在Linux下和Windows下遍历目录的方法及如何达成一致性操作

时间:2021-11-26 17:15:56

最近因为测试目的需要遍历一个目录下面的所有文件进行操作,主要是读每个文件的内容,只要知道文件名就OK了。在Java中直接用File类就可以搞定,因为Java中使用了组合模式,使得客户端对单个文件和文件夹的使用具有一致性,非常方便。但在C中就不一样了,而且在不同的平台下使用方法也不同。在Linux下实现该功能就非常方便,因为自带有API库,几个函数用起来得心应手(虽然有些小问题,后面说),在Windows下实现就不是那么方便,虽然也有自己的API,但用法有些晦涩难懂,因为没有封装起来,需要自己一步一步进行操作,因为用的是Windows API库函数所以如果对Windows编程不熟悉的话,照搬网上的代码错了也不易调试。为此,我把这些操作都封装成类似Linux下的库函数,一方面简化透明了操作,另一方面(也许更重要)就是移植性,这样将包含该功能的程序从Windows上移植到Linux下就无需改动代码了(删掉实现封装的文件,因为Linux下自带了),当然从Linux下移植到Windows下同样方便(增加实现封装的文件即可),这就是所谓的OCP原则吧(开放封闭原则,具体见:程序员该有的艺术气质—SOLID原则)。好了,首先看下Linux下是如何实现这个功能的。

一、Linux下遍历目录的方法

Linux下实现目录操作的API函数都在头文件dirent.h中,截取部分该文件内容如下:

/** structure describing an open directory. */
typedef struct _dirdesc {
int dd_fd; /** file descriptor associated with directory */
long dd_loc; /** offset in current buffer */
long dd_size; /** amount of data returned by getdirentries */
char *dd_buf; /** data buffer */
int dd_len; /** size of data buffer */
long dd_seek; /** magic cookie returned by getdirentries */
long dd_rewind; /** magic cookie for rewinding */
int dd_flags; /** flags for readdir */
struct pthread_mutex *dd_lock; /** lock */
struct _telldir *dd_td; /** telldir position recording */
} DIR; typedef void * DIR; DIR *opendir(const char *);
DIR *fdopendir(int);
struct dirent *readdir(DIR *);
void     seekdir(DIR *, long);
long     telldir(DIR *);
void rewinddir(DIR *);
int closedir(DIR *);
struct dirent
{
long d_ino; /* inode number*/
off_t d_off; /* offset to this dirent*/
unsigned short d_reclen; /* length of this d_name*/
unsigned char d_type; /* the type of d_name*/
char d_name[]; /* file name (null-terminated)*/
};

关键部分就是DIR这个结构体的定义,包括文件描述符、缓冲区偏移、大小、缓冲区内容等,下面定义的就是具体的目录操作函数了,有打开目录、读目录、重置读取位置、关闭目录等,这里我所需要的就是打开、读和关闭这三个最基本的目录操作,下面是使用例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h> #define MAX_LEN 65535 int main(void)
{
DIR *dir;
struct dirent *ptr;
char *flow[MAX_LEN];
int num = , i = ; if ((dir=opendir("./data")) == NULL)
{
perror("Open dir error...");
exit();
}
// readdir() return next enter point of directory dir
while ((ptr=readdir(dir)) != NULL)
{
flow[num++] = ptr->d_name;
// printf("%s\n", flow[num - 1]);
} for(i = ; i < num; i++)
{
printf("%s\n", flow[i]);
} closedir(dir);
}

运行结果如下:

aaarticlea/png;base64,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" alt="" />

