写这篇博客主要是为了记录一下这两天来的研究成果-gz带原有文件名压缩。首先要说的是这个解决方案不是通过调用命令gzip来做的,而是通过java代码来实现的,其中用到了apache的common compress类库。

首先来了解一下问题:

对于gz文件,我想对于使用Linux的同学们来说应该非常的熟悉了。那好,现在有一个文件叫a.txt, 我现在要把它压缩成b.gz。可以猜想一下,解压后的文件是

1. a.txt

2. b.txt

3. b

猜到了没,答案是3。为什么?为什么用gzip -c压缩a.txt,解压出来还是a.txt。而使用代码(通常是GZIPOutputStream)压缩后,解压的却是b,而且连个扩展名也没有。

这个问题还得从gz的设计目的说起。对于gz这种压缩格式,设计当初的目的是用来压缩单个平面文件的。也就是说如果想压缩多个文件,就要用到tar命令。如果想保留原文件名就要用文件名+.gz来做,如a.txt -> a.txt.gz。默认情况下,gz并不负责对文件名的处理。那么gzip -c又是如何做到保留原文件名这点的呢?

这里就要说一下gz的文件格式标准了,参见gz文件格式RFC。里面明确提到了在gz文件头里有一个标志位用于控制gz文件的一下扩展属性。

+---+---+---+---+---+---+---+---+---+---+
|ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->)
+---+---+---+---+---+---+---+---+---+---+
(if FLG.FEXTRA set)
+---+---+=================================+
| XLEN |...XLEN bytes of "extra field"...| (more-->)
+---+---+=================================+
(if FLG.FNAME set)
+=========================================+
|...original file name, zero-terminated...| (more-->)
+=========================================+

(if FLG.FCOMMENT set)
+===================================+
|...file comment, zero-terminated...| (more-->)
+===================================+
(if FLG.FHCRC set)
+---+---+
| CRC16 |
+---+---+
+=======================+
|...compressed blocks...| (more-->)
+=======================+
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| CRC32 | ISIZE |
+---+---+---+---+---+---+---+---+

