diff --git a/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/arm64.swiftdoc b/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/arm64.swiftdoc deleted file mode 100644 index eb5053c..0000000 Binary files a/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/arm64.swiftdoc and /dev/null differ diff --git a/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/arm64.swiftmodule b/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/arm64.swiftmodule deleted file mode 100644 index 512a204..0000000 Binary files a/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/arm64.swiftmodule and /dev/null differ diff --git a/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/x86_64.swiftdoc b/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/x86_64.swiftdoc deleted file mode 100644 index 3d42eac..0000000 Binary files a/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/x86_64.swiftdoc and /dev/null differ diff --git a/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/x86_64.swiftmodule b/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/x86_64.swiftmodule deleted file mode 100644 index 71c14e4..0000000 Binary files a/Carthage/Build/Mac/DockProgress.framework/Versions/A/Modules/DockProgress.swiftmodule/x86_64.swiftmodule and /dev/null differ diff --git a/Carthage/Build/iOS/40F3FEC8-FF17-3C1B-89A5-2119C890F4B8.bcsymbolmap b/Carthage/Build/iOS/40F3FEC8-FF17-3C1B-89A5-2119C890F4B8.bcsymbolmap new file mode 100644 index 0000000..d1143fa --- /dev/null +++ b/Carthage/Build/iOS/40F3FEC8-FF17-3C1B-89A5-2119C890F4B8.bcsymbolmap @@ -0,0 +1,1760 @@ +BCSymbolMap Version: 2.0 ++[URKFileInfo fileInfo:] +-[URKFileInfo initWithFileHeader:] +-[URKFileInfo parseDOSDate:] +-[URKFileInfo archiveName] +-[URKFileInfo filename] +-[URKFileInfo timestamp] +-[URKFileInfo CRC] +-[URKFileInfo uncompressedSize] +-[URKFileInfo compressedSize] +-[URKFileInfo isEncryptedWithPassword] +-[URKFileInfo isDirectory] +-[URKFileInfo compressionMethod] +-[URKFileInfo hostOS] +-[URKFileInfo .cxx_destruct] +-[URKFileInfo initWithFileHeader:].cold.1 +-[URKFileInfo parseDOSDate:].cold.1 +_OBJC_CLASSLIST_REFERENCES_$_ +_OBJC_SELECTOR_REFERENCES_ +LOS_ACT0 +_OBJC_SELECTOR_REFERENCES_.2 +LOS_LOG2 +_OBJC_CLASSLIST_REFERENCES_$_.3 +_OBJC_SELECTOR_REFERENCES_.5 +_OBJC_SELECTOR_REFERENCES_.7 +LOS_ACT3 +LOS_LOG5 +_OBJC_CLASSLIST_REFERENCES_$_.8 +_OBJC_SELECTOR_REFERENCES_.10 +_OBJC_SELECTOR_REFERENCES_.12 +_OBJC_SELECTOR_REFERENCES_.14 +_OBJC_SELECTOR_REFERENCES_.16 +_OBJC_SELECTOR_REFERENCES_.18 +_OBJC_SELECTOR_REFERENCES_.20 +_OBJC_CLASSLIST_REFERENCES_$_.21 +_OBJC_SELECTOR_REFERENCES_.23 +_OBJC_SELECTOR_REFERENCES_.25 +__OBJC_$_CLASS_METHODS_URKFileInfo +__OBJC_METACLASS_RO_$_URKFileInfo +__OBJC_$_INSTANCE_METHODS_URKFileInfo +_OBJC_IVAR_$_URKFileInfo._isEncryptedWithPassword +_OBJC_IVAR_$_URKFileInfo._isDirectory +_OBJC_IVAR_$_URKFileInfo._archiveName +_OBJC_IVAR_$_URKFileInfo._filename +_OBJC_IVAR_$_URKFileInfo._timestamp +_OBJC_IVAR_$_URKFileInfo._CRC +_OBJC_IVAR_$_URKFileInfo._uncompressedSize +_OBJC_IVAR_$_URKFileInfo._compressedSize +_OBJC_IVAR_$_URKFileInfo._compressionMethod +_OBJC_IVAR_$_URKFileInfo._hostOS +__OBJC_$_INSTANCE_VARIABLES_URKFileInfo +__OBJC_$_PROP_LIST_URKFileInfo +__OBJC_CLASS_RO_$_URKFileInfo +Apple clang version 12.0.0 (clang-1200.0.32.2) +/Applications/Xcode-12.0.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk +iPhoneOS14.0.sdk +/Users/travis/build/abbeycode/UnrarKit/Classes/URKFileInfo.m +/Users/travis/build/abbeycode/UnrarKit +-[URKFileInfo parseDOSDate:].cold.1 +Classes/URKFileInfo.m +-[URKFileInfo initWithFileHeader:].cold.1 +Classes/URKFileInfo.h ++[NSString(UnrarKit) stringWithUnichars:] +__OBJC_$_CATEGORY_CLASS_METHODS_NSString_$_UnrarKit +__OBJC_$_CATEGORY_NSString_$_UnrarKit +/Users/travis/build/abbeycode/UnrarKit/Classes/Categories/NSString+UnrarKit.mm +Classes/Categories/NSString+UnrarKit.mm ++[URKArchive rarArchiveAtPath:] ++[URKArchive rarArchiveAtURL:] ++[URKArchive rarArchiveAtPath:password:] ++[URKArchive rarArchiveAtURL:password:] ++[URKArchive initialize] +___24+[URKArchive initialize]_block_invoke +-[URKArchive init] +-[URKArchive initWithPath:error:] +-[URKArchive initWithURL:error:] +-[URKArchive initWithPath:password:error:] +-[URKArchive initWithURL:password:error:] +-[URKArchive initWithFile:error:] +-[URKArchive initWithFile:password:error:] +___clang_call_terminate +-[URKArchive fileURL] +-[URKArchive filename] +-[URKArchive uncompressedSize] +-[URKArchive compressedSize] +-[URKArchive hasMultipleVolumes] ++[URKArchive pathIsARAR:] ++[URKArchive urlIsARAR:] +-[URKArchive listFilenames:] +-[URKArchive listFileInfo:] +___27-[URKArchive listFileInfo:]_block_invoke +___copy_helper_block_ea8_32s40s +___destroy_helper_block_ea8_32s40s +-[URKArchive iterateFileInfo:error:] +-[URKArchive listVolumeURLs:] +-[URKArchive extractFilesTo:overwrite:error:] +-[URKArchive extractFilesTo:overwrite:progress:error:] +___54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke +___54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.163 +___copy_helper_block_ea8_32s +___destroy_helper_block_ea8_32s +___copy_helper_block_ea8_32s40s48s56b64s72r80r88w +___destroy_helper_block_ea8_32s40s48s56s64s72r80r88w +-[URKArchive extractData:error:] +-[URKArchive extractData:progress:error:] +-[URKArchive extractDataFromFile:error:] +-[URKArchive extractDataFromFile:progress:error:] +___Block_byref_object_copy_ +___Block_byref_object_dispose_ +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.194 +___copy_helper_block_ea8_32s40s48b56r +___destroy_helper_block_ea8_32s40s48s56r +___copy_helper_block_ea8_32s40s48b56r64w +___destroy_helper_block_ea8_32s40s48s56r64w +-[URKArchive performOnFilesInArchive:error:] +___44-[URKArchive performOnFilesInArchive:error:]_block_invoke +___copy_helper_block_ea8_32s40b +-[URKArchive performOnDataInArchive:error:] +___43-[URKArchive performOnDataInArchive:error:]_block_invoke +___copy_helper_block_ea8_32s40b48w +___destroy_helper_block_ea8_32s40s48w +-[URKArchive extractBufferedDataFromFile:error:action:] +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.209 +___copy_helper_block_ea8_32s40b48r +___destroy_helper_block_ea8_32s40s48r +___copy_helper_block_ea8_32s40s48b56w +___destroy_helper_block_ea8_32s40s48s56w +-[URKArchive isPasswordProtected] +-[URKArchive validatePassword] +___30-[URKArchive validatePassword]_block_invoke +___copy_helper_block_ea8_32r40r48w +___destroy_helper_block_ea8_32r40r48w +-[URKArchive checkDataIntegrity] +-[URKArchive checkDataIntegrityIgnoringCRCMismatches:] +___54-[URKArchive checkDataIntegrityIgnoringCRCMismatches:]_block_invoke +___copy_helper_block_ea8_32b40r +___destroy_helper_block_ea8_32s40r +-[URKArchive checkDataIntegrityOfFile:] +-[URKArchive dataIntegrityCodeOfFile:] +___38-[URKArchive dataIntegrityCodeOfFile:]_block_invoke +___copy_helper_block_ea8_32s40r48r56w +___destroy_helper_block_ea8_32s40r48r56w +-[URKArchive performActionWithArchiveOpen:inMode:error:] +-[URKArchive _unrarOpenFile:inMode:withPassword:error:] +-[URKArchive closeFile] +-[URKArchive iterateAllFileInfo:error:] +___39-[URKArchive iterateAllFileInfo:error:]_block_invoke +___copy_helper_block_ea8_32b40w +___destroy_helper_block_ea8_32s40w +-[URKArchive allFileInfo:] +___26-[URKArchive allFileInfo:]_block_invoke +-[URKArchive errorNameForErrorCode:detail:] +-[URKArchive assignError:code:errorName:] +-[URKArchive assignError:code:underlyer:errorName:] +-[URKArchive headerContainsErrors:] +-[URKArchive beginProgressOperation:] ++[URKArchive firstVolumeURL:] +-[URKArchive readHeader:info:] +-[URKArchive didReturnSuccessfully:] +-[URKArchive hasBadCRC:] +-[URKArchive password] +-[URKArchive setPassword:] +-[URKArchive progress] +-[URKArchive setProgress:] +-[URKArchive ignoreCRCMismatches] +-[URKArchive setIgnoreCRCMismatches:] +-[URKArchive rarFile] +-[URKArchive setRarFile:] +-[URKArchive header] +-[URKArchive setHeader:] +-[URKArchive flags] +-[URKArchive setFlags:] +-[URKArchive fileBookmark] +-[URKArchive setFileBookmark:] +-[URKArchive threadLock] +-[URKArchive setThreadLock:] +-[URKArchive lastArchivePath] +-[URKArchive setLastArchivePath:] +-[URKArchive lastFilepath] +-[URKArchive setLastFilepath:] +-[URKArchive .cxx_destruct] +___24+[URKArchive initialize]_block_invoke.cold.1 +-[URKArchive initWithFile:password:error:].cold.1 +-[URKArchive initWithFile:password:error:].cold.2 +-[URKArchive initWithFile:password:error:].cold.3 +-[URKArchive initWithFile:password:error:].cold.4 +-[URKArchive fileURL].cold.1 +-[URKArchive fileURL].cold.2 +-[URKArchive fileURL].cold.3 +-[URKArchive uncompressedSize].cold.1 +-[URKArchive compressedSize].cold.1 +-[URKArchive compressedSize].cold.2 +-[URKArchive hasMultipleVolumes].cold.1 ++[URKArchive pathIsARAR:].cold.1 ++[URKArchive pathIsARAR:].cold.2 ++[URKArchive pathIsARAR:].cold.3 ++[URKArchive pathIsARAR:].cold.4 ++[URKArchive pathIsARAR:].cold.5 ++[URKArchive pathIsARAR:].cold.6 ++[URKArchive pathIsARAR:].cold.7 ++[URKArchive urlIsARAR:].cold.1 +-[URKArchive listFileInfo:].cold.1 +-[URKArchive listFileInfo:].cold.2 +___27-[URKArchive listFileInfo:]_block_invoke.cold.1 +-[URKArchive iterateFileInfo:error:].cold.1 +-[URKArchive iterateFileInfo:error:].cold.2 +-[URKArchive extractFilesTo:overwrite:progress:error:].cold.1 +-[URKArchive extractFilesTo:overwrite:progress:error:].cold.2 +___54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.cold.1 +___54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.cold.2 +___54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.cold.3 +___54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.cold.4 +___54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.163.cold.1 +__Z29AllowCancellationCallbackProcjlll.cold.1 +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.1 +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.2 +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.3 +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.4 +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.5 +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.6 +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.7 +___49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.194.cold.1 +__Z24BufferedReadCallbackProcjlll.cold.1 +-[URKArchive performOnFilesInArchive:error:].cold.1 +___44-[URKArchive performOnFilesInArchive:error:]_block_invoke.cold.1 +-[URKArchive performOnDataInArchive:error:].cold.1 +___43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.1 +___43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.2 +___43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.3 +___43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.4 +___43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.5 +___43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.6 +__Z12CallbackProcjlll.cold.1 +__Z12CallbackProcjlll.cold.2 +__Z12CallbackProcjlll.cold.3 +-[URKArchive extractBufferedDataFromFile:error:action:].cold.1 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.1 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.2 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.3 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.4 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.5 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.6 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.7 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.8 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.9 +___55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.209.cold.1 +-[URKArchive isPasswordProtected].cold.1 +-[URKArchive isPasswordProtected].cold.2 +-[URKArchive isPasswordProtected].cold.3 +-[URKArchive isPasswordProtected].cold.4 +-[URKArchive isPasswordProtected].cold.5 +-[URKArchive isPasswordProtected].cold.6 +-[URKArchive isPasswordProtected].cold.7 +-[URKArchive isPasswordProtected].cold.8 +-[URKArchive validatePassword].cold.1 +___30-[URKArchive validatePassword]_block_invoke.cold.1 +___30-[URKArchive validatePassword]_block_invoke.cold.2 +___30-[URKArchive validatePassword]_block_invoke.cold.3 +___30-[URKArchive validatePassword]_block_invoke.cold.4 +___30-[URKArchive validatePassword]_block_invoke.cold.5 +-[URKArchive dataIntegrityCodeOfFile:].cold.1 +-[URKArchive dataIntegrityCodeOfFile:].cold.2 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.1 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.2 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.3 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.4 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.5 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.6 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.1 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.2 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.3 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.4 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.5 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.6 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.7 +-[URKArchive closeFile].cold.1 +-[URKArchive closeFile].cold.2 +___39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.1 +___39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.2 +___39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.3 +___39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.4 +___39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.5 +___39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.6 +-[URKArchive allFileInfo:].cold.1 +-[URKArchive allFileInfo:].cold.2 +-[URKArchive allFileInfo:].cold.3 +-[URKArchive headerContainsErrors:].cold.1 ++[URKArchive firstVolumeURL:].cold.1 ++[URKArchive firstVolumeURL:].cold.2 ++[URKArchive firstVolumeURL:].cold.3 ++[URKArchive firstVolumeURL:].cold.4 ++[URKArchive firstVolumeURL:].cold.5 ++[URKArchive firstVolumeURL:].cold.6 ++[URKArchive firstVolumeURL:].cold.7 +-[URKArchive readHeader:info:].cold.1 +-[URKArchive readHeader:info:].cold.2 +-[URKArchive readHeader:info:].cold.3 +-[URKArchive readHeader:info:].cold.4 +-[URKArchive readHeader:info:].cold.5 +-[URKArchive readHeader:info:].cold.6 +__ZL10_resources +_OBJC_SELECTOR_REFERENCES_.4 +_OBJC_SELECTOR_REFERENCES_.6 +_OBJC_SELECTOR_REFERENCES_.8 +__ZZ24+[URKArchive initialize]E9onceToken +___block_descriptor_32_e5_v8?0l +___block_literal_global +_OBJC_CLASSLIST_REFERENCES_$_.10 +_OBJC_CLASSLIST_REFERENCES_$_.23 +_OBJC_SELECTOR_REFERENCES_.27 +LOS_LOG0 +LOS_LOG1 +_OBJC_CLASSLIST_REFERENCES_$_.32 +_OBJC_SELECTOR_REFERENCES_.36 +_OBJC_CLASSLIST_REFERENCES_$_.37 +_OBJC_SELECTOR_REFERENCES_.39 +_OBJC_SELECTOR_REFERENCES_.41 +_OBJC_SELECTOR_REFERENCES_.43 +_OBJC_SELECTOR_REFERENCES_.45 +_OBJC_SELECTOR_REFERENCES_.47 +LOS_LOG6 +LOS_LOG7 +_OBJC_SELECTOR_REFERENCES_.53 +_OBJC_SELECTOR_REFERENCES_.55 +_OBJC_SELECTOR_REFERENCES_.57 +_OBJC_SELECTOR_REFERENCES_.59 +LOS_LOG8 +LOS_LOG9 +_OBJC_SELECTOR_REFERENCES_.61 +_OBJC_CLASSLIST_REFERENCES_$_.62 +LOS_LOG10 +LOS_LOG11 +LOS_ACT12 +_OBJC_SELECTOR_REFERENCES_.64 +_OBJC_SELECTOR_REFERENCES_.66 +LOS_LOG14 +LOS_LOG15 +LOS_LOG16 +_OBJC_SELECTOR_REFERENCES_.68 +LOS_LOG17 +LOS_LOG18 +LOS_ACT19 +_OBJC_SELECTOR_REFERENCES_.70 +LOS_ACT21 +_OBJC_SELECTOR_REFERENCES_.72 +LOS_LOG23 +LOS_LOG24 +_OBJC_SELECTOR_REFERENCES_.74 +LOS_LOG25 +_OBJC_SELECTOR_REFERENCES_.78 +LOS_ACT26 +_OBJC_SELECTOR_REFERENCES_.80 +LOS_LOG28 +LOS_LOG29 +LOS_LOG30 +_OBJC_CLASSLIST_REFERENCES_$_.81 +_OBJC_SELECTOR_REFERENCES_.83 +_OBJC_SELECTOR_REFERENCES_.85 +LOS_LOG31 +LOS_LOG32 +_OBJC_CLASSLIST_REFERENCES_$_.86 +_OBJC_SELECTOR_REFERENCES_.88 +_OBJC_SELECTOR_REFERENCES_.90 +LOS_ACT33 +_OBJC_SELECTOR_REFERENCES_.92 +LOS_LOG35 +LOS_LOG36 +LOS_ACT37 +_OBJC_CLASSLIST_REFERENCES_$_.93 +_OBJC_SELECTOR_REFERENCES_.95 +LOS_LOG39 +LOS_LOG40 +_OBJC_SELECTOR_REFERENCES_.97 +LOS_LOG41 +_OBJC_SELECTOR_REFERENCES_.99 +LOS_LOG42 +LOS_LOG43 +LOS_LOG44 +LOS_LOG45 +LOS_LOG46 +LOS_LOG47 +_OBJC_SELECTOR_REFERENCES_.101 +LOS_ACT48 +LOS_LOG50 +_OBJC_SELECTOR_REFERENCES_.103 +LOS_ACT51 +_OBJC_SELECTOR_REFERENCES_.107 +LOS_ACT53 +_OBJC_CLASSLIST_REFERENCES_$_.108 +_OBJC_SELECTOR_REFERENCES_.110 +_OBJC_CLASSLIST_REFERENCES_$_.111 +_OBJC_SELECTOR_REFERENCES_.113 +_OBJC_SELECTOR_REFERENCES_.115 +_OBJC_SELECTOR_REFERENCES_.117 +LOS_LOG55 +___block_descriptor_48_ea8_32s40s_e25_v24?0"URKFileInfo"8^B16l +_OBJC_SELECTOR_REFERENCES_.120 +LOS_LOG56 +LOS_LOG57 +LOS_LOG58 +_OBJC_CLASSLIST_REFERENCES_$_.121 +_OBJC_SELECTOR_REFERENCES_.123 +LOS_ACT59 +LOS_LOG61 +_OBJC_SELECTOR_REFERENCES_.125 +LOS_LOG62 +LOS_LOG63 +LOS_ACT64 +_OBJC_SELECTOR_REFERENCES_.127 +_OBJC_SELECTOR_REFERENCES_.129 +_OBJC_SELECTOR_REFERENCES_.131 +_OBJC_CLASSLIST_REFERENCES_$_.132 +_OBJC_SELECTOR_REFERENCES_.134 +_OBJC_SELECTOR_REFERENCES_.136 +_OBJC_SELECTOR_REFERENCES_.138 +_OBJC_SELECTOR_REFERENCES_.140 +LOS_ACT66 +LOS_LOG68 +LOS_LOG69 +_OBJC_SELECTOR_REFERENCES_.142 +_OBJC_SELECTOR_REFERENCES_.144 +_OBJC_SELECTOR_REFERENCES_.146 +LOS_LOG70 +LOS_ACT71 +LOS_LOG73 +LOS_LOG74 +_OBJC_SELECTOR_REFERENCES_.148 +LOS_LOG75 +_OBJC_SELECTOR_REFERENCES_.150 +_OBJC_SELECTOR_REFERENCES_.152 +_OBJC_SELECTOR_REFERENCES_.154 +_OBJC_SELECTOR_REFERENCES_.156 +LOS_LOG76 +LOS_LOG77 +_OBJC_SELECTOR_REFERENCES_.158 +_OBJC_SELECTOR_REFERENCES_.160 +LOS_LOG78 +_OBJC_SELECTOR_REFERENCES_.162 +LOS_LOG79 +LOS_LOG80 +LOS_ACT81 +LOS_LOG83 +___block_descriptor_40_ea8_32s_e5_B8?0l +_OBJC_SELECTOR_REFERENCES_.166 +_OBJC_SELECTOR_REFERENCES_.168 +LOS_LOG84 +LOS_LOG85 +_OBJC_SELECTOR_REFERENCES_.170 +_OBJC_SELECTOR_REFERENCES_.172 +_OBJC_SELECTOR_REFERENCES_.174 +_OBJC_SELECTOR_REFERENCES_.176 +LOS_LOG86 +_OBJC_SELECTOR_REFERENCES_.178 +_OBJC_SELECTOR_REFERENCES_.180 +LOS_LOG87 +LOS_LOG88 +___block_descriptor_96_ea8_32s40s48s56bs64s72r80r88w_e9_v16?0^8l +_OBJC_SELECTOR_REFERENCES_.183 +_OBJC_SELECTOR_REFERENCES_.185 +LOS_ACT89 +LOS_ACT91 +LOS_LOG93 +LOS_LOG94 +LOS_LOG95 +LOS_LOG96 +LOS_LOG97 +LOS_LOG98 +LOS_LOG99 +LOS_LOG100 +LOS_LOG101 +LOS_LOG102 +_OBJC_CLASSLIST_REFERENCES_$_.186 +_OBJC_SELECTOR_REFERENCES_.188 +_OBJC_CLASSLIST_REFERENCES_$_.189 +_OBJC_SELECTOR_REFERENCES_.191 +_OBJC_SELECTOR_REFERENCES_.193 +LOS_LOG103 +_OBJC_SELECTOR_REFERENCES_.196 +LOS_LOG104 +___block_descriptor_72_ea8_32s40s48bs56r_e16_B16?0"NSData"8l +LOS_LOG105 +LOS_LOG106 +LOS_LOG107 +LOS_LOG108 +_OBJC_SELECTOR_REFERENCES_.199 +___block_descriptor_72_ea8_32s40s48bs56r64w_e9_v16?0^8l +LOS_ACT109 +LOS_LOG111 +LOS_LOG112 +LOS_LOG113 +LOS_LOG114 +LOS_ACT115 +LOS_LOG117 +LOS_LOG118 +LOS_LOG119 +_OBJC_SELECTOR_REFERENCES_.201 +___block_descriptor_48_ea8_32s40bs_e28_v32?0"URKFileInfo"8Q16^B24l +_OBJC_SELECTOR_REFERENCES_.204 +LOS_ACT120 +LOS_LOG122 +LOS_LOG123 +LOS_LOG124 +LOS_LOG125 +LOS_LOG126 +LOS_LOG127 +LOS_LOG128 +_OBJC_SELECTOR_REFERENCES_.206 +LOS_LOG129 +LOS_LOG130 +LOS_LOG131 +LOS_LOG132 +LOS_LOG133 +LOS_LOG134 +LOS_LOG135 +_OBJC_SELECTOR_REFERENCES_.208 +LOS_LOG136 +LOS_LOG137 +LOS_LOG138 +___block_descriptor_56_ea8_32s40bs48w_e9_v16?0^8l +LOS_ACT139 +LOS_ACT141 +LOS_LOG143 +LOS_LOG144 +LOS_LOG145 +LOS_LOG146 +LOS_LOG147 +LOS_LOG148 +LOS_LOG149 +LOS_LOG150 +LOS_LOG151 +LOS_LOG152 +LOS_LOG153 +LOS_LOG154 +___block_descriptor_64_ea8_32s40bs48r_e16_B16?0"NSData"8l +LOS_LOG155 +LOS_LOG156 +LOS_LOG157 +LOS_LOG158 +LOS_LOG159 +___block_descriptor_64_ea8_32s40s48bs56w_e9_v16?0^8l +LOS_LOG160 +LOS_LOG161 +LOS_ACT162 +LOS_LOG164 +_OBJC_SELECTOR_REFERENCES_.211 +LOS_LOG165 +LOS_LOG166 +LOS_LOG167 +_OBJC_SELECTOR_REFERENCES_.213 +LOS_LOG168 +_OBJC_SELECTOR_REFERENCES_.215 +LOS_LOG169 +LOS_LOG170 +LOS_LOG171 +LOS_LOG172 +LOS_LOG173 +LOS_ACT174 +LOS_ACT176 +LOS_LOG178 +LOS_LOG179 +LOS_LOG180 +LOS_LOG181 +LOS_LOG182 +_OBJC_SELECTOR_REFERENCES_.217 +LOS_LOG183 +___block_descriptor_56_ea8_32r40r48w_e9_v16?0^8l +LOS_LOG184 +LOS_LOG185 +_OBJC_SELECTOR_REFERENCES_.219 +_OBJC_SELECTOR_REFERENCES_.221 +_OBJC_CLASSLIST_REFERENCES_$_.222 +_OBJC_SELECTOR_REFERENCES_.224 +_OBJC_SELECTOR_REFERENCES_.226 +_OBJC_CLASSLIST_REFERENCES_$_.227 +___block_descriptor_48_ea8_32bs40r_e5_v8?0l +_OBJC_SELECTOR_REFERENCES_.229 +_OBJC_SELECTOR_REFERENCES_.231 +_OBJC_SELECTOR_REFERENCES_.233 +_OBJC_SELECTOR_REFERENCES_.235 +LOS_ACT186 +LOS_LOG188 +LOS_ACT189 +_OBJC_SELECTOR_REFERENCES_.239 +_OBJC_SELECTOR_REFERENCES_.241 +___block_descriptor_64_ea8_32s40r48r56w_e9_v16?0^8l +LOS_LOG191 +LOS_LOG192 +LOS_LOG193 +LOS_LOG194 +LOS_ACT195 +LOS_LOG197 +LOS_LOG198 +LOS_LOG199 +LOS_ACT200 +LOS_LOG202 +_OBJC_SELECTOR_REFERENCES_.243 +LOS_ACT203 +LOS_LOG205 +LOS_ACT206 +_OBJC_SELECTOR_REFERENCES_.245 +LOS_LOG208 +LOS_LOG209 +LOS_LOG210 +_OBJC_SELECTOR_REFERENCES_.247 +LOS_LOG211 +LOS_LOG212 +LOS_LOG213 +LOS_LOG214 +LOS_LOG215 +LOS_ACT216 +LOS_LOG218 +LOS_LOG219 +_OBJC_SELECTOR_REFERENCES_.249 +_OBJC_SELECTOR_REFERENCES_.251 +_OBJC_SELECTOR_REFERENCES_.253 +LOS_LOG220 +_OBJC_SELECTOR_REFERENCES_.255 +LOS_LOG221 +_OBJC_SELECTOR_REFERENCES_.257 +LOS_LOG222 +LOS_LOG223 +LOS_LOG224 +LOS_LOG225 +LOS_LOG226 +LOS_ACT227 +LOS_LOG229 +LOS_LOG230 +LOS_ACT231 +LOS_ACT233 +LOS_LOG235 +LOS_LOG236 +LOS_LOG237 +LOS_LOG238 +LOS_LOG239 +LOS_LOG240 +LOS_LOG241 +LOS_LOG242 +___block_descriptor_48_ea8_32bs40w_e9_v16?0^8l +LOS_ACT243 +LOS_LOG245 +___block_descriptor_40_ea8_32s_e25_v24?0"URKFileInfo"8^B16l +LOS_LOG246 +LOS_LOG247 +LOS_LOG248 +_OBJC_SELECTOR_REFERENCES_.269 +_OBJC_CLASSLIST_REFERENCES_$_.326 +_OBJC_SELECTOR_REFERENCES_.330 +_OBJC_SELECTOR_REFERENCES_.334 +_OBJC_SELECTOR_REFERENCES_.336 +_OBJC_SELECTOR_REFERENCES_.338 +_OBJC_CLASSLIST_REFERENCES_$_.339 +_OBJC_CLASSLIST_REFERENCES_$_.340 +_OBJC_SELECTOR_REFERENCES_.342 +_OBJC_SELECTOR_REFERENCES_.344 +_OBJC_SELECTOR_REFERENCES_.346 +_OBJC_CLASSLIST_REFERENCES_$_.347 +_OBJC_SELECTOR_REFERENCES_.349 +LOS_ACT249 +LOS_LOG251 +LOS_LOG252 +LOS_ACT253 +_OBJC_SELECTOR_REFERENCES_.351 +_OBJC_SELECTOR_REFERENCES_.353 +_OBJC_CLASSLIST_REFERENCES_$_.354 +_OBJC_SELECTOR_REFERENCES_.356 +_OBJC_SELECTOR_REFERENCES_.358 +_OBJC_SELECTOR_REFERENCES_.360 +_OBJC_SELECTOR_REFERENCES_.362 +LOS_ACT255 +LOS_LOG257 +LOS_LOG258 +LOS_LOG259 +_OBJC_CLASSLIST_REFERENCES_$_.363 +_OBJC_SELECTOR_REFERENCES_.367 +LOS_LOG260 +LOS_LOG261 +_OBJC_SELECTOR_REFERENCES_.369 +LOS_LOG262 +_OBJC_SELECTOR_REFERENCES_.371 +_OBJC_SELECTOR_REFERENCES_.375 +_OBJC_SELECTOR_REFERENCES_.379 +_OBJC_SELECTOR_REFERENCES_.383 +LOS_LOG263 +LOS_LOG264 +LOS_LOG265 +_OBJC_SELECTOR_REFERENCES_.387 +_OBJC_SELECTOR_REFERENCES_.391 +_OBJC_SELECTOR_REFERENCES_.393 +LOS_LOG266 +LOS_LOG267 +LOS_LOG268 +LOS_LOG269 +_OBJC_CLASSLIST_REFERENCES_$_.394 +_OBJC_SELECTOR_REFERENCES_.396 +LOS_LOG270 +LOS_LOG271 +LOS_LOG272 +LOS_LOG273 +LOS_LOG274 +LOS_LOG275 +_OBJC_SELECTOR_REFERENCES_.398 +_OBJC_SELECTOR_REFERENCES_.400 +LOS_LOG276 +__OBJC_$_CLASS_METHODS_URKArchive +__OBJC_$_PROTOCOL_INSTANCE_METHODS_NSObject +__OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSObject +__OBJC_$_PROP_LIST_NSObject +__OBJC_$_PROTOCOL_METHOD_TYPES_NSObject +__OBJC_PROTOCOL_$_NSObject +__OBJC_LABEL_PROTOCOL_$_NSObject +__OBJC_$_PROTOCOL_REFS_NSProgressReporting +__OBJC_$_PROTOCOL_INSTANCE_METHODS_NSProgressReporting +__OBJC_$_PROP_LIST_NSProgressReporting +__OBJC_$_PROTOCOL_METHOD_TYPES_NSProgressReporting +__OBJC_PROTOCOL_$_NSProgressReporting +__OBJC_LABEL_PROTOCOL_$_NSProgressReporting +__OBJC_CLASS_PROTOCOLS_$_URKArchive +__OBJC_METACLASS_RO_$_URKArchive +__OBJC_$_INSTANCE_METHODS_URKArchive +_OBJC_IVAR_$_URKArchive._ignoreCRCMismatches +_OBJC_IVAR_$_URKArchive._password +_OBJC_IVAR_$_URKArchive._progress +_OBJC_IVAR_$_URKArchive._rarFile +_OBJC_IVAR_$_URKArchive._header +_OBJC_IVAR_$_URKArchive._flags +_OBJC_IVAR_$_URKArchive._fileBookmark +_OBJC_IVAR_$_URKArchive._threadLock +_OBJC_IVAR_$_URKArchive._lastArchivePath +_OBJC_IVAR_$_URKArchive._lastFilepath +__OBJC_$_INSTANCE_VARIABLES_URKArchive +__OBJC_$_PROP_LIST_URKArchive +__OBJC_CLASS_RO_$_URKArchive +/Users/travis/build/abbeycode/UnrarKit/Classes/URKArchive.mm +-[URKArchive readHeader:info:].cold.6 +Classes/URKArchive.mm +-[URKArchive readHeader:info:].cold.5 +-[URKArchive readHeader:info:].cold.4 +-[URKArchive readHeader:info:].cold.3 +-[URKArchive readHeader:info:].cold.2 +-[URKArchive readHeader:info:].cold.1 ++[URKArchive firstVolumeURL:].cold.7 ++[URKArchive firstVolumeURL:].cold.6 ++[URKArchive firstVolumeURL:].cold.5 ++[URKArchive firstVolumeURL:].cold.4 ++[URKArchive firstVolumeURL:].cold.3 ++[URKArchive firstVolumeURL:].cold.2 ++[URKArchive firstVolumeURL:].cold.1 +-[URKArchive headerContainsErrors:].cold.1 +-[URKArchive allFileInfo:].cold.3 +-[URKArchive allFileInfo:].cold.2 +-[URKArchive allFileInfo:].cold.1 +__39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.6 +__39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.5 +__39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.4 +__39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.3 +__39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.2 +__39-[URKArchive iterateAllFileInfo:error:]_block_invoke.cold.1 +-[URKArchive closeFile].cold.2 +-[URKArchive closeFile].cold.1 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.7 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.6 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.5 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.4 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.3 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.2 +-[URKArchive _unrarOpenFile:inMode:withPassword:error:].cold.1 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.6 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.5 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.4 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.3 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.2 +-[URKArchive performActionWithArchiveOpen:inMode:error:].cold.1 +-[URKArchive dataIntegrityCodeOfFile:].cold.2 +-[URKArchive dataIntegrityCodeOfFile:].cold.1 +__30-[URKArchive validatePassword]_block_invoke.cold.5 +__30-[URKArchive validatePassword]_block_invoke.cold.4 +__30-[URKArchive validatePassword]_block_invoke.cold.3 +__30-[URKArchive validatePassword]_block_invoke.cold.2 +__30-[URKArchive validatePassword]_block_invoke.cold.1 +-[URKArchive validatePassword].cold.1 +-[URKArchive isPasswordProtected].cold.8 +-[URKArchive isPasswordProtected].cold.7 +-[URKArchive isPasswordProtected].cold.6 +-[URKArchive isPasswordProtected].cold.5 +-[URKArchive isPasswordProtected].cold.4 +-[URKArchive isPasswordProtected].cold.3 +-[URKArchive isPasswordProtected].cold.2 +-[URKArchive isPasswordProtected].cold.1 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.209.cold.1 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.9 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.8 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.7 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.6 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.5 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.4 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.3 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.2 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.cold.1 +-[URKArchive extractBufferedDataFromFile:error:action:].cold.1 +_Z12CallbackProcjlll.cold.3 +_Z12CallbackProcjlll.cold.2 +_Z12CallbackProcjlll.cold.1 +__43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.6 +__43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.5 +__43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.4 +__43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.3 +__43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.2 +__43-[URKArchive performOnDataInArchive:error:]_block_invoke.cold.1 +-[URKArchive performOnDataInArchive:error:].cold.1 +__44-[URKArchive performOnFilesInArchive:error:]_block_invoke.cold.1 +-[URKArchive performOnFilesInArchive:error:].cold.1 +_Z24BufferedReadCallbackProcjlll.cold.1 +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.194.cold.1 +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.7 +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.6 +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.5 +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.4 +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.3 +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.2 +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.cold.1 +_Z29AllowCancellationCallbackProcjlll.cold.1 +__54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.163.cold.1 +__54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.cold.4 +__54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.cold.3 +__54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.cold.2 +__54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.cold.1 +-[URKArchive extractFilesTo:overwrite:progress:error:].cold.2 +-[URKArchive extractFilesTo:overwrite:progress:error:].cold.1 +-[URKArchive iterateFileInfo:error:].cold.2 +-[URKArchive iterateFileInfo:error:].cold.1 +__27-[URKArchive listFileInfo:]_block_invoke.cold.1 +-[URKArchive listFileInfo:].cold.2 +-[URKArchive listFileInfo:].cold.1 ++[URKArchive urlIsARAR:].cold.1 ++[URKArchive pathIsARAR:].cold.7 ++[URKArchive pathIsARAR:].cold.6 ++[URKArchive pathIsARAR:].cold.5 ++[URKArchive pathIsARAR:].cold.4 ++[URKArchive pathIsARAR:].cold.3 ++[URKArchive pathIsARAR:].cold.2 ++[URKArchive pathIsARAR:].cold.1 +-[URKArchive hasMultipleVolumes].cold.1 +-[URKArchive compressedSize].cold.2 +-[URKArchive compressedSize].cold.1 +-[URKArchive uncompressedSize].cold.1 +-[URKArchive fileURL].cold.3 +-[URKArchive fileURL].cold.2 +-[URKArchive fileURL].cold.1 +-[URKArchive initWithFile:password:error:].cold.4 +-[URKArchive initWithFile:password:error:].cold.3 +-[URKArchive initWithFile:password:error:].cold.2 +-[URKArchive initWithFile:password:error:].cold.1 +__24+[URKArchive initialize]_block_invoke.cold.1 +Classes/URKArchive.h +__os_log_helper_16_0_0 +__os_log_helper_16_2_1_8_66 +NSMakeRange +/Applications/Xcode-12.0.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSRange.h +__os_log_helper_16_2_2_8_66_4_0 +__26-[URKArchive allFileInfo:]_block_invoke +__os_log_helper_16_0_1_8_0 +__destroy_helper_block_ea8_32s40w +__copy_helper_block_ea8_32b40w +__39-[URKArchive iterateAllFileInfo:error:]_block_invoke +__destroy_helper_block_ea8_32s40r48r56w +__copy_helper_block_ea8_32s40r48r56w +__38-[URKArchive dataIntegrityCodeOfFile:]_block_invoke +__destroy_helper_block_ea8_32s40r +__copy_helper_block_ea8_32b40r +__54-[URKArchive checkDataIntegrityIgnoringCRCMismatches:]_block_invoke +__destroy_helper_block_ea8_32r40r48w +__copy_helper_block_ea8_32r40r48w +__30-[URKArchive validatePassword]_block_invoke +__destroy_helper_block_ea8_32s40s48s56w +__copy_helper_block_ea8_32s40s48b56w +__destroy_helper_block_ea8_32s40s48r +__copy_helper_block_ea8_32s40b48r +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke.209 +__55-[URKArchive extractBufferedDataFromFile:error:action:]_block_invoke +__os_log_helper_16_2_2_8_66_8_66 +__destroy_helper_block_ea8_32s40s48w +__copy_helper_block_ea8_32s40b48w +CallbackProc +__43-[URKArchive performOnDataInArchive:error:]_block_invoke +__copy_helper_block_ea8_32s40b +__44-[URKArchive performOnFilesInArchive:error:]_block_invoke +__destroy_helper_block_ea8_32s40s48s56r64w +__copy_helper_block_ea8_32s40s48b56r64w +BufferedReadCallbackProc +__destroy_helper_block_ea8_32s40s48s56r +__copy_helper_block_ea8_32s40s48b56r +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke.194 +__49-[URKArchive extractDataFromFile:progress:error:]_block_invoke +__Block_byref_object_dispose_ +__Block_byref_object_copy_ +__destroy_helper_block_ea8_32s40s48s56s64s72r80r88w +__copy_helper_block_ea8_32s40s48s56b64s72r80r88w +AllowCancellationCallbackProc +__destroy_helper_block_ea8_32s +__copy_helper_block_ea8_32s +__54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke.163 +__54-[URKArchive extractFilesTo:overwrite:progress:error:]_block_invoke +__os_log_helper_16_2_2_8_66_8_0 +__destroy_helper_block_ea8_32s40s +__copy_helper_block_ea8_32s40s +__27-[URKArchive listFileInfo:]_block_invoke +__os_log_helper_16_2_3_8_66_8_66_8_66 +__24+[URKArchive initialize]_block_invoke +/Applications/Xcode-12.0.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/usr/include/dispatch/once.h +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/strlist.cpp +~Array +Libraries/unrar/array.hpp +Search +Libraries/unrar/strlist.cpp +RestorePosition +GetString +Size +operator[] +Rewind +SavePosition +GetStringA +Array +CleanData +Add +AddString +AddStringA +StringList +Reset +__ZZ7GetWidePKcE8StrTable +__ZZ7GetWidePKcE6StrNum +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/strfn.cpp +GetCmdParam +Libraries/unrar/strfn.cpp +GetWide +itoa +wcsncatz +wcsncpyz +strncatz +strncpyz +wcsnicompc +wcsicompc +LowAscii +GetDigits +BinToHex +IsAlpha +IsSpace +IsDigit +etoupperw +etoupper +toupper +/Applications/Xcode-12.0.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/usr/include/_ctype.h +loctoupper +loctolower +tolower +RemoveLF +RemoveEOL +strnicomp +stricomp +ArcCharToWide +IntToExt +NullToEmpty +__ZL10GenArcNamePwmPKwjRb +__ZZ15EnumConfigPathsjPwmbE8ConfPath +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/pathfn.cpp +GetWideName +Libraries/unrar/pathfn.cpp +GenArcName +PointToName +IsPathDiv +wcschr +/Applications/Xcode-12.0.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/wchar.h +__libcpp_wcschr +RarTime +Libraries/unrar/timefn.hpp +GenerateArchiveName +VolNameToFirstName +FindData +Libraries/unrar/find.hpp +ParseVersionFileName +wcsrchr +__libcpp_wcsrchr +GetPathRoot +IsDriveLetter +IsFullRootPath +IsFullPath +ConvertNameToFull +DosSlashToUnix +UnixSlashToDos +MakeNameUsable +/Applications/Xcode-12.0.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string.h +__libcpp_strchr +IsNameUsable +wcspbrk +__libcpp_wcspbrk +NextVolumeName +GetVolNumPart +GetConfigName +EnumConfigPaths +RemoveNameFromPath +GetFilePath +MakeName +AddEndSlash +GetPathDisk +IsWildcard +CmpExt +SetSFXExt +GetExt +SetExt +SetName +ConvertPath +PointToLastChar +IsDriveDiv +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/smallfn.cpp +ToPercentUnlim +Libraries/unrar/smallfn.cpp +ToPercent +__GLOBAL__sub_I_global.cpp +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/global.cpp +_GLOBAL__sub_I_global.cpp +__cxx_global_var_init +Libraries/unrar/global.hpp +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/file.cpp +IsOpened +Libraries/unrar/file.hpp +Copy +Libraries/unrar/file.cpp +IsDevice +GetFD +GetOpenFileTime +SetCloseFileTimeByName +IsSet +SetCloseFileTime +SetOpenFileTime +Flush +Truncate +PutByte +GetByte +Prealloc +Tell +FileLength +RawSeek +Seek +DirectRead +Read +Write +Rename +Close +WCreate +TCreate +Create +WOpen +TOpen +Open +operator= +~File +Delete +File +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/filefn.cpp +DelFile +Libraries/unrar/filefn.cpp +RenameFile +CalcFileSum +uiMsg +Libraries/unrar/ui.hpp +uiMsgStore +SetFileAttr +GetFileAttr +PrepareToDelete +IsDeleteAllowed +IsLink +IsUnreadable +IsDir +WildFileExist +FileExist +GetFreeDisk +IsRemovable +SetDirTime +CreatePath +MakeDir +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/filcreat.cpp +GetAutoRenamedName +Libraries/unrar/filcreat.cpp +FileCreate +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/archive.cpp +Libraries/unrar/archive.cpp +Unload +Libraries/unrar/qopen.hpp +FullHeaderSize +SeekToNext +IsSignature +WCheckOpen +uiMsg +operator<< +CheckOpen +IsArchive +GetHeaderType +Libraries/unrar/archive.hpp +uiMsg +CheckArc +~Archive +~FileHeader +Libraries/unrar/headers.hpp +Archive +FileHeader +ViewComment +Libraries/unrar/arccmt.cpp +ReadCommentData +Alloc +Addr +Push +DoGetComment +SetDestSize +Libraries/unrar/unpack.hpp +SetNoFileHeader +Libraries/unrar/rdwrfn.hpp +SetPackedSizeToRead +EnableShowProgress +SetTestMode +GetComment +__ZZN7Archive17ConvertAttributesEvE4mask +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/arcread.cpp +ReadSubData +Libraries/unrar/arcread.cpp +SetSubHeader +Libraries/unrar/secpassword.hpp +GetStartPos +ConvertAttributes +IsArcDir +ProcessExtra50 +DataLeft +Libraries/unrar/rawread.hpp +GetPos +ConvertFileHeader +ConvertNameCase +RequestArcPassword +UnkEncVerMsg +uiMsg +UnexpEndArcMsg +SearchRR +CmpName +SearchSubBlock +SearchBlock +BrokenHeaderMsg +ReadHeader50 +~RawRead +SafeAdd +SetCrypt +ReadHeader15 +ReadHeader14 +ReadHeader +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/unicode.cpp +atoilw +Libraries/unrar/unicode.cpp +atoiw +toupperw +towupper +/Applications/Xcode-12.0.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/usr/include/_wctype.h +wcsupper +wcslower +towlower +tolowerw +wcscasestr +wcsnicomp +wcsicomp +IsTextUtf8 +WideToUtfSize +RawToWide +WideToRaw +UtfToWide +CharToWide +WideToUtf +WideToChar +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/system.cpp +Wait +Libraries/unrar/system.cpp +MonoClock +SetPriority +InitSystemOptions +__ZL11hmac_sha256PKhmS0_mPhP14sha256_contextPbS3_S4_ +__ZN9CryptDataD2Ev.cold.1 +__ZL16InitSubstTable20 +__ZZL13TimeRandomizePhmE5Count +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/crypt.cpp +_ZN9CryptDataD2Ev.cold.1 +Libraries/unrar/crypt.cpp +GetRnd +TimeRandomize +SetCryptKeys +DecryptBlock +Decrypt13 +Libraries/unrar/crypt1.cpp +~CryptData +~KDF3CacheItem +Libraries/unrar/crypt.hpp +~KDF5CacheItem +CryptData +KDF5CacheItem +KDF3CacheItem +ConvertHashToMAC +Libraries/unrar/crypt5.cpp +RawPut4 +Libraries/unrar/rawint.hpp +SetKey50 +hmac_sha256 +pbkdf2 +llvm.loop.isvectorized +SetKey30 +Libraries/unrar/crypt3.cpp +DecryptBlock20 +Libraries/unrar/crypt2.cpp +RawGet4 +UpdKeys20 +EncryptBlock20 +Swap20 +SetKey20 +Crypt15 +SetCmt13Encryption +SetAV15Encryption +SetKey15 +SetKey13 +__GLOBAL__sub_I_crc.cpp +__ZL10CallInit32 +__ZL10crc_tables +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/crc.cpp +_GLOBAL__sub_I_crc.cpp +Libraries/unrar/crc.cpp +CallInitCRC +InitTables +InitCRC32 +Checksum14 +CRC32 +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/rawread.cpp +RawGetV +Libraries/unrar/rawread.cpp +GetCRC50 +GetCRC15 +GetW +GetB +GetVSize +GetV +Get8 +Get4 +Get2 +Get1 +RawRead +SoftReset +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/encname.cpp +Decode +Libraries/unrar/encname.cpp +EncodeFileName +__ZL5matchPKwS0_b +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/match.cpp +match +Libraries/unrar/match.cpp +mwcsicompc +mwcsnicompc +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/timefn.cpp +IsLeapYear +Libraries/unrar/timefn.cpp +GetMonthName +Adjust +SetCurrentTime +SetUnix +SetUnixNS +SetAgeText +SetIsoText +SetLocal +GetText +SetDos +GetDos +GetUnixNS +SetWin +GetWin +GetUnix +GetLocal +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/rdwrfn.cpp +SetUnpackToMemory +Libraries/unrar/rdwrfn.cpp +SetEncryption +GetUnpackedData +SetFiles +ShowUnpWrite +UnpWrite +GetRAROptions +ShowUnpRead +UnpRead +~ComprDataIO +ComprDataIO +Init +__ZL7LogName +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/consio.cpp +OutComment +Libraries/unrar/consio.cpp +IsCommentUnsafe +SetConsoleRedirectCharset +SetConsoleMsgStream +InitConsole +InitLogOptions +Libraries/unrar/log.cpp +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/options.cpp +~RAROptions +Libraries/unrar/options.cpp +RAROptions +__ZZ13ProcessSignaliE10BreakCount +__ZTS8RAR_EXIT +__ZTI8RAR_EXIT +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/errhnd.cpp +SetSystemErrorCode +Libraries/unrar/errhnd.cpp +GetSystemErrorCode +GetSysErrMsg +SetSignalHandlers +ProcessSignal +SetDisableShutdown +Libraries/unrar/errhnd.hpp +Throw +UnknownMethodMsg +SetErrorCode +uiMsg +ChecksumFailedMsg +ArcBrokenMsg +uiMsg +WriteErrorMsg +ReadErrorMsg +CreateErrorMsg +OpenErrorMsg +GeneralErrMsg +SeekError +Exit +AskRepeatWrite +WriteError +AskRepeatRead +ReadError +SysErrMsg +CloseError +OpenError +MemoryErrorMsg +MemoryError +ErrorHandler +Clean +__ZZN5RarVM7PrepareEPhjP18VM_PreparedProgramE7StdList +__ZZN5RarVM21ExecuteStandardFilterE18VM_StandardFiltersE5Masks +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/rarvm.cpp +FilterItanium_SetBits +Libraries/unrar/rarvm.cpp +FilterItanium_GetBits +SetMemory +ReadData +Prepare +ExecuteStandardFilter +Execute +~RarVM +RarVM +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/secpassword.cpp +operator== +Libraries/unrar/secpassword.cpp +cleandata +Length +Get +Process +SecHideData +~SecPassword +SecPassword +Set +__ZL1S +__ZL2T1 +__ZL2T2 +__ZL2T3 +__ZL2T4 +__ZL2T5 +__ZL2T6 +__ZL2T7 +__ZL2T8 +__ZL2S5 +__ZL4rcon +__ZL2U1 +__ZL2U2 +__ZL2U3 +__ZL2U4 +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/rijndael.cpp +blockDecrypt +Libraries/unrar/rijndael.cpp +Copy128 +Xor128 +blockEncrypt +keyEncToDec +keySched +Rijndael +GenerateTables +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/getbits.cpp +SetExternalBuffer +Libraries/unrar/getbits.cpp +fgetbits +getbits +Libraries/unrar/getbits.hpp +faddbits +addbits +~BitInput +BitInput +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/sha1.cpp +sha1_done +Libraries/unrar/sha1.cpp +sha1_init +RawPutBE4 +sha1_process_rar29 +sha1_process +SHA1Transform +ByteSwap32 +__ZL16sha256_transformP14sha256_context +__ZL1K +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/sha256.cpp +sha256_done +Libraries/unrar/sha256.cpp +sha256_init +sha256_transform +RawGetBE4 +sha256_process +__ZL14blake2s_updateP13blake2s_statePKhm +__ZL13blake2s_finalP13blake2s_statePh +__ZL16blake2s_compressP13blake2s_statePKh +__ZL10blake2s_IV +__ZL13blake2s_sigma +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/blake2s.cpp +blake2s_compress +Libraries/unrar/blake2s.cpp +blake2s_final +blake2s_set_lastblock +blake2s_set_lastnode +blake2s_increment_counter +blake2sp_final +Libraries/unrar/blake2sp.cpp +blake2sp_update +blake2s_update +Update +blake2sp_init +blake2s_init_param +init +Libraries/unrar/blake2s.hpp +__ZZN9HashValue4InitE9HASH_TYPEE9EmptyHash +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/hash.cpp +Cmp +Libraries/unrar/hash.cpp +GetCRC32 +Result +blake2sp_state +blake2s_state +set_pointers +~DataHash +DataHash +__ZL11UnixSymlinkPKcPKwP7RarTimeS4_ +__ZL16CalcAllowedDepthPKw +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/extinfo.cpp +ExtractSymlink +Libraries/unrar/extinfo.cpp +CalcAllowedDepth +SetFileHeaderExtra +SetExtraInfo +SetExtraInfo20 +ExtractUnixLink50 +Libraries/unrar/ulinks.cpp +UnixSymlink +uiMsg +IsRelativeSymlinkSafe +LinkInPath +ExtractUnixLink30 +SetUnixOwner +Libraries/unrar/uowners.cpp +ExtractUnixOwner30 +ExtractUnixOwner20 +GetStreamNameNTFS +Libraries/unrar/win32stm.cpp +ExtractHardlink +Libraries/unrar/hardlinks.cpp +SlashToNative +Libraries/unrar/pathfn.hpp +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/extract.cpp +UnstoreFile +Libraries/unrar/extract.cpp +ExtractFileCopy +uiMsg +ExtrCreateFile +SetHandleType +ExtrCreateDir +ExtrDllGetPassword +CheckUnpVer +ExtrPrepareName +ExtractCurrentFile +SetAllowDelete +SetSkipUnpCRC +operator< +operator>= +ItemsCount +Libraries/unrar/strlist.hpp +ExtractArchiveInit +ExtractArchive +DoExtract +GetErrorCode +SetCurrentCommand +~CmdExtract +CmdExtract +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/volume.cpp +MergeArchive +Libraries/unrar/volume.cpp +DllVolNotify +DllVolChange +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/find.cpp +FastFind +Libraries/unrar/find.cpp +Next +uiMsg +SetMask +~FindFile +FindFile +__ZZN8ModelPPM16RestartModelRareEvE10InitBinEsc +__ZZN6Unpack7ShortLZEvE9ShortLen1 +__ZZN6Unpack7ShortLZEvE9ShortXor1 +__ZZN6Unpack7ShortLZEvE9ShortLen2 +__ZZN6Unpack7ShortLZEvE9ShortXor2 +__ZL5DecL2 +__ZL5PosL2 +__ZL5DecL1 +__ZL5PosL1 +__ZL6DecHf2 +__ZL6PosHf2 +__ZL6DecHf1 +__ZL6PosHf1 +__ZL6DecHf0 +__ZL6PosHf0 +__ZL6DecHf4 +__ZL6PosHf4 +__ZL6DecHf3 +__ZL6PosHf3 +__ZZN6Unpack8Unpack20EbE7DDecode +__ZZN6Unpack8Unpack20EbE5DBits +__ZZN6Unpack8Unpack29EbE7LDecode +__ZZN6Unpack8Unpack29EbE5LBits +__ZZN6Unpack8Unpack29EbE7DDecode +__ZZN6Unpack8Unpack29EbE5DBits +__ZZN6Unpack8Unpack29EbE16DBitLengthCounts +__ZZN6Unpack8Unpack29EbE8SDDecode +__ZZN6Unpack8Unpack29EbE6SDBits +__ZL9ExpEscape +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/unpack.cpp +CreateSuccessors +Libraries/unrar/model.cpp +createChild +AllocContext +Libraries/unrar/suballoc.cpp +RemoveNode +DoUnpack +Libraries/unrar/unpack.cpp +~Unpack +~FragmentedWindow +Libraries/unrar/unpack50frag.cpp +~ModelPPM +Libraries/unrar/model.hpp +~SubAllocator +Libraries/unrar/suballoc.hpp +StopSubAllocator +Unpack +UnpInitData15 +Libraries/unrar/unpack15.cpp +ModelPPM +SubAllocator +FragmentedWindow +UnpInitData50 +Libraries/unrar/unpack50.cpp +UnpWriteData +GetBlockSize +ApplyFilter +CopyData +InitFilters +ReadFilterData +AddFilter +ReadFilter +CopyString +getbits32 +UnpWriteBuf +ReadTables +DecodeNumber +Libraries/unrar/unpackinline.cpp +ReadBlockHeader +Unpack5 +SlotToLength +InsertOldDist +UnpInitData30 +Libraries/unrar/unpack30.cpp +ExecuteCode +UnpWriteArea +InitFilters30 +AddVMCode +Overflow +UnpackFilter30 +VM_PreparedProgram +Libraries/unrar/rarvm.hpp +InitBitInput +ReadVMCode +ReadEndOfBlock +ReadVMCodePPM +SafePPMDecodeChar +UnpWriteBuf30 +ReadTables30 +UnpReadBuf30 +Unpack29 +UnpInitData20 +Libraries/unrar/unpack20.cpp +MakeDecodeTables +ReadLastTables +DecodeAudio +ReadTables20 +Unpack20 +CopyString20 +CorrHuff +DecodeNum +CopyString15 +ShortLZ +LongLZ +HuffDecode +UnpWriteBuf20 +GetFlagsBuf +InitHuff +UnpReadBuf +UnpInitData +Unpack15 +UpdateModel +AllocUnits +U2B +ExpandUnits +InsertNode +_PPMD_SWAP +decodeSymbol2 +update2 +update +GetCurrentCount +Libraries/unrar/coder.cpp +makeEscFreq2 +getMean +decodeSymbol1 +update1 +DecodeChar +ClearMask +decodeBinSymbol +GetCurrentShiftCount +GetChar +DecodeInit +GetAllocatedMemory +CleanUp +rescale +ShrinkUnits +SplitBlock +FreeUnits +StartModelRare +RestartModelRare +GlueFreeBlocks +MBPtr +insertAt +AllocUnitsRare +InitSubAllocator +StartSubAllocator +InitDecoder +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/headers.cpp +Libraries/unrar/headers.cpp +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/cmddata.cpp +ReportWrongSwitches +Libraries/unrar/cmddata.cpp +uiMsg +CheckWinSize +GetArcName +AddArcName +ProcessCommand +~StringList +GetExclAttr +BadSwitch +ReadConfig +ProcessSwitchesString +AllocCmdParam +IsSwitch +ParseEnvVar +ProcessSwitch +ParseDone +ParseArg +PreprocessArg +ParseCommandLine +CommandData +OutHelp +Libraries/unrar/cmdmix.cpp +OutTitle +SetStoreTimeMode +Libraries/unrar/cmdfilter.cpp +IsProcessFile +SizeCheck +TimeCheck +SetTimeFilters +ExclDirByAttr +CheckArgs +ExclCheck +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/ui.cpp +uiGetMonthName +Libraries/unrar/uisilent.cpp +uiGiveTick +uiIsAborted +uiAlarm +uiIsGlobalPasswordSet +uiGetPassword +Msg +uiProcessProgress +uiExtractProgress +uiStartFileExtract +uiStartArchiveExtract +uiAskReplace +uiAskReplaceEx +Libraries/unrar/uicommon.cpp +uiInit +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/filestr.cpp +DetectTextEncoding +Libraries/unrar/filestr.cpp +ReadTextFile +operator+ +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/scantree.cpp +ScanError +Libraries/unrar/scantree.cpp +GetFilteredMask +ExpandFolderMask +FindProc +GetNextMask +GetNext +~ScanTree +ScanTree +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/qopen.cpp +ReadRaw +Libraries/unrar/qopen.cpp +ReadNext +ReadBuffer +Load +SetProhibitQOpen +~QuickOpen +QuickOpen +__ZL13RarErrorToDll8RAR_EXIT +/Users/travis/build/abbeycode/UnrarKit/Libraries/unrar/dll.cpp +DataSet +Libraries/unrar/dll.cpp +~CommandData +Libraries/unrar/cmddata.hpp +RARGetDllVersion +RARSetPassword +RARSetProcessDataProc +RARSetCallback +RARSetChangeVolProc +RARProcessFileW +ProcessFile +RARProcessFile +RARReadHeaderEx +RARReadHeader +RARCloseArchive +~DataSet +RarErrorToDll +RAROpenArchiveEx +RAROpenArchive diff --git a/Carthage/Checkouts/UnrarKit/.circleci/config.yml b/Carthage/Checkouts/UnrarKit/.circleci/config.yml new file mode 100644 index 0000000..70c3b58 --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/.circleci/config.yml @@ -0,0 +1,79 @@ +version: 2.1 + +executors: + my-xcode: + macos: + xcode: 12.0.1 + +workflows: + version: 2 + test-validate-release: + jobs: + # Testing + - test-Mac + - test-iOS + - test-ExampleApp + + # Validation + - validate-CocoaPods: + requires: + - test-Mac + - test-iOS + - test-ExampleApp + - validate-Carthage: + requires: + - test-Mac + - test-iOS + - test-ExampleApp + + # Release +# - release: +# # Only run for tags +# filters: +# branches: +# ignore: /.*/ +# tags: +# only: /.*/ +# requires: +# - validate-CocoaPods +# - validate-Carthage + +jobs: + test-Mac: + executor: my-xcode + steps: + - checkout + # The CLANG arguments and find command fail the build on analyzer errors + - run: xcodebuild -workspace UnrarKit.xcworkspace -scheme UnrarKit -sdk macosx -configuration Release -quiet analyze test CLANG_ANALYZER_OUTPUT=html CLANG_ANALYZER_OUTPUT_DIR=analyzer-output && [[ -z `find analyzer-output -name "*.html"` ]] + + test-iOS: + executor: my-xcode + steps: + - checkout + # The CLANG arguments and find command fail the build on analyzer errors + - run: xcodebuild -workspace UnrarKit.xcworkspace -scheme UnrarKit -destination 'platform=iOS Simulator,name=iPhone 11,OS=latest' -configuration Release analyze test CLANG_ANALYZER_OUTPUT=html CLANG_ANALYZER_OUTPUT_DIR=analyzer-output && [[ -z `find analyzer-output -name "*.html"` ]] + + test-ExampleApp: + executor: my-xcode + steps: + - checkout + # The CLANG arguments and find command fail the build on analyzer errors + - run: xcodebuild -workspace UnrarKit.xcworkspace -scheme UnrarExample -sdk iphonesimulator -configuration Release analyze CLANG_ANALYZER_OUTPUT=html CLANG_ANALYZER_OUTPUT_DIR=analyzer-output && [[ -z `find analyzer-output -name "*.html"` ]] + + validate-CocoaPods: + executor: my-xcode + steps: + - checkout + - run: ./Scripts/cocoapod-validate.sh + + validate-Carthage: + executor: my-xcode + steps: + - checkout + - run: ./Scripts/carthage-validate.sh + +# release: +# executor: my-xcode +# steps: +# - checkout +# - run: ./Scripts/push-output.sh diff --git a/Carthage/Checkouts/UnrarKit/.github/CONTRIBUTING.md b/Carthage/Checkouts/UnrarKit/.github/CONTRIBUTING.md new file mode 100644 index 0000000..d526c72 --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/.github/CONTRIBUTING.md @@ -0,0 +1,24 @@ +# Contributing to UnrarKit + +First of all, if you're reading this, thanks! I love getting feedback from other developers who use this library and welcome any and all feedback. Issues and Pull requests are welcome, with a few guidelines, laid out below. + +# Issues + +I need the following, at a minimum: + +1. The steps to reproduce your issue, detailed enough for me to follow along and see what you're seeing (bonus points for giving me a sample archive that demonstrates the issue) +2. What you expect to happen +3. What actually happened + +If what you're reporting is a crash, a crash report is key (or a stack trace, if you don't have a full crash report). + +Beyond that, the **quickest way** to get me to address what you're asking for is to provide a unit test (or tests) to demonstrate what you'd like to see (they should probably fail). I have a pretty complete set of tests already in the library that you can use as an example if you'd like. + +# Pull Requests + +Pull Requests are always greatly appreciated. The general rule of thumb for how quickly something will make it into a future release is the inverse of how much work I'll need to do on it. Creating a PR instead of an issue report takes a huge burden off of me. If you do create a PR, I'll require these things before I merge it: + +1. Style needs to mesh with the rest of the repo. I'd love to have some style enforcement checks at some point, but don't yet. Do your best according to what you see in the rest of the source and I'll point out anything you missed. No big deal +2. If you're fixing a bug, I need to see a unit test that reproduces the issue(s) by failing if I comment out your fix. I try to maintain code coverage that's as complete as possible, so more unit tests are always welcome +3. Don't touch the `Libraries/unrar` directory. This is the UnRAR source code, downloaded from [the RARLAB site](https://www.rarlab.com/rar_add.htm), and updated occasionally. You can usually look at the revision history of that folder to see what version it's currently on. This library does cause some compiler warnings, but I ignore them in Xcode and CocoaPods, relying on unit tests to tell me if anything is truly broken, since I don't maintain patches - I expect to be able to drop in newer versions as needed +4. Be patient with the process - I maintain a high attention to detail, and will take however much time is necessary to get the change to where I'd like it. If you'd rather have a more brief back-and-forth, I can always pull into a separate branch to make the changes myself before merging, but enjoy the interaction of collaborating on PRs whenever possible \ No newline at end of file diff --git a/Carthage/Checkouts/UnrarKit/.github/ISSUE_TEMPLATE.MD b/Carthage/Checkouts/UnrarKit/.github/ISSUE_TEMPLATE.MD new file mode 100644 index 0000000..a3756dd --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/.github/ISSUE_TEMPLATE.MD @@ -0,0 +1,28 @@ +Thanks for making a contribution to UnrarKit! I greatly value issue reports, which help make the library better, and more useful to more people. To help me address your issue, please follow the steps below. + +_Delete from this line up_ + +- [ ] Provide a brief, descriptive issue title +- [ ] Fill out the template below +- [ ] **Option A** is the easier, more traditional way of reporting a bug +- [ ] **Option B** gets you bonus points (redeemable in the form of me looking at your issue more quickly). Create a failing unit test that would pass if the issue were resolved. When I go to fix your issue, it's one of the first things I would do anyway. There is a pretty complete set already there, so you can use those as a guide to creating new ones. + +## Option A + +### Steps to reproduce issue (Detailed enough for me to reproduce - attaching a sample archive can be very helpful): + + +### What you expect to happen: + + +### What actually happened: + + +### (_Optional_) A stack trace or crash report, if you have one: + + +## Option B + +### Brief summary of issue: + +### Link to your branch where you've created automated tests to demonstrate the issue (and the name of the unit test(s) you created): \ No newline at end of file diff --git a/Carthage/Checkouts/UnrarKit/Libraries/unrar/cmdfilter.cpp b/Carthage/Checkouts/UnrarKit/Libraries/unrar/cmdfilter.cpp new file mode 100644 index 0000000..d6517ce --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/Libraries/unrar/cmdfilter.cpp @@ -0,0 +1,352 @@ +// Return 'true' if we need to exclude the file from processing as result +// of -x switch. If CheckInclList is true, we also check the file against +// the include list created with -n switch. +bool CommandData::ExclCheck(const wchar *CheckName,bool Dir,bool CheckFullPath,bool CheckInclList) +{ + if (CheckArgs(&ExclArgs,Dir,CheckName,CheckFullPath,MATCH_WILDSUBPATH)) + return true; + if (!CheckInclList || InclArgs.ItemsCount()==0) + return false; + if (CheckArgs(&InclArgs,Dir,CheckName,CheckFullPath,MATCH_WILDSUBPATH)) + return false; + return true; +} + + +bool CommandData::CheckArgs(StringList *Args,bool Dir,const wchar *CheckName,bool CheckFullPath,int MatchMode) +{ + wchar *Name=ConvertPath(CheckName,NULL,0); + wchar FullName[NM]; + wchar CurMask[NM]; + *FullName=0; + Args->Rewind(); + while (Args->GetString(CurMask,ASIZE(CurMask))) + { + wchar *LastMaskChar=PointToLastChar(CurMask); + bool DirMask=IsPathDiv(*LastMaskChar); // Mask for directories only. + + if (Dir) + { + // CheckName is a directory. + if (DirMask) + { + // We process the directory and have the directory exclusion mask. + // So let's convert "mask\" to "mask" and process it normally. + + *LastMaskChar=0; + } + else + { + // REMOVED, we want -npath\* to match empty folders too. + // If mask has wildcards in name part and does not have the trailing + // '\' character, we cannot use it for directories. + + // if (IsWildcard(PointToName(CurMask))) + // continue; + } + } + else + { + // If we process a file inside of directory excluded by "dirmask\". + // we want to exclude such file too. So we convert "dirmask\" to + // "dirmask\*". It is important for operations other than archiving + // with -x. When archiving with -x, directory matched by "dirmask\" + // is excluded from further scanning. + + if (DirMask) + wcsncatz(CurMask,L"*",ASIZE(CurMask)); + } + +#ifndef SFX_MODULE + if (CheckFullPath && IsFullPath(CurMask)) + { + // We do not need to do the special "*\" processing here, because + // unlike the "else" part of this "if", now we convert names to full + // format, so they all include the path, which is matched by "*\" + // correctly. Moreover, removing "*\" from mask would break + // the comparison, because now all names have the path. + + if (*FullName==0) + ConvertNameToFull(CheckName,FullName,ASIZE(FullName)); + if (CmpName(CurMask,FullName,MatchMode)) + return true; + } + else +#endif + { + wchar NewName[NM+2],*CurName=Name; + + // Important to convert before "*\" check below, so masks like + // d:*\something are processed properly. + wchar *CmpMask=ConvertPath(CurMask,NULL,0); + + if (CmpMask[0]=='*' && IsPathDiv(CmpMask[1])) + { + // We want "*\name" to match 'name' not only in subdirectories, + // but also in the current directory. We convert the name + // from 'name' to '.\name' to be matched by "*\" part even if it is + // in current directory. + NewName[0]='.'; + NewName[1]=CPATHDIVIDER; + wcsncpyz(NewName+2,Name,ASIZE(NewName)-2); + CurName=NewName; + } + + if (CmpName(CmpMask,CurName,MatchMode)) + return true; + } + } + return false; +} + + + + +#ifndef SFX_MODULE +// Now this function performs only one task and only in Windows version: +// it skips symlinks to directories if -e1024 switch is specified. +// Symlinks are skipped in ScanTree class, so their entire contents +// is skipped too. Without this function we would check the attribute +// only directly before archiving, so we would skip the symlink record, +// but not the contents of symlinked directory. +bool CommandData::ExclDirByAttr(uint FileAttr) +{ +#ifdef _WIN_ALL + if ((FileAttr & FILE_ATTRIBUTE_REPARSE_POINT)!=0 && + (ExclFileAttr & FILE_ATTRIBUTE_REPARSE_POINT)!=0) + return true; +#endif + return false; +} +#endif + + + + +#if !defined(SFX_MODULE) +void CommandData::SetTimeFilters(const wchar *Mod,bool Before,bool Age) +{ + bool ModeOR=false,TimeMods=false; + const wchar *S=Mod; + // Check if any 'mca' modifiers are present, set OR mode if 'o' is present, + // skip modifiers and set S to beginning of time string. Be sure to check + // *S!=0, because termination 0 is a part of string for wcschr. + for (;*S!=0 && wcschr(L"MCAOmcao",*S)!=NULL;S++) + if (*S=='o' || *S=='O') + ModeOR=true; + else + TimeMods=true; + + if (!TimeMods) // Assume 'm' if no modifiers are specified. + Mod=L"m"; + + // Set the specified time for every modifier. Be sure to check *Mod!=0, + // because termination 0 is a part of string for wcschr. This check is + // important when we set Mod to "m" above. + for (;*Mod!=0 && wcschr(L"MCAOmcao",*Mod)!=NULL;Mod++) + switch(toupperw(*Mod)) + { + case 'M': + if (Before) + { + Age ? FileMtimeBefore.SetAgeText(S):FileMtimeBefore.SetIsoText(S); + FileMtimeBeforeOR=ModeOR; + } + else + { + Age ? FileMtimeAfter.SetAgeText(S):FileMtimeAfter.SetIsoText(S); + FileMtimeAfterOR=ModeOR; + } + break; + case 'C': + if (Before) + { + Age ? FileCtimeBefore.SetAgeText(S):FileCtimeBefore.SetIsoText(S); + FileCtimeBeforeOR=ModeOR; + } + else + { + Age ? FileCtimeAfter.SetAgeText(S):FileCtimeAfter.SetIsoText(S); + FileCtimeAfterOR=ModeOR; + } + break; + case 'A': + if (Before) + { + Age ? FileAtimeBefore.SetAgeText(S):FileAtimeBefore.SetIsoText(S); + FileAtimeBeforeOR=ModeOR; + } + else + { + Age ? FileAtimeAfter.SetAgeText(S):FileAtimeAfter.SetIsoText(S); + FileAtimeAfterOR=ModeOR; + } + break; + } +} +#endif + + +#ifndef SFX_MODULE +// Return 'true' if we need to exclude the file from processing. +bool CommandData::TimeCheck(RarTime &ftm,RarTime &ftc,RarTime &fta) +{ + bool FilterOR=false; + + if (FileMtimeBefore.IsSet()) // Filter present. + if (ftm>=FileMtimeBefore) // Condition not matched. + if (FileMtimeBeforeOR) + FilterOR=true; // Not matched OR filter is present. + else + return true; // Exclude file in AND mode. + else // Condition matched. + if (FileMtimeBeforeOR) + return false; // Include file in OR mode. + + if (FileMtimeAfter.IsSet()) // Filter present. + if (ftm=FileCtimeBefore) // Condition not matched. + if (FileCtimeBeforeOR) + FilterOR=true; // Not matched OR filter is present. + else + return true; // Exclude file in AND mode. + else // Condition matched. + if (FileCtimeBeforeOR) + return false; // Include file in OR mode. + + if (FileCtimeAfter.IsSet()) // Filter present. + if (ftc=FileAtimeBefore) // Condition not matched. + if (FileAtimeBeforeOR) + FilterOR=true; // Not matched OR filter is present. + else + return true; // Exclude file in AND mode. + else // Condition matched. + if (FileAtimeBeforeOR) + return false; // Include file in OR mode. + + if (FileAtimeAfter.IsSet()) // Filter present. + if (fta=FileSizeLess) + return true; + if (FileSizeMore!=INT64NDF && Size<=FileSizeMore) + return true; + return false; +} +#endif + + + + +// Return 0 if file must not be processed or a number of matched parameter otherwise. +int CommandData::IsProcessFile(FileHeader &FileHead,bool *ExactMatch,int MatchType, + bool Flags,wchar *MatchedArg,uint MatchedArgSize) +{ + if (MatchedArg!=NULL && MatchedArgSize>0) + *MatchedArg=0; + bool Dir=FileHead.Dir; + if (ExclCheck(FileHead.FileName,Dir,false,true)) + return 0; +#ifndef SFX_MODULE + if (TimeCheck(FileHead.mtime,FileHead.ctime,FileHead.atime)) + return 0; + if ((FileHead.FileAttr & ExclFileAttr)!=0 || FileHead.Dir && ExclDir) + return 0; + if (InclAttrSet && (!FileHead.Dir && (FileHead.FileAttr & InclFileAttr)==0 || + FileHead.Dir && !InclDir)) + return 0; + if (!Dir && SizeCheck(FileHead.UnpSize)) + return 0; +#endif + wchar *ArgName; + FileArgs.Rewind(); + for (int StringCount=1;(ArgName=FileArgs.GetString())!=NULL;StringCount++) + if (CmpName(ArgName,FileHead.FileName,MatchType)) + { + if (ExactMatch!=NULL) + *ExactMatch=wcsicompc(ArgName,FileHead.FileName)==0; + if (MatchedArg!=NULL) + wcsncpyz(MatchedArg,ArgName,MatchedArgSize); + return StringCount; + } + return 0; +} + + +#if !defined(SFX_MODULE) +void CommandData::SetStoreTimeMode(const wchar *S) +{ + if (*S==0 || IsDigit(*S) || *S=='-' || *S=='+') + { + // Apply -ts, -ts1, -ts-, -ts+ to all 3 times. + // Handle obsolete -ts[2,3,4] as ts+. + EXTTIME_MODE Mode=EXTTIME_MAX; + if (*S=='-') + Mode=EXTTIME_NONE; + if (*S=='1') + Mode=EXTTIME_1S; + xmtime=xctime=xatime=Mode; + S++; + } + + while (*S!=0) + { + EXTTIME_MODE Mode=EXTTIME_MAX; + if (S[1]=='-') + Mode=EXTTIME_NONE; + if (S[1]=='1') + Mode=EXTTIME_1S; + switch(toupperw(*S)) + { + case 'M': + xmtime=Mode; + break; + case 'C': + xctime=Mode; + break; + case 'A': + xatime=Mode; + break; + case 'P': + PreserveAtime=true; + break; + } + S++; + } +} +#endif diff --git a/Carthage/Checkouts/UnrarKit/Libraries/unrar/cmdmix.cpp b/Carthage/Checkouts/UnrarKit/Libraries/unrar/cmdmix.cpp new file mode 100644 index 0000000..3990cc1 --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/Libraries/unrar/cmdmix.cpp @@ -0,0 +1,118 @@ +void CommandData::OutTitle() +{ + if (BareOutput || DisableCopyright) + return; +#if defined(__GNUC__) && defined(SFX_MODULE) + mprintf(St(MCopyrightS)); +#else +#ifndef SILENT + static bool TitleShown=false; + if (TitleShown) + return; + TitleShown=true; + + wchar Version[80]; + if (RARVER_BETA!=0) + swprintf(Version,ASIZE(Version),L"%d.%02d %ls %d",RARVER_MAJOR,RARVER_MINOR,St(MBeta),RARVER_BETA); + else + swprintf(Version,ASIZE(Version),L"%d.%02d",RARVER_MAJOR,RARVER_MINOR); +#if defined(_WIN_32) || defined(_WIN_64) + wcsncatz(Version,L" ",ASIZE(Version)); +#endif +#ifdef _WIN_32 + wcsncatz(Version,St(Mx86),ASIZE(Version)); +#endif +#ifdef _WIN_64 + wcsncatz(Version,St(Mx64),ASIZE(Version)); +#endif + if (PrintVersion) + { + mprintf(L"%s",Version); + exit(0); + } + mprintf(St(MUCopyright),Version,RARVER_YEAR); +#endif +#endif +} + + +inline bool CmpMSGID(MSGID i1,MSGID i2) +{ +#ifdef MSGID_INT + return i1==i2; +#else + // If MSGID is const char*, we cannot compare pointers only. + // Pointers to different instances of same string can differ, + // so we need to compare complete strings. + return wcscmp(i1,i2)==0; +#endif +} + +void CommandData::OutHelp(RAR_EXIT ExitCode) +{ +#if !defined(SILENT) + OutTitle(); + static MSGID Help[]={ +#ifdef SFX_MODULE + // Console SFX switches definition. + MCHelpCmd,MSHelpCmdE,MSHelpCmdT,MSHelpCmdV +#else + // UnRAR switches definition. + MUNRARTitle1,MRARTitle2,MCHelpCmd,MCHelpCmdE,MCHelpCmdL, + MCHelpCmdP,MCHelpCmdT,MCHelpCmdV,MCHelpCmdX,MCHelpSw,MCHelpSwm, + MCHelpSwAT,MCHelpSwAC,MCHelpSwAD,MCHelpSwAG,MCHelpSwAI,MCHelpSwAP, + MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU, + MCHelpSwDH,MCHelpSwEP,MCHelpSwEP3,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR, + MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwN,MCHelpSwNa,MCHelpSwNal, + MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOR,MCHelpSwOW,MCHelpSwP, + MCHelpSwPm,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSL,MCHelpSwSM, + MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU, + MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX,MCHelpSwXa,MCHelpSwXal, + MCHelpSwY +#endif + }; + + for (uint I=0;I> $xcconfig +echo 'EXCLUDED_ARCHS = $(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT)__XCODE_$(XCODE_VERSION_MAJOR))' >> $xcconfig + +export XCODE_XCCONFIG_FILE="$xcconfig" +carthage "$@" \ No newline at end of file diff --git a/Carthage/Checkouts/UnrarKit/Tests/ExtractBufferedDataTests.m b/Carthage/Checkouts/UnrarKit/Tests/ExtractBufferedDataTests.m new file mode 100644 index 0000000..d9ae1db --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/Tests/ExtractBufferedDataTests.m @@ -0,0 +1,174 @@ +// +// ExtractBufferedDataTests.m +// UnrarKit +// +// + +#import "URKArchiveTestCase.h" + +@import os.log; +@import os.signpost; + + +@interface ExtractBufferedDataTests : URKArchiveTestCase @end + +@implementation ExtractBufferedDataTests + +- (void)testExtractBufferedData +{ + NSURL *archiveURL = self.testFileURLs[@"Test Archive.rar"]; + NSString *extractedFile = @"Test File B.jpg"; + URKArchive *archive = [[URKArchive alloc] initWithURL:archiveURL error:nil]; + + NSError *error = nil; + NSMutableData *reconstructedFile = [NSMutableData data]; + BOOL success = [archive extractBufferedDataFromFile:extractedFile + error:&error + action: + ^(NSData *dataChunk, CGFloat percentDecompressed) { + NSLog(@"Decompressed: %f%%", percentDecompressed); + [reconstructedFile appendBytes:dataChunk.bytes + length:dataChunk.length]; + }]; + + XCTAssertTrue(success, @"Failed to read buffered data"); + XCTAssertNil(error, @"Error reading buffered data"); + XCTAssertGreaterThan(reconstructedFile.length, 0, @"No data returned"); + + NSData *originalFile = [NSData dataWithContentsOfURL:self.testFileURLs[extractedFile]]; + XCTAssertTrue([originalFile isEqualToData:reconstructedFile], + @"File extracted in buffer not returned correctly"); +} + +- (void)testExtractBufferedData_ModifiedCRC +{ + NSURL *archiveURL = self.testFileURLs[@"Modified CRC Archive.rar"]; + NSString *extractedFile = @"README.md"; + URKArchive *archive = [[URKArchive alloc] initWithURL:archiveURL error:nil]; + + NSError *error = nil; + NSMutableData *reconstructedFile = [NSMutableData data]; + BOOL success = [archive extractBufferedDataFromFile:extractedFile + error:&error + action: + ^(NSData *dataChunk, CGFloat percentDecompressed) { + NSLog(@"Decompressed: %f%%", percentDecompressed); + [reconstructedFile appendBytes:dataChunk.bytes + length:dataChunk.length]; + }]; + + XCTAssertFalse(success, @"Failed to read buffered data"); + XCTAssertNotNil(error, @"Error reading buffered data"); + + NSData *originalFile = [NSData dataWithContentsOfURL:self.testFileURLs[extractedFile]]; + XCTAssertTrue([originalFile isEqualToData:reconstructedFile], + @"File extracted in buffer not returned correctly"); +} + +- (void)testExtractBufferedData_ModifiedCRC_IgnoringMismatches +{ + NSURL *archiveURL = self.testFileURLs[@"Modified CRC Archive.rar"]; + NSString *extractedFile = @"README.md"; + URKArchive *archive = [[URKArchive alloc] initWithURL:archiveURL error:nil]; + archive.ignoreCRCMismatches = YES; + + NSError *error = nil; + NSMutableData *reconstructedFile = [NSMutableData data]; + BOOL success = [archive extractBufferedDataFromFile:extractedFile + error:&error + action: + ^(NSData *dataChunk, CGFloat percentDecompressed) { + NSLog(@"Decompressed: %f%%", percentDecompressed); + [reconstructedFile appendBytes:dataChunk.bytes + length:dataChunk.length]; + }]; + + XCTAssertTrue(success, @"Failed to read buffered data"); + XCTAssertNil(error, @"Error reading buffered data"); + XCTAssertGreaterThan(reconstructedFile.length, 0, @"No data returned"); + + NSData *originalFile = [NSData dataWithContentsOfURL:self.testFileURLs[extractedFile]]; + XCTAssertTrue([originalFile isEqualToData:reconstructedFile], + @"File extracted in buffer not returned correctly"); +} + +#if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200 +- (void)testExtractBufferedData_VeryLarge +{ + os_log_t log = os_log_create("UnrarKit-testExtractBufferedData_VeryLarge", OS_LOG_CATEGORY_POINTS_OF_INTEREST); + + os_signpost_id_t createTextFileID; + + if (@available(macOS 10.14, *)) { + createTextFileID = os_signpost_id_generate(log); + os_signpost_interval_begin(log, createTextFileID, "Create Text File"); + } + + NSURL *largeTextFile = [self randomTextFileOfLength:1000000]; // Increase for a more dramatic test + + if (@available(macOS 10.14, *)) { + XCTAssertNotNil(largeTextFile, @"No large text file URL returned"); + os_signpost_interval_end(log, createTextFileID, "Create Text File"); + } + + os_signpost_id_t archiveDataID; + + if (@available(macOS 10.14, *)) { + archiveDataID = os_signpost_id_generate(log); + os_signpost_interval_begin(log, archiveDataID, "Archive Data"); + } + + NSURL *archiveURL = [self archiveWithFiles:@[largeTextFile]]; + + XCTAssertNotNil(archiveURL, @"No archived large text file URL returned"); + + if (@available(macOS 10.14, *)) { + os_signpost_interval_end(log, archiveDataID, "Archive Data"); + } + + NSURL *deflatedFileURL = [self.tempDirectory URLByAppendingPathComponent:@"DeflatedTextFile.txt"]; + BOOL createSuccess = [[NSFileManager defaultManager] createFileAtPath:deflatedFileURL.path + contents:nil + attributes:nil]; + XCTAssertTrue(createSuccess, @"Failed to create empty deflate file"); + + NSError *handleError = nil; + NSFileHandle *deflated = [NSFileHandle fileHandleForWritingToURL:deflatedFileURL + error:&handleError]; + XCTAssertNil(handleError, @"Error creating a file handle"); + + URKArchive *archive = [[URKArchive alloc] initWithURL:archiveURL error:nil]; + + os_signpost_id_t extractDataID; + + if (@available(macOS 10.14, *)) { + extractDataID = os_signpost_id_generate(log); + os_signpost_interval_begin(log, extractDataID, "Extract Data"); + } + + NSError *error = nil; + BOOL success = [archive extractBufferedDataFromFile:largeTextFile.lastPathComponent + error:&error + action: + ^(NSData *dataChunk, CGFloat percentDecompressed) { + NSLog(@"Decompressed: %f%%", percentDecompressed); + [deflated writeData:dataChunk]; + }]; + + if (@available(macOS 10.14, *)) { + os_signpost_interval_end(log, extractDataID, "Extract Data"); + } + + XCTAssertTrue(success, @"Failed to read buffered data"); + XCTAssertNil(error, @"Error reading buffered data"); + + [deflated closeFile]; + + NSData *deflatedData = [NSData dataWithContentsOfURL:deflatedFileURL]; + NSData *fileData = [NSData dataWithContentsOfURL:largeTextFile]; + + XCTAssertTrue([fileData isEqualToData:deflatedData], @"Data didn't restore correctly"); +} +#endif + +@end diff --git a/Carthage/Checkouts/UnrarKit/Tests/ExtractDataTests.m b/Carthage/Checkouts/UnrarKit/Tests/ExtractDataTests.m new file mode 100644 index 0000000..40c8cdc --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/Tests/ExtractDataTests.m @@ -0,0 +1,150 @@ +// +// ExtractDataTests.m +// UnrarKit +// +// + +#import "URKArchiveTestCase.h" + +@interface ExtractDataTests : URKArchiveTestCase + +@end + +@implementation ExtractDataTests + +- (void)testExtractData +{ + NSArray *testArchives = @[@"Test Archive.rar", + @"Test Archive (Password).rar", + @"Test Archive (Header Password).rar"]; + + NSSet *expectedFileSet = [self.testFileURLs keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) { + return ![key hasSuffix:@"rar"] && ![key hasSuffix:@"md"]; + }]; + + NSArray *expectedFiles = [[expectedFileSet allObjects] sortedArrayUsingSelector:@selector(compare:)]; + + for (NSString *testArchiveName in testArchives) { + + NSURL *testArchiveURL = self.testFileURLs[testArchiveName]; + NSString *password = ([testArchiveName rangeOfString:@"Password"].location != NSNotFound + ? @"password" + : nil); + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL password:password error:nil]; + + NSError *error = nil; + NSArray *fileInfos = [archive listFileInfo:&error]; + XCTAssertNil(error, @"Error reading file info"); + + for (NSInteger i = 0; i < expectedFiles.count; i++) { + NSString *expectedFilename = expectedFiles[i]; + + NSError *error = nil; + NSData *extractedData = [archive extractDataFromFile:expectedFilename error:&error]; + + XCTAssertNil(error, @"Error in extractData:error:"); + + NSData *expectedFileData = [NSData dataWithContentsOfURL:self.testFileURLs[expectedFilename]]; + + XCTAssertNotNil(extractedData, @"No data extracted"); + XCTAssertTrue([expectedFileData isEqualToData:extractedData], @"Extracted data doesn't match original file"); + + error = nil; + NSData *dataFromFileInfo = [archive extractData:fileInfos[i] error:&error]; + XCTAssertNil(error, @"Error extracting data by file info"); + XCTAssertTrue([expectedFileData isEqualToData:dataFromFileInfo], @"Extracted data from file info doesn't match original file"); + } + } +} + +- (void)testExtractData_Unicode +{ + NSSet *expectedFileSet = [self.unicodeFileURLs keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) { + return ![key hasSuffix:@"rar"] && ![key hasSuffix:@"md"]; + }]; + + NSArray *expectedFiles = [[expectedFileSet allObjects] sortedArrayUsingSelector:@selector(compare:)]; + + NSURL *testArchiveURL = self.unicodeFileURLs[@"Ⓣest Ⓐrchive.rar"]; + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL error:nil]; + + NSError *error = nil; + NSArray *fileInfos = [archive listFileInfo:&error]; + XCTAssertNil(error, @"Error reading file info"); + + for (NSInteger i = 0; i < expectedFiles.count; i++) { + NSString *expectedFilename = expectedFiles[i]; + + NSError *error = nil; + NSData *extractedData = [archive extractDataFromFile:expectedFilename error:&error]; + + XCTAssertNil(error, @"Error in extractData:error:"); + + NSData *expectedFileData = [NSData dataWithContentsOfURL:self.unicodeFileURLs[expectedFilename]]; + + XCTAssertNotNil(extractedData, @"No data extracted"); + XCTAssertTrue([expectedFileData isEqualToData:extractedData], @"Extracted data doesn't match original file"); + + error = nil; + NSData *dataFromFileInfo = [archive extractData:fileInfos[i] error:&error]; + XCTAssertNil(error, @"Error extracting data by file info"); + XCTAssertTrue([expectedFileData isEqualToData:dataFromFileInfo], @"Extracted data from file info doesn't match original file"); + } +} + +- (void)testExtractData_NoPassword +{ + NSArray *testArchives = @[@"Test Archive (Password).rar", + @"Test Archive (Header Password).rar"]; + + for (NSString *testArchiveName in testArchives) { + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[testArchiveName] error:nil]; + + NSError *error = nil; + NSData *data = [archive extractDataFromFile:@"Test File A.txt" error:&error]; + + XCTAssertNotNil(error, @"Extract data without password succeeded"); + XCTAssertNil(data, @"Data returned without password"); + XCTAssertEqual(error.code, URKErrorCodeMissingPassword, @"Unexpected error code returned"); + } +} + +- (void)testExtractData_InvalidArchive +{ + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Test File A.txt"] error:nil]; + + NSError *error = nil; + NSData *data = [archive extractDataFromFile:@"Any file.txt" error:&error]; + + XCTAssertNotNil(error, @"Extract data for invalid archive succeeded"); + XCTAssertNil(data, @"Data returned for invalid archive"); + XCTAssertEqual(error.code, URKErrorCodeBadArchive, @"Unexpected error code returned"); +} + +- (void)testExtractData_ModifiedCRC +{ + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Modified CRC Archive.rar"] error:nil]; + + NSError *error = nil; + NSData *data = [archive extractDataFromFile:@"README.md" error:&error]; + + XCTAssertNotNil(error, @"Extract data for invalid archive succeeded"); + XCTAssertNil(data, @"Data returned for invalid archive"); + XCTAssertEqual(error.code, URKErrorCodeBadData, @"Unexpected error code returned"); +} + +- (void)testExtractData_ModifiedCRC_IgnoringMismatches +{ + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Modified CRC Archive.rar"] error:nil]; + archive.ignoreCRCMismatches = YES; + + NSError *error = nil; + NSData *data = [archive extractDataFromFile:@"README.md" error:&error]; + NSData *expectedData = [NSData dataWithContentsOfURL:self.testFileURLs[@"README.md"]]; + + XCTAssertNil(error, @"Extract data for invalid archive succeeded"); + XCTAssertNotNil(data, @"Data returned for invalid archive"); + XCTAssertEqualObjects(data, expectedData); +} + +@end diff --git a/Carthage/Checkouts/UnrarKit/Tests/ListFileInfoTests.m b/Carthage/Checkouts/UnrarKit/Tests/ListFileInfoTests.m new file mode 100644 index 0000000..215df79 --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/Tests/ListFileInfoTests.m @@ -0,0 +1,213 @@ +// +// ListFileInfoTests.m +// UnrarKit +// +// + +#import "URKArchiveTestCase.h" + +@interface ListFileInfoTests : URKArchiveTestCase + +@end + +@implementation ListFileInfoTests + +- (void)testListFileInfo { + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Test Archive.rar"] error:nil]; + + NSSet *expectedFileSet = [self.testFileURLs keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) { + return ![key hasSuffix:@"rar"] && ![key hasSuffix:@"md"]; + }]; + + NSArray *expectedFiles = [[expectedFileSet allObjects] sortedArrayUsingSelector:@selector(compare:)]; + + static NSDateFormatter *testFileInfoDateFormatter; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + testFileInfoDateFormatter = [[NSDateFormatter alloc] init]; + testFileInfoDateFormatter.dateFormat = @"M/dd/yyyy h:mm a"; + testFileInfoDateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US"]; + }); + + NSDictionary *expectedTimestamps = @{@"Test File A.txt": [testFileInfoDateFormatter dateFromString:@"3/13/2014 8:02 PM"], + @"Test File B.jpg": [testFileInfoDateFormatter dateFromString:@"3/13/2014 8:04 PM"], + @"Test File C.m4a": [testFileInfoDateFormatter dateFromString:@"3/13/2014 8:05 PM"],}; + + NSError *error = nil; + NSArray *filesInArchive = [archive listFileInfo:&error]; + + XCTAssertNil(error, @"Error returned by listFileInfo"); + XCTAssertNotNil(filesInArchive, @"No list of files returned"); + XCTAssertEqual(filesInArchive.count, expectedFileSet.count, @"Incorrect number of files listed in archive"); + + NSFileManager *fm = [NSFileManager defaultManager]; + + for (NSInteger i = 0; i < filesInArchive.count; i++) { + URKFileInfo *fileInfo = filesInArchive[i]; + + // Test Archive Name + NSString *expectedArchiveName = archive.filename; + XCTAssertEqualObjects(fileInfo.archiveName, expectedArchiveName, @"Incorrect archive name"); + + // Test Filename + NSString *expectedFilename = expectedFiles[i]; + XCTAssertEqualObjects(fileInfo.filename, expectedFilename, @"Incorrect filename"); + + // Test CRC + NSUInteger expectedFileCRC = [self crcOfTestFile:expectedFilename]; + XCTAssertEqual(fileInfo.CRC, expectedFileCRC, @"Incorrect CRC checksum"); + + // Test Last Modify Date + NSTimeInterval archiveFileTimeInterval = [fileInfo.timestamp timeIntervalSinceReferenceDate]; + NSTimeInterval expectedFileTimeInterval = [expectedTimestamps[fileInfo.filename] timeIntervalSinceReferenceDate]; + XCTAssertEqualWithAccuracy(archiveFileTimeInterval, expectedFileTimeInterval, 60, @"Incorrect file timestamp (more than 60 seconds off)"); + + // Test Uncompressed Size + NSError *attributesError = nil; + NSString *expectedFilePath = [[self urlOfTestFile:expectedFilename] path]; + NSDictionary *expectedFileAttributes = [fm attributesOfItemAtPath:expectedFilePath + error:&attributesError]; + XCTAssertNil(attributesError, @"Error getting file attributes of %@", expectedFilename); + + long long expectedFileSize = expectedFileAttributes.fileSize; + XCTAssertEqual(fileInfo.uncompressedSize, expectedFileSize, @"Incorrect uncompressed file size"); + + // Test Compression method + XCTAssertEqual(fileInfo.compressionMethod, URKCompressionMethodNormal, @"Incorrect compression method"); + + // Test Host OS + XCTAssertEqual(fileInfo.hostOS, URKHostOSUnix, @"Incorrect host OS"); + } +} + +- (void)testListFileInfo_Unicode +{ + NSSet *expectedFileSet = [self.unicodeFileURLs keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) { + return ![key hasSuffix:@"rar"] && ![key hasSuffix:@"md"]; + }]; + + NSArray *expectedFiles = [[expectedFileSet allObjects] sortedArrayUsingSelector:@selector(compare:)]; + + NSURL *testArchiveURL = self.unicodeFileURLs[@"Ⓣest Ⓐrchive.rar"]; + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL error:nil]; + + NSError *error = nil; + NSArray *filesInArchive = [archive listFileInfo:&error]; + + XCTAssertNil(error, @"Error returned by listFileInfo"); + XCTAssertNotNil(filesInArchive, @"No list of files returned"); + XCTAssertEqual(filesInArchive.count, expectedFileSet.count, + @"Incorrect number of files listed in archive"); + + for (NSInteger i = 0; i < filesInArchive.count; i++) { + URKFileInfo *fileInfo = (URKFileInfo *)filesInArchive[i]; + + XCTAssertEqualObjects(fileInfo.filename, expectedFiles[i], @"Incorrect filename listed"); + XCTAssertEqualObjects(fileInfo.archiveName, archive.filename, @"Incorrect archiveName listed"); + } +} + +#if !TARGET_OS_IPHONE +- (void)testListFileInfo_MultivolumeArchive { + NSArray *generatedVolumeURLs = [self multiPartArchiveWithName:@"ListFileInfoTests_MultivolumeArchive.rar"]; + URKArchive *archive = [[URKArchive alloc] initWithURL:generatedVolumeURLs.firstObject error:nil]; + + NSError *error = nil; + NSArray *files = [archive listFileInfo:&error]; + + XCTAssertNil(error, @"Error returned when listing file info for multivolume archive"); + XCTAssertEqual(files.count, 1, @"Incorrect number of file info items returned for multivolume archive"); +} +#endif + +- (void)testListFileInfo_HeaderPassword +{ + NSArray *testArchives = @[@"Test Archive (Header Password).rar"]; + + NSSet *expectedFileSet = [self.testFileURLs keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) { + return ![key hasSuffix:@"rar"] && ![key hasSuffix:@"md"]; + }]; + + NSArray *expectedFiles = [[expectedFileSet allObjects] sortedArrayUsingSelector:@selector(compare:)]; + + for (NSString *testArchiveName in testArchives) { + NSURL *testArchiveURL = self.testFileURLs[testArchiveName]; + + URKArchive *archiveNoPassword = [[URKArchive alloc] initWithURL:testArchiveURL error:nil]; + + NSError *error = nil; + NSArray *filesInArchive = [archiveNoPassword listFileInfo:&error]; + + XCTAssertNotNil(error, @"No error returned by listFileInfo (no password given)"); + XCTAssertNil(filesInArchive, @"List of files returned (no password given)"); + + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL password:@"password" error:nil]; + + filesInArchive = nil; + error = nil; + filesInArchive = [archive listFileInfo:&error]; + + XCTAssertNil(error, @"Error returned by listFileInfo"); + XCTAssertEqual(filesInArchive.count, expectedFileSet.count, + @"Incorrect number of files listed in archive"); + + for (NSInteger i = 0; i < filesInArchive.count; i++) { + URKFileInfo *archiveFileInfo = filesInArchive[i]; + NSString *archiveFilename = archiveFileInfo.filename; + NSString *expectedFilename = expectedFiles[i]; + + XCTAssertEqualObjects(archiveFilename, expectedFilename, @"Incorrect filename listed"); + } + } +} + +- (void)testListFileInfo_NoHeaderPasswordGiven { + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Test Archive (Header Password).rar"] error:nil]; + + NSError *error = nil; + NSArray *files = [archive listFileInfo:&error]; + + XCTAssertNotNil(error, @"List without password succeeded"); + XCTAssertNil(files, @"List returned without password"); + XCTAssertEqual(error.code, URKErrorCodeMissingPassword, @"Unexpected error code returned"); +} + +- (void)testListFileInfo_InvalidArchive +{ + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Test File A.txt"] error:nil]; + + NSError *error = nil; + NSArray *files = [archive listFileInfo:&error]; + + XCTAssertNotNil(error, @"List files of invalid archive succeeded"); + XCTAssertNil(files, @"List returned for invalid archive"); + XCTAssertEqual(error.code, URKErrorCodeBadArchive, @"Unexpected error code returned"); +} + +- (void)testListFileInfo_ModifiedCRC +{ + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Modified CRC Archive.rar"] error:nil]; + + NSError *error = nil; + NSArray *files = [archive listFileInfo:&error]; + + XCTAssertNotNil(error, @"List files of invalid archive succeeded"); + XCTAssertNil(files, @"List returned for invalid archive"); + XCTAssertEqual(error.code, URKErrorCodeBadData, @"Unexpected error code returned"); +} + +- (void)testListFileInfo_ModifiedCRC_IgnoringMismatches +{ + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Modified CRC Archive.rar"] error:nil]; + archive.ignoreCRCMismatches = YES; + + NSError *error = nil; + NSArray *files = [archive listFileInfo:&error]; + + XCTAssertNil(error, @"List files of invalid archive succeeded"); + XCTAssertNotNil(files, @"List returned for invalid archive"); + XCTAssertEqual(files.count, 1); + XCTAssertEqualObjects(files[0].filename, @"README.md"); +} + +@end diff --git a/Carthage/Checkouts/UnrarKit/Tests/PerformOnDataTests.m b/Carthage/Checkouts/UnrarKit/Tests/PerformOnDataTests.m new file mode 100644 index 0000000..72602d6 --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/Tests/PerformOnDataTests.m @@ -0,0 +1,261 @@ +// +// PerformOnDataTests.m +// UnrarKit +// +// + +#import "URKArchiveTestCase.h" + +@interface PerformOnDataTests : URKArchiveTestCase + +@end + +@implementation PerformOnDataTests + +- (void)testPerformOnData +{ + NSArray *testArchives = @[@"Test Archive.rar", + @"Test Archive (Password).rar", + @"Test Archive (Header Password).rar"]; + + NSSet *expectedFileSet = [self.testFileURLs keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) { + return ![key hasSuffix:@"rar"] && ![key hasSuffix:@"md"]; + }]; + + NSArray *expectedFiles = [[expectedFileSet allObjects] sortedArrayUsingSelector:@selector(compare:)]; + + for (NSString *testArchiveName in testArchives) { + NSURL *testArchiveURL = self.testFileURLs[testArchiveName]; + NSString *password = ([testArchiveName rangeOfString:@"Password"].location != NSNotFound + ? @"password" + : nil); + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL password:password error:nil]; + + __block NSUInteger fileIndex = 0; + NSError *error = nil; + + [archive performOnDataInArchive: + ^(URKFileInfo *fileInfo, NSData *fileData, BOOL *stop) { + NSString *expectedFilename = expectedFiles[fileIndex++]; + XCTAssertEqualObjects(fileInfo.filename, expectedFilename, @"Unexpected filename encountered"); + + NSData *expectedFileData = [NSData dataWithContentsOfURL:self.testFileURLs[expectedFilename]]; + + XCTAssertNotNil(fileData, @"No data extracted"); + XCTAssertTrue([expectedFileData isEqualToData:fileData], @"File data doesn't match original file"); + } error:&error]; + + XCTAssertNil(error, @"Error iterating through files"); + XCTAssertEqual(fileIndex, expectedFiles.count, @"Incorrect number of files encountered"); + } +} + +- (void)testPerformOnData_Unicode +{ + NSSet *expectedFileSet = [self.unicodeFileURLs keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) { + return ![key hasSuffix:@"rar"] && ![key hasSuffix:@"md"]; + }]; + + NSArray *expectedFiles = [[expectedFileSet allObjects] sortedArrayUsingSelector:@selector(compare:)]; + + NSURL *testArchiveURL = self.unicodeFileURLs[@"Ⓣest Ⓐrchive.rar"]; + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL error:nil]; + + __block NSUInteger fileIndex = 0; + NSError *error = nil; + + [archive performOnDataInArchive: + ^(URKFileInfo *fileInfo, NSData *fileData, BOOL *stop) { + NSString *expectedFilename = expectedFiles[fileIndex++]; + XCTAssertEqualObjects(fileInfo.filename, expectedFilename, @"Unexpected filename encountered"); + + NSData *expectedFileData = [NSData dataWithContentsOfURL:self.unicodeFileURLs[expectedFilename]]; + + XCTAssertNotNil(fileData, @"No data extracted"); + XCTAssertTrue([expectedFileData isEqualToData:fileData], @"File data doesn't match original file"); + } error:&error]; + + XCTAssertNil(error, @"Error iterating through files"); + XCTAssertEqual(fileIndex, expectedFiles.count, @"Incorrect number of files encountered"); +} + +- (void)testPerformOnData_ModifiedCRC +{ + NSURL *testArchiveURL = self.testFileURLs[@"Modified CRC Archive.rar"]; + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL error:nil]; + + __block BOOL blockCalled = NO; + NSError *error = nil; + + [archive performOnDataInArchive: + ^(URKFileInfo *fileInfo, NSData *fileData, BOOL *stop) { + blockCalled = YES; + } error:&error]; + + XCTAssertNotNil(error, @"Error iterating through files"); + XCTAssertFalse(blockCalled); +} + +- (void)testPerformOnData_ModifiedCRC_IgnoringMismatches +{ + NSURL *testArchiveURL = self.testFileURLs[@"Modified CRC Archive.rar"]; + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL error:nil]; + archive.ignoreCRCMismatches = YES; + + __block NSUInteger fileIndex = 0; + NSError *error = nil; + + [archive performOnDataInArchive: + ^(URKFileInfo *fileInfo, NSData *fileData, BOOL *stop) { + XCTAssertEqual(fileIndex++, 0, @"performOnDataInArchive called too many times"); + XCTAssertEqualObjects(fileInfo.filename, @"README.md"); + NSData *expectedFileData = [NSData dataWithContentsOfURL:self.testFileURLs[@"README.md"]]; + + XCTAssertNotNil(fileData, @"No data extracted"); + XCTAssertTrue([expectedFileData isEqualToData:fileData], @"File data doesn't match original file"); + } error:&error]; + + XCTAssertNil(error, @"Error iterating through files"); +} + +#if !TARGET_OS_IPHONE +- (void)testPerformOnData_FileMoved +{ + NSURL *largeArchiveURL = [self largeArchiveURL]; + + URKArchive *archive = [[URKArchive alloc] initWithURL:largeArchiveURL error:nil]; + + NSError *error = nil; + NSArray *archiveFiles = [archive listFilenames:&error]; + + XCTAssertNotNil(archiveFiles, @"No filenames listed from test archive"); + XCTAssertNil(error, @"Error listing files in test archive: %@", error); + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [NSThread sleepForTimeInterval:1]; + + NSURL *movedURL = [largeArchiveURL URLByAppendingPathExtension:@"FileMoved"]; + + NSError *renameError = nil; + NSFileManager *fm = [NSFileManager defaultManager]; + [fm moveItemAtURL:largeArchiveURL toURL:movedURL error:&renameError]; + XCTAssertNil(renameError, @"Error renaming file: %@", renameError); + }); + + __block NSUInteger fileCount = 0; + + error = nil; + BOOL success = [archive performOnDataInArchive:^(URKFileInfo *fileInfo, NSData *fileData, BOOL *stop) { + XCTAssertNotNil(fileData, @"Extracted file is nil: %@", fileInfo.filename); + + if (!fileInfo.isDirectory) { + fileCount++; + XCTAssertGreaterThan(fileData.length, 0, @"Extracted file is empty: %@", fileInfo.filename); + } + } error:&error]; + + XCTAssertEqual(fileCount, 20, @"Not all files read"); + XCTAssertTrue(success, @"Failed to read files"); + XCTAssertNil(error, @"Error reading files: %@", error); +} +#endif + +#if !TARGET_OS_IPHONE +- (void)testPerformOnData_FileDeleted +{ + NSURL *largeArchiveURL = [self largeArchiveURL]; + + URKArchive *archive = [[URKArchive alloc] initWithURL:largeArchiveURL error:nil]; + + NSError *error = nil; + NSArray *archiveFiles = [archive listFilenames:&error]; + + XCTAssertNotNil(archiveFiles, @"No filenames listed from test archive"); + XCTAssertNil(error, @"Error listing files in test archive: %@", error); + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [NSThread sleepForTimeInterval:1]; + + NSError *removeError = nil; + NSFileManager *fm = [NSFileManager defaultManager]; + [fm removeItemAtURL:largeArchiveURL error:&removeError]; + XCTAssertNil(removeError, @"Error removing file: %@", removeError); + }); + + __block NSUInteger fileCount = 0; + + error = nil; + BOOL success = [archive performOnDataInArchive:^(URKFileInfo *fileInfo, NSData *fileData, BOOL *stop) { + XCTAssertNotNil(fileData, @"Extracted file is nil: %@", fileInfo.filename); + + if (!fileInfo.isDirectory) { + fileCount++; + XCTAssertGreaterThan(fileData.length, 0, @"Extracted file is empty: %@", fileInfo.filename); + } + } error:&error]; + + XCTAssertEqual(fileCount, 20, @"Not all files read"); + XCTAssertTrue(success, @"Failed to read files"); + XCTAssertNil(error, @"Error reading files: %@", error); +} +#endif + +#if !TARGET_OS_IPHONE +- (void)testPerformOnData_FileMovedBeforeBegin +{ + NSURL *largeArchiveURL = [self largeArchiveURL]; + + URKArchive *archive = [[URKArchive alloc] initWithURL:largeArchiveURL error:nil]; + + NSError *error = nil; + NSArray *archiveFiles = [archive listFilenames:&error]; + + XCTAssertNotNil(archiveFiles, @"No filenames listed from test archive"); + XCTAssertNil(error, @"Error listing files in test archive: %@", error); + + NSURL *movedURL = [largeArchiveURL URLByAppendingPathExtension:@"FileMovedBeforeBegin"]; + + NSError *renameError = nil; + NSFileManager *fm = [NSFileManager defaultManager]; + [fm moveItemAtURL:largeArchiveURL toURL:movedURL error:&renameError]; + XCTAssertNil(renameError, @"Error renaming file: %@", renameError); + + __block NSUInteger fileCount = 0; + + error = nil; + BOOL success = [archive performOnDataInArchive:^(URKFileInfo *fileInfo, NSData *fileData, BOOL *stop) { + XCTAssertNotNil(fileData, @"Extracted file is nil: %@", fileInfo.filename); + + if (!fileInfo.isDirectory) { + fileCount++; + XCTAssertGreaterThan(fileData.length, 0, @"Extracted file is empty: %@", fileInfo.filename); + } + } error:&error]; + + XCTAssertEqual(fileCount, 20, @"Not all files read"); + XCTAssertTrue(success, @"Failed to read files"); + XCTAssertNil(error, @"Error reading files: %@", error); +} +#endif + +- (void)testPerformOnData_Folder +{ + NSURL *testArchiveURL = self.testFileURLs[@"Folder Archive.rar"]; + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL error:nil]; + + NSArray *expectedFiles = @[@"G070-Cliff", @"G070-Cliff/image.jpg"]; + + __block NSUInteger fileIndex = 0; + NSError *error = nil; + + [archive performOnDataInArchive: + ^(URKFileInfo *fileInfo, NSData *fileData, BOOL *stop) { + NSString *expectedFilename = expectedFiles[fileIndex++]; + XCTAssertEqualObjects(fileInfo.filename, expectedFilename, @"Unexpected filename encountered"); + } error:&error]; + + XCTAssertNil(error, @"Error iterating through files"); + XCTAssertEqual(fileIndex, expectedFiles.count, @"Incorrect number of files encountered"); +} + +@end diff --git a/Carthage/Checkouts/UnrarKit/Tests/PerformOnFilesTests.m b/Carthage/Checkouts/UnrarKit/Tests/PerformOnFilesTests.m new file mode 100644 index 0000000..898d878 --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/Tests/PerformOnFilesTests.m @@ -0,0 +1,194 @@ +// +// PerformOnFilesTests.m +// UnrarKit +// +// + +#import "URKArchiveTestCase.h" + +@interface PerformOnFilesTests : URKArchiveTestCase + +@end + +@implementation PerformOnFilesTests + +- (void)testPerformOnFiles +{ + NSArray *testArchives = @[@"Test Archive.rar", + @"Test Archive (Password).rar", + @"Test Archive (Header Password).rar"]; + + NSSet *expectedFileSet = [self.testFileURLs keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) { + return ![key hasSuffix:@"rar"] && ![key hasSuffix:@"md"]; + }]; + + NSArray *expectedFiles = [[expectedFileSet allObjects] sortedArrayUsingSelector:@selector(compare:)]; + + for (NSString *testArchiveName in testArchives) { + NSURL *testArchiveURL = self.testFileURLs[testArchiveName]; + NSString *password = ([testArchiveName rangeOfString:@"Password"].location != NSNotFound + ? @"password" + : nil); + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL password:password error:nil]; + + __block NSUInteger fileIndex = 0; + NSError *error = nil; + + [archive performOnFilesInArchive: + ^(URKFileInfo *fileInfo, BOOL *stop) { + NSString *expectedFilename = expectedFiles[fileIndex++]; + XCTAssertEqualObjects(fileInfo.filename, expectedFilename, @"Unexpected filename encountered"); + } error:&error]; + + XCTAssertNil(error, @"Error iterating through files"); + XCTAssertEqual(fileIndex, expectedFiles.count, @"Incorrect number of files encountered"); + } +} + +- (void)testPerformOnFiles_ModifiedCRC +{ + NSURL *testArchiveURL = self.testFileURLs[@"Modified CRC Archive.rar"]; + NSString *password = nil; + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL password:password error:nil]; + + __block BOOL blockCalled = NO; + NSError *error = nil; + + [archive performOnFilesInArchive: + ^(URKFileInfo *fileInfo, BOOL *stop) { + blockCalled = YES; + } error:&error]; + + XCTAssertNotNil(error, @"Error iterating through files"); + XCTAssertFalse(blockCalled); +} + +- (void)testPerformOnFiles_ModifiedCRC_MismatchesIgnored +{ + NSURL *testArchiveURL = self.testFileURLs[@"Modified CRC Archive.rar"]; + NSString *password = nil; + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL password:password error:nil]; + archive.ignoreCRCMismatches = YES; + + __block NSUInteger fileIndex = 0; + NSError *error = nil; + + [archive performOnFilesInArchive: + ^(URKFileInfo *fileInfo, BOOL *stop) { + XCTAssertEqual(fileIndex++, 0, @"performOnFilesInArchive called too many times"); + XCTAssertEqualObjects(fileInfo.filename, @"README.md"); + } error:&error]; + + XCTAssertNil(error, @"Error iterating through files"); +} + +- (void)testPerformOnFiles_Unicode +{ + NSSet *expectedFileSet = [self.unicodeFileURLs keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) { + return ![key hasSuffix:@"rar"] && ![key hasSuffix:@"md"]; + }]; + + NSArray *expectedFiles = [[expectedFileSet allObjects] sortedArrayUsingSelector:@selector(compare:)]; + + NSURL *testArchiveURL = self.unicodeFileURLs[@"Ⓣest Ⓐrchive.rar"]; + URKArchive *archive = [[URKArchive alloc] initWithURL:testArchiveURL error:nil]; + + __block NSUInteger fileIndex = 0; + NSError *error = nil; + + [archive performOnFilesInArchive: + ^(URKFileInfo *fileInfo, BOOL *stop) { + NSString *expectedFilename = expectedFiles[fileIndex++]; + XCTAssertEqualObjects(fileInfo.filename, expectedFilename, @"Unexpected filename encountered"); + } error:&error]; + + XCTAssertNil(error, @"Error iterating through files"); + XCTAssertEqual(fileIndex, expectedFiles.count, @"Incorrect number of files encountered"); +} + +- (void)testPerformOnFiles_Nested_ExtractData +{ + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Test Archive.rar"] + password:@"" + error:nil]; + + NSError *archiveError = nil; + + [archive performOnFilesInArchive:^(URKFileInfo *fileInfo, BOOL *stop) { + NSError *extractError = nil; + NSData *data = [archive extractData:fileInfo error:&extractError]; + + if (data == nil) { + *stop = YES; + XCTFail(); + } + } error:&archiveError]; +} + +- (void)testPerformOnFiles_Nested_ExtractFiles +{ + URKArchive *archive = [[URKArchive alloc] initWithURL:self.testFileURLs[@"Test Archive.rar"] + password:@"" + error:nil]; + + NSError *archiveError = nil; + + [archive performOnFilesInArchive:^(URKFileInfo *fileInfo, BOOL *stop) { +#if !TARGET_OS_IPHONE + NSURL *extractRootDirectory = self.tempDirectory; +#else + NSFileManager *fm = [NSFileManager defaultManager]; + NSURL *extractRootDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory + inDomains:NSUserDomainMask] firstObject]; + extractRootDirectory = [extractRootDirectory URLByAppendingPathComponent:@"testPerformOnFiles_Nested_ExtractFiles"]; + NSLog(@"Documents directory: %@", extractRootDirectory.path); + + if ([fm fileExistsAtPath:extractRootDirectory.path]) { + NSError *clearDirError = nil; + XCTAssertTrue([fm removeItemAtURL:extractRootDirectory error:&clearDirError], @"Failed to clear out documents directory"); + XCTAssertNil(clearDirError, @"Error while clearing out documents directory"); + } + +#endif + NSError *extractError = nil; + BOOL success = [archive extractFilesTo:extractRootDirectory.path + overwrite:NO + error:&extractError]; + XCTAssertTrue(success); + + } error:&archiveError]; +} + +#if !TARGET_OS_IPHONE +- (void)testPerformOnFiles_Ordering +{ + NSArray *testFilenames = @[@"AAA.txt", + @"BBB.txt", + @"CCC.txt"]; + + NSFileManager *fm = [NSFileManager defaultManager]; + + NSMutableArray *testFileURLs = [NSMutableArray array]; + + // Touch test files + [testFilenames enumerateObjectsUsingBlock:^(NSString *filename, NSUInteger idx, BOOL *stop) { + NSURL *outputURL = [self.tempDirectory URLByAppendingPathComponent:filename]; + XCTAssertTrue([fm createFileAtPath:outputURL.path contents:nil attributes:nil], @"Failed to create test file: %@", filename); + [testFileURLs addObject:outputURL]; + }]; + + // Create RAR archive with test files, reversed + NSURL *reversedArchiveURL = [self archiveWithFiles:testFileURLs.reverseObjectEnumerator.allObjects]; + + NSError *error = nil; + __block NSUInteger index = 0; + + URKArchive *archive = [[URKArchive alloc] initWithURL:reversedArchiveURL error:nil]; + [archive performOnFilesInArchive:^(URKFileInfo *fileInfo, BOOL *stop) { + NSString *expectedFilename = testFilenames[index++]; + XCTAssertEqualObjects(fileInfo.filename, expectedFilename, @"Archive files not iterated through in correct order"); + } error:&error]; +} +#endif + +@end diff --git a/Carthage/Checkouts/UnrarKit/Tests/Test Data/README.md b/Carthage/Checkouts/UnrarKit/Tests/Test Data/README.md new file mode 100644 index 0000000..b5b5e87 --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/Tests/Test Data/README.md @@ -0,0 +1,275 @@ +[![Build Status](https://travis-ci.org/abbeycode/UnrarKit.svg?branch=master)](https://travis-ci.org/abbeycode/UnrarKit) +[![Documentation Coverage](https://img.shields.io/cocoapods/metrics/doc-percent/UnrarKit.svg)](http://cocoadocs.org/docsets/UnrarKit) + +# About + +UnrarKit is here to enable Mac and iOS apps to easily work with RAR files for read-only operations. It is currently based on version 5.2.1 of the [UnRAR library](http://www.rarlab.com/rar/unrarsrc-5.2.1.tar.gz). + +There is a main project, with unit tests, and a basic iOS example project, which demonstrates how to use the library. To see all of these, open the main workspace file. + +I'm always open to improvements, so please submit your pull requests, or [create issues](https://github.com/abbeycode/UnrarKit/issues) for someone else to implement. + + +# Installation + +UnrarKit supports both [CocoaPods](https://cocoapods.org/) and [Carthage](https://github.com/Carthage/Carthage). CocoaPods does not support dynamic framework targets (as of v0.39.0), so in that case, please use Carthage. + +Cartfile: + + github "abbeycode/UnrarKit" + +Podfile: + + pod "UnrarKit" + +# Example Usage + +```Objective-C +NSError *archiveError = nil; +URKArchive *archive = [[URKArchive alloc] initWithPath:@"An Archive.rar" error:&archiveError]; +NSError *error = nil; +``` + +## Listing the file names in an archive +```Objective-C +NSArray *filesInArchive = [archive listFilenames:&error]; +for (NSString *name in filesInArchive) { + NSLog(@"Archived file: %@", name); +} +``` + +## Listing the file details in an archive +```Objective-C +NSArray *fileInfosInArchive = [archive listFileInfo:&error]; +for (URKFileInfo *info in fileInfosInArchive) { + NSLog(@"Archive name: %@ | File name: %@ | Size: %lld", info.archiveName, info.filename, info.uncompressedSize); +} +``` + +## Working with passwords +```Objective-C +NSArray *fileInfosInArchive = [archive listFileInfo:&error]; +if (archive.isPasswordProtected) { + NSString *givenPassword = // prompt user + archive.password = givenPassword +} + +// You can now extract the files +``` + +## Extracting files to a directory +```Objective-C +BOOL extractFilesSuccessful = [archive extractFilesTo:@"some/directory" + overWrite:NO + progress: + ^(URKFileInfo *currentFile, CGFloat percentArchiveDecompressed) { + NSLog(@"Extracting %@: %f%% complete", currentFile.filename, percentArchiveDecompressed); + } + error:&error]; +``` + +## Extracting a file into memory +```Objective-C +NSData *extractedData = [archive extractDataFromFile:@"a file in the archive.jpg" + progress:^(CGFloat percentDecompressed) { + NSLog(@"Extracting, %f%% complete", percentDecompressed); + } + error:&error]; +``` + +## Streaming a file + +For large files, you may not want the whole contents in memory at once. You can handle it one "chunk" at a time, like so: + +```Objective-C +BOOL success = [archive extractBufferedDataFromFile:@"a file in the archive.jpg" + error:&error + action: + ^(NSData *dataChunk, CGFloat percentDecompressed) { + NSLog(@"Decompressed: %f%%", percentDecompressed); + // Do something with the NSData chunk + }]; +``` + +# Progress Reporting + +The following methods support `NSProgress` and `NSProgressReporting`: + +* `extractFilesTo:overwrite:error:` +* `extractData:error:` +* `extractDataFromFile:error:` +* `performOnFilesInArchive:error:` +* `performOnDataInArchive:error:` +* `extractBufferedDataFromFile:error:action:` + +## Using implicit `NSProgress` hierarchy + +You can create your own instance of `NSProgress` and observe its `fractionCompleted` property with KVO to monitor progress like so: + +```Objective-C + static void *ExtractDataContext = &ExtractDataContext; + + URKArchive *archive = [[URKArchive alloc] initWithURL:aFileURL error:nil]; + + NSProgress *extractDataProgress = [NSProgress progressWithTotalUnitCount:1]; + [extractDataProgress becomeCurrentWithPendingUnitCount:1]; + + NSString *observedSelector = NSStringFromSelector(@selector(fractionCompleted)); + + [extractDataProgress addObserver:self + forKeyPath:observedSelector + options:NSKeyValueObservingOptionInitial + context:ExtractDataContext]; + + NSError *extractError = nil; + NSData *data = [archive extractDataFromFile:firstFile error:&extractError]; + + [extractDataProgress resignCurrent]; + [extractDataProgress removeObserver:self forKeyPath:observedSelector]; +``` + +## Using your own explicit `NSProgress` instance + +If you don't have a hierarchy of `NSProgress` instances, or if you want to observe more details during progress updates in `extractFilesTo:overwrite:error:`, you can create your own instance of `NSProgress` and set the `URKArchive` instance's `progress` property, like so: + +```Objective-C + static void *ExtractFilesContext = &ExtractFilesContext; + + URKArchive *archive = [[URKArchive alloc] initWithURL:aFileURL error:nil]; + + NSProgress *extractFilesProgress = [NSProgress progressWithTotalUnitCount:1]; + archive.progress = extractFilesProgress; + + NSString *observedSelector = NSStringFromSelector(@selector(localizedDescription)); + + [self.descriptionsReported removeAllObjects]; + [extractFilesProgress addObserver:self + forKeyPath:observedSelector + options:NSKeyValueObservingOptionInitial + context:ExtractFilesContext]; + + NSError *extractError = nil; + BOOL success = [archive extractFilesTo:extractURL.path + overwrite:NO + error:&extractError]; + + [extractFilesProgress removeObserver:self forKeyPath:observedSelector]; +``` + +## Cancellation with `NSProgress` + +Using either method above, you can call `[progress cancel]` to stop the operation in progress. It will cause the operation to fail, returning `nil` or `NO` (depending on the return type, and give an error with error code `URKErrorCodeUserCancelled`. + + +# Notes + +To open in Xcode, use the [UnrarKit.xcworkspace](UnrarKit.xcworkspace) file, which includes the other projects. + +# Documentation + +Full documentation for the project is available on [CocoaDocs](http://cocoadocs.org/docsets/UnrarKit). + + +# Logging + +For all OS versions from 2016 onward (macOS 10.12, iOS 10, tvOS 10, watchOS 3), UnzipKit uses the new [Unified Logging framework](https://developer.apple.com/documentation/os/logging) for logging and Activity Tracing. You can view messages at the Info or Debug level to view more details of how UnzipKit is working, and use Activity Tracing to help pinpoint the code path that's causing a particular error. + +As a fallback, regular `NSLog` is used on older OSes, with all messages logged at the same level. + +When debugging your own code, if you'd like to decrease the verbosity of the UnrarKit framework, you can run the following command: + + sudo log config --mode "level:default" --subsystem com.abbey-code.UnrarKit + +The available levels, in order of increasing verbosity, are `default`, `info`, `debug`, with `debug` being the default. + +## Logging guidelines + +These are the general rules governing the particulars of how activities and log messages are classified and written. They were written after the initial round of log messages were, so there may be some inconsistencies (such as an incorrect log level). If you think you spot one, open an issue or a pull request! + +### Logging + +Log messages should follow these conventions. + +1. Log messages don't have final punctuation (like these list items) +1. Messages that note a C function is about to be called, rather than a higher level UnrarKit or Cocoa method, end with "...", since it's not expected for them to log any details of their own + +#### Default log level + +There should be no messages at this level, so that it's possible for a consumer of the API to turn off _all_ diagnostic logging from it, as detailed above. It's only possible to `log config --mode "level:off"` for a process, not a subsystem. + +#### Info log level + +Info level log statements serve the following specific purposes. + +1. Major action is taken, such as initializing an archive object, or deleting a file from an archive +1. Noting each public method has been called, and the arguments with which it was called +1. Signposting the major actions a public method takes +1. Notifying that an atypical condition has occurred (such as an action causing an early stop in a block or a NO return value) +1. Noting that a loop is about to occur, which will contain debug-level messages for each iteration + +#### Debug log level + +Most messages fall into this category, making it extremely verbose. All non-error messages that don't fall into either of the other two categories should be debug-level, with some examples of specific cases below. + +1. Any log message in a private method +1. Noting variable and argument values in a method +1. Indicating that everything is working as expected +1. Indicating what happens during each iteration of a loop (or documenting that an iteration has happened at all) + +#### Error log level + +1. Every `NSError` generated should get logged with the same detail message as the `NSError` object itself +1. `NSError` log messages should contain the string of the error code's enumeration value (e.g. `"URKErrorCodeArchiveNotFound"`) when it is known at design time +1. Errors should reported everywhere they're encountered, making it easier to trace their flows through the call stack +1. Early exits that result in desired work not being performed + +#### Fault log level + +So far, there is only one case that gets logged at Fault-level: when a Cocoa framework methods that come back with an error + +### Activities +1. Public methods have an English activity names with spaces, and are title-case +1. Private methods each have an activity with the method's name +1. Sub-activities are created for significant scope changes, such as when inside an action block, but not if no significant work is done before entering that action +1. Top-level activities within a method have variables named `activity`, with more specific labels given to sub-activities +1. If a method is strictly an overload that calls out to another overload without doing anything else, it should not define its own activity + +# Pushing a new CocoaPods version + +New tagged builds (in any branch) get pushed to CocoaPods automatically, provided they meet the following criteria: + +1. All builds and tests succeed +2. The library builds successfully for CocoaPods and for Carthage +3. The build is tagged with something resembling a version number (`#.#.#(-beta#)`, e.g. **2.9** or **2.9-beta5**) +4. `pod spec lint` passes, making sure the CocoaPod is 100% valid + +Before pushing a build, you must: + +1. Add the release notes to the [CHANGELOG.md](CHANGELOG.md), and commit +2. Run [set-version](Scripts/set-version.sh), like so: + + `./Scripts/set-version.sh ` + + This does the following: + + 1. Updates the [UnrarKit-Info.plist](Resources/UnrarKit-Info.plist) file to indicate the new version number, and commits it + + 2. Makes an annotated tag whose message contains the release notes entered in Step 1 + +Once that's done, you can call `git push --follow-tags` [1](#f1), and let [Travis CI](https://travis-ci.org/abbeycode/UnrarKit/builds) take care of the rest. + +# Credits + +* Dov Frankel (dov@abbey-code.com) +* Rogerio Pereira Araujo (rogerio.araujo@gmail.com) +* Vicent Scott (vkan388@gmail.com) + + + +
+ +1: Or set `followTags = true` in your git config to always get this behavior: + + git config --global push.followTags true + +[↩](#a1) \ No newline at end of file diff --git a/Carthage/Checkouts/UnrarKit/Tests/Test Data/bin/license.txt b/Carthage/Checkouts/UnrarKit/Tests/Test Data/bin/license.txt new file mode 100644 index 0000000..82af4af --- /dev/null +++ b/Carthage/Checkouts/UnrarKit/Tests/Test Data/bin/license.txt @@ -0,0 +1,127 @@ + END USER LICENSE AGREEMENT + + The following agreement regarding RAR (and its Windows version - WinRAR) + archiver - referred to as "software" - is made between win.rar GmbH - + referred to as "licensor" - and anyone who is installing, accessing + or in any other way using the software - referred to as "user". + + 1. The author and holder of the copyright of the software is + Alexander L. Roshal. The licensor and as such issuer of the license + and bearer of the worldwide exclusive usage rights including the rights + to reproduce, distribute and make the software available to the public + in any form is win.rar GmbH, Marienstr. 12, 10117 Berlin, Germany. + + 2. The software is distributed as try before you buy. This means that + anyone may use the software during a test period of a maximum of 40 days + at no charge. Following this test period, the user must purchase + a license to continue using the software. + + 3. The software's trial version may be freely distributed, with exceptions + noted below, provided the distribution package is not modified in any way. + + a. Nobody may distribute separate parts of the package, with the exception + of the UnRAR components, without written permission. + + b. The software's unlicensed trial version may not be distributed + inside of any other software package without written permission. + The software must remain in the original unmodified installation + file for download without any barrier and conditions to the user + such as collecting fees for the download or making the download + conditional on the user giving his contact data. + + c. The unmodified installation file of WinRAR must be provided pure + and unpaired. Any bundling is interdicted. In particular the use + of any install or download software which is providing any kind + of download bundles is prohibited unless granted by win.rar GmbH + in written form. + + d. Hacks/cracks, keys or key generators may not be included, pointed to + or referred to by the distributor of the trial version. + + e. In case of violation of the precedent conditions the allowance + lapses immediately and automatically. + + 4. The trial version of the software can display a registration reminder + dialog. Depending on the software version and configuration such dialog + can contain either a predefined text and links loaded locally + or a web page loaded from the internet. Such web page can contain + licensing instructions or other materials according to the licensor's + choice, including advertisement. When opening a web page, the software + transfers only those parameters which are technically required + by HTTP protocol to successfully open a web page in a browser. + + 5. The software is distributed "as is". No warranty of any kind is expressed + or implied. You use at your own risk. Neither the author, the licensor + nor the agents of the licensor will be liable for data loss, damages, + loss of profits or any other kind of loss while using or misusing + this software. + + 6. There are 2 basic types of licenses issued for the software. These are: + + a. A single computer usage license. The user purchases one license to + use the software on one computer. + + Home users may use their single computer usage license on all + computers and mobile devices (USB drive, external hard drive, etc.) + which are property of the license owner. + + Business users require one license per computer or mobile device + on which the software is installed. + + b. A multiple usage license. The user purchases a number of usage + licenses for use, by the purchaser or the purchaser's employees + on the same number of computers. + + In a network (server/client) environment the user must purchase + a license copy for each separate client (workstation) on which + the software is installed, used or accessed. A separate license copy + for each client (workstation) is needed regardless of whether + the clients (workstations) will use the software simultaneously + or at different times. If for example you wish to have 9 different + clients (workstations) in your network with access to RAR, + you must purchase 9 license copies. + + A user who purchased a license, is granted a non-exclusive right to use + the software on as many computers as defined by the licensing terms above + according to the number of licenses purchased, for any legal purpose. + + 7. There are no additional license fees, apart from the cost of the license, + associated with the creation and distribution of RAR archives, + volumes, self-extracting archives or self-extracting volumes. + Owners of a license may use their copies of the software to produce + archives and self-extracting archives and to distribute those archives + free of any additional royalties. + + 8. The licensed software may not be rented or leased but may be permanently + transferred, in its entirety, if the recipient agrees to the terms of + this license. + + 9. To buy a license, please read the file order.htm provided with + the software for details. + + 10. You may not use, copy, emulate, clone, rent, lease, sell, modify, + decompile, disassemble, otherwise reverse engineer, or transfer + the licensed software, or any subset of the licensed software, + except as provided for in this agreement. Any such unauthorized use + shall result in immediate and automatic termination of this license + and may result in criminal and/or civil prosecution. + + Neither RAR binary code, WinRAR binary code, UnRAR source + or UnRAR binary code may be used or reverse engineered to re-create + the RAR compression algorithm, which is proprietary, without written + permission. + + The software may be using components developed and/or copyrighted + by third parties. Please read "Acknowledgments" help file topic + for WinRAR or acknow.txt text file for other RAR versions for details. + + 11. This License Agreement is construed solely and exclusively under + German law. If you are a merchant, the courts at the registered office + of win.rar GmbH in Berlin/Germany shall have exclusive jurisdiction + for any and all disputes arising in connection with this License + Agreement or its validity. + + 12. Installing and using the software signifies acceptance of these terms + and conditions of the license. If you do not agree with the terms of this + license, you must remove all software files from your storage devices + and cease to use the software. diff --git a/Carthage/Checkouts/UnrarKit/Tests/Test Data/⚠️Folder Archive 🤬⚠️.rar b/Carthage/Checkouts/UnrarKit/Tests/Test Data/⚠️Folder Archive 🤬⚠️.rar new file mode 100644 index 0000000..0e62e60 Binary files /dev/null and b/Carthage/Checkouts/UnrarKit/Tests/Test Data/⚠️Folder Archive 🤬⚠️.rar differ