一看这结果就不对,输出的都是同一个文件名(最后一个文件的文件名), 哪里出了问题呢?将代码中// printf("%s\n", flow[num - 1]);这行注释去掉再运行,发现注释处输出的是正确的,两者都是输出的flow数组元素怎么结果不一样呢?经过调试发现是flow[num++] = ptr->d_name;这句代码的问题,因为这是引用拷贝(地址拷贝),所有的flow元素全部指向同一个对象ptr->d_name,虽然ptr->d_name对象每次的内容不同(也就是前面正确输出的原因),但所有内容都共享一个地址,用一个简单的图说明就是:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAg4AAADrCAIAAACOz4l2AAAgAElEQVR4nOy9aXRT173wfT49/XSbtXrpcJ+n4V33ynnfm7ZZ7X2a9na16W17IbduC2QoSUNbOE0goQy2AxUESCAJQxg9YGyMsTA2scEYMIMNNmBbYMvzKMmSrPlotKx5ljyQ/X44g45m2ZYsLLbX74N0dLTPPsfS/um//3vvg5imvoJAIBAIJAZI2msAgUAgkKccqAoIBAKBxAGqAgKBQCBxgKqAQCAQSBygKiAQCAQSB6gKCAQCgcQBqgICgUAgcYCqgEAgEEgcoCogEAgEEgeoCggEAoHEAaoCAoFAIHGAqoBAIBBIHKAqIBAIBBIHqAoIBAKBxAGqAgKBQCBxgKqAQCAQSBygKiBx6NJ9daL3q9eugteugp+ywPIiyFPHjyvAqitg1RVwmAPa1en/zEAyD6gKSFQquV/9lAV+XQ1yWgBrCLCGwM1xwFGBTpIOFejAwGOSRxh4pARsJWArQbsStCtBmwK0KUCrArQqwEMFeCgHD0juy8F9GWghaZaBZim4R3JXCu5KQBNJowQ0isEdktticHsc3CK5OQ5uikCDCDSIwA0RuCEC14XguhBcE4JrQlAvBPUCcJWkTgDqxsAVkstj4DIf1JLU8EEND3xJcokHLnFBNUkVF1SNgosklaOgcgRcGAEXRgBrBLBGQMUwqBgG54fB+WFQPgzKh8A5krIhUDYIzpKUDoDSAVCC0w/O9IMz/aC4j+B0HzjdC4pICntBYQ8oIMnvAae6CU52g5PdYH87yGsBeS3gj/XgFxfBS+fAqZ5ZzDFl8M5M+maN/idp/yxBljpQFZAIKJxfZV8G6G1wWwy61aCLhKOGqngaVXGiC5zoAse7wPEucKwLHHgEXr/61SuVT/rUHp3TZ/DOQFtAFghUBSSULt1Xv7kELnFBjwZ0a6Aqlp4qjnHAUQ74qBX8jPWkRWRXWV169xQMLyALATFOfQWBUIjsX/22FtwRgx4NVMXSVsVRDvj8MfhF5ex9oUlusmudvgnvzKT/Sdo/Y5ClCFQFJIDW+9VrV8GXXMITUBVLXRVHOWBvG/hZxUyXWCsxWDCrS+eeMvhmoTAgcwWqAhKgqP+rrfdArwaqInNU8QUHrLv+1XtXzQPjMoFmAoYXkPkBVQEh0Hq/+gkLtMihKjJNFYc6wEtnZ649Hunmi3iYFreFwTeb9o8cZAkBVQEhaFZ+teoy6NVCVWSaKr7oBP9zaYZ5mXfvcReHKxBoJjCra8I7k/aPHGQJAVUBITjEAcwHUBWZqYoNt8Dq85r6uy0PuvuHZZjMaNN7ptP+kYMsIaAqIASvXQUXR6AqMlMVux6CH5V6L9241cTu7BdJJQaLzj2V9o8cZAkBVQEheKUKNIigKjJTFZ8+Ai8Uz168ev3WQ3bP2LhYb9K6/Gn/yEGWEFAVEILvnQXtSqiKzFTFkU6wvAhAVUDmDVQFhGB5EejTQlVAVUAgEYCqgBBAVUBVQCDRgKqAEKRFFQiCIAhCqQJ/Gk0V+Kt0VeBbYqgC3yGuKvDdYqsC3wdXBUL7S1wV+P5QFZClCFQFhCCNqojxFxJV4BtxVeCPY0cVSVdFtD9KFXHPCKoCshSBqnjG8Edl8VWBN50twcK4R8YWIVFF7PaXrorYe1KqiNumIwgyv6gC315OPjg3FLR/OlVRd/3WQ3YPf1ysN2md/hgfBggkiKmvkPRXAvJ0kN4OqIgtdbgq7tBii1v0PqgwVYRHFSGqoKIKfHuMXEVco0BVQDIeqAoIQbrS2ngDGpLWjqaKaH/zVgXlifAyo+Uq8Ad4WjtEFfGcAlUBWapAVUAI0jgCKlqrusCogl5UXFVQUQXlCboqqHKqRiPUFkYVkIwHqgJCkPa0djMtnoimimh/MVRRH+wMuiqojZQq6J6IqArqL2JUQXkCHwFFqeJpGQEFVQGZL1AVEIK0qyL8L9q8CvzVaPMq6CXg8yoiqiL2ofG/8FxF7KiC8kT4YFlqZ6gKyFIEqgJCkHZVxIgqEmnWI+Yq6FPw8O2xO6Dwp3HnVVCDoGJPwcP3eYqm4EFVQOYLVAWEIO2qCP9bSFSRIlVE+0twXgVUBWSJAlUBIXgaZmvHGAH1lKhiTrO18R1gVAHJAKAqIARPiSrorXCyVEEvM4YqqH0SiSroaW2EjCoiRhIhf1AVkKUIVAWEAC4XmPnLBUJVQOYLVAWEAKoCqgICiQZUBYQAqgKqAjJXxiz68uHLu1o//dutD35x4RU6f7v1wa7WT6t5DVK7Ne31XDhQFRACqAqoCkiCVPMa/nbrgxeKX/jWiW+u/fJ3e29+UNiy925POZ3Clr17b36wqmrFc0e//lLpS5ubcpsV3Wmv+bxBJv1fQSCTUBXPgCoq667ffMju5o+P601apz/tH7klh8Ru/Zh9ZHnB8lVVKwpb9g6OXncqB3Fc2LALG7bLB+zyfru83ybvs8l6bbJe/FXO0OVjd3e+fPZHL5f/pHz4ctpPZB5AVUAIoCqgKiDRkNitm5tyvnXimzsa3h3j33EqB53YkEs16lSN2pUjFtmAabwnHKOoa1LQYeCzjYJHFnGXXd7X1n/xj1/+7lsnvnW6/0LaT2pOQFVACKAqoCogEaniNbxwOuvYPaZR1u1UDrnUoy4Nz64cNot7CSuIe20Yj45ZGioPo5Bj4LMNvDbLOEciaPnL5df/u+rVwUlF2s8uQaAqIARQFVAVkBD4Fv1/V726qmqFVHjfiQ251FynmmeVD5rEPVbFsFMv8domZnwunFm/B2fG58a3+B0mtxGzqcZMkl6TuMck7jGKuibHHk1wW03CjuudRS+cZnzSfiTtp5kIUBUQAqgKqAoInZuS9hdOZzVwip3KQZd61KUdsymGTJJeh0485bIQepjyPpmZ+mp25qsnoTyZmZqd8lIi8ZjVVuUIJQwDv32C26rlt+5oeO93Naskdmvazzc2UBUQAqgKqAoIxa4Hn7xy/qcaMduJDbk1fKeKa5ENOidkU27bjM8143fPTvsiGiKU2ZnZad+Mn4gzfDaDTTWGC2NS2DnBa5vgtn3ZfvwXrF885Z1RUBUQAqgKqArIpP8rid36u5pVe27/3akcdKlGXVqBVT5kVwumXNZpr3Pa65zxe57MTj+ZnZkL0zN+D/72aa/Ta9Vb5MMmca9pvMfAZ09wW9s4FS+VfO+mpD3tpx8NqAoIAVQFVAVE7fauqFp5uSPfqRx0qbku7ZhVMey16glJ+FxPZqbmKIkAs9P+GZ+LEIbH7tRLTeJek7h3cuzxBLdVPHRnBeuVK4K7ab8IEYGqgBBAVUBVPOOo3d7f1/yhoavEqRxya/hONd+uEU65bdMex7THMeNzzz2YiBJeeBw4PpvBIh8yiXuNws4Jbis23PyLcz+5p+hO+6UIB6oCQgBVAVXxLBPwBDbk1o45VFyHdpxq02envAuWBC28mPJRJU+5rFYl1yTuNYq6Jrit4sFbPz/30zbVcNovSAhQFRACqAqoimeWoHhCO+ZU89yTymmPfdpjn/Y4Zqd9T2ank8y0f9rjwA8x5bY5NCK6LX5c+kOOTpj2y0IHqgJCEEMVnz8GG26BlyvA8iLIU8oPy0F2LfjzDXCEA1UxZzY35hy9x6Q84TGpKE88mfEn3xM4M1PTXgd5ILtTLzVL+nBb9PfUfP/M956qEbRQFRCC5ZFUcU8Gfl8LtjWD0n7QpQZyK+QppUsNKobBhy3gFxfBnlaoijlwuv/CXy6/7lQOurVjTjXfZcSmXLYpl23KbZ+d9j+ZmY7APN0QxvTUtNtOHM5lo9ui9sGxX1f+Ju0XhwKqAkIQroo7YvDzStAgTH87CEmc+zLw60uA+QCqIiHuKbpfOf+fRlm3W8NzacecE3K/y+p3Wf1uW1RPRGJ2yhdCom+c9k+5bcRBXVa7RmiW9E0KOye4rTuv/m1ny960XyIcqAoIQbgqfn8ZemJJwsbAf14AhzuhKuLAt+hfPvfjMf4dl3rUrRO6DIo5eWJ22j/j90x5HFRDH8KUxzHtdc1Meedji7FHE9zW7Ir/ujhyLe0XahKqAkIRooqDj8G25vS3epD58flj8OY1qIo4/HfVqw2cYpdqxK0TOvUSv9OCMzvlezIzFQbVuE/N+D1Tbns0Q0TAbZv2OoP1E1Q4aQu8AmYbxjNL+gy8dm5f/fdO/zvPrEv7tYKqgBCEqOKta6B6NP1NHmR+3JeBn7KgKmJBpCiwIbdO4NSK/A4z7okZvyeSJ6aezEw9mZ6a9rr8LisllVBwMUR71WmZwsfdRip8dspHvddnN1pkQyZx7wSvrezuJ6svrUn75YKqgBCEqOLFUsA1pL/Jg8yb5UVQFVHhW/QvnM7SiNluLd+lE/pshimXBV8EMCyGICMJn3vKbZtyWRfOtMfxJEIH19TslBevxpTL4rXozNIBPMWdff6XFQNX0nvFoCogBCGqWF6U/sYOshCgKmJAdj2NevQij0mFt87TXkfE3/sz/qRJgs6Mzxn5WKQtXAaFWdpvGHvE7atnFPyr2GZO4xWDqoAQQFVkGFAV0SBHxw65dUK3QUZ0DblsETuFpj12qu1OPm7rbFh/17TXSXVY2dVjZknfBK/t2K0df766Po0XDaoCQgBVkWFAVURE7fYuL3heKrzv1vDdepHPPul3mv1Oc2gKYXpqxuuccloWAbI/KnD0KbcNr5XPPmmWEd1Q3yt6oUXak67rhhj8X0EgBqiKjCNcFRfqrt98yO7ij4v0Jo3Tn/aPXFo42Jm/5dpfnaoRt17kMarwFnk6kKLAe4E8fpcFfymYqPnqORJWsssy43fTB0RRFXBNKvFuqIvNn6+8sHLC9yQt1w2qAkIAVZFhQFWEo3J7lxc8LxHed+kE7gmJ32HyO0xTListmPBPexyRJLEY0MOLGb8br57fYbJhPJO4Fw8smkQdabl0UBUQAqiKDAOqIpwPmnKO3mM6VaNu/bjXqscbYmoWxYzf43eayQba7HcsliTwYxHeslBdYdNuG77Ra9WbZYOTY49bO8pfPP3ves/M4l86qAoIAVRFhgFVEQLPol+e/91JWbdbJ/AYFT6H0e8wEaNjp/3THjv1K97vMPmd0Vi4G6KUTDv6jM9NdEM5zX6HyecwOrRis6R/gtuWff6XZ3uqF//qQVVACKAqMgyoihCIkELNdevFPpvB7zDiXU+zUx6/0+R3GINUMWeEZX9EEcaZ+wsqhMI47bE/mfbP+N1+h9HvMPpsBotsaFLY2cQ+86OSHy5+YAFVASGAqsgwoCroqNzeb534llr8yK0XeUxKv92Idz1Nexx+u9FvN+ItcjCLqYqwo9uNUy7rk2n/tNuG19BlkJul/RPctu8VvXBnjL3IFxCqAkIAVZFhQFXQIQY+qUc9ExKffdJnn5z2Ov1Os89u9NmNPkd85quQyEpI5Ig+u9HvMM/6PX6HyWef9NkMVsXIpLCz6M6uNy69uciBBVQFhACqIsOAqqCgBj65dUKvSeWzT5Jt8WQYxhAiRRvJJPyIoVVyGKc9Dvyxa0JmlvRjw/e+e/JfuuWCxbyGUBUQAqiKDAOqguIir+EPVSucqhGPQYL/PPfZJn22cE/EN0ccyGhgjsSrhm3Sbzf6bAYisBh7vP3Kuh23dy/mHIuUqGLC90TvndV5ZjSuKY1rSuP0L1VcUxrXlM4zo/fOpmvmy6IBVZFhQFVQvFz+k9b+iy7tmMeowBtcnz2ERLQR9Et/Psz1KCGVtBl8NgN+pzxuX/03jy1Tmu2Ldg2Tr4oJ35OZoS8AJyczmB44rLC41A6fzjOT2bbIPFUgCIIgyLw3LnWgKnAGJhXL87/rxIbdE+M+2wShigCTQcy5NU8BIVUKrrDXorPIhwx89s9K/6Oqt37RLmPyVaH3zgJODpjgZAicHL56Qmq0qx0+vXc27Z/71AFVkfYKJxeoChzmwwN7bm12aXgeg9xrnYiKbcJrMzw1RK+ndcKhERpFXXhyW233LM5lTL4qdJ4ZwMkB+scZAieniyfiqycUFpcuHZMkF43MU8UzDlQFzgvFLwyMXnfrRR6zxmPVk0xQRJfHIrohSh08QRCVd5tUZmm/ePDWN4/9M1+lWpzLmHxVaN3TgJMDdO0ZAifnQffAkBSTTNq07um0f+5TB1RFhgFVYfB/dVfR/fLZHzmwYe+k3BepLY7UJRWb8A6iSJ1XMXab2+EiK8Sm4hvGHr12YcWJh6cXp2M8+arQuKYAJwdoHmQInJw77M5eoVQ8YdG4ptL+0U8dUBUZBlSFgZyh7dLwPCbMY9F5LDqPRU/htUYkVucPrbeKIl5XEkUiJVsnwqtErzN+Fg691Cjqutj8+QrWCsziXIQrmQJVOP2AkwPUzXHBTuchWSiShWafZrHWoAjjU3YC74pKb0E2A0WyUISRx+qlP/2UHf5q4sVycp6RbxdURYYBVWHwf7W8YDmff8etE3oJT4QQ3ApbI5J4Ez9n6N1KQVgi6IGO26wxywax4XvfPPbP/fLxRbiSKVOFqike55kMFFmTj6magKqOtQZFGAfY8d8Vnd78bAaK7DgPqAJ3nCceEEdpYu/AVTGXYqEqIEsTqIpW1fBLZ150YMNeoyKOJCJ7IoWSiC+M8BoGn4JdLTCMPco+/8vT7ecWYeZ2ylSB3Y5HGZOBImtOYthtgNWw1qAIYz87/rui03Mym4EiO8qox9lFNQC7jRXlIoxcVs9tgN1m70Cpx4kCVQFZmkBVHOws2HrtLy4Nz2tWey06AqsuSr9TUB+UD8c2j2TG3FIRPhtxrIhdT2HoqBNxGeTUOCjM7Ej1xUQmfE+Si9rhA5wcoGyIySXWGhTvfUIYOazuS6w1KML4mB3hVXxj0A5YYQ6ShWYXXgLKBqA8y2SgyJrjWPfxbAaKfHgWKBvAtY+RLJR5rSHkMftD/HCx6xYMJ6fhQXsXTyTUGdUOX9Iv19MDVEWGEVEVz8iHGefnrFfu9pS7dSKfVR85nqD9ik80UREpRRHNBJGTFonlKqJHGOSJmLUW2VBfd83/Ofm/RSpdqi9mylQhvxaPEiYDRVYfxeTXgPwiazWKMPaxqe3E48B2XA/M+mtAfo2dhyJZ5Hvr9yFZaHbhRcA5ms1AkbwSELxzYAf8jYwcFidu3Wg8q6rIOgNE5vS3d5B584yrAnN5njv6daO8x2tUeMxad2R0OB6c2D1UKYd2dLJKZA0j19+uFk7wH32v6IVr/U34ihKpI2WqkF2JRxGTgSKrj2CyK0DGYq1GEcZetuwKuLoXyUKzC1jEbtTTziPZDHx7EZOBMvP24vtjBdsRxnZW5xV8BySvCOAbs1Dm1eASZFfYeSixc/zqkTyrqvj9ZdAgTH97B5kfXWrww3PPtCouC+6tuPBLp5rrs2g8Zq3HrKXaX7oVAh1TFn1k4kcb/LNvogijuCX0cWIjnaIdl6xYuD88Zh1+Rngf1PbL6z68yVRZXSm9nilThbQmHoVMBoqsPoxJa4C0nLUaRRgfsaU1WP42JAtlXiV3u/oRkoVm55cT+6w+jHUczmZ8xJYWMhnbWB3kRmkN6DiczUCR3ELqXUQhtMfsXBRhbGN1xK1bgL7q9z/+/GBje0fGf7tCVPGP+2A/O/1NHmR+lPaD319+plXxQVPu0bs73Tqh16ojVUFi0YZ5Ioow4qU0ElZFzHKiSCLMFtrQEzFrzLKh6635Pz37E4nOmNLrmTJVSKrjkc9koMjqg5ikGkjKWKtRhLGbLakGdbuRLDQ7v4zYjfYUy9+GMHaz8rchqw9ikjLWajQ7/yCTQe7ccTCbgSK5+ZHetY3VUQ0k1aQq4tYtgPbOls+PHt+46f0t27bXXL8l0BjS/h1IESGqaFOAX1WBLnX6Wz3IXOEawM8rwb62Z1oVPy5/uW2g2muUey16j1kT1sjSzRGr0ylSnLGA8U5hpcXpjIpRbbPGY9bYVHzV6IOvHfpfAoUqpdczZaoYr4zHCSYDRVZ9ho1XgvES1ioUYexiU9uJx/TtleDRZ8TciJwTYLwSO7kVyUIRxlbWI9qrOScA9cacE8QD4iiV7Bza/glCdkDd7+orKCl7b+OmvfsP3HrQrrA40/5lSC4hqujRgAvD4H9qwYA+/W0fJHG4BvD2NbCpERzlPLuqwBMVJuWA14R5zBqPiSTcGRaK0FzFHCOMORJBGCEVICsWbghTAIdOMinkfK/ohfq+Rq3Ln7pLmjJViCricYzJQJFVn2KiCiAqZq1CEQaTTbxUzFpFjYCiNga2M2srgKgC1DKRLKqECsD+NJuBIjnHgsoPLoFQBTtu3WiE5Sruc3qPnip4Z926o6cKmtidaf9WJItwVfRowNlB8OtqUDEMw4slwIAeVI+CX18C75OeeGZV0aoaeunMiy4t32fVuk0aArOGSgiHtb8xchjR0xhJILyXKTQhQUFLaGuok3JNKo3jvesvrfnk7iGl2Z66S5oyVQjOLTZt+7MZKLL9ixj7sLejCGMLq20uxUZJaysszlsP2vcfPLR+A1pUVt4xzE/712OBRFRFtwbck4J1DeDlCrC8CPJU8/0y8OqXYE8bOMZ51lVxsLNgy7W/uPVCn1UfUAUJGWGE90QR4cUcPDH3ACKeLSJGElq8zuHn4japLfKRwju7Xq9+M6XpipSpYqx0sWn9OJuBItsOx9iHvQ1FGH9ntc6l2HgjoMQGy5Vbjdty8zZv2Xq+umZUrk7792R+LI+iim416CLhqAFHBTpJOlSgAwOPSR5h4JESsJWArQTtStCuBG0K0KYArQrQqgAPFeChHDwguS8H92WghaRZBpql4B7JXSm4KwFNJI0S0CgGd0hui8HtcXCL5OY4aBAR3BCBGyJwXQiuC8E1IbgmBPVCUC8AV0nqBKBuDFwhuTwGLvNBLUkNH9TwwJckl3jgEhdUk1RxQdUouEhSOQoujBCwRgBrBFQMg4phcH4YnB8G5cOgfAicIykbAmWD4CxJ6QAoHQAlOP3gTD840w+K+whO94HTvaCIpLAXFPaAApL8HpDfDU51g1Pd4GQ3ONkNTnSBE13geBc43gWOdSVTFb3PfaP3uW+EP05k/6TsmXiBdF6ve+si+6jXqPBatG6j2m1Uu03qYE9QJJLDiD+CNuEkROSFOuLmJKh+J8oQxHkZ1Xa1oK3zwoun/12o1KSufUiZKvjFi03rPnKVp7+zWuf4agwSHiw7Klefr67ZvGVr3k7mlVuNYoMldf+2VABVAVURTlxV4BtjE7fkBCuQOM8XPC8Q3POZVR4T5Qm126T2EGhCCddG5DWjgkiseyq4cykG4XoIr6dJ7TEFTgdXhUMnMYx1fP3IP3ULRlM3uyJlquAVZghzn1fRMcwvKitfvwHdf/DQEkqAQ1VAVYQz16gikdLiGmXe+sER2y3PHf26S8PzWTRuo8ptVLlNKje9hTUFggwyh6GJlMAIzmQQbXrrhwwUebNufF5pibCERNCBWnajCKOohUpImIM6miJgVLmNKpdBYRR1/0fx92u6r2sc3hS1DylTxeipDGEBU/Ca2J1UAvw+pzdF/8JkAVUBVUEn8ZZ6rnvGfhxt/zl87+RdL5/9kUsn8Fm1hCrohKuC3jEVK4eh9Vq03oAqYkzLiPgSjtZr0UYa3TR69k2826OoJXJaIkgPIZgkA3hmW2Gypah9SJkqRo5lCAuerY0nwPfuP/Dexk1FZeXdfFGK/pcLJIYqPn8MNtyCme2nmh+Wg+xa8Ocb4AhnsaOKxLfPSRXUxjmFFBO+J2XDl/946XeeCbHXonVNYi6jyhXBE0HhRSxPhIYXrXkMFHmzThRhLZBoPUvhhBTbmsegxnwSqvDEDSZwJjHXJGZV8vbVb9p47e+py2ynQBX4yrLDRzIETs6d9o4egWR8wqx2LmjYskBjqK6/gSfAL9TWPW2z+ZZHUsU9Gfh9LdjWDEr74XjZp5ouNagYBh+2gF9cBHta06CKOUUVITvEVkWMLRHJadn92Z3tXpPCY9a4jMGqIFDTct2jZ98gG2izxnO3CMlC8+5qPGath3dlZaAF33uWR2vW39xLvZR3j7ICl4gMslCEcbrFEnF7UUsEA7XmMYpa8MCCUdRCy1KEZLDpZ0Gowoi5JjG7RlTVcmhFxQohpk1R+5B8VWhcU0+6/wE4OZnBDGfH/e7+QYlSbLBqXFNJuUSjcnVJReV7Gzfl7WRea2p5ShLg4aq4IwY/r4QrQS0x7svAry8B5oOnN1cR/iBGp1bEmsTmdzWrrnQW+swqt4n40e3GidAZpXKb1MKyPUgWmtekcZs0zbtQhLG3dFTjNrXmMVBkd6vHrCH1cEVk1nosrXkM3Bw64vGbdSIL+ZgwBPfsm9Tj8O10W2hoOYnR0jdQhFHUHBpPROhxws/IRaB06CTtnMoXT/87X6ZMUfuQfFVo3dNys5On0nO4wvvd/XfaOxoetC9R7rR33O/u53CFPJVebnZq3dPJvVbtfcOnikvWb0APHj3exO7ULCxqWSDhqoArBi5R2Bj4zwvgcOf8VTGnxHLiyefwl+ZaYCJ9UD8ofal39LrPqnVPKoNVgRMWXoxcXslAkV0P3aaHeQwUeeOykMx1B1IIgYCApg0iDjjdYtZ57p5GstCVZVyii4l6ercIyUJXlo0Sbgh5GmQLXBWFzbTRTeHBBHEWwapwTsjVvLavHfpfPIlcl+xmCif5qtB5ZlR2r2TSxlPpByXKHoGkiydaovQIJIMSJU+ll0zaVHavzjOTiv+BxulvYncePHr8nXXrThWXtPcNp+IocQlRxcHHYFtz+ls9yPz4/DF481rapuAtPKsRvjHxqOJrh75mxgZ9Vo1rUumaVLoJSGFMqtyTIT/Sh4k2evTySga6smzUbSKjCrxZxx+HqkLnMQeiB1HZ3qDOqHuEKojtd3WhqggeBUuLKkhVhGew8ZoHTkTpnlTi54gPgvrmsX9u5/amaBAUovc9SS4676zGPY3ZvTKzc9xgFU2YBTrjEh2QnHYAACAASURBVEU0YR43WGVmJ2b3atzTOu9s0i8XHbnFWd/UsmvPPjwBPiCWp/RwIYSo4q1roHo0/U0eZH7cl4GfskJVwaq7fuNBO4cnEuiMKocvkU8F3kCHPw7ZITYRS4t2lGgbo703hD6DfHn+d53aMa9Z45xQBDAog5hUOqlf5UaVq6kQYezJ3bUHYewpGVG5jCp3UyGSheY14SmN1jwGirxxRUgp5I0rQrPGbR4tfRNFGEXNZo2bdAARIlBPqQe4D5rIp6NkIuSNy0Kj2m1UuYzDJW+gCKPwXiAPQXSgOScx56Qy9BToZzchN0sGflb6Hxc6LyvM9lS0D8lXhd73ROed1XpmNO5pldOvcvpVDt9SxelXOf0a97TWM5NqT9AZ0xgu1NZty83blptXXX9jTGNYhIOGqOLFUsA1pL/Jg8yb5WG3NpqrKsJb50Ta6xj7LIIqHqqGXjrzolsv8pjUNE9QhHmC4H4u0XDXCowBVSC7HrqNRDKD/L1P1waVXdC6ycij2aQNzjpQ2yPGDXRIVYTWLdwW5OnQVGGRj/z2/C+L2s9J9KZUtA8pUQUkWQyI5UVl5e9t3LRrz776pha5xZm6Yy2HN0zNLBaoijk16/SX5qSKGG8JD2gSUcV1cfsvyn/qNkjdRpVjQu7EoXuCxIVDtsX3dqFIFrry7DA1XKp5F5WlKCw9uwdh7Ckd0URRBa0HiUxsNAemRARvN2qi5CEoVaiCPGFQugxhIQWhCrlzQu6YkDsm5FaM//bF3x1qOTGumUhF+wBVsTRo4fSeKi55Z926L04VNLE71U5/0g8BVZFhLDyqWIoU9lf+ufY1j1HumlQGVEEQCDJcAVUQ4KrIbcQbaBWBUR2EiSB8Bh9t1nfILOvAHDrq7aHFUocLiiSoPISStEVQGEGBq8KmFvyjbsOWG7lClS4VFxaqYimhdvpvksvZnioueTzMT2LhUBUZxrOpin3sL3bceNdjVLgMCode5tTLQlVhwFVBgTfELbkMeucP7gk6dElE8kRCqN1BtqDnJIJVYcACMiOrGtzpRJ6UXubQyxx6mV07frBh6/orfxtTqFJxYaEqliTjBkt9U0veTubmLVtLKipH5OqFlwlVkWE8m6rY3rL70zvbvWaVyyB3TchdE3KXASdcD2TvU2Mh3juU2xQ8mjaSGOIsMhhtXdjQwU4xluvA8Fl14X1QdG24DArivCbkLjy20Ikrmj/7/cU/8KSKVFxYmNZ+GtPaiTMiV1+ordu8Zeu23LzLtxoXkgDPXFWo+Nnf6H1ujzD9NVlUnk1V/On6+vK2Q16L2jkhd07InBOyRHqfXJOYy4i5giZeBOecAwvTRr+hXmxh0FaHjZTTVgepwph4HxR+jjKHXnr7UclPz/6EJ5GnorFKyWDZmcEjaZ9lnSymBw4v2mDZhdDFF+HL2e7df+Dmg/Z5JMCfOlXwKgc/fJSMoqAqniFV/HfVyts957wWjRPvfQrqgJI7DfKg3ie6KuiT9YKmdkfzRDiRbjJBJ7ItgiZguyOnK+h9UMEJGPI0HXpZb2/dvxX8K08i17qnkn5hk68KrWcGcHLABCdD4ORwVXrxpA2ze7WembR/E+LSwun94lTB+g0ongCPttvlW40hufGnSxW8ysHnvtEbVxW8ysH4DoCqeIZU8XPWKw8Gqn1mtUMvdeql1I/uyKqgd0mFzNQLXf8jZCXzkIR26E1YiTubRutuogoMW6sDn1tHRhKh9QxWBXlqeqlDL3XopaNDN//Pyf/Nk8jVDm/SL2zyVaFxTwNODtA/zhA4OZ1cIVell5mdGvd02r8JCSK3OG8+aN+7/wB+P9cuvijk1XfWrTt49Dh9Y5pU8WjkuW/0Zu8ZySZGQ440UY07zh4hsc/qwefCWnzcKM99o/e51XxecMnUSx9WxlMFXn4l/0N6HULKpx2C0FglP1DnRyPPhb3XGtjYm10phqpYFHBVeKOpYkLunKByGEGeCFKFkU7IIoMPaYNliYFPUYKM8KFQEcfIYm4jFhiYm4XmNdL7nchKkjkJGqGq4A7fxlWhsrmTfmGTrwq1awpwcoCuPUPg5LR09w9IlOMGq9qV/LAu1YwbLJfJ+7mWV9fgCfD6ppa1a9euXbv2VHEJtWc6VRFkiNV8XkhUge8TJgMS4YdUa/6NwRIVvfUXB5r7eKogyqe9EX9Mr0N4gcRj/L308CWsnEW3RYKqWJwJnovGz1mvtA7WeM0qQhUEVGeULIYqwvujqHFQAVUE1olSu01qd+Tep0AflNsctpA4qYrA2KfGQiQLXXl2iBizy9hTMhJDFbLA6dDO0aGX8kYacVUoLY6kX9jkq0KFL0KufZghcHJut3d0CySiCbMqBbMZFo0Rubq8umbzlq3vbtz07saNa8k/yhZpjSrIZrRpD6GNcFUk0NQKPyRb6qY9NG3E7YCilx++c0iIE6NutPcGVQCIS1bHUF26VHHzQTu+Hn7aP5xJ5PmC58WSNq8Jc+okTp0kkirC4wxqBG3ovDxaupvqjHpAUwWVe9BGIfy2E/RVxMMGOxmUrjuFSBa6snSQzGCHxRDhqtBJnDqJQycxSfqRz5Clowr81kbqlrhgp/PwgCv79AXWGhRhfMpO4F1R6S0k756dx+olNrJ3kMVGejUhODkZFrN/euSLtcF/eGPx9KhisEQ1J1WERxXiktW0vqB5q4KIeAZLVOTjRFWBVyAEWt9UmlVRe/POB3/fQv/vZwzPFzwvlrR7QlURMcLAm+CBktdRhFF4D1fFnUIkC83Fu4BGamj3q9hTOoI38XhUsSdwv4omShjBy9AGMtgjtNnahc0RxsUGepwEpXuQLDT3jiJUFZEiiRBVmJekKlR341HBZKDImnxMdReo6lhrUIRxgB3/XdHpzc9moMiOCnJLHWsN/r8JFMvegatiLsVmnCr2fHJgbdjfhdq6p0cVcaIKKn+QXSmOlqtISlRBVSZkn7lHFWkhoipOlZzduOn98B8KGQOhCqPSoRM7dGKHTuLQSRw6KUEEVcgFJR8hWWjuHbnLoLjHRBHGRyUjStdkSy4DRXbdd01i7sn7eQwUeaNWaFS5jQ/yGCjC2FM6qvYQnVFXRCZN8OqztNsl4fsQhiCXsCXXiA0b6UTOBDTIo490kgZOhzg7/EzFlCrkRmvSL2zKVIHdicc5JgNF1pzEsDsAq2WtQRHGfnb8d0Wn52Q2A0V2nAsUTmg8UCx7B4owclk9cyl2iatCbnE+HuZT1DbcfvvtP4Wr4k9/+tMP9/c9HbkK2i/6uFEFr3IwcrRBe0vTnkDf0dxVgdeBjBIS7oCK06mVBlX8eM/Dd9atC//XZ9jfT/J+opRz3EalQyt2aClVkNB/jFP9OUM1KxkowmxxTbTkMlDkjRpBYMrbYElQQIARqnijVkiFC4yiZqMaX15w5dkRPIERWFAW3142QkQSxG5DwSOdCO4xUSQLzb2tcEXKXVM5idCT0oodWrFdK6Y6oGSTS0gVypsxqSF+8mehCCOX1V3DWoMijE/YEV7FNwbtgBXmIllodmENUN4EyjImA0XWnMC6T2QzUOTDMnLjJ2xlSLE32R/ih4tdt2CeDlXQm/u2vuELtXUU5dU1e/cfoMjbyaR/c/CZFhT7Dnz29ttvR/yOff9zQRqjCnL0USA4ILuVqBFQc0wLz30EVHizTuva2sOn8g0JqSJgwXiiWiRV/L9faP+xd9+f//yXt956i/5/z7yoQiJlu40Kh3bcoR0Pji0kkXPderwPquDeUM1KBrqydNBlUBA/8LPQlWcH3ZMtZGQQUIXAiLkMg/gb7+plRGhym2zibxfgShCexW+xp4qpCoXLoBCUfoRkoStLBgIZbH2EfqdgVYgdOjF+pnbtuFk6sARVIb8ejxImA0VWH8Pk14G8irUaRRgfs6ntxOPAdqwwB8lCmfXXgfw6Ow9Fssj31n+MZKHZhVWAcyybgSJ5JbRD0Isl38jIYXHi1o1G8lQxIJbTW/zq+hv0Fn//wUP0Nj2kHae/tHf/Afobq+tv0IsNGRcbzoGDh//4xz+GlL8tN++p6ICCJI9ouYqahjtbtudQwiipqEx7+55ECFVMRlGFTuLUSQnozrhdgDA+ymV+hDA+KhmSuwwKImlxB+8awqONWgG1XPnrl8b0Uqe+l1IF4YaSASIUIJ72OW/n476hLyKy8uyQa6SWvF9FjYA8HMJsIUZnBdLXVEKCIDikCFaFZCmqQlYXj9NMBoqsPoLJ6oDsAms1ijD2smV14OpeJAvNLrhA7EY97TySzcC3n2YyUGbeXnx/rGA7wtjO6qzDd0DyTtMOQStWVgdkdew8lNg5fvVIglUxpjHQ2+X6phZ6q/3FqQJ6g75+A0pvjvN2MumvllRU0t/b1jdMLzkVa8fiHDh0JDykuHyrEaoiw4g9AmpUoTlw8PDatWv/8te/4kvcjxssaW/oFw6eq3BPyh2acYdmnBAG3hmlFTt0YiLdHZTxljkn7hH3q3i9RoDP1LtTgLfdTvL3PsIovKuXOXR3CVXoJA66KvT3chkowii4OyFz6vvCtuc36aVEdxaj8B65oBO5OjqeovioZCi43ylIFRIyfS0OnA5+dppxh2bcrlmiqpDWxqOQUIW0FkgrWKtRhLGHLa3F8rcjWSjzKrnb1T1IFpqdX0Hss/oI1nEkm7GHLS1kMrazOsiN0lrQcSSbgSK5hbRDBIrFt7BzUYSxndURt240ODm/+tWvfvvb365Zs+bNN9/cvGUrvbk/VVxCb+6b2J305v5p++6NaQwlFZV/+etf33nnHbon3lm3Tm5xZr4qgubThU2syzgSmVeB//TBl7hfvwHdf/DQ/FaFeXr4cfnLXdwb7km5QyNyaEThqqB3RtFp+gdKxAFkxvsuM5ClKCn5CGHsPtMvduiawlSRf5foI+oreZ16C+4JvMuo90xge/69CXlgQSeDwjmhwDuv6Kwo6Q2pXlAkEaoKkUMjsmtEYt6Dbx5bttRUIbkUj3wmA0VWH8Ikl4CkjLUaRRgfsSWXQN1HSBaanV9G7EZ7iuVvQxgfsfK3IasPYZIy1mo0O/8Qk0Hu3HEom4Eiufm0Q9CKlVwCkkvsXBRhbGN1xK0bjacjV7FAxjQGvC24UFs3brCIDRZ6hzU+teLpWtgDsmDmOltb7fQ3sTu/OFWQ0tuipJqfs15pH77snpTbNSK7RmTXjtu143atmE5Yxjugitzb4euWy+1EJ0+YbIKSH7IwImahxQ6t2KmTugxy2qLikYY56eljnAK562DG7dpx4kw1Iv5oEz4Fb0mpQnwxHieZDBRZ9TkmvgjEZ1mrUISxm01tJx7Tt18Ejz4n5kbknATii9iprUgWijC2sh7RXs05STtE8NvFF9k5tP0TZImrYkAsP3j0+HsbN12+1Yj/WpRbnPsPHtq8ZevbfyKGQuHpDaiKDGPeC3vgq8IcPHr8nXXrThWXtHB60/4xThxcFS6D1KoW2NQCm1pIIrKpRTaNyKYZt+MEGlyJXXc3B+8mIsfU4lDNcdTQJDRVHkRET1ABgV0ncUzIgkMHQg92HK0kUEnNuF0zbtOM2zQi4lwCpyawqgVWtYBLztZeUoNlRax4HGcyUGTVp5iIBUTFrFUowmCyiZeKWauoeI3aGNjOrGUBEQvUMpEsqgQWYH+azUCRnOMgZH9aCYQq2HHrRmPJquLxMH/v/gObt2ytb2qhfh6OGyx5O5mnikvGDZZmTs97Gzfl7WTiL0FVZBgLXwMKvy0KtZJYcm+llSJ+znqlbajWbZBZVQKbKjFV3DxF3K/iZnD3lFZs14jsmvFQW+gijMF1hEsifFSrjuYJMtwJmIm2m10XFkDEUIVKYFUJrCrBKLkGVEqm4Ol8T5ILhqtCWL7YtB/IZqDI9qMx9mFvRxHGFlb7XIrl5Fx/0N7JE43pjJjDl/TLlQqaOb3MPfu25ebdfNBO3z4sV2/espVVW0dt6RfLqX2gKjKMcFVU1F2f34eZrzHU3mrM28l8b+OmkorKfrE87R/yaPzp+vrKR8fdk3KbWmjH0eDg/VEistGnj48KNP3kQCMJrWMnTBURbRGS/Ah/NSSkIPqOxu0aETExMMIYJzF9jBP5LhFZMaFdQ5wj7ozmroqfnv0JVyJXWBxJv7ApU4WgdLFp+zibgSLbD8fYh70dRRh/Z7XNpdglpYqbD9q35eYx9+xr5vSGvPR4mL9+AxoiDzpQFRlGElVBMSxXs2rr8NUnWbV1w3J12j/zIbzflHuq5SOnQWpVjdlwQnuihHa1iICKMDSBNIZdK7arhVQCYG62iEpUT5AOEzu0EodWEkhIaMSB6pEVpp8FcV6qMZtqzKoas6rGLredXFGxYqmpYqx4sWndR67y9HdW6xxfjcFSUIXK6a9vatm8Zeue/QceD/PDd2hkd763cVNr33CMQkJUkXUGiMzpb+8g8yYVqqDoF8tLKirx2y/W3mrkawxp/xbg7Hx44ONbW1wGqRUbs+HgPVEqIQFhC2FEHzi0InuEV8ej2yKuMMTRPUFThVroIIQRZhGNiB46BE4EPy9szIaNWbExK8Yvvbf/9eo3uRI5ZnMn/cKmTBW8ogzh6VaFzOKsqr/x3sZNB48ej9YtUHur8b2Nm+J2GoSoYmUNaJSkv72DzI8BPfh+WQpVQfF4mF9YVv7exk3MPfvqm1pEBkt6vxGF/ZXrr7zpmpBaMb4V49swvo0KL4jshSCgimAf4D/V7WpBNJHYteMOLT5YtnosvjBCJCGmdSKFyoB/ejeZnT3VpA21CE0VAtJ85ElhfCvJ7qvv/v1GLlciVzm8Sb+wKVMFNz9DeFpVITJYWLV16zegJ4tLYvQDlFRUbsvNS+RHX4gqttwFxznpb/Ig86N6FKz8cjFUQdHM6T1Jm5whszjT8r24wGtYXf2q2yDB+2Qi90FpwiIGjYjq0gmoIrItmnIYKPJ61Zg2RANiWuYj7KWgVHZY0NBwEslCkR2NdvVtvHB+oGcssKdNE6v3yark/u3LNz65e4grkWvcU0m/sClTxejxDOHpU4XIYCmpqFy/AS0sK4/hAJXT/8WpAuaefQl+aUNUcWEYrL6S/iYPMj/evQ3evb2oqqA+dY20yRmN7E6V07+Y345GedfLZ3/knhDbVGO0PihaVBESWOCtMPE7XZCALShVBHdGxWI8licCIY7ApuYUr0ERxskmtSBS75MgcApESEH1Po1ZFKOvXVh5/OFprkSu9c4m/cImXxXErY1GvsgQODm32ju6BRLhhHmRP/Th8DUG/IdbeXVN7EhfZnHu2X/g4NHjidc5RBU9GvCPB+CjtvS3epC5kt8D/nAZHOWkQRX0TyA1OeNkcUn4OIsU0WuQL8//rlsvsmJ8i5JnUfKsSp410EszZsXwn+FEm2snWucTjXjje+MkkoXmNAjsaqG99+KKwALVu4v78bYbV8Vu6qXcm5Qwemizsk81BSTRXUzfHtkTuCpu5zBQZMdtMhISUm6wqgRWFWGFwOkoeRYCrkk6+LPS/7jQeZknVaTiwqZAFa6pJ93/AJyczGCGs6O5u79fohw3WFWu5Id1CdJPzqRj1dbFjRL4GsO23LySiso5HSJcFR0q8OcGsPoKuDIGU9xLgwYhePsaePVLcLgzzaqgEBks9U0te/YfwOPgiMMukojC5fnaoa+5tAK7eiyQrgjKWOBdUmM2tcCuEtgwPq9oF5KF5twYs6nGGnegCGNXca+A6Ava0WhXC+2aRrJfSEQ8Zuwu7g9EGHwqh8E41aQdd2i7z7xOZh3wfRinmjTjdk138evBtojmCRK7SmAnes/GQk8B49MSFTyTpI+R///cGnzAV6hScWGTrwq1e1pqdo6q9B1cYXN3/632jusP2pcot9o7mrv7O7jCUZVeanaq3dOL8+2i83iYv//gofc2bqq91ZhIiNAvluM7z/VA4aro0YBuDWANgdfqQNYZsLwI8rTzqyrwQRM4xiE88TSogmLRJmc8X/C8aPyhXS2wYjwrxrPhqPgkoa2tradyBdFG385hoMiaSl6gG4pTvCYkIGikpRPIpl87js/jW1HcTfQyUU+pB7gbiKddYfEEnnsQkK4KVM9OdJ1R1SZPBOPZMB5+jlYl1yjqQj5DuBK5ANOm4qomXxUaz4zS7h2ftI2q9P0SZbdA0skTLVG6BZJ+iXJUpR+ftCntXo1nZjG/WvhMus1btsaYDBFCa9/wexs3NbI753G45VFU0a0GXSQcNeCoQCdJhwp0YOAxySMMPFICthKwlaBdCdqVoE0B2hSgVQFaFeChAjyUgwck9+Xgvgy0kDTLQLMU3CO5KwV3JaCJpFECGsXgDsltMbg9Dm6R3BwHDSKCGyJwQwSuC8F1IbgmBNeEoF4I6gXgKkmdANSNgSskl8fAZT6oJanhgxoe+JLkEg9c4oJqkiouqBoFF0kqR8GFEQLWCGCNgIphUDEMzg+D88OgfBiUD4FzJGVDoGwQnCUpHQClA6AEpx+c6Qdn+kFxH8HpPnC6FxSRFPaCwh5QQJLfA/K7walucKobnOwGJ7vBiS5wogsc7wLHu8CxrqdUFRSpnpzxm6qVd3rLHRqBVcm1KnlWJc+GQ0QYeP8+34rxyJijg+iD6q1cwUBXFHXaVORv/Cx0xWmOXY1HEieDVSGya7rIKGGcX7wbyUJzbpK5aNIQ5HZRkCpOcyJ6wqYas904gWShK4o6ydryrRjfqiKqbcNIvSl5NrxvTcmzKrlWBbev7+q/FfwrVyIXaSZS8V9Lviq03lm1e1pp90rNznGDVThhHtMZlyjCCfO4wSo1O5V2r9o9nYpkUURuPmjP28nM28mcUw/vzQft723cNO8AH6oCqmKRSdHkjPebco/d+4dDJ7QoRi1KrkXJteIEfoOTYKQ/rp9AGLtyduwK/KIPJC0EhCrWXOSHdkZ1BTqUqHAhJHqIuP00J5AIwYMYKm64cYLoDQuogqotn3YKXKuSi5+dRTFqUYxebT31SvkrXIlcrDel4p+VfFXofE+03lmNZ0btnlY5/SqnH3P4lih4/dXuaY1nZhE8QZ9JF3u6XDhV9Tc2b9m6kKAeqgKqIl0kd3LGse6z79a95dQKLIpRizLMFmSogauCDCxu5VANNy2/jey4bVML+Kd3IVn4wCQhoY1wVRA5DPxxlO2BAU5B8QSeLFlR1EkmS0400kMKutuUYZ5QjloUoxb5yMGGrX+98jeuRC4321PxP0qJKiBzRWZx4hPlDh49Po+w4GRxSd5O5gJ/lEFVQFWEEHZvD4Joe4Y/jlt4yMaIkzMSLJCiRnBvxYVfOrUCi3zEIh+1KLgWBdeq4FoVo1bKGWG2aNyBUu01Dr4Fl0TxaTzgEAZFGGpOcJq6K/JIp6CEB+4JQUi/E+1Yu4p7onmCrLxi1Krg4udlkY9a5CNm6eCmmj/uuvMJVyLH7J5UtFFQFWmGmkn3xamCecQEKqd//8FD+w8eWviMpxiqKOoFGxvByxXpT9tCovHDcvCHy+Bvt5OvithbwrfH9UrsosJLSFBXFCNm3bdOfNOpHbMoRizyEYtiBO+iseJEsQXeWOdcDxsrRU62IBPdguCMdDARhsCGQJOEOnjeNT3THscToxaCEYt8xCIfMYn7fn3uP88+usiVyDWpGX0DVZE2qJl0J4tL5hcQyCzOvJ3Mk8UlSZnwsTySKloV4M8NYN0NUNgLutTpHwwKiUaXGpT2g/fugP+qAgceLWpUES2kiGaauMVST/EH+OSMkI2xa/7c0a9r5d1WJRdvScmGNYYqbm5n0Hp+wm0xJ2EkKol4noiiCup0iLOTj0wKu7574l+aRx7zZMoUtVdQFWkAn0n3zrp1JRWV8+6W5WsMm7dsLa+uSVatwlXRLAO/qgLnh9PfDkISp0EI/qsK7GtbpKgipAVPllTCS65vasEfJDI54zdVK2/1nLOpeKQqYgYW147jnT851/m2aPMwgsOLuTgj2BDRggmaJ2wxPREeUljkI2NDt5cdW5a6kbI6qIpFBp9Jt34DmshMutjlrN+A1je1JLFu4arY1AgKetPf9kHmypUx8JtLC1JF4l1AscOCiMXGfhyjJrqEJ2fsfLj/o1ub7Wo+1Zgm1g3Fs2LxbBEcYYRpI0D4PqHLcsw9nojoCYt8uKrlEL78+LhuMkVtFxwBtUgjoOgz6RaYV2jm9K7fgCZ9pYQQVVzigv+pTX+rB5kfb10DHzQtKKqYU4dPXHlELDP2IaI5CX+KT87YvGVrxMkZF3gNf6ha4VDxLPLhBdkisjAIZ3yGfJY4kQ0RGkwk6IlRuifM0oHtl9fl3dzFlcjlJltymwWKlMyrmBn8Iu0LciSL6YHDC5xX0czp3bP/AD6TbuFJhfqmlvUb0FTMdF0OV5bNIBa+smziWeVwAYSUEG1PXcygJEZcQn8Jn5zx3sZN9MkZIrvluaNfd2iCVNFUXx2kirnYIkrrT4szYjEWtYS5eCJaSGEc76Fy2qlYfhwnJbO1AScHTHAyBE7OvGdrUzPpEp9uHZvy6prNW7am6DYyIap47Sq4Mpb+Jg8yP9gY+HFFkqOK2M16DEMksnOMqCJ2/oMCn5yxfgOKT874t+P/JhC2WBSjuC2Uo5x33vlTwfFD8W2h5FkxXoQ2nYgDqqeXfRv8zxFn5GgjYTC+DeOHHMV69QOw7Dtg68XEPWGRD08KOr9+5J84YyM8qSJ1079SsgYU4OQA/eMMgZMz1zWgVE7/zQftm7dsjXjj0vmhcvrxyROpuw1AiCpeLAVcQ/qbPMi8Wb6wu+CFN9CJtNchb09kY+I7J3hofHLGH99eu2Xne3evX9KMdVvkww21F9auXbt27doLpQWxbUG02hHDC4xvwxamirACacHEffzQYOvFxD1hkQ9zur7El/QQKDUpahx0KVpZFnBygK49Q+DkJL6yLDWTLtqNS+eHzOLEJ0+kdBX05fDe2plFUlSh5hIlmgAAHONJREFUC44SEgkX4uaoE9w+b1XgHO0sWX/yrRNHPl27du3xQwe2b928lvyrKj8dbovAT/uQqdH05WkpVbx6xBk1jZGQIeiLwhLHwkOKZd8J1CQBT5ilg8du5r1du44rkYt1xtS1Dym7X4XmQYaQ2P0qZBYnPpMuxo1L5wdfY8AnT6TuQ4ADVZFhLEQVEZv+xPMKsfuUoh0ubh3mpAr8xhV2bFQz1l3DKlkb/EezRQveLrvxX/FX3wfLvjN1lWdV8qycI7PLvo0332DZSl83XRUrqZem66nW/6HvVWr/D9xY1O3WCJmJ+75Xvz118vDssm8TUYViFK9YJE8EVGEUdf/2/C8L28+lbkkPnJTdBU/dHBfsdB4+nDn7NIu1BkUYn7ITeFdUeguy8VVcGHms3mY2NVE+C2U2hL46h2Lj3QUPn0mH378l6VmEfrF885atVfU3UvcJoICqyDAWGFVQREswJPjGRLakIqrQ+Z48X/A8f+yeRT4crgrKFp8hn9lPrgTLvjNVN2pVct1bvw2WrfRxuFblxSmi1eYRj1894sB4Vqx6atm3SXPQIgz8MWEI3A3448B2a2A7L3Rlp6sfgFcPOzikKmjxxGfIZ9E8YZENq7gPv37kn/pFQq5ErnalsNchZapQNcXjPJOBImvyMVUTUNWx1qAI4wA7/rui05ufzUCRHeeBqgncOIBkodlFdUDVxN6B66Ep5HGiRFcFfSZdKlLNj4f5723clKyUeFygKjKMZKli6fJ+U+7RuzutytHdO/NCPLFh/V/37f4H8ZudaKArrYrKqWXfBq8edgSyF/eDAgIlz4pR2qA3/Xxb/Qdg2XdmTz0kIgnyqZV6gOsBf3ryfpAnlBenln179mSLNVAT2rhYxchnyGcRPWGWDd1oK/jp2Z9wJfIU3dGIImWqwG7Ho4zJQJE1JzHsNsBqWGtQhLGfHf9d0ek5mc1AkR1loduv70ey0OyiGoDdZu9AEUYuq2cuxUZSRb9Y/sWpgkRuXDpvGtmd723cNNf1ZRcCVEWGAVWBz67QCbv37d55obSg6tzpnoc3B9ob8TaXaH8VIxZFi/fVb4Nl77s5h2fxJltJRhXLvjN7soV8/IE7NMK4T0UJjlMrwbLvTNWTPUuEIe6T24MSEjRVcK1KruPkSrDsfbeSS6nCEpafIG0R5AnjeC+1SmBKExW6FKpC2RCTS6zAUos5rO5LrDUowviYHeFVfGPQDlhhDpKFZhdeAsoGoDzLZKDImuNY9/FsBop8eDbkWPjOzGsNQNnA/hA/XOy6BROsCmomXVX9jdQNRsJz46m7TVhEoCoyDKgKhcvz3NGvG+V9ZtmQWTZkkQ0Hmlo57ae6YsRS9z5YtnJq60qwbKWPM2pVjFrr8KQFN6CNV4846KogEwyEQkIcQD2Nth23wrLvgFffnwoELiSELQKdTp8hn4V4wiwbMox14DdJ5UrkSqsrpRcT0fqeJBclrgr5tXiUMBkosvooJr8G5BdZq1GEsY9NbSceB7YTLX79NSC/xs5DkSzyvfX7kCw0u/Ai4BzNZqBIXkmEoxClXWPnoQgjh8WJWzcanJzrD9o7eKJrzQ8/+nj/5i1ba281Yk5/0q8bxZmKym25eTyNIXWHiAhURYYRTRUdPBFfZ1Q6fIv8AUsLv6laeYNzxiIfCrdFcK9O5RTRcB+2KwKqAFsryV/93yF++EdTRVDkEXv7++5AB1dgOKyV1hUWnpwIqIL0hFk62MmpxofJcqUKjXc2pVcyZaqQXYlHEZOBIquPYLIrQMZirUYRxl627Aq4uhfJQrMLWMRu1NPOI9kMfHsRk4Ey8/bi+2MF2xHGdlbnFXwHJK+IfhRcKsyrtKf4zvGrR8LJOVlydsv27Zs2b75270FK/xmY03/w6PE9+w9ILc7F/1JBVWQYUBVa35OC/so/175mlg0QzSvNFmTjSzTHri1EdxPV+ePeSv3Yf993cmVQupvIZ7TQlMCLkNgguphaaNtpnqBLAodSRVgSm6gt5QnZkHG8Z2fdhi03crkSuUClS/WVTJkqpDXxKGQyUGT1YUxaA6TlrNUowviILa3B8rchWSjzKrnb1Y+QLDQ7v5zYZ/VhrONwNuMjtrSQydjG6iA3SmtAx+FsBorkFlKHwIvKzi+ntrBzUYSxjdURt24B7p/duGnz3y/WN6T62yW1OJl79n1xqiClIUsMoCoyDKgKre+J0G751olvGiRdVAsbzRa4KqbqAktFhc69CJ2vN1+CC7QEZ7CDJRHVE2bZkGHsMdX7JDfbU30lU6YKSXU88pkMFFl9EJNUA0kZazWKMHazJdWgbjeShWbnlxG70Z5i+dsQxm5W/jZk9UFMUsZajWbnH2QyyJ07DmYzUCQ3n/7GwFNJNZBUk6qIWzcaZAdUSr9dPI1hW27emYrKdH2jtFAVGQdUBc5rdW9daDtikg7EtMWFqWXfBss2ucLWFozqjDlpI+y9lsQkEc0TZulAE7vkh2d+yJXIuRK52j2d6suYMlWMV8bjBJOBIqs+w8YrwXgJaxWKMHaxqe3EY/r2SvDoM2JuRM4JMF6JndyKZKEIYyvrEe3VnBOBwqmXSNg5ETbGIfWq6BPL3924qfZWYxq/TlqoiowDqgKndPjym5d+Z5b2m6WDQa0tKQxiOQ08pAhpr8OEEdkZCRNeWiRJBIKJz5DPQiUhGzJLB42i7m2X1+XdZHIlcqFavwiXMWWqEFXE4xiTgSKrPsVEFUBUzFqFIgwmm3ipmLWKGgFFbQxsZ9ZWAFEFqGUiWVQJFYD9aTYDRXKOAVEFYREa2SeLgaiCUAU7bt1opFgVrX3D727cdIfdmcbvEg5URYYBVYEjd3m+deJbSlG7WToYzRZUuxyc66YLI4IzEjFHtHcRZUaSBK0mYcGEbAg/iwke+5vH/rmN28uVyOUWxyJcxpSpQnBusWnbn81Ake1fxNiHvR1FGFtYbXMpNpWqaHjQvn4D+miYn97vEk7mqQJBEARB5r1xqQNVQbH+1vsFLXuN4t6otggeGRVZGAFnRNVGPEaiG2KEdmhipFM0T5jEfbX3j75S/gox9skzswjXMGWqGCtdbFo/zmagyLbDMfZhb0MRxt9ZrXMpNmWqwG/MMiRXp/2LhANVkfYKJxeoCor7qqEfnHnRJOkhVBFmi2jCSCDUCCFYCXQi6SHsKKEzJ8I9YZYOGsYeU+s+ibSLNKo+ZargFy82rfvIVZ7+zmqd46sxSI0q8BXFRQZL2r9FFJmnimccqAo62TWrvmSfMIn7ArZIQBjRzBEr8ohClBKCDxQxkqBJwiwdNEn6R3vr8TtpcyVyhdW1OBcwZargFWYIyVYF5vR/cvDQJwcPpWXyRAygKjIMqAo6LF7DH6pWGMe7g1QRyRYxhEHN9I7R+kcjdAWnBCUR7AmzdHBS0LmpZu3uOx/j6z4t2gVMmSpGT2UISVWFyGDBVxRP1+SJGEBVZBhQFSH8oPSlR31fmiT9obaYpzAiyCPagNdYJCwJs3TQJBnAhpu/e/Jf8IS2zGRbtKuXMlWMHMsQkqeKIbl685at56pr0v6diQhURYYBVRHC0e6z79a9NSnkmKUDEWwRRRgBZySqjUT1ENUQkSRhlg6apQOTAk7hnV2vV7+5OIt50Em+KjD81kbDRzIETs7N9o4ugUQwYV5IKMDhi9ZvQBsetKf9CxMNqIoMA6oiBLnL83zB8wJuo0nSb5YOzFUYC9VGXD3ElIRZOmCS9OtH275X9EJ9XyNXIhfrTYt59VKgCtfUk+5/AE5OZjDD2XGvu79PohQZrJhran7X5B6nd/0GtLVvOO3flhhAVWQYUBXhsHgNv69aYRB0kKqIYot4wohgjugkWFTUmpBVNQg6P7uxdf2Vv5EztOfZHM2P5KtC5Z6WmJ0jKv1jrvBed//N9o7rD9qXKDfbO+519z/mCkdUeonZqZrX7PmrTS3rN6B9YnnavyexgarIMKAqIvKD0pfauyuN470myUB8YSTsjPkT49Bk9UySAeN4r3IokKUQaiYW+bolXxVqz4zC7hVN2kZU+j6Jsksg6eCJlihdAkmfRDmi0osmbQq7Vz33qS7nqms2b9m6+CuKz4MQVWSdASJz+ts7yLyBqogIGVg8Nkn6TZKBRIWRXG3EPRBNEibJgEnSb+A/CoQUUsUiLPoUQvJVofHOqtzTCrtXYnaKDFbBhJmvMy5RBBNmkcEqMTsVdq/KPT2nJBLm9H9xqoC5Z9/TNig2GiGqWFkDGiXpb+8g82NAD75fBlURmR+UvsTurTKKuk2S/kjCSMAZczVHggXS6kBJwiTpN4q6lUP3qJBikbMUOMlXhdb3ROOdVXtmVO5pzOnHnH6lw7dEweuvck+rPTNz8oTU4tyz/8DBo8efwkGx0QhRxaZGUNib/iYPMj+ujIHfXIKqiMwdedfLZ3+k57ebxH2kLSIKI2FnLJSBaJIwSfpN4j49t42aS5GWkEKbIlU84/A0hrydzMKy8rTXZE6EqOIoB7zfmP4mDzI/9rWBt65BVURle/OuT25tNYx10FSx+M6IaQgSw9jjh4/LXzz973g2W2q0puWKQVUkmT6xfPOWrVX1N9Jek7kSogrYB7V06VKDlyvA4U6oiqjIXZ6s0y8M9F0xjvdEskU0YSxcGxEKjCYJvOtJP9pKDZDlK1SLOZeCDlRFMnk0zH9346anefJEDMJVUccHv64GXer0t32QxOEaQHYtyGkGRzlQFbG4Jm7/RflPJngh3VCRnRFdG/OEKjbWocV9em4bfYCs0uZO1+VCNL4nkKTQ8KD93Y2bHvYNp70m8yNcFT0acIkLflUFKoahMJYAA3pQPQp+cRHkkp4IUcX5uuvXHrQ/5ol4OqPC4Uv7Ry7tvH3tr8XNH0/wHxnFfUZxn1HSTyeGNgikCRPyxvDoIQRxn1Hcp+exe7tr/q3gX/tEwlGJXKg1pPFapUQVau+syjODuaeVTr/S6Vc4fEsUvP6Ye1rlmVF7Z2Oc8sX6Gx9s2dorlqf90z9vIqqiWwNa5WBdA3i5AiwvgjzVfL8MvPol+LgdHONAVSSEzOX5fukPOrurDYJOwhaRnBFFG9EVkkjEEK4H0hA4E2MdiqF7Pyv9v5e6r49K5Dw5pnJPp/FaJV8Vau/szOAXaZ9lnSymBg6LzU653Yu5p6PZorCsPG8nk6dJp/MXzvIoquhWgy4SjhpwVKCTpEMFOjDwGAOPMfAIA48wwFYStCtBuxK0KUAryUMFeCgHD0juy8F9GWghaZaBZim4R3JXCu5KQBNJowQ0isEdktticHsc3BoHt8bBzXFwcxw0iAhuiMANEbguBNdI6oWgXgCuktQJQN0YuEJyeQxc5oNakho+qOGBL0ku8cAlLqgmqeKCqlFwcRRcHAWVo6ByFFwYIWCNgIoRUDEMzpOUD4PyIXCOpGwIlA2CsySlA6B0AJTg9IMz/eBMPyjuIzjdB073giKSwl5Q2AMKSPJ7QH43ONUNTnWDk93gZDc40QVOdIHjXeB4FzjWBVUxB9hawY/P/kg0cHtS1B1kiyjOSMwcCbshzBA4BmGXbrR1U81bu+58PCqRj0rkMosjvRcq+apQeWYAJwdMcDIETg4+BU9u96o8MyEnq3T6Pz96fM/+AxKLM+0f+gUCVQFV8WzC4l7/XeVv9Ny2yfGeCLaI6YwFEeVYk6Ju3Whb6d1Pflf5e9wTIt1k2q9S8lWBuacBJwfoH2cInJxHXOGISi82O7HgAFBicTL37DtyqkDp9Kf9H7lwoCqgKp5Zdj745B/X3tNz2yfHe6PaYoHySKzYSVG3jtv2uPPii0X/H56iGMO0sXu/F4fkq0LpmgKcHKBrzxA4Ofe6+3slSqHBqnRNUafJ0xi25eadqahM+78wWUBVQFU8y7x97S+FTXv0PNwWOIk5Izn0GsW9k+M9Om5bb3fNf5b++N7IYzJFMZXqc0+EFKgCX4Rc8yBD4OQ0tHdwBJKxCTMVPfSK5es3oHVNLWn//yWRaKpolYPdreC1OpjZfqr5YTn4VRX4Yz048AiqYp78+uKKmofH9Nz2yfEe43ivcTGc0fv/t3dnwW3UdwDH/dQ+tS+dPtAy6RCYAQammbSE6cWQgbYhQKHTDnRgIGFSrpAaSggDpIRCgBISbCd2fB/yJd+W7Tg+o8O6LFuOdVjH2jrXcrSWLWPZkqXYsp1fHyT5DDGWd1lp+c18HjQaz1rWf/X/zl9/WTs50hf5XROEitKLiYHm32T/qra/VWex660O50yQ9aclgv5UOCKXNnJ1cIQidcOr60q/5sVDh9sVfawPHr123SwVp6XwQCG8L4JqI35eNqEpXSAwwykJ7C2AF5owFfGwBYIHyg5Wdq+vxbpm7DAe6w+y5vgTZqVbL3IMtu/NvD/SiUTYyl6LsVSMXuaI9akQdItfPHRYbiBYHznabU5Fmgr+Xg96D/vzIPr2iCk4cmm1FpiKbbEFgvtLHinuOO3WiyYI5bpabLaxH9/slsfxmORunZAYaH449zc5PSUJ2IkxBlNBtnDEmlTkl/NfPfrGVbuL9WFjwoZUXBqB/WXYiaRETMFjlfDvLkxFPEwzXx8oO/ix4JhbJ/SYFRPDfRFbZGObVg47bpS6dcK+3sq9WfcXyasSsxNjDKbCKeAIRWp9t1isMXx2Lu3Nt4+bPV+zPmYM2ZCKNzvhUxn7sx6KT6EGDvAxFfE70nT0qeJHHYPt44aeCUI1Mbyib7Mte7Be7FCEkhoSu3XCVnHWvefvbrranbCdGGMwFfZ6jlCk8ls7jr/3wXunPjKNc7YTY5tS8XQtVBvZn/JQfCQk/LoQU7EjWf2le7Pul8p5br3IY1asqQUNIosJt074Qf0rD+bskxu1Ootdb3PapwOs/+E3xVgqbNXc4Os+9vJrr3/02f84/+rakIp7s/Hdp+S2a9NV8DAV29XhGNidsftY9fOOwXbK0DNhVu48Eh6TnNKL3TqhVM7bm3nfP+tei/z/xJBjlPQn7qAwlgprJTdczjry3y++/D68unbhtbW5BVNBC1do6XjbydvP3Vbc8YlbJ6SGJB6zYoJQrX9XaiuEaoLoHTfK3HqRWyd0DLYfq37+3vN3R77fKfp/dpu+DCKhMJYKSxlHbPqwLFdhKjgGU0Gjfrf90eI/3pn2i4xL7zoG2ym9eNzQ4zHJJ4jeNVRrRO/0mBXjRhk1JIm83aTtqztec/inZ37yVtOJyGJCb3Mm5ubEBoylYriEVheLnjyccue7klvdZgamAiUnTAW9XKGldkL1dNnfbj932/Gaw93S/MjsTw1JqCHJuFG6VuROt04U+ZnI3vUzvIM/P/ez1xtSIzsTkS93SvDFxArGUkEU0iqz6MnDKXeekNzqNjMwFSg5YSqYQAbm5Vbj0cY377lwz48//9FTRY+eaXqrQZgmlfNWqhAhlfMahGkfNx49UPDQDz/9wZ6sPac7z0ZWEpFIJPLOxGaMpcKUxxGYCpScMBXMcQUXrV6fcthw5sqFZ/nP7cvZtzv9jpSPU9banX7Hvpx9L1S/lCHOWynEkJ20TEyze+WJ+KS4Qsv0ss9cB0UqGLM5QpFa1yXu0RP6a5P2meu0P12JA1PBMZtTkV/d8D05mb8zZGDB6p0xj3n0VmckBjfjMI5SlkmfczaJn3PGUmHI5AhMBUpOmIrvnmMm5PAF12L9IdGFsVQMZXAEpgIlJ0wFohFjqdB9xRGYCpScMBWIRoylQnuGIzAVKDlhKhCN6E+FY3YeFKmg+ZwjFKkCkUxutBioKcfsPOsDxhxMBcdgKhCNGEiFf2G59x1QpHLDouLtNqVaNeI0eaYd/gXWB4w5mAqOwVQgGtGfCmcgPOz1a0hKojO3KdUCkayuS5ykBCJZm1It0Zk1JDXs9TsDYdYHjDncS0VKSkpKSkrcdyY7TAWiEf2pIOcWbb6Q2ePTkJRqxCk3Wnr0RJKSGy2qEaeGpMwen80XIucWWR8w5mAqWH/A9MJUIBrRn4rR4JIzELb5QsNev8kzbaCm9Ncmk5SBmjJ5poe9fpsv5AyER4NLrA8Yc7iXiu85TAWiEf2pcIWWR4NL5NyiMxB2zM47ZuftM9eTVOTxOwNhcm6R251wYSo4B1OBaMRIKlAywlRwDKYC0QhTgaIwFRyDqUA0wlSgKEwFx2AqEI0wFSgKU8ExmApEI0wFisJUcAymAtEIU4Gi7soChQtTwR2YCkSjlNHQMkKjoeXf824IiNVU3JUFxBT78x2K29pUnJbBHReW86sbarvEEj2huzZpm7nO+imHkgimAkX9peYGT7uaiserQGBmf75D8VG6YE/eairevQJ7LgYxFShumAoUdUq6fKJ7NRXvdMEpCftTHopPthoer1pNxaFmeCzHialAccNUoKgm69ITVTdWUiFywMOloHSxP+uh7dJ74HclcFK0mopHShdeze3BVKC4YSpQFBlc2l9+o8YYTYVqDIo18Gc+DFDsz33o29N74Nl6eLkVvlBEU/GhBO7Lmj9bUI6pQHHDVKBVFablZ+pXU6Eag5yrsL8MCjW4vEgCAxSU6WB/ObwS60QkFU/yF5/LUqUV8DAVKG6YCrTOS6030lWrqegdg3YrPCeABwph13mU0O7LhT9VwPsiOKNYTcW/OuAPOd4vckoulFQU1Tc3imQyo2WImrLPzrN+sqEkgqlA61gDy/vLbtQYVlPR6wJljMIFilGQx8hGQUaClAQpCT0k9JAgcUaJnSB2gsgBwpgrDrhih+6YLjt02aAzpsMGHVZoj2mzQpsFLse0WqB1BC7FtIxAyzA0D0PzMDQNQ9MwCIioRgIaCWgwQ31MnRnqTFAbU2OCGiNUx1QZocoA/JhKA1QOQUVM+RCU66EsplQPpTrg6YCngxIdlOigWBtVpIVCLRRqoCAmXwP5g5AXkzsIuVchJyZ7ALIH4GKEGrLUkKWGzP6oC/1woQ/Ox2T0QYYK0lWQroI0FaSp4KveqHO9cLYXzirhy5gzytVUnBTBvtzAJ7n89MLSXH5dxaXOVkW/asRp9Ezb/Qusn2woiWAq0EZK98IT/KViDaYiuVNxoht+m+s/lV2TXlh6sby6rLlNIJaLNMZBkiK8fkcgzPqZhpIIpgJtZPcv9Lt8BysWjrQstdswFcmXik+k8Nfq8APZMyez+OfyijNL+cUNLY0imXDQ0G9zmTw+qy/knFtk/UxDSQRTgTZyBMKE1z9IUh+2Uw8WhF9oXDrfh6lIjlS80Q4H+Yu/zJ7/R47my/yyr/JLMnmVBbWC6nZhp1qrspCG8a+tvpAjECaDS6yfaSiJYCrQRs65RasvZPL41Paxtqsj/2m2P8GbZn3PFn0bD2VPHLqo+KygNpNXmV1Rk8uvK25oqWq7ckneJzdZddcmLdNB59widgJtF6YCbUQGlxyBcKQWgyQlN1k71dpmaW+DUFrTIaps7eIJWvOq6jNL+RlFZWkFPJQ4MorKMkv5eVX1PEFrZWtXTYeoUSS7rFRLdGbcokA7galAN0EGl5xzi/bZecLrH6Km1PYxJWGXGkbEWlOnWtsiU9V0iEqbLhfWNeVXN6DEUVjXVNp0uaZD1CJTdaq1Yq1JZrSoRpyDJIVbFGgnMBXoG60sLwiv3+iZHqKmNC5Pv80lM1pW1hm1XWKUOBqE0mZpb6daKzNa+m0ujcszRE0ZPdOE149bFGgnMBXoViLLC0cgbJ+dt8/OW6aD5slZvdu7ss6Q6AmUOKSGESVhV9vH9G6veXLWMh2MDJwjEMYtCrQTmAq0DZvXGbprkyhx4BoCMQRTgbZnwzrDNnMdJQ5cQyCGYCoQQghtAVOBEEJoC5gKhBBCW8BUIIQQ2kIKGVpGCCGEbgFTgRBCaAuYCoQQQlvAVCCEENrC/wFG0lLWbVSbjAAAAABJRU5ErkJggg==" alt="" />

