From 4b3870e0a8a5f6ae70b7241c4945600d30b63f24 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 16 Jul 2017 22:33:18 +0300 Subject: [PATCH 001/113] Trying creating travis jobs for swift on linux --- .travis.yml | 69 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/.travis.yml b/.travis.yml index b58a24d9..7e3466e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,34 +1,45 @@ -language: objective-c -osx_image: xcode8.3 -xcode_project: SWCompression.xcodeproj -xcode_scheme: SWCompression + env: global: - FRAMEWORK_NAME=SWCompression -before_install: -- brew update -- brew outdated carthage || brew upgrade carthage -- brew install git-lfs -- git lfs install -before_script: -- cd Tests/Test\ Files -- git lfs pull -- cd ../.. -before_deploy: -- carthage build --no-skip-current -- carthage archive $FRAMEWORK_NAME -script: -- xcodebuild clean build test -project SWCompression.xcodeproj -scheme SWCompression -after_success: - - bash <(curl -s https://codecov.io/bash) +matrix: + include: + - language: objective-c + osx_image: xcode8.3 + xcode_project: SWCompression.xcodeproj + xcode_scheme: SWCompression + before_install: + - brew update + - brew outdated carthage || brew upgrade carthage + - brew install git-lfs + - git lfs install + before_script: + - cd Tests/Test\ Files + - git lfs pull + - cd ../.. + before_deploy: + - carthage build --no-skip-current + - carthage archive $FRAMEWORK_NAME + script: + - xcodebuild clean build test -project SWCompression.xcodeproj -scheme SWCompression + after_success: + - bash <(curl -s https://codecov.io/bash) + deploy: + provider: releases + api_key: + secure: lhJi7BsAuhGo9T4rgD/UWlVRnfrO5xLIF3BUuPHb21045tEXk/BGEHgc9a9CTFm2/iR3SmP/GDsmqfJlMzWLvuTlyV5i8otIodwIp5NYstFhyA2JaEVglmnzlkf/2FkNb5KKJDyGM1KuecYmPRTUUzYThVXl59GZ2esgfiCN26pDeDgwRyJt34jeUj0VzK9JDmEJ/ODG/hvuUWyZp0zni+m6WTPZ7dILeazFEc81WATBfMo5oa8ZBChSM6lDKaW8XyKZWrMXjsK6dKfQTcVwnvrplfw2TqfPVA+YfePcq1os5Do5CELnhrUZMSI6qvOmPauzGStjsAVFTiMaYO6HdHO03mn5L9SUuyhhKqHmh2pAkM1zKxbtfKbk6oi4zJJgvbTjIO4K2X5SUwHFgjULijW9JJeCFjsLfwODvFNFHeLeql3jaKNo6kRn2VvT/uNuT3aZa+r+WeFL0HgD6Z/EEkQW5yI6DocjetRP6y9B0rpA+YyALbd0SkVIqvoywztSfxWwp7eKhQHbG/FTIfWlmMbtLq5xULQb6TyjVHO94iSfsDV2rjAeDJY73P+rPsvej4Y9LFS8VOHcsrFhFlbR9E0NjCO2CH2TZcjXPOdLu4gfapPdiqQIdgWjC6ECUwsq+Ux6jJ6QIrGC2TI/Fw58mtLf1G8SdqBRXo+Kw0IAB4g= + file: "$FRAMEWORK_NAME.framework.zip" + skip_cleanup: true + on: + repo: tsolomko/SWCompression + tags: true + - language: generic + os: linux + sudo: required + dist: trusty + install: + - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/9f442512a46d7a2af7b850d65a7e9bd31edfb09b/swiftenv-install.sh)" + script: + - swift build && swift build -c release notifications: email: false -deploy: - provider: releases - api_key: - secure: lhJi7BsAuhGo9T4rgD/UWlVRnfrO5xLIF3BUuPHb21045tEXk/BGEHgc9a9CTFm2/iR3SmP/GDsmqfJlMzWLvuTlyV5i8otIodwIp5NYstFhyA2JaEVglmnzlkf/2FkNb5KKJDyGM1KuecYmPRTUUzYThVXl59GZ2esgfiCN26pDeDgwRyJt34jeUj0VzK9JDmEJ/ODG/hvuUWyZp0zni+m6WTPZ7dILeazFEc81WATBfMo5oa8ZBChSM6lDKaW8XyKZWrMXjsK6dKfQTcVwnvrplfw2TqfPVA+YfePcq1os5Do5CELnhrUZMSI6qvOmPauzGStjsAVFTiMaYO6HdHO03mn5L9SUuyhhKqHmh2pAkM1zKxbtfKbk6oi4zJJgvbTjIO4K2X5SUwHFgjULijW9JJeCFjsLfwODvFNFHeLeql3jaKNo6kRn2VvT/uNuT3aZa+r+WeFL0HgD6Z/EEkQW5yI6DocjetRP6y9B0rpA+YyALbd0SkVIqvoywztSfxWwp7eKhQHbG/FTIfWlmMbtLq5xULQb6TyjVHO94iSfsDV2rjAeDJY73P+rPsvej4Y9LFS8VOHcsrFhFlbR9E0NjCO2CH2TZcjXPOdLu4gfapPdiqQIdgWjC6ECUwsq+Ux6jJ6QIrGC2TI/Fw58mtLf1G8SdqBRXo+Kw0IAB4g= - file: "$FRAMEWORK_NAME.framework.zip" - skip_cleanup: true - on: - repo: tsolomko/SWCompression - tags: true From 6aa4071aab3b1842077b5116e3053239a6328b40 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 18 Jul 2017 18:50:09 +0300 Subject: [PATCH 002/113] Make ZipTests shorter --- Tests/ZipTests.swift | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/Tests/ZipTests.swift b/Tests/ZipTests.swift index d5cc1f5f..1b1a6a44 100644 --- a/Tests/ZipTests.swift +++ b/Tests/ZipTests.swift @@ -26,10 +26,7 @@ class ZipTests: XCTestCase { return } - guard entries.count == 211 else { - XCTFail("Incorrect number of entries.") - return - } + XCTAssertEqual(entries.count, 211) #if LONG_TESTS for entry in entries { @@ -54,10 +51,7 @@ class ZipTests: XCTestCase { return } - guard entries.count == 6 else { - XCTFail("Incorrect number of entries.") - return - } + XCTAssertEqual(entries.count, 6) for entry in entries { XCTAssertNotNil(try? entry.data()) @@ -80,10 +74,7 @@ class ZipTests: XCTestCase { return } - guard entries.count == 6 else { - XCTFail("Incorrect number of entries.") - return - } + XCTAssertEqual(entries.count, 6) for entry in entries where !entry.isDirectory { XCTAssertNotNil(try? entry.data()) @@ -106,11 +97,7 @@ class ZipTests: XCTestCase { return } - guard entries.count == 1 else { - XCTFail("Incorrect number of entries.") - return - } - + XCTAssertEqual(entries.count, 1) XCTAssertEqual(entries[0].name, "текстовый файл") XCTAssertEqual(entries[0].isDirectory, false) XCTAssertNotNil(try? entries[0].data()) @@ -132,11 +119,7 @@ class ZipTests: XCTestCase { return } - guard entries.count == 1 else { - XCTFail("Incorrect number of entries.") - return - } - + XCTAssertEqual(entries.count, 1) XCTAssertEqual(entries[0].name, "test4.answer") XCTAssertEqual(entries[0].isDirectory, false) @@ -171,11 +154,7 @@ class ZipTests: XCTestCase { return } - guard entries.count == 1 else { - XCTFail("Incorrect number of entries.") - return - } - + XCTAssertEqual(entries.count, 1) XCTAssertEqual(entries[0].name, "test4.answer") XCTAssertEqual(entries[0].isDirectory, false) From b5c0032f383eea734625c19c43e283058872970b Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 18 Jul 2017 18:50:27 +0300 Subject: [PATCH 003/113] First steps in 7z development --- SWCompression.xcodeproj/project.pbxproj | 44 +++++++++++++++++++++++++ Sources/SevenZipContainer.swift | 42 +++++++++++++++++++++++ Sources/SevenZipError.swift | 11 +++++++ Tests/SevenZipTests.swift | 30 +++++++++++++++++ Tests/Test Files | 2 +- 5 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 Sources/SevenZipContainer.swift create mode 100644 Sources/SevenZipError.swift create mode 100644 Tests/SevenZipTests.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index db4fc03c..289554ce 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -82,6 +82,16 @@ 063DF11A1DE1F2E200F38082 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DF1061DE1F07800F38082 /* Extensions.swift */; }; 063DF11C1DE1F2E200F38082 /* HuffmanTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DF1081DE1F07800F38082 /* HuffmanTree.swift */; }; 063DF11D1DE1F2E200F38082 /* Protocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DF1091DE1F07800F38082 /* Protocols.swift */; }; + 064F72241F1E5D4400017297 /* SevenZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* SevenZipContainer.swift */; }; + 064F72251F1E5D4400017297 /* SevenZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* SevenZipContainer.swift */; }; + 064F72261F1E5D4400017297 /* SevenZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* SevenZipContainer.swift */; }; + 064F72271F1E5D4400017297 /* SevenZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* SevenZipContainer.swift */; }; + 064F72291F1E638A00017297 /* SevenZipError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* SevenZipError.swift */; }; + 064F722A1F1E638A00017297 /* SevenZipError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* SevenZipError.swift */; }; + 064F722B1F1E638A00017297 /* SevenZipError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* SevenZipError.swift */; }; + 064F722C1F1E638A00017297 /* SevenZipError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* SevenZipError.swift */; }; + 064F722F1F1E63D800017297 /* test1.7z in Resources */ = {isa = PBXBuildFile; fileRef = 064F722E1F1E63D800017297 /* test1.7z */; }; + 064F72311F1E63E200017297 /* SevenZipTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72301F1E63E200017297 /* SevenZipTests.swift */; }; 065569681DC65C2A00A47E66 /* GzipArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063364E21DC52979007E313F /* GzipArchive.swift */; }; 065569691DC65C2A00A47E66 /* ZlibArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064492581DC606D400F10981 /* ZlibArchive.swift */; }; 0655696A1DC65C2A00A47E66 /* Deflate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061FCE251DBCC4BE0052F7BE /* Deflate.swift */; }; @@ -274,6 +284,10 @@ 063DF1081DE1F07800F38082 /* HuffmanTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HuffmanTree.swift; path = Sources/HuffmanTree.swift; sourceTree = SOURCE_ROOT; }; 063DF1091DE1F07800F38082 /* Protocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Protocols.swift; path = Sources/Protocols.swift; sourceTree = SOURCE_ROOT; }; 064492581DC606D400F10981 /* ZlibArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibArchive.swift; sourceTree = ""; }; + 064F72231F1E5D4400017297 /* SevenZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SevenZipContainer.swift; sourceTree = ""; }; + 064F72281F1E638A00017297 /* SevenZipError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SevenZipError.swift; sourceTree = ""; }; + 064F722E1F1E63D800017297 /* test1.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test1.7z; sourceTree = ""; }; + 064F72301F1E63E200017297 /* SevenZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SevenZipTests.swift; sourceTree = ""; }; 0655693F1DC659FF00A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0655694C1DC65A8000A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 065569591DC65A9400A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -468,6 +482,23 @@ path = "Long names"; sourceTree = ""; }; + 064F72221F1E5B9C00017297 /* 7-Zip */ = { + isa = PBXGroup; + children = ( + 064F72231F1E5D4400017297 /* SevenZipContainer.swift */, + 064F72281F1E638A00017297 /* SevenZipError.swift */, + ); + name = "7-Zip"; + sourceTree = ""; + }; + 064F722D1F1E63D800017297 /* 7z */ = { + isa = PBXGroup; + children = ( + 064F722E1F1E63D800017297 /* test1.7z */, + ); + path = 7z; + sourceTree = ""; + }; 0691B93E1EBE3E100037EE58 /* TAR */ = { isa = PBXGroup; children = ( @@ -610,6 +641,7 @@ 061C063A1F0E8A8B00832F0C /* Zlib */, 061C06461F0E8AEC00832F0C /* ZIP */, 061C06601F0E913700832F0C /* TAR */, + 064F72221F1E5B9C00017297 /* 7-Zip */, 06A3933D1DE070B500182E12 /* Service */, ); path = Sources; @@ -621,6 +653,7 @@ 06CC183D1DE35269003532F5 /* Test Files */, 069AC2111E02DDAF0041AC13 /* LzmaTests.swift */, 06E2347F1E069ABD00F18798 /* XzTests.swift */, + 064F72301F1E63E200017297 /* SevenZipTests.swift */, 0680E1B41DDA4075005C05EB /* Bzip2Tests.swift */, 06CC187E1DE35607003532F5 /* DeflateTests.swift */, 0680E1B21DDA3D0A005C05EB /* GzipTests.swift */, @@ -636,6 +669,7 @@ 06CC183D1DE35269003532F5 /* Test Files */ = { isa = PBXGroup; children = ( + 064F722D1F1E63D800017297 /* 7z */, 06D07AA21EB64EE800BC8C65 /* XZ */, 06D07A8F1EB64E7A00BC8C65 /* BZip2 */, 069DCE921EB64D0300ADC374 /* Answers */, @@ -949,6 +983,7 @@ 06D07AAD1EB64EE800BC8C65 /* test2.xz in Resources */, 0621E5181F0451C200C0003F /* test_multi.gz in Resources */, 069DCE9F1EB64D0300ADC374 /* test4.answer in Resources */, + 064F722F1F1E63D800017297 /* test1.7z in Resources */, 069DCEA21EB64D0300ADC374 /* test7.answer in Resources */, 06D3456B1F102E740057173F /* test_pax.tar in Resources */, 06D07AB21EB64EE800BC8C65 /* test7.xz in Resources */, @@ -998,6 +1033,7 @@ 061C06491F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, 063DF1171DE1F07800F38082 /* Protocols.swift in Sources */, 067518371E2A86F700D16354 /* ZipContainer.swift in Sources */, + 064F72251F1E5D4400017297 /* SevenZipContainer.swift in Sources */, 061C06581F0E90C800832F0C /* TarError.swift in Sources */, 061C06311F0E8A4900832F0C /* ZlibError.swift in Sources */, 069D0FFB1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, @@ -1021,6 +1057,7 @@ 061C06361F0E8A5F00832F0C /* ZlibHeader.swift in Sources */, 06CDFCB31F111DEC00292758 /* LZMA2Error.swift in Sources */, 061C065D1F0E90E600832F0C /* TarEntry.swift in Sources */, + 064F722A1F1E638A00017297 /* SevenZipError.swift in Sources */, 06CDFCAE1F111DBE00292758 /* LZMAError.swift in Sources */, 063DF10B1DE1F07800F38082 /* DataWithPointer.swift in Sources */, 061C06271F0E8A0300832F0C /* GzipError.swift in Sources */, @@ -1043,6 +1080,7 @@ 061C064A1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, 063DF11D1DE1F2E200F38082 /* Protocols.swift in Sources */, 067518381E2A86F700D16354 /* ZipContainer.swift in Sources */, + 064F72261F1E5D4400017297 /* SevenZipContainer.swift in Sources */, 061C06591F0E90C800832F0C /* TarError.swift in Sources */, 061C06321F0E8A4900832F0C /* ZlibError.swift in Sources */, 069D0FFC1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, @@ -1066,6 +1104,7 @@ 061C06371F0E8A5F00832F0C /* ZlibHeader.swift in Sources */, 06CDFCB41F111DEC00292758 /* LZMA2Error.swift in Sources */, 061C065E1F0E90E600832F0C /* TarEntry.swift in Sources */, + 064F722B1F1E638A00017297 /* SevenZipError.swift in Sources */, 06CDFCAF1F111DBE00292758 /* LZMAError.swift in Sources */, 0655696F1DC65C2B00A47E66 /* GzipArchive.swift in Sources */, 061C06281F0E8A0300832F0C /* GzipError.swift in Sources */, @@ -1088,6 +1127,7 @@ 061C064B1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, 063DF1181DE1F07800F38082 /* Protocols.swift in Sources */, 067518391E2A86F700D16354 /* ZipContainer.swift in Sources */, + 064F72271F1E5D4400017297 /* SevenZipContainer.swift in Sources */, 061C065A1F0E90C800832F0C /* TarError.swift in Sources */, 061C06331F0E8A4900832F0C /* ZlibError.swift in Sources */, 069D0FFD1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, @@ -1111,6 +1151,7 @@ 061C06381F0E8A5F00832F0C /* ZlibHeader.swift in Sources */, 06CDFCB51F111DEC00292758 /* LZMA2Error.swift in Sources */, 061C065F1F0E90E600832F0C /* TarEntry.swift in Sources */, + 064F722C1F1E638A00017297 /* SevenZipError.swift in Sources */, 06CDFCB01F111DBE00292758 /* LZMAError.swift in Sources */, 063DF10C1DE1F07800F38082 /* DataWithPointer.swift in Sources */, 061C06291F0E8A0300832F0C /* GzipError.swift in Sources */, @@ -1133,6 +1174,7 @@ 061C06481F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, 063DF1161DE1F07800F38082 /* Protocols.swift in Sources */, 067518361E2A86F700D16354 /* ZipContainer.swift in Sources */, + 064F72241F1E5D4400017297 /* SevenZipContainer.swift in Sources */, 061C06571F0E90C800832F0C /* TarError.swift in Sources */, 061C06301F0E8A4900832F0C /* ZlibError.swift in Sources */, 069D0FFA1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, @@ -1156,6 +1198,7 @@ 061C06351F0E8A5F00832F0C /* ZlibHeader.swift in Sources */, 06CDFCB21F111DEC00292758 /* LZMA2Error.swift in Sources */, 061C065C1F0E90E600832F0C /* TarEntry.swift in Sources */, + 064F72291F1E638A00017297 /* SevenZipError.swift in Sources */, 06CDFCAD1F111DBE00292758 /* LZMAError.swift in Sources */, 063DF10A1DE1F07800F38082 /* DataWithPointer.swift in Sources */, 061C06261F0E8A0300832F0C /* GzipError.swift in Sources */, @@ -1166,6 +1209,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 064F72311F1E63E200017297 /* SevenZipTests.swift in Sources */, 0680E1B51DDA4076005C05EB /* Bzip2Tests.swift in Sources */, 06CC187F1DE35607003532F5 /* DeflateTests.swift in Sources */, 061FCE2D1DBCC6A30052F7BE /* Constants.swift in Sources */, diff --git a/Sources/SevenZipContainer.swift b/Sources/SevenZipContainer.swift new file mode 100644 index 00000000..5c199bd7 --- /dev/null +++ b/Sources/SevenZipContainer.swift @@ -0,0 +1,42 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +public class SevenZipContainer: Container { + + public static func open(container data: Data) throws -> [ContainerEntry] { + /// Object with input data which supports convenient work with bit shifts. + let pointerData = DataWithPointer(data: data) + + // SignatureHeader + + // Check signature. + guard pointerData.bytes(count: 6) == [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C] + else { throw SevenZipError.wrongSignature } + + // Check archive version. + guard pointerData.bytes(count: 2) == [0, 2] + else { throw SevenZipError.wrongVersion } + +// ArchiveVersion +// { +// BYTE Major; // now = 0 +// BYTE Minor; // now = 2 +// }; +// +// UINT32 StartHeaderCRC; +// +// StartHeader +// { +// REAL_UINT64 NextHeaderOffset +// REAL_UINT64 NextHeaderSize +// UINT32 NextHeaderCRC +// } + + return [] + } + +} diff --git a/Sources/SevenZipError.swift b/Sources/SevenZipError.swift new file mode 100644 index 00000000..e8236661 --- /dev/null +++ b/Sources/SevenZipError.swift @@ -0,0 +1,11 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +public enum SevenZipError: Error { + case wrongSignature + case wrongVersion +} diff --git a/Tests/SevenZipTests.swift b/Tests/SevenZipTests.swift new file mode 100644 index 00000000..ceefa566 --- /dev/null +++ b/Tests/SevenZipTests.swift @@ -0,0 +1,30 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import XCTest +import SWCompression + +class SevenZipTests: XCTestCase { + + static let testType: String = "7z" + + func test1() { + guard let testURL = Constants.url(forTest: "test1", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { + XCTFail("Unable to load test archive.") + return + } + + guard let entries = try? SevenZipContainer.open(container: testData) else { + XCTFail("Unable to open ZIP archive.") + return + } + } + +} diff --git a/Tests/Test Files b/Tests/Test Files index c0821ade..0e847a29 160000 --- a/Tests/Test Files +++ b/Tests/Test Files @@ -1 +1 @@ -Subproject commit c0821ade35d327d198b3ed5e43f9a39d751eacb5 +Subproject commit 0e847a293cde711d99014fc6650bb7725b5d58f1 From dbb876dec412c5620410314d3466d9a168f1f0d1 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 18 Jul 2017 20:25:31 +0300 Subject: [PATCH 004/113] Add some structures and code for 7z --- Sources/SevenZipContainer.swift | 167 +++++++++++++++++++++++++++++--- Sources/SevenZipError.swift | 5 + Tests/SevenZipTests.swift | 4 +- 3 files changed, 158 insertions(+), 18 deletions(-) diff --git a/Sources/SevenZipContainer.swift b/Sources/SevenZipContainer.swift index 5c199bd7..94db69a4 100644 --- a/Sources/SevenZipContainer.swift +++ b/Sources/SevenZipContainer.swift @@ -5,38 +5,173 @@ import Foundation +fileprivate struct ArchiveProperty { + let type: UInt8 + let size: Int + let bytes: [UInt8] +} + public class SevenZipContainer: Container { public static func open(container data: Data) throws -> [ContainerEntry] { /// Object with input data which supports convenient work with bit shifts. let pointerData = DataWithPointer(data: data) - // SignatureHeader + // **SignatureHeader** // Check signature. guard pointerData.bytes(count: 6) == [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C] else { throw SevenZipError.wrongSignature } // Check archive version. - guard pointerData.bytes(count: 2) == [0, 2] + guard pointerData.bytes(count: 2) == [0, 4] // 7zFormat.txt says it should be [0, 2] instead. else { throw SevenZipError.wrongVersion } -// ArchiveVersion -// { -// BYTE Major; // now = 0 -// BYTE Minor; // now = 2 -// }; -// -// UINT32 StartHeaderCRC; -// -// StartHeader -// { -// REAL_UINT64 NextHeaderOffset -// REAL_UINT64 NextHeaderSize -// UINT32 NextHeaderCRC -// } + let startHeaderCRC = pointerData.uint32() + + /// - Note: Relative to SignatureHeader + let nextHeaderOffset = Int(pointerData.uint64()) + let nextHeaderSize = Int(pointerData.uint64()) + let nextHeaderCRC = pointerData.uint32() + + pointerData.index = 12 + guard CheckSums.crc32(pointerData.bytes(count: 20)) == startHeaderCRC + else { throw SevenZipError.wrongStartHeaderCRC } + + // **Header** + pointerData.index += nextHeaderOffset + let headerStartIndex = pointerData.index + + _ = try Header(pointerData) + + // TODO: It is possible, to have here HeaderInfo instead + + // Check header size + let headerEndIndex = pointerData.index + guard headerEndIndex - headerStartIndex == nextHeaderSize + else { throw SevenZipError.wrongHeaderSize } + + // Check header CRC + pointerData.index = headerStartIndex + guard CheckSums.crc32(pointerData.bytes(count: nextHeaderSize)) == nextHeaderCRC + else { throw SevenZipError.wrongHeaderCRC } + return [] } } + +fileprivate struct Header { + + var archiveProperties: [ArchiveProperty]? + var additionalStreams: [StreamInfo]? + var mainStreams: [StreamInfo]? + var files: [FileInfo]? + + init(_ pointerData: DataWithPointer) throws { + guard pointerData.byte() == 0x01 + else { throw SevenZipError.wrongPropertyID } + + while true { + let structureType = pointerData.byte() + if structureType == 0x00 { // **Header - End** + break + } + switch structureType { + case 0x02: // **Header - ArchiveProperties** + archiveProperties = try Header.getArchiveProperties(pointerData) + case 0x03: // **Header - AdditionalStreamsInfo** + _ = try StreamInfo(pointerData) // TODO: Or it can be more than one? + case 0x04: // **Header - MainStreamsInfo** + _ = try StreamInfo(pointerData) + case 0x05: // **Header - FilesInfo** + break + default: + throw SevenZipError.wrongPropertyID + } + } + } + + private static func getArchiveProperties(_ pointerData: DataWithPointer) throws -> [ArchiveProperty] { + var archiveProperties = [ArchiveProperty]() + while true { + let type = pointerData.byte() + if type == 0 { + break + } + let propertySize = try pointerData.multiByteDecode().multiByteInteger + archiveProperties.append(ArchiveProperty(type: type, size: propertySize, + bytes: pointerData.bytes(count: propertySize))) + } + return archiveProperties + } + +} + +fileprivate struct StreamInfo { + + var pack: PackInfo? + var coders: [CoderInfo]? + var substreams: [SubstreamInfo]? + + init(_ pointerData: DataWithPointer) throws { + while true { + let structureType = pointerData.byte() + if structureType == 0x00 { // **StreamsInfo - End** + break + } + switch structureType { + case 0x06: // **StreamsInfo - PackInfo** + break + case 0x07: // **StreamsInfo - CodersInfo** + break + case 0x08: // **StreamsInfo - SubstreamsInfo** + break + default: + throw SevenZipError.wrongPropertyID + } + } + } + +} + +fileprivate struct FileInfo { + +} + +fileprivate struct PackInfo { + +} + +fileprivate struct CoderInfo { + +} + +fileprivate struct SubstreamInfo { + +} + +fileprivate extension DataWithPointer { + + fileprivate func multiByteDecode() throws -> (multiByteInteger: Int, bytesProcessed: [UInt8]) { + var i = 1 + var result = self.byte().toInt() + var bytes: [UInt8] = [result.toUInt8()] + if result <= 127 { + return (result, bytes) + } + result &= 0x7F + while self.previousByte & 0x80 != 0 { + let byte = self.byte() + if i >= 9 || byte == 0x00 { + throw SevenZipError.multiByteIntegerError + } + bytes.append(byte) + result += (byte.toInt() & 0x7F) << (7 * i) + i += 1 + } + return (result, bytes) + } + +} diff --git a/Sources/SevenZipError.swift b/Sources/SevenZipError.swift index e8236661..dd9032c7 100644 --- a/Sources/SevenZipError.swift +++ b/Sources/SevenZipError.swift @@ -8,4 +8,9 @@ import Foundation public enum SevenZipError: Error { case wrongSignature case wrongVersion + case wrongStartHeaderCRC + case wrongHeaderSize + case wrongPropertyID + case multiByteIntegerError + case wrongHeaderCRC } diff --git a/Tests/SevenZipTests.swift b/Tests/SevenZipTests.swift index ceefa566..b48ed8f4 100644 --- a/Tests/SevenZipTests.swift +++ b/Tests/SevenZipTests.swift @@ -21,8 +21,8 @@ class SevenZipTests: XCTestCase { return } - guard let entries = try? SevenZipContainer.open(container: testData) else { - XCTFail("Unable to open ZIP archive.") + guard (try? SevenZipContainer.open(container: testData)) != nil else { + XCTFail("Unable to open 7z archive.") return } } From e390e582b157d280237ce2b188ba9ca449513252 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 18 Jul 2017 21:06:22 +0300 Subject: [PATCH 005/113] Extract multiByteDecode for use in 7z --- SWCompression.xcodeproj/project.pbxproj | 10 +++++++ Sources/MultiByteDecode.swift | 32 +++++++++++++++++++++ Sources/XZArchive.swift | 38 +++++-------------------- 3 files changed, 49 insertions(+), 31 deletions(-) create mode 100644 Sources/MultiByteDecode.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 289554ce..04071b24 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -170,6 +170,10 @@ 06A393441DE0713300182E12 /* SWCompression.h in Headers */ = {isa = PBXBuildFile; fileRef = 06A393421DE070B500182E12 /* SWCompression.h */; settings = {ATTRIBUTES = (Public, ); }; }; 06A393451DE0713A00182E12 /* SWCompression.h in Headers */ = {isa = PBXBuildFile; fileRef = 06A393421DE070B500182E12 /* SWCompression.h */; settings = {ATTRIBUTES = (Public, ); }; }; 06A393461DE0714000182E12 /* SWCompression.h in Headers */ = {isa = PBXBuildFile; fileRef = 06A393421DE070B500182E12 /* SWCompression.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06A9606F1F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; + 06A960701F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; + 06A960711F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; + 06A960721F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; 06ADB2D91EBCEFA60053A188 /* TarContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */; }; 06ADB2DA1EBCEFA60053A188 /* TarContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */; }; 06ADB2DB1EBCEFA60053A188 /* TarContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */; }; @@ -333,6 +337,7 @@ 069F276F1EDA0D5E00736269 /* TestUnicode.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = TestUnicode.zip; sourceTree = ""; }; 06A393411DE070B500182E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 06A393421DE070B500182E12 /* SWCompression.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SWCompression.h; sourceTree = ""; }; + 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MultiByteDecode.swift; path = Sources/MultiByteDecode.swift; sourceTree = SOURCE_ROOT; }; 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TarContainer.swift; sourceTree = ""; }; 06B374CA1E0EECD500064853 /* random_file.zlib */ = {isa = PBXFileReference; lastKnownFileType = file; path = random_file.zlib; sourceTree = ""; }; 06BB8F2F1E0C2C720079FB9E /* LZMA2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LZMA2.swift; sourceTree = ""; }; @@ -579,6 +584,7 @@ 063DF1091DE1F07800F38082 /* Protocols.swift */, 0681B3DD1E44F674001A9D79 /* BitWriter.swift */, 063DF1081DE1F07800F38082 /* HuffmanTree.swift */, + 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */, ); path = Common; sourceTree = ""; @@ -1036,6 +1042,7 @@ 064F72251F1E5D4400017297 /* SevenZipContainer.swift in Sources */, 061C06581F0E90C800832F0C /* TarError.swift in Sources */, 061C06311F0E8A4900832F0C /* ZlibError.swift in Sources */, + 06A960701F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFB1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, 06E234831E06A6C200F18798 /* CheckSums.swift in Sources */, 069AC20E1E02DB1D0041AC13 /* LZMA.swift in Sources */, @@ -1083,6 +1090,7 @@ 064F72261F1E5D4400017297 /* SevenZipContainer.swift in Sources */, 061C06591F0E90C800832F0C /* TarError.swift in Sources */, 061C06321F0E8A4900832F0C /* ZlibError.swift in Sources */, + 06A960711F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFC1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, 06E234841E06A6C200F18798 /* CheckSums.swift in Sources */, 069AC20F1E02DB1D0041AC13 /* LZMA.swift in Sources */, @@ -1130,6 +1138,7 @@ 064F72271F1E5D4400017297 /* SevenZipContainer.swift in Sources */, 061C065A1F0E90C800832F0C /* TarError.swift in Sources */, 061C06331F0E8A4900832F0C /* ZlibError.swift in Sources */, + 06A960721F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFD1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, 06E234851E06A6C200F18798 /* CheckSums.swift in Sources */, 069AC2101E02DB1D0041AC13 /* LZMA.swift in Sources */, @@ -1177,6 +1186,7 @@ 064F72241F1E5D4400017297 /* SevenZipContainer.swift in Sources */, 061C06571F0E90C800832F0C /* TarError.swift in Sources */, 061C06301F0E8A4900832F0C /* ZlibError.swift in Sources */, + 06A9606F1F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFA1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, 06E234821E06A6C200F18798 /* CheckSums.swift in Sources */, 069AC20D1E02DB1D0041AC13 /* LZMA.swift in Sources */, diff --git a/Sources/MultiByteDecode.swift b/Sources/MultiByteDecode.swift new file mode 100644 index 00000000..0389ba50 --- /dev/null +++ b/Sources/MultiByteDecode.swift @@ -0,0 +1,32 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +extension DataWithPointer { + + // TODO: Replace with single DataError. + func multiByteDecode(_ mbiError: Error) throws -> (multiByteInteger: Int, bytesProcessed: [UInt8]) { + var i = 1 + var result = self.byte().toInt() + var bytes: [UInt8] = [result.toUInt8()] + if result <= 127 { + return (result, bytes) + } + result &= 0x7F + while self.previousByte & 0x80 != 0 { + let byte = self.byte() + if i >= 9 || byte == 0x00 { + throw mbiError + } + bytes.append(byte) + result += (byte.toInt() & 0x7F) << (7 * i) + i += 1 + } + return (result, bytes) + } + +} + diff --git a/Sources/XZArchive.swift b/Sources/XZArchive.swift index 17b0363d..289c33a5 100644 --- a/Sources/XZArchive.swift +++ b/Sources/XZArchive.swift @@ -213,7 +213,7 @@ public class XZArchive: Archive { /// Should match size of compressed data. var compressedSize = -1 if blockFlags & 0x40 != 0 { - let compressedSizeDecodeResult = try pointerData.multiByteDecode() + let compressedSizeDecodeResult = try pointerData.multiByteDecode(XZError.multiByteIntegerError) compressedSize = compressedSizeDecodeResult.multiByteInteger guard compressedSize > 0 else { throw XZError.wrongFieldValue } @@ -223,7 +223,7 @@ public class XZArchive: Archive { /// Should match the size of data after decompression. var uncompressedSize = -1 if blockFlags & 0x80 != 0 { - let uncompressedSizeDecodeResult = try pointerData.multiByteDecode() + let uncompressedSizeDecodeResult = try pointerData.multiByteDecode(XZError.multiByteIntegerError) uncompressedSize = uncompressedSizeDecodeResult.multiByteInteger guard uncompressedSize > 0 else { throw XZError.wrongFieldValue } @@ -232,7 +232,7 @@ public class XZArchive: Archive { var filters: [(DataWithPointer) throws -> [UInt8]] = [] for _ in 0.. Int { var indexBytes: [UInt8] = [0x00] - let numberOfRecordsTuple = try pointerData.multiByteDecode() + let numberOfRecordsTuple = try pointerData.multiByteDecode(XZError.multiByteIntegerError) indexBytes.append(contentsOf: numberOfRecordsTuple.bytesProcessed) let numberOfRecords = numberOfRecordsTuple.multiByteInteger guard numberOfRecords == blockInfos.count else { throw XZError.wrongFieldValue } for blockInfo in blockInfos { - let unpaddedSizeTuple = try pointerData.multiByteDecode() + let unpaddedSizeTuple = try pointerData.multiByteDecode(XZError.multiByteIntegerError) guard unpaddedSizeTuple.multiByteInteger == blockInfo.unpaddedSize else { throw XZError.wrongFieldValue } indexBytes.append(contentsOf: unpaddedSizeTuple.bytesProcessed) - let uncompSizeTuple = try pointerData.multiByteDecode() + let uncompSizeTuple = try pointerData.multiByteDecode(XZError.multiByteIntegerError) guard uncompSizeTuple.multiByteInteger == blockInfo.uncompSize else { throw XZError.wrongDataSize } indexBytes.append(contentsOf: uncompSizeTuple.bytesProcessed) @@ -363,27 +363,3 @@ public class XZArchive: Archive { } } - -fileprivate extension DataWithPointer { - - fileprivate func multiByteDecode() throws -> (multiByteInteger: Int, bytesProcessed: [UInt8]) { - var i = 1 - var result = self.byte().toInt() - var bytes: [UInt8] = [result.toUInt8()] - if result <= 127 { - return (result, bytes) - } - result &= 0x7F - while self.previousByte & 0x80 != 0 { - let byte = self.byte() - if i >= 9 || byte == 0x00 { - throw XZError.multiByteIntegerError - } - bytes.append(byte) - result += (byte.toInt() & 0x7F) << (7 * i) - i += 1 - } - return (result, bytes) - } - -} From 507db69ddb6549b5b49fd97587ac1941ff91b83d Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 18 Jul 2017 21:06:37 +0300 Subject: [PATCH 006/113] Add a lot of 7z related files for structures --- SWCompression.xcodeproj/project.pbxproj | 110 +++++++++-- Sources/7zCoderInfo.swift | 51 +++++ Sources/7zContainer.swift | 57 ++++++ .../{SevenZipError.swift => 7zError.swift} | 1 + Sources/7zFileInfo.swift | 82 ++++++++ Sources/7zFolder.swift | 12 ++ Sources/7zHeader.swift | 61 ++++++ Sources/7zPackInfo.swift | 42 +++++ Sources/7zStreamInfo.swift | 33 ++++ Sources/7zSubstreamInfo.swift | 35 ++++ Sources/SevenZipContainer.swift | 177 ------------------ 11 files changed, 464 insertions(+), 197 deletions(-) create mode 100644 Sources/7zCoderInfo.swift create mode 100644 Sources/7zContainer.swift rename Sources/{SevenZipError.swift => 7zError.swift} (93%) create mode 100644 Sources/7zFileInfo.swift create mode 100644 Sources/7zFolder.swift create mode 100644 Sources/7zHeader.swift create mode 100644 Sources/7zPackInfo.swift create mode 100644 Sources/7zStreamInfo.swift create mode 100644 Sources/7zSubstreamInfo.swift delete mode 100644 Sources/SevenZipContainer.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 04071b24..a93fac3f 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -82,14 +82,14 @@ 063DF11A1DE1F2E200F38082 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DF1061DE1F07800F38082 /* Extensions.swift */; }; 063DF11C1DE1F2E200F38082 /* HuffmanTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DF1081DE1F07800F38082 /* HuffmanTree.swift */; }; 063DF11D1DE1F2E200F38082 /* Protocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DF1091DE1F07800F38082 /* Protocols.swift */; }; - 064F72241F1E5D4400017297 /* SevenZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* SevenZipContainer.swift */; }; - 064F72251F1E5D4400017297 /* SevenZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* SevenZipContainer.swift */; }; - 064F72261F1E5D4400017297 /* SevenZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* SevenZipContainer.swift */; }; - 064F72271F1E5D4400017297 /* SevenZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* SevenZipContainer.swift */; }; - 064F72291F1E638A00017297 /* SevenZipError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* SevenZipError.swift */; }; - 064F722A1F1E638A00017297 /* SevenZipError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* SevenZipError.swift */; }; - 064F722B1F1E638A00017297 /* SevenZipError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* SevenZipError.swift */; }; - 064F722C1F1E638A00017297 /* SevenZipError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* SevenZipError.swift */; }; + 064F72241F1E5D4400017297 /* 7zContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* 7zContainer.swift */; }; + 064F72251F1E5D4400017297 /* 7zContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* 7zContainer.swift */; }; + 064F72261F1E5D4400017297 /* 7zContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* 7zContainer.swift */; }; + 064F72271F1E5D4400017297 /* 7zContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72231F1E5D4400017297 /* 7zContainer.swift */; }; + 064F72291F1E638A00017297 /* 7zError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* 7zError.swift */; }; + 064F722A1F1E638A00017297 /* 7zError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* 7zError.swift */; }; + 064F722B1F1E638A00017297 /* 7zError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* 7zError.swift */; }; + 064F722C1F1E638A00017297 /* 7zError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* 7zError.swift */; }; 064F722F1F1E63D800017297 /* test1.7z in Resources */ = {isa = PBXBuildFile; fileRef = 064F722E1F1E63D800017297 /* test1.7z */; }; 064F72311F1E63E200017297 /* SevenZipTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72301F1E63E200017297 /* SevenZipTests.swift */; }; 065569681DC65C2A00A47E66 /* GzipArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063364E21DC52979007E313F /* GzipArchive.swift */; }; @@ -101,6 +101,10 @@ 065569761DC65C2B00A47E66 /* GzipArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063364E21DC52979007E313F /* GzipArchive.swift */; }; 065569771DC65C2B00A47E66 /* ZlibArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064492581DC606D400F10981 /* ZlibArchive.swift */; }; 065569781DC65C2B00A47E66 /* Deflate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061FCE251DBCC4BE0052F7BE /* Deflate.swift */; }; + 06595E0E1F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; + 06595E0F1F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; + 06595E101F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; + 06595E111F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; 067518361E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518371E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518381E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; @@ -170,6 +174,30 @@ 06A393441DE0713300182E12 /* SWCompression.h in Headers */ = {isa = PBXBuildFile; fileRef = 06A393421DE070B500182E12 /* SWCompression.h */; settings = {ATTRIBUTES = (Public, ); }; }; 06A393451DE0713A00182E12 /* SWCompression.h in Headers */ = {isa = PBXBuildFile; fileRef = 06A393421DE070B500182E12 /* SWCompression.h */; settings = {ATTRIBUTES = (Public, ); }; }; 06A393461DE0714000182E12 /* SWCompression.h in Headers */ = {isa = PBXBuildFile; fileRef = 06A393421DE070B500182E12 /* SWCompression.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06A960511F1E7D040078E6D1 /* 7zStreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960501F1E7D040078E6D1 /* 7zStreamInfo.swift */; }; + 06A960521F1E7D040078E6D1 /* 7zStreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960501F1E7D040078E6D1 /* 7zStreamInfo.swift */; }; + 06A960531F1E7D040078E6D1 /* 7zStreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960501F1E7D040078E6D1 /* 7zStreamInfo.swift */; }; + 06A960541F1E7D040078E6D1 /* 7zStreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960501F1E7D040078E6D1 /* 7zStreamInfo.swift */; }; + 06A960561F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960551F1E7D0B0078E6D1 /* 7zPackInfo.swift */; }; + 06A960571F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960551F1E7D0B0078E6D1 /* 7zPackInfo.swift */; }; + 06A960581F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960551F1E7D0B0078E6D1 /* 7zPackInfo.swift */; }; + 06A960591F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960551F1E7D0B0078E6D1 /* 7zPackInfo.swift */; }; + 06A9605B1F1E7D990078E6D1 /* 7zHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9605A1F1E7D990078E6D1 /* 7zHeader.swift */; }; + 06A9605C1F1E7D990078E6D1 /* 7zHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9605A1F1E7D990078E6D1 /* 7zHeader.swift */; }; + 06A9605D1F1E7D990078E6D1 /* 7zHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9605A1F1E7D990078E6D1 /* 7zHeader.swift */; }; + 06A9605E1F1E7D990078E6D1 /* 7zHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9605A1F1E7D990078E6D1 /* 7zHeader.swift */; }; + 06A960601F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */; }; + 06A960611F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */; }; + 06A960621F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */; }; + 06A960631F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */; }; + 06A960651F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */; }; + 06A960661F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */; }; + 06A960671F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */; }; + 06A960681F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */; }; + 06A9606A1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */; }; + 06A9606B1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */; }; + 06A9606C1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */; }; + 06A9606D1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */; }; 06A9606F1F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; 06A960701F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; 06A960711F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; @@ -288,13 +316,14 @@ 063DF1081DE1F07800F38082 /* HuffmanTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HuffmanTree.swift; path = Sources/HuffmanTree.swift; sourceTree = SOURCE_ROOT; }; 063DF1091DE1F07800F38082 /* Protocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Protocols.swift; path = Sources/Protocols.swift; sourceTree = SOURCE_ROOT; }; 064492581DC606D400F10981 /* ZlibArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibArchive.swift; sourceTree = ""; }; - 064F72231F1E5D4400017297 /* SevenZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SevenZipContainer.swift; sourceTree = ""; }; - 064F72281F1E638A00017297 /* SevenZipError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SevenZipError.swift; sourceTree = ""; }; + 064F72231F1E5D4400017297 /* 7zContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zContainer.swift; sourceTree = ""; }; + 064F72281F1E638A00017297 /* 7zError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zError.swift; sourceTree = ""; }; 064F722E1F1E63D800017297 /* test1.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test1.7z; sourceTree = ""; }; 064F72301F1E63E200017297 /* SevenZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SevenZipTests.swift; sourceTree = ""; }; 0655693F1DC659FF00A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0655694C1DC65A8000A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 065569591DC65A9400A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 06595E0D1F1E8252006501C2 /* 7zFolder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFolder.swift; sourceTree = ""; }; 067518351E2A86F700D16354 /* ZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipContainer.swift; sourceTree = ""; }; 0675183C1E2A883600D16354 /* ZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipTests.swift; sourceTree = ""; }; 0680E1B01DDA2D7C005C05EB /* ZlibTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibTests.swift; sourceTree = ""; }; @@ -337,6 +366,12 @@ 069F276F1EDA0D5E00736269 /* TestUnicode.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = TestUnicode.zip; sourceTree = ""; }; 06A393411DE070B500182E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 06A393421DE070B500182E12 /* SWCompression.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SWCompression.h; sourceTree = ""; }; + 06A960501F1E7D040078E6D1 /* 7zStreamInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zStreamInfo.swift; sourceTree = ""; }; + 06A960551F1E7D0B0078E6D1 /* 7zPackInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zPackInfo.swift; sourceTree = ""; }; + 06A9605A1F1E7D990078E6D1 /* 7zHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zHeader.swift; sourceTree = ""; }; + 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFileInfo.swift; sourceTree = ""; }; + 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zCoderInfo.swift; sourceTree = ""; }; + 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zSubstreamInfo.swift; sourceTree = ""; }; 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MultiByteDecode.swift; path = Sources/MultiByteDecode.swift; sourceTree = SOURCE_ROOT; }; 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TarContainer.swift; sourceTree = ""; }; 06B374CA1E0EECD500064853 /* random_file.zlib */ = {isa = PBXFileReference; lastKnownFileType = file; path = random_file.zlib; sourceTree = ""; }; @@ -490,8 +525,15 @@ 064F72221F1E5B9C00017297 /* 7-Zip */ = { isa = PBXGroup; children = ( - 064F72231F1E5D4400017297 /* SevenZipContainer.swift */, - 064F72281F1E638A00017297 /* SevenZipError.swift */, + 064F72231F1E5D4400017297 /* 7zContainer.swift */, + 06A9605A1F1E7D990078E6D1 /* 7zHeader.swift */, + 06A960501F1E7D040078E6D1 /* 7zStreamInfo.swift */, + 06A960551F1E7D0B0078E6D1 /* 7zPackInfo.swift */, + 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */, + 06595E0D1F1E8252006501C2 /* 7zFolder.swift */, + 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */, + 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */, + 064F72281F1E638A00017297 /* 7zError.swift */, ); name = "7-Zip"; sourceTree = ""; @@ -1033,14 +1075,17 @@ 065569691DC65C2A00A47E66 /* ZlibArchive.swift in Sources */, 061C064E1F0E901C00832F0C /* ZipLocalHeader.swift in Sources */, 063DF10E1DE1F07800F38082 /* Extensions.swift in Sources */, + 06595E0F1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1141DE1F07800F38082 /* HuffmanTree.swift in Sources */, 06CDFCA91F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF11E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06491F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, 063DF1171DE1F07800F38082 /* Protocols.swift in Sources */, 067518371E2A86F700D16354 /* ZipContainer.swift in Sources */, - 064F72251F1E5D4400017297 /* SevenZipContainer.swift in Sources */, + 06A9605C1F1E7D990078E6D1 /* 7zHeader.swift in Sources */, + 064F72251F1E5D4400017297 /* 7zContainer.swift in Sources */, 061C06581F0E90C800832F0C /* TarError.swift in Sources */, + 06A960571F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */, 061C06311F0E8A4900832F0C /* ZlibError.swift in Sources */, 06A960701F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFB1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, @@ -1050,11 +1095,14 @@ 0681B3DF1E44F674001A9D79 /* BitWriter.swift in Sources */, 061C063E1F0E8AB700832F0C /* ZipError.swift in Sources */, 069D0FE71E0D6C6400D8AA87 /* LZMADecoder.swift in Sources */, + 06A9606B1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */, 06FED40D1DD7717E0013DFB2 /* BZip2.swift in Sources */, + 06A960611F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */, 061C062C1F0E8A1D00832F0C /* GzipHeader.swift in Sources */, 069D0FF61E0D6CD000D8AA87 /* LZMABitTreeDecoder.swift in Sources */, 065569681DC65C2A00A47E66 /* GzipArchive.swift in Sources */, 061C06221F0E89D900832F0C /* XZError.swift in Sources */, + 06A960661F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */, 06ADB2DA1EBCEFA60053A188 /* TarContainer.swift in Sources */, 06CDFCA41F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF61F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, @@ -1062,9 +1110,10 @@ 06CDFC9F1F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06431F0E8AD500832F0C /* ZipEntry.swift in Sources */, 061C06361F0E8A5F00832F0C /* ZlibHeader.swift in Sources */, + 06A960521F1E7D040078E6D1 /* 7zStreamInfo.swift in Sources */, 06CDFCB31F111DEC00292758 /* LZMA2Error.swift in Sources */, 061C065D1F0E90E600832F0C /* TarEntry.swift in Sources */, - 064F722A1F1E638A00017297 /* SevenZipError.swift in Sources */, + 064F722A1F1E638A00017297 /* 7zError.swift in Sources */, 06CDFCAE1F111DBE00292758 /* LZMAError.swift in Sources */, 063DF10B1DE1F07800F38082 /* DataWithPointer.swift in Sources */, 061C06271F0E8A0300832F0C /* GzipError.swift in Sources */, @@ -1081,14 +1130,17 @@ 063DF1191DE1F2E200F38082 /* DataWithPointer.swift in Sources */, 061C064F1F0E901C00832F0C /* ZipLocalHeader.swift in Sources */, 063DF11A1DE1F2E200F38082 /* Extensions.swift in Sources */, + 06595E101F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF11C1DE1F2E200F38082 /* HuffmanTree.swift in Sources */, 06CDFCAA1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF21E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064A1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, 063DF11D1DE1F2E200F38082 /* Protocols.swift in Sources */, 067518381E2A86F700D16354 /* ZipContainer.swift in Sources */, - 064F72261F1E5D4400017297 /* SevenZipContainer.swift in Sources */, + 06A9605D1F1E7D990078E6D1 /* 7zHeader.swift in Sources */, + 064F72261F1E5D4400017297 /* 7zContainer.swift in Sources */, 061C06591F0E90C800832F0C /* TarError.swift in Sources */, + 06A960581F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */, 061C06321F0E8A4900832F0C /* ZlibError.swift in Sources */, 06A960711F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFC1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, @@ -1098,11 +1150,14 @@ 0681B3E01E44F674001A9D79 /* BitWriter.swift in Sources */, 061C063F1F0E8AB700832F0C /* ZipError.swift in Sources */, 069D0FE81E0D6C6400D8AA87 /* LZMADecoder.swift in Sources */, + 06A9606C1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */, 065569711DC65C2B00A47E66 /* Deflate.swift in Sources */, + 06A960621F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */, 061C062D1F0E8A1D00832F0C /* GzipHeader.swift in Sources */, 069D0FF71E0D6CD000D8AA87 /* LZMABitTreeDecoder.swift in Sources */, 06FED40E1DD7717E0013DFB2 /* BZip2.swift in Sources */, 061C06231F0E89D900832F0C /* XZError.swift in Sources */, + 06A960671F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */, 06ADB2DB1EBCEFA60053A188 /* TarContainer.swift in Sources */, 06CDFCA51F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF71F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, @@ -1110,9 +1165,10 @@ 06CDFCA01F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06441F0E8AD500832F0C /* ZipEntry.swift in Sources */, 061C06371F0E8A5F00832F0C /* ZlibHeader.swift in Sources */, + 06A960531F1E7D040078E6D1 /* 7zStreamInfo.swift in Sources */, 06CDFCB41F111DEC00292758 /* LZMA2Error.swift in Sources */, 061C065E1F0E90E600832F0C /* TarEntry.swift in Sources */, - 064F722B1F1E638A00017297 /* SevenZipError.swift in Sources */, + 064F722B1F1E638A00017297 /* 7zError.swift in Sources */, 06CDFCAF1F111DBE00292758 /* LZMAError.swift in Sources */, 0655696F1DC65C2B00A47E66 /* GzipArchive.swift in Sources */, 061C06281F0E8A0300832F0C /* GzipError.swift in Sources */, @@ -1129,14 +1185,17 @@ 065569771DC65C2B00A47E66 /* ZlibArchive.swift in Sources */, 061C06501F0E901C00832F0C /* ZipLocalHeader.swift in Sources */, 063DF10F1DE1F07800F38082 /* Extensions.swift in Sources */, + 06595E111F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1151DE1F07800F38082 /* HuffmanTree.swift in Sources */, 06CDFCAB1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF31E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064B1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, 063DF1181DE1F07800F38082 /* Protocols.swift in Sources */, 067518391E2A86F700D16354 /* ZipContainer.swift in Sources */, - 064F72271F1E5D4400017297 /* SevenZipContainer.swift in Sources */, + 06A9605E1F1E7D990078E6D1 /* 7zHeader.swift in Sources */, + 064F72271F1E5D4400017297 /* 7zContainer.swift in Sources */, 061C065A1F0E90C800832F0C /* TarError.swift in Sources */, + 06A960591F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */, 061C06331F0E8A4900832F0C /* ZlibError.swift in Sources */, 06A960721F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFD1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, @@ -1146,11 +1205,14 @@ 0681B3E11E44F674001A9D79 /* BitWriter.swift in Sources */, 061C06401F0E8AB700832F0C /* ZipError.swift in Sources */, 069D0FE91E0D6C6400D8AA87 /* LZMADecoder.swift in Sources */, + 06A9606D1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */, 06FED40F1DD7717E0013DFB2 /* BZip2.swift in Sources */, + 06A960631F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */, 061C062E1F0E8A1D00832F0C /* GzipHeader.swift in Sources */, 069D0FF81E0D6CD000D8AA87 /* LZMABitTreeDecoder.swift in Sources */, 065569761DC65C2B00A47E66 /* GzipArchive.swift in Sources */, 061C06241F0E89D900832F0C /* XZError.swift in Sources */, + 06A960681F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */, 06ADB2DC1EBCEFA60053A188 /* TarContainer.swift in Sources */, 06CDFCA61F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF81F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, @@ -1158,9 +1220,10 @@ 06CDFCA11F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06451F0E8AD500832F0C /* ZipEntry.swift in Sources */, 061C06381F0E8A5F00832F0C /* ZlibHeader.swift in Sources */, + 06A960541F1E7D040078E6D1 /* 7zStreamInfo.swift in Sources */, 06CDFCB51F111DEC00292758 /* LZMA2Error.swift in Sources */, 061C065F1F0E90E600832F0C /* TarEntry.swift in Sources */, - 064F722C1F1E638A00017297 /* SevenZipError.swift in Sources */, + 064F722C1F1E638A00017297 /* 7zError.swift in Sources */, 06CDFCB01F111DBE00292758 /* LZMAError.swift in Sources */, 063DF10C1DE1F07800F38082 /* DataWithPointer.swift in Sources */, 061C06291F0E8A0300832F0C /* GzipError.swift in Sources */, @@ -1177,14 +1240,17 @@ 06A393391DE0709300182E12 /* GzipArchive.swift in Sources */, 061C064D1F0E901C00832F0C /* ZipLocalHeader.swift in Sources */, 063DF10D1DE1F07800F38082 /* Extensions.swift in Sources */, + 06595E0E1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1131DE1F07800F38082 /* HuffmanTree.swift in Sources */, 06CDFCA81F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF01E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06481F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, 063DF1161DE1F07800F38082 /* Protocols.swift in Sources */, 067518361E2A86F700D16354 /* ZipContainer.swift in Sources */, - 064F72241F1E5D4400017297 /* SevenZipContainer.swift in Sources */, + 06A9605B1F1E7D990078E6D1 /* 7zHeader.swift in Sources */, + 064F72241F1E5D4400017297 /* 7zContainer.swift in Sources */, 061C06571F0E90C800832F0C /* TarError.swift in Sources */, + 06A960561F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */, 061C06301F0E8A4900832F0C /* ZlibError.swift in Sources */, 06A9606F1F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFA1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, @@ -1194,11 +1260,14 @@ 0681B3DE1E44F674001A9D79 /* BitWriter.swift in Sources */, 061C063D1F0E8AB700832F0C /* ZipError.swift in Sources */, 069D0FE61E0D6C6400D8AA87 /* LZMADecoder.swift in Sources */, + 06A9606A1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */, 06A3933B1DE0709300182E12 /* Deflate.swift in Sources */, + 06A960601F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */, 061C062B1F0E8A1D00832F0C /* GzipHeader.swift in Sources */, 069D0FF51E0D6CD000D8AA87 /* LZMABitTreeDecoder.swift in Sources */, 06A3933C1DE0709300182E12 /* BZip2.swift in Sources */, 061C06211F0E89D900832F0C /* XZError.swift in Sources */, + 06A960651F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */, 06ADB2D91EBCEFA60053A188 /* TarContainer.swift in Sources */, 06CDFCA31F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF51F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, @@ -1206,9 +1275,10 @@ 06CDFC9E1F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06421F0E8AD500832F0C /* ZipEntry.swift in Sources */, 061C06351F0E8A5F00832F0C /* ZlibHeader.swift in Sources */, + 06A960511F1E7D040078E6D1 /* 7zStreamInfo.swift in Sources */, 06CDFCB21F111DEC00292758 /* LZMA2Error.swift in Sources */, 061C065C1F0E90E600832F0C /* TarEntry.swift in Sources */, - 064F72291F1E638A00017297 /* SevenZipError.swift in Sources */, + 064F72291F1E638A00017297 /* 7zError.swift in Sources */, 06CDFCAD1F111DBE00292758 /* LZMAError.swift in Sources */, 063DF10A1DE1F07800F38082 /* DataWithPointer.swift in Sources */, 061C06261F0E8A0300832F0C /* GzipError.swift in Sources */, diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift new file mode 100644 index 00000000..a7c96680 --- /dev/null +++ b/Sources/7zCoderInfo.swift @@ -0,0 +1,51 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +struct SevenZipCoderInfo { + + let numFolders: Int + + let external: UInt8 + var folders: [SevenZipFolder]? + var dataStreamIndex: Int? + + init(_ pointerData: DataWithPointer) throws { + guard pointerData.byte() == 0x0B + else { throw SevenZipError.wrongPropertyID } + numFolders = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + external = pointerData.byte() + switch external { + case 0: + folders = [] + for _ in 0.. [ContainerEntry] { + /// Object with input data which supports convenient work with bit shifts. + let pointerData = DataWithPointer(data: data) + + // **SignatureHeader** + + // Check signature. + guard pointerData.bytes(count: 6) == [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C] + else { throw SevenZipError.wrongSignature } + + // Check archive version. + guard pointerData.bytes(count: 2) == [0, 4] // 7zFormat.txt says it should be [0, 2] instead. + else { throw SevenZipError.wrongVersion } + + let startHeaderCRC = pointerData.uint32() + + /// - Note: Relative to SignatureHeader + let nextHeaderOffset = Int(pointerData.uint64()) + let nextHeaderSize = Int(pointerData.uint64()) + let nextHeaderCRC = pointerData.uint32() + + pointerData.index = 12 + guard CheckSums.crc32(pointerData.bytes(count: 20)) == startHeaderCRC + else { throw SevenZipError.wrongStartHeaderCRC } + + // **Header** + pointerData.index += nextHeaderOffset + let headerStartIndex = pointerData.index + + _ = try SevenZipHeader(pointerData) + + // TODO: It is possible, to have here HeaderInfo instead + + // Check header size + let headerEndIndex = pointerData.index + guard headerEndIndex - headerStartIndex == nextHeaderSize + else { throw SevenZipError.wrongHeaderSize } + + // Check header CRC + pointerData.index = headerStartIndex + guard CheckSums.crc32(pointerData.bytes(count: nextHeaderSize)) == nextHeaderCRC + else { throw SevenZipError.wrongHeaderCRC } + + + return [] + } + +} diff --git a/Sources/SevenZipError.swift b/Sources/7zError.swift similarity index 93% rename from Sources/SevenZipError.swift rename to Sources/7zError.swift index dd9032c7..b87dbc9a 100644 --- a/Sources/SevenZipError.swift +++ b/Sources/7zError.swift @@ -13,4 +13,5 @@ public enum SevenZipError: Error { case wrongPropertyID case multiByteIntegerError case wrongHeaderCRC + case wrongExternal } diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift new file mode 100644 index 00000000..d12f369a --- /dev/null +++ b/Sources/7zFileInfo.swift @@ -0,0 +1,82 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +struct SevenZipFileInfo { + init(_ pointerData: DataWithPointer) throws { + + } +// BYTE NID::kFilesInfo; (0x05) +// UINT64 NumFiles +// +// for (;;) +// { +// BYTE PropertyType; +// if (aType == 0) +// break; +// +// UINT64 Size; +// +// switch(PropertyType) +// { +// kEmptyStream: (0x0E) +// for(NumFiles) +// BIT IsEmptyStream +// +// kEmptyFile: (0x0F) +// for(EmptyStreams) +// BIT IsEmptyFile +// +// kAnti: (0x10) +// for(EmptyStreams) +// BIT IsAntiFile +// +// case kCTime: (0x12) +// case kATime: (0x13) +// case kMTime: (0x14) +// BYTE AllAreDefined +// if (AllAreDefined == 0) +// { +// for(NumFiles) +// BIT TimeDefined +// } +// BYTE External; +// if(External != 0) +// UINT64 DataIndex +// [] +// for(Definded Items) +// UINT64 Time +// [] +// +// kNames: (0x11) +// BYTE External; +// if(External != 0) +// UINT64 DataIndex +// [] +// for(Files) +// { +// wchar_t Names[NameSize]; +// wchar_t 0; +// } +// [] +// +// kAttributes: (0x15) +// BYTE AllAreDefined +// if (AllAreDefined == 0) +// { +// for(NumFiles) +// BIT AttributesAreDefined +// } +// BYTE External; +// if(External != 0) +// UINT64 DataIndex +// [] +// for(Definded Attributes) +// UINT32 Attributes +// [] +// } +// } +} diff --git a/Sources/7zFolder.swift b/Sources/7zFolder.swift new file mode 100644 index 00000000..f00c7535 --- /dev/null +++ b/Sources/7zFolder.swift @@ -0,0 +1,12 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +struct SevenZipFolder { + init(_ pointerData: DataWithPointer) throws { + + } +} diff --git a/Sources/7zHeader.swift b/Sources/7zHeader.swift new file mode 100644 index 00000000..36695884 --- /dev/null +++ b/Sources/7zHeader.swift @@ -0,0 +1,61 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +struct SevenZipHeader { + + struct ArchiveProperty { + + let type: UInt8 + let size: Int + let bytes: [UInt8] + + } + + var archiveProperties: [ArchiveProperty]? + var additionalStreams: [SevenZipStreamInfo]? + var mainStreams: [SevenZipStreamInfo]? + var files: [SevenZipFileInfo]? + + init(_ pointerData: DataWithPointer) throws { + guard pointerData.byte() == 0x01 + else { throw SevenZipError.wrongPropertyID } + + while true { + let structureType = pointerData.byte() + if structureType == 0x00 { // **Header - End** + break + } + switch structureType { + case 0x02: // **Header - ArchiveProperties** + archiveProperties = try SevenZipHeader.getArchiveProperties(pointerData) + case 0x03: // **Header - AdditionalStreamsInfo** + _ = try SevenZipStreamInfo(pointerData) // TODO: Or it can be more than one? + case 0x04: // **Header - MainStreamsInfo** + _ = try SevenZipStreamInfo(pointerData) + case 0x05: // **Header - FilesInfo** + break + default: + throw SevenZipError.wrongPropertyID + } + } + } + + private static func getArchiveProperties(_ pointerData: DataWithPointer) throws -> [ArchiveProperty] { + var archiveProperties = [ArchiveProperty]() + while true { + let type = pointerData.byte() + if type == 0 { + break + } + let propertySize = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + archiveProperties.append(ArchiveProperty(type: type, size: propertySize, + bytes: pointerData.bytes(count: propertySize))) + } + return archiveProperties + } + +} diff --git a/Sources/7zPackInfo.swift b/Sources/7zPackInfo.swift new file mode 100644 index 00000000..92bb18b2 --- /dev/null +++ b/Sources/7zPackInfo.swift @@ -0,0 +1,42 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +struct SevenZipPackInfo { + + let packPosition: Int + let numPackStreams: Int + + var sizes: [Int]? + + init(_ pointerData: DataWithPointer) throws { + packPosition = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + numPackStreams = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + while true { + let structureType = pointerData.byte() + if structureType == 0x00 { // **PackInfo - End** + break + } + switch structureType { + case 0x09: // **PackInfo - PackSizes** + sizes = [] + for _ in 0.. [ContainerEntry] { - /// Object with input data which supports convenient work with bit shifts. - let pointerData = DataWithPointer(data: data) - - // **SignatureHeader** - - // Check signature. - guard pointerData.bytes(count: 6) == [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C] - else { throw SevenZipError.wrongSignature } - - // Check archive version. - guard pointerData.bytes(count: 2) == [0, 4] // 7zFormat.txt says it should be [0, 2] instead. - else { throw SevenZipError.wrongVersion } - - let startHeaderCRC = pointerData.uint32() - - /// - Note: Relative to SignatureHeader - let nextHeaderOffset = Int(pointerData.uint64()) - let nextHeaderSize = Int(pointerData.uint64()) - let nextHeaderCRC = pointerData.uint32() - - pointerData.index = 12 - guard CheckSums.crc32(pointerData.bytes(count: 20)) == startHeaderCRC - else { throw SevenZipError.wrongStartHeaderCRC } - - // **Header** - pointerData.index += nextHeaderOffset - let headerStartIndex = pointerData.index - - _ = try Header(pointerData) - - // TODO: It is possible, to have here HeaderInfo instead - - // Check header size - let headerEndIndex = pointerData.index - guard headerEndIndex - headerStartIndex == nextHeaderSize - else { throw SevenZipError.wrongHeaderSize } - - // Check header CRC - pointerData.index = headerStartIndex - guard CheckSums.crc32(pointerData.bytes(count: nextHeaderSize)) == nextHeaderCRC - else { throw SevenZipError.wrongHeaderCRC } - - - return [] - } - -} - -fileprivate struct Header { - - var archiveProperties: [ArchiveProperty]? - var additionalStreams: [StreamInfo]? - var mainStreams: [StreamInfo]? - var files: [FileInfo]? - - init(_ pointerData: DataWithPointer) throws { - guard pointerData.byte() == 0x01 - else { throw SevenZipError.wrongPropertyID } - - while true { - let structureType = pointerData.byte() - if structureType == 0x00 { // **Header - End** - break - } - switch structureType { - case 0x02: // **Header - ArchiveProperties** - archiveProperties = try Header.getArchiveProperties(pointerData) - case 0x03: // **Header - AdditionalStreamsInfo** - _ = try StreamInfo(pointerData) // TODO: Or it can be more than one? - case 0x04: // **Header - MainStreamsInfo** - _ = try StreamInfo(pointerData) - case 0x05: // **Header - FilesInfo** - break - default: - throw SevenZipError.wrongPropertyID - } - } - } - - private static func getArchiveProperties(_ pointerData: DataWithPointer) throws -> [ArchiveProperty] { - var archiveProperties = [ArchiveProperty]() - while true { - let type = pointerData.byte() - if type == 0 { - break - } - let propertySize = try pointerData.multiByteDecode().multiByteInteger - archiveProperties.append(ArchiveProperty(type: type, size: propertySize, - bytes: pointerData.bytes(count: propertySize))) - } - return archiveProperties - } - -} - -fileprivate struct StreamInfo { - - var pack: PackInfo? - var coders: [CoderInfo]? - var substreams: [SubstreamInfo]? - - init(_ pointerData: DataWithPointer) throws { - while true { - let structureType = pointerData.byte() - if structureType == 0x00 { // **StreamsInfo - End** - break - } - switch structureType { - case 0x06: // **StreamsInfo - PackInfo** - break - case 0x07: // **StreamsInfo - CodersInfo** - break - case 0x08: // **StreamsInfo - SubstreamsInfo** - break - default: - throw SevenZipError.wrongPropertyID - } - } - } - -} - -fileprivate struct FileInfo { - -} - -fileprivate struct PackInfo { - -} - -fileprivate struct CoderInfo { - -} - -fileprivate struct SubstreamInfo { - -} - -fileprivate extension DataWithPointer { - - fileprivate func multiByteDecode() throws -> (multiByteInteger: Int, bytesProcessed: [UInt8]) { - var i = 1 - var result = self.byte().toInt() - var bytes: [UInt8] = [result.toUInt8()] - if result <= 127 { - return (result, bytes) - } - result &= 0x7F - while self.previousByte & 0x80 != 0 { - let byte = self.byte() - if i >= 9 || byte == 0x00 { - throw SevenZipError.multiByteIntegerError - } - bytes.append(byte) - result += (byte.toInt() & 0x7F) << (7 * i) - i += 1 - } - return (result, bytes) - } - -} From f76c2b575a2ce5a62a69aced0de494b3070113cf Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 18 Jul 2017 23:28:17 +0300 Subject: [PATCH 007/113] More 7z progress --- SWCompression.xcodeproj/project.pbxproj | 10 ++++ Sources/7zCodec.swift | 42 +++++++++++++++++ Sources/7zCoderInfo.swift | 27 +++++++---- Sources/7zError.swift | 2 + Sources/7zFileInfo.swift | 40 +++++++++++++--- Sources/7zFolder.swift | 53 ++++++++++++++++++++- Sources/7zHeader.swift | 12 ++--- Sources/7zPackInfo.swift | 6 +-- Sources/7zStreamInfo.swift | 14 +++--- Sources/7zSubstreamInfo.swift | 61 +++++++++++++++---------- Sources/XZArchive.swift | 1 + 11 files changed, 213 insertions(+), 55 deletions(-) create mode 100644 Sources/7zCodec.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index a93fac3f..03155477 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -105,6 +105,10 @@ 06595E0F1F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; 06595E101F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; 06595E111F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; + 06595E131F1E90C2006501C2 /* 7zCodec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCodec.swift */; }; + 06595E141F1E90C2006501C2 /* 7zCodec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCodec.swift */; }; + 06595E151F1E90C2006501C2 /* 7zCodec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCodec.swift */; }; + 06595E161F1E90C2006501C2 /* 7zCodec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCodec.swift */; }; 067518361E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518371E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518381E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; @@ -324,6 +328,7 @@ 0655694C1DC65A8000A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 065569591DC65A9400A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 06595E0D1F1E8252006501C2 /* 7zFolder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFolder.swift; sourceTree = ""; }; + 06595E121F1E90C2006501C2 /* 7zCodec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zCodec.swift; sourceTree = ""; }; 067518351E2A86F700D16354 /* ZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipContainer.swift; sourceTree = ""; }; 0675183C1E2A883600D16354 /* ZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipTests.swift; sourceTree = ""; }; 0680E1B01DDA2D7C005C05EB /* ZlibTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibTests.swift; sourceTree = ""; }; @@ -531,6 +536,7 @@ 06A960551F1E7D0B0078E6D1 /* 7zPackInfo.swift */, 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */, 06595E0D1F1E8252006501C2 /* 7zFolder.swift */, + 06595E121F1E90C2006501C2 /* 7zCodec.swift */, 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */, 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */, 064F72281F1E638A00017297 /* 7zError.swift */, @@ -1077,6 +1083,7 @@ 063DF10E1DE1F07800F38082 /* Extensions.swift in Sources */, 06595E0F1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1141DE1F07800F38082 /* HuffmanTree.swift in Sources */, + 06595E141F1E90C2006501C2 /* 7zCodec.swift in Sources */, 06CDFCA91F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF11E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06491F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1132,6 +1139,7 @@ 063DF11A1DE1F2E200F38082 /* Extensions.swift in Sources */, 06595E101F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF11C1DE1F2E200F38082 /* HuffmanTree.swift in Sources */, + 06595E151F1E90C2006501C2 /* 7zCodec.swift in Sources */, 06CDFCAA1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF21E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064A1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1187,6 +1195,7 @@ 063DF10F1DE1F07800F38082 /* Extensions.swift in Sources */, 06595E111F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1151DE1F07800F38082 /* HuffmanTree.swift in Sources */, + 06595E161F1E90C2006501C2 /* 7zCodec.swift in Sources */, 06CDFCAB1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF31E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064B1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1242,6 +1251,7 @@ 063DF10D1DE1F07800F38082 /* Extensions.swift in Sources */, 06595E0E1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1131DE1F07800F38082 /* HuffmanTree.swift in Sources */, + 06595E131F1E90C2006501C2 /* 7zCodec.swift in Sources */, 06CDFCA81F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF01E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06481F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, diff --git a/Sources/7zCodec.swift b/Sources/7zCodec.swift new file mode 100644 index 00000000..d986a773 --- /dev/null +++ b/Sources/7zCodec.swift @@ -0,0 +1,42 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +struct SevenZipCodec { + + let idSize: Int + let isComplex: Bool + let attributesExist: Bool + + let id: [UInt8] + + var numInStreams: Int? + var numOutStreams: Int? + + var propertiesSize: Int? + var properties: [UInt8]? + + init(_ pointerData: DataWithPointer) throws { + let flags = pointerData.byte() + guard flags & 0xC0 == 0 + else { throw SevenZipError.reservedCodecFlags } + idSize = (flags & 0xF).toInt() + isComplex = flags & 0x10 != 0 + attributesExist = flags & 0x20 != 0 + + id = pointerData.bytes(count: idSize) + + if isComplex { + numInStreams = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + numOutStreams = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + } + + if attributesExist { + propertiesSize = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + properties = pointerData.bytes(count: propertiesSize!) + } + } +} diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index a7c96680..8ffbba5d 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -13,6 +13,8 @@ struct SevenZipCoderInfo { var folders: [SevenZipFolder]? var dataStreamIndex: Int? + let unpackSizes: [Int] + init(_ pointerData: DataWithPointer) throws { guard pointerData.byte() == 0x0B else { throw SevenZipError.wrongPropertyID } @@ -30,22 +32,27 @@ struct SevenZipCoderInfo { throw SevenZipError.wrongExternal } + guard pointerData.byte() == 0x0C + else { throw SevenZipError.wrongPropertyID } + var sizes = [Int]() + if external == 0 { + for folder in folders! { + for _ in 0.. 0 { + for _ in 0.. 1 { + for _ in 0.. [UInt8]] = [] for _ in 0.. Date: Tue, 25 Jul 2017 00:35:57 +0300 Subject: [PATCH 008/113] Complete 7zip structures implementations Though some questions, problems and opportunities for improvements are remaining. --- Sources/7zCodec.swift | 13 +++--- Sources/7zCoderInfo.swift | 47 +++++++++++++------ Sources/7zFileInfo.swift | 86 +++-------------------------------- Sources/7zFolder.swift | 4 +- Sources/7zPackInfo.swift | 32 +++++++++---- Sources/7zSubstreamInfo.swift | 49 +++++++++++--------- 6 files changed, 98 insertions(+), 133 deletions(-) diff --git a/Sources/7zCodec.swift b/Sources/7zCodec.swift index d986a773..eacc4416 100644 --- a/Sources/7zCodec.swift +++ b/Sources/7zCodec.swift @@ -13,8 +13,8 @@ struct SevenZipCodec { let id: [UInt8] - var numInStreams: Int? - var numOutStreams: Int? + let numInStreams: Int + let numOutStreams: Int var propertiesSize: Int? var properties: [UInt8]? @@ -29,10 +29,11 @@ struct SevenZipCodec { id = pointerData.bytes(count: idSize) - if isComplex { - numInStreams = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger - numOutStreams = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger - } + // TODO: Introduce typealias for SevenZipError.multiByteIntegerError. + numInStreams = isComplex ? try pointerData + .multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger : 1 + numOutStreams = isComplex ? try pointerData + .multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger : 1 if attributesExist { propertiesSize = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index 8ffbba5d..fccfbd1d 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -10,10 +10,10 @@ struct SevenZipCoderInfo { let numFolders: Int let external: UInt8 - var folders: [SevenZipFolder]? + var folders = [SevenZipFolder]() var dataStreamIndex: Int? - let unpackSizes: [Int] + var digests = [UInt32?]() init(_ pointerData: DataWithPointer) throws { guard pointerData.byte() == 0x0B @@ -22,9 +22,8 @@ struct SevenZipCoderInfo { external = pointerData.byte() switch external { case 0: - folders = [] for _ in 0.. Date: Tue, 25 Jul 2017 13:39:42 +0300 Subject: [PATCH 009/113] Add two more 7z tests --- SWCompression.xcodeproj/project.pbxproj | 8 ++++++ Tests/SevenZipTests.swift | 34 +++++++++++++++++++++++++ Tests/Test Files | 2 +- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 03155477..46a7d264 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 061358FB1F274E080065BCEB /* test2.7z in Resources */ = {isa = PBXBuildFile; fileRef = 061358F91F274E080065BCEB /* test2.7z */; }; + 061358FC1F274E080065BCEB /* test3.7z in Resources */ = {isa = PBXBuildFile; fileRef = 061358FA1F274E080065BCEB /* test3.7z */; }; 061C06211F0E89D900832F0C /* XZError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061C06201F0E89D900832F0C /* XZError.swift */; }; 061C06221F0E89D900832F0C /* XZError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061C06201F0E89D900832F0C /* XZError.swift */; }; 061C06231F0E89D900832F0C /* XZError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061C06201F0E89D900832F0C /* XZError.swift */; }; @@ -293,6 +295,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 061358F91F274E080065BCEB /* test2.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test2.7z; sourceTree = ""; }; + 061358FA1F274E080065BCEB /* test3.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test3.7z; sourceTree = ""; }; 061C06201F0E89D900832F0C /* XZError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XZError.swift; sourceTree = ""; }; 061C06251F0E8A0300832F0C /* GzipError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GzipError.swift; sourceTree = ""; }; 061C062A1F0E8A1D00832F0C /* GzipHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GzipHeader.swift; sourceTree = ""; }; @@ -547,6 +551,8 @@ 064F722D1F1E63D800017297 /* 7z */ = { isa = PBXGroup; children = ( + 061358F91F274E080065BCEB /* test2.7z */, + 061358FA1F274E080065BCEB /* test3.7z */, 064F722E1F1E63D800017297 /* test1.7z */, ); path = 7z; @@ -1029,8 +1035,10 @@ 06D3456D1F102E740057173F /* test_v7.tar in Resources */, 06D07AAC1EB64EE800BC8C65 /* test1.xz in Resources */, 06D345691F102E740057173F /* test_gnu.tar in Resources */, + 061358FC1F274E080065BCEB /* test3.7z in Resources */, 06BD0D231E3D0C630054AA5C /* SWCompressionSourceCode.zip in Resources */, 06D07AB11EB64EE800BC8C65 /* test6.xz in Resources */, + 061358FB1F274E080065BCEB /* test2.7z in Resources */, 06B374CB1E0EECD500064853 /* random_file.zlib in Resources */, 06393DFE1F1A858000A647A0 /* long_test_oldgnu.tar in Resources */, 069DCEA41EB64D0300ADC374 /* test9.answer in Resources */, diff --git a/Tests/SevenZipTests.swift b/Tests/SevenZipTests.swift index b48ed8f4..865b22be 100644 --- a/Tests/SevenZipTests.swift +++ b/Tests/SevenZipTests.swift @@ -27,4 +27,38 @@ class SevenZipTests: XCTestCase { } } + func test2() { + guard let testURL = Constants.url(forTest: "test2", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { + XCTFail("Unable to load test archive.") + return + } + + guard (try? SevenZipContainer.open(container: testData)) != nil else { + XCTFail("Unable to open 7z archive.") + return + } + } + + func test3() { + guard let testURL = Constants.url(forTest: "test3", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { + XCTFail("Unable to load test archive.") + return + } + + guard (try? SevenZipContainer.open(container: testData)) != nil else { + XCTFail("Unable to open 7z archive.") + return + } + } + } diff --git a/Tests/Test Files b/Tests/Test Files index 0e847a29..927c83e5 160000 --- a/Tests/Test Files +++ b/Tests/Test Files @@ -1 +1 @@ -Subproject commit 0e847a293cde711d99014fc6650bb7725b5d58f1 +Subproject commit 927c83e52f63a25534def677dcf2130a8bfd589d From adf55c3d642aa663468e9ff82edc97c4cc5afb8a Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 25 Jul 2017 13:42:20 +0300 Subject: [PATCH 010/113] Revert "Extract multiByteDecode for use in 7z" This reverts commit e390e582b157d280237ce2b188ba9ca449513252. --- SWCompression.xcodeproj/project.pbxproj | 5 ---- Sources/MultiByteDecode.swift | 32 --------------------- Sources/XZArchive.swift | 38 ++++++++++++++++++++----- 3 files changed, 31 insertions(+), 44 deletions(-) delete mode 100644 Sources/MultiByteDecode.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 46a7d264..540ecc94 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -638,7 +638,6 @@ 063DF1091DE1F07800F38082 /* Protocols.swift */, 0681B3DD1E44F674001A9D79 /* BitWriter.swift */, 063DF1081DE1F07800F38082 /* HuffmanTree.swift */, - 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */, ); path = Common; sourceTree = ""; @@ -1102,7 +1101,6 @@ 061C06581F0E90C800832F0C /* TarError.swift in Sources */, 06A960571F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */, 061C06311F0E8A4900832F0C /* ZlibError.swift in Sources */, - 06A960701F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFB1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, 06E234831E06A6C200F18798 /* CheckSums.swift in Sources */, 069AC20E1E02DB1D0041AC13 /* LZMA.swift in Sources */, @@ -1158,7 +1156,6 @@ 061C06591F0E90C800832F0C /* TarError.swift in Sources */, 06A960581F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */, 061C06321F0E8A4900832F0C /* ZlibError.swift in Sources */, - 06A960711F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFC1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, 06E234841E06A6C200F18798 /* CheckSums.swift in Sources */, 069AC20F1E02DB1D0041AC13 /* LZMA.swift in Sources */, @@ -1214,7 +1211,6 @@ 061C065A1F0E90C800832F0C /* TarError.swift in Sources */, 06A960591F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */, 061C06331F0E8A4900832F0C /* ZlibError.swift in Sources */, - 06A960721F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFD1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, 06E234851E06A6C200F18798 /* CheckSums.swift in Sources */, 069AC2101E02DB1D0041AC13 /* LZMA.swift in Sources */, @@ -1270,7 +1266,6 @@ 061C06571F0E90C800832F0C /* TarError.swift in Sources */, 06A960561F1E7D0B0078E6D1 /* 7zPackInfo.swift in Sources */, 061C06301F0E8A4900832F0C /* ZlibError.swift in Sources */, - 06A9606F1F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */, 069D0FFA1E0D6CE900D8AA87 /* LZMALenDecoder.swift in Sources */, 06E234821E06A6C200F18798 /* CheckSums.swift in Sources */, 069AC20D1E02DB1D0041AC13 /* LZMA.swift in Sources */, diff --git a/Sources/MultiByteDecode.swift b/Sources/MultiByteDecode.swift deleted file mode 100644 index 0389ba50..00000000 --- a/Sources/MultiByteDecode.swift +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2017 Timofey Solomko -// Licensed under MIT License -// -// See LICENSE for license information - -import Foundation - -extension DataWithPointer { - - // TODO: Replace with single DataError. - func multiByteDecode(_ mbiError: Error) throws -> (multiByteInteger: Int, bytesProcessed: [UInt8]) { - var i = 1 - var result = self.byte().toInt() - var bytes: [UInt8] = [result.toUInt8()] - if result <= 127 { - return (result, bytes) - } - result &= 0x7F - while self.previousByte & 0x80 != 0 { - let byte = self.byte() - if i >= 9 || byte == 0x00 { - throw mbiError - } - bytes.append(byte) - result += (byte.toInt() & 0x7F) << (7 * i) - i += 1 - } - return (result, bytes) - } - -} - diff --git a/Sources/XZArchive.swift b/Sources/XZArchive.swift index 1d77645b..b5dc4515 100644 --- a/Sources/XZArchive.swift +++ b/Sources/XZArchive.swift @@ -213,7 +213,7 @@ public class XZArchive: Archive { /// Should match size of compressed data. var compressedSize = -1 if blockFlags & 0x40 != 0 { - let compressedSizeDecodeResult = try pointerData.multiByteDecode(XZError.multiByteIntegerError) + let compressedSizeDecodeResult = try pointerData.multiByteDecode() compressedSize = compressedSizeDecodeResult.multiByteInteger guard compressedSize > 0 else { throw XZError.wrongFieldValue } @@ -223,7 +223,7 @@ public class XZArchive: Archive { /// Should match the size of data after decompression. var uncompressedSize = -1 if blockFlags & 0x80 != 0 { - let uncompressedSizeDecodeResult = try pointerData.multiByteDecode(XZError.multiByteIntegerError) + let uncompressedSizeDecodeResult = try pointerData.multiByteDecode() uncompressedSize = uncompressedSizeDecodeResult.multiByteInteger guard uncompressedSize > 0 else { throw XZError.wrongFieldValue } @@ -233,7 +233,7 @@ public class XZArchive: Archive { // TODO: First parse, then use. var filters: [(DataWithPointer) throws -> [UInt8]] = [] for _ in 0.. Int { var indexBytes: [UInt8] = [0x00] - let numberOfRecordsTuple = try pointerData.multiByteDecode(XZError.multiByteIntegerError) + let numberOfRecordsTuple = try pointerData.multiByteDecode() indexBytes.append(contentsOf: numberOfRecordsTuple.bytesProcessed) let numberOfRecords = numberOfRecordsTuple.multiByteInteger guard numberOfRecords == blockInfos.count else { throw XZError.wrongFieldValue } for blockInfo in blockInfos { - let unpaddedSizeTuple = try pointerData.multiByteDecode(XZError.multiByteIntegerError) + let unpaddedSizeTuple = try pointerData.multiByteDecode() guard unpaddedSizeTuple.multiByteInteger == blockInfo.unpaddedSize else { throw XZError.wrongFieldValue } indexBytes.append(contentsOf: unpaddedSizeTuple.bytesProcessed) - let uncompSizeTuple = try pointerData.multiByteDecode(XZError.multiByteIntegerError) + let uncompSizeTuple = try pointerData.multiByteDecode() guard uncompSizeTuple.multiByteInteger == blockInfo.uncompSize else { throw XZError.wrongDataSize } indexBytes.append(contentsOf: uncompSizeTuple.bytesProcessed) @@ -364,3 +364,27 @@ public class XZArchive: Archive { } } + +fileprivate extension DataWithPointer { + + fileprivate func multiByteDecode() throws -> (multiByteInteger: Int, bytesProcessed: [UInt8]) { + var i = 1 + var result = self.byte().toInt() + var bytes: [UInt8] = [result.toUInt8()] + if result <= 127 { + return (result, bytes) + } + result &= 0x7F + while self.previousByte & 0x80 != 0 { + let byte = self.byte() + if i >= 9 || byte == 0x00 { + throw XZError.multiByteIntegerError + } + bytes.append(byte) + result += (byte.toInt() & 0x7F) << (7 * i) + i += 1 + } + return (result, bytes) + } + +} From 0b3d8523bdacd9b8ae1e8552f9883bab3fd48a17 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 25 Jul 2017 13:58:25 +0300 Subject: [PATCH 011/113] Numerous changes to 7z code Added correct verion of DWP.multiByteDecode for 7-zip; added detection of packed headers, as well as reading of their streaminfos; added SevenZipProperty struct which used as ArchiveProperties in header and as Properties in FilesInfo (for now, until parsing of these properties is added). --- Sources/7zCodec.swift | 15 +++++------ Sources/7zCoderInfo.swift | 6 ++--- Sources/7zContainer.swift | 35 ++++++++++++++++++++++++- Sources/7zError.swift | 3 ++- Sources/7zFileInfo.swift | 15 +++-------- Sources/7zFolder.swift | 8 +++--- Sources/7zHeader.swift | 48 +++++++++++++++++------------------ Sources/7zPackInfo.swift | 6 ++--- Sources/7zSubstreamInfo.swift | 5 ++-- 9 files changed, 81 insertions(+), 60 deletions(-) diff --git a/Sources/7zCodec.swift b/Sources/7zCodec.swift index eacc4416..1363d76c 100644 --- a/Sources/7zCodec.swift +++ b/Sources/7zCodec.swift @@ -9,7 +9,7 @@ struct SevenZipCodec { let idSize: Int let isComplex: Bool - let attributesExist: Bool + let hasAttributes: Bool let id: [UInt8] @@ -25,18 +25,15 @@ struct SevenZipCodec { else { throw SevenZipError.reservedCodecFlags } idSize = (flags & 0xF).toInt() isComplex = flags & 0x10 != 0 - attributesExist = flags & 0x20 != 0 + hasAttributes = flags & 0x20 != 0 id = pointerData.bytes(count: idSize) - // TODO: Introduce typealias for SevenZipError.multiByteIntegerError. - numInStreams = isComplex ? try pointerData - .multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger : 1 - numOutStreams = isComplex ? try pointerData - .multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger : 1 + numInStreams = isComplex ? pointerData.szMbd().multiByteInteger : 1 + numOutStreams = isComplex ? pointerData.szMbd().multiByteInteger : 1 - if attributesExist { - propertiesSize = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + if hasAttributes { + propertiesSize = pointerData.szMbd().multiByteInteger properties = pointerData.bytes(count: propertiesSize!) } } diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index fccfbd1d..12e4c9a3 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -18,7 +18,7 @@ struct SevenZipCoderInfo { init(_ pointerData: DataWithPointer) throws { guard pointerData.byte() == 0x0B else { throw SevenZipError.wrongPropertyID } - numFolders = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + numFolders = pointerData.szMbd().multiByteInteger external = pointerData.byte() switch external { case 0: @@ -26,7 +26,7 @@ struct SevenZipCoderInfo { folders.append(try SevenZipFolder(pointerData)) } case 1: - dataStreamIndex = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + dataStreamIndex = pointerData.szMbd().multiByteInteger default: throw SevenZipError.wrongExternal } @@ -37,7 +37,7 @@ struct SevenZipCoderInfo { if external == 0 { for folder in folders { for _ in 0.. (multiByteInteger: Int, bytesProcessed: [UInt8]) { + let firstByte = self.byte().toInt() + var mask = 1 + var bytes = [firstByte.toUInt8()] + var value = 0 + for i in 0..<8 { + if firstByte & mask == 0 { + value |= ((firstByte & (mask &- 1)) << (8 * i)) + break + } + let nextByte = self.byte().toInt() + bytes.append(nextByte.toUInt8()) + value |= nextByte << (8 * i) + mask >>= 1 + } + return (value, bytes) + } + +} diff --git a/Sources/7zError.swift b/Sources/7zError.swift index b6781781..f6bc06c3 100644 --- a/Sources/7zError.swift +++ b/Sources/7zError.swift @@ -5,15 +5,16 @@ import Foundation +// TODO: Check if every error is used. public enum SevenZipError: Error { case wrongSignature case wrongVersion case wrongStartHeaderCRC case wrongHeaderSize case wrongPropertyID - case multiByteIntegerError case wrongHeaderCRC case wrongExternal case reservedCodecFlags case unknownNumFolders + case wrongHeaderType } diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index caa1ec14..027f31eb 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -16,23 +16,14 @@ struct SevenZipFileInfo { let numFiles: Int var files = [File]() - var properties = [(Int, [UInt8])]() + var properties = [SevenZipProperty]() init(_ pointerData: DataWithPointer) throws { - numFiles = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + numFiles = pointerData.szMbd().multiByteInteger for _ in 0.. 1 { for _ in 0.. [SevenZipProperty] { + var properties = [SevenZipProperty]() + while true { + let propertyType = pointerData.byte() + if propertyType == 0 { + break + } + let propertySize = pointerData.szMbd().multiByteInteger + properties.append(SevenZipProperty(type: propertyType, size: propertySize, + bytes: pointerData.bytes(count: propertySize))) + } + return properties } - var archiveProperties: [ArchiveProperty]? +} + +struct SevenZipHeader { + + var archiveProperties: [SevenZipProperty]? var additionalStreams: SevenZipStreamInfo? var mainStreams: SevenZipStreamInfo? var fileInfo: SevenZipFileInfo? init(_ pointerData: DataWithPointer) throws { - guard pointerData.byte() == 0x01 - else { throw SevenZipError.wrongPropertyID } - while true { let structureType = pointerData.byte() if structureType == 0x00 { // **Header - End** @@ -31,7 +42,7 @@ struct SevenZipHeader { } switch structureType { case 0x02: // **Header - ArchiveProperties** - archiveProperties = try SevenZipHeader.getArchiveProperties(pointerData) + archiveProperties = try SevenZipProperty.getProperties(pointerData) case 0x03: // **Header - AdditionalStreamsInfo** additionalStreams = try SevenZipStreamInfo(pointerData) // TODO: Or it can be more than one? case 0x04: // **Header - MainStreamsInfo** @@ -44,18 +55,7 @@ struct SevenZipHeader { } } - private static func getArchiveProperties(_ pointerData: DataWithPointer) throws -> [ArchiveProperty] { - var archiveProperties = [ArchiveProperty]() - while true { - let type = pointerData.byte() - if type == 0 { - break - } - let propertySize = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger - archiveProperties.append(ArchiveProperty(type: type, size: propertySize, - bytes: pointerData.bytes(count: propertySize))) - } - return archiveProperties - } + // TODO: Remove this function. + } diff --git a/Sources/7zPackInfo.swift b/Sources/7zPackInfo.swift index 9224cc1e..10f44089 100644 --- a/Sources/7zPackInfo.swift +++ b/Sources/7zPackInfo.swift @@ -13,8 +13,8 @@ struct SevenZipPackInfo { var digests = [UInt32?]() init(_ pointerData: DataWithPointer) throws { - packPosition = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger - numPackStreams = try pointerData.multiByteDecode(SevenZipError.multiByteIntegerError).multiByteInteger + packPosition = pointerData.szMbd().multiByteInteger + numPackStreams = pointerData.szMbd().multiByteInteger while true { let structureType = pointerData.byte() if structureType == 0x00 { // **PackInfo - End** @@ -23,7 +23,7 @@ struct SevenZipPackInfo { switch structureType { case 0x09: // **PackInfo - PackSizes** for _ in 0.. Date: Tue, 25 Jul 2017 14:09:56 +0300 Subject: [PATCH 012/113] Fix szMbd typo --- Sources/7zContainer.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index 5ec03d3a..7e957ab2 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -71,7 +71,7 @@ extension DataWithPointer { /// Abbreviation for "sevenZipMultiByteDecode". func szMbd() -> (multiByteInteger: Int, bytesProcessed: [UInt8]) { let firstByte = self.byte().toInt() - var mask = 1 + var mask = 0x80 var bytes = [firstByte.toUInt8()] var value = 0 for i in 0..<8 { From 133d2325fcfb40c98c04aea421a624027944b5ad Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 25 Jul 2017 17:35:03 +0300 Subject: [PATCH 013/113] Another iteration of 7zip implementation Extracted 7zProperty into a separate file; converted all structs to classes (to eliminates cows); replaced switches with ifs to ensure correct order of structures; overall completed implementation of structures (except fileinfo properties and packed header); codec renamed to coder. --- SWCompression.xcodeproj/project.pbxproj | 35 ++++---- Sources/{7zCodec.swift => 7zCoder.swift} | 4 +- Sources/7zCoderInfo.swift | 76 ++++++++-------- Sources/7zContainer.swift | 20 ++--- Sources/7zError.swift | 5 +- Sources/7zFileInfo.swift | 2 +- Sources/7zFolder.swift | 110 +++++++++++++++++------ Sources/7zHeader.swift | 70 ++++++--------- Sources/7zPackInfo.swift | 67 +++++++------- Sources/7zProperty.swift | 33 +++++++ Sources/7zStreamInfo.swift | 46 +++++----- Sources/7zSubstreamInfo.swift | 104 ++++++++++++++------- Sources/XZArchive.swift | 1 + 13 files changed, 350 insertions(+), 223 deletions(-) rename Sources/{7zCodec.swift => 7zCoder.swift} (90%) create mode 100644 Sources/7zProperty.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 540ecc94..9dbd4042 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -107,10 +107,10 @@ 06595E0F1F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; 06595E101F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; 06595E111F1E8252006501C2 /* 7zFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E0D1F1E8252006501C2 /* 7zFolder.swift */; }; - 06595E131F1E90C2006501C2 /* 7zCodec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCodec.swift */; }; - 06595E141F1E90C2006501C2 /* 7zCodec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCodec.swift */; }; - 06595E151F1E90C2006501C2 /* 7zCodec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCodec.swift */; }; - 06595E161F1E90C2006501C2 /* 7zCodec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCodec.swift */; }; + 06595E131F1E90C2006501C2 /* 7zCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCoder.swift */; }; + 06595E141F1E90C2006501C2 /* 7zCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCoder.swift */; }; + 06595E151F1E90C2006501C2 /* 7zCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCoder.swift */; }; + 06595E161F1E90C2006501C2 /* 7zCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCoder.swift */; }; 067518361E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518371E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518381E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; @@ -204,15 +204,15 @@ 06A9606B1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */; }; 06A9606C1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */; }; 06A9606D1F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */; }; - 06A9606F1F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; - 06A960701F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; - 06A960711F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; - 06A960721F1E7FE00078E6D1 /* MultiByteDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */; }; 06ADB2D91EBCEFA60053A188 /* TarContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */; }; 06ADB2DA1EBCEFA60053A188 /* TarContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */; }; 06ADB2DB1EBCEFA60053A188 /* TarContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */; }; 06ADB2DC1EBCEFA60053A188 /* TarContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */; }; 06B374CB1E0EECD500064853 /* random_file.zlib in Resources */ = {isa = PBXBuildFile; fileRef = 06B374CA1E0EECD500064853 /* random_file.zlib */; }; + 06B689581F278815007C9316 /* 7zProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B689571F278815007C9316 /* 7zProperty.swift */; }; + 06B689591F278815007C9316 /* 7zProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B689571F278815007C9316 /* 7zProperty.swift */; }; + 06B6895A1F278815007C9316 /* 7zProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B689571F278815007C9316 /* 7zProperty.swift */; }; + 06B6895B1F278815007C9316 /* 7zProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B689571F278815007C9316 /* 7zProperty.swift */; }; 06BB8F301E0C2C720079FB9E /* LZMA2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BB8F2F1E0C2C720079FB9E /* LZMA2.swift */; }; 06BB8F311E0C2C720079FB9E /* LZMA2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BB8F2F1E0C2C720079FB9E /* LZMA2.swift */; }; 06BB8F321E0C2C720079FB9E /* LZMA2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BB8F2F1E0C2C720079FB9E /* LZMA2.swift */; }; @@ -332,7 +332,7 @@ 0655694C1DC65A8000A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 065569591DC65A9400A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 06595E0D1F1E8252006501C2 /* 7zFolder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFolder.swift; sourceTree = ""; }; - 06595E121F1E90C2006501C2 /* 7zCodec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zCodec.swift; sourceTree = ""; }; + 06595E121F1E90C2006501C2 /* 7zCoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zCoder.swift; sourceTree = ""; }; 067518351E2A86F700D16354 /* ZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipContainer.swift; sourceTree = ""; }; 0675183C1E2A883600D16354 /* ZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipTests.swift; sourceTree = ""; }; 0680E1B01DDA2D7C005C05EB /* ZlibTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibTests.swift; sourceTree = ""; }; @@ -381,9 +381,9 @@ 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFileInfo.swift; sourceTree = ""; }; 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zCoderInfo.swift; sourceTree = ""; }; 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zSubstreamInfo.swift; sourceTree = ""; }; - 06A9606E1F1E7FE00078E6D1 /* MultiByteDecode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MultiByteDecode.swift; path = Sources/MultiByteDecode.swift; sourceTree = SOURCE_ROOT; }; 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TarContainer.swift; sourceTree = ""; }; 06B374CA1E0EECD500064853 /* random_file.zlib */ = {isa = PBXFileReference; lastKnownFileType = file; path = random_file.zlib; sourceTree = ""; }; + 06B689571F278815007C9316 /* 7zProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zProperty.swift; sourceTree = ""; }; 06BB8F2F1E0C2C720079FB9E /* LZMA2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LZMA2.swift; sourceTree = ""; }; 06BD0D201E3D0C630054AA5C /* SWCompressionSourceCode.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = SWCompressionSourceCode.zip; sourceTree = ""; }; 06BD0D211E3D0C630054AA5C /* TestDataDescriptor.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = TestDataDescriptor.zip; sourceTree = ""; }; @@ -536,11 +536,12 @@ children = ( 064F72231F1E5D4400017297 /* 7zContainer.swift */, 06A9605A1F1E7D990078E6D1 /* 7zHeader.swift */, + 06B689571F278815007C9316 /* 7zProperty.swift */, 06A960501F1E7D040078E6D1 /* 7zStreamInfo.swift */, 06A960551F1E7D0B0078E6D1 /* 7zPackInfo.swift */, 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */, 06595E0D1F1E8252006501C2 /* 7zFolder.swift */, - 06595E121F1E90C2006501C2 /* 7zCodec.swift */, + 06595E121F1E90C2006501C2 /* 7zCoder.swift */, 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */, 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */, 064F72281F1E638A00017297 /* 7zError.swift */, @@ -1090,7 +1091,7 @@ 063DF10E1DE1F07800F38082 /* Extensions.swift in Sources */, 06595E0F1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1141DE1F07800F38082 /* HuffmanTree.swift in Sources */, - 06595E141F1E90C2006501C2 /* 7zCodec.swift in Sources */, + 06595E141F1E90C2006501C2 /* 7zCoder.swift in Sources */, 06CDFCA91F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF11E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06491F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1129,6 +1130,7 @@ 064F722A1F1E638A00017297 /* 7zError.swift in Sources */, 06CDFCAE1F111DBE00292758 /* LZMAError.swift in Sources */, 063DF10B1DE1F07800F38082 /* DataWithPointer.swift in Sources */, + 06B689591F278815007C9316 /* 7zProperty.swift in Sources */, 061C06271F0E8A0300832F0C /* GzipError.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1145,7 +1147,7 @@ 063DF11A1DE1F2E200F38082 /* Extensions.swift in Sources */, 06595E101F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF11C1DE1F2E200F38082 /* HuffmanTree.swift in Sources */, - 06595E151F1E90C2006501C2 /* 7zCodec.swift in Sources */, + 06595E151F1E90C2006501C2 /* 7zCoder.swift in Sources */, 06CDFCAA1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF21E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064A1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1184,6 +1186,7 @@ 064F722B1F1E638A00017297 /* 7zError.swift in Sources */, 06CDFCAF1F111DBE00292758 /* LZMAError.swift in Sources */, 0655696F1DC65C2B00A47E66 /* GzipArchive.swift in Sources */, + 06B6895A1F278815007C9316 /* 7zProperty.swift in Sources */, 061C06281F0E8A0300832F0C /* GzipError.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1200,7 +1203,7 @@ 063DF10F1DE1F07800F38082 /* Extensions.swift in Sources */, 06595E111F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1151DE1F07800F38082 /* HuffmanTree.swift in Sources */, - 06595E161F1E90C2006501C2 /* 7zCodec.swift in Sources */, + 06595E161F1E90C2006501C2 /* 7zCoder.swift in Sources */, 06CDFCAB1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF31E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064B1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1239,6 +1242,7 @@ 064F722C1F1E638A00017297 /* 7zError.swift in Sources */, 06CDFCB01F111DBE00292758 /* LZMAError.swift in Sources */, 063DF10C1DE1F07800F38082 /* DataWithPointer.swift in Sources */, + 06B6895B1F278815007C9316 /* 7zProperty.swift in Sources */, 061C06291F0E8A0300832F0C /* GzipError.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1255,7 +1259,7 @@ 063DF10D1DE1F07800F38082 /* Extensions.swift in Sources */, 06595E0E1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1131DE1F07800F38082 /* HuffmanTree.swift in Sources */, - 06595E131F1E90C2006501C2 /* 7zCodec.swift in Sources */, + 06595E131F1E90C2006501C2 /* 7zCoder.swift in Sources */, 06CDFCA81F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF01E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06481F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1294,6 +1298,7 @@ 064F72291F1E638A00017297 /* 7zError.swift in Sources */, 06CDFCAD1F111DBE00292758 /* LZMAError.swift in Sources */, 063DF10A1DE1F07800F38082 /* DataWithPointer.swift in Sources */, + 06B689581F278815007C9316 /* 7zProperty.swift in Sources */, 061C06261F0E8A0300832F0C /* GzipError.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Sources/7zCodec.swift b/Sources/7zCoder.swift similarity index 90% rename from Sources/7zCodec.swift rename to Sources/7zCoder.swift index 1363d76c..ae6c120b 100644 --- a/Sources/7zCodec.swift +++ b/Sources/7zCoder.swift @@ -5,7 +5,7 @@ import Foundation -struct SevenZipCodec { +class SevenZipCoder { let idSize: Int let isComplex: Bool @@ -27,6 +27,8 @@ struct SevenZipCodec { isComplex = flags & 0x10 != 0 hasAttributes = flags & 0x20 != 0 + guard flags & 0x80 == 0 else { throw SevenZipError.altMethodsNotSupported } + id = pointerData.bytes(count: idSize) numInStreams = isComplex ? pointerData.szMbd().multiByteInteger : 1 diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index 12e4c9a3..2ce8d596 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -5,51 +5,50 @@ import Foundation -struct SevenZipCoderInfo { +class SevenZipCoderInfo { let numFolders: Int let external: UInt8 - var folders = [SevenZipFolder]() - var dataStreamIndex: Int? - let unpackSizes: [Int] - var digests = [UInt32?]() + private(set) var folders = [SevenZipFolder]() + + init() { + numFolders = 0 + external = 0 + } init(_ pointerData: DataWithPointer) throws { - guard pointerData.byte() == 0x0B - else { throw SevenZipError.wrongPropertyID } + var type = pointerData.byte() + guard type == 0x0B else { throw SevenZipError.wrongPropertyID } + numFolders = pointerData.szMbd().multiByteInteger external = pointerData.byte() - switch external { - case 0: - for _ in 0.. 0 { for _ in 0..= numBindPairs else { throw SevenZipError.wrongStreamsNumber } + + numPackedStreams = totalInputStreams - numBindPairs + packedStreams = Array(repeating: 0, count: numPackedStreams) + if numPackedStreams == 1 { + var i = 0 + while i < totalInputStreams { + if self.bindPairForInStream(i) < 0 { + break + } + i += 1 + } + if i == totalInputStreams { + throw SevenZipError.wrongStreamsNumber + } + packedStreams[0] = i + } else { + for i in 0.. [SevenZipCoder] { + var result = [SevenZipCoder]() + var current = 0 + while current != -1 { + result.append(coders[current]) + let pair = bindPairForOutStream(current) + current = pair != -1 ? bindPairs[pair].inIndex : -1 + } + return result + } + + func bindPairForInStream(_ index: Int) -> Int { + for i in 0.. 1 { - for _ in 0.. Int { + for i in 0.. Int { + if (totalOutputStreams == 0) { + return 0 + } + for i in stride(from: totalOutputStreams - 1, through: 0, by: -1) { + if bindPairForOutStream(i) < 0 { + return unpackSizes[i] + } + } + return 0 + } + } diff --git a/Sources/7zHeader.swift b/Sources/7zHeader.swift index 3d362532..9d6090c5 100644 --- a/Sources/7zHeader.swift +++ b/Sources/7zHeader.swift @@ -5,29 +5,7 @@ import Foundation -struct SevenZipProperty { - - let type: UInt8 - let size: Int - let bytes: [UInt8] - - static func getProperties(_ pointerData: DataWithPointer) throws -> [SevenZipProperty] { - var properties = [SevenZipProperty]() - while true { - let propertyType = pointerData.byte() - if propertyType == 0 { - break - } - let propertySize = pointerData.szMbd().multiByteInteger - properties.append(SevenZipProperty(type: propertyType, size: propertySize, - bytes: pointerData.bytes(count: propertySize))) - } - return properties - } - -} - -struct SevenZipHeader { +class SevenZipHeader { var archiveProperties: [SevenZipProperty]? var additionalStreams: SevenZipStreamInfo? @@ -35,27 +13,33 @@ struct SevenZipHeader { var fileInfo: SevenZipFileInfo? init(_ pointerData: DataWithPointer) throws { - while true { - let structureType = pointerData.byte() - if structureType == 0x00 { // **Header - End** - break - } - switch structureType { - case 0x02: // **Header - ArchiveProperties** - archiveProperties = try SevenZipProperty.getProperties(pointerData) - case 0x03: // **Header - AdditionalStreamsInfo** - additionalStreams = try SevenZipStreamInfo(pointerData) // TODO: Or it can be more than one? - case 0x04: // **Header - MainStreamsInfo** - mainStreams = try SevenZipStreamInfo(pointerData) - case 0x05: // **Header - FilesInfo** - fileInfo = try SevenZipFileInfo(pointerData) - default: - throw SevenZipError.wrongPropertyID - } + var type = pointerData.byte() + + if type == 0x02 { + archiveProperties = try SevenZipProperty.getProperties(pointerData) + type = pointerData.byte() } - } - // TODO: Remove this function. + if type == 0x03 { + // TODO: Do we support this? + // TODO: Or it can be more than one? + additionalStreams = try SevenZipStreamInfo(pointerData) + type = pointerData.byte() + } + + if type == 0x04 { + mainStreams = try SevenZipStreamInfo(pointerData) + type = pointerData.byte() + } + + if type == 0x05 { + fileInfo = try SevenZipFileInfo(pointerData) + type = pointerData.byte() + } + + if type != 0x00 { + throw SevenZipError.wrongEnd + } + } - } diff --git a/Sources/7zPackInfo.swift b/Sources/7zPackInfo.swift index 10f44089..9451aa2e 100644 --- a/Sources/7zPackInfo.swift +++ b/Sources/7zPackInfo.swift @@ -5,50 +5,51 @@ import Foundation -struct SevenZipPackInfo { +class SevenZipPackInfo { let packPosition: Int let numPackStreams: Int - var packSizes = [Int]() - var digests = [UInt32?]() + private(set) var packSizes = [Int]() + private(set) var digests = [UInt32?]() init(_ pointerData: DataWithPointer) throws { packPosition = pointerData.szMbd().multiByteInteger numPackStreams = pointerData.szMbd().multiByteInteger - while true { - let structureType = pointerData.byte() - if structureType == 0x00 { // **PackInfo - End** - break + + var type = pointerData.byte() + + if type == 0x09 { + for _ in 0.. [SevenZipProperty] { + var properties = [SevenZipProperty]() + while true { + let propertyType = pointerData.byte() + if propertyType == 0 { + break + } + let propertySize = pointerData.szMbd().multiByteInteger + properties.append(SevenZipProperty(propertyType, propertySize, pointerData.bytes(count: propertySize))) + } + return properties + } + +} diff --git a/Sources/7zStreamInfo.swift b/Sources/7zStreamInfo.swift index 557a4939..e9e1bccb 100644 --- a/Sources/7zStreamInfo.swift +++ b/Sources/7zStreamInfo.swift @@ -5,31 +5,35 @@ import Foundation -struct SevenZipStreamInfo { +class SevenZipStreamInfo { var packInfo: SevenZipPackInfo? - var coderInfo: SevenZipCoderInfo? + var coderInfo: SevenZipCoderInfo var substreamInfo: SevenZipSubstreamInfo? - init(_ pointerData: DataWithPointer) throws { - while true { - let structureType = pointerData.byte() - if structureType == 0x00 { // **StreamsInfo - End** - break - } - switch structureType { - case 0x06: // **StreamsInfo - PackInfo** - packInfo = try SevenZipPackInfo(pointerData) - case 0x07: // **StreamsInfo - CodersInfo** - coderInfo = try SevenZipCoderInfo(pointerData) - case 0x08: // **StreamsInfo - SubstreamsInfo** - guard let numFolders = coderInfo?.numFolders - else { throw SevenZipError.unknownNumFolders } - substreamInfo = try SevenZipSubstreamInfo(pointerData, numFolders) - default: - throw SevenZipError.wrongPropertyID - } + init(_ pointerData: DataWithPointer) throws { + var type = pointerData.byte() + + if type == 0x06 { + packInfo = try SevenZipPackInfo(pointerData) + type = pointerData.byte() + } + + if type == 0x07 { + coderInfo = try SevenZipCoderInfo(pointerData) + type = pointerData.byte() + } else { + coderInfo = SevenZipCoderInfo() + } + + if type == 0x08 { + substreamInfo = try SevenZipSubstreamInfo(pointerData, coderInfo) + type = pointerData.byte() + } + + if type != 0x00 { + throw SevenZipError.wrongEnd } } - + } diff --git a/Sources/7zSubstreamInfo.swift b/Sources/7zSubstreamInfo.swift index b6d15485..54bb4f4a 100644 --- a/Sources/7zSubstreamInfo.swift +++ b/Sources/7zSubstreamInfo.swift @@ -5,52 +5,90 @@ import Foundation -struct SevenZipSubstreamInfo { +class SevenZipSubstreamInfo { var numUnpackStreamsInFolders = [Int]() var unpackSizes = [Int]() var digests = [UInt32?]() - init(_ pointerData: DataWithPointer, _ numFolders: Int) throws { - while true { - let structureType = pointerData.byte() - if structureType == 0x00 { // **SubstreamsInfo - End** - break + init(_ pointerData: DataWithPointer, _ coderInfo: SevenZipCoderInfo) throws { + var totalUnpackStreams = coderInfo.folders.count + + var type = pointerData.byte() + + if type == 0x0D { + totalUnpackStreams = 0 + for folder in coderInfo.folders { + let numStreams = pointerData.szMbd().multiByteInteger + folder.numUnpackSubstreams = numStreams + totalUnpackStreams += numStreams } - switch structureType { - case 0x0D: // **SubstreamsInfo - NumUnpackStreamsInFolders** - for _ in 0.. (multiByteInteger: Int, bytesProcessed: [UInt8]) { var i = 1 var result = self.byte().toInt() From 0287bd4443820bb3a2937dc082a0029ab981de56 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 25 Jul 2017 21:17:36 +0300 Subject: [PATCH 014/113] Make 7zCoder equatable; add packed header processing --- Sources/7zCoder.swift | 19 ++++++++++++- Sources/7zContainer.swift | 58 +++++++++++++++++++++++++++++++++++---- Sources/7zError.swift | 4 +++ Sources/7zFolder.swift | 9 ++++++ 4 files changed, 83 insertions(+), 7 deletions(-) diff --git a/Sources/7zCoder.swift b/Sources/7zCoder.swift index ae6c120b..208b7879 100644 --- a/Sources/7zCoder.swift +++ b/Sources/7zCoder.swift @@ -23,7 +23,7 @@ class SevenZipCoder { let flags = pointerData.byte() guard flags & 0xC0 == 0 else { throw SevenZipError.reservedCodecFlags } - idSize = (flags & 0xF).toInt() + idSize = (flags & 0x0F).toInt() isComplex = flags & 0x10 != 0 hasAttributes = flags & 0x20 != 0 @@ -40,3 +40,20 @@ class SevenZipCoder { } } } + +extension SevenZipCoder: Equatable { + + static func == (lhs: SevenZipCoder, rhs: SevenZipCoder) -> Bool { + let propertiesEqual: Bool + if lhs.properties == nil && rhs.properties == nil { + propertiesEqual = true + } else if lhs.properties != nil && rhs.properties != nil { + propertiesEqual = lhs.properties! == rhs.properties! + } else { + propertiesEqual = false + } + return lhs.id == rhs.id && lhs.numInStreams == rhs.numInStreams && + lhs.numOutStreams == rhs.numOutStreams && propertiesEqual + } + +} diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index 96815075..03780144 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -7,6 +7,12 @@ import Foundation public class SevenZipContainer: Container { + static let signatureHeaderSize = 0 + + // Coder IDs + static let lzma2ID: [UInt8] = [0x21] + static let lzmaID: [UInt8] = [0x03, 0x01, 0x01] + public static func open(container data: Data) throws -> [ContainerEntry] { /// Object with input data which supports convenient work with bit shifts. let pointerData = DataWithPointer(data: data) @@ -37,17 +43,57 @@ public class SevenZipContainer: Container { let headerStartIndex = pointerData.index var type = pointerData.byte() + let header: SevenZipHeader if type == 0x17 { - _ = try SevenZipStreamInfo(pointerData) + let packedHeaderStreamInfo = try SevenZipStreamInfo(pointerData) + let folder = packedHeaderStreamInfo.coderInfo.folders[0] + guard let packInfo = packedHeaderStreamInfo.packInfo else { return [] } // TODO: throw + let folderOffset = signatureHeaderSize + packInfo.packPosition + pointerData.index = folderOffset + var packedHeaderEndIndex: Int? = nil + var headerPointerData = DataWithPointer(data: pointerData.data) + headerPointerData.index = pointerData.index + for coder in folder.orderedCoders() { + guard coder.numInStreams == 1 || coder.numOutStreams == 1 + else { throw SevenZipError.multiStreamNotSupported } + let decodedData: Data + let unpackSize = folder.unpackSize(for: coder) + if coder.id == lzma2ID { + precondition(coder.propertiesSize == 1) // TODO: + decodedData = Data(bytes: try LZMA2.decompress(LZMA2.dictionarySize(coder.properties![0]), // TODO: + pointerData)) + } else if coder.id == lzmaID { + var dataToDecode = Data(bytes: coder.properties!) // TODO: + dataToDecode.append(headerPointerData.data.subdata(in: headerPointerData.index.. Int { + for i in 0.. Date: Tue, 25 Jul 2017 21:17:51 +0300 Subject: [PATCH 015/113] Some small improvements to LZMADecoder code --- Sources/LZMADecoder.swift | 64 ++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/Sources/LZMADecoder.swift b/Sources/LZMADecoder.swift index c171327b..98457cdf 100644 --- a/Sources/LZMADecoder.swift +++ b/Sources/LZMADecoder.swift @@ -6,18 +6,18 @@ import Foundation struct LZMAConstants { - static let topValue: Int = 1 << 24 - static let numBitModelTotalBits: Int = 11 - static let numMoveBits: Int = 5 - static let probInitValue: Int = ((1 << numBitModelTotalBits) / 2) - static let numPosBitsMax: Int = 4 - static let numStates: Int = 12 - static let numLenToPosStates: Int = 4 - static let numAlignBits: Int = 4 - static let startPosModelIndex: Int = 4 - static let endPosModelIndex: Int = 14 - static let numFullDistances: Int = (1 << (endPosModelIndex >> 1)) - static let matchMinLen: Int = 2 + static let topValue = 1 << 24 + static let numBitModelTotalBits = 11 + static let numMoveBits = 5 + static let probInitValue = ((1 << numBitModelTotalBits) / 2) + static let numPosBitsMax = 4 + static let numStates = 12 + static let numLenToPosStates = 4 + static let numAlignBits = 4 + static let startPosModelIndex = 4 + static let endPosModelIndex = 14 + static let numFullDistances = (1 << (endPosModelIndex >> 1)) + static let matchMinLen = 2 // LZMAConstants.numStates << LZMAConstants.numPosBitsMax = 192 } @@ -28,19 +28,19 @@ class LZMADecoder { private var lc: UInt8 = 0 private var lp: UInt8 = 0 private var pb: UInt8 = 0 - private var dictionarySize: Int = 0 + private var dictionarySize = 0 - private var rangeDecoder: LZMARangeDecoder = LZMARangeDecoder() - private var posSlotDecoder: [LZMABitTreeDecoder] = [] - private var alignDecoder: LZMABitTreeDecoder - private var lenDecoder: LZMALenDecoder - private var repLenDecoder: LZMALenDecoder + private var rangeDecoder = LZMARangeDecoder() + private var posSlotDecoder = [LZMABitTreeDecoder]() + private var alignDecoder = LZMABitTreeDecoder(numBits: LZMAConstants.numAlignBits) + private var lenDecoder = LZMALenDecoder() + private var repLenDecoder = LZMALenDecoder() /** For literal decoding we need `1 << (lc + lp)` amount of tables. Each table contains 0x300 probabilities. */ - private var literalProbs: [[Int]] = [] + private var literalProbs = [[Int]]() /** Array with all probabilities: @@ -52,35 +52,31 @@ class LZMADecoder { - 229..<241: isRepG2 - 241..<433: isRep0Long */ - private var probabilities: [Int] = [] + private var probabilities = [Int]() - private var posDecoders: [Int] = [] + private var posDecoders = [Int]() // 'Distance history table'. - private var rep0: Int = 0 - private var rep1: Int = 0 - private var rep2: Int = 0 - private var rep3: Int = 0 + private var rep0 = 0 + private var rep1 = 0 + private var rep2 = 0 + private var rep3 = 0 /// Is used to select exact variable from 'IsRep', 'IsRepG0', 'IsRepG1' and 'IsRepG2' arrays. - private var state: Int = 0 + private var state = 0 /// An array for storing output data. - var out: [UInt8] = [] + var out = [UInt8]() // This array will also serve as dictionary and out window. - private var dictStart: Int = 0 - private var dictEnd: Int = 0 + private var dictStart = 0 + private var dictEnd = 0 /// For proper processing of LZMA data `resetState` and `resetProperties` functions should be called at least once. /// If that has happened, then stateReset is true. - private var stateReset: Bool = false + private var stateReset = false init(_ pointerData: DataWithPointer) throws { self.pointerData = pointerData - self.alignDecoder = LZMABitTreeDecoder(numBits: LZMAConstants.numAlignBits) - // There are two types of matches so we need two decoders for them. - self.lenDecoder = LZMALenDecoder() - self.repLenDecoder = LZMALenDecoder() } // MARK: LZMA2 related functions. From c608d2b48ffbfced4b09942e72b04195c70602d5 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 25 Jul 2017 22:02:56 +0300 Subject: [PATCH 016/113] Add ability to specify lzma properties for LZMADecoder externally --- Sources/LZMA.swift | 9 ++------- Sources/LZMADecoder.swift | 26 ++++++++++++-------------- Sources/ZipEntry.swift | 4 +++- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/Sources/LZMA.swift b/Sources/LZMA.swift index 8c685d00..49b9c92c 100644 --- a/Sources/LZMA.swift +++ b/Sources/LZMA.swift @@ -27,14 +27,9 @@ public class LZMA: DecompressionAlgorithm { return Data(bytes: try decompress(pointerData)) } - /** - - Parameter externalUncompressedSize: stream doesn't contain uncompressed size property, - and decoder should use externally specified uncompressed size. - Used in ZIP containers with LZMA compression. - */ - static func decompress(_ pointerData: DataWithPointer, _ externalUncompressedSize: Int? = nil) throws -> [UInt8] { + static func decompress(_ pointerData: DataWithPointer) throws -> [UInt8] { let lzmaDecoder = try LZMADecoder(pointerData) - try lzmaDecoder.decodeLZMA(externalUncompressedSize) + try lzmaDecoder.decodeLZMA() return lzmaDecoder.out } diff --git a/Sources/LZMADecoder.swift b/Sources/LZMADecoder.swift index 98457cdf..f60ff0b9 100644 --- a/Sources/LZMADecoder.swift +++ b/Sources/LZMADecoder.swift @@ -86,18 +86,16 @@ class LZMADecoder { self.dictStart = self.dictEnd } - private func resetProperties() throws { - var properties = pointerData.byte() + private func resetProperties(_ properties: UInt8) throws { if properties >= (9 * 5 * 5) { throw LZMAError.wrongProperties } /// The number of literal context bits self.lc = properties % 9 - properties /= 9 /// The number of pos bits - self.pb = properties / 5 + self.pb = (properties / 9) / 5 /// The number of literal pos bits - self.lp = properties % 5 + self.lp = (properties / 9) % 5 // We need to 'reset state' because several properties of Decoder depend on the values of lc, lp, pb. self.resetState() @@ -151,10 +149,10 @@ class LZMADecoder { case 1: self.resetState() case 2: - try self.resetProperties() + try self.resetProperties(pointerData.byte()) dataStartIndex += 1 case 3: - try self.resetProperties() + try self.resetProperties(pointerData.byte()) dataStartIndex += 1 self.resetDictionary(dictSize) default: @@ -197,19 +195,19 @@ class LZMADecoder { and decoder should use externally specified uncompressed size. Used in ZIP containers with LZMA compression. */ - func decodeLZMA(_ externalUncompressedSize: Int? = nil) throws { + func decodeLZMA(_ externalUncompressedSize: Int? = nil, _ propertiesByte: UInt8? = nil, _ dSize: Int? = nil) throws { // Firstly, we need to parse LZMA properties. - try self.resetProperties() - let dictSize = pointerData.uint32().toInt() + try self.resetProperties(propertiesByte ?? pointerData.byte()) + let dictSize = dSize ?? pointerData.uint32().toInt() dictionarySize = dictSize < (1 << 12) ? 1 << 12 : dictSize /// Size of uncompressed data. -1 means it is unknown/undefined. - var uncompressedSize = pointerData.uint64().toInt() - uncompressedSize = Double(uncompressedSize) == pow(Double(2), Double(64)) - 1 ? -1 : uncompressedSize - + var uncompressedSize: Int if let extUncompSize = externalUncompressedSize { - pointerData.index -= 8 uncompressedSize = extUncompSize + } else { + uncompressedSize = pointerData.uint64().toInt() + uncompressedSize = Double(uncompressedSize) == pow(Double(2), Double(64)) - 1 ? -1 : uncompressedSize } try decode(&uncompressedSize) diff --git a/Sources/ZipEntry.swift b/Sources/ZipEntry.swift index 76647abd..2467e693 100644 --- a/Sources/ZipEntry.swift +++ b/Sources/ZipEntry.swift @@ -128,7 +128,9 @@ public class ZipEntry: ContainerEntry { case 14: #if (!SWCOMP_ZIP_POD_BUILD) || (SWCOMP_ZIP_POD_BUILD && SWCOMP_ZIP_POD_LZMA) pointerData.index += 4 // Skipping LZMA SDK version and size of properties. - fileBytes = try LZMA.decompress(pointerData, uncompSize) + let lzmaDecoder = try LZMADecoder(pointerData) + try lzmaDecoder.decodeLZMA(uncompSize) + fileBytes = lzmaDecoder.out #else throw ZipError.compressionNotSupported #endif From 27ca50ecfbea4625d228a5a351167db4e38a7179 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 25 Jul 2017 22:03:33 +0300 Subject: [PATCH 017/113] Correctly unpack LZMA/LZMA2 packed headers --- Sources/7zCoder.swift | 7 ++++++ Sources/7zContainer.swift | 53 +++++++++++++++++++++++++++++---------- Sources/7zError.swift | 1 + 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/Sources/7zCoder.swift b/Sources/7zCoder.swift index 208b7879..c4306362 100644 --- a/Sources/7zCoder.swift +++ b/Sources/7zCoder.swift @@ -7,6 +7,12 @@ import Foundation class SevenZipCoder { + /// Possible coder IDs. + struct ID { + static let lzma2: [UInt8] = [0x21] + static let lzma: [UInt8] = [0x03, 0x01, 0x01] + } + let idSize: Int let isComplex: Bool let hasAttributes: Bool @@ -39,6 +45,7 @@ class SevenZipCoder { properties = pointerData.bytes(count: propertiesSize!) } } + } extension SevenZipCoder: Equatable { diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index 03780144..d6f791cf 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -7,11 +7,7 @@ import Foundation public class SevenZipContainer: Container { - static let signatureHeaderSize = 0 - - // Coder IDs - static let lzma2ID: [UInt8] = [0x21] - static let lzmaID: [UInt8] = [0x03, 0x01, 0x01] + static let signatureHeaderSize = 32 public static func open(container data: Data) throws -> [ContainerEntry] { /// Object with input data which supports convenient work with bit shifts. @@ -47,36 +43,67 @@ public class SevenZipContainer: Container { if type == 0x17 { let packedHeaderStreamInfo = try SevenZipStreamInfo(pointerData) + let folder = packedHeaderStreamInfo.coderInfo.folders[0] guard let packInfo = packedHeaderStreamInfo.packInfo else { return [] } // TODO: throw + let folderOffset = signatureHeaderSize + packInfo.packPosition pointerData.index = folderOffset + var packedHeaderEndIndex: Int? = nil + var headerPointerData = DataWithPointer(data: pointerData.data) headerPointerData.index = pointerData.index + for coder in folder.orderedCoders() { guard coder.numInStreams == 1 || coder.numOutStreams == 1 else { throw SevenZipError.multiStreamNotSupported } - let decodedData: Data + let unpackSize = folder.unpackSize(for: coder) - if coder.id == lzma2ID { - precondition(coder.propertiesSize == 1) // TODO: - decodedData = Data(bytes: try LZMA2.decompress(LZMA2.dictionarySize(coder.properties![0]), // TODO: + + let decodedData: Data + + if coder.id == SevenZipCoder.ID.lzma2 { + // Dictionary size is stored in coder's properties. + guard let properties = coder.properties + else { throw SevenZipError.wrongCoderProperties } + guard properties.count == 1 + else { throw SevenZipError.wrongCoderProperties } + + decodedData = Data(bytes: try LZMA2.decompress(LZMA2.dictionarySize(properties[0]), pointerData)) - } else if coder.id == lzmaID { - var dataToDecode = Data(bytes: coder.properties!) // TODO: - dataToDecode.append(headerPointerData.data.subdata(in: headerPointerData.index.. Date: Tue, 25 Jul 2017 22:17:19 +0300 Subject: [PATCH 018/113] Extract packed header processing code into initializer --- Sources/7zContainer.swift | 81 +++------------------------------------ Sources/7zError.swift | 1 + Sources/7zHeader.swift | 76 ++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 76 deletions(-) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index d6f791cf..bc92a6e7 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -37,94 +37,23 @@ public class SevenZipContainer: Container { // **Header** pointerData.index += nextHeaderOffset let headerStartIndex = pointerData.index + let headerEndIndex: Int - var type = pointerData.byte() + let type = pointerData.byte() let header: SevenZipHeader if type == 0x17 { let packedHeaderStreamInfo = try SevenZipStreamInfo(pointerData) - - let folder = packedHeaderStreamInfo.coderInfo.folders[0] - guard let packInfo = packedHeaderStreamInfo.packInfo else { return [] } // TODO: throw - - let folderOffset = signatureHeaderSize + packInfo.packPosition - pointerData.index = folderOffset - - var packedHeaderEndIndex: Int? = nil - - var headerPointerData = DataWithPointer(data: pointerData.data) - headerPointerData.index = pointerData.index - - for coder in folder.orderedCoders() { - guard coder.numInStreams == 1 || coder.numOutStreams == 1 - else { throw SevenZipError.multiStreamNotSupported } - - let unpackSize = folder.unpackSize(for: coder) - - let decodedData: Data - - if coder.id == SevenZipCoder.ID.lzma2 { - // Dictionary size is stored in coder's properties. - guard let properties = coder.properties - else { throw SevenZipError.wrongCoderProperties } - guard properties.count == 1 - else { throw SevenZipError.wrongCoderProperties } - - decodedData = Data(bytes: try LZMA2.decompress(LZMA2.dictionarySize(properties[0]), - pointerData)) - } else if coder.id == SevenZipCoder.ID.lzma { - // Both properties' byte (lp, lc, pb) and dictionary size are stored in coder's properties. - guard let properties = coder.properties - else { throw SevenZipError.wrongCoderProperties } - guard properties.count == 5 - else { throw SevenZipError.wrongCoderProperties } - - let lzmaDecoder = try LZMADecoder(headerPointerData) - - var dictionarySize = 0 - for i in 1..<4 { - dictionarySize |= properties[i].toInt() << (8 * (i - 1)) - } - - try lzmaDecoder.decodeLZMA(unpackSize, properties[0], dictionarySize) - decodedData = Data(bytes: lzmaDecoder.out) - } else { - throw SevenZipError.compressionNotSupported - } - - guard decodedData.count == unpackSize - else { throw SevenZipError.wrongDataSize } - - // Save header's data end index after first pass. - // Necessary to calculate and check packed size later. - if packedHeaderEndIndex == nil { - packedHeaderEndIndex = headerPointerData.index - } - - headerPointerData = DataWithPointer(data: decodedData) - } - - guard packedHeaderEndIndex! - pointerData.index == packInfo.packSizes[0] - else { throw SevenZipError.wrongDataSize } - guard headerPointerData.size == folder.unpackSize() - else { throw SevenZipError.wrongDataSize } - if let crc = folder.crc { - guard CheckSums.crc32(headerPointerData.data) == crc - else { throw SevenZipError.wrongCRC } - } - header = try SevenZipHeader(headerPointerData) - type = pointerData.byte() + headerEndIndex = pointerData.index + header = try SevenZipHeader(pointerData, using: packedHeaderStreamInfo) } else if type == 0x01 { header = try SevenZipHeader(pointerData) - type = pointerData.byte() + headerEndIndex = pointerData.index } else { throw SevenZipError.wrongPropertyID } - print(header) - // TODO: Header checks may be incorrect for packed headers. // Check header size - let headerEndIndex = pointerData.index guard headerEndIndex - headerStartIndex == nextHeaderSize else { throw SevenZipError.wrongHeaderSize } diff --git a/Sources/7zError.swift b/Sources/7zError.swift index 2f6566d1..5ff2178b 100644 --- a/Sources/7zError.swift +++ b/Sources/7zError.swift @@ -25,4 +25,5 @@ public enum SevenZipError: Error { case wrongDataSize case wrongCRC case wrongCoderProperties + case noPackInfo } diff --git a/Sources/7zHeader.swift b/Sources/7zHeader.swift index 9d6090c5..65078e58 100644 --- a/Sources/7zHeader.swift +++ b/Sources/7zHeader.swift @@ -42,4 +42,80 @@ class SevenZipHeader { } } + convenience init(_ pointerData: DataWithPointer, using streamInfo: SevenZipStreamInfo) throws { + let folder = streamInfo.coderInfo.folders[0] + guard let packInfo = streamInfo.packInfo + else { throw SevenZipError.noPackInfo } + + let folderOffset = SevenZipContainer.signatureHeaderSize + packInfo.packPosition + pointerData.index = folderOffset + + var packedHeaderEndIndex: Int? = nil + + var headerPointerData = DataWithPointer(data: pointerData.data) + headerPointerData.index = pointerData.index + + for coder in folder.orderedCoders() { + guard coder.numInStreams == 1 || coder.numOutStreams == 1 + else { throw SevenZipError.multiStreamNotSupported } + + let unpackSize = folder.unpackSize(for: coder) + + let decodedData: Data + + if coder.id == SevenZipCoder.ID.lzma2 { + // Dictionary size is stored in coder's properties. + guard let properties = coder.properties + else { throw SevenZipError.wrongCoderProperties } + guard properties.count == 1 + else { throw SevenZipError.wrongCoderProperties } + + decodedData = Data(bytes: try LZMA2.decompress(LZMA2.dictionarySize(properties[0]), + pointerData)) + } else if coder.id == SevenZipCoder.ID.lzma { + // Both properties' byte (lp, lc, pb) and dictionary size are stored in coder's properties. + guard let properties = coder.properties + else { throw SevenZipError.wrongCoderProperties } + guard properties.count == 5 + else { throw SevenZipError.wrongCoderProperties } + + let lzmaDecoder = try LZMADecoder(headerPointerData) + + var dictionarySize = 0 + for i in 1..<4 { + dictionarySize |= properties[i].toInt() << (8 * (i - 1)) + } + + try lzmaDecoder.decodeLZMA(unpackSize, properties[0], dictionarySize) + decodedData = Data(bytes: lzmaDecoder.out) + } else { + throw SevenZipError.compressionNotSupported + } + + guard decodedData.count == unpackSize + else { throw SevenZipError.wrongDataSize } + + // Save header's data end index after first pass. + // Necessary to calculate and check packed size later. + if packedHeaderEndIndex == nil { + packedHeaderEndIndex = headerPointerData.index + } + + headerPointerData = DataWithPointer(data: decodedData) + } + + guard packedHeaderEndIndex! - pointerData.index == packInfo.packSizes[0] + else { throw SevenZipError.wrongDataSize } + guard headerPointerData.size == folder.unpackSize() + else { throw SevenZipError.wrongDataSize } + if let crc = folder.crc { + guard CheckSums.crc32(headerPointerData.data) == crc + else { throw SevenZipError.wrongCRC } + } + + guard headerPointerData.byte() == 0x01 + else { throw SevenZipError.wrongPropertyID } + try self.init(headerPointerData) + } + } From f4786d0cba8df0c61e254b6c48e84badc941bf22 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Fri, 28 Jul 2017 18:59:30 +0300 Subject: [PATCH 019/113] Parse files' properties --- Sources/7zCoderInfo.swift | 6 +- Sources/7zError.swift | 7 ++ Sources/7zFileInfo.swift | 165 +++++++++++++++++++++++++++++++++++++- Sources/7zHeader.swift | 13 +++ 4 files changed, 183 insertions(+), 8 deletions(-) diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index 2ce8d596..58f64a32 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -24,10 +24,8 @@ class SevenZipCoderInfo { numFolders = pointerData.szMbd().multiByteInteger external = pointerData.byte() - if external != 0 { - // TODO: Do we support this? - throw SevenZipError.externalNotSupported - } + guard external == 0 + else { throw SevenZipError.externalNotSupported } // TODO: Do we support this? for _ in 0..= propertySize + else { throw SevenZipError.incompleteProperty } + bitReader.index += propertySize + default: // Unknown property // TODO: Maybe we should store it for testing. + guard bitReader.size - bitReader.index >= propertySize + else { throw SevenZipError.incompleteProperty } + bitReader.index += propertySize + } + } + pointerData.index = bitReader.index + + var emptyFileIndex = 0 + for i in 0.. Date: Fri, 28 Jul 2017 19:00:07 +0300 Subject: [PATCH 020/113] Throw error on detected additional streams Because we don't support them (yet?) --- Sources/7zHeader.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Sources/7zHeader.swift b/Sources/7zHeader.swift index 5b8b8e4b..3c33430f 100644 --- a/Sources/7zHeader.swift +++ b/Sources/7zHeader.swift @@ -23,8 +23,9 @@ class SevenZipHeader { if type == 0x03 { // TODO: Do we support this? // TODO: Or it can be more than one? - additionalStreams = try SevenZipStreamInfo(pointerData) - type = pointerData.byte() + throw SevenZipError.additionalStreamsNotSupported +// additionalStreams = try SevenZipStreamInfo(pointerData) +// type = pointerData.byte() } if type == 0x04 { From e0f84717de19e85f2eeb2c6d38f3121aef8ca1ad Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Fri, 28 Jul 2017 19:03:14 +0300 Subject: [PATCH 021/113] Return only integer in multi-byte decode function for 7z We never use its bytes for anything. --- Sources/7zCoder.swift | 6 +++--- Sources/7zCoderInfo.swift | 4 ++-- Sources/7zContainer.swift | 10 +++------- Sources/7zFileInfo.swift | 4 ++-- Sources/7zFolder.swift | 8 ++++---- Sources/7zPackInfo.swift | 6 +++--- Sources/7zProperty.swift | 2 +- Sources/7zSubstreamInfo.swift | 4 ++-- 8 files changed, 20 insertions(+), 24 deletions(-) diff --git a/Sources/7zCoder.swift b/Sources/7zCoder.swift index c4306362..c488f06b 100644 --- a/Sources/7zCoder.swift +++ b/Sources/7zCoder.swift @@ -37,11 +37,11 @@ class SevenZipCoder { id = pointerData.bytes(count: idSize) - numInStreams = isComplex ? pointerData.szMbd().multiByteInteger : 1 - numOutStreams = isComplex ? pointerData.szMbd().multiByteInteger : 1 + numInStreams = isComplex ? pointerData.szMbd() : 1 + numOutStreams = isComplex ? pointerData.szMbd() : 1 if hasAttributes { - propertiesSize = pointerData.szMbd().multiByteInteger + propertiesSize = pointerData.szMbd() properties = pointerData.bytes(count: propertiesSize!) } } diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index 58f64a32..f6f387d4 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -21,7 +21,7 @@ class SevenZipCoderInfo { var type = pointerData.byte() guard type == 0x0B else { throw SevenZipError.wrongPropertyID } - numFolders = pointerData.szMbd().multiByteInteger + numFolders = pointerData.szMbd() external = pointerData.byte() guard external == 0 @@ -36,7 +36,7 @@ class SevenZipCoderInfo { for folder in folders { for _ in 0.. (multiByteInteger: Int, bytesProcessed: [UInt8]) { + func szMbd() -> Int { let firstByte = self.byte().toInt() var mask = 0x80 - var bytes = [firstByte.toUInt8()] var value = 0 for i in 0..<8 { if firstByte & mask == 0 { value |= ((firstByte & (mask &- 1)) << (8 * i)) break } - let nextByte = self.byte().toInt() - bytes.append(nextByte.toUInt8()) - value |= nextByte << (8 * i) + value |= self.byte().toInt() << (8 * i) mask >>= 1 } - return (value, bytes) + return value } } diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index 23c40e4b..e596ec41 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -26,7 +26,7 @@ class SevenZipFileInfo { var files = [File]() init(_ pointerData: DataWithPointer) throws { - numFiles = pointerData.szMbd().multiByteInteger + numFiles = pointerData.szMbd() for _ in 0.. Date: Fri, 28 Jul 2017 19:11:18 +0300 Subject: [PATCH 022/113] Use BitReader everywhere in 7z It should protect from not updating index in DWP when we switch between DWP and BitReader. --- SWCompression.xcodeproj/project.pbxproj | 10 +++---- Sources/7zCoder.swift | 14 ++++----- Sources/7zCoderInfo.swift | 27 ++++++++--------- Sources/7zContainer.swift | 40 ++++++++++++------------- Sources/7zFileInfo.swift | 10 ++----- Sources/7zFolder.swift | 16 +++++----- Sources/7zHeader.swift | 34 ++++++++++----------- Sources/7zPackInfo.swift | 23 +++++++------- Sources/7zProperty.swift | 8 ++--- Sources/7zStreamInfo.swift | 16 +++++----- Sources/7zSubstreamInfo.swift | 21 ++++++------- 11 files changed, 104 insertions(+), 115 deletions(-) diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 9dbd4042..1208f921 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -324,7 +324,7 @@ 063DF1081DE1F07800F38082 /* HuffmanTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HuffmanTree.swift; path = Sources/HuffmanTree.swift; sourceTree = SOURCE_ROOT; }; 063DF1091DE1F07800F38082 /* Protocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Protocols.swift; path = Sources/Protocols.swift; sourceTree = SOURCE_ROOT; }; 064492581DC606D400F10981 /* ZlibArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibArchive.swift; sourceTree = ""; }; - 064F72231F1E5D4400017297 /* 7zContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zContainer.swift; sourceTree = ""; }; + 064F72231F1E5D4400017297 /* 7zContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = 7zContainer.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 064F72281F1E638A00017297 /* 7zError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zError.swift; sourceTree = ""; }; 064F722E1F1E63D800017297 /* test1.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test1.7z; sourceTree = ""; }; 064F72301F1E63E200017297 /* SevenZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SevenZipTests.swift; sourceTree = ""; }; @@ -332,7 +332,7 @@ 0655694C1DC65A8000A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 065569591DC65A9400A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 06595E0D1F1E8252006501C2 /* 7zFolder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFolder.swift; sourceTree = ""; }; - 06595E121F1E90C2006501C2 /* 7zCoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zCoder.swift; sourceTree = ""; }; + 06595E121F1E90C2006501C2 /* 7zCoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = 7zCoder.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 067518351E2A86F700D16354 /* ZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipContainer.swift; sourceTree = ""; }; 0675183C1E2A883600D16354 /* ZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipTests.swift; sourceTree = ""; }; 0680E1B01DDA2D7C005C05EB /* ZlibTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibTests.swift; sourceTree = ""; }; @@ -375,12 +375,12 @@ 069F276F1EDA0D5E00736269 /* TestUnicode.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = TestUnicode.zip; sourceTree = ""; }; 06A393411DE070B500182E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 06A393421DE070B500182E12 /* SWCompression.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SWCompression.h; sourceTree = ""; }; - 06A960501F1E7D040078E6D1 /* 7zStreamInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zStreamInfo.swift; sourceTree = ""; }; + 06A960501F1E7D040078E6D1 /* 7zStreamInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = 7zStreamInfo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 06A960551F1E7D0B0078E6D1 /* 7zPackInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zPackInfo.swift; sourceTree = ""; }; 06A9605A1F1E7D990078E6D1 /* 7zHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zHeader.swift; sourceTree = ""; }; 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFileInfo.swift; sourceTree = ""; }; - 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zCoderInfo.swift; sourceTree = ""; }; - 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zSubstreamInfo.swift; sourceTree = ""; }; + 06A960641F1E7DF60078E6D1 /* 7zCoderInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = 7zCoderInfo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = 7zSubstreamInfo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 06ADB2D81EBCEFA60053A188 /* TarContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TarContainer.swift; sourceTree = ""; }; 06B374CA1E0EECD500064853 /* random_file.zlib */ = {isa = PBXFileReference; lastKnownFileType = file; path = random_file.zlib; sourceTree = ""; }; 06B689571F278815007C9316 /* 7zProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zProperty.swift; sourceTree = ""; }; diff --git a/Sources/7zCoder.swift b/Sources/7zCoder.swift index c488f06b..da735d17 100644 --- a/Sources/7zCoder.swift +++ b/Sources/7zCoder.swift @@ -25,8 +25,8 @@ class SevenZipCoder { var propertiesSize: Int? var properties: [UInt8]? - init(_ pointerData: DataWithPointer) throws { - let flags = pointerData.byte() + init(_ bitReader: BitReader) throws { + let flags = bitReader.byte() guard flags & 0xC0 == 0 else { throw SevenZipError.reservedCodecFlags } idSize = (flags & 0x0F).toInt() @@ -35,14 +35,14 @@ class SevenZipCoder { guard flags & 0x80 == 0 else { throw SevenZipError.altMethodsNotSupported } - id = pointerData.bytes(count: idSize) + id = bitReader.bytes(count: idSize) - numInStreams = isComplex ? pointerData.szMbd() : 1 - numOutStreams = isComplex ? pointerData.szMbd() : 1 + numInStreams = isComplex ? bitReader.szMbd() : 1 + numOutStreams = isComplex ? bitReader.szMbd() : 1 if hasAttributes { - propertiesSize = pointerData.szMbd() - properties = pointerData.bytes(count: propertiesSize!) + propertiesSize = bitReader.szMbd() + properties = bitReader.bytes(count: propertiesSize!) } } diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index f6f387d4..3f10c193 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -17,49 +17,48 @@ class SevenZipCoderInfo { external = 0 } - init(_ pointerData: DataWithPointer) throws { - var type = pointerData.byte() + init(_ bitReader: BitReader) throws { + var type = bitReader.byte() guard type == 0x0B else { throw SevenZipError.wrongPropertyID } - numFolders = pointerData.szMbd() - external = pointerData.byte() + numFolders = bitReader.szMbd() + external = bitReader.byte() guard external == 0 else { throw SevenZipError.externalNotSupported } // TODO: Do we support this? for _ in 0.. [ContainerEntry] { /// Object with input data which supports convenient work with bit shifts. - let pointerData = DataWithPointer(data: data) + let bitReader = BitReader(data: data, bitOrder: .straight) // **SignatureHeader** // Check signature. - guard pointerData.bytes(count: 6) == [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C] + guard bitReader.bytes(count: 6) == [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C] else { throw SevenZipError.wrongSignature } // Check archive version. - guard pointerData.bytes(count: 2) == [0, 4] // 7zFormat.txt says it should be [0, 2] instead. + guard bitReader.bytes(count: 2) == [0, 4] // 7zFormat.txt says it should be [0, 2] instead. else { throw SevenZipError.wrongVersion } - let startHeaderCRC = pointerData.uint32() + let startHeaderCRC = bitReader.uint32() /// - Note: Relative to SignatureHeader - let nextHeaderOffset = Int(pointerData.uint64()) - let nextHeaderSize = Int(pointerData.uint64()) - let nextHeaderCRC = pointerData.uint32() + let nextHeaderOffset = Int(bitReader.uint64()) + let nextHeaderSize = Int(bitReader.uint64()) + let nextHeaderCRC = bitReader.uint32() - pointerData.index = 12 - guard CheckSums.crc32(pointerData.bytes(count: 20)) == startHeaderCRC + bitReader.index = 12 + guard CheckSums.crc32(bitReader.bytes(count: 20)) == startHeaderCRC else { throw SevenZipError.wrongStartHeaderCRC } // **Header** - pointerData.index += nextHeaderOffset - let headerStartIndex = pointerData.index + bitReader.index += nextHeaderOffset + let headerStartIndex = bitReader.index let headerEndIndex: Int - let type = pointerData.byte() + let type = bitReader.byte() let header: SevenZipHeader if type == 0x17 { - let packedHeaderStreamInfo = try SevenZipStreamInfo(pointerData) - headerEndIndex = pointerData.index - header = try SevenZipHeader(pointerData, using: packedHeaderStreamInfo) + let packedHeaderStreamInfo = try SevenZipStreamInfo(bitReader) + headerEndIndex = bitReader.index + header = try SevenZipHeader(bitReader, using: packedHeaderStreamInfo) } else if type == 0x01 { - header = try SevenZipHeader(pointerData) - headerEndIndex = pointerData.index + header = try SevenZipHeader(bitReader) + headerEndIndex = bitReader.index } else { throw SevenZipError.wrongPropertyID } @@ -58,8 +58,8 @@ public class SevenZipContainer: Container { else { throw SevenZipError.wrongHeaderSize } // Check header CRC - pointerData.index = headerStartIndex - guard CheckSums.crc32(pointerData.bytes(count: nextHeaderSize)) == nextHeaderCRC + bitReader.index = headerStartIndex + guard CheckSums.crc32(bitReader.bytes(count: nextHeaderSize)) == nextHeaderCRC else { throw SevenZipError.wrongHeaderCRC } return [] @@ -67,7 +67,7 @@ public class SevenZipContainer: Container { } -extension DataWithPointer { +extension BitReader { /// Abbreviation for "sevenZipMultiByteDecode". func szMbd() -> Int { diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index e596ec41..0f0cfbf9 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -25,15 +25,12 @@ class SevenZipFileInfo { let numFiles: Int var files = [File]() - init(_ pointerData: DataWithPointer) throws { - numFiles = pointerData.szMbd() + init(_ bitReader: BitReader) throws { + numFiles = bitReader.szMbd() for _ in 0.. 0 { for _ in 0.. [SevenZipProperty] { + static func getProperties(_ bitReader: BitReader) throws -> [SevenZipProperty] { var properties = [SevenZipProperty]() while true { - let propertyType = pointerData.byte() + let propertyType = bitReader.byte() if propertyType == 0 { break } - let propertySize = pointerData.szMbd() - properties.append(SevenZipProperty(propertyType, propertySize, pointerData.bytes(count: propertySize))) + let propertySize = bitReader.szMbd() + properties.append(SevenZipProperty(propertyType, propertySize, bitReader.bytes(count: propertySize))) } return properties } diff --git a/Sources/7zStreamInfo.swift b/Sources/7zStreamInfo.swift index e9e1bccb..06c24c3b 100644 --- a/Sources/7zStreamInfo.swift +++ b/Sources/7zStreamInfo.swift @@ -11,24 +11,24 @@ class SevenZipStreamInfo { var coderInfo: SevenZipCoderInfo var substreamInfo: SevenZipSubstreamInfo? - init(_ pointerData: DataWithPointer) throws { - var type = pointerData.byte() + init(_ bitReader: BitReader) throws { + var type = bitReader.byte() if type == 0x06 { - packInfo = try SevenZipPackInfo(pointerData) - type = pointerData.byte() + packInfo = try SevenZipPackInfo(bitReader) + type = bitReader.byte() } if type == 0x07 { - coderInfo = try SevenZipCoderInfo(pointerData) - type = pointerData.byte() + coderInfo = try SevenZipCoderInfo(bitReader) + type = bitReader.byte() } else { coderInfo = SevenZipCoderInfo() } if type == 0x08 { - substreamInfo = try SevenZipSubstreamInfo(pointerData, coderInfo) - type = pointerData.byte() + substreamInfo = try SevenZipSubstreamInfo(bitReader, coderInfo) + type = bitReader.byte() } if type != 0x00 { diff --git a/Sources/7zSubstreamInfo.swift b/Sources/7zSubstreamInfo.swift index a725c8ed..35e25bf3 100644 --- a/Sources/7zSubstreamInfo.swift +++ b/Sources/7zSubstreamInfo.swift @@ -11,19 +11,19 @@ class SevenZipSubstreamInfo { var unpackSizes = [Int]() var digests = [UInt32?]() - init(_ pointerData: DataWithPointer, _ coderInfo: SevenZipCoderInfo) throws { + init(_ bitReader: BitReader, _ coderInfo: SevenZipCoderInfo) throws { var totalUnpackStreams = coderInfo.folders.count - var type = pointerData.byte() + var type = bitReader.byte() if type == 0x0D { totalUnpackStreams = 0 for folder in coderInfo.folders { - let numStreams = pointerData.szMbd() + let numStreams = bitReader.szMbd() folder.numUnpackSubstreams = numStreams totalUnpackStreams += numStreams } - type = pointerData.byte() + type = bitReader.byte() } for folder in coderInfo.folders { @@ -33,7 +33,7 @@ class SevenZipSubstreamInfo { var sum = 0 if type == 0x09 { for _ in 0.. Date: Fri, 28 Jul 2017 19:17:22 +0300 Subject: [PATCH 023/113] Extract function to read "definedBits" as a BitReader extension --- Sources/7zCoderInfo.swift | 10 ++------- Sources/7zContainer.swift | 11 +++++++++ Sources/7zFileInfo.swift | 42 ++++++++--------------------------- Sources/7zPackInfo.swift | 10 ++------- Sources/7zSubstreamInfo.swift | 10 ++------- 5 files changed, 26 insertions(+), 57 deletions(-) diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index 3f10c193..b86fdb6b 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -43,14 +43,8 @@ class SevenZipCoderInfo { type = bitReader.byte() if type == 0x0A { - let allDefined = bitReader.byte() - let definedBits: [UInt8] - if allDefined == 0 { - definedBits = bitReader.bits(count: numFolders) - bitReader.skipUntilNextByte() - } else { - definedBits = Array(repeating: 1, count: numFolders) - } + let definedBits = bitReader.defBits(count: numFolders) + bitReader.skipUntilNextByte() for i in 0.. [UInt8] { + let allDefined = self.byte() + let definedBits: [UInt8] + if allDefined == 0 { + definedBits = self.bits(count: count) + } else { + definedBits = Array(repeating: 1, count: count) + } + return definedBits + } + } diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index 0f0cfbf9..e5fcf0be 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -75,15 +75,9 @@ class SevenZipFileInfo { guard nextName == names.count && nextFile == numFiles else { throw SevenZipError.wrongFileNames } case 0x12: // Creation time - // TODO: Extract following as a function. - let allDefined = bitReader.byte() - let timesDefined: [UInt8] - if allDefined == 0 { - timesDefined = bitReader.bits(count: numFiles) - bitReader.skipUntilNextByte() - } else { - timesDefined = Array(repeating: 1, count: numFiles) - } + let timesDefined = bitReader.defBits(count: numFiles) + bitReader.skipUntilNextByte() + // TODO: Remove implicit call of skipUntilNextByte() in BitReader, // instead make it check if bytes are aligned. @@ -97,14 +91,8 @@ class SevenZipFileInfo { } } case 0x13: // Access time - let allDefined = bitReader.byte() - let timesDefined: [UInt8] - if allDefined == 0 { - timesDefined = bitReader.bits(count: numFiles) - bitReader.skipUntilNextByte() - } else { - timesDefined = Array(repeating: 1, count: numFiles) - } + let timesDefined = bitReader.defBits(count: numFiles) + bitReader.skipUntilNextByte() let external = bitReader.byte() guard external == 0 @@ -116,14 +104,8 @@ class SevenZipFileInfo { } } case 0x14: // Modification time - let allDefined = bitReader.byte() - let timesDefined: [UInt8] - if allDefined == 0 { - timesDefined = bitReader.bits(count: numFiles) - bitReader.skipUntilNextByte() - } else { - timesDefined = Array(repeating: 1, count: numFiles) - } + let timesDefined = bitReader.defBits(count: numFiles) + bitReader.skipUntilNextByte() let external = bitReader.byte() guard external == 0 @@ -135,14 +117,8 @@ class SevenZipFileInfo { } } case 0x15: // WinAttributes - let allDefined = bitReader.byte() - let attributesDefined: [UInt8] - if allDefined == 0 { - attributesDefined = bitReader.bits(count: numFiles) - bitReader.skipUntilNextByte() - } else { - attributesDefined = Array(repeating: 1, count: numFiles) - } + let attributesDefined = bitReader.defBits(count: numFiles) + bitReader.skipUntilNextByte() let external = bitReader.byte() guard external == 0 diff --git a/Sources/7zPackInfo.swift b/Sources/7zPackInfo.swift index 686feedb..c0553899 100644 --- a/Sources/7zPackInfo.swift +++ b/Sources/7zPackInfo.swift @@ -26,14 +26,8 @@ class SevenZipPackInfo { } if type == 0x0A { - let allDefined = bitReader.byte() - let definedBits: [UInt8] - if allDefined == 0 { - definedBits = bitReader.bits(count: numPackStreams) - bitReader.skipUntilNextByte() - } else { - definedBits = Array(repeating: 1, count: numPackStreams) - } + let definedBits = bitReader.defBits(count: numPackStreams) + bitReader.skipUntilNextByte() for bit in definedBits { if bit == 1 { diff --git a/Sources/7zSubstreamInfo.swift b/Sources/7zSubstreamInfo.swift index 35e25bf3..d31557c9 100644 --- a/Sources/7zSubstreamInfo.swift +++ b/Sources/7zSubstreamInfo.swift @@ -52,14 +52,8 @@ class SevenZipSubstreamInfo { } if type == 0x0A { - let allDefined = bitReader.byte() - let definedBits: [UInt8] - if allDefined == 0 { - definedBits = bitReader.bits(count: totalDigests) - bitReader.skipUntilNextByte() - } else { - definedBits = Array(repeating: 1, count: totalDigests) - } + let definedBits = bitReader.defBits(count: totalDigests) + bitReader.skipUntilNextByte() var missingCrcs = [UInt32?]() for i in 0.. Date: Fri, 28 Jul 2017 19:48:48 +0300 Subject: [PATCH 024/113] Add new EntryInfo struct for 7z and public function for getting them --- SWCompression.xcodeproj/project.pbxproj | 10 +++++ Sources/7zContainer.swift | 27 +++++++++++- Sources/7zEntryInfo.swift | 56 +++++++++++++++++++++++++ Sources/7zFileInfo.swift | 2 +- Sources/7zHeader.swift | 13 ------ 5 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 Sources/7zEntryInfo.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 1208f921..f1a937c4 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -111,6 +111,10 @@ 06595E141F1E90C2006501C2 /* 7zCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCoder.swift */; }; 06595E151F1E90C2006501C2 /* 7zCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCoder.swift */; }; 06595E161F1E90C2006501C2 /* 7zCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06595E121F1E90C2006501C2 /* 7zCoder.swift */; }; + 065D0ADC1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; + 065D0ADD1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; + 065D0ADE1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; + 065D0ADF1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; 067518361E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518371E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518381E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; @@ -333,6 +337,7 @@ 065569591DC65A9400A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 06595E0D1F1E8252006501C2 /* 7zFolder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFolder.swift; sourceTree = ""; }; 06595E121F1E90C2006501C2 /* 7zCoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = 7zCoder.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zEntryInfo.swift; sourceTree = ""; }; 067518351E2A86F700D16354 /* ZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipContainer.swift; sourceTree = ""; }; 0675183C1E2A883600D16354 /* ZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipTests.swift; sourceTree = ""; }; 0680E1B01DDA2D7C005C05EB /* ZlibTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibTests.swift; sourceTree = ""; }; @@ -545,6 +550,7 @@ 06A960691F1E7E0D0078E6D1 /* 7zSubstreamInfo.swift */, 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */, 064F72281F1E638A00017297 /* 7zError.swift */, + 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */, ); name = "7-Zip"; sourceTree = ""; @@ -1120,6 +1126,7 @@ 06ADB2DA1EBCEFA60053A188 /* TarContainer.swift in Sources */, 06CDFCA41F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF61F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, + 065D0ADD1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */, 06E2346D1E068E9600F18798 /* XZArchive.swift in Sources */, 06CDFC9F1F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06431F0E8AD500832F0C /* ZipEntry.swift in Sources */, @@ -1176,6 +1183,7 @@ 06ADB2DB1EBCEFA60053A188 /* TarContainer.swift in Sources */, 06CDFCA51F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF71F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, + 065D0ADE1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */, 06E2346E1E068E9600F18798 /* XZArchive.swift in Sources */, 06CDFCA01F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06441F0E8AD500832F0C /* ZipEntry.swift in Sources */, @@ -1232,6 +1240,7 @@ 06ADB2DC1EBCEFA60053A188 /* TarContainer.swift in Sources */, 06CDFCA61F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF81F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, + 065D0ADF1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */, 06E2346F1E068E9600F18798 /* XZArchive.swift in Sources */, 06CDFCA11F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06451F0E8AD500832F0C /* ZipEntry.swift in Sources */, @@ -1288,6 +1297,7 @@ 06ADB2D91EBCEFA60053A188 /* TarContainer.swift in Sources */, 06CDFCA31F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF51F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, + 065D0ADC1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */, 06E2346C1E068E9600F18798 /* XZArchive.swift in Sources */, 06CDFC9E1F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06421F0E8AD500832F0C /* ZipEntry.swift in Sources */, diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index f47f42e4..b28f38e1 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -10,6 +10,31 @@ public class SevenZipContainer: Container { static let signatureHeaderSize = 32 public static func open(container data: Data) throws -> [ContainerEntry] { + return [] + } + + public static func info(container data: Data) throws -> [SevenZipEntryInfo] { + var entryInfos = [SevenZipEntryInfo]() + let header = try readHeader(data) + + if let files = header.fileInfo?.files, let substreamInfo = header.mainStreams?.substreamInfo { + var nonEmptyFileIndex = 0 + for file in files { + if file.isEmptyStream { + entryInfos.append(SevenZipEntryInfo(file)) + } else { + entryInfos.append(SevenZipEntryInfo(file, + substreamInfo.unpackSizes[nonEmptyFileIndex], + substreamInfo.digests[nonEmptyFileIndex])) + nonEmptyFileIndex += 1 + } + } + } + + return entryInfos + } + + private static func readHeader(_ data: Data) throws -> SevenZipHeader { /// Object with input data which supports convenient work with bit shifts. let bitReader = BitReader(data: data, bitOrder: .straight) @@ -62,7 +87,7 @@ public class SevenZipContainer: Container { guard CheckSums.crc32(bitReader.bytes(count: nextHeaderSize)) == nextHeaderCRC else { throw SevenZipError.wrongHeaderCRC } - return [] + return header } } diff --git a/Sources/7zEntryInfo.swift b/Sources/7zEntryInfo.swift new file mode 100644 index 00000000..9cab5db5 --- /dev/null +++ b/Sources/7zEntryInfo.swift @@ -0,0 +1,56 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +public struct SevenZipEntryInfo { + + public let name: String? + public let size: Int? + public let isDirectory: Bool + public let accessTime: Date? + public let creationTime: Date? + public let modificationTime: Date? + public let windowsAttributes: Int? + + public let hasStream: Bool + public let isEmpty: Bool + public let isAnti: Bool + + public let crc: UInt32? + + init(_ file: SevenZipFileInfo.File, _ size: Int? = nil, _ crc: UInt32? = nil) { + self.hasStream = !file.isEmptyStream + self.isEmpty = file.isEmptyFile + self.isAnti = file.isAntiFile + + self.name = file.name + self.isDirectory = !file.isEmptyStream || (file.isEmptyStream && file.isAntiFile) + + if let aTime = file.aTime { + self.accessTime = Date(timeIntervalSince1970: TimeInterval(aTime)) + } else { + self.accessTime = nil + } + + if let cTime = file.cTime { + self.creationTime = Date(timeIntervalSince1970: TimeInterval(cTime)) + } else { + self.creationTime = nil + } + + if let mTime = file.mTime { + self.modificationTime = Date(timeIntervalSince1970: TimeInterval(mTime)) + } else { + self.modificationTime = nil + } + + self.windowsAttributes = file.winAttributes + + self.crc = crc + self.size = size + } + +} diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index e5fcf0be..799fa103 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -131,7 +131,7 @@ class SevenZipFileInfo { } case 0x18: // StartPos // TODO: Do we support this? throw SevenZipError.startPosNotSupported - case 0x19: // Dummy // TODO: Do we support this? + case 0x19: // "Dummy". Used for alignment. guard bitReader.size - bitReader.index >= propertySize else { throw SevenZipError.incompleteProperty } bitReader.index += propertySize diff --git a/Sources/7zHeader.swift b/Sources/7zHeader.swift index 90c9872e..3043eaed 100644 --- a/Sources/7zHeader.swift +++ b/Sources/7zHeader.swift @@ -38,19 +38,6 @@ class SevenZipHeader { type = bitReader.byte() } - if let fileInfo = fileInfo { - var nonEmptyFileIndex = 0 - for i in 0.. Date: Fri, 28 Jul 2017 20:26:14 +0300 Subject: [PATCH 025/113] Fix problems with isDirectory and times in 7zEntryInfo --- Sources/7zCoderInfo.swift | 4 ++-- Sources/7zContainer.swift | 2 +- Sources/7zEntryInfo.swift | 25 ++++++++++++++++++------- Sources/7zFileInfo.swift | 4 ++-- Sources/7zPackInfo.swift | 2 +- Sources/7zProperty.swift | 2 +- Tests/SevenZipTests.swift | 9 ++++++--- 7 files changed, 31 insertions(+), 17 deletions(-) diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index b86fdb6b..c5dbea81 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -41,7 +41,7 @@ class SevenZipCoderInfo { } type = bitReader.byte() - + if type == 0x0A { let definedBits = bitReader.defBits(count: numFolders) bitReader.skipUntilNextByte() @@ -51,7 +51,7 @@ class SevenZipCoderInfo { folders[i].crc = bitReader.uint32() } } - + type = bitReader.byte() } diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index b28f38e1..efda1f8a 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -30,7 +30,7 @@ public class SevenZipContainer: Container { } } } - + return entryInfos } diff --git a/Sources/7zEntryInfo.swift b/Sources/7zEntryInfo.swift index 9cab5db5..a6df4e23 100644 --- a/Sources/7zEntryInfo.swift +++ b/Sources/7zEntryInfo.swift @@ -27,22 +27,22 @@ public struct SevenZipEntryInfo { self.isAnti = file.isAntiFile self.name = file.name - self.isDirectory = !file.isEmptyStream || (file.isEmptyStream && file.isAntiFile) + self.isDirectory = file.isEmptyStream && !file.isEmptyFile - if let aTime = file.aTime { - self.accessTime = Date(timeIntervalSince1970: TimeInterval(aTime)) + if let aTime = SevenZipEntryInfo.ntfsTimeToDate(file.aTime) { + self.accessTime = aTime } else { self.accessTime = nil } - if let cTime = file.cTime { - self.creationTime = Date(timeIntervalSince1970: TimeInterval(cTime)) + if let cTime = SevenZipEntryInfo.ntfsTimeToDate(file.cTime) { + self.creationTime = cTime } else { self.creationTime = nil } - if let mTime = file.mTime { - self.modificationTime = Date(timeIntervalSince1970: TimeInterval(mTime)) + if let mTime = SevenZipEntryInfo.ntfsTimeToDate(file.mTime) { + self.modificationTime = mTime } else { self.modificationTime = nil } @@ -53,4 +53,15 @@ public struct SevenZipEntryInfo { self.size = size } + private static func ntfsTimeToDate(_ time: UInt64?) -> Date? { + if let time = time { // TODO: Probably incorrect hours, minutes, seconds. + return DateComponents(calendar: Calendar(identifier: .iso8601), + timeZone: TimeZone(abbreviation: "UTC"), + year: 1601, month: 1, day: 1, + hour: 0, minute: 0, second: 0).date?.addingTimeInterval(TimeInterval(time) / 10_000_000) + } else { + return nil + } + } + } diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index 799fa103..3eca5c7c 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -46,12 +46,12 @@ class SevenZipFileInfo { isEmptyStream = bitReader.bits(count: numFiles) bitReader.skipUntilNextByte() case 0x0F: // EmptyFile - guard let emptyStreamCount = isEmptyStream?.reduce(0, { $0 + $1} ) + guard let emptyStreamCount = isEmptyStream?.reduce(0, { $0 + $1}) else { throw SevenZipError.wrongFileProperty } isEmptyFile = bitReader.bits(count: emptyStreamCount.toInt()) bitReader.skipUntilNextByte() case 0x10: // AntiFile (used in backups to indicate that file was removed) - guard let emptyStreamCount = isEmptyStream?.reduce(0, { $0 + $1} ) + guard let emptyStreamCount = isEmptyStream?.reduce(0, { $0 + $1}) else { throw SevenZipError.wrongFileProperty } isAntiFile = bitReader.bits(count: emptyStreamCount.toInt()) bitReader.skipUntilNextByte() diff --git a/Sources/7zPackInfo.swift b/Sources/7zPackInfo.swift index c0553899..07712425 100644 --- a/Sources/7zPackInfo.swift +++ b/Sources/7zPackInfo.swift @@ -36,7 +36,7 @@ class SevenZipPackInfo { digests.append(nil) } } - + type = bitReader.byte() } diff --git a/Sources/7zProperty.swift b/Sources/7zProperty.swift index 4f6ad94f..3a723c61 100644 --- a/Sources/7zProperty.swift +++ b/Sources/7zProperty.swift @@ -29,5 +29,5 @@ class SevenZipProperty { } return properties } - + } diff --git a/Tests/SevenZipTests.swift b/Tests/SevenZipTests.swift index 865b22be..04b74c6a 100644 --- a/Tests/SevenZipTests.swift +++ b/Tests/SevenZipTests.swift @@ -21,10 +21,11 @@ class SevenZipTests: XCTestCase { return } - guard (try? SevenZipContainer.open(container: testData)) != nil else { + guard let infos = try? SevenZipContainer.info(container: testData) else { XCTFail("Unable to open 7z archive.") return } + print(infos) } func test2() { @@ -38,10 +39,11 @@ class SevenZipTests: XCTestCase { return } - guard (try? SevenZipContainer.open(container: testData)) != nil else { + guard let infos = try? SevenZipContainer.info(container: testData) else { XCTFail("Unable to open 7z archive.") return } + print(infos) } func test3() { @@ -55,10 +57,11 @@ class SevenZipTests: XCTestCase { return } - guard (try? SevenZipContainer.open(container: testData)) != nil else { + guard let infos = try? SevenZipContainer.info(container: testData) else { XCTFail("Unable to open 7z archive.") return } + print(infos) } } From 363fe78ead516b790bc262ae80d93b7200ce00bc Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 00:01:23 +0300 Subject: [PATCH 026/113] Add 7zEntry class and its first iteration --- SWCompression.xcodeproj/project.pbxproj | 10 +++++++ Sources/7zContainer.swift | 23 ++++++++------- Sources/7zEntry.swift | 39 +++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 Sources/7zEntry.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index f1a937c4..151f71f1 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -283,6 +283,10 @@ 06E234831E06A6C200F18798 /* CheckSums.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E234811E06A6C200F18798 /* CheckSums.swift */; }; 06E234841E06A6C200F18798 /* CheckSums.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E234811E06A6C200F18798 /* CheckSums.swift */; }; 06E234851E06A6C200F18798 /* CheckSums.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E234811E06A6C200F18798 /* CheckSums.swift */; }; + 06F276DF1F2BAB4A00E67335 /* 7zEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06F276DE1F2BAB4900E67335 /* 7zEntry.swift */; }; + 06F276E01F2BAB4A00E67335 /* 7zEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06F276DE1F2BAB4900E67335 /* 7zEntry.swift */; }; + 06F276E11F2BAB4A00E67335 /* 7zEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06F276DE1F2BAB4900E67335 /* 7zEntry.swift */; }; + 06F276E21F2BAB4A00E67335 /* 7zEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06F276DE1F2BAB4900E67335 /* 7zEntry.swift */; }; 06FED40D1DD7717E0013DFB2 /* BZip2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FED40B1DD7717E0013DFB2 /* BZip2.swift */; }; 06FED40E1DD7717E0013DFB2 /* BZip2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FED40B1DD7717E0013DFB2 /* BZip2.swift */; }; 06FED40F1DD7717E0013DFB2 /* BZip2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FED40B1DD7717E0013DFB2 /* BZip2.swift */; }; @@ -430,6 +434,7 @@ 06E2346B1E068E9600F18798 /* XZArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XZArchive.swift; sourceTree = ""; }; 06E2347F1E069ABD00F18798 /* XzTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XzTests.swift; sourceTree = ""; }; 06E234811E06A6C200F18798 /* CheckSums.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CheckSums.swift; path = Sources/CheckSums.swift; sourceTree = SOURCE_ROOT; }; + 06F276DE1F2BAB4900E67335 /* 7zEntry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zEntry.swift; sourceTree = ""; }; 06FED40B1DD7717E0013DFB2 /* BZip2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BZip2.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -551,6 +556,7 @@ 06A9605F1F1E7DE20078E6D1 /* 7zFileInfo.swift */, 064F72281F1E638A00017297 /* 7zError.swift */, 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */, + 06F276DE1F2BAB4900E67335 /* 7zEntry.swift */, ); name = "7-Zip"; sourceTree = ""; @@ -1127,6 +1133,7 @@ 06CDFCA41F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF61F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, 065D0ADD1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */, + 06F276E01F2BAB4A00E67335 /* 7zEntry.swift in Sources */, 06E2346D1E068E9600F18798 /* XZArchive.swift in Sources */, 06CDFC9F1F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06431F0E8AD500832F0C /* ZipEntry.swift in Sources */, @@ -1184,6 +1191,7 @@ 06CDFCA51F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF71F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, 065D0ADE1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */, + 06F276E11F2BAB4A00E67335 /* 7zEntry.swift in Sources */, 06E2346E1E068E9600F18798 /* XZArchive.swift in Sources */, 06CDFCA01F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06441F0E8AD500832F0C /* ZipEntry.swift in Sources */, @@ -1241,6 +1249,7 @@ 06CDFCA61F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF81F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, 065D0ADF1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */, + 06F276E21F2BAB4A00E67335 /* 7zEntry.swift in Sources */, 06E2346F1E068E9600F18798 /* XZArchive.swift in Sources */, 06CDFCA11F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06451F0E8AD500832F0C /* ZipEntry.swift in Sources */, @@ -1298,6 +1307,7 @@ 06CDFCA31F111D6C00292758 /* BZip2Error.swift in Sources */, 06393DF51F1A7F8E00A647A0 /* ZipCommon.swift in Sources */, 065D0ADC1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */, + 06F276DF1F2BAB4A00E67335 /* 7zEntry.swift in Sources */, 06E2346C1E068E9600F18798 /* XZArchive.swift in Sources */, 06CDFC9E1F111D2600292758 /* DeflateCompression.swift in Sources */, 061C06421F0E8AD500832F0C /* ZipEntry.swift in Sources */, diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index efda1f8a..d9af782c 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -17,17 +17,18 @@ public class SevenZipContainer: Container { var entryInfos = [SevenZipEntryInfo]() let header = try readHeader(data) - if let files = header.fileInfo?.files, let substreamInfo = header.mainStreams?.substreamInfo { - var nonEmptyFileIndex = 0 - for file in files { - if file.isEmptyStream { - entryInfos.append(SevenZipEntryInfo(file)) - } else { - entryInfos.append(SevenZipEntryInfo(file, - substreamInfo.unpackSizes[nonEmptyFileIndex], - substreamInfo.digests[nonEmptyFileIndex])) - nonEmptyFileIndex += 1 - } + guard let files = header.fileInfo?.files, let substreamInfo = header.mainStreams?.substreamInfo + else { return [] } + + var nonEmptyFileIndex = 0 + for file in files { + if file.isEmptyStream { + entryInfos.append(SevenZipEntryInfo(file)) + } else { + entryInfos.append(SevenZipEntryInfo(file, + substreamInfo.unpackSizes[nonEmptyFileIndex], + substreamInfo.digests[nonEmptyFileIndex])) + nonEmptyFileIndex += 1 } } diff --git a/Sources/7zEntry.swift b/Sources/7zEntry.swift new file mode 100644 index 00000000..2f82cd98 --- /dev/null +++ b/Sources/7zEntry.swift @@ -0,0 +1,39 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +public class SevenZipEntry: ContainerEntry { + + public let info: SevenZipEntryInfo + + public var name: String { + return info.name ?? "" + } + + public var size: Int { + return info.size ?? 0 + } + + public var isDirectory: Bool { + return info.isDirectory + } + + public var entryAttributes: [FileAttributeKey: Any] + + private let dataObject: Data + + init(_ bitReader: BitReader, _ entryInfo: SevenZipEntryInfo) { + self.info = entryInfo + self.dataObject = Data() + self.entryAttributes = [:] + } + + public func data() -> Data { + return dataObject + } + + +} From 0dab82741acf2a9f691f2319d61fd062e8ae0dd8 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 13:16:27 +0300 Subject: [PATCH 027/113] Use codeclimate instead of codecov --- .travis.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7e3466e3..d3cb3069 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,8 @@ env: global: - FRAMEWORK_NAME=SWCompression + - CC_TEST_REPORTER_ID=87379ba4ed4c1c2f6cd9ab95560364759898a0902effca0c23eddfc16a9ff5ff + - GIT_COMMITTED_AT=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then git log -1 --pretty=format:%ct; else git log -1 --skip 1 --pretty=format:%ct; fi) matrix: include: - language: objective-c @@ -17,13 +19,16 @@ matrix: - cd Tests/Test\ Files - git lfs pull - cd ../.. + - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter + - chmod +x ./cc-test-reporter + - ./cc-test-reporter before-build before_deploy: - carthage build --no-skip-current - carthage archive $FRAMEWORK_NAME script: - xcodebuild clean build test -project SWCompression.xcodeproj -scheme SWCompression after_success: - - bash <(curl -s https://codecov.io/bash) + - if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT; fi deploy: provider: releases api_key: From 91a6488891a67011f49510d658e2a2c7e9c96bae Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 13:21:02 +0300 Subject: [PATCH 028/113] Fix incorrect test-reporter binary --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d3cb3069..2bde3ae6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ matrix: - cd Tests/Test\ Files - git lfs pull - cd ../.. - - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter + - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-darwin-amd64 > ./cc-test-reporter - chmod +x ./cc-test-reporter - ./cc-test-reporter before-build before_deploy: From b628af795babccf44b5e6ff60a0eb7e56d01f52a Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 13:23:16 +0300 Subject: [PATCH 029/113] Disable submodule update in travis linux build We don't run tests on linux, so we don't need test files. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 2bde3ae6..19d96544 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,6 +42,8 @@ matrix: os: linux sudo: required dist: trusty + git: + submodules: false install: - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/9f442512a46d7a2af7b850d65a7e9bd31edfb09b/swiftenv-install.sh)" script: From 129cbbbd25faf1a26a67af388af2e7d0ddd49a3d Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 15:10:49 +0300 Subject: [PATCH 030/113] Another fix for problems with codeclimate coverage --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 19d96544..2cc7563f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,3 @@ - env: global: - FRAMEWORK_NAME=SWCompression @@ -11,6 +10,8 @@ matrix: xcode_project: SWCompression.xcodeproj xcode_scheme: SWCompression before_install: + - rvm use $RVM_RUBY_VERSION + - gem install slather - brew update - brew outdated carthage || brew upgrade carthage - brew install git-lfs @@ -28,7 +29,8 @@ matrix: script: - xcodebuild clean build test -project SWCompression.xcodeproj -scheme SWCompression after_success: - - if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT; fi + - slather coverage -x --scheme SWCompression SWCompression.xcodeproj/ + - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT deploy: provider: releases api_key: From 31c6d17bd17a19e53ce6629db13fbcc0cd54dcee Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 15:11:03 +0300 Subject: [PATCH 031/113] Enable tailor engine for codeclimate --- .codeclimate.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .codeclimate.yml diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 00000000..09ea4f02 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,8 @@ +engines: + fixme: + enabled: true + tailor: + enabled: true +ratings: + paths: + - "**.swift" From c7e0330fa3eb7a4468d143f7c0c73a145a190539 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 15:24:37 +0300 Subject: [PATCH 032/113] Replace codecov badge with codeclimate badges --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 895d4563..9792edf4 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,10 @@ [![CocoaPods](https://img.shields.io/cocoapods/p/SWCompression.svg)](https://cocoapods.org/pods/SWCompression) [![Swift 3](https://img.shields.io/badge/Swift-3.1.1-lightgrey.svg)](https://developer.apple.com/swift/) [![Build Status](https://travis-ci.org/tsolomko/SWCompression.svg?branch=develop)](https://travis-ci.org/tsolomko/SWCompression) -[![codecov](https://codecov.io/gh/tsolomko/SWCompression/branch/develop/graph/badge.svg)](https://codecov.io/gh/tsolomko/SWCompression) + +[![Code Climate](https://codeclimate.com/github/tsolomko/SWCompression/badges/gpa.svg)](https://codeclimate.com/github/codeclimate/codeclimate) +[![Test Coverage](https://codeclimate.com/github/tsolomko/SWCompression/badges/coverage.svg)](https://codeclimate.com/github/codeclimate/codeclimate/coverage) +[![Issue Count](https://codeclimate.com/github/tsolomko/SWCompression/badges/issue_count.svg)](https://codeclimate.com/github/codeclimate/codeclimate) [![CocoaPods](https://img.shields.io/cocoapods/v/SWCompression.svg)](https://cocoapods.org/pods/SWCompression) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) From d9dffe8241fd9c93183e08d23179c91a05f95d4a Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 15:26:58 +0300 Subject: [PATCH 033/113] Reduce number of codeclimate badges --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 9792edf4..86ae415d 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,7 @@ [![CocoaPods](https://img.shields.io/cocoapods/p/SWCompression.svg)](https://cocoapods.org/pods/SWCompression) [![Swift 3](https://img.shields.io/badge/Swift-3.1.1-lightgrey.svg)](https://developer.apple.com/swift/) [![Build Status](https://travis-ci.org/tsolomko/SWCompression.svg?branch=develop)](https://travis-ci.org/tsolomko/SWCompression) - -[![Code Climate](https://codeclimate.com/github/tsolomko/SWCompression/badges/gpa.svg)](https://codeclimate.com/github/codeclimate/codeclimate) [![Test Coverage](https://codeclimate.com/github/tsolomko/SWCompression/badges/coverage.svg)](https://codeclimate.com/github/codeclimate/codeclimate/coverage) -[![Issue Count](https://codeclimate.com/github/tsolomko/SWCompression/badges/issue_count.svg)](https://codeclimate.com/github/codeclimate/codeclimate) [![CocoaPods](https://img.shields.io/cocoapods/v/SWCompression.svg)](https://cocoapods.org/pods/SWCompression) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) From 8f9a0393f7a4f3fab7e5053efd948a5580b80ce2 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 15:34:46 +0300 Subject: [PATCH 034/113] Remove unused 7zFileInfo.File properties --- Sources/7zFileInfo.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index 3eca5c7c..f8e33b4e 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -16,10 +16,6 @@ class SevenZipFileInfo { var mTime: UInt64? var aTime: UInt64? var winAttributes: Int? - - // Set in Header using SubstreamInfo. - var size = 0 - var crc: UInt32? } let numFiles: Int From a222b05c7123f6588983eb8c88535731e3a23b10 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 15:35:05 +0300 Subject: [PATCH 035/113] Make winAttributes uint32 --- Sources/7zEntryInfo.swift | 5 +++-- Sources/7zFileInfo.swift | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Sources/7zEntryInfo.swift b/Sources/7zEntryInfo.swift index a6df4e23..72540f81 100644 --- a/Sources/7zEntryInfo.swift +++ b/Sources/7zEntryInfo.swift @@ -13,7 +13,7 @@ public struct SevenZipEntryInfo { public let accessTime: Date? public let creationTime: Date? public let modificationTime: Date? - public let windowsAttributes: Int? + public let windowsAttributes: UInt32? public let hasStream: Bool public let isEmpty: Bool @@ -58,7 +58,8 @@ public struct SevenZipEntryInfo { return DateComponents(calendar: Calendar(identifier: .iso8601), timeZone: TimeZone(abbreviation: "UTC"), year: 1601, month: 1, day: 1, - hour: 0, minute: 0, second: 0).date?.addingTimeInterval(TimeInterval(time) / 10_000_000) + hour: 0, minute: 0, second: 0).date? + .addingTimeInterval(TimeInterval(time) / 10_000_000) } else { return nil } diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index f8e33b4e..984a48ec 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -15,7 +15,7 @@ class SevenZipFileInfo { var cTime: UInt64? var mTime: UInt64? var aTime: UInt64? - var winAttributes: Int? + var winAttributes: UInt32? } let numFiles: Int @@ -122,7 +122,7 @@ class SevenZipFileInfo { for i in 0.. Date: Sat, 29 Jul 2017 15:44:09 +0300 Subject: [PATCH 036/113] Style improvements --- Sources/7zEntry.swift | 1 - Sources/7zFolder.swift | 2 +- Sources/Deflate.swift | 6 ++++-- Sources/Extensions.swift | 2 +- Sources/GzipArchive.swift | 4 ++-- Sources/LZMADecoder.swift | 29 ++++++++++++++++++++--------- Sources/TarEntry.swift | 2 +- Sources/XZArchive.swift | 2 +- Sources/ZipCommon.swift | 6 ++---- Sources/ZlibArchive.swift | 4 ++-- Tests/Bzip2Tests.swift | 22 +++++++++++----------- Tests/DeflateTests.swift | 2 ++ 12 files changed, 47 insertions(+), 35 deletions(-) diff --git a/Sources/7zEntry.swift b/Sources/7zEntry.swift index 2f82cd98..6e9652d2 100644 --- a/Sources/7zEntry.swift +++ b/Sources/7zEntry.swift @@ -34,6 +34,5 @@ public class SevenZipEntry: ContainerEntry { public func data() -> Data { return dataObject } - } diff --git a/Sources/7zFolder.swift b/Sources/7zFolder.swift index c67faf0c..3274ab15 100644 --- a/Sources/7zFolder.swift +++ b/Sources/7zFolder.swift @@ -109,7 +109,7 @@ class SevenZipFolder { } func unpackSize() -> Int { - if (totalOutputStreams == 0) { + if totalOutputStreams == 0 { return 0 } for i in stride(from: totalOutputStreams - 1, through: 0, by: -1) { diff --git a/Sources/Deflate.swift b/Sources/Deflate.swift index 6c021ea6..ff35a4bc 100644 --- a/Sources/Deflate.swift +++ b/Sources/Deflate.swift @@ -114,7 +114,7 @@ public class Deflate: DecompressionAlgorithm { let codeLengthsLength = bitReader.intFromBits(count: 4) + 4 // Read code lengths codes. - // Moreover, they are stored in a very specific order, + // Moreover, they are stored in a very specific order, // defined by HuffmanTree.Constants.codeLengthOrders. var lengthsForOrder = Array(repeating: 0, count: 19) for i in 0.. UInt32 { var result: UInt32 = 0 for i: UInt32 in 0..<4 { - let byte = ((self & (0xFF << (i * 8))) >> (i * 8)) + let byte = (self & (0xFF << (i * 8))) >> (i * 8) result += byte << (8 * (3 - i)) } return result diff --git a/Sources/GzipArchive.swift b/Sources/GzipArchive.swift index 50587a09..4021321e 100644 --- a/Sources/GzipArchive.swift +++ b/Sources/GzipArchive.swift @@ -48,7 +48,7 @@ public class GzipArchive: Archive { Multi-member GZip archives are essentially several GZip archives following each other in a single file. - Note: `wrongCRC` error contains only last processed member's data as their associated value - instead of all successfully processed members. + instead of all successfully processed members. This is a known issue and it will be fixed in future major version because solution requires backwards-incompatible API changes. @@ -90,7 +90,7 @@ public class GzipArchive: Archive { Archives `data` into GZip archive, using various specified options. Data will be also compressed with Deflate algorithm. It will be also specified in archive's header that the compressor used the slowest Deflate algorithm. - + If during compression something goes wrong `DeflateError` will be thrown. If either `fileName` or `comment` cannot be encoded with ISO Latin-1 encoding, then `GzipError.cannotEncodeISOLatin1` will be thrown. diff --git a/Sources/LZMADecoder.swift b/Sources/LZMADecoder.swift index f60ff0b9..2b7a4248 100644 --- a/Sources/LZMADecoder.swift +++ b/Sources/LZMADecoder.swift @@ -9,14 +9,14 @@ struct LZMAConstants { static let topValue = 1 << 24 static let numBitModelTotalBits = 11 static let numMoveBits = 5 - static let probInitValue = ((1 << numBitModelTotalBits) / 2) + static let probInitValue = (1 << numBitModelTotalBits) / 2 static let numPosBitsMax = 4 static let numStates = 12 static let numLenToPosStates = 4 static let numAlignBits = 4 static let startPosModelIndex = 4 static let endPosModelIndex = 14 - static let numFullDistances = (1 << (endPosModelIndex >> 1)) + static let numFullDistances = 1 << (endPosModelIndex >> 1) static let matchMinLen = 2 // LZMAConstants.numStates << LZMAConstants.numPosBitsMax = 192 } @@ -238,7 +238,9 @@ class LZMADecoder { let posState = out.count & ((1 << pb.toInt()) - 1) if rangeDecoder.decode(bitWithProb: &probabilities[(state << LZMAConstants.numPosBitsMax) + posState]) == 0 { - if uncompressedSize == 0 { throw LZMAError.exceededUncompressedSize } + if uncompressedSize == 0 { + throw LZMAError.exceededUncompressedSize + } // DECODE LITERAL: /// Previous literal (zero, if there was none). @@ -293,8 +295,12 @@ class LZMADecoder { var len: Int if rangeDecoder.decode(bitWithProb: &probabilities[193 + state]) != 0 { // REP MATCH CASE - if uncompressedSize == 0 { throw LZMAError.exceededUncompressedSize } - if dictEnd == 0 { throw LZMAError.windowIsEmpty } + if uncompressedSize == 0 { + throw LZMAError.exceededUncompressedSize + } + if dictEnd == 0 { + throw LZMAError.windowIsEmpty + } if rangeDecoder.decode(bitWithProb: &probabilities[205 + state]) == 0 { // (We use last distance from 'distance history table'). if rangeDecoder.decode(bitWithProb: @@ -350,7 +356,7 @@ class LZMADecoder { rep0 = posSlot } else { let numDirectBits = (posSlot >> 1) - 1 - var dist = ((2 | (posSlot & 1)) << numDirectBits) + var dist = (2 | (posSlot & 1)) << numDirectBits if posSlot < LZMAConstants.endPosModelIndex { // In this case we need a sequence of bits decoded with bit tree... // ...(separate trees for different `posSlot` values)... @@ -374,18 +380,23 @@ class LZMADecoder { // Check if finish marker is encountered. // Distance value of 2^32 is used to indicate 'End of Stream' marker. if UInt32(rep0) == 0xFFFFFFFF { - guard rangeDecoder.isFinishedOK else { throw LZMAError.rangeDecoderFinishError } + guard rangeDecoder.isFinishedOK + else { throw LZMAError.rangeDecoderFinishError } break } - if uncompressedSize == 0 { throw LZMAError.exceededUncompressedSize } + if uncompressedSize == 0 { + throw LZMAError.exceededUncompressedSize + } if rep0 >= dictionarySize || (rep0 > dictEnd && dictEnd < dictionarySize) { throw LZMAError.notEnoughToRepeat } } // Converting from zero-based length of the match to the real one. len += LZMAConstants.matchMinLen - if uncompressedSize > -1 && uncompressedSize < len { throw LZMAError.repeatWillExceed } + if uncompressedSize > -1 && uncompressedSize < len { + throw LZMAError.repeatWillExceed + } for _ in 0.. Date: Sat, 29 Jul 2017 23:20:43 +0300 Subject: [PATCH 037/113] Rename zip test to a more meaningful name --- Tests/ZipTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/ZipTests.swift b/Tests/ZipTests.swift index 1b1a6a44..53a95aa2 100644 --- a/Tests/ZipTests.swift +++ b/Tests/ZipTests.swift @@ -10,7 +10,7 @@ class ZipTests: XCTestCase { static let testType: String = "zip" - func test() { + func testBigContainer() { guard let testURL = Constants.url(forTest: "SWCompressionSourceCode", withType: ZipTests.testType) else { XCTFail("Unable to get test's URL.") return From b01e3c99d3cf775588ff10978b0ca6631702d520 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 23:22:18 +0300 Subject: [PATCH 038/113] Rework 7z tests to also use open function, provide long versions of them and use 7z container with SWCompression source code --- SWCompression.xcodeproj/project.pbxproj | 4 ++ Tests/SevenZipTests.swift | 79 ++++++++++++++++++++++--- Tests/Test Files | 2 +- 3 files changed, 77 insertions(+), 8 deletions(-) diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 151f71f1..9c4e3d15 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -274,6 +274,7 @@ 06D3456B1F102E740057173F /* test_pax.tar in Resources */ = {isa = PBXBuildFile; fileRef = 06D345661F102E740057173F /* test_pax.tar */; }; 06D3456C1F102E740057173F /* test_ustar.tar in Resources */ = {isa = PBXBuildFile; fileRef = 06D345671F102E740057173F /* test_ustar.tar */; }; 06D3456D1F102E740057173F /* test_v7.tar in Resources */ = {isa = PBXBuildFile; fileRef = 06D345681F102E740057173F /* test_v7.tar */; }; + 06DD48A71F2D24EF00F45599 /* SWCompressionSourceCode.7z in Resources */ = {isa = PBXBuildFile; fileRef = 06DD48A61F2D24EF00F45599 /* SWCompressionSourceCode.7z */; }; 06E2346C1E068E9600F18798 /* XZArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E2346B1E068E9600F18798 /* XZArchive.swift */; }; 06E2346D1E068E9600F18798 /* XZArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E2346B1E068E9600F18798 /* XZArchive.swift */; }; 06E2346E1E068E9600F18798 /* XZArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E2346B1E068E9600F18798 /* XZArchive.swift */; }; @@ -431,6 +432,7 @@ 06D345661F102E740057173F /* test_pax.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = test_pax.tar; sourceTree = ""; }; 06D345671F102E740057173F /* test_ustar.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = test_ustar.tar; sourceTree = ""; }; 06D345681F102E740057173F /* test_v7.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = test_v7.tar; sourceTree = ""; }; + 06DD48A61F2D24EF00F45599 /* SWCompressionSourceCode.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = SWCompressionSourceCode.7z; sourceTree = ""; }; 06E2346B1E068E9600F18798 /* XZArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XZArchive.swift; sourceTree = ""; }; 06E2347F1E069ABD00F18798 /* XzTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XzTests.swift; sourceTree = ""; }; 06E234811E06A6C200F18798 /* CheckSums.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CheckSums.swift; path = Sources/CheckSums.swift; sourceTree = SOURCE_ROOT; }; @@ -564,6 +566,7 @@ 064F722D1F1E63D800017297 /* 7z */ = { isa = PBXGroup; children = ( + 06DD48A61F2D24EF00F45599 /* SWCompressionSourceCode.7z */, 061358F91F274E080065BCEB /* test2.7z */, 061358FA1F274E080065BCEB /* test3.7z */, 064F722E1F1E63D800017297 /* test1.7z */, @@ -1034,6 +1037,7 @@ 06991C701E05A9F70030FF07 /* test9.lzma in Resources */, 06D3456A1F102E740057173F /* test_oldgnu.tar in Resources */, 06BD0D251E3D0C630054AA5C /* TestZip64.zip in Resources */, + 06DD48A71F2D24EF00F45599 /* SWCompressionSourceCode.7z in Resources */, 06393DFF1F1A858000A647A0 /* long_test_pax.tar in Resources */, 069DCE8D1EB64B1500ADC374 /* test5.gz in Resources */, 069DCE911EB64B1500ADC374 /* test9.gz in Resources */, diff --git a/Tests/SevenZipTests.swift b/Tests/SevenZipTests.swift index 04b74c6a..f6996b04 100644 --- a/Tests/SevenZipTests.swift +++ b/Tests/SevenZipTests.swift @@ -21,11 +21,26 @@ class SevenZipTests: XCTestCase { return } - guard let infos = try? SevenZipContainer.info(container: testData) else { + guard let entries = try? SevenZipContainer.open(container: testData) else { XCTFail("Unable to open 7z archive.") return } - print(infos) + + guard let answerURL = Constants.url(forAnswer: "test1") else { + XCTFail("Unable to get answer's URL.") + return + } + + guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { + XCTFail("Unable to load answer.") + return + } + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "test1.answer") + XCTAssertEqual(entries[0].isDirectory, false) + XCTAssertEqual(entries[0].size, answerData.count) + XCTAssertEqual(try? entries[0].data(), answerData) } func test2() { @@ -39,11 +54,43 @@ class SevenZipTests: XCTestCase { return } - guard let infos = try? SevenZipContainer.info(container: testData) else { + guard let entries = try? SevenZipContainer.open(container: testData) else { XCTFail("Unable to open 7z archive.") return } - print(infos) + + XCTAssertEqual(entries.count, 2) + + guard let answer1URL = Constants.url(forAnswer: "test1") else { + XCTFail("Unable to get answer's URL.") + return + } + + guard let answer1Data = try? Data(contentsOf: answer1URL, options: .mappedIfSafe) else { + XCTFail("Unable to load answer.") + return + } + + XCTAssertEqual(entries[0].name, "test1.answer") + XCTAssertEqual(entries[0].isDirectory, false) + XCTAssertEqual(entries[0].size, answer1Data.count) + XCTAssertEqual(try? entries[0].data(), answer1Data) + + + guard let answer4URL = Constants.url(forAnswer: "test4") else { + XCTFail("Unable to get answer's URL.") + return + } + + guard let answer4Data = try? Data(contentsOf: answer4URL, options: .mappedIfSafe) else { + XCTFail("Unable to load answer.") + return + } + + XCTAssertEqual(entries[0].name, "test4.answer") + XCTAssertEqual(entries[0].isDirectory, false) + XCTAssertEqual(entries[0].size, answer4Data.count) + XCTAssertEqual(try? entries[0].data(), answer4Data) } func test3() { @@ -57,11 +104,29 @@ class SevenZipTests: XCTestCase { return } - guard let infos = try? SevenZipContainer.info(container: testData) else { - XCTFail("Unable to open 7z archive.") + #if LONG_TESTS + XCTAssertNotNil(try? SevenZipContainer.open(container: testData)) + #else + XCTAssertNotNil(try? SevenZipContainer.info(container: testData)) + #endif + } + + func testBigContainer() { + guard let testURL = Constants.url(forTest: "SWCompressionSourceCode", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { + XCTFail("Unable to load test archive.") return } - print(infos) + + #if LONG_TESTS + XCTAssertNotNil(try? SevenZipContainer.open(container: testData)) + #else + XCTAssertNotNil(try? SevenZipContainer.info(container: testData)) + #endif } } diff --git a/Tests/Test Files b/Tests/Test Files index 927c83e5..ee419767 160000 --- a/Tests/Test Files +++ b/Tests/Test Files @@ -1 +1 @@ -Subproject commit 927c83e52f63a25534def677dcf2130a8bfd589d +Subproject commit ee41976767d1b72afe665231f0c5e51e06abb526 From 559c47a42dfc5bfc96b959aacbe3a5769324e69a Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 23:24:32 +0300 Subject: [PATCH 039/113] Fixes for packed header decoding Don't use optional for storing packed header end index, use correct pointer data object for LZMA2 decoding. --- Sources/7zHeader.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/7zHeader.swift b/Sources/7zHeader.swift index 3043eaed..038be5c6 100644 --- a/Sources/7zHeader.swift +++ b/Sources/7zHeader.swift @@ -51,7 +51,7 @@ class SevenZipHeader { let folderOffset = SevenZipContainer.signatureHeaderSize + packInfo.packPosition bitReader.index = folderOffset - var packedHeaderEndIndex: Int? = nil + var packedHeaderEndIndex = -1 var headerPointerData = BitReader(data: bitReader.data, bitOrder: .straight) headerPointerData.index = bitReader.index @@ -63,7 +63,7 @@ class SevenZipHeader { let unpackSize = folder.unpackSize(for: coder) let decodedData: Data - + // TODO: Copy filter. if coder.id == SevenZipCoder.ID.lzma2 { // Dictionary size is stored in coder's properties. guard let properties = coder.properties @@ -72,7 +72,7 @@ class SevenZipHeader { else { throw SevenZipError.wrongCoderProperties } decodedData = Data(bytes: try LZMA2.decompress(LZMA2.dictionarySize(properties[0]), - bitReader)) + headerPointerData)) } else if coder.id == SevenZipCoder.ID.lzma { // Both properties' byte (lp, lc, pb) and dictionary size are stored in coder's properties. guard let properties = coder.properties @@ -98,14 +98,14 @@ class SevenZipHeader { // Save header's data end index after first pass. // Necessary to calculate and check packed size later. - if packedHeaderEndIndex == nil { + if packedHeaderEndIndex == -1 { packedHeaderEndIndex = headerPointerData.index } headerPointerData = BitReader(data: decodedData, bitOrder: .straight) } - guard packedHeaderEndIndex! - bitReader.index == packInfo.packSizes[0] + guard packedHeaderEndIndex - bitReader.index == packInfo.packSizes[0] else { throw SevenZipError.wrongDataSize } guard headerPointerData.size == folder.unpackSize() else { throw SevenZipError.wrongDataSize } From b1bc89ecdd570fe01225ad0487d503186b60aea3 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 23:24:54 +0300 Subject: [PATCH 040/113] Add update-crc version for crc32 function with Data argument --- Sources/CheckSums.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/CheckSums.swift b/Sources/CheckSums.swift index 5384eebb..8080b66d 100644 --- a/Sources/CheckSums.swift +++ b/Sources/CheckSums.swift @@ -18,8 +18,8 @@ struct CheckSums { return ~crc } - static func crc32(_ data: Data) -> UInt32 { - var crc: UInt32 = ~0 + static func crc32(_ data: Data, prevValue: UInt32 = 0) -> UInt32 { + var crc = ~prevValue for i in 0..> 8) From 09683957570584f34f52b58eb6b6929da638e526 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 23:26:17 +0300 Subject: [PATCH 041/113] Implement SevenZipContainer.open function There are some problems when one packed stream contains several files, though. --- Sources/7zContainer.swift | 199 +++++++++++++++++++++++++++++++++++++- Sources/7zEntry.swift | 5 +- Sources/7zError.swift | 5 + 3 files changed, 206 insertions(+), 3 deletions(-) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index d9af782c..b41e1bea 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -10,7 +10,204 @@ public class SevenZipContainer: Container { static let signatureHeaderSize = 32 public static func open(container data: Data) throws -> [ContainerEntry] { - return [] + var entries = [SevenZipEntry]() + let header = try readHeader(data) + + guard let files = header.fileInfo?.files + else { return [] } + + /// Index of currently opened folder in `streamInfo.coderInfo.folders`. + var folderIndex = 0 + + /// Index of currently extracted file in `headerInfo.fileInfo.files`. + var fileInFolderCount = 0 + + /// Index of currently read stream. + var streamIndex = -1 + + var oldStreamIndex = -1 + + /// Index of current stream for folder in `folder.packedStreams`. + var folderStreamIndex = -1 + + /// Total size of unpacked data for current folder. Used for consistency check. + var folderUnpackSize = 0 + + /// Total size of read data for current stream. Used for consistency check. + var streamPackSize = 0 + + var folderCRC = CheckSums.crc32(Data()) + var streamCRC = CheckSums.crc32(Data()) + + let pointerData = DataWithPointer(data: data) + + for fileIndex in 0..= packInfo.packSizes[streamIndex] { + // We already have opened folder, but we need to go to the next stream. + guard streamPackSize == packInfo.packSizes[streamIndex] + else { throw SevenZipError.streamOverread } + folderStreamIndex += 1 + guard folderStreamIndex < folder.numPackedStreams + else { throw SevenZipError.notEnoughStreams } + oldStreamIndex = streamIndex + streamIndex = folder.packedStreams[folderStreamIndex] + streamChanged = true + } + + if streamChanged { // We need to move to the stream's offset if we switched streams. + pointerData.index = packOffset + if oldStreamIndex > -1 { + // If there was a processed stream already, we check its CRC. + if oldStreamIndex < packInfo.digests.count, + let storedStreamCRC = packInfo.digests[oldStreamIndex] { + guard streamCRC == storedStreamCRC + else { throw SevenZipError.wrongCRC } + } + } + // Reset information about old CRC. + oldStreamIndex = -1 + streamCRC = CheckSums.crc32(Data()) + if streamIndex != 0 { + for i in 0..= substreamInfo.unpackSizes.count || + data.count == substreamInfo.unpackSizes[fileIndex] + else { throw SevenZipError.wrongDataSize } + guard fileIndex >= substreamInfo.digests.count || + calculatedFileCRC == substreamInfo.digests[fileIndex] + else { throw SevenZipError.wrongCRC } + } + // Even if container doesn't have info about file's size and/or CRC32, + // we still can calculate them and store in `SevenZipEntryInfo` object. + info = SevenZipEntryInfo(file, data.count, calculatedFileCRC) + + fileInFolderCount += 1 + + if fileInFolderCount > folder.numUnpackSubstreams { // If we read all files in folder... + // We need to check folder's unpacked size as well as its CRC32 (if it is available). + guard folderUnpackSize == folder.unpackSize() + else { throw SevenZipError.wrongDataSize } + if let storedFolderCRC = folder.crc { + guard folderCRC == storedFolderCRC + else { throw SevenZipError.wrongCRC } + } + folderCRC = CheckSums.crc32(Data()) + // Moving to the next folder. + folderIndex += 1 + // Resetting files count for the next folder. + fileInFolderCount = 0 + // Next folder will have its own stream. + folderStreamIndex = -1 + } + } else { + info = SevenZipEntryInfo(file) + data = Data() + } + + entries.append(SevenZipEntry(info, data)) + } + + return entries } public static func info(container data: Data) throws -> [SevenZipEntryInfo] { diff --git a/Sources/7zEntry.swift b/Sources/7zEntry.swift index 6e9652d2..6436b749 100644 --- a/Sources/7zEntry.swift +++ b/Sources/7zEntry.swift @@ -25,9 +25,10 @@ public class SevenZipEntry: ContainerEntry { private let dataObject: Data - init(_ bitReader: BitReader, _ entryInfo: SevenZipEntryInfo) { + init(_ entryInfo: SevenZipEntryInfo, _ data: Data) { + // TODO: Make data decoding here? self.info = entryInfo - self.dataObject = Data() + self.dataObject = data self.entryAttributes = [:] } diff --git a/Sources/7zError.swift b/Sources/7zError.swift index bad2c8ec..129b2480 100644 --- a/Sources/7zError.swift +++ b/Sources/7zError.swift @@ -33,4 +33,9 @@ public enum SevenZipError: Error { case incompleteProperty case additionalStreamsNotSupported case noFileSize + case notEnoughFolders + case notEnoughStreams + case noStreamFound + case noPackInfoFound + case streamOverread } From c4771949698653416a71e8b4cc39b76b87d65d0d Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 23:27:20 +0300 Subject: [PATCH 042/113] Don't return empty info array when no substreamInfo found In this case we can still get some information about files and we should return it. --- Sources/7zContainer.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index b41e1bea..f02444e6 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -214,18 +214,18 @@ public class SevenZipContainer: Container { var entryInfos = [SevenZipEntryInfo]() let header = try readHeader(data) - guard let files = header.fileInfo?.files, let substreamInfo = header.mainStreams?.substreamInfo + guard let files = header.fileInfo?.files else { return [] } var nonEmptyFileIndex = 0 for file in files { - if file.isEmptyStream { - entryInfos.append(SevenZipEntryInfo(file)) - } else { + if !file.isEmptyStream, let substreamInfo = header.mainStreams?.substreamInfo { entryInfos.append(SevenZipEntryInfo(file, substreamInfo.unpackSizes[nonEmptyFileIndex], substreamInfo.digests[nonEmptyFileIndex])) nonEmptyFileIndex += 1 + } else { + entryInfos.append(SevenZipEntryInfo(file)) } } From e455ccb5b0be01e0bcf7c345da22dcfa75d833bd Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 23:30:34 +0300 Subject: [PATCH 043/113] Add xcode project groups for deflate and bzip2 --- SWCompression.xcodeproj/project.pbxproj | 26 ++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 9c4e3d15..e0cf5325 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -705,11 +705,8 @@ isa = PBXGroup; children = ( 06A3931F1DE06FFE00182E12 /* Common */, - 061FCE251DBCC4BE0052F7BE /* Deflate.swift */, - 06CDFCA71F111D9700292758 /* DeflateError.swift */, - 06CDFC9D1F111D2600292758 /* DeflateCompression.swift */, - 06FED40B1DD7717E0013DFB2 /* BZip2.swift */, - 06CDFCA21F111D6C00292758 /* BZip2Error.swift */, + 06DD48A81F2D27CA00F45599 /* Deflate */, + 06DD48A91F2D27D200F45599 /* BZip2 */, 069D0FFE1E0D6CF200D8AA87 /* LZMA */, 061C063B1F0E8A9500832F0C /* XZ */, 061C06391F0E8A8300832F0C /* GZip */, @@ -804,6 +801,25 @@ path = Formats; sourceTree = ""; }; + 06DD48A81F2D27CA00F45599 /* Deflate */ = { + isa = PBXGroup; + children = ( + 061FCE251DBCC4BE0052F7BE /* Deflate.swift */, + 06CDFCA71F111D9700292758 /* DeflateError.swift */, + 06CDFC9D1F111D2600292758 /* DeflateCompression.swift */, + ); + name = Deflate; + sourceTree = ""; + }; + 06DD48A91F2D27D200F45599 /* BZip2 */ = { + isa = PBXGroup; + children = ( + 06FED40B1DD7717E0013DFB2 /* BZip2.swift */, + 06CDFCA21F111D6C00292758 /* BZip2Error.swift */, + ); + name = BZip2; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ From 45e70d5f7abf401dfebcf21ea4e85cec87106a81 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 29 Jul 2017 23:38:03 +0300 Subject: [PATCH 044/113] Fix incorrect badge link in README --- README.md | 2 +- Sources/7zFileInfo.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 86ae415d..36c3fcbc 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![CocoaPods](https://img.shields.io/cocoapods/p/SWCompression.svg)](https://cocoapods.org/pods/SWCompression) [![Swift 3](https://img.shields.io/badge/Swift-3.1.1-lightgrey.svg)](https://developer.apple.com/swift/) [![Build Status](https://travis-ci.org/tsolomko/SWCompression.svg?branch=develop)](https://travis-ci.org/tsolomko/SWCompression) -[![Test Coverage](https://codeclimate.com/github/tsolomko/SWCompression/badges/coverage.svg)](https://codeclimate.com/github/codeclimate/codeclimate/coverage) +[![Test Coverage](https://codeclimate.com/github/tsolomko/SWCompression/badges/coverage.svg)](https://codeclimate.com/github/tsolomko/SWCompression/coverage) [![CocoaPods](https://img.shields.io/cocoapods/v/SWCompression.svg)](https://cocoapods.org/pods/SWCompression) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index 984a48ec..1a920472 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -9,7 +9,7 @@ class SevenZipFileInfo { struct File { var isEmptyStream = false - var isEmptyFile = false // TODO: Does it mean directory? + var isEmptyFile = false var isAntiFile = false var name: String? var cTime: UInt64? From f0bdff081a14269733d40ad5aa36e0e54995823f Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 15:48:03 +0300 Subject: [PATCH 045/113] Extract function for unpacking data in 7z --- Sources/7zFolder.swift | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Sources/7zFolder.swift b/Sources/7zFolder.swift index 3274ab15..2ab478ec 100644 --- a/Sources/7zFolder.swift +++ b/Sources/7zFolder.swift @@ -129,4 +129,50 @@ class SevenZipFolder { return 0 } + func unpack(data: Data) throws -> Data { + var decodedData = data + for coder in self.orderedCoders() { + guard coder.numInStreams == 1 || coder.numOutStreams == 1 + else { throw SevenZipError.multiStreamNotSupported } + + let unpackSize = self.unpackSize(for: coder) + + // TODO: Copy filter. + if coder.id == SevenZipCoder.ID.lzma2 { + // Dictionary size is stored in coder's properties. + guard let properties = coder.properties + else { throw SevenZipError.wrongCoderProperties } + guard properties.count == 1 + else { throw SevenZipError.wrongCoderProperties } + + let pointerData = DataWithPointer(data: decodedData) + decodedData = Data(bytes: try LZMA2.decompress(LZMA2.dictionarySize(properties[0]), + pointerData)) + } else if coder.id == SevenZipCoder.ID.lzma { + // Both properties' byte (lp, lc, pb) and dictionary size are stored in coder's properties. + guard let properties = coder.properties + else { throw SevenZipError.wrongCoderProperties } + guard properties.count == 5 + else { throw SevenZipError.wrongCoderProperties } + + let pointerData = DataWithPointer(data: decodedData) + let lzmaDecoder = try LZMADecoder(pointerData) + + var dictionarySize = 0 + for i in 1..<4 { + dictionarySize |= properties[i].toInt() << (8 * (i - 1)) + } + + try lzmaDecoder.decodeLZMA(unpackSize, properties[0], dictionarySize) + decodedData = Data(bytes: lzmaDecoder.out) + } else { + throw SevenZipError.compressionNotSupported + } + + guard decodedData.count == unpackSize + else { throw SevenZipError.wrongDataSize } + } + return decodedData + } + } From 3503bcbb89f87e5a3f7270ea2c26795eb0f03e62 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 15:52:28 +0300 Subject: [PATCH 046/113] Support unavailable data in SevenZipEntry (when no substreamInfo is found) --- Sources/7zEntry.swift | 16 +++++++++++----- Sources/7zError.swift | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Sources/7zEntry.swift b/Sources/7zEntry.swift index 6436b749..1ea89ba4 100644 --- a/Sources/7zEntry.swift +++ b/Sources/7zEntry.swift @@ -23,17 +23,23 @@ public class SevenZipEntry: ContainerEntry { public var entryAttributes: [FileAttributeKey: Any] - private let dataObject: Data + public let dataIsAvailable: Bool - init(_ entryInfo: SevenZipEntryInfo, _ data: Data) { - // TODO: Make data decoding here? + private let dataObject: Data? + + init(_ entryInfo: SevenZipEntryInfo, _ data: Data?) { self.info = entryInfo self.dataObject = data + self.dataIsAvailable = data != nil self.entryAttributes = [:] } - public func data() -> Data { - return dataObject + public func data() throws -> Data { + if let data = dataObject { + return data + } else { + throw SevenZipError.dataIsUnavailable + } } } diff --git a/Sources/7zError.swift b/Sources/7zError.swift index 129b2480..70bd936e 100644 --- a/Sources/7zError.swift +++ b/Sources/7zError.swift @@ -38,4 +38,5 @@ public enum SevenZipError: Error { case noStreamFound case noPackInfoFound case streamOverread + case dataIsUnavailable } From dac0bc426b4af86910ab58525d619f5e93356c93 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 15:52:44 +0300 Subject: [PATCH 047/113] Disable swiftlint rule which contradicts my philosophy --- .swiftlint.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.swiftlint.yml b/.swiftlint.yml index ceea26f4..b9cd272f 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -6,7 +6,6 @@ disabled_rules: opt_in_rules: - conditional_returns_on_newline - explicit_init - - explicit_type_interface - fatal_error_message - first_where - force_unwrapping From da13e3a881ade2b0a954f3df9e5bdd0752a47912 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 15:52:57 +0300 Subject: [PATCH 048/113] Fix incorrect 7z test2 --- Tests/SevenZipTests.swift | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Tests/SevenZipTests.swift b/Tests/SevenZipTests.swift index f6996b04..7f40fd54 100644 --- a/Tests/SevenZipTests.swift +++ b/Tests/SevenZipTests.swift @@ -76,7 +76,6 @@ class SevenZipTests: XCTestCase { XCTAssertEqual(entries[0].size, answer1Data.count) XCTAssertEqual(try? entries[0].data(), answer1Data) - guard let answer4URL = Constants.url(forAnswer: "test4") else { XCTFail("Unable to get answer's URL.") return @@ -87,10 +86,10 @@ class SevenZipTests: XCTestCase { return } - XCTAssertEqual(entries[0].name, "test4.answer") + XCTAssertEqual(entries[1].name, "test4.answer") XCTAssertEqual(entries[0].isDirectory, false) - XCTAssertEqual(entries[0].size, answer4Data.count) - XCTAssertEqual(try? entries[0].data(), answer4Data) + XCTAssertEqual(entries[1].size, answer4Data.count) + XCTAssertEqual(try? entries[1].data(), answer4Data) } func test3() { From a7dfb668206952ab6ccb55cd8de337f9e7db329a Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 15:53:47 +0300 Subject: [PATCH 049/113] Fix problems with unpacking files We now account for the fact that one stream contains information for several files. --- Sources/7zCoderInfo.swift | 6 +- Sources/7zContainer.swift | 173 ++++++++++++++++---------------------- 2 files changed, 75 insertions(+), 104 deletions(-) diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index c5dbea81..796a10bf 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -46,10 +46,8 @@ class SevenZipCoderInfo { let definedBits = bitReader.defBits(count: numFolders) bitReader.skipUntilNextByte() - for i in 0..= packInfo.packSizes[streamIndex] { + } else if rawUnpackSize >= rawFileData.size { // We already have opened folder, but we need to go to the next stream. - guard streamPackSize == packInfo.packSizes[streamIndex] + guard rawUnpackSize == rawFileData.size else { throw SevenZipError.streamOverread } folderStreamIndex += 1 guard folderStreamIndex < folder.numPackedStreams else { throw SevenZipError.notEnoughStreams } - oldStreamIndex = streamIndex streamIndex = folder.packedStreams[folderStreamIndex] streamChanged = true } - if streamChanged { // We need to move to the stream's offset if we switched streams. - pointerData.index = packOffset - if oldStreamIndex > -1 { - // If there was a processed stream already, we check its CRC. - if oldStreamIndex < packInfo.digests.count, - let storedStreamCRC = packInfo.digests[oldStreamIndex] { - guard streamCRC == storedStreamCRC - else { throw SevenZipError.wrongCRC } - } - } - // Reset information about old CRC. - oldStreamIndex = -1 - streamCRC = CheckSums.crc32(Data()) + if streamChanged { // We need to load the new stream if we switched streams. + // First, we move to the stream's offset. + // We don't have any guarantees that streams will be enountered in the same order, + // as they are placed in the container. + // Thus, we have to start moving to stream's offset from the beginning. + // (Maybe, this is incorrect and the order of streams is guaranteed). + pointerData.index = signatureHeaderSize + packInfo.packPosition // Pack offset. if streamIndex != 0 { for i in 0..= substreamInfo.unpackSizes.count || - data.count == substreamInfo.unpackSizes[fileIndex] - else { throw SevenZipError.wrongDataSize } - guard fileIndex >= substreamInfo.digests.count || - calculatedFileCRC == substreamInfo.digests[fileIndex] + // File's unpack size is required to proceed. + // Next check ensures that we don't `unpackSizes` array's boundaries. + guard fileIndex < substreamInfo.unpackSizes.count + else { throw SevenZipError.noFileSize } + + let fileSize = substreamInfo.unpackSizes[fileIndex] + let fileData = Data(bytes: rawFileData.bytes(count: fileSize)) + + let calculatedFileCRC = CheckSums.crc32(fileData) + if fileIndex < substreamInfo.digests.count { + guard calculatedFileCRC == substreamInfo.digests[fileIndex] else { throw SevenZipError.wrongCRC } } - // Even if container doesn't have info about file's size and/or CRC32, - // we still can calculate them and store in `SevenZipEntryInfo` object. - info = SevenZipEntryInfo(file, data.count, calculatedFileCRC) + + info = SevenZipEntryInfo(file, fileSize, calculatedFileCRC) + data = fileData + + // Update folder's crc and unpack size. + folderUnpackSize += fileSize + folderCRC = CheckSums.crc32(fileData, prevValue: folderCRC) + + // Update unpackSize for stream. + rawUnpackSize += fileSize fileInFolderCount += 1 @@ -191,11 +162,13 @@ public class SevenZipContainer: Container { guard folderCRC == storedFolderCRC else { throw SevenZipError.wrongCRC } } + // Resetting folder's crc and unpack size. folderCRC = CheckSums.crc32(Data()) - // Moving to the next folder. - folderIndex += 1 + folderUnpackSize = 0 // Resetting files count for the next folder. fileInFolderCount = 0 + // Moving to the next folder. + folderIndex += 1 // Next folder will have its own stream. folderStreamIndex = -1 } From e9774296a550c68354f73b167e73973bb9a1099a Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 16:00:06 +0300 Subject: [PATCH 050/113] Use folder.unpack(data:) function for unpacking packed headers --- Sources/7zHeader.swift | 67 +++++------------------------------------- 1 file changed, 8 insertions(+), 59 deletions(-) diff --git a/Sources/7zHeader.swift b/Sources/7zHeader.swift index 038be5c6..969a059c 100644 --- a/Sources/7zHeader.swift +++ b/Sources/7zHeader.swift @@ -51,72 +51,21 @@ class SevenZipHeader { let folderOffset = SevenZipContainer.signatureHeaderSize + packInfo.packPosition bitReader.index = folderOffset - var packedHeaderEndIndex = -1 - - var headerPointerData = BitReader(data: bitReader.data, bitOrder: .straight) - headerPointerData.index = bitReader.index - - for coder in folder.orderedCoders() { - guard coder.numInStreams == 1 || coder.numOutStreams == 1 - else { throw SevenZipError.multiStreamNotSupported } - - let unpackSize = folder.unpackSize(for: coder) - - let decodedData: Data - // TODO: Copy filter. - if coder.id == SevenZipCoder.ID.lzma2 { - // Dictionary size is stored in coder's properties. - guard let properties = coder.properties - else { throw SevenZipError.wrongCoderProperties } - guard properties.count == 1 - else { throw SevenZipError.wrongCoderProperties } - - decodedData = Data(bytes: try LZMA2.decompress(LZMA2.dictionarySize(properties[0]), - headerPointerData)) - } else if coder.id == SevenZipCoder.ID.lzma { - // Both properties' byte (lp, lc, pb) and dictionary size are stored in coder's properties. - guard let properties = coder.properties - else { throw SevenZipError.wrongCoderProperties } - guard properties.count == 5 - else { throw SevenZipError.wrongCoderProperties } - - let lzmaDecoder = try LZMADecoder(headerPointerData) - - var dictionarySize = 0 - for i in 1..<4 { - dictionarySize |= properties[i].toInt() << (8 * (i - 1)) - } - - try lzmaDecoder.decodeLZMA(unpackSize, properties[0], dictionarySize) - decodedData = Data(bytes: lzmaDecoder.out) - } else { - throw SevenZipError.compressionNotSupported - } - - guard decodedData.count == unpackSize - else { throw SevenZipError.wrongDataSize } - - // Save header's data end index after first pass. - // Necessary to calculate and check packed size later. - if packedHeaderEndIndex == -1 { - packedHeaderEndIndex = headerPointerData.index - } - - headerPointerData = BitReader(data: decodedData, bitOrder: .straight) - } + let packedHeaderData = Data(bitReader.bytes(count: packInfo.packSizes[0])) + let headerData = try folder.unpack(data: packedHeaderData) - guard packedHeaderEndIndex - bitReader.index == packInfo.packSizes[0] - else { throw SevenZipError.wrongDataSize } - guard headerPointerData.size == folder.unpackSize() + guard headerData.count == folder.unpackSize() else { throw SevenZipError.wrongDataSize } if let crc = folder.crc { - guard CheckSums.crc32(headerPointerData.data) == crc + guard CheckSums.crc32(headerData) == crc else { throw SevenZipError.wrongCRC } } - guard headerPointerData.byte() == 0x01 + let headerBitReader = BitReader(data: headerData, bitOrder: .straight) + + guard headerBitReader.byte() == 0x01 else { throw SevenZipError.wrongPropertyID } - try self.init(headerPointerData) + try self.init(headerBitReader) } } From c5877fdc9403864978c5471167157b6de0e9d7d8 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 16:23:56 +0300 Subject: [PATCH 051/113] Reduce amount of guard statements in tests by making all tests throwing --- Tests/Bzip2Tests.swift | 56 ++++++------- Tests/DeflateTests.swift | 57 ++++++------- Tests/GzipTests.swift | 165 +++++++++++++------------------------- Tests/LzmaTests.swift | 34 +++----- Tests/SevenZipTests.swift | 63 ++++----------- Tests/TarTests.swift | 66 ++++----------- Tests/XzTests.swift | 128 +++++++++-------------------- Tests/ZipTests.swift | 96 ++++++---------------- Tests/ZlibTests.swift | 52 +++--------- 9 files changed, 221 insertions(+), 496 deletions(-) diff --git a/Tests/Bzip2Tests.swift b/Tests/Bzip2Tests.swift index 77eb45d1..3bdd57df 100644 --- a/Tests/Bzip2Tests.swift +++ b/Tests/Bzip2Tests.swift @@ -10,80 +10,70 @@ class Bzip2Tests: XCTestCase { static let testType: String = "bz2" - func perform(test testName: String) { + func perform(test testName: String) throws { guard let testURL = Constants.url(forTest: testName, withType: Bzip2Tests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let decompressedData = try? BZip2.decompress(data: testData) else { - XCTFail("Unable to decompress.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let decompressedData = try BZip2.decompress(data: testData) guard let answerURL = Constants.url(forAnswer: testName) else { XCTFail("Unable to get asnwer's URL.") return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(decompressedData, answerData, "Decompression was incorrect.") #if PERF_TESTS print("Performing performance tests for \(Bzip2Tests.testType).\(testName)") self.measure { - _ = try? BZip2.decompress(data: testData) + _ = try BZip2.decompress(data: testData) } #endif } - func test1Bzip2() { - self.perform(test: "test1") + func test1Bzip2() throws { + try self.perform(test: "test1") } - func test2Bzip2() { - self.perform(test: "test2") + func test2Bzip2() throws { + try self.perform(test: "test2") } - func test3Bzip2() { - self.perform(test: "test3") + func test3Bzip2() throws { + try self.perform(test: "test3") } - func test4Bzip2() { - self.perform(test: "test4") + func test4Bzip2() throws { + try self.perform(test: "test4") } - func test5Bzip2() { - self.perform(test: "test5") + func test5Bzip2() throws { + try self.perform(test: "test5") } #if LONG_TESTS - func test6Bzip2() { - self.perform(test: "test6") + func test6Bzip2() throws { + try self.perform(test: "test6") } - func test7Bzip2() { - self.perform(test: "test7") + func test7Bzip2() throws { + try self.perform(test: "test7") } #endif - func test8Bzip2() { - self.perform(test: "test8") + func test8Bzip2() throws { + try self.perform(test: "test8") } - func test9Bzip2() { - self.perform(test: "test9") + func test9Bzip2() throws { + try self.perform(test: "test9") } } diff --git a/Tests/DeflateTests.swift b/Tests/DeflateTests.swift index c5b051d3..287c6b67 100644 --- a/Tests/DeflateTests.swift +++ b/Tests/DeflateTests.swift @@ -8,26 +8,15 @@ import SWCompression class DeflateTests: XCTestCase { - func perform(compressionTest testName: String) { + func perform(compressionTest testName: String) throws { guard let answerURL = Constants.url(forAnswer: testName) else { XCTFail("Unable to get test's URL.") return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let deflatedData = try? Deflate.compress(data: answerData) else { - XCTFail("Unable to deflate data") - return - } - - guard let reUncompData = try? Deflate.decompress(data: deflatedData) else { - XCTFail("Unable to re-decompress data.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) + let deflatedData = try Deflate.compress(data: answerData) + let reUncompData = try Deflate.decompress(data: deflatedData) XCTAssertEqual(answerData, reUncompData, "Data before compression and after decompression of compressed data aren't equal.") @@ -35,50 +24,50 @@ class DeflateTests: XCTestCase { #if PERF_TESTS print("Performing performance tests for deflate.\(testName)") self.measure { - _ = try? Deflate.compress(data: answerData) + _ = try Deflate.compress(data: answerData) } #endif } - func testDeflate1() { - self.perform(compressionTest: "test1") + func testDeflate1() throws { + try self.perform(compressionTest: "test1") } - func testDeflate2() { - self.perform(compressionTest: "test2") + func testDeflate2() throws { + try self.perform(compressionTest: "test2") } - func testDeflate3() { - self.perform(compressionTest: "test3") + func testDeflate3() throws { + try self.perform(compressionTest: "test3") } - func testDeflate4() { - self.perform(compressionTest: "test4") + func testDeflate4() throws { + try self.perform(compressionTest: "test4") } - func testDeflate5() { - self.perform(compressionTest: "test5") + func testDeflate5() throws { + try self.perform(compressionTest: "test5") } - func testDeflate6() { - self.perform(compressionTest: "test6") + func testDeflate6() throws { + try self.perform(compressionTest: "test6") } #if LONG_TESTS - func testDeflate7() { - self.perform(compressionTest: "test7") + func testDeflate7() throws { + try self.perform(compressionTest: "test7") } #endif - func testDeflate8() { - self.perform(compressionTest: "test8") + func testDeflate8() throws { + try self.perform(compressionTest: "test8") } - func testDeflate9() { - self.perform(compressionTest: "test9") + func testDeflate9() throws { + try self.perform(compressionTest: "test9") } } diff --git a/Tests/GzipTests.swift b/Tests/GzipTests.swift index 5b339152..9d5b5422 100644 --- a/Tests/GzipTests.swift +++ b/Tests/GzipTests.swift @@ -10,23 +10,14 @@ class GzipTests: XCTestCase { static let testType: String = "gz" - func header(test testName: String, mtime: Int) { - // Load archive. + func header(test testName: String, mtime: Int) throws { guard let testURL = Constants.url(forTest: testName, withType: GzipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - // Test GZip header parsing - guard let testGzipHeader = try? GzipHeader(archive: testData) else { - XCTFail("Unable to get archive header.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let testGzipHeader = try GzipHeader(archive: testData) XCTAssertEqual(testGzipHeader.compressionMethod, .deflate, "Incorrect compression method.") XCTAssertEqual(testGzipHeader.modificationTime, Date(timeIntervalSince1970: TimeInterval(mtime)), @@ -36,77 +27,54 @@ class GzipTests: XCTestCase { XCTAssertEqual(testGzipHeader.comment, nil, "Incorrect comment.") } - func unarchive(test testName: String) { - // Load archive. + func unarchive(test testName: String) throws { guard let testURL = Constants.url(forTest: testName, withType: GzipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - // Test GZip unarchiving. - guard let decompressedData = try? GzipArchive.unarchive(archive: testData) else { - XCTFail("Unable to decompress.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let decompressedData = try? GzipArchive.unarchive(archive: testData) guard let answerURL = Constants.url(forAnswer: testName) else { XCTFail("Unable to get answer's URL.") return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(decompressedData, answerData, "Decompression was incorrect.") #if PERF_TESTS print("Performing performance tests for gz.\(testName)") self.measure { - _ = try? GzipArchive.unarchive(archive: testData) + _ = try GzipArchive.unarchive(archive: testData) } #endif } - func archive(test testName: String) { - // Load answer data. + func archive(test testName: String) throws { guard let answerURL = Constants.url(forAnswer: testName) else { XCTFail("Unable to get answer's URL.") return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer archive.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) // Options for archiving. let mtimeDate = Date(timeIntervalSinceNow: 0.0) let mtime = Double(Int(mtimeDate.timeIntervalSince1970)) // Test GZip archiving. - guard let archiveData = try? GzipArchive.archive(data: answerData, - comment: "some file comment", - fileName: testName + ".answer", - writeHeaderCRC: true, - isTextFile: true, - osType: .macintosh, - modificationTime: mtimeDate) else { - XCTFail("Unable to create archive.") - return - } + let archiveData = try GzipArchive.archive(data: answerData, comment: "some file comment", + fileName: testName + ".answer", + writeHeaderCRC: true, + isTextFile: true, + osType: .macintosh, + modificationTime: mtimeDate) // Test output GZip header. - guard let testGzipHeader = try? GzipHeader(archive: archiveData) else { - XCTFail("Unable to get archive header.") - return - } + let testGzipHeader = try GzipHeader(archive: archiveData) XCTAssertEqual(testGzipHeader.compressionMethod, .deflate, "Incorrect compression method.") XCTAssertEqual(testGzipHeader.modificationTime?.timeIntervalSince1970, mtime, "Incorrect mtime.") @@ -116,78 +84,68 @@ class GzipTests: XCTestCase { XCTAssertTrue(testGzipHeader.isTextFile) // Test output GZip archive content. - guard let decompressedData = try? GzipArchive.unarchive(archive: archiveData) else { - XCTFail("Unable to decompress.") - return - } + let decompressedData = try GzipArchive.unarchive(archive: archiveData) XCTAssertEqual(decompressedData, answerData, "Decompression was incorrect.") } - func testGzip1() { - self.header(test: "test1", mtime: 1482698300) - self.unarchive(test: "test1") + func testGzip1() throws { + try self.header(test: "test1", mtime: 1482698300) + try self.unarchive(test: "test1") } - func testGzip2() { - self.header(test: "test2", mtime: 1482698300) - self.unarchive(test: "test2") + func testGzip2() throws { + try self.header(test: "test2", mtime: 1482698300) + try self.unarchive(test: "test2") } - func testGzip3() { - self.header(test: "test3", mtime: 1482698301) - self.unarchive(test: "test3") + func testGzip3() throws { + try self.header(test: "test3", mtime: 1482698301) + try self.unarchive(test: "test3") } - func testGzip4() { - self.header(test: "test4", mtime: 1482698301) - self.unarchive(test: "test4") + func testGzip4() throws { + try self.header(test: "test4", mtime: 1482698301) + try self.unarchive(test: "test4") } - func testGzip5() { - self.header(test: "test5", mtime: 1482698242) - self.unarchive(test: "test5") + func testGzip5() throws { + try self.header(test: "test5", mtime: 1482698242) + try self.unarchive(test: "test5") } - func testGzip6() { - self.header(test: "test6", mtime: 1482698305) - self.unarchive(test: "test6") + func testGzip6() throws { + try self.header(test: "test6", mtime: 1482698305) + try self.unarchive(test: "test6") } - func testGzip7() { - self.header(test: "test7", mtime: 1482698304) - self.unarchive(test: "test7") + func testGzip7() throws { + try self.header(test: "test7", mtime: 1482698304) + try self.unarchive(test: "test7") } - func testGzip8() { - self.header(test: "test8", mtime: 1483040005) - self.unarchive(test: "test8") + func testGzip8() throws { + try self.header(test: "test8", mtime: 1483040005) + try self.unarchive(test: "test8") } - func testGzip9() { - self.header(test: "test9", mtime: 1483040005) - self.unarchive(test: "test9") + func testGzip9() throws { + try self.header(test: "test9", mtime: 1483040005) + try self.unarchive(test: "test9") } - func testGzipArchive4() { - self.archive(test: "test4") + func testGzipArchive4() throws { + try self.archive(test: "test4") } - func testMultiUnarchive() { + func testMultiUnarchive() throws { guard let testURL = Constants.url(forTest: "test_multi", withType: GzipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let members = try? GzipArchive.multiUnarchive(archive: testData) else { - XCTFail("Unable to unarchive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let members = try GzipArchive.multiUnarchive(archive: testData) XCTAssertEqual(members.count, 4) @@ -201,30 +159,20 @@ class GzipTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(data, answerData) } } - func testMultiUnarchiveRedundant() { + func testMultiUnarchiveRedundant() throws { guard let testURL = Constants.url(forTest: "test1", withType: GzipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let members = try? GzipArchive.multiUnarchive(archive: testData) else { - XCTFail("Unable to unarchive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let members = try GzipArchive.multiUnarchive(archive: testData) XCTAssertEqual(members.count, 1) @@ -237,10 +185,7 @@ class GzipTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(data, answerData) } diff --git a/Tests/LzmaTests.swift b/Tests/LzmaTests.swift index 83b860f2..a98b0222 100644 --- a/Tests/LzmaTests.swift +++ b/Tests/LzmaTests.swift @@ -10,49 +10,39 @@ class LzmaTests: XCTestCase { static let testType: String = "lzma" - func perform(test testName: String) { + func perform(test testName: String) throws { guard let testURL = Constants.url(forTest: testName, withType: LzmaTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let decompressedData = try? LZMA.decompress(data: testData) else { - XCTFail("Unable to decompress.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let decompressedData = try LZMA.decompress(data: testData) guard let answerURL = Constants.url(forAnswer: "test8") else { XCTFail("Unable to get answer's URL.") return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(decompressedData, answerData, "Decompression was incorrect.") } - func testLzma8() { - self.perform(test: "test8") + func testLzma8() throws { + try self.perform(test: "test8") } - func testLzma9() { - self.perform(test: "test9") + func testLzma9() throws { + try self.perform(test: "test9") } - func testLzma10() { - self.perform(test: "test10") + func testLzma10() throws { + try self.perform(test: "test10") } - func testLzma11() { - self.perform(test: "test11") + func testLzma11() throws { + try self.perform(test: "test11") } } diff --git a/Tests/SevenZipTests.swift b/Tests/SevenZipTests.swift index 7f40fd54..f77fb7e1 100644 --- a/Tests/SevenZipTests.swift +++ b/Tests/SevenZipTests.swift @@ -10,31 +10,21 @@ class SevenZipTests: XCTestCase { static let testType: String = "7z" - func test1() { + func test1() throws { guard let testURL = Constants.url(forTest: "test1", withType: SevenZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let entries = try? SevenZipContainer.open(container: testData) else { - XCTFail("Unable to open 7z archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) guard let answerURL = Constants.url(forAnswer: "test1") else { XCTFail("Unable to get answer's URL.") return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(entries.count, 1) XCTAssertEqual(entries[0].name, "test1.answer") @@ -43,21 +33,14 @@ class SevenZipTests: XCTestCase { XCTAssertEqual(try? entries[0].data(), answerData) } - func test2() { + func test2() throws { guard let testURL = Constants.url(forTest: "test2", withType: SevenZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let entries = try? SevenZipContainer.open(container: testData) else { - XCTFail("Unable to open 7z archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) XCTAssertEqual(entries.count, 2) @@ -66,42 +49,33 @@ class SevenZipTests: XCTestCase { return } - guard let answer1Data = try? Data(contentsOf: answer1URL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + var answerData = try Data(contentsOf: answer1URL, options: .mappedIfSafe) XCTAssertEqual(entries[0].name, "test1.answer") XCTAssertEqual(entries[0].isDirectory, false) - XCTAssertEqual(entries[0].size, answer1Data.count) - XCTAssertEqual(try? entries[0].data(), answer1Data) + XCTAssertEqual(entries[0].size, answerData.count) + XCTAssertEqual(try? entries[0].data(), answerData) guard let answer4URL = Constants.url(forAnswer: "test4") else { XCTFail("Unable to get answer's URL.") return } - guard let answer4Data = try? Data(contentsOf: answer4URL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + answerData = try Data(contentsOf: answer4URL, options: .mappedIfSafe) XCTAssertEqual(entries[1].name, "test4.answer") XCTAssertEqual(entries[0].isDirectory, false) - XCTAssertEqual(entries[1].size, answer4Data.count) - XCTAssertEqual(try? entries[1].data(), answer4Data) + XCTAssertEqual(entries[1].size, answerData.count) + XCTAssertEqual(try? entries[1].data(), answerData) } - func test3() { + func test3() throws { guard let testURL = Constants.url(forTest: "test3", withType: SevenZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) #if LONG_TESTS XCTAssertNotNil(try? SevenZipContainer.open(container: testData)) @@ -110,16 +84,13 @@ class SevenZipTests: XCTestCase { #endif } - func testBigContainer() { + func testBigContainer() throws { guard let testURL = Constants.url(forTest: "SWCompressionSourceCode", withType: SevenZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) #if LONG_TESTS XCTAssertNotNil(try? SevenZipContainer.open(container: testData)) diff --git a/Tests/TarTests.swift b/Tests/TarTests.swift index e1c71d71..2ec5eb1b 100644 --- a/Tests/TarTests.swift +++ b/Tests/TarTests.swift @@ -10,21 +10,14 @@ class TarTests: XCTestCase { static let testType: String = "tar" - func test() { + func test() throws { guard let testURL = Constants.url(forTest: "test", withType: TarTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let result = try? TarContainer.open(container: testData) else { - XCTFail("Unable to parse TAR container.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let result = try TarContainer.open(container: testData) XCTAssertEqual(result.count, 1) XCTAssertEqual(result[0].name, "test5.answer") @@ -33,23 +26,17 @@ class TarTests: XCTestCase { XCTAssertEqual(try? result[0].data(), Data()) } - func testPax() { + func testPax() throws { guard let testURL = Constants.url(forTest: "full_test", withType: TarTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let result = try? TarContainer.open(container: testData) else { - XCTFail("Unable to parse TAR container.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let result = try TarContainer.open(container: testData) XCTAssertEqual(result.count, 5) + for entry in result { guard let tarEntry = entry as? TarEntry else { XCTFail("Unable to convert entry to TarEntry.") @@ -61,17 +48,15 @@ class TarTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) + XCTAssertEqual(tarEntry.data(), answerData) XCTAssertEqual(tarEntry.isDirectory, false) XCTAssertNotNil(tarEntry.accessTime) } } - func testFormats() { + func testFormats() throws { let formatTestNames = ["test_gnu", "test_oldgnu", "test_pax", "test_ustar", "test_v7"] guard let answerURL = Constants.url(forAnswer: "test1") else { @@ -79,10 +64,7 @@ class TarTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) for testName in formatTestNames { guard let testURL = Constants.url(forTest: testName, withType: TarTests.testType) else { @@ -90,15 +72,8 @@ class TarTests: XCTestCase { return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let result = try? TarContainer.open(container: testData) else { - XCTFail("Unable to parse TAR container.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let result = try TarContainer.open(container: testData) XCTAssertEqual(result.count, 1) XCTAssertEqual(result[0].name, "test1.answer") @@ -108,7 +83,7 @@ class TarTests: XCTestCase { } } - func testLongNames() { + func testLongNames() throws { let formatTestNames = ["long_test_gnu", "long_test_oldgnu", "long_test_pax"] for testName in formatTestNames { @@ -117,17 +92,10 @@ class TarTests: XCTestCase { return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let entries = try? TarContainer.open(container: testData) else { - XCTFail("Unable to parse TAR container.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let result = try TarContainer.open(container: testData) - XCTAssertEqual(entries.count, 6) + XCTAssertEqual(result.count, 6) } } diff --git a/Tests/XzTests.swift b/Tests/XzTests.swift index 019a3022..591f8ade 100644 --- a/Tests/XzTests.swift +++ b/Tests/XzTests.swift @@ -10,95 +10,78 @@ class XZTests: XCTestCase { static let testType: String = "xz" - func perform(test testName: String) { + func perform(test testName: String) throws { guard let testURL = Constants.url(forTest: testName, withType: XZTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let decompressedData = try? XZArchive.unarchive(archive: testData) else { - XCTFail("Unable to decompress.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let decompressedData = try XZArchive.unarchive(archive: testData) guard let answerURL = Constants.url(forAnswer: testName) else { XCTFail("Unable to get answer's URL.") return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(decompressedData, answerData, "Decompression was incorrect.") #if PERF_TESTS print("Performing performance tests for \(XZTests.testType).\(testName)") self.measure { - _ = try? XZArchive.unarchive(archive: testData) + _ = try XZArchive.unarchive(archive: testData) } #endif } - func testXz1() { - self.perform(test: "test1") + func testXz1() throws { + try self.perform(test: "test1") } - func testXz2() { - self.perform(test: "test2") + func testXz2() throws { + try self.perform(test: "test2") } - func testXz3() { - self.perform(test: "test3") + func testXz3() throws { + try self.perform(test: "test3") } - func testXz4() { + func testXz4() throws { // This test contains padding! - self.perform(test: "test4") + try self.perform(test: "test4") } - func testXz5() { - self.perform(test: "test5") + func testXz5() throws { + try self.perform(test: "test5") } - func testXz6() { - self.perform(test: "test6") + func testXz6() throws { + try self.perform(test: "test6") } - func testXz7() { - self.perform(test: "test7") + func testXz7() throws { + try self.perform(test: "test7") } - func testXz8() { - self.perform(test: "test8") + func testXz8() throws { + try self.perform(test: "test8") } - func testXz9() { - self.perform(test: "test9") + func testXz9() throws { + try self.perform(test: "test9") } - func testMultiUnarchive() { + func testMultiUnarchive() throws { // Doesn't contain any padding. guard let testURL = Constants.url(forTest: "test_multi", withType: XZTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let members = try? XZArchive.multiUnarchive(archive: testData) else { - XCTFail("Unable to unarchive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let members = try XZArchive.multiUnarchive(archive: testData) XCTAssertEqual(members.count, 4) @@ -108,16 +91,13 @@ class XZTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(members[i - 1], answerData) } } - func testMultiUnarchiveWithPadding() { + func testMultiUnarchiveWithPadding() throws { // After first stream - no padding. // After second - 4 bytes of padding. // Third - 8 bytes. @@ -128,15 +108,8 @@ class XZTests: XCTestCase { return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let members = try? XZArchive.multiUnarchive(archive: testData) else { - XCTFail("Unable to unarchive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let members = try XZArchive.multiUnarchive(archive: testData) XCTAssertEqual(members.count, 4) @@ -146,30 +119,20 @@ class XZTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(members[i - 1], answerData) } } - func testMultiUnarchiveRedundant1() { + func testMultiUnarchiveRedundant1() throws { guard let testURL = Constants.url(forTest: "test4", withType: XZTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let members = try? XZArchive.multiUnarchive(archive: testData) else { - XCTFail("Unable to unarchive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let members = try XZArchive.multiUnarchive(archive: testData) XCTAssertEqual(members.count, 1) @@ -178,29 +141,19 @@ class XZTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(members[0], answerData) } - func testMultiUnarchiveRedundant2() { + func testMultiUnarchiveRedundant2() throws { guard let testURL = Constants.url(forTest: "test1", withType: XZTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let members = try? XZArchive.multiUnarchive(archive: testData) else { - XCTFail("Unable to unarchive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let members = try XZArchive.multiUnarchive(archive: testData) XCTAssertEqual(members.count, 1) @@ -209,10 +162,7 @@ class XZTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(members[0], answerData) } diff --git a/Tests/ZipTests.swift b/Tests/ZipTests.swift index 53a95aa2..a2b54fa8 100644 --- a/Tests/ZipTests.swift +++ b/Tests/ZipTests.swift @@ -10,92 +10,64 @@ class ZipTests: XCTestCase { static let testType: String = "zip" - func testBigContainer() { + func testBigContainer() throws { guard let testURL = Constants.url(forTest: "SWCompressionSourceCode", withType: ZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let entries = try? ZipContainer.open(container: testData) else { - XCTFail("Unable to open ZIP archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) XCTAssertEqual(entries.count, 211) #if LONG_TESTS for entry in entries { - XCTAssertNotNil(try? entry.data()) + _ = try entry.data() } #endif } - func testZip64() { + func testZip64() throws { guard let testURL = Constants.url(forTest: "TestZip64", withType: ZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let entries = try? ZipContainer.open(container: testData) else { - XCTFail("Unable to open ZIP archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) XCTAssertEqual(entries.count, 6) for entry in entries { - XCTAssertNotNil(try? entry.data()) + _ = try entry.data() } } - func testDataDescriptor() { + func testDataDescriptor() throws { guard let testURL = Constants.url(forTest: "TestDataDescriptor", withType: ZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let entries = try? ZipContainer.open(container: testData) else { - XCTFail("Unable to open ZIP archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) XCTAssertEqual(entries.count, 6) - for entry in entries where !entry.isDirectory { - XCTAssertNotNil(try? entry.data()) + for entry in entries { + _ = try entry.data() } } - func testUnicode() { + func testUnicode() throws { guard let testURL = Constants.url(forTest: "TestUnicode", withType: ZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let entries = try? ZipContainer.open(container: testData) else { - XCTFail("Unable to open ZIP archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) XCTAssertEqual(entries.count, 1) XCTAssertEqual(entries[0].name, "текстовый файл") @@ -103,21 +75,14 @@ class ZipTests: XCTestCase { XCTAssertNotNil(try? entries[0].data()) } - func testZipLZMA() { + func testZipLZMA() throws { guard let testURL = Constants.url(forTest: "test_zip_lzma", withType: ZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let entries = try? ZipContainer.open(container: testData) else { - XCTFail("Unable to open ZIP archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) XCTAssertEqual(entries.count, 1) XCTAssertEqual(entries[0].name, "test4.answer") @@ -128,31 +93,21 @@ class ZipTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(try? entries[0].data(), answerData) // Test repeat of getting entry data (there was a problem with it). XCTAssertEqual(try? entries[0].data(), answerData) } - func testZipBZip2() { + func testZipBZip2() throws { guard let testURL = Constants.url(forTest: "test_zip_bzip2", withType: ZipTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let entries = try? ZipContainer.open(container: testData) else { - XCTFail("Unable to open ZIP archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) XCTAssertEqual(entries.count, 1) XCTAssertEqual(entries[0].name, "test4.answer") @@ -163,10 +118,7 @@ class ZipTests: XCTestCase { return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(try? entries[0].data(), answerData) } diff --git a/Tests/ZlibTests.swift b/Tests/ZlibTests.swift index cdd97cb4..6adc23f3 100644 --- a/Tests/ZlibTests.swift +++ b/Tests/ZlibTests.swift @@ -10,7 +10,7 @@ class ZlibTests: XCTestCase { static let testType: String = "zlib" - func testZlib() { + func testZlib() throws { let testName = "test" guard let testURL = Constants.url(forTest: testName, withType: ZlibTests.testType) else { @@ -18,72 +18,42 @@ class ZlibTests: XCTestCase { return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let testZlibHeader = try? ZlibHeader(archive: testData) else { - XCTFail("Unable to get archive header.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let testZlibHeader = try ZlibHeader(archive: testData) XCTAssertEqual(testZlibHeader.compressionMethod, .deflate, "Incorrect compression method.") XCTAssertEqual(testZlibHeader.compressionLevel, .defaultAlgorithm, "Incorrect compression level.") XCTAssertEqual(testZlibHeader.windowSize, 32768, "Incorrect window size.") } - func testZlibFull() { + func testZlibFull() throws { guard let testURL = Constants.url(forTest: "random_file", withType: ZlibTests.testType) else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - let decompressedData = try? ZlibArchive.unarchive(archive: testData) - - guard decompressedData != nil else { - XCTFail("Unable to decompress.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let decompressedData = try ZlibArchive.unarchive(archive: testData) guard let answerURL = Constants.url(forAnswer: "test9") else { XCTFail("Unable to get answer's URL.") return } - guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { - XCTFail("Unable to load answer.") - return - } + let answerData = try Data(contentsOf: answerURL, options: .mappedIfSafe) XCTAssertEqual(decompressedData, answerData, "Unarchiving was incorrect") } - func testCreateZlib() { + func testCreateZlib() throws { guard let testURL = Constants.url(forAnswer: "test9") else { XCTFail("Unable to get test's URL.") return } - guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { - XCTFail("Unable to load test archive.") - return - } - - guard let archiveData = try? ZlibArchive.archive(data: testData) else { - XCTFail("Unable to create archive.") - return - } - - guard let reextractedData = try? ZlibArchive.unarchive(archive: archiveData) else { - XCTFail("Unable to re-extract created archive.") - return - } + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let archiveData = try ZlibArchive.archive(data: testData) + let reextractedData = try ZlibArchive.unarchive(archive: archiveData) XCTAssertEqual(testData, reextractedData, "Re-extracted data is not equal to initial data.") } From 5831c5201ddbdaf0daf2a32f0ff801ae5fb7ec86 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 18:36:07 +0300 Subject: [PATCH 052/113] Add encryptionNotSupported error for 7z --- Sources/7zError.swift | 1 + Sources/7zFolder.swift | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Sources/7zError.swift b/Sources/7zError.swift index 70bd936e..3fc88cbd 100644 --- a/Sources/7zError.swift +++ b/Sources/7zError.swift @@ -39,4 +39,5 @@ public enum SevenZipError: Error { case noPackInfoFound case streamOverread case dataIsUnavailable + case encryptionNotSupported } diff --git a/Sources/7zFolder.swift b/Sources/7zFolder.swift index 2ab478ec..89db5b3a 100644 --- a/Sources/7zFolder.swift +++ b/Sources/7zFolder.swift @@ -166,7 +166,11 @@ class SevenZipFolder { try lzmaDecoder.decodeLZMA(unpackSize, properties[0], dictionarySize) decodedData = Data(bytes: lzmaDecoder.out) } else { - throw SevenZipError.compressionNotSupported + if coder.id[0] == 0x06 { + throw SevenZipError.encryptionNotSupported + } else { + throw SevenZipError.compressionNotSupported + } } guard decodedData.count == unpackSize From 995ee2953176e7ff5d3c926541a30582d97bd804 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 20:03:26 +0300 Subject: [PATCH 053/113] Parse 7zEntryInfo into 7zEntry.entryAttributes --- Sources/7zEntry.swift | 23 ++++++++++++++++++++++- Sources/7zEntryInfo.swift | 6 +++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Sources/7zEntry.swift b/Sources/7zEntry.swift index 1ea89ba4..24546a24 100644 --- a/Sources/7zEntry.swift +++ b/Sources/7zEntry.swift @@ -31,7 +31,28 @@ public class SevenZipEntry: ContainerEntry { self.info = entryInfo self.dataObject = data self.dataIsAvailable = data != nil - self.entryAttributes = [:] + + var attributesDict = [FileAttributeKey: Any]() + + if let mtime = entryInfo.modificationTime { + attributesDict[FileAttributeKey.modificationDate] = mtime + } + + if let ctime = entryInfo.creationTime { + attributesDict[FileAttributeKey.creationDate] = ctime + } + + if let size = entryInfo.size { + attributesDict[FileAttributeKey.size] = size + } + + if entryInfo.isDirectory { + attributesDict[FileAttributeKey.type] = FileAttributeType.typeDirectory + } else { + attributesDict[FileAttributeKey.type] = FileAttributeType.typeRegular + } + + self.entryAttributes = attributesDict } public func data() throws -> Data { diff --git a/Sources/7zEntryInfo.swift b/Sources/7zEntryInfo.swift index 72540f81..7aee2b28 100644 --- a/Sources/7zEntryInfo.swift +++ b/Sources/7zEntryInfo.swift @@ -13,7 +13,7 @@ public struct SevenZipEntryInfo { public let accessTime: Date? public let creationTime: Date? public let modificationTime: Date? - public let windowsAttributes: UInt32? + public let attributes: UInt32? public let hasStream: Bool public let isEmpty: Bool @@ -47,14 +47,14 @@ public struct SevenZipEntryInfo { self.modificationTime = nil } - self.windowsAttributes = file.winAttributes + self.attributes = file.winAttributes self.crc = crc self.size = size } private static func ntfsTimeToDate(_ time: UInt64?) -> Date? { - if let time = time { // TODO: Probably incorrect hours, minutes, seconds. + if let time = time { return DateComponents(calendar: Calendar(identifier: .iso8601), timeZone: TimeZone(abbreviation: "UTC"), year: 1601, month: 1, day: 1, From 8eeb849015527186ab71a4818bc9224d7a47daa8 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 20:04:57 +0300 Subject: [PATCH 054/113] Add reference to ASF commons-compress to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 36c3fcbc..d5f74dd5 100644 --- a/README.md +++ b/README.md @@ -213,3 +213,4 @@ References - [Wikipedia article about TAR](https://en.wikipedia.org/wiki/Tar_(computing)) - [Pax specification](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html) - [Basic TAR specification](https://www.gnu.org/software/tar/manual/html_node/Standard.html) +- [Apache Commons Compress](https://commons.apache.org/proper/commons-compress/) From 86874b9beeb224688dd13dbd1fc4de062fb78822 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 22:25:37 +0300 Subject: [PATCH 055/113] Add some tests for 7z "empty" cases --- SWCompression.xcodeproj/project.pbxproj | 12 +++++ Tests/SevenZipTests.swift | 58 ++++++++++++++++++++++--- Tests/TarTests.swift | 4 +- Tests/Test Files | 2 +- Tests/ZipTests.swift | 8 ++-- 5 files changed, 70 insertions(+), 14 deletions(-) diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index e0cf5325..86bdd3d4 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -130,6 +130,9 @@ 0685E6241F123F0D008655AA /* test_zip_bzip2.zip in Resources */ = {isa = PBXBuildFile; fileRef = 0685E6231F123F0D008655AA /* test_zip_bzip2.zip */; }; 068B36791ED0AC050016269E /* full_test.tar in Resources */ = {isa = PBXBuildFile; fileRef = 068B36781ED0AC050016269E /* full_test.tar */; }; 0691B9401EBE3E100037EE58 /* test.tar in Resources */ = {isa = PBXBuildFile; fileRef = 0691B93F1EBE3E100037EE58 /* test.tar */; }; + 0693DF521F2E499F00602300 /* test_empty_dir.7z in Resources */ = {isa = PBXBuildFile; fileRef = 0693DF501F2E499F00602300 /* test_empty_dir.7z */; }; + 0693DF531F2E499F00602300 /* test_empty_file.7z in Resources */ = {isa = PBXBuildFile; fileRef = 0693DF511F2E499F00602300 /* test_empty_file.7z */; }; + 0693DF551F2E4AEE00602300 /* test_empty_cont.7z in Resources */ = {isa = PBXBuildFile; fileRef = 0693DF541F2E4AEE00602300 /* test_empty_cont.7z */; }; 0696E5C61ED0B22F00921D4D /* TarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0696E5C51ED0B22F00921D4D /* TarTests.swift */; }; 06991C701E05A9F70030FF07 /* test9.lzma in Resources */ = {isa = PBXBuildFile; fileRef = 06991C6D1E05A9F70030FF07 /* test9.lzma */; }; 06991C711E05A9F70030FF07 /* test10.lzma in Resources */ = {isa = PBXBuildFile; fileRef = 06991C6E1E05A9F70030FF07 /* test10.lzma */; }; @@ -352,6 +355,9 @@ 0685E6231F123F0D008655AA /* test_zip_bzip2.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = test_zip_bzip2.zip; sourceTree = ""; }; 068B36781ED0AC050016269E /* full_test.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = full_test.tar; sourceTree = ""; }; 0691B93F1EBE3E100037EE58 /* test.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = test.tar; sourceTree = ""; }; + 0693DF501F2E499F00602300 /* test_empty_dir.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_empty_dir.7z; sourceTree = ""; }; + 0693DF511F2E499F00602300 /* test_empty_file.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_empty_file.7z; sourceTree = ""; }; + 0693DF541F2E4AEE00602300 /* test_empty_cont.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_empty_cont.7z; sourceTree = ""; }; 0696E5C51ED0B22F00921D4D /* TarTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TarTests.swift; sourceTree = ""; }; 06991C6D1E05A9F70030FF07 /* test9.lzma */ = {isa = PBXFileReference; lastKnownFileType = file; path = test9.lzma; sourceTree = ""; }; 06991C6E1E05A9F70030FF07 /* test10.lzma */ = {isa = PBXFileReference; lastKnownFileType = file; path = test10.lzma; sourceTree = ""; }; @@ -567,6 +573,9 @@ isa = PBXGroup; children = ( 06DD48A61F2D24EF00F45599 /* SWCompressionSourceCode.7z */, + 0693DF501F2E499F00602300 /* test_empty_dir.7z */, + 0693DF511F2E499F00602300 /* test_empty_file.7z */, + 0693DF541F2E4AEE00602300 /* test_empty_cont.7z */, 061358F91F274E080065BCEB /* test2.7z */, 061358FA1F274E080065BCEB /* test3.7z */, 064F722E1F1E63D800017297 /* test1.7z */, @@ -1045,10 +1054,12 @@ 06D07AB01EB64EE800BC8C65 /* test5.xz in Resources */, 06BD0D241E3D0C630054AA5C /* TestDataDescriptor.zip in Resources */, 0691B9401EBE3E100037EE58 /* test.tar in Resources */, + 0693DF531F2E499F00602300 /* test_empty_file.7z in Resources */, 06D07A9E1EB64E7A00BC8C65 /* test6.bz2 in Resources */, 06D07A9C1EB64E7A00BC8C65 /* test4.bz2 in Resources */, 06D07AA01EB64E7A00BC8C65 /* test8.bz2 in Resources */, 069DCE8C1EB64B1500ADC374 /* test4.gz in Resources */, + 0693DF551F2E4AEE00602300 /* test_empty_cont.7z in Resources */, 06D07AB41EB64EE800BC8C65 /* test9.xz in Resources */, 06991C701E05A9F70030FF07 /* test9.lzma in Resources */, 06D3456A1F102E740057173F /* test_oldgnu.tar in Resources */, @@ -1070,6 +1081,7 @@ 061358FC1F274E080065BCEB /* test3.7z in Resources */, 06BD0D231E3D0C630054AA5C /* SWCompressionSourceCode.zip in Resources */, 06D07AB11EB64EE800BC8C65 /* test6.xz in Resources */, + 0693DF521F2E499F00602300 /* test_empty_dir.7z in Resources */, 061358FB1F274E080065BCEB /* test2.7z in Resources */, 06B374CB1E0EECD500064853 /* random_file.zlib in Resources */, 06393DFE1F1A858000A647A0 /* long_test_oldgnu.tar in Resources */, diff --git a/Tests/SevenZipTests.swift b/Tests/SevenZipTests.swift index f77fb7e1..214780f6 100644 --- a/Tests/SevenZipTests.swift +++ b/Tests/SevenZipTests.swift @@ -10,6 +10,50 @@ class SevenZipTests: XCTestCase { static let testType: String = "7z" + func testEmptyFile() throws { + guard let testURL = Constants.url(forTest: "test_empty_file", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "empty_file") + XCTAssertEqual(entries[0].isDirectory, false) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + } + + func testEmptyDirectory() throws { + guard let testURL = Constants.url(forTest: "test_empty_dir", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "empty_dir") + XCTAssertEqual(entries[0].isDirectory, true) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + } + + func testEmptyContainer() throws { + guard let testURL = Constants.url(forTest: "test_empty_cont", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.isEmpty, true) + } + func test1() throws { guard let testURL = Constants.url(forTest: "test1", withType: SevenZipTests.testType) else { XCTFail("Unable to get test's URL.") @@ -30,7 +74,7 @@ class SevenZipTests: XCTestCase { XCTAssertEqual(entries[0].name, "test1.answer") XCTAssertEqual(entries[0].isDirectory, false) XCTAssertEqual(entries[0].size, answerData.count) - XCTAssertEqual(try? entries[0].data(), answerData) + XCTAssertEqual(try entries[0].data(), answerData) } func test2() throws { @@ -54,7 +98,7 @@ class SevenZipTests: XCTestCase { XCTAssertEqual(entries[0].name, "test1.answer") XCTAssertEqual(entries[0].isDirectory, false) XCTAssertEqual(entries[0].size, answerData.count) - XCTAssertEqual(try? entries[0].data(), answerData) + XCTAssertEqual(try entries[0].data(), answerData) guard let answer4URL = Constants.url(forAnswer: "test4") else { XCTFail("Unable to get answer's URL.") @@ -66,7 +110,7 @@ class SevenZipTests: XCTestCase { XCTAssertEqual(entries[1].name, "test4.answer") XCTAssertEqual(entries[0].isDirectory, false) XCTAssertEqual(entries[1].size, answerData.count) - XCTAssertEqual(try? entries[1].data(), answerData) + XCTAssertEqual(try entries[1].data(), answerData) } func test3() throws { @@ -78,9 +122,9 @@ class SevenZipTests: XCTestCase { let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) #if LONG_TESTS - XCTAssertNotNil(try? SevenZipContainer.open(container: testData)) + _ = try SevenZipContainer.open(container: testData) #else - XCTAssertNotNil(try? SevenZipContainer.info(container: testData)) + _ = try SevenZipContainer.info(container: testData) #endif } @@ -93,9 +137,9 @@ class SevenZipTests: XCTestCase { let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) #if LONG_TESTS - XCTAssertNotNil(try? SevenZipContainer.open(container: testData)) + _ = try SevenZipContainer.open(container: testData) #else - XCTAssertNotNil(try? SevenZipContainer.info(container: testData)) + _ = try SevenZipContainer.info(container: testData) #endif } diff --git a/Tests/TarTests.swift b/Tests/TarTests.swift index 2ec5eb1b..467b217d 100644 --- a/Tests/TarTests.swift +++ b/Tests/TarTests.swift @@ -23,7 +23,7 @@ class TarTests: XCTestCase { XCTAssertEqual(result[0].name, "test5.answer") XCTAssertEqual(result[0].size, 0) XCTAssertEqual(result[0].isDirectory, false) - XCTAssertEqual(try? result[0].data(), Data()) + XCTAssertEqual(try result[0].data(), Data()) } func testPax() throws { @@ -79,7 +79,7 @@ class TarTests: XCTestCase { XCTAssertEqual(result[0].name, "test1.answer") XCTAssertEqual(result[0].size, 14) XCTAssertEqual(result[0].isDirectory, false) - XCTAssertEqual(try? result[0].data(), answerData) + XCTAssertEqual(try result[0].data(), answerData) } } diff --git a/Tests/Test Files b/Tests/Test Files index ee419767..b646ac6e 160000 --- a/Tests/Test Files +++ b/Tests/Test Files @@ -1 +1 @@ -Subproject commit ee41976767d1b72afe665231f0c5e51e06abb526 +Subproject commit b646ac6ef7d69756792cd463615ce9300be73dee diff --git a/Tests/ZipTests.swift b/Tests/ZipTests.swift index a2b54fa8..64eef628 100644 --- a/Tests/ZipTests.swift +++ b/Tests/ZipTests.swift @@ -72,7 +72,7 @@ class ZipTests: XCTestCase { XCTAssertEqual(entries.count, 1) XCTAssertEqual(entries[0].name, "текстовый файл") XCTAssertEqual(entries[0].isDirectory, false) - XCTAssertNotNil(try? entries[0].data()) + XCTAssertNotNil(try entries[0].data()) } func testZipLZMA() throws { @@ -95,9 +95,9 @@ class ZipTests: XCTestCase { let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) - XCTAssertEqual(try? entries[0].data(), answerData) + XCTAssertEqual(try entries[0].data(), answerData) // Test repeat of getting entry data (there was a problem with it). - XCTAssertEqual(try? entries[0].data(), answerData) + XCTAssertEqual(try entries[0].data(), answerData) } func testZipBZip2() throws { @@ -120,7 +120,7 @@ class ZipTests: XCTestCase { let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) - XCTAssertEqual(try? entries[0].data(), answerData) + XCTAssertEqual(try entries[0].data(), answerData) } } From f0c0c24d90865558f9e7883ddc9f17939ee32190 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 30 Jul 2017 22:26:25 +0300 Subject: [PATCH 056/113] Return empty arrays for completely empty containers --- Sources/7zContainer.swift | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index c91892a8..8a1e7b59 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -11,7 +11,8 @@ public class SevenZipContainer: Container { public static func open(container data: Data) throws -> [ContainerEntry] { var entries = [SevenZipEntry]() - let header = try readHeader(data) + guard let header = try readHeader(data) + else { return [] } guard let files = header.fileInfo?.files else { return [] } @@ -185,7 +186,8 @@ public class SevenZipContainer: Container { public static func info(container data: Data) throws -> [SevenZipEntryInfo] { var entryInfos = [SevenZipEntryInfo]() - let header = try readHeader(data) + guard let header = try readHeader(data) + else { return [] } guard let files = header.fileInfo?.files else { return [] } @@ -205,7 +207,7 @@ public class SevenZipContainer: Container { return entryInfos } - private static func readHeader(_ data: Data) throws -> SevenZipHeader { + private static func readHeader(_ data: Data) throws -> SevenZipHeader? { /// Object with input data which supports convenient work with bit shifts. let bitReader = BitReader(data: data, bitOrder: .straight) @@ -235,6 +237,10 @@ public class SevenZipContainer: Container { let headerStartIndex = bitReader.index let headerEndIndex: Int + if bitReader.isAtTheEnd { + return nil // In case of completely empty container. + } + let type = bitReader.byte() let header: SevenZipHeader From 42553d82bfa94e522cde2e6137da15d2e9c37558 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Mon, 31 Jul 2017 17:49:44 +0300 Subject: [PATCH 057/113] Fix problem with 7z containers with empty and non-empty files unpackSizes array doesn't have values for empty files. --- Sources/7zContainer.swift | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index 8a1e7b59..125197fd 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -17,6 +17,8 @@ public class SevenZipContainer: Container { guard let files = header.fileInfo?.files else { return [] } + var nonEmptyFileIndex = 0 + /// Index of currently opened folder in `streamInfo.coderInfo.folders`. var folderIndex = 0 @@ -52,8 +54,6 @@ public class SevenZipContainer: Container { let data: Data? if !file.isEmptyStream { - // TODO: Does empty files need all this? - // Without `SevenZipStreamInfo` and `SevenZipPackInfo` objects, // we cannot find file data location in container. guard let streamInfo = header.mainStreams @@ -131,15 +131,15 @@ public class SevenZipContainer: Container { // File's unpack size is required to proceed. // Next check ensures that we don't `unpackSizes` array's boundaries. - guard fileIndex < substreamInfo.unpackSizes.count + guard nonEmptyFileIndex < substreamInfo.unpackSizes.count else { throw SevenZipError.noFileSize } - let fileSize = substreamInfo.unpackSizes[fileIndex] + let fileSize = substreamInfo.unpackSizes[nonEmptyFileIndex] let fileData = Data(bytes: rawFileData.bytes(count: fileSize)) let calculatedFileCRC = CheckSums.crc32(fileData) - if fileIndex < substreamInfo.digests.count { - guard calculatedFileCRC == substreamInfo.digests[fileIndex] + if nonEmptyFileIndex < substreamInfo.digests.count { + guard calculatedFileCRC == substreamInfo.digests[nonEmptyFileIndex] else { throw SevenZipError.wrongCRC } } @@ -154,6 +154,7 @@ public class SevenZipContainer: Container { rawUnpackSize += fileSize fileInFolderCount += 1 + nonEmptyFileIndex += 1 if fileInFolderCount > folder.numUnpackSubstreams { // If we read all files in folder... // We need to check folder's unpacked size as well as its CRC32 (if it is available). From 0bc1d470e948a24d9b9f0d4db34dd8b14d400251 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Mon, 31 Jul 2017 18:55:56 +0300 Subject: [PATCH 058/113] Add some types for permissions/attributes --- Sources/7zEntryInfo.swift | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/Sources/7zEntryInfo.swift b/Sources/7zEntryInfo.swift index 7aee2b28..a37b4c2c 100644 --- a/Sources/7zEntryInfo.swift +++ b/Sources/7zEntryInfo.swift @@ -7,6 +7,59 @@ import Foundation public struct SevenZipEntryInfo { + public struct Permissions: OptionSet { + + public let rawValue: UInt32 + + public init(rawValue: UInt32) { + self.rawValue = rawValue + } + + public static let setuid = Permissions(rawValue: 0o4000) + public static let setgid = Permissions(rawValue: 0o2000) + public static let sticky = Permissions(rawValue: 0o1000) + + public static let readOwner = Permissions(rawValue: 0o0400) + public static let writeOwner = Permissions(rawValue: 0o0200) + public static let executeOwner = Permissions(rawValue: 0o0100) + + public static let readGroup = Permissions(rawValue: 0o0040) + public static let writeGroup = Permissions(rawValue: 0o0020) + public static let executeGroup = Permissions(rawValue: 0o0010) + + public static let readOther = Permissions(rawValue: 0o0004) + public static let writeOther = Permissions(rawValue: 0o0002) + public static let executeOther = Permissions(rawValue: 0o0001) + + } + + public struct DosAttributes: OptionSet { + + public let rawValue: UInt32 + + public init(rawValue: UInt32) { + self.rawValue = rawValue + } + + public static let archive = DosAttributes(rawValue: 0b00100000) + public static let directory = DosAttributes(rawValue: 0b00010000) + public static let volume = DosAttributes(rawValue: 0b00001000) + public static let system = DosAttributes(rawValue: 0b00000100) + public static let hidden = DosAttributes(rawValue: 0b00000010) + public static let readOnly = DosAttributes(rawValue: 0b00000001) + + } + + public enum UnixType: UInt32 { + case fifo = 0o010000 + case characterSpecial = 0o020000 + case directory = 0o040000 + case blockSpecial = 0o060000 + case regular = 0o100000 + case symbolicLink = 0o120000 + case socket = 0o140000 + } + public let name: String? public let size: Int? public let isDirectory: Bool From c324508ab342f127b777c27acfd14c9699fb3150 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 2 Aug 2017 17:29:54 +0300 Subject: [PATCH 059/113] Enable some new swiftlint rules --- .swiftlint.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.swiftlint.yml b/.swiftlint.yml index b9cd272f..3ec9ceac 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -14,3 +14,7 @@ opt_in_rules: - operator_usage_whitespace - redundant_nil_coalescing - switch_case_on_newline + - strict_fileprivate + - trailing_closure + - block_based_kvo + - discouraged_direct_init \ No newline at end of file From 8ca5f9e37ca40efc3a586647d51d3ef7a4db9715 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 2 Aug 2017 17:31:33 +0300 Subject: [PATCH 060/113] Use new attribute types in 7z entry info --- Sources/7zEntryInfo.swift | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Sources/7zEntryInfo.swift b/Sources/7zEntryInfo.swift index a37b4c2c..2f354858 100644 --- a/Sources/7zEntryInfo.swift +++ b/Sources/7zEntryInfo.swift @@ -8,7 +8,7 @@ import Foundation public struct SevenZipEntryInfo { public struct Permissions: OptionSet { - + public let rawValue: UInt32 public init(rawValue: UInt32) { @@ -66,7 +66,11 @@ public struct SevenZipEntryInfo { public let accessTime: Date? public let creationTime: Date? public let modificationTime: Date? - public let attributes: UInt32? + public let winAttributes: UInt32? + + public let permissions: Permissions? + public let dosAttributes: DosAttributes? + public let unixType: UnixType? public let hasStream: Bool public let isEmpty: Bool @@ -80,7 +84,7 @@ public struct SevenZipEntryInfo { self.isAnti = file.isAntiFile self.name = file.name - self.isDirectory = file.isEmptyStream && !file.isEmptyFile + self.isDirectory = file.isEmptyStream && !file.isEmptyFile // TODO: Do we need this??? if let aTime = SevenZipEntryInfo.ntfsTimeToDate(file.aTime) { self.accessTime = aTime @@ -100,7 +104,17 @@ public struct SevenZipEntryInfo { self.modificationTime = nil } - self.attributes = file.winAttributes + if let attributes = file.winAttributes { + self.winAttributes = attributes + self.permissions = Permissions(rawValue: (0x0FFF0000 & attributes) >> 16) + self.unixType = UnixType(rawValue: (0xF0000000 & attributes) >> 16) + self.dosAttributes = DosAttributes(rawValue: 0xFF & attributes) + } else { + self.winAttributes = nil + self.permissions = nil + self.unixType = nil + self.dosAttributes = nil + } self.crc = crc self.size = size From e79924bf8430f992578e7ccaf28e3ffd6af51680 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 2 Aug 2017 17:34:09 +0300 Subject: [PATCH 061/113] Populate entryAttributes for 7z entry; set linkPath, too --- Sources/7zEntry.swift | 50 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/Sources/7zEntry.swift b/Sources/7zEntry.swift index 24546a24..f921170a 100644 --- a/Sources/7zEntry.swift +++ b/Sources/7zEntry.swift @@ -21,6 +21,9 @@ public class SevenZipEntry: ContainerEntry { return info.isDirectory } + public let isLink: Bool + public let linkPath: String? + public var entryAttributes: [FileAttributeKey: Any] public let dataIsAvailable: Bool @@ -46,10 +49,53 @@ public class SevenZipEntry: ContainerEntry { attributesDict[FileAttributeKey.size] = size } - if entryInfo.isDirectory { + if let permissions = entryInfo.permissions { + attributesDict[FileAttributeKey.posixPermissions] = permissions.rawValue + } + + if let unixType = entryInfo.unixType { + switch unixType { + case .characterSpecial: + attributesDict[FileAttributeKey.type] = FileAttributeType.typeCharacterSpecial + case .directory: + attributesDict[FileAttributeKey.type] = FileAttributeType.typeDirectory + case .blockSpecial: + attributesDict[FileAttributeKey.type] = FileAttributeType.typeBlockSpecial + case .regular: + attributesDict[FileAttributeKey.type] = FileAttributeType.typeRegular + case .symbolicLink: + attributesDict[FileAttributeKey.type] = FileAttributeType.typeSymbolicLink + case .socket: + attributesDict[FileAttributeKey.type] = FileAttributeType.typeSocket + default: + attributesDict[FileAttributeKey.type] = FileAttributeType.typeUnknown + } + } + + if let dosAttrbutes = entryInfo.dosAttributes { + if dosAttrbutes.contains(.readOnly) { + attributesDict[FileAttributeKey.appendOnly] = true + } + + if dosAttrbutes.contains(.directory) && attributesDict[FileAttributeKey.type] == nil { + attributesDict[FileAttributeKey.type] = FileAttributeType.typeDirectory + } + } + + if entryInfo.isDirectory && attributesDict[FileAttributeKey.type] == nil { attributesDict[FileAttributeKey.type] = FileAttributeType.typeDirectory + } + + if attributesDict[FileAttributeKey.type] as? FileAttributeType == FileAttributeType.typeSymbolicLink { + self.isLink = true + if let data = data { + self.linkPath = String(data: data, encoding: .utf8) + } else { + self.linkPath = nil + } } else { - attributesDict[FileAttributeKey.type] = FileAttributeType.typeRegular + self.isLink = false + self.linkPath = nil } self.entryAttributes = attributesDict From f76a7c677ab24d3469571ac89aee282b5508ed79 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Thu, 3 Aug 2017 00:32:32 +0300 Subject: [PATCH 062/113] Add support for several 7z coders --- Sources/7zCoder.swift | 15 +++++++++++++-- Sources/7zFolder.swift | 9 +++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Sources/7zCoder.swift b/Sources/7zCoder.swift index da735d17..8d7c293a 100644 --- a/Sources/7zCoder.swift +++ b/Sources/7zCoder.swift @@ -9,8 +9,19 @@ class SevenZipCoder { /// Possible coder IDs. struct ID { - static let lzma2: [UInt8] = [0x21] - static let lzma: [UInt8] = [0x03, 0x01, 0x01] + // TODO: Left comments column indicates whether coder has been implemented or not (I/NI) and tested (T/NT). + /* I/NT */static let copy: [UInt8] = [0x00] + /// Shouldn't be used, added for compatibility, `ID.copy` should be used instead. + /* I/NT */static let zipCopy: [UInt8] = [0x04, 0x01, 0x00] + /* I/NT */static let deflate: [UInt8] = [0x04, 0x01, 0x08] + /// Shouldn't be used, added for compatibility, `ID.bzip2` should be used instead. + /* I/NT */static let zipBzip2: [UInt8] = [0x04, 0x01, 0x0C] + /* NI/NT */static let zipLzma: [UInt8] = [0x04, 0x01, 0x0E] + /// For some reason, this method is specified in ZIP section of Methods.txt. + /* NI/NT */static let xz: [UInt8] = [0x04, 0x01, 0x5F] + /* I/NT */static let bzip2: [UInt8] = [0x04, 0x02, 0x02] + /* I/T */static let lzma2: [UInt8] = [0x21] + /* I/T */static let lzma: [UInt8] = [0x03, 0x01, 0x01] } let idSize: Int diff --git a/Sources/7zFolder.swift b/Sources/7zFolder.swift index 89db5b3a..c730acdd 100644 --- a/Sources/7zFolder.swift +++ b/Sources/7zFolder.swift @@ -137,8 +137,13 @@ class SevenZipFolder { let unpackSize = self.unpackSize(for: coder) - // TODO: Copy filter. - if coder.id == SevenZipCoder.ID.lzma2 { + if coder.id == SevenZipCoder.ID.copy || coder.id == SevenZipCoder.ID.zipCopy { + continue + } else if coder.id == SevenZipCoder.ID.deflate { + decodedData = try Deflate.decompress(data: decodedData) + } else if coder.id == SevenZipCoder.ID.bzip2 || coder.id == SevenZipCoder.ID.zipBzip2 { + decodedData = try BZip2.decompress(data: decodedData) + } else if coder.id == SevenZipCoder.ID.lzma2 { // Dictionary size is stored in coder's properties. guard let properties = coder.properties else { throw SevenZipError.wrongCoderProperties } From 3a4f66416ad23205b731d6896d502d7fcaaaa8c3 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Thu, 3 Aug 2017 22:45:40 +0300 Subject: [PATCH 063/113] Rename SevenZipTests file to 7zTests --- Tests/{SevenZipTests.swift => 7zTests.swift} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Tests/{SevenZipTests.swift => 7zTests.swift} (100%) diff --git a/Tests/SevenZipTests.swift b/Tests/7zTests.swift similarity index 100% rename from Tests/SevenZipTests.swift rename to Tests/7zTests.swift From 29f99d8f537927170a71f0497e512281c691bf89 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Thu, 3 Aug 2017 22:59:16 +0300 Subject: [PATCH 064/113] Add a lot of tests for containers' corner cases This includes containers created on Windows, as well as container with only empty file or directory and completely empty containers (which are somewhat hard to create for ZIP or TAR). Also typo in one 7z test is fixed. --- SWCompression.xcodeproj/project.pbxproj | 44 ++++++++- Tests/7zTests.swift | 113 ++++++++++++++---------- Tests/TarTests.swift | 66 ++++++++++++++ Tests/Test Files | 2 +- Tests/ZipTests.swift | 66 ++++++++++++++ 5 files changed, 241 insertions(+), 50 deletions(-) diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 86bdd3d4..d95fbedf 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -59,6 +59,15 @@ 061C065F1F0E90E600832F0C /* TarEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061C065B1F0E90E600832F0C /* TarEntry.swift */; }; 061FCE2D1DBCC6A30052F7BE /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061FCE2C1DBCC6A30052F7BE /* Constants.swift */; }; 0621E5181F0451C200C0003F /* test_multi.gz in Resources */ = {isa = PBXBuildFile; fileRef = 0621E5171F0451C200C0003F /* test_multi.gz */; }; + 0623135B1F33B41B0070A574 /* test_empty_cont.tar in Resources */ = {isa = PBXBuildFile; fileRef = 062313571F33B41B0070A574 /* test_empty_cont.tar */; }; + 0623135C1F33B41B0070A574 /* test_empty_dir.tar in Resources */ = {isa = PBXBuildFile; fileRef = 062313581F33B41B0070A574 /* test_empty_dir.tar */; }; + 0623135D1F33B41B0070A574 /* test_empty_file.tar in Resources */ = {isa = PBXBuildFile; fileRef = 062313591F33B41B0070A574 /* test_empty_file.tar */; }; + 0623135E1F33B41B0070A574 /* test_win.tar in Resources */ = {isa = PBXBuildFile; fileRef = 0623135A1F33B41B0070A574 /* test_win.tar */; }; + 062313631F33B4280070A574 /* test_empty_cont.zip in Resources */ = {isa = PBXBuildFile; fileRef = 0623135F1F33B4280070A574 /* test_empty_cont.zip */; }; + 062313641F33B4280070A574 /* test_empty_dir.zip in Resources */ = {isa = PBXBuildFile; fileRef = 062313601F33B4280070A574 /* test_empty_dir.zip */; }; + 062313651F33B4280070A574 /* test_empty_file.zip in Resources */ = {isa = PBXBuildFile; fileRef = 062313611F33B4280070A574 /* test_empty_file.zip */; }; + 062313661F33B4280070A574 /* test_win.zip in Resources */ = {isa = PBXBuildFile; fileRef = 062313621F33B4280070A574 /* test_win.zip */; }; + 062313681F33B4510070A574 /* test_win.7z in Resources */ = {isa = PBXBuildFile; fileRef = 062313671F33B4510070A574 /* test_win.7z */; }; 063336B71F06F0B6009EC0A3 /* test_multi_pad.xz in Resources */ = {isa = PBXBuildFile; fileRef = 063336B51F06F0B6009EC0A3 /* test_multi_pad.xz */; }; 063336B81F06F0B6009EC0A3 /* test_multi.xz in Resources */ = {isa = PBXBuildFile; fileRef = 063336B61F06F0B6009EC0A3 /* test_multi.xz */; }; 06393DF51F1A7F8E00A647A0 /* ZipCommon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06393DF41F1A7F8E00A647A0 /* ZipCommon.swift */; }; @@ -93,7 +102,7 @@ 064F722B1F1E638A00017297 /* 7zError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* 7zError.swift */; }; 064F722C1F1E638A00017297 /* 7zError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72281F1E638A00017297 /* 7zError.swift */; }; 064F722F1F1E63D800017297 /* test1.7z in Resources */ = {isa = PBXBuildFile; fileRef = 064F722E1F1E63D800017297 /* test1.7z */; }; - 064F72311F1E63E200017297 /* SevenZipTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72301F1E63E200017297 /* SevenZipTests.swift */; }; + 064F72311F1E63E200017297 /* 7zTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F72301F1E63E200017297 /* 7zTests.swift */; }; 065569681DC65C2A00A47E66 /* GzipArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063364E21DC52979007E313F /* GzipArchive.swift */; }; 065569691DC65C2A00A47E66 /* ZlibArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064492581DC606D400F10981 /* ZlibArchive.swift */; }; 0655696A1DC65C2A00A47E66 /* Deflate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061FCE251DBCC4BE0052F7BE /* Deflate.swift */; }; @@ -324,6 +333,15 @@ 061FCE251DBCC4BE0052F7BE /* Deflate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Deflate.swift; sourceTree = ""; }; 061FCE2C1DBCC6A30052F7BE /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; 0621E5171F0451C200C0003F /* test_multi.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = test_multi.gz; sourceTree = ""; }; + 062313571F33B41B0070A574 /* test_empty_cont.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = test_empty_cont.tar; sourceTree = ""; }; + 062313581F33B41B0070A574 /* test_empty_dir.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = test_empty_dir.tar; sourceTree = ""; }; + 062313591F33B41B0070A574 /* test_empty_file.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = test_empty_file.tar; sourceTree = ""; }; + 0623135A1F33B41B0070A574 /* test_win.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = test_win.tar; sourceTree = ""; }; + 0623135F1F33B4280070A574 /* test_empty_cont.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = test_empty_cont.zip; sourceTree = ""; }; + 062313601F33B4280070A574 /* test_empty_dir.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = test_empty_dir.zip; sourceTree = ""; }; + 062313611F33B4280070A574 /* test_empty_file.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = test_empty_file.zip; sourceTree = ""; }; + 062313621F33B4280070A574 /* test_win.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = test_win.zip; sourceTree = ""; }; + 062313671F33B4510070A574 /* test_win.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_win.7z; sourceTree = ""; }; 063336B51F06F0B6009EC0A3 /* test_multi_pad.xz */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_multi_pad.xz; sourceTree = ""; }; 063336B61F06F0B6009EC0A3 /* test_multi.xz */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_multi.xz; sourceTree = ""; }; 063364E21DC52979007E313F /* GzipArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GzipArchive.swift; sourceTree = ""; }; @@ -339,7 +357,7 @@ 064F72231F1E5D4400017297 /* 7zContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = 7zContainer.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 064F72281F1E638A00017297 /* 7zError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zError.swift; sourceTree = ""; }; 064F722E1F1E63D800017297 /* test1.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test1.7z; sourceTree = ""; }; - 064F72301F1E63E200017297 /* SevenZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SevenZipTests.swift; sourceTree = ""; }; + 064F72301F1E63E200017297 /* 7zTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zTests.swift; sourceTree = ""; }; 0655693F1DC659FF00A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0655694C1DC65A8000A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 065569591DC65A9400A47E66 /* SWCompression.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SWCompression.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -572,6 +590,7 @@ 064F722D1F1E63D800017297 /* 7z */ = { isa = PBXGroup; children = ( + 062313671F33B4510070A574 /* test_win.7z */, 06DD48A61F2D24EF00F45599 /* SWCompressionSourceCode.7z */, 0693DF501F2E499F00602300 /* test_empty_dir.7z */, 0693DF511F2E499F00602300 /* test_empty_file.7z */, @@ -586,6 +605,10 @@ 0691B93E1EBE3E100037EE58 /* TAR */ = { isa = PBXGroup; children = ( + 062313571F33B41B0070A574 /* test_empty_cont.tar */, + 062313581F33B41B0070A574 /* test_empty_dir.tar */, + 062313591F33B41B0070A574 /* test_empty_file.tar */, + 0623135A1F33B41B0070A574 /* test_win.tar */, 06393DF91F1A858000A647A0 /* Long names */, 06D345631F102E740057173F /* Formats */, 068B36781ED0AC050016269E /* full_test.tar */, @@ -679,6 +702,10 @@ 06BD0D1F1E3D0C630054AA5C /* ZIP */ = { isa = PBXGroup; children = ( + 0623135F1F33B4280070A574 /* test_empty_cont.zip */, + 062313601F33B4280070A574 /* test_empty_dir.zip */, + 062313611F33B4280070A574 /* test_empty_file.zip */, + 062313621F33B4280070A574 /* test_win.zip */, 0685E6231F123F0D008655AA /* test_zip_bzip2.zip */, 069EBC361F0837B7008D5EF3 /* test_zip_lzma.zip */, 069F276F1EDA0D5E00736269 /* TestUnicode.zip */, @@ -734,13 +761,13 @@ 06CC183D1DE35269003532F5 /* Test Files */, 069AC2111E02DDAF0041AC13 /* LzmaTests.swift */, 06E2347F1E069ABD00F18798 /* XzTests.swift */, - 064F72301F1E63E200017297 /* SevenZipTests.swift */, 0680E1B41DDA4075005C05EB /* Bzip2Tests.swift */, 06CC187E1DE35607003532F5 /* DeflateTests.swift */, 0680E1B21DDA3D0A005C05EB /* GzipTests.swift */, 0680E1B01DDA2D7C005C05EB /* ZlibTests.swift */, 0675183C1E2A883600D16354 /* ZipTests.swift */, 0696E5C51ED0B22F00921D4D /* TarTests.swift */, + 064F72301F1E63E200017297 /* 7zTests.swift */, 061FCE2C1DBCC6A30052F7BE /* Constants.swift */, 06BE1AD81DB410F100EE0F59 /* Info.plist */, ); @@ -1052,8 +1079,11 @@ 069DCE9D1EB64D0300ADC374 /* test2.answer in Resources */, 06393DFD1F1A858000A647A0 /* long_test_gnu.tar in Resources */, 06D07AB01EB64EE800BC8C65 /* test5.xz in Resources */, + 0623135D1F33B41B0070A574 /* test_empty_file.tar in Resources */, 06BD0D241E3D0C630054AA5C /* TestDataDescriptor.zip in Resources */, 0691B9401EBE3E100037EE58 /* test.tar in Resources */, + 062313681F33B4510070A574 /* test_win.7z in Resources */, + 062313661F33B4280070A574 /* test_win.zip in Resources */, 0693DF531F2E499F00602300 /* test_empty_file.7z in Resources */, 06D07A9E1EB64E7A00BC8C65 /* test6.bz2 in Resources */, 06D07A9C1EB64E7A00BC8C65 /* test4.bz2 in Resources */, @@ -1076,20 +1106,25 @@ 06D07AAF1EB64EE800BC8C65 /* test4.xz in Resources */, 063336B81F06F0B6009EC0A3 /* test_multi.xz in Resources */, 06D3456D1F102E740057173F /* test_v7.tar in Resources */, + 062313651F33B4280070A574 /* test_empty_file.zip in Resources */, 06D07AAC1EB64EE800BC8C65 /* test1.xz in Resources */, 06D345691F102E740057173F /* test_gnu.tar in Resources */, 061358FC1F274E080065BCEB /* test3.7z in Resources */, 06BD0D231E3D0C630054AA5C /* SWCompressionSourceCode.zip in Resources */, 06D07AB11EB64EE800BC8C65 /* test6.xz in Resources */, 0693DF521F2E499F00602300 /* test_empty_dir.7z in Resources */, + 0623135C1F33B41B0070A574 /* test_empty_dir.tar in Resources */, 061358FB1F274E080065BCEB /* test2.7z in Resources */, 06B374CB1E0EECD500064853 /* random_file.zlib in Resources */, 06393DFE1F1A858000A647A0 /* long_test_oldgnu.tar in Resources */, + 0623135E1F33B41B0070A574 /* test_win.tar in Resources */, 069DCEA41EB64D0300ADC374 /* test9.answer in Resources */, + 062313631F33B4280070A574 /* test_empty_cont.zip in Resources */, 06D07AAD1EB64EE800BC8C65 /* test2.xz in Resources */, 0621E5181F0451C200C0003F /* test_multi.gz in Resources */, 069DCE9F1EB64D0300ADC374 /* test4.answer in Resources */, 064F722F1F1E63D800017297 /* test1.7z in Resources */, + 0623135B1F33B41B0070A574 /* test_empty_cont.tar in Resources */, 069DCEA21EB64D0300ADC374 /* test7.answer in Resources */, 06D3456B1F102E740057173F /* test_pax.tar in Resources */, 06D07AB21EB64EE800BC8C65 /* test7.xz in Resources */, @@ -1097,6 +1132,7 @@ 06D07A9F1EB64E7A00BC8C65 /* test7.bz2 in Resources */, 063336B71F06F0B6009EC0A3 /* test_multi_pad.xz in Resources */, 06991C711E05A9F70030FF07 /* test10.lzma in Resources */, + 062313641F33B4280070A574 /* test_empty_dir.zip in Resources */, 069DCEA01EB64D0300ADC374 /* test5.answer in Resources */, 069DCE8A1EB64B1500ADC374 /* test2.gz in Resources */, 069DCE901EB64B1500ADC374 /* test8.gz in Resources */, @@ -1359,7 +1395,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 064F72311F1E63E200017297 /* SevenZipTests.swift in Sources */, + 064F72311F1E63E200017297 /* 7zTests.swift in Sources */, 0680E1B51DDA4076005C05EB /* Bzip2Tests.swift in Sources */, 06CC187F1DE35607003532F5 /* DeflateTests.swift in Sources */, 061FCE2D1DBCC6A30052F7BE /* Constants.swift in Sources */, diff --git a/Tests/7zTests.swift b/Tests/7zTests.swift index 214780f6..d8ef6d96 100644 --- a/Tests/7zTests.swift +++ b/Tests/7zTests.swift @@ -10,50 +10,6 @@ class SevenZipTests: XCTestCase { static let testType: String = "7z" - func testEmptyFile() throws { - guard let testURL = Constants.url(forTest: "test_empty_file", withType: SevenZipTests.testType) else { - XCTFail("Unable to get test's URL.") - return - } - - let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) - let entries = try SevenZipContainer.open(container: testData) - - XCTAssertEqual(entries.count, 1) - XCTAssertEqual(entries[0].name, "empty_file") - XCTAssertEqual(entries[0].isDirectory, false) - XCTAssertEqual(entries[0].size, 0) - XCTAssertEqual(try entries[0].data(), Data()) - } - - func testEmptyDirectory() throws { - guard let testURL = Constants.url(forTest: "test_empty_dir", withType: SevenZipTests.testType) else { - XCTFail("Unable to get test's URL.") - return - } - - let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) - let entries = try SevenZipContainer.open(container: testData) - - XCTAssertEqual(entries.count, 1) - XCTAssertEqual(entries[0].name, "empty_dir") - XCTAssertEqual(entries[0].isDirectory, true) - XCTAssertEqual(entries[0].size, 0) - XCTAssertEqual(try entries[0].data(), Data()) - } - - func testEmptyContainer() throws { - guard let testURL = Constants.url(forTest: "test_empty_cont", withType: SevenZipTests.testType) else { - XCTFail("Unable to get test's URL.") - return - } - - let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) - let entries = try SevenZipContainer.open(container: testData) - - XCTAssertEqual(entries.isEmpty, true) - } - func test1() throws { guard let testURL = Constants.url(forTest: "test1", withType: SevenZipTests.testType) else { XCTFail("Unable to get test's URL.") @@ -108,7 +64,7 @@ class SevenZipTests: XCTestCase { answerData = try Data(contentsOf: answer4URL, options: .mappedIfSafe) XCTAssertEqual(entries[1].name, "test4.answer") - XCTAssertEqual(entries[0].isDirectory, false) + XCTAssertEqual(entries[1].isDirectory, false) XCTAssertEqual(entries[1].size, answerData.count) XCTAssertEqual(try entries[1].data(), answerData) } @@ -143,4 +99,71 @@ class SevenZipTests: XCTestCase { #endif } + func testWinContainer() throws { + guard let testURL = Constants.url(forTest: "test_win", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 2) + + XCTAssertEqual(entries[0].name, "dir") + XCTAssertEqual(entries[0].isDirectory, true) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + + XCTAssertEqual(entries[1].name, "text_win.txt") + XCTAssertEqual(entries[1].isDirectory, false) + XCTAssertEqual(entries[1].size, 15) + XCTAssertEqual(try entries[1].data(), "Hello, Windows!".data(using: .utf8)) + } + + func testEmptyFile() throws { + guard let testURL = Constants.url(forTest: "test_empty_file", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "empty_file") + XCTAssertEqual(entries[0].isDirectory, false) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + } + + func testEmptyDirectory() throws { + guard let testURL = Constants.url(forTest: "test_empty_dir", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "empty_dir") + XCTAssertEqual(entries[0].isDirectory, true) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + } + + func testEmptyContainer() throws { + guard let testURL = Constants.url(forTest: "test_empty_cont", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.isEmpty, true) + } + + } diff --git a/Tests/TarTests.swift b/Tests/TarTests.swift index 467b217d..fb351698 100644 --- a/Tests/TarTests.swift +++ b/Tests/TarTests.swift @@ -99,4 +99,70 @@ class TarTests: XCTestCase { } } + func testWinContainer() throws { + guard let testURL = Constants.url(forTest: "test_win", withType: TarTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try TarContainer.open(container: testData) + + XCTAssertEqual(entries.count, 2) + + XCTAssertEqual(entries[0].name, "dir/") + XCTAssertEqual(entries[0].isDirectory, true) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + + XCTAssertEqual(entries[1].name, "text_win.txt") + XCTAssertEqual(entries[1].isDirectory, false) + XCTAssertEqual(entries[1].size, 15) + XCTAssertEqual(try entries[1].data(), "Hello, Windows!".data(using: .utf8)) + } + + func testEmptyFile() throws { + guard let testURL = Constants.url(forTest: "test_empty_file", withType: TarTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try TarContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "empty_file") + XCTAssertEqual(entries[0].isDirectory, false) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + } + + func testEmptyDirectory() throws { + guard let testURL = Constants.url(forTest: "test_empty_dir", withType: TarTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try TarContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "empty_dir/") + XCTAssertEqual(entries[0].isDirectory, true) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + } + + func testEmptyContainer() throws { + guard let testURL = Constants.url(forTest: "test_empty_cont", withType: TarTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try TarContainer.open(container: testData) + + XCTAssertEqual(entries.isEmpty, true) + } + } diff --git a/Tests/Test Files b/Tests/Test Files index b646ac6e..16c089b1 160000 --- a/Tests/Test Files +++ b/Tests/Test Files @@ -1 +1 @@ -Subproject commit b646ac6ef7d69756792cd463615ce9300be73dee +Subproject commit 16c089b1a5fde3a31912f20292783044ae07ba8e diff --git a/Tests/ZipTests.swift b/Tests/ZipTests.swift index 64eef628..716bc550 100644 --- a/Tests/ZipTests.swift +++ b/Tests/ZipTests.swift @@ -123,4 +123,70 @@ class ZipTests: XCTestCase { XCTAssertEqual(try entries[0].data(), answerData) } + func testWinContainer() throws { + guard let testURL = Constants.url(forTest: "test_win", withType: ZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 2) + + XCTAssertEqual(entries[0].name, "dir/") + XCTAssertEqual(entries[0].isDirectory, true) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + + XCTAssertEqual(entries[1].name, "text_win.txt") + XCTAssertEqual(entries[1].isDirectory, false) + XCTAssertEqual(entries[1].size, 15) + XCTAssertEqual(try entries[1].data(), "Hello, Windows!".data(using: .utf8)) + } + + func testEmptyFile() throws { + guard let testURL = Constants.url(forTest: "test_empty_file", withType: ZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "empty_file") + XCTAssertEqual(entries[0].isDirectory, false) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + } + + func testEmptyDirectory() throws { + guard let testURL = Constants.url(forTest: "test_empty_dir", withType: ZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "empty_dir/") + XCTAssertEqual(entries[0].isDirectory, true) + XCTAssertEqual(entries[0].size, 0) + XCTAssertEqual(try entries[0].data(), Data()) + } + + func testEmptyContainer() throws { + guard let testURL = Constants.url(forTest: "test_empty_cont", withType: ZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) + + XCTAssertEqual(entries.isEmpty, true) + } + } From 5db356f8d08184f43e578759602862e02f2e37b1 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Thu, 3 Aug 2017 23:00:03 +0300 Subject: [PATCH 065/113] Remove extra commands in travis configuration --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2cc7563f..fdce214e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,10 +10,9 @@ matrix: xcode_project: SWCompression.xcodeproj xcode_scheme: SWCompression before_install: - - rvm use $RVM_RUBY_VERSION - gem install slather - brew update - - brew outdated carthage || brew upgrade carthage + - brew upgrade carthage - brew install git-lfs - git lfs install before_script: From ffb1c78434a4709a744e37f0225ed769fe5c76d2 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 5 Aug 2017 15:11:22 +0300 Subject: [PATCH 066/113] Fix incorrect read of end byte in 7z substream --- Sources/7zSubstreamInfo.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/7zSubstreamInfo.swift b/Sources/7zSubstreamInfo.swift index d31557c9..2dd7a5ce 100644 --- a/Sources/7zSubstreamInfo.swift +++ b/Sources/7zSubstreamInfo.swift @@ -72,9 +72,9 @@ class SevenZipSubstreamInfo { digests.append(missingCrcs[i]) } } - - type = bitReader.byte() } + + type = bitReader.byte() } if type != 0x00 { From c341a9263c52ea480d1e1d3aaead78213ed39afb Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 6 Aug 2017 17:43:23 +0300 Subject: [PATCH 067/113] Fix incorrect reading of substreams' crcs --- Sources/7zSubstreamInfo.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Sources/7zSubstreamInfo.swift b/Sources/7zSubstreamInfo.swift index 2dd7a5ce..07c4180c 100644 --- a/Sources/7zSubstreamInfo.swift +++ b/Sources/7zSubstreamInfo.swift @@ -64,12 +64,14 @@ class SevenZipSubstreamInfo { } } + var nextMissingCrc = 0 for folder in coderInfo.folders { if folder.numUnpackSubstreams == 1 && folder.crc != nil { digests.append(folder.crc) } else { - for i in 0.. Date: Sun, 6 Aug 2017 17:44:24 +0300 Subject: [PATCH 068/113] Fix problems with reading entries' data caused by incorrect interpretation of packedStreams property of 7zFolder --- Sources/7zContainer.swift | 45 +++++++++++++-------------------------- Sources/7zFolder.swift | 7 +++--- 2 files changed, 18 insertions(+), 34 deletions(-) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index 125197fd..972422ae 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -17,6 +17,7 @@ public class SevenZipContainer: Container { guard let files = header.fileInfo?.files else { return [] } + /// Total count of non-empty files. Used to iterate over SubstreamInfo. var nonEmptyFileIndex = 0 /// Index of currently opened folder in `streamInfo.coderInfo.folders`. @@ -28,9 +29,6 @@ public class SevenZipContainer: Container { /// Index of currently read stream. var streamIndex = -1 - /// Index of current stream for folder in `folder.packedStreams`. - var folderStreamIndex = -1 - /// Total size of unpacked data for current folder. Used for consistency check. var folderUnpackSize = 0 @@ -74,36 +72,24 @@ public class SevenZipContainer: Container { guard folderIndex < streamInfo.coderInfo.numFolders else { throw SevenZipError.notEnoughFolders } + // Check, if we haven't read to much from a stream. // TODO: Is it even possible? + guard rawUnpackSize <= rawFileData.size + else { throw SevenZipError.streamOverread } + /// Folder, which contains current file. let folder = streamInfo.coderInfo.folders[folderIndex] // There may be several streams corresponding to a single folder, // so we have to iterate over them, if necessary. - // Moreover, one stream can contain data of several files, - // so we need to decode the stream first, then split it into files. - var streamChanged = false - if folderStreamIndex == -1 { - // We need to open (start) new folder. - folderStreamIndex += 1 - streamIndex = folder.packedStreams[folderStreamIndex] - streamChanged = true - } else if rawUnpackSize >= rawFileData.size { - // We already have opened folder, but we need to go to the next stream. - guard rawUnpackSize == rawFileData.size - else { throw SevenZipError.streamOverread } - folderStreamIndex += 1 - guard folderStreamIndex < folder.numPackedStreams - else { throw SevenZipError.notEnoughStreams } - streamIndex = folder.packedStreams[folderStreamIndex] - streamChanged = true - } + // If we switched folders or completed reading of a stream we need to move to the next stream. + if fileInFolderCount == 0 || rawUnpackSize == rawFileData.size { + streamIndex += 1 - if streamChanged { // We need to load the new stream if we switched streams. // First, we move to the stream's offset. // We don't have any guarantees that streams will be enountered in the same order, - // as they are placed in the container. + // as they are placed in the container. // Thus, we have to start moving to stream's offset from the beginning. - // (Maybe, this is incorrect and the order of streams is guaranteed). + // (Or, maybe, this is incorrect and the order of streams is guaranteed). pointerData.index = signatureHeaderSize + packInfo.packPosition // Pack offset. if streamIndex != 0 { for i in 0.. folder.numUnpackSubstreams { // If we read all files in folder... + if fileInFolderCount >= folder.numUnpackSubstreams { // If we read all files in folder... // We need to check folder's unpacked size as well as its CRC32 (if it is available). guard folderUnpackSize == folder.unpackSize() else { throw SevenZipError.wrongDataSize } @@ -171,8 +158,6 @@ public class SevenZipContainer: Container { fileInFolderCount = 0 // Moving to the next folder. folderIndex += 1 - // Next folder will have its own stream. - folderStreamIndex = -1 } } else { info = SevenZipEntryInfo(file) diff --git a/Sources/7zFolder.swift b/Sources/7zFolder.swift index c730acdd..5a306269 100644 --- a/Sources/7zFolder.swift +++ b/Sources/7zFolder.swift @@ -59,7 +59,6 @@ class SevenZipFolder { guard totalInputStreams >= numBindPairs else { throw SevenZipError.wrongStreamsNumber } numPackedStreams = totalInputStreams - numBindPairs - packedStreams = Array(repeating: 0, count: numPackedStreams) if numPackedStreams == 1 { var i = 0 while i < totalInputStreams { @@ -71,10 +70,10 @@ class SevenZipFolder { if i == totalInputStreams { throw SevenZipError.wrongStreamsNumber } - packedStreams[0] = i + packedStreams.append(i) } else { - for i in 0.. Date: Sun, 6 Aug 2017 18:08:14 +0300 Subject: [PATCH 069/113] Add tests for several 7z format features --- SWCompression.xcodeproj/project.pbxproj | 30 ++++- Tests/7zTests.swift | 139 ++++++++++++++++++++++++ Tests/Test Files | 2 +- 3 files changed, 167 insertions(+), 4 deletions(-) diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index d95fbedf..8c9550b3 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -124,6 +124,12 @@ 065D0ADD1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; 065D0ADE1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; 065D0ADF1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; + 066348CD1F35E32200F3DC7D /* test_anti_file.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348CC1F35E32200F3DC7D /* test_anti_file.7z */; }; + 066348CF1F35E54700F3DC7D /* test_multi_blocks.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348CE1F35E54700F3DC7D /* test_multi_blocks.7z */; }; + 066348D41F35E7F500F3DC7D /* test_all_timestamps.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D01F35E7F500F3DC7D /* test_all_timestamps.7z */; }; + 066348D51F35E7F500F3DC7D /* test_complicated_coding_scheme.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D11F35E7F500F3DC7D /* test_complicated_coding_scheme.7z */; }; + 066348D61F35E7F500F3DC7D /* test_encrypted_header.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D21F35E7F500F3DC7D /* test_encrypted_header.7z */; }; + 066348D71F35E7F500F3DC7D /* test_single_thread.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D31F35E7F500F3DC7D /* test_single_thread.7z */; }; 067518361E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518371E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518381E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; @@ -364,6 +370,12 @@ 06595E0D1F1E8252006501C2 /* 7zFolder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFolder.swift; sourceTree = ""; }; 06595E121F1E90C2006501C2 /* 7zCoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = 7zCoder.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zEntryInfo.swift; sourceTree = ""; }; + 066348CC1F35E32200F3DC7D /* test_anti_file.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_anti_file.7z; sourceTree = ""; }; + 066348CE1F35E54700F3DC7D /* test_multi_blocks.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_multi_blocks.7z; sourceTree = ""; }; + 066348D01F35E7F500F3DC7D /* test_all_timestamps.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_all_timestamps.7z; sourceTree = ""; }; + 066348D11F35E7F500F3DC7D /* test_complicated_coding_scheme.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_complicated_coding_scheme.7z; sourceTree = ""; }; + 066348D21F35E7F500F3DC7D /* test_encrypted_header.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_encrypted_header.7z; sourceTree = ""; }; + 066348D31F35E7F500F3DC7D /* test_single_thread.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_single_thread.7z; sourceTree = ""; }; 067518351E2A86F700D16354 /* ZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipContainer.swift; sourceTree = ""; }; 0675183C1E2A883600D16354 /* ZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipTests.swift; sourceTree = ""; }; 0680E1B01DDA2D7C005C05EB /* ZlibTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibTests.swift; sourceTree = ""; }; @@ -590,6 +602,12 @@ 064F722D1F1E63D800017297 /* 7z */ = { isa = PBXGroup; children = ( + 066348CC1F35E32200F3DC7D /* test_anti_file.7z */, + 066348CE1F35E54700F3DC7D /* test_multi_blocks.7z */, + 066348D01F35E7F500F3DC7D /* test_all_timestamps.7z */, + 066348D11F35E7F500F3DC7D /* test_complicated_coding_scheme.7z */, + 066348D21F35E7F500F3DC7D /* test_encrypted_header.7z */, + 066348D31F35E7F500F3DC7D /* test_single_thread.7z */, 062313671F33B4510070A574 /* test_win.7z */, 06DD48A61F2D24EF00F45599 /* SWCompressionSourceCode.7z */, 0693DF501F2E499F00602300 /* test_empty_dir.7z */, @@ -777,14 +795,14 @@ 06CC183D1DE35269003532F5 /* Test Files */ = { isa = PBXGroup; children = ( - 064F722D1F1E63D800017297 /* 7z */, - 06D07AA21EB64EE800BC8C65 /* XZ */, - 06D07A8F1EB64E7A00BC8C65 /* BZip2 */, 069DCE921EB64D0300ADC374 /* Answers */, + 06D07A8F1EB64E7A00BC8C65 /* BZip2 */, 069DCE7F1EB64B1500ADC374 /* GZip */, 069AC2161E02DE490041AC13 /* LZMA */, + 06D07AA21EB64EE800BC8C65 /* XZ */, 06BD0D1F1E3D0C630054AA5C /* ZIP */, 0691B93E1EBE3E100037EE58 /* TAR */, + 064F722D1F1E63D800017297 /* 7z */, 06CC185F1DE35269003532F5 /* test.zlib */, 06B374CA1E0EECD500064853 /* random_file.zlib */, ); @@ -1095,20 +1113,26 @@ 06D3456A1F102E740057173F /* test_oldgnu.tar in Resources */, 06BD0D251E3D0C630054AA5C /* TestZip64.zip in Resources */, 06DD48A71F2D24EF00F45599 /* SWCompressionSourceCode.7z in Resources */, + 066348D41F35E7F500F3DC7D /* test_all_timestamps.7z in Resources */, + 066348CF1F35E54700F3DC7D /* test_multi_blocks.7z in Resources */, 06393DFF1F1A858000A647A0 /* long_test_pax.tar in Resources */, 069DCE8D1EB64B1500ADC374 /* test5.gz in Resources */, 069DCE911EB64B1500ADC374 /* test9.gz in Resources */, 06D07AA11EB64E7A00BC8C65 /* test9.bz2 in Resources */, 0685E6241F123F0D008655AA /* test_zip_bzip2.zip in Resources */, + 066348D61F35E7F500F3DC7D /* test_encrypted_header.7z in Resources */, 06D07AB31EB64EE800BC8C65 /* test8.xz in Resources */, + 066348D51F35E7F500F3DC7D /* test_complicated_coding_scheme.7z in Resources */, 069DCEA11EB64D0300ADC374 /* test6.answer in Resources */, 06D3456C1F102E740057173F /* test_ustar.tar in Resources */, 06D07AAF1EB64EE800BC8C65 /* test4.xz in Resources */, + 066348CD1F35E32200F3DC7D /* test_anti_file.7z in Resources */, 063336B81F06F0B6009EC0A3 /* test_multi.xz in Resources */, 06D3456D1F102E740057173F /* test_v7.tar in Resources */, 062313651F33B4280070A574 /* test_empty_file.zip in Resources */, 06D07AAC1EB64EE800BC8C65 /* test1.xz in Resources */, 06D345691F102E740057173F /* test_gnu.tar in Resources */, + 066348D71F35E7F500F3DC7D /* test_single_thread.7z in Resources */, 061358FC1F274E080065BCEB /* test3.7z in Resources */, 06BD0D231E3D0C630054AA5C /* SWCompressionSourceCode.zip in Resources */, 06D07AB11EB64EE800BC8C65 /* test6.xz in Resources */, diff --git a/Tests/7zTests.swift b/Tests/7zTests.swift index d8ef6d96..a012b796 100644 --- a/Tests/7zTests.swift +++ b/Tests/7zTests.swift @@ -84,6 +84,145 @@ class SevenZipTests: XCTestCase { #endif } + func testAntiFile() throws { + guard let testURL = Constants.url(forTest: "test_anti_file", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + + #if LONG_TESTS + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 6) + + for entry in entries where entry.name == "test_create/test4.answer" { + XCTAssertEqual((entry as? SevenZipEntry)?.info.isAnti, true) + } + #else + let entries = try SevenZipContainer.info(container: testData) + + XCTAssertEqual(entries.count, 6) + + for entry in entries where entry.name == "test_create/test4.answer" { + XCTAssertEqual((entry as? SevenZipEntryInfo)?.isAnti, true) + } + #endif + } + + func testMultiBlocks() throws { + // Container was created with "solid" options set to "off" (-ms=off). + guard let testURL = Constants.url(forTest: "test_multi_blocks", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + + #if LONG_TESTS + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 6) + #else + let entries = try SevenZipContainer.info(container: testData) + + XCTAssertEqual(entries.count, 6) + #endif + } + + func testAllTimestamps() throws { + // Container was created with "-mtc=on" and "-mta=on" options. + guard let testURL = Constants.url(forTest: "test_all_timestamps", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + + #if LONG_TESTS + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 6) + + for entry in entries { + XCTAssertNotNil((entry as? SevenZipEntry)?.info.creationTime) + XCTAssertNotNil((entry as? SevenZipEntry)?.info.accessTime) + // Just in case... + XCTAssertNotNil((entry as? SevenZipEntry)?.info.modificationTime) + } + #else + let entries = try SevenZipContainer.info(container: testData) + + XCTAssertEqual(entries.count, 6) + + for entry in entries { + XCTAssertNotNil((entry as? SevenZipEntryInfo)?.creationTime) + XCTAssertNotNil((entry as? SevenZipEntryInfo)?.accessTime) + // Just in case... + XCTAssertNotNil((entry as? SevenZipEntryInfo)?.modificationTime) + } + #endif + } + + func testComplicatedCodingScheme() throws { + // Container was created with these options: "-mf=BCJ -m0=Copy -m1=Deflate -m2=Delta -m3=LZMA -m4=LZMA2" + guard let testURL = Constants.url(forTest: "test_complicated_coding_scheme", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + + // In these test case the most important thing is that information about entries must be read correctly. + _ = try SevenZipContainer.info(container: testData) + + // It is expected for `open(container:) function to throw `SevenZipError.compressionNotSupported`, + // because of the coders used. + #if LONG_TESTS + XCTAssertThrowsError(try SevenZipContainer.open(container: testData)) { error in + XCTAssertEqual(error as? SevenZipError, SevenZipError.compressionNotSupported) + } + #endif + } + + func testEncryptedHeader() throws { + // Container was created with "-mhe=on". + guard let testURL = Constants.url(forTest: "test_encrypted_header", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + + XCTAssertThrowsError(try SevenZipContainer.info(container: testData)) { error in + XCTAssertEqual(error as? SevenZipError, SevenZipError.encryptionNotSupported) + } + + // There is no point in testing `open(container:)` function, because we are unable to get even files' info. + } + + func testSingleThread() throws { + // Container was created with disabled multithreading options. + // We check this just in case. + guard let testURL = Constants.url(forTest: "test_single_thread", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + + #if LONG_TESTS + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 6) + #else + let entries = try SevenZipContainer.info(container: testData) + + XCTAssertEqual(entries.count, 6) + #endif + } + func testBigContainer() throws { guard let testURL = Constants.url(forTest: "SWCompressionSourceCode", withType: SevenZipTests.testType) else { XCTFail("Unable to get test's URL.") diff --git a/Tests/Test Files b/Tests/Test Files index 16c089b1..9c9e0d95 160000 --- a/Tests/Test Files +++ b/Tests/Test Files @@ -1 +1 @@ -Subproject commit 16c089b1a5fde3a31912f20292783044ae07ba8e +Subproject commit 9c9e0d957a0e031ed38eeb251ff0fe2a33908cc6 From b8eb63b834eb45559fc919d9fa061fc5e1c5bede Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 6 Aug 2017 18:17:43 +0300 Subject: [PATCH 070/113] Minor code improvements. --- Sources/7zFileInfo.swift | 5 ++++- Tests/7zTests.swift | 13 ++++++------- Tests/TarTests.swift | 2 +- Tests/ZipTests.swift | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index 1a920472..2748a0c8 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -60,7 +60,10 @@ class SevenZipFileInfo { let names = bitReader.bytes(count: propertySize - 1) var nextFile = 0 var nextName = 0 - for i in stride(from: 0, to: names.count, by: 2) { // TODO: Understand what is going on here. + for i in stride(from: 0, to: names.count, by: 2) { + // End of file name is identified by two consequent NULL bytes. + // TODO: In Swift 4.0 we may try to convert dat to UTF16LE first, + // and then split it into strings? if names[i] == 0 && names[i + 1] == 0 { files[nextFile].name = String(data: Data(bytes: names[nextName.. Date: Sun, 6 Aug 2017 18:23:00 +0300 Subject: [PATCH 071/113] Update swift version in .swift-version for linux builds --- .swift-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.swift-version b/.swift-version index 8c50098d..94ff29cc 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -3.1 +3.1.1 From 59a0896fa59ea49f4e99878cbc83d05c8e2bcf12 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Thu, 10 Aug 2017 16:48:36 +0300 Subject: [PATCH 072/113] Add tests for different 7z compression methods --- SWCompression.xcodeproj/project.pbxproj | 12 +++++ Sources/7zCoder.swift | 10 ++-- Tests/7zTests.swift | 72 +++++++++++++++++++++++++ Tests/Test Files | 2 +- 4 files changed, 90 insertions(+), 6 deletions(-) diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 8c9550b3..784d0e02 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -124,6 +124,9 @@ 065D0ADD1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; 065D0ADE1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; 065D0ADF1F2B9D9100CE2DA8 /* 7zEntryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */; }; + 0660C1321F3B3E6B002D42E4 /* test_7z_bzip2.7z in Resources */ = {isa = PBXBuildFile; fileRef = 0660C12F1F3B3E6B002D42E4 /* test_7z_bzip2.7z */; }; + 0660C1331F3B3E6B002D42E4 /* test_7z_copy.7z in Resources */ = {isa = PBXBuildFile; fileRef = 0660C1301F3B3E6B002D42E4 /* test_7z_copy.7z */; }; + 0660C1341F3B3E6B002D42E4 /* test_7z_deflate.7z in Resources */ = {isa = PBXBuildFile; fileRef = 0660C1311F3B3E6B002D42E4 /* test_7z_deflate.7z */; }; 066348CD1F35E32200F3DC7D /* test_anti_file.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348CC1F35E32200F3DC7D /* test_anti_file.7z */; }; 066348CF1F35E54700F3DC7D /* test_multi_blocks.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348CE1F35E54700F3DC7D /* test_multi_blocks.7z */; }; 066348D41F35E7F500F3DC7D /* test_all_timestamps.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D01F35E7F500F3DC7D /* test_all_timestamps.7z */; }; @@ -370,6 +373,9 @@ 06595E0D1F1E8252006501C2 /* 7zFolder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zFolder.swift; sourceTree = ""; }; 06595E121F1E90C2006501C2 /* 7zCoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = 7zCoder.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 065D0ADB1F2B9D9100CE2DA8 /* 7zEntryInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 7zEntryInfo.swift; sourceTree = ""; }; + 0660C12F1F3B3E6B002D42E4 /* test_7z_bzip2.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_7z_bzip2.7z; sourceTree = ""; }; + 0660C1301F3B3E6B002D42E4 /* test_7z_copy.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_7z_copy.7z; sourceTree = ""; }; + 0660C1311F3B3E6B002D42E4 /* test_7z_deflate.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_7z_deflate.7z; sourceTree = ""; }; 066348CC1F35E32200F3DC7D /* test_anti_file.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_anti_file.7z; sourceTree = ""; }; 066348CE1F35E54700F3DC7D /* test_multi_blocks.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_multi_blocks.7z; sourceTree = ""; }; 066348D01F35E7F500F3DC7D /* test_all_timestamps.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_all_timestamps.7z; sourceTree = ""; }; @@ -602,6 +608,9 @@ 064F722D1F1E63D800017297 /* 7z */ = { isa = PBXGroup; children = ( + 0660C12F1F3B3E6B002D42E4 /* test_7z_bzip2.7z */, + 0660C1301F3B3E6B002D42E4 /* test_7z_copy.7z */, + 0660C1311F3B3E6B002D42E4 /* test_7z_deflate.7z */, 066348CC1F35E32200F3DC7D /* test_anti_file.7z */, 066348CE1F35E54700F3DC7D /* test_multi_blocks.7z */, 066348D01F35E7F500F3DC7D /* test_all_timestamps.7z */, @@ -1096,6 +1105,7 @@ files = ( 069DCE9D1EB64D0300ADC374 /* test2.answer in Resources */, 06393DFD1F1A858000A647A0 /* long_test_gnu.tar in Resources */, + 0660C1321F3B3E6B002D42E4 /* test_7z_bzip2.7z in Resources */, 06D07AB01EB64EE800BC8C65 /* test5.xz in Resources */, 0623135D1F33B41B0070A574 /* test_empty_file.tar in Resources */, 06BD0D241E3D0C630054AA5C /* TestDataDescriptor.zip in Resources */, @@ -1115,6 +1125,7 @@ 06DD48A71F2D24EF00F45599 /* SWCompressionSourceCode.7z in Resources */, 066348D41F35E7F500F3DC7D /* test_all_timestamps.7z in Resources */, 066348CF1F35E54700F3DC7D /* test_multi_blocks.7z in Resources */, + 0660C1331F3B3E6B002D42E4 /* test_7z_copy.7z in Resources */, 06393DFF1F1A858000A647A0 /* long_test_pax.tar in Resources */, 069DCE8D1EB64B1500ADC374 /* test5.gz in Resources */, 069DCE911EB64B1500ADC374 /* test9.gz in Resources */, @@ -1142,6 +1153,7 @@ 06B374CB1E0EECD500064853 /* random_file.zlib in Resources */, 06393DFE1F1A858000A647A0 /* long_test_oldgnu.tar in Resources */, 0623135E1F33B41B0070A574 /* test_win.tar in Resources */, + 0660C1341F3B3E6B002D42E4 /* test_7z_deflate.7z in Resources */, 069DCEA41EB64D0300ADC374 /* test9.answer in Resources */, 062313631F33B4280070A574 /* test_empty_cont.zip in Resources */, 06D07AAD1EB64EE800BC8C65 /* test2.xz in Resources */, diff --git a/Sources/7zCoder.swift b/Sources/7zCoder.swift index 8d7c293a..1598a56c 100644 --- a/Sources/7zCoder.swift +++ b/Sources/7zCoder.swift @@ -10,16 +10,16 @@ class SevenZipCoder { /// Possible coder IDs. struct ID { // TODO: Left comments column indicates whether coder has been implemented or not (I/NI) and tested (T/NT). - /* I/NT */static let copy: [UInt8] = [0x00] + /* I/T */static let copy: [UInt8] = [0x00] /// Shouldn't be used, added for compatibility, `ID.copy` should be used instead. - /* I/NT */static let zipCopy: [UInt8] = [0x04, 0x01, 0x00] - /* I/NT */static let deflate: [UInt8] = [0x04, 0x01, 0x08] + /* I/T */static let zipCopy: [UInt8] = [0x04, 0x01, 0x00] + /* I/T */static let deflate: [UInt8] = [0x04, 0x01, 0x08] /// Shouldn't be used, added for compatibility, `ID.bzip2` should be used instead. - /* I/NT */static let zipBzip2: [UInt8] = [0x04, 0x01, 0x0C] + /* I/T */static let zipBzip2: [UInt8] = [0x04, 0x01, 0x0C] /* NI/NT */static let zipLzma: [UInt8] = [0x04, 0x01, 0x0E] /// For some reason, this method is specified in ZIP section of Methods.txt. /* NI/NT */static let xz: [UInt8] = [0x04, 0x01, 0x5F] - /* I/NT */static let bzip2: [UInt8] = [0x04, 0x02, 0x02] + /* I/T */static let bzip2: [UInt8] = [0x04, 0x02, 0x02] /* I/T */static let lzma2: [UInt8] = [0x21] /* I/T */static let lzma: [UInt8] = [0x03, 0x01, 0x01] } diff --git a/Tests/7zTests.swift b/Tests/7zTests.swift index 0c882243..b8e3aeb7 100644 --- a/Tests/7zTests.swift +++ b/Tests/7zTests.swift @@ -238,6 +238,78 @@ class SevenZipTests: XCTestCase { #endif } + func test7zBZip2() throws { + // File in container compressed with BZip2. + guard let testURL = Constants.url(forTest: "test_7z_bzip2", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "test4.answer") + XCTAssertEqual(entries[0].isDirectory, false) + + guard let answerURL = Constants.url(forAnswer: "test4") else { + XCTFail("Unable to get answer's URL.") + return + } + + let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) + + XCTAssertEqual(try entries[0].data(), answerData) + } + + func test7zDeflate() throws { + // File in container compressed with Deflate. + guard let testURL = Constants.url(forTest: "test_7z_deflate", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "test4.answer") + XCTAssertEqual(entries[0].isDirectory, false) + + guard let answerURL = Constants.url(forAnswer: "test4") else { + XCTFail("Unable to get answer's URL.") + return + } + + let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) + + XCTAssertEqual(try entries[0].data(), answerData) + } + + func test7zCopy() throws { + // File in container is explicitly uncompressed. + guard let testURL = Constants.url(forTest: "test_7z_copy", withType: SevenZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try SevenZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 1) + XCTAssertEqual(entries[0].name, "test4.answer") + XCTAssertEqual(entries[0].isDirectory, false) + + guard let answerURL = Constants.url(forAnswer: "test4") else { + XCTFail("Unable to get answer's URL.") + return + } + + let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) + + XCTAssertEqual(try entries[0].data(), answerData) + } + func testWinContainer() throws { guard let testURL = Constants.url(forTest: "test_win", withType: SevenZipTests.testType) else { XCTFail("Unable to get test's URL.") diff --git a/Tests/Test Files b/Tests/Test Files index 9c9e0d95..44bdfb54 160000 --- a/Tests/Test Files +++ b/Tests/Test Files @@ -1 +1 @@ -Subproject commit 9c9e0d957a0e031ed38eeb251ff0fe2a33908cc6 +Subproject commit 44bdfb54766bed3b4fbeef79e47d1486672c98f1 From a65666cd19264fb450a7544fee7f027e4211b93c Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Mon, 14 Aug 2017 17:29:58 +0300 Subject: [PATCH 073/113] Remove unused coder IDs and extra comments --- Sources/7zCoder.swift | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Sources/7zCoder.swift b/Sources/7zCoder.swift index 1598a56c..09bf199e 100644 --- a/Sources/7zCoder.swift +++ b/Sources/7zCoder.swift @@ -9,19 +9,15 @@ class SevenZipCoder { /// Possible coder IDs. struct ID { - // TODO: Left comments column indicates whether coder has been implemented or not (I/NI) and tested (T/NT). - /* I/T */static let copy: [UInt8] = [0x00] + static let copy: [UInt8] = [0x00] /// Shouldn't be used, added for compatibility, `ID.copy` should be used instead. - /* I/T */static let zipCopy: [UInt8] = [0x04, 0x01, 0x00] - /* I/T */static let deflate: [UInt8] = [0x04, 0x01, 0x08] + static let zipCopy: [UInt8] = [0x04, 0x01, 0x00] + static let deflate: [UInt8] = [0x04, 0x01, 0x08] /// Shouldn't be used, added for compatibility, `ID.bzip2` should be used instead. - /* I/T */static let zipBzip2: [UInt8] = [0x04, 0x01, 0x0C] - /* NI/NT */static let zipLzma: [UInt8] = [0x04, 0x01, 0x0E] - /// For some reason, this method is specified in ZIP section of Methods.txt. - /* NI/NT */static let xz: [UInt8] = [0x04, 0x01, 0x5F] - /* I/T */static let bzip2: [UInt8] = [0x04, 0x02, 0x02] - /* I/T */static let lzma2: [UInt8] = [0x21] - /* I/T */static let lzma: [UInt8] = [0x03, 0x01, 0x01] + static let zipBzip2: [UInt8] = [0x04, 0x01, 0x0C] + static let bzip2: [UInt8] = [0x04, 0x02, 0x02] + static let lzma2: [UInt8] = [0x21] + static let lzma: [UInt8] = [0x03, 0x01, 0x01] } let idSize: Int From 8229afde2e9142dea665196d638e1cbb5719b97e Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Mon, 14 Aug 2017 17:36:35 +0300 Subject: [PATCH 074/113] Prepare for first test release --- .jazzy.yaml | 4 +- CHANGELOG.md | 4 + SWCompression.podspec | 2 +- Sources/Service/Info.plist | 2 +- docs/Archives.html | 48 +- docs/Classes/BZip2.html | 40 +- docs/Classes/Deflate.html | 42 +- docs/Classes/GzipArchive.html | 48 +- docs/Classes/GzipArchive/Member.html | 42 +- docs/Classes/LZMA.html | 40 +- docs/Classes/LZMA2.html | 40 +- docs/Classes/SevenZipContainer.html | 290 +++++ docs/Classes/SevenZipEntry.html | 472 +++++++ docs/Classes/TarContainer.html | 40 +- docs/Classes/TarEntry.html | 76 +- docs/Classes/TarEntry/EntryType.html | 60 +- docs/Classes/XZArchive.html | 42 +- docs/Classes/ZipContainer.html | 40 +- docs/Classes/ZipEntry.html | 52 +- docs/Classes/ZlibArchive.html | 44 +- docs/Compression.html | 46 +- docs/Containers.html | 46 +- docs/Enums/BZip2Error.html | 58 +- docs/Enums/DeflateError.html | 46 +- docs/Enums/GzipError.html | 52 +- docs/Enums/LZMA2Error.html | 48 +- docs/Enums/LZMAError.html | 54 +- docs/Enums/SevenZipError.html | 1093 +++++++++++++++++ docs/Enums/TarError.html | 50 +- docs/Enums/XZError.html | 58 +- docs/Enums/ZipError.html | 60 +- docs/Enums/ZlibError.html | 48 +- docs/Errors.html | 56 +- docs/Other Classes.html | 288 +++++ docs/Other Enums.html | 268 ++++ docs/Other Structs.html | 261 ++++ docs/Protocols.html | 46 +- docs/Protocols/Archive.html | 40 +- docs/Protocols/Container.html | 40 +- docs/Protocols/ContainerEntry.html | 48 +- docs/Protocols/DecompressionAlgorithm.html | 40 +- docs/Structs/GzipHeader.html | 56 +- .../Structs/GzipHeader/CompressionMethod.html | 40 +- docs/Structs/GzipHeader/FileSystemType.html | 48 +- docs/Structs/SevenZipEntryInfo.html | 616 ++++++++++ .../SevenZipEntryInfo/DosAttributes.html | 448 +++++++ .../SevenZipEntryInfo/Permissions.html | 580 +++++++++ docs/Structs/SevenZipEntryInfo/UnixType.html | 417 +++++++ docs/Structs/ZlibHeader.html | 50 +- docs/Structs/ZlibHeader/CompressionLevel.html | 46 +- .../Structs/ZlibHeader/CompressionMethod.html | 40 +- docs/badge.svg | 2 +- .../Resources/Documents/Archives.html | 48 +- .../Resources/Documents/Classes/BZip2.html | 40 +- .../Resources/Documents/Classes/Deflate.html | 42 +- .../Documents/Classes/GzipArchive.html | 48 +- .../Documents/Classes/GzipArchive/Member.html | 42 +- .../Resources/Documents/Classes/LZMA.html | 40 +- .../Resources/Documents/Classes/LZMA2.html | 40 +- .../Documents/Classes/SevenZipContainer.html | 290 +++++ .../Documents/Classes/SevenZipEntry.html | 472 +++++++ .../Documents/Classes/TarContainer.html | 40 +- .../Resources/Documents/Classes/TarEntry.html | 76 +- .../Documents/Classes/TarEntry/EntryType.html | 60 +- .../Documents/Classes/XZArchive.html | 42 +- .../Documents/Classes/ZipContainer.html | 40 +- .../Resources/Documents/Classes/ZipEntry.html | 52 +- .../Documents/Classes/ZlibArchive.html | 44 +- .../Resources/Documents/Compression.html | 46 +- .../Resources/Documents/Containers.html | 46 +- .../Resources/Documents/Enums/BZip2Error.html | 58 +- .../Documents/Enums/DeflateError.html | 46 +- .../Resources/Documents/Enums/GzipError.html | 52 +- .../Resources/Documents/Enums/LZMA2Error.html | 48 +- .../Resources/Documents/Enums/LZMAError.html | 54 +- .../Documents/Enums/SevenZipError.html | 1093 +++++++++++++++++ .../Resources/Documents/Enums/TarError.html | 50 +- .../Resources/Documents/Enums/XZError.html | 58 +- .../Resources/Documents/Enums/ZipError.html | 60 +- .../Resources/Documents/Enums/ZlibError.html | 48 +- .../Contents/Resources/Documents/Errors.html | 56 +- .../Resources/Documents/Other Classes.html | 288 +++++ .../Resources/Documents/Other Enums.html | 268 ++++ .../Resources/Documents/Other Structs.html | 261 ++++ .../Resources/Documents/Protocols.html | 46 +- .../Documents/Protocols/Archive.html | 40 +- .../Documents/Protocols/Container.html | 40 +- .../Documents/Protocols/ContainerEntry.html | 48 +- .../Protocols/DecompressionAlgorithm.html | 40 +- .../Documents/Structs/GzipHeader.html | 56 +- .../Structs/GzipHeader/CompressionMethod.html | 40 +- .../Structs/GzipHeader/FileSystemType.html | 48 +- .../Documents/Structs/SevenZipEntryInfo.html | 616 ++++++++++ .../SevenZipEntryInfo/DosAttributes.html | 448 +++++++ .../SevenZipEntryInfo/Permissions.html | 580 +++++++++ .../Structs/SevenZipEntryInfo/UnixType.html | 417 +++++++ .../Documents/Structs/ZlibHeader.html | 50 +- .../Structs/ZlibHeader/CompressionLevel.html | 46 +- .../Structs/ZlibHeader/CompressionMethod.html | 40 +- .../Contents/Resources/Documents/index.html | 41 +- .../Contents/Resources/Documents/search.json | 2 +- .../Contents/Resources/docSet.dsidx | Bin 61440 -> 81920 bytes docs/docsets/SWCompression.tgz | Bin 108155 -> 124194 bytes docs/index.html | 41 +- docs/search.json | 2 +- docs/undocumented.json | 589 ++++++++- 106 files changed, 13245 insertions(+), 450 deletions(-) create mode 100644 docs/Classes/SevenZipContainer.html create mode 100644 docs/Classes/SevenZipEntry.html create mode 100644 docs/Enums/SevenZipError.html create mode 100644 docs/Other Classes.html create mode 100644 docs/Other Enums.html create mode 100644 docs/Other Structs.html create mode 100644 docs/Structs/SevenZipEntryInfo.html create mode 100644 docs/Structs/SevenZipEntryInfo/DosAttributes.html create mode 100644 docs/Structs/SevenZipEntryInfo/Permissions.html create mode 100644 docs/Structs/SevenZipEntryInfo/UnixType.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Classes.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html create mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html diff --git a/.jazzy.yaml b/.jazzy.yaml index 261095a8..294d936d 100644 --- a/.jazzy.yaml +++ b/.jazzy.yaml @@ -3,11 +3,11 @@ clean: true exclude: Tests/ author: Timofey Solomko module: SWCompression -module_version: 3.2.0 +module_version: 3.3.0-test.1 copyright: '© 2017 Timofey Solomko' readme: README.md github_url: https://github.com/tsolomko/SWCompression -github_file_prefix: https://github.com/tsolomko/SWCompression/tree/v3.2.0 +github_file_prefix: https://github.com/tsolomko/SWCompression/tree/v3.3.0-test.1 theme: fullwidth custom_categories: diff --git a/CHANGELOG.md b/CHANGELOG.md index edb48a46..84efcaf5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ # Changelog +v3.3.0-test.1 +---------------- +- Introduced support for 7-Zip containers. + v3.2.0 ---------------- - Split source files. diff --git a/SWCompression.podspec b/SWCompression.podspec index eb783a14..d88d479d 100644 --- a/SWCompression.podspec +++ b/SWCompression.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "SWCompression" - s.version = "3.2.0" + s.version = "3.3.0-test.1" s.summary = "Framework with implementations in Swift of different (de)compression algorithms" s.description = <<-DESC diff --git a/Sources/Service/Info.plist b/Sources/Service/Info.plist index 91c7c755..f12d5de4 100644 --- a/Sources/Service/Info.plist +++ b/Sources/Service/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.2.0 + 3.3.0-test.1 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSHumanReadableCopyright diff --git a/docs/Archives.html b/docs/Archives.html index 90a5b9c6..e9b526cb 100644 --- a/docs/Archives.html +++ b/docs/Archives.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -211,7 +247,7 @@

Declaration

@@ -246,7 +282,7 @@

Declaration

@@ -281,7 +317,7 @@

Declaration

@@ -316,7 +352,7 @@

Declaration

@@ -351,7 +387,7 @@

Declaration

diff --git a/docs/Classes/BZip2.html b/docs/Classes/BZip2.html index 87b6742c..4368d429 100644 --- a/docs/Classes/BZip2.html +++ b/docs/Classes/BZip2.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -249,7 +285,7 @@

Return Value

Decompressed data.

diff --git a/docs/Classes/Deflate.html b/docs/Classes/Deflate.html index 5249f2c9..a3e3f2c9 100644 --- a/docs/Classes/Deflate.html +++ b/docs/Classes/Deflate.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -254,7 +290,7 @@

Return Value

Decompressed data.

@@ -318,7 +354,7 @@

Parameters

diff --git a/docs/Classes/GzipArchive.html b/docs/Classes/GzipArchive.html index 294fad3e..5cc78676 100644 --- a/docs/Classes/GzipArchive.html +++ b/docs/Classes/GzipArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -288,7 +324,7 @@

Return Value

Unarchived data.

@@ -311,7 +347,7 @@

Return Value

Note

wrongCRC error contains only last processed member’s data as their associated value -instead of all successfully processed members. +instead of all successfully processed members. This is a known issue and it will be fixed in future major version because solution requires backwards-incompatible API changes.

@@ -357,7 +393,7 @@

Return Value

Unarchived data.

@@ -500,7 +536,7 @@

Return Value

Resulting archive’s data.

diff --git a/docs/Classes/GzipArchive/Member.html b/docs/Classes/GzipArchive/Member.html index 7ca6f68f..490f4932 100644 --- a/docs/Classes/GzipArchive/Member.html +++ b/docs/Classes/GzipArchive/Member.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

@@ -248,7 +284,7 @@

Declaration

diff --git a/docs/Classes/LZMA.html b/docs/Classes/LZMA.html index c6b4748d..90e3bba9 100644 --- a/docs/Classes/LZMA.html +++ b/docs/Classes/LZMA.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -249,7 +285,7 @@

Return Value

Decompressed data.

diff --git a/docs/Classes/LZMA2.html b/docs/Classes/LZMA2.html index fe49a2ca..d3f54c7b 100644 --- a/docs/Classes/LZMA2.html +++ b/docs/Classes/LZMA2.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -249,7 +285,7 @@

Return Value

Decompressed data.

diff --git a/docs/Classes/SevenZipContainer.html b/docs/Classes/SevenZipContainer.html new file mode 100644 index 00000000..b982f506 --- /dev/null +++ b/docs/Classes/SevenZipContainer.html @@ -0,0 +1,290 @@ + + + + SevenZipContainer Class Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ + +
+ + + + diff --git a/docs/Classes/SevenZipEntry.html b/docs/Classes/SevenZipEntry.html new file mode 100644 index 00000000..45473155 --- /dev/null +++ b/docs/Classes/SevenZipEntry.html @@ -0,0 +1,472 @@ + + + + SevenZipEntry Class Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

SevenZipEntry

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/Classes/TarContainer.html b/docs/Classes/TarContainer.html index 34ff78bc..0eb9530f 100644 --- a/docs/Classes/TarContainer.html +++ b/docs/Classes/TarContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -254,7 +290,7 @@

Return Value

Array of TarEntry as an array of ContainerEntry.

diff --git a/docs/Classes/TarEntry.html b/docs/Classes/TarEntry.html index 67dd00cc..325864d6 100644 --- a/docs/Classes/TarEntry.html +++ b/docs/Classes/TarEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -224,7 +260,7 @@

Declaration

@@ -254,7 +290,7 @@

Declaration

@@ -284,7 +320,7 @@

Declaration

@@ -314,7 +350,7 @@

Declaration

@@ -365,7 +401,7 @@

Declaration

@@ -400,7 +436,7 @@

Declaration

@@ -435,7 +471,7 @@

Declaration

@@ -470,7 +506,7 @@

Declaration

@@ -505,7 +541,7 @@

Declaration

@@ -540,7 +576,7 @@

Declaration

@@ -575,7 +611,7 @@

Declaration

@@ -610,7 +646,7 @@

Declaration

@@ -640,7 +676,7 @@

Declaration

@@ -670,7 +706,7 @@

Declaration

@@ -700,7 +736,7 @@

Declaration

@@ -730,7 +766,7 @@

Declaration

@@ -760,7 +796,7 @@

Declaration

@@ -790,7 +826,7 @@

Declaration

@@ -820,7 +856,7 @@

Declaration

diff --git a/docs/Classes/TarEntry/EntryType.html b/docs/Classes/TarEntry/EntryType.html index 8a71e54e..00d06bbb 100644 --- a/docs/Classes/TarEntry/EntryType.html +++ b/docs/Classes/TarEntry/EntryType.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -223,7 +259,7 @@

Declaration

@@ -257,7 +293,7 @@

Declaration

@@ -291,7 +327,7 @@

Declaration

@@ -325,7 +361,7 @@

Declaration

@@ -359,7 +395,7 @@

Declaration

@@ -393,7 +429,7 @@

Declaration

@@ -427,7 +463,7 @@

Declaration

@@ -461,7 +497,7 @@

Declaration

@@ -495,7 +531,7 @@

Declaration

@@ -529,7 +565,7 @@

Declaration

@@ -563,7 +599,7 @@

Declaration

diff --git a/docs/Classes/XZArchive.html b/docs/Classes/XZArchive.html index 2900306c..f918811f 100644 --- a/docs/Classes/XZArchive.html +++ b/docs/Classes/XZArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -254,7 +290,7 @@

Return Value

Unarchived data.

@@ -322,7 +358,7 @@

Return Value

Unarchived data.

diff --git a/docs/Classes/ZipContainer.html b/docs/Classes/ZipContainer.html index 890fb0c7..83f816b8 100644 --- a/docs/Classes/ZipContainer.html +++ b/docs/Classes/ZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -256,7 +292,7 @@

Return Value

Array of ZipEntry as an array of ContainerEntry.

diff --git a/docs/Classes/ZipEntry.html b/docs/Classes/ZipEntry.html index f489e549..3c9c2ff1 100644 --- a/docs/Classes/ZipEntry.html +++ b/docs/Classes/ZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

@@ -248,7 +284,7 @@

Declaration

@@ -283,7 +319,7 @@

Declaration

@@ -313,7 +349,7 @@

Declaration

@@ -345,7 +381,7 @@

Declaration

@@ -390,7 +426,7 @@

Declaration

@@ -426,7 +462,7 @@

Declaration

diff --git a/docs/Classes/ZlibArchive.html b/docs/Classes/ZlibArchive.html index 622802b1..72ca9fce 100644 --- a/docs/Classes/ZlibArchive.html +++ b/docs/Classes/ZlibArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -257,7 +293,7 @@

Return Value

Unarchived data.

@@ -275,7 +311,7 @@

Return Value

-

Archives data into Zlib archive. +

Archives data into Zlib archive. Data will be also compressed with Deflate algorithm. It will also be specified in archive’s header that the compressor used the slowest Deflate algorithm.

@@ -324,7 +360,7 @@

Return Value

Resulting archive’s data.

diff --git a/docs/Compression.html b/docs/Compression.html index 521d454f..c873767f 100644 --- a/docs/Compression.html +++ b/docs/Compression.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -211,7 +247,7 @@

Declaration

@@ -246,7 +282,7 @@

Declaration

@@ -281,7 +317,7 @@

Declaration

@@ -316,7 +352,7 @@

Declaration

diff --git a/docs/Containers.html b/docs/Containers.html index 9aca31f2..2648e7f9 100644 --- a/docs/Containers.html +++ b/docs/Containers.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -211,7 +247,7 @@

Declaration

@@ -246,7 +282,7 @@

Declaration

@@ -281,7 +317,7 @@

Declaration

@@ -316,7 +352,7 @@

Declaration

diff --git a/docs/Enums/BZip2Error.html b/docs/Enums/BZip2Error.html index 26a2eaf1..d80052fb 100644 --- a/docs/Enums/BZip2Error.html +++ b/docs/Enums/BZip2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -355,7 +391,7 @@

Declaration

@@ -389,7 +425,7 @@

Declaration

@@ -423,7 +459,7 @@

Declaration

@@ -457,7 +493,7 @@

Declaration

@@ -491,7 +527,7 @@

Declaration

@@ -526,7 +562,7 @@

Declaration

diff --git a/docs/Enums/DeflateError.html b/docs/Enums/DeflateError.html index e636f345..b67fdde7 100644 --- a/docs/Enums/DeflateError.html +++ b/docs/Enums/DeflateError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

diff --git a/docs/Enums/GzipError.html b/docs/Enums/GzipError.html index d01cc672..86326f92 100644 --- a/docs/Enums/GzipError.html +++ b/docs/Enums/GzipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -288,7 +324,7 @@

Declaration

@@ -322,7 +358,7 @@

Declaration

@@ -357,7 +393,7 @@

Declaration

@@ -391,7 +427,7 @@

Declaration

@@ -425,7 +461,7 @@

Declaration

diff --git a/docs/Enums/LZMA2Error.html b/docs/Enums/LZMA2Error.html index 2cdbab12..7c9814e3 100644 --- a/docs/Enums/LZMA2Error.html +++ b/docs/Enums/LZMA2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -356,7 +392,7 @@

Declaration

diff --git a/docs/Enums/LZMAError.html b/docs/Enums/LZMAError.html index b123e567..b27dda47 100644 --- a/docs/Enums/LZMAError.html +++ b/docs/Enums/LZMAError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -355,7 +391,7 @@

Declaration

@@ -389,7 +425,7 @@

Declaration

@@ -423,7 +459,7 @@

Declaration

@@ -457,7 +493,7 @@

Declaration

diff --git a/docs/Enums/SevenZipError.html b/docs/Enums/SevenZipError.html new file mode 100644 index 00000000..c8380857 --- /dev/null +++ b/docs/Enums/SevenZipError.html @@ -0,0 +1,1093 @@ + + + + SevenZipError Enum Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

SevenZipError

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/Enums/TarError.html b/docs/Enums/TarError.html index 09096368..c49caf2c 100644 --- a/docs/Enums/TarError.html +++ b/docs/Enums/TarError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -355,7 +391,7 @@

Declaration

@@ -389,7 +425,7 @@

Declaration

diff --git a/docs/Enums/XZError.html b/docs/Enums/XZError.html index 403c9e4d..23d9342e 100644 --- a/docs/Enums/XZError.html +++ b/docs/Enums/XZError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -288,7 +324,7 @@

Declaration

@@ -322,7 +358,7 @@

Declaration

@@ -356,7 +392,7 @@

Declaration

@@ -390,7 +426,7 @@

Declaration

@@ -425,7 +461,7 @@

Declaration

@@ -460,7 +496,7 @@

Declaration

@@ -494,7 +530,7 @@

Declaration

@@ -528,7 +564,7 @@

Declaration

diff --git a/docs/Enums/ZipError.html b/docs/Enums/ZipError.html index ec9230da..522eab01 100644 --- a/docs/Enums/ZipError.html +++ b/docs/Enums/ZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -355,7 +391,7 @@

Declaration

@@ -389,7 +425,7 @@

Declaration

@@ -423,7 +459,7 @@

Declaration

@@ -457,7 +493,7 @@

Declaration

@@ -491,7 +527,7 @@

Declaration

@@ -526,7 +562,7 @@

Declaration

@@ -560,7 +596,7 @@

Declaration

diff --git a/docs/Enums/ZlibError.html b/docs/Enums/ZlibError.html index 9dfa2b82..862450c9 100644 --- a/docs/Enums/ZlibError.html +++ b/docs/Enums/ZlibError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -356,7 +392,7 @@

Declaration

diff --git a/docs/Errors.html b/docs/Errors.html index 8aba76a1..93205e9e 100644 --- a/docs/Errors.html +++ b/docs/Errors.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -212,7 +248,7 @@

Declaration

@@ -248,7 +284,7 @@

Declaration

@@ -284,7 +320,7 @@

Declaration

@@ -320,7 +356,7 @@

Declaration

@@ -356,7 +392,7 @@

Declaration

@@ -399,7 +435,7 @@

Declaration

@@ -435,7 +471,7 @@

Declaration

@@ -471,7 +507,7 @@

Declaration

@@ -507,7 +543,7 @@

Declaration

diff --git a/docs/Other Classes.html b/docs/Other Classes.html new file mode 100644 index 00000000..3025fcd6 --- /dev/null +++ b/docs/Other Classes.html @@ -0,0 +1,288 @@ + + + + Other Classes Reference + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ + +
+ + + + diff --git a/docs/Other Enums.html b/docs/Other Enums.html new file mode 100644 index 00000000..fa0b7d5a --- /dev/null +++ b/docs/Other Enums.html @@ -0,0 +1,268 @@ + + + + Other Enums Reference + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ + +
+ + + + diff --git a/docs/Other Structs.html b/docs/Other Structs.html new file mode 100644 index 00000000..e66c7efa --- /dev/null +++ b/docs/Other Structs.html @@ -0,0 +1,261 @@ + + + + Other Structs Reference + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

Other Structs

+

The following structs are available globally.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/Protocols.html b/docs/Protocols.html index 485111bb..e5a834e4 100644 --- a/docs/Protocols.html +++ b/docs/Protocols.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -211,7 +247,7 @@

Declaration

@@ -242,7 +278,7 @@

Declaration

@@ -273,7 +309,7 @@

Declaration

@@ -304,7 +340,7 @@

Declaration

diff --git a/docs/Protocols/Archive.html b/docs/Protocols/Archive.html index 9eb2c704..23b10f1a 100644 --- a/docs/Protocols/Archive.html +++ b/docs/Protocols/Archive.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/Protocols/Container.html b/docs/Protocols/Container.html index 7db7fa00..4dd22eed 100644 --- a/docs/Protocols/Container.html +++ b/docs/Protocols/Container.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/Protocols/ContainerEntry.html b/docs/Protocols/ContainerEntry.html index 37460921..90114ac7 100644 --- a/docs/Protocols/ContainerEntry.html +++ b/docs/Protocols/ContainerEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

@@ -248,7 +284,7 @@

Declaration

@@ -278,7 +314,7 @@

Declaration

@@ -314,7 +350,7 @@

Declaration

@@ -344,7 +380,7 @@

Declaration

diff --git a/docs/Protocols/DecompressionAlgorithm.html b/docs/Protocols/DecompressionAlgorithm.html index f6a8c7b7..bdf9b2e8 100644 --- a/docs/Protocols/DecompressionAlgorithm.html +++ b/docs/Protocols/DecompressionAlgorithm.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/Structs/GzipHeader.html b/docs/Structs/GzipHeader.html index f8c38add..078ce590 100644 --- a/docs/Structs/GzipHeader.html +++ b/docs/Structs/GzipHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -250,7 +286,7 @@

Declaration

@@ -280,7 +316,7 @@

Declaration

@@ -312,7 +348,7 @@

Declaration

@@ -342,7 +378,7 @@

Declaration

@@ -372,7 +408,7 @@

Declaration

@@ -402,7 +438,7 @@

Declaration

@@ -432,7 +468,7 @@

Declaration

@@ -489,7 +525,7 @@

Parameters

diff --git a/docs/Structs/GzipHeader/CompressionMethod.html b/docs/Structs/GzipHeader/CompressionMethod.html index 25266d0f..1b9b44ce 100644 --- a/docs/Structs/GzipHeader/CompressionMethod.html +++ b/docs/Structs/GzipHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/Structs/GzipHeader/FileSystemType.html b/docs/Structs/GzipHeader/FileSystemType.html index 15a6aaa8..975b0103 100644 --- a/docs/Structs/GzipHeader/FileSystemType.html +++ b/docs/Structs/GzipHeader/FileSystemType.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -223,7 +259,7 @@

Declaration

@@ -257,7 +293,7 @@

Declaration

@@ -291,7 +327,7 @@

Declaration

@@ -325,7 +361,7 @@

Declaration

@@ -359,7 +395,7 @@

Declaration

diff --git a/docs/Structs/SevenZipEntryInfo.html b/docs/Structs/SevenZipEntryInfo.html new file mode 100644 index 00000000..4e6b2cb2 --- /dev/null +++ b/docs/Structs/SevenZipEntryInfo.html @@ -0,0 +1,616 @@ + + + + SevenZipEntryInfo Struct Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

SevenZipEntryInfo

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/Structs/SevenZipEntryInfo/DosAttributes.html b/docs/Structs/SevenZipEntryInfo/DosAttributes.html new file mode 100644 index 00000000..8bbf6334 --- /dev/null +++ b/docs/Structs/SevenZipEntryInfo/DosAttributes.html @@ -0,0 +1,448 @@ + + + + DosAttributes Struct Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

DosAttributes

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/Structs/SevenZipEntryInfo/Permissions.html b/docs/Structs/SevenZipEntryInfo/Permissions.html new file mode 100644 index 00000000..7c544fed --- /dev/null +++ b/docs/Structs/SevenZipEntryInfo/Permissions.html @@ -0,0 +1,580 @@ + + + + Permissions Struct Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

Permissions

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/Structs/SevenZipEntryInfo/UnixType.html b/docs/Structs/SevenZipEntryInfo/UnixType.html new file mode 100644 index 00000000..a903618c --- /dev/null +++ b/docs/Structs/SevenZipEntryInfo/UnixType.html @@ -0,0 +1,417 @@ + + + + UnixType Enum Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

UnixType

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/Structs/ZlibHeader.html b/docs/Structs/ZlibHeader.html index f5be602a..8db9e350 100644 --- a/docs/Structs/ZlibHeader.html +++ b/docs/Structs/ZlibHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -250,7 +286,7 @@

Declaration

@@ -280,7 +316,7 @@

Declaration

@@ -310,7 +346,7 @@

Declaration

@@ -340,7 +376,7 @@

Declaration

@@ -397,7 +433,7 @@

Parameters

diff --git a/docs/Structs/ZlibHeader/CompressionLevel.html b/docs/Structs/ZlibHeader/CompressionLevel.html index b90a15be..d2762e15 100644 --- a/docs/Structs/ZlibHeader/CompressionLevel.html +++ b/docs/Structs/ZlibHeader/CompressionLevel.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

@@ -252,7 +288,7 @@

Declaration

@@ -286,7 +322,7 @@

Declaration

@@ -320,7 +356,7 @@

Declaration

diff --git a/docs/Structs/ZlibHeader/CompressionMethod.html b/docs/Structs/ZlibHeader/CompressionMethod.html index 104b27e1..564e63ca 100644 --- a/docs/Structs/ZlibHeader/CompressionMethod.html +++ b/docs/Structs/ZlibHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/badge.svg b/docs/badge.svg index 2606d804..9ec9bd92 100644 --- a/docs/badge.svg +++ b/docs/badge.svg @@ -1 +1 @@ -documentationdocumentation100%100% \ No newline at end of file +documentationdocumentation69%69% \ No newline at end of file diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html index 90a5b9c6..e9b526cb 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -211,7 +247,7 @@

Declaration

@@ -246,7 +282,7 @@

Declaration

@@ -281,7 +317,7 @@

Declaration

@@ -316,7 +352,7 @@

Declaration

@@ -351,7 +387,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html index 87b6742c..4368d429 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -249,7 +285,7 @@

Return Value

Decompressed data.

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html index 5249f2c9..a3e3f2c9 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -254,7 +290,7 @@

Return Value

Decompressed data.

@@ -318,7 +354,7 @@

Parameters

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html index 294fad3e..5cc78676 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -288,7 +324,7 @@

Return Value

Unarchived data.

@@ -311,7 +347,7 @@

Return Value

Note

wrongCRC error contains only last processed member’s data as their associated value -instead of all successfully processed members. +instead of all successfully processed members. This is a known issue and it will be fixed in future major version because solution requires backwards-incompatible API changes.

@@ -357,7 +393,7 @@

Return Value

Unarchived data.

@@ -500,7 +536,7 @@

Return Value

Resulting archive’s data.

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html index 7ca6f68f..490f4932 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

@@ -248,7 +284,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html index c6b4748d..90e3bba9 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -249,7 +285,7 @@

Return Value

Decompressed data.

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html index fe49a2ca..d3f54c7b 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -249,7 +285,7 @@

Return Value

Decompressed data.

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html new file mode 100644 index 00000000..b982f506 --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html @@ -0,0 +1,290 @@ + + + + SevenZipContainer Class Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ + +
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html new file mode 100644 index 00000000..45473155 --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html @@ -0,0 +1,472 @@ + + + + SevenZipEntry Class Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

SevenZipEntry

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html index 34ff78bc..0eb9530f 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -254,7 +290,7 @@

Return Value

Array of TarEntry as an array of ContainerEntry.

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html index 67dd00cc..325864d6 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -224,7 +260,7 @@

Declaration

@@ -254,7 +290,7 @@

Declaration

@@ -284,7 +320,7 @@

Declaration

@@ -314,7 +350,7 @@

Declaration

@@ -365,7 +401,7 @@

Declaration

@@ -400,7 +436,7 @@

Declaration

@@ -435,7 +471,7 @@

Declaration

@@ -470,7 +506,7 @@

Declaration

@@ -505,7 +541,7 @@

Declaration

@@ -540,7 +576,7 @@

Declaration

@@ -575,7 +611,7 @@

Declaration

@@ -610,7 +646,7 @@

Declaration

@@ -640,7 +676,7 @@

Declaration

@@ -670,7 +706,7 @@

Declaration

@@ -700,7 +736,7 @@

Declaration

@@ -730,7 +766,7 @@

Declaration

@@ -760,7 +796,7 @@

Declaration

@@ -790,7 +826,7 @@

Declaration

@@ -820,7 +856,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html index 8a71e54e..00d06bbb 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -223,7 +259,7 @@

Declaration

@@ -257,7 +293,7 @@

Declaration

@@ -291,7 +327,7 @@

Declaration

@@ -325,7 +361,7 @@

Declaration

@@ -359,7 +395,7 @@

Declaration

@@ -393,7 +429,7 @@

Declaration

@@ -427,7 +463,7 @@

Declaration

@@ -461,7 +497,7 @@

Declaration

@@ -495,7 +531,7 @@

Declaration

@@ -529,7 +565,7 @@

Declaration

@@ -563,7 +599,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html index 2900306c..f918811f 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -254,7 +290,7 @@

Return Value

Unarchived data.

@@ -322,7 +358,7 @@

Return Value

Unarchived data.

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html index 890fb0c7..83f816b8 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -256,7 +292,7 @@

Return Value

Array of ZipEntry as an array of ContainerEntry.

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html index f489e549..3c9c2ff1 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

@@ -248,7 +284,7 @@

Declaration

@@ -283,7 +319,7 @@

Declaration

@@ -313,7 +349,7 @@

Declaration

@@ -345,7 +381,7 @@

Declaration

@@ -390,7 +426,7 @@

Declaration

@@ -426,7 +462,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html index 622802b1..72ca9fce 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -257,7 +293,7 @@

Return Value

Unarchived data.

@@ -275,7 +311,7 @@

Return Value

-

Archives data into Zlib archive. +

Archives data into Zlib archive. Data will be also compressed with Deflate algorithm. It will also be specified in archive’s header that the compressor used the slowest Deflate algorithm.

@@ -324,7 +360,7 @@

Return Value

Resulting archive’s data.

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html index 521d454f..c873767f 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -211,7 +247,7 @@

Declaration

@@ -246,7 +282,7 @@

Declaration

@@ -281,7 +317,7 @@

Declaration

@@ -316,7 +352,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html index 9aca31f2..2648e7f9 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -211,7 +247,7 @@

Declaration

@@ -246,7 +282,7 @@

Declaration

@@ -281,7 +317,7 @@

Declaration

@@ -316,7 +352,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html index 26a2eaf1..d80052fb 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -355,7 +391,7 @@

Declaration

@@ -389,7 +425,7 @@

Declaration

@@ -423,7 +459,7 @@

Declaration

@@ -457,7 +493,7 @@

Declaration

@@ -491,7 +527,7 @@

Declaration

@@ -526,7 +562,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html index e636f345..b67fdde7 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html index d01cc672..86326f92 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -288,7 +324,7 @@

Declaration

@@ -322,7 +358,7 @@

Declaration

@@ -357,7 +393,7 @@

Declaration

@@ -391,7 +427,7 @@

Declaration

@@ -425,7 +461,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html index 2cdbab12..7c9814e3 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -356,7 +392,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html index b123e567..b27dda47 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -355,7 +391,7 @@

Declaration

@@ -389,7 +425,7 @@

Declaration

@@ -423,7 +459,7 @@

Declaration

@@ -457,7 +493,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html new file mode 100644 index 00000000..c8380857 --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html @@ -0,0 +1,1093 @@ + + + + SevenZipError Enum Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

SevenZipError

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html index 09096368..c49caf2c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -355,7 +391,7 @@

Declaration

@@ -389,7 +425,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html index 403c9e4d..23d9342e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -288,7 +324,7 @@

Declaration

@@ -322,7 +358,7 @@

Declaration

@@ -356,7 +392,7 @@

Declaration

@@ -390,7 +426,7 @@

Declaration

@@ -425,7 +461,7 @@

Declaration

@@ -460,7 +496,7 @@

Declaration

@@ -494,7 +530,7 @@

Declaration

@@ -528,7 +564,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html index ec9230da..522eab01 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -355,7 +391,7 @@

Declaration

@@ -389,7 +425,7 @@

Declaration

@@ -423,7 +459,7 @@

Declaration

@@ -457,7 +493,7 @@

Declaration

@@ -491,7 +527,7 @@

Declaration

@@ -526,7 +562,7 @@

Declaration

@@ -560,7 +596,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html index 9dfa2b82..862450c9 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -253,7 +289,7 @@

Declaration

@@ -287,7 +323,7 @@

Declaration

@@ -321,7 +357,7 @@

Declaration

@@ -356,7 +392,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html index 8aba76a1..93205e9e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -212,7 +248,7 @@

Declaration

@@ -248,7 +284,7 @@

Declaration

@@ -284,7 +320,7 @@

Declaration

@@ -320,7 +356,7 @@

Declaration

@@ -356,7 +392,7 @@

Declaration

@@ -399,7 +435,7 @@

Declaration

@@ -435,7 +471,7 @@

Declaration

@@ -471,7 +507,7 @@

Declaration

@@ -507,7 +543,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Classes.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Classes.html new file mode 100644 index 00000000..3025fcd6 --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Classes.html @@ -0,0 +1,288 @@ + + + + Other Classes Reference + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ + +
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html new file mode 100644 index 00000000..fa0b7d5a --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html @@ -0,0 +1,268 @@ + + + + Other Enums Reference + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ + +
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html new file mode 100644 index 00000000..e66c7efa --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html @@ -0,0 +1,261 @@ + + + + Other Structs Reference + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

Other Structs

+

The following structs are available globally.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html index 485111bb..e5a834e4 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -211,7 +247,7 @@

Declaration

@@ -242,7 +278,7 @@

Declaration

@@ -273,7 +309,7 @@

Declaration

@@ -304,7 +340,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html index 9eb2c704..23b10f1a 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html index 7db7fa00..4dd22eed 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html index 37460921..90114ac7 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

@@ -248,7 +284,7 @@

Declaration

@@ -278,7 +314,7 @@

Declaration

@@ -314,7 +350,7 @@

Declaration

@@ -344,7 +380,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html index f6a8c7b7..bdf9b2e8 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html index f8c38add..078ce590 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -250,7 +286,7 @@

Declaration

@@ -280,7 +316,7 @@

Declaration

@@ -312,7 +348,7 @@

Declaration

@@ -342,7 +378,7 @@

Declaration

@@ -372,7 +408,7 @@

Declaration

@@ -402,7 +438,7 @@

Declaration

@@ -432,7 +468,7 @@

Declaration

@@ -489,7 +525,7 @@

Parameters

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html index 25266d0f..1b9b44ce 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html index 15a6aaa8..975b0103 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -223,7 +259,7 @@

Declaration

@@ -257,7 +293,7 @@

Declaration

@@ -291,7 +327,7 @@

Declaration

@@ -325,7 +361,7 @@

Declaration

@@ -359,7 +395,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html new file mode 100644 index 00000000..4e6b2cb2 --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html @@ -0,0 +1,616 @@ + + + + SevenZipEntryInfo Struct Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

SevenZipEntryInfo

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html new file mode 100644 index 00000000..8bbf6334 --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html @@ -0,0 +1,448 @@ + + + + DosAttributes Struct Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

DosAttributes

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html new file mode 100644 index 00000000..7c544fed --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html @@ -0,0 +1,580 @@ + + + + Permissions Struct Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

Permissions

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html new file mode 100644 index 00000000..a903618c --- /dev/null +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html @@ -0,0 +1,417 @@ + + + + UnixType Enum Reference + + + + + + + + + + + + + + + + +
+

+ + SWCompression Docs + + (69% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +
+ + + +
+ +
+ +
+
+

UnixType

+

Undocumented

+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + + + diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html index f5be602a..8db9e350 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -219,7 +255,7 @@

Declaration

@@ -250,7 +286,7 @@

Declaration

@@ -280,7 +316,7 @@

Declaration

@@ -310,7 +346,7 @@

Declaration

@@ -340,7 +376,7 @@

Declaration

@@ -397,7 +433,7 @@

Parameters

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html index b90a15be..d2762e15 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

@@ -252,7 +288,7 @@

Declaration

@@ -286,7 +322,7 @@

Declaration

@@ -320,7 +356,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html index 104b27e1..564e63ca 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -171,6 +171,42 @@ +

+ +
@@ -218,7 +254,7 @@

Declaration

diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html index e34c3c87..1a654460 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html @@ -22,7 +22,7 @@ SWCompression Docs - (100% documented) + (69% documented)

@@ -170,6 +170,42 @@ +

+ +
@@ -183,7 +219,7 @@

SWCompression

CocoaPods Swift 3 Build Status -codecov

+Test Coverage

CocoaPods Carthage compatible

@@ -395,6 +431,7 @@

References

  • Wikipedia article about TAR
  • Pax specification
  • Basic TAR specification
  • +
  • Apache Commons Compress
  • diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json index b4c2e00e..b0ad85e4 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json @@ -1 +1 @@ -{"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"}} \ No newline at end of file +{"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Undocumented

    "},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongStartHeaderCRCFMS0_S0_":{"name":"wrongStartHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongHeaderSizeFMS0_S0_":{"name":"wrongHeaderSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongPropertyIDFMS0_S0_":{"name":"wrongPropertyID","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongExternalFMS0_S0_":{"name":"wrongExternal","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18reservedCodecFlagsFMS0_S0_":{"name":"reservedCodecFlags","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17unknownNumFoldersFMS0_S0_":{"name":"unknownNumFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongEndFMS0_S0_":{"name":"wrongEnd","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22altMethodsNotSupportedFMS0_S0_":{"name":"altMethodsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongStreamsNumberFMS0_S0_":{"name":"wrongStreamsNumber","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20wrongCoderPropertiesFMS0_S0_":{"name":"wrongCoderProperties","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noPackInfoFMS0_S0_":{"name":"noPackInfo","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17wrongFilePropertyFMS0_S0_":{"name":"wrongFileProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongFileNameLengthFMS0_S0_":{"name":"wrongFileNameLength","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongFileNamesFMS0_S0_":{"name":"wrongFileNames","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18incompletePropertyFMS0_S0_":{"name":"incompleteProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noFileSizeFMS0_S0_":{"name":"noFileSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughFoldersFMS0_S0_":{"name":"notEnoughFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughStreamsFMS0_S0_":{"name":"notEnoughStreams","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13noStreamFoundFMS0_S0_":{"name":"noStreamFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15noPackInfoFoundFMS0_S0_":{"name":"noPackInfoFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14streamOverreadFMS0_S0_":{"name":"streamOverread","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Undocumented

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Undocumented

    "},"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"},"Other Classes.html":{"name":"Other Classes","abstract":"

    The following classes are available globally.

    "},"Other Enums.html":{"name":"Other Enums","abstract":"

    The following enums are available globally.

    "},"Other Structs.html":{"name":"Other Structs","abstract":"

    The following structs are available globally.

    "}} \ No newline at end of file diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/docSet.dsidx b/docs/docsets/SWCompression.docset/Contents/Resources/docSet.dsidx index e2ce9798b7544b5b5935f324cc59ffbc0e510dd0..b4120e97826f11b78211981e96c2d969034ebd8c 100644 GIT binary patch literal 81920 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%0A@})mX!`>Pvy&4ea#4$KR!W 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 + + +
    @@ -183,7 +219,7 @@

    SWCompression

    CocoaPods Swift 3 Build Status -codecov

    +Test Coverage

    CocoaPods Carthage compatible

    @@ -395,6 +431,7 @@

    References

  • Wikipedia article about TAR
  • Pax specification
  • Basic TAR specification
  • +
  • Apache Commons Compress
  • diff --git a/docs/search.json b/docs/search.json index b4c2e00e..b0ad85e4 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -{"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"}} \ No newline at end of file +{"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Undocumented

    "},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongStartHeaderCRCFMS0_S0_":{"name":"wrongStartHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongHeaderSizeFMS0_S0_":{"name":"wrongHeaderSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongPropertyIDFMS0_S0_":{"name":"wrongPropertyID","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongExternalFMS0_S0_":{"name":"wrongExternal","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18reservedCodecFlagsFMS0_S0_":{"name":"reservedCodecFlags","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17unknownNumFoldersFMS0_S0_":{"name":"unknownNumFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongEndFMS0_S0_":{"name":"wrongEnd","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22altMethodsNotSupportedFMS0_S0_":{"name":"altMethodsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongStreamsNumberFMS0_S0_":{"name":"wrongStreamsNumber","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20wrongCoderPropertiesFMS0_S0_":{"name":"wrongCoderProperties","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noPackInfoFMS0_S0_":{"name":"noPackInfo","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17wrongFilePropertyFMS0_S0_":{"name":"wrongFileProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongFileNameLengthFMS0_S0_":{"name":"wrongFileNameLength","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongFileNamesFMS0_S0_":{"name":"wrongFileNames","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18incompletePropertyFMS0_S0_":{"name":"incompleteProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noFileSizeFMS0_S0_":{"name":"noFileSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughFoldersFMS0_S0_":{"name":"notEnoughFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughStreamsFMS0_S0_":{"name":"notEnoughStreams","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13noStreamFoundFMS0_S0_":{"name":"noStreamFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15noPackInfoFoundFMS0_S0_":{"name":"noPackInfoFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14streamOverreadFMS0_S0_":{"name":"streamOverread","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Undocumented

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Undocumented

    "},"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"},"Other Classes.html":{"name":"Other Classes","abstract":"

    The following classes are available globally.

    "},"Other Enums.html":{"name":"Other Enums","abstract":"

    The following enums are available globally.

    "},"Other Structs.html":{"name":"Other Structs","abstract":"

    The following structs are available globally.

    "}} \ No newline at end of file diff --git a/docs/undocumented.json b/docs/undocumented.json index f43c0df0..1818a440 100644 --- a/docs/undocumented.json +++ b/docs/undocumented.json @@ -1,6 +1,593 @@ { "warnings": [ - + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zContainer.swift", + "line": 8, + "symbol": "SevenZipContainer", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zContainer.swift", + "line": 173, + "symbol": "SevenZipContainer.info(container:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", + "line": 8, + "symbol": "SevenZipEntry", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", + "line": 10, + "symbol": "SevenZipEntry.info", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", + "line": 24, + "symbol": "SevenZipEntry.isLink", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", + "line": 25, + "symbol": "SevenZipEntry.linkPath", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", + "line": 29, + "symbol": "SevenZipEntry.dataIsAvailable", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 8, + "symbol": "SevenZipEntryInfo", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 10, + "symbol": "SevenZipEntryInfo.Permissions", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 18, + "symbol": "SevenZipEntryInfo.Permissions.setuid", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 19, + "symbol": "SevenZipEntryInfo.Permissions.setgid", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 20, + "symbol": "SevenZipEntryInfo.Permissions.sticky", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 22, + "symbol": "SevenZipEntryInfo.Permissions.readOwner", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 23, + "symbol": "SevenZipEntryInfo.Permissions.writeOwner", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 24, + "symbol": "SevenZipEntryInfo.Permissions.executeOwner", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 26, + "symbol": "SevenZipEntryInfo.Permissions.readGroup", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 27, + "symbol": "SevenZipEntryInfo.Permissions.writeGroup", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 28, + "symbol": "SevenZipEntryInfo.Permissions.executeGroup", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 30, + "symbol": "SevenZipEntryInfo.Permissions.readOther", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 31, + "symbol": "SevenZipEntryInfo.Permissions.writeOther", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 32, + "symbol": "SevenZipEntryInfo.Permissions.executeOther", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 36, + "symbol": "SevenZipEntryInfo.DosAttributes", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 44, + "symbol": "SevenZipEntryInfo.DosAttributes.archive", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 45, + "symbol": "SevenZipEntryInfo.DosAttributes.directory", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 46, + "symbol": "SevenZipEntryInfo.DosAttributes.volume", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 47, + "symbol": "SevenZipEntryInfo.DosAttributes.system", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 48, + "symbol": "SevenZipEntryInfo.DosAttributes.hidden", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 49, + "symbol": "SevenZipEntryInfo.DosAttributes.readOnly", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 53, + "symbol": "SevenZipEntryInfo.UnixType", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 54, + "symbol": "SevenZipEntryInfo.UnixType.fifo", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 55, + "symbol": "SevenZipEntryInfo.UnixType.characterSpecial", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 56, + "symbol": "SevenZipEntryInfo.UnixType.directory", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 57, + "symbol": "SevenZipEntryInfo.UnixType.blockSpecial", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 58, + "symbol": "SevenZipEntryInfo.UnixType.regular", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 59, + "symbol": "SevenZipEntryInfo.UnixType.symbolicLink", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 60, + "symbol": "SevenZipEntryInfo.UnixType.socket", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 63, + "symbol": "SevenZipEntryInfo.name", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 64, + "symbol": "SevenZipEntryInfo.size", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 65, + "symbol": "SevenZipEntryInfo.isDirectory", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 66, + "symbol": "SevenZipEntryInfo.accessTime", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 67, + "symbol": "SevenZipEntryInfo.creationTime", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 68, + "symbol": "SevenZipEntryInfo.modificationTime", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 69, + "symbol": "SevenZipEntryInfo.winAttributes", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 71, + "symbol": "SevenZipEntryInfo.permissions", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 72, + "symbol": "SevenZipEntryInfo.dosAttributes", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 73, + "symbol": "SevenZipEntryInfo.unixType", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 75, + "symbol": "SevenZipEntryInfo.hasStream", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 76, + "symbol": "SevenZipEntryInfo.isEmpty", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 77, + "symbol": "SevenZipEntryInfo.isAnti", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", + "line": 79, + "symbol": "SevenZipEntryInfo.crc", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 9, + "symbol": "SevenZipError", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 10, + "symbol": "SevenZipError.wrongSignature", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 11, + "symbol": "SevenZipError.wrongVersion", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 12, + "symbol": "SevenZipError.wrongStartHeaderCRC", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 13, + "symbol": "SevenZipError.wrongHeaderSize", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 14, + "symbol": "SevenZipError.wrongPropertyID", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 15, + "symbol": "SevenZipError.wrongHeaderCRC", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 16, + "symbol": "SevenZipError.wrongExternal", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 17, + "symbol": "SevenZipError.reservedCodecFlags", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 18, + "symbol": "SevenZipError.unknownNumFolders", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 19, + "symbol": "SevenZipError.wrongEnd", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 20, + "symbol": "SevenZipError.externalNotSupported", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 21, + "symbol": "SevenZipError.altMethodsNotSupported", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 22, + "symbol": "SevenZipError.wrongStreamsNumber", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 23, + "symbol": "SevenZipError.multiStreamNotSupported", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 24, + "symbol": "SevenZipError.compressionNotSupported", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 25, + "symbol": "SevenZipError.wrongDataSize", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 26, + "symbol": "SevenZipError.wrongCRC", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 27, + "symbol": "SevenZipError.wrongCoderProperties", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 28, + "symbol": "SevenZipError.noPackInfo", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 29, + "symbol": "SevenZipError.wrongFileProperty", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 30, + "symbol": "SevenZipError.wrongFileNameLength", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 31, + "symbol": "SevenZipError.wrongFileNames", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 32, + "symbol": "SevenZipError.startPosNotSupported", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 33, + "symbol": "SevenZipError.incompleteProperty", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 34, + "symbol": "SevenZipError.additionalStreamsNotSupported", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 35, + "symbol": "SevenZipError.noFileSize", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 36, + "symbol": "SevenZipError.notEnoughFolders", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 37, + "symbol": "SevenZipError.notEnoughStreams", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 38, + "symbol": "SevenZipError.noStreamFound", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 39, + "symbol": "SevenZipError.noPackInfoFound", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 40, + "symbol": "SevenZipError.streamOverread", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 41, + "symbol": "SevenZipError.dataIsUnavailable", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", + "line": 42, + "symbol": "SevenZipError.encryptionNotSupported", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + } ], "source_directory": "/Users/timofeysolomko/Developer/Compression/SWCompression" } \ No newline at end of file From 0a1b356b1bc7bd845edabefcc883939ef1abb501 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Mon, 14 Aug 2017 18:49:59 +0300 Subject: [PATCH 075/113] 7z entries now always have type in entryAttributes --- Sources/7zEntry.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/7zEntry.swift b/Sources/7zEntry.swift index f921170a..ee047f49 100644 --- a/Sources/7zEntry.swift +++ b/Sources/7zEntry.swift @@ -84,6 +84,9 @@ public class SevenZipEntry: ContainerEntry { if entryInfo.isDirectory && attributesDict[FileAttributeKey.type] == nil { attributesDict[FileAttributeKey.type] = FileAttributeType.typeDirectory + } else if attributesDict[FileAttributeKey.type] == nil { + // We still need some type for an entry. + attributesDict[FileAttributeKey.type] = FileAttributeType.typeRegular } if attributesDict[FileAttributeKey.type] as? FileAttributeType == FileAttributeType.typeSymbolicLink { From 5210c16cf921ba49cb507cb69af119215dd320ae Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 15 Aug 2017 11:18:02 +0300 Subject: [PATCH 076/113] Change logic of alignment requirements in byte functions of BitReader Previously, functions like byte(), uint32(), etc had a side effect: they were silently permorming alignement (skipping all bits until next byte's boundary). I've considered this as a bad practice and now a call of align() function is required before using byte function. In addition, isAligned computed property was added to check if alignment is required. --- Sources/7zCoderInfo.swift | 2 +- Sources/7zFileInfo.swift | 14 +++++++------- Sources/7zPackInfo.swift | 2 +- Sources/7zSubstreamInfo.swift | 2 +- Sources/BitReader.swift | 21 +++++++++++++++------ Sources/Deflate.swift | 2 +- Sources/GzipArchive.swift | 2 ++ Sources/ZipEntry.swift | 4 ++-- 8 files changed, 30 insertions(+), 19 deletions(-) diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index 796a10bf..6637e02a 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -44,7 +44,7 @@ class SevenZipCoderInfo { if type == 0x0A { let definedBits = bitReader.defBits(count: numFolders) - bitReader.skipUntilNextByte() + bitReader.align() for i in 0.. UInt8 { - self.skipUntilNextByte() + precondition(isAligned, "BitReader is not aligned.") return super.byte() } override func bytes(count: Int) -> [UInt8] { - self.skipUntilNextByte() + precondition(isAligned, "BitReader is not aligned.") return super.bytes(count: count) } override func uint64(count: UInt64 = 8) -> UInt64 { - self.skipUntilNextByte() + precondition(isAligned, "BitReader is not aligned.") return super.uint64(count: count) } override func uint32(count: UInt32 = 4) -> UInt32 { - self.skipUntilNextByte() + precondition(isAligned, "BitReader is not aligned.") return super.uint32(count: count) } override func uint16(count: UInt16 = 2) -> UInt16 { - self.skipUntilNextByte() + precondition(isAligned, "BitReader is not aligned.") return super.uint16(count: count) } diff --git a/Sources/Deflate.swift b/Sources/Deflate.swift index ff35a4bc..bd96bb41 100644 --- a/Sources/Deflate.swift +++ b/Sources/Deflate.swift @@ -72,7 +72,7 @@ public class Deflate: DecompressionAlgorithm { let blockType = [UInt8](bitReader.bits(count: 2).reversed()) if blockType == [0, 0] { // Uncompressed block. - bitReader.skipUntilNextByte() + bitReader.align() /// Length of the uncompressed data. let length = bitReader.intFromBits(count: 16) /// 1-complement of the length. diff --git a/Sources/GzipArchive.swift b/Sources/GzipArchive.swift index 4021321e..1d435d42 100644 --- a/Sources/GzipArchive.swift +++ b/Sources/GzipArchive.swift @@ -77,6 +77,8 @@ public class GzipArchive: Archive { let memberData = Data(bytes: try Deflate.decompress(bitReader)) + bitReader.align() + let crc32 = bitReader.uint32() guard CheckSums.crc32(memberData) == crc32 else { throw GzipError.wrongCRC(memberData) } diff --git a/Sources/ZipEntry.swift b/Sources/ZipEntry.swift index 2467e693..9ca4cd86 100644 --- a/Sources/ZipEntry.swift +++ b/Sources/ZipEntry.swift @@ -112,7 +112,7 @@ public class ZipEntry: ContainerEntry { fileBytes = try Deflate.decompress(bitReader) // Sometimes pointerData stays in not-aligned state after deflate decompression. // Following line ensures that this is not the case. - bitReader.skipUntilNextByte() + bitReader.align() pointerData.index = bitReader.index case 12: #if (!SWCOMP_ZIP_POD_BUILD) || (SWCOMP_ZIP_POD_BUILD && SWCOMP_ZIP_POD_BZ2) @@ -120,7 +120,7 @@ public class ZipEntry: ContainerEntry { let bitReader = BitReader(data: pointerData.data, bitOrder: .straight) bitReader.index = pointerData.index fileBytes = try BZip2.decompress(bitReader) - bitReader.skipUntilNextByte() + bitReader.align() pointerData.index = bitReader.index #else throw ZipError.compressionNotSupported From 2134d635358e43f86aff8efb7f0418973abb1c6f Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 15 Aug 2017 11:37:06 +0300 Subject: [PATCH 077/113] Perform alignment of bitreader in 7z specific code of bitreader --- Sources/7zContainer.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index 972422ae..26791b51 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -259,6 +259,7 @@ extension BitReader { /// Abbreviation for "sevenZipMultiByteDecode". func szMbd() -> Int { + self.align() let firstByte = self.byte().toInt() var mask = 0x80 var value = 0 @@ -274,6 +275,7 @@ extension BitReader { } func defBits(count: Int) -> [UInt8] { + self.align() let allDefined = self.byte() let definedBits: [UInt8] if allDefined == 0 { From f21f0c7292dca34773de6f8b96c4dbe5f2c83e42 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 15 Aug 2017 12:04:22 +0300 Subject: [PATCH 078/113] Reduce usage of intFromBits function --- Sources/BZip2.swift | 8 ++++---- Sources/Deflate.swift | 12 ++++++------ Sources/ZlibHeader.swift | 25 ++++++++++++------------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/Sources/BZip2.swift b/Sources/BZip2.swift index 2c5c1f26..487bca3c 100644 --- a/Sources/BZip2.swift +++ b/Sources/BZip2.swift @@ -30,13 +30,13 @@ public class BZip2: DecompressionAlgorithm { /// An array for storing output data var out = [UInt8]() - let magic = bitReader.intFromBits(count: 16) - guard magic == 0x425a else { throw BZip2Error.wrongMagic } + let magic = bitReader.uint16() + guard magic == 0x5a42 else { throw BZip2Error.wrongMagic } - let method = bitReader.intFromBits(count: 8) + let method = bitReader.byte() guard method == 104 else { throw BZip2Error.wrongCompressionMethod } - var blockSize = bitReader.intFromBits(count: 8) + var blockSize = bitReader.byte() if blockSize >= 49 && blockSize <= 57 { blockSize -= 48 } else { diff --git a/Sources/Deflate.swift b/Sources/Deflate.swift index bd96bb41..ecf8e152 100644 --- a/Sources/Deflate.swift +++ b/Sources/Deflate.swift @@ -69,21 +69,21 @@ public class Deflate: DecompressionAlgorithm { /// Is this a last block? let isLastBit = bitReader.bit() /// Type of the current block. - let blockType = [UInt8](bitReader.bits(count: 2).reversed()) + let blockType = bitReader.intFromBits(count: 2) - if blockType == [0, 0] { // Uncompressed block. + if blockType == 0 { // Uncompressed block. bitReader.align() /// Length of the uncompressed data. - let length = bitReader.intFromBits(count: 16) + let length = bitReader.uint16() /// 1-complement of the length. - let nlength = bitReader.intFromBits(count: 16) + let nlength = bitReader.uint16() // Check if lengths are OK (nlength should be a 1-complement of length). guard length & nlength == 0 else { throw DeflateError.wrongUncompressedBlockLengths } // Process uncompressed data into the output for _ in 0..> 4 guard compressionInfo <= 7 else { throw ZlibError.wrongCompressionInfo } - let windowSize = 1 << (compressionInfo + 8) + let windowSize = 1 << (compressionInfo.toInt() + 8) self.windowSize = windowSize - // compressionMethod and compressionInfo combined are needed later for integrity check. - let cmf = compressionInfo << 4 + compressionMethod + // fcheck, fdict and compresionLevel together make flags byte which is used in integrity check. + let flags = bitReader.byte() - // Next five bits are fcheck bits which are supposed to be integrity check. - let fcheck = bitReader.intFromBits(count: 5) + // First five bits are fcheck bits which are supposed to be integrity check: + // let fcheck = flags & 0x1F // Sixth bit indicate if archive contain Adler-32 checksum of preset dictionary. - let fdict = bitReader.intFromBits(count: 1) + let fdict = (flags & 0x20) >> 5 // Remaining bits indicate compression level. - guard let compressionLevel = ZlibHeader.CompressionLevel(rawValue: - bitReader.intFromBits(count: 2)) else { throw ZlibError.wrongCompressionLevel } - + guard let compressionLevel = ZlibHeader.CompressionLevel(rawValue: (flags.toInt() & 0xC0) >> 6) + else { throw ZlibError.wrongCompressionLevel } self.compressionLevel = compressionLevel - // fcheck, fdict and compresionLevel together make flags byte which is used in integrity check. - let flags = compressionLevel.rawValue << 6 + fdict << 5 + fcheck guard (UInt(cmf) * 256 + UInt(flags)) % 31 == 0 else { throw ZlibError.wrongFcheck } // If preset dictionary is present 4 bytes will be skipped. From a9b3a110fec4f7ac1a781af1aafb765d74533965 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Tue, 15 Aug 2017 12:09:13 +0300 Subject: [PATCH 079/113] Save byte in bit functions instead of constantly access data property --- Sources/BitReader.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Sources/BitReader.swift b/Sources/BitReader.swift index 92677e33..1a4cb847 100644 --- a/Sources/BitReader.swift +++ b/Sources/BitReader.swift @@ -45,13 +45,15 @@ class BitReader: DataWithPointer { } var array: [UInt8] = Array(repeating: 0, count: count) + var byte = self.data[self.index] for i in 0.. 0 ? 1 : 0 + array[i] = byte & self.bitMask > 0 ? 1 : 0 switch self.bitOrder { case .reversed: if self.bitMask == 128 { self.index += 1 + byte = self.data[self.index] self.bitMask = 1 } else { self.bitMask <<= 1 @@ -59,6 +61,7 @@ class BitReader: DataWithPointer { case .straight: if self.bitMask == 1 { self.index += 1 + byte = self.data[self.index] self.bitMask = 128 } else { self.bitMask >>= 1 @@ -75,6 +78,7 @@ class BitReader: DataWithPointer { } var result = 0 + var byte = self.data[self.index] for i in 0.. 0 ? 1 : 0 + let bit = byte & self.bitMask > 0 ? 1 : 0 result += (1 << power) * bit switch self.bitOrder { case .reversed: if self.bitMask == 128 { self.index += 1 + byte = self.data[self.index] self.bitMask = 1 } else { self.bitMask <<= 1 @@ -98,6 +103,7 @@ class BitReader: DataWithPointer { case .straight: if self.bitMask == 1 { self.index += 1 + byte = self.data[self.index] self.bitMask = 128 } else { self.bitMask >>= 1 From 67c445491ee1f7e47d06c29c16a27daa47703b0c Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 17:03:24 +0300 Subject: [PATCH 080/113] Add isLink property to TAR --- Sources/TarEntry.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/TarEntry.swift b/Sources/TarEntry.swift index b8987042..759219ed 100644 --- a/Sources/TarEntry.swift +++ b/Sources/TarEntry.swift @@ -151,6 +151,8 @@ public class TarEntry: ContainerEntry { /// Comment associated with the entry (PAX only). public private(set) var comment: String? + public let isLink: Bool + /// Path to a linked file. public var linkPath: String? { return (paxLinkPath ?? gnuLongLinkName) ?? linkedFileName @@ -355,6 +357,7 @@ public class TarEntry: ContainerEntry { } self.entryAttributes = attributesDict + self.isLink = attributesDict[FileAttributeKey.type] as? FileAttributeType == FileAttributeType.typeSymbolicLink // File data pointerData.index = blockStartIndex + 512 From 9160abf0684d55613e10a3f5b1bc5e3cd3b2e80a Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 17:03:42 +0300 Subject: [PATCH 081/113] Add isLink and linkPath properties to ZIP --- Sources/ZipEntry.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Sources/ZipEntry.swift b/Sources/ZipEntry.swift index 9ca4cd86..1bc95ae3 100644 --- a/Sources/ZipEntry.swift +++ b/Sources/ZipEntry.swift @@ -50,6 +50,14 @@ public class ZipEntry: ContainerEntry { } } + public let isLink: Bool + + public lazy var linkPath: String? = { + guard self.isLink else { return nil } + guard let entryData = try? self.data() else { return nil } + return String(data: entryData, encoding: .utf8) + }() + /** Provides a dictionary with various attributes of the entry. `FileAttributeKey` values are used as dictionary keys. @@ -240,6 +248,7 @@ public class ZipEntry: ContainerEntry { } self.entryAttributes = attributesDict + self.isLink = attributesDict[FileAttributeKey.type] as? FileAttributeType == FileAttributeType.typeSymbolicLink } } From a29dc61183cc70be171a1e7e311711f5e6a64733 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 17:04:00 +0300 Subject: [PATCH 082/113] Add isLink and linkPath properties to ContainerEntry protocol --- Sources/Protocols.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/Protocols.swift b/Sources/Protocols.swift index 0ef05233..e2a7091b 100644 --- a/Sources/Protocols.swift +++ b/Sources/Protocols.swift @@ -41,6 +41,9 @@ public protocol ContainerEntry { /// Check if entry is a directory. var isDirectory: Bool { get } + var isLink: Bool { get } + var linkPath: String? { get } + /** Provides a dictionary with various attributes of the entry. `FileAttributeKey` values are used as dictionary keys. From f68a1f0cb7e9a0d4cc9c588c28d504f7087f0c32 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 17:04:22 +0300 Subject: [PATCH 083/113] Remove warnings about deprecation of certain TAR entry properties --- Sources/TarEntry.swift | 23 +---------------------- Sources/ZipEntry.swift | 2 +- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/Sources/TarEntry.swift b/Sources/TarEntry.swift index 759219ed..56cbd16b 100644 --- a/Sources/TarEntry.swift +++ b/Sources/TarEntry.swift @@ -44,7 +44,7 @@ public class TarEntry: ContainerEntry { return (paxPath ?? gnuLongName) ?? ((fileNamePrefix ?? "") + (fileName ?? "")) } - /// True, if an entry is a directory. + /// True, if entry is a directory. public var isDirectory: Bool { return (type == .directory) || (type == .normal && size == 0 && name.characters.last == "/") } @@ -77,57 +77,36 @@ public class TarEntry: ContainerEntry { /** File mode. - - - Warning: - Deprecated and will be removed in 4.0. Use `entryAttributes` instead. */ public let mode: Int? /** Owner's ID. - - - Warning: - Deprecated and will be removed in 4.0. Use `entryAttributes` instead. */ public private(set) var ownerID: Int? /** Owner's group ID. - - - Warning: - Deprecated and will be removed in 4.0. Use `entryAttributes` instead. */ public private(set) var groupID: Int? /** The most recent modification time of the original file or directory. - - - Warning: - Deprecated and will be removed in 4.0. Use `entryAttributes` instead. */ public private(set) var modificationTime: Date /** Type of entry. - - - Warning: - Deprecated and will be removed in 4.0. Use `entryAttributes` instead. */ public let type: EntryType /** Owner's user name. - - - Warning: - Deprecated and will be removed in 4.0. Use `entryAttributes` instead. */ public private(set) var ownerUserName: String? /** Owner's group name. - - - Warning: - Deprecated and will be removed in 4.0. Use `entryAttributes` instead. */ public private(set) var ownerGroupName: String? diff --git a/Sources/ZipEntry.swift b/Sources/ZipEntry.swift index 1bc95ae3..99359659 100644 --- a/Sources/ZipEntry.swift +++ b/Sources/ZipEntry.swift @@ -38,7 +38,7 @@ public class ZipEntry: ContainerEntry { } /** - True, if an entry is a directory. + True, if entry is a directory. For MS-DOS and UNIX-like container creator's OS, the result is based on 'external file attributes'. Otherwise, it is true if size of data is 0 AND last character of entry's name is '/'. */ From e6b50095ed1153cd169ca03fe6ce771d4cfb08a0 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 17:47:48 +0300 Subject: [PATCH 084/113] Add test for multithreaded calls of ZipEntry.data() --- Tests/ZipTests.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Tests/ZipTests.swift b/Tests/ZipTests.swift index 2aa34128..84634392 100644 --- a/Tests/ZipTests.swift +++ b/Tests/ZipTests.swift @@ -28,6 +28,24 @@ class ZipTests: XCTestCase { #endif } + func testMultiThreading() throws { + guard let testURL = Constants.url(forTest: "SWCompressionSourceCode", withType: ZipTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + let testData = try Data(contentsOf: testURL, options: .mappedIfSafe) + let entries = try ZipContainer.open(container: testData) + + XCTAssertEqual(entries.count, 211) + + for entry in entries { + DispatchQueue.global(qos: .userInitiated).async { + XCTAssertNotNil(try? entry.data()) + } + } + } + func testZip64() throws { guard let testURL = Constants.url(forTest: "TestZip64", withType: ZipTests.testType) else { XCTFail("Unable to get test's URL.") From fe7442335685bd0b941d61ed5706dc5325d497be Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 17:48:25 +0300 Subject: [PATCH 085/113] Fix problems when ZipEntry.data() is called multithreadingly --- Sources/ZipEntry.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Sources/ZipEntry.swift b/Sources/ZipEntry.swift index 99359659..cbb178b0 100644 --- a/Sources/ZipEntry.swift +++ b/Sources/ZipEntry.swift @@ -10,7 +10,7 @@ public class ZipEntry: ContainerEntry { private let cdEntry: ZipCentralDirectoryEntry private var localHeader: ZipLocalHeader? - private var pointerData: DataWithPointer + private let containerData: Data /// Name of the file or directory. public var name: String { @@ -83,6 +83,7 @@ public class ZipEntry: ContainerEntry { */ public func data() throws -> Data { // Now, let's move to the location of local header. + let pointerData = DataWithPointer(data: self.containerData) pointerData.index = Int(UInt32(truncatingBitPattern: self.cdEntry.offset)) if localHeader == nil { @@ -171,7 +172,7 @@ public class ZipEntry: ContainerEntry { init(_ cdEntry: ZipCentralDirectoryEntry, _ pointerData: DataWithPointer) { self.cdEntry = cdEntry - self.pointerData = pointerData + self.containerData = pointerData.data var attributesDict = [FileAttributeKey: Any]() From a0d150c68c74eb7c4de41fac285407b835758ec7 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 17:55:39 +0300 Subject: [PATCH 086/113] Add isTextFile property to ZipEntry --- Sources/ZipEntry.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Sources/ZipEntry.swift b/Sources/ZipEntry.swift index cbb178b0..b2cad636 100644 --- a/Sources/ZipEntry.swift +++ b/Sources/ZipEntry.swift @@ -58,6 +58,10 @@ public class ZipEntry: ContainerEntry { return String(data: entryData, encoding: .utf8) }() + public var isTextFile: Bool { + return cdEntry.internalFileAttributes & 0x1 != 0 + } + /** Provides a dictionary with various attributes of the entry. `FileAttributeKey` values are used as dictionary keys. From 7f78732973e23e194f6afd0cea92d5785bc80ada Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 18:06:49 +0300 Subject: [PATCH 087/113] Add Date extension with initializer from ntfs time --- SWCompression.xcodeproj/project.pbxproj | 10 ++++++++++ Sources/Date+NtfsTime.swift | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 Sources/Date+NtfsTime.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 784d0e02..04465ab0 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -133,6 +133,10 @@ 066348D51F35E7F500F3DC7D /* test_complicated_coding_scheme.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D11F35E7F500F3DC7D /* test_complicated_coding_scheme.7z */; }; 066348D61F35E7F500F3DC7D /* test_encrypted_header.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D21F35E7F500F3DC7D /* test_encrypted_header.7z */; }; 066348D71F35E7F500F3DC7D /* test_single_thread.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D31F35E7F500F3DC7D /* test_single_thread.7z */; }; + 0663FDE31F4494AD00910A90 /* Date+NtfsTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */; }; + 0663FDE41F4494AD00910A90 /* Date+NtfsTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */; }; + 0663FDE51F4494AD00910A90 /* Date+NtfsTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */; }; + 0663FDE61F4494AD00910A90 /* Date+NtfsTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */; }; 067518361E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518371E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518381E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; @@ -382,6 +386,7 @@ 066348D11F35E7F500F3DC7D /* test_complicated_coding_scheme.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_complicated_coding_scheme.7z; sourceTree = ""; }; 066348D21F35E7F500F3DC7D /* test_encrypted_header.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_encrypted_header.7z; sourceTree = ""; }; 066348D31F35E7F500F3DC7D /* test_single_thread.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_single_thread.7z; sourceTree = ""; }; + 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Date+NtfsTime.swift"; path = "Sources/Date+NtfsTime.swift"; sourceTree = SOURCE_ROOT; }; 067518351E2A86F700D16354 /* ZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipContainer.swift; sourceTree = ""; }; 0675183C1E2A883600D16354 /* ZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipTests.swift; sourceTree = ""; }; 0680E1B01DDA2D7C005C05EB /* ZlibTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibTests.swift; sourceTree = ""; }; @@ -706,6 +711,7 @@ 06A3931F1DE06FFE00182E12 /* Common */ = { isa = PBXGroup; children = ( + 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */, 06E234811E06A6C200F18798 /* CheckSums.swift */, 06CDFCB61F111E6900292758 /* BitReader.swift */, 063DF1051DE1F07800F38082 /* DataWithPointer.swift */, @@ -1208,6 +1214,7 @@ 06595E0F1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1141DE1F07800F38082 /* HuffmanTree.swift in Sources */, 06595E141F1E90C2006501C2 /* 7zCoder.swift in Sources */, + 0663FDE41F4494AD00910A90 /* Date+NtfsTime.swift in Sources */, 06CDFCA91F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF11E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06491F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1266,6 +1273,7 @@ 06595E101F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF11C1DE1F2E200F38082 /* HuffmanTree.swift in Sources */, 06595E151F1E90C2006501C2 /* 7zCoder.swift in Sources */, + 0663FDE51F4494AD00910A90 /* Date+NtfsTime.swift in Sources */, 06CDFCAA1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF21E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064A1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1324,6 +1332,7 @@ 06595E111F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1151DE1F07800F38082 /* HuffmanTree.swift in Sources */, 06595E161F1E90C2006501C2 /* 7zCoder.swift in Sources */, + 0663FDE61F4494AD00910A90 /* Date+NtfsTime.swift in Sources */, 06CDFCAB1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF31E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064B1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1382,6 +1391,7 @@ 06595E0E1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1131DE1F07800F38082 /* HuffmanTree.swift in Sources */, 06595E131F1E90C2006501C2 /* 7zCoder.swift in Sources */, + 0663FDE31F4494AD00910A90 /* Date+NtfsTime.swift in Sources */, 06CDFCA81F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF01E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06481F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, diff --git a/Sources/Date+NtfsTime.swift b/Sources/Date+NtfsTime.swift new file mode 100644 index 00000000..4693ce7d --- /dev/null +++ b/Sources/Date+NtfsTime.swift @@ -0,0 +1,22 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +extension Date { + + init?(from ntfsTime: UInt64?) { + if let time = ntfsTime, + let ntfsStartDate = DateComponents(calendar: Calendar(identifier: .iso8601), + timeZone: TimeZone(abbreviation: "UTC"), + year: 1601, month: 1,day: 1, + hour: 0, minute: 0, second: 0).date { + self.init(timeInterval: TimeInterval(time) / 10_000_000, since: ntfsStartDate) + } else { + return nil + } + } + +} From 288e34179caebec5bc7bcfdb09b0504b15aa99c3 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 18:07:05 +0300 Subject: [PATCH 088/113] Use new Date extension in 7z --- Sources/7zEntryInfo.swift | 34 ++++------------------------------ 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/Sources/7zEntryInfo.swift b/Sources/7zEntryInfo.swift index 2f354858..bbf4fc64 100644 --- a/Sources/7zEntryInfo.swift +++ b/Sources/7zEntryInfo.swift @@ -84,25 +84,11 @@ public struct SevenZipEntryInfo { self.isAnti = file.isAntiFile self.name = file.name - self.isDirectory = file.isEmptyStream && !file.isEmptyFile // TODO: Do we need this??? + self.isDirectory = file.isEmptyStream && !file.isEmptyFile - if let aTime = SevenZipEntryInfo.ntfsTimeToDate(file.aTime) { - self.accessTime = aTime - } else { - self.accessTime = nil - } - - if let cTime = SevenZipEntryInfo.ntfsTimeToDate(file.cTime) { - self.creationTime = cTime - } else { - self.creationTime = nil - } - - if let mTime = SevenZipEntryInfo.ntfsTimeToDate(file.mTime) { - self.modificationTime = mTime - } else { - self.modificationTime = nil - } + self.accessTime = Date(from: file.aTime) + self.creationTime = Date(from: file.cTime) + self.modificationTime = Date(from: file.mTime) if let attributes = file.winAttributes { self.winAttributes = attributes @@ -120,16 +106,4 @@ public struct SevenZipEntryInfo { self.size = size } - private static func ntfsTimeToDate(_ time: UInt64?) -> Date? { - if let time = time { - return DateComponents(calendar: Calendar(identifier: .iso8601), - timeZone: TimeZone(abbreviation: "UTC"), - year: 1601, month: 1, day: 1, - hour: 0, minute: 0, second: 0).date? - .addingTimeInterval(TimeInterval(time) / 10_000_000) - } else { - return nil - } - } - } From 15b9169448fcf5359c49c133f6dd9fe3da75f4f6 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 18:30:36 +0300 Subject: [PATCH 089/113] Add support for NTFS extra field in ZIP --- Sources/ZipCentralDirectoryEntry.swift | 19 +++++++++++++++++++ Sources/ZipEntry.swift | 8 ++++++++ Sources/ZipLocalHeader.swift | 19 +++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/Sources/ZipCentralDirectoryEntry.swift b/Sources/ZipCentralDirectoryEntry.swift index 456cd062..7cedcab6 100644 --- a/Sources/ZipCentralDirectoryEntry.swift +++ b/Sources/ZipCentralDirectoryEntry.swift @@ -29,6 +29,10 @@ struct ZipCentralDirectoryEntry { private(set) var modificationTimestamp: UInt32? + private(set) var ntfsMtime: UInt64? + private(set) var ntfsAtime: UInt64? + private(set) var ntfsCtime: UInt64? + init(_ pointerData: DataWithPointer, _ currentDiskNumber: UInt32) throws { // Check signature. guard pointerData.uint32() == 0x02014b50 @@ -90,6 +94,21 @@ struct ZipCentralDirectoryEntry { if flags & 0x01 != 0 { self.modificationTimestamp = pointerData.uint32() } + case 0x000a: // NTFS Extra Fields + let ntfsExtraFieldsStartIndex = pointerData.index + pointerData.index += 4 // Skipping reserved bytes. + while pointerData.index - ntfsExtraFieldsStartIndex < size { + let tag = pointerData.uint16() + pointerData.index += 2 // Skipping size of attributes for this tag. + switch tag { + case 0x0001: + self.ntfsMtime = pointerData.uint64() + self.ntfsAtime = pointerData.uint64() + self.ntfsCtime = pointerData.uint64() + default: + break + } + } default: pointerData.index += size } diff --git a/Sources/ZipEntry.swift b/Sources/ZipEntry.swift index b2cad636..d267fe56 100644 --- a/Sources/ZipEntry.swift +++ b/Sources/ZipEntry.swift @@ -205,6 +205,14 @@ public class ZipEntry: ContainerEntry { attributesDict[FileAttributeKey.modificationDate] = Date(timeIntervalSince1970: TimeInterval(mtimestamp)) } + // NTFS Extra Fields + if let mtime = Date(from: cdEntry.ntfsMtime) { + attributesDict[FileAttributeKey.modificationDate] = mtime + } + if let ctime = Date(from: cdEntry.ntfsCtime) { + attributesDict[FileAttributeKey.creationDate] = ctime + } + // Size attributesDict[FileAttributeKey.size] = cdEntry.uncompSize diff --git a/Sources/ZipLocalHeader.swift b/Sources/ZipLocalHeader.swift index 40edd0e7..39d028ea 100644 --- a/Sources/ZipLocalHeader.swift +++ b/Sources/ZipLocalHeader.swift @@ -25,6 +25,10 @@ struct ZipLocalHeader { private(set) var accessTimestamp: UInt32? private(set) var creationTimestamp: UInt32? + private(set) var ntfsMtime: UInt64? + private(set) var ntfsAtime: UInt64? + private(set) var ntfsCtime: UInt64? + let headerSize: Int init(_ pointerData: DataWithPointer) throws { @@ -79,6 +83,21 @@ struct ZipLocalHeader { if flags & 0x04 != 0 { self.creationTimestamp = pointerData.uint32() } + case 0x000a: // NTFS Extra Fields + let ntfsExtraFieldsStartIndex = pointerData.index + pointerData.index += 4 // Skipping reserved bytes. + while pointerData.index - ntfsExtraFieldsStartIndex < size { + let tag = pointerData.uint16() + pointerData.index += 2 // Skipping size of attributes for this tag. + switch tag { + case 0x0001: + self.ntfsMtime = pointerData.uint64() + self.ntfsAtime = pointerData.uint64() + self.ntfsCtime = pointerData.uint64() + default: + break + } + } default: pointerData.index += size } From e40ddacd073a2627cb3ecf62f91c0875fcc9d8cd Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 18:36:18 +0300 Subject: [PATCH 090/113] Fix incorrect posixPermissions in tar in some cases Sometimes "mode" fields also includes unix type which we haven't accounted for. --- Sources/TarEntry.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/TarEntry.swift b/Sources/TarEntry.swift index 56cbd16b..24b205e8 100644 --- a/Sources/TarEntry.swift +++ b/Sources/TarEntry.swift @@ -168,13 +168,14 @@ public class TarEntry: ContainerEntry { var attributesDict = [FileAttributeKey: Any]() let blockStartIndex = pointerData.index + // File name fileName = try pointerData.nullEndedAsciiString(cutoff: 100) // File mode guard let octalPosixPermissions = Int(try pointerData.nullSpaceEndedAsciiString(cutoff: 8)) else { throw TarError.fieldIsNotNumber } - let posixPermissions = octalPosixPermissions.octalToDecimal() + let posixPermissions = octalPosixPermissions.octalToDecimal() & 0xFFF attributesDict[FileAttributeKey.posixPermissions] = posixPermissions mode = posixPermissions From 626c1f7b628d07e203f97e8cec91b874a4a13294 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 20:26:33 +0300 Subject: [PATCH 091/113] Change utf8 detection alogrithm in zip to favor more cp437 --- Sources/ZipCommon.swift | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Sources/ZipCommon.swift b/Sources/ZipCommon.swift index 3c26d840..0a8b986c 100644 --- a/Sources/ZipCommon.swift +++ b/Sources/ZipCommon.swift @@ -20,8 +20,11 @@ class ZipCommon { #endif static func getStringField(_ pointerData: DataWithPointer, _ length: Int, _ useUtf8: Bool) -> String? { + if length == 0 { + return "" + } let bytes = pointerData.bytes(count: length) - let bytesAreUtf8 = ZipCommon.isUtf8(bytes) + let bytesAreUtf8 = ZipCommon.needsUtf8(bytes) if !useUtf8 && ZipCommon.cp437Available && !bytesAreUtf8 { return String(data: Data(bytes: bytes), encoding: String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(ZipCommon.cp437Encoding))) @@ -30,17 +33,25 @@ class ZipCommon { } } - static func isUtf8(_ bytes: [UInt8]) -> Bool { + static func needsUtf8(_ bytes: [UInt8]) -> Bool { + // UTF-8 can have BOM. + if bytes.count >= 3 { + if bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF { + return true + } + } var codeLength = 0 var index = 0 var ch: UInt32 = 0 while index < bytes.count { let byte = bytes[index] - if byte <= 0x7F { + if byte <= 0x7F { // This simple bytes can both exist in CP437 and UTF-8. index += 1 continue } + // Otherwise, it has to be correct code sequence in case of UTF-8. + // If code sequence is incorrect, then it is CP437. if byte >= 0xC2 && byte <= 0xDF { codeLength = 2 } else if byte >= 0xE0 && byte <= 0xEF { @@ -77,8 +88,11 @@ class ZipCommon { } } index += codeLength + return true } - return true + // All bytes were in range 0...0x7F, which can be both in CP437 and UTF-8. + // We solve this ambiguity in favor of CP437. + return false } } From ce4e12ac18bd5241dea5abad8a457679b72bdfbb Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 21:36:12 +0300 Subject: [PATCH 092/113] Rework XZ so multiByteDecode doesn't return tuples --- Sources/XZArchive.swift | 114 ++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 70 deletions(-) diff --git a/Sources/XZArchive.swift b/Sources/XZArchive.swift index a3d2f71e..0427b1ea 100644 --- a/Sources/XZArchive.swift +++ b/Sources/XZArchive.swift @@ -125,7 +125,7 @@ public class XZArchive: Archive { var blockInfos: [(unpaddedSize: Int, uncompSize: Int)] = [] var indexSize = -1 while true { - let blockHeaderSize = pointerData.byte() + let blockHeaderSize = pointerData.byte().toInt() if blockHeaderSize == 0 { indexSize = try processIndex(blockInfos, pointerData) break @@ -162,7 +162,7 @@ public class XZArchive: Archive { return Data(bytes: out) } - private static func processStreamHeader(_ pointerData: DataWithPointer) throws -> (checkType: UInt8, flagsCRC: UInt32) { + private static func processStreamHeader(_ pointerData: DataWithPointer) throws -> (checkType: Int, flagsCRC: UInt32) { // Check magic number. guard pointerData.bytes(count: 6) == [0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00] else { throw XZError.wrongMagic } @@ -180,7 +180,7 @@ public class XZArchive: Archive { else { throw XZError.fieldReservedValue } // Four bits of second flags byte indicate type of redundancy check. - let checkType = flagsBytes[1] & 0x0F + let checkType = flagsBytes[1].toInt() & 0xF switch checkType { case 0x00, 0x01, 0x04, 0x0A: break @@ -191,17 +191,14 @@ public class XZArchive: Archive { return (checkType, flagsCRC) } - private static func processBlock(_ blockHeaderSize: UInt8, + private static func processBlock(_ blockHeaderSize: Int, _ pointerData: DataWithPointer) throws -> (blockData: [UInt8], unpaddedSize: Int, uncompressedSize: Int) { - var blockBytes: [UInt8] = [] let blockHeaderStartIndex = pointerData.index - 1 - blockBytes.append(blockHeaderSize) guard blockHeaderSize >= 0x01 && blockHeaderSize <= 0xFF else { throw XZError.wrongFieldValue } let realBlockHeaderSize = (blockHeaderSize + 1) * 4 let blockFlags = pointerData.byte() - blockBytes.append(blockFlags) /** Bit values 00, 01, 10, 11 indicate filters number from 1 to 4, so we actually need to add 1 to get filters' number. @@ -211,41 +208,24 @@ public class XZArchive: Archive { else { throw XZError.fieldReservedValue } /// Should match size of compressed data. - var compressedSize = -1 - if blockFlags & 0x40 != 0 { - let compressedSizeDecodeResult = try pointerData.multiByteDecode() - compressedSize = compressedSizeDecodeResult.multiByteInteger - guard compressedSize > 0 - else { throw XZError.wrongFieldValue } - blockBytes.append(contentsOf: compressedSizeDecodeResult.bytesProcessed) - } + let compressedSize = blockFlags & 0x40 != 0 ? try pointerData.multiByteDecode() : -1 /// Should match the size of data after decompression. - var uncompressedSize = -1 - if blockFlags & 0x80 != 0 { - let uncompressedSizeDecodeResult = try pointerData.multiByteDecode() - uncompressedSize = uncompressedSizeDecodeResult.multiByteInteger - guard uncompressedSize > 0 - else { throw XZError.wrongFieldValue } - blockBytes.append(contentsOf: uncompressedSizeDecodeResult.bytesProcessed) - } + let uncompressedSize = blockFlags & 0x80 != 0 ? try pointerData.multiByteDecode() : -1 // TODO: First parse, then use. var filters: [(DataWithPointer) throws -> [UInt8]] = [] for _ in 0.. [UInt8] in try LZMA2.decompress(LZMA2.dictionarySize(filterPropeties), dwp) } @@ -256,16 +236,17 @@ public class XZArchive: Archive { } // We need to take into account 4 bytes for CRC32 so thats why "-4". - while pointerData.index - blockHeaderStartIndex < realBlockHeaderSize.toInt() - 4 { + while pointerData.index - blockHeaderStartIndex < realBlockHeaderSize - 4 { let byte = pointerData.byte() guard byte == 0x00 else { throw XZError.wrongPadding } - blockBytes.append(byte) } let blockHeaderCRC = pointerData.uint32() - guard CheckSums.crc32(blockBytes) == blockHeaderCRC + pointerData.index = blockHeaderStartIndex + guard CheckSums.crc32(pointerData.bytes(count: realBlockHeaderSize - 4)) == blockHeaderCRC else { throw XZError.wrongInfoCRC } + pointerData.index += 4 var intResult = pointerData let compressedDataStart = pointerData.index @@ -273,11 +254,11 @@ public class XZArchive: Archive { var arrayResult = try filters[numberOfFilters.toInt() - filterIndex.toInt() - 1](intResult) intResult = DataWithPointer(array: &arrayResult) } - guard compressedSize == -1 || compressedSize == pointerData.index - compressedDataStart + guard compressedSize < 0 || compressedSize == pointerData.index - compressedDataStart else { throw XZError.wrongDataSize } let out = try filters[numberOfFilters.toInt() - 1](intResult) - guard uncompressedSize == -1 || uncompressedSize == out.count + guard uncompressedSize < 0 || uncompressedSize == out.count else { throw XZError.wrongDataSize } let unpaddedSize = pointerData.index - blockHeaderStartIndex @@ -296,66 +277,62 @@ public class XZArchive: Archive { private static func processIndex(_ blockInfos: [(unpaddedSize: Int, uncompSize: Int)], _ pointerData: DataWithPointer) throws -> Int { - var indexBytes: [UInt8] = [0x00] - let numberOfRecordsTuple = try pointerData.multiByteDecode() - indexBytes.append(contentsOf: numberOfRecordsTuple.bytesProcessed) - let numberOfRecords = numberOfRecordsTuple.multiByteInteger - guard numberOfRecords == blockInfos.count + let indexStartIndex = pointerData.index - 1 + let recordsCount = try pointerData.multiByteDecode() + guard recordsCount == blockInfos.count else { throw XZError.wrongFieldValue } + for blockInfo in blockInfos { - let unpaddedSizeTuple = try pointerData.multiByteDecode() - guard unpaddedSizeTuple.multiByteInteger == blockInfo.unpaddedSize + let unpaddedSize = try pointerData.multiByteDecode() + guard unpaddedSize == blockInfo.unpaddedSize else { throw XZError.wrongFieldValue } - indexBytes.append(contentsOf: unpaddedSizeTuple.bytesProcessed) - let uncompSizeTuple = try pointerData.multiByteDecode() - guard uncompSizeTuple.multiByteInteger == blockInfo.uncompSize + let uncompSize = try pointerData.multiByteDecode() + guard uncompSize == blockInfo.uncompSize else { throw XZError.wrongDataSize } - indexBytes.append(contentsOf: uncompSizeTuple.bytesProcessed) } - if indexBytes.count % 4 != 0 { - let paddingSize = 4 - indexBytes.count % 4 + var indexSize = pointerData.index - indexStartIndex + if indexSize % 4 != 0 { + let paddingSize = 4 - indexSize % 4 for _ in 0..> 8 == streamHeader.checkType else { throw XZError.wrongFieldValue } - guard footerStreamFlags[1] & 0xF0 == 0 + guard streamFooterFlags & 0xF000 == 0 else { throw XZError.fieldReservedValue } // Check footer's magic number @@ -367,13 +344,11 @@ public class XZArchive: Archive { fileprivate extension DataWithPointer { - // TODO: Removed `bytesProcessed`. - fileprivate func multiByteDecode() throws -> (multiByteInteger: Int, bytesProcessed: [UInt8]) { + fileprivate func multiByteDecode() throws -> Int { var i = 1 var result = self.byte().toInt() - var bytes: [UInt8] = [result.toUInt8()] if result <= 127 { - return (result, bytes) + return result } result &= 0x7F while self.previousByte & 0x80 != 0 { @@ -381,11 +356,10 @@ fileprivate extension DataWithPointer { if i >= 9 || byte == 0x00 { throw XZError.multiByteIntegerError } - bytes.append(byte) result += (byte.toInt() & 0x7F) << (7 * i) i += 1 } - return (result, bytes) + return result } } From 3bfce7fe7fd285508c42b0285e90aeaa54da1462 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 21:36:28 +0300 Subject: [PATCH 093/113] Move Date extension into Extensions file --- SWCompression.xcodeproj/project.pbxproj | 10 ---------- Sources/Date+NtfsTime.swift | 22 ---------------------- Sources/Extensions.swift | 16 ++++++++++++++++ 3 files changed, 16 insertions(+), 32 deletions(-) delete mode 100644 Sources/Date+NtfsTime.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index 04465ab0..784d0e02 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -133,10 +133,6 @@ 066348D51F35E7F500F3DC7D /* test_complicated_coding_scheme.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D11F35E7F500F3DC7D /* test_complicated_coding_scheme.7z */; }; 066348D61F35E7F500F3DC7D /* test_encrypted_header.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D21F35E7F500F3DC7D /* test_encrypted_header.7z */; }; 066348D71F35E7F500F3DC7D /* test_single_thread.7z in Resources */ = {isa = PBXBuildFile; fileRef = 066348D31F35E7F500F3DC7D /* test_single_thread.7z */; }; - 0663FDE31F4494AD00910A90 /* Date+NtfsTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */; }; - 0663FDE41F4494AD00910A90 /* Date+NtfsTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */; }; - 0663FDE51F4494AD00910A90 /* Date+NtfsTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */; }; - 0663FDE61F4494AD00910A90 /* Date+NtfsTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */; }; 067518361E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518371E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; 067518381E2A86F700D16354 /* ZipContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067518351E2A86F700D16354 /* ZipContainer.swift */; }; @@ -386,7 +382,6 @@ 066348D11F35E7F500F3DC7D /* test_complicated_coding_scheme.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_complicated_coding_scheme.7z; sourceTree = ""; }; 066348D21F35E7F500F3DC7D /* test_encrypted_header.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_encrypted_header.7z; sourceTree = ""; }; 066348D31F35E7F500F3DC7D /* test_single_thread.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_single_thread.7z; sourceTree = ""; }; - 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Date+NtfsTime.swift"; path = "Sources/Date+NtfsTime.swift"; sourceTree = SOURCE_ROOT; }; 067518351E2A86F700D16354 /* ZipContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipContainer.swift; sourceTree = ""; }; 0675183C1E2A883600D16354 /* ZipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipTests.swift; sourceTree = ""; }; 0680E1B01DDA2D7C005C05EB /* ZlibTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZlibTests.swift; sourceTree = ""; }; @@ -711,7 +706,6 @@ 06A3931F1DE06FFE00182E12 /* Common */ = { isa = PBXGroup; children = ( - 0663FDE21F4494AD00910A90 /* Date+NtfsTime.swift */, 06E234811E06A6C200F18798 /* CheckSums.swift */, 06CDFCB61F111E6900292758 /* BitReader.swift */, 063DF1051DE1F07800F38082 /* DataWithPointer.swift */, @@ -1214,7 +1208,6 @@ 06595E0F1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1141DE1F07800F38082 /* HuffmanTree.swift in Sources */, 06595E141F1E90C2006501C2 /* 7zCoder.swift in Sources */, - 0663FDE41F4494AD00910A90 /* Date+NtfsTime.swift in Sources */, 06CDFCA91F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF11E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06491F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1273,7 +1266,6 @@ 06595E101F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF11C1DE1F2E200F38082 /* HuffmanTree.swift in Sources */, 06595E151F1E90C2006501C2 /* 7zCoder.swift in Sources */, - 0663FDE51F4494AD00910A90 /* Date+NtfsTime.swift in Sources */, 06CDFCAA1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF21E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064A1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1332,7 +1324,6 @@ 06595E111F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1151DE1F07800F38082 /* HuffmanTree.swift in Sources */, 06595E161F1E90C2006501C2 /* 7zCoder.swift in Sources */, - 0663FDE61F4494AD00910A90 /* Date+NtfsTime.swift in Sources */, 06CDFCAB1F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF31E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C064B1F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, @@ -1391,7 +1382,6 @@ 06595E0E1F1E8252006501C2 /* 7zFolder.swift in Sources */, 063DF1131DE1F07800F38082 /* HuffmanTree.swift in Sources */, 06595E131F1E90C2006501C2 /* 7zCoder.swift in Sources */, - 0663FDE31F4494AD00910A90 /* Date+NtfsTime.swift in Sources */, 06CDFCA81F111D9700292758 /* DeflateError.swift in Sources */, 069D0FF01E0D6CB600D8AA87 /* LZMARangeDecoder.swift in Sources */, 061C06481F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift in Sources */, diff --git a/Sources/Date+NtfsTime.swift b/Sources/Date+NtfsTime.swift deleted file mode 100644 index 4693ce7d..00000000 --- a/Sources/Date+NtfsTime.swift +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2017 Timofey Solomko -// Licensed under MIT License -// -// See LICENSE for license information - -import Foundation - -extension Date { - - init?(from ntfsTime: UInt64?) { - if let time = ntfsTime, - let ntfsStartDate = DateComponents(calendar: Calendar(identifier: .iso8601), - timeZone: TimeZone(abbreviation: "UTC"), - year: 1601, month: 1,day: 1, - hour: 0, minute: 0, second: 0).date { - self.init(timeInterval: TimeInterval(time) / 10_000_000, since: ntfsStartDate) - } else { - return nil - } - } - -} diff --git a/Sources/Extensions.swift b/Sources/Extensions.swift index 883a5fec..6736c71d 100644 --- a/Sources/Extensions.swift +++ b/Sources/Extensions.swift @@ -67,3 +67,19 @@ extension Int { } } + +extension Date { + + init?(from ntfsTime: UInt64?) { + if let time = ntfsTime, + let ntfsStartDate = DateComponents(calendar: Calendar(identifier: .iso8601), + timeZone: TimeZone(abbreviation: "UTC"), + year: 1601, month: 1,day: 1, + hour: 0, minute: 0, second: 0).date { + self.init(timeInterval: TimeInterval(time) / 10_000_000, since: ntfsStartDate) + } else { + return nil + } + } + +} From c155b3910d9cd00682300b02545ea3d68cf4b5b2 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 21:51:53 +0300 Subject: [PATCH 094/113] Remove rawUnpackSize from 7z.open() --- Sources/7zContainer.swift | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index 26791b51..777d79f1 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -38,12 +38,6 @@ public class SevenZipContainer: Container { /// `DataWithPointer` object with unpacked stream's data. var rawFileData = DataWithPointer(data: Data()) - /** - Total size of processed unpacked data for current stream. - Used to decide when to switch streams. - */ - var rawUnpackSize = 0 - let pointerData = DataWithPointer(data: data) for fileIndex in 0.. Date: Wed, 16 Aug 2017 21:52:37 +0300 Subject: [PATCH 095/113] Store unknown properties of 7z file info --- Sources/7zCoderInfo.swift | 2 +- Sources/7zError.swift | 1 - Sources/7zFileInfo.swift | 25 ++++++++++++------------- Sources/7zHeader.swift | 4 ---- Sources/XZArchive.swift | 1 - 5 files changed, 13 insertions(+), 20 deletions(-) diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index 6637e02a..79f4952b 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -25,7 +25,7 @@ class SevenZipCoderInfo { external = bitReader.byte() guard external == 0 - else { throw SevenZipError.externalNotSupported } // TODO: Do we support this? + else { throw SevenZipError.externalNotSupported } for _ in 0..= propertySize else { throw SevenZipError.incompleteProperty } bitReader.index += propertySize - default: // Unknown property // TODO: Maybe we should store it for testing. + default: // Unknown property guard bitReader.size - bitReader.index >= propertySize else { throw SevenZipError.incompleteProperty } - bitReader.index += propertySize + unknownProperties.append(SevenZipProperty(propertyType, propertySize, + bitReader.bytes(count: propertySize))) } } diff --git a/Sources/7zHeader.swift b/Sources/7zHeader.swift index 969a059c..16b2f7e8 100644 --- a/Sources/7zHeader.swift +++ b/Sources/7zHeader.swift @@ -21,11 +21,7 @@ class SevenZipHeader { } if type == 0x03 { - // TODO: Do we support this? - // TODO: Or it can be more than one? throw SevenZipError.additionalStreamsNotSupported -// additionalStreams = try SevenZipStreamInfo(bitReader) -// type = bitReader.byte() } if type == 0x04 { diff --git a/Sources/XZArchive.swift b/Sources/XZArchive.swift index 0427b1ea..c449976c 100644 --- a/Sources/XZArchive.swift +++ b/Sources/XZArchive.swift @@ -213,7 +213,6 @@ public class XZArchive: Archive { /// Should match the size of data after decompression. let uncompressedSize = blockFlags & 0x80 != 0 ? try pointerData.multiByteDecode() : -1 - // TODO: First parse, then use. var filters: [(DataWithPointer) throws -> [UInt8]] = [] for _ in 0.. Date: Wed, 16 Aug 2017 21:55:29 +0300 Subject: [PATCH 096/113] Rename build flags used in cocoapods configurations --- SWCompression.podspec | 6 +++--- Sources/ZipEntry.swift | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SWCompression.podspec b/SWCompression.podspec index d88d479d..c1d0978d 100644 --- a/SWCompression.podspec +++ b/SWCompression.podspec @@ -44,12 +44,12 @@ Pod::Spec.new do |s| s.subspec 'BZip2' do |sp| sp.source_files = 'Sources/{BZip2,BZip2Error,Extensions,Protocols,CheckSums,DataWithPointer,BitReader,HuffmanTree,BitWriter}.swift' - sp.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-DSWCOMP_ZIP_POD_BZ2' } + sp.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-DSWCOMPRESSION_POD_BZ2' } end s.subspec 'LZMA' do |sp| sp.source_files = 'Sources/{LZMA*,Extensions,Protocols,DataWithPointer}.swift' - sp.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-DSWCOMP_ZIP_POD_LZMA' } + sp.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-DSWCOMPRESSION_POD_LZMA' } end s.subspec 'XZ' do |sp| @@ -60,7 +60,7 @@ Pod::Spec.new do |s| s.subspec 'ZIP' do |sp| sp.dependency 'SWCompression/Deflate' sp.source_files = 'Sources/{Zip*,CheckSums}.swift' - sp.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-DSWCOMP_ZIP_POD_BUILD' } + sp.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-DSWCOMPRESSION_POD_ZIP' } end s.subspec 'TAR' do |sp| diff --git a/Sources/ZipEntry.swift b/Sources/ZipEntry.swift index d267fe56..4f60b923 100644 --- a/Sources/ZipEntry.swift +++ b/Sources/ZipEntry.swift @@ -128,7 +128,7 @@ public class ZipEntry: ContainerEntry { bitReader.align() pointerData.index = bitReader.index case 12: - #if (!SWCOMP_ZIP_POD_BUILD) || (SWCOMP_ZIP_POD_BUILD && SWCOMP_ZIP_POD_BZ2) + #if (!SWCOMPRESSION_POD_ZIP) || (SWCOMPRESSION_POD_ZIP && SWCOMPRESSION_POD_BZ2) // BZip2 algorithm considers bits in a byte in a different order. let bitReader = BitReader(data: pointerData.data, bitOrder: .straight) bitReader.index = pointerData.index @@ -139,7 +139,7 @@ public class ZipEntry: ContainerEntry { throw ZipError.compressionNotSupported #endif case 14: - #if (!SWCOMP_ZIP_POD_BUILD) || (SWCOMP_ZIP_POD_BUILD && SWCOMP_ZIP_POD_LZMA) + #if (!SWCOMPRESSION_POD_ZIP) || (SWCOMPRESSION_POD_ZIP && SWCOMPRESSION_POD_LZMA) pointerData.index += 4 // Skipping LZMA SDK version and size of properties. let lzmaDecoder = try LZMADecoder(pointerData) try lzmaDecoder.decodeLZMA(uncompSize) From df223ebde5d13b29c10eda326dfec98cafc595c4 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 22:06:32 +0300 Subject: [PATCH 097/113] Add 7z subspec --- SWCompression.podspec | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SWCompression.podspec b/SWCompression.podspec index c1d0978d..bc09fb6c 100644 --- a/SWCompression.podspec +++ b/SWCompression.podspec @@ -67,4 +67,10 @@ Pod::Spec.new do |s| sp.source_files = 'Sources/{Tar*,Extensions,Protocols,DataWithPointer}.swift' end + s.subspec 'SevenZip' do |sp| + sp.dependency 'SWCompression/LZMA' + sp.source_files = 'Sources/{7z*,CheckSums,}.swift' + sp.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-DSWCOMPRESSION_POD_SEVENZIP' } + end + end From e365dd3617a07d8248d42c33aa1708bad0b4807d Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 22:06:44 +0300 Subject: [PATCH 098/113] Add build flag for deflate subspec --- SWCompression.podspec | 1 + 1 file changed, 1 insertion(+) diff --git a/SWCompression.podspec b/SWCompression.podspec index bc09fb6c..77b71448 100644 --- a/SWCompression.podspec +++ b/SWCompression.podspec @@ -30,6 +30,7 @@ Pod::Spec.new do |s| s.subspec 'Deflate' do |sp| sp.source_files = 'Sources/{Deflate,DeflateCompression,DeflateError,Extensions,Protocols,DataWithPointer,BitReader,HuffmanTree,BitWriter,CheckSums}.swift' + sp.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-DSWCOMPRESSION_POD_DEFLATE' } end s.subspec 'GZip' do |sp| From 87c35fcc249469a4eb3a8e0aaba8df1dbf9fb1a9 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 22:07:09 +0300 Subject: [PATCH 099/113] Add build time configuration of used compression methods in 7z in cocoapods configurations --- Sources/7zFolder.swift | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Sources/7zFolder.swift b/Sources/7zFolder.swift index 5a306269..cff6843b 100644 --- a/Sources/7zFolder.swift +++ b/Sources/7zFolder.swift @@ -139,9 +139,17 @@ class SevenZipFolder { if coder.id == SevenZipCoder.ID.copy || coder.id == SevenZipCoder.ID.zipCopy { continue } else if coder.id == SevenZipCoder.ID.deflate { - decodedData = try Deflate.decompress(data: decodedData) + #if (!SWCOMPRESSION_POD_SEVENZIP) || (SWCOMPRESSION_POD_SEVENZIP && SWCOMPRESSION_POD_DEFLATE) + decodedData = try Deflate.decompress(data: decodedData) + #else + throw SevenZipError.compressionNotSupported + #endif } else if coder.id == SevenZipCoder.ID.bzip2 || coder.id == SevenZipCoder.ID.zipBzip2 { - decodedData = try BZip2.decompress(data: decodedData) + #if (!SWCOMPRESSION_POD_SEVENZIP) || (SWCOMPRESSION_POD_SEVENZIP && SWCOMPRESSION_POD_BZ2) + decodedData = try BZip2.decompress(data: decodedData) + #else + throw SevenZipError.compressionNotSupported + #endif } else if coder.id == SevenZipCoder.ID.lzma2 { // Dictionary size is stored in coder's properties. guard let properties = coder.properties From a1daa622a577f420282f4b24203b29a55e8c2a57 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 22:16:22 +0300 Subject: [PATCH 100/113] Swiftlinted --- Sources/Extensions.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Extensions.swift b/Sources/Extensions.swift index 6736c71d..ace959c1 100644 --- a/Sources/Extensions.swift +++ b/Sources/Extensions.swift @@ -74,12 +74,12 @@ extension Date { if let time = ntfsTime, let ntfsStartDate = DateComponents(calendar: Calendar(identifier: .iso8601), timeZone: TimeZone(abbreviation: "UTC"), - year: 1601, month: 1,day: 1, + year: 1601, month: 1, day: 1, hour: 0, minute: 0, second: 0).date { self.init(timeInterval: TimeInterval(time) / 10_000_000, since: ntfsStartDate) } else { return nil } } - + } From c8be30a9427243eb9903d06ce17779454de61e1e Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 22:17:59 +0300 Subject: [PATCH 101/113] Prepare for second test release --- .jazzy.yaml | 4 +- CHANGELOG.md | 14 +++ SWCompression.podspec | 2 +- Sources/Service/Info.plist | 2 +- docs/Archives.html | 12 +- docs/Classes/BZip2.html | 4 +- docs/Classes/Deflate.html | 6 +- docs/Classes/GzipArchive.html | 10 +- docs/Classes/GzipArchive/Member.html | 6 +- docs/Classes/LZMA.html | 4 +- docs/Classes/LZMA2.html | 4 +- docs/Classes/SevenZipContainer.html | 6 +- docs/Classes/SevenZipEntry.html | 20 ++-- docs/Classes/TarContainer.html | 4 +- docs/Classes/TarEntry.html | 107 ++++++++--------- docs/Classes/TarEntry/EntryType.html | 24 ++-- docs/Classes/XZArchive.html | 6 +- docs/Classes/ZipContainer.html | 4 +- docs/Classes/ZipEntry.html | 108 +++++++++++++++-- docs/Classes/ZlibArchive.html | 6 +- docs/Compression.html | 10 +- docs/Containers.html | 10 +- docs/Enums/BZip2Error.html | 22 ++-- docs/Enums/DeflateError.html | 10 +- docs/Enums/GzipError.html | 16 +-- docs/Enums/LZMA2Error.html | 12 +- docs/Enums/LZMAError.html | 18 +-- docs/Enums/SevenZipError.html | 68 +++++------ docs/Enums/TarError.html | 14 +-- docs/Enums/XZError.html | 22 ++-- docs/Enums/ZipError.html | 24 ++-- docs/Enums/ZlibError.html | 12 +- docs/Errors.html | 20 ++-- docs/Other Classes.html | 6 +- docs/Other Enums.html | 11 +- docs/Other Structs.html | 4 +- docs/Protocols.html | 10 +- docs/Protocols/Archive.html | 4 +- docs/Protocols/Container.html | 4 +- docs/Protocols/ContainerEntry.html | 72 ++++++++++- docs/Protocols/DecompressionAlgorithm.html | 4 +- docs/Structs/GzipHeader.html | 20 ++-- .../Structs/GzipHeader/CompressionMethod.html | 4 +- docs/Structs/GzipHeader/FileSystemType.html | 12 +- docs/Structs/SevenZipEntryInfo.html | 36 +++--- .../SevenZipEntryInfo/DosAttributes.html | 18 +-- .../SevenZipEntryInfo/Permissions.html | 30 ++--- docs/Structs/SevenZipEntryInfo/UnixType.html | 16 +-- docs/Structs/ZlibHeader.html | 14 +-- docs/Structs/ZlibHeader/CompressionLevel.html | 10 +- .../Structs/ZlibHeader/CompressionMethod.html | 4 +- docs/badge.svg | 2 +- .../Resources/Documents/Archives.html | 12 +- .../Resources/Documents/Classes/BZip2.html | 4 +- .../Resources/Documents/Classes/Deflate.html | 6 +- .../Documents/Classes/GzipArchive.html | 10 +- .../Documents/Classes/GzipArchive/Member.html | 6 +- .../Resources/Documents/Classes/LZMA.html | 4 +- .../Resources/Documents/Classes/LZMA2.html | 4 +- .../Documents/Classes/SevenZipContainer.html | 6 +- .../Documents/Classes/SevenZipEntry.html | 20 ++-- .../Documents/Classes/TarContainer.html | 4 +- .../Resources/Documents/Classes/TarEntry.html | 107 ++++++++--------- .../Documents/Classes/TarEntry/EntryType.html | 24 ++-- .../Documents/Classes/XZArchive.html | 6 +- .../Documents/Classes/ZipContainer.html | 4 +- .../Resources/Documents/Classes/ZipEntry.html | 108 +++++++++++++++-- .../Documents/Classes/ZlibArchive.html | 6 +- .../Resources/Documents/Compression.html | 10 +- .../Resources/Documents/Containers.html | 10 +- .../Resources/Documents/Enums/BZip2Error.html | 22 ++-- .../Documents/Enums/DeflateError.html | 10 +- .../Resources/Documents/Enums/GzipError.html | 16 +-- .../Resources/Documents/Enums/LZMA2Error.html | 12 +- .../Resources/Documents/Enums/LZMAError.html | 18 +-- .../Documents/Enums/SevenZipError.html | 68 +++++------ .../Resources/Documents/Enums/TarError.html | 14 +-- .../Resources/Documents/Enums/XZError.html | 22 ++-- .../Resources/Documents/Enums/ZipError.html | 24 ++-- .../Resources/Documents/Enums/ZlibError.html | 12 +- .../Contents/Resources/Documents/Errors.html | 20 ++-- .../Resources/Documents/Other Classes.html | 6 +- .../Resources/Documents/Other Enums.html | 11 +- .../Resources/Documents/Other Structs.html | 4 +- .../Resources/Documents/Protocols.html | 10 +- .../Documents/Protocols/Archive.html | 4 +- .../Documents/Protocols/Container.html | 4 +- .../Documents/Protocols/ContainerEntry.html | 72 ++++++++++- .../Protocols/DecompressionAlgorithm.html | 4 +- .../Documents/Structs/GzipHeader.html | 20 ++-- .../Structs/GzipHeader/CompressionMethod.html | 4 +- .../Structs/GzipHeader/FileSystemType.html | 12 +- .../Documents/Structs/SevenZipEntryInfo.html | 36 +++--- .../SevenZipEntryInfo/DosAttributes.html | 18 +-- .../SevenZipEntryInfo/Permissions.html | 30 ++--- .../Structs/SevenZipEntryInfo/UnixType.html | 16 +-- .../Documents/Structs/ZlibHeader.html | 14 +-- .../Structs/ZlibHeader/CompressionLevel.html | 10 +- .../Structs/ZlibHeader/CompressionMethod.html | 4 +- .../Contents/Resources/Documents/index.html | 2 +- .../Contents/Resources/Documents/search.json | 2 +- .../Contents/Resources/docSet.dsidx | Bin 81920 -> 86016 bytes docs/docsets/SWCompression.tgz | Bin 124194 -> 124615 bytes docs/index.html | 2 +- docs/search.json | 2 +- docs/undocumented.json | 112 ++++++++++++------ 106 files changed, 1106 insertions(+), 774 deletions(-) diff --git a/.jazzy.yaml b/.jazzy.yaml index 294d936d..f0768200 100644 --- a/.jazzy.yaml +++ b/.jazzy.yaml @@ -3,11 +3,11 @@ clean: true exclude: Tests/ author: Timofey Solomko module: SWCompression -module_version: 3.3.0-test.1 +module_version: 3.3.0-test.2 copyright: '© 2017 Timofey Solomko' readme: README.md github_url: https://github.com/tsolomko/SWCompression -github_file_prefix: https://github.com/tsolomko/SWCompression/tree/v3.3.0-test.1 +github_file_prefix: https://github.com/tsolomko/SWCompression/tree/v3.3.0-test.2 theme: fullwidth custom_categories: diff --git a/CHANGELOG.md b/CHANGELOG.md index 84efcaf5..6968cac3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,18 @@ # Changelog +v3.3.0-test.2 +---------------- +- Fixed multithreading problems for `ZipEntry.data()`. +- Fixed absent type in `SevenZipEntry.entryAttributes` in some cases. +- Fixed `posixPermissions` in `TarEntry.entryAttributes` containing UNIX type byte in some cases. +- Added `TarEntry.isLink`. +- Added `ZipEntry.isLink`. +- Added `ZipEntry.linkPath`. +- Added `ZipEntry.isTextFile`. +- Added support for NTFS extra fields in ZIP containers. +- Detection of UTF-8 in ZIP string fields now favors Code Page 437 more. +- Renamed build flags included in Cocoapods configurations. +- Removed deprecation warnings for properties of `TarEntry`. + v3.3.0-test.1 ---------------- - Introduced support for 7-Zip containers. diff --git a/SWCompression.podspec b/SWCompression.podspec index 77b71448..bcfbb6d7 100644 --- a/SWCompression.podspec +++ b/SWCompression.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "SWCompression" - s.version = "3.3.0-test.1" + s.version = "3.3.0-test.2" s.summary = "Framework with implementations in Swift of different (de)compression algorithms" s.description = <<-DESC diff --git a/Sources/Service/Info.plist b/Sources/Service/Info.plist index f12d5de4..ea5d2247 100644 --- a/Sources/Service/Info.plist +++ b/Sources/Service/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.3.0-test.1 + 3.3.0-test.2 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSHumanReadableCopyright diff --git a/docs/Archives.html b/docs/Archives.html index e9b526cb..41ffcd11 100644 --- a/docs/Archives.html +++ b/docs/Archives.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -282,7 +282,7 @@

    Declaration

    @@ -317,7 +317,7 @@

    Declaration

    @@ -352,7 +352,7 @@

    Declaration

    @@ -387,7 +387,7 @@

    Declaration

    diff --git a/docs/Classes/BZip2.html b/docs/Classes/BZip2.html index 4368d429..d45d6cfc 100644 --- a/docs/Classes/BZip2.html +++ b/docs/Classes/BZip2.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -285,7 +285,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/Classes/Deflate.html b/docs/Classes/Deflate.html index a3e3f2c9..0aaf7e64 100644 --- a/docs/Classes/Deflate.html +++ b/docs/Classes/Deflate.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -290,7 +290,7 @@

    Return Value

    Decompressed data.

    @@ -354,7 +354,7 @@

    Parameters

    diff --git a/docs/Classes/GzipArchive.html b/docs/Classes/GzipArchive.html index 5cc78676..7b68d683 100644 --- a/docs/Classes/GzipArchive.html +++ b/docs/Classes/GzipArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -324,7 +324,7 @@

    Return Value

    Unarchived data.

    @@ -393,7 +393,7 @@

    Return Value

    Unarchived data.

    @@ -536,7 +536,7 @@

    Return Value

    Resulting archive’s data.

    diff --git a/docs/Classes/GzipArchive/Member.html b/docs/Classes/GzipArchive/Member.html index 490f4932..4e3196da 100644 --- a/docs/Classes/GzipArchive/Member.html +++ b/docs/Classes/GzipArchive/Member.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    @@ -284,7 +284,7 @@

    Declaration

    diff --git a/docs/Classes/LZMA.html b/docs/Classes/LZMA.html index 90e3bba9..c4e6df74 100644 --- a/docs/Classes/LZMA.html +++ b/docs/Classes/LZMA.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -285,7 +285,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/Classes/LZMA2.html b/docs/Classes/LZMA2.html index d3f54c7b..40c7ae6e 100644 --- a/docs/Classes/LZMA2.html +++ b/docs/Classes/LZMA2.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -285,7 +285,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/Classes/SevenZipContainer.html b/docs/Classes/SevenZipContainer.html index b982f506..dd63aa6e 100644 --- a/docs/Classes/SevenZipContainer.html +++ b/docs/Classes/SevenZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    diff --git a/docs/Classes/SevenZipEntry.html b/docs/Classes/SevenZipEntry.html index 45473155..86bc3708 100644 --- a/docs/Classes/SevenZipEntry.html +++ b/docs/Classes/SevenZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    SevenZipEntry

    @@ -269,7 +269,7 @@

    Declaration

    @@ -298,7 +298,7 @@

    Declaration

    @@ -327,7 +327,7 @@

    Declaration

    @@ -349,7 +349,7 @@

    Declaration

    @@ -371,7 +371,7 @@

    Declaration

    @@ -400,7 +400,7 @@

    Declaration

    @@ -422,7 +422,7 @@

    Declaration

    @@ -451,7 +451,7 @@

    Declaration

    diff --git a/docs/Classes/TarContainer.html b/docs/Classes/TarContainer.html index 0eb9530f..97b03716 100644 --- a/docs/Classes/TarContainer.html +++ b/docs/Classes/TarContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -290,7 +290,7 @@

    Return Value

    Array of TarEntry as an array of ContainerEntry.

    diff --git a/docs/Classes/TarEntry.html b/docs/Classes/TarEntry.html index 325864d6..001f572b 100644 --- a/docs/Classes/TarEntry.html +++ b/docs/Classes/TarEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -260,7 +260,7 @@

    Declaration

    @@ -290,7 +290,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    -

    True, if an entry is a directory.

    +

    True, if entry is a directory.

    @@ -320,7 +320,7 @@

    Declaration

    @@ -350,7 +350,7 @@

    Declaration

    @@ -401,7 +401,7 @@

    Declaration

    @@ -420,11 +420,6 @@

    Declaration

    File mode.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -436,7 +431,7 @@

    Declaration

    @@ -455,11 +450,6 @@

    Declaration

    Owner’s ID.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -471,7 +461,7 @@

    Declaration

    @@ -490,11 +480,6 @@

    Declaration

    Owner’s group ID.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -506,7 +491,7 @@

    Declaration

    @@ -525,11 +510,6 @@

    Declaration

    The most recent modification time of the original file or directory.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -541,7 +521,7 @@

    Declaration

    @@ -560,11 +540,6 @@

    Declaration

    Type of entry.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -576,7 +551,7 @@

    Declaration

    @@ -595,11 +570,6 @@

    Declaration

    Owner’s user name.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -611,7 +581,7 @@

    Declaration

    @@ -630,11 +600,6 @@

    Declaration

    Owner’s group name.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -646,7 +611,7 @@

    Declaration

    @@ -676,7 +641,7 @@

    Declaration

    @@ -706,7 +671,7 @@

    Declaration

    @@ -736,7 +701,7 @@

    Declaration

    @@ -766,7 +731,37 @@

    Declaration

    + + + +
  • +
    + + + + isLink + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class TarEntry: ContainerEntry
    + +
    +
    +
    @@ -796,7 +791,7 @@

    Declaration

    @@ -826,7 +821,7 @@

    Declaration

    @@ -856,7 +851,7 @@

    Declaration

    diff --git a/docs/Classes/TarEntry/EntryType.html b/docs/Classes/TarEntry/EntryType.html index 00d06bbb..84604c66 100644 --- a/docs/Classes/TarEntry/EntryType.html +++ b/docs/Classes/TarEntry/EntryType.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -259,7 +259,7 @@

    Declaration

    @@ -293,7 +293,7 @@

    Declaration

    @@ -327,7 +327,7 @@

    Declaration

    @@ -361,7 +361,7 @@

    Declaration

    @@ -395,7 +395,7 @@

    Declaration

    @@ -429,7 +429,7 @@

    Declaration

    @@ -463,7 +463,7 @@

    Declaration

    @@ -497,7 +497,7 @@

    Declaration

    @@ -531,7 +531,7 @@

    Declaration

    @@ -565,7 +565,7 @@

    Declaration

    @@ -599,7 +599,7 @@

    Declaration

    diff --git a/docs/Classes/XZArchive.html b/docs/Classes/XZArchive.html index f918811f..bf03fa36 100644 --- a/docs/Classes/XZArchive.html +++ b/docs/Classes/XZArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -290,7 +290,7 @@

    Return Value

    Unarchived data.

    @@ -358,7 +358,7 @@

    Return Value

    Unarchived data.

    diff --git a/docs/Classes/ZipContainer.html b/docs/Classes/ZipContainer.html index 83f816b8..05cc6231 100644 --- a/docs/Classes/ZipContainer.html +++ b/docs/Classes/ZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -292,7 +292,7 @@

    Return Value

    Array of ZipEntry as an array of ContainerEntry.

    diff --git a/docs/Classes/ZipEntry.html b/docs/Classes/ZipEntry.html index 3c9c2ff1..0d0a6c39 100644 --- a/docs/Classes/ZipEntry.html +++ b/docs/Classes/ZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    @@ -284,7 +284,7 @@

    Declaration

    @@ -319,7 +319,7 @@

    Declaration

    @@ -349,7 +349,7 @@

    Declaration

    @@ -367,7 +367,7 @@

    Declaration

    -

    True, if an entry is a directory. +

    True, if entry is a directory. For MS-DOS and UNIX-like container creator’s OS, the result is based on ‘external file attributes’. Otherwise, it is true if size of data is 0 AND last character of entry’s name is ‘/’.

    @@ -381,7 +381,97 @@

    Declaration

    +
    + +
  • +
  • +
    + + + + isLink + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class ZipEntry: ContainerEntry
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + linkPath + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class ZipEntry: ContainerEntry
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isTextFile + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class ZipEntry: ContainerEntry
    + +
    +
    +
    @@ -426,7 +516,7 @@

    Declaration

    @@ -462,7 +552,7 @@

    Declaration

    diff --git a/docs/Classes/ZlibArchive.html b/docs/Classes/ZlibArchive.html index 72ca9fce..817e8469 100644 --- a/docs/Classes/ZlibArchive.html +++ b/docs/Classes/ZlibArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -293,7 +293,7 @@

    Return Value

    Unarchived data.

    @@ -360,7 +360,7 @@

    Return Value

    Resulting archive’s data.

    diff --git a/docs/Compression.html b/docs/Compression.html index c873767f..22751226 100644 --- a/docs/Compression.html +++ b/docs/Compression.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -282,7 +282,7 @@

    Declaration

    @@ -317,7 +317,7 @@

    Declaration

    @@ -352,7 +352,7 @@

    Declaration

    diff --git a/docs/Containers.html b/docs/Containers.html index 2648e7f9..6a23b5fa 100644 --- a/docs/Containers.html +++ b/docs/Containers.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -282,7 +282,7 @@

    Declaration

    @@ -317,7 +317,7 @@

    Declaration

    @@ -352,7 +352,7 @@

    Declaration

    diff --git a/docs/Enums/BZip2Error.html b/docs/Enums/BZip2Error.html index d80052fb..3a53f08d 100644 --- a/docs/Enums/BZip2Error.html +++ b/docs/Enums/BZip2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    @@ -459,7 +459,7 @@

    Declaration

    @@ -493,7 +493,7 @@

    Declaration

    @@ -527,7 +527,7 @@

    Declaration

    @@ -562,7 +562,7 @@

    Declaration

    diff --git a/docs/Enums/DeflateError.html b/docs/Enums/DeflateError.html index b67fdde7..0d218290 100644 --- a/docs/Enums/DeflateError.html +++ b/docs/Enums/DeflateError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    diff --git a/docs/Enums/GzipError.html b/docs/Enums/GzipError.html index 86326f92..0000bbaa 100644 --- a/docs/Enums/GzipError.html +++ b/docs/Enums/GzipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -324,7 +324,7 @@

    Declaration

    @@ -358,7 +358,7 @@

    Declaration

    @@ -393,7 +393,7 @@

    Declaration

    @@ -427,7 +427,7 @@

    Declaration

    @@ -461,7 +461,7 @@

    Declaration

    diff --git a/docs/Enums/LZMA2Error.html b/docs/Enums/LZMA2Error.html index 7c9814e3..550b9101 100644 --- a/docs/Enums/LZMA2Error.html +++ b/docs/Enums/LZMA2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    diff --git a/docs/Enums/LZMAError.html b/docs/Enums/LZMAError.html index b27dda47..088a1a2f 100644 --- a/docs/Enums/LZMAError.html +++ b/docs/Enums/LZMAError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    @@ -459,7 +459,7 @@

    Declaration

    @@ -493,7 +493,7 @@

    Declaration

    diff --git a/docs/Enums/SevenZipError.html b/docs/Enums/SevenZipError.html index c8380857..99365395 100644 --- a/docs/Enums/SevenZipError.html +++ b/docs/Enums/SevenZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    SevenZipError

    @@ -266,7 +266,7 @@

    SevenZipError

    @@ -292,7 +292,7 @@

    SevenZipError

    @@ -318,7 +318,7 @@

    SevenZipError

    @@ -344,7 +344,7 @@

    SevenZipError

    @@ -370,7 +370,7 @@

    SevenZipError

    @@ -396,7 +396,7 @@

    SevenZipError

    @@ -422,7 +422,7 @@

    SevenZipError

    @@ -448,7 +448,7 @@

    SevenZipError

    @@ -474,7 +474,7 @@

    SevenZipError

    @@ -500,7 +500,7 @@

    SevenZipError

    @@ -526,7 +526,7 @@

    SevenZipError

    @@ -552,7 +552,7 @@

    SevenZipError

    @@ -578,7 +578,7 @@

    SevenZipError

    @@ -604,7 +604,7 @@

    SevenZipError

    @@ -630,7 +630,7 @@

    SevenZipError

    @@ -656,7 +656,7 @@

    SevenZipError

    @@ -682,7 +682,7 @@

    SevenZipError

    @@ -708,7 +708,7 @@

    SevenZipError

    @@ -734,7 +734,7 @@

    SevenZipError

    @@ -760,7 +760,7 @@

    SevenZipError

    @@ -786,7 +786,7 @@

    SevenZipError

    @@ -812,7 +812,7 @@

    SevenZipError

    @@ -838,7 +838,7 @@

    SevenZipError

    @@ -864,7 +864,7 @@

    SevenZipError

    @@ -890,7 +890,7 @@

    SevenZipError

    @@ -916,7 +916,7 @@

    SevenZipError

    @@ -942,7 +942,7 @@

    SevenZipError

    @@ -968,7 +968,7 @@

    SevenZipError

    @@ -994,7 +994,7 @@

    SevenZipError

    @@ -1020,7 +1020,7 @@

    SevenZipError

    @@ -1046,7 +1046,7 @@

    SevenZipError

    @@ -1072,7 +1072,7 @@

    SevenZipError

    diff --git a/docs/Enums/TarError.html b/docs/Enums/TarError.html index c49caf2c..a141f45c 100644 --- a/docs/Enums/TarError.html +++ b/docs/Enums/TarError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    diff --git a/docs/Enums/XZError.html b/docs/Enums/XZError.html index 23d9342e..d74cba30 100644 --- a/docs/Enums/XZError.html +++ b/docs/Enums/XZError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -324,7 +324,7 @@

    Declaration

    @@ -358,7 +358,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    @@ -426,7 +426,7 @@

    Declaration

    @@ -461,7 +461,7 @@

    Declaration

    @@ -496,7 +496,7 @@

    Declaration

    @@ -530,7 +530,7 @@

    Declaration

    @@ -564,7 +564,7 @@

    Declaration

    diff --git a/docs/Enums/ZipError.html b/docs/Enums/ZipError.html index 522eab01..30a42ece 100644 --- a/docs/Enums/ZipError.html +++ b/docs/Enums/ZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    @@ -459,7 +459,7 @@

    Declaration

    @@ -493,7 +493,7 @@

    Declaration

    @@ -527,7 +527,7 @@

    Declaration

    @@ -562,7 +562,7 @@

    Declaration

    @@ -596,7 +596,7 @@

    Declaration

    diff --git a/docs/Enums/ZlibError.html b/docs/Enums/ZlibError.html index 862450c9..1b945cf9 100644 --- a/docs/Enums/ZlibError.html +++ b/docs/Enums/ZlibError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    diff --git a/docs/Errors.html b/docs/Errors.html index 93205e9e..5b107a65 100644 --- a/docs/Errors.html +++ b/docs/Errors.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -248,7 +248,7 @@

    Declaration

    @@ -284,7 +284,7 @@

    Declaration

    @@ -320,7 +320,7 @@

    Declaration

    @@ -356,7 +356,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    @@ -435,7 +435,7 @@

    Declaration

    @@ -471,7 +471,7 @@

    Declaration

    @@ -507,7 +507,7 @@

    Declaration

    @@ -543,7 +543,7 @@

    Declaration

    diff --git a/docs/Other Classes.html b/docs/Other Classes.html index 3025fcd6..202a6886 100644 --- a/docs/Other Classes.html +++ b/docs/Other Classes.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    Other Classes

    See more @@ -267,7 +267,7 @@

    Other Classes

    See more diff --git a/docs/Other Enums.html b/docs/Other Enums.html index fa0b7d5a..84b0b83a 100644 --- a/docs/Other Enums.html +++ b/docs/Other Enums.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -221,13 +221,6 @@

    Other Enums

    -
    diff --git a/docs/Other Structs.html b/docs/Other Structs.html index e66c7efa..721a3ffa 100644 --- a/docs/Other Structs.html +++ b/docs/Other Structs.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    Other Structs

    See more diff --git a/docs/Protocols.html b/docs/Protocols.html index e5a834e4..68ff3581 100644 --- a/docs/Protocols.html +++ b/docs/Protocols.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -278,7 +278,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Declaration

    @@ -340,7 +340,7 @@

    Declaration

    diff --git a/docs/Protocols/Archive.html b/docs/Protocols/Archive.html index 23b10f1a..b916c9c2 100644 --- a/docs/Protocols/Archive.html +++ b/docs/Protocols/Archive.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/Protocols/Container.html b/docs/Protocols/Container.html index 4dd22eed..b6fcd9c7 100644 --- a/docs/Protocols/Container.html +++ b/docs/Protocols/Container.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/Protocols/ContainerEntry.html b/docs/Protocols/ContainerEntry.html index 90114ac7..a0c57288 100644 --- a/docs/Protocols/ContainerEntry.html +++ b/docs/Protocols/ContainerEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    @@ -284,7 +284,7 @@

    Declaration

    @@ -314,7 +314,67 @@

    Declaration

    + + +
  • +
  • +
    + + + + isLink + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ContainerEntry
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + linkPath + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ContainerEntry
    + +
    +
    +
    @@ -350,7 +410,7 @@

    Declaration

    @@ -380,7 +440,7 @@

    Declaration

    diff --git a/docs/Protocols/DecompressionAlgorithm.html b/docs/Protocols/DecompressionAlgorithm.html index bdf9b2e8..fd70493f 100644 --- a/docs/Protocols/DecompressionAlgorithm.html +++ b/docs/Protocols/DecompressionAlgorithm.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/Structs/GzipHeader.html b/docs/Structs/GzipHeader.html index 078ce590..c09daf63 100644 --- a/docs/Structs/GzipHeader.html +++ b/docs/Structs/GzipHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -286,7 +286,7 @@

    Declaration

    @@ -316,7 +316,7 @@

    Declaration

    @@ -348,7 +348,7 @@

    Declaration

    @@ -378,7 +378,7 @@

    Declaration

    @@ -408,7 +408,7 @@

    Declaration

    @@ -438,7 +438,7 @@

    Declaration

    @@ -468,7 +468,7 @@

    Declaration

    @@ -525,7 +525,7 @@

    Parameters

    diff --git a/docs/Structs/GzipHeader/CompressionMethod.html b/docs/Structs/GzipHeader/CompressionMethod.html index 1b9b44ce..36b75a90 100644 --- a/docs/Structs/GzipHeader/CompressionMethod.html +++ b/docs/Structs/GzipHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/Structs/GzipHeader/FileSystemType.html b/docs/Structs/GzipHeader/FileSystemType.html index 975b0103..ced6c3cf 100644 --- a/docs/Structs/GzipHeader/FileSystemType.html +++ b/docs/Structs/GzipHeader/FileSystemType.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -259,7 +259,7 @@

    Declaration

    @@ -293,7 +293,7 @@

    Declaration

    @@ -327,7 +327,7 @@

    Declaration

    @@ -361,7 +361,7 @@

    Declaration

    @@ -395,7 +395,7 @@

    Declaration

    diff --git a/docs/Structs/SevenZipEntryInfo.html b/docs/Structs/SevenZipEntryInfo.html index 4e6b2cb2..7a79e689 100644 --- a/docs/Structs/SevenZipEntryInfo.html +++ b/docs/Structs/SevenZipEntryInfo.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -241,7 +241,7 @@

    SevenZipEntryInfo

    See more @@ -264,7 +264,7 @@

    SevenZipEntryInfo

    See more @@ -287,7 +287,7 @@

    SevenZipEntryInfo

    See more @@ -309,7 +309,7 @@

    SevenZipEntryInfo

    @@ -331,7 +331,7 @@

    SevenZipEntryInfo

    @@ -353,7 +353,7 @@

    SevenZipEntryInfo

    @@ -375,7 +375,7 @@

    SevenZipEntryInfo

    @@ -397,7 +397,7 @@

    SevenZipEntryInfo

    @@ -419,7 +419,7 @@

    SevenZipEntryInfo

    @@ -441,7 +441,7 @@

    SevenZipEntryInfo

    @@ -463,7 +463,7 @@

    SevenZipEntryInfo

    @@ -485,7 +485,7 @@

    SevenZipEntryInfo

    @@ -507,7 +507,7 @@

    SevenZipEntryInfo

    @@ -529,7 +529,7 @@

    SevenZipEntryInfo

    @@ -551,7 +551,7 @@

    SevenZipEntryInfo

    @@ -573,7 +573,7 @@

    SevenZipEntryInfo

    @@ -595,7 +595,7 @@

    SevenZipEntryInfo

    diff --git a/docs/Structs/SevenZipEntryInfo/DosAttributes.html b/docs/Structs/SevenZipEntryInfo/DosAttributes.html index 8bbf6334..fa29e240 100644 --- a/docs/Structs/SevenZipEntryInfo/DosAttributes.html +++ b/docs/Structs/SevenZipEntryInfo/DosAttributes.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -295,7 +295,7 @@

    Parameters

    @@ -317,7 +317,7 @@

    Parameters

    @@ -339,7 +339,7 @@

    Parameters

    @@ -361,7 +361,7 @@

    Parameters

    @@ -383,7 +383,7 @@

    Parameters

    @@ -405,7 +405,7 @@

    Parameters

    @@ -427,7 +427,7 @@

    Parameters

    diff --git a/docs/Structs/SevenZipEntryInfo/Permissions.html b/docs/Structs/SevenZipEntryInfo/Permissions.html index 7c544fed..bd69b86e 100644 --- a/docs/Structs/SevenZipEntryInfo/Permissions.html +++ b/docs/Structs/SevenZipEntryInfo/Permissions.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -295,7 +295,7 @@

    Parameters

    @@ -317,7 +317,7 @@

    Parameters

    @@ -339,7 +339,7 @@

    Parameters

    @@ -361,7 +361,7 @@

    Parameters

    @@ -383,7 +383,7 @@

    Parameters

    @@ -405,7 +405,7 @@

    Parameters

    @@ -427,7 +427,7 @@

    Parameters

    @@ -449,7 +449,7 @@

    Parameters

    @@ -471,7 +471,7 @@

    Parameters

    @@ -493,7 +493,7 @@

    Parameters

    @@ -515,7 +515,7 @@

    Parameters

    @@ -537,7 +537,7 @@

    Parameters

    @@ -559,7 +559,7 @@

    Parameters

    diff --git a/docs/Structs/SevenZipEntryInfo/UnixType.html b/docs/Structs/SevenZipEntryInfo/UnixType.html index a903618c..d78b78bc 100644 --- a/docs/Structs/SevenZipEntryInfo/UnixType.html +++ b/docs/Structs/SevenZipEntryInfo/UnixType.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    UnixType

    @@ -266,7 +266,7 @@

    UnixType

    @@ -292,7 +292,7 @@

    UnixType

    @@ -318,7 +318,7 @@

    UnixType

    @@ -344,7 +344,7 @@

    UnixType

    @@ -370,7 +370,7 @@

    UnixType

    @@ -396,7 +396,7 @@

    UnixType

    diff --git a/docs/Structs/ZlibHeader.html b/docs/Structs/ZlibHeader.html index 8db9e350..434e7e83 100644 --- a/docs/Structs/ZlibHeader.html +++ b/docs/Structs/ZlibHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -286,7 +286,7 @@

    Declaration

    @@ -316,7 +316,7 @@

    Declaration

    @@ -346,7 +346,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -433,7 +433,7 @@

    Parameters

    diff --git a/docs/Structs/ZlibHeader/CompressionLevel.html b/docs/Structs/ZlibHeader/CompressionLevel.html index d2762e15..5e1503d0 100644 --- a/docs/Structs/ZlibHeader/CompressionLevel.html +++ b/docs/Structs/ZlibHeader/CompressionLevel.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    @@ -288,7 +288,7 @@

    Declaration

    @@ -322,7 +322,7 @@

    Declaration

    @@ -356,7 +356,7 @@

    Declaration

    diff --git a/docs/Structs/ZlibHeader/CompressionMethod.html b/docs/Structs/ZlibHeader/CompressionMethod.html index 564e63ca..d8bb88d1 100644 --- a/docs/Structs/ZlibHeader/CompressionMethod.html +++ b/docs/Structs/ZlibHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/badge.svg b/docs/badge.svg index 9ec9bd92..7220d1cc 100644 --- a/docs/badge.svg +++ b/docs/badge.svg @@ -1 +1 @@ -documentationdocumentation69%69% \ No newline at end of file +documentationdocumentation67%67% \ No newline at end of file diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html index e9b526cb..41ffcd11 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -282,7 +282,7 @@

    Declaration

    @@ -317,7 +317,7 @@

    Declaration

    @@ -352,7 +352,7 @@

    Declaration

    @@ -387,7 +387,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html index 4368d429..d45d6cfc 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -285,7 +285,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html index a3e3f2c9..0aaf7e64 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -290,7 +290,7 @@

    Return Value

    Decompressed data.

    @@ -354,7 +354,7 @@

    Parameters

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html index 5cc78676..7b68d683 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -324,7 +324,7 @@

    Return Value

    Unarchived data.

    @@ -393,7 +393,7 @@

    Return Value

    Unarchived data.

    @@ -536,7 +536,7 @@

    Return Value

    Resulting archive’s data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html index 490f4932..4e3196da 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    @@ -284,7 +284,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html index 90e3bba9..c4e6df74 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -285,7 +285,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html index d3f54c7b..40c7ae6e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -285,7 +285,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html index b982f506..dd63aa6e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html index 45473155..86bc3708 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    SevenZipEntry

    @@ -269,7 +269,7 @@

    Declaration

    @@ -298,7 +298,7 @@

    Declaration

    @@ -327,7 +327,7 @@

    Declaration

    @@ -349,7 +349,7 @@

    Declaration

    @@ -371,7 +371,7 @@

    Declaration

    @@ -400,7 +400,7 @@

    Declaration

    @@ -422,7 +422,7 @@

    Declaration

    @@ -451,7 +451,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html index 0eb9530f..97b03716 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -290,7 +290,7 @@

    Return Value

    Array of TarEntry as an array of ContainerEntry.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html index 325864d6..001f572b 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -260,7 +260,7 @@

    Declaration

    @@ -290,7 +290,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    -

    True, if an entry is a directory.

    +

    True, if entry is a directory.

    @@ -320,7 +320,7 @@

    Declaration

    @@ -350,7 +350,7 @@

    Declaration

    @@ -401,7 +401,7 @@

    Declaration

    @@ -420,11 +420,6 @@

    Declaration

    File mode.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -436,7 +431,7 @@

    Declaration

    @@ -455,11 +450,6 @@

    Declaration

    Owner’s ID.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -471,7 +461,7 @@

    Declaration

    @@ -490,11 +480,6 @@

    Declaration

    Owner’s group ID.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -506,7 +491,7 @@

    Declaration

    @@ -525,11 +510,6 @@

    Declaration

    The most recent modification time of the original file or directory.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -541,7 +521,7 @@

    Declaration

    @@ -560,11 +540,6 @@

    Declaration

    Type of entry.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -576,7 +551,7 @@

    Declaration

    @@ -595,11 +570,6 @@

    Declaration

    Owner’s user name.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -611,7 +581,7 @@

    Declaration

    @@ -630,11 +600,6 @@

    Declaration

    Owner’s group name.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. Use entryAttributes instead. - -
    @@ -646,7 +611,7 @@

    Declaration

    @@ -676,7 +641,7 @@

    Declaration

    @@ -706,7 +671,7 @@

    Declaration

    @@ -736,7 +701,7 @@

    Declaration

    @@ -766,7 +731,37 @@

    Declaration

    + + +
  • +
  • +
    + + + + isLink + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class TarEntry: ContainerEntry
    + +
    +
    +
    @@ -796,7 +791,7 @@

    Declaration

    @@ -826,7 +821,7 @@

    Declaration

    @@ -856,7 +851,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html index 00d06bbb..84604c66 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -259,7 +259,7 @@

    Declaration

    @@ -293,7 +293,7 @@

    Declaration

    @@ -327,7 +327,7 @@

    Declaration

    @@ -361,7 +361,7 @@

    Declaration

    @@ -395,7 +395,7 @@

    Declaration

    @@ -429,7 +429,7 @@

    Declaration

    @@ -463,7 +463,7 @@

    Declaration

    @@ -497,7 +497,7 @@

    Declaration

    @@ -531,7 +531,7 @@

    Declaration

    @@ -565,7 +565,7 @@

    Declaration

    @@ -599,7 +599,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html index f918811f..bf03fa36 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -290,7 +290,7 @@

    Return Value

    Unarchived data.

    @@ -358,7 +358,7 @@

    Return Value

    Unarchived data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html index 83f816b8..05cc6231 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -292,7 +292,7 @@

    Return Value

    Array of ZipEntry as an array of ContainerEntry.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html index 3c9c2ff1..0d0a6c39 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    @@ -284,7 +284,7 @@

    Declaration

    @@ -319,7 +319,7 @@

    Declaration

    @@ -349,7 +349,7 @@

    Declaration

    @@ -367,7 +367,7 @@

    Declaration

    -

    True, if an entry is a directory. +

    True, if entry is a directory. For MS-DOS and UNIX-like container creator’s OS, the result is based on ‘external file attributes’. Otherwise, it is true if size of data is 0 AND last character of entry’s name is ‘/’.

    @@ -381,7 +381,97 @@

    Declaration

    +
    + +
  • +
  • +
    + + + + isLink + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class ZipEntry: ContainerEntry
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + linkPath + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class ZipEntry: ContainerEntry
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isTextFile + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class ZipEntry: ContainerEntry
    + +
    +
    +
    @@ -426,7 +516,7 @@

    Declaration

    @@ -462,7 +552,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html index 72ca9fce..817e8469 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -293,7 +293,7 @@

    Return Value

    Unarchived data.

    @@ -360,7 +360,7 @@

    Return Value

    Resulting archive’s data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html index c873767f..22751226 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -282,7 +282,7 @@

    Declaration

    @@ -317,7 +317,7 @@

    Declaration

    @@ -352,7 +352,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html index 2648e7f9..6a23b5fa 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -282,7 +282,7 @@

    Declaration

    @@ -317,7 +317,7 @@

    Declaration

    @@ -352,7 +352,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html index d80052fb..3a53f08d 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    @@ -459,7 +459,7 @@

    Declaration

    @@ -493,7 +493,7 @@

    Declaration

    @@ -527,7 +527,7 @@

    Declaration

    @@ -562,7 +562,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html index b67fdde7..0d218290 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html index 86326f92..0000bbaa 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -324,7 +324,7 @@

    Declaration

    @@ -358,7 +358,7 @@

    Declaration

    @@ -393,7 +393,7 @@

    Declaration

    @@ -427,7 +427,7 @@

    Declaration

    @@ -461,7 +461,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html index 7c9814e3..550b9101 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html index b27dda47..088a1a2f 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    @@ -459,7 +459,7 @@

    Declaration

    @@ -493,7 +493,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html index c8380857..99365395 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    SevenZipError

    @@ -266,7 +266,7 @@

    SevenZipError

    @@ -292,7 +292,7 @@

    SevenZipError

    @@ -318,7 +318,7 @@

    SevenZipError

    @@ -344,7 +344,7 @@

    SevenZipError

    @@ -370,7 +370,7 @@

    SevenZipError

    @@ -396,7 +396,7 @@

    SevenZipError

    @@ -422,7 +422,7 @@

    SevenZipError

    @@ -448,7 +448,7 @@

    SevenZipError

    @@ -474,7 +474,7 @@

    SevenZipError

    @@ -500,7 +500,7 @@

    SevenZipError

    @@ -526,7 +526,7 @@

    SevenZipError

    @@ -552,7 +552,7 @@

    SevenZipError

    @@ -578,7 +578,7 @@

    SevenZipError

    @@ -604,7 +604,7 @@

    SevenZipError

    @@ -630,7 +630,7 @@

    SevenZipError

    @@ -656,7 +656,7 @@

    SevenZipError

    @@ -682,7 +682,7 @@

    SevenZipError

    @@ -708,7 +708,7 @@

    SevenZipError

    @@ -734,7 +734,7 @@

    SevenZipError

    @@ -760,7 +760,7 @@

    SevenZipError

    @@ -786,7 +786,7 @@

    SevenZipError

    @@ -812,7 +812,7 @@

    SevenZipError

    @@ -838,7 +838,7 @@

    SevenZipError

    @@ -864,7 +864,7 @@

    SevenZipError

    @@ -890,7 +890,7 @@

    SevenZipError

    @@ -916,7 +916,7 @@

    SevenZipError

    @@ -942,7 +942,7 @@

    SevenZipError

    @@ -968,7 +968,7 @@

    SevenZipError

    @@ -994,7 +994,7 @@

    SevenZipError

    @@ -1020,7 +1020,7 @@

    SevenZipError

    @@ -1046,7 +1046,7 @@

    SevenZipError

    @@ -1072,7 +1072,7 @@

    SevenZipError

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html index c49caf2c..a141f45c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html index 23d9342e..d74cba30 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -324,7 +324,7 @@

    Declaration

    @@ -358,7 +358,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    @@ -426,7 +426,7 @@

    Declaration

    @@ -461,7 +461,7 @@

    Declaration

    @@ -496,7 +496,7 @@

    Declaration

    @@ -530,7 +530,7 @@

    Declaration

    @@ -564,7 +564,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html index 522eab01..30a42ece 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    @@ -459,7 +459,7 @@

    Declaration

    @@ -493,7 +493,7 @@

    Declaration

    @@ -527,7 +527,7 @@

    Declaration

    @@ -562,7 +562,7 @@

    Declaration

    @@ -596,7 +596,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html index 862450c9..1b945cf9 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -289,7 +289,7 @@

    Declaration

    @@ -323,7 +323,7 @@

    Declaration

    @@ -357,7 +357,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html index 93205e9e..5b107a65 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -248,7 +248,7 @@

    Declaration

    @@ -284,7 +284,7 @@

    Declaration

    @@ -320,7 +320,7 @@

    Declaration

    @@ -356,7 +356,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    @@ -435,7 +435,7 @@

    Declaration

    @@ -471,7 +471,7 @@

    Declaration

    @@ -507,7 +507,7 @@

    Declaration

    @@ -543,7 +543,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Classes.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Classes.html index 3025fcd6..202a6886 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Classes.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Classes.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    Other Classes

    See more @@ -267,7 +267,7 @@

    Other Classes

    See more diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html index fa0b7d5a..84b0b83a 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -221,13 +221,6 @@

    Other Enums

    -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html index e66c7efa..721a3ffa 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    Other Structs

    See more diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html index e5a834e4..68ff3581 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -278,7 +278,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Declaration

    @@ -340,7 +340,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html index 23b10f1a..b916c9c2 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html index 4dd22eed..b6fcd9c7 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html index 90114ac7..a0c57288 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    @@ -284,7 +284,7 @@

    Declaration

    @@ -314,7 +314,67 @@

    Declaration

    + + +
  • +
  • +
    + + + + isLink + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ContainerEntry
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + linkPath + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ContainerEntry
    + +
    +
    +
    @@ -350,7 +410,7 @@

    Declaration

    @@ -380,7 +440,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html index bdf9b2e8..fd70493f 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html index 078ce590..c09daf63 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -286,7 +286,7 @@

    Declaration

    @@ -316,7 +316,7 @@

    Declaration

    @@ -348,7 +348,7 @@

    Declaration

    @@ -378,7 +378,7 @@

    Declaration

    @@ -408,7 +408,7 @@

    Declaration

    @@ -438,7 +438,7 @@

    Declaration

    @@ -468,7 +468,7 @@

    Declaration

    @@ -525,7 +525,7 @@

    Parameters

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html index 1b9b44ce..36b75a90 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html index 975b0103..ced6c3cf 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -259,7 +259,7 @@

    Declaration

    @@ -293,7 +293,7 @@

    Declaration

    @@ -327,7 +327,7 @@

    Declaration

    @@ -361,7 +361,7 @@

    Declaration

    @@ -395,7 +395,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html index 4e6b2cb2..7a79e689 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -241,7 +241,7 @@

    SevenZipEntryInfo

    See more @@ -264,7 +264,7 @@

    SevenZipEntryInfo

    See more @@ -287,7 +287,7 @@

    SevenZipEntryInfo

    See more @@ -309,7 +309,7 @@

    SevenZipEntryInfo

    @@ -331,7 +331,7 @@

    SevenZipEntryInfo

    @@ -353,7 +353,7 @@

    SevenZipEntryInfo

    @@ -375,7 +375,7 @@

    SevenZipEntryInfo

    @@ -397,7 +397,7 @@

    SevenZipEntryInfo

    @@ -419,7 +419,7 @@

    SevenZipEntryInfo

    @@ -441,7 +441,7 @@

    SevenZipEntryInfo

    @@ -463,7 +463,7 @@

    SevenZipEntryInfo

    @@ -485,7 +485,7 @@

    SevenZipEntryInfo

    @@ -507,7 +507,7 @@

    SevenZipEntryInfo

    @@ -529,7 +529,7 @@

    SevenZipEntryInfo

    @@ -551,7 +551,7 @@

    SevenZipEntryInfo

    @@ -573,7 +573,7 @@

    SevenZipEntryInfo

    @@ -595,7 +595,7 @@

    SevenZipEntryInfo

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html index 8bbf6334..fa29e240 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -295,7 +295,7 @@

    Parameters

    @@ -317,7 +317,7 @@

    Parameters

    @@ -339,7 +339,7 @@

    Parameters

    @@ -361,7 +361,7 @@

    Parameters

    @@ -383,7 +383,7 @@

    Parameters

    @@ -405,7 +405,7 @@

    Parameters

    @@ -427,7 +427,7 @@

    Parameters

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html index 7c544fed..bd69b86e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -247,7 +247,7 @@

    Declaration

    @@ -295,7 +295,7 @@

    Parameters

    @@ -317,7 +317,7 @@

    Parameters

    @@ -339,7 +339,7 @@

    Parameters

    @@ -361,7 +361,7 @@

    Parameters

    @@ -383,7 +383,7 @@

    Parameters

    @@ -405,7 +405,7 @@

    Parameters

    @@ -427,7 +427,7 @@

    Parameters

    @@ -449,7 +449,7 @@

    Parameters

    @@ -471,7 +471,7 @@

    Parameters

    @@ -493,7 +493,7 @@

    Parameters

    @@ -515,7 +515,7 @@

    Parameters

    @@ -537,7 +537,7 @@

    Parameters

    @@ -559,7 +559,7 @@

    Parameters

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html index a903618c..d78b78bc 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -240,7 +240,7 @@

    UnixType

    @@ -266,7 +266,7 @@

    UnixType

    @@ -292,7 +292,7 @@

    UnixType

    @@ -318,7 +318,7 @@

    UnixType

    @@ -344,7 +344,7 @@

    UnixType

    @@ -370,7 +370,7 @@

    UnixType

    @@ -396,7 +396,7 @@

    UnixType

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html index 8db9e350..434e7e83 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -255,7 +255,7 @@

    Declaration

    @@ -286,7 +286,7 @@

    Declaration

    @@ -316,7 +316,7 @@

    Declaration

    @@ -346,7 +346,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -433,7 +433,7 @@

    Parameters

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html index d2762e15..5e1503d0 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    @@ -288,7 +288,7 @@

    Declaration

    @@ -322,7 +322,7 @@

    Declaration

    @@ -356,7 +356,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html index 564e63ca..d8bb88d1 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    @@ -254,7 +254,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html index 1a654460..2bfcdeb3 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json index b0ad85e4..27045042 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json @@ -1 +1 @@ -{"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Undocumented

    "},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongStartHeaderCRCFMS0_S0_":{"name":"wrongStartHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongHeaderSizeFMS0_S0_":{"name":"wrongHeaderSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongPropertyIDFMS0_S0_":{"name":"wrongPropertyID","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongExternalFMS0_S0_":{"name":"wrongExternal","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18reservedCodecFlagsFMS0_S0_":{"name":"reservedCodecFlags","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17unknownNumFoldersFMS0_S0_":{"name":"unknownNumFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongEndFMS0_S0_":{"name":"wrongEnd","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22altMethodsNotSupportedFMS0_S0_":{"name":"altMethodsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongStreamsNumberFMS0_S0_":{"name":"wrongStreamsNumber","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20wrongCoderPropertiesFMS0_S0_":{"name":"wrongCoderProperties","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noPackInfoFMS0_S0_":{"name":"noPackInfo","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17wrongFilePropertyFMS0_S0_":{"name":"wrongFileProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongFileNameLengthFMS0_S0_":{"name":"wrongFileNameLength","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongFileNamesFMS0_S0_":{"name":"wrongFileNames","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18incompletePropertyFMS0_S0_":{"name":"incompleteProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noFileSizeFMS0_S0_":{"name":"noFileSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughFoldersFMS0_S0_":{"name":"notEnoughFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughStreamsFMS0_S0_":{"name":"notEnoughStreams","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13noStreamFoundFMS0_S0_":{"name":"noStreamFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15noPackInfoFoundFMS0_S0_":{"name":"noPackInfoFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14streamOverreadFMS0_S0_":{"name":"streamOverread","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Undocumented

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Undocumented

    "},"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"},"Other Classes.html":{"name":"Other Classes","abstract":"

    The following classes are available globally.

    "},"Other Enums.html":{"name":"Other Enums","abstract":"

    The following enums are available globally.

    "},"Other Structs.html":{"name":"Other Structs","abstract":"

    The following structs are available globally.

    "}} \ No newline at end of file +{"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Undocumented

    "},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongStartHeaderCRCFMS0_S0_":{"name":"wrongStartHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongHeaderSizeFMS0_S0_":{"name":"wrongHeaderSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongPropertyIDFMS0_S0_":{"name":"wrongPropertyID","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongExternalFMS0_S0_":{"name":"wrongExternal","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18reservedCodecFlagsFMS0_S0_":{"name":"reservedCodecFlags","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17unknownNumFoldersFMS0_S0_":{"name":"unknownNumFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongEndFMS0_S0_":{"name":"wrongEnd","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22altMethodsNotSupportedFMS0_S0_":{"name":"altMethodsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongStreamsNumberFMS0_S0_":{"name":"wrongStreamsNumber","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20wrongCoderPropertiesFMS0_S0_":{"name":"wrongCoderProperties","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noPackInfoFMS0_S0_":{"name":"noPackInfo","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17wrongFilePropertyFMS0_S0_":{"name":"wrongFileProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongFileNameLengthFMS0_S0_":{"name":"wrongFileNameLength","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongFileNamesFMS0_S0_":{"name":"wrongFileNames","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18incompletePropertyFMS0_S0_":{"name":"incompleteProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noFileSizeFMS0_S0_":{"name":"noFileSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughFoldersFMS0_S0_":{"name":"notEnoughFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughStreamsFMS0_S0_":{"name":"notEnoughStreams","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13noStreamFoundFMS0_S0_":{"name":"noStreamFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15noPackInfoFoundFMS0_S0_":{"name":"noPackInfoFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14streamOverreadFMS0_S0_":{"name":"streamOverread","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Undocumented

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Undocumented

    "},"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10isTextFileSb":{"name":"isTextFile","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"},"Other Classes.html":{"name":"Other Classes","abstract":"

    The following classes are available globally.

    "},"Other Enums.html":{"name":"Other Enums","abstract":"

    The following enums are available globally.

    "},"Other Structs.html":{"name":"Other Structs","abstract":"

    The following structs are available globally.

    "}} \ No newline at end of file diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/docSet.dsidx b/docs/docsets/SWCompression.docset/Contents/Resources/docSet.dsidx index b4120e97826f11b78211981e96c2d969034ebd8c..b382906247bab8cfb13c56b5c115c4f1eec5b7f8 100644 GIT binary patch delta 5703 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 B9H{^R delta 5360 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 fxl8Y+vEeRMaOi&k206N} diff --git a/docs/docsets/SWCompression.tgz b/docs/docsets/SWCompression.tgz index 2b11fed8262fbbd96e0a553246f8224c5ebca502..aa1a920c6991f34334b0eb1f749ac1760aa60a62 100644 GIT binary patch delta 123176 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�Rj5lYGPlsm;-svi>Sk6U#6V|dCnz=-pch;PnxrbD0PS4 z&?javqFISmgKWIt`-%s`5PxFPtDurVzKL(~cUgytZ z-^P#)UjKA~PC-M`_XY~$>z#c^#lo~=h1uT81(0a8)TE@9X?W;OCzgajv(%64V2O>g zXkH7UEvBmH{0_wv+m{*mCv1!wHbjW7&C306uXC)qC;NwS1P;>rLPKZ*Jc5 z4Y=o?V)DoettbS-%=lZiH|=tpn#%TSaN~|mV>xZ&CJ@(RQD3N5X^qW6%!a>FVc%o{ zf}}*@CHV>qnUx9>WfpAPBZC~=lb2)if-d>_U1L_lGQJ)L` zf4!>VM{s2e|5FdF>IxDWZ{3=B+qlPE@o-Fn6KWpz%;GS#j-gG`E5TX+^}N`l$Lw$z zpKzR4#mBrW!PF}cs#is`9FFIMIV_H6D#;HuO>^_pNh{mJctKFwJc)N*=<9=etw*uO zIKSEEY@8cFch}!~O)=)B#7U6j{6GaxSMpXY=HOa(E_^Hi* zK#f4Y|JqcM^uagZX2yl)Yy?WBU4P8Iss9DfpE!f;EQQ#tP4;TF1~q5Hh0PRasZfRI{w5`2R;!h2o(^=UhLN$_Og8GJuVjvvAlz7x8Y9ZF5(tA6tMJ2-zk#h)-`magZ2l&Ke=jh|Da>sDXgvnv~?|=atFj&kNkIbWP5+NLcZ&L z`HP8pmnK3sPy8esg~Y&9e<(${uIQ>pmnuqZDcnoOc*0U3Stx&{$RJezX&RjTr>i1Z z?Fn$1u^SrkrJ-IDgLK)w1o{63a^RROfTYFX0KIW>v7|wNKVm{x{oz!eXjH7}j0k|q zf`Cfsq(xW#Jz^F8V-8#l;R}OMf;575KfP2)aY02tDW!etvk(F*gH%1SG$q3hIrOe5 zmMdzoIR7(96!%*2@6FJ5B~Qe3L9N5yMoDb|k4kI)|L(57I5BPDJLtxeHT(O|RER8v z^Pom};8FdMGdjZoJH!u6uMZt?D~S@5=QoEJkedNh^0Il4oW(!;(8aKOq43ZZ5lETD z>UWpX`OL6+D|Q|yVzjTb37;lw@L0&?JB!uHu-n@d1otS$8SAI24)t8wWUPIs=kP-^ zz4JtV^RDp1JL89v-{NX*$)ZQcQQOACcNdUYocmVKK?IOGY}+`O&g?v~Q|<@J2rH{V zGLQ+-obsQl4!jkp7k*+4G60%XJUTG;rv9@6(gq1YZy88nf>wFqO_y0f=eek}#^X1= z+9$@?{^|q`^TE{r^|UES{qg!G@i^N9N%OJsWH;{2P&%rO^iZIp+W_F97Y?U*74Jh8 zz*tt}7wa-GQ~*3#FEavH^`diRQlF(nY_xA?XtdLr)bzPRF$^H*e|tf7Vj0LJZh?I2-nROX?t586%;IL%T`&4cJZIL z_6-a(=r55)l-ue&LI4a!^_ery))jkdZd|R$9KH5az67^Sm}C`ms6^wVqYf$0YO+iW z9rd@`Hb-vQJ$WNU3{tkrT0h9ESs9GF8lq=dkC|xm*_*Y5{mKyS-928bbat!E2xhOk z?rC3q=F#65h4&m4cY%LT^3mYu)q;?rs{WjiAtYpqQTk65pvT^X3lXs}w}+j5i8ZIk zJ|jZWlx~?T1|_BDH-|*pAnYu*5iXgWNeDx7x0{&u47L&SLc@OpR?*BcD1|J&?Eg?c z!<`HNfVLRJ|0&qg{I-g&20gYIltx2v4hc#;aboA27QTT$TcxJqJS) zl*=&O8QEW1Z?vVj(Qsh)ohm?H>s!2MxL2OwW+1AIZmG+!up4kp=pm}z9%B4F!Aj%b zIQ*o{|DsfnEm@#%FRUHfa_sjScYhvgHokhcS=#Q;p~gnc5WHS^pW&}jUKzU> Ly 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 JZI2x7e*jb3V6y-K diff --git a/docs/index.html b/docs/index.html index 1a654460..2bfcdeb3 100644 --- a/docs/index.html +++ b/docs/index.html @@ -22,7 +22,7 @@ SWCompression Docs - (69% documented) + (67% documented)

    diff --git a/docs/search.json b/docs/search.json index b0ad85e4..27045042 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -{"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Undocumented

    "},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongStartHeaderCRCFMS0_S0_":{"name":"wrongStartHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongHeaderSizeFMS0_S0_":{"name":"wrongHeaderSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongPropertyIDFMS0_S0_":{"name":"wrongPropertyID","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongExternalFMS0_S0_":{"name":"wrongExternal","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18reservedCodecFlagsFMS0_S0_":{"name":"reservedCodecFlags","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17unknownNumFoldersFMS0_S0_":{"name":"unknownNumFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongEndFMS0_S0_":{"name":"wrongEnd","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22altMethodsNotSupportedFMS0_S0_":{"name":"altMethodsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongStreamsNumberFMS0_S0_":{"name":"wrongStreamsNumber","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20wrongCoderPropertiesFMS0_S0_":{"name":"wrongCoderProperties","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noPackInfoFMS0_S0_":{"name":"noPackInfo","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17wrongFilePropertyFMS0_S0_":{"name":"wrongFileProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongFileNameLengthFMS0_S0_":{"name":"wrongFileNameLength","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongFileNamesFMS0_S0_":{"name":"wrongFileNames","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18incompletePropertyFMS0_S0_":{"name":"incompleteProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noFileSizeFMS0_S0_":{"name":"noFileSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughFoldersFMS0_S0_":{"name":"notEnoughFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughStreamsFMS0_S0_":{"name":"notEnoughStreams","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13noStreamFoundFMS0_S0_":{"name":"noStreamFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15noPackInfoFoundFMS0_S0_":{"name":"noPackInfoFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14streamOverreadFMS0_S0_":{"name":"streamOverread","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Undocumented

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Undocumented

    "},"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if an entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"},"Other Classes.html":{"name":"Other Classes","abstract":"

    The following classes are available globally.

    "},"Other Enums.html":{"name":"Other Enums","abstract":"

    The following enums are available globally.

    "},"Other Structs.html":{"name":"Other Structs","abstract":"

    The following structs are available globally.

    "}} \ No newline at end of file +{"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Undocumented

    "},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongStartHeaderCRCFMS0_S0_":{"name":"wrongStartHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongHeaderSizeFMS0_S0_":{"name":"wrongHeaderSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongPropertyIDFMS0_S0_":{"name":"wrongPropertyID","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongExternalFMS0_S0_":{"name":"wrongExternal","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18reservedCodecFlagsFMS0_S0_":{"name":"reservedCodecFlags","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17unknownNumFoldersFMS0_S0_":{"name":"unknownNumFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongEndFMS0_S0_":{"name":"wrongEnd","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22altMethodsNotSupportedFMS0_S0_":{"name":"altMethodsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongStreamsNumberFMS0_S0_":{"name":"wrongStreamsNumber","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20wrongCoderPropertiesFMS0_S0_":{"name":"wrongCoderProperties","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noPackInfoFMS0_S0_":{"name":"noPackInfo","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17wrongFilePropertyFMS0_S0_":{"name":"wrongFileProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongFileNameLengthFMS0_S0_":{"name":"wrongFileNameLength","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongFileNamesFMS0_S0_":{"name":"wrongFileNames","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18incompletePropertyFMS0_S0_":{"name":"incompleteProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noFileSizeFMS0_S0_":{"name":"noFileSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughFoldersFMS0_S0_":{"name":"notEnoughFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughStreamsFMS0_S0_":{"name":"notEnoughStreams","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13noStreamFoundFMS0_S0_":{"name":"noStreamFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15noPackInfoFoundFMS0_S0_":{"name":"noPackInfoFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14streamOverreadFMS0_S0_":{"name":"streamOverread","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Undocumented

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Undocumented

    "},"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10isTextFileSb":{"name":"isTextFile","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"},"Other Classes.html":{"name":"Other Classes","abstract":"

    The following classes are available globally.

    "},"Other Enums.html":{"name":"Other Enums","abstract":"

    The following enums are available globally.

    "},"Other Structs.html":{"name":"Other Structs","abstract":"

    The following structs are available globally.

    "}} \ No newline at end of file diff --git a/docs/undocumented.json b/docs/undocumented.json index 1818a440..80fe1075 100644 --- a/docs/undocumented.json +++ b/docs/undocumented.json @@ -9,7 +9,7 @@ }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zContainer.swift", - "line": 173, + "line": 164, "symbol": "SevenZipContainer.info(container:)", "symbol_kind": "source.lang.swift.decl.function.method.static", "warning": "undocumented" @@ -352,241 +352,283 @@ }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 9, + "line": 8, "symbol": "SevenZipError", "symbol_kind": "source.lang.swift.decl.enum", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 10, + "line": 9, "symbol": "SevenZipError.wrongSignature", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 11, + "line": 10, "symbol": "SevenZipError.wrongVersion", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 12, + "line": 11, "symbol": "SevenZipError.wrongStartHeaderCRC", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 13, + "line": 12, "symbol": "SevenZipError.wrongHeaderSize", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 14, + "line": 13, "symbol": "SevenZipError.wrongPropertyID", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 15, + "line": 14, "symbol": "SevenZipError.wrongHeaderCRC", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 16, + "line": 15, "symbol": "SevenZipError.wrongExternal", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 17, + "line": 16, "symbol": "SevenZipError.reservedCodecFlags", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 18, + "line": 17, "symbol": "SevenZipError.unknownNumFolders", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 19, + "line": 18, "symbol": "SevenZipError.wrongEnd", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 20, + "line": 19, "symbol": "SevenZipError.externalNotSupported", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 21, + "line": 20, "symbol": "SevenZipError.altMethodsNotSupported", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 22, + "line": 21, "symbol": "SevenZipError.wrongStreamsNumber", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 23, + "line": 22, "symbol": "SevenZipError.multiStreamNotSupported", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 24, + "line": 23, "symbol": "SevenZipError.compressionNotSupported", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 25, + "line": 24, "symbol": "SevenZipError.wrongDataSize", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 26, + "line": 25, "symbol": "SevenZipError.wrongCRC", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 27, + "line": 26, "symbol": "SevenZipError.wrongCoderProperties", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 28, + "line": 27, "symbol": "SevenZipError.noPackInfo", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 29, + "line": 28, "symbol": "SevenZipError.wrongFileProperty", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 30, + "line": 29, "symbol": "SevenZipError.wrongFileNameLength", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 31, + "line": 30, "symbol": "SevenZipError.wrongFileNames", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 32, + "line": 31, "symbol": "SevenZipError.startPosNotSupported", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 33, + "line": 32, "symbol": "SevenZipError.incompleteProperty", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 34, + "line": 33, "symbol": "SevenZipError.additionalStreamsNotSupported", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 35, + "line": 34, "symbol": "SevenZipError.noFileSize", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 36, + "line": 35, "symbol": "SevenZipError.notEnoughFolders", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 37, + "line": 36, "symbol": "SevenZipError.notEnoughStreams", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 38, + "line": 37, "symbol": "SevenZipError.noStreamFound", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 39, + "line": 38, "symbol": "SevenZipError.noPackInfoFound", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 40, + "line": 39, "symbol": "SevenZipError.streamOverread", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 41, + "line": 40, "symbol": "SevenZipError.dataIsUnavailable", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" }, { "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 42, + "line": 41, "symbol": "SevenZipError.encryptionNotSupported", "symbol_kind": "source.lang.swift.decl.enumelement", "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/Protocols.swift", + "line": 44, + "symbol": "ContainerEntry.isLink", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/Protocols.swift", + "line": 45, + "symbol": "ContainerEntry.linkPath", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/TarEntry.swift", + "line": 133, + "symbol": "TarEntry.isLink", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/ZipEntry.swift", + "line": 53, + "symbol": "ZipEntry.isLink", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/ZipEntry.swift", + "line": 55, + "symbol": "ZipEntry.linkPath", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/ZipEntry.swift", + "line": 61, + "symbol": "ZipEntry.isTextFile", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" } ], "source_directory": "/Users/timofeysolomko/Developer/Compression/SWCompression" From 745368e50d00f69019773b64d4155d0fbb081539 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Wed, 16 Aug 2017 22:47:24 +0300 Subject: [PATCH 102/113] Small fixes here and there --- SWCompression.podspec | 2 +- Sources/TarEntry.swift | 1 + Sources/XZArchive.swift | 9 ++++----- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/SWCompression.podspec b/SWCompression.podspec index bcfbb6d7..eb51fed1 100644 --- a/SWCompression.podspec +++ b/SWCompression.podspec @@ -70,7 +70,7 @@ Pod::Spec.new do |s| s.subspec 'SevenZip' do |sp| sp.dependency 'SWCompression/LZMA' - sp.source_files = 'Sources/{7z*,CheckSums,}.swift' + sp.source_files = 'Sources/{7z*,CheckSums,BitReader}.swift' sp.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-DSWCOMPRESSION_POD_SEVENZIP' } end diff --git a/Sources/TarEntry.swift b/Sources/TarEntry.swift index 24b205e8..83f7df07 100644 --- a/Sources/TarEntry.swift +++ b/Sources/TarEntry.swift @@ -175,6 +175,7 @@ public class TarEntry: ContainerEntry { // File mode guard let octalPosixPermissions = Int(try pointerData.nullSpaceEndedAsciiString(cutoff: 8)) else { throw TarError.fieldIsNotNumber } + // Sometime file mode also contains unix type, so we need to filter it out. let posixPermissions = octalPosixPermissions.octalToDecimal() & 0xFFF attributesDict[FileAttributeKey.posixPermissions] = posixPermissions mode = posixPermissions diff --git a/Sources/XZArchive.swift b/Sources/XZArchive.swift index c449976c..7f7e46fa 100644 --- a/Sources/XZArchive.swift +++ b/Sources/XZArchive.swift @@ -203,7 +203,7 @@ public class XZArchive: Archive { Bit values 00, 01, 10, 11 indicate filters number from 1 to 4, so we actually need to add 1 to get filters' number. */ - let numberOfFilters = blockFlags & 0x03 + 1 + let filtersCount = blockFlags & 0x03 + 1 guard blockFlags & 0x3C == 0 else { throw XZError.fieldReservedValue } @@ -214,13 +214,12 @@ public class XZArchive: Archive { let uncompressedSize = blockFlags & 0x80 != 0 ? try pointerData.multiByteDecode() : -1 var filters: [(DataWithPointer) throws -> [UInt8]] = [] - for _ in 0.. Date: Fri, 18 Aug 2017 09:48:36 +0300 Subject: [PATCH 103/113] Fix compile issues with renamed variable --- Sources/XZArchive.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/XZArchive.swift b/Sources/XZArchive.swift index 7f7e46fa..08124617 100644 --- a/Sources/XZArchive.swift +++ b/Sources/XZArchive.swift @@ -248,14 +248,14 @@ public class XZArchive: Archive { var intResult = pointerData let compressedDataStart = pointerData.index - for filterIndex in 0.. Date: Fri, 18 Aug 2017 09:48:55 +0300 Subject: [PATCH 104/113] Fix compile issues for performance tests --- Tests/Bzip2Tests.swift | 2 +- Tests/DeflateTests.swift | 2 +- Tests/GzipTests.swift | 2 +- Tests/XzTests.swift | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/Bzip2Tests.swift b/Tests/Bzip2Tests.swift index 3bdd57df..e39ce3e1 100644 --- a/Tests/Bzip2Tests.swift +++ b/Tests/Bzip2Tests.swift @@ -31,7 +31,7 @@ class Bzip2Tests: XCTestCase { #if PERF_TESTS print("Performing performance tests for \(Bzip2Tests.testType).\(testName)") self.measure { - _ = try BZip2.decompress(data: testData) + _ = try? BZip2.decompress(data: testData) } #endif } diff --git a/Tests/DeflateTests.swift b/Tests/DeflateTests.swift index 287c6b67..f6cf62a5 100644 --- a/Tests/DeflateTests.swift +++ b/Tests/DeflateTests.swift @@ -24,7 +24,7 @@ class DeflateTests: XCTestCase { #if PERF_TESTS print("Performing performance tests for deflate.\(testName)") self.measure { - _ = try Deflate.compress(data: answerData) + _ = try? Deflate.compress(data: answerData) } #endif diff --git a/Tests/GzipTests.swift b/Tests/GzipTests.swift index 9d5b5422..ebbe17b5 100644 --- a/Tests/GzipTests.swift +++ b/Tests/GzipTests.swift @@ -48,7 +48,7 @@ class GzipTests: XCTestCase { #if PERF_TESTS print("Performing performance tests for gz.\(testName)") self.measure { - _ = try GzipArchive.unarchive(archive: testData) + _ = try? GzipArchive.unarchive(archive: testData) } #endif } diff --git a/Tests/XzTests.swift b/Tests/XzTests.swift index 591f8ade..51f5a7c3 100644 --- a/Tests/XzTests.swift +++ b/Tests/XzTests.swift @@ -31,7 +31,7 @@ class XZTests: XCTestCase { #if PERF_TESTS print("Performing performance tests for \(XZTests.testType).\(testName)") self.measure { - _ = try XZArchive.unarchive(archive: testData) + _ = try? XZArchive.unarchive(archive: testData) } #endif } From 31aa3478421988ff825af76cc10b720b29d22e11 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Fri, 18 Aug 2017 09:49:12 +0300 Subject: [PATCH 105/113] Update test results --- Tests/Results.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Tests/Results.md b/Tests/Results.md index 796695be..25c1cbe2 100644 --- a/Tests/Results.md +++ b/Tests/Results.md @@ -35,6 +35,7 @@ BZip2 (Decompression) |3.0.0|0.000|0.003|0.002|0.001|0.000|0.078|3.901| |3.0.1|0.000|0.005|0.002|0.001|0.000|0.084|3.868| |3.1.0|0.000|0.002|0.002|0.000|0.000|0.054|3.268| +|3.3.0|0.000|0.002|0.002|0.000|0.000|0.051|3.948| Deflate (Decompression) --------------------------- @@ -51,6 +52,7 @@ Deflate (Decompression) |3.0.0|0.001|0.002|0.001|0.001|0.001|0.044|0.206| |3.0.1|0.001|0.002|0.001|0.000|0.001|0.046|0.210| |3.1.0|0.001|0.001|0.001|0.000|0.000|0.045|0.210| +|3.3.0|0.001|0.002|0.001|0.001|0.001|0.043|0.263| Deflate (Compression) --------------------------- @@ -63,6 +65,7 @@ Deflate (Compression) |3.0.0|0.001|0.003|0.002|0.001|0.000|0.036|3.888| |3.0.1|0.001|0.002|0.002|0.001|0.000|0.033|2.442| |3.1.0|0.000|0.002|0.002|0.001|0.001|0.031|2.539| +|3.3.0|0.001|0.002|0.002|0.001|0.001|0.032|2.542| XZ (LZMA/LZMA2) (Decompression) --------------------------- @@ -77,6 +80,7 @@ XZ (LZMA/LZMA2) (Decompression) |3.0.0|0.000|0.002|0.002|0.000|0.000|0.070|0.243| |3.0.1|0.000|0.002|0.001|0.000|0.000|0.076|0.253| |3.1.0|0.000|0.002|0.002|0.000|0.000|0.069|0.252| +|3.3.0|0.000|0.002|0.002|0.000|0.000|0.070|0.249| Debug ================= @@ -96,6 +100,7 @@ BZip2 (Decompression) |3.0.0|0.002|0.290|0.130|0.129|0.000|7.234|221.061| |3.0.1|0.002|0.274|0.126|0.125|0.000|6.831|-| |3.1.0|0.001|0.021|0.012|0.006|0.000|0.619|28.992| +|3.3.0|0.001|0.022|0.012|0.005|0.000|0.642|32.183| Deflate (Decompression) --------------------------- @@ -113,6 +118,7 @@ Deflate (Decompression) |3.0.0|0.001|0.006|0.004|0.002|0.002|0.515|0.535| |3.0.1|0.001|0.003|0.003|0.002|0.001|0.502|0.501| |3.1.0|0.001|0.004|0.003|0.002|0.001|0.563|0.535| +|3.3.0|0.001|0.004|0.003|0.002|0.002|0.512|3.058| Deflate (Compression) --------------------------- @@ -125,6 +131,7 @@ Deflate (Compression) |3.0.0|0.004|0.030|0.020|0.004|0.000|0.933|50.459| |3.0.1|0.002|0.017|0.006|0.002|0.000|0.762|12.384| |3.1.0|0.002|0.018|0.006|0.002|0.002|0.770|12.161| +|3.3.0|0.002|0.018|0.007|0.003|0.002|0.779|12.792| XZ (LZMA/LZMA2) (Decompression) --------------------------- @@ -139,3 +146,4 @@ XZ (LZMA/LZMA2) (Decompression) |3.0.0|0.001|0.006|0.008|0.001|0.000|0.488|0.512| |3.0.1|0.000|0.007|0.007|0.001|0.000|0.470|0.507| |3.1.0|0.000|0.007|0.007|0.001|0.000|0.466|0.521| +|3.3.0|0.000|0.006|0.008|0.001|0.000|0.536|0.527| From 0ff3e2f5e36a9d5f719e0113232b62fc0af006f7 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 19 Aug 2017 15:46:43 +0300 Subject: [PATCH 106/113] Significantly reduce number of error cases in 7zError Also some of them were renamed. --- Sources/7zCoder.swift | 4 +--- Sources/7zCoderInfo.swift | 6 +++--- Sources/7zContainer.swift | 22 ++++++++++---------- Sources/7zError.swift | 39 ++++++++++------------------------- Sources/7zFileInfo.swift | 12 +++++------ Sources/7zFolder.swift | 16 +++++++------- Sources/7zHeader.swift | 8 +++---- Sources/7zPackInfo.swift | 2 +- Sources/7zStreamInfo.swift | 2 +- Sources/7zSubstreamInfo.swift | 2 +- 10 files changed, 47 insertions(+), 66 deletions(-) diff --git a/Sources/7zCoder.swift b/Sources/7zCoder.swift index 09bf199e..27011372 100644 --- a/Sources/7zCoder.swift +++ b/Sources/7zCoder.swift @@ -35,13 +35,11 @@ class SevenZipCoder { init(_ bitReader: BitReader) throws { let flags = bitReader.byte() guard flags & 0xC0 == 0 - else { throw SevenZipError.reservedCodecFlags } + else { throw SevenZipError.internalStructureError } idSize = (flags & 0x0F).toInt() isComplex = flags & 0x10 != 0 hasAttributes = flags & 0x20 != 0 - guard flags & 0x80 == 0 else { throw SevenZipError.altMethodsNotSupported } - id = bitReader.bytes(count: idSize) numInStreams = isComplex ? bitReader.szMbd() : 1 diff --git a/Sources/7zCoderInfo.swift b/Sources/7zCoderInfo.swift index 79f4952b..27b59ee2 100644 --- a/Sources/7zCoderInfo.swift +++ b/Sources/7zCoderInfo.swift @@ -19,7 +19,7 @@ class SevenZipCoderInfo { init(_ bitReader: BitReader) throws { var type = bitReader.byte() - guard type == 0x0B else { throw SevenZipError.wrongPropertyID } + guard type == 0x0B else { throw SevenZipError.internalStructureError } numFolders = bitReader.szMbd() external = bitReader.byte() @@ -32,7 +32,7 @@ class SevenZipCoderInfo { } type = bitReader.byte() - guard type == 0x0C else { throw SevenZipError.wrongPropertyID } + guard type == 0x0C else { throw SevenZipError.internalStructureError } for folder in folders { for _ in 0..= folder.numUnpackSubstreams { // If we read all files in folder... // We need to check folder's unpacked size as well as its CRC32 (if it is available). guard folderUnpackSize == folder.unpackSize() - else { throw SevenZipError.wrongDataSize } + else { throw SevenZipError.wrongSize } if let storedFolderCRC = folder.crc { guard folderCRC == storedFolderCRC else { throw SevenZipError.wrongCRC } @@ -196,7 +196,7 @@ public class SevenZipContainer: Container { // Check archive version. guard bitReader.bytes(count: 2) == [0, 4] // 7zFormat.txt says it should be [0, 2] instead. - else { throw SevenZipError.wrongVersion } + else { throw SevenZipError.wrongFormatVersion } let startHeaderCRC = bitReader.uint32() @@ -207,7 +207,7 @@ public class SevenZipContainer: Container { bitReader.index = 12 guard CheckSums.crc32(bitReader.bytes(count: 20)) == startHeaderCRC - else { throw SevenZipError.wrongStartHeaderCRC } + else { throw SevenZipError.wrongCRC } // **Header** bitReader.index += nextHeaderOffset @@ -229,17 +229,17 @@ public class SevenZipContainer: Container { header = try SevenZipHeader(bitReader) headerEndIndex = bitReader.index } else { - throw SevenZipError.wrongPropertyID + throw SevenZipError.internalStructureError } // Check header size guard headerEndIndex - headerStartIndex == nextHeaderSize - else { throw SevenZipError.wrongHeaderSize } + else { throw SevenZipError.wrongSize } // Check header CRC bitReader.index = headerStartIndex guard CheckSums.crc32(bitReader.bytes(count: nextHeaderSize)) == nextHeaderCRC - else { throw SevenZipError.wrongHeaderCRC } + else { throw SevenZipError.wrongCRC } return header } diff --git a/Sources/7zError.swift b/Sources/7zError.swift index b4869f9e..b7960351 100644 --- a/Sources/7zError.swift +++ b/Sources/7zError.swift @@ -7,36 +7,19 @@ import Foundation public enum SevenZipError: Error { case wrongSignature - case wrongVersion - case wrongStartHeaderCRC - case wrongHeaderSize - case wrongPropertyID - case wrongHeaderCRC - case wrongExternal - case reservedCodecFlags - case unknownNumFolders - case wrongEnd - case externalNotSupported - case altMethodsNotSupported - case wrongStreamsNumber - case multiStreamNotSupported - case compressionNotSupported - case wrongDataSize + case wrongFormatVersion + case wrongCRC - case wrongCoderProperties - case noPackInfo - case wrongFileProperty - case wrongFileNameLength - case wrongFileNames + case wrongSize + case startPosNotSupported - case incompleteProperty + case externalNotSupported + case multiStreamNotSupported case additionalStreamsNotSupported - case noFileSize - case notEnoughFolders - case notEnoughStreams - case noStreamFound - case noPackInfoFound - case streamOverread - case dataIsUnavailable + case compressionNotSupported case encryptionNotSupported + + case dataIsUnavailable + + case internalStructureError } diff --git a/Sources/7zFileInfo.swift b/Sources/7zFileInfo.swift index 3f302ca1..c996e687 100644 --- a/Sources/7zFileInfo.swift +++ b/Sources/7zFileInfo.swift @@ -45,12 +45,12 @@ class SevenZipFileInfo { bitReader.align() case 0x0F: // EmptyFile guard let emptyStreamCount = isEmptyStream?.reduce(0, { $0 + $1}) - else { throw SevenZipError.wrongFileProperty } + else { throw SevenZipError.internalStructureError } isEmptyFile = bitReader.bits(count: emptyStreamCount.toInt()) bitReader.align() case 0x10: // AntiFile (used in backups to indicate that file was removed) guard let emptyStreamCount = isEmptyStream?.reduce(0, { $0 + $1}) - else { throw SevenZipError.wrongFileProperty } + else { throw SevenZipError.internalStructureError } isAntiFile = bitReader.bits(count: emptyStreamCount.toInt()) bitReader.align() case 0x11: // File name @@ -58,7 +58,7 @@ class SevenZipFileInfo { guard external == 0 else { throw SevenZipError.externalNotSupported } guard (propertySize - 1) & 1 == 0 - else { throw SevenZipError.wrongFileNameLength } + else { throw SevenZipError.internalStructureError } let names = bitReader.bytes(count: propertySize - 1) var nextFile = 0 var nextName = 0 @@ -74,7 +74,7 @@ class SevenZipFileInfo { } } guard nextName == names.count && nextFile == numFiles - else { throw SevenZipError.wrongFileNames } + else { throw SevenZipError.internalStructureError } case 0x12: // Creation time let timesDefined = bitReader.defBits(count: numFiles) bitReader.align() @@ -130,11 +130,11 @@ class SevenZipFileInfo { throw SevenZipError.startPosNotSupported case 0x19: // "Dummy". Used for alignment/padding. guard bitReader.size - bitReader.index >= propertySize - else { throw SevenZipError.incompleteProperty } + else { throw SevenZipError.internalStructureError } bitReader.index += propertySize default: // Unknown property guard bitReader.size - bitReader.index >= propertySize - else { throw SevenZipError.incompleteProperty } + else { throw SevenZipError.internalStructureError } unknownProperties.append(SevenZipProperty(propertyType, propertySize, bitReader.bytes(count: propertySize))) } diff --git a/Sources/7zFolder.swift b/Sources/7zFolder.swift index cff6843b..713cf40f 100644 --- a/Sources/7zFolder.swift +++ b/Sources/7zFolder.swift @@ -47,7 +47,7 @@ class SevenZipFolder { totalInputStreams += coder.numInStreams } - guard totalOutputStreams != 0 else { throw SevenZipError.wrongStreamsNumber } + guard totalOutputStreams != 0 else { throw SevenZipError.internalStructureError } numBindPairs = totalOutputStreams - 1 if numBindPairs > 0 { @@ -56,7 +56,7 @@ class SevenZipFolder { } } - guard totalInputStreams >= numBindPairs else { throw SevenZipError.wrongStreamsNumber } + guard totalInputStreams >= numBindPairs else { throw SevenZipError.internalStructureError } numPackedStreams = totalInputStreams - numBindPairs if numPackedStreams == 1 { @@ -68,7 +68,7 @@ class SevenZipFolder { i += 1 } if i == totalInputStreams { - throw SevenZipError.wrongStreamsNumber + throw SevenZipError.internalStructureError } packedStreams.append(i) } else { @@ -153,9 +153,9 @@ class SevenZipFolder { } else if coder.id == SevenZipCoder.ID.lzma2 { // Dictionary size is stored in coder's properties. guard let properties = coder.properties - else { throw SevenZipError.wrongCoderProperties } + else { throw LZMA2Error.wrongProperties } guard properties.count == 1 - else { throw SevenZipError.wrongCoderProperties } + else { throw LZMA2Error.wrongProperties } let pointerData = DataWithPointer(data: decodedData) decodedData = Data(bytes: try LZMA2.decompress(LZMA2.dictionarySize(properties[0]), @@ -163,9 +163,9 @@ class SevenZipFolder { } else if coder.id == SevenZipCoder.ID.lzma { // Both properties' byte (lp, lc, pb) and dictionary size are stored in coder's properties. guard let properties = coder.properties - else { throw SevenZipError.wrongCoderProperties } + else { throw LZMAError.wrongProperties } guard properties.count == 5 - else { throw SevenZipError.wrongCoderProperties } + else { throw LZMAError.wrongProperties } let pointerData = DataWithPointer(data: decodedData) let lzmaDecoder = try LZMADecoder(pointerData) @@ -186,7 +186,7 @@ class SevenZipFolder { } guard decodedData.count == unpackSize - else { throw SevenZipError.wrongDataSize } + else { throw SevenZipError.wrongSize } } return decodedData } diff --git a/Sources/7zHeader.swift b/Sources/7zHeader.swift index 16b2f7e8..3be7c58f 100644 --- a/Sources/7zHeader.swift +++ b/Sources/7zHeader.swift @@ -35,14 +35,14 @@ class SevenZipHeader { } if type != 0x00 { - throw SevenZipError.wrongEnd + throw SevenZipError.internalStructureError } } convenience init(_ bitReader: BitReader, using streamInfo: SevenZipStreamInfo) throws { let folder = streamInfo.coderInfo.folders[0] guard let packInfo = streamInfo.packInfo - else { throw SevenZipError.noPackInfo } + else { throw SevenZipError.internalStructureError } let folderOffset = SevenZipContainer.signatureHeaderSize + packInfo.packPosition bitReader.index = folderOffset @@ -51,7 +51,7 @@ class SevenZipHeader { let headerData = try folder.unpack(data: packedHeaderData) guard headerData.count == folder.unpackSize() - else { throw SevenZipError.wrongDataSize } + else { throw SevenZipError.wrongSize } if let crc = folder.crc { guard CheckSums.crc32(headerData) == crc else { throw SevenZipError.wrongCRC } @@ -60,7 +60,7 @@ class SevenZipHeader { let headerBitReader = BitReader(data: headerData, bitOrder: .straight) guard headerBitReader.byte() == 0x01 - else { throw SevenZipError.wrongPropertyID } + else { throw SevenZipError.internalStructureError } try self.init(headerBitReader) } diff --git a/Sources/7zPackInfo.swift b/Sources/7zPackInfo.swift index 6e70aceb..acd1a25e 100644 --- a/Sources/7zPackInfo.swift +++ b/Sources/7zPackInfo.swift @@ -41,7 +41,7 @@ class SevenZipPackInfo { } if type != 0x00 { - throw SevenZipError.wrongEnd + throw SevenZipError.internalStructureError } } diff --git a/Sources/7zStreamInfo.swift b/Sources/7zStreamInfo.swift index 06c24c3b..61828896 100644 --- a/Sources/7zStreamInfo.swift +++ b/Sources/7zStreamInfo.swift @@ -32,7 +32,7 @@ class SevenZipStreamInfo { } if type != 0x00 { - throw SevenZipError.wrongEnd + throw SevenZipError.internalStructureError } } diff --git a/Sources/7zSubstreamInfo.swift b/Sources/7zSubstreamInfo.swift index c2904d39..befb66f6 100644 --- a/Sources/7zSubstreamInfo.swift +++ b/Sources/7zSubstreamInfo.swift @@ -80,7 +80,7 @@ class SevenZipSubstreamInfo { } if type != 0x00 { - throw SevenZipError.wrongEnd + throw SevenZipError.internalStructureError } } From 33c347c13168df6e96feeea46660632fd4f55692 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 19 Aug 2017 16:23:26 +0300 Subject: [PATCH 107/113] Add documentation for 7z --- Sources/7zContainer.swift | 36 +++++++++++++++++++ Sources/7zEntry.swift | 32 +++++++++++++++++ Sources/7zEntryInfo.swift | 74 +++++++++++++++++++++++++++++++++++++++ Sources/7zError.swift | 29 ++++++++++++--- 4 files changed, 167 insertions(+), 4 deletions(-) diff --git a/Sources/7zContainer.swift b/Sources/7zContainer.swift index fbe77e3a..95b122ad 100644 --- a/Sources/7zContainer.swift +++ b/Sources/7zContainer.swift @@ -5,10 +5,27 @@ import Foundation +/// Provides open functions for 7-Zip containers. public class SevenZipContainer: Container { static let signatureHeaderSize = 32 + /** + Processes 7-Zip container and returns an array of `ContainerEntry` (which are actually `SevenZipEntry`). + + - Important: The order of entries is defined by 7-Zip container and, + particularly, by the creator of a given 7-Zip container. + It is likely that directories will be encountered earlier than files stored in those directories, + but one SHOULD NOT rely on any particular order. + + - Parameter container: 7-Zip container's data. + + - Throws: `SevenZipError` or any other error associated with compression type, + depending on the type of the problem. + It may indicate that either container is damaged or it might not be 7-Zip container at all. + + - Returns: Array of `SevenZipEntry` as an array of `ContainerEntry`. + */ public static func open(container data: Data) throws -> [ContainerEntry] { var entries = [SevenZipEntry]() guard let header = try readHeader(data) @@ -60,6 +77,7 @@ public class SevenZipContainer: Container { info = SevenZipEntryInfo(file) data = nil continue + // FIXME: Possible problems, because we didn't update counters for folders and files. } // Check if there is enough folders. @@ -161,6 +179,24 @@ public class SevenZipContainer: Container { return entries } + /** + Processes ZIP container and returns an array of `SevenZipEntryInfo`, + which contain various information about container's entry. + This is performed without decompressing entries' data. + + - Important: The order of entries is defined by 7-Zip container and, + particularly, by the creator of a given 7-Zip container. + It is likely that directories will be encountered earlier than files stored in those directories, + but one SHOULD NOT rely on any particular order. + + - Parameter container: 7-Zip container's data. + + - Throws: `SevenZipError` or any other error associated with compression type, + depending on the type of the problem. + It may indicate that either container is damaged or it might not be 7-Zip container at all. + + - Returns: Array of `SevenZipEntryInfo`. + */ public static func info(container data: Data) throws -> [SevenZipEntryInfo] { var entryInfos = [SevenZipEntryInfo]() guard let header = try readHeader(data) diff --git a/Sources/7zEntry.swift b/Sources/7zEntry.swift index ee047f49..90edbad8 100644 --- a/Sources/7zEntry.swift +++ b/Sources/7zEntry.swift @@ -5,27 +5,54 @@ import Foundation +/// Represents an entry in 7-Zip container. public class SevenZipEntry: ContainerEntry { + /// Various information about entry. public let info: SevenZipEntryInfo + /// Entry's name. public var name: String { return info.name ?? "" } + /// Entry's data size. public var size: Int { return info.size ?? 0 } + /// True, if entry is a directory. public var isDirectory: Bool { return info.isDirectory } + /// True, if entry is a symbolic link. public let isLink: Bool + + /// Path to a linked file for symbolic link entry. public let linkPath: String? + /** + Provides a dictionary with various attributes of the entry. + `FileAttributeKey` values are used as dictionary keys. + + ## Possible attributes: + + - `FileAttributeKey.posixPermissions`, + - `FileAttributeKey.size`, + - `FileAttributeKey.modificationDate`, + - `FileAttributeKey.creationDate`, + - `FileAttributeKey.type`, + - `FileAttributeKey.appendOnly`. + + Most modern TAR containers are in UStar format. + */ public var entryAttributes: [FileAttributeKey: Any] + /** + True, if data for entry is available. + It might not be depending on the content of the container. + */ public let dataIsAvailable: Bool private let dataObject: Data? @@ -104,6 +131,11 @@ public class SevenZipEntry: ContainerEntry { self.entryAttributes = attributesDict } + /** + Returns data associated with this entry. + + - Throws: `SevenZipError.dataIsUnavailable` if data for entry isn't available. + */ public func data() throws -> Data { if let data = dataObject { return data diff --git a/Sources/7zEntryInfo.swift b/Sources/7zEntryInfo.swift index bbf4fc64..bbb606f8 100644 --- a/Sources/7zEntryInfo.swift +++ b/Sources/7zEntryInfo.swift @@ -5,77 +5,151 @@ import Foundation +/// Provides information about 7-Zip entry. public struct SevenZipEntryInfo { + /// Represents file access permissions in UNIX format. public struct Permissions: OptionSet { + /// Raw bit flags value (in decimal). public let rawValue: UInt32 + /// Initializes permissions with bit flags in decimal. public init(rawValue: UInt32) { self.rawValue = rawValue } + /// Set UID. public static let setuid = Permissions(rawValue: 0o4000) + + /// Set GID. public static let setgid = Permissions(rawValue: 0o2000) + + /// Sticky bit. public static let sticky = Permissions(rawValue: 0o1000) + /// Owner can read. public static let readOwner = Permissions(rawValue: 0o0400) + + /// Owner can write. public static let writeOwner = Permissions(rawValue: 0o0200) + + /// Owner can execute. public static let executeOwner = Permissions(rawValue: 0o0100) + /// Group can read. public static let readGroup = Permissions(rawValue: 0o0040) + + /// Group can write. public static let writeGroup = Permissions(rawValue: 0o0020) + + /// Group can execute. public static let executeGroup = Permissions(rawValue: 0o0010) + /// Others can read. public static let readOther = Permissions(rawValue: 0o0004) + + /// Others can write. public static let writeOther = Permissions(rawValue: 0o0002) + + /// Others can execute. public static let executeOther = Permissions(rawValue: 0o0001) } + /// Represents file attributes in DOS format. public struct DosAttributes: OptionSet { + /// Raw bit flags value. public let rawValue: UInt32 + /// Initializes attributes with bit flags. public init(rawValue: UInt32) { self.rawValue = rawValue } + /// File is archive or archived. public static let archive = DosAttributes(rawValue: 0b00100000) + + /// File is a directory. public static let directory = DosAttributes(rawValue: 0b00010000) + + /// File is a volume. public static let volume = DosAttributes(rawValue: 0b00001000) + + /// File is a system file. public static let system = DosAttributes(rawValue: 0b00000100) + + /// File is hidden. public static let hidden = DosAttributes(rawValue: 0b00000010) + + /// File is read-only. public static let readOnly = DosAttributes(rawValue: 0b00000001) } + /// Represents file type in UNIX format. public enum UnixType: UInt32 { + /// FIFO special file. case fifo = 0o010000 + /// Character special file. case characterSpecial = 0o020000 + /// Directory. case directory = 0o040000 + /// Block special file. case blockSpecial = 0o060000 + /// Regular file. case regular = 0o100000 + /// Symbolic link. case symbolicLink = 0o120000 + /// Socket. case socket = 0o140000 } + /// Entry's name. public let name: String? + + /// Entry's data size. public let size: Int? + + /// True, if entry is a directory. public let isDirectory: Bool + + /// Entry's last access time and date. public let accessTime: Date? + + /// Entry's creation time and date. public let creationTime: Date? + + /// Entry's last modification time and date. public let modificationTime: Date? + + /// 7-Zip internal property which may contain UNIX permissions, type and/or DOS attributes. public let winAttributes: UInt32? + /// Entry's UNIX file access permissions. public let permissions: Permissions? + + /// Entry's DOS attributes. public let dosAttributes: DosAttributes? + + /// Entry's UNIX file type. public let unixType: UnixType? + /// 7-Zip internal propety. Indicates whether entry has a stream (data) inside container. public let hasStream: Bool + + /// True, if entry is an empty file. 7-Zip internal property. public let isEmpty: Bool + + /** + True if entry is an anti-file. + Used in differential backups to indicate that file should be deleted. + 7-Zip internal property. + */ public let isAnti: Bool + /// CRC32 of entry's data. public let crc: UInt32? init(_ file: SevenZipFileInfo.File, _ size: Int? = nil, _ crc: UInt32? = nil) { diff --git a/Sources/7zError.swift b/Sources/7zError.swift index b7960351..d7914309 100644 --- a/Sources/7zError.swift +++ b/Sources/7zError.swift @@ -5,21 +5,42 @@ import Foundation +/** + Represents an error, which happened during processing 7-Zip container. + It may indicate that either container is damaged or it might not be 7-Zip container at all. + */ public enum SevenZipError: Error { + /// Wrong container's signature. case wrongSignature + /// Unsupporte version of container's format. case wrongFormatVersion - + /** + CRC either of one of the files from the container + or one of the container's strucutures is incorrect. + */ case wrongCRC + /** + Size either of one of the files from the container + or one of the container's strucutures is incorrect. + */ case wrongSize - + /// Files have StartPos property. This feature isn't supported. case startPosNotSupported + /// External feature isn't supported. case externalNotSupported + /// Coders with multiple in and/or out streams aren't supported. case multiStreamNotSupported + /// Additional streams feature isn't supported. case additionalStreamsNotSupported + /// Entry is compressed using unsupported compression method. case compressionNotSupported + /// Entry or container's header is encrypted. This feature isn't supported. case encryptionNotSupported - + /// Entry's data isn't available. case dataIsUnavailable - + /** + Unknown/incorrect internal 7-Zip structure was encountered or + no internal structure was found where it must be. + */ case internalStructureError } From 82b4da87893368db8a16a130d4984ed53637c32e Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 19 Aug 2017 16:23:55 +0300 Subject: [PATCH 108/113] Add and update docs for other classes. --- Sources/Protocols.swift | 5 ++++- Sources/TarContainer.swift | 4 ++-- Sources/TarEntry.swift | 13 +++---------- Sources/ZipContainer.swift | 4 ++-- Sources/ZipEntry.swift | 13 ++++--------- 5 files changed, 15 insertions(+), 24 deletions(-) diff --git a/Sources/Protocols.swift b/Sources/Protocols.swift index e2a7091b..0cd93fd1 100644 --- a/Sources/Protocols.swift +++ b/Sources/Protocols.swift @@ -38,10 +38,13 @@ public protocol ContainerEntry { /// Retrieve size of the entry's data from the container. var size: Int { get } - /// Check if entry is a directory. + /// True, if entry is a directory. var isDirectory: Bool { get } + /// True, if entry is a symbolic link. var isLink: Bool { get } + + /// Path to a linked file for symbolic link entry. var linkPath: String? { get } /** diff --git a/Sources/TarContainer.swift b/Sources/TarContainer.swift index c757395b..711f6034 100644 --- a/Sources/TarContainer.swift +++ b/Sources/TarContainer.swift @@ -9,10 +9,10 @@ import Foundation public class TarContainer: Container { /** - Processes TAR container and returns an array of `ContainerEntries` (which are actually `TarEntries`). + Processes TAR container and returns an array of `ContainerEntry` (which are actually `TarEntry`). - Important: The order of entries is defined by TAR container and, - particularly, by a creator of a given TAR container. + particularly, by the creator of a given TAR container. It is likely that directories will be encountered earlier than files stored in those directories, but one SHOULD NOT rely on any particular order. diff --git a/Sources/TarEntry.swift b/Sources/TarEntry.swift index 83f7df07..785c9d93 100644 --- a/Sources/TarEntry.swift +++ b/Sources/TarEntry.swift @@ -8,12 +8,7 @@ import Foundation /// Represents either a file or directory entry in TAR container. public class TarEntry: ContainerEntry { - /** - Represents a type of an entry. - - - Warning: - Deprecated and will be removed in 4.0. `FileAttributeType` values will be used instead. - */ + /// Represents a type of an entry. public enum EntryType: String { /// Normal file. case normal = "0" @@ -56,9 +51,6 @@ public class TarEntry: ContainerEntry { Provides a dictionary with various attributes of the entry. `FileAttributeKey` values are used as dictionary keys. - - Note: - Will be renamed in 4.0. - ## Possible attributes: - `FileAttributeKey.posixPermissions`, @@ -130,9 +122,10 @@ public class TarEntry: ContainerEntry { /// Comment associated with the entry (PAX only). public private(set) var comment: String? + /// True if entry is a symbolic link. public let isLink: Bool - /// Path to a linked file. + /// Path to a linked file for symbolic link entry. public var linkPath: String? { return (paxLinkPath ?? gnuLongLinkName) ?? linkedFileName } diff --git a/Sources/ZipContainer.swift b/Sources/ZipContainer.swift index 87f43d58..d7c71056 100644 --- a/Sources/ZipContainer.swift +++ b/Sources/ZipContainer.swift @@ -9,10 +9,10 @@ import Foundation public class ZipContainer: Container { /** - Processes ZIP container and returns an array of `ContainerEntries` (which are actually `ZipEntries`). + Processes ZIP container and returns an array of `ContainerEntry` (which are actually `ZipEntry`). - Important: The order of entries is defined by ZIP container and, - particularly, by a creator of a given ZIP container. + particularly, by the creator of a given ZIP container. It is likely that directories will be encountered earlier than files stored in those directories, but one SHOULD NOT rely on any particular order. diff --git a/Sources/ZipEntry.swift b/Sources/ZipEntry.swift index 4f60b923..eef1f402 100644 --- a/Sources/ZipEntry.swift +++ b/Sources/ZipEntry.swift @@ -22,12 +22,7 @@ public class ZipEntry: ContainerEntry { return self.cdEntry.fileComment } - /** - File or directory attributes related to the file system of the container's creator. - - - Note: - Will be renamed to `externalFileAttributes` in 4.0. - */ + /// File or directory attributes related to the file system of the container's creator. public var attributes: UInt32 { return self.cdEntry.externalFileAttributes } @@ -50,14 +45,17 @@ public class ZipEntry: ContainerEntry { } } + /// True, if entry is a symbolic link. public let isLink: Bool + /// Path to a linked file for symbolic link entry. public lazy var linkPath: String? = { guard self.isLink else { return nil } guard let entryData = try? self.data() else { return nil } return String(data: entryData, encoding: .utf8) }() + /// True if entry is likely to be text or ASCII file. public var isTextFile: Bool { return cdEntry.internalFileAttributes & 0x1 != 0 } @@ -66,9 +64,6 @@ public class ZipEntry: ContainerEntry { Provides a dictionary with various attributes of the entry. `FileAttributeKey` values are used as dictionary keys. - - Note: - Will be renamed in 4.0. - ## Possible attributes: - `FileAttributeKey.modificationDate` From a012413000503ac6c396f74595389ad026319e5c Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 19 Aug 2017 16:27:50 +0300 Subject: [PATCH 109/113] Update jazzy categories --- .jazzy.yaml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.jazzy.yaml b/.jazzy.yaml index f0768200..b87c04ba 100644 --- a/.jazzy.yaml +++ b/.jazzy.yaml @@ -21,25 +21,29 @@ custom_categories: children: - GzipArchive - GzipHeader + - XZArchive - ZlibArchive - ZlibHeader - - XZArchive - name: Containers children: - - ZipContainer - - ZipEntry + - SevenZipContainer + - SevenZipEntry + - SevenZipEntryInfo - TarContainer - TarEntry + - ZipContainer + - ZipEntry - name: Errors children: - BZip2Error - DeflateError - - GzipError - - LZMA2Error - LZMAError + - LZMA2Error + - SevenZipError - TarError - - XZError - ZipError + - GzipError + - XZError - ZlibError - name: Protocols children: From 617c86fe92fe95d8d096e0620a45c3b5c5962445 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 19 Aug 2017 16:28:01 +0300 Subject: [PATCH 110/113] Rebuild jazzy docs --- docs/Archives.html | 119 ++- docs/Classes/BZip2.html | 77 +- docs/Classes/Deflate.html | 77 +- docs/Classes/GzipArchive.html | 77 +- docs/Classes/GzipArchive/Member.html | 77 +- docs/Classes/LZMA.html | 77 +- docs/Classes/LZMA2.html | 77 +- docs/Classes/SevenZipContainer.html | 184 ++-- docs/Classes/SevenZipEntry.html | 197 +++-- docs/Classes/TarContainer.html | 81 +- docs/Classes/TarEntry.html | 133 ++- docs/Classes/TarEntry/EntryType.html | 104 +-- docs/Classes/XZArchive.html | 77 +- docs/Classes/ZipContainer.html | 81 +- docs/Classes/ZipEntry.html | 115 +-- docs/Classes/ZlibArchive.html | 77 +- docs/Compression.html | 77 +- docs/Containers.html | 212 +++-- docs/Enums/BZip2Error.html | 77 +- docs/Enums/DeflateError.html | 77 +- docs/Enums/GzipError.html | 77 +- docs/Enums/LZMA2Error.html | 77 +- docs/Enums/LZMAError.html | 77 +- docs/Enums/SevenZipError.html | 797 ++++-------------- docs/Enums/TarError.html | 77 +- docs/Enums/XZError.html | 77 +- docs/Enums/ZipError.html | 77 +- docs/Enums/ZlibError.html | 77 +- docs/Errors.html | 177 ++-- docs/Other Classes.html | 288 ------- docs/Other Enums.html | 261 ------ docs/Other Structs.html | 261 ------ docs/Protocols.html | 79 +- docs/Protocols/Archive.html | 77 +- docs/Protocols/Container.html | 77 +- docs/Protocols/ContainerEntry.html | 95 +-- docs/Protocols/DecompressionAlgorithm.html | 77 +- docs/Structs/GzipHeader.html | 77 +- .../Structs/GzipHeader/CompressionMethod.html | 77 +- docs/Structs/GzipHeader/FileSystemType.html | 77 +- docs/Structs/SevenZipEntryInfo.html | 291 +++++-- .../SevenZipEntryInfo/DosAttributes.html | 194 +++-- .../SevenZipEntryInfo/Permissions.html | 266 +++--- docs/Structs/SevenZipEntryInfo/UnixType.html | 169 ++-- docs/Structs/ZlibHeader.html | 77 +- docs/Structs/ZlibHeader/CompressionLevel.html | 77 +- .../Structs/ZlibHeader/CompressionMethod.html | 77 +- docs/badge.svg | 2 +- .../Resources/Documents/Archives.html | 119 ++- .../Resources/Documents/Classes/BZip2.html | 77 +- .../Resources/Documents/Classes/Deflate.html | 77 +- .../Documents/Classes/GzipArchive.html | 77 +- .../Documents/Classes/GzipArchive/Member.html | 77 +- .../Resources/Documents/Classes/LZMA.html | 77 +- .../Resources/Documents/Classes/LZMA2.html | 77 +- .../Documents/Classes/SevenZipContainer.html | 184 ++-- .../Documents/Classes/SevenZipEntry.html | 197 +++-- .../Documents/Classes/TarContainer.html | 81 +- .../Resources/Documents/Classes/TarEntry.html | 133 ++- .../Documents/Classes/TarEntry/EntryType.html | 104 +-- .../Documents/Classes/XZArchive.html | 77 +- .../Documents/Classes/ZipContainer.html | 81 +- .../Resources/Documents/Classes/ZipEntry.html | 115 +-- .../Documents/Classes/ZlibArchive.html | 77 +- .../Resources/Documents/Compression.html | 77 +- .../Resources/Documents/Containers.html | 212 +++-- .../Resources/Documents/Enums/BZip2Error.html | 77 +- .../Documents/Enums/DeflateError.html | 77 +- .../Resources/Documents/Enums/GzipError.html | 77 +- .../Resources/Documents/Enums/LZMA2Error.html | 77 +- .../Resources/Documents/Enums/LZMAError.html | 77 +- .../Documents/Enums/SevenZipError.html | 797 ++++-------------- .../Resources/Documents/Enums/TarError.html | 77 +- .../Resources/Documents/Enums/XZError.html | 77 +- .../Resources/Documents/Enums/ZipError.html | 77 +- .../Resources/Documents/Enums/ZlibError.html | 77 +- .../Contents/Resources/Documents/Errors.html | 177 ++-- .../Resources/Documents/Other Classes.html | 288 ------- .../Resources/Documents/Other Enums.html | 261 ------ .../Resources/Documents/Other Structs.html | 261 ------ .../Resources/Documents/Protocols.html | 79 +- .../Documents/Protocols/Archive.html | 77 +- .../Documents/Protocols/Container.html | 77 +- .../Documents/Protocols/ContainerEntry.html | 95 +-- .../Protocols/DecompressionAlgorithm.html | 77 +- .../Documents/Structs/GzipHeader.html | 77 +- .../Structs/GzipHeader/CompressionMethod.html | 77 +- .../Structs/GzipHeader/FileSystemType.html | 77 +- .../Documents/Structs/SevenZipEntryInfo.html | 291 +++++-- .../SevenZipEntryInfo/DosAttributes.html | 194 +++-- .../SevenZipEntryInfo/Permissions.html | 266 +++--- .../Structs/SevenZipEntryInfo/UnixType.html | 169 ++-- .../Documents/Structs/ZlibHeader.html | 77 +- .../Structs/ZlibHeader/CompressionLevel.html | 77 +- .../Structs/ZlibHeader/CompressionMethod.html | 77 +- .../Contents/Resources/Documents/index.html | 77 +- .../Contents/Resources/Documents/search.json | 2 +- .../Contents/Resources/docSet.dsidx | Bin 86016 -> 86016 bytes docs/docsets/SWCompression.tgz | Bin 124615 -> 125031 bytes docs/index.html | 77 +- docs/search.json | 2 +- docs/undocumented.json | 631 +------------- 102 files changed, 4938 insertions(+), 8219 deletions(-) delete mode 100644 docs/Other Classes.html delete mode 100644 docs/Other Enums.html delete mode 100644 docs/Other Structs.html delete mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Classes.html delete mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html delete mode 100644 docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html diff --git a/docs/Archives.html b/docs/Archives.html index 41ffcd11..52ddb64e 100644 --- a/docs/Archives.html +++ b/docs/Archives.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

  • + @@ -96,19 +99,28 @@ - + - - -
    @@ -294,9 +279,9 @@

    Declaration

  • - - - ZlibArchive + + + XZArchive
    @@ -304,20 +289,20 @@

    Declaration

    -

    Provides unarchive and archive functions for Zlib archives.

    +

    Provides unarchive function for XZ archives.

    - See more + See more

    Declaration

    Swift

    -
    public class ZlibArchive: Archive
    +
    public class XZArchive: Archive
    @@ -329,9 +314,9 @@

    Declaration

  • - - - ZlibHeader + + + ZlibArchive
    @@ -339,20 +324,20 @@

    Declaration

    -

    Represents a Zlib archive’s header.

    +

    Provides unarchive and archive functions for Zlib archives.

    - See more + See more

    Declaration

    Swift

    -
    public struct ZlibHeader
    +
    public class ZlibArchive: Archive
    @@ -364,9 +349,9 @@

    Declaration

  • - - - XZArchive + + + ZlibHeader
    @@ -374,20 +359,20 @@

    Declaration

    -

    Provides unarchive function for XZ archives.

    +

    Represents a Zlib archive’s header.

    - See more + See more

    Declaration

    Swift

    -
    public class XZArchive: Archive
    +
    public struct ZlibHeader
    diff --git a/docs/Classes/BZip2.html b/docs/Classes/BZip2.html index d45d6cfc..a3513421 100644 --- a/docs/Classes/BZip2.html +++ b/docs/Classes/BZip2.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Classes/Deflate.html b/docs/Classes/Deflate.html index 0aaf7e64..bbfee98c 100644 --- a/docs/Classes/Deflate.html +++ b/docs/Classes/Deflate.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Classes/GzipArchive.html b/docs/Classes/GzipArchive.html index 7b68d683..6759da9b 100644 --- a/docs/Classes/GzipArchive.html +++ b/docs/Classes/GzipArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Classes/GzipArchive/Member.html b/docs/Classes/GzipArchive/Member.html index 4e3196da..03dfd65c 100644 --- a/docs/Classes/GzipArchive/Member.html +++ b/docs/Classes/GzipArchive/Member.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Classes/LZMA.html b/docs/Classes/LZMA.html index c4e6df74..1b7f7cff 100644 --- a/docs/Classes/LZMA.html +++ b/docs/Classes/LZMA.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Classes/LZMA2.html b/docs/Classes/LZMA2.html index 40c7ae6e..46a42ead 100644 --- a/docs/Classes/LZMA2.html +++ b/docs/Classes/LZMA2.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Classes/SevenZipContainer.html b/docs/Classes/SevenZipContainer.html index dd63aa6e..daaa759e 100644 --- a/docs/Classes/SevenZipContainer.html +++ b/docs/Classes/SevenZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    SevenZipContainer

    -

    Undocumented

    +
    +
    +
    public class SevenZipContainer: Container
    + +
    +
    +

    Provides open functions for 7-Zip containers.

    @@ -226,9 +217,9 @@

    SevenZipContainer

  • @@ -236,7 +227,23 @@

    SevenZipContainer

    - +

    Processes 7-Zip container and returns an array of ContainerEntry (which are actually SevenZipEntry).

    +
    +

    Important

    +

    The order of entries is defined by 7-Zip container and, +particularly, by the creator of a given 7-Zip container. +It is likely that directories will be encountered earlier than files stored in those directories, +but one SHOULD NOT rely on any particular order.

    + +
    +
    +

    Throws

    +

    SevenZipError or any other error associated with compression type, +depending on the type of the problem. +It may indicate that either container is damaged or it might not be 7-Zip container at all.

    + +
    +

    Declaration

    @@ -246,8 +253,31 @@

    Declaration

    +
    +

    Parameters

    + + + + + + + +
    + + container + + +
    +

    7-Zip container’s data.

    +
    +
    +
    +
    +

    Return Value

    +

    Array of SevenZipEntry as an array of ContainerEntry.

    +
    @@ -265,11 +295,59 @@

    Declaration

    -

    Undocumented

    +

    Processes ZIP container and returns an array of SevenZipEntryInfo, +which contain various information about container’s entry. +This is performed without decompressing entries’ data.

    +
    +

    Important

    +

    The order of entries is defined by 7-Zip container and, +particularly, by the creator of a given 7-Zip container. +It is likely that directories will be encountered earlier than files stored in those directories, +but one SHOULD NOT rely on any particular order.

    + +
    +
    +

    Throws

    +

    SevenZipError or any other error associated with compression type, +depending on the type of the problem. +It may indicate that either container is damaged or it might not be 7-Zip container at all.

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func info(container data: Data) throws -> [SevenZipEntryInfo]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + container + + +
    +

    7-Zip container’s data.

    +
    +
    +
    +
    +

    Return Value

    +

    Array of SevenZipEntryInfo.

    diff --git a/docs/Classes/SevenZipEntry.html b/docs/Classes/SevenZipEntry.html index 86bc3708..d45f382a 100644 --- a/docs/Classes/SevenZipEntry.html +++ b/docs/Classes/SevenZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    SevenZipEntry

    -

    Undocumented

    +
    +
    +
    public class SevenZipEntry: ContainerEntry
    + +
    +
    +

    Represents an entry in 7-Zip container.

    @@ -236,11 +227,19 @@

    SevenZipEntry

    -

    Undocumented

    +

    Various information about entry.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let info: SevenZipEntryInfo
    +
    @@ -248,9 +247,9 @@

    SevenZipEntry

  • - + - name + name
    @@ -258,7 +257,8 @@

    SevenZipEntry

    - +

    Entry’s name.

    +

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -277,9 +277,9 @@

    Declaration

  • - + - size + size
    @@ -287,7 +287,8 @@

    Declaration

    - +

    Entry’s data size.

    +

    Declaration

    @@ -298,7 +299,7 @@

    Declaration

    @@ -306,9 +307,9 @@

    Declaration

  • @@ -316,7 +317,8 @@

    Declaration

    - +

    True, if entry is a directory.

    +

    Declaration

    @@ -327,7 +329,7 @@

    Declaration

    @@ -345,11 +347,19 @@

    Declaration

    -

    Undocumented

    +

    True, if entry is a symbolic link.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let isLink: Bool
    +
    @@ -367,11 +377,19 @@

    Declaration

    -

    Undocumented

    +

    Path to a linked file for symbolic link entry.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let linkPath: String?
    +
    @@ -379,9 +397,9 @@

    Declaration

  • @@ -389,7 +407,21 @@

    Declaration

    - +

    Provides a dictionary with various attributes of the entry. +FileAttributeKey values are used as dictionary keys.

    +

    Possible attributes:

    + +
      +
    • FileAttributeKey.posixPermissions,
    • +
    • FileAttributeKey.size,
    • +
    • FileAttributeKey.modificationDate,
    • +
    • FileAttributeKey.creationDate,
    • +
    • FileAttributeKey.type,
    • +
    • FileAttributeKey.appendOnly.
    • +
    + +

    Most modern TAR containers are in UStar format.

    +

    Declaration

    @@ -400,7 +432,7 @@

    Declaration

    @@ -418,11 +450,20 @@

    Declaration

    -

    Undocumented

    +

    True, if data for entry is available. +It might not be depending on the content of the container.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataIsAvailable: Bool
    +
    @@ -430,9 +471,9 @@

    Declaration

  • - + - data() + data()
    @@ -440,7 +481,13 @@

    Declaration

    - +

    Returns data associated with this entry.

    +
    +

    Throws

    + SevenZipError.dataIsUnavailable if data for entry isn’t available. + +
    +

    Declaration

    @@ -451,7 +498,7 @@

    Declaration

    diff --git a/docs/Classes/TarContainer.html b/docs/Classes/TarContainer.html index 97b03716..2e5c0540 100644 --- a/docs/Classes/TarContainer.html +++ b/docs/Classes/TarContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    @@ -242,11 +227,11 @@

    TarContainer

    -

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    +

    Processes TAR container and returns an array of ContainerEntry (which are actually TarEntry).

    Important

    The order of entries is defined by TAR container and, -particularly, by a creator of a given TAR container. +particularly, by the creator of a given TAR container. It is likely that directories will be encountered earlier than files stored in those directories, but one SHOULD NOT rely on any particular order.

    diff --git a/docs/Classes/TarEntry.html b/docs/Classes/TarEntry.html index 001f572b..75c5e025 100644 --- a/docs/Classes/TarEntry.html +++ b/docs/Classes/TarEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -243,11 +228,6 @@

    TarEntry

    Represents a type of an entry.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. FileAttributeType values will be used instead. - -
    See more
    @@ -260,7 +240,7 @@

    Declaration

    @@ -290,7 +270,7 @@

    Declaration

    @@ -320,7 +300,7 @@

    Declaration

    @@ -350,7 +330,7 @@

    Declaration

    @@ -370,11 +350,6 @@

    Declaration

    Provides a dictionary with various attributes of the entry. FileAttributeKey values are used as dictionary keys.

    -
    -

    Note

    - Will be renamed in 4.0. - -

    Possible attributes:

      @@ -401,7 +376,7 @@

      Declaration

    @@ -431,7 +406,7 @@

    Declaration

    @@ -461,7 +436,7 @@

    Declaration

    @@ -491,7 +466,7 @@

    Declaration

    @@ -521,7 +496,7 @@

    Declaration

    @@ -551,7 +526,7 @@

    Declaration

    @@ -581,7 +556,7 @@

    Declaration

    @@ -611,7 +586,7 @@

    Declaration

    @@ -641,7 +616,7 @@

    Declaration

    @@ -671,7 +646,7 @@

    Declaration

    @@ -701,7 +676,7 @@

    Declaration

    @@ -731,7 +706,7 @@

    Declaration

    @@ -749,19 +724,19 @@

    Declaration

    -

    Undocumented

    +

    True if entry is a symbolic link.

    Declaration

    Swift

    -
    public class TarEntry: ContainerEntry
    +
    public let isLink: Bool
    @@ -779,7 +754,7 @@

    Declaration

    -

    Path to a linked file.

    +

    Path to a linked file for symbolic link entry.

    @@ -791,7 +766,7 @@

    Declaration

    @@ -821,7 +796,7 @@

    Declaration

    @@ -851,7 +826,7 @@

    Declaration

    diff --git a/docs/Classes/TarEntry/EntryType.html b/docs/Classes/TarEntry/EntryType.html index 84604c66..57bb58b4 100644 --- a/docs/Classes/TarEntry/EntryType.html +++ b/docs/Classes/TarEntry/EntryType.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -221,11 +206,6 @@

    EntryType

    Represents a type of an entry.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. FileAttributeType values will be used instead. - -
    @@ -259,7 +239,7 @@

    Declaration

    @@ -293,7 +273,7 @@

    Declaration

    @@ -327,7 +307,7 @@

    Declaration

    @@ -361,7 +341,7 @@

    Declaration

    @@ -395,7 +375,7 @@

    Declaration

    @@ -429,7 +409,7 @@

    Declaration

    @@ -463,7 +443,7 @@

    Declaration

    @@ -497,7 +477,7 @@

    Declaration

    @@ -531,7 +511,7 @@

    Declaration

    @@ -565,7 +545,7 @@

    Declaration

    @@ -599,7 +579,7 @@

    Declaration

    diff --git a/docs/Classes/XZArchive.html b/docs/Classes/XZArchive.html index bf03fa36..1f374f0f 100644 --- a/docs/Classes/XZArchive.html +++ b/docs/Classes/XZArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Classes/ZipContainer.html b/docs/Classes/ZipContainer.html index 05cc6231..146bea03 100644 --- a/docs/Classes/ZipContainer.html +++ b/docs/Classes/ZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -242,11 +227,11 @@

    ZipContainer

    -

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    +

    Processes ZIP container and returns an array of ContainerEntry (which are actually ZipEntry).

    Important

    The order of entries is defined by ZIP container and, -particularly, by a creator of a given ZIP container. +particularly, by the creator of a given ZIP container. It is likely that directories will be encountered earlier than files stored in those directories, but one SHOULD NOT rely on any particular order.

    diff --git a/docs/Classes/ZipEntry.html b/docs/Classes/ZipEntry.html index 0d0a6c39..2e7d1add 100644 --- a/docs/Classes/ZipEntry.html +++ b/docs/Classes/ZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -303,11 +288,6 @@

    Declaration

    File or directory attributes related to the file system of the container’s creator.

    -
    -

    Note

    - Will be renamed to externalFileAttributes in 4.0. - -
    @@ -319,7 +299,7 @@

    Declaration

    @@ -349,7 +329,7 @@

    Declaration

    @@ -381,7 +361,7 @@

    Declaration

    @@ -399,19 +379,19 @@

    Declaration

    -

    Undocumented

    +

    True, if entry is a symbolic link.

    Declaration

    Swift

    -
    public class ZipEntry: ContainerEntry
    +
    public let isLink: Bool
    @@ -429,19 +409,19 @@

    Declaration

    -

    Undocumented

    +

    Path to a linked file for symbolic link entry.

    Declaration

    Swift

    -
    public class ZipEntry: ContainerEntry
    +
    public lazy var linkPath: String? =
    @@ -459,19 +439,19 @@

    Declaration

    -

    Undocumented

    +

    True if entry is likely to be text or ASCII file.

    Declaration

    Swift

    -
    public class ZipEntry: ContainerEntry
    +
    public var isTextFile: Bool
    @@ -491,11 +471,6 @@

    Declaration

    Provides a dictionary with various attributes of the entry. FileAttributeKey values are used as dictionary keys.

    -
    -

    Note

    - Will be renamed in 4.0. - -

    Possible attributes:

      @@ -516,7 +491,7 @@

      Declaration

    @@ -552,7 +527,7 @@

    Declaration

    diff --git a/docs/Classes/ZlibArchive.html b/docs/Classes/ZlibArchive.html index 817e8469..0bc0ea28 100644 --- a/docs/Classes/ZlibArchive.html +++ b/docs/Classes/ZlibArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Compression.html b/docs/Compression.html index 22751226..6518d83d 100644 --- a/docs/Compression.html +++ b/docs/Compression.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    diff --git a/docs/Containers.html b/docs/Containers.html index 6a23b5fa..d587226c 100644 --- a/docs/Containers.html +++ b/docs/Containers.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    @@ -224,9 +209,9 @@

    Containers

  • @@ -234,20 +219,20 @@

    Containers

    -

    Provides open function for ZIP containers.

    +

    Provides open functions for 7-Zip containers.

    - See more + See more

    Declaration

    Swift

    -
    public class ZipContainer: Container
    +
    public class SevenZipContainer: Container
    @@ -259,9 +244,9 @@

    Declaration

  • - - - ZipEntry + + + SevenZipEntry
    @@ -269,20 +254,55 @@

    Declaration

    -

    Represents either a file or directory entry in ZIP container.

    +

    Represents an entry in 7-Zip container.

    - See more + See more

    Declaration

    Swift

    -
    public class ZipEntry: ContainerEntry
    +
    public class SevenZipEntry: ContainerEntry
    + +
    +
    + +
    +
    +
  • + + +
    +
    + + + + + +
    + +
    +
    + + - - -
    diff --git a/docs/Enums/DeflateError.html b/docs/Enums/DeflateError.html index 0d218290..1d2cb560 100644 --- a/docs/Enums/DeflateError.html +++ b/docs/Enums/DeflateError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Enums/GzipError.html b/docs/Enums/GzipError.html index 0000bbaa..54a2c27c 100644 --- a/docs/Enums/GzipError.html +++ b/docs/Enums/GzipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Enums/LZMA2Error.html b/docs/Enums/LZMA2Error.html index 550b9101..cb00d052 100644 --- a/docs/Enums/LZMA2Error.html +++ b/docs/Enums/LZMA2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Enums/LZMAError.html b/docs/Enums/LZMAError.html index 088a1a2f..f03dfe94 100644 --- a/docs/Enums/LZMAError.html +++ b/docs/Enums/LZMAError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Enums/SevenZipError.html b/docs/Enums/SevenZipError.html index 99365395..a2b0cd4d 100644 --- a/docs/Enums/SevenZipError.html +++ b/docs/Enums/SevenZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,14 @@

    SevenZipError

    -

    Undocumented

    +
    +
    +
    public enum SevenZipError: Error
    + +
    +
    +

    Represents an error, which happened during processing 7-Zip container. +It may indicate that either container is damaged or it might not be 7-Zip container at all.

    @@ -236,37 +228,19 @@

    SevenZipError

    -

    Undocumented

    +

    Wrong container’s signature.

    - -
    -
    - - - -
    - -
    -
    -
      -
    • -
      - - - - wrongHeaderSize - -
      -
      -
      -
      -
      -
      -

      Undocumented

      +
      +

      Declaration

      +
      +

      Swift

      +
      case wrongFormatVersion
      +
      @@ -330,9 +286,9 @@

      SevenZipError

    • @@ -340,37 +296,20 @@

      SevenZipError

      -

      Undocumented

      +

      CRC either of one of the files from the container +or one of the container’s strucutures is incorrect.

      - -
      -
      -
    • -
    -
    -
    -
      -
    • -
      - - - - wrongHeaderCRC - -
      -
      -
      -
      -
      -
      -

      Undocumented

      +
      +

      Declaration

      +
      +

      Swift

      +
      case wrongCRC
      +
      @@ -382,9 +321,9 @@

      SevenZipError

    • - - - wrongExternal + + + wrongSize
      @@ -392,37 +331,20 @@

      SevenZipError

      -

      Undocumented

      +

      Size either of one of the files from the container +or one of the container’s strucutures is incorrect.

      - -
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • -
      - - - - wrongEnd - -
      -
      -
      -
      -
      -
      -

      Undocumented

      +
      +

      Declaration

      +
      +

      Swift

      +
      case startPosNotSupported
      +
      @@ -496,37 +400,19 @@

      SevenZipError

      -

      Undocumented

      +

      External feature isn’t supported.

      - -
      -
    - - - -
    -
    - - - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - + - - -
    diff --git a/docs/Enums/XZError.html b/docs/Enums/XZError.html index d74cba30..385a4697 100644 --- a/docs/Enums/XZError.html +++ b/docs/Enums/XZError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Enums/ZipError.html b/docs/Enums/ZipError.html index 30a42ece..5dcf2be2 100644 --- a/docs/Enums/ZipError.html +++ b/docs/Enums/ZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Enums/ZlibError.html b/docs/Enums/ZlibError.html index 1b945cf9..cad78f4a 100644 --- a/docs/Enums/ZlibError.html +++ b/docs/Enums/ZlibError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Errors.html b/docs/Errors.html index 5b107a65..1f825d88 100644 --- a/docs/Errors.html +++ b/docs/Errors.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    @@ -296,9 +281,9 @@

    Declaration

  • - - - GzipError + + + LZMAError
    @@ -306,21 +291,21 @@

    Declaration

    -

    Represents an error, which happened during processing GZip archive. -It may indicate that either archive is damaged or it might not be GZip archive at all.

    +

    Represents an error, which happened during LZMA decompression. +It may indicate that either data is damaged or it might not be compressed with LZMA at all.

    - See more + See more

    Declaration

    Swift

    -
    public enum GzipError: Error
    +
    public enum LZMAError: Error
    @@ -368,9 +353,9 @@

    Declaration

  • - - - LZMAError + + + SevenZipError
    @@ -378,21 +363,21 @@

    Declaration

    -

    Represents an error, which happened during LZMA decompression. -It may indicate that either data is damaged or it might not be compressed with LZMA at all.

    +

    Represents an error, which happened during processing 7-Zip container. +It may indicate that either container is damaged or it might not be 7-Zip container at all.

    - See more + See more

    Declaration

    Swift

    -
    public enum LZMAError: Error
    +
    public enum SevenZipError: Error
    @@ -447,9 +432,9 @@

    Declaration

  • - - - XZError + + + ZipError
    @@ -457,21 +442,21 @@

    Declaration

    -

    Represents an error, which happened during unarchiving XZ archive. -It may indicate that either archive is damaged or it might not be XZ archive at all.

    +

    Represents an error, which happened during processing ZIP container. +It may indicate that either container is damaged or it might not be ZIP container at all.

    - See more + See more

    Declaration

    Swift

    -
    public enum XZError: Error
    +
    public enum ZipError: Error
    @@ -483,9 +468,9 @@

    Declaration

  • - - - ZipError + + + GzipError
    @@ -493,21 +478,57 @@

    Declaration

    -

    Represents an error, which happened during processing ZIP container. -It may indicate that either container is damaged or it might not be ZIP container at all.

    +

    Represents an error, which happened during processing GZip archive. +It may indicate that either archive is damaged or it might not be GZip archive at all.

    - See more + See more

    Declaration

    Swift

    -
    public enum ZipError: Error
    +
    public enum GzipError: Error
    +
    +
    +
  • + +
    +
    +
    - diff --git a/docs/Other Enums.html b/docs/Other Enums.html deleted file mode 100644 index 84b0b83a..00000000 --- a/docs/Other Enums.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - Other Enums Reference - - - - - - - - - - - - - - - -
    -

    - - SWCompression Docs - - (67% documented) -

    - -

    -

    - -
    -

    - -

    - - - View on GitHub - -

    - -
    - - - -
    - -
    - -
    -
    -

    Other Enums

    -

    The following enums are available globally.

    - -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    - - - - diff --git a/docs/Other Structs.html b/docs/Other Structs.html deleted file mode 100644 index 721a3ffa..00000000 --- a/docs/Other Structs.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - Other Structs Reference - - - - - - - - - - - - - - - -
    -

    - - SWCompression Docs - - (67% documented) -

    - -

    -

    - -
    -

    - -

    - - - View on GitHub - -

    - -
    - - - -
    - -
    - -
    -
    -

    Other Structs

    -

    The following structs are available globally.

    - -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    - - - - diff --git a/docs/Protocols.html b/docs/Protocols.html index 68ff3581..7e93bcf3 100644 --- a/docs/Protocols.html +++ b/docs/Protocols.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    @@ -309,7 +294,7 @@

    Declaration

    diff --git a/docs/Protocols/Archive.html b/docs/Protocols/Archive.html index b916c9c2..052813be 100644 --- a/docs/Protocols/Archive.html +++ b/docs/Protocols/Archive.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Protocols/Container.html b/docs/Protocols/Container.html index b6fcd9c7..4485d2e0 100644 --- a/docs/Protocols/Container.html +++ b/docs/Protocols/Container.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Protocols/ContainerEntry.html b/docs/Protocols/ContainerEntry.html index a0c57288..d9905d69 100644 --- a/docs/Protocols/ContainerEntry.html +++ b/docs/Protocols/ContainerEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -302,7 +287,7 @@

    Declaration

    -

    Check if entry is a directory.

    +

    True, if entry is a directory.

    @@ -332,19 +317,19 @@

    Declaration

    -

    Undocumented

    +

    True, if entry is a symbolic link.

    Declaration

    Swift

    -
    public protocol ContainerEntry
    +
    var isLink: Bool
    @@ -362,19 +347,19 @@

    Declaration

    -

    Undocumented

    +

    Path to a linked file for symbolic link entry.

    Declaration

    Swift

    -
    public protocol ContainerEntry
    +
    var linkPath: String?
    @@ -410,7 +395,7 @@

    Declaration

    @@ -440,7 +425,7 @@

    Declaration

    diff --git a/docs/Protocols/DecompressionAlgorithm.html b/docs/Protocols/DecompressionAlgorithm.html index fd70493f..7a9052b1 100644 --- a/docs/Protocols/DecompressionAlgorithm.html +++ b/docs/Protocols/DecompressionAlgorithm.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Structs/GzipHeader.html b/docs/Structs/GzipHeader.html index c09daf63..c69edc7c 100644 --- a/docs/Structs/GzipHeader.html +++ b/docs/Structs/GzipHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Structs/GzipHeader/CompressionMethod.html b/docs/Structs/GzipHeader/CompressionMethod.html index 36b75a90..0fef6679 100644 --- a/docs/Structs/GzipHeader/CompressionMethod.html +++ b/docs/Structs/GzipHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Structs/GzipHeader/FileSystemType.html b/docs/Structs/GzipHeader/FileSystemType.html index ced6c3cf..d46f2b99 100644 --- a/docs/Structs/GzipHeader/FileSystemType.html +++ b/docs/Structs/GzipHeader/FileSystemType.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Structs/SevenZipEntryInfo.html b/docs/Structs/SevenZipEntryInfo.html index 7a79e689..103f2105 100644 --- a/docs/Structs/SevenZipEntryInfo.html +++ b/docs/Structs/SevenZipEntryInfo.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    SevenZipEntryInfo

    -

    Undocumented

    +
    +
    +
    public struct SevenZipEntryInfo
    + +
    +
    +

    Provides information about 7-Zip entry.

    @@ -236,12 +227,20 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Represents file access permissions in UNIX format.

    See more
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Permissions: OptionSet
    + +
    +
    @@ -259,12 +258,20 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Represents file attributes in DOS format.

    See more
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DosAttributes: OptionSet
    + +
    +
    @@ -282,12 +289,20 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Represents file type in UNIX format.

    See more
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum UnixType: UInt32
    + +
    +
    @@ -305,11 +320,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s name.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let name: String?
    +
    @@ -327,11 +350,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s data size.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let size: Int?
    + +
    +
    @@ -349,11 +380,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    True, if entry is a directory.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let isDirectory: Bool
    +
    @@ -371,11 +410,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s last access time and date.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let accessTime: Date?
    + +
    +
    @@ -393,11 +440,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s creation time and date.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let creationTime: Date?
    + +
    +
    @@ -415,11 +470,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s last modification time and date.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let modificationTime: Date?
    +
    @@ -437,11 +500,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    7-Zip internal property which may contain UNIX permissions, type and/or DOS attributes.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let winAttributes: UInt32?
    + +
    +
    @@ -459,11 +530,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s UNIX file access permissions.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let permissions: Permissions?
    +
    @@ -481,11 +560,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s DOS attributes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dosAttributes: DosAttributes?
    +
    @@ -503,11 +590,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s UNIX file type.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let unixType: UnixType?
    + +
    +
    @@ -525,11 +620,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    7-Zip internal propety. Indicates whether entry has a stream (data) inside container.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let hasStream: Bool
    +
    @@ -547,11 +650,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    True, if entry is an empty file. 7-Zip internal property.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let isEmpty: Bool
    + +
    +
    @@ -569,11 +680,21 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    True if entry is an anti-file. +Used in differential backups to indicate that file should be deleted. +7-Zip internal property.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let isAnti: Bool
    +
    @@ -591,11 +712,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    CRC32 of entry’s data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let crc: UInt32?
    +
    diff --git a/docs/Structs/SevenZipEntryInfo/DosAttributes.html b/docs/Structs/SevenZipEntryInfo/DosAttributes.html index fa29e240..cce4043c 100644 --- a/docs/Structs/SevenZipEntryInfo/DosAttributes.html +++ b/docs/Structs/SevenZipEntryInfo/DosAttributes.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    DosAttributes

    -

    Undocumented

    +
    +
    +
    public struct DosAttributes: OptionSet
    + +
    +
    +

    Represents file attributes in DOS format.

    @@ -226,9 +217,9 @@

    DosAttributes

  • - + - rawValue + rawValue
    @@ -236,7 +227,8 @@

    DosAttributes

    - +

    Raw bit flags value.

    +

    Declaration

    @@ -247,7 +239,7 @@

    Declaration

    @@ -255,9 +247,9 @@

    Declaration

  • @@ -265,7 +257,8 @@

    Declaration

    - +

    Initializes attributes with bit flags.

    +

    Declaration

    @@ -275,27 +268,8 @@

    Declaration

    -
    -

    Parameters

    - - - - - - - -
    - - rawValue - - -
    - -
    -
    -
    @@ -313,11 +287,19 @@

    Parameters

    -

    Undocumented

    +

    File is archive or archived.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let archive = DosAttributes(rawValue: 0b00100000)
    + +
    +
    @@ -335,11 +317,19 @@

    Parameters

    -

    Undocumented

    +

    File is a directory.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let directory = DosAttributes(rawValue: 0b00010000)
    + +
    +
    @@ -357,11 +347,19 @@

    Parameters

    -

    Undocumented

    +

    File is a volume.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let volume = DosAttributes(rawValue: 0b00001000)
    +
    @@ -379,11 +377,19 @@

    Parameters

    -

    Undocumented

    +

    File is a system file.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let system = DosAttributes(rawValue: 0b00000100)
    + +
    +
    @@ -401,11 +407,19 @@

    Parameters

    -

    Undocumented

    +

    File is hidden.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let hidden = DosAttributes(rawValue: 0b00000010)
    + +
    +
    @@ -423,11 +437,19 @@

    Parameters

    -

    Undocumented

    +

    File is read-only.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let readOnly = DosAttributes(rawValue: 0b00000001)
    + +
    +
    diff --git a/docs/Structs/SevenZipEntryInfo/Permissions.html b/docs/Structs/SevenZipEntryInfo/Permissions.html index bd69b86e..30c3fa10 100644 --- a/docs/Structs/SevenZipEntryInfo/Permissions.html +++ b/docs/Structs/SevenZipEntryInfo/Permissions.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    Permissions

    -

    Undocumented

    +
    +
    +
    public struct Permissions: OptionSet
    + +
    +
    +

    Represents file access permissions in UNIX format.

    @@ -226,9 +217,9 @@

    Permissions

  • - + - rawValue + rawValue
    @@ -236,7 +227,8 @@

    Permissions

    - +

    Raw bit flags value (in decimal).

    +

    Declaration

    @@ -247,7 +239,7 @@

    Declaration

    @@ -255,9 +247,9 @@

    Declaration

  • @@ -265,7 +257,8 @@

    Declaration

    - +

    Initializes permissions with bit flags in decimal.

    +

    Declaration

    @@ -275,27 +268,8 @@

    Declaration

    -
    -

    Parameters

    - - - - - - - -
    - - rawValue - - -
    - -
    -
    -
    @@ -313,11 +287,19 @@

    Parameters

    -

    Undocumented

    +

    Set UID.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let setuid = Permissions(rawValue: 0o4000)
    +
    @@ -335,11 +317,19 @@

    Parameters

    -

    Undocumented

    +

    Set GID.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let setgid = Permissions(rawValue: 0o2000)
    +
    @@ -357,11 +347,19 @@

    Parameters

    -

    Undocumented

    +

    Sticky bit.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let sticky = Permissions(rawValue: 0o1000)
    + +
    +
    @@ -379,11 +377,19 @@

    Parameters

    -

    Undocumented

    +

    Owner can read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let readOwner = Permissions(rawValue: 0o0400)
    +
    @@ -401,11 +407,19 @@

    Parameters

    -

    Undocumented

    +

    Owner can write.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let writeOwner = Permissions(rawValue: 0o0200)
    +
    @@ -423,11 +437,19 @@

    Parameters

    -

    Undocumented

    +

    Owner can execute.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let executeOwner = Permissions(rawValue: 0o0100)
    +
    @@ -445,11 +467,19 @@

    Parameters

    -

    Undocumented

    +

    Group can read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let readGroup = Permissions(rawValue: 0o0040)
    +
    @@ -467,11 +497,19 @@

    Parameters

    -

    Undocumented

    +

    Group can write.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let writeGroup = Permissions(rawValue: 0o0020)
    +
    @@ -489,11 +527,19 @@

    Parameters

    -

    Undocumented

    +

    Group can execute.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let executeGroup = Permissions(rawValue: 0o0010)
    +
    @@ -511,11 +557,19 @@

    Parameters

    -

    Undocumented

    +

    Others can read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let readOther = Permissions(rawValue: 0o0004)
    +
    @@ -533,11 +587,19 @@

    Parameters

    -

    Undocumented

    +

    Others can write.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let writeOther = Permissions(rawValue: 0o0002)
    +
    @@ -555,11 +617,19 @@

    Parameters

    -

    Undocumented

    +

    Others can execute.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let executeOther = Permissions(rawValue: 0o0001)
    +
    diff --git a/docs/Structs/SevenZipEntryInfo/UnixType.html b/docs/Structs/SevenZipEntryInfo/UnixType.html index d78b78bc..f5f87b57 100644 --- a/docs/Structs/SevenZipEntryInfo/UnixType.html +++ b/docs/Structs/SevenZipEntryInfo/UnixType.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    UnixType

    -

    Undocumented

    +
    +
    +
    public enum UnixType: UInt32
    + +
    +
    +

    Represents file type in UNIX format.

    @@ -236,11 +227,19 @@

    UnixType

    -

    Undocumented

    +

    FIFO special file.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case fifo = 0o010000
    +
    @@ -262,11 +261,19 @@

    UnixType

    -

    Undocumented

    +

    Character special file.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case characterSpecial = 0o020000
    +
    @@ -288,11 +295,19 @@

    UnixType

    -

    Undocumented

    +

    Directory.

    +
    +

    Declaration

    +
    +

    Swift

    +
    case directory = 0o040000
    + +
    +
    @@ -314,11 +329,19 @@

    UnixType

    -

    Undocumented

    +

    Block special file.

    +
    +

    Declaration

    +
    +

    Swift

    +
    case blockSpecial = 0o060000
    + +
    +
    @@ -340,11 +363,19 @@

    UnixType

    -

    Undocumented

    +

    Regular file.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case regular = 0o100000
    +
    @@ -366,11 +397,19 @@

    UnixType

    -

    Undocumented

    +

    Symbolic link.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case symbolicLink = 0o120000
    +
    @@ -392,11 +431,19 @@

    UnixType

    -

    Undocumented

    +

    Socket.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case socket = 0o140000
    +
    diff --git a/docs/Structs/ZlibHeader.html b/docs/Structs/ZlibHeader.html index 434e7e83..55183b8d 100644 --- a/docs/Structs/ZlibHeader.html +++ b/docs/Structs/ZlibHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Structs/ZlibHeader/CompressionLevel.html b/docs/Structs/ZlibHeader/CompressionLevel.html index 5e1503d0..18e60662 100644 --- a/docs/Structs/ZlibHeader/CompressionLevel.html +++ b/docs/Structs/ZlibHeader/CompressionLevel.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/Structs/ZlibHeader/CompressionMethod.html b/docs/Structs/ZlibHeader/CompressionMethod.html index d8bb88d1..54c459fb 100644 --- a/docs/Structs/ZlibHeader/CompressionMethod.html +++ b/docs/Structs/ZlibHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/badge.svg b/docs/badge.svg index 7220d1cc..2606d804 100644 --- a/docs/badge.svg +++ b/docs/badge.svg @@ -1 +1 @@ -documentationdocumentation67%67% \ No newline at end of file +documentationdocumentation100%100% \ No newline at end of file diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html index 41ffcd11..52ddb64e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    @@ -294,9 +279,9 @@

    Declaration

  • - - - ZlibArchive + + + XZArchive
    @@ -304,20 +289,20 @@

    Declaration

    -

    Provides unarchive and archive functions for Zlib archives.

    +

    Provides unarchive function for XZ archives.

    - See more + See more

    Declaration

    Swift

    -
    public class ZlibArchive: Archive
    +
    public class XZArchive: Archive
    @@ -329,9 +314,9 @@

    Declaration

  • - - - ZlibHeader + + + ZlibArchive
    @@ -339,20 +324,20 @@

    Declaration

    -

    Represents a Zlib archive’s header.

    +

    Provides unarchive and archive functions for Zlib archives.

    - See more + See more

    Declaration

    Swift

    -
    public struct ZlibHeader
    +
    public class ZlibArchive: Archive
    @@ -364,9 +349,9 @@

    Declaration

  • - - - XZArchive + + + ZlibHeader
    @@ -374,20 +359,20 @@

    Declaration

    -

    Provides unarchive function for XZ archives.

    +

    Represents a Zlib archive’s header.

    - See more + See more

    Declaration

    Swift

    -
    public class XZArchive: Archive
    +
    public struct ZlibHeader
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html index d45d6cfc..a3513421 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html index 0aaf7e64..bbfee98c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html index 7b68d683..6759da9b 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html index 4e3196da..03dfd65c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html index c4e6df74..1b7f7cff 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html index 40c7ae6e..46a42ead 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html index dd63aa6e..daaa759e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    SevenZipContainer

    -

    Undocumented

    +
    +
    +
    public class SevenZipContainer: Container
    + +
    +
    +

    Provides open functions for 7-Zip containers.

    @@ -226,9 +217,9 @@

    SevenZipContainer

  • @@ -236,7 +227,23 @@

    SevenZipContainer

    - +

    Processes 7-Zip container and returns an array of ContainerEntry (which are actually SevenZipEntry).

    +
    +

    Important

    +

    The order of entries is defined by 7-Zip container and, +particularly, by the creator of a given 7-Zip container. +It is likely that directories will be encountered earlier than files stored in those directories, +but one SHOULD NOT rely on any particular order.

    + +
    +
    +

    Throws

    +

    SevenZipError or any other error associated with compression type, +depending on the type of the problem. +It may indicate that either container is damaged or it might not be 7-Zip container at all.

    + +
    +

    Declaration

    @@ -246,8 +253,31 @@

    Declaration

    +
    +

    Parameters

    + + + + + + + +
    + + container + + +
    +

    7-Zip container’s data.

    +
    +
    +
    +
    +

    Return Value

    +

    Array of SevenZipEntry as an array of ContainerEntry.

    +
    @@ -265,11 +295,59 @@

    Declaration

    -

    Undocumented

    +

    Processes ZIP container and returns an array of SevenZipEntryInfo, +which contain various information about container’s entry. +This is performed without decompressing entries’ data.

    +
    +

    Important

    +

    The order of entries is defined by 7-Zip container and, +particularly, by the creator of a given 7-Zip container. +It is likely that directories will be encountered earlier than files stored in those directories, +but one SHOULD NOT rely on any particular order.

    + +
    +
    +

    Throws

    +

    SevenZipError or any other error associated with compression type, +depending on the type of the problem. +It may indicate that either container is damaged or it might not be 7-Zip container at all.

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func info(container data: Data) throws -> [SevenZipEntryInfo]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + container + + +
    +

    7-Zip container’s data.

    +
    +
    +
    +
    +

    Return Value

    +

    Array of SevenZipEntryInfo.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html index 86bc3708..d45f382a 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    SevenZipEntry

    -

    Undocumented

    +
    +
    +
    public class SevenZipEntry: ContainerEntry
    + +
    +
    +

    Represents an entry in 7-Zip container.

    @@ -236,11 +227,19 @@

    SevenZipEntry

    -

    Undocumented

    +

    Various information about entry.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let info: SevenZipEntryInfo
    +
    @@ -248,9 +247,9 @@

    SevenZipEntry

  • - + - name + name
    @@ -258,7 +257,8 @@

    SevenZipEntry

    - +

    Entry’s name.

    +

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -277,9 +277,9 @@

    Declaration

  • - + - size + size
    @@ -287,7 +287,8 @@

    Declaration

    - +

    Entry’s data size.

    +

    Declaration

    @@ -298,7 +299,7 @@

    Declaration

    @@ -306,9 +307,9 @@

    Declaration

  • @@ -316,7 +317,8 @@

    Declaration

    - +

    True, if entry is a directory.

    +

    Declaration

    @@ -327,7 +329,7 @@

    Declaration

    @@ -345,11 +347,19 @@

    Declaration

    -

    Undocumented

    +

    True, if entry is a symbolic link.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let isLink: Bool
    +
    @@ -367,11 +377,19 @@

    Declaration

    -

    Undocumented

    +

    Path to a linked file for symbolic link entry.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let linkPath: String?
    +
    @@ -379,9 +397,9 @@

    Declaration

  • @@ -389,7 +407,21 @@

    Declaration

    - +

    Provides a dictionary with various attributes of the entry. +FileAttributeKey values are used as dictionary keys.

    +

    Possible attributes:

    + +
      +
    • FileAttributeKey.posixPermissions,
    • +
    • FileAttributeKey.size,
    • +
    • FileAttributeKey.modificationDate,
    • +
    • FileAttributeKey.creationDate,
    • +
    • FileAttributeKey.type,
    • +
    • FileAttributeKey.appendOnly.
    • +
    + +

    Most modern TAR containers are in UStar format.

    +

    Declaration

    @@ -400,7 +432,7 @@

    Declaration

    @@ -418,11 +450,20 @@

    Declaration

    -

    Undocumented

    +

    True, if data for entry is available. +It might not be depending on the content of the container.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataIsAvailable: Bool
    +
    @@ -430,9 +471,9 @@

    Declaration

  • - + - data() + data()
    @@ -440,7 +481,13 @@

    Declaration

    - +

    Returns data associated with this entry.

    +
    +

    Throws

    + SevenZipError.dataIsUnavailable if data for entry isn’t available. + +
    +

    Declaration

    @@ -451,7 +498,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html index 97b03716..2e5c0540 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    @@ -242,11 +227,11 @@

    TarContainer

    -

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    +

    Processes TAR container and returns an array of ContainerEntry (which are actually TarEntry).

    Important

    The order of entries is defined by TAR container and, -particularly, by a creator of a given TAR container. +particularly, by the creator of a given TAR container. It is likely that directories will be encountered earlier than files stored in those directories, but one SHOULD NOT rely on any particular order.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html index 001f572b..75c5e025 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -243,11 +228,6 @@

    TarEntry

    Represents a type of an entry.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. FileAttributeType values will be used instead. - -
    See more
    @@ -260,7 +240,7 @@

    Declaration

    @@ -290,7 +270,7 @@

    Declaration

    @@ -320,7 +300,7 @@

    Declaration

    @@ -350,7 +330,7 @@

    Declaration

    @@ -370,11 +350,6 @@

    Declaration

    Provides a dictionary with various attributes of the entry. FileAttributeKey values are used as dictionary keys.

    -
    -

    Note

    - Will be renamed in 4.0. - -

    Possible attributes:

      @@ -401,7 +376,7 @@

      Declaration

    @@ -431,7 +406,7 @@

    Declaration

    @@ -461,7 +436,7 @@

    Declaration

    @@ -491,7 +466,7 @@

    Declaration

    @@ -521,7 +496,7 @@

    Declaration

    @@ -551,7 +526,7 @@

    Declaration

    @@ -581,7 +556,7 @@

    Declaration

    @@ -611,7 +586,7 @@

    Declaration

    @@ -641,7 +616,7 @@

    Declaration

    @@ -671,7 +646,7 @@

    Declaration

    @@ -701,7 +676,7 @@

    Declaration

    @@ -731,7 +706,7 @@

    Declaration

    @@ -749,19 +724,19 @@

    Declaration

    -

    Undocumented

    +

    True if entry is a symbolic link.

    Declaration

    Swift

    -
    public class TarEntry: ContainerEntry
    +
    public let isLink: Bool
    @@ -779,7 +754,7 @@

    Declaration

    -

    Path to a linked file.

    +

    Path to a linked file for symbolic link entry.

    @@ -791,7 +766,7 @@

    Declaration

    @@ -821,7 +796,7 @@

    Declaration

    @@ -851,7 +826,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html index 84604c66..57bb58b4 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -221,11 +206,6 @@

    EntryType

    Represents a type of an entry.

    -
    -

    Warning

    - Deprecated and will be removed in 4.0. FileAttributeType values will be used instead. - -
    @@ -259,7 +239,7 @@

    Declaration

    @@ -293,7 +273,7 @@

    Declaration

    @@ -327,7 +307,7 @@

    Declaration

    @@ -361,7 +341,7 @@

    Declaration

    @@ -395,7 +375,7 @@

    Declaration

    @@ -429,7 +409,7 @@

    Declaration

    @@ -463,7 +443,7 @@

    Declaration

    @@ -497,7 +477,7 @@

    Declaration

    @@ -531,7 +511,7 @@

    Declaration

    @@ -565,7 +545,7 @@

    Declaration

    @@ -599,7 +579,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html index bf03fa36..1f374f0f 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html index 05cc6231..146bea03 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -242,11 +227,11 @@

    ZipContainer

    -

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    +

    Processes ZIP container and returns an array of ContainerEntry (which are actually ZipEntry).

    Important

    The order of entries is defined by ZIP container and, -particularly, by a creator of a given ZIP container. +particularly, by the creator of a given ZIP container. It is likely that directories will be encountered earlier than files stored in those directories, but one SHOULD NOT rely on any particular order.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html index 0d0a6c39..2e7d1add 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -303,11 +288,6 @@

    Declaration

    File or directory attributes related to the file system of the container’s creator.

    -
    -

    Note

    - Will be renamed to externalFileAttributes in 4.0. - -
    @@ -319,7 +299,7 @@

    Declaration

    @@ -349,7 +329,7 @@

    Declaration

    @@ -381,7 +361,7 @@

    Declaration

    @@ -399,19 +379,19 @@

    Declaration

    -

    Undocumented

    +

    True, if entry is a symbolic link.

    Declaration

    Swift

    -
    public class ZipEntry: ContainerEntry
    +
    public let isLink: Bool
    @@ -429,19 +409,19 @@

    Declaration

    -

    Undocumented

    +

    Path to a linked file for symbolic link entry.

    Declaration

    Swift

    -
    public class ZipEntry: ContainerEntry
    +
    public lazy var linkPath: String? =
    @@ -459,19 +439,19 @@

    Declaration

    -

    Undocumented

    +

    True if entry is likely to be text or ASCII file.

    Declaration

    Swift

    -
    public class ZipEntry: ContainerEntry
    +
    public var isTextFile: Bool
    @@ -491,11 +471,6 @@

    Declaration

    Provides a dictionary with various attributes of the entry. FileAttributeKey values are used as dictionary keys.

    -
    -

    Note

    - Will be renamed in 4.0. - -

    Possible attributes:

      @@ -516,7 +491,7 @@

      Declaration

    @@ -552,7 +527,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html index 817e8469..0bc0ea28 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html index 22751226..6518d83d 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html index 6a23b5fa..d587226c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    @@ -224,9 +209,9 @@

    Containers

  • @@ -234,20 +219,20 @@

    Containers

    -

    Provides open function for ZIP containers.

    +

    Provides open functions for 7-Zip containers.

    - See more + See more

    Declaration

    Swift

    -
    public class ZipContainer: Container
    +
    public class SevenZipContainer: Container
    @@ -259,9 +244,9 @@

    Declaration

  • - - - ZipEntry + + + SevenZipEntry
    @@ -269,20 +254,55 @@

    Declaration

    -

    Represents either a file or directory entry in ZIP container.

    +

    Represents an entry in 7-Zip container.

    - See more + See more

    Declaration

    Swift

    -
    public class ZipEntry: ContainerEntry
    +
    public class SevenZipEntry: ContainerEntry
    + +
    +
    + +
    +
    +
  • + + +
    +
    + + + + + +
    + +
    +
    +
      +
    • +
      + + + + ZipEntry + +
      +
      +
      +
      +
      +
      +

      Represents either a file or directory entry in ZIP container.

      + + See more +
      +
      +

      Declaration

      +
      +

      Swift

      +
      public class ZipEntry: ContainerEntry
      + +
      +
      +
      diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html index 3a53f08d..1fb139f6 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

      @@ -85,6 +85,9 @@

    • + @@ -97,19 +100,28 @@ -
    + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html index 0d218290..1d2cb560 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html index 0000bbaa..54a2c27c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html index 550b9101..cb00d052 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html index 088a1a2f..f03dfe94 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html index 99365395..a2b0cd4d 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,14 @@

    SevenZipError

    -

    Undocumented

    +
    +
    +
    public enum SevenZipError: Error
    + +
    +
    +

    Represents an error, which happened during processing 7-Zip container. +It may indicate that either container is damaged or it might not be 7-Zip container at all.

    @@ -236,37 +228,19 @@

    SevenZipError

    -

    Undocumented

    +

    Wrong container’s signature.

    - -
    -
    - - - -
    - -
    -
    -
      -
    • -
      - - - - wrongHeaderSize - -
      -
      -
      -
      -
      -
      -

      Undocumented

      +
      +

      Declaration

      +
      +

      Swift

      +
      case wrongFormatVersion
      +
      @@ -330,9 +286,9 @@

      SevenZipError

    • @@ -340,37 +296,20 @@

      SevenZipError

      -

      Undocumented

      +

      CRC either of one of the files from the container +or one of the container’s strucutures is incorrect.

      - -
      -
      -
    • -
    -
    -
    -
      -
    • -
      - - - - wrongHeaderCRC - -
      -
      -
      -
      -
      -
      -

      Undocumented

      +
      +

      Declaration

      +
      +

      Swift

      +
      case wrongCRC
      +
      @@ -382,9 +321,9 @@

      SevenZipError

    • - - - wrongExternal + + + wrongSize
      @@ -392,37 +331,20 @@

      SevenZipError

      -

      Undocumented

      +

      Size either of one of the files from the container +or one of the container’s strucutures is incorrect.

      - -
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • -
      - - - - wrongEnd - -
      -
      -
      -
      -
      -
      -

      Undocumented

      +
      +

      Declaration

      +
      +

      Swift

      +
      case startPosNotSupported
      +
      @@ -496,37 +400,19 @@

      SevenZipError

      -

      Undocumented

      +

      External feature isn’t supported.

      - -
      -
    - - - -
    -
    - - - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
      -
      -
      -
      -
      -

      Undocumented

      +
      +

      Declaration

      +
      +

      Swift

      +
      case internalStructureError
      +
      diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html index a141f45c..0168fad0 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

      @@ -85,6 +85,9 @@

    • + @@ -97,19 +100,28 @@ -
    + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html index d74cba30..385a4697 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html index 30a42ece..5dcf2be2 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html index 1b945cf9..cad78f4a 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html index 5b107a65..1f825d88 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    @@ -296,9 +281,9 @@

    Declaration

  • - - - GzipError + + + LZMAError
    @@ -306,21 +291,21 @@

    Declaration

    -

    Represents an error, which happened during processing GZip archive. -It may indicate that either archive is damaged or it might not be GZip archive at all.

    +

    Represents an error, which happened during LZMA decompression. +It may indicate that either data is damaged or it might not be compressed with LZMA at all.

    - See more + See more

    Declaration

    Swift

    -
    public enum GzipError: Error
    +
    public enum LZMAError: Error
    @@ -368,9 +353,9 @@

    Declaration

  • - - - LZMAError + + + SevenZipError
    @@ -378,21 +363,21 @@

    Declaration

    -

    Represents an error, which happened during LZMA decompression. -It may indicate that either data is damaged or it might not be compressed with LZMA at all.

    +

    Represents an error, which happened during processing 7-Zip container. +It may indicate that either container is damaged or it might not be 7-Zip container at all.

    - See more + See more

    Declaration

    Swift

    -
    public enum LZMAError: Error
    +
    public enum SevenZipError: Error
    @@ -447,9 +432,9 @@

    Declaration

  • - - - XZError + + + ZipError
    @@ -457,21 +442,21 @@

    Declaration

    -

    Represents an error, which happened during unarchiving XZ archive. -It may indicate that either archive is damaged or it might not be XZ archive at all.

    +

    Represents an error, which happened during processing ZIP container. +It may indicate that either container is damaged or it might not be ZIP container at all.

    - See more + See more

    Declaration

    Swift

    -
    public enum XZError: Error
    +
    public enum ZipError: Error
    @@ -483,9 +468,9 @@

    Declaration

  • - - - ZipError + + + GzipError
    @@ -493,21 +478,57 @@

    Declaration

    -

    Represents an error, which happened during processing ZIP container. -It may indicate that either container is damaged or it might not be ZIP container at all.

    +

    Represents an error, which happened during processing GZip archive. +It may indicate that either archive is damaged or it might not be GZip archive at all.

    - See more + See more

    Declaration

    Swift

    -
    public enum ZipError: Error
    +
    public enum GzipError: Error
    +
    +
    +
  • + +
    +
    +
    - diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html deleted file mode 100644 index 84b0b83a..00000000 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Enums.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - Other Enums Reference - - - - - - - - - - - - - - - -
    -

    - - SWCompression Docs - - (67% documented) -

    - -

    -

    - -
    -

    - -

    - - - View on GitHub - -

    - -
    - - - -
    - -
    - -
    -
    -

    Other Enums

    -

    The following enums are available globally.

    - -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    - - - - diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html deleted file mode 100644 index 721a3ffa..00000000 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Other Structs.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - Other Structs Reference - - - - - - - - - - - - - - - -
    -

    - - SWCompression Docs - - (67% documented) -

    - -

    -

    - -
    -

    - -

    - - - View on GitHub - -

    - -
    - - - -
    - -
    - -
    -
    -

    Other Structs

    -

    The following structs are available globally.

    - -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    - - - - diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html index 68ff3581..7e93bcf3 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    @@ -309,7 +294,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html index b916c9c2..052813be 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html index b6fcd9c7..4485d2e0 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html index a0c57288..d9905d69 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -302,7 +287,7 @@

    Declaration

    -

    Check if entry is a directory.

    +

    True, if entry is a directory.

    @@ -332,19 +317,19 @@

    Declaration

    -

    Undocumented

    +

    True, if entry is a symbolic link.

    Declaration

    Swift

    -
    public protocol ContainerEntry
    +
    var isLink: Bool
    @@ -362,19 +347,19 @@

    Declaration

    -

    Undocumented

    +

    Path to a linked file for symbolic link entry.

    Declaration

    Swift

    -
    public protocol ContainerEntry
    +
    var linkPath: String?
    @@ -410,7 +395,7 @@

    Declaration

    @@ -440,7 +425,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html index fd70493f..7a9052b1 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html index c09daf63..c69edc7c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html index 36b75a90..0fef6679 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html index ced6c3cf..d46f2b99 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html index 7a79e689..103f2105 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    SevenZipEntryInfo

    -

    Undocumented

    +
    +
    +
    public struct SevenZipEntryInfo
    + +
    +
    +

    Provides information about 7-Zip entry.

    @@ -236,12 +227,20 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Represents file access permissions in UNIX format.

    See more
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Permissions: OptionSet
    + +
    +
    @@ -259,12 +258,20 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Represents file attributes in DOS format.

    See more
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DosAttributes: OptionSet
    + +
    +
    @@ -282,12 +289,20 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Represents file type in UNIX format.

    See more
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum UnixType: UInt32
    + +
    +
    @@ -305,11 +320,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s name.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let name: String?
    +
    @@ -327,11 +350,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s data size.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let size: Int?
    + +
    +
    @@ -349,11 +380,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    True, if entry is a directory.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let isDirectory: Bool
    +
    @@ -371,11 +410,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s last access time and date.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let accessTime: Date?
    + +
    +
    @@ -393,11 +440,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s creation time and date.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let creationTime: Date?
    + +
    +
    @@ -415,11 +470,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s last modification time and date.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let modificationTime: Date?
    +
    @@ -437,11 +500,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    7-Zip internal property which may contain UNIX permissions, type and/or DOS attributes.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let winAttributes: UInt32?
    + +
    +
    @@ -459,11 +530,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s UNIX file access permissions.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let permissions: Permissions?
    +
    @@ -481,11 +560,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s DOS attributes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dosAttributes: DosAttributes?
    +
    @@ -503,11 +590,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    Entry’s UNIX file type.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let unixType: UnixType?
    + +
    +
    @@ -525,11 +620,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    7-Zip internal propety. Indicates whether entry has a stream (data) inside container.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let hasStream: Bool
    +
    @@ -547,11 +650,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    True, if entry is an empty file. 7-Zip internal property.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public let isEmpty: Bool
    + +
    +
    @@ -569,11 +680,21 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    True if entry is an anti-file. +Used in differential backups to indicate that file should be deleted. +7-Zip internal property.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let isAnti: Bool
    +
    @@ -591,11 +712,19 @@

    SevenZipEntryInfo

    -

    Undocumented

    +

    CRC32 of entry’s data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let crc: UInt32?
    +
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html index fa29e240..cce4043c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    DosAttributes

    -

    Undocumented

    +
    +
    +
    public struct DosAttributes: OptionSet
    + +
    +
    +

    Represents file attributes in DOS format.

    @@ -226,9 +217,9 @@

    DosAttributes

  • - + - rawValue + rawValue
    @@ -236,7 +227,8 @@

    DosAttributes

    - +

    Raw bit flags value.

    +

    Declaration

    @@ -247,7 +239,7 @@

    Declaration

    @@ -255,9 +247,9 @@

    Declaration

  • @@ -265,7 +257,8 @@

    Declaration

    - +

    Initializes attributes with bit flags.

    +

    Declaration

    @@ -275,27 +268,8 @@

    Declaration

    -
    -

    Parameters

    - - - - - - - -
    - - rawValue - - -
    - -
    -
    -
    @@ -313,11 +287,19 @@

    Parameters

    -

    Undocumented

    +

    File is archive or archived.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let archive = DosAttributes(rawValue: 0b00100000)
    + +
    +
    @@ -335,11 +317,19 @@

    Parameters

    -

    Undocumented

    +

    File is a directory.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let directory = DosAttributes(rawValue: 0b00010000)
    + +
    +
    @@ -357,11 +347,19 @@

    Parameters

    -

    Undocumented

    +

    File is a volume.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let volume = DosAttributes(rawValue: 0b00001000)
    +
    @@ -379,11 +377,19 @@

    Parameters

    -

    Undocumented

    +

    File is a system file.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let system = DosAttributes(rawValue: 0b00000100)
    + +
    +
    @@ -401,11 +407,19 @@

    Parameters

    -

    Undocumented

    +

    File is hidden.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let hidden = DosAttributes(rawValue: 0b00000010)
    + +
    +
    @@ -423,11 +437,19 @@

    Parameters

    -

    Undocumented

    +

    File is read-only.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let readOnly = DosAttributes(rawValue: 0b00000001)
    + +
    +
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html index bd69b86e..30c3fa10 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    Permissions

    -

    Undocumented

    +
    +
    +
    public struct Permissions: OptionSet
    + +
    +
    +

    Represents file access permissions in UNIX format.

    @@ -226,9 +217,9 @@

    Permissions

  • - + - rawValue + rawValue
    @@ -236,7 +227,8 @@

    Permissions

    - +

    Raw bit flags value (in decimal).

    +

    Declaration

    @@ -247,7 +239,7 @@

    Declaration

    @@ -255,9 +247,9 @@

    Declaration

  • @@ -265,7 +257,8 @@

    Declaration

    - +

    Initializes permissions with bit flags in decimal.

    +

    Declaration

    @@ -275,27 +268,8 @@

    Declaration

    -
    -

    Parameters

    - - - - - - - -
    - - rawValue - - -
    - -
    -
    -
    @@ -313,11 +287,19 @@

    Parameters

    -

    Undocumented

    +

    Set UID.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let setuid = Permissions(rawValue: 0o4000)
    +
    @@ -335,11 +317,19 @@

    Parameters

    -

    Undocumented

    +

    Set GID.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let setgid = Permissions(rawValue: 0o2000)
    +
    @@ -357,11 +347,19 @@

    Parameters

    -

    Undocumented

    +

    Sticky bit.

    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let sticky = Permissions(rawValue: 0o1000)
    + +
    +
    @@ -379,11 +377,19 @@

    Parameters

    -

    Undocumented

    +

    Owner can read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let readOwner = Permissions(rawValue: 0o0400)
    +
    @@ -401,11 +407,19 @@

    Parameters

    -

    Undocumented

    +

    Owner can write.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let writeOwner = Permissions(rawValue: 0o0200)
    +
    @@ -423,11 +437,19 @@

    Parameters

    -

    Undocumented

    +

    Owner can execute.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let executeOwner = Permissions(rawValue: 0o0100)
    +
    @@ -445,11 +467,19 @@

    Parameters

    -

    Undocumented

    +

    Group can read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let readGroup = Permissions(rawValue: 0o0040)
    +
    @@ -467,11 +497,19 @@

    Parameters

    -

    Undocumented

    +

    Group can write.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let writeGroup = Permissions(rawValue: 0o0020)
    +
    @@ -489,11 +527,19 @@

    Parameters

    -

    Undocumented

    +

    Group can execute.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let executeGroup = Permissions(rawValue: 0o0010)
    +
    @@ -511,11 +557,19 @@

    Parameters

    -

    Undocumented

    +

    Others can read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let readOther = Permissions(rawValue: 0o0004)
    +
    @@ -533,11 +587,19 @@

    Parameters

    -

    Undocumented

    +

    Others can write.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let writeOther = Permissions(rawValue: 0o0002)
    +
    @@ -555,11 +617,19 @@

    Parameters

    -

    Undocumented

    +

    Others can execute.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let executeOther = Permissions(rawValue: 0o0001)
    +
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html index d78b78bc..f5f87b57 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

  • + @@ -97,19 +100,28 @@ - + - - -
    @@ -214,7 +199,13 @@

    UnixType

    -

    Undocumented

    +
    +
    +
    public enum UnixType: UInt32
    + +
    +
    +

    Represents file type in UNIX format.

    @@ -236,11 +227,19 @@

    UnixType

    -

    Undocumented

    +

    FIFO special file.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case fifo = 0o010000
    +
    @@ -262,11 +261,19 @@

    UnixType

    -

    Undocumented

    +

    Character special file.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case characterSpecial = 0o020000
    +
    @@ -288,11 +295,19 @@

    UnixType

    -

    Undocumented

    +

    Directory.

    +
    +

    Declaration

    +
    +

    Swift

    +
    case directory = 0o040000
    + +
    +
    @@ -314,11 +329,19 @@

    UnixType

    -

    Undocumented

    +

    Block special file.

    +
    +

    Declaration

    +
    +

    Swift

    +
    case blockSpecial = 0o060000
    + +
    +
    @@ -340,11 +363,19 @@

    UnixType

    -

    Undocumented

    +

    Regular file.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case regular = 0o100000
    +
    @@ -366,11 +397,19 @@

    UnixType

    -

    Undocumented

    +

    Symbolic link.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case symbolicLink = 0o120000
    +
    @@ -392,11 +431,19 @@

    UnixType

    -

    Undocumented

    +

    Socket.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case socket = 0o140000
    +
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html index 434e7e83..55183b8d 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html index 5e1503d0..18e60662 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html index d8bb88d1..54c459fb 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html @@ -23,7 +23,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -85,6 +85,9 @@

    + @@ -97,19 +100,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html index 2bfcdeb3..3dc30092 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html @@ -22,7 +22,7 @@ SWCompression Docs - (67% documented) + (100% documented)

    @@ -84,6 +84,9 @@

    + @@ -96,19 +99,28 @@ - + - - -
    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json index 27045042..8c1e188e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/search.json @@ -1 +1 @@ -{"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Undocumented

    "},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongStartHeaderCRCFMS0_S0_":{"name":"wrongStartHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongHeaderSizeFMS0_S0_":{"name":"wrongHeaderSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongPropertyIDFMS0_S0_":{"name":"wrongPropertyID","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongExternalFMS0_S0_":{"name":"wrongExternal","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18reservedCodecFlagsFMS0_S0_":{"name":"reservedCodecFlags","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17unknownNumFoldersFMS0_S0_":{"name":"unknownNumFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongEndFMS0_S0_":{"name":"wrongEnd","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22altMethodsNotSupportedFMS0_S0_":{"name":"altMethodsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongStreamsNumberFMS0_S0_":{"name":"wrongStreamsNumber","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20wrongCoderPropertiesFMS0_S0_":{"name":"wrongCoderProperties","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noPackInfoFMS0_S0_":{"name":"noPackInfo","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17wrongFilePropertyFMS0_S0_":{"name":"wrongFileProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongFileNameLengthFMS0_S0_":{"name":"wrongFileNameLength","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongFileNamesFMS0_S0_":{"name":"wrongFileNames","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18incompletePropertyFMS0_S0_":{"name":"incompleteProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noFileSizeFMS0_S0_":{"name":"noFileSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughFoldersFMS0_S0_":{"name":"notEnoughFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughStreamsFMS0_S0_":{"name":"notEnoughStreams","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13noStreamFoundFMS0_S0_":{"name":"noStreamFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15noPackInfoFoundFMS0_S0_":{"name":"noPackInfoFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14streamOverreadFMS0_S0_":{"name":"streamOverread","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Undocumented

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Undocumented

    "},"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10isTextFileSb":{"name":"isTextFile","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"},"Other Classes.html":{"name":"Other Classes","abstract":"

    The following classes are available globally.

    "},"Other Enums.html":{"name":"Other Enums","abstract":"

    The following enums are available globally.

    "},"Other Structs.html":{"name":"Other Structs","abstract":"

    The following structs are available globally.

    "}} \ No newline at end of file +{"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry6isLinkSb":{"name":"isLink","abstract":"

    True, if entry is a symbolic link.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file for symbolic link entry.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong container’s signature.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongFormatVersionFMS0_S0_":{"name":"wrongFormatVersion","abstract":"

    Unsupporte version of container’s format.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    CRC either of one of the files from the container","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Size either of one of the files from the container","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Files have StartPos property. This feature isn’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    External feature isn’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Coders with multiple in and/or out streams aren’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Additional streams feature isn’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or container’s header is encrypted. This feature isn’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Entry’s data isn’t available.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22internalStructureErrorFMS0_S0_":{"name":"internalStructureError","abstract":"

    Unknown/incorrect internal 7-Zip structure was encountered or","parent_name":"SevenZipError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Represents an error, which happened during processing 7-Zip container."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry6isLinkSb":{"name":"isLink","abstract":"

    True, if entry is a symbolic link.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file for symbolic link entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10isTextFileSb":{"name":"isTextFile","abstract":"

    True if entry is likely to be text or ASCII file.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntry (which are actually ZipEntry).

    ","parent_name":"ZipContainer"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry6isLinkSb":{"name":"isLink","abstract":"

    True if entry is a symbolic link.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file for symbolic link entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntry (which are actually TarEntry).

    ","parent_name":"TarContainer"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Regular file.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolic link.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Socket.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vVV13SWCompression17SevenZipEntryInfo13DosAttributes8rawValueVs6UInt32":{"name":"rawValue","abstract":"

    Raw bit flags value.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FVV13SWCompression17SevenZipEntryInfo13DosAttributescFT8rawValueVs6UInt32_S1_":{"name":"init(rawValue:)","abstract":"

    Initializes attributes with bit flags.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    File is archive or archived.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    File is a directory.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    File is a volume.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    File is a system file.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    File is hidden.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    File is read-only.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vVV13SWCompression17SevenZipEntryInfo11Permissions8rawValueVs6UInt32":{"name":"rawValue","abstract":"

    Raw bit flags value (in decimal).

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FVV13SWCompression17SevenZipEntryInfo11PermissionscFT8rawValueVs6UInt32_S1_":{"name":"init(rawValue:)","abstract":"

    Initializes permissions with bit flags in decimal.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Set UID.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Set GID.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Sticky bit.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Owner can read.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Owner can write.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Owner can execute.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Group can read.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Group can write.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Group can execute.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Others can read.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Others can write.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Others can execute.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Represents file access permissions in UNIX format.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Represents file attributes in DOS format.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Represents file type in UNIX format.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Entry’s name.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Entry’s data size.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Entry’s last access time and date.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Entry’s creation time and date.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Entry’s last modification time and date.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    7-Zip internal property which may contain UNIX permissions, type and/or DOS attributes.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Entry’s UNIX file access permissions.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Entry’s DOS attributes.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Entry’s UNIX file type.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    7-Zip internal propety. Indicates whether entry has a stream (data) inside container.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    True, if entry is an empty file. 7-Zip internal property.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    True if entry is an anti-file.","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    CRC32 of entry’s data.

    ","parent_name":"SevenZipEntryInfo"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Various information about entry.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4nameSS":{"name":"name","abstract":"

    Entry’s name.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4sizeSi":{"name":"size","abstract":"

    Entry’s data size.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    True, if entry is a symbolic link.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file for symbolic link entry.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    True, if data for entry is available.","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FC13SWCompression13SevenZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes 7-Zip container and returns an array of ContainerEntry (which are actually SevenZipEntry).

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Processes ZIP container and returns an array of SevenZipEntryInfo,","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Provides open functions for 7-Zip containers.

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Represents an entry in 7-Zip container.

    "},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Provides information about 7-Zip entry.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"}} \ No newline at end of file diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/docSet.dsidx b/docs/docsets/SWCompression.docset/Contents/Resources/docSet.dsidx index b382906247bab8cfb13c56b5c115c4f1eec5b7f8..a4454485e44ce2500381051004f490f2d50e99c9 100644 GIT binary patch delta 9584 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 delta 12212 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 R-nqSdX=#(SgHy(b`#*u@+Ohxu literal 124615 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�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 + - - -
    diff --git a/docs/search.json b/docs/search.json index 27045042..8c1e188e 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -{"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Undocumented

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    Undocumented

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vPs16RawRepresentable8rawValuewx8RawValue":{"name":"rawValue","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FPs9OptionSetcFT8rawValuewx8RawValue_x":{"name":"init(rawValue:)","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Undocumented

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Undocumented

    "},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongStartHeaderCRCFMS0_S0_":{"name":"wrongStartHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongHeaderSizeFMS0_S0_":{"name":"wrongHeaderSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15wrongPropertyIDFMS0_S0_":{"name":"wrongPropertyID","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongExternalFMS0_S0_":{"name":"wrongExternal","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18reservedCodecFlagsFMS0_S0_":{"name":"reservedCodecFlags","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17unknownNumFoldersFMS0_S0_":{"name":"unknownNumFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongEndFMS0_S0_":{"name":"wrongEnd","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22altMethodsNotSupportedFMS0_S0_":{"name":"altMethodsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongStreamsNumberFMS0_S0_":{"name":"wrongStreamsNumber","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20wrongCoderPropertiesFMS0_S0_":{"name":"wrongCoderProperties","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noPackInfoFMS0_S0_":{"name":"noPackInfo","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17wrongFilePropertyFMS0_S0_":{"name":"wrongFileProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError19wrongFileNameLengthFMS0_S0_":{"name":"wrongFileNameLength","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongFileNamesFMS0_S0_":{"name":"wrongFileNames","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18incompletePropertyFMS0_S0_":{"name":"incompleteProperty","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError10noFileSizeFMS0_S0_":{"name":"noFileSize","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughFoldersFMS0_S0_":{"name":"notEnoughFolders","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError16notEnoughStreamsFMS0_S0_":{"name":"notEnoughStreams","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError13noStreamFoundFMS0_S0_":{"name":"noStreamFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError15noPackInfoFoundFMS0_S0_":{"name":"noPackInfoFound","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14streamOverreadFMS0_S0_":{"name":"streamOverread","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Undocumented

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    Undocumented

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Undocumented

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Undocumented

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Undocumented

    "},"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    Check if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntries (which are actually TarEntries).

    ","parent_name":"TarContainer"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry6isLinkSb":{"name":"isLink","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10isTextFileSb":{"name":"isTextFile","abstract":"

    Undocumented

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntries (which are actually ZipEntries).

    ","parent_name":"ZipContainer"},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"},"Other Classes.html":{"name":"Other Classes","abstract":"

    The following classes are available globally.

    "},"Other Enums.html":{"name":"Other Enums","abstract":"

    The following enums are available globally.

    "},"Other Structs.html":{"name":"Other Structs","abstract":"

    The following structs are available globally.

    "}} \ No newline at end of file +{"Protocols/DecompressionAlgorithm.html#/s:ZFP13SWCompression22DecompressionAlgorithm10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompress data compressed with particular algorithm.

    ","parent_name":"DecompressionAlgorithm"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4nameSS":{"name":"name","abstract":"

    Retrieve name of the entry from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry4sizeSi":{"name":"size","abstract":"

    Retrieve size of the entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry6isLinkSb":{"name":"isLink","abstract":"

    True, if entry is a symbolic link.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file for symbolic link entry.

    ","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:vP13SWCompression14ContainerEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ContainerEntry"},"Protocols/ContainerEntry.html#/s:FP13SWCompression14ContainerEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Retrieve entry’s data from the container.

    ","parent_name":"ContainerEntry"},"Protocols/Container.html#/s:ZFP13SWCompression9Container4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Retrieve all the entries from the container.

    ","parent_name":"Container"},"Protocols/Archive.html#/s:ZFP13SWCompression7Archive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchive data from the archive.

    ","parent_name":"Archive"},"Protocols/Archive.html":{"name":"Archive","abstract":"

    A type that represents an archive.

    "},"Protocols/Container.html":{"name":"Container","abstract":"

    A type that represents a container of files, directories and/or other data.

    "},"Protocols/ContainerEntry.html":{"name":"ContainerEntry","abstract":"

    A type that represents an entry from a container (file or directory) with attributes.

    "},"Protocols/DecompressionAlgorithm.html":{"name":"DecompressionAlgorithm","abstract":"

    A type that provides an implementation of a particular decompression algorithm.

    "},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError20wrongCompressionInfoFMS0_S0_":{"name":"wrongCompressionInfo","abstract":"

    Compression info has value incompatible with Deflate compression method.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError11wrongFcheckFMS0_S0_":{"name":"wrongFcheck","abstract":"

    First two bytes of archive’s flags are inconsistent with each other.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError21wrongCompressionLevelFMS0_S0_":{"name":"wrongCompressionLevel","abstract":"

    Compression level has value, which is different from the supported ones.

    ","parent_name":"ZlibError"},"Enums/ZlibError.html#/s:FO13SWCompression9ZlibError12wrongAdler32FMS0_FV10Foundation4DataS0_":{"name":"wrongAdler32","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"ZlibError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    Either ‘magic’ number in header or footer isn’t equal to a predefined value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15wrongFieldValueFMS0_S0_":{"name":"wrongFieldValue","abstract":"

    One of the fields in archive has an incorrect value.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError18fieldReservedValueFMS0_S0_":{"name":"fieldReservedValue","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongInfoCRCFMS0_S0_":{"name":"wrongInfoCRC","abstract":"

    Checksum of one of the fields of archive doesn’t match the value stored in archive.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongFilterIDFMS0_S0_":{"name":"wrongFilterID","abstract":"

    Filter used in archvie is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError15checkTypeSHA256FMS0_S0_":{"name":"checkTypeSHA256","abstract":"

    Archive uses SHA-256 checksum which is unsupported.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError13wrongDataSizeFMS0_S0_":{"name":"wrongDataSize","abstract":"

    Either size of decompressed data isn’t equal to the one specified in archive or","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError10wrongCheckFMS0_FV10Foundation4DataS0_":{"name":"wrongCheck","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in the archive.","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError12wrongPaddingFMS0_S0_":{"name":"wrongPadding","abstract":"

    Padding (null-bytes appended to an archive’s structure) is incorrect.

    ","parent_name":"XZError"},"Enums/XZError.html#/s:FO13SWCompression7XZError21multiByteIntegerErrorFMS0_S0_":{"name":"multiByteIntegerError","abstract":"

    Either null byte encountered or exceeded maximum amount bytes during reading multi byte number.

    ","parent_name":"XZError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    First two bytes (‘magic’ number) of archive isn’t 31 and 139.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method used in archive is different from Deflate, which is the only supported one.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongFlagsFMS0_S0_":{"name":"wrongFlags","abstract":"

    One of the reserved fields in archive has an unexpected value, which can also mean (apart from damaged archive),","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError14wrongHeaderCRCFMS0_S0_":{"name":"wrongHeaderCRC","abstract":"

    Computed CRC of archive’s header doesn’t match the value stored in archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError10wrongISizeFMS0_S0_":{"name":"wrongISize","abstract":"

    Computed ‘isize’ didn’t match the value stored in the archive.

    ","parent_name":"GzipError"},"Enums/GzipError.html#/s:FO13SWCompression9GzipError21cannotEncodeISOLatin1FMS0_S0_":{"name":"cannotEncodeISOLatin1","abstract":"

    Either specified file name or comment cannot be encoded using ISO Latin-1 encoding.

    ","parent_name":"GzipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError27notFoundCentralDirectoryEndFMS0_S0_":{"name":"notFoundCentralDirectoryEnd","abstract":"

    End of Central Directoty record wasn’t found.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong signature of one of container’s structures.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Wrong either compressed or uncompressed size of a container’s entry.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError12wrongVersionFMS0_S0_":{"name":"wrongVersion","abstract":"

    Version needed to process container is unsupported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError24multiVolumesNotSupportedFMS0_S0_":{"name":"multiVolumesNotSupported","abstract":"

    Container is either spanned or consists of several volumes. These features aren’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or record is encrypted. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError20patchingNotSupportedFMS0_S0_":{"name":"patchingNotSupported","abstract":"

    Entry contains patched data. This feature isn’t supported.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError16wrongLocalHeaderFMS0_S0_":{"name":"wrongLocalHeader","abstract":"

    Local header of an entry is inconsistent with Central Directory.

    ","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError10wrongCRC32FMS0_FV10Foundation4DataS0_":{"name":"wrongCRC32","abstract":"

    Computed checksum of entry’s data doesn’t match the value stored in container.","parent_name":"ZipError"},"Enums/ZipError.html#/s:FO13SWCompression8ZipError14wrongTextFieldFMS0_S0_":{"name":"wrongTextField","abstract":"

    Either entry’s comment or file name cannot be processed using UTF-8 encoding.

    ","parent_name":"ZipError"},"Enums/TarError.html#/s:FO13SWCompression8TarError20tooSmallFileIsPassedFMS0_S0_":{"name":"tooSmallFileIsPassed","abstract":"

    Size of data is too small, even to contain only one header.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError16fieldIsNotNumberFMS0_S0_":{"name":"fieldIsNotNumber","abstract":"

    Failed to process a field as a number.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongHeaderChecksumFMS0_S0_":{"name":"wrongHeaderChecksum","abstract":"

    Computed checksum of a header doesn’t match the value stored in container.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError17wrongUstarVersionFMS0_S0_":{"name":"wrongUstarVersion","abstract":"

    Unsupported version of USTAR format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError19wrongPaxHeaderEntryFMS0_S0_":{"name":"wrongPaxHeaderEntry","abstract":"

    Entry from PAX extended header is in incorrect format.

    ","parent_name":"TarError"},"Enums/TarError.html#/s:FO13SWCompression8TarError14notAsciiStringFMS0_S0_":{"name":"notAsciiString","abstract":"

    Failed to process a field as an ASCII string.

    ","parent_name":"TarError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError14wrongSignatureFMS0_S0_":{"name":"wrongSignature","abstract":"

    Wrong container’s signature.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError18wrongFormatVersionFMS0_S0_":{"name":"wrongFormatVersion","abstract":"

    Unsupporte version of container’s format.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError8wrongCRCFMS0_S0_":{"name":"wrongCRC","abstract":"

    CRC either of one of the files from the container","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError9wrongSizeFMS0_S0_":{"name":"wrongSize","abstract":"

    Size either of one of the files from the container","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20startPosNotSupportedFMS0_S0_":{"name":"startPosNotSupported","abstract":"

    Files have StartPos property. This feature isn’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError20externalNotSupportedFMS0_S0_":{"name":"externalNotSupported","abstract":"

    External feature isn’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23multiStreamNotSupportedFMS0_S0_":{"name":"multiStreamNotSupported","abstract":"

    Coders with multiple in and/or out streams aren’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError29additionalStreamsNotSupportedFMS0_S0_":{"name":"additionalStreamsNotSupported","abstract":"

    Additional streams feature isn’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError23compressionNotSupportedFMS0_S0_":{"name":"compressionNotSupported","abstract":"

    Entry is compressed using unsupported compression method.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22encryptionNotSupportedFMS0_S0_":{"name":"encryptionNotSupported","abstract":"

    Entry or container’s header is encrypted. This feature isn’t supported.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError17dataIsUnavailableFMS0_S0_":{"name":"dataIsUnavailable","abstract":"

    Entry’s data isn’t available.

    ","parent_name":"SevenZipError"},"Enums/SevenZipError.html#/s:FO13SWCompression13SevenZipError22internalStructureErrorFMS0_S0_":{"name":"internalStructureError","abstract":"

    Unknown/incorrect internal 7-Zip structure was encountered or","parent_name":"SevenZipError"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Reserved bits of LZMA2 properties’ byte aren’t equal to zero.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error19wrongDictionarySizeFMS0_S0_":{"name":"wrongDictionarySize","abstract":"

    Dictionary size is too big.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error16wrongControlByteFMS0_S0_":{"name":"wrongControlByte","abstract":"

    Unknown conrol byte value of LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongResetFMS0_S0_":{"name":"wrongReset","abstract":"

    Unknown reset instruction encountered in LZMA2 packet.

    ","parent_name":"LZMA2Error"},"Enums/LZMA2Error.html#/s:FO13SWCompression10LZMA2Error10wrongSizesFMS0_S0_":{"name":"wrongSizes","abstract":"

    Either size of decompressed data isn’t equal to the one specified in LZMA2 packet or","parent_name":"LZMA2Error"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError15wrongPropertiesFMS0_S0_":{"name":"wrongProperties","abstract":"

    Properties’ byte is greater than 225.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError21rangeDecoderInitErrorFMS0_S0_":{"name":"rangeDecoderInitError","abstract":"

    Unable to initialize RanderDecorer.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError24exceededUncompressedSizeFMS0_S0_":{"name":"exceededUncompressedSize","abstract":"

    Size of uncompressed data hit specified limit in the middle of decoding.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError13windowIsEmptyFMS0_S0_":{"name":"windowIsEmpty","abstract":"

    Unable to perfrom repeat-distance decoding because there is nothing to repeat.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23rangeDecoderFinishErrorFMS0_S0_":{"name":"rangeDecoderFinishError","abstract":"

    End of stream marker is reached, but range decoder is in incorrect state.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError16repeatWillExceedFMS0_S0_":{"name":"repeatWillExceed","abstract":"

    The number of bytes to repeat is greater than the amount bytes that is left to decode.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError17notEnoughToRepeatFMS0_S0_":{"name":"notEnoughToRepeat","abstract":"

    The amount of already decoded bytes is smaller than repeat length.

    ","parent_name":"LZMAError"},"Enums/LZMAError.html#/s:FO13SWCompression9LZMAError23decoderIsNotInitialisedFMS0_S0_":{"name":"decoderIsNotInitialised","abstract":"

    LZMADecoder wasn’t properly initialized before decoding data.

    ","parent_name":"LZMAError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError29wrongUncompressedBlockLengthsFMS0_S0_":{"name":"wrongUncompressedBlockLengths","abstract":"

    Uncompressed block’s length and nlength bytes isn’t consistent with each other.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unknown block type (not 0, 1 or 2).

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError11wrongSymbolFMS0_S0_":{"name":"wrongSymbol","abstract":"

    Decoded symbol was found in Huffman tree but is unknown.

    ","parent_name":"DeflateError"},"Enums/DeflateError.html#/s:FO13SWCompression12DeflateError14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"DeflateError"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error10wrongMagicFMS0_S0_":{"name":"wrongMagic","abstract":"

    ‘Magic’ number is not 0x425a.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongCompressionMethodFMS0_S0_":{"name":"wrongCompressionMethod","abstract":"

    Compression method is not type ‘h’ (not Huffman).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockSizeFMS0_S0_":{"name":"wrongBlockSize","abstract":"

    Unsupported block size (not from ‘0’ to ‘9’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14wrongBlockTypeFMS0_S0_":{"name":"wrongBlockType","abstract":"

    Unsupported block type (is neither ‘pi’ nor ‘sqrt(pi)’).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error15randomizedBlockFMS0_S0_":{"name":"randomizedBlock","abstract":"

    Block is randomized.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error18wrongHuffmanGroupsFMS0_S0_":{"name":"wrongHuffmanGroups","abstract":"

    Wrong number of Huffman tables/groups (should be between 2 and 6).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error13wrongSelectorFMS0_S0_":{"name":"wrongSelector","abstract":"

    Selector is greater than the total number of Huffman tables/groups.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error22wrongHuffmanLengthCodeFMS0_S0_":{"name":"wrongHuffmanLengthCode","abstract":"

    Wrong code of Huffman length (should be between 0 and 20).

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error14symbolNotFoundFMS0_S0_":{"name":"symbolNotFound","abstract":"

    Symbol wasn’t found in Huffman tree.

    ","parent_name":"BZip2Error"},"Enums/BZip2Error.html#/s:FO13SWCompression10BZip2Error8wrongCRCFMS0_FV10Foundation4DataS0_":{"name":"wrongCRC","abstract":"

    Computed checksum of uncompressed data doesn’t match the value stored in archive.","parent_name":"BZip2Error"},"Enums/BZip2Error.html":{"name":"BZip2Error","abstract":"

    Represents an error, which happened during BZip2 decompression."},"Enums/DeflateError.html":{"name":"DeflateError","abstract":"

    Represents an error, which happened during Deflate compression or decompression."},"Enums/LZMAError.html":{"name":"LZMAError","abstract":"

    Represents an error, which happened during LZMA decompression."},"Enums/LZMA2Error.html":{"name":"LZMA2Error","abstract":"

    Represents an error, which happened during LZMA2 decompression."},"Enums/SevenZipError.html":{"name":"SevenZipError","abstract":"

    Represents an error, which happened during processing 7-Zip container."},"Enums/TarError.html":{"name":"TarError","abstract":"

    Represents an error, which happened during processing TAR container."},"Enums/ZipError.html":{"name":"ZipError","abstract":"

    Represents an error, which happened during processing ZIP container."},"Enums/GzipError.html":{"name":"GzipError","abstract":"

    Represents an error, which happened during processing GZip archive."},"Enums/XZError.html":{"name":"XZError","abstract":"

    Represents an error, which happened during unarchiving XZ archive."},"Enums/ZlibError.html":{"name":"ZlibError","abstract":"

    Represents an error, which happened during processing Zlib archive."},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10attributesVs6UInt32":{"name":"attributes","abstract":"

    File or directory attributes related to the file system of the container’s creator.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry6isLinkSb":{"name":"isLink","abstract":"

    True, if entry is a symbolic link.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file for symbolic link entry.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry10isTextFileSb":{"name":"isTextFile","abstract":"

    True if entry is likely to be text or ASCII file.

    ","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:vC13SWCompression8ZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"ZipEntry"},"Classes/ZipEntry.html#/s:FC13SWCompression8ZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"ZipEntry"},"Classes/ZipContainer.html#/s:ZFC13SWCompression12ZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes ZIP container and returns an array of ContainerEntry (which are actually ZipEntry).

    ","parent_name":"ZipContainer"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType6normalFMS1_S1_":{"name":"normal","abstract":"

    Normal file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType8hardLinkFMS1_S1_":{"name":"hardLink","abstract":"

    Hard linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolically linked entry.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType10contiguousFMS1_S1_":{"name":"contiguous","abstract":"

    Contiguous file.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType20globalExtendedHeaderFMS1_S1_":{"name":"globalExtendedHeader","abstract":"

    PAX global extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType19localExtendedHeaderFMS1_S1_":{"name":"localExtendedHeader","abstract":"

    PAX local extended header. (Should not be encountered separately).

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html#/s:FOC13SWCompression8TarEntry9EntryType23vendorUnknownOrReservedFMS1_S1_":{"name":"vendorUnknownOrReserved","abstract":"

    Either unknown type, vendor specific or reserved value.

    ","parent_name":"EntryType"},"Classes/TarEntry/EntryType.html":{"name":"EntryType","abstract":"

    Represents a type of an entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4nameSS":{"name":"name","abstract":"

    Name of the file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4sizeSi":{"name":"size","abstract":"

    Size of the data associated with the entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4modeGSqSi_":{"name":"mode","abstract":"

    File mode.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7ownerIDGSqSi_":{"name":"ownerID","abstract":"

    Owner’s ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7groupIDGSqSi_":{"name":"groupID","abstract":"

    Owner’s group ID.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry16modificationTimeV10Foundation4Date":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file or directory.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry4typeOS0_9EntryType":{"name":"type","abstract":"

    Type of entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry13ownerUserNameGSqSS_":{"name":"ownerUserName","abstract":"

    Owner’s user name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry14ownerGroupNameGSqSS_":{"name":"ownerGroupName","abstract":"

    Owner’s group name.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    The most recent access time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    The creation time of the original file or directory (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7charsetGSqSS_":{"name":"charset","abstract":"

    Name of the character set used to encode entry’s data (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry7commentGSqSS_":{"name":"comment","abstract":"

    Comment associated with the entry (PAX only).

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry6isLinkSb":{"name":"isLink","abstract":"

    True if entry is a symbolic link.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file for symbolic link entry.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:vC13SWCompression8TarEntry28unknownExtendedHeaderEntriesGVs10DictionarySSSS_":{"name":"unknownExtendedHeaderEntries","abstract":"

    Other entries from PAX extended headers.

    ","parent_name":"TarEntry"},"Classes/TarEntry.html#/s:FC13SWCompression8TarEntry4dataFT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"TarEntry"},"Classes/TarContainer.html#/s:ZFC13SWCompression12TarContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes TAR container and returns an array of ContainerEntry (which are actually TarEntry).

    ","parent_name":"TarContainer"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType4fifoFMS1_S1_":{"name":"fifo","abstract":"

    FIFO special file.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType16characterSpecialFMS1_S1_":{"name":"characterSpecial","abstract":"

    Character special file.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType9directoryFMS1_S1_":{"name":"directory","abstract":"

    Directory.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12blockSpecialFMS1_S1_":{"name":"blockSpecial","abstract":"

    Block special file.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType7regularFMS1_S1_":{"name":"regular","abstract":"

    Regular file.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType12symbolicLinkFMS1_S1_":{"name":"symbolicLink","abstract":"

    Symbolic link.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/UnixType.html#/s:FOV13SWCompression17SevenZipEntryInfo8UnixType6socketFMS1_S1_":{"name":"socket","abstract":"

    Socket.

    ","parent_name":"UnixType"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:vVV13SWCompression17SevenZipEntryInfo13DosAttributes8rawValueVs6UInt32":{"name":"rawValue","abstract":"

    Raw bit flags value.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:FVV13SWCompression17SevenZipEntryInfo13DosAttributescFT8rawValueVs6UInt32_S1_":{"name":"init(rawValue:)","abstract":"

    Initializes attributes with bit flags.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes7archiveS1_":{"name":"archive","abstract":"

    File is archive or archived.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes9directoryS1_":{"name":"directory","abstract":"

    File is a directory.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6volumeS1_":{"name":"volume","abstract":"

    File is a volume.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6systemS1_":{"name":"system","abstract":"

    File is a system file.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes6hiddenS1_":{"name":"hidden","abstract":"

    File is hidden.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/DosAttributes.html#/s:ZvVV13SWCompression17SevenZipEntryInfo13DosAttributes8readOnlyS1_":{"name":"readOnly","abstract":"

    File is read-only.

    ","parent_name":"DosAttributes"},"Structs/SevenZipEntryInfo/Permissions.html#/s:vVV13SWCompression17SevenZipEntryInfo11Permissions8rawValueVs6UInt32":{"name":"rawValue","abstract":"

    Raw bit flags value (in decimal).

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:FVV13SWCompression17SevenZipEntryInfo11PermissionscFT8rawValueVs6UInt32_S1_":{"name":"init(rawValue:)","abstract":"

    Initializes permissions with bit flags in decimal.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setuidS1_":{"name":"setuid","abstract":"

    Set UID.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6setgidS1_":{"name":"setgid","abstract":"

    Set GID.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions6stickyS1_":{"name":"sticky","abstract":"

    Sticky bit.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOwnerS1_":{"name":"readOwner","abstract":"

    Owner can read.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOwnerS1_":{"name":"writeOwner","abstract":"

    Owner can write.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOwnerS1_":{"name":"executeOwner","abstract":"

    Owner can execute.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readGroupS1_":{"name":"readGroup","abstract":"

    Group can read.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeGroupS1_":{"name":"writeGroup","abstract":"

    Group can write.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeGroupS1_":{"name":"executeGroup","abstract":"

    Group can execute.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions9readOtherS1_":{"name":"readOther","abstract":"

    Others can read.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions10writeOtherS1_":{"name":"writeOther","abstract":"

    Others can write.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html#/s:ZvVV13SWCompression17SevenZipEntryInfo11Permissions12executeOtherS1_":{"name":"executeOther","abstract":"

    Others can execute.

    ","parent_name":"Permissions"},"Structs/SevenZipEntryInfo/Permissions.html":{"name":"Permissions","abstract":"

    Represents file access permissions in UNIX format.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/DosAttributes.html":{"name":"DosAttributes","abstract":"

    Represents file attributes in DOS format.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo/UnixType.html":{"name":"UnixType","abstract":"

    Represents file type in UNIX format.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4nameGSqSS_":{"name":"name","abstract":"

    Entry’s name.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo4sizeGSqSi_":{"name":"size","abstract":"

    Entry’s data size.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo10accessTimeGSqV10Foundation4Date_":{"name":"accessTime","abstract":"

    Entry’s last access time and date.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo12creationTimeGSqV10Foundation4Date_":{"name":"creationTime","abstract":"

    Entry’s creation time and date.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    Entry’s last modification time and date.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13winAttributesGSqVs6UInt32_":{"name":"winAttributes","abstract":"

    7-Zip internal property which may contain UNIX permissions, type and/or DOS attributes.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo11permissionsGSqVS0_11Permissions_":{"name":"permissions","abstract":"

    Entry’s UNIX file access permissions.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo13dosAttributesGSqVS0_13DosAttributes_":{"name":"dosAttributes","abstract":"

    Entry’s DOS attributes.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo8unixTypeGSqOS0_8UnixType_":{"name":"unixType","abstract":"

    Entry’s UNIX file type.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo9hasStreamSb":{"name":"hasStream","abstract":"

    7-Zip internal propety. Indicates whether entry has a stream (data) inside container.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo7isEmptySb":{"name":"isEmpty","abstract":"

    True, if entry is an empty file. 7-Zip internal property.

    ","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo6isAntiSb":{"name":"isAnti","abstract":"

    True if entry is an anti-file.","parent_name":"SevenZipEntryInfo"},"Structs/SevenZipEntryInfo.html#/s:vV13SWCompression17SevenZipEntryInfo3crcGSqVs6UInt32_":{"name":"crc","abstract":"

    CRC32 of entry’s data.

    ","parent_name":"SevenZipEntryInfo"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4infoVS_17SevenZipEntryInfo":{"name":"info","abstract":"

    Various information about entry.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4nameSS":{"name":"name","abstract":"

    Entry’s name.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry4sizeSi":{"name":"size","abstract":"

    Entry’s data size.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry11isDirectorySb":{"name":"isDirectory","abstract":"

    True, if entry is a directory.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry6isLinkSb":{"name":"isLink","abstract":"

    True, if entry is a symbolic link.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry8linkPathGSqSS_":{"name":"linkPath","abstract":"

    Path to a linked file for symbolic link entry.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15entryAttributesGVs10DictionaryVSC16FileAttributeKeyP__":{"name":"entryAttributes","abstract":"

    Provides a dictionary with various attributes of the entry.","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:vC13SWCompression13SevenZipEntry15dataIsAvailableSb":{"name":"dataIsAvailable","abstract":"

    True, if data for entry is available.","parent_name":"SevenZipEntry"},"Classes/SevenZipEntry.html#/s:FC13SWCompression13SevenZipEntry4dataFzT_V10Foundation4Data":{"name":"data()","abstract":"

    Returns data associated with this entry.

    ","parent_name":"SevenZipEntry"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4openFzT9containerV10Foundation4Data_GSaPS_14ContainerEntry__":{"name":"open(container:)","abstract":"

    Processes 7-Zip container and returns an array of ContainerEntry (which are actually SevenZipEntry).

    ","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html#/s:ZFC13SWCompression17SevenZipContainer4infoFzT9containerV10Foundation4Data_GSaVS_17SevenZipEntryInfo_":{"name":"info(container:)","abstract":"

    Processes ZIP container and returns an array of SevenZipEntryInfo,","parent_name":"SevenZipContainer"},"Classes/SevenZipContainer.html":{"name":"SevenZipContainer","abstract":"

    Provides open functions for 7-Zip containers.

    "},"Classes/SevenZipEntry.html":{"name":"SevenZipEntry","abstract":"

    Represents an entry in 7-Zip container.

    "},"Structs/SevenZipEntryInfo.html":{"name":"SevenZipEntryInfo","abstract":"

    Provides information about 7-Zip entry.

    "},"Classes/TarContainer.html":{"name":"TarContainer","abstract":"

    Provides open function for TAR containers.

    "},"Classes/TarEntry.html":{"name":"TarEntry","abstract":"

    Represents either a file or directory entry in TAR container.

    "},"Classes/ZipContainer.html":{"name":"ZipContainer","abstract":"

    Provides open function for ZIP containers.

    "},"Classes/ZipEntry.html":{"name":"ZipEntry","abstract":"

    Represents either a file or directory entry in ZIP container.

    "},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16fastestAlgorithmFMS1_S1_":{"name":"fastestAlgorithm","abstract":"

    Fastest algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13fastAlgorithmFMS1_S1_":{"name":"fastAlgorithm","abstract":"

    Fast algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel16defaultAlgorithmFMS1_S1_":{"name":"defaultAlgorithm","abstract":"

    Default algorithm.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionLevel.html#/s:FOV13SWCompression10ZlibHeader16CompressionLevel13slowAlgorithmFMS1_S1_":{"name":"slowAlgorithm","abstract":"

    Slowest algorithm but with maximum compression.

    ","parent_name":"CompressionLevel"},"Structs/ZlibHeader/CompressionMethod.html#/s:FOV13SWCompression10ZlibHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/ZlibHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader/CompressionLevel.html":{"name":"CompressionLevel","abstract":"

    Levels of compression which can be used to create Zlib archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader16compressionLevelOS0_16CompressionLevel":{"name":"compressionLevel","abstract":"

    Level of compression used in archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:vV13SWCompression10ZlibHeader10windowSizeSi":{"name":"windowSize","abstract":"

    Size of ‘window’: moving interval of data which was used to make archive.

    ","parent_name":"ZlibHeader"},"Structs/ZlibHeader.html#/s:FV13SWCompression10ZlibHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from Zlib archive.

    ","parent_name":"ZlibHeader"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives Zlib archive.

    ","parent_name":"ZlibArchive"},"Classes/ZlibArchive.html#/s:ZFC13SWCompression11ZlibArchive7archiveFzT4dataV10Foundation4Data_S2_":{"name":"archive(data:)","abstract":"

    Archives data into Zlib archive.","parent_name":"ZlibArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives XZ archive.

    ","parent_name":"XZArchive"},"Classes/XZArchive.html#/s:ZFC13SWCompression9XZArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaS2__":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives XZ archive which contains one or more streams.

    ","parent_name":"XZArchive"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4unixFMS1_S1_":{"name":"unix","abstract":"

    One of many UNIX-like systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType9macintoshFMS1_S1_":{"name":"macintosh","abstract":"

    Older Macintosh systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType4ntfsFMS1_S1_":{"name":"ntfs","abstract":"

    File system used in Microsoft™®© Windows™®©.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType7unknownFMS1_S1_":{"name":"unknown","abstract":"

    File system was unknown to the archiver.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/FileSystemType.html#/s:FOV13SWCompression10GzipHeader14FileSystemType5otherFMS1_S1_":{"name":"other","abstract":"

    File system is one of the rare systems.

    ","parent_name":"FileSystemType"},"Structs/GzipHeader/CompressionMethod.html#/s:FOV13SWCompression10GzipHeader17CompressionMethod7deflateFMS1_S1_":{"name":"deflate","abstract":"

    The only one supported compression method (Deflate).

    ","parent_name":"CompressionMethod"},"Structs/GzipHeader/CompressionMethod.html":{"name":"CompressionMethod","abstract":"

    Supported compression methods in GZip archive.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader/FileSystemType.html":{"name":"FileSystemType","abstract":"

    Type of file system on which GZip archive was created.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader17compressionMethodOS0_17CompressionMethod":{"name":"compressionMethod","abstract":"

    Compression method of archive. Currently, always equals to .deflate.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader16modificationTimeGSqV10Foundation4Date_":{"name":"modificationTime","abstract":"

    The most recent modification time of the original file.","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader6osTypeOS0_14FileSystemType":{"name":"osType","abstract":"

    Type of file system on which archivation took place.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader8fileNameGSqSS_":{"name":"fileName","abstract":"

    Name of the original file. If archive doesn’t contain file’s name, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader7commentGSqSS_":{"name":"comment","abstract":"

    Comment stored in archive. If archive doesn’t contain any comment, then nil.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:vV13SWCompression10GzipHeader10isTextFileSb":{"name":"isTextFile","abstract":"

    Check if file is likely to be text file or ASCII-file.

    ","parent_name":"GzipHeader"},"Structs/GzipHeader.html#/s:FV13SWCompression10GzipHeadercFzT7archiveV10Foundation4Data_S0_":{"name":"init(archive:)","abstract":"

    Initializes the structure with the values from the first ‘member’ of GZip archive.

    ","parent_name":"GzipHeader"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member6headerVS_10GzipHeader":{"name":"header","abstract":"

    GZip header of a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html#/s:vVC13SWCompression11GzipArchive6Member4dataV10Foundation4Data":{"name":"data","abstract":"

    Unarchived data from a member.

    ","parent_name":"Member"},"Classes/GzipArchive/Member.html":{"name":"Member","abstract":"

    Represents a member of multi-member of GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive9unarchiveFzT7archiveV10Foundation4Data_S2_":{"name":"unarchive(archive:)","abstract":"

    Unarchives GZip archive.

    ","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive14multiUnarchiveFzT7archiveV10Foundation4Data_GSaVS0_6Member_":{"name":"multiUnarchive(archive:)","abstract":"

    Unarchives multi-member GZip archive.","parent_name":"GzipArchive"},"Classes/GzipArchive.html#/s:ZFC13SWCompression11GzipArchive7archiveFzT4dataV10Foundation4Data7commentGSqSS_8fileNameGSqSS_14writeHeaderCRCSb10isTextFileSb6osTypeGSqOVS_10GzipHeader14FileSystemType_16modificationTimeGSqVS1_4Date__S2_":{"name":"archive(data:comment:fileName:writeHeaderCRC:isTextFile:osType:modificationTime:)","abstract":"

    Archives data into GZip archive, using various specified options.","parent_name":"GzipArchive"},"Classes/GzipArchive.html":{"name":"GzipArchive","abstract":"

    Provides unarchive and archive functions for GZip archives.

    "},"Structs/GzipHeader.html":{"name":"GzipHeader","abstract":"

    Represents a GZip archive’s header.

    "},"Classes/XZArchive.html":{"name":"XZArchive","abstract":"

    Provides unarchive function for XZ archives.

    "},"Classes/ZlibArchive.html":{"name":"ZlibArchive","abstract":"

    Provides unarchive and archive functions for Zlib archives.

    "},"Structs/ZlibHeader.html":{"name":"ZlibHeader","abstract":"

    Represents a Zlib archive’s header.

    "},"Classes/LZMA2.html#/s:ZFC13SWCompression5LZMA210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA2 algortihm.

    ","parent_name":"LZMA2"},"Classes/LZMA.html#/s:ZFC13SWCompression4LZMA10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using LZMA algortihm.

    ","parent_name":"LZMA"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate10decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/Deflate.html#/s:ZFC13SWCompression7Deflate8compressFzT4dataV10Foundation4Data_S2_":{"name":"compress(data:)","abstract":"

    Compresses data with Deflate algortihm.

    ","parent_name":"Deflate"},"Classes/BZip2.html#/s:ZFC13SWCompression5BZip210decompressFzT4dataV10Foundation4Data_S2_":{"name":"decompress(data:)","abstract":"

    Decompresses data using BZip2 algortihm.

    ","parent_name":"BZip2"},"Classes/BZip2.html":{"name":"BZip2","abstract":"

    Provides decompression function for BZip2 algorithm.

    "},"Classes/Deflate.html":{"name":"Deflate","abstract":"

    Provides compression and decompression functions for Deflate algorithm.

    "},"Classes/LZMA.html":{"name":"LZMA","abstract":"

    Provides decompression function for LZMA algorithm.

    "},"Classes/LZMA2.html":{"name":"LZMA2","abstract":"

    Provides decompression function for LZMA2 algorithm.

    "},"Compression.html":{"name":"Compression"},"Archives.html":{"name":"Archives"},"Containers.html":{"name":"Containers"},"Errors.html":{"name":"Errors"},"Protocols.html":{"name":"Protocols"}} \ No newline at end of file diff --git a/docs/undocumented.json b/docs/undocumented.json index 80fe1075..f43c0df0 100644 --- a/docs/undocumented.json +++ b/docs/undocumented.json @@ -1,635 +1,6 @@ { "warnings": [ - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zContainer.swift", - "line": 8, - "symbol": "SevenZipContainer", - "symbol_kind": "source.lang.swift.decl.class", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zContainer.swift", - "line": 164, - "symbol": "SevenZipContainer.info(container:)", - "symbol_kind": "source.lang.swift.decl.function.method.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", - "line": 8, - "symbol": "SevenZipEntry", - "symbol_kind": "source.lang.swift.decl.class", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", - "line": 10, - "symbol": "SevenZipEntry.info", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", - "line": 24, - "symbol": "SevenZipEntry.isLink", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", - "line": 25, - "symbol": "SevenZipEntry.linkPath", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntry.swift", - "line": 29, - "symbol": "SevenZipEntry.dataIsAvailable", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 8, - "symbol": "SevenZipEntryInfo", - "symbol_kind": "source.lang.swift.decl.struct", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 10, - "symbol": "SevenZipEntryInfo.Permissions", - "symbol_kind": "source.lang.swift.decl.struct", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 18, - "symbol": "SevenZipEntryInfo.Permissions.setuid", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 19, - "symbol": "SevenZipEntryInfo.Permissions.setgid", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 20, - "symbol": "SevenZipEntryInfo.Permissions.sticky", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 22, - "symbol": "SevenZipEntryInfo.Permissions.readOwner", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 23, - "symbol": "SevenZipEntryInfo.Permissions.writeOwner", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 24, - "symbol": "SevenZipEntryInfo.Permissions.executeOwner", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 26, - "symbol": "SevenZipEntryInfo.Permissions.readGroup", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 27, - "symbol": "SevenZipEntryInfo.Permissions.writeGroup", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 28, - "symbol": "SevenZipEntryInfo.Permissions.executeGroup", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 30, - "symbol": "SevenZipEntryInfo.Permissions.readOther", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 31, - "symbol": "SevenZipEntryInfo.Permissions.writeOther", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 32, - "symbol": "SevenZipEntryInfo.Permissions.executeOther", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 36, - "symbol": "SevenZipEntryInfo.DosAttributes", - "symbol_kind": "source.lang.swift.decl.struct", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 44, - "symbol": "SevenZipEntryInfo.DosAttributes.archive", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 45, - "symbol": "SevenZipEntryInfo.DosAttributes.directory", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 46, - "symbol": "SevenZipEntryInfo.DosAttributes.volume", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 47, - "symbol": "SevenZipEntryInfo.DosAttributes.system", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 48, - "symbol": "SevenZipEntryInfo.DosAttributes.hidden", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 49, - "symbol": "SevenZipEntryInfo.DosAttributes.readOnly", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 53, - "symbol": "SevenZipEntryInfo.UnixType", - "symbol_kind": "source.lang.swift.decl.enum", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 54, - "symbol": "SevenZipEntryInfo.UnixType.fifo", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 55, - "symbol": "SevenZipEntryInfo.UnixType.characterSpecial", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 56, - "symbol": "SevenZipEntryInfo.UnixType.directory", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 57, - "symbol": "SevenZipEntryInfo.UnixType.blockSpecial", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 58, - "symbol": "SevenZipEntryInfo.UnixType.regular", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 59, - "symbol": "SevenZipEntryInfo.UnixType.symbolicLink", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 60, - "symbol": "SevenZipEntryInfo.UnixType.socket", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 63, - "symbol": "SevenZipEntryInfo.name", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 64, - "symbol": "SevenZipEntryInfo.size", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 65, - "symbol": "SevenZipEntryInfo.isDirectory", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 66, - "symbol": "SevenZipEntryInfo.accessTime", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 67, - "symbol": "SevenZipEntryInfo.creationTime", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 68, - "symbol": "SevenZipEntryInfo.modificationTime", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 69, - "symbol": "SevenZipEntryInfo.winAttributes", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 71, - "symbol": "SevenZipEntryInfo.permissions", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 72, - "symbol": "SevenZipEntryInfo.dosAttributes", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 73, - "symbol": "SevenZipEntryInfo.unixType", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 75, - "symbol": "SevenZipEntryInfo.hasStream", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 76, - "symbol": "SevenZipEntryInfo.isEmpty", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 77, - "symbol": "SevenZipEntryInfo.isAnti", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zEntryInfo.swift", - "line": 79, - "symbol": "SevenZipEntryInfo.crc", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 8, - "symbol": "SevenZipError", - "symbol_kind": "source.lang.swift.decl.enum", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 9, - "symbol": "SevenZipError.wrongSignature", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 10, - "symbol": "SevenZipError.wrongVersion", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 11, - "symbol": "SevenZipError.wrongStartHeaderCRC", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 12, - "symbol": "SevenZipError.wrongHeaderSize", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 13, - "symbol": "SevenZipError.wrongPropertyID", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 14, - "symbol": "SevenZipError.wrongHeaderCRC", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 15, - "symbol": "SevenZipError.wrongExternal", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 16, - "symbol": "SevenZipError.reservedCodecFlags", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 17, - "symbol": "SevenZipError.unknownNumFolders", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 18, - "symbol": "SevenZipError.wrongEnd", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 19, - "symbol": "SevenZipError.externalNotSupported", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 20, - "symbol": "SevenZipError.altMethodsNotSupported", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 21, - "symbol": "SevenZipError.wrongStreamsNumber", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 22, - "symbol": "SevenZipError.multiStreamNotSupported", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 23, - "symbol": "SevenZipError.compressionNotSupported", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 24, - "symbol": "SevenZipError.wrongDataSize", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 25, - "symbol": "SevenZipError.wrongCRC", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 26, - "symbol": "SevenZipError.wrongCoderProperties", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 27, - "symbol": "SevenZipError.noPackInfo", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 28, - "symbol": "SevenZipError.wrongFileProperty", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 29, - "symbol": "SevenZipError.wrongFileNameLength", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 30, - "symbol": "SevenZipError.wrongFileNames", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 31, - "symbol": "SevenZipError.startPosNotSupported", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 32, - "symbol": "SevenZipError.incompleteProperty", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 33, - "symbol": "SevenZipError.additionalStreamsNotSupported", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 34, - "symbol": "SevenZipError.noFileSize", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 35, - "symbol": "SevenZipError.notEnoughFolders", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 36, - "symbol": "SevenZipError.notEnoughStreams", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 37, - "symbol": "SevenZipError.noStreamFound", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 38, - "symbol": "SevenZipError.noPackInfoFound", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 39, - "symbol": "SevenZipError.streamOverread", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 40, - "symbol": "SevenZipError.dataIsUnavailable", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/7zError.swift", - "line": 41, - "symbol": "SevenZipError.encryptionNotSupported", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/Protocols.swift", - "line": 44, - "symbol": "ContainerEntry.isLink", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/Protocols.swift", - "line": 45, - "symbol": "ContainerEntry.linkPath", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/TarEntry.swift", - "line": 133, - "symbol": "TarEntry.isLink", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/ZipEntry.swift", - "line": 53, - "symbol": "ZipEntry.isLink", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/ZipEntry.swift", - "line": 55, - "symbol": "ZipEntry.linkPath", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/timofeysolomko/Developer/Compression/SWCompression/Sources/ZipEntry.swift", - "line": 61, - "symbol": "ZipEntry.isTextFile", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - } + ], "source_directory": "/Users/timofeysolomko/Developer/Compression/SWCompression" } \ No newline at end of file From 7aae6255f939060d5f5dd8054e7001b6e3109b09 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 20 Aug 2017 10:41:50 +0300 Subject: [PATCH 111/113] Update Readme --- README.md | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d5f74dd5..b07de081 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ Features - Containers: - ZIP - TAR + - 7-Zip - Decompression algorithms: - LZMA/LZMA2 - Deflate @@ -66,6 +67,7 @@ Available subspecs: - SWCompression/BZip2 - SWCompression/ZIP - SWCompression/TAR + - SWCompression/SevenZip You can add some or all of them instead of `pod 'SWCompression'` @@ -96,17 +98,33 @@ let package = Package( More info about SPM you can find at [Swift Package Manager's Documentation](https://github.com/apple/swift-package-manager/tree/master/Documentation). -SWCompression/ZIP and compression methods ------------------------------------------ -Deflate is a default compression method of ZIP containers. +Options for CocoaPods users +--------------------------- +Both ZIP and 7-Zip containers have compression method +which is most likely to be used when compressing files into them. +This is Deflate for ZIP and LZMA/LZMA2 for 7-Zip. +Thus, 'SWCompression/ZIP' subspec have 'SWCompression/Deflate' subspec as a dependency +and 'SWCompression/LZMA' subspec is a dependency for 'SWCompression/SevenZip'. -This means, that if you use CocoaPods, when installing SWCompression/ZIP it will install SWCompression/Deflate as a dependency. +But both these containers support other compression methods, +some of them are implemented in SWCompression. +For CocoaPods configurations some sort of 'optional dependecies' are provided for such compression methods. -However, ZIP containers can also support LZMA and BZip2. -So if you want to enable them in your Pods configuration you need to include SWCompression/LZMA and/or SWCompression/Deflate. +'Optional dependency' in this context means +that SWCompression/ZIP or SWCompression/7-Zip will support particular compression methods +only if a corresponding subspec is expicitly specified in your Podfile and installed. -If you use Carthage or Swift Package Manager you always have the full package, -and ZIP will be built with both BZip2 and LZMA support. +__List of 'optional dependecies'.__ +For SWCompression/ZIP: + - SWCompression/BZip2 + - SWCompression/LZMA +For SWCompression/SevenZip: + - SWCompression/BZip2 + - SWCompression/Deflate + +__Note:__ If you use Carthage or Swift Package Manager you always have the full package, +and ZIP will be built with both additional BZip2 and LZMA support +as well as 7-Zip will be build with both additional Deflate and BZip2 support. Usage ----- @@ -138,7 +156,7 @@ This documentation can be found at its own [website](http://tsolomko.github.io/S #### Handling Errors If you look at list of available error types and their cases, you may be frightened by their number. -However, most of these cases (such as `XZError.WrongMagic`) exist for diagnostic purposes. +However, most of these cases (such as `XZError.wrongMagic`) exist for diagnostic purposes. Thus, you only need to handle the most common type of error for your archive/algorithm. For example: @@ -193,9 +211,9 @@ It is intended to fix this problem, but solution requires backwards-incompatible Future plans ------------- -- Better Deflate compression. -- 7zip containers. - BZip2 compression. +- Container API rework. +- Better Deflate compression. - Something else... References From 2446350bf0ce4c7e8d71710d30b2cada27cba091 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 20 Aug 2017 10:44:31 +0300 Subject: [PATCH 112/113] Small fixes to README --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b07de081..3ccf249b 100644 --- a/README.md +++ b/README.md @@ -103,8 +103,8 @@ Options for CocoaPods users Both ZIP and 7-Zip containers have compression method which is most likely to be used when compressing files into them. This is Deflate for ZIP and LZMA/LZMA2 for 7-Zip. -Thus, 'SWCompression/ZIP' subspec have 'SWCompression/Deflate' subspec as a dependency -and 'SWCompression/LZMA' subspec is a dependency for 'SWCompression/SevenZip'. +Thus, SWCompression/ZIP subspec have SWCompression/Deflate subspec as a dependency +and SWCompression/LZMA subspec as a dependency for SWCompression/SevenZip. But both these containers support other compression methods, some of them are implemented in SWCompression. @@ -115,9 +115,11 @@ that SWCompression/ZIP or SWCompression/7-Zip will support particular compressio only if a corresponding subspec is expicitly specified in your Podfile and installed. __List of 'optional dependecies'.__ + For SWCompression/ZIP: - SWCompression/BZip2 - SWCompression/LZMA + For SWCompression/SevenZip: - SWCompression/BZip2 - SWCompression/Deflate From c32cd538d6624078bd13913ac05e53b5e2d80eca Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 20 Aug 2017 10:49:42 +0300 Subject: [PATCH 113/113] Prepare for 3.3.0 --- .jazzy.yaml | 4 +- CHANGELOG.md | 17 +++---- SWCompression.podspec | 2 +- Sources/Service/Info.plist | 2 +- docs/Archives.html | 10 ++-- docs/Classes/BZip2.html | 2 +- docs/Classes/Deflate.html | 4 +- docs/Classes/GzipArchive.html | 8 +-- docs/Classes/GzipArchive/Member.html | 4 +- docs/Classes/LZMA.html | 2 +- docs/Classes/LZMA2.html | 2 +- docs/Classes/SevenZipContainer.html | 4 +- docs/Classes/SevenZipEntry.html | 18 +++---- docs/Classes/TarContainer.html | 2 +- docs/Classes/TarEntry.html | 40 +++++++-------- docs/Classes/TarEntry/EntryType.html | 22 ++++----- docs/Classes/XZArchive.html | 4 +- docs/Classes/ZipContainer.html | 2 +- docs/Classes/ZipEntry.html | 20 ++++---- docs/Classes/ZlibArchive.html | 4 +- docs/Compression.html | 8 +-- docs/Containers.html | 14 +++--- docs/Enums/BZip2Error.html | 20 ++++---- docs/Enums/DeflateError.html | 8 +-- docs/Enums/GzipError.html | 14 +++--- docs/Enums/LZMA2Error.html | 10 ++-- docs/Enums/LZMAError.html | 16 +++--- docs/Enums/SevenZipError.html | 24 ++++----- docs/Enums/TarError.html | 12 ++--- docs/Enums/XZError.html | 20 ++++---- docs/Enums/ZipError.html | 22 ++++----- docs/Enums/ZlibError.html | 10 ++-- docs/Errors.html | 20 ++++---- docs/Protocols.html | 8 +-- docs/Protocols/Archive.html | 2 +- docs/Protocols/Container.html | 2 +- docs/Protocols/ContainerEntry.html | 14 +++--- docs/Protocols/DecompressionAlgorithm.html | 2 +- docs/Structs/GzipHeader.html | 18 +++---- .../Structs/GzipHeader/CompressionMethod.html | 2 +- docs/Structs/GzipHeader/FileSystemType.html | 10 ++-- docs/Structs/SevenZipEntryInfo.html | 34 ++++++------- .../SevenZipEntryInfo/DosAttributes.html | 16 +++--- .../SevenZipEntryInfo/Permissions.html | 28 +++++------ docs/Structs/SevenZipEntryInfo/UnixType.html | 14 +++--- docs/Structs/ZlibHeader.html | 12 ++--- docs/Structs/ZlibHeader/CompressionLevel.html | 8 +-- .../Structs/ZlibHeader/CompressionMethod.html | 2 +- .../Resources/Documents/Archives.html | 10 ++-- .../Resources/Documents/Classes/BZip2.html | 2 +- .../Resources/Documents/Classes/Deflate.html | 4 +- .../Documents/Classes/GzipArchive.html | 8 +-- .../Documents/Classes/GzipArchive/Member.html | 4 +- .../Resources/Documents/Classes/LZMA.html | 2 +- .../Resources/Documents/Classes/LZMA2.html | 2 +- .../Documents/Classes/SevenZipContainer.html | 4 +- .../Documents/Classes/SevenZipEntry.html | 18 +++---- .../Documents/Classes/TarContainer.html | 2 +- .../Resources/Documents/Classes/TarEntry.html | 40 +++++++-------- .../Documents/Classes/TarEntry/EntryType.html | 22 ++++----- .../Documents/Classes/XZArchive.html | 4 +- .../Documents/Classes/ZipContainer.html | 2 +- .../Resources/Documents/Classes/ZipEntry.html | 20 ++++---- .../Documents/Classes/ZlibArchive.html | 4 +- .../Resources/Documents/Compression.html | 8 +-- .../Resources/Documents/Containers.html | 14 +++--- .../Resources/Documents/Enums/BZip2Error.html | 20 ++++---- .../Documents/Enums/DeflateError.html | 8 +-- .../Resources/Documents/Enums/GzipError.html | 14 +++--- .../Resources/Documents/Enums/LZMA2Error.html | 10 ++-- .../Resources/Documents/Enums/LZMAError.html | 16 +++--- .../Documents/Enums/SevenZipError.html | 24 ++++----- .../Resources/Documents/Enums/TarError.html | 12 ++--- .../Resources/Documents/Enums/XZError.html | 20 ++++---- .../Resources/Documents/Enums/ZipError.html | 22 ++++----- .../Resources/Documents/Enums/ZlibError.html | 10 ++-- .../Contents/Resources/Documents/Errors.html | 20 ++++---- .../Resources/Documents/Protocols.html | 8 +-- .../Documents/Protocols/Archive.html | 2 +- .../Documents/Protocols/Container.html | 2 +- .../Documents/Protocols/ContainerEntry.html | 14 +++--- .../Protocols/DecompressionAlgorithm.html | 2 +- .../Documents/Structs/GzipHeader.html | 18 +++---- .../Structs/GzipHeader/CompressionMethod.html | 2 +- .../Structs/GzipHeader/FileSystemType.html | 10 ++-- .../Documents/Structs/SevenZipEntryInfo.html | 34 ++++++------- .../SevenZipEntryInfo/DosAttributes.html | 16 +++--- .../SevenZipEntryInfo/Permissions.html | 28 +++++------ .../Structs/SevenZipEntryInfo/UnixType.html | 14 +++--- .../Documents/Structs/ZlibHeader.html | 12 ++--- .../Structs/ZlibHeader/CompressionLevel.html | 8 +-- .../Structs/ZlibHeader/CompressionMethod.html | 2 +- .../Contents/Resources/Documents/index.html | 46 ++++++++++++++---- docs/docsets/SWCompression.tgz | Bin 125031 -> 125300 bytes docs/index.html | 46 ++++++++++++++---- 95 files changed, 600 insertions(+), 553 deletions(-) diff --git a/.jazzy.yaml b/.jazzy.yaml index b87c04ba..8ca00b51 100644 --- a/.jazzy.yaml +++ b/.jazzy.yaml @@ -3,11 +3,11 @@ clean: true exclude: Tests/ author: Timofey Solomko module: SWCompression -module_version: 3.3.0-test.2 +module_version: 3.3.0 copyright: '© 2017 Timofey Solomko' readme: README.md github_url: https://github.com/tsolomko/SWCompression -github_file_prefix: https://github.com/tsolomko/SWCompression/tree/v3.3.0-test.2 +github_file_prefix: https://github.com/tsolomko/SWCompression/tree/v3.3.0 theme: fullwidth custom_categories: diff --git a/CHANGELOG.md b/CHANGELOG.md index 6968cac3..70327da2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,16 @@ # Changelog -v3.3.0-test.2 +v3.3.0 ---------------- -- Fixed multithreading problems for `ZipEntry.data()`. -- Fixed absent type in `SevenZipEntry.entryAttributes` in some cases. -- Fixed `posixPermissions` in `TarEntry.entryAttributes` containing UNIX type byte in some cases. +- Introduced support for 7-Zip containers. - Added `TarEntry.isLink`. -- Added `ZipEntry.isLink`. -- Added `ZipEntry.linkPath`. +- Added `ZipEntry.isLink` and `ZipEntry.linkPath`. - Added `ZipEntry.isTextFile`. +- Added `ContainerEntry.isLink` and `ContainerEntry.linkPath`. - Added support for NTFS extra fields in ZIP containers. - Detection of UTF-8 in ZIP string fields now favors Code Page 437 more. - Renamed build flags included in Cocoapods configurations. -- Removed deprecation warnings for properties of `TarEntry`. - -v3.3.0-test.1 ----------------- -- Introduced support for 7-Zip containers. +- Fixed multithreading problems for `ZipEntry.data()`. +- Fixed `posixPermissions` in `TarEntry.entryAttributes` containing UNIX type byte in some cases. v3.2.0 ---------------- diff --git a/SWCompression.podspec b/SWCompression.podspec index eb51fed1..e2e4dc60 100644 --- a/SWCompression.podspec +++ b/SWCompression.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "SWCompression" - s.version = "3.3.0-test.2" + s.version = "3.3.0" s.summary = "Framework with implementations in Swift of different (de)compression algorithms" s.description = <<-DESC diff --git a/Sources/Service/Info.plist b/Sources/Service/Info.plist index ea5d2247..e4f1aef4 100644 --- a/Sources/Service/Info.plist +++ b/Sources/Service/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.3.0-test.2 + 3.3.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSHumanReadableCopyright diff --git a/docs/Archives.html b/docs/Archives.html index 52ddb64e..685f10ed 100644 --- a/docs/Archives.html +++ b/docs/Archives.html @@ -232,7 +232,7 @@

    Declaration

    @@ -267,7 +267,7 @@

    Declaration

    @@ -302,7 +302,7 @@

    Declaration

    @@ -337,7 +337,7 @@

    Declaration

    @@ -372,7 +372,7 @@

    Declaration

    diff --git a/docs/Classes/BZip2.html b/docs/Classes/BZip2.html index a3513421..dbef3505 100644 --- a/docs/Classes/BZip2.html +++ b/docs/Classes/BZip2.html @@ -270,7 +270,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/Classes/Deflate.html b/docs/Classes/Deflate.html index bbfee98c..d4fe834d 100644 --- a/docs/Classes/Deflate.html +++ b/docs/Classes/Deflate.html @@ -275,7 +275,7 @@

    Return Value

    Decompressed data.

    @@ -339,7 +339,7 @@

    Parameters

    diff --git a/docs/Classes/GzipArchive.html b/docs/Classes/GzipArchive.html index 6759da9b..47191b33 100644 --- a/docs/Classes/GzipArchive.html +++ b/docs/Classes/GzipArchive.html @@ -240,7 +240,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Return Value

    Unarchived data.

    @@ -378,7 +378,7 @@

    Return Value

    Unarchived data.

    @@ -521,7 +521,7 @@

    Return Value

    Resulting archive’s data.

    diff --git a/docs/Classes/GzipArchive/Member.html b/docs/Classes/GzipArchive/Member.html index 03dfd65c..ef2b5d5e 100644 --- a/docs/Classes/GzipArchive/Member.html +++ b/docs/Classes/GzipArchive/Member.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    diff --git a/docs/Classes/LZMA.html b/docs/Classes/LZMA.html index 1b7f7cff..b794bcc1 100644 --- a/docs/Classes/LZMA.html +++ b/docs/Classes/LZMA.html @@ -270,7 +270,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/Classes/LZMA2.html b/docs/Classes/LZMA2.html index 46a42ead..a50e572a 100644 --- a/docs/Classes/LZMA2.html +++ b/docs/Classes/LZMA2.html @@ -270,7 +270,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/Classes/SevenZipContainer.html b/docs/Classes/SevenZipContainer.html index daaa759e..3022009c 100644 --- a/docs/Classes/SevenZipContainer.html +++ b/docs/Classes/SevenZipContainer.html @@ -277,7 +277,7 @@

    Return Value

    Array of SevenZipEntry as an array of ContainerEntry.

    @@ -347,7 +347,7 @@

    Return Value

    Array of SevenZipEntryInfo.

    diff --git a/docs/Classes/SevenZipEntry.html b/docs/Classes/SevenZipEntry.html index d45f382a..449d1858 100644 --- a/docs/Classes/SevenZipEntry.html +++ b/docs/Classes/SevenZipEntry.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -359,7 +359,7 @@

    Declaration

    @@ -389,7 +389,7 @@

    Declaration

    @@ -432,7 +432,7 @@

    Declaration

    @@ -463,7 +463,7 @@

    Declaration

    @@ -498,7 +498,7 @@

    Declaration

    diff --git a/docs/Classes/TarContainer.html b/docs/Classes/TarContainer.html index 2e5c0540..d0966449 100644 --- a/docs/Classes/TarContainer.html +++ b/docs/Classes/TarContainer.html @@ -275,7 +275,7 @@

    Return Value

    Array of TarEntry as an array of ContainerEntry.

    diff --git a/docs/Classes/TarEntry.html b/docs/Classes/TarEntry.html index 75c5e025..b12e3e4e 100644 --- a/docs/Classes/TarEntry.html +++ b/docs/Classes/TarEntry.html @@ -240,7 +240,7 @@

    Declaration

    @@ -270,7 +270,7 @@

    Declaration

    @@ -300,7 +300,7 @@

    Declaration

    @@ -330,7 +330,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -406,7 +406,7 @@

    Declaration

    @@ -436,7 +436,7 @@

    Declaration

    @@ -466,7 +466,7 @@

    Declaration

    @@ -496,7 +496,7 @@

    Declaration

    @@ -526,7 +526,7 @@

    Declaration

    @@ -556,7 +556,7 @@

    Declaration

    @@ -586,7 +586,7 @@

    Declaration

    @@ -616,7 +616,7 @@

    Declaration

    @@ -646,7 +646,7 @@

    Declaration

    @@ -676,7 +676,7 @@

    Declaration

    @@ -706,7 +706,7 @@

    Declaration

    @@ -736,7 +736,7 @@

    Declaration

    @@ -766,7 +766,7 @@

    Declaration

    @@ -796,7 +796,7 @@

    Declaration

    @@ -826,7 +826,7 @@

    Declaration

    diff --git a/docs/Classes/TarEntry/EntryType.html b/docs/Classes/TarEntry/EntryType.html index 57bb58b4..c5498243 100644 --- a/docs/Classes/TarEntry/EntryType.html +++ b/docs/Classes/TarEntry/EntryType.html @@ -239,7 +239,7 @@

    Declaration

    @@ -273,7 +273,7 @@

    Declaration

    @@ -307,7 +307,7 @@

    Declaration

    @@ -341,7 +341,7 @@

    Declaration

    @@ -375,7 +375,7 @@

    Declaration

    @@ -409,7 +409,7 @@

    Declaration

    @@ -443,7 +443,7 @@

    Declaration

    @@ -477,7 +477,7 @@

    Declaration

    @@ -511,7 +511,7 @@

    Declaration

    @@ -545,7 +545,7 @@

    Declaration

    @@ -579,7 +579,7 @@

    Declaration

    diff --git a/docs/Classes/XZArchive.html b/docs/Classes/XZArchive.html index 1f374f0f..16c37349 100644 --- a/docs/Classes/XZArchive.html +++ b/docs/Classes/XZArchive.html @@ -275,7 +275,7 @@

    Return Value

    Unarchived data.

    @@ -343,7 +343,7 @@

    Return Value

    Unarchived data.

    diff --git a/docs/Classes/ZipContainer.html b/docs/Classes/ZipContainer.html index 146bea03..4bfc4dea 100644 --- a/docs/Classes/ZipContainer.html +++ b/docs/Classes/ZipContainer.html @@ -277,7 +277,7 @@

    Return Value

    Array of ZipEntry as an array of ContainerEntry.

    diff --git a/docs/Classes/ZipEntry.html b/docs/Classes/ZipEntry.html index 2e7d1add..2a495015 100644 --- a/docs/Classes/ZipEntry.html +++ b/docs/Classes/ZipEntry.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -361,7 +361,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -421,7 +421,7 @@

    Declaration

    @@ -451,7 +451,7 @@

    Declaration

    @@ -491,7 +491,7 @@

    Declaration

    @@ -527,7 +527,7 @@

    Declaration

    diff --git a/docs/Classes/ZlibArchive.html b/docs/Classes/ZlibArchive.html index 0bc0ea28..a63dd3e3 100644 --- a/docs/Classes/ZlibArchive.html +++ b/docs/Classes/ZlibArchive.html @@ -278,7 +278,7 @@

    Return Value

    Unarchived data.

    @@ -345,7 +345,7 @@

    Return Value

    Resulting archive’s data.

    diff --git a/docs/Compression.html b/docs/Compression.html index 6518d83d..93ac1f35 100644 --- a/docs/Compression.html +++ b/docs/Compression.html @@ -232,7 +232,7 @@

    Declaration

    @@ -267,7 +267,7 @@

    Declaration

    @@ -302,7 +302,7 @@

    Declaration

    @@ -337,7 +337,7 @@

    Declaration

    diff --git a/docs/Containers.html b/docs/Containers.html index d587226c..b53812a7 100644 --- a/docs/Containers.html +++ b/docs/Containers.html @@ -232,7 +232,7 @@

    Declaration

    @@ -267,7 +267,7 @@

    Declaration

    @@ -302,7 +302,7 @@

    Declaration

    @@ -337,7 +337,7 @@

    Declaration

    @@ -372,7 +372,7 @@

    Declaration

    @@ -407,7 +407,7 @@

    Declaration

    @@ -442,7 +442,7 @@

    Declaration

    diff --git a/docs/Enums/BZip2Error.html b/docs/Enums/BZip2Error.html index 1fb139f6..bafc7343 100644 --- a/docs/Enums/BZip2Error.html +++ b/docs/Enums/BZip2Error.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -410,7 +410,7 @@

    Declaration

    @@ -444,7 +444,7 @@

    Declaration

    @@ -478,7 +478,7 @@

    Declaration

    @@ -512,7 +512,7 @@

    Declaration

    @@ -547,7 +547,7 @@

    Declaration

    diff --git a/docs/Enums/DeflateError.html b/docs/Enums/DeflateError.html index 1d2cb560..81b45388 100644 --- a/docs/Enums/DeflateError.html +++ b/docs/Enums/DeflateError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    diff --git a/docs/Enums/GzipError.html b/docs/Enums/GzipError.html index 54a2c27c..130dd82b 100644 --- a/docs/Enums/GzipError.html +++ b/docs/Enums/GzipError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Declaration

    @@ -343,7 +343,7 @@

    Declaration

    @@ -378,7 +378,7 @@

    Declaration

    @@ -412,7 +412,7 @@

    Declaration

    @@ -446,7 +446,7 @@

    Declaration

    diff --git a/docs/Enums/LZMA2Error.html b/docs/Enums/LZMA2Error.html index cb00d052..d07c68ab 100644 --- a/docs/Enums/LZMA2Error.html +++ b/docs/Enums/LZMA2Error.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -377,7 +377,7 @@

    Declaration

    diff --git a/docs/Enums/LZMAError.html b/docs/Enums/LZMAError.html index f03dfe94..dce9345a 100644 --- a/docs/Enums/LZMAError.html +++ b/docs/Enums/LZMAError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -410,7 +410,7 @@

    Declaration

    @@ -444,7 +444,7 @@

    Declaration

    @@ -478,7 +478,7 @@

    Declaration

    diff --git a/docs/Enums/SevenZipError.html b/docs/Enums/SevenZipError.html index a2b0cd4d..685e92a7 100644 --- a/docs/Enums/SevenZipError.html +++ b/docs/Enums/SevenZipError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Declaration

    @@ -344,7 +344,7 @@

    Declaration

    @@ -378,7 +378,7 @@

    Declaration

    @@ -412,7 +412,7 @@

    Declaration

    @@ -446,7 +446,7 @@

    Declaration

    @@ -480,7 +480,7 @@

    Declaration

    @@ -514,7 +514,7 @@

    Declaration

    @@ -548,7 +548,7 @@

    Declaration

    @@ -582,7 +582,7 @@

    Declaration

    @@ -617,7 +617,7 @@

    Declaration

    diff --git a/docs/Enums/TarError.html b/docs/Enums/TarError.html index 0168fad0..d1731f31 100644 --- a/docs/Enums/TarError.html +++ b/docs/Enums/TarError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -410,7 +410,7 @@

    Declaration

    diff --git a/docs/Enums/XZError.html b/docs/Enums/XZError.html index 385a4697..5b8fdd1a 100644 --- a/docs/Enums/XZError.html +++ b/docs/Enums/XZError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Declaration

    @@ -343,7 +343,7 @@

    Declaration

    @@ -377,7 +377,7 @@

    Declaration

    @@ -411,7 +411,7 @@

    Declaration

    @@ -446,7 +446,7 @@

    Declaration

    @@ -481,7 +481,7 @@

    Declaration

    @@ -515,7 +515,7 @@

    Declaration

    @@ -549,7 +549,7 @@

    Declaration

    diff --git a/docs/Enums/ZipError.html b/docs/Enums/ZipError.html index 5dcf2be2..0363f329 100644 --- a/docs/Enums/ZipError.html +++ b/docs/Enums/ZipError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -410,7 +410,7 @@

    Declaration

    @@ -444,7 +444,7 @@

    Declaration

    @@ -478,7 +478,7 @@

    Declaration

    @@ -512,7 +512,7 @@

    Declaration

    @@ -547,7 +547,7 @@

    Declaration

    @@ -581,7 +581,7 @@

    Declaration

    diff --git a/docs/Enums/ZlibError.html b/docs/Enums/ZlibError.html index cad78f4a..5af46e36 100644 --- a/docs/Enums/ZlibError.html +++ b/docs/Enums/ZlibError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -377,7 +377,7 @@

    Declaration

    diff --git a/docs/Errors.html b/docs/Errors.html index 1f825d88..f1408cfa 100644 --- a/docs/Errors.html +++ b/docs/Errors.html @@ -233,7 +233,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -305,7 +305,7 @@

    Declaration

    @@ -341,7 +341,7 @@

    Declaration

    @@ -377,7 +377,7 @@

    Declaration

    @@ -420,7 +420,7 @@

    Declaration

    @@ -456,7 +456,7 @@

    Declaration

    @@ -492,7 +492,7 @@

    Declaration

    @@ -528,7 +528,7 @@

    Declaration

    @@ -564,7 +564,7 @@

    Declaration

    diff --git a/docs/Protocols.html b/docs/Protocols.html index 7e93bcf3..6a226ed3 100644 --- a/docs/Protocols.html +++ b/docs/Protocols.html @@ -232,7 +232,7 @@

    Declaration

    @@ -263,7 +263,7 @@

    Declaration

    @@ -294,7 +294,7 @@

    Declaration

    @@ -325,7 +325,7 @@

    Declaration

    diff --git a/docs/Protocols/Archive.html b/docs/Protocols/Archive.html index 052813be..c234031c 100644 --- a/docs/Protocols/Archive.html +++ b/docs/Protocols/Archive.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/Protocols/Container.html b/docs/Protocols/Container.html index 4485d2e0..67cb930c 100644 --- a/docs/Protocols/Container.html +++ b/docs/Protocols/Container.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/Protocols/ContainerEntry.html b/docs/Protocols/ContainerEntry.html index d9905d69..757ab349 100644 --- a/docs/Protocols/ContainerEntry.html +++ b/docs/Protocols/ContainerEntry.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -359,7 +359,7 @@

    Declaration

    @@ -395,7 +395,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    diff --git a/docs/Protocols/DecompressionAlgorithm.html b/docs/Protocols/DecompressionAlgorithm.html index 7a9052b1..6a9d331c 100644 --- a/docs/Protocols/DecompressionAlgorithm.html +++ b/docs/Protocols/DecompressionAlgorithm.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/Structs/GzipHeader.html b/docs/Structs/GzipHeader.html index c69edc7c..9dafc6eb 100644 --- a/docs/Structs/GzipHeader.html +++ b/docs/Structs/GzipHeader.html @@ -240,7 +240,7 @@

    Declaration

    @@ -271,7 +271,7 @@

    Declaration

    @@ -301,7 +301,7 @@

    Declaration

    @@ -333,7 +333,7 @@

    Declaration

    @@ -363,7 +363,7 @@

    Declaration

    @@ -393,7 +393,7 @@

    Declaration

    @@ -423,7 +423,7 @@

    Declaration

    @@ -453,7 +453,7 @@

    Declaration

    @@ -510,7 +510,7 @@

    Parameters

    diff --git a/docs/Structs/GzipHeader/CompressionMethod.html b/docs/Structs/GzipHeader/CompressionMethod.html index 0fef6679..227717ee 100644 --- a/docs/Structs/GzipHeader/CompressionMethod.html +++ b/docs/Structs/GzipHeader/CompressionMethod.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/Structs/GzipHeader/FileSystemType.html b/docs/Structs/GzipHeader/FileSystemType.html index d46f2b99..33e686af 100644 --- a/docs/Structs/GzipHeader/FileSystemType.html +++ b/docs/Structs/GzipHeader/FileSystemType.html @@ -244,7 +244,7 @@

    Declaration

    @@ -278,7 +278,7 @@

    Declaration

    @@ -312,7 +312,7 @@

    Declaration

    @@ -346,7 +346,7 @@

    Declaration

    @@ -380,7 +380,7 @@

    Declaration

    diff --git a/docs/Structs/SevenZipEntryInfo.html b/docs/Structs/SevenZipEntryInfo.html index 103f2105..236e5f9c 100644 --- a/docs/Structs/SevenZipEntryInfo.html +++ b/docs/Structs/SevenZipEntryInfo.html @@ -240,7 +240,7 @@

    Declaration

    @@ -271,7 +271,7 @@

    Declaration

    @@ -302,7 +302,7 @@

    Declaration

    @@ -332,7 +332,7 @@

    Declaration

    @@ -362,7 +362,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    @@ -422,7 +422,7 @@

    Declaration

    @@ -452,7 +452,7 @@

    Declaration

    @@ -482,7 +482,7 @@

    Declaration

    @@ -512,7 +512,7 @@

    Declaration

    @@ -542,7 +542,7 @@

    Declaration

    @@ -572,7 +572,7 @@

    Declaration

    @@ -602,7 +602,7 @@

    Declaration

    @@ -632,7 +632,7 @@

    Declaration

    @@ -662,7 +662,7 @@

    Declaration

    @@ -694,7 +694,7 @@

    Declaration

    @@ -724,7 +724,7 @@

    Declaration

    diff --git a/docs/Structs/SevenZipEntryInfo/DosAttributes.html b/docs/Structs/SevenZipEntryInfo/DosAttributes.html index cce4043c..a9d50f4f 100644 --- a/docs/Structs/SevenZipEntryInfo/DosAttributes.html +++ b/docs/Structs/SevenZipEntryInfo/DosAttributes.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -359,7 +359,7 @@

    Declaration

    @@ -389,7 +389,7 @@

    Declaration

    @@ -419,7 +419,7 @@

    Declaration

    @@ -449,7 +449,7 @@

    Declaration

    diff --git a/docs/Structs/SevenZipEntryInfo/Permissions.html b/docs/Structs/SevenZipEntryInfo/Permissions.html index 30c3fa10..1e309e9b 100644 --- a/docs/Structs/SevenZipEntryInfo/Permissions.html +++ b/docs/Structs/SevenZipEntryInfo/Permissions.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -359,7 +359,7 @@

    Declaration

    @@ -389,7 +389,7 @@

    Declaration

    @@ -419,7 +419,7 @@

    Declaration

    @@ -449,7 +449,7 @@

    Declaration

    @@ -479,7 +479,7 @@

    Declaration

    @@ -509,7 +509,7 @@

    Declaration

    @@ -539,7 +539,7 @@

    Declaration

    @@ -569,7 +569,7 @@

    Declaration

    @@ -599,7 +599,7 @@

    Declaration

    @@ -629,7 +629,7 @@

    Declaration

    diff --git a/docs/Structs/SevenZipEntryInfo/UnixType.html b/docs/Structs/SevenZipEntryInfo/UnixType.html index f5f87b57..b15690ef 100644 --- a/docs/Structs/SevenZipEntryInfo/UnixType.html +++ b/docs/Structs/SevenZipEntryInfo/UnixType.html @@ -239,7 +239,7 @@

    Declaration

    @@ -273,7 +273,7 @@

    Declaration

    @@ -307,7 +307,7 @@

    Declaration

    @@ -341,7 +341,7 @@

    Declaration

    @@ -375,7 +375,7 @@

    Declaration

    @@ -409,7 +409,7 @@

    Declaration

    @@ -443,7 +443,7 @@

    Declaration

    diff --git a/docs/Structs/ZlibHeader.html b/docs/Structs/ZlibHeader.html index 55183b8d..32bba4c3 100644 --- a/docs/Structs/ZlibHeader.html +++ b/docs/Structs/ZlibHeader.html @@ -240,7 +240,7 @@

    Declaration

    @@ -271,7 +271,7 @@

    Declaration

    @@ -301,7 +301,7 @@

    Declaration

    @@ -331,7 +331,7 @@

    Declaration

    @@ -361,7 +361,7 @@

    Declaration

    @@ -418,7 +418,7 @@

    Parameters

    diff --git a/docs/Structs/ZlibHeader/CompressionLevel.html b/docs/Structs/ZlibHeader/CompressionLevel.html index 18e60662..3215bc97 100644 --- a/docs/Structs/ZlibHeader/CompressionLevel.html +++ b/docs/Structs/ZlibHeader/CompressionLevel.html @@ -239,7 +239,7 @@

    Declaration

    @@ -273,7 +273,7 @@

    Declaration

    @@ -307,7 +307,7 @@

    Declaration

    @@ -341,7 +341,7 @@

    Declaration

    diff --git a/docs/Structs/ZlibHeader/CompressionMethod.html b/docs/Structs/ZlibHeader/CompressionMethod.html index 54c459fb..b63100ce 100644 --- a/docs/Structs/ZlibHeader/CompressionMethod.html +++ b/docs/Structs/ZlibHeader/CompressionMethod.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html index 52ddb64e..685f10ed 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Archives.html @@ -232,7 +232,7 @@

    Declaration

    @@ -267,7 +267,7 @@

    Declaration

    @@ -302,7 +302,7 @@

    Declaration

    @@ -337,7 +337,7 @@

    Declaration

    @@ -372,7 +372,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html index a3513421..dbef3505 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/BZip2.html @@ -270,7 +270,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html index bbfee98c..d4fe834d 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/Deflate.html @@ -275,7 +275,7 @@

    Return Value

    Decompressed data.

    @@ -339,7 +339,7 @@

    Parameters

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html index 6759da9b..47191b33 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive.html @@ -240,7 +240,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Return Value

    Unarchived data.

    @@ -378,7 +378,7 @@

    Return Value

    Unarchived data.

    @@ -521,7 +521,7 @@

    Return Value

    Resulting archive’s data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html index 03dfd65c..ef2b5d5e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/GzipArchive/Member.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html index 1b7f7cff..b794bcc1 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA.html @@ -270,7 +270,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html index 46a42ead..a50e572a 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/LZMA2.html @@ -270,7 +270,7 @@

    Return Value

    Decompressed data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html index daaa759e..3022009c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipContainer.html @@ -277,7 +277,7 @@

    Return Value

    Array of SevenZipEntry as an array of ContainerEntry.

    @@ -347,7 +347,7 @@

    Return Value

    Array of SevenZipEntryInfo.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html index d45f382a..449d1858 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/SevenZipEntry.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -359,7 +359,7 @@

    Declaration

    @@ -389,7 +389,7 @@

    Declaration

    @@ -432,7 +432,7 @@

    Declaration

    @@ -463,7 +463,7 @@

    Declaration

    @@ -498,7 +498,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html index 2e5c0540..d0966449 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarContainer.html @@ -275,7 +275,7 @@

    Return Value

    Array of TarEntry as an array of ContainerEntry.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html index 75c5e025..b12e3e4e 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry.html @@ -240,7 +240,7 @@

    Declaration

    @@ -270,7 +270,7 @@

    Declaration

    @@ -300,7 +300,7 @@

    Declaration

    @@ -330,7 +330,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -406,7 +406,7 @@

    Declaration

    @@ -436,7 +436,7 @@

    Declaration

    @@ -466,7 +466,7 @@

    Declaration

    @@ -496,7 +496,7 @@

    Declaration

    @@ -526,7 +526,7 @@

    Declaration

    @@ -556,7 +556,7 @@

    Declaration

    @@ -586,7 +586,7 @@

    Declaration

    @@ -616,7 +616,7 @@

    Declaration

    @@ -646,7 +646,7 @@

    Declaration

    @@ -676,7 +676,7 @@

    Declaration

    @@ -706,7 +706,7 @@

    Declaration

    @@ -736,7 +736,7 @@

    Declaration

    @@ -766,7 +766,7 @@

    Declaration

    @@ -796,7 +796,7 @@

    Declaration

    @@ -826,7 +826,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html index 57bb58b4..c5498243 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/TarEntry/EntryType.html @@ -239,7 +239,7 @@

    Declaration

    @@ -273,7 +273,7 @@

    Declaration

    @@ -307,7 +307,7 @@

    Declaration

    @@ -341,7 +341,7 @@

    Declaration

    @@ -375,7 +375,7 @@

    Declaration

    @@ -409,7 +409,7 @@

    Declaration

    @@ -443,7 +443,7 @@

    Declaration

    @@ -477,7 +477,7 @@

    Declaration

    @@ -511,7 +511,7 @@

    Declaration

    @@ -545,7 +545,7 @@

    Declaration

    @@ -579,7 +579,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html index 1f374f0f..16c37349 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/XZArchive.html @@ -275,7 +275,7 @@

    Return Value

    Unarchived data.

    @@ -343,7 +343,7 @@

    Return Value

    Unarchived data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html index 146bea03..4bfc4dea 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipContainer.html @@ -277,7 +277,7 @@

    Return Value

    Array of ZipEntry as an array of ContainerEntry.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html index 2e7d1add..2a495015 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZipEntry.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -361,7 +361,7 @@

    Declaration

    @@ -391,7 +391,7 @@

    Declaration

    @@ -421,7 +421,7 @@

    Declaration

    @@ -451,7 +451,7 @@

    Declaration

    @@ -491,7 +491,7 @@

    Declaration

    @@ -527,7 +527,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html index 0bc0ea28..a63dd3e3 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Classes/ZlibArchive.html @@ -278,7 +278,7 @@

    Return Value

    Unarchived data.

    @@ -345,7 +345,7 @@

    Return Value

    Resulting archive’s data.

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html index 6518d83d..93ac1f35 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Compression.html @@ -232,7 +232,7 @@

    Declaration

    @@ -267,7 +267,7 @@

    Declaration

    @@ -302,7 +302,7 @@

    Declaration

    @@ -337,7 +337,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html index d587226c..b53812a7 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Containers.html @@ -232,7 +232,7 @@

    Declaration

    @@ -267,7 +267,7 @@

    Declaration

    @@ -302,7 +302,7 @@

    Declaration

    @@ -337,7 +337,7 @@

    Declaration

    @@ -372,7 +372,7 @@

    Declaration

    @@ -407,7 +407,7 @@

    Declaration

    @@ -442,7 +442,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html index 1fb139f6..bafc7343 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/BZip2Error.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -410,7 +410,7 @@

    Declaration

    @@ -444,7 +444,7 @@

    Declaration

    @@ -478,7 +478,7 @@

    Declaration

    @@ -512,7 +512,7 @@

    Declaration

    @@ -547,7 +547,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html index 1d2cb560..81b45388 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/DeflateError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html index 54a2c27c..130dd82b 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/GzipError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Declaration

    @@ -343,7 +343,7 @@

    Declaration

    @@ -378,7 +378,7 @@

    Declaration

    @@ -412,7 +412,7 @@

    Declaration

    @@ -446,7 +446,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html index cb00d052..d07c68ab 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMA2Error.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -377,7 +377,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html index f03dfe94..dce9345a 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/LZMAError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -410,7 +410,7 @@

    Declaration

    @@ -444,7 +444,7 @@

    Declaration

    @@ -478,7 +478,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html index a2b0cd4d..685e92a7 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/SevenZipError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Declaration

    @@ -344,7 +344,7 @@

    Declaration

    @@ -378,7 +378,7 @@

    Declaration

    @@ -412,7 +412,7 @@

    Declaration

    @@ -446,7 +446,7 @@

    Declaration

    @@ -480,7 +480,7 @@

    Declaration

    @@ -514,7 +514,7 @@

    Declaration

    @@ -548,7 +548,7 @@

    Declaration

    @@ -582,7 +582,7 @@

    Declaration

    @@ -617,7 +617,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html index 0168fad0..d1731f31 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/TarError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -410,7 +410,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html index 385a4697..5b8fdd1a 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/XZError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -309,7 +309,7 @@

    Declaration

    @@ -343,7 +343,7 @@

    Declaration

    @@ -377,7 +377,7 @@

    Declaration

    @@ -411,7 +411,7 @@

    Declaration

    @@ -446,7 +446,7 @@

    Declaration

    @@ -481,7 +481,7 @@

    Declaration

    @@ -515,7 +515,7 @@

    Declaration

    @@ -549,7 +549,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html index 5dcf2be2..0363f329 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZipError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -376,7 +376,7 @@

    Declaration

    @@ -410,7 +410,7 @@

    Declaration

    @@ -444,7 +444,7 @@

    Declaration

    @@ -478,7 +478,7 @@

    Declaration

    @@ -512,7 +512,7 @@

    Declaration

    @@ -547,7 +547,7 @@

    Declaration

    @@ -581,7 +581,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html index cad78f4a..5af46e36 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Enums/ZlibError.html @@ -240,7 +240,7 @@

    Declaration

    @@ -274,7 +274,7 @@

    Declaration

    @@ -308,7 +308,7 @@

    Declaration

    @@ -342,7 +342,7 @@

    Declaration

    @@ -377,7 +377,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html index 1f825d88..f1408cfa 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Errors.html @@ -233,7 +233,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -305,7 +305,7 @@

    Declaration

    @@ -341,7 +341,7 @@

    Declaration

    @@ -377,7 +377,7 @@

    Declaration

    @@ -420,7 +420,7 @@

    Declaration

    @@ -456,7 +456,7 @@

    Declaration

    @@ -492,7 +492,7 @@

    Declaration

    @@ -528,7 +528,7 @@

    Declaration

    @@ -564,7 +564,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html index 7e93bcf3..6a226ed3 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols.html @@ -232,7 +232,7 @@

    Declaration

    @@ -263,7 +263,7 @@

    Declaration

    @@ -294,7 +294,7 @@

    Declaration

    @@ -325,7 +325,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html index 052813be..c234031c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Archive.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html index 4485d2e0..67cb930c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/Container.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html index d9905d69..757ab349 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/ContainerEntry.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -359,7 +359,7 @@

    Declaration

    @@ -395,7 +395,7 @@

    Declaration

    @@ -425,7 +425,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html index 7a9052b1..6a9d331c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Protocols/DecompressionAlgorithm.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html index c69edc7c..9dafc6eb 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader.html @@ -240,7 +240,7 @@

    Declaration

    @@ -271,7 +271,7 @@

    Declaration

    @@ -301,7 +301,7 @@

    Declaration

    @@ -333,7 +333,7 @@

    Declaration

    @@ -363,7 +363,7 @@

    Declaration

    @@ -393,7 +393,7 @@

    Declaration

    @@ -423,7 +423,7 @@

    Declaration

    @@ -453,7 +453,7 @@

    Declaration

    @@ -510,7 +510,7 @@

    Parameters

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html index 0fef6679..227717ee 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/CompressionMethod.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html index d46f2b99..33e686af 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/GzipHeader/FileSystemType.html @@ -244,7 +244,7 @@

    Declaration

    @@ -278,7 +278,7 @@

    Declaration

    @@ -312,7 +312,7 @@

    Declaration

    @@ -346,7 +346,7 @@

    Declaration

    @@ -380,7 +380,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html index 103f2105..236e5f9c 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo.html @@ -240,7 +240,7 @@

    Declaration

    @@ -271,7 +271,7 @@

    Declaration

    @@ -302,7 +302,7 @@

    Declaration

    @@ -332,7 +332,7 @@

    Declaration

    @@ -362,7 +362,7 @@

    Declaration

    @@ -392,7 +392,7 @@

    Declaration

    @@ -422,7 +422,7 @@

    Declaration

    @@ -452,7 +452,7 @@

    Declaration

    @@ -482,7 +482,7 @@

    Declaration

    @@ -512,7 +512,7 @@

    Declaration

    @@ -542,7 +542,7 @@

    Declaration

    @@ -572,7 +572,7 @@

    Declaration

    @@ -602,7 +602,7 @@

    Declaration

    @@ -632,7 +632,7 @@

    Declaration

    @@ -662,7 +662,7 @@

    Declaration

    @@ -694,7 +694,7 @@

    Declaration

    @@ -724,7 +724,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html index cce4043c..a9d50f4f 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/DosAttributes.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -359,7 +359,7 @@

    Declaration

    @@ -389,7 +389,7 @@

    Declaration

    @@ -419,7 +419,7 @@

    Declaration

    @@ -449,7 +449,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html index 30c3fa10..1e309e9b 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/Permissions.html @@ -239,7 +239,7 @@

    Declaration

    @@ -269,7 +269,7 @@

    Declaration

    @@ -299,7 +299,7 @@

    Declaration

    @@ -329,7 +329,7 @@

    Declaration

    @@ -359,7 +359,7 @@

    Declaration

    @@ -389,7 +389,7 @@

    Declaration

    @@ -419,7 +419,7 @@

    Declaration

    @@ -449,7 +449,7 @@

    Declaration

    @@ -479,7 +479,7 @@

    Declaration

    @@ -509,7 +509,7 @@

    Declaration

    @@ -539,7 +539,7 @@

    Declaration

    @@ -569,7 +569,7 @@

    Declaration

    @@ -599,7 +599,7 @@

    Declaration

    @@ -629,7 +629,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html index f5f87b57..b15690ef 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/SevenZipEntryInfo/UnixType.html @@ -239,7 +239,7 @@

    Declaration

    @@ -273,7 +273,7 @@

    Declaration

    @@ -307,7 +307,7 @@

    Declaration

    @@ -341,7 +341,7 @@

    Declaration

    @@ -375,7 +375,7 @@

    Declaration

    @@ -409,7 +409,7 @@

    Declaration

    @@ -443,7 +443,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html index 55183b8d..32bba4c3 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader.html @@ -240,7 +240,7 @@

    Declaration

    @@ -271,7 +271,7 @@

    Declaration

    @@ -301,7 +301,7 @@

    Declaration

    @@ -331,7 +331,7 @@

    Declaration

    @@ -361,7 +361,7 @@

    Declaration

    @@ -418,7 +418,7 @@

    Parameters

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html index 18e60662..3215bc97 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionLevel.html @@ -239,7 +239,7 @@

    Declaration

    @@ -273,7 +273,7 @@

    Declaration

    @@ -307,7 +307,7 @@

    Declaration

    @@ -341,7 +341,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html index 54c459fb..b63100ce 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/Structs/ZlibHeader/CompressionMethod.html @@ -239,7 +239,7 @@

    Declaration

    diff --git a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html index 3dc30092..49328b59 100644 --- a/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html +++ b/docs/docsets/SWCompression.docset/Contents/Resources/Documents/index.html @@ -234,6 +234,7 @@

    Features

    • ZIP
    • TAR
    • +
    • 7-Zip
  • Decompression algorithms: @@ -278,6 +279,7 @@
    CocoaPods
  • SWCompression/BZip2
  • SWCompression/ZIP
  • SWCompression/TAR
  • +
  • SWCompression/SevenZip
  • You can add some or all of them instead of pod 'SWCompression'

    @@ -306,17 +308,41 @@
    Swift Package Manager

    More info about SPM you can find at Swift Package Manager’s Documentation.

    -

    SWCompression/ZIP and compression methods

    +

    Options for CocoaPods users

    -

    Deflate is a default compression method of ZIP containers.

    +

    Both ZIP and 7-Zip containers have compression method +which is most likely to be used when compressing files into them. +This is Deflate for ZIP and LZMA/LZMA2 for 7-Zip. +Thus, SWCompression/ZIP subspec have SWCompression/Deflate subspec as a dependency +and SWCompression/LZMA subspec as a dependency for SWCompression/SevenZip.

    -

    This means, that if you use CocoaPods, when installing SWCompression/ZIP it will install SWCompression/Deflate as a dependency.

    +

    But both these containers support other compression methods, +some of them are implemented in SWCompression. +For CocoaPods configurations some sort of ‘optional dependecies’ are provided for such compression methods.

    -

    However, ZIP containers can also support LZMA and BZip2. -So if you want to enable them in your Pods configuration you need to include SWCompression/LZMA and/or SWCompression/Deflate.

    +

    ‘Optional dependency’ in this context means +that SWCompression/ZIP or SWCompression/7-Zip will support particular compression methods +only if a corresponding subspec is expicitly specified in your Podfile and installed.

    -

    If you use Carthage or Swift Package Manager you always have the full package, -and ZIP will be built with both BZip2 and LZMA support.

    +

    List of ‘optional dependecies’.

    + +

    For SWCompression/ZIP:

    + +
      +
    • SWCompression/BZip2
    • +
    • SWCompression/LZMA
    • +
    + +

    For SWCompression/SevenZip:

    + +
      +
    • SWCompression/BZip2
    • +
    • SWCompression/Deflate
    • +
    + +

    Note: If you use Carthage or Swift Package Manager you always have the full package, +and ZIP will be built with both additional BZip2 and LZMA support +as well as 7-Zip will be build with both additional Deflate and BZip2 support.

    Usage

    Basics

    @@ -343,7 +369,7 @@

    Documentation

    Handling Errors

    If you look at list of available error types and their cases, you may be frightened by their number. -However, most of these cases (such as XZError.WrongMagic) exist for diagnostic purposes.

    +However, most of these cases (such as XZError.wrongMagic) exist for diagnostic purposes.

    Thus, you only need to handle the most common type of error for your archive/algorithm. For example:

    @@ -395,9 +421,9 @@

    Known issues

    Future plans

      -
    • Better Deflate compression.
    • -
    • 7zip containers.
    • BZip2 compression.
    • +
    • Container API rework.
    • +
    • Better Deflate compression.
    • Something else…

    References

    diff --git a/docs/docsets/SWCompression.tgz b/docs/docsets/SWCompression.tgz index d1f4c7325de33e42b1efca04a9876e86649eca3e..1e55ccb66a041b1b010a39aec1944448089cd0e2 100644 GIT binary patch delta 120183 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

    NlxOK<#QJl&cmy{uGgJ^}#K&0>B!R4U8J0g0ki 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

    %pf?na+l2}? zQH&OS^jnf!>_yfUJmY%DLFi1K_D@%V>jcjZ!nvm7w-0$E*Vqn%UakcX=RsY10AJF3 zSAbO&z^5XLveikrpBuo+@c8wPd#J7)vOGk2^gZ0Ykp$=`EaKMj}TPHbYfO*>EGTp_I zprtqW%eN}RwIWb?2)??Rph~1XZ3zKR)BEaYn<`e*PLevdajkh6NiaMN^`#KBJEKh6 zEJ+A#;a4neOuVkc1=7nQ_#r+Fz==>zagB*R5LQkKPFzD(Wx1Sx;RwOVrE;c*W?uTl z09Ba^bI8PGq#S9+Yb7o}E@lT$7m^cKVXXK|xyP$KXgpHKRG7xQFAIOVW9ge6bCvZP z0wyR8&4xv|x##o5TDPPV&6*}!Ou@%tom}4Fuk@h~$&xF|)6aF!R^a34BjajCjU#TE zPvsX5{sgicwtfPCW(kvrM{hiQ;<^JPqbCl(?BFQsp3Zt}s;ls7Nh_tCT-;R^yyOmB zJ27gMhbJ*wKZ#o#s~R#g@7oqH*HOTW7j%NL>SPR)P6kaj0xdn<@L`Jx_Hnv^Yt*{4 zh?9FAu?Q$0!G~Y>k;#ur8mzm$GoL%}36O!jPs<;qiSf>Vs*TJuup#O;Yzct_NV zsNhjiq5;x`AAiVY6W`qMcF{Fy#yEpzlOVWFN$82d*~cAhJW9l=b;7sG$@ZdP)Lg#cP6&nzOn*4!ViFrYo`_5*wrL&m6T(k$*)i{ruJ&3Dn6vgDl!K=p-GM<5jQ7tMJ;!7pIVu$ zsgv4>ZfaD(gMH+-8J%-590;{{iN#XQ-b)&o8T;UWV#Quzz*u3df*McH=mZMy>pE1vno{mPd1gdgt8 z)8q8Ue*tP#hDtU5$tDR9?)0dQeAv%J8Ass7qG*3hEG0Xac_nb)lCSeh`Gi4)(!&W8 z$`Dq<#2JUzW2->Y)MpFLlQ8>u7^7iuRU5K@);g)p(1mhfx;?f(n+8=Q#zRT1?ISFgI=79u%SPYS_* z@$QrkTSJzWxbI+vg0XZUG!jFqC|dEcfMj?xC}`|A@_Io>k|6AM_z?GQErK|D*3e*a z4IiKSQX)~`0``(TOhmzqD$OHH1~P$3%4BcGw;y-tFZe1 z#ug7WuGPavVwhrv4xI7}4bUY|Ch{zQWda)%NR(_7p{d7=sd&;Pz5r0Jo6-6L{f(R% zN$KdnA;$*pq6KX(Ow1LUG$GfB1P(xzP%EGo7-m{tAqk_WTQ+s_g3V@A{Pfz=OV|L5 zxP4Vq8$DIi5hWr*8(h^I(F+9)PCTUTW8W?j5|-@YFOk=0plV>Q6e-pxPd3P;Ii}4mlWqoXv@`K*hpm z{>8VUDnxImXy;I>$ebsmAFIBO47PnPqfe5B(Xahy=(i%#ln$fl)_Ik5+u9^y0XOTYZO zdv!cJh#ajhQ8)j|WWjH&^BGq^|u=YXYv_%3FlW(9&@nRvD0QGK1ya++O&b$1LI+`%Q$6#e5QTfZmI{gI391*{5}j~6QzI)WOoGUvNF=T6M>S3Zk}^u|Gpy+;Zm`>%qG2L3;OxV8br%vJZ= zM=I!ZNV|6TYosz8Lp;`FN)&#ldp;Rg1nO4})tF%)@-`7?JVXWr{NLu`PrnojVugR8 z7WRfH6?H@K9k8T;37=acZ=TYge{C{2mXzgR4=k0eg^oo$PYDwSXh10{-8|Sd_SccD z_~

    Features

    • ZIP
    • TAR
    • +
    • 7-Zip
  • Decompression algorithms: @@ -278,6 +279,7 @@
    CocoaPods
  • SWCompression/BZip2
  • SWCompression/ZIP
  • SWCompression/TAR
  • +
  • SWCompression/SevenZip
  • You can add some or all of them instead of pod 'SWCompression'

    @@ -306,17 +308,41 @@
    Swift Package Manager

    More info about SPM you can find at Swift Package Manager’s Documentation.

    -

    SWCompression/ZIP and compression methods

    +

    Options for CocoaPods users

    -

    Deflate is a default compression method of ZIP containers.

    +

    Both ZIP and 7-Zip containers have compression method +which is most likely to be used when compressing files into them. +This is Deflate for ZIP and LZMA/LZMA2 for 7-Zip. +Thus, SWCompression/ZIP subspec have SWCompression/Deflate subspec as a dependency +and SWCompression/LZMA subspec as a dependency for SWCompression/SevenZip.

    -

    This means, that if you use CocoaPods, when installing SWCompression/ZIP it will install SWCompression/Deflate as a dependency.

    +

    But both these containers support other compression methods, +some of them are implemented in SWCompression. +For CocoaPods configurations some sort of ‘optional dependecies’ are provided for such compression methods.

    -

    However, ZIP containers can also support LZMA and BZip2. -So if you want to enable them in your Pods configuration you need to include SWCompression/LZMA and/or SWCompression/Deflate.

    +

    ‘Optional dependency’ in this context means +that SWCompression/ZIP or SWCompression/7-Zip will support particular compression methods +only if a corresponding subspec is expicitly specified in your Podfile and installed.

    -

    If you use Carthage or Swift Package Manager you always have the full package, -and ZIP will be built with both BZip2 and LZMA support.

    +

    List of ‘optional dependecies’.

    + +

    For SWCompression/ZIP:

    + +
      +
    • SWCompression/BZip2
    • +
    • SWCompression/LZMA
    • +
    + +

    For SWCompression/SevenZip:

    + +
      +
    • SWCompression/BZip2
    • +
    • SWCompression/Deflate
    • +
    + +

    Note: If you use Carthage or Swift Package Manager you always have the full package, +and ZIP will be built with both additional BZip2 and LZMA support +as well as 7-Zip will be build with both additional Deflate and BZip2 support.

    Usage

    Basics

    @@ -343,7 +369,7 @@

    Documentation

    Handling Errors

    If you look at list of available error types and their cases, you may be frightened by their number. -However, most of these cases (such as XZError.WrongMagic) exist for diagnostic purposes.

    +However, most of these cases (such as XZError.wrongMagic) exist for diagnostic purposes.

    Thus, you only need to handle the most common type of error for your archive/algorithm. For example:

    @@ -395,9 +421,9 @@

    Known issues

    Future plans

      -
    • Better Deflate compression.
    • -
    • 7zip containers.
    • BZip2 compression.
    • +
    • Container API rework.
    • +
    • Better Deflate compression.
    • Something else…

    References

    14_8&`PBNtzwB7mk|sG#i>I~~ZVdJPc)K8y?6u@_f>BQ(ISb=WabJYRSR*Aqt@s`X}kNu8*~=GYGsyyfvGg&mfVA zp5or1m7ki8zDDx`s4DZACd$lo4@3>+fl@?(<(KVq=&!M;>OFo(4)&WkGRFR0J=LGk zjFQPPy?y9}{$fFYB}kSn&@mFPip7ZFVP|BwzbJm6&h~@p;|O?mM*U|Si>ufh2cs6z zn@>SU$AW0@{_nhsBB<$6-+H0+pOaZF6;h=r)!w(8D|y(9aPm{e+lW|BI<9 zaBH0wuXzUBd=ox~Z=Qql>Q5wbaHrN@zLctTZ*%z3&3h6Qsj#Ya3FWJ%O-N?Uo^{>c z2c1>p$ww~}&9ppFL-cnY&5*(T;e~GNM;?-3zN?IKD-PpK!HbcH>{WLY|5MVc|B*vlQovYZ_K*y76utok7{fzaWM4+RVp_d%C^i> zlc7fOQX6Z<7YNr+s3mVgF1naP_!Td`CCHo!)Tj$nXeJU>wad9gwln6{_Ot^Q7pTF= zmP7E5j7y43h0}A2CW~r&+b(mQb{uP)5G(Mr=>vKS0E!2NY;ld!%vfvG>>oQC#U{Vs zqx`<_sDBzni+;K3k4Y;2XtrWnBiW8#L7zz4csWz9rBOPFhZ4Z^&#Q14@=K{E z)=q;|2WorPu^LxI*E2DcL}}@aTylQ~<`N3pnhBAnj~@SqNc1&OK@xm+qt~|oZtm#6 zL`%YF^+7IztEevp_T;Z+L62qX#XSdwMGGn0z2SWYL!1>GqJHk5!llkegwXJdws|@R zKmCmRx45WmHtGO=t-)WK`h$$`E@^^4oqFS*_<-^#RzGTQ=n>ICc+^J(0xwiMZ0_%c zD@4yLS>-O;BMlgsDl(>$9mUrKj#RIge4Z9iBG;>^SZyema9fODLE8N5Vftv$Q+iI= z&$Jx%CJssk8uuBXpT;S;`fCogT{$90s@U+bETNlQSRE%$_xh#0dG!l)0y%z%#3*;k(d4{Wk} ztOI5tJvn**a(q%Ij&KNS=lBS-#g~eoCf^?MjfYjnKDCs3V&j-`I;hjbe!*t=VC~SA z{8!%4MQ-LdaiN%8wA&o|#E{j2sUUZltBnH=E>X5zB87^#advT8bE+-sx2>pN_acszrISJZJJ zO)M8E;7S*|UsXDjxp7P>sFm56s1Glgj6eK99!euXf?jOz zZ~B!5>W(4~7H^rQ2`F;em&0x{~j-C^p8zkG-TWO&rUU+PE^7>#Hp1%pjPRU<{a0V4Jk&yP+Rf(A{xWL6^ zo1#PVy#aw$*u>dj0G2gM(gL6J3ytwCtipAL2w zXXuqTwd;H(A9cof!YGwx*Zd4z;lhD)hOt3HYXUQv(We!9_?F=Gd#D+|1fpHd zXrwq*_$TLp_#+VyP)xY@gK63|b{y8-gNi<~Pi%&P`RyvmGwN~X&!>gcz{rPW4_NNzD_mjooC+MI>fP|Hs8AB}t95UPZy7sb;~cj`B6@~Y(COpLNy6=7LcEQapj zIaxK>VAFrj*{({bjEBlgYnLR@?U(zUuIEKwu%(llKVN)b3ww#QbhFHl=_u}MzN)+0 z^7u;ggrbD=7eFS@yqbPw)LJuahSdnn2m zbcIT|_P894p#F;d-glD!7dej*?}gQPsZr6k&z>cdH3~i4FUzYT8=2DEUh{``{jxz7 zOq~9*a5c3lwEkH9A8P_R(>YYAKX366vhYvtxQ>}x`ha4!dUf%H&SXb;L_Qlct-6Y= zG(p+)p(+JFeYV;>-?uEq$?ydZ%6QwLRu2Mw0*fy54E)NA z)r>;HGNE`m*hVLYRlmMeu5YSOKlG|0ZsMV2e>{CT!42%L08d17{2^ma95l%df!$Xn z;^Wk0B?a($GMdISyMUwf1(Jt~AxFphsWS1q!LNPccEeQ;UCW~u{r#^Pc_0+?s z@oF+`mi%gkakPX(ihBcN3N>sN3^Y@9Da;H+mMfsYNil!B5DdZk2T^V`7YYIR8Va@4 zK|@>xM>RUwrIi@1{I8sp?1Z68mLAas%nvGcB(6IrJ+bDEUvH5#J!cXg5XG*M8~Y>C zd_w+~kp^AH7|I{eH?@oSp% z#bFGxd*dUhNw&%6#;WZ~@JbTVTR5)1d_Pm_b%lRQ5gkrl@Q_v`gZUzT@iS}-33jBw zKhnDg?A{UQYiE=l8H6zIz1D~+hu1n5?D=otDv(6gqf#ql<#wM#)u8?gp{#=X#JY?J z^fx7*44l8V13aGWLp0I3zi&4FyW{-CB)RbSz!>*s2|5yiuzn=eg><3~GC6oYXtq|a zd$!YW;=t}o(hhdd>F59MJMBEkaL_ZXi3m<0xA-j!?pB&v8wJ2@ta|oqH%tXzI>N=KSQLh~g9i z&OEXeSD?FlnU@BM;j9NF4G%<&_c@=)nUVWd`fc291#}EbayLg;OP&iEMnC$i-uwXF!LN4j8Fy%EAQ)Ekk+Urzb?=nM zJ+em^c5Cso|Me_jxu1T?shm+oKBzqKTqEBXB0U@m~ku z`~terdN=_lu3uAF1HwR<+j7prOSr|*&_qaoc=EQavlfaTYc+V9&v%#K*`#9!*J^jX z2+tPE0rzMI=?TSdSXt7>{zWDe3sWK8Gdw8SbR3) zvoKEZTRI(Q5O8lEjBX%@znc z1kEI^!5+fVGE_H5(|(YUXI7Nr>29@n;B8u@dILlClP7&1-(-b~i}W1G5_!KiZF?T8 z#!(=&I5;HR|H?*9>~E;Y+7bV|++9FK-JMh22W}}%eLIcBYCG>Kkm22*XroLRa|>Gn z@iWXH?7_g70N?Qxh#m{SO6&$iN};&;nvGE6g}=$0KvKyJor*&W%`4PBBOnn)LL~+% zj@Cr~vK-dIbL$9V>OH}_(DCw+dJq#$?~SDofI0JpT@1^GFq-a+(jUn&;HBs?$qp)} z2#spRx?`N>zrPiGF2nJ3!0Kf<7^7&ZDblGkjz32T(5_7e)RQStnh%D_S3|-yJW}CodDewP$i~sr%if`YD?zWR+gX$8Y#SzmBC zp^1N@8zPGph}xp-5@X(*)e74at5_DBq*0Sjt(cG>s%D5*6R^;K3i`p+dJ<*Z%6(%j z*VlV{;2g8UdJmpzQ_(&>E<`|Qs`YM|UXfCSOU>q4>1fL!)0SXQC4Yb$upgpf7A(=@AXB2y~=NmTHN4VJL zKqZ*{wbqfS9)o6u(SgDZn?hSgM zR}l7>U)B1BEKsWl4sV0&SUl*QB)ZjM>9akd8y6mLc^Aes1L_f#f9Tb~qZ$Ig$sC&?CFJ}@~_lM}x92#0mR^oH6w zd^4f|D8wq2geBHPLF+Jw2CAqqnB*_;0kC+7%ZIp(E_VSSBysWnS7 z1Kw8E4tLlcn~s?k4|6QT;+?xnEIRxCeLG)|ku!(xn~U4)RFIyd|K1<(;v?xg8JRZ@ zgvXH3nC*!ClSQM|NzD#j>z)=^`RYU+{wh3`l=_c=l$$H4w<9T(Y{?+#zPZh+l4alY%uaZi7HIPmL{Z5w(h6lQ=t-n7c5o## zAuzuWjTgb;IA;0{HAiUo5%n_zzsHjE>POAS7>oLP*1h3M9UC?RnWQ{YSkOxe9AIVD z=#2Ryb47tTs#v|(A~#c)?7)5VQbzr86{NQllt~uR7Tcy6c11kS@fAq|*LzZz<15fD zBeb@tP_8wAKG5=xghtmHJgHi5O08@_$*E=^1S8oDIWrtOtgPL*Hz%b#wVU)T;#_(n zGoo-i4t3!xoZrkW&EhD1{Y7bA9GG*$kSJpQ>8Z&}71Ng9iO~rY6tjvrsnid1G2i>J znNF#gZUW`H8)DDcM6-*e&;4l4RZ5A=ISuwNQTkc2Z`&gy2cyOH!DMagSC8a;H@cj4 zHK%nAsqN_j@*#KoIC%xmb^FBM2-Mu+B&g`ZB!XQ=g?Mf+&HOjLg|pmPSm6C?`VjXc zl3+pP{&!pUH?kWfz*a(IXU;}KB14w6bc;pEoz=%QK&bkdF~^7w7;6>uam5)}k=%}f zib79~3O7^H#NZ?vF!1UPmKsHVNSxk1nVZAB&Wq@L`ugUdffy;WQ`Ko+1SPcdhWVoB zvfr)MZnZaUq>%~TTZjJe9bl6|M%^_uwwGZ(S;)31jn4R9_IL6wSwGuhq+j;ygJuv1 zRfK@&o%xIeH{&;voo#Mps2mZb-yb6Uu9TQLbk;-@BeWRStf@x??)XKe30Jk)n=F?D z1|E+F3TeGmJsiQNKhe2-q%wVx39u;Q8q$Yim_Rw?GRBEC@X9w)o`AMV7V|r=IHz;u z(LjW-Xd3Kn4*|{H0fM3KUcsV?v9BJ9(dmoXR>IaQ@IIwGORWHG!vhqw_OzPpG@xC7|JLHu4D z^EKor69T9nX~D1P%fMAO9k`x;aI8#FMgaFZO6OLcvSs2uAx$x~? zzc)uluu`T>z>jfSbqlS=vw*aH{k)VeLH3v9TdtM~ABYZL0|2FjWTq#L2@;urY)rDB z+oG7)^Ry|3!r}HI|H?%qsR;$TqpKLmamj7}4CfOI9M4F4c0Y4?U07c{(^MY`z#^GN zb9})|%2Doq^+VTzq{4(`^bS58;;?{xqwiZ@Opaz=q{ku4z~YB3nOuDC^6jVM5nYVF zsySC2LWE_{>jOyLiusW)24lMr%DS*aP;|fse6dbc3u5V(XcHI9n?ug>IPL1%3^EvI zX7hNRhV zWA_t-U)P~Bsh=&m31S@)YWlJS=Sz4e$UQqPx1`L`*n=NSEd}r?UP^@{J5R0}hT7SF zZmm#0P;s5N2#4sfXadA&dg{D5d_Cyb&_PZ+qF9o`;*V?iFancEiV-?)Qy2Q7YHnEd zCi#YwXFwryI)x}Zn0eY{_~KT12!`nHYx(5c0G87uj+PL^A}WWx6%{W@NmExOTPkN+ z%KGyFVU{OKxrdU-PQ1q-P0#G{=sof|YVU-o<*-qxIj&ygaV@D){x;k3KJoVl2^GZp zb0!iFn+?`t0{lPGKfLfMH?gIc1i!+{(JBv5vjNCL*jIWm+k4|p7cNmC>%>(M%s%yq z6LDv#?Z9FMbnM(~>L(6_eVNK(`K%hbsbV7SPdu#p9S0kq9V6Z$J(mI70@s;qm-@%8 zcoE?*so0@&Ya@~v?M+duton0_3s95izv=j}RBy!!pj^AFcMv9AQMFhXZ{eSCR7)w@ zivTP|z>4Y+Ei#!8M3L|5P6lvm+^xSTz`RH!WgP#i|1YHm_~WD&7qrsy*&bUnSZbqM8)%Zbdr{%jxv_F7 z=MT^AH?46wg<<=Pa~F|F%~RcmtMqkeYi{Eh5qi5wA8je}bo7v&4D9{~X1y8-YJ~ND zGYQ<}?~Q=#JX=>YoX&ZJiK5t7*972iFqD2ZSVuMGo9EO>N;PJVCPo6wMJm@(Vj?S9 z4CiI16gS=9X@^DB0^W24*Wxm*IY))>#jz5|5b7{(-Mf^z23ox3xTMZTviel(+Fyv$rE=ArGaxZ_NH_oQ~#?D=df`CjWf%cK?{-v9lIw5RwCP`3dtm zNz}ZKr6su*h2NJI@Q$5Zo7%K`0I%Uq=f=plV0kr;GGiWA9scFXjmb$O%8c{#lksm# zGq>7qZzURymSn2d9oCrBYksJ;-ZNijNNa^i$%ubp4Lo~AdtV5;ug?=`G1~mpSF&P4i=-mhJQLUWOYoZIx!H<9f!az+J5g%G>PKAcLNk>80IM2ot@(*a9?wmDsG}9r>v*lWZhYpE_o--KQu@pNsV(rea}TFV&P+GH z^U8mO^lp=L^XV*-X!CLFhW)VXNj}T><=BkV$EELrGp$Lc9Z-6C$?EhxvYV3rEzt1z zlCvq>82!oDIwA-<5M`3ky@PmX7~m)N*;WJH^w?CWbskTv=)EMV>Dgbcd)d98-g2zh zo|U@EKE9s_eoR@IhkvR0cPb{p<2;u1&l(&bmthEC6$rSl>IPjuHQBbE3nsF2e5hs4 zB|+MN{{;V@Bx(ar4j$iRVFP{#4xH>vSY3EK_Z8}ZoVH5sEgnCAVhc}8?@cMXnj~GMtbn^A9h`r!S_z!@B zm2GVvBY2(d+}wDDXNiBqiDQdDA`!_aaJlE>qlayWWK}TvmxJhz zL(-W8xD@zv5~m~hD4-?RzMECls_N@;biD{XQxiXrnlZi3cNoR2x0GB8`r2DREk~7o zyd9&oJKN}4ftD`PvNGQG_)FYmD}Cp^R0(}gVL^+}WszBL(}`M@I*$`=MD4HCOfN_K zn_cefQM+!-f`Y0lw%ksRXG&fdgdI#25fUQZVR?FauxcC$L)y39D*FM!+4m%5nuLl8G;f75fIzf4uH_Uycg z@8+pO&}&3mf5q39!Ff;oDP{F#s`TVr*!6M0>HXLSx*pT>J&x3S8!O5bB9-^ur_Xxp z2dFbW4pOo{?uuf3@A3dpAhGvTthm5y%GBGyVwXT!F9&F<0Qa$>{d>WxsAz{uM#$kc zZO1R>M4ONMQj==r^|#gg#V8^oVj@1SRM`SGM)99EfAEvF8$G2IRm;_zo`+DXaPc%> z_qK$IH(qyMvp!CC0q5;3Z%H5Led6D1!2MHU)|smAM@b|M=y_0&-}x%A4Y)1}C%EW5 zm9OlwUgre3oDZH#bh~s{WtO!jZyoX7|G8PcR}tfBzc%#9qWHe~Q~O>6OV3lM zPgjw)CD={cH?0QuH|wJ(uvu@1CmZ4ml|EC2;zfd8W&GE_k${B zMDjk@mzN$BV~lj|A0A~76RinxQLfLYkz9Hh~!;7I>)74PDrw=9AtmdN)EH}osqc|nDb(2OA!{i7wrzrwduDS1QI0FN3t&`x3L6qHN;0frhGm!Y}`C4PH ziPB9amT-8~VFgqB1=gbtA&+P7?uS~%QuAwn;_Id7e#1e^#?M&;Q;pguJuZ0F(Xa2;^T&VURLK&(A|6$@Tq+7Wxsqq zrYrPeR#n$$TP;l-wT33bXZ+RN+D%Wl zMmRf9CQ!<|9vDyr>~DcBdN0q7%|3OFfx2J4I?izQ(uU{pUGB7o`x~1YUE8;M>W#JU zZ9c~xWsL2oMs63)7o{lHPY+pwmsk9Gg0BySQ+jXzaNb@^aI9PJiiqEuVk|D#ub4P- z7fnBrc8&qid!YCQNaSE)B(JP~-PML^1#hkPbp8=X*JC;D0syq8v^Ko)jP%*3y6OG> z1+9b;*Z!(|Ju)%+7+Q^4Rjw%T-%%%3H6Q*Pn>qBk(rNPk;c+%Y-<9rVb`ywGR&zJfByHAmiN)Y@w8EZ-hMS7$f$Q_z!7qxE$?M%zK9>87=a(?yTV5ro0i z%KAQ=^dWhub3$CO%H(~HK=fk#8aV}=P!hWXXK_vCp6^MQl^5r&=Cdc{ryM$+ih3=k z`_MS`$}xmeYn`?Of%FTRpusWCjTXaoX#TSMv_eNEEj-TC{*of@B8hiwR zvr`;kn_vp`Pie#jr}Fvakk}`@*7AMjmeFpx#c^V=p={C4e8g6#;UEADrJU;$!sqnG zg|JKw#oF_*k%3+<)3w=RyQPGCEg{;+d<;cPz;~ihX~_5TT8V(?6H@wq$k)a9@pkIX za!d43@M^(KEo!})`#qVPYsPKllT>Av*!Rc^r{be$BM|!CL+=wS{OslPjr6St!n&ye zX0ulw1Wd#ljn`WqX{tK*K5A1T^I<7bo^pCM7UwQag+&}2vnPlp_r0!?HeC0?p;{}I zx-}npi`JT^RG_DUMZUQvgY%BQsSoqhTcYMicHt~@ufu{W;J!=SVdNoE4aoAi!T=s~ z5h96K?eG4crwM#=8fRK+HEnM+y&u9dS-dV!{-x*0a8nr@>=a(KvD50hnNMppL)NQ4 zKDbq_Zzpd$iL&c*+%1XM(sYI7oZ|KgTCM_#(Kpo2vpC1=PDBToDZDWY*8V=a*OSNj zI`^~ybad!AzAyfsdYB-G1wv3hkJA@JtT)%0@V+T_53EK9sY;$%D<+(0t2bbj?OQjw zwB?^W^Xh?HC?NY6eXEF@ZFED05YnEZr^ZsEKPPD|RaKllgIZYIh^=n0Xd^e%fGaTX zB~_z??&7gkv1_xT`h){M$c!`s?@z-JkRJC}w3^t6EnW_O=!A+Q1H`!_Ob+a+n#knB zJnm|BCD$Wvx+l9`Z7)fJwo8~n25`N<{#s%=HBz?FeI(3kI9XVfrqGAvuWs~s`n(3k zW-TuZ-TbO4e2Nwkhvie4{-pf8tS-C@h$@1%Rh6JoPqP(=P=$e3Ch&~Y}ATjx~9RzZ~fKmH+O zM0H84u%rNYH`4es5!zvH*&$bpwq*;FV`|=C@_yiFW3nRTgPVpgu%z(Pwmo_IDITT7 zZOCMb)eA{Bu#aNBH+*?oahv`4Ig076L-EywI}!i1;~XGth%+O3qS+zB4K%M@ln>D}fi8_Qk+bKRX$m zy7Jof?1S$cS)$d%kF^~`pBUYlL9=gK^nJm6Lrt89Xv1ewoF3u{w_a#hu1bD zi6Q%AGir4d2^@DNVkrh}$Rqv!Jm85+YN>uGlwq+%;c7dD z=V5c`T2{*Qmp4WJtbBn=%G1^hHt13r;var0(m-sZ8)1YbALe}jr2lk&rZQnr19Cst zB9?7dZYnG^Icjr9>+K&HA?Oo3csjYj?<)xsk1u-`L?&Ld=2u-aujN7?A&Uk&Fa`J2o@?k`X;#Pbpnlbpr4qSodv&CkK7V!_4} z_={X6Dogq9%WIZfA;CCHXbZl*Xnile^9|ttqRw=IxY8W*p6}0WIil=T9WGK42Rt8%|Cmd z?Ukvf2z1C3Cp6|-jc-x@tMj-$ez#gIvb39rTZM&)$ipI+j6+Eo&hE)>!~*E z;h0$<#*whfR4eeQ_$IUbuvNQPxWVHfmR566<4sYG2)-3(!ANG4O7248%Pl3*bl*w( z_0&hg>;G_|wDt4nOG9DaNOkX{>>j7@-pY_hZ)CZnN#BuFaf_Ztq@Lz6Ss5wapsN{- zXLBtlb?joRp-M|s546A`vI1IV8{#-e&9~!+4DnEwp1#|luLLa);E-NZiM97Iz=s;! zl1q;(82116yJA$F9+sN!u17$@_i@J)j_IfxbcHco%Xh!AL3b8epuwdErw{|!e+^`gy>Gf zU2!J_M{OpFrgnJMTc~YoSm};W%KjFEb?Rjxs{vrZj7sk?X~{wLIk}NU?RY`VqH5N=9mYgD=fx zo>&#bu303B>ye|`;xFxd>GY|m7VQsude4FNv25<2x#8&KsZW%i7P%5d?fumC2+?GF zH-=Bs%$d%QUq|w5^mn!w*>hJcWu^>~kvL(c@yk%i^r?-i9~wY-4fmkuLo$X7sW zI1y*p&!ACf6V@4!8f(%B_{GJ&Gb;-q5h2Xgtc(S|LTiyQbJVe(|l|;`-GGUH4i{W_&3% z_yFf|9nlg)x=9~5epy86-$4Lo)TnB{J8;hCaK!zEIIq+L&lF1RI zaP<}Tgf?SqXG2Bf`a?!v-I$vhaW@+GQyC|Ory>=RvqP|<%O*7c3xa!$3r4p{{5{PG zL&M#K6wj`XW05M8O66q>KJtrAmI~;NbDHi;W*bHSwc*rDGp2nGxZnHaj)gUX{$-pW zkG`A%U>WtGf4`^F&j79rrYJySmpJ_zMVt}8@ePeia^@_Q?Ui)GcRXe}rkZ7OXD-q^ zoAaq0Hk!KKDe{*QHL z;5mV0un5Y_dA1hIYc!jRElw@rDlp)CJ)4hqc6N)c5UW;CRXOk6dJ${}o^>+$>@w3P z0Zm&3HJo7{f*a4@jkc5lTsoYf`iMp|j^yuz#Gl@J1f*a6*2IcvgaT||$rZRg zIH1dgPPdVgvaxQFOJHb%@Dq6hoxbhQ6cv1C8svS{M3Q2N?7pP}^+p3vR~2-Ngyz@~ z3{XKhM+UkL^EpJGEb(&j?6Job5G#YPRo-J%WhK%upFDY%8ps_rAA%;imx8i4g4M7l zS*8l}RC3L+TB8@bOeQ~;ZGy+GLE0uqKKD5L$oO| zP+Gs#*+w9XbZElmQNHzm5zG^bTqw2V?#SLHD2WT96zgfr`7RMA^a74)(EwjVr`KoM zS}c#bMthEj9tc4RLCXS=DGYy6Pt{N0KkSxR`9Pw*^)E|L})@?S~|2=!F3L@K|-At?K!Y%2#k zu}%kia|=kWAVmwv=3{S3f^H`Q+!>hadhl;HVA2HLGcZ@_Jlentm@VDur~K9^K;Zg6 zH52CH=PeBK#{_S+3aC5vFWc%?;tnU_TSKop4r)$Ji zw^DrkZO!zDnl+ij%fCW_F4v;NO>iuovRwV;#~t2ARDX#Ed|7lIwPCA#vnhSag~qyP2V{+xbMZ zWEh4H_0N2fOx)NZ8%^j;BO`#IE5zSkqSKaKanoEYUo4dm+ZD(!o|i+vUkH$ZSp~`HQBJ%QM>IzJVAoepG(&ZNoKoD<;O585JuCsghWv{}BzHMGr2&a6+!l zcPajJGf8@?U}gj=`3c<0yPOHSxVaUzK|W;FT3CQe@Upm9fw+UL{AcRe=b~jTAZ{=# z|GKDp$FR{lA)#j8bhyX30;wY}S96vh7( z*w9ro51&4t=AXJqtCgh2EJGVri`Qf8=lI4f;Gj3H{+&&&GylA3*^%nMM*p?H({6mf zTVsEBM%MDR4A`c&c%*d|oR6N)I91KUFAcAMW&9B{+<7{quSv*s4;Du+|5AuKmK9PfdSFt^a4uwgdey&6*iM zUXfOR&`Yf^%%iu*^X9861PZsMnFF*2lw#^|u}1}Pj5EC$IXdR{$1{aasfmj>oXTtO z2Hs+jeU5hU{cH+N%H!2F^9Ak#wVT1YWOmKU6;>9)lxq!+{qAq&*qQop-*0Qv zN-U{3S_~{zWE)m*TTROTrXOsDeb3pSONBl>Obw5jr3=vs`jU`L5vP#X?~!?c^+FlW zG!uqdpmT&IPu+#InWyGl#wCAfp?x5`{0Ypb@x{MChbu}><)+%=XFiassXAKf@rxDQ zXnIOpajc2<^AEa*@F!S!f39pyH1`zr|y@*+BKEa>)zQ0aZ5vL$m{;apqD=3mq=#Hg~rfr(qqxsy^d zpqIv}R+AEfQ-%vjr5^zpe?SFryub4NrWx7J?o>bXtKl3~WN4JII>&BL#*ao>@XX>B zs9cJ>enkFCO6>+H>|#@zfIZqy67w8ZWN?xQY08T47C4mSG%UTpe=H?YO-k%TeAew| zHg`crS{#qB|Q!+gbm9zP5B8ulfS=!8az4lop>w z;JElB+n)qnA{@<6$i&y8ce zgz>y5l$q|l2jI+LvOw{*g%n;1OnTTV;CHt`(On75QVNy!x{@`~`4l%7%=+a1U;7li zqrDO+XoXzB|5RtByb>7W1Wj_@^J$APo>C7hsP?J&jNq&Ls`x*TmRs8M9!L|G-JyxY zWLbB;^GWu$E0x({f6Uyf&!$i@enegep$+i{X_*nlMp8*V3i0FZm%I3+ZW)|L4*p7c zRpmC*L1Wi{X@_qeVdl->H|(FkkPV8Xisx9Yqe*Z6P>&eU)arClFokAD!VNv7@Sx?h zIqHzr4AH9xn+c_Kj4?=5c?~m#ko--uGt%Vo16`v;KOHJToq<-f!Ezp8{s(`zz)_+3A!Vnv>7a|{c5(vAkyH*IDi51h+|Ga!v>8!d`>90|0|{Kcu$}K9GNT! zc`VEKH`Sv0qg6!z!_ z`b>ibvhUtalT)24=ccE@2;b9DMf^R&BeA(-g1sVrUMja^;LX_d@h z6zsjoEx?mhEh#s_Lv7j9UixY==jSLegDIonB7{VJX>((pUH%gb|Gw3n}x`M6kps}6Cw$<3S)ugeVG{%nA*luhaZEV|(t;WW8dhdO|fA(H`7LwmN zXRmqYnKd(}XcJ<^k`(}+43!F_`P6g^MUZkJU1C3pgZ8O<(zjot&9i!)bO{+Pe(LcnhrcPq3tEbANk)(l7zAb_k zRV5Ap1wb9OPR`;{YdVAq>i7JD5_qDiNWctE;|9hiA8?QF8VdM#N8CfMg3Bm`m~WDW zAO;kL%d2XEJfTfTZv$^)SWiPEy>u7kPQ+=cu+D{>C%jGYG>U|i#PeEJhQWy}ZBUxI zqnYX?BGA5mV*CBcs7S7y8g+F5jDCe7$8b2$krAdso`49YIsC?cC$!|-J_sUM8*`dF z{_DMYvxfKqc$@FmC!@x8C`7?Vr;rzCoQc{))@8U%zf?;V7|_#J4$;_=~(o-+P$iSE*sW0yZ!eS;C@B=?98ax1WF2ojJ|K7EOfqa zT-nUWr|zJf@cf+I=~q-^aD1xu{G1KS2?kxDoB$I4lN0`@-2~-?=Vt*>PN>-g<%H+w zXi!e@eUmll0_B9;J3dfO_!q$)loS5X1C$ed-yqCb`$T{_m+^_3uXQfVeSf!m#GGCp z?o4TazYM;0=EaWabJ^h!a?>F6?N6k+qBiHU3hZI;^8+<_c-09snw@6hYx@x@hA0P^ z^IPzXQVwc{FF}3{c~!W{vxshPqKy%I4WG<3w=muqL>P|bwp9Wf>XQBNem5c@aHZ!2 zRwrMZ7^(s1?Rb_^{g52*dYNEsDjHWq(vA^xCJ~Y54g7|%`u=p~f%tkV+cr=wt^H_} zk_2$0HwpcyR);~;Oe~?OOCjO`=B=gsin>kCQTDjMKYxLg$)~3XPx3&oPKKuuo*Q0GFIKN6VoVd(%#KLNrjl=_om4SaY{^0g9{suw$Y&x?H9(A0@ zfTv7v_$`~LCC&iRK`yVtBG+Rtk0i;J`T8#bdF_x-@#u=iEh#?)Mu-W1seo57B=ZLX z*h}h6tNE=dMHJnRASw>GE1X#-JbptI_8dY?UTdHhrYZ{=dGU7Cl>caFqTzElx-ODK zYj9$*ew}(!&((GvD+_x#-naa4bn?i@5HA^s;Wl?IW=7c1q!wvL*vW-=;uSkmI#YWmREH_E3(P+L#H$45(Y@B)j{_9GwhT+Yr&nNRMrI;y-PZ$|!m>I|woqq${?wKd!~^iuefkzau3 zv=LFyBKzJLxS6KqT=xq*FGNaj1$gtZ(O~*s1-ocR?euK)fFsH;EM5o`en}rEb~}jS z;H5qs(rqfqRvzUZbCaGNs`3@I(B^Ctdt-#1X%rcCLRA;1 zTMBhG6f$ww4NE?A6f8Dl`<(S$SLxt!$yF%iWusY~91ms|enu9w$||<@HL-#V)aD`= zL7Zb^2sgV5girbzih?xMij&X71>P!Z-5n-d8##x^Xc4>!Ya7(d5rcn`dzcB38m(#gnopgu3 zG;l64RDD9Ed=KKJ8ka+3ZKpIgT!re)?fHf*j1TzyHEiynCK|sqTa7}AjTY3n{eU;@Ya|rE+hH|Xq*iE+cbX=xKQ^<&l zM#*Zw{m%tw`0%O4Jmsn6@eZqp2&LpuD|w5$kVHFhIdZO6cysnaL@H4Dkjq0JEA%HyuF%O2>Sc-E%$-T+VA#0A=dn2(x`$qS~gkD46Y)Z32*5GVKw)J>)$ zcNapkOoHQL{0J5B4;haC4o;=-FN0%vvkSpsI^4v)K(^WH8+;3n-CKGKzWBYf5T&*a z3Go1&MxNe;(8Q77C&t*9^|@+q*RvN* zrTbN2FU<~$JbbSrhTFhZ{rWOLo2x-|Z6!x#+MsWoUXAX-v=dB#%)lDNLlhpR;>A06 zVs6-Qd&?d3jLUV@awi@4*60k~jYPu#4K?veyVzU#)CgA-`bEzekc~=n#>~*H(_V9K zzRBi=A};=lu9bxAG{C$ehb~)q$^yzj%CkylteOo;H#P}u3GUR=fs$vr+gY;QT#blx zHX}b)%GIF^^S9^3BFL|HhgIuvKKsWB!jY!A1-O%gmN262)G$lp=J9ZuP@}6t393WL zM)`}bsh6QvP&D@dio?GxHfFgyg{-oMw_!oAVXUogAWX6T7JV|4E%ITwN_jHpDQ_Q< z1*D*4qITeVrc?T?@Io&Q#d5!OKw1!Hdqe@fla6 zMHfVxD%E|vSvx=^LHoT3lSEb(lM6+P`m6vxyn8Lt8~epd{t|=gQV!i`&sQi<-|$jK ztA{xBTY40+mpIQCNRJbB8BBT+YPV@8y~3?~^KU8?2OOVW`e!>S(4@+tP*QK@Y&QCbWePINcp;A~|XgM?x7COA-! zY=d#T)iL5LsmO@dr^ITF>Db04RzZ?a_l_IE#F~#_uVwuex1vBJ{Qk2`O~_yG?w%{m z44&61o5BP<1<-P+0IAtjvi9$?u8^V~-AAI?;KX>q#rR}{y9rJHXOcO~Xg#(F&YSZM z+=A$WCw}^m!S%Vzp21)EFbIiY#r@ERP=ANx?W3pAVLB+0jaMbE0&i=%?EcO)smc#| zf##GR0@am4;6VJ>qpyOO5sU%?2}JII^0XWtHWp=xW@!j|`JeNw>pzYjO5Vh7s&GWq zl;3CpCx=$<8G{6tIq%7ys9T25syVj|ZMi=|=ab(qvqv$3W=~ACv@CeHKI&Td7~h0I zi1y1zEC|s;N*{wIxPy)C z3d<75{X?|iJRn5-FNE_yMEgIFe~4BXg7VS-yG6`l28MKt`C&bdv^s)BQG-e$hP15u z6ck13&s(t14;>MHQb+ausy`ST3d3~@i9 zZXp(j>XHMklCavZ%v_Mk{J#WB7IEzAo9lT$wR_ zBbh@uzwmixh0Azsa?ooLq(l`I;*8Q9ghqZ4hnNY@Ny@neL0Q`m%kaN>3S}yDTci$y zybgjx4IYR@nX~T_hRt$nGxkIN@39 zDy&S;S0uCOl1=g3S;X3F0KjSqZaDw>hEf zk%$NJxZ^E7(z?=WT)fd*Kd6&%IX2zMZLlVZ-Ydr?d9_A@qCZEg%U#y{NRHTaqEnXA z)&=PH2>BJ>4L3jyx=i^LHlAXs<}{wVD*Bi^e9#*jmDzuux$j~FjxRR8b-mS0PJXlc zsQCOdrfQT$*Yv2_7(bFvN!u+llc5+@J-w;gww*ll;$-apj_xa;u4)V_O^vV#23x+S zs0ziqLezMz!ICw*+SW(Xo1k)t)erLA5w({dF^&wyM&WT0HAu=1;m6i*=?qXKLltFOGYVa&y^D)l4+ z8ET*=^`rFjuXL|9`lb@oQaA0rZ+5&4)`$}?iGlaUGce9Q@-kY5p>gZEW|JeekK6fp zi_v9h_R=ul~V5hnrwyNITfDd0Amh#XmeO$GDK zpx(aH?9E7}DOr0p>y#al56f08t=yep#_3>Lpi(eI;&V!uPE}h!@i!*2{9I{HC>P~} ztG`A8A_QO2P@g4Q@PSXk^8I*mhaXw^51Wj%#Iti&EGI21?R9R%1Z;*pQnYux5eXXElSmdkN!&O#!9Z`p=X_l zabL%dbbi;BKl-Wk{9>`do*c;S8&^BKC0+3dyzmkZJ|9El_oeaj9p6y@>?RJld|D%u ze;$1=<4j`VZVE+(h9Vcge9Nax@)=_;F{b;dBr6`}65mf1V@>Yb?pJ@;#87*xla$BG zYI}ZZ5P%TERu(TaZ;q5_w{J^Cr{1? zz~i=xPggMcWT4dEvF81rdVYR!mT(A6Jlfi+H6zRaTXVjZsVmGU#!!VZ_`RcOGt{jT z)KQ6iHTnY`U>AVlA+M}CA@iFp*U-mtDa%9Qn?DQHd3JX8B?g$O@W`!t2_IY8H_AFK z`s_tpffBkUD^A9lVs3D|QIgfRlvPYXu1fnHn-1?#Yu2_EGc*WgT!ZdwcBo^pEC#h} zM|S1OSf~+>(=XjR6{dD;D-ZfUEz4e(9tv*wURSyVo(R)i(EkIaqejnOOgMi^sXa`W zBSXrwFe#)+x zcqB5hX=CGCmdgTt{*ggwijJ7GSsYwj`N54g!R(_!is=CLjz{*tjqyvYQ-g}Z<-jjf zr;5S-z^hXgOTcBo`BKwLz|FxKT0Tm^ZNS0lQfS-`ncv&z5;zf=bpEY%hn%8hFL zu|Hf(;>xvCAE-K{x*4BH6P(z?#@G(nrn#UyVTEl?@8z+hg`SS6O}Q?QNxdusCxCcf zNkuLPrviUVenb*wTfgqC4{d)UJZze!yK z)lcIa07T;V#4OGSiIxp`Y0l~7D<*1Okb&_NKl8fmEMI`T7eY_~Jr9Rl$ftqnKgw|vg~zj`Kar?1L#GMm2PcBQE3 zg1j>s^k>AK%~0+;_-bO8C2;PhT9Wj+Vpg!ph`?JehvPr+V)LROQ?-%%#5z^mrR}gS*Cf;e`Jk)Q%Y(tPBlS)79Gw%~k zc5gzkp4X&C>oMA7vb3G9sAqne(4?)PU(MUbFI?eaBm&uBp(6zwVMYxfrU^bjRo$DXQlMUddVXl-fw?7S z@!qqN)>j=AQvovtJNK1@-mSA2)!CvVMDoEB0qXqp8zl$_+Urqs-Ys$wnqb?&AQB8g z*^RTp7*fVEpEaym*zPY-gcToguw2Xr;$?NiHxLs;5H(>aX!%2i7GBdooPqi2k&aq% zQphrz<1J5;a%?(5{adQDLEd{3D%NF(-t&i;qdG$4OMN0H$K?noc=x)TnBoy+Bbz2c z!a6J}*UhurN0+=ph@q)t@Qm$YRniHP0V_!}?4yXrjEUpu5T|`7SubwxJPU-s81B7r zV2b^JECJ)q^Iy}%Z?>vX?m#tsxm*1=Usjdnvv_hYTetzKD9OtBS5A}LV=={<+B^zt zi6Ac%`Mn(P9At)sGe!S%{F5i>831<&Ar0it5aRt!jpPaM`DCJRq zQT$SCapWAiOGNC{3{v(^*wR92*Mw{%iAqPGsiZ=8ohPwrirS_SBLO_U#0ys?9O3b> zAi|GXvy%8YkG@M};B=|QWJd*hfjVATcKncHExbCe_)&5rE+*ABvS+@z{NL$^b50D6 z74Kq5gJ;ABx1X{6Y65J9!3yO{*2_e~r1FljuB_P;$&9${sfvC~@{rC^P8rMi`e5LP zj@;}x-B{b02bES_d7LPO_B+}w?1O;oIGlv z1B;K|Gs@o51`T9aw0=WueKHI{MmIPyf0B5$>KrSC&W*9>_X2Ef+m;GtOE$c|KN-eK zVKKdaLm1(8nz5d($h%YPpSuuf56*4C+77IVWzwpgv7Y-@3zH9z?FW1xd4J3wrR)-D zS4SIiY7DAvHPy(hXPIwL;(Gn|B?x;Uc45rz|h%W-uFx=!Rwk`v{@OFbx0Z_ za3is)>mFnCTmU$=ic7!L1(y}QKR-hya=wzS{0g!z6>iDC3(+NR3UUuVQ~PC)z<$Fl zU*Gjf?A`G2JKOK3aX&g4!Pjx2;*XQC8bLMBO9L}OEVk)XR!wY^HKqM%C4?k4@Fq_O z*cU#0G^N_7U zY%{*>Sx0BbKa57%i=}Lb!qmR0_0^jjm74LQIHYd58HO6EXs-LAB@uyK@`_rR)4`TJw?o0MY$&$dYW3bW&r=anT}sNpeD z3!@UF$I|SLjU-%GG`Ot3o@Rfvgp5{@aVx(o|1#fol=povXLqN7KcUeS6NvCh41rCBNnjrTo#Ttr(m4px*|QjSc?1LZT&Q`fljWO zso5ro!y({pEF?>Fzaw`)<{NgN%=UIake6f6x!?b`Mn87RR*OCgt=xr!iGRus1xwmB zHbOKU_8)kf5oc#YqVX z4p;Nc${1XOBG(9otu}xN1_s*U7>%eE+GDHE_762IfXblC84OEDDS#}loOwa%|H;g6 zg{24T*BP0z2&`&43g+vUe_*U(;1_buR8*V^L2r!JFJWMdyM!Zj=INp5r-mKYxsh@l zstVhY+pVJA#@8yJ7|0A+*%=|Q8&nrQ)#7F;ix1~Nx_%}7(Zd~=JJ6SSu&-jVEBr%g z<~MIyH_%eP(V*L^d8A%7RmMB!Qg)l{P%g!p*1qLd_QIUgw+Kbv>U~&iORN{>3tG1L zoy(Qfu!M8%2YAvmli93?JQUl*bX^%N-S|UFn(+aA7kH-fctf1f-AcQH7oNOcvvKq| zq&JPd-#}#QD;FX1&?Si+@{IZez6JS^=|v2?Iv~5>Q>sIyoJQ{RnK$nqtbcbh;X!NZ zMbPz~s{T%Ul4!4cLUs4cVSwnkhGTsz%BMWN9<=sd*I?W9Pf}rFf5hq$B%-2;4?K9O z9t>f1Qetjfc=Ia{y^&HzW3)uV@xG^8c7eCcuNH7RrB55pzCaNc^DJ@k%6DSWou4}= z5CMO1R8+#@Q%A3Q2HPlyixN~e=C)O7CqME6x30&)He&nw7~WBOQqgulxOsUW5qR`m z{ya79zY-VSeh?t1`MjqV6lhX!e4O|7k?#RzJ9PaY`QHVcyGdZ82EhxWqC-3lod+?T zdq{8)oqH<75U4CxIeW_^l!jpn^oL=Bd;peV7&V;&GGfH*p82!^h$q816zKn5%2Toa zCoNJtux!Smn7fX|p%f#+#s7bkMS9Zf9unel-50d~nMRI9_^`w|&o3H;@N+8SRyh}4 z_L`oA+_84a+lh6W!3-;0>R9-APBD01CWhHE10x35LF9gdKeq2z?aW{aBix+^NWzQ{ zB|A6ik*r#CyVIG`%)nvE^zg(V<3$tu;x&!qSRD+&vZG5<9JmVpp7hI)k7*Z6I`@&C zE;ufu!zGEvs|=<5u-rlqo3T<*mrjpSZIn?LOPpRBwdT`#dcs&$pQaKk9ZhO zy9nHv8TC!<-E)Vx1)K0NF_kumVu#tLA9xxwrQyzcgFDv5u z&x(1RJDy%INEegowVN*!<{M-$M}WeB+~hXz--F9q3{>|IO?0hQ5Lk-G>--b;{}jaE{B+B z*aq+ZlsPuNm0v;UC!wX$UM|%gv?QU$d0a~<6{8DXb<1kwM`Gc*`Lc29D-fXZ0+Z7A zxGL!3n0^MqH=?=zd(Ca^*8T|PCuFQcECC7&6~onnMM^uCNXi-vFUOP3i{%+&uRFmP zD&`%Rnm4S%Tmvn?sn6WWSvbJg#bXWSOf4_YZxXH^l-8GYOnR<@ccHE-$LCR#K*S^< z+!l}hXXHM6nNJUm>SV)F!2+){_>;S3uM+CTmq&A_tscCT!*SqkRG;-co@Vo?$^Ixp z?t<~6I^ZYv-jwY-CVYT*&OX2L!K6hB{%o^cxjeRx4Ttq7A>__SdFONNn}E&3 zu7Z~z=(oMrn35teyU_&T_~qbam1cGder*r!;*M$Z5eT*Y9Ji3M@&~nw(1zk*7Kth4 zH+_ISHpQweeb9otkj)LVBH>+{8q)<9riyB^IylO`xYf_mjbpW_i9FF>>n4L|8Ucc8 zNv@8>O=M^)OX)tcdP(m+Bh!1SJRGV5)z6nqs|6U^!hM+*)@7Z*mzXfikd_rlh!fOD z8|9K^OIWv;y1w19jfsnUqC1hL1~bzA?Njr~Bz|13t`SbKtdJ}D=EjB>_F3W?5^;l* z4g477g*gvha+4Tie?rdOa~!K>SkE=Sj#f)a>XrlSr(h|Gtv0*+@KzOMInVXApf^EQ z0-t65=#A!*;8M_Xn{JGYk3yyP74mI#Me*lKvPexs1PPUi4A)1h?D9ux0d7O{P0F*= zIbPEldt$JZm(p)T3@qy;q4@n3ZdzB5fYDiUo7vvb$En+Dl|BEvNyozABcP!dvhyLb zWU?iM_*w$>9wbud*x%KN7M%CaGEW@({8g#6tMO?O_LKq;G>Q^B@5KdhcTr4UH5N<% zb6?JDQy^bf?5_RL25JUaMpL0LE`_|o+hK3yn-}M_vHWc zt!d2yg;R}Ly&hOnL%5)}Zi3kI+K;dAOamaB#=}2DO$z|8`aW5B)a)ivcO`F0W2J6j z3TyTfc0Uysn%JUs)WZ#zb*Yh7X76NS!`AgFo!up#DU!S7;#?&f*1wp1(xy!^a51J9 zF<;qEaDJO3dsW)MW@eT<@WFF+^gx@Xxr2*KvXUYC6F#P1 zTX=!*a0z6Gfcf8Cg38N{AU@oq{=vZB$1Y?D zFf_0II}tDpjA}GZS-?jWG1rY08kN;Q9K5np1r0JBw;PW< z6%}+B?gu0Lr&t(^{IBfjdkuYq#Ohxm7mC}>Mj?(!Vhr{lhdbH-SXVa@|9b@aVW(oS z`p2mngYhY0d|F;n#WaL5@;~(lC%SI-4dm|LrwDt73CKjgj(7=xoBlp29!keeFmZLQaZ;EMFa zl1VxW;P$j3B-Ws5D*K530(}Un%AMe};LxdFo#2eXyy9B6r}c7A5?x9l`FM83sTcw; z2427?ff#gt`}&i3zebC2mY#lQ38TRC-Tp@&elb~%@L8<(B1a$vRfB=`jlTICKQX6e40X&Ye%|v)cc}iS5%sgJiE#9x5SM^T)--4r zg+&jr#sV=-89xTWBH9N$4Eu_baai330qOmQsAnclpD+uvIKF1h#$6PbB;v6Rwk{PL zDiS})IWw`LZAutJ87xL=ozGPCsg&k)n~mB4TP!6Gw`egcf4O&- zb(T+Sdq6=gJ9m`%GCR5q6J50lWQB-1(_RNXtU}z{wy-pO7h5`iiG%YxMA)aYVNY)7 z)+Jo!Vhd>hvXHNp4qIH`5q)x6C#xiep5n$z`)-_4Beny=$My<1Mf3u%bl`19G?VLq zJF*pi7OMYros6}m*(FbE^q0)yzR*^5QoeM3t_^uVS(~2!3zQEgLKwv-lqOI70m&@=dtV6SKQ4_TLllRrIS}cX=cMf^YhcI zlGM39ea}b#1?h(x){^Y2(y!C_7r3^cs%<|XkF+x$XkFz=4>6ntNe}0|cz&uZcsdRK%y8(Kyuq zm;nE-R-m!nCdRcuRTJ_5Y|C1+h95rBVs%ola4IFA%4pW;<&+GNTothj`WCWKZF3Oj zPH;COI7&NZVK@s=`spARcmdcj)^1JPeIgmhu;a$lYFvd>^LG{mKDu~Y-;1o%j$b0` zmHT6uq6y!!A{H^1#~*DMh@^nH)r5P)!})waDm@06pyo6rZMb3$C<1zdr&#|3)J0`7 zp4DtGBkmJpQ4+J7mi)G@YHhOvGStuS`BpSD9G3@3@vhUqERm$!7PmHrp;3NZ{VL=% z#O`kV+pJbZ%*DJmRJu6#z0l&lP{2i^2{~Q8WDzoco4Ne1sm!%o1l1BSnLjV&{lf%( zm(c#!d*7m3=gxhEhvglaV%wtdSC8#=+^eO+{zlwWqxcYmQ@JyLm09I{vsJBKYTT%n z^%RYqBCOYr=*p6F)Bt~5Zq?s_U}#m5yj$~uQ14Gk*);iF2gkVsW$B09J8wPNL`^uO zU|zdHL;HjI?$dE;cjf>Kp7jsTRWK{f#FLb2jPHXpv<*DlpRR+x!ff%O%Ig z=MAqD#CVqK$~y>1K>SUv2Y9XFP8~Z-n6TJnB=_Mw2ZG?R&S9$W@S){zC=5uM1cBE2 zDjo6rQQ~dt2z*f!!{Ov@N!=;nVX9}?$Yh#!I5291}@CtKRw&vF~#K<^ea?kiMKS0(kM+{Q1PU{{Qv zm;ks*mnm#yodI1cf=L%bB zme1}&4&Oo(sOpFeHXou+HN{2aj>zul@NtH2Yw%(3kJJs6z1P0Q}Q zXp1uI_=^^mpPQdNXuZzNFv`S;7`2kYX6#jx(WC!TY*vfruBVZqyGgZU${ZEIN3Zl4 zm1WT>W2l>GE8yR$+dIR-V5y0bT41=xYf<~j%|-cpvszF;ClN*Ki({!PG|V`nw6qU@f(Xwbf{jRbE@*S^XZt$^S>l@)t9#Cy^07xH z|3-{zFPtEik<|P5R&y645G9(y>(2EECXaaHIAps}bwdvDKJL(Xy1`5D9#H#J1bNCh zYsKiY@oI+A6Ea^)A4EziaT<&c&?T%H$?}@BY7~`+R4@N5u!Bg)p|Jt{KpV`j3z~Kv z#zLlmg)U|cwsaFGPIbp~S_CU8ZkpHhU>i_?e=K?}x_G|nn!J|WGwB#H3Gs-)(ufM9 zLFg_tp}(tTS*Cr3-V#JXX}J6e!Cba0^fg=Yg?XRwZs1&XhCft+;PKxd9-DXtnE&nu{V!zy z6d-u~U)kOFnvU-^{6SxZt^Xy3lyt}Ue`eKMqW^5&K|k{UTDG)ig+GKOLHwon-iI^x zHJcb6cw&Mcp+UNOiSLyTzHtU;7~O(p1;9k1(rR^3&uNh*#84e~QU`>)wJcbL&tzD# zzJ)TmvobK_UJfTSBlUKqb$hNs)x!pFVZ(~zD5?Yz$L}mFe?<~Vee*zurRdznSmX() zJ5rGyjLG~{#q$TJhTWL3;3sWnWxAVay1bljTF&2$`#)~M76@N7gC1?O56oK3XMhzt zHoA!L`MelGe~#Z9k@1afKQvQBbcD4Ze}oo_i(LnBTB0uU)(!SuE*8q4ce;2vn3{|Z zOiMO(*6RMv;b2D5EnVbPSh3IC@MHnJTjFM6kli#EHio8+VdBT^+ zvtU6>9|{&|eC>jn%U%E{0vkTg4?rZ<%1>{4XmL2_De-75hEko>`^k zK|2Te)2erk{VizLU;4_rTTCFTU$~Lp zx_7L=&BOWp`H=qnc}6+^!Px$f8`b%a@d^keVw|sj5&{PKIfprl(n-EfF(*0mwo+dR z?kur2IS^X+Vvn^tmjIOnoj6YoBWz>iu^LP4MRRNqgaRj6qN;c&*dal@u!X2TxM##V z98;+i#rJ5Q;)o+ps5e^CX4kbJu5i!!XBOCjCxj*?&dQ}LP?~aqNk;#Ya z;9JOlBd;oOpxdl8MHXeQON2!0P)zGbmf@`Sk z4K|$@?fM~UIsq_?Oh*RCE>1+!B!W#0pG19O{4Q>c*J^gFBj;J$HPYyCJRF201=sh19jT@)F_`BWjEAIb@@7`{c!^ z%etl&k|uw;%4tzf)wx_sx)pS&=pXkMH|Mc}D$@{EwgEuQ48*a8!wY$zSwTaR07tqO zmQ<+8zwbhBQ5+Kfe2gfU$*76}7RM({8DCf9S1U@(0(TGUYSMCnYdvj`UXMZ(x@BR! zEk|{F_Enlyurp%ha0Pl${tw2kd=c82+^h($3G<&~4QN24qB(gQnkAPk3;rXMbz+?R@Mn2aGXy02CgUQZ|TKYAslBnl4Dv**nycJI3UORT~Gg% zTwL61EC=nN$F9s$hwXbdtK&U79ez%f$C$Teu=K=z$+g8W`XYU7 z%a^5cERN6*S>N#$9^XXTjS5D}Cp-6+xjL^@D>>vX*VB&7ng|n3Nml$PzB{SOEvUWr z7vLAiS8aJe(oecA=v8Y{CrbKjW04T1UPs2Xu_=~+Le==*q`YaMy+WOq6E+PgUD#^Of*pJv{&)KY@>j56XwCx5PK5+c6?m=TVb^E4F(D3wv;4 zQc_bHs_GkRo8-6JNL{T?Kc`bfbJUQaFJyDP?`f{n2A8Xsa%#9QkR?;E5jYm(h5&ot z!EX=+S;jS){r-LYZ+1_qiTnHG_2PN#xOb0!f|g{(0xvH&$>qc2QQU`}Yrnf2;dk9X zsq+iy^IYa% zfkPDCRk)vyvehp)XoKzKlrBgW$jhNQKjcq6)MbDO8q7&9f?X2k? z(uJD=-Pe|jx|)Y;J-xm)vJ&*Y;;Af37YpPHQP3vVA51q=8u8AkEfSx2S+)GJenVl4 zlTAd<3A0IvV8fi1Z~(Z{w_Vd5O5_l?E5lEPGb3`=NTFM%^tNi*O(y$n=5pkH&Dzi6 zBFt`&hwHSR9NfHK+muzeeI0?4&oL~n@ldK+=IZ7FInos?SsU6OZTMgLy10hi>ue_k z)tS;@&mM5x3*I7pTW&;w+Xk8B053T7(AObO@yP=L{C4BI5AlaFxIYbKmC zq02l<(07{<}69%Jt6N*3)I%8;H{5!bDJ z*s-_gmsr6NoAgqG$MdN=P4f7d%PLhIoGf!LfzGa$zS(i-?JTOsyxIJ?0nnUw(TdKV zE*k$L&<>mu7NHG9gX$j3?doc(8_joGydsc+?Hw=nsS=Zr35>l(ptL7#;m>{caB4+> ztpUT0W~ySFS`adfRbx8lpVH*-_+JudCAtb9=4Df}KGfwfys;(8kyCSeqT4f8h-~CD ztGLBvAeYGfx}fRE;$(jHP4DkLShHksdNQ5mB~nqZ*A!GTC*_`vuFr`!Eh(S44E@*v z6zQF99&BizsMlW6zH)qOv1Zw{NBmNaJ^%GCPFVxGX9-UxCD$`daItiQ*!xfN{2Qm* z3u|;&QhkjV)MdpfZ{8iwzk(Z}sl=phw;xKqCHpa2>dcumbKOR@NX_{HnS=2ChNYy zF1KYddpG0Vl7IuAC$=^J= zMCq%cK7Ghi>7G-Nf)BCG{jeK711Ql`0@J$BG^(oCGDC+3ss>W!ge3TFsQ$8Bga+u3 z;i=odf8>G1$Qz=VfHg8SL)t#P&)0(XD;v%scq+foXb4aKBS9oTM%I$_NWSD*`+&c+ zPNb0D+hXo549CvFsOcKZO;CCqo7TC9OiG^#Z!SBByl+`6-i%2_^W5VKoOQVKr$&h` zz&D)H@=HoO%EIQdt94(Gu)&o3F3QSj3M};@Qy4+*3;f)LIb4vyhw~32MMr|P3WTzQ zRzCoh^C-?JDQcA&-VbZndhsA}xZ5Jpoc4g<64jc-(g;c5DrYI`9WLhYz72*b4Gu;{ z=Y#hPg@$tYh$`@`Te36*hL0#wtY7sJg=rE6pzwl};1*wdT4B32Y@KV>l}r9iy7W4m zs!`!u8lziG7zcl4>>{|?+OiPg(6ltIC(*Hb&`CU1q68o1p{dbB{#zNwrZU@^RhQ|H zKSo?C|J0!IW6FT@Fh*^&HCiu)Zz=5$uh2D2IkRGbMTtL$y&r@$z?POu;f_^GS+Hw~ zICBMoVp{EZtA1mqSBcm5r>HRVQU&v91e|>|*Et;`xM49gaCj8QJ7DKvDH>GNBMvI+ z5e60Y*j8EjBk(gl*=notT7=VAG=Lj~?l+l4UuDdAGQusNWr2oCE$oA4IVSUhxJrzh zuZ?Nmx1AO&C{~;RjxuwNu~4m{YlEp|i{l@AQcv9UH?;UBy~R+UnSetA{UECT%tw3fVE|80x)6qzgkeBcffUV^_ zYUi=z=yyRg!NH&MN8TymryGNe=lJ8El=88Po(~8qU z$)$=I0QDnU$&s9xlG18wVH5LevV((=_xzmak>?*nQWIltFSXy0$**5Xx=_AxwnpB3 zP#{NJq{L5s%$*ZaJOME%DDfX9krk*Pv8#8|;K7)}cu;Y?+}P&eqxdS)pMu4Or9U+i zk>&pKT!KBN5+ucmb0ft;bp|KJQ8tT?)Ds?t0@O{QG4>!tnMnS3DgUPVKS}pL9TT-PxX7pqU$ZD+{ax7WT-NB*Xf|+a0_99K zzX%u5si&9d*QgMlB^+T8DJr%`=(}N|aS&2@{&`syoYwdg$)fV#siezk z)qfNgX+EW>cnu}p>>L&tj7U4%Q6u;-{%Tf84t?~cmc}OJIKK{vaQIsxQY;m=7bvc; zrlC_eMimDhJFT5)bQy@ZYZ7tt5^5X&uWvJthO+7+!h46-}X4x5BJ= z5=>R!ysx@0I&S$_GkAQpi)G$f*qmWDfA8+dxq^(}EHr3;r5P8J+f&|`Oq;oViQQ7+&ohbBU|;`a3hq}{Z> zVfIa41tnEF&GF1>*0EA@<9790y{PXD;tny41bTxx-HT80oDP&aS^s;yl71!YVchOL zMY!6O^!L1)Q#lk(l|wSZf7x zva#j1SHW$bF%Pq2)MU(ZuI1ZR0#|!lcZ%lDF1eQB6@0ULMBg~?-6;Gclk;}?PO_Hc zSa?HCfo>eE6ffmriSG@I6xssX$KFSm5n7@z3#+Q+B{jCKzv?w#-@De154q`DvdX|9PN%E0SduX3oOX!<3!I6CU1j>mA5ucxR&^A>1< zv8y-aRN6pG#>;z8d#A_b0n_(6uJZ{+j~z7ohc0#aRD`q?6xeLM@4OQCu^ffg-*zrI z_z?IuI3<50l5pkWSzbNFUSi9BIkdMwyyaHxtfySoKW=I&SKqiqk}y<9lNGPu%baz?z2ezF>gEnTCu zhgH>TEpg3$AS<%>l&UJvB>PTft2HgB0!fTV`sZv{H%o-ku65d1Y)DFroJo6L;ml8e zvawa~%p}}bmj2XODTs;pO)^rG=UILj4={9!E?giw!X!6IL!r1YI)>YJGlC)ye$Gj8 zp%0bR1%VZW>EqUYY$CkLLhw#6yrK2iD}bzM5&q}R_>ZY6N>iTQNbN;{Y|GpG7}rvF zHiHdP2LDbr{Huf_F2?0YPh~m!71y#2c+Hvp%gN zD8OyKzp+q0xJ6HXKh5%}LqjIw_ngtOK%vAFt1c_>UpAxLAUd`i5x>Ro1yxmuvz31+ z(UEwCGayDfhr6Pcf4sjjl}KsHl)w@J8DbZ^=}PX&CjzYf++4s4i2zI$UV#_XO(#1# z3t}y`7*^yR3w6-Wf`eGu+#_AVl|5;K?vZ6+v2Hqt+h){hi!3yMUq>5ePz%mcb3Lb3 zr@0u};$BJII5eG;sk=F9L>a#JI8gSe18c#90gbe5V$N*f8=+s3OZo9m~ z+QZVm?YC*5c|pOuI|Zwd!+hz;$NeJ3-~65@zxy;T_74xEQcrmp{SOdxApaML|K?%2 zxBrKS&Hg_RKQG|gT`G>ynE|k1on2oP zg_`;@>_R>w^KxHXWGs%|j=XFsLBB3o9|h`|)QGj(?|3w3xHa{jGBqHkNEZc|xmo~! zJ@`lshwey|JYYE%BM)QuZs@m)1&4eAayDz2D=p5&DQ+;JgtV0smW?@s5epR`)gdCt zy^9K*l)BE54Kzo}%gi2CR>xSBY;VJcN5$OHW&XF=yZyaO=xge$f^#3NN zxp%J80*fzfWK#cD>@SFr8KAqH#e@^(%RHK+Wnq378}r+x8uP6%lXISypMhkG8qWmJ z(_W$V&h(h4eTaUtVKkTl`SK|zc%)tSmH(ndj3PjKD~`+UfYz70OWxmOF)~_d{Ekn~ zY)K6wX9_YpU!>zs`2(Q;iG6;T(^(<)bHENoPOI4Bjf1r$$9m&{2vnCYi$mkeNrm5?w+mg0?1;6-{G8|Qs3>85}}9^lnl;Abq@>vn-+OR1*!!xGJF z*TXtTNZq-$8dH9#6@{gGNMXUEZJBG|`=n4lIg@x^ob>sOyV?bBZb9tR-VFDwRg-Wv zWu!%hGBo=g2NB;Oh5#d+Rq+J9MQ*iP=UkJu-y@jMxf4Lyop{m`7ZkbJK0p1^H+n#?G&v0*CEqT|Irrc10$6yA9M%>?`~+9_7hVhvB$*vaJ;G1bF86G-Bgd+(q z=wCv{XC8|C`}-NT0ASdVyI#vLwhAN%D(2eCN3nXlpWi>SY=qn^a4k(R-u9pCet&F7pV>N0vcI9{gw^eq5^B=_-Tv~NE=_8^+G5G^ z7udl{m6Hs=&7Vs@zsdbHRB@DiDL>VXhBhs`G+D$RR%2Fr>ILK>_M%@%-2so9cl|DC ztV$ogBtyn*Rt=ZUcXK)V6`lCAZT>tStZ+A=Q}K`#sCLd~$(PSgFj$0$h3ToFK<1g1 zpUVAEFwR-#;m}m>GMmM#(?-6vNG~3RF?Rzb=uhBg`5Z+=IV!8@d8)`s)r7Z!NYA`B zJUOKWbW)X2Vs>OWJgN6N$$ig|?Ide8B90>Vg3viEqRhz0h$haYfR3utW>WZ-E4i#q zQ5Hu`iN{%Tvfbe*NGA6ZtpqSdREm1ymkC*-)kG^IGOLi0BATm4UW@^3m+FUTlHDmR zQ~YU^(TzdRtz%8)CgQVk27<3IvW zyyKW39cM#0ECdeR>adAtWNp=mQFqLcI_%dg`@bcl@Q-NId3b9rZe&*eUlc*675Ro&C z&zMh_`}T-FoRq=l=#{v016?a{D2CZdBhBAKLJ$2q7ORkA$(IWuM9ORopA+K0ZAAaW Tu#INL2`8`5u{I6jEY1G_`xpnww-j0iIbTa6PpuT6Wg{Xwv+GW{(rsuZq=(gb?Wrl zYwyPC?$y2bx|@YLnucK`iH7~sB$%f21>&p|&Wmu#n^b$lj3;o=T&LJ7EnEjuF)?!a z7y+gif*leZlbjeeGm%Y?C-H}Qx)!Dw{ltDzR$m2Nai=nSx_(-w>GhQN4M%zomB@XB zqPgmy+mUfUpMV_2Vr=$5c;VT$iTyMHR$1W6 zloC_X>kV2p4e(fO2C0=nS%NH8N1(zLo1#Z-rZPJ~EW*#fY3qGE5Z?i7damRwlV??> zQG}vwd9`N8s=rf;LamtXUb{E3zx1XYE9<>DYYCcj+uFMNl>TBw9k}T1V?+UC&CGuY zw3hxfYeP~bYIh3%Rl-tl^b<~8-rCCD`Ms#1L@zEyRYxXoZlH-$O>X3T*Q;PKp-jdJ z*%q5sgga(1j=+Z%Al7|x10&C1tE?gCooF~!U`%g^(Ba1hcIk|yE~8>D2|^d=xn+O6 z+Ubp{&;1kr{5RC#0@^E^;U)+8ZFf5W(PK`Rda!_$sMbu?+A@d*b=`yUjY$sjfV~8h zc`wQe=JzO;u-L+QfzN4?Ajn7&^%+Tt$!izm_n?9p(~q3tu7tI{dOjW6iV7+R`Tg4k z=aU99&5Bys&@$DyK~FX@pDPpa$1By!r9EMgI4Lto+@bs=acYjA1Tv*y;En|PE zQLM1I22ueCMGc6sk&t1v*nIFUxVnBq!*2IMAy&J3l?0+B7g8@D*^M(PoWjrbsDt)Rf$*)#-lqZ_K^BYuY zkfFclPaWRkA{TwQ1%og(tNKq$8`$kBILb&o#~x~aT4CFvn{dN~7~a4m znOx(k;`e>eBUFFP&zKha?S_(gZ|?7pQg~&e(l?*42cBMdfRTjzqXB>h1#mAxRE1@egD|E_ZXZEhCBC3XgLH9a3 z2{h`Ty?9k3lpMIpu;0K;+>$Zwm0rm zvbo1G`8HLg8LokBwd=kF#G~;q3LnxD_4d13#D6>Me#ocXlCxOOdRWuL>oule|B2hA z;LoC;lk#UsESuE0r0*Vzp4e0Nh2VsFq)<65T=~wols}DILkADU1c?R6|4bJsrphww z!L<*nD#Q^~qmEr-O2+Tkm7o?9!ZyaH$!#B3%RwF6jiW@c$!j5#FaMb=xmS{ORUHAx z$AfQNOjFb2O-1uF;kRhpau7jqCn3Pcfo>e9Y``vG?iYFr^g4y|aksX_U^*DbdoC>^ zIBlQ|<||l;`xXPLyTfZ7FH^U3g=8HfA)1}dO*>g3KEI?eR#*G=5MF97=<3rI9c|(f zrP7~5n^=B5&!%VfMi8`TOF6zpTNLShiAZ3{Koy!c9C0C7nV7Ha9O2<9>ZRpi%lj_o z-pcV2s!bF+l$MN3v;GN{U3F8-Cn6G+Kijt@o1Q{R(Ev2Co9O9laC2n15-%6Tb3U(d zmy66-Di#F3-$BVJ7iLfu5c|K*-t9bG zIf7UHR0Zg0wRZg1rpGY?SE^D`3e3@*$!QNCN@6E6^Ls3s4R|rl;}mR$unJciP(~O7 z$KY8);Q*&)re-wWz%h$P&(M4YlikLkj@E?iAm`JZcnwYd%aL>?Um!{DaEAG{Y87Ut z+i}J~6clH3d%TtAf%z@~yO{-XdYpT_w=+Y?f%$67yGB9`@ajjs-!GphvJgM7%>V*7 zDRuGj9}lHIUfzCz&*wXaB(K9)=e@T(3i~s801L@mkVN0~5qS+#HnA7#d!K~Fjw8~$ z?wv1+zs0sEG6?mLVFX!NeBXn}{K`9MuSVMVmE>gM1Efv`UoKbL{tEJRls4|iIhp?e znX$pIfxdY@fYbz7Rh7c|J3%61&AKoTptAr>^{Q{pkDwvzF8*2&u;h=sH|oJ}jVk1vSqRZ3Vr9W;ST; zKoT3vAd%w7ua=J>8H2#Qx6-YBM{5wMN$5Cs;aln>DE@@K@$=Z4U1pLsJ>5+}ph)zv z^X}*xr3=uOYPW*T=?CB^6x;*?^0?1HL)a8nuOv2ppm_D^ypZEW)79G@`(C@9N_s7q z@}%MXE|#Ejn1#H*=*{wd5Zbr250|`+AgCqFqnIfRFgO#D#;6a|56@7ce4?nqcx#v) z!R`q%XUm%dQYidivzKG2s(1vH^>CJ5Zgx@L*R98OU+o1$ zq1kJ92aIFV>3L)55%^)jI|5s9y}uw_`^fUqI(*Gf2&rn_G*co*e=;26eK5D2smzv} z>xu2nkL&h*+Zb1&^083`B-{uC_+E|+J;<_>U5{%hSfrJeY~n)&6(A-WDmSpN=*3x? zd){VvptXt!X_9s}@2Fii;YM)jokP##$j*&U`amrGO=h}|cc(7~)8VglkbIr+NClk~ zpLYUT2WZF@pnVyjWHt_rvP`rY9MMO%7Fc1=#o(>mc;~s4G`a(fsjz*1rCSoS?&S*J ziHNhr0Q*-Iduw}V%K-7~u=ewGO{~zQAntqS3<>W0b{+}IcX%PT7u;KvJOJY*BTQP#EN0pthEaRj=zzWgTPqm5@a)6$*vmu-q99roWS5`yN`j&{|r+1Wf)hcI^z%# zC}!D)d#xUJw&1t3VLN0gjE31FPB&5tcOIkNH&kWqkyc_=4pq#SsSBXM%D;?JU@z%^ zG17?11qxZ&vG_&?`Z2Tb-dXhzoE*n>brDmxH?C4>4?NlzP^|GY%c%UbnO%frt#gO( z`#OfClu2W$23q4dGQLr%enl83GXLOKO=h>=X)J+h7#P6m#^j!?t}WBeT|8=ra*=s? z6P_jTp8Mfp@Xg^GMV<^R$T zBjVsb+x3>kQAz~_|BI*QZ~rBy>t@+}2zO9=6Dv^aF^m4COh3^8k2PZYY4QM-@L0eU`MD{UEB(Yex)2IaI_wYdq2&WJN%bJ7}$_$H;<=5 z0)6{vRx8fhSTnsL)^15$NtRB$LWE%)kR!Rv%WzSG{l2bQi;S=*TT+@fN;~c!2Ec8T zBIWt7!v5Wi`Rfq(iyhT|reO=}SHebApW6d^s;!Tq5^@@vmMdr$94JBAU-)L!rR9(V zGINPhQI>s6PrE63jXtt5kaRS;Z&Y|2zu);Y=KR7K9F$~~2z7eyXNj@qG$$U>B8zQI zG#YFVM5GFTTExwHPuOiF?VZl`OV=XEBx1=rY{aQkp!rsvCRu`V{xF z0`C??-%6Dpf^I-nlDjen`FW_W?ux360wlM&!^c#bP`-f9rPD%cP9$NbK7hDzP|ish zt;CkBkQ4Q;YRB@Bl1GBK8uJ04jN(u3LjE?s2K|gh7e)>#w9##a2Ex4K2lq98?scrrH7z9U6IAHJwF{N zY#2pN-SD?Ieksg$?kv_F8yHpliXe+r393cWW?2Z~`VMtYSUvq^vl~Wjw$Otq%Qc3$ z#AR>!)z_Ab`?d~a7pYLHHFk6ySVWe>NM8NJ2~`{-Z%fJ8B5Hz5`yQKe`D=s7?H1#hrLV>aVlXUyb{*fE*+&(8)AIsq3$P6*fK`^?;JcOH zAWG0a8S;J%)v?pub+@oVaGf{u^o3LX{*SDNOk~Y`Sj&i_1QUMB3Go85Z{AdCG54?g z_!ALt5k~roM(kfNOViNUDN|BF44-frQKH5`t{_@i~Y$zHU$Q;cBm`l~%Ga@CVlj^@c~N65r- zpy?bme%gc32legVsuN~x%8<$tmBeFE z_(6h{M9JhkVzj4G?IlG>=MfyiZDZ43w?ivvu{Dl3FfbcI3~+B)tqS>T*GX9#86f6d zY56eG(9E_~nLPOv$Qj;q-)RNjAsf`-e&7+cwg-u}7{^_iR|bWn4sq@~IzvOrV%i?(nlK#Gz=f;_jJy5s+tvZCzAvo%`DQ;U3~Y%#tp5^0Dk1k$COz&bZvVep z9O$KacT?7KR5e5c*fhWZ5>eU5y%X=D-ysYt4a&jda5#R(8X#tU} zgHSF&Fpr?uj}IUlT67tdYX(35Sb^w)oZILH17!eI*hi1Z_iaU}{%e*CP7y?5T0q z2yY>TQ%BEl=SgBDxt`WQM{GL2<-1YF>s3kAB&ll=(MP>QDkEIEZ~QE-iDMx2VjouJ zZZ^3uB6}&Mfi-b%^`XvhM1^&H&0D2o&4dVI*;%gI!X!m3YZm`@Y7Zc9>046 z$NiVgDI4OfoxgjEV#uN!qb%d+d(-ejWY-6WHsrl&M>id5+rjPu`7n|Y|1Q+L6a-al z6*xnu9kn~!Viwvp!0hwQcQN%wj0G}n*Li$3{~@ielXt*W`3^N8d~dq$exclHx3p}~ zwW1ph+!IH6$8MOBSAl-3ejPa1Mfgr>A8apBXtK680MjJa|H`s0w8#z$j9K;AQ}zMl zPRyklCfi78BWvsg2$Bo}69b^$y25Dyug&()l%U~;#-}7}2PbG3BB^5F=@PQ3B&dpli z>OKnBvX&QGoI4>h7U?iTm$=IxL%gFimDVU0=-z#?z+Yhpw5d_6j=5uWYA$Rc*Mbp# zj_76VDmFibOh}bs>g`V;kIz4;YKM?POZr{;cY+6mC{kp4inCW;eC_&G#HjLe_%ySb;8zfN3 zhgeS>kV||_t&82xz7Mg&kC-x&=jAiG)t$h{6S2ns5w!C>r|lZLC$T6!1T ziR`~r!Y#Pna}H9jqd!J_U-TPJ6(=k z4>%P8ExVDM*Dm&^Hzm(WvabX`d*&++{1iGT)?*!Jn_m6k;A+3xueWKf&qCS1_}pxe za}$W{auV=>EgREpqSj^enlxkZfGu$%cGpHD^~bA6eay-VEHm|L84eDvqT0hbfR{VG z_~!=t+SR*iom^t(Bet|Rt-(E=AX`Ty$;{^i(yKw*Wh7g1tV8kR3mp`Ke`V54WmGjB zkA-uFYHc=i{XCib6o^OGT{ZqhHF!Gi=yEZiPdcF;-X+Sr8&(S4cEP&t4vP~ti;-*% ztj~8C`aE=^9nL2rxNnvT-l7j04*3iJlVWU45o%tDYZG1+uh0|{*6KshUdpY;TQ3a& z8p?D8SS8+hTO!=0{IxVzHknK^;ok`lR&x5 z-c?*rD5Ff$J7%JfQgV0-X zL?ys<|A?$el9I8;^Y^Kv_j5(?Bg(`*Yy&bSI>M`b=9U?B%Fi$zzVbY?PqiuoaHk^Y z`c7aR_K{k3GlvZ^Tf#JvyY#|f4qz)C7%3~oQwiKf@jgqTNxw05g@pcxZI~PkBM;`H z{K2Z)UQb7D>MDsFdQ1kPhkMWk8hQl>{is}@j`M2pUa#v~XD;!x37-cO)yB2LmBNMb zg-Jg4dsq7dv*Xve9-jM%FYzZme8GR-PC|)M3>`nR4<72$;6BC4kHii zFhZIb??c6=z%URup`>5K1FR_%eHE=GYtMJCVPTAK;`}%*cg{pqvl?3`R)4}O1sh2w zZr&w8N%8yoKe^Slf^CBZ;6nrAGCsKEYbj1O^=SwT``9YS4tUc$HwF+SDnKaYp@2ck z%xVBSg@aM}i+|nPW))q${o*1fW3j387JH&TALF$v1LgnP$&CdRMtGgSdCQGP4t7k? zS^akB!~cU(w(_OBJXYeHKUDI9Mg}`~47FJI16ZVL7vaeW+zXUFBJ=PD$}P$hVa7QR z>9Wf?!_g$F+VZx}Rv2)Ld2dgzSP(YrY(lSgy+Mfdm7E79FHlkwxfUaO#-OXD<& zTr1JHC6>|i2hqc=+nK1Z=WwA`t%dOCovnPzf#i%LRcxrt0M|SRP;P$C7Fl>_gG(2E zf|tHFlq!UX0GJAOEIPp)Ejna#IO(EU|1RiO^o7YkZ48qBcLN|ptB{yKXrq2K_v7_5u7oBAKZpS&Lo`U+mvY&dd-y z3LEw7Llq7`Uj-6a&B!FF z5Up|8^#T%LHh^&n$u|)26Ay3~FQIDHnusi+wwcIRla&_KIu8Gf3rm_A zoWah}$)3-t_~{`(8(@uP&noXN?ATfi&y;>MdsGhQpLS-Rq;ri-4G@9-P%GA$g#)Kohh!jMx`Pt9|4% zRFmo=rNB!#*}~M&6PNMRzL^n?hRnNreA`f=_r9wNE~51eWk-+ukdL_Uu?cd7?W#3_ zud^J7KT9cwJGfuK{7zb`_VOkTI+ZZ!nPt3-dY)iQY7`yrLsftWL;QJj7Yz~8q zt&z%VUQLzLH13jl03v+@ve$XOXX(Le^3o4XI=Bn7fe-RxjT`KNO=OvAXfXgs=!bwS z3N6BCR+I3>-QukRI>7dAV7Z%EJ~rU=I5Dw?5DrNs@?A>d2NC{De(w~LRmhgeQ&*6u z48V^c@5h-W{5I2{IwR8yd|rz=KpAe|hkm|j%%8^)+HG!Oy79E_3PBfE-`~|(3d^P4 z{i&yMq}4lT8>0Kq<^1<;U-Y5#H-?!g(^Yw6sB?6M>|#>`%3H|Te=d&z?h+cN%If8X zJ0yX0@^8bVUVsa&cP*M^yk3E%dcFHT5!58@#e3dEG+-QUM`wUQ$O|( z{z}RiE2bfeP2TD1@AIqRhHfC_6pi)-aV`ll`*h`@hkZNAyBJgjbf?r--u0fQjt5h# zB~`sIgpX5{L)&mFuHmjgB9nxydo{7|2g}(rhJ^l8z;JwQVMMoOTCBg-F-bTv^2fyX zW=}4P(~M!1FwyhK@Jjzyz$c%w2)XgSwO&ny8X~@H9Os6LAKwm=oY!*4zjL;37Jr|| zwMTw+=-PkSu*1OO+TfF4W%QuYyK8Pi19g;V_u*)`2>sdXEbr7S z`K?88snwWF4b@pEY~?stoR27pd0Z0+ZZ(?Kqg8nE7ywa>WW`u4b@B|YBTz^*L}AfP zx_|3eRuMXmkrf)_iN^jDLh2xTgDPa3(o6xJ{lUrV;UY=Q2^>#iRp2_wryIrLu;Bh3 z!0jSZ=ge1gOU9(2ghsvbI47#D@8F&W$ixzYS%WO^#DFyQ&6-XknJA!)CW60i*!(bi z9Giom`=*FOMjQ}&;7LT`(93(zQN2e{vTcelHP$xnwnf35`_xz%q4MKPP!pTB)CA)+fcfcUDCzO`tg@~ywG zbE!WKc&Bd|;m9*EkBr?23Hcf2^va^o4$9<)ZfcwOmb*^$8u%cKc>zSc9)k1UF1!SJ z#lTUN}&;&o1$${i4wq&g(vFtvv=K zn=oV!<&l}=${p}QQ#oP97y8>A1WvrTY>jS*GBP6LcAlGcL)B;xvx5_Uxv?oZ87}GZ z$3qDlW6Wusl-|mU@Z&rMN`b7pJDWq8rd>J4;+G4H65o}Rial0*F|UE=-ivm(#ZHDI z6A!J8U#j=`Ds>;PFufEfRIZ-0I@k5T3)o~=%9-0FzgdIM(23{Y&_^c4bvr3us9 zZxU><$0anx2m?BW5HT5BiAog{7owkn9`PKpSCpv7>j1Dh-hKN|<^q00Xqos_a>?ou zR}>NPlD5}8yQQwUAiIiE*!_3Y@LUH*R?x+bFk=K>D(tmv@JbqLSt6KgM?eSCM47Hv z{2VX_xObc@y?D!aYwuKsv4}QJ&(bM>rd^tYK_I$A`Sk0XWq@dn=)H3$JF%POc{TCr zY6@}d$NTp)Jre|pTzpk%5up}=tJa{S0ujuO_-e_5L}h7VbZ^wwfF~Jbk$~fh{#+Ch z*b)g46(uVWBg%E#q2&uE@Kwoev;`z~4iFQWo`LZQ#qZsXgHt!}_#h}jw(7rmy3mQx|c;@LSKxwgdktFFU<0bYv*rm1B za^ie~RM*i;dE^xfEy(dWcyte(aLAJ~K{6HG&Xevo!<@9PSO(oS7=kAp4mFM?IU@Lp_x9+*Fsy!j^%rwCadnxHrCv^6m@xY}6lIvRwn;~Q( za164Uq!6^1zlwi<>M)4^J}bGL-~SpWjpXi*$!ZE6n#UlTXc)0gt;O)wC%p(bm-_Qt zV!{D#RqCuYm)^-}q};oW9M19d&X-UU=oZaSXL z%JviGDmpr_cYE@{r=RqlD`^b*T`OTGk%S9my(c`gpI6O%N)j%Uc^4>P&3@VXM4#8K zAX>{5B#bpm1MEvaOmhF4@RBcV9fv~0UYW)iZ@E@6zj+iwn|C%0u;qGjwSm*bQ*8+O zK-tM>S?P*v%1_9A(JKX?=YDHccy?XcZ6i#L($~VQT5(XZTbCbx+T22x19cyxKD4WG;cX@X-%zCFO|2zp zbxoS!PwR9$&x{+9G&L(V!R<@n8wQiLKLN>W9(qK#m&p04JquqDS_Ga{O8|uce9;~*v0SVx4nhb!SX_*LUr>z48#b!Kdm8e2)R+eHSZWA0%|RoFBQ`` zVaOD$RYK(tVubOBU-txG5tr|>Pa6U%3P(>merxer_K1zK3#VOmg*yN4L^nsrShdM< z#Mo7z1=k>I&iDVaXHXeLpt(RFX_?m%Pzhk2zvG@3@z)kt{Lb#jIvMiS^u;w+QqZqe z(mIEUL7s|e@jx~HtnNxm`PJqo@{>y|*rJe+Ul*io+EmzUc~9BAreVr=Hzn^b#}70L zDZn=p)Ps3m6dUNx(L=ShdbRUjxs&xrHX@eak_NjhP8`$*0Wk!*Z})Bj!cNn4*lssm8%2G`>C+p5VuT zm+0R=haWR(L@j0xTH4X+;^mSHsR2Ev`R7(gaQZ{jYFu=q3d&YvyyS@mA?3Jai{GY8-cmWya`lKfGy^qz1yYiT>~Z45 z6oz8ON#+fxkpmkizvExT@hj^#Bv8-)`?Aam=PvNYU=|+D;$`^up(#)3u^iAV(`?9I zodhsp4Uf9dZ6*OOuz6#~iu1Qe(Y*r1Ww>@n>bJm@p||e&Oxtc>U1Uoapn6SHE_SBL z$-%RF_#iZio-Pczz>pJ7XWTXP*&*U~da&`)Sc-ayhgx@@Bvae7b*7zG;&N#-8tN7) zGiTk$u4Pq@d6Ai7Ro>mk5y*~JF0o-*TvQem>=(MjsL-^3hnxg$abGcvKQ+g*#JsOB z`wpeeToU*j?_WxP9Q4%0Fd~B{uTl|7qW$gd{ElfNm{E#hfEJ`7_5b~=?VY=jK}lMo zbA`AyCDv#DYPIE5f(!iH*Ds3n#etre*;aZ)o~08{T9zPj>A8?nAHvK36D6WPbTF19Yr%Q z-W7Yr(s$mXcaaDx7?w52!+(8oU6xT?APNS+(x2&xMROmZHc|u_$AK1@iWRTn&J3;@ z-iNTtJ7M5TS^%%!Fy6Y;b%KFC(GpCIa^D|R4A!O?xvPlCc7{|JG|5TE4mzXy;yn&y z7M&WJmb(E4Q|r~zkHeRiOD|Ep7UtAETf!#NfdGp^h7wv8PYP4t&jMa8)8WL$0e9Bp zx$`E%{eaH#VZQf#9ldvn`&vE9lla<`_9?K^)K#>JfBc2I^kKp`{*)@Dy_)=eLDKRXvQ32L7|B|UU%}d=VKy@q zAT(BDceZ(zfB#XD<#qlol+TAVY$Me^pd)4I_Ijxg?QmG-ZBPSh3E;igrR^gW;4cyI zU!$Mt+NCitW#uMBoYq9>?scbMt#J1?(=&YXGTVc{_ciN(2I)c1e1P-@NeEuc>TC;g z@ivH_LlQf842c7TA6AxEryo(WiQZbbCxQQx(f{=G&zRf$yA4Zq3VNmkY@nP7wMv>k zA|(02w}wGL)a`g7;hU;=>p&Ewm=rZ!^{VrCj&r2dma5iDA#8sWabK==BTf67pE~yk z^Tno?&ld9*U5dUkm`VOTa#}d`{v0Hm(ZO2wE$t4C<0Yq}YaeUUao*w*cM<6oR<$RBBtMe!_NW&=U*5Ao`bMr+U-J^yAb4Q=Blo9d$3^ z`74~uhA!GKlmv;CnOXisd$z@5XO4C(JTca(;L6LBnd+2`KBT~B&{p@g=PO0 z;-H88jmX@#aAjQ2JM|pTU9p+`kH~u26|An5(&6TZdZMe*RD#Pd@_?ll`~(GRoWn!y zH&-C%O`+IwMETuVEq(sXkDVhoC)YChU+cbpxbe|yO=3&#k9-$)aw)7Iv)sUM*?jf& zU+eeZ8qd$^o!o@Sb8C`Iu0NVrR!{o=tG=!QS#qSeLdk$w#*5StGtXErpS+VFL4Pq) z9V^#;0!)8}UFiS#K7g&B$Z)Qou`90z$g`z%!X`m|N~6nz>2Kr*QH@qI-?&+BiwFTW zu^+NrPJ5>21|6J5r7+|*m|h0ipYnwD?-{DkFgD~Rv}$%@hs`XCd4?D)t|%nLBuMS28DJ5Z6k)E{k z+#Xt1A05%%YcK=%QWovSrrdy|%ctCXcodxz%leourGIBDwp*oNo{FFqCrq_9Ulqdp2UE0u9E&V@pSv}EbT`My z06f=;K%vUeM4qTh!WZ-uKi;wel#b={85AfDCWa%7C?YW?^(G4!Rkl3fWXz&(5sy2e z$J==bOmi5_)oUQXZ$QboSbsHLZn?Xi;_8+0WR)TK#mzjrIO)Pb;L^;jV5b^I{SRJK zLUqQ}$gkZL6D0M??_RhgSvoN9^k)fxm_(zZRN?5J_KLzH?;4!I{Kldxm`=uku=PN-56+ z-#-a`{ez$1{|2o^$d#Uy|5Kz>Z&W+s*T~fE>uxU%6-EoIMw28VQDXWB+-K0|MjkcXU<|7f1SADC=zEax!E>r(H9*t`6y9JmLcvsW@h}G)MF{&1QRFl7}5GIY!c^S-o z7f;#ajdiPfu3l32VZ3^8Xc9=d57)e_mh&7v^0kS2o6%C;;8W98<3o%F)PY;yO*$R`#wnfz2tF!<;EF6^`7y~C!AOyVS>^`$e_Qy+)Q$R zBv$_bJ;b7d-I#evF>AFj@=^aN zX~13Mo@c*b-$F4GtV^3wzg1C-(~y~~ORv==Nfx0gc^44njGT1Jlq+SQqIqEFNKZG@KfrRQ&K^D?Zn`TSl0P1) zh`z4)x6e2K4i$A1XyZ_+)>m_JDfo*ZqImoH`cwm1(>2>s2@!pc%ROm>n@u}=v3wGS z|4bB?n-S9SW_o=aX3B+|?6IYCy+#%XbECE1Ao1u(5M8#zL0%B*QBot(a=ZlKN&hxG zR791mdYdjvz0=mYoT>BGLw6-jN0h&jso-DbA#@Q0a;S=chuI)AqGR91rmYXc;gu=E zfC^yWQ~Hc)*S$*duM*7>u5H|o9@VYI!7(P`XS5ANeH`>0A4Os8^2uZ)|DEW*`ywn{ z_H+ZJ8=nFUdu_MbZ~Grmsqm3T9x-K!Zr`UPCFLkPvZwFYi!pb7C?s%os-VIQWQVKgp9rMp*?(2F zPvlMsIBZ{WV{h!)BsaEOX0$f9xyzT+@@m+0rq8u(MlLn)ly-tiKN!xUvu_xr(1*m{Igt#ZebTc0Z?nux=Y)RRZp&M=%DdaMN0A!k{A&g27txE{4 zkr-yJW`3Zza$VX8$}rya$8t}b8F`xdI6b`_DeX=R(|AV@%LitBTpoQ zsIYxN$4)=s<>rq19zxC&`GF=0vSNCP7($FrKTFsO-X`G!N)dwrx9C#RCmAHwkZlsN ztN70$>Kg^@2O1>kSibFZF5AY_GzY3zZ11~qv* zAuuIxzUj^3Ll&2jJ)xty4&8a^e^&NkFdhUWbZ@;Rcq~M%eY$z4@hgny*VJ2|L# zI~~kD-GVfpw!aqeLY*95$j10JE#o^ZC0X?v(pRq`&oOi2ac&x<5x$z&v}SwqI_A++ zXVz&psQkL;iTrQDV+h*nwd*PBD(=^jMdqFPb>V+xNr~H;h_Tkm?nh+Un>YP}5#p8Q zyr9;2I~|mpoUKX^8cg2WO^+0E;|*5dV_Hq0g-M(?6TbKviASS!1CWdbb)YnkwFcm*o#( zJ5!`!^!|5)1hlXuKO-G>d-7U1INUVWSDhEAMfq3D^OPW^TXTy5Zq&ff*P}<^`HjoJ zxRB_O^`5FC;8mc<_mqI?>I zT9~183v5-=2m_sU8SLTD9fC*T!_+DhM7BWBo!^T)&6g0`Vc{nO5|spkco0IKCP6=# zGjMeHwhKz~YHfPz{@41vg4jRV*rT;El_~h)xCgu|Guv|q7hHejDo+%Ld|VFBNrLod z@J|L*ggzeM#C@30k3nH>)K~+ci@`bdH%E5J;N>mHtL3d~2jtxVwS8#k?vR$Ps)2Wp ziR!cw_~+QwLTI+`khHB%O8Us>?;-P~hn}dn0+G)|18>MC0WfUcuSpl5b0w=AX_jK+ zz~%q3JH%FgZrScb{Wkzg^?!XllS=;sT5Fd6Poxb*Yq4=h%UI!jYj zU1GrK_Ku$uLr-gk9OhB-MjY8*QM<9HY_Jji%ElN9>YdR=05*>D4|q9p)p!c!uMKhe zXk>(67X|Tdgs_k_KkhfVt~ZCC1wb&KilxeHUQ3}e@7unnp*dYh2HbW2_r)zd;<4uM zhqClYy$}YTJTjZ2CLD?chPtR(+^j?x*~oy6EpD9KQ_#~{;nVzUV9@|gm$Oc{pcIIc zLJetPLRO<0jXj~lpGxbTLm;7&i?YIAP_3RT8{UkedJSQv%_@hufmDkLHygd2GksxF zz^x~U^SqEV4EgxV0JFeK+KL}}2s~;<3q3ibEvTiEjJYaNVQiE%6s2s9;I_)Wa0AG1 zIBR)MDQ-9s>p&JrNXt%1%jVufC!81^@9|q(66avu;wI(VI9zix>Y{S@CFkbgcC5gr zEFn@F3N1?~Fhvg}=hs^KUu&0w$o-?4aM}{Grb8oy;QVEBIn=m?9_8O!hHDWDp)M zeR+i*5deQRbf(}kC}XBEwk4|@yKM@`y%-kFSd1!xX;;;HkOvWg17wC2qLUh9zIb>MFG&8CnFdx z{z>-Q87_))!XPx9(Gdi%E<=x(iOfmRoq^15oZKda_S3$W(rrCb6b(-s`9=EM>fXO* zsc);I+*Gs>Az~y5qdl6_-v<0sx9(a+zwNdOU7xeF3^$R|G2s&3p63r&dK78F5WG4ArL01iY7CVX(HQt|!c!G}rb_l<3 z2KVn>`t2!;^BRE+Cv(P3h%Q@81}lG4Y~gSv_N6QgVdSvGioS{=(4ZzgdzJC0c{Rio z%B8+$pOVWR;;YWsu1(zjQge-K!u~wW)+xn^_0^Mb>=6*^ry09rMGdm`AsYs*#Fj*T z@chYNh%WH?m}+fZY1Og(nA(5SPXPTPP*!^uIUl(S=KSq=#`!y-lgJFBXc(zJ2zo_S zZv^^;XT*eBW}n9f(88gFLP`pL_lU9@C}RvVx_&uSvsPSVe>i$0)AeXJNipGufJ|Is(b|6wy(E2X63&FAdyZ+`FN z;cf$$3$d4M2tnz?R)7g8bHv&-tvUp5hjUV{~&8b1dql zh|Xnq;$*>X3IV5)kCVQoKJ<(HjS_f(GjabCG`VvjQHR$y&*Zgmxd-_&5>}_x1YD%kn=4afO#f@yTEjm~jqzgZr zy`;>w7$t#7yIrSkF0xhrfrktdlb>TF@Vf5sk#4uCZ7}KAVuXwEN?1*j!osifqxvW8 z7p7;f9&p^>pf!B_7t1fLYRo0YK>82}g7%@2V0D!k0_sAW$$B7K&%dM;wFZ3zjGf?~_08+>x2_Le zbwFLhV8vm;4ynQR!_!lcdK3;{OR$RQT<`u!XM(U6uh9+ywtsIQ4x^uOV_&kBvm%C% z1D031j9CE)trKe=e;S&7imqq3iE>Yw=|#mKn=;Y>>i?nZoC3p&n>HWYjcq%P(b%?= z#wSISgvWZWROc9zr-B5ZUPssCLx z$+RzpAIe}iM9_d#>!&WxY?d>MbQu`LZh=%|bisoNrs7c+iC!eOuwQd4!wrZpX{qEm zNC=(|2;PH}k10vofI`gOSLlL>WQgska)2}Xg z6LcGG>S&5I_EZZ*X%z$6sP!*y4jqw<7N1w$FxiOCZ@Z>FTPl&Y@OBc=k}l# zO&2Z*K8AN64Ea^9zKUQ_Td8LWRc^*Tnf(AU{k1TTqjjCJqjfN88hM2na6|fL4X4go zM5!oxm?_|Y>$yk_kz@mJQ6GQi1OxH*JTkruiAVJu^~-jmS@JBhy*ChwB;WEc1~jQ6 zFCDYDb7pVG8T_RwiU}>I-{I`-|AK9mL&yAF!d#4>G2cWxqKRv<_dN-kSOhM#ksL+Y z#M3)}6OKHhEkQJ30f7U9HNVp#s#(3#+kX^lAb7|5esoVDz;pj5XH;0!!bY{&7sAWW z17|}V!C*uNmexWSr6ZD88f^4?pEPDVHg@Wsze#h~#d8iq#B*er+0#(DU|V1&d#IqF z7KGvAi-!H1!ZzH?@{Elpp^261o8jpm<}M!j4W%y1=!&E(0^kGlxs-5ZZ(O)$r;zpp zX^EbQH)vwDLMS>kM>n~Sss`Vtw;@f*V(u+FC=X1_Dgm1%_X#NWbZ4F92roI6ih&Hc z2Czp&DjAr{aI7n)D$JH=A40jR5)`9p8b-=Xrn*5So!PgL^$C@GPpGXpykOGmDkq&s z^`Spa9%+>vfaJISil`xuRcobNZ6i$r^a}VO{9}Qj8Jv$hHViGknkR*g=!05rsvOxf zITuXp_;+xmL4r86T=jUWg40`3kTSu(7IDyzkZjQu|4Q3)OK-KU!qY9y3tAH)3gan(Y|;x?2D!?gTD6dRTg9y?j7fH!%B_n#IJ4uso}S62aY1CngmQ6nOyiRVxN_l-JsFsFB#syr&(V=#G@ggqE&zq)JfcP?!%K z&_#vHLr?io7P~}IAbQ{fQADheP8rh#mbrIx5RorD_MJwsLWaM4I(IljTlpaH+b7Kx zLzrvLO}mysTiu3(WXu|84Mzl`i}L-7vjvxpgH_(o6J>EC3RN0VhxeeNd##epMxtjf zOVY*M!NR(nS_c0h+LV{~SGVM~$8W83KsIU7q65niZBEzv{`5`Wk<=HesSVP`)(b}u zhn#f*IQi9&pib|6)rSmPR$O|PB?^o~j@Kx?A$86^#ekA0P&#lTG0mI1;wXqkL?a3A z=_HTisI&}|lQto!x!=C%CjjNWT=#C#7G#{m0l(TBDEy1DBVZW z(CQ|o^s5wjj|i$}k(daANdc;;cUd}g-Yn0y?tgJJK*Ui-L)7d(8ffV}GfH}*&=5Ge zM5udA3_X3C4LSF4+-NFiOChyZ0Zx(M{^T(@WH<{<1wF_TA|7Pgg29?cV8MeZH=+(} zjBbApT0}J1`=4nkC&?vduh#p*$d#&U`3XNvONfM%)1EfWjWit_Q4O(aTW+`^1NIkLNMH0$!CV7qFUy1*j($>gCFz zqw{@n&+$omfn5$HfV0f62mC&w)fOFInFlpf2+;~7>#-#`Zj#3E31l{7#1jkmlNhk5 zHYPsDDT=4_gOW9?-Vu1frw?0dB?zMofiKqj1XYC2%E4;QLJJ7yDbkG_Lkkc&yTr)) zZu5;jQEOdXw4&dn`!v!E8sGwthsjynryu?;nZj)Q!B)pU_C9mZlbG_(v3=Eo9%)DI z<)6J2k-el5p&tld%x+n-da3QE;ovH2!40Q>lflLQIJ4~aN?z!+Z zMtcT%>Nh0D-0U4qR}Z7!bF!4oT4Qg}8TpY0QP^?LsZO}XB6VS@0l4G~DbWac-!R5+ zo77u5dm%?HuFd6@;_w8KCdFOmqiqGYG9L4tJG!uo5Nf|da5wiSbK-yd7H#BiQti?F z7bLY`k*i7c*DiB7%kHp}QsyL#rsf>#N>re7ex)C#aZqrrmfvUxLg=yXWZ)mfhH+LZ z+_z>O4JO^cmbMG(=LL(F$Je5K?ZZd|qluWm^-1SAG zIx|rN=z7I7*kHHapOFpi7JcO$D&qy0+hZu&p`7eGGLTK&4S@d;9+F)swZ?VIGh#(o z4+||KN-}tgtaM$m+zd2{LY~%)^&I=yt!14n&1ze+;771RVk`B5A<_BeMn)lSNM)@T zdqu(01(eD%(wfz(O#!zO?TLUEYs_~=Au(Q4Ct8}g1QW&_EEg==#xzEaA2f8=`Nw77 zFLPI}?bLJHd4cUBrIp!GRBkHMJ;%JD&7nQkoQh#M+-nv9=CSEtn^x>u5avSoZmp5_ zTvmh?#e)JVTn0u6gWiHsm=u{m6mpF@^A>j)g)9BD#j`OsLn4Bsi?@RhO$URNR%6nUnV>r*&!b6qSY>u7ix9iUE7226PWu)H>akeRY;?gG`V}7Ki6ZF`f zMG8RWCA)i~11lFM(#=f{7wPif8O_8pZ0`*rW2N77G}WLUN;0D8GG5L?aObSmk;=Dg zgbwA61DNF3j*jhMZN2sa@>M%Jdb9nNlM{LP`(V5>$$SnDBm8m1VfB=^oev#<#O1Wc zk<>wzhet_^HIBpFkRllyBekUdMT*ha1}s+maDHbi@V-_ zU})3_6&GmEN}L?LMn^htwK z_yf!bS}oToQG{#Uc@xIdM-`PPbEA=PUtIJz!Y^R_AhIu}qD6Pao4+-WvayiBXFoqb zWpQW_*&>DyUeFxLsj?lU^L_kqWMvsnx&YKCt2y`SHgzy&e~lIvbWdLBuM*57WwulB zF}JDJ%+K_|R7#W^2wU)0a?sEX3{YKyX%|Cy2j-|enisv(S=x-wcZ8e1ssx_e12s49 zYEedBK98`^$iT1&;|=ks60>-=h9LPyKK9=4rwjj1=6Zefx0xND=^T@ol09$ct$^40 zw*9h!asGeDy|@~YVF4BpnH8I=rm0;WJMtiKl&g<@ zBj-+O9!z~cq2RHrxe#K#zjJe7?@6enc`<$^9M??4DjcF4iFbU@k)=>kkvUtz3x8O^ z;K&*+Ot?{vf=U?m2@ldPt{LCPf(7O`t^pqbC7PbAeS_s%KX0)BAa`_qyg96KxuRVQ zo#p^clgnRC_xB=S>&vui&BpHj1Y50>s$f#uSLOyLIF0%bYsHfZ=&lZ*P*l<$Y3T8AkS}Lkoc|c=F6kqjM zLr}j1X=Jm6XX7MZ%Zm^Om>I6H#CRjzDL_WPS(OZobTq0-wM1JaMmpvq#5HF5IiHU=zyY zuWCMqdtif`xcmqhrY}qY?j}DCh9O>v+Hb!nef8jj30;PAdR#)+WFy@QDDFdf5(RW1 zSMB>=ryH^);N9xP-sM3h2~CFDpur|;L(fXLyNcwb5~=|mohdpRGW}!iH{hLv;rbdZL?Nk?}i8{wVrU@EyevJVGsRu9{?mv z4g;T&H#{~Ca*)7YPdl5u*cVl2XCoI0H`5^lud-B~5S3*Nn|@*nx7(Y|WvCo&{RsYW zoK(=t$@G6cDk+)NZeM$$$z-08RSP!O(?;D52lbmBJ5R?B2pXL}-k5iMpF!!McX_Y{Rl`0ysRkv6G8O))L@Dlgjz$>3T&3=oIJs z;DOV;dGStud`l)RsUnDj`k!Q@c1rY0S9+Nn@pOFh=nAg^ zYFGoKLXI*4Cd|b1e!zSf!;xHnU*#Aw zTb+TZURZBJ??w|qT5iYsmy7t< zNza;XL39C@r2;Y5j}Z4{CQfuzaXqTt*UZ@RC}g) z(0HR3Y!or81lm>D)7MNC!L2$w25+p~fIjY*37(Vh;T@M9Ii3I0RZ*$KQ^Vy(92#^s z;eL1fHGrGcQP$xn9`wDE)YtKn({DapuS{S33B4(hNMcEf98VLcIU6$atd5?85uS9A zay46!%)Pd58naYST6G>mXF`^-2lX?AiZb-WpA67>j~`s*MT~=s5L!xFt_FZn3zDji z8>UJSiJ6-uwYOnYAq?Dk5^M!us264pIKk;aVuSZ})(1~J>QcpO4C#C=Pdsi(v_C@M zB8O2D(gRsq%a~_e3Y+ElUb;@KXKfX*Ghz#AG3Z;P8Zq6Ogw_<*AHcwL6Om-w2&0wB zJZ0jelE&+@qk_D5KY^#vj0N1|(y%HxiVJnw4Foe@szcHPgjg&)VxlN#Zf@4koHg>4ns|hlo#IHR<<2R={ZVn83I?{bZ4Z zg3mhyyiNMhCR+p?Ol=8NF2~lKEY=e)!02BaXdrPqa497VBsjk} z8%-t{Rg%{I;RJbu)a53M_lP>4(A6&cGR(`U5cT;Fh7!|7a~5~1ob``*p)z|mZ^w<*T(^Erv1z4uIW}eJYdVEr{m)7*Pm-{j^0EqwYX$A8&DIF7`o!B=*v`|JQ?=rNpsMJ7K9#`}wtt&6gvbrjdUz8IDYWqI zdTa+iF==8YvreC_ijha|0%4UxQz; z0#BLwHg<9P^u^Zi)R@*XSjbmy6pohy={tT`oVB_`-3>lE*@q@mNwZP0)Jm1)il8o(If&!|b(l$2p>BVxUHZkC|$b65wMi`%t7TLKsRgWTzTv*DG#&OJJ zQs~`arnrJ`UFO-*qX+%dg8+}|9SNqC)@}_Z6uWr@;4h&ge?Kfwch)ZW6}LHg>RdEf ztWl%3mAQwzalLq*V;QvuIX-0T09&0`3(UCk@tIb#0}4yqC^an&v1-ZW8kf2TwhqXW z5{7B}_S!|(FT-p$swSRwTZA?YLNzSgs$DkuWuZ`Oskeg0o;>2 zI&0WEG$pbBX{*p*Tb#f!e%j^hLFfPY zU%YS+yV9ExnOk9ydMgSlV#Xt?hj$EGWG(Lt_uu>7rEf-{bkWHzr`_a&1#}>iLPKso zQ7@J6IBp32=-)sKE5Z!qG@*O#W?ddkMwGWKS% zV*4{F^~$in^cVfMu)%JRF#uwQlty2>JogQf21L&kLOkp$u_rj|UZg1lwI$M6~26uTX_mV|8bz7cM^gj6&!^XNdpIQ_n9z z2C-BDLRDg0^msT!@?zigS^cp=s%d&BCamy)g*JyntR`Wy4pD;koo3s0IYr2`)DR_WfPXd@B# zC4@iW-rD1zD7^hyC@UYW@5^x~T&-=3*E(6Y9HzQ!;>O|r;u71TIMv)E;Hyzi)zd69 zmz3~Mg133300ShjK1~9;r<)wdcZvOM-MoC~a8PHLb4eE$r1UDRQ+oqAymy9nyju)G zxo7QN87Ynn>OECLsR-Pe>zSGCy%A({*)cqJ3s#$3y6y`dhps9})}S`GJvLsG=0bJU z7TJ&09tme1+gb$;y3ET14U$(hIo$I|0w)-`tDkF?fZ~H_QYDxNR`AKtY1X9H>^6dw z+s8uwXSvKf`=4I!7qSX`7ef0#%UYP@b+l1z4A6aEj2mwN3t;H{8B zHF7^D7JBb)nSwW3Dc8X4$WAfee?4VGTS>U-mY+djhHQ7oKpDbdwq{e*b z4W&c-nv{9j^hcB%WQx{98wnn#-0{fNe{w0EQC@EB8#?Kgh4x;P`Q56v2D+Q)4G6Xn z9xR40)LgFFLnEWz(tAoAW?zE(e*A7rEe!irpcl#|M*O^#FRh%$xwhsk z;)igIkw*RXU-iWdFlf2BHt=J1e(R8Irrm+E@%P8Ji?#t(9`2Og=in8{U*2v2M^a9X zOp(*Nja`LR<``DzZ3zxEhIyD3*v>sl6NbEKLb1|$b|Cam_Rr$$7n_|E`8;n7bQ{0e z?yrD@=vCN1;>AkdGnM=XU|X(S%#ybGUpAq?6t~r*ug_>@f?(UTOtR@5oCy0vp!3Az zBIiq#{OiOu(&!0DxRN-6{E-&`m%5lT(czt*MLMKI=TcKtsg6uY4frXc-O62c)hM`r zgMv3Qs-(e1D**G@h)BdCM$+K>11oa<-Ctb&D7tC_5?42!?mF!()n4l-eM8?1@u?6I zG?U0$6`=^fB@YgG{$^cqr4~zhDtA%K$Zr}Cymp6KmQ)Y=3+wT2FN`t(Ef3Q_iZHM5 zZBvwBn_hIk=d@mN1q8WmkY$AGS%Z~0iBr9#-pNzf!?CJUl)Ks^ zsd&;PPM|hV?@XISi(4 zL_Asc-&nqmYF~HN+G0}Vai!5Wkv5){D5a^TPTAw`-g4PH} zAWUhA+Yf}?GDT=iTEwQnfZWZ?_sYt1!JG@=7krmuk37Sj$s*$zIq0qg2S-OeC7f=4 zD>7S1H%?Qnaz<}37rYDPq7}f^t&lCg(Fzhkwyu}bcr=+Wou)cx=q5DS;h!uXek;dS znOyz6qlLw*koE#n#cC|X366?3j%>1uTYJD02d5OY3u`!!s2I?)1WN1!&UwYDzv;pm zaabQ!td?9ZEF##N7BAn1sqgJ&sAHvE?m??e@9u>XW(qt{>usHY>(xP*Aafuma4w$& z+MW|v4sJCm5FN|=>r=Fh&>)k8fWNT)$Dcd2Z7;eZ2EfwI$zl^Y3nG~D+feHLW6y8} zr<27ZSbVmpU!Ohw1SCcPX*u2)i=kbrys1Fz$VAKnPTKe-Dgv zC;kiZ>y`R1Jx%h!h_dD7ypS8M@!NCe_{H9Dd3{11@igyuhc^^fktqs|0W_Pw1q20a zx$8uoKgb7WV>9dy@OQtJMnn#4G7^GJ*+K6T+D(}$xm(qM0&+qwHIUoIly9Xd(BH(y z#%->hl)C3RXcLs@OKcM)&v6n^%qUqsA#D?bJB)j}uhw5tYwBA*CY8K|o};06cm;wC zPKbKdNLtP`5r=s>cb?f1az1l?Q4=i8BJmy`{yactavoc{0K!|x&9;bEXf|3(D0wON zCJ9L9#Gq;kOy(}2G6{v|+@QJ%o95W^@R{)gac;Kx(>^*&=s^(Q|NZBK{<{O8`gWC# zFFA5M>i82v*oP$yz_|aStu@Uv{16~0%*fl{<&JHJJQLFls+fdtR4Y)SywsMCm3WXK zY7q=NmN05T4%WGyaBaZ`*h*A*2TeErebh_;SzWu9gr=YED6DyuIn7zGwnSHRo#o+J ziYgpenNFeMBM)x;p#IR;ep$4ej{nD1Hy}&Pv&0WqAetd;O6pRWqIBVu z7FW@Tz2>a&LC((*_}`NBUV4a*s*Znp;^64b=dbnivW9slb)l$h z2DDt8U!zN2{u#Tg^_SalSG3y4#KQRw>58KkeOP6#jBYS$md^0?Ech;pUlKyiTkuaY^(jAX1X#Lg0m_EAy3iNJmS2y_;_glLg}m zndN`;91A4j@^eeMzrm-7ySuu(`feCMd9?>go$5GiDi(fv59P=ua;9XdSRZm|A@0mQAYo-LKmE0KK zO=D%r<{RMlFwFV`xo~q($+KGPv|G)Nb5^|XIJ()|i)LWl9;Kbi%)_20fk+&3Hja_` zTYj{ZehTtgRrYQBgl$olEjdb#W|93u~y2X!j zq?sdK9W4ECvYARz<{fB_&deAZ^dLvC;fD9li)Tw))inzmq%+d5l5i(EDuRv7Frg*dZD2=!L#T6t^CiUD=^WZH4_Qr$!4n>J*JcK7 zQclV*y#PrZ`8DahH&bp7c-+QD!7+1Y5hA4O(2Ljc=XCZ)Aohn2Nh;wUmMvNdHBiY> zWMt>2suCSCOJy-77Qd#pQi?cu`y8q0c&G&?AM1^N+2f~oJ)L(We@uE1pz&Pxcx}5O zFWLewp1B`^AV#UboR^w5&Ew=)apF7DwA=$W_<&||{$YQ_Ui@!<3kx2pOiTtL*B=8kR@6(&oh>CZ?>=qQavm;FYj={{+=c znCuR78MQh3;KD}QvL>8wede$exW0`BM z7Qj|&{{^a}UXwc$$ZaX0M1E;DEg2*z*b;y;C)nEJ!+@jk$=0ws+$6-=#si#gC#}He z+})m=?tKFdJnj-zkf;;Xoy6liA||)XDu+zb5Veitst5yc>JKjuQpEKP;fx_+mDU)c#xRPin0{?yLd3;P~#{>{htyP1wu-fzF zu2UQ>oI)2#cEO|RQ_R{rRtJ}`{#1H5>}kwRePTZKigF5kOjvXL>16#!;p{uCocy{Nc#Hk%&U5`$2>%kn8M$^~ z*&dR}29ijY7ZY&OguA&gRjH7}Xua?0`=aZm-?9|?HF%Q=b-6sdJR)5zfaA`Qb9}C5 z0ljHa8SF2|$_*~Psj$9X&v6~n#5Ua5LrW-7H5c?^fcknT@UJiWfddtp9E522b88;E z2wnxJy>xN-<20q0N|#U|-&4zkcWVC3)%yGC9{>=nSn7kXVKWO5iidAE+Z$h- zC!jm$$6Mw9F^xP^AZsG#F)(j_t#S_D9N6Pz>P^rXeeH%0)WJGyGqkU-<3nzC!!Zs( z2L(J+4O^m7d5R2uNFI&NNTg#Xq~S^qGLNE$W5Ci)i0}RQ9vUvcROY1ovk0Y5gySS5 zgM^;nunNE}!QSX?>>g4t=qxFKrkoan!6Z0EHb(#P5K=IriOb5f;duFCL27n7w9hL< zqeXOPGG(gbkR~chP{uW0Hjd99r`BNYRlrFY)2rUO8CO;B{Pf|uq|4(H(ryJfivqeb8cl@{8$a1Mydwnx zC64LJqnPb3S}M{dZ<;S;>f9m^B@1yxI`%F@&oD_#KUSsV)pB|-R^P4nm-8t-oNnQ6 z?gj3cm3)x$Qokp$W@yT$lX6r+@sKak2-lgvZqiytoJ1fQIN%lVme9=-66~5vQLn~J zrq?`WFH(Ih3rZGJdl~j)C>WhpRf>={Nx4(=(+HIurD5ZLzJ0wLLQgjCtPnP=TZtX zQm*3NzQXS3o-{Nuq1#lVcM=rX_9rMJp|=H2iq!DnFV6?@it1Efl&_k6bf9@S^*CK7 zMn6byu+SbWvO$M2aYFBlZHB)l99Rt#&;r!~ir>)41HLOD3~-isOGF!;m(*m-cFHV@ zjHmma>O5%IS#vMK9OD>2K?l%D&P+i?WPZIhA~i~ejM%PJCR%*4)wN4G_Mi#(MKHJm zcIE{{^@jaB!)Qso?)QB&g&R-jC9XcdN{jSWhStxQ_MR~zrFs!Aau)qz%CrhT{k02u zxgQ*qu*xN3oEpG;Er>SsnPg~2a*6lI7!=56&Z0JYio+-~7FK4K`x{q2GG`Lc5l;fo zHF^c8Z5VKEgI8Y1Cpk>rf;`gIU5?fO!UL13wWS~Kp}O1eu4U5W1)Amqi+8xJ2{E1} zqL1`kw`Pydw+V3yM&P4c`BS>Iyw*~7Na z4D3R{E4GHp3I8y{{z_ik`R9PRg4+<>^qk)kXgH(-26jF!$yXDEMFew40k4n+tdbvk zDazry_g>Om&4CH^29spNqvG^Mkp^d?6q?d;hHCWP_#BhcayEQBy4d;tr8`yXoYAu| z{VcV5p6rnjE9l{9VvgD}&mF7K4WZIy0bHEYH&Z?m_-e zNLWP)6($9&ifBbC^TB1lH@~)`_O(cv){qWm*^YwRG#f$%rjZ)#B-EEv$DiXpmis$q zQ0@Wd$clC>bhIfiFWgWv5}7v}x=e7k9%9&pUYiL|u%Q^^L^3?x`!NO~fCzq!8U3CY z=XhW` zNL#6ks9rp@9iaFUAnU~XgU4%ox}_r70e%3h3um=1b)T-MHLWT43O%(-dWwszwnI2> zAs5E{#VAE9EjrlJ_ESUxz-j7kf7}nvAc^E+FrrwF&(GST6Qw~>Qg@pU4ai*(RQxWD z2|)rvsCigUAl>U*5Cr#cve)aXhTShA6OwB4H^1tbmKnnZq|2#K^~ zSpAY>nA3!k8K(&P$#cWP`4f3q%q4m?dN`d7kzUER5xWBk+h;%+aMN`4M8w0$C#!Ov zk&V=buCBP3=(Wo?l0UsWs1`9-q*y43u62Wx7en|njle7Z0Or^w{GfZ9$Qa@Xb~tk^ zh%CQ{HK7IS@VYrBTI=))mhchm%Sh5PtO+e3bdVTg&H?KJ-^WvC7RJwibv=kr6D+#P z-xan(82V{l&x&CO@ba+e(8Lo4=UxN>nE_=6_It2~OABXm&30WBXMZ-HFii62r9=fa zXB}I%lE^;T=x(=pBQkd$OAR@nQt-D7Sb=2@ch-wf+a{F3K13pwcYt>GiG{bkQC*tj zGGI4zOG&g7O^ETp2W00CKQ<qPj{~b85rv4Y$NEQAUn1E3;55(XGS2PbSYv{R5W&QW99=-fO54Ehu z{CA0sC(pu)VQT%-_$(#xei98cR%+Zs6%1~P5Qn})lc*ifL&1>CkN%nVaB>P5l5%Wfx^Q^2^}6x8 z5iM%bzvbjlz#jgbTVM6*)L})=VD+DOv!UA&XU3SaED}tr9B_Rj>##@H+`z6BWh0a9 z^l;WC7dN#5XcB30q$xtud&>?StZLd`UPm;L(Mo2ag^MZPzy0;}3B02h!xR&m3kaH8 z{yOx{y*@7X2>JyOw$$lHtg%s}(=Nm%%?xX!{QC8a9pB!b-{t%TZc%a~BmyIos?R+{ zY#^U#(+>aDT9T-o`Fui0#+}e|)y8WFp2^SZ zrNcfQ{g|y*y7qojp z>#S|~miYc>lDePgt{m-L%sHJEm0>a>sYJ2L*jvv6mI)TT&94AmKm{4}Fi_6Aw# z)6Lv!xPR@wv8CeN&+hDYA{2?_;U+QAxMm(=X@qDzt$SL0>D}o*m*7nMAG+~S)U`2q zKtJEMeS~;{j>8^Pxe?jHT35gWlB@K{TuuE$C%000IC<(|zvVLQkg@^S<6{MyS_{zvEQhi8?FHeu2b8z9em{7n96yxyEt5}AvQ&3^Io=r zIxqU`Pt!Ay6XdB)H#NW+6m&0&l2Ob4^M#k1tyM(gi`*NEcDkDS*7c_UJYo2qu{SSa zzd`vtHrzY~j?-=_)VZ{6dECTSdCmy|8J)wTq7SO)84f2|5bEG6hf4RU<9fy690LSE zNS%;&6e7*ir%|QG#)!`~6e6=nll8cFKIXxWoW0>8;PewEBoYTMo7EIqDpodXEU02{|>S(y4CKJtf(qRkj7WX(AyCFS8 z5%|j^pSV~s%=6!z;DTYo9QzwQYcUESs6zmT@>jiiI2cT1L>+&m;g(fEo==h}7K%NW z>S#t(`L)pD#D1%O5EAN`wa0t+PjQkPCOY3g#2|8k_O6IJe5pedRIq4 zlewS|Z0QvF)O@i-A*G$8IiQ-C}OOIdv4u7+WoN;XVuSN9P?yNI$J`)su2;XmAG6a~X-&gX{|aicqN zb1_Yj@K4eO6?``cb>p=i zvz)j%oYXh=wzsxdu(siJ16o?X@-Org>`A($U=R@sf79gD)}_irkMLySywrMybv^BC zh<+t79O0M>dY@mM?>~ImIoo^l&U{T|T^t%T4$|Uo`#*inHDTFjcYV|lbC^PE#l_>WB~m4-^c zK1H4$jLTBZs<@+v183BP6c2fDcLd=Ub4U{D`H|L!7ttd>qyH~O=QBV`rG8=L{kRJ3 zsCiBJS!*G+41)P67p2tBoRnt`>Be-#D+sfAr9k5}-BHcoN)H%Czb|~7inxv_o7yf} zhUQNfuQZe-LCqX8=w>ad5lhL)DCox1>?!N!>qB$G*fj!5uC##S14$iR|T=5K;f z#QmG^sQf!#)YmjVC68VS?IAl^I6=MC);h%XW2k(95nqrPypIk0s&~5?>TfEDNF=#z zk~2h!gu3r0F1EmYi%rYXQy!Pf56UfA>66!B`bZAQl#y@jg}clptj_nM>J!x`QEf*P z;Zn~k_S14EXDgcA0@&NWoof|QA$pyJU-wv3NoI3(o)r|FA-cXi7KY?3(HIOfA+TA- z&6JgNvcNaOH~lMJzgJ*fq)4T0wOYn{xUTg zx{&4sUxYtiI*$uZ4$2UJRO<54tlivCv7nAO{{5W5vt@A_c_1Jxo3!-$XYhk99F&tQ ze<>}vbhh;u7!2zji&t!<0 z3^6JJCbB9V7A%MJ4=%RGkqwosgOErU1NV@R4V7$%ZQ*?LOvjGXo5w}C_=N2M3IsWn zXRwbGxs_NV1*ZhmKurMq*?8;mjr0|_iwQ3mw)fQWV`k$lnshW?rIK~LhP5=|Nb4rF zDEBVdTEZ&V{G*!4V{cPX7PVd7Az7kd5rg ze-rH!%s--?w9Vve$#QfQ@4eqW%zoaucHVZQeag_j$Cl$EkgLifm zg}I2!UOrCDntr|rSM^G#9nIz7Jr7pg7tnMY8B%?`*bt( zu$)!r?-j)pZe$O2`hpcPZ2_FKP44Y4C6Fd+!8lCBnGr=OYA=%r#DJ0ut8Xr*L~r+D zlAIhb^ayo@a?X&NrjYa;uju*=5gG~{2KHs!Q2@>vDla!)FY%w?swUE{XB{1T4D~Km z>0l=@uh|kzgD?;L{>GyO5Rt}vCd7$T1I?7Y!@oJ2zG$VvtX>m4>ihTVZChC3LQAb% zTOK2g>!aK{?6=)@HacQ1BbtrN;ZkU*caT+s^@^3t7+OL}GQ}z|>i0YhZL%4)#Kw1( zg8(}11}-f_3!}D`V`dqG=W(oRy(VjsU*TXdr^|b!@l}HN`Nli7Y4Sn@F_n;yO9^q& za3_t0qG;lSz=}|D)p&D)&T9A9HsYV}kNeP(g2-OWYzy1L7;v52-8}9X5CZ~wE0!Zh zy3|GM`K5JF#7cVy^gY&H@AqywQTqnzQ9#P4$#HC5(;ZmIClT|N0g}}5Y1<`Yr(>|` zRyk$}1!uK#CSx!Qq|rE?h4$2GU>IDJfMdwYs&qFMh#<-tuax0%Ox`NcD5px$+^m9^9x~*= zf*j;giX(EG(F}@(978b=TxMwYSTn!y<}&o*ZdLF&}J&z7k2PJ*m}q4%A%!hG`4Lg9d>Lx z9ox2T?bx<$+crA3Z6_V;=A7?+?{|OPUwhBem}8AK=Bj$CW>sk)OaCQU+EDxNap}_- zawkaSUu}V$d}H8M?iCjnS+zLKol=tQBweX-yyj49ou+t>0VkBFZ<>M;>06LLHRwQO z0yS^UG7)Y$KiCG{8uleM%S|`bRA<6VZt&3e&zNvAlfNf~jR3dp*)s-1AsE7cP-kL;6TR_1Xi1@)RXfW|j#UlBBDsMd)Yf@qsB4 zx0Io<&_Tq4{WM&l(*EYZNGvAkmSZuLCx=A<7aI1JVKGocL`48MDuUb?mBFBciVgcI zFzPGAVWEQ_Uk8Uo0RBgc=2to*KRRd$<^F$pKVt339@G$jr^1yO^=-w9eoVkw{Hzu6 zD-8QKbx|v^7{F1>4Eu~rDc#_(Y6w0aApG}OX$8^J4#v$7Ad9X3D@KpM|*@*k%K*$4NWT@vC~VrWUm3!{4_f4;k1_&_bn%uUv&WJ?>0>iBV#M{ z7RhRAJ!BhVq_*Yqc&5h!T@pEhwp59SuU95&`uME-q|~wQ54xLg#u)@GI-{2F(QDtr z_UwP(t5&u&-?2Y$;r(}*OOqJ3kOzSBCie0O>L|9&Ic?+Fh^>-p2Jz@MpNC&{{}sUK zMZ|~VQlvI0kCp#JUs|O3&qATZzxadC(Ok`!aN_0w zVNBVV&`qZ8{=IE#uk?d2f<*RzlpIL!lXgab9-J>BJE`KU53O*<{kwXFaPrRR6>I(d zJ7t={(Q|xuL69$Dcr)Pc^Whb0Jc4V*j8vf)oR@Dqs;*|#_Rg1(zkN*Ke5BNc=hU5M zeeOAAJ(7JCN7F{#=;%J)mpONGG*nNK59OVzS;~ofgh&qLVjr`T-vI#q{C}clx|3(% z0MkQ=gGsKLT85d}0?T1Ss_$5kPk!Hq-%Ty-%lgFY@Xd&T)t-r7VH(BVi~nGWtBCw# z(%pGkrG@)~uYQ++2sX+z)G^)hECE$8H2PGe@~6pGi}H@HT%xV?YA<0s?Y*^@is5!x z46Q-1bQmF+pg6VJmYk($zJ3w;4Ag|e60jyp`8gP{WP{KKX9P>-h8)Z=w(yw>M1tTa zcD);)M*k z{wr{=Gg^&#uvKZEt5mfK*aiLm1Yhk)rMfh3)8n96=bSl8s8q1kT3d@=gVE(=l!YFr zE>QBnz{$+QjIncD2Ra3Ehtj$$wmKQqt4anL8hAj-A87zUK6)TSs2NXrL#2$39_-TR z_B~M$7?w3-W@|rP8{4xy?ou@_imfJqv6_WpWbKo{01KEg*nku3NyK1v(~zGmr-pr$ zA!7#LC{6iCn&DEFA&TvHy|bb~NixJ3$IQ+zB4IM6pUx!4av3mV$0?t@GY*@3Q~puM zPJmGX3Y8FDYNAeXqC%NUBxxG>00+}vH7E$A5+qv4eu5I{eMO;f=n*1s=1a^v@e!vE zEwo6rupLUWPH?ipk*%RZ7_>BtV&KNGgB#2&)(n_w$6f1QZTpfK75P!>GCfX!XwG*W z+}`kHn#Y%LV|{n;l61~@UH6v!34hgoD`4>zQBk~dfzZ^qOctPD$}d67{Je(PxGJ6f zktgdb|BJus@Gw+k@HW1TxH~~r#q>sc`SJ#X4aJxbo?da$Bg?S!w) ziEx6YZm}Jav#HXF@aNY}poHsruLk;uw|RW4bi#)wn)SbWZO9(yn}E zFZzD%E!Cdih9={E%_hAZ&N%)Xba7FHHjok%hj-1pd&xa6 zjHMK@o3`Ou$c^VN3#6bi-dhzPfvA@HpJKkWKc&-UOmnVYxBO~8dQG|}7Y^>hy=eA# zt(q(P<=f3!XgaWU-oqz8x)}@RWJ?Qr%oP1cC-|QF^R)w@3U^OkZBKoVcrN8wgRSGnM0Kr+=a zo$Jj2BB?yk^d#w9Fa9(LlSm5|hCM=Ki#(54>d4>mRK$>#=+voHB();tn>Tx{Ivc}UKfqnh;*NRp_8#qip4IC; zqy)MAyWsF0!)G~SPBWqETH6X+MPidGiU#RGB9aQcL6=c~9;CQy8!0T*+{)${=e&S12b1{GY8j{dX&&j^{-iqRn35ds$gpR81)g z-G`7cSGM3+Ny~~~O=$nwgjbCFx%IR55Y3uF+mR@bWd_GJx~WyT##Z}}-MBU-EP&eK zG+v8&*<#9_oRq&k%HWQZyVWJ7`(#L~4tlY%;NXxU(C>*#Fw4m@*|}ASe2eu|egKp`Yw@HJaySneII(xLYfzo1_C3Koh1fvhmX=w5ueb z3vY}@qbu>y02P~1&r2R?(T{*v5P zr@SAotxx%Cng8DshV3;g+fPv|TJ_XoUsR+a;5eod>tQilE_|{JXVXJr8bD$A51{hw zd^MbTV)uP9YR59cCwCVcA_2qmN8!z4rWtR<4~!1cL)^+;JLy052cT}|pucBVSg2xv zCpP}K_yF`_(2Ri?%(ZsI0E?dil3-R)owW9xeL@1rnWxd8J49iaY|3ynISOgM0Th(ykI{}`&Uyt-TG%}-x zsDx6si0$B~W&Zg?>S`=vxUFWF`b_5H;xnQyG26$D23gN!jI?3#l~xCy)G7-1NsB6| z$y3<=u_8yO$t-rJqZ~H6U__vY`5a9mIBowr#+&t)9lY-nUu^f91UyCtW1~@jx~>}T zI!T{2C^;U1I!-$LW=a%E!UYaV)K9_!!EZ|ROu_@?#V?kWyA>CH6|cC((ht^iBUPG7 zdVYv&f_XqG&WHHTfk?GiQE^Fxlv(yZNVWU>sp`h=c~u?S><=+E1#VON)mFvKqTi zo=-%=uV0A69rU0wOR5t_;TR3c`DaB{Mnf;a z)S!7ZH2e7ZlnokBtB+m&Nc-=w5pCG@GDFz3{*oE(T$_~)i?sB++q2W#UznUQHV;iP zki5|pI2r%*DaOe#RXQ#Eh%Lsa?>XxQ@M)c~0Z18K}H11k_Pa^$qVWrwq{bRllEzKFix*(2T+Y@?<`LZbo*Y ztZgC7n=Fa*D2^!;F?H`&SM*8HAVrax(jf%9qQL;eBwwE51q;pH8&+;TUp)w^$vVck zHCs-Ur+g?IDEg=UV`Zz-q$=j8gUZ^E(!%4rqVj&bxG*g=HXuV6fd11%*tP`?cWIax zZsIClmQ(}lm6um0K=~F9XekHDKV1kAkg&HhcoAkxMf+lDLHmkpIvUJ9R(0nzfA^X3 zy@H>K6eQ*x<<=rHQIqnmkS`Zd<}!t^%zw-ZAg>lsk9e?lSS@mmgJPpvfXry|UTwmB zdur$Y4V5IJ>joxXo-ykcEFemPWT6Pos~JB#xZ1=qtAHy8=6s#|Ybzk)D^p3=qwss1 z?CYj^FI5D)@!;F`%I@llZ2$Y34fmb;>xSAlktK}|WWg%YC@l~WbJ7^1Lu7n=XUuXB z%951iE`$3M`bFV?(D}8PGI|sRK$dRPUj3a7dveZrr#fDBJ7p@!^HXPO-1uj%-t-d% z{x=9@rM+Cf{r?F938DTI1X9>yn4ODe6XozwvO|um`+0C$Z}HdK9UaCg0d&)|@fPWy z)xy5TLmVQsN36eNv$L~DR0qC|%)IQxUjaXkZqm1SS8wveXcS`d1Ej-OnA6|Q971Mn znRXw_R>Y&HdX(1K^n)KSm!w;fkB~-@(n%QX=%Jp{V&X*j)tfRmb{I;9kFc^t_rD7! zc-o_fc;U|bS9v}{H-JFN{cD@mK=RC}4Fdnsg94hv|7zjJmwNNr%4YrWvEwIBjIigE zW=4Nv=pSNjc=C*RKNxjx>?IoczgG$B+HYe7!twLuzKy`kwRe0+f;0@2^;y%sf|IrG zw9-&lgWwGOHglbdF1~p?n7g;taHp|p<5M5n5x@?plV)<`=%wav_Wd2@?C8N%T-2^V zYuEpAje%HCylF$7%SM<)^`N3XMc_UeQ^Pr@QTSiXQ~RZpbfcSRgQZy&2Y@`Ov4q;6 zGL3YzOdo~yF4RAJAd(+{a5B(xV5Y*zUk&{G%j+I4YTM+I9;vhSO=VW&PoQpeYdru! z4LKtCT@Q#wKmh3_I;a;(C-*>4)mxZ240xo7AdA>?&xsB0D1R{f@NV=_M`XbCmoOy0 ziz1PX7T@d|b_}-xqkACd))EtqE^L<)kP=Z}R}u?Z;;ah;+Q@Sb{!9K2cC9c(j8`2& z+g6~<2B8jt`S)!|3;?-ghf-o5CI~<_aS~ae(D*vLclwo0{35?=4q)OTe8U_pKm(99 za)T5*>#Tx;%d~>Yl$Ds-R3U?BO|riDgAi29Z{Zppiq@N1xjp9x&Y*(xk=eZVnXN#E zBcp-xl2vkp;o=YuJQNF z%ndn@%FPXF-slLvX*OIPRIyjGzqdE#M!o~MUB2EWeWixK4e@IoR4FN6)EMJ?VW8ie zwg1*0f%wv)UR_Y+_t;WRW12zy#yCc}Po9x+!`Zvo4t`dw@5YF^QrYg)4HkWzfIUm* zKPL#!n5%rpp1IHkfAEY6mjqypM=mJ0Fz9C0+z;I*P*DSbYQ0dpBiSuAgxySL)dt#h zju6&eVo6=MChc{y%qFoaBNtSc1$2&L=3Qcioj;)uoVE&gwY^ujLdUfKXij3KT<{Ga zcH{!LU)!?KgrY9Q5+nG{F&kss?6!}pRaxZ4@pZ2s7Xaw2q=`TnL4&wldo^kKij*uER8+$+J=-iqU_ytVF55 ze}T{8)NlWd4kABSwP&d^8$uDneXgpS ze2=fBq|=&YcM**dIghIH=%~kqo1iCC53|P^-jC`?9lT`8h9s9C_8>p)pUhr?(H!!Q zyp^ZEB>3^3LB2^=2ECoSx%tv6yCC=6k*guoc0?b(g4Y#&F#()MRK1aqPo3f4;@*sz zdLu4hgq_h>Mc<>_*E#p!>ce(a--vT}6QCj9+WCT=>N*K>%b)c$4dK>ud*-E1fs~RKdoHpJ!pSYcgbHqfRG$gxhu^* z_*~E{H$OWs3(F{M9;sin_CE}VbH1)2^{XKXA-c(E_vcu*>a8#S;8(rtO#g;F1Gpc76=VsRa{41t zXl$aA#kMAKhdDwjTobikA|$ZC5QM|b(;T7xU}d>TN2mqfLaNJU6Td`WgOXMgbY6of z|A(3+H+F8J!bkjH)+Rx>cNbM|T&7Zqw@^f${QniRO%?jD5!+_MWVx_=Xazn1@#I3e zw-7_|CF;Q2@ysRGKt)?aqL6k2uPkk^iC#R6XN0*gk+$gX%5`x2G*i(E$fI8gp3J$q zW1&SmBJ<#ekck9@^e0ciAjbd2>jVe2jf%6hJ)9`Ad5=r6zo`My8@DTcDWdehuNxi8 zdD!mxvb9_EPXI^YpVTq=ogrJHSAKQfYQG_a<|UqH-wz4A*pn`Q`tFl+ z|HsO>FKz<978}LdO5pA15I+>^FMcXU!tW*`MmcORLB?-O4&Pm-FBxquiu~ zpsMJjP~KBnE-k8F5xaU$oeF`TDGI~^yFD`0+aHnUa+|yu>n7G z#YMuMwfX?kK|@XuAn?b#S|FV8?jbtqA$%r=fCDFq)>2+$Hm_Yu%-&e%`-Lc&IY~$HcGb z-^U+HY_lOYRLj^?2?A(&vkslT0~AMCUJ{>_A)aJ9`=YC5^g1a)nPk5i<83-lDQwoXx4TdC0B61Gx@z<)=jt$?C~$!$u@-=A^W)9ERppqY-$qVP8BMfQ;!DY6BGr4OGO{1%KJ1e7l5HidOw6snGi5 z=9+k?=jPht`u}EXw(h7AsvY12PKR%Bc*^~ue`7x*;(=KIt1!Oq)!Gg4M zN0RZtIK&Yf-m_^}7Q`KtGdm;~oNrLmw{v69J6`eM@%I;P=)Ey?M=SXsTwi~E@gKf0 zp1|nb+a5grcYzpWPPvb-w8pN3)Q?X! z+wFPi(ggF{N`Gl!em_e^i@AA}!O5AM0o;i|t$BvQyiLJ9TF+ZJm6w&t9?-|}fqR=C zg3S~1&v7m4(J#n>!GUnjF`cuHaFHS(m*>Jz7t{)1{Y?EB3#H{!+o3*wSZNjMt6Xbk z7m`-K{7g4GJL22A;TG<6G4sr#Ex*(p&<{Vhd?i zxpJCNq)FN?(kxp1!BKG^g#&r*jsizzqwx7>YLu6rO!+`b68!MfQ0P}loN?z|--=${ zBMlF+0f+$vyj!xRGb0#OnetH+Yg!b?wU#2_Op@Bpnp7rG^{w+FMri(_%c#8YVa=G~ zK12s@(4W2@*D^}}vMTHYXXK=eXC$;KvW{~X99o4tBdFUbt+bOi10Ta5>g}W=Sj)cjm*?P(dJ3O;h%8`TX$YILrD1t5{yWAu=o&trT}Uhd zsV1%?A7c6ML5KJ4K3pr}a1eCMZ3aA0yFwDsUNW$tv;*sZwO$4sz?5rt*F-0AhT9h$ zvSFd){JW(6{5ZJ3lQ^4DKeKCa3;t+eh9pDj$uS1r3!z~pz`St@=*7Psx3%L(i}2L^c^Pq?c(Ys z4U6dro(Eqvb)@CSAY|kRW6u{h%zl@N|EAFQC9N4hJ%1?WoB?O;7?-411Z|Vo^uq0lH2_9RAoC1SdX#EnGK+%T z#N4Oy>dA=w4|XwZS3)>NB-v8{>z+DG)?(n-?C^GAJ2;SLM6vn_Cj#SoInPKt<}Un& zpu1jR^43nw&WAj*j&3#Z3j*mipom_+o45iYw;kgzR-u~0oF;hMihyx!f)&#{DQogf zTv>5^(kcd>v|PttM18lugQB*wj)Mxahj=m3GBdhrq%;rw*%Ht%^}*}5mHC$80~%6h z+<+;%>a{p#ed}$>`_3%Wzd6BlSB*nU)o=)@lOYf!X|oZYaU6KKn(mxY09GH092RX zl`P6J$QUEKI=qs);VVgnpl-VW`vvK#d5MpK;|uGsIx@9C#Op0WsS(_a2=+`?oyj5j zHs=jycGYriVZOMyVacQWfEx4;pA~{h;d$03cS5oheEFZRM;NTRxolZR)K=z>;{!h@ z#=xV=-^Fk1D?4`A)`W-NUsY7j&3%DGimd8)3# z9dWJTkS9y?6(V9IF#gkJ1t53>oi~%uxr{i{l(`z;fCz2}CJtk4#c36W|GV!#I2jQo zy5(h%YJJa2B_tebUedWr04=Vq8_QPQ_^yahodD&iHvB|-T*qS zo?sLXe%p{s&s;DpV1MAd#OR;2`mL8~E!&gDtjPhKt-j0mvEi7}CeBG(ncaEQptF(w z$fU_Xqa(=XX(XoSk;AEEMwW}-+%DK18C~Cp`=id-8Jtqwg`rQ($C^FihAF`|4R$e8 zpGL>~>3TN)Y*hmjyRMnvRq$xvQ8Ax0z*y8vm7uh1c#B~U00`(`cj=B&m39K4K|{Iy zh?<~*1BluKD7pJ8l?G9tW`aPdSQah=@g1gGpL|PT+Sm-_Q4YYhZ$&$L%+-Y>`7S|J za#ipR9Qm)gEvJnOsyxgkF7-1;8Yq8*GvGG!E)t4Z%R!PW3`FsS7wPPvv@(N;*OfKy z;0aZ=OYe}G7M&vsSx`As7s&s!+0!}CV{ubFzj-;?vC z&y9pfW#izmX){Fx{1yfIn|A=d$3YMJ>{ASEp})^eGj57H-*&^Cp?%Ic$i`k34dZIo zxrB6;owvZpf_rgsCH#IGJZhOD7sC11K%;5oI&dcrs>!KLTRKQlTX77vd85nt64tIDPebd@%1C%FI#Mm{u7RhTXky zS(YHFa7i^{&xtv_82ld)IZjZQ!k9{Lh`f4%B<5BuR;dvc$(qR$S1T=@(;}YpNFnblCiNlx40} zP6o=m2Rn$uyF}3{a)DVlZRg~Izj9UxwFLvy$wYAv_{ubCB|Fml*?G6!1 z%9x#r(ssJeP8I&Bv90x>Fk$Biw4bnk8@?n~RQ(2YqsE%(@5AO`FUcB2>eosMG z5~9O|EsxB>Jfs0{_T4t>SG7MehEr4AQIiF+-&QO8TY_5|Xo0rIGDlQZs2g&;g&-s* zo73krF>NR2AGfu=rouNS(ckjcRkej!{I&WHkTa??IFMuV!zE5BqtJI<5tth$cUu`E zj@<-UB)(d-zF~LX<~f}bv?*6{#qooyT?~QmX#}?yK%>+}_~%U5j;SL09?aY3K16;r zn1ddK*7yUCY3!cVvM~MO>nhD0@Nc!jIqA>Ki6s@X_Od#|v2$61A&&Vtc_k)FCFPN! z#cuIGYfy*J0UOXrm(8q~-FEhXq<|PlruWH9@Ts)=+Q@ zI3V4p(7Rmi=N{hVUxiCy@SEx#EL-I8UWC&S`)egpp;&@eO2dl`wP$H%POY$3XB7bD zPyHEAF`-8?kP>HN);r8Amx0#?CwZW(u76q81+$%r(Cy*THnsHJ#J*t|z$=#E}ig9Ay z8Nuq7)s#G45dGJcE&QL*b#|ILHMrqS=&P=%kYR>Q_s&{OFtL)QX zXl^V%h28nN=cQC@a7GEKs3I3oG&uQ&n)Y#woeiiDfrZVcmEpq5(nR`;1l6pXb4f6K z2D_Dre|(H|Hu;8*#!M6I*3j3gn3NJz%|-S9!Od_mPe=DKGK7TK0YzZ@BjXqu8J_1q zpDFDuv9ozR;1ZH0hdBTXACi7xxLLSv)KPqjeDf3ndZu+7wIsOg4R;dHYKZ}_qzBv| zkr`2HANzLpfku~}ZK!F-nQHJ86R!d#WP8|LI#1S5 zYM6^P!P@HNmH3+}jB?B7#?fv4r5&#DUp{}jcW27t(>JaAyyTs5#&Bo-%)-jGAT&K$ z=r7`b67z9`Nye9*iy0++qAvwVyMURj-GbnpdMWXHJYOHE9&B~qb-ML;x(&MBaFur4 z1(vJDXx{9qWeNpEPA!~`-^A6;tp)+AM=V@~*|*d9p^z5oorQZ}Xl_4ZOTMnR!h7yM zL%vKzcU}yHYlT!VzYZsNdedq?AO4M1HT)8<9!)MQ+qt_rSU68z8eK4O^SmGC#^32$ zD2=Y47raWce-}d301Uqr?8-I$@*)-Zm1t4#Z54Vz@YNd5zBCm9 zj|ydW?l$JjYlO0_X>Q2!h!5#`V+`8Xt?BVR{o25lCFVV$Tj%B84J=KRk-`vkEhr;D z8ehhK|7}%vf=N3*>ymxTxl}}c5wbRCYb&bUep9MbhFYzl-0zOR3n5mjlqlao0vLC{ zM6A?Xe;wUb2CS_(aVSDl2nmL2+DyQ z>K53T%`{84U!YDq+FLt2yGKuW0UTC=&;ijEt->c^B%bh7yE)GcDUk=NS@8Fw&B?F# zw{>f2*Vnc_&1NjPS{oPB&Te*Il?vS?us3Sf_xJN3xY^a-Wyq@Uz&-GlVjtH>;odWk z?I3w;Z|mSuUM9X2uPwR_%Hj@iA2GEBaH`h0$71PDwo)06jUFv7hT^CvfOG#erVT$y zH8n$&d5gqlaPLwN7odHrzIU)y`lwhA|LUgL^)e89(4Hx_>=rG;irH&nbpcQl2B{#< z5hO}`dn#ij8^}!Mh)*csc;mDApjw&}2GM;RP}tkr-8D`r(Ua-I$4AywT1T#9LSvVh zNUAnoX6|28O83V!sJ#P~dIZKRF6}N?E2*_v6BsQ@z?(~O62L3(;U%^hW6eQXR+ zk45+`a`|xFiLy-?0AcO*n(k0GA3b4y46=|WUvr3KFbYqbw9|M#4ZYSVitadNy(>H& zvByR`SBEWSXmj?6K2`KBCw)G9FmNb8i&l6fO1-L!CDl$03RGMMG~u*Qfkysi_5t|M zyYdoTpM_X@@%PM3mG2^eWeD!g26|Tofp(f|=8BcimYwhkKq?C~3bFaY%B+XI%CD)y zu+Y1zAWNe8STx$262I}Y(2OC3Kf$#~Xt&|*6~?rIp=nQREEU_3%o2Vu+2m4%BzRsf zh7G}?9*1<(%x;(Z7%5es;ZN}s&&36TJgimjQ@9GO zm#&$1`2fl-AgG9!RYz8eo4R2oMMd{lqEcGb;DC15^ZJ~mnR+8|z{qc-`iN_H!hh$2 zi=I|i80Sm#niAXcj%Gw=;%=KU;KB6C5^ahpL0cN!zggBKZ7b9kJYg`g28lyFcQk}c zZ*o?DT~m!MP_{m(+u9hrK&rfqgKI3XkYhuVp5*q`5DuC9r(w&K((9k!%h9~TjkcgB zDrpNFX0kD2@;|NnBm%df0(v$T8f+6)h|SdRlPS|>;#kRBxYrniGbFFL+Z4Xg%Yph3 zxTJ{Pma^_c96kDi9pkfPrr?qK=4sR?6+N{V0}D!qj(4GH7g)I+*iJ!k1!e-nu5xmO zc8D>5#;-ws@3ImxeaXcgj*ftg0U*57h44i7ob)qkHZFmr{UMo_Tft5Er)mXIm_JGj< z0--S%%sYIAXohi=)^%(OHsMwIvo;2^{=D>g}sX1BGR=k5;|lC#VrA|iPtf0EiP3JBUDpcQVq`UE&J(N zFi-t+(FF|4G*RA+s zsXvw6cq5lj*eHMes7Owc>H1rE(#p;4UO5u}#l?-q#d%pB4=bq-`8mQ4a+lOrgrcu(dtPh3uvCkZzMm=+v`(#B67EO< zytu8RLFKGlIJ+`A|{))GuT$vJ!*q)`5l2Wr>fHV(bAOVWJ<5j z6?{>fDyvK8v`1A-M*`@zvtT+Ap5(X1i-=C3E=~%@6{`f?Ux1T!2;nL{o7SwGEh=1p zYG-TLxcJ|=P2QbeES0oDU80w#I|5$;ER7x1wc$2~4t~pY3XlVmqStbTW;yDmZS*@7 z6T{62P5ulyL@ua@puzZEXVVmqe&!Sg&6nSG;Af7W~KLs z$}FOYHlQ*K!h=v|Mx^`jlqfschcc1m?|wsGA02BTU9OeY#I*Dq+AyYe9VpoVh6>qJ ze)A(V9};8B3ay5pMyH{41%wz*!@2NV-XEf<$ZLN7xhSi%RE1|O>UxM}9~NrBBuG}P zI>}`lr*$yo56sHx(xuoSnApq69UBx8>8FB401RfjlA>DQo{04#8#s$VAV`NpF6+3K zJx8iW-dYPx+h>HeT_)!E;mcSt=nYV!NzaO)Vc_+iKIvQBbxB7_()b3?!-Q_XX5`%6 zVVRe_)oF!N^4gI4+!&NeXe?B7j)a`)R%Bf6X8Xf+-BG9PLWIQGP8m4*VvO-!4}r|121`ZVcxd2htcNhf>fk zut|*M!Z9CjHP6j8NHa*Z=t3q2WE`e+No?dU*}KJgs6abV@{_d~r%=^yAXb5T6IGI2 zC1!Tv%m2Yu6R=+e|Z0*?9xzsa|@ zX6>_#__%B~3ajZ!=IV0H;K$b8k#a{sU>7#(|K9)bi#QRgTMh8z!O{Wg-et8^ibrwr z_(PVLdQ}Ehv9uN?d%w@4IgJjGv4Pffd9iTY|xVU)GZ6Rl)xt0k}geOFQb(~ zQ`$OLVH&E@&ms${BIafYAN5Y`H?GtDnJYwVX?01kH-L~?xx`n|hD$l=^0o_=tnC`v z%P%ys`;!-f)m|Z@cAeIBZ7v32cPHuL4Uoxy3;Bw-QyL0tF7j)juvl-}hkHvLGbM*- z%IfsT@>E7sj9UYQcNVqE93g*8MxtLE3|+!YlZcLa(;C{PHD8#2lko3s3L+9^Ydj-K zx_gn-aaPI1%wN{GP}D+^jfhF|NQ(b0o4edy9*qA@oS8#>wKJNE0gQuia^--X-+o+O zTlooDwXCsx{aeTo105UMV4$@dNzFTc=y=wlb3l^o=&|7yyU z0Qm5#CekntDp-jEljCGM4%U5!9=T@HTdFUt?~;blZqSE!18l?h$) z?4#@G?W_W@1RNV6KBAPK~5IgWzHc_3~h=ML7z*38K6V>sW+)Q3&xRENCw_MX%1WtWL;ccl zJE%(h8zD5Wfk6F!Is{5UmI95Udr@~=lo`)ZS%M9i#cp0b2Az)`lioSH$fLjs%vBFD z@k6u9#c|Ytp4^N`)^;0vZ%naPlEWb5>}-g6b?dnwoYDxAhHN#p`4G<0R%v8_djN|M zw$sUqoP)6RA$U7brI%WX&>C74?MQ9u4QqN>rMQd8b4NB+(OKB5v|Qof6xB$n;}8Id zsdHkx%vr@t!+NS`vwfW@A0!J}T|#|~ee~PgC$9D>BiVaLrz!0AK#o&c0RB15+9mSz zQ_>O}Yn5vfiPyjU;)o6p-j2K~R1mRIJYk&i7mdF$^DHkE`x{zLv0i@CO}LyG*ROyl zw#gdUy^kxR2GKiFBGY1!a3cay#2G~?tO|{p_}NbYES`urAPHzWGI#q6*Ww^KWVGL0 zWWZx#$Ho}_&X-Q2nUR%uklQ_HyGBM{)w0m;5Q@2Bjn@>;pVzL^obW!2;f+{%qmj#A z``VRTA^F#A2Ca#}+IIivVzt@9P{Y}D_S8toLsND(Y<<-(9D)_HlHv37K>n+fK4(rW z-#_Eq*3VdXcqxEA=68&Ku=^e)g02^6Wh7#4#oT43kLA+_`Z)ia6NiP7Jc~rEgU9IE zKhTVvjpXRrst3!(l!9dY!6=3T4z??j$a4i;GdUX^u$A{iip9wRc!v8cCjL8gt~Vdp z+>%1E3++>0ME!fAEL;QP-NhiTNIBz*TpFu7fvUD+MpnS;wMw|y5V`3BZ%T9|HDU`y zwyc**U^}xbkzP~B03~ePuvR>H#!i1hDt0jre#Qs03dzP|Zk93i)ErAgC;>XPYIhTT z$LY%mZbJve@FxtjxWc}(CqygJ+8(&Bing~aFS<^kjd>p$bE)&DcSE{dqxk`W*UmY< zXh)Uh1uDQfMGd_gfL=fR?z*lZ;|MY9vR83zjbtWU;TS6|Nn$tTx;a$ji$hb9L=f!-iUc%~IO-4Wd&1p2N=txN8@8Q_3FWrGz%8g5rSwZfjQkU%P_Xag z?^!!?!QP93U?J&P^exBj9=irUUpS8+-tt2I)LZ5{jp4Qwl!}f5u8L;#B4xND)o+$O z8MAz?qpl^$&T8qXejXaaH9bLhE+?nT-vG==zi=>w*eh`|*BRUmw|iii1vzPRKM9Iu zCt|?MhS&#Bjy_*j=#l%vIKM-lZ2tp+^^=|no|53{^*eSGd*9{V6cmH}oqi^NP|NJh z(tG?ck$!gn`4BT#+XC@|m*R73=<66_?0SbdFA-`XU>TixE)Kjy`T(yh(TpwtAOJ8j zbEN0v!v2_u3i>gL(%8jEse21B|n(z4lb+ zY`Hdw4^)_&czQ!31gi1cu-IqO00Y*U6Rj7O7nHefb;=879rzBj6m~MLaj%-Iqg*SC z$Q8QnKN`R}L~~jXqna;}hgdWNlm}>$MAy&N@Pr9fv|Mg+Rzt~Uau1Xy;P$R7l2KuA2!hS1I_($oViu&($*P4SZS z8W+^Z=d`+3Pej9$(h!a)fe(Gcj#xEsa||6`e9!41(4*d9zIX(yjS=I^ zf~%S}I`%jyR_rp>3CBMY2j007@@DV+;EgLXW$9-Y`HkEj)j#ZbsEdow^Amr2(tr8o zkZm-P9s4jbEd(8&bH~6M0>1zZ>LbCg`JN`I;HBYQCwx&KbH^off;0#zSz~!~A+Oth zK@ww>x~iEeM{2W=NRbgw4dS8jrumNqK~g{>a;3zttpR|)c4u|>K)-~N2n-%0BEb-S z`u#-EM)Obc^JIgl1xF&WVFmaMnRAxmiLBuo-X(#E6`oYI@N;U+T+0A=XtQaYlcviM zWH{r@7BSrr=tZ6SI{QnQcc|=e0WfaTyJ~P_Al?xfVg_=vj;~9=#;`{|BG$q~7h!Zx z3klMp-R8`^*9KBZXg?+GJZT#BDYFaX?Deev`c9M)g3A3c?dEUbOGD%6Zmpy~?xt@X zUiZb_vVHE`kXj52-j9izW2nGEiMC^8wq6WmnQe^SS;*m0%spUvN|w4aG&3K~6z>2h zIU#ica)FINUs1057J`buqM~od9@5(Tv~K$I6M2y&;Zsa$8o#aw+(#JcHj?8xZF3xw z9-}B!6D~Hw1w1?+UWf|eONlky4i64YD9$J@^1UV7Eahb!?@YBh3`-@{?akiF z+KU*Q%+YCBM=p4;$5?!ag`sZpx=qFjIb(vO`KF&phBkCJ91+93FB9U13`VF%YiLw@)i9 zu-iE80aAm%SP@c&W*o=CNcpIV4h%Zw-(N{0!F{X9kA;I13KwUcZ=J_`Xhy=`ek;w1 zJ6ZrAxBD8?EZLDw^=ac|0Y*SJj3B#i7 znv3ZnYHp`EVd;SZG6+8uta3bgHtj>06&3@FCkX{|qhyFAqK3JoK!I?hV0qg<_R&y( zpAEl-5@ejZ9lQ^cx;bm0>@Vfk{v(e1_^=fCq}l}6)*;CwDAf--^@Nc`fxRk}t18K% z>>R+KQ(daR)B)FAiWLTCg*nE=saWVMuQB+aBK2_u7Tby%E1B>&~Lagv) z-@s8;VusY>lGr6EN&E#eep$h1)?@2(x5ghm1J?o$6phF5plIuP|R4ZCe5OYrL~lQa)``0)^90!0bY{2 z3XO-cBgJ^17pT$1p!@mv{|>i?I{{g?c&c)~{5+qI6Z;e1e+I^Qm_-F{FEv=;i>aA~ zkKK!55ODn>LE^U>1I&yPyC=y2jRrOCJ=129RyLdHC3}Oh^34D0C)7*VC5NqTBi%%f z1_RUjloRo^P2p`&EWe<{-79Uz9J=>HL~2B(DfDn`Y@I|xT*Ts1q~_;Fg3_rBEzW?3 zZE$|2i}_ZK3^7D1>F^q2I-?6&iPCOZ2l8;nc^*cH9Cb-^wXb9C4%vqR?2K3-Kct<( z2|C8s6~U5X3*w8$tV|Q5G_^&c+$1=y+dV9XLQ*Z_-)R^Nk?B;zeMXpz#}9&4w8q;) zHS(YM=NHgoSM`{fs6hn)20V7q6#|;S%Ft59qG%)a3~q&x{hACJ=UiNFrPmP$96%$# z1&82KaH_Fo3~m+BT8HN}Yny(vHf|Rr z(R{JSV{2&=SnVumhffyxQ_@k8vM~2PHkW5d6SrEy;c6kHMD>j+5j5bILl;K%&`6Uo z8936SjZJ8pGIRd>Llz@B9_-RVO;YYrHrP+9@~%IZ63~BV^C(~elMr2IV-7HIlg7WN zLaBbCmYA1GmsP?k)oGr;=hK8%#j2%(>m~;-9OPuou?C+`M@$9nZ<>oU9z*XmzF)TLH0%#bwc>6|kcAu({FT4Dn^ zwpo@ywobHjB5)YBGsO4+iq3zu!Z^x^!yC=Um`pGb<%kU6votQ}QC-|(J>Fue0Uqgv z?849b9#%ql;wKC!bYSIpi4j^1%W)FDnKRkpb&DPL0Ad!FzNGuABz`Jn_jU4+2suMM zG>iv4PMk5&O5AgvMXjhDz4Qeo)A3>EERA@WA2iqGaV2fFv-qo@Gc12ixPeF7J+#f- zwPcWE9z#sBWz}+kyO-!rD{Wm?#TP^d=9zG3eTwFSR3c`Sg)I>?u&rKEshO8HX-LfS z2Bw%fM25QsH1 zA6fN)A8}~Q{D>Wl`lX(MTpu}>JRy;w~RXnb4hQ;L(lHNM! z29Csj?A-hu0}&bxkx$GxnFr$JD~*JXXI;@w9LGaHVxg#k6JtTB9T*vuXV%xx(YTWw zmD1xd-69sIobYIxfgT#@N&*uYDcZMz?j*wOg&crlI>vt)P5@=3N4GtU?Ur#yP7fy# zl%Yfr@(gQoZfJ|u;z({AJ=`gQIZ3rATrp7rjv=SrL!{Wn9V~Ly+1y0MDWxVk0~9j~ zS((!#vz@gHi$2LW2$D9OQBAlzDlLQcZe~Kyv`spZjwjAIL};ydW#CcS8ToiT515Ke z+{CiPk1{7S^oX@0IS#uOZ)slQbc!Yz9x;`&$>=7|0nG6Dh#MdSufPKK$P<(Q&=!BW z5)$ZKK2+xg2HOrY4TDck^uP`M{s&ZQJN^*@Nb zyu%1=LsuG*H6*u^YE?YNR{oqum=u4>BGJxUQ;N8kEoRteW7mwYu5q!0UYRhXbWbqA z>uDubY?p*@%R2DufE~UR<%bL8fd?}7NL*H`w9m zjnfSsIZr<&a4?z;f2Q(}iin1Cd#_1HfoOL*yU{cg~w}5|vK|Dk_ z3JYS7*nwi_80j{)qBh3RvH*A(DE7di&1#YWdWbaSLT+W-1ewu3Y5s1V!gpLSz>_U< zkAeXf;iN&NnM}k}nN8&$Ij!sw8&3~(@exjfeDM~;%~#^YiMoE*aLK;mMbFK$6h|}2 z)WH(uWJ9qYCaMRR(dF}t+d_YkCrn z<77ZzCCRclXGKC@9D>#~$S41>ym1TWS$^N4FJcqRBbG6y+Sq8ZyUH3K78sC&5kBXBA!rJKK@ai8C2i?rEEQKluTZhVx}VsE#TYK) zNxD6__8rcD`@b_|!XiKaEDqq_t7-D9=|{6#Je^i*Zffp#nT&y&)8dI#yv1qIC6k>_ zXPbOSoh+b*H`rw|7#It#1IykkvQ%*VV>|HseKgSGJ?PT)i#&ix86q*%#_f!C9w<5z z2~wN7#x4xlSPx!ZRm8gDJ0UjO)hkk$zsC-jc}=!|17G8o$e?o0y>i7#cxbl=1N60V z4paU+Z~ZZwxWp8i7gU!)f-=8%$Z6XKFG36 zF`V2N^xK*ph9rE9K4La5EvpT}V={IR+J1muT#W-_W&(ey)d^g{;uQYHHg0Wx1;5cp z3}7LD#}0I=iBN)u2rNm<{p9-tXrR9%@kvr(N`WWdv}ns63;+VXArvSG8Ug#FM!z}w z$cV!$%(B(g^PAiK8&)&PXw{0cqqWg3I3JT*<6DCAajypXA8s;QU z(n)tGamP+4X^Qa!fFKEp7nv8!ipc%jPrX&^3V@2!v*+wN`)ub41uQHqtZS{RT2*g< z<%lE2N0@5IX@tNqFtNN=zE z!~q6D?ic{3lXn8S?d0*-8t`SH4rBj+{Oa3pSn=V&hAq0NxoWEzwQGs}V8k-hDKD)9 zq7y+AR)5?94Bm~?v91@SRD>mVMO>i{oUOtC!+hp%Hr5B9Gua6S^}cpgC+?OFeK054 zheHnvagrsqnbDWxlo-i!02huJKc}a&{_kMR2xx_C_OgKU)b)t_A>8lHG3dB|;q1v6 zU0xG&qsvW{3%d>c7SD*Ar7|fK{!qUALwqldkFg+DH}KV|#SG0FV}^3P&tkwO*_ga^ z2UtH-b^j43F&fX5oh>3ba!fhZT(HB?G?AMyvJL0xzUV&{F_dV)C~2Cc*?@5XvQZ>- zX2SNKwRb~A8=giJ$D8Oo&zP!zVSLBR{lSbW$%f9D&LHay&G3(6bIHzEaM)o}1<^kb zkPzcX+6qBmhuO`-0c>ZL@xG|GVas4zK(*(2KBj!s)Re|n$c}>pm6zbud4=65Tx$Dgb70G$4 z=k>L37-J${4f>#WiiI|D3}gH59wmaFbB>~pS(wgG#N2M;oNCjYdn3>IC~;Gau`_KT zW6}0At(*8yhq-vH;i3yX<*3I-dj>>IHbXi5ao5UN=~MqeE8|;#aioK@VhDM%u@2lz zT3e$o>XDY^XqdH14r`=ZEUFy9k~Anbe*Hxbpd3#Is4grERV~xd0T*u?Z~q*-{t5e% zt)a{ZJsIBaid|8gah_3ciWu+g-#2-W_;vgWRIIu?8I=Zy6(?hf$f+a554=2{(GDWL z8%%fN&e`R_GnxmsOs41$g~5QQ!0 z(1&TY)-^*m=80_!9Mjx{`(zsxNtBI@#-?@OrL02tCVaRR71}O$%D$E-I7Gn$3Fn;gbz2C{Ll*_!N`ba-DtyoR_m1DBYG`ZHYmEXs-Rif~*{ zUoe<(9y5*t{Fv5bIM_}(*65 zV{9*fKmrWLu|5Mp$}G~4LOTbFK^k8TbUnhj9Apd`ibH|PA^Jh&aE(f`XPgqm_OwU+ z$MqR1YD9EYxs;m+dQ87qr&G?Md@LLnp;qhJyj)(NKYzx4T+g4KtH0VS>OB4Z^Avtj z;!MPmNRr>{s{bC&Mb|U|QfPjDn3cqV-H^zCuT(mYCy^0euDe^P%aW5L5m$n(Xw&qp zy6(=li}|Z!U8Zw@p`09j5e=!n_lFmAS_et+EMBJXsCE1YWU|(I^nhN@k)54=XhL;Y z#8GlbMFJS40z*^7gUCQiVMgYaphfg`ogjHk?#S!@XF9;^^Y_&A`WjujTyf3y`|L4) z9(3?upSy6 zmH839+F4amofB7l?M3ve7IFatqgqAitv0ROe@e-hxk|oqvy$)7t|=Rt9v)LTHlPNH zex5Oi0IgOo89^uq@@LS=qW1NW*qBd$cNwj}O)yGw(I`RG^hCGSN)J`ie{V+<<^BTTLw1O;*X!lx6^)|AX={te30aAw)8M3BL-!&bsDuxHpqkmBc zP7@iEPH35Sg48*{98ZXl$_#+FQGJ$H4LGN&rRy=tKFF@G^$RzVp}A^FEnIU5z$MrmT7`lEP+|*q{}uM{ z>rfA=ypA_Jm>fKRS23ZhYVK>+6-tTv6E&qqAX7BppaP1v`%rAPg`k!}GNewv!)(0L zphgPoav;wKJp@hou2+%<^Dv4D7)#@wkI_H z#%fQg_~*dRZof@#oKI5i-x^)lTeX6qF>_vxgYa1oA+dGlJTmK1|0@kf!<1<6}W!QFHksl>S*G%mxpzq$-#3FHI~2Ql~B>X*id zfrNoQqb_kAr42c9K6mj{m=O*fqw5-Jxe?L=558;N|1c?5mnI&1E-OGVN3i%$z>o{y z$r|%=Bc2t1IH0)~TefSDRPFaSks9%`bAwe4bVbMitWPqwpR&>jajraSxDoW}Fh?~RGAQsWbSHmSBi>US(U|^i5Q$}5WwOx_$G^V+vVplJp zUku9l+K^f_WsDY?;D=)|w7zVZNbKwqoxDG+`7 zsz?)+N@CGcOU5*%>Jx&90$Ml+QKJh{$3%6u^hN|SDx<9pgw}i}U(Ki%f+=urPDON& z9N4sfo|#$SM9{2(N%_9*c$av-C3PFrD?8xgVDFE)u+y^j)|Z)idVdg%N%mMy?E;ZC z%mvdZ&>()M>W+bMZlzjE5i3jber7(W*sYD5E4l)wZsz@j*n&*W`}EknzfZgQZjHsG zDmD>0U~0=D!NYuRICTpAYOyHBCBiy2mE5L(JT8rdXO?@fqtIGbff4o9r)YCb3UnI| z>kB#X&69S!+TDfWN=D*{Ca*(Ptm+)9Nv#@II;Z^%$)T53uHAmvzSv({k+=dm?S#9P zK_8>#vf1i!gTsw`?~P-W+BvKH^!TZ#hUv_F)`xYlvKR11e0o~C&fC=Qf}#zxN!G4^ zoM;(PD>+XR!DJwT)pg`!FIk1S>J?cUoOU)oYARUa3o>$AuRl{BR)9d6jM&oKMbn7P z0ZAbTs`vwz!4aVb3);)LM#?d{1Z$uWPt+q7>#sDi{$TQs0t*8oT^JTnL6+WQ8pNgT z{^DRpa`r51&dwh*Z)EB$cLs~JDco6q-q(zc9qz+`=(_H0s^ehjp^rVN7(RR$7Nh=@ zcFk&HGEM%W1xq=;Wi^c)%l+g(xi0P`9V&%!!gkv?8|_F;m)hz>Jqcs`2%ZoQw=@A& z8T;}<#^)!DxRPS%CiG)YW-ZI2FNuO|*11yCU?-1061@aJb!VD+!#wnm-MWi^Vw?V@ zxJ!WJudbu1a-$qfjU#k4At{$np>8&Dkj}T1ua$}Jtd#@3V~*+E%D3w|9(gpd#f$$X z$&EOWg~kt)*`)&Xc-28l#$<&4ug zB@w#`z3@zO$vaLiH-W=bayOaMfAUIyy}I!V=le?8Hji@;JeiZU>&;tc+uD^xqAGSN zGBBDB2t7sRcp_=jK#3G-rq{*k1Xy+S`%(OqexJlWlUU^`4dlXA`bM6@Bv88P;1H9J z*{Z%_<*n45osx}@q?h3u6`(K^tBmOPoEoIY|uBCO`bPwR9B6yZ5_Ym5UKCE z+5odiSwKig>A!G{sBe7_us`V0XlO*jf|;sIVs=0Tg?{I-*Z<{uvWAkE?|Qyh$Z z6W-xw8VOp1LPs!Lbs|mBx6t@4Nt46oEL)Fub;f=cRq^nlQ9jWiU9OmYEo~R ztxKg?jk@58S~z=Wo=vuqgl$cctEumPOT`}OdsRcJO;f&yo+lxbI7 z1R=akm=x*qVEH8(cn|Krk(0~kHx9}4x?-!zBc%%%C2aeSlMv__0os!(=o^3WIVR7K z&#@mxKIiJ2Kx%__yP56V?*q2h@e-@UD;2#_Av>i4-8b4R)E$^W8R!V6rq8G8_ay+c zRPfE!ZnIS-jhWn96>e=2G<~pMN_B)AKXhR~V@F<>uaulz8;AR?*GsrsHVvTynk(op z%Dx&M8yPrs))}ovZ}e;H%w!&D{? z76E~i_~ukOIvsDWMxdoMhTuclD@t{(0&jKvE?z^NH}q~eehIawn(`}M-k#SvQh zn?8GX(T9^^=_h}`hY7GU0cQifiI~_)E0-MpAdgaLsEZmlt~y{9O%hOK+T#QOqNc=H zJ%BkwgLmMVt;2L)b?a0JYFR$jp<*)wDR46OP?H_x?n2>ijT=EW+JX_0!e*jzks*R2 z+vaF{jrO!+m!^2ux>G=fzQXn>XWyVhv|2Wa@vf%E8A+1|>J=5cye3dJE9Yy{8)N5G zer#CGPS6cHlQHTiLgwx2O%jHh;X^4(&VFTtT-unLA*$)3YS5*}%G1gd3=<#3IK?TL zl17Ibfbxu<2c0781mW=Va&!KC6p+XfAgW$+{`2Lga~_p+McGbZ47|@^?K|JI zYwLct-j|E%Ud)DJZI3#qdtyP-Mc4)+d_3w1Kzw+4{``DeMps;zdU76JnoOB|TJ3E8yq{@$lzlv`^?-8=H5LZG~1m z+Fzbij;r)tx-arY8cK=u_y&&wB0w3skEuRyrPYt0oxmV@_~NrqUVm~q+@GC=dnAl5 zN4S1YIUZ48uCwG`qDRNWizs*|w4p_t{kFUzdFl81>i38u^Xy!nKMzI`(IVQ=mNNA2c)z^rNKod$bhyw>dSC{m79S@(FXEFjR z3tu`}X}BBmnvC?A=d8SK?%Z!tJwB?vzg?^Et)Dl1)aa`#-X4QtFA5NxX2fm#@!7b1 zC*|Sit?#T$qsaA6QYCjcKwy; zoi*bLKj@=GyBb6x&-ce?m#b4yy@=CjQ}y?LI9b+awPidKg|p5<8&Ykl8Fqs6praJ& zPC<9hR(X@D*cZ}`2AX@I)n&tfi&3mk8ftOR-BN$a8nEj1e4&X1w{-@acQi#}v;FzI zbWTENW}SUGGOhd6g#i0ReW(`W7vpBFw*6yZYr!2&6D#>n81PS7a`y#RS0g-VquQx; zv*?>h8Z%xbg2q3CA5A5|t}o~35%Qo14uT!Rp>TZ+lKVrXa797~_2bijDxK)pnysRt zSS5sypA((8Z#u8AvrElqcbv@=Hg3T@r)8#FV-j5cWQXSI1@3Jwo}Y^Q->0A(DX zN(_HsrPF?oAn08c3WEbp-61869gom_;DwZ98%N`72aS}z4m~$Mu>QuGjTJIfy@l)0 zDCUyZ;myg98i;OHD(;h$v+ffb-l;=P{>v@BQH(sb)RZgKnG4?N%e4A1Zab6U?i7F5 zr7;IkM$E#K2R(r~oV+st0-PYx$2cOz$y5aj44wrY7u4!G5lvX2! zm}AO+%5ge55w^7)ID<=>CA0lr3SfU5cqy}?tSOO@Pi!eH<}=-!7!oZtiu5uAD4dOd z`V02jlk)VG`3#c>pPeNIpX)}GLzL~P*R(X$AdzcYZstLB1@{2!%e?|umBG-SxP`Z9 z$Md%wa2CN`iRQnhy?eiB1CX%M+j|m*dZWLIEXK-UI2pwg3z;}q^M|tEb0>eUeE-#E z7LMj^`$}za6Yj> zIoz28gtth51@E91!CKvTyE1Rp-~)YnIx~$sJ-rdeNjC_Pdb})VrWuHy%0!)c1RA46 z@hvoo%l-b^6gDtCK0QJGy@!9jcoxrGPNoou9Lw(2QJ5UI=qhou5-%8Oo`neRRlO7x z?XKJ_0B-7WpSf`rq8V=o3i>h$H1>j9*>L6+<~{1q5Sdo@y7<`~>s6Xg0QO(`rPbWB z8Kw;J@i^MMajk!sg*@k#?^AL!e5=AKGkDC|1y6Gg8b1LZJuBlJS~`EJ&{9od{OLUj zon=1d)jflmJvMLq`Ps1G2+Mkm^@&grn#e~JYqBadU?o5u%LeErz4mQPg&yw%8b0nS zQRq_9yy{3z6r!TDwsHeN5JJXEKtD0h=lKXo0NgR6<}zs06~H=}#nF6NXmn>LWl0lo zP|;^W1swa_3z{-D+zUNQwnvS)i{={M3*Xnm)VRv!uq;(eZI@w;*Q8@jhc~FJw@0GQ z{9SZ#4Nt6P%RmBsa!zHs!tf$(4cXb&ldSO=3$cIej#rDX(`9+nlh5%NOMX@XP&gbU zc+G#K3evJJ*4t0{FcB-s3s!^b$~ogdS=-tHcqO6wd82?$C)=YojQx^Nthhr2(cuFrqO3SY+SoNQr;TasB0yEJ{hY%vFPx@f z?hIEq$q?V#)rB?0s-?pgV;{PqNWeAsMrKklJg2Q#?SM9 zj`bm(luIX7H6`uJB+Gb`c_=WTW=YQhzCC1W|NeVhUtE8e8FtX7b#_GFyt(+$x!$U67E);81Vk00k5gJEJ@-Xc!aTeb=AjglM3GcCt)Cry8j zA~tpgjn_5mHD|z+Mc0!w6@9PqCNu|CljZXhf2!iF(fF4R$NWBHCt6J%=FhMCSL|d) zJx)8wN`r1PU4pkgTOLe6I7LF4itgHO35+bHdjVehOQm~9D|dkHixL2Sgpp(_nGtCdiEX+4H2M@?lYw^?Ebt3P|5hz6H<4VrZ`hZx8N zVXKt(6v|xM!rO4rR*M>_S{$#_;|dxBf9t)-qR%ofrrzgS+f}?#&1whFp{BU6SM-pj zf3}{bZz`jQ7pnz{rp5S`iYzcb{4cIRTfJk;g01Z@~@&N$6mDNsv;hZGg z(W3nffpN^iIL8S4Tol*}Xi&Uo@#IC8(EqfVwu5I9m$Aja5+)$|eed@z4i3Oqe-gU@ zm*=$CIo*&|-LDvQ=mo-S`|%w2doNKh#?VGF&$_p3+N0YFHH_6lw)!tJ(*a?`&1AxJ zs3Gz7ue+NWk>Kke*69rgG1$0xl*&Tr#PTJGUVL(4eLQU-`ri^pV(@=h6p6FjBD*fP zXW8og*{1vj@gmgFA*p}1Sp9PBf7y{_JX- zo5pCr#(3>B1_j+?xB#TaRKX($gZ5WhlZ9CIoYDc%sFgu0MZnOh1~mvxe_xf9N>|yr zP9)(grC84gOh#WS17kk1pxLwEBTQAS!y3YT4&-FYV&Czz2}Vj=$mb-AGIgiI8=~Fv zPwF}o=vJJe|{94?iS$=I3$1~K{zq$)fq#^xV?Gumuh!n#);F%ZYfSv z^g-%T_Cw`|h=3rMiQfQDgF2X>1rr+MS0rIEPW2$TC>BAC?w)mT%J&7k&vpVVIrYNW zExEC$iK$6<+g0G2k^R-P54fj!SQT3GByF2OF(+c4EEqSvOE1#%e^%B%AQoE?_x`05C}c`Vgl3!`Y=yoR{8|ov}Bec z;u3p-solaZmZbDqz+PZxi%PlR9V$8DkR43y+D-jey4~%3Agls4YwO81{XYi5AM?dl zu9O+2vh*yEf0Fj?7{dgvOEmWqi>m2N5l6#P{h@r z<-;N!gEW9f>Wme9yTL&}Vl7dK& zY{07^I7F}LWnyc##rhQ*LBo%!4UX&wp`^i6j!X19ONN1Le)QRI>3`ZD>36XSMs}0< z-Wu?!e{g8p>QKc(5xAL8w(TBh&G$qploGt7A(Sq#A!J0;UN;1bVt(m0B1LubsQLwM zJ!6#^f3F)ZvdJJTht53|HPuVgDr`Xex-g$6f4TL#IMYo!djRr+ftlViHAqW_~ zLF|H2iU@pnWr>6l^AnW^r>EaDmfk~OjlRg*e`D*=79t31k>I_kP5Z6;-IKxrxUG~@ z405Fw8ap~6X#Paq+B@DQne&xe1A>Osh91ZUs+)pX%Ced@$ME!r%!jymsg6@JYbrJP zI^D9|)$T=OB0FaY4b}_8PJ1j+yF``4IJ0H`n7NK*dS*C<38xlKCELW4TCE=}S$F)@_UKQQQ9{nd?XlF=k;JLLi%b$N zmpV*2%_GY;c`-~(mH|Hw*yZ23Prk?5)GQP;bUlbPe??f0rEg~=tF15!2F!OF;-KV91Fl3fb;`#MuoHld z*`SC^Dv*z(Ol(vq5+%o+ERw$|GMR_sKG-f`;&>50E{G&{oY|^Z6;x-$^)GpL1QJ8z zgw^?qPU%M{4EM#a$yAbl$U6zs*}6au3NM>ckCmkcoY@NGK)Pt7SqZg&e^#u4un?WJ z(I=ZqpMXT?j2pgXH{vliEQSK(_jM@OE1YQaq&kKu)i~P5L*m!RSxd{dT@&;UHjfr)|`Hor_-YFwT zPcD@D47%e$nTW%0!&+T`E$7bA7gdZeISzQuNlCt>+31X83Y?5>FST`LlCP~{wD&n0 z%n6WZJB11jXhzYMfBOHL5gX8;JBu1eH?tG^-bh*!^!!Wv zC7x3+Yq6Xzm8h;*vii}uS*K|SD^=`y?G(rz(_cO)zdwNN*P?9?atDVq29WDh<@;1n z$*+gw5sIJC-~FC`&z|t#o+BShSaOb^ zY-1TqbH|FobfOOzO0<~_Gm=6^X367Dwp!hkiRR@jMD)Npa*EjCLT{o6SiRK@rJgfZ z+Kkw#I)(eYGB0J*B9hUYG`}hjJndK0>AWfEB9W>UOr+c}uqqHNKHOI3#Q1=|uDbYt zFCQ5!)zRh$&st zRNQf79eRlO8o)n@VHT@Z2}PtZaAAzJU2-uNqx{I7jXQdZRZ#O;jkc(-O8I#}3qw+)>x9BF&sYVOBr)Qc{f zpM|kD5~f~l>%Kg*eIC;OVekAxHrwJx86vt#)*wp|+jaTcqKr=&s3-aN!JahFBe7?S zYBSZDe~|98$Sp6qH{R-%on8${6@eJF9;PxRut&tbR;MVN5hqRO9B7H7ovKh=oQ{nW zXqIxq39fpO5nmGfpQ-NtY&rFwyVI0kOF^Vczjp10>N(u7de3KiRbprfrB{8(V7Hx= z*HyLFETG*U%)qGeGf2ltLo$ws88xYbJjXS5f5kmc@NCALKCTfNnTXtD>rU5AwxKEY zFvv^8v+f_xSSyvUXy_jE<;$FeX5Si(4VS65j4Q)z{yCce-6&dsOX#zmU)dG^c-51l{ImQH%9Pz>nVc1 z2Y2X1c0^=tEVUpcDTbE|2P~=vXy-8V%6w)<|{<`{P4zHNA~hZ=lZ9SI22a&0nt1$5vs2SPUpKPEc-p|Q0-|)d=)8q3a`!e zL4+%{i~cZV{jFqWQ_XJ>NaU~S9jz)3n9gO;!uHD_+$ga%zOjcjo&d*Ae?z)y9IDK8 zg*jxa+lfMN+%#U!+qP6#PB>lZKDlt8{Nz4)GCG6~$OC((1LI>nqFqFYX(7&*I^-=L zG1UxYdqFQk1wi!g?Eq~lpl{`M!0*X5br}MNtsPA6H4LVq(k_>~qW>14u`57~uTM|c zEF)ThX{@5-T_x5NryBlle-(z#7`L5CQk@GDDo&5nmH3q3uLpV{s2|oGId0vRlrU~u z<`E*IK>Mb%B`0sg=lq+cV z4$erf!f8T8_3Z$C8TUv8S`xv<6B>gy5}^=fUivL#k6`1`DeA9te;PydMK5jKVL$Lt zNv`~DM98THM@fY)yNc7CIRKeW2>lXS5qu)YEga`n9wyKe&=OL?+!=~~qQfU5Lq(rD z76qzkGFXR-t$wOpm7(c0?~X^dnv+m!i_jE08VyPJbXBMshzci#ZTEG38{vIvoNI?2 z>;Rt?lVZI_5P*iof2?X!GFNfnD4L#icoFIV#(ljvX2~O>uGsuZhI39buVmc726V2B zY;`7V*SSpr&oN0Z&c=M6T_#uEEjTpmE~gY7I(;}D!CbR#u_k7;ptj}Y4$cL?tB+NN!C%x!i zIgfwNY&K#vAfTOwAy)RmWwD7fllZL&gmE63u8B?O>Hdgw(>0N_I0n|0%Bt#1k!fEK|I9Gve=>|04ysdqm?EMiF_J-6z0^p1^IX%6;Su9+(b~UmYvt@7rfVhsP}k8cM>8r<2P~HlY5aCNP3!&5nxhvOJpzI&BALlzZ2r1h5lMq7z*Q} zVd66`gwao(TA_Q>_%h!S91;I649bER|rR9Hq>oayo&PWdrVerm`CcLXRhz zY)aE1BHH4YD^GK=Jr%SD9qL*@Tk09}TwB-JmtAy z9Zr9NKO5@a4WNv&x6;`ozqiMOvE=}mf7LUSModfa3Q++=ERo>2Z{@G!vkm{%%yw)h z9h*tVDufgCXErkPJ!NCV%7Q7IEm}8l3vSU9gIFK|H2w9S=5(dr@lxe1iYoNAgt+KN&r zK5!*VH`CK9KRcs|)z6oF2>~QWy-VlG#Yd6N?Y8s{5smhnEZG#>uTbDMhz~-n`@En8mS&@dCSPivSe~W$%xQw-HV_1$k zxGmab1JnmF)9Q$#7*NZCx^zV89XzmFJ7pv-!h6vKTBq@$=(UvnnnT_l=!=d4f{J=y zO>TxV9`T8`viHm!8`#X8*+)gBhgOHemhmk@g-BzxCthWWhME))R%2SP2BR>;4#QR= zgmNsW^&zXK(Tqylf1Ay7hM!UqWYBN9Mh|qRlCk<`0kzq*po#~sD&txloUlcJGO<&j zf($(!$x5!5Y}AnvqqS+{3)VU4)z3!TY%azLXG$xdDlD7c^8ymv02PQiM*V~));_-=ViYXeNrxvkSFbv+^?hb1xR(wEAQvk(6mXjZ`G~%$x^Lj~ZL5$nLsFC%mk#3vHt2 zo_xvy^i^Fu+lkBVZ<65xaZ1LLX7oA0q$fz zxp0A9Dnp)}e_gI-klkE+%g9!kG8*Bcm=Z3kPGk6B~@GBnhn zY1plcEe-rHvRD35!gXxN7$AghtO`@@Ie|l6O`;sFYdsL}bFaLzZ9vSzo z)5S!5E$Gh^w$0FWa3Ww>ZU=y?3)VqvdrHRaWQZ;gXdKoH6=-M76CMp?df!%KwBSI_ z5CJu4#bBAo3(wv@AB-)nA8SJ_I9-gDg?`2!7rYg^G&c*)mMVqCMQF$o7rHTpy1pD^ zTy|@$Fp9^}~>8XFjuVNwP$waV)(U%y7 zFUt3)+@$eI9`GWE?%80VB$~6JlZT^3XIkj4f7TM7*SfLEY~&I%HZg2#b`tuggV4ie zUMFo>AchTLg<@qKX?Pnu(Es+y+Z=WGhlF1JmHy2Um>OYlHLb3X;%2p5=Y^Ub=a;vg z^J&LVkkN)kCv_@uoKe{Hgt zA>GSyA~R20l|S7h1Co4x33TyS_$4tmewbf+=@;Ya)->s5rCRe50GMtT^V5-1Sw;>> z6s0N_JcC1Gg|kw{!{c=YpJ0HkenD4}sK($WY*b{2sMg+!!DBNgHWf~6DxBCly~ep^rEXrt=_C(CCS z2j%_e>)1>H;i0J2qF}Sm8vsZ^x4#y*+lvpZyQ#mXpIVngqm|>8>=?ppN$yDRq<@Z- z>l*WB73tm&$>iSo8HEA%k8;!iL8(@x<8PPqJD`K4@Bhkc4%51r&lSdqx_haNjOmrt zEj?NyeKl8CyG`+RdP5fs9{Q>H&PUpJ{&Pi&tCFXlyP|^fbUUm&CV- zbg|-U3FX=mB^q9CFV~mL%gLy!0Dq(wyudO&rUi83Yq;RgS9PyDoXTo*NJk;~0FX20 zl+yL-YP4Ndpz?GwWJIgUu0lD_{lkit7+^5I8_9~kfHuqH4XoUrI&y~5#+$!|aF!FHmP$X$P`J%2{WFuye) z658h0g@~MwbFWZ^{;4ryf91;N0k5+El_TfW@4xln9T_{hZ5lx+rC{o!OEOO)HKH8w zM8*`pt-ozp-p5I13Pa<03HHM^;!ZtS( zv)DFp1ODQjo=eack$Tso| z6J`8e?Y6D?Djm1h#fCVEmZ)i4yCo;)^D@6~jkCF2ELOB7j!CwYtKE(K#gNJsoB`Ao zmCF|pT2va1CuPiM>2gXRlEB5AUA8Eg%gy6>utz}c{UjvMpvQv z1$kz@_H@M1!hfvh_qmTNzz*hCTfjbVw7jDpyGx{e)i$e)}~v3*B^cx6G4(ha1~ANEJPX3dcs2$+ZcOt9PkDU(;yhM@%QUwrlP<$8oLJ zmGoKZ$tV}M*}FXYC67L#sr@hA$B)jVPcg}dgVRy?CK>*GI(mE_y7$>k*Z=hS>;0FXfASf;b-zH`<@x3LdGsfKJiNT6f<~Pf%K{I00 zFGN#*X)t?9X&4!wFYQTo_GZxg2kmD$G2! zjW{6UZ#KgzV;AAUh&|#|iO>vOWSGQq%@V8xV%ZWQyBiNr2V zu7)KK#stn`w0ih5I+@yNrdK>Cpc1w0^NhMmp}yH7W*ARX3g6MpnX)&@0NILBj33yj z_ZSKed7^7Gq9`?Vrq`5nhJt^VkPd_GY`wbO1fwuZrZ^VihGEN)d$m!_O_YSq7L2L4 zA4mKro(|@5@Xe|vLx|0=H6iu_laiXUU7;5ahl5|vW|!wAUjz}lKF-`=+9=KA?$dvK8AD9)gieY~uUfdLGkO&xgVR?X*EuZvIMp-aP(H>2QDVa`Z(c(XfCv zd9z;O;~WqdBn5m7E)>Oh%|*dNyp*l;{QcSO?d=&18_(!-tQRcCeTYzNAXt6>`irxF z3nGbe3+T$nLHuW`5@Ns#b446xxeO!*qNLz5h~DGg`_f__wG2NNU2Pc2*~x$umE$UX zm#T1O2VHmiI?BY`=kk9!{?fUW#BZNN7v?S(c_q+^#7hOL?m7vlIJz=A4cx1IS1nw$ zn=2N?!dePr+2WR>d*v3TK)^TbzDh@XW6K89R%*8q8D%{}?}0LUF!Nw{R-K)2|VtohLt~rYu2!Y{ha zJ+%9GuXs84qS}A%*novZwC4$QEwYteh4EuA`sR4w2PkV-i>JWOT@g^re+2 z2S*0NaVuLMW(U;illk1QR#OxXuGChioEOzEM5`%iunL;1_{YD+vV)2AO1_X&uM zyIQupT0Z_d8hCno-F0?Cs|Gj1h0dpXBw^~D>JEQGC&Ru969ir`(bu4t(KWG)@4`q{ zy2ecG&tL+{8*nre{8z+;$41}jFoVxw-L=XuU_uC=96Ofs$Bz|&1K4z<*zn}!bG6}1 zRyc2P=X<$$aj9mh=bfZ|YrGQ&!6|jsAP76EmFgT{?s()#XcG@n?iozfPwnegpY$os z&_{n4Z<3(%4w~k;=rn#NFge(pVWK%6j^FFDKM71|r z15NzXLxp@p3lVr_`7E%xsa9<}Uu-|(&f%BXR}#z2Nei35V1Re`%y zS$w(fDvoRDKN$^rYcb;UxRm13zP_Y*Y4oS1(xNqvH&@9>yTH)oi`T4aB7wI}#2~q)2hHze?V8urLZ<9Qm8GK8H0UF-K?toJyaxuCjz$ox z_DJe>p(_%%-zPg}7z*MIcS0XGbitF4y5(d8&Dkb-A7SS{d5;4_Dnp5j)K!1%P2IyD zq!|zDHGRppVmP9CkFB11Yvm!C%%dSqljz+jj8`s}$sAMkeY6?bLct`p0o|mB)0^B^ z1DW1R1daLbbEzX{JAHW_qqrMJMsq$wX$VMNStl>lk~3@N>`ZTNtg3F>+E(mZVlai7 zS>^M9qeiAvZ891KEJB6+&MSYG|Bks-$UCYJG8^35GuVLj^u3}o7{0@HE3PH%q@2;2SWKWks2 z%JOYXv@wZtQ8Y$$?IY3KLqv-2g*HrfUuW~}#oTb;rtm0ZN5ZPhFdx1vF)(!^!fQtb zn__(yQZL;G4AO!86iTuu(x3yrS}u!U@ryZX&Qa-0E~?g>RrKe~m}qdwE2X4?o4h{1 z&F#p9v5uM77H|qYX|#WF^s3lDKK^-q{4?K6G>qj_yQTjzzh`80f%sB$9Wuu6VyhuB z9})9gn>Cpb?#gxqBZhfGy;;#tyze%Fm7L`k&uSgd|8 z24_2TkRo;P4if>!hN)_ZT5+gWk)x{3i-tO$G&Tlf%9@|Q<;j2fzdq@mPowW}1V6kS zJvxtGv0L%ra!JXr)w!V%Q(qT%(_$H(mzF#FdsU%d z!^&5b*Fy=wLGFJ4oi>UM2Q)(wI02<~f?+^>byfRS3^Fj$onRD1g_t;mMtx3&=@(8o z2n4-@Z;zQYSI~cCve0~{;NlSWO-fV}Y0{vhp~cdWU7M2<-qS!qF{NNr z^%6Q{1CykODRr%0Wf8JFMr8e>O~*Unjnt!g#2}3rT#J9Bb+sy&ZIVr`X60|haCCy| z&P3$BWSi#(ilNm60`9IeO1rR*{G?+fr*W%L4uV2z3S}-}?K)sdXq{@6l^#(Ug=E#Z z^YGmBNa&Ic+fFnED>v;Rw%)|2r{Ak(;CZnlGWKh;K8&H9@(10Y{GcC&9PQI-n~QDZ zdhGky@wtDfHSG+^!+|*F=M9ee_h9SYO(x7xsmv2S4@Q)mr zGLPu@5dR}*%K8Hg{eEPNh@bN6u{70^I<-K zOh;;gbEpp12d&nd{or;KwtiUMa?B z;35K!GuD)z1V4WL*Dtr*8}&dTCl+#kZhci)2R5lIZfKW6JW<$*O++n`dI~Q&Cl)|5 z#@Di4uY$+%Ne)MdgD|w;LyDd_8U#L0RtkSbnoConzDD6dbC5H#crC`6Y^t}qq0*n8 z_ywWvZMR* z_3M{G=oaRk0Gi`u5gygKu|4#STHd+vk@O;8G^W2lvroL^WA!zdp`pw@vW1d(UODdN zb6ZtJlTfu#D*w;1p8=ffU^fqQ%-Vl8!m%glXeKHZeLK5di{}00qCzJ4nYiq**qy4+ zCSv4NCAE#;W9t&9OpEGw$I4s?GyyIc#%aI5tJ*L&6J=JHG(cf#MGT3=VnxXT+a>jd zSQW5WmbNgcJYy8CHI5-c#xq(2*t(LeX)*YA*xknuY9AW?1l2)~=t!#|rn;fzLRsFo3 zgqMT%AUWMX3ip?T%fWfyTXayZ-NZqzPRYgS;YJ^t*JC@q$pu)B6@3gvzUl;TYJ{_y*fW+yovpTQz@5W!B|P2A6WIM~Y@aI0)#M1EczcKU0S{CvER=Mx2I> zx6ZFxyMXbvALO$z;&<@ZvfuEDl4d~q@sC*GDb)2kvm%N44}k&TCA6U&@lvAMAcG|( zehkB!j&bM)i|e@3TUq6(PxqQWhf~=_xWfW-Ow!bP72B0jQkPh!)+T=$J|eg2rnOvc zTbM?yz@JhV93sC<64B!_9)5xI`NAuCYEAtQ(YOI+US42fn49N!ZeHoEHww`iHf~eF zR55)IbpAj)y%jySgEI;m3pHKmNEkdZD%8yJ23{v z*#ZvHIcgtZqlYGv*?502%qnCRVZXys%wY+#9np#}*6Ea=(DGwJS5Q+$x(DlDXurEQ zTDBpQd*mA%+RB3<=!_}O?}XW;+u^PXwM7_mC;bat6N zPuM9^+bg8X@NyPuU~onw)X6;#PFq!bs18?3`Z#L<@s<#?!OMSdU%kc@HZD6_dhs;g z6Gz)Ewr$F?FRTQ_pv|_hQ=5uK?)G><`|GoD`R;jObhyq`gWSxH-S82F!qOO&Ak@7t zN>4>Gk^|4#F%1PP3k(1R)le2S6*ZlLL>)Kl_@_i-+6MU4)e0M^01!P1`JnnrS$YBJ zLbD4szQHh%jydwRd$3ZCe`uyNB5`u)rc^aSJ9~c3OEOKDi)HQgosW9U;ok zhfo6?8#Em%ezjq>6vyX*j2tattrcL;FLORQWWGxjr#g2Mtc!UHmKTPt$z0WUkN}Dh*Cg6px655Bd&1$~evVQg&(52;jBA~co0B3&<1}5+p(Qp!#qwx9J1&&t7 z^f_G*7JX^Ag7B0;oj2KraeL~=Mn=pGFI;koq}ozpEncQ$5#+p@6uMrQ;g@k9xVn+M zvl)InQ=0|f<~+Di_mm5Nu+IeW0h}_*AZ>Ykqd&C_<2iTHQlLW|_1mgCqTxf}l9rif zZ?UGhpL~BFCZ%@GjL~q@nMObpSipN=mi8jFAnqM3z@-ZL=ARg`?!m$_PO9@C@pg$T zA(nf?dgeh}>yIHEeu}u@)Fm(GCFT8&$P;bne_`TxMdwT#`BImiT|tf?2`wo-4(puSWGI8o-N@~&smi!g>lyg6{P3DM1c%H62f zEa#LU#MEaJg_yCjbLq5(eCQyXQ4Nl)87}+GG*AN2y~Z)`i5?8KZlw5XRumm5jz4nS z` zEbkjySo4=^q#|ERHc(Zx2>zT2(%+YvL1<%@vE6E@$PU6*#ujWTbjDSVC1VZs6!9X6 z6#`Tpx?Nr}vA!7$JLsfZLlYxDdK|2FTTXV~XK|5-eC!Un9oA|Wg6noX{0+OxAvb?= z_8)@J2#M(8cA_Ig#%e`djIPz>Wo2C) zKC`e!lL+reg?Fbj$b!@v{5$*cP>&}2`^w@*!=|vWmpE;L8-h3>Su`1pW39_IlT$mc z!>7MNY;+I_)CQj}$FGX{L_`gm1D}6Fb_?{IPAHp#xMA9DHB@4x>8|GoMF2jsw#fDbaQU0Q4B>PTgC{#_v;l$(EZ%`a}w zuQuoN-E!Ssl*{hb=0m>G>-GNlhd;FV@5l1D_vESk?e#wT_{qf|TNfW)JpCBgAAj8H zJ^3SD{*PAgzq;}Gw?k|RstO5?t4VQ3;>~Jty{hM%=I{SU{+&O5{JYlU z7Dlvn)?&Yea~|I-jcS4v~<(T z*4RYptzP$!-6tsd#p>ox65B7r)|1}F$E|PYB>+&qK`L#c>AXP3|A01RxhYy-fAyN~ z&wqDPVF4X#r}oSxV|4Zp2To=>ulx+sb(-yGRk^L9JaW;D`{_{2a!upD)Vo){V>(-iwHdhiFeV zrxW#@y6~?hb<@&+U&eofg?%S8E3}k&Y!qh@Kt&0UAkUCD?S5%^nnIb9V?4o1d@lGA zFsU}6G&JexE-PB8>0e@Tmfgu}{kbPBZ&mwd=|=Fs*Oa6~5lEwl+fiZzap@$jf;~iH zpLo1mL@QbEnJw5kB}w|<*E6>AMXf+A#8lIHq9X7tql;QKHO_yAgJEf(J~W!eqTG7Z z>4B;iA2hs(4pgaK<9H~gs^Y*3#xFl!Pg|X)$-jk^<9rkaZCBUDlDN3FM=n84J4YHxNBZV)QT0`sVf`!`Jb0||h9Sy#%XLnQF6zg=mTJQIj-Oh?-OW93s zcoxiH)Z8u?O+9^fktD}E z8^>d2<$M9wrR*dZUK`YwUq-!Xd8`TIn)u(Q4ZnZ2`ocIJ+g>VFqMhOF;smD_4WB{u z&|@Fj`CPfS6D?q7f?e2zI&#ZZiR+}-Up}Ypx6`q2u9EF=J&HE;tb9(ivAuF%9d1VL zRYU@X1G&9YF!`&nzoC-)^#`CQbwz!#P2}YA?C#Al1Ll7B({m(bCn-2x#Bu^q;nWPxNNN8rd*WslvsbT zyGEf1m83RM(s^5*qN%pG!^d0qj@$ogwcZxvR}ExEFGD4DDlZO2X3T5H!~~u#@EA1w ziz#6nY1~O^Sxoy&0i8NaQ zF@6Cfu`q&=+IRcIe^Z|dG*^DRVg`Tc80od&7euyW#Sm?-s1_Pa0SVtKCbOv+#bkX* zQJNons5sS~M;1#jS~hkSEt%yR{L+gKFU84xMemg7Pr_*Bzd#!;ZL$|a)K)G|$-2LN zzG6S-HNEwm?KW`vTZ-1ijSC*E5i8YLUde39<+NNPk_mc4I;#MyX$|2v~ahrY|E}K3|<(?Dy;Eo3o3M@$dTS zumn=xj9M|k^)tRIJDnJJ&vAEpO8i*d7I_4z)H$6_1SZYkOC4(^dqdY{luF~82o}3D zt(0q=rCvpCz>ku#-O`i0HJN|J9`90@=Y}HU5S34BX=;UtX}49A46{MCr5!p90Y+nK zYuR5D8=xp6dZ*+bTTvJK+eD3nUjT#(WN9ya>#nOHD+9W94`qi4aX-?hLCa%>MYGt_OaP@zW&Uc`{`NC7z zsrHoP$qV*!xEDc_J=3UzIhqP28^lAo8K(d}sCAC>@}UdBa#8r({&a@Ioix8m-R^sv zyXsX(mG79idU;5KX{^j-^3dkte#BRdn|(w|tSLSUeaHgX7kypTJZaR*MY&;Yueg=( z)-cwA?ohwf30ma>{v&_Tz62dpu-3d**^;H1tF%AzMYNRZ3TbN+E$z^^tIE-KVH03% zSed$N+Ul&{!%!Ejv)Wng6>Tzmv%1QDQEvA+@|z`A(Kk_6{Ya^Ds)NkEP#I<+l!7+6 zOvDv+8)d8220SkR-S00BKF=-PDWdIC+w#`GhrT|>$MQgIkG_A}tn7b475K2?*vyGv zQw*lAYS0$>PpAchuug4?qwV#0VU}A(KxGWbDydr~#n5yj)E(xma5*^X#ml}oN==6~ z&Owz?eXe)QcD2TB`Vjji1If13*U7SPwI;p(>e*6nM=NMlILKVG9Il9A;jL*C*6Fu; za8TO3h7E#)maTuHwcQD!o7p^D>yK?*^-Y?rEvvK{aS)*$<=;K?Izzp>)AgJu?&INZ z6y-@doJ%{SNuohQ#E8~>4Y6NtsPxJ6oBj=zl@D)#6_}o$j!Dv9v>Fs1sa6s;6G?fL&u9ls(&K-?d=j_5R3Kp&LYHE zt|BUYq#=Lv0OtVCl6E>cU+tDq7!YS^B8x8>H;xiSY-;eP zNY}0mTKpC|!@%FJ9*XE5@t7-bebQ)+ce&%r;&Cb+wO<{gUPuzlvb$L=iuSP$$mt|Z z_^qCRtO?xMmPGaLg}lyu zs;LznYqW5NIflz!auLmI(hfCbeS)KJWteQtG(U0#$oX15#-b{gX5{vDGmFfUV2ir6q zo_(mLPGRB?D89<|byOO^t#`brcI6GHYN6LXsIjuku_J9y>M|M>?Ixg#b_qivX-$8W zuQY3BIV?v_0ujH;`XQ2X?)AB~)Y9FJwiPab8z!_~X^Hj8Mr3;cW@ANDdDCKhRG86k zHoZq5eAvQ?Uv7G{;ULv%0$i{h<1k$XclgfE!lrVMF1(GM^n4jfF|ku5&sb$sSyx}& zvo_%>-SF2&@yM9<)gzKm@0;Q)V9crg4q zEy~qyMA_(uukYxFsCq{~yBj?Ya8B4!&vCm+f}h(#XWa?HLC{%s)PI*Ijbn1yEmd-cGmsY`!mlLGrEp!Jw@>XukPn z6kc9lJOYBbm*r=)t~6bF`~Gf(Oz+hvb?=9FRCs3Uq2~5p{lRqJV;=7@fvGlhN0WBX z^L0-%b&VOyGiB^6@#JEK8ew{@-Ftd7VdG?V( zGvFu(;PiLdX1i|pU`c-)+y!iU(OxDiAFRG(GG2t>pKlNtB-)5q*)rsFTn%Hf0gA<= zCqWpe`Z*VAbEG;4ikebU3tN=5;B~SQ@B|W;H_2Q-ehrWWDr}S7MU_tid_^NPrq#ky zQ&^dx4Ep3aQn^a0T}f%LXkFjZD!z_V+pA)ICefsnNTuFs3=?m(gHy=>iCdsSC{Dy()a8=SI zua1tY#V;RNgERr_{W5BsssL!flz1}J*QR*2E;h-x{P~R?O?MVIk9~FFIQGZ>!dV(^ z@aqHk<>S_exue^$#W{x11v z%)fW|U2~CK3|`6#{$VXMUln*G;}2$dA?G4;HrB(%YBzsJY2zYA6~-mstoWxusYSV+ zaqS9@5gHWlqfLN`Xe~xQ!aQ0AV&J#@GqZw&E#h-zx<$F@GoDlZsk{f zp~U|a{4DtgXb}PDEVulF%c~uC)x1d6U;Ztx3-xD?IxbTFMcP6fcmvhN3weEk=S$Pl z<%)mg63>5E6aJCkE%)e3ez<(jxl%8$cKmyb=QI-}ag%btZnz@!i>hz9J2o>l02>MW z5%8Ep@e}}8oCk~kZ26C*73Es~F6577Dc0)gM*Y3xKipwk`Cai3|K9SrfJqH*)8$tF z@^8UET-dFA_f|e}JJYEp!ixm#R?mM|^1I+a`0Rge$uk+2(fFfUc*lctx7x|?IvD-> z+V`BX0{@;Vf%4pHl#mR4I{*3dht9bdZRng*9&yrx=J1YhSfDQWv-V7`CI_!qD-vYj zCK=x!8l>UMaoz{nM{${3{&UPg$|?59sgN>_RART1V7W+`iJLI15$KqXvTE!BAZ^k+ zZI*wjP3t6-^4i!X;3<2E4*Bp7#FYUATwyt(Eg&|E@--?2S^Q`ls`4+?tJ>V>oe%4W3lT%M<1+cBg*DRLs=>RK=)_BNb~M zAMt5TYvJk{RJHj5j}wkIDZsmihHEd~6mewe;GGf|u-^D*IMM`~;p>Lia)b*jIQ~`gcl8O{c zEfv{xOZF*dD>3D-i?_RSZ6RYq{}Z+Z{er-@=v==$ghFm@lOE~sGVCrsWhk*zTmUO3 zpkz`-Z39)~{T?YdUvJ7HZZ4nD z64CtVR-oEQC?oiwVvLB02vhs1bqcwzR-S-Yf6#L*q=J*zD}=ZxQMRz>`u=#f)gvVA zm!FEP*$55i#>G!|Lxs#A`8ijr#&W1vFKRri;es}A1_GG)&>zPj7cMkYPa3YllSacu zK{5<+t8QDqCvqL zf4UT{mZyDk0XE#Y`sR!h_+(y5<#37iS-3^RO2J$tT~<+jsGT2phYBg% z6r2Ze+8UM%$FBfe!dbpU&~eU)71i9=k8o5tr!EQMa`E&@qdl_7I;5;m>ljRkrC;Av ziv0@N{2-c+nCYe?OTrI*8lIFHLrEBmZOSX|Ak7z9!lY)8<*z1p8irYC35S&gf8odo zE#G%2>Cje;%!H$(d2QP!kg{k*(aKdYVO^NvVZ{lo+fJPAXiT~b1KI$~LLf>0QnY$? zqt<$Y9e}G7RXGHEo+VSEA}We^>5Pyl9o@}&Z34A*j+Z6)(xyzQI@(*ov3FhvCn6!e zPMt!xh0Y3%_B;`x3ie8~Lm?Xze-+^(`r#_6DbT=Z#|SgRb;guL8s18?nHKRtwdiQ&NUa22&pyFv35SXk(1t)IIlRF#Z!@h{NFv^EHuLH& zCUu*K6D!&YAR!^iptUG#(R1|Nnn~P5_24Ob;wYMiZI{I3AbiT>cy05Ke}y)siq?0! zQDbr&9;DP&O$l8+Ie?d|R#)P|IO^Fa5u1Zo)b~rAwWbp0hT@|_2qdeci1|jxt zdGzS)4%F~lF=DZ9xTIPZ*scdD@YW3cK3B0hIePTk?wnpGeCtneG7NNfJO1j6F6tE; z3*UT^Xpq!MBz*Hlf~y$tXMyAC4Wc<Q(=tpFO}+=(VzOAmcHe1((4Pr^55tFf#{ic_Zm6>?#NkQ9 zFOkr@Q&UrDDFc10`DP#*h^UDfAohE3i2YIW|*wVarWCu;~iMuDhLmfojRZjf-Uzj_8=O*MN|;y z5LQW!b)a*81}W)Y&)tEA&6=zSjW)=#{+ge=GYF9;()=N}4?!lJDdNiQR#mN#me`TF zQrV^u_w^_eeZMlXb9)C6?7UJ?TRZ_=2|k{@=^=t81_w}Af6lftLE#XL6sI3RxP9_+ zf}Xz7F6D5bO*tjrAkoZ@ow^z2mq;a01y1`W`&OY)I!Wu-3y(8FRgmxsN2t?FAxk{w zlSXl!GzGf}KGf+wBGfCO*wj8zGIFO9L9r8zA&dca8F1V@i5URbFiIjF5{n(eghvzS z6vIY|Owicxe<$|65=uWkUR1$vmXfF#l`x)+s+z-RFNsV;EkVKZZ2JOS5Q19$Ac7B! zN8sc{Tn{yOYSIK(K%%-g%rf{=zRuX&SU=8z`9>Hab45H-lu4&ApPL}vhTq1KEb5LF zEIEzTtz?Ie&^r8>bUlH6pEXjHX_x90Mck-GmZqcye`Q6XFYE(gi46C)N#Ox2!!tCI zrLfGkg>dPL^jKM)gauvAEG4mHK^+1*&_esF3A9@5>1sQaE?s?Kq*NTdesE}TY><2o zc64;i?Cl;J9K}EPkfoP z#O^X|LbX!hGTZYDYqV|AN~i(1Bymw9+-3sJe~NN7==_p>0(CgrxbSDNgbeSmLk@|y z2o8<6K-X^}_N9`pIBdgL!h$7Y(mk-Spxut$-0Hm5-6BfBYM!DT^Cq28aOjBuI|z@~ zk04fteXS5ye{wb^Y6V)UV>gRmBnR%Mot7hSw`tXq3Bpc-Heda^q3LaeY^4sG*gl7r zfA=4k`A-Lh{T^0hHhQ%@T(gICj>A6TIie8+Re=%YEd{lTchWcp`Q9A1De^N?1>u6KJWa?o(cM64o@-F?A4D#e{Afqxq zQ^^g`zrI6-%AiFf@fTlgp)dgd36UK7e8Xll#1VM(??;h>EjXo@xyc0j)H z+$vU6;IzRbCrv0B1{wUN-XmD^`g%V%f#}$I>n^NQF-(3XJ&X?^N^eRcf6P(4<&0@J z1kG~(ogRL6LiFZb{_q?qT&VbRBm*K?5)Fs)ghPdN`LUbD3oVsJ2Zu%2!1tAWe~ffF zbuWXuu7Tx?w+{tdP%5Fx`eMZNb}Fvbpf-f_kUAk0!#d@TpG~oIEwxY}Mb2W3`1+zb z17?;I%o}O&i%lF-!b4DK+mYK=Tr#`pf^OPVLgLy+EItTS3KD)_yT4mYoDXhU5ABy$>)J~>i0 zJ9$9U=*o7Wyb68U2AY#0fZ?X$vV_-hqDwifyBMOR6ud8E%19wqyQ5AAf4Hk4!B}S< zzo!x$$y3<%E7-*ui&BAbv*1>6PUtw7Iz)E`K9+~95gm>~CG56aq|oKRQ1oldH(VK4 z%O;{K4$)awB&f(Es*7jDZy)kTf3C3|1if4f9?pZh^Z>r3_pSh|Du7Q#6lJTEa6dPImErO0 zeebfFUEqn*P8nw2I#4Oi(1!}Xq^hNjYZW*|J*`m+(U!uedx6`=#*HJsiZr!J&8Kl_ zh;JVSmyYB-2kVv7Lmk>S;ea0{w@z}*0Q0oRWx9(aK}&D$mv2>se``gc@(_G=GeMO| zdD;>JoTm5H&o))8rkx~pY~xz`Lv{{l6*ut+^+L(A*UX!x4g!OXW-r&Ajx90je?;=8%cWNIBAs*GgP|T+9xh zE+i+e!dUT_a*tPef6#cOj;Sz>cV8C%bjQ*+JLW3uH3Uph8k!A@aC6V+iM4J?Cz>@) zw3vdA!#cUV!C&b^9g-zil&7ETo~^*g(MQJBiW*1UGM~yX9Q+AnH*Ea`%n~LKkKTCr z#B~QoMo%1m*}+lNJ)QN|R9E5El2%GNxwxw;c*z~Mc4E{he-BS$w0;t|HdZxcWZt(e zUaq5n7cb}pW7WwRCY=nLYy?_*xZ%SV5$xl10oSN?XAvj&I${w}Jc19u?jw^Ql{8p) zduKj(-V-1Ld7qX)NE73oRU4US#%-TUqj*`(%60qSSx1Wn!B-?X7&(#hzm#(-1U4k< z>`@4}pi0Q$!m+Wxz*`K2d5PN-t?-Vh6;Z*XqC^9v2|xaj%O<|L;q9Vp z(u{Ei%O*i^o08BIfwPZ0*m|5|f9V{jukm-ACCr>muFwV7cgho0N2KvZCb)DM@# z>V$8VlkG*psJVQ>oe&HcnEr6c#UwU*JQ0~r$fttseThGW_D@*}?0m`}srv0O@sX)_+th0z=V(;PuU)g|W2EE0C zuRzMFk5yz2ctVpLOCoMghAc4c9 z%CSzwi(i=h1;=!#s5Uqe`Ku!87p`7)yDda=s-6^r`S-7aE{T zo=oIf$^33h`WrbjlG4$CLyisHMGM+on3yXxe`!Ll z5eXcCDxp?DEilZqyh0L2Pq%F9BW4J!LlpoC%!2f7_3db>?4hxuuF*qOsDa9QsCCh>|E`W~1)gaWHf0 zy!s_e$~Ly3YjYP+Z4CW`T#!U~9q#x}Or2m^3HDVa5iTK^iWVH2jPesq=r9_Zlx@&` z3CD;gZAdbH#sZ&`ut-kXXs1l;-HJo;8kGg(Dv`EzvZ0BdDzk`BJ-a4||%wQP-)=Nhw$e5DOlZFs3&|G9VY zPQz2v(3le`{HQ9N`4``Yst~=MqMbvjB6FVb?inW{ zcZ@V&LKK-TTH5a;s5js_f9|A#QO3p?AlJ*^kA^I$Zr%hWU@?)1EaNN?mmOVj+neC4 zRfq6|FxyDp5R6>UVbM64sosZ1nt$gVN!MUY0Rjtm>GgWZt-ZIK_)T9O4#JPYf}JHS zF3<^L3r_yR2;o9)NPQh+D2 zzo=^hCU|HE@%s@L7TIQ)AW`QiDcJv_aya1#Sz6)I4)wyulg6xrrdH6W4;1#|Al*6w zse^(AkK*0q(C7oaV({!#L>4HXtfBGH$63J26*_=}_UQf3g!Wt~2XRlY$wsvB{6l20Ge=4qzm$BNbd7yv4aS3%4|Vb8sNR z_I1pSwXyAuZEIs}ys_>c`C5+L_SH@caQ-hk9`vkMGzR5XPdPZT8c-c2mr zGOf^OoSSO$kvvA7qs|&LHPD$c<&p2o2qlUmf(oU;;mT)%!C$8g8-aamEa&p7E^csK z4=$u+yLUn=qZq{${n21bf|&bess?(dk<&BCIAta|@DD@5ASX7<7eT6XQd@_6DGE5Zx(Y?9@{h^uU?OSun)I5weVD& zK586`hPZ=CK@~*dskRy{cIjOW6sK1 zxi5GW``e#YX2la!K_fva$i~vGf}cEWAluFOtoAa#ajV9zXS+#<24IBe?sBI892@61 z8+Pke1(}s5#tMR*X*Tp`2PAQ3Y&z6NJ(XK~ski{bXgL~p$NVp!yuH3TFQh&#tjB0O58@_YLV(TiI}(78+SY1iBJB@EJql_e5&^kPGn6t_B7 z>;QN(T3JU-K!|TYmNj=sUW)OIU0$RsS9AmH2hHP?F*xcX$^%*>auf-e5RjutM-z!9 zmH>hOs4U2uRE1qMJ4MhE@LARl83M*AoE)IU8 zseIA9gL>Zf;(B?B;}|wVo9yb(y3zfWF5DItu&}E;Vj{p`^Akq590^v3JbuQGQxj&L(;kj=K)GgYRFQGDHwW{t1WAc#MGXvl% zhrJKK!Fln>3P#0k*ht5Xo)#o?mlRh$3dIis?G+oI;cS>Yo6D+lFZ065`i%zsI+C~*{{(EgtMRF5l6$(&@ic+g@;AT1rIH>I3M^mde3qq zL>%;cdnwhxe_n;p{6XH;kK%4Jpx#D={fNIAHx`G_1?%333)KTXDg{ZWmUW%Mhhl)m z_mRE1mpTu{y2cJ-=aAw^+<#q!$u&WK#s5XQzIKy5r3UVaJVyr0c!(ffEgxxZu=#t3 zv&YQ+EUjIQ=+rS7J-P#0p9^5Y3GMo=MuFy&tH+Be}@5QD4yvlO^au)%qJxkfA9= zRVq=+-Ha5s4GXapmutuwimk~{4ACP1mfdkO;(M?7zv!@;Ays_vIBph5uj`e-c=v=c zyM(qH4b^2*w4IF|zU`e<6Y<}*xtT_3d3;@DFsjXVq6}`ksI$N@CCN1ZAZ%DZzSgEo zG>3%RajUmmIvm;QpWyE`=aRAh3VgS4*Y>WPQQ`d+NNXA*RxaWMWgRuDr%fUvq^SJz z4{JDA#>EL}xgjwm%*v~obA5kTGBffI!$h>?=M}P@i(eY)?IRFopwP?=UlJKfH?zfU zTTdtE<&EvBoe2TFv&9ly1xb-pOM<*fVl^JJOUJy3)CdCfje-fG!O+c~mYp}asm_W5 zPYeO*b126z)hOdEI~^W(>>W(x=pzZrJso*W@bG$;e?_ji1D&FkM?}xx3lSQ3sGByA zbZZ=z$}cC&G>l0{BnG(xP>w-!m|aN*pU2TNETFLpR9yfDOwRf6kr*8;*p5Fl&Yt?C z_*vM*$fumKlS=y8Xjxdq$gOOQ91mg_Z-$)*7rV$iuoN=E%UgSGi}=4pNtY4@ zOcODb-XRZHoiCYKBUiGykBtGqP4eTnZ2At3kcOK-P&^o6cC61=sIX< zZo8jo`8p-b-3xW$1i$dUn8uJ6!Pkvbv#UfLT#45S0*c_NjbkVkbop9h%G3ylgUebH z8x_Bg(k^Ym;?A zOB|K;yyv_0Ab&*~49F=y5^kc1Q_z7yD5R1Cxcj1TR{r!1WD{*G^;${>1R{7EjT`Lj zkd2!R`6{dxxsq$8h$i>`rm;A)W;IIi=-B8y6f2!!>s$g3B1c0Bj~_&BnY@PrW=735 zH-tCf-O$P)f40H?ayp>L4poNhjGUk8B3o_85-;Z1gDrZ|)R{2q_0%wsC|#;Fwc5PN z*LE!5kL{my#n2yB(p}k4T8+&W5DB)% zJz)QawZ}D26$|s!st$kpvk$r$azHE{|G|O?Hi-|y(@+hhi5GUXX~#$$K?r12fO@9D zHztJms1*_uG6FJUb^TyHy+l$PJl@lYw? zoyz+Uz6NG&nk~|!6J14mGiX!nL&Rd~&S}?%`Aaxq*-&r%%%XGK`QVGzSDue;h-EoJaUPlm+P7pa{Zpij5Fx zEKj`ASxE@Csp1-8+KPtc2QOj=(!qu9(bL~(4N*kk;0N)9+~t)B#l;}E757`Ipa=n!pQW;KN zw%|tu$+S`mH%{&0d#j1Z4w=GIp4f^EE0O5yRohTI#E*0?{rj75xo6Gp$vRx_>w-k>yA; zCf6v8xKfY<(6KF`eQERkzXqiIihaeginB~I4~}iMUzOHL+;p%viJYSW{J4^Z6tye2 zprhPb_WZ}pdaKG-ZR|KcIh}ZzDdx5(8x;Osf*icSN5AYP&87t9{x<6a0x{@nfgQRu z2#+mkG@gq3Zpq$}Yr-n73jr`a|weLHg4oAnr+ce$;<4-SyGGQgJg^8*D;i*h4Kl#ZK!Y=5v? z$EJ!F_mLnPqT(J)Z`xs9t{jJldFbgUW;8>KbGQ05-=iHL0%(#6IF1vLeNGanKcrahK zgMGG#L5$7R>qrG;p1l9s(ygp{nO;c-uXOe#Af(O-#%Wkm$q-plNknm5+fu2^R>;D9 zTXFYUP*2h?G;Bvs8@BBTsj5)N`)!@^%-SDCgb1$F2Ku>!kV;cpNw-Ry7dJ8%!CD)- z2Y3E3fYX*DILKpH+Ygouz1fMF-efQB^++ozc0T5aeN6$_LEce@Z~syI4#`HEjCyI` zBFRC#Kjx1Yd#1LXkkt)AL=DY{(r1*_4#I!|k3=2Oj&hAI*7qLfUj|LL63RhAw!`GA zxh*xkfeit%zO6m8kC%Mb5M%Hon2qX@tZ98)ci$iEZk2s~8s z>ql?~GzNEoiI%;SJpqLj(@xa%u*OQhg{*hLi3Uk#oQ<;Zo5_x#Ab2WgL$4LywOI)l z-l@Jg!!>I{ybQraxCA|aJ=)L0TL0oG_f>s)(2nwC9U?yg1)J4>lROi9O1Mb3o6I9# zV(!~pGI_0WXL{Ifu+|i*o8$qE929<=je*G}YR=|B23xT0KRbw#=9lZZM7*2pN|_F$ zqP52l@`&V_Bh9|t0BnhnFtX9SFIIMFm!LdY}nQTX5M@0$naqRScy({-aZ{^uZ^<8QA z%b!w!MNMzcm_jL-`#W0s0f&%1c5TKD={O@|4hBRtc{udGxR#_Q;kS|>xGjJ8AUM%o zI0dawj0oBchAOqDi{oRK>!Ql`>_3Q9iC~zKd-x}8MMP{i?72`jQJ-QY6G1|tUC#|1 zLJvxK3s5l+vu_q53its5gz+w~4$ zP5D%$kb%cZ5$l>m>oIa+MM{E;B8=A=p~(vIs85a6`PBbRx!C2>@UOBE$8stjZc8^J zCgIrS~qa&UbT z_~p0pV*4Kde%yo$)mAoSMb%InZCyjRm>Do3ILrywVEr}T=&hD^VToO+0eH+a$`MCI^4ZlDf0rXi~%nH>+1$cZsbX zoZ955`(1mpS`2CsiYC9dNMwluKJ?R)&Pr2JN%J4GQw=pT1XP$6OCrUHiGRnaSL>Jc zoAzeLH22%4viro*;!$&LVQQBIpRVbnjUyqpp(Oe@8id(Sw)f76^ROznuNI7U4@Pys z^?yt$4}FRCrpa2b&4nYih?$yP_wpe;nr(t9tu`d}M76Jvd!^3* z5qH2^4~N2`WMXzywsD#-@y}P(dpQ3W3A~GngQx(%=J`gpJ{$#PsE-IRQR6?o-`UEFaW#d}b!Z` z7gYIcy{@ch(vYDL*-0sA>`wtU1MA78XyI(wtUw_yxFp^sDGy8*1_@o@et1cP`h+<81CG79MP#SqWb}52UHsKZJ{( zA%b-k#Cb+e4IfX+&>B5+fBTUgDzBPJjct*Y+OuIBijHMMEp9_iU{LlN>R|(Rf=(f+ zU^%>RpFHo{x8!?mpWf>pzTDHPwfvD@PZnMu*<-VgJavEx7a7rkt|JhMdE7HaF*g|^o1cj1k7>P`}0IC<@mz-&9Cj?hfU1S}C;rlv?TCMD@_lOiLs2 zQJKZc4iKn`H;9#dTfn+V5R}Zw7XB=+!gGsojl%Pw8?P61Q|r?W4ju(H)Qt8CIZmr8*4jg=v_C9GdJVrEEmRw9N#4u^Ue2nv$qIqc-5yW;<5p}b7CTr@)`30AByIzMfY?=M=Hbo+F3 zAm9`jHi0VUC*7qOQ+|$C1RQT|p8fprBau`UIV-R70G8$&e|2BY$6?lNmq$8tP~PD>-AM7U4RB zBF6;tRKHo}e?0q#=+3hBc5JU}h_oO?t$}u11rWKNgou#f5~z@G!&flHh1DoC6~Fdk zY5zG0RYh8YGBa~b3{^2GB-tyKY53l%9asDZ&~9xam&NReHs$RibXBx3BCFRlcs4=MF!TIzm_3eUXM6fic$ta4 zE*~|QO&l#^7mj)hDNv3bD21FLO!mdNPtwIru53kxGR2gZNOe-s550WTXbkat00A`> zxa+6X;g&+;+%lQYoa7^f#N0T_*_oJyBHsIv0Ov;dGtaUo(6A?{`uc5|!rB)w=6uDO zM>+I35H6_CJ0e*$uV)_+(&FI?%m-0=W1}j)OVc=pR-&o zyivxg1j#e_FAZbqkN4f7wF^f@z47WOK&M+}>S=$*Zx<$4w0N5EL|eM;a@SapmJo@PI?Y@YsGDd zNnvX;ZgZSDx^j){l8Ipxy;^qQkY?Q4wUUyb-g8T)M{i21WJB!obX&~rTw-0PW6!W=`)X<8bU6Jm>TORpSYLImK+R1m6 zkeDAIXZ`B$8Ez$(u06Y4!9Tw~t@3Y*RGCQKKo5>DD1id8p69y3$yl(wKWpOdFZh?c0<}Uo@O`$FBSuIV?W5L z^8M9#t11<|td5?_tClPO%5!%`KM;7unZXFn@BT^SVKeuCY_j)+id>yb>uJqY3@Yxk z*eprtLHw@fmAisyXnE+N3;Nk7-B@tgKyqq3xzB5e5`Wa|b5li!DxUiXh9Fl%wNhma zgY7yep(ll!sBQt)>KQi@@SZL@7^H0Up}vI&>5BfBp6aWh%dw(~YkH`&O)>S$Q2{Q7 zJ7lCEZ;2o)&?b-x+o?x@4#Yviz8`jElM~v{3@Q6y_ew?66C8? zXtD1sGkM6udwkBMlf=`{2z0U?5V)#v5qt)D&M@d3F>a>|#fk+ab)G^U^$~sY zZaE8bpLq-3?Iv0|5Yln8JRmt-O2_@= zNoM~W%=682DX{$sND9;K4lkDRsf=!FD9SAlb7dx&D<5wtPWezb#;G0zG3EI zH3jNjadDv~k*HYu{}|FigWi~P5Z}K!+)$^MC`9GH#L06C0UUb~ot-1J5T&8mP)CJ8 z#`Uq>Iz(BmEJH9z1Ixu@I3Pv_s_7)yw6$^(eqJ%gXS=^g65@+f*;*t)QrO*!BVOq8 z1oyVnt=c-_&C%tX9I}@G4opj^w}Yg$xJ32dyyUz{k;t!!3J-Tffvn|2<~PBSj2FdSSQ7YCh0fFT|)jwHe-p+zV8 zN35!t(S0;>^bxS6(^-2khk56`x4aoEa(qQ`_lZ@_hxFc@vf@nra!cZQC+@jUwX6)I zo`i511uNG(9w=fql-YW3x#}W%7gihF+dmKRDAHg)0$IH7|BB;XH@ONrES|@lU8`Pa z#*_H275Z_Ty{uC^U**yh6X`2cJ+nCKULm(Ue%y3*j(R7T;7&xHjwld}Rd$}Uj1#!a zdF0(zVj<``oK@?&?p>32yE${;rriZ0$s*={c0CW7>fJqcK_^#peGURIck>DY?I-29 zF5N4<0N2fj+{qd6a+=%C$H@Hhck?X7hhv5NBgvKG^DP~#lgND*{;nDQ(d#Zq?|mG) zxl#AINJQQHL{Hbdx7YQm^PqZq&By^rj^e(r9`A7WLQeefh%i&OcT(|Ae@klPi=eQ_cmub%a&~v)`${+AL4jQMd>NvT0 zeCto`x~(3q@EHYwm&X39 zEU(WHM^BrxtW-d4zHRk*u7FlM&NUB=`r)ubdBHsWy&~vne`@d zQqOBAJF3&t2_rxVnGGqJf$MW;zmG|);Q#xPsBCKQo z=cr~5p!0Sm>+1Y+-Cf*VFR=@JrKoo2GifmBa|7nH9^3y@=RNh?(C1XNY#Zs?R@Ue@ zr+Y*r53-LC{l}4!pC(ir-Nn_WZs@)0N83dHue0(HFQlotJ5^a!=SAicr1Oitmp57U zpjV0wR>!y#h!2lQMJUiKAHA}VGj|{cz&gBjLZA_z7RnvVR@Ok#OFsR^THa=>($f)bO_oVYM9iy5UZz><< zZ86=MkM()z_d$Bq?s;4_{jtdbXmvj?A#JL0x;(<`JuVwBL}j0Ky>Axl-9-~df6n^t z@+1*@pC3wm=6xMbE5Ek{e%zj4 zzjN@ad9vR&A_1Q-5(0PW&^Exf7{|wx4&(D%d)CVeQqpI?DLdcG{cpf=J2~-6j`!|_ zu-e_}-%~N;=T#~~_3Kx{KhA%DJ_A$0bF(hbw*|JI%0m!+>>e3ESnc~aT;E6UlPg~jkwT{Mx=+2g zG(Ha|LKxQVzLW=kfv?afXX&{taP4sOf^$3 z{@OTOvP`G;9Cz212WNb-sr;1PFLO-SG*1W=AdT$H}X4)fl%b zD}1g;fvQVyql?u?D-WlaTTitN_YQWSPqFk%U4HMCa&=qn#?za>Sf3wROC9HVeP`Lt z7F*$HVTt9x%IGsiTnYK=E#}MaA2+;SyKdPDuH5HoZMrXXysu997RNO-d+UE7RCod4 zhQsbpXa3yon@2vQ_z1@E6}hu+IOdnv2+~9DG3Cgt+tA87vIi;Vy-qD znrwG>JF%Lme`R}6cuTz!T6r~f937K?e&l~lU-3Nk&Q4j=YO#}FX)z}(yKTPoo$1bjO$C-|)RCTdW?>cOi{XsRcB^~P(&z*4jBQ}CAN=f&C9 zOzrDs%*K+>M-lwA(?+ZL!YQMG(#BuskARS-_obs%M(x|KY@fQ9*hang{&)p^*)JZS ziwyySdlxjt;72_S>Kg3hm>^)C)rPXJ1|7#ny$)m5%d{4q?0Fu(P_i zet+}ln|sI=_WMdRhxf;BOxO07t#@yc4Diwmyrw*CB78ao*jqmg%%*=lZV9;Ue<&E) zr1G{&uURiWQr}iUyqG%I(-6b9-IFT$G?M@yF=;1etXlzHQcTmSZxRFPtbn- z(sf)2KFt+q^%~@h(M{sN3b^8a20f^iseW^~%p671?f6H(biVn%o9uHF^!05D!qQod zeU9s@vz+&i$$oo_jnVe_EK3xb_SzXKgJ)m7Y@v+(Rd3Shk-1rGFga<--p~YeRe4XY z8oxHol`mFm>MdSrG+9gz)wx*V{yyQ&D#X?|w?Z>Kxfxh}?>=`oJljK}^pNPjY4V&p z@8V8fcO7&sYu>DTEmHs7dGG$1xJ^KKe0%%1L8#eie*c$n<8PT&Td|f_s+D_xr)k%1 z>{7Lk=NYir#Q(X=W{Id1%VP`7x3N(!Y0s>tt=E_w;GC&aR=Jxkc=IUW2>_FcM|wJ! zIpi!-wwT%~z(*MFL^&~$`N?wfP@mt9Rth z-fyN$1y}Q3%eTvW?J?^<{UPerFJeok{A@}ePvwkT4j&vJOWkUWD>Fdd%I^!>{ zPMeJ(o}`P-rqc&iT=t3<{mE!+ddnZSHhLUoF4a_x+#MAN4YFtLz}>ZHHJ;aFV@$_M zO!mjxQset&@yGOY`KH(B@r}{RrK^C$pz6lhS=Q!X@12o%g^uH?I|aQL%1qZ%Ai<{l zx{=ZCIR1i>|FbmNYa6JQ*{nOg*XwF;Yd*`9E03vIb9xr{K1fT%(w0(SPz-slMgBu+{Of7Q+B& zZl#9B>wIcIZ_6wRd|b~A)U{La^StjeR@l5QCwJX;V0rIET>+oVON<|V99f_F#c^j0 z+P4eS0xzh>3ongFI-7Nl2We53>eX8_aT{$GlaRCo8upuzFN^nQ+-lVX%Xd@OztpOD zFYM;~9F-kgsPSKCk_el;-qPfn30^ygZ8v6~r{b3gUl*P?rUh=x{jf4Wdwyl>u(|9V z-u*t@mfRx84F(i|r`&3th8Jj0B+R=b?;VMky0fjiQv_Eef_0tuOu7Ce>kcoYm7#zm zYc1#AdmTPpHBuAyQ!ekpqQ<3-xU5w-g>sgHMff%H#+^k*-t{?``|x|hPLuf`EYHJ? zU5B|{2$om)J`WPVvLAaotFd21*LWDc-^)J_!eyG8JAjvofb6GsEFF!v<>35ktF60M zjx4V->y2Q~t%q#Fj)DtQ9`&kar%hFQ+*d@M=1%MPF?HM3EH1C!qV(xsv;U&k%Q(8; z$D*3ER_E$)TimBkNGE*WIkZX>E2DGM?<`!{Jso@0$gt3N&3eyr$jy)XvA?7viF zXJ4dCAOhbA|FgFqvd!Lf+~q0XH=-FIwlZ#cC68)NsMdl~ZG6S%%tdPL#H9;tE(Z@x zK~syo*!qeHBCw@EU7or~ZB@ugwKA`01-7EKlhnX+-bG@n4pn+KP^3x)&c}H@Z_{N> z7B0kff)8sLER=)ND=7s$e=)6-RIwiZ!W$Mx42X6>AD`HfwGqldzCAYXjBA5D@XPeO zSl<+a=~p)R=tm7Kq*lPOraX&`q3iK_s=Uh(H=4f{qkLDK)9b9ku?S9l7VA!A$TdXvPqQB zV!$inpjszN&S6=L-r8Duk*?Y#HYF&-RyssMWIRblOtdLGLu{U#i45dqSk(sjM1@F- zD9iFeG$B9zbb@%Zs|uGQa{cC}jX76-+@rlV(?p#i&WuUH5$e-Htzz#to=kHUUOZb$ zM#}Y_xb1~ESF#~{?hxg3Oh&&-?iTS>PJn{jHzJcb(L9Gzl&yRo*Dlx^!O2NB5C69{ z7@@(MQ_|)2T?nO2iM#t;a%EP)Sgqf-t`RwRhg8h*YJxxalf}m7uk>x~1D=&%-aqtb zsPa(H8U`RbI!96){{Vdd|CAvB~RNVG*{_I;Uj^7oTwiIc6bYLtBMqDH8%7&*TW^ zVhjU3KSiD_n^n&e4ruuU6^RgjhNnW#fz*qhrA%Zd=)CduP~FK&*-|KwYULKJ;v9s3 zXhC>gw3~kt8N+okphnl>$wb|6J^;~Lqb$f?==MmFLaa+?#XHv6CJFD_6(YN*Yj-pU zu?`bKbpG;3Eho#>iIlAIbA#JHlCeYq+&AMh`>j9i(H=oiJ|gr3DIZt$V_lLLuNBSwQSQ)R*^E zYb=?GceaZbZ5Y?EVg#z;&bjOYZJIfki~?qjhJg#7>~=0jaXEb=ANU`Pd-`>?di8!yj3Eb=1` zl{@pTJU>W!{~H$#w)c53fUtp+bDt9Y!4buN(eLx@>^G$q3KLDrE7nTGRr-x7+X{y# zr0?{?GM=ap9s54k<_>v_XC~yiLmw`m@Pb+gQ>%m-vU?}jC%R>X%GG^$XU!skN%D>dvd&bcT4_`kUTmHfJEI^1nL-K8dQoO z4KwRk7kTyr!KYUbSR>+ z%-`twT|A+87oKy|nzCrkD{zeeYG2%yu?pELGG`Vtdyb|=f86N?I5bzXW{r>aTQTox zR^(=Xz&W@du-y#;cY5RDR60sbg3>$)56 zlHj>u_Z*NI#X{KDV=9W%7>Oh<9(f0eUXy=mrA37Gv;Wllsc?z*zEfI z;Ll+!1$IIWymwAleUHUmss*GLW@7bIz0zj#aN;+)$;A$@tuOvG78E=x7LrNQ+;he{YBeP=E~H^oAJN$}kS?UD-%ZN0GrY z)$(9ig?q}JAdDJs`Rf9ZMOUi10_?eEDEQN2Ayiw*InJA4w1>hd7H?Ejri;8j>=~0V zTvMXy!@bC6icPyPmfLU^H^TTpIRrk!;u@ueOh>kU*ajQ63nNwA#6NpdI6V8vt$K5R z;^kz3k=_P)B(9Ajtx;U#hHqoPPa>fmy;9j>o%+spBmUH&k)Cg32F0^9$C5iyF$+rw zx+Sx_7?Hc^uLccA^LLcwO6;otR)%1<(d2z*hZQ2RM30Q;L?w;J3pzB$dKdT8Y4nwt zM@@qbErlmH$B5FRMoQyFOXDjv#~?4yfmJ#IVsSC!Sf>yo6jqbjuO&M{gxjxs=EH&< zGdy-8Q5-dri$knm)%{|q0db{dpa0yXty1BAh??^9m!&LlA6-4f`EBA~I@7Pa;DSrfc99uh} z&b+msSn9|iq+jM`4vM%GLC_2fFYt%XqO5x#m5%AMXQUQ6MWv~2*5n)%O!-%m{ADwE z@Yfs05-e1Yqq-{5a}qH+cQ37G{t^j^g`udtp>`JZ7ASAtqOC$gqdC+vdzpQo?(~c{ zn$zIFp*qJ=v}P+hVhssS2d9o&2tfg)^uwN4WD%Su9K`5d$I227(3H#VuF7s`&pUGM zN0ikrv{4A_GSy_*&oRd4!slTnWu^Kh>8lq?+t5iTM(>ySh<&Nb zNw2t@f{GiB@l;FNfb$1EC}0-kyBD#!Rx&r9OSYq(#u5lv87T9rP$;Lz=ejDu^lfd= z%;;z@#+UR&_khVB>+AncaVUz1qEneGg*pv~#)7B)_r}8SFjOh^$wZ2($wJ;gISmcX z>?v1e88n(bs-?7~a6n$RkoR^9iSO&8EuJs!QlY$)NzW5c2np{uE^x}X0S)m*u2U&1 zvWK@wOi&h6P`9}vx->8&%_G-@Y)8>DYZm`EzinFe(GB+SOfnYw@VSt9DQEir(cSiA z?$c5^xjh(^4m2bAI2be>NcBQQ?9=F-6Vq6~Qm*R|HF>QadPZ0m0kgV{?wE+0uhGyz zxqWglwqc7Ri?`J>WXqh0^04Ab?b5C-af%;)ZZN-b^g`9W5tp4?8}pozpu&%fXLlh4Uw=jwdZh$Du&tCfN~;w}^h#kvf>V!2$)m!(oyp6(VaN$^W!N8lH)*eOR;A&2ND($RBor!x%mG&4S68`XkxZ zx6lBQ|GIwle|0?{{QUorM#94X#Z2MJo;!s8iOKRN`-;c%)Vpx5UH_oS7KJBC_~OCV zXSO6`l;DRXtuovNot@2kit=db?;~;i!~AW?xSPB5$j~b-_%^*83*!FC73kkD_xrAg za6T(Hu69lxkTxT!tJr4?JvK9UhwtZq*akak1vy-E`O{So+sUNHAX?V6+e<5F0?ri2 ztxR0Z2bPc4&edoxG&tGC&yPHvyesVev6|Ummgvd^ME>0)Y>ymy@O&fVBs9tXmWFM7 zuN04w@g7X=t|8IiJRvoV6KF~igV48}DoHRwFITI?q39@OrujFDD}_VJ04v@fH$-Kg z5ir9LJvp5f$BkWlBAlUz#_^?9v%wU`#cVj`7Y^l#)ANm!kXeDWf$CU`+V-YKS>>iy zsxnVb9c4cButBSgD<@vW-eU9zvPG_~RAX5hdgihw%w$PpB_v^54d8{+ksFy9&R&>0 zWE0ij!3(lkI%ZnK`3Z$|xFm7TN}Zk~Zv4TaQ4)Yj=~#xBzBV1EUD0*P*yV3;Sou z(3;~gKcNY{AbmiR@xIf-ifJuAPFItfnP+a4GVEsNw4D!?Sr}?x!ZJ}sPYix8jffI@ zbY@mg6^zt;+d%A3EgiB3_|A6{3G3f`FV^;}{=?5~HzhN}-2g7dtPTH6^r^%#riDQf zVeHavlptQy$TU;&WjnUFK2N&EOGPoe>LHqZ0G^ESwP=yN^C0j(egkFA?cP z8?^=My#;w>5*0crTokJJukx~kJO60ga%r5T?~qqfV?@MoC(u7z7ib1{y%1>c^7s|) ziW^KNzriI4761b7QoofRGWyBPkvR)G1}%`?svZDuMmf^)(5BC|g_SjohR^gV z>DTVbr-{*z>b2)NkQ!Ey32YD-$b19%p4>VzIS?7No;ir?w-gXWd?$MO!4VD{9Xe}} z5GERH5RObnb8t5saFJDzBzE6I1buUGja85={l~s^vM@S-TkS{R&L}~*lulkqaD}I=Ut*9Ea;FFoeEg|NnCM1#I>^d)pG>A6eKkjWk|wjBeExmZx^v%U>T=Y=|MJtxC)TzPvYDwC-xTWX#xHmKL4OH#<~SR8Smc zYNta`p)}qMOHzfQNZXWTlzmsms38tYOFq}YLsNFr%RiJipF3xe!l`a`lP^kUuaLY| z2z1#o2>SlhpA?ZtT(I|<4OTkvtG*=jngI9eA#STY#(=l%2SDTXW%HqoQF#NcB4x_cUf(g@|=4 zS*Nb!kxbD0trW*Wg#VNaD7bwwG-n;`pK4Ggj9^IOP&&-+G&IDPzh;Oqm?P1AjW9!` zQ>$|UHnWdXAo{)d^73-iru&`pPJI=y7&4uD$S!!MH2;t?`Y?Z3%r3a0G=HP6;3&8$ zerEn4vla-trL-21T2rV$lw9?RYsxOTpfrD#TJ=dIwViuV=3UQpB>lSkuc271x4hx~ z%jXL|_b|Vk_E30HtdXv|>cjo(qu`>r^%|hC7MM(AG=DX3%J?rR{=ay>WNQIFS2=;q z{-o?Q{U@na@9>S+22!V^wuRzg3leMo$t~QV0K+|bvjl}SoHP*G6i^yz_BHw~7^?a{ z4D$u*(_CNH(*~GXvUKLzr&)c2w55sKaGSktHzu(ZXO=&OHkE<1sK$ogfPAHVj&+E2 zPEeuEnFVat0KO7!NpJ3kT*G9-F)C?WpyXZL(0B8luo(u{At&>BF1c~bXIz>~8)p7B zKZ8~dNOPQ$U*CfU(!bxBWbn6E*+Vl%Yax>pMOh8v2c*t2=4jo2TTI~4t6!vkkv%@qr8|UUs=+JN45YcQtf{b} zt*tUOmKCjDxNp=gNXt8Ji>A&vSWNnhI8P3kT4D4v2t!EAqDl=Y?(!Pl!o4d6W1EYH z&oSIR6vuC+U(M3Csb&<5uru5iS^1nU(FF?jDQ1Wl)3`795h=;h1GL5qyoISCY{#Zm zB?oH>Uz6zVXrdNT!&yv8iE)Q{Q8q#I9qdZcJa_Itw~`-mLj@HBWU}ouzp@GHo_NcW zzo;AH3DCYjJ6MlFQROjwd=KMc{*ocgD^jtz4#(SuPJp3v{e?C|>3hp=(f=n76INA< zcKJ`Vemn#*xjZu52=EyvPFU*nRVL$jd(Z~+X)#;G5B3ic)8*atC=jg`Z7Zl)gDIl= z8Hy7vF;r=R{ZeH?m;8rrg4{O~7P5^TR2-+4+7N+io$!5DoakHz$EM%|G*{;uoYUi+ z+2pI>{;h&P8g4m_7U%AWxP7|#pU3|h$prB(q~MW2omhVj$iE#YnQ-EBLdamPX+-H#@o?H*naTP%Dl zHs+t5*x6hwz@t-F11O_)k0bjwU)^jC{u5PLT+?UI`9m7}C_N?B3@_*JhVf(MH zY_^a&g0~fBnv34yR^U1Nq$$lq6w{1tI;CG3?Oz-V`b#sK-`rD zee{LECb#)>6ZU`#h4ajtKEnW&L#+JoI(O&$Eabr=t1Qa(v@n_101ROX-^vQOKSI8L zRC9oNslV(UNk=+0ik3+VI85a1t(Y*e6FTa_u zb(*~gDr!72jpCG?NWKRK+Mx8GaFl`veJYx=Vm9N9CbmWaBoiFbgs9pK^8gK4Vf!|cTm-t@qEvZI zG2u?9+#=+L`Ertnli(RI3-H8Wv*@Er zdI+kLuNp-L#Oq^_Y9MgaU--tY)3YI@pN>4Eic^)k%9&w73OhR>f$t3${h3H_u`c`7 zi3}DdTFZ^tG>QFFKtHPTAQ8t0Lc_74;TCQQO*&P>G(Hralq5*{1$Bs|wC?MbhQu^( zl%C2cUA+Yp+wDjX5p|}ej85i6=Rw3S5>$wOQ4;(Ph`oYdgcSS`skcoL4(>sPqAH#G z@&p$&_UMHiNpThtH0XAAn&7 zOVw>Vo+D@b4s&5Bm~4eP&9dLqk`%y3i5LTIIN;7<|EgT=uMlcHbGzY)u4dIJf=y>S~vbby51_Fj-`njMS=$n1ozYn{Dd#Y>onr^j^X@6z4gku7sI9+h2%h;TkTM-vf~RWYTb3TRZvcO5!U-rn<{ms(n_E43c+WZ?bCG`k zceeJ3E zR^@`>XbV&yUBz5}%iplIq?0IN4|>f+`%d;LQ5wptslTvbm~6W!6c$P|pel(h6+~8U!fL94bov<> zx5OgQ6#}ojk_*IEPDsEB1jV2Qsd5=EqjkHgMh!vHySV-EZ;0eWLOt#=ZrvIq z{E%i>BjO^~B4tm}osaIx>U^4me{mG6N-|5eS|ORrXKIH5exw8lOmYZ>5CFkMNkiuj zJan{hw-&R#KUa$+`=@PVF%p4Qb8r|k1BW4RIgR7S#HN+rfpeVt6~#0kck2jMCG3iN+*JDuwt$aeaZ?r|(IZt9-BU+LW6 z*-nVBzMmW&pUOR-y}O#R&b}G^o6Jk{8Dzc#N&D~IH-H)~Uh5lGDw)-bBHnw_@caG< zD9>ZCg}a4pqxej4N^<2bsr9}1thbb-viX(j`#Xbil-cZk-oLi=DlmI*aO0Ws4?@uD z+5Qb=wj;mt#^*f=?!nES{9n7`%3GEJO3A;Fe{zR^hXl@g|4AO+A;HPRq~#RL9H7uW z$uSPJL`GWRgZy^nBW0)xr85TPR-={p(xg7rWQY8WcvP9mde^t3APz23DLEdgo1S)RoP29A$29i z{gyxgL=af|sRmG61oa2q`q>GKuv?B!dAdYS%a8*-+a!B8y#tek;Tq0s2?_!{BK< zJhiU}8F%n~*}fHnf*ivB>IbceYI$ab!0{KrKS~;(hrrAl>w8CJy7{-yZX}8SX6wm~ zp*<7}mDVeRgRp$7`M52uEt{ffsrJ8T>s@ueBc3I3<12Fg{eoX185t^ZZzy|JaRGM_YEo&)(haYkGA=dQIhkS&pASx{p`E0iwhoS+2A;`!% z-kz44_C+fSJL;>vRu&`ufxa1r0O&c!%ROW_UkJqK9dEd%b^a@%Fs3n)K%J~aBTz~e6Jr4O1}?GZmQgpff> z5ne2XMBh~@v@23%&VWyBoYcMjssmpg2@82UX(By8dwi_eJI$)X8U*~|r;8wN zsqvta@G!-5b8Wy`3p5FB)tndZ+34XPk^q{gS;AJiOKf-SF(CA-Pl|u>AiNZ5kQZ}IB?JGrkmMz`DUIv7(SKOfudQRp$;u<|n)aIZ!x!&WRI47w;nB|u?2qau5289+d6+uqo>mR~Q>+8>v!*m2~3#KBT zAd&?7icy(?BWSrNh%7J{L2L-7BEaUqRK$PodN3971i=TUB2eqWRKycR6qt(e^_M0# z1XB^WkepyD0+ks&Aoz9ie|v!6CcggQx5-c8KIaL9^luH$zmc>S*qunc4^QMx;IJfB zzpkLBi)xH~N~e-N`UudUk6`=Coi}!u_g~3g8mZ~2GQ=ESZvJAnkf3|?_-iPJ$qX>D zn1AbsCwrtPpR~YD`TA992y60MPTEL70D1v^)|Z^8i-wk+s>lUFQ)~o1)!$1VUX8O zbE?x0E{1=vH*p3ogxlD|E)?;o{J8_WgIT_0rQ!ryVS_qKkXAc*jFYX+es@gPkNjzi zoB5kU@?fsp%&yeJj2OYwfQP>yA7W=^xL+0j`mr*-NZJM4ZG1fOJaYl{hez!A?f%X@(e}k-+sv-{-77F%LCAbE8B~b6m<9$L5L3mLaCaJ&xPZV*2X4M^n z3p6QrBuSJffA{6_s$&evoJJ6O6KsGd#~FN>2>kM)L=DYMW}69_(7|Aqwk*lp03Ccd zis|2vpbEgC0SyX4q#-EY?&=Aa<0Ut+6Gf#hSLxSaSBzL5&J2~>Y#J+sbO#ae4b`G$;B;$$D}4X0z2v;^6)@gc9w& ziJ)RqB5AlHW;5ZI;v;L03VFaZBlD=zQeRjoUlVY1dV&*a3A@OyL!KrlGU>y|H=Msy zE;IFOmF1z)r=G=Nq<`Q`EKS3fRzIIpang>*X8pGT(o#K4R3%iKxqBi#x*?avgWpY_ zs7f#km!YzoQ5$>3*uK-J5M&UMC@|f{M#{=g)*&lA1;?9{GaJZZ56uro1}U2!Dg&t) z5BEUSr`M8b&h7((6)CtR(miRoq^8%2Kkr2&xkfIyGjGJ59lV`huW!WOo!-UoBj!H) z`|k;^JuVP5ghJOSBpJHw=a8&oiN#1#M^Gvq{@GO6@uViTLlxMM!wichsH12S;G*<~ z!dGbWyP*_u{48AYEhLSvkPLCW^RdGbG|*U4ElV7Kv-)JaEd8ImT`3#fWbwP;7Shu# z8jN(Tg(yaqI)Ziz;7Jl7Irs&3fQOj05d{1G9gxRepafMa{{wOS`NWm3Gt|-IsqQ^g zgmpo=3umMYlyt;#yZ`QW5)sLc-_`U5yk06!2r5C+2s3L!jLyHbA zxs@CEQ!Vu)UVkNIxV+hbcZ=4@4-L`D4pCsCB8ghVc9=keuvR;Lg1}Y|0#0Y}8XDJS&pfcxKh5^R*zj@R1WyyUL;T!ouv+Y`Zy; z?F3n|PN3!in~eTV3Uz~g1oA54+ZDOI=x}h{LGE`cs~WoEuU0iSTY^nL-m&WI)qX@< zJ{x4X0PgmEZ<-cm&F>4ziX$3kI1FE0zBM2Z<$Rd_GV%L^DtzpOjwa`Ng1q~k*|S$l z4Iu-KBz&@FegGV<@^daV#yh2i`Enh2Gfx@^yI+39k_VX(O z67@)YbnE0&19x}Sk!!+a6u5I??{uxj=&YD=LxJEV7Z`qQ5*!B2sD2?u25sstOIUd! z0HifEE2q3gPu6t{&4FLd^B9DhX$b)rH1b^w_z-0CX$Wl*rKqHevtVE0v6DVzANtFi z?o=bZ9RhYZpQTkx7dpIzYNUDYKAyjLpEoy^1M$jjhBb|=9`Z-44}r>iAUxeLH*K1O z3ZRV3qr8;dvC;!N3^LwF_>FgadInL4ZxS?6>a4S%YDUln$FLPta7o;(KmORpTm94~ zSeV(t+mFD4PgGI#k`I|wQ&A*7|M9O}_gTt{DyteFy;B`0;b)G}{a0yW@3}+hcEi$Q zIu%hVyJ@_AHLVv1W#p6Ld3dg3Xl0HbWx%JQNJ9Y&9yw;csvv^lt4(>8HiwMS6hc*($C%-g$Dd}(>Mm#rG=yYB+-x%(g=W6D6d%+g7E9tQ8K77zmI7RJ zvQGZEaFbEAk8Yo9T=$zEZJCQydu-tsoucKoZh|3UI2;7h*SI@(+po1-MQdqC^Lu+8 zVOcH4{W<7h@h06_iDw!E-xx5j56LH}IQUnq)o#&EOBPN}y<8DTt0URqF+LB);C-35 z&}{J`T9Hnlvi&BlUXb%a`!P(6_zi%Ee=S^%5rh(x}DBO_}JdT(e@G?-|PEozSHXUck2xkjOX<0cGtH1c>pa3SXEt zBM|OX%BLA_ucip5-U;~50OSb?y0 z!|l_i)F_B@ip$Uf~~~;MF$I>7T&+HJ+!a$((m; zn{j+%-tG$Ll;y0!$lqW(G^S&3&otS7jHP_bBsyMA+Ri!}tgC+GNsnUn!X(?c{mHRQ zAvt=j;+svHNg1Rp>vfb4auw8|9ETkdSa`vXzj`ka%f6 zm5_v7!2t$K^(BU~ztpGf4px&n^S`SN)f`aXO#Dt4_`Uo2(^kM1^#ScM3w&F~0MBMBSAfQ)+z znwW?{|Fv4??Mxz7e3OBV3W-DOSCCFyTg>c>+UCn{t)Mgn-%O>pQn`i*|4BxZR8A$d zCB8+HFS7xaK=xw9BtIj5o8(u1^u@vUu0;bws$1o=eZB;T=Pq9v4!ZnWEOohpY3R|h zg(>OJ${GcIj59haNu|7OMshbLK)52Y4;*de_Lmy3%<&`QuGWyVK^k`C{yaDM0==VJ z{|*{7C)|~4=t9_BHrRZg#!F&QFW>abw_H|?i^P4VF|iP2%*_nnPGwNDXOidj^mk2J5NW@~rOnf1jo7Egum>_SQ*#ppJQIPDiRNgiMyAlzT_49@V3 z@=W$i?1vJ<=#nX<&TLGj#ghF3PrtS}0CnXXmBpjYPF#4c+%q4W;+3tAl65imR2Ai| zePLG*5&rW-qTdo-dsq{bLZhUs|8d|RPi5m?A&QH%4 z!~oeW%{uunilMq_-MDr`K>7PrW6W-*1<`;j+F>$qU7klaaL^kLe|W@oBC~pQ{7baf z*Ql!Q2>danJI1<}CB^#EARb$`cdP(&>A4NCft4J_FqyNzK)Z6amO`pJvX-(%zaC)( z8FAjt;v@Z(Tt^H_-+wMoU3WPQK7J7wZ%p=`vWczWkhim@PU3a|g4tdcmt|v4V}9OV z7gfE@yB{B+cFa9{AHx>e?EO_d--%C-jYyd&kb1|`L%Px1GSAEGQIT>N#2zL5E5I3Y zfzhEJai>%&62)FxS&D&3ZI*J*q`Hql!!>(Q8f5TVv9n@q7gbjmp?g#MZ1+pwPmY{{ zQoRr|4TG)a&cx{}aMdaElKigy_9`eCN)VyVR~P;A@SfAUcr<(^cvfWM^KLM7@EgcB z$XkCq_+2LkvG=!+80zHZ2cH^=$40PG-^QhQTR4{Jpr;E3bxRu!#`U^*?AFdR>UlW$ z)XWGmlo2V+*oV=AL=p|x1YNS}X67=MJC|AFqgW)8pA}rTK<+6BN0#VL06y!LDrxsQ znYYQem45j>X^+L9Hn)cd4WTJ-``Us({w|rPCEH9EF|g@ERyr+}H5@1JK0DlevKN85 zWRx!Jw}0G+0<=cyk1ui{YR}Fj-cT~>z13QOS_nUy>7~OMv3k!(GMO0hTx?5$&mR09 z;qjIq-Adus0p=0-TMz71YEu#{3c{{i@tEL9MeJ^b&W2WwaOsctSq{(L&H>!29N;zgKXTW%o)tEbb znHZgVWG51#D2O$MJVfyIe}JIc_G=bwICn=WjPv6x2cT#*Vbu9}bbMKqmroPOIV}-} zBtJ@4=XPbWJQa#6%+v>bu@--{8MefFq|gWNo5|)nz!4}DVUM^kc<;ws4d?8V(nmOZ zpf34chCAKzOZxRrZKy1cpog?WiQSfU;t3V5PYrCr{g)IK%&B;aGft^_&R0%Ks(Mmd@gJ>F00c9kFn&0-!ZIsiOWne;Y&Xe{)I45B!^=fMC3ww;c$ zu?+Oa-7z!%wt~s!&7=wS{amM(RF%9{J0VcvFT!?x*)c)w;kf0({$919N4F|I$CiBk z%CO){)=OYfsuB7PsE!M=;Xq>-e^`<`8)1J_`PFlb1wjRI;~EcA<{D?(R=m-p#S&CFd8h9nN9 zX}M|{lt`7;HWgyqkREsnsZROKxbJtL0XTmx3Fy&h?NXUr<~!|C(yRMXr5DaLMPWM5 zs+s1Wq;59Q8||+;7$$mpnG@bH=s`g_b7QxY>`xV9AcrhKzV`&CPC&K&+`vKrt9~Ml zMdP!{ydp)2B2p+TWXq%B$MUK{E&l@MTU_I?R&s-plYscEO(bXS9a&-%e7wOuV0=iM zer=4@{#y-J>)X)ODr2_2bSUrRiVgP1Ei%qI)BzEZlnuwM00iLDrPr{EuQXk86V&ZIGnvVL?z)IWB8P{I0&-eZ zH|1DF6rJv&4~cEJ&zLBT36kp+r%3p>L@5al7&Yx1ZNZ~FY;Mkmx1^>mT(kTl$O>l@ zMW;g3T)q>hoBqrtw)MLNIgq{%l5^kk>glyMK!h}*YK!Ru^*rNDIJ(@4K)Nsfgr)g> zj?xyxC+88b<%AvcG1pP3057Sp*6~zSvcL4a51JpByf5sLQZ&UO@?Q!(ehzP?d%dVz zoJ(QOD>o8hG^Pt;@;hF0^T8B5UVjow?C<*0eiALk%A0Bu9E&ZLW2I13v5(ZIMdlloq@uc&Uz%<&nm(WcL$l!<84z zBO-pTcF3hYOvU-=*H@!(Q|TKm{Db-MGwixoXx=tR@UGg!5BCw&Yj<+UjQ)P2^%G=} z;)A&LZn{Jcg@*2r{vn?L8_5KMZ5X`}0v#rty6-L@f~{1SygU^Y3UK$0!a4efLyHj@ zn#DwN3k^ap;&cc9Q~QGdWO4={{D-x8f8n8As?SQ|P{)fT(D;W=4*Bn?L|Xwi{%}O&i-2z^ zL_e9jXn4NL?3~aC^11F0@%a->_>^t_X?h=M;e}~$0s@I`l`cu;F5L!?F*XbTxVwuy z52N*Yb&+ci$%+2xqF%1WE8oV5QB!R*X0Ao6PxrxujDpvikc;vks#fEGq<^BqL~o=% zx8pILAx6Py_VAeP;jpX0S7=2298{Gte3%-7rv==C%K| z@6*S0X5Ot4_|_vG78Ei5xwat15Ot`gUJI1CQTlTWhsbn{wEWm_$JP{o;sj_2ld1Sh z$ua%`u_;7WlxiN&-($_f>HWBEqwIb|td(*6PY6MqtM!YypbC69V$Wyy5RyVVkmy5K zY&=8K=HX?%vy@vwc*EOI9L14c$Wzks*;G5tZ^?H~b^R*ZSG4fTujd$NTtZVc*Ou~M zscy3hUjzN-vZpwoRik`V*DLBaw!yFnGz z$_c2jkA~J0#sNOeqi{k06$|5$|5^V&eWP$q9j2pjs-eOEFXSWz?a?qE)g1iz{RbV| z6BEDzAHz~uCz6X#C0FcJayejn9CF9fE61SMV+L0p^UnVZbe*g1^bVv(*)omsMQx!8 z<_$r3XO?~}AirX)#aUE3T^oJyE)o8SjmdpOQAiIl6C_&%C#YiS#62tH!n%KkWZ85z ze;aKM`j(R(;fXu0rf8>S+Kq>zLk6jMs4O$wn$)U+fGAR~jb4sBu_0%(HC2C1qWMSE z@C}|0rl63hDt;QXW*z9V{&5T=UoqR+Lgu%aB`KGdx6mlL)1fMB}AUL3LHEI2!fUdhuEG#hhZP zjhG0F11iI7(J2xE{wL5pP*vX1zAx8oCk$9M9 z4O+@B^~O@3L~nWWZF)o#JWuezH(=!S*np@3z2 zv+cX|gn>e-+x^vqI~6quTkJl4m)a!5b5rJaNW?%*Z8ordU};|OlI!EXTwCor7dIjN z0m!;u_iH6;A33BOoBK+bZK$ecj7RRdUy!#e?CG0dQ#vp=+S8$W6&cF&rAL&9-4A}H zek&Ol*AVMD3E{WSXG-mz*!#N*Sp?NJRe^khCtvG&8maT!w;z)0xNY)5&gBh{Fyoc( zTxtG-KhA^Fz8=z3W{c-XCn1^R) zbgTTzepm!lMtpuyUZ4n7s@DzSd*L@XbeJ*0a-T7Y@v4>-3R@D6<2d?381|+EJ9f)* z0%K_Fx$*q>#Fsx{=ov1x9aP~;Oi0-Yq1G7UexYE4d(QB><;Z@$o^S?r8BEdhHlgxE zgrI3LW;>5J1HRA6vb(A4 zT+2ak^d6D+ZUXbhC58QFysQZ0c}qa&{=t;oJ0@a)O|6w6D}Frg+<8U&GJdtoqnC>5 zxndX)OhtbX1$5Van?2g?I`GTVzpov`$|BWJMS`E9SOOWNa9HL9XLOPW z6n<;0&xMouy3^2W@jb9heyXn5*&26$wlNG?>AWA9at{6E8dW=$TD!&6`km1rj`SO> zX^XiVSFp_pUPQY~P?Xt)%xDtKpC7Zo4DZ&bR-mJAr1|%fqr73nlhr8H`%DCkRt_3N zo(RZY%efnLzGn$Yqrz1s{661x4+?<9Q{jrJo+0uizm{w=j}>#JNoc>`VuM= z$gI4G*&)^4`hM^4&kK6Po2TK#dyxlDFF}p&O`YA6{L^=~+ESj(of-TTaUDZUPRJ0F z#=1caXVq`fx03Uy%V`}Cp+%y1?72&$=|wn(lE`f@;&_}QfA1z4nX{8fN86WNqdlf&zp}J}QOgpCmAn6W1Uq(L*9wph`OSJ_CB@k7G7h)}oD62J@ z6M`ccoq!7VWQO(w!t)dTl#ZniHpE}aJKpaB{cu0nKqP*-FREYP4A8vI>~J5i-g&>v z+l=f8TGxCYey`eArG6uJ;fH7=Fb{7WCmKcfvVIxF z0dRIu|H1a&$%M1Kfjv6U=>PTA)K!SSf}@el^trlQ3w(~ysqwGT_bjev+TRdjVEY0H zLz18Z*u)n7V-q+gui|!liDj+@RxKLK_kXH&>DW?3Lf~0zTv=lo^y-2gz>*F!dChV~ zm5PoJOq$%|{N%%~DFf#mRF)W~sf1KCOM(m{cWR6avm)ELqO2{4aR?{+egl7tOdlpM z^)b@?@&>FZP~0H}YG`gN^2ue{P5ppdQuIohk~m7or^Dt@$<)JUNgMFt7uFqRrK%!M z3Cs+MQKltcWKId}-J$8ip6=Qc`Nr>g&=hRMNEpP+=j?SWRN*LME+mD}Ken6j-s-y1 zARLI^>gJ9pFM*Np_o`i0ocARO2oflWPY`|gD)4=SI3n;QA`s|MZ36Iy#sk2=$z(WW zv=16|IF8UDgvMfdIHcG|!Mn_d+EqL)_U{_7Vt9)TkyMZ@BMc7On7Yfpn%AH&?|+6RH^xhfz^uz8IoN|LVv z%+5hVu9lENuF{D>X55c?3yfr}p)qeAV^y;dG{kreHcO(%g?kK6G>1!0$f%QlHO7aG zxMqaH_+zMq7LoIr3hNJ7EqDnZN@7jF8!rVY(!g(Y~qwj^JfqY8S=!Ike zic8KWzjB=#%3#U%qwh}+-W9-{As`C}GD;#4acSR439hk;r5kQ5D5vMUW#b6y9R^0_ z{iuU-RP}cS2S53Xs>K-E-ny!O_=3&#{P~tb`0+Y-U5^jAsqn0(#|2Dip)6)XE;d30 zv7a3NxEJ!p3XtD3!#uY(<32b#bjFbbMS{lKb7+a_6MhxH-81gSedhC7a+hPv;Et)F z@!gK7R2zbRkjvP@O~Nz|8{$o{Xzf5w$D(LcJbHqXOV@1V+G=uH$t@@ENm52wkNMOd zY;#i-&j0AlL<&wQ`_X&Pfh2xs_=Au?h9MJXrJV**s5g_Cnc-CHrlwc;{4^Z{bW?RV z;WI=WDl&)kckGVQR||_DR`1HHoUgZ@KF1DBZZc=u{g$F`FZaO2*Ft7>Cf(2zwhUb3 zgcDI|8#i@2>*`qB|AjUiv^^VG~B!4d431CdpTT@|9eV(nHLMz{D@n#cyvX zGDrLe{<@t@=gb-7xf{N2MZs#$xf^yf>Yfd>`y2YR`**rb&5@ zh>I=p%u^Y`bP^yv_~ax|lXgSny3G;zE5d&C0rQb$4qvewewLNeNZz=#oP53 z>7n|ssMOc^&(g{3dh-$ODFgqld&*e9i2VZr{srpP1&=-i`zYF+N&bhWWu&_17nTXR zkaqj+yyum;K$mu4#UkZn6|G226D`dx568?FdjticLa-UEs~Eu-6`)EyxefnY!4%}+ zV$OTph_j!JT!G-)g)5np8p^I$fhY0gS4fX3TqGMLA!sqc4nxf*@QpkUAm{xq?OpF| zt-|z)DivDb+XQTN@KhyK7*_O4S&$=q5j81+PN)86OotYR)Sr_YOO7^4jf{m$@z7pN zQkiD7E>CDvLUtxR7?oOOkLjlVpT=LAtT59_nX8{`7Ei-|)1Be8cxP6+#N;(wRF|)l zCLK3-GO@mhpY?E_p_Icz0pFu(bJfbWhw}ARh75H6a-KYJj_4QpDJrLCnztP!URW%4 zesjH`ny6xR%_|SM{?r0Qth_H~%<>z5dqU^GPERt8KfEmW~x7a(Nry`jx}R*PXMcDdU{%5|F{;5Ug-mGC*-q zdy=JjopfWxoSMs~Vg~G8>~DJ>x|isrI0?#q1)F|h0wO-|TzLMh8G+hC7*pof#F=R* z+*b5)6Id+JAVe+CW;_!#l!p|z7n8VG-zsErIArk^qH)r^byC~YR|`#>9Q>}x4z}kt zzPVV4CBkA5T+TWs5Cey;m8?~;@SO&$*6x&tU2IQfF^VLi{%qGh#PIa~apx|7&)3Or z>@(B8aM!qx!X;cjud8SHkBV{n?DI+rpCUF~m+Rl<^3naP*q^duGWn7?e_rd4c633k zkeBKjWd9u%i&T;$k6Y>6L8h|!GbkXBZIicW{}SFO3uDtW4WRL$My5d{Q4*~}o50KM zRfjt(7&mPOWvBc73Hus*@{O5gnnpXwW;{E@r~U=qZ@;Y{_UA?G3AzUKvDWVWx+H}F z^@YSwvOKTcb2LXK~2{`@4wpGQ)<7M^nY+nk@AilML~G< z`yTapPa}UiYy~v`V#n-hZaGnwP&UZ6sc4Vn(g>14);hI$9&>>Nwys3xmx&{&$uSZ) z>&zOB&=am_vQv)Ds3;N7yBRI?V_RptzK9kNDOB{gb$~pdIdHMQm*m^WpV@g9{MD!o zjfat!jVRqKivB&!5JiNfyC*EiZbsZXarq5tk&?@Qwq`V)fQ`w$<6p8l5F!#gSosD-vu~t|XW?5B2)P zpP?rV{WCg%$PqxAx!)``f%v^-?#NQI0mQW8c!0Lkt9C_$`7VCu_3=G$%YbalV7|Y> z;Wn)c9SG?+UA_1N(ksZ^&Uf+tKjwn9Yz!$p5?jJ<)|^mFc~k7)7IA7lck0Sze5#%FHU zCvpYMzQJrTpD8=$7eL67u{G|~7W2PI97ze?=XgYg6lbTXU@w`xjFSD(1Ot=Tk2m44 zRZUifC)ki{+0#87oV7*6=Cp5%I_m(Up5|QsN}jXUWM&x6V?+#5L2m<&#PS|u4^V!Z z)OTQh)W1TdYRVi9z{jZe_$9-vRYBh{6j7kN-MD)i3yG$&T4Md#JEpTj(l#pbul-V9 z?c`Y4$v5tK-XLi64i55ywZhq198lSUY%rU=LKB)i4`bbwf$$&*_XMrU76KDbjUC(U zgpNBC_ZIdxS->1A9I^_H#n^vCYsxb?X3#RF$sB(>CDp(PXm==VBFRRe7yg`0bH;0P z=4acT8cVP5#p0g(s&v#=`IR$PWdK2d0$K9SrOn9MNRIz4lh>Wo1A_VX#9_*IA?KAG z;Pu$1_H;v(+S#S@{}SXW?W7r-VCqthqRFejnJ|H+$iCo1gIy(M7e;fGKBSgn{Y7i& zjo|yvc$bhia6>n&vU^Y3nJ0*%1%;zygSP=CDJKAZvyhE0z~h_N4g1X};X}2~iT2dq zoz1Ibc7o)#@$%e=_UDJckwZ_i*KR9;Sc}9(Jwmn5&pq$ zfFJVzklRjVf3Z~%yXsC;EW+GMbLU*{hfF22zk#p4;D zj&x2OlzKrB(WkKmD(IO{x@a4t0Is zzLlU<2{!I^c7gKTOMV zr=|mfnugM`vAg|s;%8PxKarw-%CUcf<>JJAM7J9D&(->1dRAH8iUcQq=OnL;sQTdV zTE_gTz{pU>ytORj?Z1&yW=y*iW)qze!eo+zI`yIZg5P9;gV0oM$j+aZ*=GbsI|7MS z>Fe5JJ}&7(20BZ0)bn+N#aqt;?OR(Atw145+~fA+br&WB(@mw&%*arxpz?ZJ`FZ=s zCnalx+@eJ)j@5l+34Wb0r)p?k2o{cUE+Igs5rwsmwpvuq_VH8APp}ff-l!S{TNst>{`ypEeXo~em>u1(&~S4xjv)F z=(;(LVheL8?lQetitaF$;i0LSM(Uj_B zbdf}}wJRHc7H+u@vk?`)p5+eI^H@#l7xIvCut^>VYj5qr zgoXTyg5ZuE#_;fBh2@>5jmD*6HPJwl;xE2y6pXW98J2Ul5`4`>SCS{D z{4clxi$z~g0xqlytwEy>bstZFZwN0-nqS+NR?b4n>OrBOi%fe?aMoM+@HhU*O`(VX z4b=!twxYP6!UBJ@ApP2VXS<~H4Bz4-W|iBw);-g$OrsE(rwy|rK-%_>-{P0?v6z<| zhEw%^x@$sq)1EoB^^^J=JcBY(4dt;g_u32s_0(4|mu*Fe{9R0Jp%tueTjUz|YxaBH zQnnF->s9t85vjmKC_U7-cV$b|)P*T6k@CIC6^c^ZFEA$3NsCOS5FH_creiK>+!_o2 z(G}GiK5sim3xv`e4PK`QILCYw&H~lVkDTVr{m9tv{%eP4RMV7Wwmr|d<8iqVabI48d=jomXBCuG%iX-k%rWq0~nk>WRp z7a5RiMD8{xPsWDvyZ5g*FwRF&YTsS~kyiDMElpM|ZPb_BO_-*A%V36Z>M%>?j^=0w z&%$ywcNWI>?Y;M1eud#IeGSjVTgsxCDpNZHfqusOmm0n%k~^C?P?h!aUDiB}M~!O) z4mcJBCf&lz_#WoHJ8$k{f2-Uli~jz>SD)-gzrMz^S25cA{`~&(-22YtX?d1+>Yi_K zAD*j9L>HUZV885)1cFB(m1T8271XXeg;S4q*~<#z^JWezC+(@q>)B!nbSNqX)iWu=}I%H!)G@>ByuVS7Wo~n&_zCKj9aA7uWxz08flipfc(v`VtM20?S@_ zQpv`KBoq!|`f)%swyc1O1=|l=T9)8yvRLHrlwNjWhijBh z0YQ_|HLDvqi>Ajkb7o<3a@~rOtz(hiopU==Fo}^Ng62o4wa0+lzVbFt<)QXt~C|-G~tS52&a#0AQbfzse8H3(I<=HPf$P&(Cxw1BvWn&0SC)6ha7#?~V z-U$w;9LY~>ZaJT`v>T1rjYcLrh9e&m2cs7{?ov({`> zN>rKn+kNUsiV(41YC}xV+AKMa7W$rOw#94t+k^9)u(n?E07XX4>KW@f{d%}U#Lq8& zPGfIi2@nOq->$ZKB*8oTt|zPNwzHhO{zHBv6Q=jXd>X1BrSMr&vDY0_=CgtEf{||u zSx(1fq<(cs_CYhT9dtL_#rKg*i5o}GX}UUyoF|1+2u4`)0PQnk7Ck$c2P*_vJn4D{Y2cgtQSkg9AIu5Mm-txErCLWAL*6Q1SyGM>_65cDB`em#-0U*t3uNe=gY zj`YZLjBH%=9WK5&bhyb!2=sZgc-Wx5A7MvdZGMPCP?xN$zvp>*36)05RH)>i?Fk9P187Ghu41WMo?G(}4 zMD%Nr#@lJw4$71c$YT2g8gIMY72v1N`KE{2Qt~Pxx_H=E_ znW4FPA+O=f&CI>BVqrS+RkVnmwax_$o4X>{`vVt#C*pShboCC~bu_(|6kCjJH~Sn1 z$=3SEI@V0)t|99psQ!-i_k)nYvV(-+IpDx`ZY%b@@v_%_Ifp5ouK26*#?Wd5Th@_O znLW|}e4z2KgBoohoYE+AYLw(1qzAkl4~F|Ma(Cpi&C^iN*vEED_g+V&d6;Z~FWI@j zzV1AEVHVHdd9%|@bSKO~IZUxTM0AN-em7x1Js{S*5U{OJ-UD6{o3TivxOq~#90b-z7cZiSw2PO0pJBC>A9-} zuI@S=uF7ML!7!2jPT>lhp^#Lay|%S*WCnD6FY>K;J2gm$+amHE{*%7(okKSN845^W z*>5()+dt^g%7xxPDWOv|85lN+n}b-1>#U=xT6c~D3dj7r^`6GmaQ4pN4H+E%#&JM? zXy>Gsj7B+(SC1hcRAk@K2TU*ugp92q5|`b}&;R_7x5~%zO%B4-UM#(e$z%(#B)~zz zr{!c?7%BRfw)&5?@=+-%Flsbqlx4iEv_0=s`)yq3$c05c_W#3JDMBj!c4WZvppl{j z6@LiTii4rh{H*`d2Y^?OTxkpHlWrn{jiI6Xi^e2vpon0go4%Mf6MushV4FUSd?K7F z{X;XVnlGQS)$zw;E?gyMT9{-)?XTWv^Cw1cs~?~hq*3n0Cb>1+Wt&}!QpI$awJzST z5}R~T2IwF>zyA{s4e|0;!heREB)5!w{O3{ksN0I;KeZ0xKP&kZ#eedDu1D-AVn5^9 zPd+e~!F{HVB*c6o<`XfWYr}k|&bdZVFYyiWo{k_pC8W4e_3c z_e8uW;yn@XS-q@?_e8uW;yu?VuRq@q@432Ui1#c*Ld1I_-V^bji1%EtgoyVkthCe>Oz`cuNaV%4W|ipyx9S_rkO{ZGII6XF%I8c zKv?*Tu*(u*mmgSz`lz$SbWF^<$is*ZTT<2UoIdE;I4v=>m(=lpJe@4a3@w0@xEWnLBN`MB8fCu;l>HU61s(*#5r zEC64Aq1GqWY5ib?ucY{6kNthC4MJOMUbQ=D5F(mYYw5v@-_P#Rr%TK0v{$qXVU87; zhKvg6d9Snm{y-ytv8<7}NOhnE`Br;mEji7BI)!7zxZY*hD z#Pr&3Gs66eHu@E@jTqPXNqfeMh66IGV%NwQ7XG4nDA7FhScCey9>8(vOw>Z*i*dfB zs=o}qkFC`69p)}{&|QeFwl%{&_t$>CyA}1ll2;X;LR@x#>OC%uBeOStasanr%NbZT<;!8_drRy&LQ z)#Pb>1{2|RgezQ`#eU-&-Yq^FE=b06@R*b!q$_O}w^!_Xi@f`APFQ_CPJzH`8?q|S z0*PR3Luy%n{DEH%nzic8T4eq%Y2ALYZF8&5TesD`>K>taixHq-Ucyv)nsE(L^tpor*x+{aQLE%DT=ssEf6@dm=V zu#Q*e3Et|rTWwPg+h|i_ub~b1mj3WKlgaAtgP&C;FVLfshriIOl-S%Kk*6TOCe{?*!04`8!Z$jTk@?0<4V?SV0b7)VTlb56S{bucJ}oae+V z@x{`5oPUJh+hZDz8Et0AZO6DbEOOl=kE{*&ODr(p=hr>{GHZWsuB>H@9}&W!`6Vot zGceCugKL(}oIK;ga`+}LIV#!BOsKyl)*X3~k&+X4$py_jE9;p`10>aMopXG+m1~@T zMCi=$7#+MZzxa9kH5n{(r7)n7?QVI&KMPhsNP(-85?3W3Ww_3alYz`9R<=~jjN(|w z5RT-XB{S?ZB^wRom=?itAEPq*kCwREoEvsACqm+G>Cq13(G|DS#-4PVSK4u_UWOJ! zk74MszpNDhD@NFzT}FQVuddeVB;tR69doEivh5(C(01L;);!(h| z#}ftu!$4pd2y9J(z_O=ZBdD7ArYx&57FdR$7z?a&xiA)3v5A4Pz%UjV#sb4wU>FOm zP={kIuu4V8SYYdIeSg|vEHI1(hOxk&N^*<^wz7m63v4w(F&0>vD*%iIhOxkZo>(%B z1y)o-j0J|Vz}DK27z+$zfnhAL;&NgvFh~ipz|^hLXBQ4kt=y83kMxLOnR=o07+?Wh zZEETAEjus+`rqM@F7$-UNjRXQ{w)_HfF&R;v~NI z+66JI66_Havn&6;E)V%pW))L^R}Iw!EbF#uqMWqWX< zYpR>(jOdZa_OdY_d8z!CTC@Uv;0<42Ez(;Q(O+;n)>Jv>4Fp8H?7&CE#ScC z377?#VdDA5DFb!!!G+O+&XlzhUHmIqVVvJCoBA z8j0D8l}5orFrLPxN5=Xr2H^1{S%!l|qIj544TC)aGn@|`)`>Ee958$s11czMAhE$_ zn$f1unuUl6T7H$~!kNy3fT6%hWTA%AuCpeOK9$4@=Kzti7j@^^4?PR;QvN`_VWV_R zJ^l_kcbt0qUFeJ4JNoQ@&i;`UV9nkQl+$dz)4H(XrWAbmFRU;*25D zeWC=QETUGQ&2=_^roo^k`U>5m$fGrJi;6f!==G!z9`t&`WX#hMW8@jQJYHxN)psB0 z_sF};`aK_cq$n^C@wLLUbb}6$n^(s*3s#4`Daf1hj6TKrUouWLr<9S;|8jKPZFOV( zFCF#(^1oE^Da8L0^f&>}rzG;1()eG>qJSyP0#ld>rXUv+%!+g{>tlq0(GjYLh3R0j zhS!sq>*E0#1k_G^+m{IB0XG48mq6qJZ+{c=O3ju$%g>y2!@4h>ZRR6|F$E{|h#p}2 z0b~*eA8lmjfrK)VTWX-->$7;EUEk4u6^wx+%XY@PdGUKs`^x?mLm&QXQaEXIAo40N zP;j9Nh~J1VED>G!fj21`8YWFl$4F8Ha>aG^&S_tFGl(R@v6>EadYgKKt^RgeJAYdh zl{VPCl;8@jyK%sZXKqGLM!GY&V(ZFs42hpxwWcJc68;r5CncJb-&ms(a6;%HV~rPi z0FBCWMkO4x%bFE!%gxFWniZb5HfBX@yR-3~&0O8`Y>S#>we}^eHtJP0G$k6Eo@`i7 z1c?SG@n}f~CpvzYH9GArH##S1bbol-`WT%fz*sWnLY*E^^pv$b7SFX}vWo^pgmfI9O6Cl#o#-?kp4w13D1QOXZlFw4AFo zI`e9mb{7p%iH7Lr-5*3WGNH1SC3o;X*=3qwY7YFMvuYeAmrlTbP;>SYZ5JugcBK#a zWv$r#c3ZIyo)r*jYh%TDWzm6FR(4LiO&wgc^ zggRs@8kw_=>=DuMK|o%@zB{t<$pb_;L?cE@G-8?Ke4CBZ<{e+aSdkg!VXVkXKE>ld zW&|-wDI-7rW2fEL4n77%PrmJY{Asp6AhUN{>32#fi3EwKng?hrm5596(FVsb?Oh^|_O@7u|7xvT| z@Y&csXIECVA&_as79_JGa2*Xui3a48C6{*te&m)69ea#sB>HGIW<(6_C5_0r^3c|r ggw5mVLLgp7c?iVA4}S22pXd1b|Gd9QZ2(Xd07JP=qW}N^ diff --git a/docs/index.html b/docs/index.html index 3dc30092..49328b59 100644 --- a/docs/index.html +++ b/docs/index.html @@ -234,6 +234,7 @@