一个实际的gz文件样子

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdEAAABvCAYAAACzdPoqAAAYIGlDQ1BJQ0MgUHJvZmlsZQAAWAmteXdYFEuzd89sYoFd8pJhyUlyzjmD5KzknFlyEAEBCQoCiggoCioiKogSJYmCIhwEFFRMBJEgKgYEBeQOHj3nvd+9979vnmd7f1tdXV1d1d1TVQsAx02vyMhQmB6AsPAYiq2xHtnZxZWMewlgQAIsSCvk5RMdqWttbQH+z+fbJIB2Ox9J7sr6P9n+9w4GX79oHwAga6Tb2zfaJwzBNwFAtflEUmIAwOzKE4yPidzFxxDMTEEURPD5XRzwN27bxd5/4+FfPPa2+gjPNABUtF5elAAACCsInRznE4DIIdICgGUM9w0KR4aREazlE+jlCwCHJ8KzJywsYhcfQbCo93/ICfgP7OXl/Y9ML6+Af/Dfa0FGIhMbBEVHhnol/vrx/7MJC41F7PXr4UFa2ugQO3Pkm4TYLcHHy9AOwWwILgj0M7X4Tb8YGaNn+5veGRRjao9gZoTncWCsicNvvBgb4qCLYC6EvhUSYb7Lj9gJZgv33muFYEYEC/pE6yO2350LVkoKtHf6zWPh62dgiGBkF8HOlAjbP/yB0XF2f+hJSYH6e//wB3uZ7fqbiPDneVEQ9EsfuMwv1Hh3Xn6EfiUyxnpXz925RsJD9/5eC/zGn2K0y7NL/+EX/Wu9u7oFxgTamyB0RGcUfQzFfpcHWSOKyz/IyBTBiG4omUCKyR+6TmTorz2NjEXZU2Jtd+0giGB/v3CHXRvu0vN8vQx2bYvYBFUJjIAXoAA/4A3CwTYgAwugDwx+t2SEHo7QfEAECEU+FDLdnx7MW8wYZhYzgZnGPPtDQ0b+5gNBwBfBf8v6j/EI3Q4kgfeIVD8Q/Wc2NAdaC62OtkBaHeQjh1ZBq/7pG1lpXfmDf+sagIyV/C1b77f2cf+pvUdQBuX/GeP9z4j/qZMReINYIOAPh0y9zJLM1p/x/64Ya4g1wJpgjbBiqBzUDdQ91G3UIKoT1QrIqB5UG2oY1bWLf+v1ZxYvhLJrlV0LRwNzxIp+IPbXr/A/8/03K8X+w/FbAlGcqAhskVHhIATpC/pnBsdfWgf9DymxCIc3MmMwwmv+jz9+64UWRqyriNZDayJ2RmyMJqE5gCRaAbG4Llob8YEiQv3Xi/99NZLA/5e1436tJQS8RdYRFuOXEIPsJaAfEZlICQoIjCHrIrel3x6yabiP1B6ynIysPNi9e3d5APhi++tOhUgP/6VFyAKguntXHvqX5vkBgNZg5Lph/Jcm3AoAnRwAgyd9Yilxf8tD735hADWgQ04FO+ABAkAUsYgcUALqQAcYAjNgBeyBC3BH9nAgCEM0jgcpIB1kg3xwDJwA5aAK1IBL4CpoAq2gE9wGA2AIjIIJ8BxMg3nwDqyCb2ATgiAcRICYIHaIFxKCJCA5SAXSggwhC8gWcoE8oQAoHIqFUqBDUD5UDJVD56A66DrUDt2GBqEx6Bk0Ay1Bn6EfMAqmhZlhblgYloZVYF3YHLaH98MBcBScBGfCBXAZXA1fgVvg2/AQPAFPw+/gNRRA0aBIKD6UJEoFpY+yQrmi/FEUVCoqD1WKqkZdQ3Uge/ERahq1gvqOxqKZ0GS0JOJJE7QD2gcdhU5FH0GXoy+hW9B30Y/QM+hV9E8MAcOFkcCoYUwxzpgATDwmG1OKuYhpxvQj53ke8w2LxZKwIlhlZLe7YIOxydgj2NPYBmwvdgw7h13D4XDsOAmcJs4K54WLwWXjTuGu4Hpw47h53AYVDRUvlRyVEZUrVThVBlUp1WWqbqpxqgWqTTw9XgivhrfC++IT8YX48/gO/EP8PH6TmoFahFqT2p46mDqduoz6GnU/9QvqLzQ0NPw0qjQ2NEE0aTRlNI0092lmaL7TMtKK0+rT7qONpS2graXtpX1G+4VAIAgTdAiuhBhCAaGOcIfwirBBZCJKEU2JvsSDxApiC3Gc+IEOTydEp0vnTpdEV0p3g+4h3Qo9nl6YXp/eiz6VvoK+nf4J/RoDE4MsgxVDGMMRhssMgwyLjDhGYUZDRl/GTMYaxjuMc0woJgEmfSYfpkNM55n6meaZscwizKbMwcz5zFeZR5hXWRhZFFgcWRJYKli6WKZJKJIwyZQUSiokNZEmST9YuVl1Wf1Yc1mvsY6zrrNxsumw+bHlsTWwTbD9YCezG7KHsBext7K/5EBziHPYcMRznOHo51jhZOZU5/ThzONs4pzigrnEuWy5krlquIa51rh5uI25I7lPcd/hXuEh8ejwBPMc5+nmWeJl4tXiDeI9ztvDu0xmIeuSQ8ll5LvkVT4uPhO+WL5zfCN8m/wi/A78GfwN/C8FqAVUBPwFjgv0CawK8gpaCqYI1gtOCeGFVIQChU4K3RNaFxYRdhI+LNwqvCjCJmIqkiRSL/JClCCqLRolWi36WAwrpiIWInZabFQcFlcUDxSvEH8oAUsoSQRJnJYY24PZo7onfE/1nieStJK6knGS9ZIzUiQpC6kMqVapD9KC0q7SRdL3pH/KKMqEypyXeS7LKGsmmyHbIftZTlzOR65C7rE8Qd5I/qB8m/wnBQkFP4UzCk8VmRQtFQ8r9iluKykrUZSuKS0pCyp7KlcqP1FhVrFWOaJyXxWjqqd6ULVT9buaklqMWpPaR3VJ9RD1y+qLGiIafhrnNeY0+TW9NM9pTmuRtTy1zmpNa/Npe2lXa8/qCOj46lzUWdAV0w3WvaL7QU9Gj6LXrLeur6Z/QL/XAGVgbJBnMGLIaOhgWG74yojfKMCo3mjVWNE42bjXBGNiblJk8sSU29THtM501UzZ7IDZXXNaczvzcvNZC3ELikWHJWxpZlli+WKv0N7wva1WwMrUqsTqpbWIdZT1LRusjbVNhc1bW1nbFNt7dkx2HnaX7b7Z69kX2j93EHWIdehzpHPc51jnuO5k4FTsNO0s7XzAeciFwyXIpc0V5+roetF1zc3Q7YTb/D7Ffdn7JveL7E/YP+jO4R7q3uVB5+HlccMT4+nkedlzy8vKq9przdvUu9J71Uff56TPO18d3+O+S36afsV+C/6a/sX+iwGaASUBS4HagaWBK0H6QeVBn4JNgquC10OsQmpDdkKdQhvCqMI8w9rDGcNDwu9G8EQkRIxFSkRmR05HqUWdiFqlmFMuRkPR+6PbYpiRIHc4VjQ2K3YmTiuuIm4j3jH+RgJDQnjCcKJ4Ym7iQpJR0oVkdLJPcl8KX0p6yswB3QPnUqFU79S+gwIHMw/OpxmnXUqnTg9J/ytDJqM44+shp0MdmdyZaZlzWcZZ9dnEbEr2k8Pqh6ty0DlBOSO58rmncn/m+eY9yJfJL83fOuJz5MFR2aNlR3cK/AtGCpUKzxzDHgs/NlmkXXSpmKE4qXiuxLKk5Tj5eN7xryc8TgyWKpRWnaQ+GXtyusyirO2U4Kljp7bKA8snKvQqGiq5KnMr10/7nh4/o3PmWhV3VX7Vj7NBZ5+eMz7XUi1cXVqDrYmreXve8fy9CyoX6i5yXMy/uF0bXjt9yfbS3TrlurrLXJcL6+H62PqlK/uujF41uNp2TfLauQZSQ34jaIxtXL7ueX2yybyp74bKjWs3hW5WNjM157VALYktq62BrdNtLm1j7WbtfR3qHc23pG7VdvJ1VnSxdBV2U3dndu/0JPWs9Ub2rtwOuD3X59H3/I7zncd3be6O9Jv33x8wGrhzT/dez33N+52DaoPtD1QetA4pDbUMKw43/6X4V/OI0kjLQ+WHbaOqox1jGmPd49rjtx8ZPBp4bPp4aGLvxNikw+TTJ/ueTD/1fbr4LPTZp6m4qc3naS8wL/Je0r8sfcX1qvq12OuGaaXprhmDmeFZu9nncz5z795Ev9maz3xLeFu6wLtQtyi32LlktDS67LY8/y7y3eZK9nuG95UfRD/c/KjzcXjVeXX+E+XTzucjX9i/1H5V+Nq3Zr326lvYt831vA32jUvfVb7f++H0Y2Ezfgu3VbYttt3x0/zni52wnZ1IL4rXr1gAhbSwvz8An2uRvMgFAKZRAKiJf+dGvziQcBdCeBCMQyIFMyQCmIPEkfd2L8wOx8BTKFPUHbQx+jEmDMuA7cOlUGnhcfiX1O00lbSFhFriC3p6BnPGXKZBFgbSPtYr7GgOL84ubjLPEd4NPl/+KcG9QoMi0qIFYu8kTPdUSX6T1pc5KjsqT1DQU4xWqlTuVZlW3VZn1ZDQVNUy1LbV8dGN1svUP2lQb9hj9Mh4yWTHjMV8j4W+pdveIKs46yybYtsqu3r7VuTUDzmNOz9zee0657a47/3+RfcXHiOePV4N3md8jvom+fn72wSoBwoGEYO+Bb8OGQitCzsaHhlhF6kcxRG1RXkV3RtTE5sV5x9vmiCRSJ24nDSc3JhSdiAzNf5gVBolPSkj79C5zK6s14fxORq5kXk1+ZNHqQs0CsOOnSkaKd4+vueEW2neyZay6XKaCsVKj9O5Z5qqnp9DV0vWOJ4/eOHSxbHajTryZYv6lCtNVz81qDUWXv94w+3mwxar1sftGh0xt+o6X3TT9Mj3Ot6O6su6U3S3tL90oOhezv1Dg4cfHB06Opz1V8yI00Oph5ujvWPJ40rj3x49edw+UT554InHU71nQlP4qffPx140vyx/deC157TBjNgs/ez3ubdvJucH395euLXYvtS+fOFdwUrce/cPhh8lVulX1z5Nfe7+cu5r1lrgN/N16Q2mjfXvL370blZvZW77/TTY4d/ZQfyPBRxIdJgA+pGIzgI6Br2G5ZHY6wvKAzWJRE0vMZFYIrYV50fFQTWFr6QOoNGj1STYEwPp0ujPMtxmXGJmYTEgJbI2sH3kkOKkcHXy0PA6ki/z7QjoCqYL9QhviSqLBYuflhja81mKRVpexkTWTS5APkohUfGAUpJysIqbqoWaprqMBr8mixaV1g/t9zozuhN6D/S7DW4Y1hqVGeeYxJsGmrmYm1ioWIrsZbFCW321nrUZs+21a7Q/45DjGO3k7mzqIu/K7YZ1+4Dc9F3uNR55nhFe9t4KPrQ+s77tfoX+/gEagQyBb4NuBReF+IWqhdGFzYW3RuREukRJIPtiJPpsDCVWP44lbiG+PeFIonuSTDKc/CSl4UB+athBhzSDdLUM1UOamSZZztnhhw/nXMi9kzeT//MoV4FqoeOx6KJjxVdKBo+/LYVPcpUpnbIpD6vIr7xyevTMt7P856yrD9W0n/90Uao26tLNuvV61SspV7sbQKPu9UNN/TcxzcYtOa332nEdhrcyOru6vvYI99rdTu47c+fW3Yn+pYH1++hBpgd8Q9LDmn9ZjLg+DByNH8seP/Go+nHDROfk4JPJp/PPvj5HvWB+KfRK5bXFdMBMzezSG5F517fZC5cX7y3NLG+sEN8LfdD+6Laa9mn0i/zXkrUv67YbN3+wbWZtbfyM/+V/NGAA4mAvSAO9SFyvBsVArTAMW8Jn4U2UO+oBWgPdglHB9GGtsXO4ZCpOqnv4o9Q+NBq0nLQ/CbPEIbpm+gsMZYwFTDnMWSzZpHzWErYq9nqONs4uri7ubp4e3m7yLb5m/nqB04L5QrHC+0R0RPnFgNhz8VaJ/D2OkmTJZalm6TQZc1mS7IxcvXysgrYiXvGR0mnlQBUFlQ3VbrUsdXMNRo0pzWqtYG057S2dAd0ivf364vrrBncMC43cjEWMP5t0m+aZOZrzmb+zaLFM22thRbKasa63ibZVt4PtHtgXO7g6kh0XnK45x7qou8Kug26F++z2k/Y/c6/w2O/J7fnS67T3fh8unynfMj9Hfyb/hwH5gYZBANkvcSGyISuhtWHe4VzhTyJKIvdGUUXdpiRFy0evxFyIdY9jjXsYfzhBO2EjsTEpKJmc/Czl+AH7VPbU+YNtacfTEzP8D+3LdMlyy/Y7HJuTlVuadzG/5cjA0YmC+cKvRahiphL+4zIn1Er1T5qV2ZxyKfeuiKg8eLrkzJWqobMfq4VqEs+PXhSpTb00eVmyPvPK82uyDTmNr5qUbuTffN0i33q47UWH/K28ztlujZ6y3m999nea+0UGzt+XHOwfCvlLcGRl9N749cd1k41Pb0+9fAley8zUvsleyFtu/UD3KWeNbaN5y2nX/3/XyHbfCVglAC7MAeB4DgAbNwBqJQAQqkBKOEiNxZoAgL0qgPUKAfTsFICMr/3z/iAAEaQW4Q8OI5njIHgHESFZyAFKgk5DndBzaAvJ77Rhbzgbvgw/hL+iOFG6qEDUMVQ7ahZNg2TYnkhG1oZ+g2HEaGPCMecwE1hqrC42AduEXcGJ4gJwtbglKimqWKoePA3eFX+FGqJ2pm6iIdKE04zTqtCeJVARKIRXRDNiO50oXTk9gT6dfp0hAslXfBhfM3kzLTCHMX9jSScRSadZpVnvsLmxrbEXcchyPOKM5+LmGuU+zKPHC3hvk7P4LPnZ+RcFbgkWCQULG4kIidKKronNio9L3N3TIXlDqlG6QaZJtk2uV35I4ZXiJ2W0CouqgJqkuqyGjKa4FlmbUQfW+aj7XK9Hv9ogxzDCyNlYz0TalMeMzhxlvmGxarm8d95q1nrG5o3tO7sv9tuOeCdWZxEXVVdLN599yftPuDci77H33kQfeV8Xv4P+NQH9gXNB2yGMoXxh4uFSEZKRYlH8FFI0PvpHzFIcR7xlQmZiT9LPFMMDJanv0izTbx1SyGzPNj08l3s4n+/ItQKdwumiohLnE5onTU/FV/Sf4TxLrIZrvl/4XPuhbqV+5erHhrXr2zepWjjbpDsMOl26g3rj+lLvpg0cuB/3IHTYcyR/tG18eYLvyf5nVc/fvpKdTp+dmJdYyFlaWDH+cPkT/Zfktfcb/j8WtiN/3R90QArYIHWcctAD3kA0SDXADcpEMv4h6COS3avBnnAO3Ag/Q6GQnN0FlYW6jnqNJiC3Sgi6Av0Xkn/LYnwxlYjf6bAW2FzsfRw1zhJXjJuiEqKiUPXhSfhQ/AC1AHUG9TyNGU0HrQRtFYGFcISIJWbQAbp0ehR9DgOR4SQjP2MDkw7TBHMYC5almqRLmmXNZpNkm2RP55DhmOYs4TLhRnP38RziNSLTkif5qvmjBYwEeQQ3hCaFW0XOip4UKxIvkCjYUyxZLnVRulnmvuwruXUFFkU1JR/lApUu1Y/qQhoemhVaz3V4dH31GvQ3DQ2N8o2HTDFmyubeFtmWF/fetpqyXrVF25HsxR10HF2cop0LXa65jrh92k9y1/Tw9yzy6vb+4Cvg5+xfGDAQuB2sEBIUeiZsLAKOlIvypBRE34pZjKOLV07wTMxPakteOMCaanrwQFpT+vIhgcz9WeXZT3NYc13yzuS/OSpZkFA4UMRWHFEyfEKmtKKMeCq3grbyxBmRqnvngmpozzdddL2Ermus97hKf+1OY0KT9I3F5trWoHbJjs+dHd0ZvRZ9rHfm+hvvpQyaDbEPj444PJwbS3rE83hkMv+p3ZTwC+jl7OuBmfq5wnnKgt0S53LVisj76x+1Vkc+e3z5uJa2Trdx6gfPZtU2x8/CX/5nBbogEqkcPQQ7iO/9oVNQP/QF5odtkRpOK7yC1GqckfM+iEYhVbYkdCt6DaOIicN0YTFYK2wFdhmnjjuGW6QyoDqPp8JH4l9QW1D30igjntajHSa4EJaJqXQsdI30VvSfGEoZtRiXmE4z27EQWB6Qclkt2BjZptgvcFA4dbmYuN5xD/Cc580mh/DZ8+sKyAmKCPEKc4pwiJLFJMRVJcz3eEmmSJVLd8m8kSPKayhQFK8pfVRRVE1XG9cQ1czUeqtjoduqL2Fw3ojPuMZUzKzZwsDyqVWkDa1to70bcl67XOLcFPZtuPd6HvV291Xypw14FlQeYhq6FJ4YsRUVQ5mPsY69Ec+QQEl8nKyWci6V5mBC2kKG86HhLL3sjhyF3JZ8zSODBS6F74pSSxiOV5dKn2w/pVXeU6lxuqUKc9bi3Inq1+fFL8Rf7L/EUud/ueMK8arvtc5GluuRTUM3RZHM532bTXvrLZ7O7K4PPU69t/sk7py4uzMQfO/xoM6D+mHSX9EjD0Y5xwLHrzxanhCYdHqS8fTSswdT88+3XtK/4n0tMa04ozarNafzRmde663agvKi7JL4Mv874rullfb38R8UP6x8vLDq8on6U+dn/y/0X9q+7lsDa9Xf9L7Nrh/c4Npo/+7wffXHkU2Rzb4t962N7ZKf0j8Hd3x3/R/tL4/UIZEHotVDyo+vdna+CCNJRTEA20U7O5vVOzvbNUiy8QKA3tC//3fZZcYitfpKhP6/P/8FW2TCD/AimYQAADe7SURBVHgB7X0JfJTVuf6bfYGwh0Vlc0FQiYparYoScEHbilatrUKrraCtXsT2tor3umH/VmldoFZBr4VbRavArWgRFAsWpEJZNKCCQASEgBBIQhJIIAnf/zzfzDNz5stMJkOSMYzvye+bc867n+c9yyzfTJKKioocsUpSUpI4jo+EOjk52eWSZomGyIEOWcjBBsrhw4clJSVF6urq3D7o5NE25b320acMlL1ytIWasq4TzwP4iIN+yaYe+3ZNWdhloX9bjzTKUc+WoT5rLw99xkce63D2SaM91tRBH20UxoU2aWijMDeo7WLbgb7m34cOcffiY/eJsU2zsUXby0Nf8x/cc4gX8PbOPxs7tHlRlrp2bePrpUMvXIEOis1H2/ZHPmiUo55Ncw1ZD14e+pr/IIaECpjisvcfGzu0eVGWunZt4+ulM282HW3ooJCPPuKoqamR4447zuXZD6ncRKHAoEhDnwcg+VSmAw4SsqBBFwcn5SnH2taHLOi4aAdt2EJBzVjYdxnmAXLg0a9NJw02Kcc25ViDj0KfbMO2HRPojM3W4RioRzv0yz74KLTBNmr4oT+OCXSUcHZsWcjAB/Vs+9QHjeO3+ZgUjI902qJdzb8vB8QS+AAr4gPc7b6NJ3PiCvsfiDO61NP86/q31zTnEOeIdx7ZspDhmuXc9Opjnun6950FwMsuXIM2ZsQTmKEAb+yD7Nv6aCdt377dgZBtjG0ubibHVbAONtsxedAlnW3WDM4rC/+koYY8A2bblkGbPlDTLtu0Qb+Qpz27DTkUyLHmEwCX4H+AXcjYfsECHYV0+LBtkQ8aLtiGbLhCH7YO2owX+uTRn82HTcggBiYcfRTIkUeayzAPkIc90ikLPnk2jT7BR9sulCMdNm0a2hy/TbdpsMdY7bYtgzZ9oKZdtqlH/5DHWFDstkswDxw76sbkf8OGDVJZWRmIgfHAB2wMGjTIrRkjaLQN2XAFspCxddBmvDaP/mw+bEIGMWj+fVgQM2IIjOw2+iiQY92Y/LvC5oG5Yj6Yf9oiH/Zx6fo/+td/7969mf5AnVRYWOhwMXICsY+abU4QTjj0UbyTEvKQAR015GwZ6kOXNtGGHhY/Y4AcaCiQA4+27doVMA/UR83YYIMx0B5iQYEcCvqc3KSBTnnQaId8ji01NRWigWLLUp9jt3WhwHEGlE0DsrRB3Gw9tIkZZOGfOsSOfdqx7YMGPmOjDOmMiX3UbNMvdFGIMeyxDTrkIUM/4Nky1KcN9qHHMYCGCzTKtab8r1q1Si644AI3Nj4899xzctJJJ0lmZqab2zPOOCMEO44FWKAQa+qjBo/4ETdbD23QgQ1kNf/BJ3HAhnOE85HziJhBhvjbuOr69+HCOUmcULNNDIEpCjEGnmyDDnnOT9Tg2TLUpw32oXc0rP++ffsi9JDingIcCAbL9p49e2V1wRr5bP0G2brtS1epb+9ecrLZKM4643Tp3LlTiCHoEUAymADUxcV7ZNXHBSH2+vTqKQNOPlkGnZ4nXbp0dvUBJArsMTmMiTVk9u4tCRtf/3793Phyc7sExsLFhfGhjc0HtnAhttra2pDY6Zd4oE951lx47CNme7zoo4AGGRT4pi28lco26LBnF8YEGvXpizXHQ1304Q+FY0ab8vBny7BN++izTT3UKLRHHcRnF+jZYwXPxoMxUAc8e4yUhx8UyCNetu2asTBWjtkVNg+MkXzKg452U/NP+9XV1XQpffr0kfXr18upp54ql156qSxYsEDOPPPMEEzgmzn35d+RLz/7WMqz+sqpfToGbKFhY8NxoLYvjkfzHzxMgR3zQ9yaO/+wq+v/m7n+Mb+8JWXs2LEPgYiJh4INaeOmQpnz93my9N+rJTmzrRzX5yTplNtD9pZVyMfmIPzqq6+kY4f20rlTJ1cek9Re3Jy83Gg3bNwkc+bOr2evpKxSPvLba98uRzp16lhv40VctIf40HbjC2MP8cHerl27pEP7dtKxYweouDqIEYWbGOxyzKBj3PYYQEOhb9SwwcVDHujc7F0F82Bv6rTJccAGY6BP6kMGNNawxxhhB21e6FPWlgfm7KP22qBPxoW+LUO+S7QeKE8S/UM+Wv4ZM2UxXurQH2NFn/HDB9qoWRgH5RkHathksfVsHrEHnzagwzhon3bQR6EN5H/Hjh1y/PHHu/qwh2vevHnSv39/SU9Pl9NOO03wts/SpUulW7duri7jCc3/QZn/i1/Ks9lnyw/yugbGDVnEg8IY4R9tXugTK1te8+/C5uLkzR04zZF/OyfwAZt2Ye5AAx8XdFCH5t+351CfeWQNfdsX2rxgS/Pvwxc4EFtghgKcQEOxeU3Nf5cuXVyb9kMqnhGzwHFJaanMf2+RbNtRLFdd9wM5ZcAJ0qtbrqSYibJl5y75dH2hvDf3bXl34T8lJ6et5Bqj3LwQINppaWnuINDeW1IiCxYtli+j2INMO3OQduzQwT2oAIw94RAjwIA9+I5mj/F16uh7hs8JBztoo2C82BTJg32MAXTUoNs0tHkzDmKjHNqUQxs2UdCmL/DRxgU6io09+raM3bfpaONCoX3YPHToUGCDQOx8AgM5jhM1ZG0bkGWx+TadfOhShm3IcTxs2/mHLnVQo9ixoQ196kKGOSGd42UN3xwH7LENG7CHGgW2bB36hzz59EVZ6KKN2rZLPnJGPv3AFl6Brlu3zn31iYMUBa9I3377bZeGOGAPF/GqqamV7J4p0jM7zZ0Ltgz02WfNeNBHgR3a1Pz71m488s8cch4gD8gJ5gPauv6D+z/mKXACZqhRjub17w7A85CK5NuL9OO1n8rWol1y9vkXyrHHdpPKA9WyZuMWVy01NUWOPaabDPr2+bLyXx9IwSefSf5g32dDBIkTCZMJ7dUFa2XL9q9isod4bODRxsQEfc2n6xptD76HXTzYjd2e3MSAm6C9CIgFEw4ZbJy2LDcuyEIXfRS0UbiQwYcebKFN25Cxx8exQQ8HEORQUDMOl2Ae4Mu2g74dH+QYE3j0jZo+IQMb9Et7tm3QKOc2zAP4tAkaxsYxk04a6GzTFnQQA+i4WOw2Y2CsjJux0iZ00aY8+pCFX8pyXOCRjjYL/YIHWfSpA1sooNn4Qpa24Ifls88+c1+BQv4Pf/iDS8bbxt27d3dtwi5tg+kbHzA2T+LE9/HCwYMHJQ2fqVrYMw7XoHngeFGjoLbjAw3xgY4L+vCL2ufTpweaFyfIM0bUKKzRtm2ij7HCFwp9kQY627YNxAA6Lha7zRgYK+NmrLQJXbQpjz5kmRv4xAU+Culux/9Av+BBFn3qwBYKaDa+kIVN+mUfsmij6Pr3rRFgR2xdYMwDcAUdF4vdJq6QQxs1rtaSf8Zs16lMPIP/Yus2ye1xrKSmZcjOXWWSlZUhGWZjRzlYc0Cqqg66PMhAdsiFvsnKScgBE4RY7BVu+VIuvuDbdnyBSc3JCpnGxrf5y+1uAjA2FHus6CNmXNwMMfmJA/goHAdlSUMfsrg4UezJAD0U8miXdlBDHjXjgjwWLGVpn77Ap120vXTbDiedHT/4oIMG36hpjz5tu6CBTz+Ml+MkD3xctEkftAkeCvrUtTcalxnhgb4RO/RZQxz+6ZNy6EOGfdaQBx0FdlDAwxVr/mEHOjgkWU4//XRZu3at3HHHHZKXl+eS8YRoyZIlbpw2FvSbnGz8J5s5dGiLvDt1kry6bI+Jra0MG/1rueGcY9w4qceYa0rWyyuTJ8o/v8Q4esqw4cdJwUqR2x/+mfRKq5D3Jv2XvL7ZkWwTQZs2bdwbnaqqjpUxE0ZL7xTNPxJDLJmHWPPPeQ87uDjfOLfhAzIo5EGO/lhDHm3OS8jr+gcKwQJ8iLFdQ+LrWv/B6Hwt93uiCI4HSMm+cunR80RJSU03CTYbjZkLdXW+CYE2aOB17tJVdm7bFHhpDhucABgcJ1qs9jChCA5CBIicnKDvLdsnx/Q6qdHxMRbUWCyIk5OYfjjR7RtOiAd8U4fyiIs02GKhXfRtOvvUQY3CsXIztuOAL9jg2KEDGgr12UdNG/QLW/SHcUMGffpkrKDhsscLHuSghzb9gMaFjzhogzGFyz94KNCzbUIXPlFzjGijwJ9NYxt0W57jgQ7odh+yzCfauJor/xwHMYf/WbNmoZLs7Gz3QhuHKMYIecbHGvy6ulpJbZMiu9+eLq+fea08+MgAWffaJJn94gTpnPuE5PfMDOCAsR0+vFOm3/OErEg6R34z6VbpVV4gTz38vJQc7i2Hag02qVny7VH3SP/9NZKa1U4ObHhNfv/SR3K47SnSPtV8bONo/oEjcoALc4LzEn3OF7Tt9UAdyiN3pEGWBW32Wds86qBGwbyATc4jzhP0QYcNzn3ogIZCffZtG/QLW/Sn67/51r+bAM+De4giCdwwU5PTJCs7S3LaZEmb7EzJzswwSfa9bVVbazZWPHMWRw4YGchCFxeSzYRjArIciT3qYkLYkwLttJT0mOLjROUkpD1ORPpCzYWDNvCALic28YEM27ABPuXBg33gAExYKE+c7Bo2cPhQhzZhlzHADulcYLQPOnmQgx3ogoZYaIM+QacuaagZI2JBgS5jQB9t2OYYeUDQHni4UCDDAj7o8IEL9rlZMUbQGCdtQB8x4EKBf+ijgAZduw0edKkDe7DL+FjTHvVdI/4HxE0644Ff6BAfyMAX+owH6tddd51rhRsiOmhDHwU2GGOwNpt1dYokD7lLZt9xjpRVVMup/32PfPzjB2VJwTZziJ4U0EdclZtWy0ozxmsfGSt57Q7JoQ4XyqOPlcuo8e9LqoO5miTte/SVTmJwqt4sz/6twGAySB577lbpWLpbaowucUBMwTg0/8CjsfnnXACWzC9o0EeeOd9hE4XyNt6UgQ3MU7sPm7igR/v0pev/613/voyGPro3FiGBvDGhe/cuUmM+m8lMN4dpRrq0NQdpeprvbatD5kaIZHOI1pnJcsjc3t+tW2d3AtgTCMlG4cbjyjTSHnxjIqLADjce9OEDtFjsQRYFNjmR0bdj5LhBx4TlBo8+Jj30UGADODEm8LhJgsbJDlnYhA8cNFgg4HEBoY2L8UAXsrCNmrpoQwd8+CEu+FoFFxJ8gY8LxV6ItAcbHD99Qx9xUQey8ItCv2zDNvSggzb0MC7EAVnweKCCDxqKt017qGEDcpDBxXhAYz7IR/woxAttxGuPyabRJvVsWfBQ7BjpD3R7nOjDRrj80zftQfass85C5Y7FbZgH6GKs8AFbiIU58I3H3KSUlCzdO6SZG+V2u3GVFJdigJLszxHxgc+kjDaGlSM9UsultBK4HJCycnNDWYp5J8H4qDV65aV7JenwV/LKw0/KR1V95N6p90iHvdulynz26vjnHvFGnIgJl+a/8flHLnEBR+QTOULNAiwxx3T9B/cCYMN1dzSvf+bYrt1XoligKBhkz+7dZOO23ZJqFmZmeqp7mOIQTTKHZ7LhA4D0tBSpPrBfTurZ3V2A0MdEwoUFiYIa/V49ujfaXr9evpswMCGxyWCiIiZcmJiYtLHYO/G4bm68iAcxQh8xwS5pqJlc8DA+bpy2LNr2QoEe+9AHHxcKMUDMaNMfashAnm3I23zbFmQRC+1QlzG6G6sfH+ghHuLO2KAD+7QLf9ADDXigRh8FsowddPhmHzKwyXhoD3zwoGvrMw7YsW2wDX3GDLtoUwf24Ae6lCMG6NMX+GijwAbb6INn68Nmc+Xfjhe+UHbu3OnW9i+aIFYUxMEaMYLuix3jM0+ezPO0YLxp7lprkxF88sexH67F3KyWL7ZVyAkntnFxL1zzmbGR7dpEXMnJZTJ38iQpONRd/uOp30qfqm1Sdgi59uGGOIAF/Gn+g/secEFuuLbYZ+7AA752Yd+ek+BzjgfyFjH/vrlLH6htW/DJ9ca1AT5jRB7R5+XLf+jnrLBh20V8mv/m2f+BJYp7YxGTjmT073eC7CndJ19s3ixnDDzVTCw4NBvkYWyS2JjqZFNhoXRsmyH9TuzrJhRJQrKhj6ShxgQC7eSTjm+0vROP7x1IOGxyktImaJCJJT5MGBSMEW3Y5KRDDTr9QA40yBGTc3/4fZCbvSx9+XXXFwwzNvjGWFEQA+MELVwfcpQH3tgUIQcasEcNGyhc0PAFHO2LY6U/8NBGTfvoQ452YBN98OkPMvRJOdCAL+XYhz7a1AEfcrAJGnwzL7SJGuPD2HDhblaMGXLoQwcFbepyLLALXdDpFzXolIUuaJADHQVtxmPT2HaFzIP3F4xAhwxwoH3Ezzh9cZmDLCtJSt5+XT7ofL2c1SdD1sz9ixQlt5PR5/YyeiWy/OUpsuDQefLLWy6QnL5nyTlJb8vCF/8olcPOlgNr/yFrd8FmT/NK9KA45oB9//ln5IPdZh3fcIscW1IgGyrxLkiS5HTtLG1MPIgJvu2LYyEuxAw1YkYhVswraNADn+OCDNqoKYc2xk859mmTOuBDDjZBg28bN8q1hvwzdhxmKMSPeCFWFh546BMnyOGiHPQ5zyCDwr49brTtPuQoD7x1/cdn/QN3u6QyWSBi0mZkZMiZeafIms8+l1UfFUifXsdJbmff26LFe/fKZnNHblaqY+5APEWyzO34mCSwgQQiobg4OTBRMsx35mK1551giA00bJqZ/vgKPl3fYHynndbfjY8LmBOekw4TFzzEzcL40QcfPluq0Bdq4Md4gB3aKKixOBAH3xoCDTpcTKiJF+xgTJSBHApkwGMfGznb1IUcdakPGuVgA3weAuyD31D+wYcsaviiD9agwR99oW/HRB5oyD/7aFMHtsBnYR9+IQ/ekeYf8wM5wLqADY4FdtFG+fDDZQaDGvNjIZ2koqJCzjvvPJcOPi7GhhqxkQ5Mag6ZV/tt02T5jD/JO357V477rZyaWiXlteau+Mpy8/GKeWJgZKvKs+X2Z+6Xv03/q6xYvlzanftj+Y+LP5VnZ2+VWsOvPVAsG770PXktnP2kPOS35xxuJzf+6g7pneGbD5p/39pCLqKt/3D5R/7sPCLZ6KMgpza+XC/ghcs/5HX9Hz3rH3n0llR7QiCZKJ3NrxFdfP65stV8RWTbjiJZZ76bidKlUzsZ0OcY6W0OVrOVy/79+91NihsVNzhOCkwaXJ3Mrwc1ZK9Xz2PFvHtsvj5T5fpBTLYNTkww8VlcrvlloyEXnFcvvs4dc2RA32Ol57E9JN3cDIX4ULjhwQ4L7POzPMpgk8SiQcyY/C1Z4AvxYKwo8Ik2aGijxsXFaW/gkCcdbehBB+OkHu1RDjy0OS7I4XAABqATc47fjov+bB506BO22YasnTv4gyxkUOCXNeiM1yX6HxgL7UKGcdMWxwxf9AEec8pYGRfk6RtuGpt/5gmHNmxR1234H4qKtru/YoQuDlseouhDH77oHzEiXt+4U+Tyh5+VazPNxyVJtbK/wryaaNNOpGyn7CxDTtLlsof/LNcmVcrWzbukzshs2Z0j373tHrk21WBeXSYLpr4iKW3zpXuGmTNJA+S/XnxR0vxzihiZ2SV7t22V0oOaf+QEpSn5x7zEhdyiRi6ZX+QWtlHQxhpDIT80/7r+fesguC8TK2DYWte/m1DrIXBjETYIDgjPpvEds9MG9JNvnXVG4FUmJg02k7KyMvOdUd+zckwKTBDU2LhQYMem43DED3OfcvKJcvaZee5Po0EGQB04cEDKy8ulytjjhgceJiAOTGyKlMUvwWBS4j9owN7AU0527UEGMSA2+EL85eW+Ax7xcCLDJuTgBxf8M3b4YPzgIX7qwUZLFPiGX9TAFuOAb9IRA3/9Bm1ckEHhAsaYQEdBbfdhGwWT0R4rfNhy9mSFDu2gDZ5tA3rUJ3asiR9tkI4aOlwYNh9tFNqFP9DQj5R/jhd6sAt5jgFzAP6ID2SYR9hkLIyHMcIG4wcPPqBnxwVZ9FnQR7n++utJqlfTFv0gTthGnZRUJ8U7i2SP8VdTa77bmZ0hdbu+ErOi3DHV1R2S4q1fSLGxWufGVCFLnp4oq9p2kxOP6yjlhetk16FkOeemb0vaoVqpdkpka+E+FxMEQmyJKWNATBgHcSR2kMcFOvhog4eCGvkjHqhpjzXxow3SURNvxgIfoEMWhXbJR7+15h9jwTxDrMTSntuce+BxfMQCOsH86/onPkdL/t3J6nlImj9/vvuv0EDHhs3NFknHhU2bC4abEQ4+0AEAeNBBwSIiKJxAmDQo6EMHMpQDDRcOPtiBLuXR5iKjTdaMB3y0oYMakxOTGwU0TGbIID6MDW0W0KCDAlmOAW1ciAvyl4z+CVXcesHz0wM88BkzsMGrEMTAQjugXfGLW0l26/de+F/XDscJW5BDH3bgH23ahxJiZHzoY3yQw9igS3/goQ869NGGfVyQgR7GjjzAJmygePNPDMCDLmSRQ2B8JPmHb9qCbY6Fh5U9VrThEzUuFNaIHTzYAA01xoKCsYLPcTLuI80/7NMma/w6Uan5eUzEjbkLXNBGDPAHbLKystwneu3bt5d+5p8iIB7wWNBn/KDjgn34i5z/ZMlOK5N1n22Wr0rMv2LL6CR5510kAzpUyuavKlwfsIkCW5r/pq//cPkHxswZ+MhltPXfPPnX9Y+5/XWu/+HDhyOEkOLeWIRJgSRjc0Qbiw+LEIULG23KYQJxQwcfg8LGDBp4mFiUR81BQwYXfLFGG5sOdFE4aUEHDRsT2qDDNgrodiygQQYFkxly6OOCH8YEG9AFHTHBBvrgcwPEeEgjBq5h/wNo0OemCZu88MwZdlnoi3GTjpo+UMM3ZcEjTowJvmAXfhgf+vY40Ef+uHFCFuNjzUMPNMSDCz5hj1iGyz/igQ3WdtzwD334RszkUR52UcCHP/ahx/Gi3dT8wzZ9ckywi6up+Udsw3/+M3ccfLiUja+pvsj2O/Uxt3eyTUuQ9tt/eqFR67+l8895iznWlPUPO1wHbGO+6vpv2v4fz/yHW1qp6Wm+H8vmpoOkugk2bylhQ0Y/zXxnFJtRRrq5794U70GFyZWZkRnYUDnZoIcBwjbsgM7NPCXZdyhwUqWmBG/wSTFfoQEdf8nmKwAo6HPDTjafB2Fjhk3Ypg3IMUbQIZ+VmeXKgOeOy9zqz7Gar86F2Acf+tBDrPDvLYyzbZu2Lg7mCDVf+Uk3XwnyHfaUB14cP+x5C8eWnZXtO1zMOWU/eUlKC751CNuILd18bxfFzYV5tYrxw3Zaqu9dAdS4gAfGAT4K4mMOsGDdQ9ngD5vAGoWYQMfFyYxd829yYHDS8vUg4K6pr3n9I//JacE9BmsLJdb1zyeKWH/YW7AGsbfp+vc9uea+Cmxb0/7vzT/i85bUN+a8EXgWDyY2UxRspEg2CieO27Ee3M0Wh51/YqFv64OOCzTwWGCXuphU1EPNttc3+rhgi/o4SFFoC77QRmEcaFMX8uSDDnnwGCcOEMjgYKLtyyFolVmzZwVigA97bLCFwjjIQ+199fLmW2+6sowHMnaxYwAdcrBPvNBnjNTjWNiHDMcGHnzYMVKeNOgxDvoDDTbCFds++Ojb+vQNGngs8EddjocytMGY6Bt9XJCjPsdPW5ClH8YBn9SFPPmgQx48xhku/5AbhgctcUcAe1NryD8GjnmDuYonsJyDqHFxTmEuoXAekkd58DAHMc9AQ6Eu+y7RPOj6D2IJTLiGiSVwi9f6h3/m/9LLvDu5yffevXt90UKyGcqKFSvk8su9R08zGP66TJi7fUPK5qKQbqM7zWWn0Q5VsNkQ8Oau2QyroQYRONK11qBRZSoCIkVFReZfb7Zzn8zgSQ8OZD6Z5hMa+wkcDlFcuF/BW4LvoXo52lcEFIHwCOjmHh6XplL1yUpTEVT9rwGB0PcQGxFAXVWl+YpLZSMkW06ktqJUis1vjPo+8YvdD/UjaZIfyT75R6ofSY/0aPYp902to+HTVH51abE7v6obBLhWKiBX2rBUOBO0H453NNCIb6T10dJjoP+W9tPa7FebO8K/LsxbGxatKZ6YDtFtS6bKT0bfLg888HMZee9M2V3/fpkGx1ZbulXmvzJRrjY3s+RPXh0q65TK6iULZcnyJeZ/MJp6CeolsnChaa8u9E+ealk4cZSkteskP7jkWMnqfLssKfZNq4oda40sdXx6y9fvCPVheutn3e3qXzLsGEkZOlG2mu/nBUt9+0GerxWrPuPz2onUb9g+tWrlzbtPkjQz/rXVwfgbxJeqbl1fn/gtB/7A3I/9wiWrpbTeyq2v75qtXisjze8tJ6fluf9TE2+HjJq+NuC58fEFVOo1ouHTJH51oUy8urtkdx0mN9zQV9q0vVrmF9Y/JEvXzjJzOEPaDblEunbKkunrK9w4o47PKZapo3q69jF/U0+/Twr9+YsN/3qwuIS1U0e5b0nh/5niOj3FfGY3Yqr4orN1wucvun799WHP7+j6jCG8f3JZ11+f0dYvNY+8Llw4Xe67b7Ks3mHyXlooawvNPwRoBWXHwomSZX4R66zbXgmTTyvAikJ5c/pkmThxsry5fKvFaB3N0q2FUhyy58YWV1P1Y/PWOOnGH6KVH8vvny+XB194WSZPfknuHbhEnnprc+O8+KWKlr8m7+zpb3667EYp2ef73cmAgboq+eKj9+TBoQ/K+x9tlNWrV7vXxk/ekzv/c647carX/1W+MzlPiswH+IsKDsj6qY5c9Oh7ronqrzbLe9PulAdefl82bvxIPvlkpfwxr5ecft98CWyDpQvlhtF7ZFX5YSlYUyXv58+QW579JBBCOPsBpr8Rqz7j89oJ248SH3Wq174oIwq+Kz89vVIOWDA2iC+VTR1OH/h98NpIOX/YE/LRRh/+Gzd+ItPunCCfVARvCoKZcPquefNP23cMeFR21ayRNWvWuDcDvHTzQJeFh8bGF1DwNqLh00R+ddGnIlfPkUMm/oULy2Tbm6fId3/1f94opPOgCTJy7R5xCgrcMd7cP8eViTa+tc/fILf3/F/XPubvJ/fslRNHz3afIMaCf72A/ISajHNkWUmdiz3wX/XF65JS/wSNmL9o+uHWhz2/o+kz7ojzhwL+2rs+JVp+Pfoxd6vXy4uTN8ig80Ru6Wl+1L/TiTJvq+9X1GK21cwK709bKsvM75c/fuB1WVocuh7pqrpwliS1O1HmHuwnl1zcR14ffILkPbKwVb16/eQvz8ja0uATf8be2Lqp+o31E5McbixqzLVu7oPOmCnLgrIb5jpXXjnF2erRx483RCtVqyY5QyYsqy92uNyZNm6KU25zDG3KuEnObkMrXzbekXGWXt06Z0z+4y4PKlWrpjiTllnah7c449oPdRaXH3Ytbpkzxsl/fJXbdh+K5jiZx050SvyUcPadPsc49hWrfiA+j51gEMFWtPhcycMlztM52c6MTUXOtBEjAmMLWgEOEfCFUAP6NWsmOVfZ+BjxVZPGO//YWxc034C+SZBzVf6k0PwFNQOtBuMLSNVvRMOnqfx6HmtWOWPGzAjJP+bCpDVV9URtQqTxLTNYztttYWnsj8h7PDD/GoW/7ShKe9O0kc7IGZtCpRrKX6ik49UPtz4C89uji65X3xVpyL93jXjWZ7T8hgnhyEg1Vc7uLVuckpojU28JrVWTRjhDxo1z8nLHOZtqfPtZiB+D6+Nts5wxc6x8V5n5lZrsTFlj7YkhSkfWqSkvcXbv5q4Zm41VkyY4y/z7cWyaPumm6tPn9u3bHfNLeY759TvH/DysY77j75jvyTvmq0eOuXvavcwd0ua/B9a5bdAhE640+pXovm375LSBPYIHdOdecmG/tGA/hlZN8LWhR6tafL83ZMi1xVK41fc0unPfY8S9Ayqtg8iebQHtio/flf9p11V8rwPMb+/il7pDSrZ52fRBgLJ3/S7Jv7hvoC89TpXbz7butgpjPyjsa8Wqb8fnteXtR43PKBQv+r38csSrcuMJncxPG3ot+PqR8W1Yv6om8Jpd8LYJ0E/r0ls6mO+ssjTo30yH8o9WyCLzdvybs2bJ/OV8G57avrqh+EIlQ3vR8GkqP9SbSOF7c+X5A77v5tq8Hw3MlFrz05LV9d7m9klFGt+5Yx+V4bnBJVe7db3MczJ9c9uoNgZ/O44G206FzP3LGrl+SJ8QsQbzZ0uG0w+zPiLO73D6xn6j/SMWz/qMll87/CNp1+5YIncP7SxJaVnStU8f6XTdxMDb7Udirzl18n70gFyx/4Dc/dZ9coL5rntF8VZZ8uZ0ufvqkTLLfORQ/fkcub/vY/KHq04Ius0cJC+8M1Zu//PSIK0JLeKDj9O6du3kfhzGjyOimq3dKpNvu1p+9T8zZfzIH8uoUaNk1NVXy8T5hT5Vw584aqjk54+S6avNW+iOr3/60KEyYdZ6cx5E0Y8aQMsJNPru3NS0TE8UHcX851HZbt7t6J/lYR1x14SzZ7XMnr9Q0hePk5FZL8jh+8+V68Ze57M4aKxMK+plPqt6WW69ZrM8//IamVlUI4ws1XxOtWLWbJlf2sl8mblSCmb+RiYPnyoTcnyHQFomj1sG2FX6ygrZUOHIuUYmJ4x988qDwmHq6Pp2fGEMhJCixYeJ9ehVc2Xu5t+aSeb7cf0QA9E6UfUzZe4Mc/idvV7uGf64PLP3Yxl8421Bq1H1s6Vfz+1SUFgiQ8wh/+HvLpB7Tpkuqx4dHjgogsZib0XDp6l8RrR+1n0y4Prfud2ZReakvOAustx62m1D5Z6NInn/fF+GvrRSfn/joNjHV7xQLus3SqZ9WhZ4EihmJjeIf0gUUTplK+TFPTfJ+8dYPxYRNX+WzTD64dZHxPkdRj/2+Ru6vqLl14r+yJo5J8i417bIU7m+faLwlVHy/ec/koKxg47MXjNqpeYOkrEP3Sl/f2uKjPrdKsnue75c+r1L5L6XRkpuTqpULN8tF4y8xJpLPue5Z35PBv54pZQ+NVw6NjWepuCTeqz84k8vyWlPPiCHbpggQzqZH40x8aRl+ffk1N4y+r/GyT0DRsgVNZPdSMtmm8P/oXly93X9Tb+2Yf2mjq0J+o0+RGvNq5TQ5+R1Yj4CM9+vaYL3cKrmxWO6+aWjdPN/Fr2luvDv8lTB92XBygfknG418p2Bd8nTz7wnV1ubdHZWutFva2JNlwHDxsrFtz0ls9eOkJsHdpSa6gqxXnca8+ZHu82rOfPLbm4JZ1+eWxESRqz63vhCjHk60eIrfNWM95r75YGcQ1JdWSL79pRLaYl59Z3DpxEeg55uY/STJEva+H/FyqMuUfUzB8rUNYsCaoMvXCtlHW+QD8dfLoP9T2QCzCNoRMOnqXyG1P+6R81nnROkcOGT0v+KR8X/FI5sKbz0WXGmmoVtDqX72l8l7136UcgrzIBghEbp2unSKe8WmbGuXG70f55K0Ybwp0xj6h1LXpPOt94ZsnFGzZ9lOJx+uPURaX6H04/Fvy+U0PUZLb9W+EfWrK2SFa8+I//9aZV0yc6S/QVzRS6/+8hsNbtWrWxcXyQ9L/6xvHDb/YEXDtjDUPB4UlezeXqL+QWzZitNwge/mZ4jbcwvyKW1ayOZOcnWGHwRdux/lThV6+TuDt0l6eAhmTBvixQM7+0PP7p+s40zRkONPkSRi51leLu0rc/Foe2yen8fuSL0ZI3RvVfcTIXsQfK9oYMl56L3ZfPu0PAKXnlEhr7xgQz1bzxX/XqSLBr2mpTKcMk1pmrN27mnXnajDD2XrziHy3WXHS+n3zRHfrjoZjEvVKVwF24U8D8nO7hB5u8dKKMzfQd2OPvy3PkhQcaqb8cXYihMJ1p80vZ8GSEL5N67Frjayz59X2Y9/a5c9tRV9SZkGPMmddH0q+XKm74jgwcPkvc3niOp5uCrWP2KzK65Qm4+12AWVd/rNVXCPBfyCjW6Hw2fpvJDA0mVE4aOlQe2nCtinjXb5UH3mbGhJPWWHz3SV15dv88coo17nr/+zfvk1Bs/k8W7a2Rwbuj8Np89NIy/HUSDbfPPuf/8odz6xKRQqUbnL7x+uPURfn6H1495/njWZ7T8hg42xp55QvTrHuZ/JL+8WB4f1U9yzK8T7TbPB0evt+7ci9Fk84qnysDz+8h9V14lY2SoTJvzpPT97HkZcv7Ppe9Db8j067vK9L8sk0k39w/ZCyo++1DW5h9f7xVqzLE1Gz4Nv21ZvWuLbJb+MiTPvMu59Svz5KC3512ehvVjHldzKDTmpiJXpvAdcyPRvc7HO303Ii19cZxz0+R/Bm808t9g1Jgbi0qWTYhwY9FucxPRlMCNQt4PcUsWT3Bk5MzAjSsl5gaa1PzgjUgliyc5jy3GLUgsVc4y84F8Hm9i2j3PSWk/0llX5ftg3sdbTGEnnH37piK0Y9UPxOe9aSLg1WpEic+SNM0q5+m8Ec4y/1hsXkR8baEw+uXLHnfyxwfxgHh9TGnE67/KmTl+jDNjlbl32l9K1kxz0ruNd7aQQHqk/Hvk6nWj4dMkfpWzeNoUZ/GW4E0YJetmOGldxtW7sWj8PP+Iaja5N66F3Hhlgg6Pf5Xzj8fznfQeE5xNzFnNbmfxvFUmE74SG/710AkSzA1e+d3HO8FMBFnBljd/QQ5uEAunH259BOa3pR5J3xYJO389a8S7Pp1o+Q11EL5nbsCZMTrPSc4Y4szcROSNaPliN9eB22WqtjjTxvRxBj5u3cgIi5H06a0F+cB//OJyp3zeOGfC4i3OvDEjnWXmJqOZI/KdeSVVzoyrezgjzM2fvB+qpugfTn5ysjNzCylNiL+Z8Fn22EjnaetGp/Kidc6aLT7Ui5ZNcpJSBzrz3HjNfmLwF3NjXyAnJvyG9N0URMPfn6fmvLFIGn2ImkPy4zeecK644gpnzE1XOlfeNNlZt7v+nb0NHaLrZozBvc2BKy85yUnKn+Bswd1mVWucMelpPl5enltPs8AmQDPH57tA5+e3d5LbjDCA+xbCuhnjAnYHDhzo4IKvgWOmOEXW3WzrZpo7fA19SF6Wk5rn9+0HFgvEa997iMaqz/i8dujSWzdo3y9cZTZ34pg8YlrgSUWD+FqOwunb+JkvGbr4EcNJq+xpbFIVwX/5lsXOmLw2juTlOyPyO7j5+UdRcKNqbHxWqPWa0fBpCn/L4ikO5qQd/5x1Zuyezd2dp/n5bg7GzVgTiLHB8Zn5jTslsUkMwdz0z/H0gb67mWPBP+AwQqPcPLkc4d38LdlI+aNIRP0w6yMwv6ls6oj6fpmI/j0411ufRj9afq0wwjcPFzkTsjPc3E1aFXzC5JhvAcwZn+fmZ8QIXz1ypG8PyR8/L2grkj4lWpJfssy5KS3FfSKPO1xLFj/ujiNvjP+FxeHd7sGPfXHcXTe562/mOmuMiPFI42smfErMNyiwd+Wbbxa4+79ZD5MWF5ntf5pLB2/GOrNnHN7kjB+Y46ONDO5xkfQJf9Tx+QWb8xCN/bdzzQ07eytqpUPnDvgnKPVKPH47F7/4UmLele10TG7IWxf1golEqC6VHSW10tXoe99Qg0qIfe9PkeEn32LRZwzh7JDnraPY94q3tj5+yafC5CcSvk2ONxo+TeKbXyIyv4ZVYWZGV/MWrTs/6uVuq5Tu2C21OV3dmzqaPJ6jzEDI+mjO2D0415q1Fm59Rlt/UUMy90YUm/mZ25Ef+wQ1Kop3SEVNmuR0zTVv6QbpIa0G9F25luTXVpi5mROIrdrcJZ6ak+PHyfwYxuQfyrC75rhhjHl8pvz07Ep55q10efapG4Nv6TYhvubCZ0dJhXtTUbgchGAdrmPib1A/2viMzeb87dzYD9Fwg7Jo8ThELXct3/Qs7GZzqL+/2mxQtrgh7xzQ3LUM5Ipz03A1XwN55dlF0v3C86R3+xrZuHyRrNieIUOu/YEMPqFxn9k3LYCjR7s5D9FIz7WOHjQ0UkUg3gh4N/t4+1d/ikA4BMzXRG4ce3OAc8IJA80tl1paGoHgN79b2pPaVwQUAUVAEVAEEgyBFnslWlV9KCGgaqkbqhMFn4RIcpRBtNQciOL2G8/WNfKNnwJHBQAtdogeFaNvRJBV6zY3QkpFFAFFQBFQBL6JCBzhIVonVZUV5ndus6VD29h/baG2slRKcXdchC+oV5eZuztrUiXH8MP9Fk80/dbOjzbRWnv8LR1fa8NHn0hFy4jyFYFvLgKBz0TrKnfLykUz5RHzw8Dj39gYEZHKzUuMzM0y5r4H5M7bfyrvbjOnYQzl87/9WtrldpfvXNlb2g5/Qr70/WqVz4L5f45P3dBLOve8wvxAcT/p0vk6WfBF8EfRIdSg/lHA9w008uPRPr6mxh8ZGR+nqfabqh8tPuUrAorANwuBwCG6d/0/ZdW+nnLFD/Nk//7w/227avNc+fkDM2XIo8/JS5Mny8svvyyX9YzhE6OyRTLq58Xyr+KD8u8V5fLORa/KmKnW//PcsU7ku7NkX8VKmT+/WDbOHiDX3PuG/9chTWKi6Ld6frS5dbSPr6nxt3Z8osWnfEVAEfjGIRA4RLuefb3cdvV5ktfvJGkTFoZKeeeBv8q1E/4gg3v6fz83rFxk4pdLZ0mn39wlZ/jVL7jlIVn+5DtS5lfJPP67cveobwW+YN3jwu/LLV35E8si0fRbOz8yMj5Oa4+/peNr7fhEi0/5ioAi8M1DIHCIcujmf7OwGVqbH5xfLsNkSN90qauqkkPhX6yG6nh6JZ/vkosv7BOk9hggtw4K/b8oQabIFwvnyZ+t/+cYTb+18+2xhWu39vhbOr5wmNi0lvYfzb4di7YVAUVAEQAC9Q7RSLAc2rVTxPwT7gWTx8tPJkyQ/7x5lExdtFFiOUtTM7yvYLtJ36SVsrEy1Ovnf7tfsrMy5LQRD8vL/+/7gZuLoum3dn7oKOv3Wnv8LR1ffURCKS3tP5r90Gi0pwgoAopADIdoivn/ets+nyc7z/yFvPy738nkl56QjD//UT7ie7GNQLP2YKXn/3nWyEH8P0/PPcInX/OIHKjaL5/Me1R+8r1HxRzfbomm39r50SBq7fG3dHytHZ9o8SlfEVAEvnkINPqVaEpOB+mU9C25aXBPP0pd5eJrc+WT7Z6XkQ1gmGreud1cbN1tW71R3jH/z7NPuO+xmE9Gjx9yh4z/8v/kc/9BHU2/tfMbgMZltfb4Wzq+1o5PtPiUrwgoAt88BOodonV1EX5pKP14uSbv3/LWyt0+lOp2yLuzD8gZfbxv0UYG8bQfjJHpPx0vn/vP0RUvTpS915wnHVyValn60guy9MvgoVz2+RvyWEa+HO8TkIb1pdXzIyPj4xzt42tq/K0dn2jxKf9oQKBUXrvzbGnb4TL5m+frc77old8wPkdDjuMbY+CN1G2LJsv4F//t9z5Pxs5PktLjhssTv71Jurr/8yxd8u98UCaP/pWM7HmcyLZtMvhnjwTutG1U2LmXycopS+TMjhly0amZ8i+5Rz5ZdoFfNVN6Hi9ybf8u8ukpg+V7XQpk7oqL5LV/vSC9aLxBfSPU2vkcR6S6tcff0vFFwoX0lvYfzT7j0PooRqBavnh1gxw+eFB27rO/pM4hKb9hfIiT1kTgCP4VWp1U7i2T2uwO0iGr/n8U5b9Ca/B3L83/e9xZWiu5PcL9P89aqfT/P0f8olHglGfEqBvUPwr49ljCtY/28TU1/nCY2LSm2m+qvh2Lto8+BKorBZ8q5XaI8C6a8hvG5+jLeL2IS/YWS7t27SQ5OVmSkpIkJSXFrdEGDQVtFPN/vOXw4cPulZFR/9skR3CIunYjPjTqEI2orQxFQBFQBBQBRaBlEWjOQ7TeZ6ItG7paVwQUAUVAEVAEEgcBPUQTJ5c6EkVAEVAEFIE4IxD2I8fmiCErM/b/7tIcftWGIqAIKAKKgCIQLwT0lWi8kFY/ioAioAgoAgmHgB6iCZdSHZAioAgoAopAvBDQQzReSKsfRUARUAQUgYRDQA/RhEupDkgRUAQUAUUgXgjoIRovpNWPIqAIKAKKQMIhoIdowqVUB6QIKAKKgCIQLwT0EI0X0upHEVAEFAFFIOEQ0EM04VKqA1IEFAFFQBGIFwJ6iMYLafWjCCgCioAikHAI6CGacCnVASkCioAioAjECwE9ROOFtPpRBBQBRUARSDgE9BBNuJTqgBQBRUARUATihYAeovFCWv0oAoqAIqAIJBwCeogmXEp1QIqAIqAIKALxQkAP0XghrX4UAUVAEVAEEg4BPUQTLqU6IEVAEVAEFIF4IaCHaLyQVj+KgCKgCCgCCYeAHqIJl1IdkCKgCCgCikC8ENBDNF5Iqx9FQBFQBBSBhENAD9GES6kOSBFQBBQBRSBeCOghGi+k1Y8ioAgoAopAwiGgh2jCpVQHpAgoAoqAIhAvBPQQjRfS6kcRUAQUAUUg4RDQQzThUqoDUgQUAUVAEYgXAnqIxgtp9aMIKAKKgCKQcAjoIZpwKdUBKQKKgCKgCMQLAT1E44W0+lEEFAFFQBFIOAT0EE24lOqAFAFFQBFQBOKFgB6i8UJa/SgCioAioAgkHAJ6iCZcSnVAioAioAgoAvFCQA/ReCGtfhQBRUARUAQSDgE9RBMupTogRUARUAQUgXghoIdovJBWP4qAIqAIKAIJh4AeogmXUh2QIqAIKAKKQLwQ0EM0XkirH0VAEVAEFIGEQ0AP0YRLqQ5IEVAEFAFFIF4I6CEaL6TVjyKgCCgCikDCIaCHaMKlVAekCCgCioAiEC8E9BCNF9LqRxFQBBQBRSDhENBDNOFSqgNSBBQBRUARiBcCeojGC2n1owgoAoqAIpBwCOghmnAp1QEpAoqAIqAIxAsBPUTjhbT6UQQUAUVAEUg4BPQQTbiU6oAUAUVAEVAE4oWAHqLxQlr9KAKKgCKgCCQcAnqIJlxKdUCKgCKgCCgC8UJAD9F4Ia1+FAFFQBFQBBIOAT1EEy6lOiBFQBFQBBSBeCGgh2i8kFY/ioAioAgoAgmHQJJjSsKNSgekCCgCioAioAjEAQF9JRoHkNWFIqAIKAKKQGIioIdoYuZVR6UIKAKKgCIQBwT0EI0DyOpCEVAEFAFFIDER0EM0MfOqo1IEFAFFQBGIAwJ6iMYBZHWhCCgCioAikJgI6CGamHnVUSkCioAioAjEAQE9ROMAsrpQBBQBRUARSEwE/j+KfFslCdFu2QAAAABJRU5ErkJggg==" alt="" />