当然这个问题也比较好解决,也是比较常见的问题,用字符串拷贝或内存拷贝就行了,给flow每个元素重新申请一块内存。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h> #define MAX_LEN 65535 int main(void)
{
DIR *dir;
struct dirent *ptr;
char *flow[MAX_LEN];
int num = , i = ; if ((dir=opendir("./data")) == NULL)
{
perror("Open dir error...");
exit();
}
// readdir() return next enter point of directory dir
while ((ptr=readdir(dir)) != NULL)
{
flow[num] = (char*)malloc(sizeof(char));
strcpy(flow[num], ptr->d_name);
num++;
} for(i = ; i < num; i++)
{
printf("%s\n", flow[i]);
} closedir(dir);
}

最终结果就正确了。

aaarticlea/png;base64,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" alt="" />

二、Windows下遍历目录的方法

在Windows下就比较麻烦了,所要用到的函数都在windows.h中,Windows编程本来就比较繁琐,下面就不一一介绍所用到的函数了,直接给出封装的过程。

1. 首先模拟Linux下自带的头文件dirent.h

不同的是DIR中去掉了一些不需要的属性,及只定义了三个我所需要的操作(按需定义)。

// dirent.h
#ifndef _SYS_DIRENT_H
#define _SYS_DIRENT_H typedef struct _dirdesc {
int dd_fd; /** file descriptor associated with directory */
long dd_loc; /** offset in current buffer */
long dd_size; /** amount of data returned by getdirentries */
char *dd_buf; /** data buffer */
int dd_len; /** size of data buffer */
long dd_seek; /** magic cookie returned by getdirentries */
} DIR; # define __dirfd(dp) ((dp)->dd_fd) DIR *opendir (const char *);
struct dirent *readdir (DIR *);
void rewinddir (DIR *);
int closedir (DIR *); #include <sys/types.h> struct dirent
{
long d_ino; /* inode number*/
off_t d_off; /* offset to this dirent*/
unsigned short d_reclen; /* length of this d_name*/
unsigned char d_type; /* the type of d_name*/
char d_name[]; /* file name (null-terminated)*/
}; #endif

