├── .allstar └── binary_artifacts.yaml ├── .clang-format ├── .gitignore ├── AUTHORS ├── CONTRIBUTING.md ├── CONTRIBUTORS ├── INSTALL.md ├── LICENSE ├── Makefile ├── README.md ├── TODO.md ├── fuse-archive.1 ├── fuse-archive.cc └── test ├── data ├── 65536-files.zip ├── README.md ├── archive.7z ├── archive.ar ├── archive.cab ├── archive.iso ├── archive.iso9660 ├── archive.password-is-asdf.zip ├── archive.rar ├── archive.tar ├── archive.tar.Z ├── archive.tar.b64 ├── archive.tar.br ├── archive.tar.bz2 ├── archive.tar.gz ├── archive.tar.gz.uu ├── archive.tar.lrz ├── archive.tar.lz ├── archive.tar.lz4 ├── archive.tar.lzma ├── archive.tar.lzo ├── archive.tar.uu ├── archive.tar.xz ├── archive.tar.zst ├── archive.taz ├── archive.tb2 ├── archive.tbr ├── archive.tbz ├── archive.tbz2 ├── archive.tgz ├── archive.tlz ├── archive.tlz4 ├── archive.tlzip ├── archive.tlzma ├── archive.txz ├── archive.tz ├── archive.tz2 ├── archive.tzs ├── archive.tzst ├── archive.tzstd ├── archive.zip ├── archive.zip.gz ├── archive.zip.rar ├── as-i-was-going-to-st-ives.tar.bz2 ├── compressed.tar ├── data_descriptor.zip ├── different-encryptions.zip ├── dot-slash-foo.tar ├── empty ├── empty.gz ├── empty.tar ├── empty.tar.gz ├── empty.tgz ├── encrypted-solidly.7z ├── encrypted.7z ├── hardlinks.tgz ├── lz_is_lzip.tlz ├── lz_is_lzma.tlz ├── mixed-paths.zip ├── permissions.tgz ├── romeo.bzip2.zip ├── romeo.lzma.zip ├── romeo.txt ├── romeo.txt.Z ├── romeo.txt.b64 ├── romeo.txt.base64 ├── romeo.txt.br ├── romeo.txt.brotli ├── romeo.txt.bz2 ├── romeo.txt.bzip2 ├── romeo.txt.gz ├── romeo.txt.gz.uu ├── romeo.txt.gzip ├── romeo.txt.lrz ├── romeo.txt.lrzip ├── romeo.txt.lz ├── romeo.txt.lz4 ├── romeo.txt.lzip ├── romeo.txt.lzma ├── romeo.txt.lzo ├── romeo.txt.lzop ├── romeo.txt.uu ├── romeo.txt.xz ├── romeo.txt.zst ├── romeo.txt.zstd ├── romeo.xz.zip ├── sparse.tar.gz ├── specials.tar.gz ├── test.csv.gz ├── truncated.7z └── zeroes-256mib.tar.gz ├── make_big_zip.py ├── make_collisions.py └── test.py /.allstar/binary_artifacts.yaml: -------------------------------------------------------------------------------- 1 | # test/data/archive.iso is test data, not a binary to be executed. This program 2 | # (fuse-archive) is specifically about being able to read ISO files (amongst 3 | # other archive file formats, like 7z, RAR, ZIP, etc). 4 | ignorePaths: 5 | - test/data/archive.iso 6 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: Chromium 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | out 3 | test/data/big.zip 4 | test/data/collisions.zip 5 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | # This is the official list of Fuse-Archive authors for copyright purposes. 2 | # This file is distinct from the CONTRIBUTORS files. 3 | # See the latter for an explanation. 4 | 5 | # Names should be added to this file as one of 6 | # Organization's name 7 | # Individual's name 8 | # Individual's name 9 | # See CONTRIBUTORS for the meaning of multiple email addresses. 10 | 11 | # Please keep the list sorted. 12 | 13 | Google Inc. 14 | Vassili Tchersky 15 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to Contribute 2 | 3 | We'd love to accept your patches and contributions to this project. There are 4 | just a few small guidelines you need to follow. 5 | 6 | ## Contributor License Agreement 7 | 8 | Contributions to this project must be accompanied by a Contributor License 9 | Agreement. You (or your employer) retain the copyright to your contribution; 10 | this simply gives us permission to use and redistribute your contributions as 11 | part of the project. Head over to to see 12 | your current agreements on file or to sign a new one. 13 | 14 | You generally only need to submit a CLA once, so if you've already submitted one 15 | (even if it was for a different project), you probably don't need to do it 16 | again. 17 | 18 | ## Code Reviews 19 | 20 | All submissions, including submissions by project members, require review. We 21 | use GitHub pull requests for this purpose. Consult 22 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more 23 | information on using pull requests. 24 | 25 | ## Community Guidelines 26 | 27 | This project follows [Google's Open Source Community 28 | Guidelines](https://opensource.google/conduct/). 29 | -------------------------------------------------------------------------------- /CONTRIBUTORS: -------------------------------------------------------------------------------- 1 | # This is the official list of people who can contribute 2 | # (and typically have contributed) code to the Fuse-Archive repository. 3 | # The AUTHORS file lists the copyright holders; this file 4 | # lists people. For example, Google employees are listed here 5 | # but not in AUTHORS, because Google holds the copyright. 6 | # 7 | # The submission process automatically checks to make sure 8 | # that people submitting code are listed in this file (by email address). 9 | # 10 | # Names should be added to this file only after verifying that 11 | # the individual or the individual's organization has agreed to 12 | # the appropriate Contributor License Agreement, found here: 13 | # 14 | # http://code.google.com/legal/individual-cla-v1.0.html 15 | # http://code.google.com/legal/corporate-cla-v1.0.html 16 | # 17 | # The agreement for individuals can be filled out on the web. 18 | # 19 | # When adding J Random Contributor's name to this file, 20 | # either J's name or J's organization's name should be 21 | # added to the AUTHORS file, depending on whether the 22 | # individual or corporate CLA was used. 23 | 24 | # Names should be added to this file like so: 25 | # Individual's name 26 | # Individual's name 27 | # 28 | # An entry with multiple email addresses specifies that the 29 | # first address should be used in the submit logs and 30 | # that the other addresses should be recognized as the 31 | # same person when interacting with Gerrit. 32 | 33 | # Please keep the list sorted. 34 | 35 | François Degros 36 | Nigel Tao 37 | Vassili Tchersky 38 | -------------------------------------------------------------------------------- /INSTALL.md: -------------------------------------------------------------------------------- 1 | # How to Build 2 | 3 | ## Prerequisites 4 | 5 | To build **fuse-archive**, you need the following libraries: 6 | 7 | * [Boost Intrusive](https://www.boost.org) 8 | * [libfuse >= 3.1](https://github.com/libfuse/libfuse) 9 | * [libarchive >= 3.7](https://libarchive.org) 10 | 11 | On Debian systems, you can get these libraries by installing the following 12 | packages: 13 | 14 | ```sh 15 | $ sudo apt install libboost-container-dev libfuse3-dev libarchive-dev 16 | ``` 17 | 18 | For compatibility reasons, **fuse-archive** can optionally use the old FUSE 2 19 | library [libfuse >= 2.9](https://github.com/libfuse/libfuse). On Debian systems, 20 | you can install FUSE 2 by installing the following package: 21 | 22 | ```sh 23 | $ sudo apt install libfuse-dev 24 | ``` 25 | 26 | To build **fuse-archive**, you also need the following tools: 27 | 28 | * C++20 compiler (g++ or clang++) 29 | * [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/) 30 | * [GNU make](https://www.gnu.org/software/make/) 31 | * [Pandoc](https://pandoc.org) to regenerate the man page 32 | 33 | On Debian systems, you can get these tools by installing the following packages: 34 | 35 | ```sh 36 | $ sudo apt install g++ pkg-config make pandoc 37 | ``` 38 | 39 | To test **fuse-archive**, you also need the following tools: 40 | 41 | * [Python 3](https://www.python.org) 42 | * base64 43 | * [brotli](https://github.com/google/brotli) 44 | * [compress](https://en.wikipedia.org/wiki/Compress_(software)) 45 | * [lrzip](https://github.com/ckolivas/lrzip) 46 | * [lzop](https://www.lzop.org/) 47 | 48 | On Debian systems, you can get these tools by installing the following packages: 49 | 50 | ```sh 51 | $ sudo apt install python3 brotli coreutils lrzip lzop ncompress 52 | ``` 53 | 54 | ## Get the Source Code 55 | 56 | ```sh 57 | $ git clone https://github.com/google/fuse-archive.git 58 | $ cd fuse-archive 59 | ``` 60 | 61 | ## Build **fuse-archive** 62 | 63 | ```sh 64 | $ make 65 | ``` 66 | 67 | ### With debugging assertions 68 | 69 | ```sh 70 | $ DEBUG=1 make 71 | ``` 72 | 73 | ### With FUSE 2 74 | 75 | ```sh 76 | $ FUSE_MAJOR_VERSION=2 make 77 | ``` 78 | 79 | ## Test **fuse-archive** 80 | 81 | ```sh 82 | $ make check 83 | ``` 84 | 85 | ## Install **fuse-archive**: 86 | 87 | ```sh 88 | $ sudo make install 89 | ``` 90 | 91 | ## Uninstall **fuse-archive**: 92 | 93 | ```sh 94 | $ sudo make uninstall 95 | ``` 96 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PROJECT = fuse-archive 2 | PKG_CONFIG ?= pkg-config 3 | 4 | FUSE_MAJOR_VERSION ?= 3 5 | 6 | ifeq ($(FUSE_MAJOR_VERSION), 3) 7 | DEPS = fuse3 8 | CXXFLAGS += -DFUSE_USE_VERSION=30 9 | else ifeq ($(FUSE_MAJOR_VERSION), 2) 10 | DEPS = fuse 11 | CXXFLAGS += -DFUSE_USE_VERSION=26 12 | endif 13 | 14 | DEPS += libarchive 15 | 16 | CXXFLAGS += $(shell $(PKG_CONFIG) --cflags $(DEPS)) 17 | LDFLAGS += $(shell $(PKG_CONFIG) --libs $(DEPS)) 18 | CXXFLAGS += -std=c++20 -Wall -Wextra -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter 19 | CXXFLAGS += -D_FILE_OFFSET_BITS=64 20 | 21 | ifeq ($(DEBUG), 1) 22 | CXXFLAGS += -O0 -g 23 | else 24 | CXXFLAGS += -O2 -DNDEBUG 25 | endif 26 | 27 | PREFIX = $(DESTDIR)/usr 28 | BINDIR = $(PREFIX)/bin 29 | MAN = $(PROJECT).1 30 | MANDIR = $(PREFIX)/share/man/man1 31 | INSTALL = install 32 | 33 | 34 | all: out/$(PROJECT) 35 | 36 | check: out/$(PROJECT) test/data/big.zip test/data/collisions.zip 37 | python3 test/test.py 38 | 39 | clean: 40 | rm -rf out 41 | 42 | doc: $(MAN) 43 | man -l $(MAN) 44 | 45 | $(MAN): README.md 46 | pandoc $< -s -t man -o $@ 47 | 48 | install: out/$(PROJECT) 49 | $(INSTALL) -D "out/$(PROJECT)" "$(BINDIR)/$(PROJECT)" 50 | $(INSTALL) -D -m 644 $(MAN) "$(MANDIR)/$(MAN)" 51 | 52 | install-strip: out/$(PROJECT) 53 | $(INSTALL) -D -s "out/$(PROJECT)" "$(BINDIR)/$(PROJECT)" 54 | $(INSTALL) -D -m 644 $(MAN) "$(MANDIR)/$(MAN)" 55 | 56 | uninstall: 57 | rm "$(BINDIR)/$(PROJECT)" "$(MANDIR)/$(MAN)" 58 | 59 | out/$(PROJECT): $(PROJECT).cc 60 | mkdir -p out 61 | $(CXX) $(CPPFLAGS) $(CXXFLAGS) $< $(LDFLAGS) -o $@ 62 | 63 | test/data/big.zip: test/make_big_zip.py 64 | python3 test/make_big_zip.py 65 | 66 | test/data/collisions.zip: test/make_collisions.py 67 | python3 test/make_collisions.py 68 | 69 | .PHONY: all check clean doc install uninstall 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: fuse-archive 3 | section: 1 4 | header: User Manual 5 | footer: fuse-archive 1.13 6 | date: April 2025 7 | --- 8 | 9 | # NAME 10 | 11 | **fuse-archive** - Mount an archive or compressed file as a FUSE file system. 12 | 13 | # SYNOPSIS 14 | 15 | **fuse-archive** [*options*] *archive-file* [*mount-point*] 16 | 17 | # DESCRIPTION 18 | 19 | **fuse-archive** is a program that serves an archive or compressed file (e.g. 20 | `foo.tar`, `foo.tar.gz`, `foo.xz` or `foo.zip`) as a read-only 21 | [FUSE](https://en.wikipedia.org/wiki/Filesystem_in_Userspace) file system. 22 | 23 | It is similar to [**mount-zip**](https://github.com/google/mount-zip) and 24 | [**fuse-zip**](https://bitbucket.org/agalanin/fuse-zip) but speaks a larger 25 | range of archive or compressed file formats. 26 | 27 | It is similar to [**archivemount**](https://github.com/cybernoid/archivemount) 28 | but can be much faster (see the Performance section below) although it can only 29 | mount read-only, not read-write. 30 | 31 | # OPTIONS 32 | 33 | **-\-help** or **-h** 34 | : Print help 35 | 36 | **-\-version** or **-V** 37 | : Print version 38 | 39 | **-o quiet** or **-q** 40 | : Print fewer log messages 41 | 42 | **-o verbose** or **-v** 43 | : Print more log messages 44 | 45 | **-o redact** 46 | : Redact file names from log messages 47 | 48 | **-o force** 49 | : Continue despite errors 50 | 51 | **-o lazycache** 52 | : Incremental caching of uncompressed data 53 | 54 | **-o nocache** 55 | : No caching of uncompressed data 56 | 57 | **-o nospecials** 58 | : Hide special files (FIFOs, sockets, devices) 59 | 60 | **-o nosymlinks** 61 | : Hide symbolic links 62 | 63 | **-o nohardlinks** 64 | : No files with multiple hard links 65 | 66 | **-o dmask=M** 67 | : Directory permission mask in octal (default 0022) 68 | 69 | **-o fmask=M** 70 | : File permission mask in octal (default 0022) 71 | 72 | **-o uid=N** 73 | : Set the file owner of all the items in the mounted archive (default is 74 | current user) 75 | 76 | **-o gid=N** 77 | : Set file group of all the items in the mounted archive (default is current 78 | group) 79 | 80 | **-o default_permissions** 81 | : Use the file owner (UID), group (GID) and permissions stored with each item 82 | in the archive. 83 | 84 | **-f** 85 | : Foreground mode 86 | 87 | **-d** 88 | : Foreground mode with debug output 89 | 90 | # ARCHIVE FORMATS 91 | 92 | **fuse-archive** determines the archive format from its filename extension. It 93 | recognizes the following extensions: 94 | 95 | * Archive formats `7z`, `7zip`, `a`, `ar`, `cab`, `cpio`, `deb`, `iso`, 96 | `iso9660`, `jar`, `mtree`, `rar`, `rpm`, `tar`, `warc`, `xar`, `zip`, `zipx` 97 | * ZIP-based file formats `crx`, `odf`, `odg`, `odp`, `ods`, `odt`, `docx`, 98 | `ppsx`, `pptx`, `xlsx` 99 | * Compressed TARs `tb2`, `tbz`, `tbz2`, `tz2`, `tgz`, `tlz`, `tlz4`, `tlzma`, 100 | `txz`, `tz`, `taz`, `tzs`, `tzst`, `tzstd`, `tar.br`, `tar.brotli`, 101 | `tar.bz2`, `tar.bzip2`, `tar.grz`, `tar.grzip`, `tar.gz`, `tar.gzip`, 102 | `tar.lha`, `tar.lrz`, `tar.lrzip`, `tar.lz`, `tar.lz4`, `tar.lzip`, 103 | `tar.lzma`, `tar.lzo`, `tar.lzop`, `tar.xz`, `tar.z`, `tar.zst`, `tar.zstd` 104 | * Compression filters `br`, `brotli`, `bz2`, `bzip2`, `grz`, `grzip`, `gz`, 105 | `gzip`, `lha`, `lrz`, `lrzip`, `lz`, `lz4`, `lzip`, `lzma`, `lzo`, `lzop`, 106 | `xz`, `z`, `zst`, `zstd` 107 | * ASCII encoding filters `b64`, `base64`, `uu` 108 | 109 | If the filename extension is not recognized, then **fuse-archive** determines 110 | the archive format by looking at its byte contents. This heuristic works all 111 | right most of the time, but there are corner cases for which it might get 112 | confused. 113 | 114 | **fuse-archive** relies on the availability of the following filter programs: 115 | `base64`, `brotli`, `compress`, `lrzip` and `lzop`. 116 | 117 | # CACHING 118 | 119 | By default, **fuse-archive** decompresses and caches the whole archive before 120 | serving its contents. This ensures that the served files can be accessed in any 121 | order without any performance issue. 122 | 123 | Decompressed data is cached in an anonymous file created in the `tmp` directory 124 | (`$TMPDIR` or `/tmp` by default). This cache can use a significant amount of 125 | disk space, but it is automatically deleted when the archive is unmounted. 126 | 127 | If there is not enough temporary space to cache the whole archive, 128 | **fuse-archive** can be run with the `-o nocache` or the `-o lazycache` options. 129 | However, this can cause **fuse-archive** to be much slower at serving files. 130 | 131 | # PERFORMANCE 132 | 133 | Create a single `.tar.gz` file that is 256 MiB decompressed and 255 KiB 134 | compressed (the file just contains repeated 0x00 NUL bytes): 135 | 136 | ``` 137 | $ truncate --size=256M zeroes 138 | $ tar cfz zeroes-256mib.tar.gz zeroes 139 | ``` 140 | 141 | Here are **fuse-archive**'s timings: 142 | 143 | ``` 144 | $ time fuse-archive zeroes-256mib.tar.gz mnt 145 | real 0m0.443s 146 | 147 | $ dd if=mnt/zeroes of=/dev/null status=progress 148 | 268435456 bytes (268 MB, 256 MiB) copied, 0.836048 s, 321 MB/s 149 | 150 | $ fusermount -u mnt 151 | ``` 152 | 153 | For comparison, here are **archivemount**'s timings: 154 | 155 | ``` 156 | $ time archivemount zeroes-256mib.tar.gz mnt 157 | real 0m0.581s 158 | 159 | $ dd if=mnt/zeroes of=/dev/null status=progress 160 | 268435456 bytes (268 MB, 256 MiB) copied, 570.146 s, 471 kB/s 161 | 162 | $ fusermount -u mnt 163 | ``` 164 | 165 | In this case, **fuse-archive** takes about the same time to load the archive as 166 | **archivemount**, but it is **~700× faster** (0.83s vs 570s) to copy out the 167 | decompressed contents. This is because **fuse-archive** fully caches the archive 168 | and does not use **archivemount**'s 169 | [quadratic complexity algorithm](https://github.com/cybernoid/archivemount/issues/21). 170 | 171 | # RETURN VALUE 172 | 173 | **0** 174 | : Success. 175 | 176 | **1** 177 | : Generic error code for: missing command line argument, too many command line 178 | arguments, unknown option, mount point is not empty, etc. 179 | 180 | **10** 181 | : Cannot create the mount point. 182 | 183 | **11** 184 | : Cannot open the archive file. 185 | 186 | **12** 187 | : Cannot create the cache file. 188 | 189 | **13** 190 | : Cannot write to the cache file. This is most likely the indication that 191 | there is not enough temp space. 192 | 193 | **20** 194 | : The archive contains an encrypted file, but no password was provided. 195 | 196 | **21** 197 | : The archive contains an encrypted file, and the provided password does not 198 | decrypt it. 199 | 200 | **22** 201 | : The archive contains an encrypted file, and the encryption method is not 202 | supported. 203 | 204 | **30** 205 | : Cannot recognize the archive format. 206 | 207 | **31** 208 | : Invalid archive header. 209 | 210 | **32** 211 | : Cannot read and extract the archive. 212 | 213 | # SEE ALSO 214 | 215 | archivemount(1), mount-zip(1), fuse-zip(1), fusermount(1), fuse(8), umount(8) 216 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | # Improvement Ideas 2 | 3 | - [x] Automatically create the mount point if it does not already exist. 4 | - [x] Automatically remove the mount point if it has been created by `fuse-archive` in the first place. 5 | - [x] Handle special files (sockets, FIFOs or pipes, character and block devices). 6 | - [x] Add a `-o nospecials` option. 7 | - [x] Handle symlinks. 8 | - [x] Add a `-o nosymlinks` option. 9 | - [x] Handle empty directories (https://github.com/google/fuse-archive/issues/17). 10 | - [x] Improve the computation of the access bits of each inode. 11 | - [x] Gracefully handle file name collisions by deduplicating the colliding names. 12 | - [x] Add a convenient logging system. 13 | - [x] Add a `--verbose` option. 14 | - [x] Keep track of the number of links to each inode. 15 | - [x] Keep track of the number of blocks used by each inode. 16 | - [x] Implement the `statfs` function. 17 | - [x] Print versions of linked libraries when using the `--version` option. 18 | - [x] Add a cache system holding the full extracted data. 19 | - [x] Add a `-o nocache` option. 20 | - [x] Remove unused options. 21 | - [x] Automatically request a decryption password when dealing with an encrypted archive. 22 | - [x] Add comprehensive tests. 23 | - [x] Document the version numbering system. 24 | - [x] Create a `man` page. 25 | - [x] Modify the `Makefile` so that `make doc` refreshes the `man` page. 26 | - [x] Modify the `Makefile` so that `make install` also installs the `man` page (https://github.com/google/fuse-archive/issues/24). 27 | - [x] Add a `-o fmask` option. 28 | - [x] Add a `-o dmask` option. 29 | - [x] Honor the original UID and GID when using the `-o default_permissions` option. 30 | - [x] Modify the `Makefile` so that `make check` runs the new tests in `test/test.py`. 31 | - [x] Handle hardlinks (https://github.com/google/fuse-archive/issues/18). 32 | - [x] Add tests for hardlinks. 33 | - [x] Add tests for big files. 34 | - [x] Document the `-o nocache` option. 35 | - [x] Document the `-o nosymlink` option. 36 | - [x] Document the `-o nospecials` option. 37 | - [x] Document the returned error values. 38 | - [x] Document the `-o dmask=M` option. 39 | - [x] Document the `-o fmask=M` option. 40 | - [x] Document the `-o uid=N` option. 41 | - [x] Document the `-o gid=N` option. 42 | - [x] Document the `-o default_permissions` option. 43 | - [x] Add a `-o force` option. 44 | - [x] Add tests for the `lzma` compression method. 45 | - [x] Add tests for the `xz` compression method. 46 | - [x] Add tests for the `zstd` compression method. 47 | - [x] Add tests for the `Z` compression method. 48 | - [x] Add a `-o nohardlink` option. 49 | - [x] Optimize the tree structure in order to avoid storing all the full paths in memory. 50 | - [x] Optimize the `Reader` struct in order to reuse the existing archive file descriptor instead of opening a new one every time. 51 | - [x] Check the archive file type to avoid reading from a pipe or a directory. 52 | - [x] Document the cache system. 53 | - [x] Optimize the `Reader` recycling system. 54 | - [x] Use a `Reader` when building the tree. 55 | - [x] Add a rolling buffer of uncompressed data to each `Reader`. 56 | -------------------------------------------------------------------------------- /fuse-archive.1: -------------------------------------------------------------------------------- 1 | .\" Automatically generated by Pandoc 2.17.1.1 2 | .\" 3 | .\" Define V font for inline verbatim, using C font in formats 4 | .\" that render this, and otherwise B font. 5 | .ie "\f[CB]x\f[]"x" \{\ 6 | . ftr V B 7 | . ftr VI BI 8 | . ftr VB B 9 | . ftr VBI BI 10 | .\} 11 | .el \{\ 12 | . ftr V CR 13 | . ftr VI CI 14 | . ftr VB CB 15 | . ftr VBI CBI 16 | .\} 17 | .TH "fuse-archive" "1" "April 2025" "fuse-archive 1.13" "User Manual" 18 | .hy 19 | .SH NAME 20 | .PP 21 | \f[B]fuse-archive\f[R] - Mount an archive or compressed file as a FUSE 22 | file system. 23 | .SH SYNOPSIS 24 | .PP 25 | \f[B]fuse-archive\f[R] [\f[I]options\f[R]] \f[I]archive-file\f[R] 26 | [\f[I]mount-point\f[R]] 27 | .SH DESCRIPTION 28 | .PP 29 | \f[B]fuse-archive\f[R] is a program that serves an archive or compressed 30 | file (e.g. 31 | \f[V]foo.tar\f[R], \f[V]foo.tar.gz\f[R], \f[V]foo.xz\f[R] or 32 | \f[V]foo.zip\f[R]) as a read-only 33 | FUSE (https://en.wikipedia.org/wiki/Filesystem_in_Userspace) file 34 | system. 35 | .PP 36 | It is similar to 37 | \f[B]mount-zip\f[R] (https://github.com/google/mount-zip) and 38 | \f[B]fuse-zip\f[R] (https://bitbucket.org/agalanin/fuse-zip) but speaks 39 | a larger range of archive or compressed file formats. 40 | .PP 41 | It is similar to 42 | \f[B]archivemount\f[R] (https://github.com/cybernoid/archivemount) but 43 | can be much faster (see the Performance section below) although it can 44 | only mount read-only, not read-write. 45 | .SH OPTIONS 46 | .TP 47 | \f[B]--help\f[R] or \f[B]-h\f[R] 48 | Print help 49 | .TP 50 | \f[B]--version\f[R] or \f[B]-V\f[R] 51 | Print version 52 | .TP 53 | \f[B]-o quiet\f[R] or \f[B]-q\f[R] 54 | Print fewer log messages 55 | .TP 56 | \f[B]-o verbose\f[R] or \f[B]-v\f[R] 57 | Print more log messages 58 | .TP 59 | \f[B]-o redact\f[R] 60 | Redact file names from log messages 61 | .TP 62 | \f[B]-o force\f[R] 63 | Continue despite errors 64 | .TP 65 | \f[B]-o lazycache\f[R] 66 | Incremental caching of uncompressed data 67 | .TP 68 | \f[B]-o nocache\f[R] 69 | No caching of uncompressed data 70 | .TP 71 | \f[B]-o nospecials\f[R] 72 | Hide special files (FIFOs, sockets, devices) 73 | .TP 74 | \f[B]-o nosymlinks\f[R] 75 | Hide symbolic links 76 | .TP 77 | \f[B]-o nohardlinks\f[R] 78 | No files with multiple hard links 79 | .TP 80 | \f[B]-o dmask=M\f[R] 81 | Directory permission mask in octal (default 0022) 82 | .TP 83 | \f[B]-o fmask=M\f[R] 84 | File permission mask in octal (default 0022) 85 | .TP 86 | \f[B]-o uid=N\f[R] 87 | Set the file owner of all the items in the mounted archive (default is 88 | current user) 89 | .TP 90 | \f[B]-o gid=N\f[R] 91 | Set file group of all the items in the mounted archive (default is 92 | current group) 93 | .TP 94 | \f[B]-o default_permissions\f[R] 95 | Use the file owner (UID), group (GID) and permissions stored with each 96 | item in the archive. 97 | .TP 98 | \f[B]-f\f[R] 99 | Foreground mode 100 | .TP 101 | \f[B]-d\f[R] 102 | Foreground mode with debug output 103 | .SH ARCHIVE FORMATS 104 | .PP 105 | \f[B]fuse-archive\f[R] determines the archive format from its filename 106 | extension. 107 | It recognizes the following extensions: 108 | .IP \[bu] 2 109 | Archive formats \f[V]7z\f[R], \f[V]7zip\f[R], \f[V]a\f[R], \f[V]ar\f[R], 110 | \f[V]cab\f[R], \f[V]cpio\f[R], \f[V]deb\f[R], \f[V]iso\f[R], 111 | \f[V]iso9660\f[R], \f[V]jar\f[R], \f[V]mtree\f[R], \f[V]rar\f[R], 112 | \f[V]rpm\f[R], \f[V]tar\f[R], \f[V]warc\f[R], \f[V]xar\f[R], 113 | \f[V]zip\f[R], \f[V]zipx\f[R] 114 | .IP \[bu] 2 115 | ZIP-based file formats \f[V]crx\f[R], \f[V]odf\f[R], \f[V]odg\f[R], 116 | \f[V]odp\f[R], \f[V]ods\f[R], \f[V]odt\f[R], \f[V]docx\f[R], 117 | \f[V]ppsx\f[R], \f[V]pptx\f[R], \f[V]xlsx\f[R] 118 | .IP \[bu] 2 119 | Compressed TARs \f[V]tb2\f[R], \f[V]tbz\f[R], \f[V]tbz2\f[R], 120 | \f[V]tz2\f[R], \f[V]tgz\f[R], \f[V]tlz\f[R], \f[V]tlz4\f[R], 121 | \f[V]tlzma\f[R], \f[V]txz\f[R], \f[V]tz\f[R], \f[V]taz\f[R], 122 | \f[V]tzs\f[R], \f[V]tzst\f[R], \f[V]tzstd\f[R], \f[V]tar.br\f[R], 123 | \f[V]tar.brotli\f[R], \f[V]tar.bz2\f[R], \f[V]tar.bzip2\f[R], 124 | \f[V]tar.grz\f[R], \f[V]tar.grzip\f[R], \f[V]tar.gz\f[R], 125 | \f[V]tar.gzip\f[R], \f[V]tar.lha\f[R], \f[V]tar.lrz\f[R], 126 | \f[V]tar.lrzip\f[R], \f[V]tar.lz\f[R], \f[V]tar.lz4\f[R], 127 | \f[V]tar.lzip\f[R], \f[V]tar.lzma\f[R], \f[V]tar.lzo\f[R], 128 | \f[V]tar.lzop\f[R], \f[V]tar.xz\f[R], \f[V]tar.z\f[R], 129 | \f[V]tar.zst\f[R], \f[V]tar.zstd\f[R] 130 | .IP \[bu] 2 131 | Compression filters \f[V]br\f[R], \f[V]brotli\f[R], \f[V]bz2\f[R], 132 | \f[V]bzip2\f[R], \f[V]grz\f[R], \f[V]grzip\f[R], \f[V]gz\f[R], 133 | \f[V]gzip\f[R], \f[V]lha\f[R], \f[V]lrz\f[R], \f[V]lrzip\f[R], 134 | \f[V]lz\f[R], \f[V]lz4\f[R], \f[V]lzip\f[R], \f[V]lzma\f[R], 135 | \f[V]lzo\f[R], \f[V]lzop\f[R], \f[V]xz\f[R], \f[V]z\f[R], \f[V]zst\f[R], 136 | \f[V]zstd\f[R] 137 | .IP \[bu] 2 138 | ASCII encoding filters \f[V]b64\f[R], \f[V]base64\f[R], \f[V]uu\f[R] 139 | .PP 140 | If the filename extension is not recognized, then \f[B]fuse-archive\f[R] 141 | determines the archive format by looking at its byte contents. 142 | This heuristic works all right most of the time, but there are corner 143 | cases for which it might get confused. 144 | .PP 145 | \f[B]fuse-archive\f[R] relies on the availability of the following 146 | filter programs: \f[V]base64\f[R], \f[V]brotli\f[R], \f[V]compress\f[R], 147 | \f[V]lrzip\f[R] and \f[V]lzop\f[R]. 148 | .SH CACHING 149 | .PP 150 | By default, \f[B]fuse-archive\f[R] decompresses and caches the whole 151 | archive before serving its contents. 152 | This ensures that the served files can be accessed in any order without 153 | any performance issue. 154 | .PP 155 | Decompressed data is cached in an anonymous file created in the 156 | \f[V]tmp\f[R] directory (\f[V]$TMPDIR\f[R] or \f[V]/tmp\f[R] by 157 | default). 158 | This cache can use a significant amount of disk space, but it is 159 | automatically deleted when the archive is unmounted. 160 | .PP 161 | If there is not enough temporary space to cache the whole archive, 162 | \f[B]fuse-archive\f[R] can be run with the \f[V]-o nocache\f[R] or the 163 | \f[V]-o lazycache\f[R] options. 164 | However, this can cause \f[B]fuse-archive\f[R] to be much slower at 165 | serving files. 166 | .SH PERFORMANCE 167 | .PP 168 | Create a single \f[V].tar.gz\f[R] file that is 256 MiB decompressed and 169 | 255 KiB compressed (the file just contains repeated 0x00 NUL bytes): 170 | .IP 171 | .nf 172 | \f[C] 173 | $ truncate --size=256M zeroes 174 | $ tar cfz zeroes-256mib.tar.gz zeroes 175 | \f[R] 176 | .fi 177 | .PP 178 | Here are \f[B]fuse-archive\f[R]\[cq]s timings: 179 | .IP 180 | .nf 181 | \f[C] 182 | $ time fuse-archive zeroes-256mib.tar.gz mnt 183 | real 0m0.443s 184 | 185 | $ dd if=mnt/zeroes of=/dev/null status=progress 186 | 268435456 bytes (268 MB, 256 MiB) copied, 0.836048 s, 321 MB/s 187 | 188 | $ fusermount -u mnt 189 | \f[R] 190 | .fi 191 | .PP 192 | For comparison, here are \f[B]archivemount\f[R]\[cq]s timings: 193 | .IP 194 | .nf 195 | \f[C] 196 | $ time archivemount zeroes-256mib.tar.gz mnt 197 | real 0m0.581s 198 | 199 | $ dd if=mnt/zeroes of=/dev/null status=progress 200 | 268435456 bytes (268 MB, 256 MiB) copied, 570.146 s, 471 kB/s 201 | 202 | $ fusermount -u mnt 203 | \f[R] 204 | .fi 205 | .PP 206 | In this case, \f[B]fuse-archive\f[R] takes about the same time to load 207 | the archive as \f[B]archivemount\f[R], but it is \f[B]\[ti]700\[tmu] 208 | faster\f[R] (0.83s vs 570s) to copy out the decompressed contents. 209 | This is because \f[B]fuse-archive\f[R] fully caches the archive and does 210 | not use \f[B]archivemount\f[R]\[cq]s quadratic complexity 211 | algorithm (https://github.com/cybernoid/archivemount/issues/21). 212 | .SH RETURN VALUE 213 | .TP 214 | \f[B]0\f[R] 215 | Success. 216 | .TP 217 | \f[B]1\f[R] 218 | Generic error code for: missing command line argument, too many command 219 | line arguments, unknown option, mount point is not empty, etc. 220 | .TP 221 | \f[B]10\f[R] 222 | Cannot create the mount point. 223 | .TP 224 | \f[B]11\f[R] 225 | Cannot open the archive file. 226 | .TP 227 | \f[B]12\f[R] 228 | Cannot create the cache file. 229 | .TP 230 | \f[B]13\f[R] 231 | Cannot write to the cache file. 232 | This is most likely the indication that there is not enough temp space. 233 | .TP 234 | \f[B]20\f[R] 235 | The archive contains an encrypted file, but no password was provided. 236 | .TP 237 | \f[B]21\f[R] 238 | The archive contains an encrypted file, and the provided password does 239 | not decrypt it. 240 | .TP 241 | \f[B]22\f[R] 242 | The archive contains an encrypted file, and the encryption method is not 243 | supported. 244 | .TP 245 | \f[B]30\f[R] 246 | Cannot recognize the archive format. 247 | .TP 248 | \f[B]31\f[R] 249 | Invalid archive header. 250 | .TP 251 | \f[B]32\f[R] 252 | Cannot read and extract the archive. 253 | .SH SEE ALSO 254 | .PP 255 | archivemount(1), mount-zip(1), fuse-zip(1), fusermount(1), fuse(8), 256 | umount(8) 257 | -------------------------------------------------------------------------------- /test/data/65536-files.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/65536-files.zip -------------------------------------------------------------------------------- /test/data/README.md: -------------------------------------------------------------------------------- 1 | `archive.*` was copied from the github.com/google/wuffs test/data directory, 2 | released under the same Apache 2 license. 3 | 4 | `as-i-was-going-to-st-ives.tar.bz2` is an archive containing a rich directory 5 | tree (but the 2401 leaves are empty files) inspired by the traditional rhyme: 6 | 7 | As I was going to St Ives, 8 | I met a man with seven wives, 9 | Each wife had seven sacks, 10 | Each sack had seven cats, 11 | Each cat had seven kits: 12 | Kits, cats, sacks, and wives, 13 | How many were there going to St Ives? 14 | 15 | It was created by: 16 | 17 | for w in {1..7}; do 18 | for s in {1..7}; do 19 | for c in {1..7}; do 20 | mkdir -p m/w$w/s$s/c$c; 21 | for k in {1..7}; do 22 | touch m/w$w/s$s/c$c/k$k; 23 | done 24 | done 25 | done 26 | done 27 | tar cvjf as-i-was-going-to-st-ives.tar.bz2 m 28 | 29 | `dot-slash-foo` was created by: 30 | 31 | touch foo 32 | tar cf dot-slash-foo.tar ./foo 33 | 34 | `romeo.txt` is an excerpt of Shakespeare's "Romeo and Juliet", copied from 35 | [shakespeare.mit.edu](http://shakespeare.mit.edu/romeo_juliet/romeo_juliet.2.2.html). 36 | 37 | `zeroes-256mib.tar.gz` was created by: 38 | 39 | truncate --size=256M zeroes 40 | tar cfz zeroes-256mib.tar.gz zeroes 41 | -------------------------------------------------------------------------------- /test/data/archive.7z: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.7z -------------------------------------------------------------------------------- /test/data/archive.ar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.ar -------------------------------------------------------------------------------- /test/data/archive.cab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.cab -------------------------------------------------------------------------------- /test/data/archive.iso: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.iso -------------------------------------------------------------------------------- /test/data/archive.iso9660: -------------------------------------------------------------------------------- 1 | archive.iso -------------------------------------------------------------------------------- /test/data/archive.password-is-asdf.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.password-is-asdf.zip -------------------------------------------------------------------------------- /test/data/archive.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.rar -------------------------------------------------------------------------------- /test/data/archive.tar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar -------------------------------------------------------------------------------- /test/data/archive.tar.Z: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar.Z -------------------------------------------------------------------------------- /test/data/archive.tar.b64: -------------------------------------------------------------------------------- 1 | YXJ0aWZpY2lhbC8wLmJ5dGVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1 3 | MAAwMDAxNzUwADAwMDAwMDAwMDAwADEzNjE2NDU2MTIwADAxMjIxMgAgMAAAAAAAAAAAAAAAAAAA 4 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 5 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG50AAAAAAAAAAAAAAAAAAAAAAAA 6 | AAAAAAAAAAAAAAAAbnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 7 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 8 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 9 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn 10 | aXRodWItdGFncy5qc29uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 11 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUw 12 | ADAwMDE3NTAAMDAwMDAwMDE1MjUAMTM3MTQ3NzMzNDYAMDEyMDM1ACAwAAAAAAAAAAAAAAAAAAAA 13 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 14 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAbnQAAAAAAAAAAAAAAAAAAAAAAAAA 15 | AAAAAAAAAAAAAABudAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 16 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 17 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 18 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFsK 19 | ICB7CiAgICAibmFtZSI6ICJ2MC4yLjAiLAogICAgInppcGJhbGxfdXJsIjogImh0dHBzOi8vYXBp 20 | LmdpdGh1Yi5jb20vcmVwb3MvZ29vZ2xlL3d1ZmZzL3ppcGJhbGwvdjAuMi4wIiwKICAgICJ0YXJi 21 | YWxsX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2dvb2dsZS93dWZmcy90YXJi 22 | YWxsL3YwLjIuMCIsCiAgICAiY29tbWl0IjogewogICAgICAic2hhIjogImZiNjAwZmUzY2U1ZTE2 23 | MTkzNjg0OTE0OGFhNGQzYWQ4MmRmYzU3NDMiLAogICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdp 24 | dGh1Yi5jb20vcmVwb3MvZ29vZ2xlL3d1ZmZzL2NvbW1pdHMvZmI2MDBmZTNjZTVlMTYxOTM2ODQ5 25 | MTQ4YWE0ZDNhZDgyZGZjNTc0MyIKICAgIH0sCiAgICAibm9kZV9pZCI6ICJNRE02VW1WbU1URXdO 26 | RGd5TWpZM09uWXdMakl1TUE9PSIKICB9LAogIHsKICAgICJuYW1lIjogInYwLjEuMCIsCiAgICAi 27 | emlwYmFsbF91cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9nb29nbGUvd3VmZnMv 28 | emlwYmFsbC92MC4xLjAiLAogICAgInRhcmJhbGxfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5j 29 | b20vcmVwb3MvZ29vZ2xlL3d1ZmZzL3RhcmJhbGwvdjAuMS4wIiwKICAgICJjb21taXQiOiB7CiAg 30 | ICAgICJzaGEiOiAiZjYwNDE5NGJhNGQ3Zjk3MjExMDViNmVjMzI4NDIyYjVmOThmZThiZCIsCiAg 31 | ICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9nb29nbGUvd3VmZnMvY29t 32 | bWl0cy9mNjA0MTk0YmE0ZDdmOTcyMTEwNWI2ZWMzMjg0MjJiNWY5OGZlOGJkIgogICAgfSwKICAg 33 | ICJub2RlX2lkIjogIk1ETTZVbVZtTVRFd05EZ3lNalkzT25Zd0xqRXVNQT09IgogIH0KXQoAAAAA 34 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 35 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 36 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoZWxs 37 | by5zaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 38 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDc1NQAwMDAxNzUwADAw 39 | MDE3NTAAMDAwMDAwMDEyNjUAMTQwNDM3MTMwMTMAMDEwMzQ0ACAwAAAAAAAAAAAAAAAAAAAAAAAA 40 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 41 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAbnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 42 | AAAAAAAAAABudAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 43 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 44 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 45 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMhL2Jp 46 | bi9iYXNoIC1ldQojIENvcHlyaWdodCAyMDIxIFRoZSBXdWZmcyBBdXRob3JzLgojCiMgTGljZW5z 47 | ZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7 48 | CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRo 49 | ZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMg 50 | ICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNz 51 | IHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0 52 | d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFu 53 | ICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5Z 54 | IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0 55 | aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRp 56 | b25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKIyAtLS0tLS0tLS0tLS0tLS0tCgojIFRoaXMgZmlsZSBz 57 | aG91bGQgaGF2ZSB0aGUgImV4ZWN1dGFibGUiIFVuaXggcGVybWlzc2lvbiBiaXQuCgplY2hvIGhl 58 | bGxvCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 59 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 60 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 61 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 62 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 63 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABub24tYXNj 64 | aWkvzrHOsi50eHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 65 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3 66 | NTAAMDAwMDAwMDAxNTAAMTQwNDM3MTI1MTUAMDEyNzc3ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA 67 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 68 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAbnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 69 | AAAAAABudAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 70 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 71 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 72 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM6xIFUrMDNC 73 | MSBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEuIFVURi04OiBbQzMgQjFdLgrOsiBVKzAzQjIgR1JF 74 | RUsgU01BTEwgTEVUVEVSIEJFVEEuICBVVEYtODogW0MzIEIyXS4KAAAAAAAAAAAAAAAAAAAAAAAA 75 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 76 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 77 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 78 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 79 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 80 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 81 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbm9uLWFzY2lp 82 | L/CfmLsudHh0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 83 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAwMDAxNzUw 84 | ADAwMDAwMDAwMjI3ADE0MDQzNzEzMzA3ADAxMjc0NwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 85 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 86 | AAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 87 | AAAAbnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 88 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 89 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 90 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwn5i7IFUrMUY2 91 | M0IgU01JTElORyBDQVQgRkFDRSBXSVRIIEhFQVJULVNIQVBFRCBFWUVTLiBVVEYtODogW0YwIDlG 92 | IDk4IEJCXS4KClRoaXMgY29kZSBwb2ludCBpcyBvdXRzaWRlIG9mIHRoZSBVbmljb2RlIEJNUCAo 93 | QmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lKS4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 94 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 95 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 96 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 97 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 98 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 99 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBqdy10aHVtYm5h 100 | aWwucG5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 101 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAAMDAwMTc1MAAw 102 | MDAwMDAwMDMyMAAxMzYxNjQ1NjEyMAAwMTIxNzAAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 103 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 104 | AAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABudAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 105 | AG50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 106 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 107 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 108 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiVBORw0KGgoAAAAN 109 | SUhEUgAAACAAAAAgAQMAAABJtOi3AAAABlBMVEUAAAD///+l2Z/dAAAAhUlEQVQI1yXNvQ3CMBQE 110 | 4EMpXBok+rRsYSpmYQtexxKRwghsgEtKNsBUICpHqaL8HGfxik/3dMWBOjDVIjpxWYkbTiCt/rMw 111 | egyqRXLomD26Vm/6wiMaHOJBKY17jxePHv17GzC3FjDmtZh2YkHAYGKmWuaNhhorQ2elZ9m9Fu6V 112 | eBQ+FX+M6VDHMHw5bwAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 113 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 114 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 115 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 116 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 117 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByb21lby50eHQAAAAA 118 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 119 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAw 120 | MDAwMDE2NTYAMTM2MTY0NTYxMjAAMDEwNjAwACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 121 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 122 | AAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAbnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABu 123 | dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 124 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 125 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 126 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJvbWVvIGFuZCBKdWxp 127 | ZXQKRXhjZXJwdCBmcm9tIEFjdCAyLCBTY2VuZSAyCgpKVUxJRVQKTyBSb21lbywgUm9tZW8hIHdo 128 | ZXJlZm9yZSBhcnQgdGhvdSBSb21lbz8KRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5h 129 | bWU7Ck9yLCBpZiB0aG91IHdpbHQgbm90LCBiZSBidXQgc3dvcm4gbXkgbG92ZSwKQW5kIEknbGwg 130 | bm8gbG9uZ2VyIGJlIGEgQ2FwdWxldC4KClJPTUVPCltBc2lkZV0gU2hhbGwgSSBoZWFyIG1vcmUs 131 | IG9yIHNoYWxsIEkgc3BlYWsgYXQgdGhpcz8KCkpVTElFVAonVGlzIGJ1dCB0aHkgbmFtZSB0aGF0 132 | IGlzIG15IGVuZW15OwpUaG91IGFydCB0aHlzZWxmLCB0aG91Z2ggbm90IGEgTW9udGFndWUuCldo 133 | YXQncyBNb250YWd1ZT8gaXQgaXMgbm9yIGhhbmQsIG5vciBmb290LApOb3IgYXJtLCBub3IgZmFj 134 | ZSwgbm9yIGFueSBvdGhlciBwYXJ0CkJlbG9uZ2luZyB0byBhIG1hbi4gTywgYmUgc29tZSBvdGhl 135 | ciBuYW1lIQpXaGF0J3MgaW4gYSBuYW1lPyB0aGF0IHdoaWNoIHdlIGNhbGwgYSByb3NlCkJ5IGFu 136 | eSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwpTbyBSb21lbyB3b3VsZCwgd2VyZSBo 137 | ZSBub3QgUm9tZW8gY2FsbCdkLApSZXRhaW4gdGhhdCBkZWFyIHBlcmZlY3Rpb24gd2hpY2ggaGUg 138 | b3dlcwpXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLApBbmQgZm9yIHRo 139 | YXQgbmFtZSB3aGljaCBpcyBubyBwYXJ0IG9mIHRoZWUKVGFrZSBhbGwgbXlzZWxmLgoKUk9NRU8K 140 | SSB0YWtlIHRoZWUgYXQgdGh5IHdvcmQ6CkNhbGwgbWUgYnV0IGxvdmUsIGFuZCBJJ2xsIGJlIG5l 141 | dyBiYXB0aXplZDsKSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKV2hh 142 | dCBtYW4gYXJ0IHRob3UgdGhhdCB0aHVzIGJlc2NyZWVuJ2QgaW4gbmlnaHQKU28gc3R1bWJsZXN0 143 | IG9uIG15IGNvdW5zZWw/CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 144 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByb21lby50eHQuZ3oAAAAA 145 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 146 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAw 147 | MDEwNTYAMTM2MTY0NTYxMjAAMDExMjExACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 148 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 149 | AAAAAAAAAAAAAAAAAHVzdGFyICAAbnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABudAAA 150 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 151 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 152 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 153 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+LCAgm2F1ZAANyb21lby50 154 | eHQATVPBbtswDL3zK9hTLkYOPS6HIO0CNMW6AEmGHoYdFJuOhNqSIdH1vK8fRSXZThaoJ/LxvedD 155 | 6Cmg8Q2+jp0jhu3vmuLA2MbQ46ZmfKzwWJMnfAR4/fFttz3BHg/5WVU+DzhZitSGSGgiI9swlps1 156 | fCU/S2HG1rCAdJBAx0Ra9aanFexjha4t7ybXMfrAFZ4JzyNjmkL02M/YhU+qYCMNdouuE4xU/EV6 157 | CtDgsxnGjngJcNi/bffwc5NcQ7/waI2Ad2jJROyFYoUhYrpW00DmA03m7NL6vt/i5JIOv3GUg4Ck 158 | KDxEin5ewSmzLevOibq2Uv4Xm8kLn7fg2VxGWsK7PF2ke2GNTjt5oWFFjkpPbZCV4bucTOyvJVNT 159 | ORnRMKh8gwyEJ8qLO39BFuewN36Je9UriehXZGb9cJvtvOByZV0WmayrLU6EdZbBYAyJ4Gn+b5Au 160 | PYWxazD1lEFJnCDiFRxDMbdcV9JGfLeke5eL3HXRVHAgNjJaRzZZ/4FiSzW74K8U5FmYKMG7y+Jx 161 | gbLjjpa3iDWhbe8+FP8laQVZWGonVVT1wZDxRHAyH5IM4d6rQfdo7JDzTcYU62dZJTZf4FnBJXaa 162 | No2rpk3E9TTh2Qzs/lCzghfydY48W4mRp0/RTKKrQCW+vIcpe5BN+vdvlC3tKBmjVEciv2iyR95d 163 | LGd9E4/9uaMku2j06zB6WWENfwHvB+WrrgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 164 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 165 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 166 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 167 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 168 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 169 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 170 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 171 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 172 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 173 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 174 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 175 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 176 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 177 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 178 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 179 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 180 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 181 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 182 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 183 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 184 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 185 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 186 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 187 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 188 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 189 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 190 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 191 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 192 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 193 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 194 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 195 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 196 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 197 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 198 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 199 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 200 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 201 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 202 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 203 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 204 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 205 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 206 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 207 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 208 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 209 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 210 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 211 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 212 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 213 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 214 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 215 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 216 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 217 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 218 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 219 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 220 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 221 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 222 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 223 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 224 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 225 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 226 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 227 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 228 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 229 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 230 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 231 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 232 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 233 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 234 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 235 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 236 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 237 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 238 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 239 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 240 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 241 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 242 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 243 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 244 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 245 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 246 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 247 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 248 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 249 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 250 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 251 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 252 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 253 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 254 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 255 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 256 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 257 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 258 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 259 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 260 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 261 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 262 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 263 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 264 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 265 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 266 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 267 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 268 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 269 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 270 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 271 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 272 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 273 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 274 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 275 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 276 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 277 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 278 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 279 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 280 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 281 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 282 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 283 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 284 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 285 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 286 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 287 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 288 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 289 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 290 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 291 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 292 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 293 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 294 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 295 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 296 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 297 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 298 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 299 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 300 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 301 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 302 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 303 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 304 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 305 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 306 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 307 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 308 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 309 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 310 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 311 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 312 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 313 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 314 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 315 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 316 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 317 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 318 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 319 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 320 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 321 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 322 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 323 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 324 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 325 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 326 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 327 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 328 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 329 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 330 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 331 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 332 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 333 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 334 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 335 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 336 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 337 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 338 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 339 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 340 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 341 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 342 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 343 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 344 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 345 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 346 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 347 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 348 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 349 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 350 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 351 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 352 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 353 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 354 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 355 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 356 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 357 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 358 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 359 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 360 | AAAAAAAAAAAAAAAAAAAAAAA= 361 | -------------------------------------------------------------------------------- /test/data/archive.tar.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar.br -------------------------------------------------------------------------------- /test/data/archive.tar.bz2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar.bz2 -------------------------------------------------------------------------------- /test/data/archive.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar.gz -------------------------------------------------------------------------------- /test/data/archive.tar.gz.uu: -------------------------------------------------------------------------------- 1 | begin 644 archive.tar.gz 2 | M'XL(`````````^U8#7!4U17&8EM\@LY4P!&M7A)CB&QVW]O?A(BXFVR2A>QN 3 | M)KLA+A#E[N[=?0_?OK>\GVR6H.(/V(@@(EHJMM8_M&)1P393$"%,Q;&=HMA: 4 | MH;8VHD4Z0@&58\X[[V!%$U)"0L"B 5 | MC;7&\QI1!YUQL`"WTTE'SN-BCQ^/8A#G<'-NI\O-V6&>L]LY^R#$GGE13H6N 6 | M:EA!:)"D_6>ZTZU_0Y$6-%Z/5VHXK5IGJ+)T-LXXC?\YE]T%_O=P3H_'X7"Z 7 | MJ?]9A\OT_T!@*H-0%_P0*I%PAI2,0R4=K-5N94LLA=E90C:.1?%F71'I(J]I 8 | M676\>/I1F/;J8[BSJRCN#/K*.ZK.,K-.KEJ9QR,Y4E5>^P/),..JK'O7U'>4_YBBFG3G70?TUP!-1E*TJ?S;/ 13 | MH$G>XW+]V_QO=T/^=[).>`4X6,X!^9]UP.O"S/\#@-+1MK@@V>)8Y5$ET9E2 14 | M5"MG\XJ0YC5D9^T5E'&9Q'DJPA727`0E!12A`)(IT) 16 | MDM60("&(W*PH8"E!4`Y"W#BFR`3$0+$B"SFN8:#&0)^%_U+'TR&L&0(#CF:, 17 | M7"YGQ8:P5EE)V\0"H6IK"M3Z0Q%_)0AL;&F51**J2"$S=4$!5>-YA+,@3P+' 18 | M04H1YY"L()Q6"*QI,I4WIPB:(*4M2)536@XK!+@D!553A+BNG6"LH]*!SL<3 19 | M@+FPA$J\$12(E""?-Q*(6(!'6R#:&&Z-HC9O2XLW%`WX(RC<@FK#H;I`-!`. 20 | MP7_UR!N*H4F!4)T%$3`5'$,ZLPJ5'X04J!E)DMHL0L@)`J3D@D!JEB3HEP#H 21 | M):5UG"8H+7<010)U4)8H&4&ESE1!O"1P$07(J%@S9DY1RLH`1>5)H'/1?A>K 22 | MO*R+2<3CCH(T):23)'2-&K8$["YT'G955ZSP+:>YTWW\9N:&[U6U!JMKZP:AZ;6.I"/:[)+\>Q^-_[V-*UYR;^[79/?_WG8#U&_#O-^!\04*]#-'/U 26 | M;H+?83^E_\MY6#/^!P+= 29 | MS:&&8.7+DZ6V/_06>Y@;J 30 | MO-$A[Y;];MVPC>SP\_MJ*Z:-NOK@RR*^-H4OO.GU[SVP<8@X9])$]X8HNK;A 31 | M9T]\<45ZW[WA`]IK=XQCWRD9-S/6?7D(_?SP:G;6T.?\RLZEX]=,E@]N+!UU 32 | MQ79OQ8*N^R^]_\I#79>S/2/9';]8VA'W;I@>7SYEQX)YH\;6II].;ULW\A\/ 33 | M=0Z_?L3M]_V]^75V=K5,]0CX0W4K?=/O/%=V_*9"D3-$/CNO_7Z6G:THPB/@3B`>`)>SH"(%MH/48NS:I;@ 38 | M6Q#6C.;3A'[]RJ-0N=##C\H(#]@H9T`.,$4F7P.U#DA;4#>O$C%E,>1/\T8_ 39 | M"Z.@+&DXK1,KTP9;R]7^B0E(,#A)(`8/YK`83RD95&9"M)^D9(I3.$$*3QAL 40 | M*!OFR\*!C(]0Q6E?1@//H0R6K"ALV$L%HQ2/`H 41 | M1U""F@$C158)X\L?=Y"A=,[HT:@90HE4\`0A6@T3D0O.+2Q;@`WX'4H[JG=A 42 | M@7(M3UJ8%F*TY8PCD]3^6:*D2()VC8HBP#8Y1U2F3:#&TPJDFJ")Q'KTBB7E 43 | M5*K?#P7_%UI60%F0TN!D6-2P3['4)$P4WP(W`V3/&`[JOQH!I-$52E-P?1Y4 44 | M49+CF%J#N'#MC-MF7%?CMH%Q)9)#<9S5A%DD6<,T$BE!K[S&PS622`?8#*ZN 45 | M06@(;NV_3-0'U$G'8J.@):_#'2-J0B%$*D]2'TFTZTKMJVI0D(E$U6@_$*Y< 46 | M0M8E4&'"62B+^_._-3WKS',OX'3YGSTE_T,!R)GY?R!PU?PA0Z[9VAX;-/A8 47 | M)1",]$KOL4/7?39V:\1:?]%XZSUH][>^G!Y:O;S>V]\ 49 | ML'SV^9V']F5ZQO=>>?$_8ZW77UP5N_7N6:739B$-_WQQ3G: 50 | MHAM>KYNR?_DS(W8EYJZLW'/-N]S!#2-^LS!_:J#TZK7;^77S`GQ[]1MVMN?.[H^)K) 52 | MO[]AQ^#@CEUO'WSUK]L_6GS1^IE+[IKSU)CKZNZ][:;>BM65GVSN7O/+EL.7 53 | M+GOCPL=Z^K9-JY^R<>UU[4]UX06AFOSCV+]P8CBSZ*$/UC[:M.N%LDBD^K(M 54 | M[+.S[QIZ=_EOYM?<[AWY\8N>V[J[WAG;O;,MF3J47;;[E3Z%M(_\T?,K*D-W 55 | MZP_W3A_:W2<$?Q9:.Z5W[V^TS[UCUX<*'>W[@>CRSY_KA1\J$ 57 | M;\=NG%'>&MW?NVA?7=9^U>*A'[R_PGN`W[7HL^"FX9^D8V7NF_MBO64=C[@7 58 | MK%@>_/5^YP?;ANXZW+SZSDL_U1=>-[7[@6?"6YJ>6'%#V:NOW%/1M2AX\("\ 59 | MI'+WF,N>C#:4K.=7-;S?;DG?>LG]AW[UY-5K^<\_86?%\+#;S]OSW;^M6#GX 60 | M7-]5$R9,F#!APH0)$R9,F#!APH0)$R9,F#!APH0)$R9,F#!APH0)$R9,F#!A 61 | 1PH0)$R;^W_$O!O.=L0!0```` 62 | ` 63 | end 64 | -------------------------------------------------------------------------------- /test/data/archive.tar.lrz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar.lrz -------------------------------------------------------------------------------- /test/data/archive.tar.lz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar.lz -------------------------------------------------------------------------------- /test/data/archive.tar.lz4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar.lz4 -------------------------------------------------------------------------------- /test/data/archive.tar.lzma: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar.lzma -------------------------------------------------------------------------------- /test/data/archive.tar.lzo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/archive.tar.lzo -------------------------------------------------------------------------------- /test/data/archive.tar.uu: -------------------------------------------------------------------------------- 1 | begin 644 archive.tar 2 | M87)T:69I8VEA;"\P+F)Y=&5S```````````````````````````````````` 3 | M```````````````````````````````````````````````````````````` 4 | M`````````````#`P,#`V-#0`,#`P,3FEP 35 | M8F%L;%]UFEP8F%L;"]V,"XQ+C`B+`H@("`@(G1A6]U(&UA>2!N;W0@=7-E('1H 62 | M:7,@9FEL92!E>&-E<'0@:6X@8V]M<&QI86YC92!W:71H('1H92!,:6-E;G-E 63 | M+@HC(%EO=2!M87D@;V)T86EN(&$@8V]P>2!O9B!T:&4@3&EC96YS92!A=`HC 64 | M"B,@("`@:'1T<',Z+R]W=W'!R97-S(&]R(&EM<&QI960N"B,@4V5E 70 | M('1H92!,:6-E;G-E(&9O'0````````````````````````````````````````````````````````` 83 | M````````````````````````````````````````````````````,#`P,#8T 84 | M-``P,#`Q-S4P`#`P,#$W-3``,#`P,#`P,#`Q-3``,30P-#,W,3(U,34`,#$R 85 | M-SQQ*1P@AL@$M*-L!4("I'J:+\'&?QBD_W=,6! 141 | M.C#5(CIQ68D;3B"M_K,P>@RJ17+HF#VZ5F_ZPB,:'.)!*8U[CQ>/'OU[&S"W 142 | M%C#FM9AV8D'`8&*F6N:-AAHK0V>E9]F]%NZ5>!0^%7^,Z5#','PY;P````!) 143 | M14Y$KD)@@@`````````````````````````````````````````````````` 144 | M```````````````````````````````````````````````````````````` 145 | M```````````````````````````````````````````````````````````` 146 | M```````````````````````````````````````````````````````````` 147 | M```````````````````````````````````````````````````````````` 148 | M```````````````````````````````````````````````````````````` 149 | M``````````````````````````````````````````````````````!R;VUE 150 | M;RYT>'0````````````````````````````````````````````````````` 151 | M```````````````````````````````````````````````````````````` 152 | M````````,#`P,#8T-``P,#`Q-S4P`#`P,#$W-3``,#`P,#`P,#$V-38`,3,V 153 | M,38T-38Q,C``,#$P-C`P`"`P```````````````````````````````````` 154 | M```````````````````````````````````````````````````````````` 155 | M`````````````````````````````````````'5S=&%R("``;G0````````` 156 | M``````````````````````````````!N=``````````````````````````` 157 | M```````````````````````````````````````````````````````````` 158 | M```````````````````````````````````````````````````````````` 159 | M```````````````````````````````````````````````````````````` 160 | M```````````````````````````````````````````````````````````` 161 | M`````````````````%)O;65O(&%N9"!*=6QI970*17AC97)P="!F2!T:'D@9F%T:&5R(&%N9"!R969U2!O=&AE2!O=&AE2!N86UE+`I!;F0@9F]R('1H870@;F%M92!W 177 | M:&EC:"!I'0N9WH````````````````````````````````````````` 185 | M```````````````````````````````````````````````````````````` 186 | M````````````````,#`P,#8T-``P,#`Q-S4P`#`P,#$W-3``,#`P,#`P,#$P 187 | M-38`,3,V,38T-38Q,C``,#$Q,C$Q`"`P```````````````````````````` 188 | M```````````````````````````````````````````````````````````` 189 | M`````````````````````````````````````````````'5S=&%R("``;G0` 190 | M``````````````````````````````````````!N=``````````````````` 191 | M```````````````````````````````````````````````````````````` 192 | M```````````````````````````````````````````````````````````` 193 | M```````````````````````````````````````````````````````````` 194 | M```````````````````````````````````````````````````````````` 195 | M`````````````````````````!^+"`@FV%U9``-R;VUE;RYT>'0`35/!;MLP 196 | M#+WS*]A3+D8./2Z'(.T"-,6Z`$F&'H8=%)N.A-J2(='UO*\?12793A:H)_+Q 197 | MO>=#Z"F@\0V^CITCANWOFN+`V,;0XZ9F?*SP6),G?`1X_?%MMSW!'@_Y654^ 198 | M#SA9BM2&2&@B(]LPEILU?"4_2V'&UK"`=)!`QT1:]::G%>QCA:XM[R;7,?K` 199 | M%9X)SR-CFD+TV,_8A4^J8",-=HNN$XQ4_$5Z"M#@LQG&CG@)<-B_;??P 201 | MP2FS+>O.B;JV4OX7F\D+G[?@V5Q&6L*[/%VD>V&-3CMYH6%%CDI/;9"5X;N< 202 | M3.RO)5-3.1G1,*A\@PR$)\J+.W]!%N>P-WZ)>]4KB>A79&;]<)OMO.!R95T6 203 | MF:RK+4Z$=9;!8`R)X&G^;Y`N/86Q:S#UE$%)G"#B%1Q#,;=<5])&?+>D>Y>+ 204 | MW'715'`@-C):1S99_X%B2S6[X*\4Y%F8*,&[R^)Q@;+CCI:WB#6A;>\^%/\E 205 | M:0596&HG553UP9#Q1'`R'Y(,X=ZK0?=H[)#S3<84ZV=9)39?X%G!)7::-HVK 206 | MIDW$]33AV0SL_E"S@A?R=8X\6XF1IT_13**K0"6^O(Y!-^O=OE"WM*!FC 207 | M5$AAT4FXZ$VI(AT?6\KQ]%)=E.%J@G\O&]YT/H*:#Q#;Z.G2.&[>^:XL#8 4 | MQM#CIF9\K/!8DR=\!'C]\6VW/<$>#_E953X/.%F*U(9(:"(CVS"6FS5\)3]+ 5 | M8<;6L(!TD$#'1%KUIJ<5[&.%KBWO)M`EPV+]M]_!SDUQ#O_!HC8!W:,E$[(5BA2%BNE;3 7 | M0.8#3>;LTOJ^W^+DD@Z_<92#@*0H/$2*?E[!*;,MZ\Z)NK92_A>;R0N?M^#9 8 | M7$9:PKL\7:1[88U..WFA846.2D]MD)7ANYQ,[*\E4U,Y&=$PJ'R##(0GRHL[ 9 | M?T$6Y[`W?HE[U2N)Z%=D9OUPF^V\X')E71:9K*LM3H1UEL%@#(G@:?YOD"X] 10 | MA;%K,/6404F<(.(5'$,QMUQ7TD9\MZ1[EXO<==%4<"`V,EI'-EG_@6)+-;O@ 11 | MKQ3D69@HP;O+XG&!LN..EK>(-:%M[SX4_R5I!5E8:B=55/7!D/%$<#(?D@SA 12 | MWJM!]VCLD/--QA3K9UDE-E_@6<$E=IHVC:NF3<3U-.'9#.S^4+."%_)UCCQ; 13 | MB9&G3]%,HJM`);Z\ARE[D$WZ]V^4+>TH&:-41R*_:+)'WETL9WT3C_VYHR2[ 14 | 2:/3K,'I980U_`>\'Y:NN`P`` 15 | ` 16 | end 17 | -------------------------------------------------------------------------------- /test/data/romeo.txt.gzip: -------------------------------------------------------------------------------- 1 | romeo.txt.gz -------------------------------------------------------------------------------- /test/data/romeo.txt.lrz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/romeo.txt.lrz -------------------------------------------------------------------------------- /test/data/romeo.txt.lrzip: -------------------------------------------------------------------------------- 1 | romeo.txt.lrz -------------------------------------------------------------------------------- /test/data/romeo.txt.lz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/romeo.txt.lz -------------------------------------------------------------------------------- /test/data/romeo.txt.lz4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/romeo.txt.lz4 -------------------------------------------------------------------------------- /test/data/romeo.txt.lzip: -------------------------------------------------------------------------------- 1 | romeo.txt.lz -------------------------------------------------------------------------------- /test/data/romeo.txt.lzma: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/romeo.txt.lzma -------------------------------------------------------------------------------- /test/data/romeo.txt.lzo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/fuse-archive/54438ba897d667fd4aac3a6a6891367769f4615f/test/data/romeo.txt.lzo -------------------------------------------------------------------------------- /test/data/romeo.txt.lzop: -------------------------------------------------------------------------------- 1 | romeo.txt.lzo -------------------------------------------------------------------------------- /test/data/romeo.txt.uu: -------------------------------------------------------------------------------- 1 | begin 644 romeo.txt 2 | M4F]M96\@86YD($IU;&EE=`I%>&-E2!F871H97(@86YD(')E9G5S92!T:'D@;F%M93L*3W(L 5 | M(&EF('1H;W4@=VEL="!N;W0L(&)E(&)U="!S=V]R;B!M>2!L;W9E+`I!;F0@ 6 | M22=L;"!N;R!L;VYG97(@8F4@82!#87!U;&5T+@H*4D]-14\*6T%S:61E72!3 7 | M:&%L;"!)(&AE87(@;6]R92P@;W(@2!N86UE('1H870@:7,@;7D@96YE;7D["E1H 9 | M;W4@87)T('1H>7-E;&8L('1H;W5G:"!N;W0@82!-;VYT86=U92X*5VAA="=S 10 | M($UO;G1A9W5E/R!I="!I7-E;&8N"@I23TU%3PI)('1A:V4@=&AE 19 | M92!A="!T:'D@=V]R9#H*0V%L;"!M92!B=70@;&]V92P@86YD($DG;&P@8F4@ 20 | M;F5W(&)A<'1I>F5D.PI(96YC969O (1)': {'md5': '36fbea036273dc1917a3e7e3b573dd22'}, 444 | 'Angle <> (2)': {'md5': 'c98dc6a537865f0896db87452784280b'}, 445 | 'Angle <>': {'md5': '1c5cbe4d86c73de115eb48de5cf0eeea'}, 446 | 'At @ (1)': {'md5': 'dccf5a36da117a1b9ea52f6aa1d46dca'}, 447 | 'At @ (2)': {'md5': '40d05f890dcda5552b7b87f1b1223b1a'}, 448 | 'At @': {'md5': 'cabcc9ad22fd30b2fe3220785474d9d8'}, 449 | 'At The Top (1)': {'md5': 'ba54e1aca97bad73f835c5d1c858417c'}, 450 | 'At The Top (2)': {'md5': '2d56b90a936b4f2b7f9ba2e4ef1fbd83'}, 451 | 'At The Top': {'md5': '9ef02862743242d23ce6ed223c38b707'}, 452 | 'Backslash ': {'mode': 'drwxr-xr-x'}, 453 | 'Backspace \x08 (1)': {'md5': 'a14e44a642e9037c3c298348093ec380'}, 454 | 'Backspace \x08 (2)': {'md5': 'a52f6c6706cfe008497efe714eb2a5ff'}, 455 | 'Backspace \x08': {'md5': '5d2071685575754babe374981552164b'}, 456 | 'Backtick ` (1)': {'md5': 'b92aae294d43c3e081397788bcdeda77'}, 457 | 'Backtick ` (2)': {'md5': '714d2283f6384ffabcf1c403ad0ebb3e'}, 458 | 'Backtick `': {'md5': '44a52fddfbaf7c0c213c20192744afd5'}, 459 | 'Bell \x07 (1)': {'md5': 'd42111a8d9d715d6ca13f870c03bb136'}, 460 | 'Bell \x07 (2)': {'md5': 'a9e9d87ea96b4f4e8797820c7ac19df1'}, 461 | 'Bell \x07': {'md5': 'aafdd252197512170d856086452836a9'}, 462 | 'C:': {'mode': 'drwxr-xr-x'}, 463 | 'C:/Temp': {'mode': 'drwxr-xr-x'}, 464 | 'C:/Temp/File (1)': {'md5': 'ca11bb68c069615a4b9b6eecedae436b'}, 465 | 'C:/Temp/File (2)': {'md5': 'de6cf0f9e21e500d452ca1731148a774'}, 466 | 'C:/Temp/File': {'md5': '09e89cca300f6ad14c9c614fb95c33b0'}, 467 | 'CASE (1)': {'md5': '00b78d79abf97077fbf025f3355fddb2'}, 468 | 'CASE (2)': {'md5': '53e44ae7ecdff196ff18881fae2a4c31'}, 469 | 'CASE': {'md5': 'e92836e4b17a39306f51d13ead0a09e4'}, 470 | 'CLOCK$ (1)': {'md5': '4a89d1ec340b7984fce1828f32b17a1b'}, 471 | 'CLOCK$ (2)': {'md5': 'a10ee44c95468f79c4d76acbc431f2d9'}, 472 | 'CLOCK$': {'md5': '306be585c84e6ed5aab5070e9846121d'}, 473 | 'COM1 (1)': {'md5': '7126112f4c33e7530fffcf7278a5e719'}, 474 | 'COM1 (2)': {'md5': '619a4330a4dd8433f2b27ceb9e2c575c'}, 475 | 'COM1': {'md5': 'a613354228a8154a5c980526c82d7efe'}, 476 | 'COM9 (1)': {'md5': '7c904dcc4bb875a99e403d6a41d97c2a'}, 477 | 'COM9 (2)': {'md5': 'c0a1e5c28a2359f61cc4531df14d0892'}, 478 | 'COM9': {'md5': '413d4b59327743bb2d8ce59f41fd1f41'}, 479 | 'CON (1)': {'md5': 'a6a5ee67a986dc6270311f631c2d403d'}, 480 | 'CON (2)': {'md5': '66673cda9a9e98f3ab3f7194ead33958'}, 481 | 'CON': {'md5': '407f3ff633ac1822974ce5e1a07ac9e5'}, 482 | 'Café (1)': {'md5': 'b7ce2be1dfb8cf535bccf1036284900c'}, 483 | 'Café (2)': {'md5': '637f113e67522f774879f6f63f3093da'}, 484 | 'Café (3)': {'md5': 'e9e59d2978d1ffcfc11274fcedea35d6'}, 485 | 'Café (4)': {'md5': 'f60233605389c3fc8ba841d202860c38'}, 486 | 'Café (5)': {'md5': '4f51f74e22dd4e3a77f965d77daffb4b'}, 487 | 'Café': {'md5': '080f684e7afffcc022c53359c1b6d968'}, 488 | 'Caret ^ (1)': {'md5': '6ecbe85c819de33f1a1566fc6a49b148'}, 489 | 'Caret ^ (2)': {'md5': '4037bf95d8b2a026056c6be3cb88f16d'}, 490 | 'Caret ^': {'md5': '327e8a9bae15530ada822c20e6e875f2'}, 491 | 'Carriage Return \r (1)': {'md5': '1657ca6d389450c66dcb3737ade632d4'}, 492 | 'Carriage Return \r (2)': {'md5': 'f5f79fbe6bd369bb344d2acb1500f3a0'}, 493 | 'Carriage Return \r': {'md5': '5b5600d7515e86d01364bc6f066cfc14'}, 494 | 'Case (1)': {'md5': 'b33984146a2bb8c8fc337362e91d1911'}, 495 | 'Case (2)': {'md5': '2653ca3273626a97a5b9155b83511e44'}, 496 | 'Case': {'md5': 'f39791e31c562ce31a325a188c405d02'}, 497 | 'Colon : (1)': {'md5': '662fcf045861ca1e9be6466f34f23846'}, 498 | 'Colon : (2)': {'md5': '30b9479836d7aab4428db84a4435de2b'}, 499 | 'Colon :': {'md5': 'bad98d8795bd453e675ae45cf511cb6f'}, 500 | 'Comma , (1)': {'md5': '741313ce46594c276d4dbf8c50a3c242'}, 501 | 'Comma , (2)': {'md5': 'dbe2d9051ca9c7ad197acdd39644c151'}, 502 | 'Comma ,': {'md5': '8e4e2a35ea3db7e1f0c71e9e260e3f2b'}, 503 | 'Curly {} (1)': {'md5': '5e75818b995fac62fd10046e918a6d68'}, 504 | 'Curly {} (2)': {'md5': '2526b1e0fdb6a56ef9c7104b0432295a'}, 505 | 'Curly {}': {'md5': '7f80122391b3c4f8af113d08784576bb'}, 506 | 'Dash - (1)': {'md5': 'c2fe85e07ed29f1907466647d8e7de73'}, 507 | 'Dash - (2)': {'md5': '394758376fd6bece3d8c523911d4802f'}, 508 | 'Dash -': {'md5': '367fcecd09ee039d04346ca9483f15b0'}, 509 | 'Delete \x7f (1)': {'md5': '63f936c1f9b6679f6448d6b9dd6907e9'}, 510 | 'Delete \x7f (2)': {'md5': '1e5f71a3210f3572ad57cd0f8db7c773'}, 511 | 'Delete \x7f': {'md5': '3ffe534d559861937f43e74252183f7d'}, 512 | 'Dollar $ (1)': {'md5': '785fcb195fd44a2d958ab601533aaa93'}, 513 | 'Dollar $ (2)': {'md5': 'ad033aafabafeeece964f7558f5e0110'}, 514 | 'Dollar $': {'md5': '8e567128bd3120c6b504f0ea1c078591'}, 515 | 'Dot . (1)': {'md5': 'd6bbeadd3e2949c9a97863faf7941fd1'}, 516 | 'Dot . (2)': {'md5': 'ba3e606d9d97dcaa1903c77b4caa62a7'}, 517 | 'Dot .': {'md5': 'f312d5c330e833d409ad05fe206b3099'}, 518 | 'Double quote " (1)': {'md5': '843b0fa6d0bd93d58b5a1a0960c4be2f'}, 519 | 'Double quote " (2)': {'md5': '94912b944529fe9ac74f1d17ffd685ed'}, 520 | 'Double quote "': {'md5': '7b20185b51dbce9398dfbe5b3c5c2f44'}, 521 | 'Empty': {'mode': 'drwxr-xr-x'}, 522 | 'Equal = (1)': {'md5': '83379a04a3ee4566eb3605bc3f5a4ab4'}, 523 | 'Equal = (2)': {'md5': '7891ccb015f7c6daec40bbd16c8075ec'}, 524 | 'Equal =': {'md5': '69b9497f9f34aba975699c833d037666'}, 525 | 'Escape \x1b (1)': {'md5': '9e3c4cefd408009286d5b418ae9988db'}, 526 | 'Escape \x1b (2)': {'md5': '8e7878beac19e997da1ef12bd481cb44'}, 527 | 'Escape \x1b': {'md5': '1c1ee3412c62f438d4403816482ed486'}, 528 | 'Euro € (1)': {'md5': '54dd622a6f10eed2cd59ed2a6f594ef2'}, 529 | 'Euro € (2)': {'md5': '3ee86efa36d8cf102288ad2bf936dfa8'}, 530 | 'Euro €': {'md5': '8e79df94fcaf890f6433ecf48152919d'}, 531 | 'Exclamation ! (1)': {'md5': '10e762da30d7793ee14e7bf0c154078b'}, 532 | 'Exclamation ! (2)': {'md5': '22520ad75ab8d3b28e90fd7a4fc2bfc8'}, 533 | 'Exclamation !': {'md5': '255abe4fe8bbb0b4f8411913673388fe'}, 534 | 'FileOrDir (1)': {'md5': '616efa472d51b7f5aacab007d9a635be'}, 535 | 'FileOrDir (2)': {'md5': 'be82b39076b03bcf3828ab09b1c34582'}, 536 | 'FileOrDir (3)': {'md5': 'e503e8e89925339aefb47443581ba4bc'}, 537 | 'FileOrDir': {'mode': 'drwxr-xr-x'}, 538 | 'Hash # (1)': {'md5': '37715cd1852064027118eb0e466d1172'}, 539 | 'Hash # (2)': {'md5': '38730629648b8780fe1f4f90738eb6a1'}, 540 | 'Hash #': {'md5': '2c33603f6b59836dc9dd61bbd6f47b6d'}, 541 | 'LPT1 (1)': {'md5': '695771298fcc161d5375e7ef65fe0cbf'}, 542 | 'LPT1 (2)': {'md5': '4c6478198627fe5d5d8ca588782502ea'}, 543 | 'LPT1': {'md5': 'e9aa40253c2cda7319f60e127b7a5d2b'}, 544 | 'LPT9 (1)': {'md5': '338ad2a4d01b83966a2d93b84991079c'}, 545 | 'LPT9 (2)': {'md5': 'a5ee3dd960f9c0457cc778afdc1bc45e'}, 546 | 'LPT9': {'md5': 'b5908fed9f25a430cc17f41058517fd7'}, 547 | 'Line Feed \n (1)': {'md5': '3e1c022c4be1b6d982289cbd6aeb9eba'}, 548 | 'Line Feed \n (2)': {'md5': 'fc8dfff4cc4757c29ab931d9e7f954e9'}, 549 | 'Line Feed \n': {'md5': '72af886a4aed8ad6885a7f786ec5b661'}, 550 | 'NUL (1)': {'md5': '95c40e86277b9e90a040c3b302d7562c'}, 551 | 'NUL (2)': {'md5': 'd6516225315fb534b075c396016ca039'}, 552 | 'NUL': {'md5': '485ca989764c13cf55f8ab3d839cfd1e'}, 553 | 'One. (1)': {'md5': 'a85a42df93c1b1365a6a593e07a3f80a'}, 554 | 'One. (2)': {'md5': 'a05d70a56ff44a1fa4b42a55d5a29c19'}, 555 | 'One.': {'md5': 'ab394e10e5ef36efedc9e415c2c3cb42'}, 556 | 'PRN (1)': {'md5': '193b412ab1a91011b5ea7accb3c146c2'}, 557 | 'PRN (2)': {'md5': 'dc5ef433ccf07082e793a71e17dd2b1f'}, 558 | 'PRN': {'md5': 'c6f96d5f3a7313541646d5d8b951dc0d'}, 559 | 'Percent % (1)': {'md5': 'c8dd7a81eaf6d6c8e817657aa45063ef'}, 560 | 'Percent % (2)': {'md5': '5dca4785fee3d3cf8b7a090555409e1a'}, 561 | 'Percent %': {'md5': 'bc402953f32f33d3e8c17360557bd294'}, 562 | 'Pipe | (1)': {'md5': '8f2eaf2f601cfc28087f0826c0d0415d'}, 563 | 'Pipe | (2)': {'md5': '715f63380171ee77dd2057cff284edd7'}, 564 | 'Pipe |': {'md5': '6dfa11c10b119a6f0bea267804707f59'}, 565 | 'Plus + (1)': {'md5': '00a706dba456a2da0c8175498c1c2e0a'}, 566 | 'Plus + (2)': {'md5': '9dfada89dcbd35eb95e6d6882f4eb79b'}, 567 | 'Plus +': {'md5': '2517d92c6a28e82e53086558f599f7a3'}, 568 | 'Question ? (1)': {'md5': '2b04a6c5990e28e981052c2a1b487891'}, 569 | 'Question ? (2)': {'md5': '96ae8325f90df4cfb401b3d40c65417d'}, 570 | 'Question ?': {'md5': '4762c2deeccd2243cbe2c750f6027608'}, 571 | 'Round () (1)': {'md5': '66a98a72d65a794b288469d1b9f5a9c7'}, 572 | 'Round () (2)': {'md5': '347ea63daa56787225c2575a277fefcf'}, 573 | 'Round ()': {'md5': 'ea2053ca1e8235aec047f2debca62161'}, 574 | 'Semicolon ; (1)': {'md5': '3ee36aec082f0d0c9f89145d4d3081f8'}, 575 | 'Semicolon ; (2)': {'md5': '7977cacb02ea2bbb75517dde267e6904'}, 576 | 'Semicolon ;': {'md5': '789f0142366e24b2ce19c7248b3c1103'}, 577 | 'Smile 🙂 (1)': {'md5': 'bafa29d272d040544572ab3b4e5cc497'}, 578 | 'Smile 🙂 (2)': {'md5': '581599352cd9dda6a541481952d06048'}, 579 | 'Smile 🙂': {'md5': 'a870c6b6877e97c950d18d95505a9769'}, 580 | 'Space→ (1)': {'md5': '2c8a1745d3f0add39eb277b539fdfeaa'}, 581 | 'Space→ (2)': {'md5': 'e272aa59f06c6b9f3af33c941e6b3c5a'}, 582 | 'Space→ ': {'md5': '20f9a99e85968869900467f65298c1ba'}, 583 | 'Square [] (1)': {'md5': 'bc066cc3c9934b31a337260efc99d1df'}, 584 | 'Square [] (2)': {'md5': 'fc77bf99b696d888e4ca937f8cf5097a'}, 585 | 'Square []': {'md5': '47a86abc13e9703ca7457ea9e29b83b1'}, 586 | 'Star * (1)': {'md5': '2a9362d8d04ce694c85e4d054fa72763'}, 587 | 'Star * (2)': {'md5': '341c4e1e9785c4658250c1a37e9fd04f'}, 588 | 'Star *': {'md5': '1e1d1d592ee97949db5fa6d1db01a06f'}, 589 | 'String Terminator \x9c (1)': {'md5': 'ba7f76d662af39dfbaeb3899c46978ef'}, 590 | 'String Terminator \x9c (2)': {'md5': '33abcf5fd9bff50dc5f97592a133d1d2'}, 591 | 'String Terminator \x9c': {'md5': 'ad901030332576dfb289e848d7ef5721'}, 592 | 'Tab \t (1)': {'md5': '76635ca0e84ce5af2d08804b81fe33e0'}, 593 | 'Tab \t (2)': {'md5': '3f92d47d30f56412f37b81aaf302d5eb'}, 594 | 'Tab \t': {'md5': 'f546955680b666f1f4ed2cddb173d142'}, 595 | 'Three... (1)': {'md5': '79d37b7eedc1aa7d1d54fdf906ea32f4'}, 596 | 'Three... (2)': {'md5': '17715f0b716cf0061fce3c6ac99fa035'}, 597 | 'Three... (3)': {'md5': '2cc2c8026d87a4a2ee0175d3977bd9db'}, 598 | 'Three... (4)': {'md5': 'cc8a892db5bbb6e00783911a977e49e2'}, 599 | 'Three... (5)': {'md5': 'd79667406b09137e02359a22570cc69f'}, 600 | 'Three...': {'md5': 'fd7443b6ef5da1fe8229a64ac462fbb9'}, 601 | 'Tilde ~ (1)': {'md5': 'b9170048f08dafa6d314ff685cf56396'}, 602 | 'Tilde ~ (2)': {'md5': '44a6e1123c523c089a1fb2f622a346d9'}, 603 | 'Tilde ~': {'md5': 'd644fb4311c7b1c581ed1cbca0913ff3'}, 604 | 'Two.. (1)': {'md5': '561eaf19d31ba9f2f3a93f4a1cf740cd'}, 605 | 'Two.. (2)': {'md5': '3bfdba5a9317da55733a3aa3db8788c8'}, 606 | 'Two..': {'md5': '8b25e8cb6343c03d3dceeb5287c4414f'}, 607 | 'One Level Up (1)': {'md5': '5cfff7eb216252fd9edd35ad58f65807'}, 608 | 'One Level Up (2)': {'md5': '8926cc7e8073e1079320f2e0b4b2a05c'}, 609 | 'One Level Up': {'md5': 'd530362d8793bd2213702f7a8b9eb391'}, 610 | 'Two Levels Up (1)': {'md5': 'c1c08ba600c42750bb25007bd93fcd37'}, 611 | 'Two Levels Up (2)': {'md5': '35bdc6589118dee115df941fd9775282'}, 612 | 'Two Levels Up': {'md5': 'fefd04175ab55cbf25f4e59a62b44c2a'}, 613 | 'Three Levels Up (1)': {'md5': '5d7122fa28bb1886d90cdbaee7b8b630'}, 614 | 'Three Levels Up (2)': {'md5': '69baf719bc3af25f12c86a2c146ab491'}, 615 | 'Three Levels Up': {'md5': '77798d1b2b8f820dbf742a6416d2fd51'}, 616 | 'Underscore _ (1)': {'md5': 'c23f32b919508169a496a093839f0e04'}, 617 | 'Underscore _ (2)': {'md5': 'cdf441502a50204b943e0a8f943e0668'}, 618 | 'Underscore _': {'md5': '3ef0593f0a008dd757bfc49dc75f3f9a'}, 619 | 'a' + '🙂' * 62 + ' (1)': {'md5': '6ca3d8755b658c8c0ffe1c1d43b61b2a'}, 620 | 'a' + '🙂' * 62 + ' (2)': {'md5': '56e595f226384b9413361d435b5f5e44'}, 621 | 'a' + '🙂' * 63: {'md5': 'e1397fa63e2d64195fcedad9348182e8'}, 622 | 'a': {'mode': 'drwxr-xr-x'}, 623 | 'a/? (1)': {'size': 34, 'md5': 'fea45576dee3469614a677cac21192e3'}, 624 | 'a/? (2)': {'size': 35, 'md5': '3e3d527abc6edc59608f027a1f12e581'}, 625 | 'a/? (3)': {'size': 35, 'md5': '71f25b9671fe15d79baab1f17c4872dc'}, 626 | 'a/? (4)': {'size': 36, 'md5': '48ca4b2216dca0ec1a5de383481b12a0'}, 627 | 'a/? (5)': {'size': 34, 'md5': 'c22db2a461a51236bf132906371a5d31'}, 628 | 'a/? (6)': {'size': 35, 'md5': 'd56fdea04fc2c01f6556ed8157e4ce5c'}, 629 | 'a/?': {'mode': 'drwxr-xr-x'}, 630 | 'a/?/b (1)': {'size': 37, 'md5': 'c5bb219b8e035b24e763e1a409e1e9e8'}, 631 | 'a/?/b (2)': {'size': 37, 'md5': '7dbda963a520c0bb261685ac28bba6dd'}, 632 | 'a/?/b (3)': {'size': 38, 'md5': 'cb1028cae1d77c324c186482ae9edff5'}, 633 | 'a/?/b (4)': {'size': 36, 'md5': '6a49956b8999b6ed64b30171994ac1cf'}, 634 | 'a/?/b (5)': {'size': 37, 'md5': 'c3552b56f73b2f0e290b38bdd1fb0c69'}, 635 | 'a/?/b': {'size': 36, 'md5': '01fa5cbef17c21be0d127cf70dad97e2'}, 636 | 'ab' + '🙂' * 62 + ' (1)': {'md5': '4db72400bf44ff1bf81231513083701d'}, 637 | 'ab' + '🙂' * 62 + ' (2)': {'md5': 'f7b12f040637a6dae4263bc2817b56eb'}, 638 | 'ab' + '🙂' * 63: {'md5': 'fd0d1895da329d89e2396f8300c4f61f'}, 639 | 'abc' + '🙂' * 62 + ' (1)': {'md5': '05937261559a83256ddb4d44480bb5c4'}, 640 | 'abc' + '🙂' * 62 + ' (2)': {'md5': '6ac381136adf1f350e667f4753e65f63'}, 641 | 'abc' + '🙂' * 63: {'md5': '4d222a84ac3bd28f6efd125337e125f6'}, 642 | 'abcd' + '🙂' * 61 + ' (1)': {'md5': 'c573d71784261e3c388d489c915b879a'}, 643 | 'abcd' + '🙂' * 61 + ' (2)': {'md5': '5f19970d9d6df57bd84b506e6d81807e'}, 644 | 'abcd' + '🙂' * 62: {'md5': '51ee3f362dab5fafdb377657487fa09c'}, 645 | 'case (1)': {'md5': 'cf53c713e71b4765ebbe560c8e826868'}, 646 | 'case (2)': {'md5': '0f94a61da6aaa86267cd006c6812582a'}, 647 | 'case': {'md5': '2c6d2601bfa42243878ef4ddd9940b42'}, 648 | 'dev': {'mode': 'drwxr-xr-x'}, 649 | 'dev/null (1)': {'md5': '0542f8d179a0a5812cca12f9d1a20768'}, 650 | 'dev/null (2)': {'md5': '146840ea79bf74bd86d1e73c3a166d4b'}, 651 | 'dev/null': {'md5': '2a62812a0e6f22b55507ef85c0e3e3e4'}, 652 | 'foo (1).tar.gz': {'md5': '108c35f79486c56c344d0f064e4a511a'}, 653 | 'foo (2).tar.gz': {'md5': '387ccc3f6b2333031dc50e733f7827b2'}, 654 | 'foo (3).tar.gz': {'md5': '711ab4fd640632037360f79cda1fdc2b'}, 655 | 'foo (4).tar.gz': {'md5': '82fd4edb638dae95d133c2c870bc09eb'}, 656 | 'foo (5).tar.gz': {'md5': '0e6b54d7b2997381121a0b943e8243b4'}, 657 | 'foo.a b (1)': {'md5': 'b9210e8eda5412bf89a20cdac2e0a104'}, 658 | 'foo.a b (2)': {'md5': 'aa32c2818b3e50eda6b8fa566d0fe927'}, 659 | 'foo.a b (3)': {'md5': '30ff74a98043c1d2c015210865d456d6'}, 660 | 'foo.a b (4)': {'md5': '5e9a95548b5b6b53061ec81719bedd8e'}, 661 | 'foo.a b (5)': {'md5': 'b10267c805c7c45a8c5a09c4f36377ea'}, 662 | 'foo.a b': {'md5': '786e84bde86ba0eb1606b4df422a791d'}, 663 | 'foo.tar.gz': {'md5': '06ab92061c8deeabf83b9aefcd0d59b0'}, 664 | 'server': {'mode': 'drwxr-xr-x'}, 665 | 'server/share': {'mode': 'drwxr-xr-x'}, 666 | 'server/share/file (1)': {'md5': 'bcfef6ccd938358b6db770eb1d3de17f'}, 667 | 'server/share/file (2)': {'md5': '422825a9e933d11cf4c2f5c0f03e8224'}, 668 | 'server/share/file': {'md5': '6bf0dd24273206e58f6dae18c4e0c5d6'}, 669 | 'u': {'mode': 'drwxr-xr-x'}, 670 | 'u/v': {'mode': 'drwxr-xr-x'}, 671 | 'u/v/w': {'mode': 'drwxr-xr-x'}, 672 | 'u/v/w/x': {'mode': 'drwxr-xr-x'}, 673 | 'u/v/w/x/y': {'mode': 'drwxr-xr-x'}, 674 | 'u/v/w/x/y/z (1)': {'md5': '92ca5594530ebbe26df838c6e789a669'}, 675 | 'u/v/w/x/y/z (2)': {'md5': '5780324871ddfae6538bd0d427e1c731'}, 676 | 'u/v/w/x/y/z': {'md5': '7913f1d77a8a8d35cb62da4e8cba336a'}, 677 | '~ (1)': {'md5': 'db7971e041320de89f83b3caa3c11c7e'}, 678 | '~ (2)': {'md5': '115d04c23c77c6490bd9aebe9cfde881'}, 679 | '~': {'md5': '5dc8143d7f881a02622daaeabf714329'}, 680 | '🏳\u200d🌈' * 22 + ' (1)': {'md5': 'e15a50f8eb3fccdc26132fa06fa1205f'}, 681 | '🏳\u200d🌈' * 22 + ' (2)': {'md5': 'e5918d1b19a95d6a0724bca2b9e74878'}, 682 | '🏳\u200d🌈' * 23: {'md5': '8c29470e347f44ec20cd684c0f192945'}, 683 | '🙂' * 62 + ' (1)': {'md5': '0ca3c0471e4176f8e223d69ffb67e847'}, 684 | '🙂' * 62 + ' (2)': {'md5': '6c191a9c421da46230b4367e4b8e08d9'}, 685 | '🙂' * 63: {'md5': '9ba840cf76707d55db222c1b90cedbfb'}, 686 | }, 687 | 'romeo.txt.gz.uu': { 688 | '.': {'mode': 'drwxr-xr-x'}, 689 | 'romeo.txt.gz': {'mode': '-rw-r--r--', 'size': 558, 'md5': 'f261bc929b34f58d8138413ed6252f2d'} 690 | }, 691 | 'zeroes-256mib.tar.gz': { 692 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 693 | 'zeroes': {'mode': '-rw-r--r--', 'mtime': 1630037295000000000, 'size': 268435456, 'md5': '1f5039e50bd66b290c56684d8550c6c2'}, 694 | }, 695 | 'dot-slash-foo.tar': { 696 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 697 | 'foo': {'mode': '-rw-r--r--', 'mtime': 1641016352000000000, 'size': 0, 'md5': 'd41d8cd98f00b204e9800998ecf8427e'}, 698 | }, 699 | 'sparse.tar.gz': { 700 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 701 | # https://github.com/google/fuse-archive/issues/40 702 | 'sparse': {'mode': '-rw-r--r--', 'size': 1073741824, 'md5': '5e4001589ffa2c5135f413a13e6800ef'}, 703 | } 704 | } 705 | 706 | for zip_name, want_tree in want_trees.items(): 707 | MountArchiveAndCheckTree(zip_name, want_tree, options=options) 708 | 709 | 710 | def TestHardlinks(options=[]): 711 | zip_name = 'hardlinks.tgz' 712 | 713 | want_tree = { 714 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 3, 'mtime': 1727754916000000000}, 715 | 'Dir1': {'ino': 3, 'mode': 'drwxr-xr-x', 'nlink': 3, 'mtime': 1727754809000000000}, 716 | 'Dir1/Dir2': {'ino': 4, 'mode': 'drwxr-xr-x', 'nlink': 2, 'mtime': 1727754818000000000}, 717 | 'Dir1/Dir2/File': {'ino': 2, 'mode': '-rw-r--r--', 'nlink': 7, 'mtime': 1727754740000000000, 'size': 35, 'md5': '972fc6414a197a62c6c84fe8da0cf5ca'}, 718 | 'Dir1/File': {'ino': 2, 'mode': '-rw-r--r--', 'nlink': 7, 'mtime': 1727754740000000000, 'size': 35, 'md5': '972fc6414a197a62c6c84fe8da0cf5ca'}, 719 | 'File1': {'ino': 2, 'mode': '-rw-r--r--', 'nlink': 7, 'mtime': 1727754740000000000, 'size': 35, 'md5': '972fc6414a197a62c6c84fe8da0cf5ca'}, 720 | 'File2': {'ino': 2, 'mode': '-rw-r--r--', 'nlink': 7, 'mtime': 1727754740000000000, 'size': 35, 'md5': '972fc6414a197a62c6c84fe8da0cf5ca'}, 721 | 'File3': {'ino': 2, 'mode': '-rw-r--r--', 'nlink': 7, 'mtime': 1727754740000000000, 'size': 35, 'md5': '972fc6414a197a62c6c84fe8da0cf5ca'}, 722 | 'File4': {'ino': 2, 'mode': '-rw-r--r--', 'nlink': 7, 'mtime': 1727754740000000000, 'size': 35, 'md5': '972fc6414a197a62c6c84fe8da0cf5ca'}, 723 | 'File5': {'ino': 2, 'mode': '-rw-r--r--', 'nlink': 7, 'mtime': 1727754740000000000, 'size': 35, 'md5': '972fc6414a197a62c6c84fe8da0cf5ca'}, 724 | 'Symlink1': {'ino': 5, 'mode': 'lrwxr-xr-x', 'nlink': 3, 'mtime': 1727754873000000000, 'target': 'Target'}, 725 | 'Symlink2': {'ino': 5, 'mode': 'lrwxr-xr-x', 'nlink': 3, 'mtime': 1727754873000000000, 'target': 'Target'}, 726 | 'Symlink3': {'ino': 5, 'mode': 'lrwxr-xr-x', 'nlink': 3, 'mtime': 1727754873000000000, 'target': 'Target'}, 727 | } 728 | 729 | MountArchiveAndCheckTree(zip_name, want_tree, want_blocks=15, want_inodes=5, options=options) 730 | 731 | want_tree = { 732 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 3, 'mtime': 1727754916000000000}, 733 | 'Dir1': {'ino': 3, 'mode': 'drwxr-xr-x', 'nlink': 3, 'mtime': 1727754809000000000}, 734 | 'Dir1/Dir2': {'ino': 4, 'mode': 'drwxr-xr-x', 'nlink': 2, 'mtime': 1727754818000000000}, 735 | 'File4': {'ino': 2, 'mode': '-rw-r--r--', 'nlink': 1, 'mtime': 1727754740000000000, 'size': 35, 'md5': '972fc6414a197a62c6c84fe8da0cf5ca'}, 736 | 'Symlink2': {'ino': 5, 'mode': 'lrwxr-xr-x', 'nlink': 1, 'mtime': 1727754873000000000, 'target': 'Target'}, 737 | } 738 | 739 | MountArchiveAndCheckTree(zip_name, want_tree, want_blocks=7, want_inodes=5, options=options + ['-o', 'nohardlinks']) 740 | 741 | 742 | # Tests dmask and fmask. 743 | def TestMasks(): 744 | want_tree = { 745 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 24}, 746 | 'Dir000': {'mode': 'drwxr-xr-x'}, 747 | 'Dir001': {'mode': 'drwxr-xr-x'}, 748 | 'Dir002': {'mode': 'drwxr-xr-x'}, 749 | 'Dir003': {'mode': 'drwxr-xr-x'}, 750 | 'Dir004': {'mode': 'drwxr-xr-x'}, 751 | 'Dir005': {'mode': 'drwxr-xr-x'}, 752 | 'Dir006': {'mode': 'drwxr-xr-x'}, 753 | 'Dir007': {'mode': 'drwxr-xr-x'}, 754 | 'Dir010': {'mode': 'drwxr-xr-x'}, 755 | 'Dir020': {'mode': 'drwxr-xr-x'}, 756 | 'Dir030': {'mode': 'drwxr-xr-x'}, 757 | 'Dir040': {'mode': 'drwxr-xr-x'}, 758 | 'Dir050': {'mode': 'drwxr-xr-x'}, 759 | 'Dir060': {'mode': 'drwxr-xr-x'}, 760 | 'Dir070': {'mode': 'drwxr-xr-x'}, 761 | 'Dir100': {'mode': 'drwxr-xr-x'}, 762 | 'Dir200': {'mode': 'drwxr-xr-x'}, 763 | 'Dir300': {'mode': 'drwxr-xr-x'}, 764 | 'Dir400': {'mode': 'drwxr-xr-x'}, 765 | 'Dir500': {'mode': 'drwxr-xr-x'}, 766 | 'Dir600': {'mode': 'drwxr-xr-x'}, 767 | 'Dir700': {'mode': 'drwxr-xr-x'}, 768 | 'File000': {'mode': '-rw-r--r--'}, 769 | 'File001': {'mode': '-rwxr-xr-x'}, 770 | 'File002': {'mode': '-rw-r--r--'}, 771 | 'File003': {'mode': '-rwxr-xr-x'}, 772 | 'File004': {'mode': '-rw-r--r--'}, 773 | 'File005': {'mode': '-rwxr-xr-x'}, 774 | 'File006': {'mode': '-rw-r--r--'}, 775 | 'File007': {'mode': '-rwxr-xr-x'}, 776 | 'File010': {'mode': '-rwxr-xr-x'}, 777 | 'File020': {'mode': '-rw-r--r--'}, 778 | 'File030': {'mode': '-rwxr-xr-x'}, 779 | 'File040': {'mode': '-rw-r--r--'}, 780 | 'File050': {'mode': '-rwxr-xr-x'}, 781 | 'File060': {'mode': '-rw-r--r--'}, 782 | 'File070': {'mode': '-rwxr-xr-x'}, 783 | 'File100': {'mode': '-rwxr-xr-x'}, 784 | 'File200': {'mode': '-rw-r--r--'}, 785 | 'File300': {'mode': '-rwxr-xr-x'}, 786 | 'File400': {'mode': '-rw-r--r--'}, 787 | 'File500': {'mode': '-rwxr-xr-x'}, 788 | 'File600': {'mode': '-rw-r--r--'}, 789 | 'File700': {'mode': '-rwxr-xr-x'}, 790 | } 791 | 792 | MountArchiveAndCheckTree('permissions.tgz', want_tree, use_md5=False) 793 | 794 | want_tree = { 795 | '.': {'ino': 1, 'mode': 'drwx------', 'nlink': 24}, 796 | 'Dir000': {'mode': 'drwx------'}, 797 | 'Dir001': {'mode': 'drwx------'}, 798 | 'Dir002': {'mode': 'drwx------'}, 799 | 'Dir003': {'mode': 'drwx------'}, 800 | 'Dir004': {'mode': 'drwx------'}, 801 | 'Dir005': {'mode': 'drwx------'}, 802 | 'Dir006': {'mode': 'drwx------'}, 803 | 'Dir007': {'mode': 'drwx------'}, 804 | 'Dir010': {'mode': 'drwx------'}, 805 | 'Dir020': {'mode': 'drwx------'}, 806 | 'Dir030': {'mode': 'drwx------'}, 807 | 'Dir040': {'mode': 'drwx------'}, 808 | 'Dir050': {'mode': 'drwx------'}, 809 | 'Dir060': {'mode': 'drwx------'}, 810 | 'Dir070': {'mode': 'drwx------'}, 811 | 'Dir100': {'mode': 'drwx------'}, 812 | 'Dir200': {'mode': 'drwx------'}, 813 | 'Dir300': {'mode': 'drwx------'}, 814 | 'Dir400': {'mode': 'drwx------'}, 815 | 'Dir500': {'mode': 'drwx------'}, 816 | 'Dir600': {'mode': 'drwx------'}, 817 | 'Dir700': {'mode': 'drwx------'}, 818 | 'File000': {'mode': '-rw-r--r--'}, 819 | 'File001': {'mode': '-rwxr-xr-x'}, 820 | 'File002': {'mode': '-rw-r--r--'}, 821 | 'File003': {'mode': '-rwxr-xr-x'}, 822 | 'File004': {'mode': '-rw-r--r--'}, 823 | 'File005': {'mode': '-rwxr-xr-x'}, 824 | 'File006': {'mode': '-rw-r--r--'}, 825 | 'File007': {'mode': '-rwxr-xr-x'}, 826 | 'File010': {'mode': '-rwxr-xr-x'}, 827 | 'File020': {'mode': '-rw-r--r--'}, 828 | 'File030': {'mode': '-rwxr-xr-x'}, 829 | 'File040': {'mode': '-rw-r--r--'}, 830 | 'File050': {'mode': '-rwxr-xr-x'}, 831 | 'File060': {'mode': '-rw-r--r--'}, 832 | 'File070': {'mode': '-rwxr-xr-x'}, 833 | 'File100': {'mode': '-rwxr-xr-x'}, 834 | 'File200': {'mode': '-rw-r--r--'}, 835 | 'File300': {'mode': '-rwxr-xr-x'}, 836 | 'File400': {'mode': '-rw-r--r--'}, 837 | 'File500': {'mode': '-rwxr-xr-x'}, 838 | 'File600': {'mode': '-rw-r--r--'}, 839 | 'File700': {'mode': '-rwxr-xr-x'}, 840 | } 841 | 842 | MountArchiveAndCheckTree('permissions.tgz', want_tree, use_md5=False, options=['-o', 'dmask=077']) 843 | 844 | want_tree = { 845 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 24}, 846 | 'Dir000': {'mode': 'drwxr-xr-x'}, 847 | 'Dir001': {'mode': 'drwxr-xr-x'}, 848 | 'Dir002': {'mode': 'drwxr-xr-x'}, 849 | 'Dir003': {'mode': 'drwxr-xr-x'}, 850 | 'Dir004': {'mode': 'drwxr-xr-x'}, 851 | 'Dir005': {'mode': 'drwxr-xr-x'}, 852 | 'Dir006': {'mode': 'drwxr-xr-x'}, 853 | 'Dir007': {'mode': 'drwxr-xr-x'}, 854 | 'Dir010': {'mode': 'drwxr-xr-x'}, 855 | 'Dir020': {'mode': 'drwxr-xr-x'}, 856 | 'Dir030': {'mode': 'drwxr-xr-x'}, 857 | 'Dir040': {'mode': 'drwxr-xr-x'}, 858 | 'Dir050': {'mode': 'drwxr-xr-x'}, 859 | 'Dir060': {'mode': 'drwxr-xr-x'}, 860 | 'Dir070': {'mode': 'drwxr-xr-x'}, 861 | 'Dir100': {'mode': 'drwxr-xr-x'}, 862 | 'Dir200': {'mode': 'drwxr-xr-x'}, 863 | 'Dir300': {'mode': 'drwxr-xr-x'}, 864 | 'Dir400': {'mode': 'drwxr-xr-x'}, 865 | 'Dir500': {'mode': 'drwxr-xr-x'}, 866 | 'Dir600': {'mode': 'drwxr-xr-x'}, 867 | 'Dir700': {'mode': 'drwxr-xr-x'}, 868 | 'File000': {'mode': '-rw-------'}, 869 | 'File001': {'mode': '-rwx------'}, 870 | 'File002': {'mode': '-rw-------'}, 871 | 'File003': {'mode': '-rwx------'}, 872 | 'File004': {'mode': '-rw-------'}, 873 | 'File005': {'mode': '-rwx------'}, 874 | 'File006': {'mode': '-rw-------'}, 875 | 'File007': {'mode': '-rwx------'}, 876 | 'File010': {'mode': '-rwx------'}, 877 | 'File020': {'mode': '-rw-------'}, 878 | 'File030': {'mode': '-rwx------'}, 879 | 'File040': {'mode': '-rw-------'}, 880 | 'File050': {'mode': '-rwx------'}, 881 | 'File060': {'mode': '-rw-------'}, 882 | 'File070': {'mode': '-rwx------'}, 883 | 'File100': {'mode': '-rwx------'}, 884 | 'File200': {'mode': '-rw-------'}, 885 | 'File300': {'mode': '-rwx------'}, 886 | 'File400': {'mode': '-rw-------'}, 887 | 'File500': {'mode': '-rwx------'}, 888 | 'File600': {'mode': '-rw-------'}, 889 | 'File700': {'mode': '-rwx------'}, 890 | } 891 | 892 | MountArchiveAndCheckTree('permissions.tgz', want_tree, use_md5=False, options=['-o', 'fmask=077']) 893 | 894 | want_tree = { 895 | '.': {'ino': 1, 'mode': 'drwxrwxrwx', 'nlink': 24}, 896 | 'Dir000': {'mode': 'drwxrwxrwx'}, 897 | 'Dir001': {'mode': 'drwxrwxrwx'}, 898 | 'Dir002': {'mode': 'drwxrwxrwx'}, 899 | 'Dir003': {'mode': 'drwxrwxrwx'}, 900 | 'Dir004': {'mode': 'drwxrwxrwx'}, 901 | 'Dir005': {'mode': 'drwxrwxrwx'}, 902 | 'Dir006': {'mode': 'drwxrwxrwx'}, 903 | 'Dir007': {'mode': 'drwxrwxrwx'}, 904 | 'Dir010': {'mode': 'drwxrwxrwx'}, 905 | 'Dir020': {'mode': 'drwxrwxrwx'}, 906 | 'Dir030': {'mode': 'drwxrwxrwx'}, 907 | 'Dir040': {'mode': 'drwxrwxrwx'}, 908 | 'Dir050': {'mode': 'drwxrwxrwx'}, 909 | 'Dir060': {'mode': 'drwxrwxrwx'}, 910 | 'Dir070': {'mode': 'drwxrwxrwx'}, 911 | 'Dir100': {'mode': 'drwxrwxrwx'}, 912 | 'Dir200': {'mode': 'drwxrwxrwx'}, 913 | 'Dir300': {'mode': 'drwxrwxrwx'}, 914 | 'Dir400': {'mode': 'drwxrwxrwx'}, 915 | 'Dir500': {'mode': 'drwxrwxrwx'}, 916 | 'Dir600': {'mode': 'drwxrwxrwx'}, 917 | 'Dir700': {'mode': 'drwxrwxrwx'}, 918 | 'File000': {'mode': '-rw-rw-rw-'}, 919 | 'File001': {'mode': '-rwxrwxrwx'}, 920 | 'File002': {'mode': '-rw-rw-rw-'}, 921 | 'File003': {'mode': '-rwxrwxrwx'}, 922 | 'File004': {'mode': '-rw-rw-rw-'}, 923 | 'File005': {'mode': '-rwxrwxrwx'}, 924 | 'File006': {'mode': '-rw-rw-rw-'}, 925 | 'File007': {'mode': '-rwxrwxrwx'}, 926 | 'File010': {'mode': '-rwxrwxrwx'}, 927 | 'File020': {'mode': '-rw-rw-rw-'}, 928 | 'File030': {'mode': '-rwxrwxrwx'}, 929 | 'File040': {'mode': '-rw-rw-rw-'}, 930 | 'File050': {'mode': '-rwxrwxrwx'}, 931 | 'File060': {'mode': '-rw-rw-rw-'}, 932 | 'File070': {'mode': '-rwxrwxrwx'}, 933 | 'File100': {'mode': '-rwxrwxrwx'}, 934 | 'File200': {'mode': '-rw-rw-rw-'}, 935 | 'File300': {'mode': '-rwxrwxrwx'}, 936 | 'File400': {'mode': '-rw-rw-rw-'}, 937 | 'File500': {'mode': '-rwxrwxrwx'}, 938 | 'File600': {'mode': '-rw-rw-rw-'}, 939 | 'File700': {'mode': '-rwxrwxrwx'}, 940 | } 941 | 942 | MountArchiveAndCheckTree('permissions.tgz', want_tree, use_md5=False, options=['-o', 'dmask=0,fmask=0']) 943 | 944 | 945 | # Tests the archive with lots of files. 946 | def TestArchiveWithManyFiles(): 947 | # Only check a few files: the first one, the last one, and one in the middle. 948 | want_tree = { 949 | '1': { 950 | 'mode': '-rw-r--r--', 951 | 'mtime': 1371243195000000000, 952 | 'size': 0, 953 | }, 954 | '30000': { 955 | 'mode': '-rw-r--r--', 956 | 'mtime': 1371243200000000000, 957 | 'size': 0, 958 | }, 959 | '65536': { 960 | 'mode': '-rw-r--r--', 961 | 'mtime': 1371243206000000000, 962 | 'size': 0, 963 | }, 964 | } 965 | 966 | MountArchiveAndCheckTree( 967 | '65536-files.zip', 968 | want_tree, 969 | want_blocks=65537, 970 | want_inodes=65537, 971 | strict=False, 972 | use_md5=False, 973 | ) 974 | 975 | want_tree = { 976 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file': { 977 | 'size': 0, 978 | }, 979 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (1)': { 980 | 'size': 0, 981 | }, 982 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (2)': { 983 | 'size': 18, 984 | }, 985 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (3)': { 986 | 'size': 0, 987 | }, 988 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (4)': { 989 | 'size': 19, 990 | }, 991 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (5)': { 992 | 'size': 0, 993 | }, 994 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (50000)': { 995 | 'size': 0, 996 | }, 997 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (99999)': { 998 | 'size': 0, 999 | }, 1000 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (100000)': { 1001 | 'size': 0, 1002 | }, 1003 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (100001)': { 1004 | 'size': 0, 1005 | }, 1006 | 'a/b/c/d/e/f/g/h/i/j/There are many versions of this file (100002)': { 1007 | 'size': 8, 1008 | }, 1009 | } 1010 | 1011 | MountArchiveAndCheckTree( 1012 | 'collisions.zip', 1013 | want_tree, 1014 | want_blocks=100017, 1015 | want_inodes=100014, 1016 | strict=False, 1017 | use_md5=False, 1018 | ) 1019 | 1020 | 1021 | # Tests that a big file can be accessed in random order. 1022 | def TestBigArchiveRandomOrder(options=[]): 1023 | zip_name = 'big.zip' 1024 | s = f'Test {zip_name!r}' 1025 | if options: s += f', options = {" ".join(options)!r}' 1026 | logging.info(s) 1027 | with tempfile.TemporaryDirectory() as mount_point: 1028 | zip_path = os.path.join(script_dir, 'data', zip_name) 1029 | logging.debug(f'Mounting {zip_path!r} on {mount_point!r}...') 1030 | subprocess.run( 1031 | [mount_program] + options + [zip_path, mount_point], 1032 | check=True, 1033 | capture_output=True, 1034 | input='', 1035 | encoding='UTF-8', 1036 | ) 1037 | try: 1038 | logging.debug(f'Mounted archive {zip_path!r} on {mount_point!r}') 1039 | 1040 | GetTree(mount_point, use_md5=False) 1041 | st = os.statvfs(mount_point) 1042 | 1043 | want_blocks = 10546877 1044 | if st.f_blocks != want_blocks: 1045 | LogError( 1046 | f'Mismatch for st.f_blocks: got: {st.f_blocks}, want: {want_blocks}' 1047 | ) 1048 | 1049 | want_inodes = 2 1050 | if st.f_files != want_inodes: 1051 | LogError( 1052 | f'Mismatch for st.f_files: got: {st.f_files}, want: {want_inodes}' 1053 | ) 1054 | 1055 | fd = os.open(os.path.join(mount_point, 'big.txt'), os.O_RDONLY) 1056 | try: 1057 | random.seed() 1058 | n = 100000000 1059 | for j in [random.randrange(n) for i in range(100)] + [n - 1, 0, n - 1]: 1060 | logging.debug(f'Getting line {j}...') 1061 | want_line = b'%08d The quick brown fox jumps over the lazy dog.\n' % j 1062 | got_line = os.pread(fd, len(want_line), j * len(want_line)) 1063 | if got_line != want_line: 1064 | LogError( 1065 | f'Want line: {want_line!r}, Got line: {got_line!r}') 1066 | got_line = os.pread(fd, 100, j * len(want_line)) 1067 | if got_line != want_line: 1068 | LogError( 1069 | f'Want line: {want_line!r}, Got line: {got_line!r}') 1070 | got_line = os.pread(fd, 100, n * len(want_line)) 1071 | if got_line: 1072 | LogError(f'Want empty line, Got line: {got_line!r}') 1073 | finally: 1074 | os.close(fd) 1075 | finally: 1076 | logging.debug(f'Unmounting {zip_path!r} from {mount_point!r}...') 1077 | subprocess.run(['fusermount', '-u', '-z', mount_point], check=True) 1078 | logging.debug(f'Unmounted {zip_path!r} from {mount_point!r}') 1079 | 1080 | 1081 | # Tests that a big file can be accessed in somewhat globally increasing order 1082 | # even with no cache file. 1083 | def TestBigArchiveStreamed(options=[]): 1084 | zip_name = 'big.zip' 1085 | s = f'Test {zip_name!r}' 1086 | if options: s += f', options = {" ".join(options)!r}' 1087 | logging.info(s) 1088 | with tempfile.TemporaryDirectory() as mount_point: 1089 | zip_path = os.path.join(script_dir, 'data', zip_name) 1090 | logging.debug(f'Mounting {zip_path!r} on {mount_point!r}...') 1091 | subprocess.run( 1092 | [mount_program] + options + [zip_path, mount_point], 1093 | check=True, 1094 | capture_output=True, 1095 | input='', 1096 | encoding='UTF-8', 1097 | ) 1098 | try: 1099 | logging.debug(f'Mounted archive {zip_path!r} on {mount_point!r}') 1100 | GetTree(mount_point, use_md5=False) 1101 | fd = os.open(os.path.join(mount_point, 'big.txt'), os.O_RDONLY) 1102 | try: 1103 | random.seed() 1104 | n = 100000000 1105 | for i in [(r * 2 + 1) * n // 20 for r in range(10)] + [n - 1]: 1106 | for k in range(3): 1107 | j = i - k * 1000000 1108 | if j < 0: continue 1109 | logging.debug(f'Getting line {j}...') 1110 | want_line = b'%08d The quick brown fox jumps over the lazy dog.\n' % j 1111 | got_line = os.pread(fd, len(want_line), j * len(want_line)) 1112 | if got_line != want_line: 1113 | LogError( 1114 | f'Want line: {want_line!r}, Got line: {got_line!r}') 1115 | finally: 1116 | os.close(fd) 1117 | finally: 1118 | logging.debug(f'Unmounting {zip_path!r} from {mount_point!r}...') 1119 | subprocess.run(['fusermount', '-u', '-z', mount_point], check=True) 1120 | logging.debug(f'Unmounted {zip_path!r} from {mount_point!r}') 1121 | 1122 | 1123 | # Tests encrypted archive. 1124 | def TestEncryptedArchive(options=[]): 1125 | zip_name = 'different-encryptions.zip' 1126 | 1127 | # With correct password. 1128 | want_tree = { 1129 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 1130 | 'Encrypted ZipCrypto.txt': { 1131 | 'mode': '-rw-r--r--', 1132 | 'size': 34, 1133 | 'md5': '275e8c5aed7e7ce2f32dd1e5e9ee4a5b', 1134 | }, 1135 | 'Encrypted AES-256.txt': { 1136 | 'mode': '-rw-r--r--', 1137 | 'size': 32, 1138 | 'md5': 'ca5e064a0835d186f2f6326f88a7078f', 1139 | }, 1140 | 'Encrypted AES-192.txt': { 1141 | 'mode': '-rw-r--r--', 1142 | 'size': 32, 1143 | 'md5': 'e48d57930ef96ff2ad45867202d3250d', 1144 | }, 1145 | 'Encrypted AES-128.txt': { 1146 | 'mode': '-rw-r--r--', 1147 | 'size': 32, 1148 | 'md5': '07c4edd2a55c9d5614457a21fb40aa56', 1149 | }, 1150 | 'ClearText.txt': { 1151 | 'mode': '-rw-r--r--', 1152 | 'size': 23, 1153 | 'md5': '7a542815e2c51837b3d8a8b2ebf36490', 1154 | }, 1155 | } 1156 | 1157 | for password in ['password', 'password\n', 'password\nThis line is ignored...\n']: 1158 | MountArchiveAndCheckTree( 1159 | zip_name, want_tree, want_blocks=11, want_inodes=6, options=options, password=password, 1160 | ) 1161 | 1162 | # With wrong or no password. 1163 | CheckArchiveMountingError(zip_name, 21, options=options, password='wrong password') 1164 | CheckArchiveMountingError(zip_name, 20, options=options, password='\n') 1165 | CheckArchiveMountingError(zip_name, 20, options=options) 1166 | 1167 | # With wrong or no password and `-o force` option. 1168 | want_tree = { 1169 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 1170 | 'Encrypted ZipCrypto.txt': { 1171 | 'mode': '-rw-r--r--', 1172 | 'size': 34, 1173 | 'errno': 5, 1174 | }, 1175 | 'Encrypted AES-256.txt': { 1176 | 'mode': '-rw-r--r--', 1177 | 'size': 32, 1178 | 'errno': 5, 1179 | }, 1180 | 'Encrypted AES-192.txt': { 1181 | 'mode': '-rw-r--r--', 1182 | 'size': 32, 1183 | 'errno': 5, 1184 | }, 1185 | 'Encrypted AES-128.txt': { 1186 | 'mode': '-rw-r--r--', 1187 | 'size': 32, 1188 | 'errno': 5, 1189 | }, 1190 | 'ClearText.txt': { 1191 | 'mode': '-rw-r--r--', 1192 | 'size': 23, 1193 | 'md5': '7a542815e2c51837b3d8a8b2ebf36490', 1194 | }, 1195 | } 1196 | for password in ['wrong password', '\n', '']: 1197 | MountArchiveAndCheckTree( 1198 | zip_name, want_tree, want_inodes=6, options=options + ['-o', 'force'], password=password, 1199 | ) 1200 | 1201 | 1202 | # Tests the default_permissions, nosymlinks and nospecials mount options. 1203 | def TestArchiveWithSpecialFiles(): 1204 | zip_name = 'specials.tar.gz' 1205 | 1206 | want_tree = { 1207 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 1208 | 'block': {'mode': 'brw-r--r--', 'mtime': 1564833480000000000, 'rdev': 2049}, 1209 | 'char': {'mode': 'crw-r--r--', 'mtime': 1564833480000000000, 'rdev': 1024}, 1210 | 'fifo': {'mode': 'prw-r--r--', 'mtime': 1565809123000000000}, 1211 | 'regular': {'mode': '-rw-r--r--', 'mtime': 1565290018000000000, 'size': 32, 'md5': '456e611a5420b7dd09bae143a7b2deb0'}, 1212 | 'symlink': {'mode': 'lrwxr-xr-x', 'mtime': 1564834729000000000, 'target': 'regular'}, 1213 | } 1214 | 1215 | MountArchiveAndCheckTree(zip_name, want_tree, want_blocks=8, want_inodes=6) 1216 | 1217 | # Test -o default_permissions 1218 | want_tree = { 1219 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 1220 | 'block': {'mode': 'brw-rw----', 'uid': 0, 'gid': 6, 'rdev': 2049}, 1221 | 'char': {'mode': 'crw--w----', 'uid': 0, 'gid': 5, 'rdev': 1024}, 1222 | 'fifo': {'mode': 'prw-r--r--', 'uid': 1000, 'gid': 1000}, 1223 | 'regular': {'mode': '-rw-r--r--', 'uid': 1000, 'gid': 1000, 'size': 32, 'md5': '456e611a5420b7dd09bae143a7b2deb0'}, 1224 | 'symlink': {'mode': 'lrwxrwxrwx', 'uid': 1000, 'gid': 1000, 'target': 'regular'}, 1225 | } 1226 | 1227 | MountArchiveAndCheckTree( 1228 | zip_name, want_tree, want_blocks=8, want_inodes=6, options=['-o', 'default_permissions'],) 1229 | 1230 | # Test -o nosymlinks 1231 | want_tree = { 1232 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 1233 | 'block': {'mode': 'brw-r--r--', 'mtime': 1564833480000000000, 'rdev': 2049}, 1234 | 'char': {'mode': 'crw-r--r--', 'mtime': 1564833480000000000, 'rdev': 1024}, 1235 | 'fifo': {'mode': 'prw-r--r--', 'mtime': 1565809123000000000}, 1236 | 'regular': {'mode': '-rw-r--r--', 'mtime': 1565290018000000000, 'size': 32, 'md5': '456e611a5420b7dd09bae143a7b2deb0'}, 1237 | } 1238 | 1239 | MountArchiveAndCheckTree( 1240 | zip_name, 1241 | want_tree, 1242 | want_blocks=6, 1243 | want_inodes=5, 1244 | options=['-o', 'nosymlinks'], 1245 | ) 1246 | 1247 | # Test -o nospecials 1248 | want_tree = { 1249 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 1250 | 'regular': {'mode': '-rw-r--r--', 'mtime': 1565290018000000000, 'size': 32, 'md5': '456e611a5420b7dd09bae143a7b2deb0'}, 1251 | 'symlink': {'mode': 'lrwxr-xr-x', 'mtime': 1564834729000000000, 'target': 'regular'}, 1252 | } 1253 | 1254 | MountArchiveAndCheckTree( 1255 | zip_name, 1256 | want_tree, 1257 | want_blocks=5, 1258 | want_inodes=3, 1259 | options=['-o', 'nospecials'], 1260 | ) 1261 | 1262 | # Tests -o nosymlinks and -o nospecials together 1263 | want_tree = { 1264 | '.': {'ino': 1, 'mode': 'drwxr-xr-x', 'nlink': 2}, 1265 | 'regular': {'mode': '-rw-r--r--', 'mtime': 1565290018000000000, 'size': 32, 'md5': '456e611a5420b7dd09bae143a7b2deb0'}, 1266 | } 1267 | 1268 | MountArchiveAndCheckTree( 1269 | zip_name, 1270 | want_tree, 1271 | want_blocks=3, 1272 | want_inodes=2, 1273 | options=['-o', 'nosymlinks,nospecials'], 1274 | ) 1275 | 1276 | 1277 | # Tests invalid and absent archives. 1278 | def TestInvalidArchive(): 1279 | CheckArchiveMountingError('', 11) 1280 | CheckArchiveMountingError('absent.zip', 11) 1281 | CheckArchiveMountingError('romeo.txt', 30) 1282 | 1283 | # https://github.com/google/fuse-archive/issues/38 1284 | CheckArchiveMountingError('empty', 30) 1285 | CheckArchiveMountingError('empty.gz', 30) 1286 | 1287 | # https://github.com/google/fuse-archive/issues/36 1288 | CheckArchiveMountingError('truncated.7z', 32) 1289 | 1290 | # 7Z encryption is not supported 1291 | CheckArchiveMountingError("encrypted.7z", 22, password='password') 1292 | CheckArchiveMountingError("encrypted-solidly.7z", 22, password='password') 1293 | 1294 | if os.getuid() != 0: 1295 | with tempfile.NamedTemporaryFile() as f: 1296 | os.chmod(f.name, 0) 1297 | CheckArchiveMountingError(f.name, 11) 1298 | 1299 | 1300 | logging.getLogger().setLevel('INFO') 1301 | 1302 | TestArchiveWithOptions() 1303 | TestArchiveWithOptions(['-o', 'nocache']) 1304 | TestArchiveWithOptions(['-o', 'lazycache']) 1305 | TestHardlinks() 1306 | TestHardlinks(['-o', 'nocache']) 1307 | TestHardlinks(['-o', 'lazycache']) 1308 | TestArchiveWithSpecialFiles() 1309 | TestEncryptedArchive() 1310 | TestEncryptedArchive(['-o', 'nocache']) 1311 | TestEncryptedArchive(['-o', 'lazycache']) 1312 | TestInvalidArchive() 1313 | TestMasks() 1314 | TestArchiveWithManyFiles() 1315 | TestBigArchiveRandomOrder(['-o', 'direct_io']) 1316 | TestBigArchiveRandomOrder(['-o', 'lazycache,direct_io']) 1317 | TestBigArchiveStreamed(['-o', 'nocache,direct_io']) 1318 | 1319 | if error_count: 1320 | LogError(f'FAIL: There were {error_count} errors') 1321 | sys.exit(1) 1322 | else: 1323 | logging.info('PASS: All tests passed') 1324 | --------------------------------------------------------------------------------