红色部分的是FNAME标志位,以及附带的文件名。一旦设置了这两个属性,gz在解压缩时候就会自动使用附带的文件名来命名解压文件了。那么写到这里,gzip命令的实现原理就已经清楚了。接下来就要分析一下为什么常规的代码无法实现这一功能。

通过代码实现gz压缩,并保持原来的文件名的更多相关文章

  1. webpack体积优化篇二(GZ压缩)

    这里我列举几个常用的能够用于减少包体大小的插件,我们可以根据项目需求选择性的使用: compression-webpack-plugin :该插件能够将资源文件压缩为.gz文件,并且根据客户端的需求按 ...

  2. 我们的代码为什么要压缩成7z?

    代码为什么要压缩成7z? a. 代码的复制速度是非常慢的.  几M或几KB都是常事. b. 压缩成7z格式后,压缩速度迅速提高上百倍 网页为什么要压缩成7z? 怎么使用7z压缩(以好压2345为例子) ...

  3. ZIP、tar.gz压缩时排除指定目录

    1.ZIP 压缩时排除一个文件夹下所有内容zip -r sss.zip sss/ -x "sss/222/*" 压缩时排除指定多个文件夹下所有内容zip -r sss.zip ss ...

  4. log4j 设置将生成的日志进行gz压缩并删除过期日志

    1.准备jar  :log4j-1.2.17.jar,commons-logging-1.2.jar,这2个就可以了,其他关于日志的jar包就不要加进来了,在优先级上会有冲突. 2.定义一个类,继承R ...

  5. dlang 读取gz压缩文件

    没找到打开gz压缩文件的标准库,暂时调用系统命令打开gz压缩文件(参考:https://dlang.org/phobos/std_process.html#.Redirect.stdoutToStde ...

  6. Python如何支持读入gz压缩或未压缩文件?

    目录 需求 示例代码 笨办法 Pythonic方法 需求 要写一个接口,同时支持压缩和未压缩文件读入 示例代码 笨办法 import os import gzip filename = sys.arg ...

  7. asp.net mvc4 使用 System.Web.Optimization 对javascript和style的引入、代码合并和压缩的优化(ScriptBundle,StyleBundle,Bundling and Minification )

    Bundling and Minification两个单词对今天的内容有个比较好的总结. 问题所在 一. 在asp.net包括mvc项目中,引入js和css也许有人认为是个很容易和很简单操作的事情,v ...

  8. gulp入坑系列(2)——初试JS代码合并与压缩

    在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...

  9. tar.gz压缩,查看,解压

    本次使用的压缩格式是*.tar.gz,用到的命令如下: 压缩: tar -czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个g ...

随机推荐

  1. python内置模块(3)

    博主所有python文章均为python3.5.1环境. 目录: 1.collections 2.subprocess 3.configparser 4.XML 5.shutil 一. collect ...

  2. Win10 + VS2015 下编译 Qt5.6.0

    近期由于另外一个项目需要用 vs2015 ,于是把 Qt 也升级到了 5.6.0 .由于项目需要兼容 Windows xp ,所以需要自己编译 Qt .这里大致整理一下编译的过程. 安装 Active ...

  3. MySQL数据库 安装图解

    下面的是MySQL安装的图解,用的可执行文件:下载地址:http://www.jinhusns.com/Products/Download/?type=xcj相关下载 mysql安装向导启动,按“Ne ...

  4. Repeater控件使用(含删除,分页功能)

    Repeater控件使用(含删除,分页功能) 摘自:http://www.cnblogs.com/alanliu/archive/2008/02/25/914779.html 前臺代碼 <%@ ...

  5. IDEA默认常用快捷键

    作为Java的利器,IDEA属实是非常好用,参考网文总结其常用快捷键如下: Ctrl + /(Ctrl + Shift + /):注释或反注释指定的语句.这个是本人最喜欢的,所以排在第一位. Ctrl ...

  6. 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

    [源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...

  7. JSONArray.toCollection 封装 bean 失败

    1. 问题描述: 通过http请求服务端, 返回的bean的集合的字符串形式, 其中bean中的Date类型的属性值,形式为Long类型的表示形式(1466083519000): String res ...

  8. Java多线程--wait(),notify(),notifyAll()的用法

    忙等待没有对运行等待线程的 CPU 进行有效的利用(而且忙等待消耗cpu过于恐怖,请慎用),除非平均等待时间非常短.否则,让等待线程进入睡眠或者非运行状态更为明智,直到它接收到它等待的信号. Java ...

  9. ahjesus Unity3D界面快捷键

    F Frame selection Tab Shift focus between first column and second column (Two columns) Ctrl/Cmd + F ...

  10. Visual Studio 2013 Preview 新功能

    先来看一下Visual Studio的版本历史: 1. Visual Studio.NET 2002 2. Visual Studio.NET 2003 3. Visual Studio.NET 20 ...