2. 三个目录操作函数的实现

当然这是最关键的部分,我不知道Linux下是怎么实现的(找了下没找到),Windows下实现如下,主要是FindFirstFile()和FindNextFile()这两个Windows函数,对Windows编程不精,也不好解释什么,需要搞明白为啥这样实现请上网搜或MSDN。

// dirent.c
#include <stdio.h>
#include <windows.h>
#include "dirent.h" static HANDLE hFind; DIR *opendir(const char *name)
{
DIR *dir;
WIN32_FIND_DATA FindData;
char namebuf[]; sprintf(namebuf, "%s\\*.*",name); hFind = FindFirstFile(namebuf, &FindData );
if(hFind == INVALID_HANDLE_VALUE)
{
printf("FindFirstFile failed (%d)\n", GetLastError());
return ;
} dir = (DIR *)malloc(sizeof(DIR));
if(!dir)
{
printf("DIR memory allocate fail\n");
return ;
} memset(dir, , sizeof(DIR));
dir->dd_fd = ; // simulate return return dir;
} struct dirent *readdir(DIR *d)
{
int i;
static struct dirent dirent;
BOOL bf;
WIN32_FIND_DATA FileData;
if(!d)
{
return ;
} bf = FindNextFile(hFind,&FileData);
//fail or end
if(!bf)
{
return ;
} for(i = ; i < ; i++)
{
dirent.d_name[i] = FileData.cFileName[i];
if(FileData.cFileName[i] == '\0') break;
}
dirent.d_reclen = i;
dirent.d_reclen = FileData.nFileSizeLow; //check there is file or directory
if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
dirent.d_type = ;
}
else
{
dirent.d_type = ;
} return (&dirent);
} int closedir(DIR *d)
{
if(!d) return -;
hFind=;
free(d);
return ;
}

3. 使用方法

与Linux下使用一模一样,不需要改动一句代码就可应用,但却发现了与Linux下自带实现同样的问题,即也是引用拷贝,如下。

aaarticlea/png;base64,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" alt="" />

因为这是我们自己实现的代码,所以字符串拷贝不是最佳解决方案,修改原实现代码才是最好的方法,当然如果是为了可移植性,就不需要改动了,就用字符串拷贝这样代码到Linux下就不需要改动了。下面看如何修改原实现解决:

a. 首先定位问题,可以很明显的知道是readdir这个函数的问题;

b. 然后找出问题根源,通过前面的分析可知问题的根源在于每次ptr->d_name使用的是同一内存地址,即ptr地址不变,而ptr是readdir返回的struct dirent指针,所以问题的根源在于readdir返回的dirent结构体地址问题,从上面代码中可以看到static struct dirent dirent; 这句代码,其中dirent的地址就是返回的地址,注意到dirent被定义为static,大家都知道C中static声明的变量调用一次后地址就不变了,存在静态存储区,也就是每次readdir返回的地址都是不变的,但指向的内容每次都被覆写,这就是问题所在;

c. 最后解决问题,知道问题根源后,问题就比较容易解决了,就是每次给dirent重新申请内存,看如下我的做法,注意我这里不能简单的struct dirent *dirent = (struct dirent *)malloc(sizeof(struct dirent))就结束了,看前面dirent结构体定义中char d_name[1];这里我只给d_name一个内存空间,显然不够,所以也要给它申请内存,我这里是按需申请内存,如果定义为char d_name[256];这样的就不需要了(一般文件名不是太长吧)。

struct dirent *readdir(DIR *d)
{
int i; BOOL bf;
WIN32_FIND_DATA FileData;
if(!d)
{
return ;
} bf=FindNextFile(hFind,&FileData);
//fail or end
if(!bf)
{
return ;
} struct dirent *dirent = (struct dirent *)malloc(sizeof(struct dirent)+sizeof(FileData.cFileName)); for(i = ; i < ; i++)
{
dirent->d_name[i] = FileData.cFileName[i];
if(FileData.cFileName[i] == '\0') break;
}
dirent->d_reclen = i;
dirent->d_reclen = FileData.nFileSizeLow; //check there is file or directory
if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
dirent->d_type = ;
}
else
{
dirent->d_type = ;
} return dirent;
}

最终Windows运行结果如下:

aaarticlea/png;base64,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" alt="" />

PS:不知道这里大家有没有注意一个很小的细节,就是输出的不同(用的是一个相同的目录结构),Linux下输出了当前目录.和上层目录..而Windows下只输出了上层目录..,当然这没关系,因为我要的只是下面的文件名即可。OK,终于完成了,中间找bug花了不少时间,嘿嘿~~~

参考资料:

http://blog.csdn.net/lindabell/article/details/8181866