From cbbda43098c4f2122fbff5b3e6c9ff1ce041e26d Mon Sep 17 00:00:00 2001 From: SunnyGor Date: Wed, 11 Jan 2023 21:45:46 +0800 Subject: [PATCH] idk what i have done --- output/bw2x3(output).bmp | Bin 78 -> 66 bytes tempCodeRunnerFile.c | 2 + test/hello.bmp | Bin 0 -> 172938 bytes test/image.cpp | 619 +++++++++++++++++++++++++++++++++++++++ test/image.h | 60 ++++ test/main.cpp | 75 +++++ test/struct.h | 35 +++ transfer.c | 4 +- transfer.exe | Bin 0 -> 45090 bytes try.c | 34 ++- try.exe | Bin 0 -> 47854 bytes 11 files changed, 811 insertions(+), 18 deletions(-) create mode 100644 tempCodeRunnerFile.c create mode 100644 test/hello.bmp create mode 100644 test/image.cpp create mode 100644 test/image.h create mode 100644 test/main.cpp create mode 100644 test/struct.h create mode 100644 transfer.exe create mode 100644 try.exe diff --git a/output/bw2x3(output).bmp b/output/bw2x3(output).bmp index b56ab8a45def40534e6c7b21653632dccf5eb833..1bd6edb1a84a505910a8b2391b55e061312ed022 100644 GIT binary patch literal 66 ncmZ?rwP%0;Ga#h_#Ed}945lT3Bm)B{m_#MQf!zQ9|APeqXAT6X literal 78 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 AX#fBK literal 0 HcmV?d00001 diff --git a/test/image.cpp b/test/image.cpp new file mode 100644 index 0000000..2a90733 --- /dev/null +++ b/test/image.cpp @@ -0,0 +1,619 @@ +#include "image.h" +#include +#include +#include +#include +using namespace std; +//普通构造函数 +Image::Image(int h, int w) :height(h), width(w) +{ + this->height = h; + this->width = w; + // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, + data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); + //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 + //申请行指针 + for (int i = 0; i < this->height; i++) + { + //注意3通道,每个像素3个字节 + data[i] = (unsigned char *)malloc(this->width * 3); + // 读取像素数据 + for (int j = 0; j < this->width; j++) + { + data[i][j] = 0; + } + } +} +Image::Image(int h, int w, unsigned char val)//创建的图像像素值都为val; +{ + this->height = h; + this->width = w; + // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, + data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); + //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 + //申请行指针 + for (int i = 0; i < this->height; i++) + { + //注意3通道,每个像素3个字节 + data[i] = (unsigned char *)malloc(this->width * 3); + // 读取像素数据 + for (int j = 0; j < this->width; j++) + { + data[i][j] = val; + } + } +} +Image::Image(const char* ImageName)//利用文件名从硬盘加载图像文件成为Image对象; +{ + this->ReadBMP(ImageName); +} +Image::Image(unsigned char *m, int rows, int cols)//从一维静态数组创建Image对象,图像的行数和列数由后面两个参数给出; +{ + this->height = rows; + this->width = cols; + // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, + data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); + //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 + //申请行指针 + for (int i = 0; i < this->height; i++) + { + //注意3通道,每个像素3个字节 + data[i] = (unsigned char *)malloc(this->width * 3); + // 读取像素数据 + for (int j = 0; j < this->width; j++) + { + data[i][j] = *m; + m++; + } + } +} +Image::Image(unsigned char m[][100], int rows)//从静态二维数组创建Image对象,图像的行数(二维数组的第一个维度)由第二个参数rows给出; +{ + this->height = rows; + this->width = 100; + // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, + data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); + //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 + //申请行指针 + for (int i = 0; i < this->height; i++) + { + //注意3通道,每个像素3个字节 + data[i] = (unsigned char *)malloc(this->width * 3); + // 读取像素数据 + for (int j = 0; j < this->width; j++) + { + data[i][j] = m[i][j]; + } + } +} +Image::Image(unsigned char **m, int h, int w)//从动态数组(二级指针)创建Image对象,图像的行数和列数由后面两个参数给出; +{ + this->height = h; + this->width = w; + // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, + data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); + //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 + //申请行指针 + for (int i = 0; i < this->height; i++) + { + //注意3通道,每个像素3个字节 + data[i] = (unsigned char *)malloc(this->width * 3); + // 读取像素数据 + for (int j = 0; j < this->width; j++) + { + data[i][j] = m[i][j]; + } + } +} +//拷贝构造函数 +Image::Image(Image &im) +{ + if (this->data) + { + delete[] this->data; + this->data = NULL; + } + + *this = im; +} + + +//释放堆区数据 +void Image::myFree(unsigned char** data, int h) +{ + for (int i = 0; i < h; i++) + { + free(data[i]); + data[i] = NULL; + } + free(data); + data = NULL; + puts("释放堆区数据"); +} +//析构函数 +Image::~Image() +{ + this->myFree(this->data, this->height); +} + + +//从硬盘读入图像文件,存储到image类中 +void Image::ReadBMP(const char* filename) +{ + FILE* fp = NULL; // C标准库的文件指针 + fp = fopen(filename, "rb"); // 二进制读取方式打开文件 + + // 读取文件头 + fread(&bmpfileheader, sizeof(bmpfileheader), 1, fp); + // 读取信息头 + fread(&bitmapinfoheader, sizeof(bitmapinfoheader), 1, fp); + + // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, + data = (unsigned char **)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); + //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 + //申请行指针 + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + //注意3通道,每个像素3个字节 + data[i] = (unsigned char *)malloc(bitmapinfoheader.biWidth * 3); + // 读取像素数据 + for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) + { + fread(&data[i][j], 1, 1, fp); + } + } + this->height = this->bitmapinfoheader.biHeight; + this->width = this->bitmapinfoheader.biWidth; + printf("height = %d width = %d\n",this->height,this->width); + + // 关闭读取的文件 + fclose(fp); +} + + +//保存bmp图像 +void Image::WriteBMP(const char *filename) +{ + FILE* fp = NULL; // 保存文件的文件指针 + fp = fopen(filename, "wb"); // 二进制写入方式打开文件 + // 写入文件头 + fwrite(&bmpfileheader, sizeof(bmpfileheader), 1, fp); + // 写入信息头 + fwrite(&bitmapinfoheader, sizeof(bitmapinfoheader), 1, fp); + // 写入数据 + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + fwrite(data[i], bitmapinfoheader.biWidth * 3, 1, fp); + } + // 关闭写入的文件 + fclose(fp); +} +//保存bmp图像 +void Image::WriteBMP(const char *filename, unsigned char** data) +{ + FILE* fp = NULL; // 保存文件的文件指针 + fp = fopen(filename, "wb"); // 二进制写入方式打开文件 + // 写入文件头 + fwrite(&bmpfileheader, sizeof(bmpfileheader), 1, fp); + // 写入信息头 + fwrite(&bitmapinfoheader, sizeof(bitmapinfoheader), 1, fp); + // 写入数据 + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + fwrite(data[i], bitmapinfoheader.biWidth * 3, 1, fp); + } + // 关闭写入的文件 + fclose(fp); +} +//保存bmp图像 +void Image::WriteBMP(const char *filename, unsigned char** t_data, + BMPFILEHEADER bmpfileheader, BITMAPINFOHEADER t_bitmapinfoheader) +{ + FILE* fp = NULL; // 保存文件的文件指针 + fp = fopen(filename, "wb"); // 二进制写入方式打开文件 + // 写入文件头 + fwrite(&bmpfileheader, sizeof(bmpfileheader), 1, fp); + // 写入信息头 + fwrite(&t_bitmapinfoheader, sizeof(t_bitmapinfoheader), 1, fp); + // 写入数据 + for (int i = 0; i < t_bitmapinfoheader.biHeight; i++) + { + fwrite(t_data[i], t_bitmapinfoheader.biWidth * 3, 1, fp); + } + // 关闭写入的文件 + fclose(fp); +} + + +//从文本文件读取 +void Image::ReadText(const char* filename) +{ + FILE* fp = NULL; // C标准库的文件指针 + fp = fopen(filename, "rb"); // 二进制读取方式打开文件 + + fread(&bitmapinfoheader.biHeight, sizeof(bitmapinfoheader.biHeight), 1, fp); + fread(&bitmapinfoheader.biWidth, sizeof(bitmapinfoheader.biWidth), 1, fp); + + // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, + data = (unsigned char **)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); + //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 + //申请行指针 + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + //注意3通道,每个像素3个字节 + data[i] = (unsigned char *)malloc(bitmapinfoheader.biWidth * 3); + // 读取像素数据 + for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) + { + fread(&data[i][j], 1, 1, fp); + } + } + + // 关闭读取的文件 + fclose(fp); +} +//保存成文本文件 +void Image::WriteText(const char *filename) +{ + FILE* fp = NULL; // 保存文件的文件指针 + fp = fopen(filename, "wb"); // 二进制写入方式打开文件 + // 写入信息头 + fwrite(&bitmapinfoheader.biHeight, sizeof(bitmapinfoheader.biHeight), 1, fp); + fwrite(&bitmapinfoheader.biWidth, sizeof(bitmapinfoheader.biWidth), 1, fp); + // 写入数据 + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + fwrite(data[i], bitmapinfoheader.biWidth * 3, 1, fp); + } + // 关闭写入的文件 + fclose(fp); +} + + +//获取图像中指定点的值 +unsigned char& Image::At(int row, int col) +{ + return this->data[row * 3][col * 3]; +} +//设置像素(row,col)为某值 +void Image::Set(int row, int col, unsigned char value) +{ + //重新读取数据 + unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3); + for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) + { + t_data[i][j] = data[i][j]; + } + } + //修改像数值 + for (int i = 0; i < 3; i++) + { + t_data[row * 3 + i][col * 3 + i] = value; + } + //保存图像 + this->WriteBMP("setImg.bmp", t_data); + myFree(t_data, bitmapinfoheader.biHeight); +} +//设置图像所有像素为同一值 +void Image::Set(unsigned char value) +{ + //重新读取数据 + unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3); + for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) + { + t_data[i][j] = data[i][j]; + } + } + //修改像数值 + for (int i = 0; i < this->bitmapinfoheader.biHeight; i++) + { + for (int j = 0; j < this->bitmapinfoheader.biWidth * 3; j++) + { + t_data[i][j] = value; + } + } + //保存图像 + this->WriteBMP("setAllImg.bmp", t_data); + myFree(t_data, bitmapinfoheader.biHeight); +} + + +//false 左右,true 上下 +void Image::Flip(int code) +{ + //重新读取数据 + unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3); + for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) + { + t_data[i][j] = data[i][j]; + } + } + + if (code) + { + //上下翻转图片 + for (int i = 0; i < bitmapinfoheader.biHeight / 2; i++) + { + unsigned char* temp = t_data[i]; + t_data[i] = t_data[bitmapinfoheader.biHeight - 1 - i]; + t_data[bitmapinfoheader.biHeight - 1 - i] = temp; + } + this->WriteBMP("flipImageUpDown.bmp",t_data); + } + else + { + //左右翻转图片 + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + for (int j = 0; j < bitmapinfoheader.biWidth * 3 / 2; j += 3) + { + unsigned char temp = t_data[i][j]; + t_data[i][j] = t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j - 2]; + t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j - 2] = temp; + + unsigned char temp1 = t_data[i][j+1]; + t_data[i][j + 1] = t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j - 1]; + t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j - 1] = temp1; + + unsigned char temp2 = t_data[i][j + 2]; + t_data[i][j+2] = t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j]; + t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j] = temp2; + } + } + this->WriteBMP("flipImageLeftRight.bmp",t_data); + } + + this->myFree(t_data, this->bitmapinfoheader.biHeight); +} + + +//图像缩小,放大 +//false缩小,true放大 +void Image::Resize(int code) +{ + if (code)//放大 + { + /* * + *难点主要在于对索引的控制, + *因为这里需要两个索引控制四个变量,需要找到它们对应的关系式 + */ + unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight * 2); + for (int i = 0; i < bitmapinfoheader.biHeight ; i++) + { + t_data[2 * i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3 * 2); + for (int j = 0; j < bitmapinfoheader.biWidth; j++) + { + t_data[2 * i][6 * j] = data[i][3 * j]; + t_data[2 * i][6 * j + 1] = data[i][3 * j + 1]; + t_data[2 * i][6 * j + 2] = data[i][3 * j + 2]; + + t_data[2 * i][6 * j + 3] = data[i][3 * j]; + t_data[2 * i][6 * j + 3 + 1] = data[i][3 * j + 1]; + t_data[2 * i][6 * j + 3 + 2] = data[i][3 * j + 2]; + } + + t_data[2 * i + 1] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3 * 2); + for (int j = 0; j < bitmapinfoheader .biWidth * 6; j++) + { + t_data[2 * i + 1][j] = t_data[2 * i][j]; + } + } + + BMPFILEHEADER t_bmpfileheader = this->bmpfileheader; + BITMAPINFOHEADER t_bitmapinfoheader = this->bitmapinfoheader; + + t_bitmapinfoheader.biHeight *= 2; + t_bitmapinfoheader.biWidth *= 2; + t_bitmapinfoheader.biSizeImage *= 4; + + this->WriteBMP("magnifyImage.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); + this->myFree(t_data, t_bitmapinfoheader.biHeight);//释放内存 + } + else//缩小 + { + unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight / 2); + for (int i = 0; i < bitmapinfoheader.biHeight / 2; i++) + { + t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3 / 2); + for (int j = 0, index = 0; j < bitmapinfoheader.biWidth / 2; j++) + { + t_data[i][index++] = data[2 * i][6 * j]; + t_data[i][index++] = data[2 * i][6 * j + 1]; + t_data[i][index++] = data[2 * i][6 * j + 2]; + } + } + + BMPFILEHEADER t_bmpfileheader = this->bmpfileheader; + BITMAPINFOHEADER t_bitmapinfoheader = this->bitmapinfoheader; + + t_bitmapinfoheader.biHeight /= 2; + t_bitmapinfoheader.biWidth /= 2; + t_bitmapinfoheader.biSizeImage /= 4; + + this->WriteBMP("shrinkImage.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); + this->myFree(t_data, t_bitmapinfoheader.biHeight);//释放内存 + } +} + + +//图像裁剪的函数 +void Image::Cut(int x1, int y1, int x2, int y2) +{//裁剪点(x1,y1)到点(x2,y2)的图像——(0,120) (512,360) h = y2 - y1 = 240, w = x2 - x1 = 512 + if (x2 > x1 && y2 > y1) + { + int h = y2 - y1 + 1; + int w = x2 - x1 + 1; + while (w % 4) + { + w++; + } + //重新载入数据 + unsigned char **t_data = (unsigned char**)malloc(h * sizeof(unsigned char*)); + //m,n控制t_data的下标,i,j控制data下标 + for (int i = y1,m = 0; i <= y2; i++, m++) + { + t_data[m] = (unsigned char*)malloc(w * 3); + memset(t_data[m],0, w * 3); + for (int j = x1*3, n = 0; j <= x2*3 + 2; j++, n++) + { + t_data[m][n] = data[i][j]; + } + } + //重新载入头文件 + BMPFILEHEADER t_bmpfileheader = this->bmpfileheader; + BITMAPINFOHEADER t_bitmapinfoheader = this->bitmapinfoheader; + t_bitmapinfoheader.biHeight = h; + t_bitmapinfoheader.biWidth = w; + //通过公式重新计算biSize + t_bitmapinfoheader.biSizeImage = (((w*t_bitmapinfoheader.biBitCount) + 31) / 32 * 4)*h; + //保存数据 + WriteBMP("cutImage.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); + //释放数据 + myFree(t_data, h); + } + else + { + puts("输入坐标有误"); + } +} + + +//图像旋转的函数 +void Image::Rotate(int degree)//图像旋转的函数(简单起见,旋转角度为90度的整数倍) +{ + BMPFILEHEADER t_bmpfileheader = this->bmpfileheader; + BITMAPINFOHEADER t_bitmapinfoheader = this->bitmapinfoheader; + if (degree == 90) + { + unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biWidth); + for (int i = 0; i < bitmapinfoheader.biWidth; i++) + { + t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biHeight * 3); + for (int j = 0; j < bitmapinfoheader.biHeight; j++) + { + t_data[i][j * 3] = data[bitmapinfoheader.biHeight - j - 1][3 * i]; + t_data[i][j * 3 + 1] = data[bitmapinfoheader.biHeight - j - 1][3 * i + 1]; + t_data[i][j * 3 + 2] = data[bitmapinfoheader.biHeight - j - 1][3 * i + 2]; + } + } + //重写信息头 + t_bitmapinfoheader.biHeight = this->bitmapinfoheader.biWidth; + t_bitmapinfoheader.biWidth = this->bitmapinfoheader.biHeight; + //保存图片 + this->WriteBMP("rotate90.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); + this->myFree(t_data, t_bitmapinfoheader.biHeight); + } + else if (degree == 180) + { + unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3); + for (int j = 0; j < bitmapinfoheader.biWidth; j++) + { + t_data[i][j * 3] = data[bitmapinfoheader.biHeight - i - 1][bitmapinfoheader.biWidth * 3 - j * 3 - 3]; + t_data[i][j * 3 + 1] = data[bitmapinfoheader.biHeight - i - 1][bitmapinfoheader.biWidth * 3 - j * 3 - 3 + 1]; + t_data[i][j * 3 + 2] = data[bitmapinfoheader.biHeight - i - 1][bitmapinfoheader.biWidth * 3 - j * 3 - 3 + 2]; + } + } + //保存图片 + this->WriteBMP("rotate180.bmp", t_data); + this->myFree(t_data, t_bitmapinfoheader.biHeight); + } + else if (degree == 270) + { + unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biWidth); + for (int i = 0; i < bitmapinfoheader.biWidth; i++) + { + t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biHeight * 3); + for (int j = 0; j < bitmapinfoheader.biHeight; j++) + { + t_data[i][j * 3] = data[j][bitmapinfoheader.biWidth * 3 - 3 -i * 3]; + t_data[i][j * 3 + 1] = data[j][bitmapinfoheader.biWidth * 3 - 3 - i * 3 + 1]; + t_data[i][j * 3 + 2] = data[j][bitmapinfoheader.biWidth * 3 - 3 - i * 3 + 2]; + } + } + //重写信息头 + t_bitmapinfoheader.biHeight = this->bitmapinfoheader.biWidth; + t_bitmapinfoheader.biWidth = this->bitmapinfoheader.biHeight; + //保存图片 + this->WriteBMP("rotate270.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); + this->myFree(t_data, t_bitmapinfoheader.biHeight); + } + else + { + puts("输入的角度不符合要求"); + } +} + + +//求均值方差 +void Image::Mean_Variance(float &m, float &var)//求图像的均值和方差,利用参数输出 +{ + float sum = 0; + float ave = 0; + float vSum = 0; + float vAve = 0; + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) + { + sum += this->data[i][j]; + } + } + ave = sum / (bitmapinfoheader.biHeight*bitmapinfoheader.biWidth * 3); + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) + { + vSum += (data[i][j] - ave)*(data[i][j] - ave); + } + } + vAve = vSum / (bitmapinfoheader.biHeight*bitmapinfoheader.biWidth * 3); + + m = ave; + var = vAve; +} + + +Image& Image::operator=(Image& val)//重载操作符 +{ + this->bitmapinfoheader = val.bitmapinfoheader; + this->bmpfileheader = val.bmpfileheader; + this->height = val.height; + this->width = val.width; + // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, + this->data = (unsigned char **)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); + //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 + //申请行指针 + for (int i = 0; i < bitmapinfoheader.biHeight; i++) + { + //注意3通道,每个像素3个字节 + this->data[i] = (unsigned char *)malloc(bitmapinfoheader.biWidth * 3); + // 读取像素数据 + for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) + { + this->data[i][j] = val.data[i][j]; + } + } + + return *this; +} + + +//实现友元函数,交换两个Image对象的数据 +void Swap(Image &a, Image &b) +{ + Image t(a); + a = b; + b = t; +} diff --git a/test/image.h b/test/image.h new file mode 100644 index 0000000..fbbf861 --- /dev/null +++ b/test/image.h @@ -0,0 +1,60 @@ +#ifndef IMAGE_H +#define IMAGE_H +#include "struct.h" + +class Image +{ +public: + //构造函数及其重载 + Image(){}//创建行列都为零的Image对象 + Image(int h, int w);//创建h行,w列的Image对象 + Image(int h, int w, unsigned char val); //创建的图像像素值都为val; + Image(const char* ImageName); //利用文件名从硬盘加载图像文件成为Image对象; + Image(unsigned char *m, int rows, int cols); //从一维静态数组创建Image对象,图像的行数和列数由后面两个参数给出; + Image(unsigned char m[][100], int rows); //从静态二维数组创建Image对象,图像的行数(二维数组的第一个维度)由第二个参数rows给出; + Image(unsigned char **m, int h, int w); //从动态数组(二级指针)创建Image对象,图像的行数和列数由后面两个参数给出; + Image(Image &im); //拷贝构造函数; + ~Image(); //析构函数; + + + void ReadBMP(const char* filename); //从BMP文件中读入图像数据; + void WriteBMP(const char* filename); //将图像数据保存为BMP图像文件; + void WriteBMP(const char *filename, unsigned char** data);//翻转时写图片 + void WriteBMP(const char *filename, unsigned char** data,//放缩时写图片 + BMPFILEHEADER bmpfileheader, BITMAPINFOHEADER bitmapinfoheader); + + + void ReadText(const char* filename); //从文本文件中读入图像数据; + void WriteText(const char* filename); //将图像数据保存为文本文件; + + + unsigned char& At(int row, int col); //获取第row行第col列的像素点的值; + void Set(int row, int col, unsigned char value); //设置像素(row,col)为某值; + void Set(unsigned char value); //设置图像所有像素为同一值; + + + void Flip(int code); //图像的翻转; 根据code的值:0:左右翻转,1:上下翻转; + void Resize(int code); //图像的缩放;根据code的值:0:缩小一倍,1:放大一倍; + + + void Cut(int x1, int y1, int x2, int y2);//裁剪点(x1,y1)到点(x2,y2)的图像 + + + void Rotate(int degree);//图像旋转的函数(简单起见,旋转角度为90度的整数倍) + + + void Mean_Variance(float &m, float &var);//求图像的均值和方差,利用参数输出 + + friend void Swap(Image &a, Image &b);//使用友元函数交换两个Image对象的数据 + void myFree(unsigned char** data, int h); + Image& operator=(Image& val);//重载操作符 + +private: + unsigned char **data; + int height; + int width; + BMPFILEHEADER bmpfileheader; + BITMAPINFOHEADER bitmapinfoheader; +}; + +#endif diff --git a/test/main.cpp b/test/main.cpp new file mode 100644 index 0000000..7dd6237 --- /dev/null +++ b/test/main.cpp @@ -0,0 +1,75 @@ +#include "image.h" +#include +#include + +int main(int argc, char* argv[]) +{ + Image img; //创建对象 + //读写BMP文件 + img.ReadBMP("hello.bmp"); + img.WriteBMP("FruitsCopy.bmp"); + img.WriteText("FruitsCopy.text"); + + + //读写text文件 + Image readtxtImage; + readtxtImage.ReadText("FruitsCopy.text"); + readtxtImage.WriteText("writeFruits.text"); + + + //图像的上下翻转,并保存结果图像文件 + img.Flip(true); + //图像的左右翻转,如img.Flip(true);并保存结果图像文件 + img.Flip(false); + //左右翻转需要注意,每个像数占3个字节,翻转时不能简单直接翻转, + //而需要每个字节对应地翻转 + + + //图像的缩放,并保存结果图像文件 + img.Resize(false);//图像缩小 + img.Resize(true);//图像放大 + //缩小时也需要注意,每个像数占3个字节,不能简单通过删除字节而缩小, + //而需要每个字节对应地删除 + //放大也是一样的道理 + + + //获取图像的某点的像素值,并修改, 并保存结果图像文件 + int row = 100; + int col = 100; + img.At(row, col); + img.Set(row, col, 10); + img.Set(100); + + + //使用拷贝构造函数创建新的对象 + Image new_img(img); + new_img.WriteBMP("new_img.bmp"); + + + //截取指定区域内的图像,并保存结果图像文件(x1,y1) (x2,y2) + new_img.Cut(120,120,360,360); + //需要保证 x2 > x1 && y2 > y1 + + + //顺时针旋转图像并保存结果图像文件(简单起见,旋转角度为90度的整数倍) + img.Rotate(90); + img.Rotate(180); + img.Rotate(270); + + + //求图像的均值和方差,并在命令行输出 + float ave = 0; + float vAve = 0; + img.Mean_Variance(ave, vAve); + printf("平均值为:%f\n方差为:%f\n", ave, vAve); + + + //交换两个图像的数据 + Image img1("Baboon.bmp"); + Image img2("Lena.bmp"); + Swap(img1, img2); + //保存交换完的结果图像文件 + img1.WriteBMP("S_img1_baboon.bmp"); + img2.WriteBMP("S_img2_lena.bmp"); + return 0; +} diff --git a/test/struct.h b/test/struct.h new file mode 100644 index 0000000..10216cd --- /dev/null +++ b/test/struct.h @@ -0,0 +1,35 @@ +#ifndef STRUCT_H +#define STRUCT_H + +// 针对该结构体的字节对齐问题调整对齐策略 +#pragma pack(push,1) +struct BMPFILEHEADER +{ + unsigned short bfType; + unsigned int bfSize; + unsigned short bfReserved1; + unsigned short bfReserved2; + unsigned int bfOffBits; +}; +#pragma pack(pop) + +struct BITMAPINFOHEADER +{ + unsigned long biSize; //本结构所占用字节数 40字节 + long biWidth; //位图的宽度,以像素为单位 + long biHeight; //位图的高度,以像素为单位 + unsigned short biPlanes; //目标设备的级别,必须为1 + unsigned short biBitCount; //每个像素所需的位数,必须是1(双色)、 + //4(16色)、8(256色)或24(真彩色)之一 + unsigned long biCompression; //位图压缩类型,必须是 0(BI_RGB不压缩)、 + //1(BI_RLE8压缩类型) + //2(BI_RLE压缩类型)之一 + unsigned long biSizeImage; //位图的大小,以字节为单位 + long biXPelsPerMeter; //位图水平分辨率,每米像素数 + long biYPelsPerMeter; //位图垂直分辨率,每米像素数 + unsigned long biClrUsed; //位图实际使用的颜色表中的颜色数 + unsigned long biClrImportant; //位图显示过程中重要的颜色数 +}; + +#endif + diff --git a/transfer.c b/transfer.c index 05141e0..677a1c2 100644 --- a/transfer.c +++ b/transfer.c @@ -185,9 +185,9 @@ int main(int argc, char const *argv[]) { // 建構 Imgraw img = {0, 0, 0, NULL}; // 讀圖 - Imgraw_Read(&img, "./input/bw2x3.bmp"); + Imgraw_Read(&img, "./input/bw2x1.bmp"); // 寫圖 - Imgraw_Writ(&img, "./output/bw2x3(output).bmp", radio_w, radio_h); + Imgraw_Writ(&img, "./output/bw2x1(output).bmp", radio_w, radio_h); return 0; } /*==============================================================*/ \ No newline at end of file diff --git a/transfer.exe b/transfer.exe new file mode 100644 index 0000000000000000000000000000000000000000..b04c17372b2f99933a66b58864226710c1ee8d34 GIT binary patch literal 45090 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 literal 0 HcmV?d00001 diff --git a/try.c b/try.c index 5a820ed..9a3c71e 100644 --- a/try.c +++ b/try.c @@ -36,7 +36,7 @@ float linear_single(float x, float x1, float x2, float f1, float f2){ // 鍙岀嚎鎬ф彃鍊煎嚱鏁 // 鍙傝 https://zh.wikipedia.org/wiki/%E5%8F%8C%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC -char linear_insert(uch** old_pixels, uint32_t row, uint32_t col, uint32_t old_width, uint32_t old_height, float radio_w, float radio_h){ +char** linear_insert(uch** old_pixels, uint32_t row, uint32_t col, uint32_t old_width, uint32_t old_height, float radio_w, float radio_h){ float x = row / radio_h; float y = col / radio_w; // 濡傛灉鏁存暟鏍肩偣灏辩洿鎺ヨ繑鍥 @@ -47,7 +47,9 @@ char linear_insert(uch** old_pixels, uint32_t row, uint32_t col, uint32_t old_wi if (x2 >= old_height){x2 = x1;} if (y2 >= old_width){y2 = y1;} - if (x1 == x2 && y1 == y2){return old_pixels[x1][y1];} + if (x1 == x2 && y1 == y2){ + uint32_t idx = x1*old_width+y1; + return old_pixels[x1][idx + 0], old_pixels[x1][idx + 1], old_pixels[x1][idx + 2];} if (x1 == x2){ int x = x1; uint32_t idx1 = x*old_width+y; @@ -156,7 +158,7 @@ void bmpWrite(const char* name, const uch* raw_img, uint32_t width, uint32_t hei for(unsigned i = 0; i < new_width; ++i) { uint32_t idx = j*new_width +i; if(bits == 24) { // RGB鍦栫墖 - char* r, g, b = linear_insert(&raw_img, j, i, width, height, radio_w, radio_h); + char** r, g, b = linear_insert(&(raw_img), j, i, width, height, radio_w, radio_h); fwrite(b, sizeof(char), sizeof(uch), pFile); fwrite(g, sizeof(char), sizeof(uch), pFile); fwrite(r, sizeof(char), sizeof(uch), pFile); @@ -198,7 +200,7 @@ void bmpRead(const char* name, uch** oldpixels, uint32_t* width, uint32_t* heigh *width = info_h.biWidth; *height = info_h.biHeight; *bits = info_h.biBitCount; - unsigned char **oldpixels=(unsigned char**)malloc((*width)*(*height)*3); + **oldpixels=(unsigned char**)malloc((*width)*(*height)*3); // size_t ImgSize = ((size_t)*width) * ((size_t)*height) * 3; // *raw_img = (uch*)calloc(ImgSize, sizeof(uch)); @@ -243,17 +245,17 @@ void bmpRead(const char* name, uch** oldpixels, uint32_t* width, uint32_t* heigh // fclose(pFile); //---------------------------------------------------------------------------- - // for(int j = *height-1; j >= 0; --j) { - // for(unsigned i = 0; i < *width; ++i) { - // uint32_t idx = j*(*width)+i; - // for(int k = 0; k < 3; k++){ - // printf((char*)&(*raw_img)[idx*3 + k]); - // printf("\t"); - // } - // printf("\t done \t"); - // } - // printf("\n"); - // } + for(int j = *height-1; j >= 0; --j) { + for(unsigned i = 0; i < *width; ++i) { + uint32_t idx = j*(*width)+i; + for(int k = 0; k < 3; k++){ + printf((char*)&(*oldpixels)[idx*3 + k]); + printf("\t"); + } + printf("\t done \t"); + } + printf("\n"); + } } // 鍦栧儚绲愭 @@ -278,7 +280,7 @@ int main(int argc, char const *argv[]) { scanf("%f", &radio_w); printf("Enter a radio of height :") ; scanf("%f", &radio_h); - printf("%f :: %f\n", radio_w, radio_h); + printf("\n"); // 寤烘 Imgraw img = {0, 0, 0, NULL}; // 璁鍦 diff --git a/try.exe b/try.exe new file mode 100644 index 0000000000000000000000000000000000000000..1d98d5d040a6a06af416c5ef6d615ff6006b9034 GIT binary patch literal 47854 zcmeHw4}4U`wg24R4OvLcO(1C0SQi@*GJzIu|8g(t-O{OsUi&o2`bt^X$7H*O55Fr+Gr62SoilmGxzS@n@yzc zr=R!h@ArB?xqD~MoO9;PnKNhR&di+@+}_2kj4>PTV34t$c+!>5f4}&r4asp=zZl1M zjD2I$PAUJ5NoBQlt&ZlFrqwMK4UVdc#>OVaQR#NHcp4pbjgIW1Qb$8mwLA5aOU9*W ztc#tDjdC^O5Zh;gN}nLVj30&yKx<|^F8D+hPj1-$ebvjw1S z9G=a%V{zXqVEQlNrB=4KQk+m&8~sFHZIo}FmM`hB3%4Ej5;HEBFRP@Cpj=l^AwcDz zx(&NHo>I^Abr5_zZo*rIJM1F78EK**^9bI9oA4@ehh6C`J#)sa`5Y1?1@`0q67Fga z3jL(B_{2RoH;yxfbhuj2(O)kLO&dD?pJx7%NMWVJsd*e z0hA-t4Edjrc~2+%vQr#B=3@(CvOQ}H7k1*&x@ut*9&*P)h}4&zLe|9kY$-8#_y-p< z<{gsc_FR;!14zFGv~$O`gp=0e-Iu)A#=5ll!pFcy$y@jYacftBvG7|6dfp0SN+#p~ z7oF)35bNksx{(_t1p9XeaSd$i>_#kH7EV?z$UJWlKdKXr%)b~3oHB4X$knr*yRIYp zg;()nl>-(g0Ts`GxnQL%N0HiR6M~JGTazI0Wq`Ug9q2Gw;}f3qp#@wD%FX}sHM$hP z{#@j!Ve%aR9hlw&!N9BLG_GWymi7arbt=~~P5yHA*QMUmiCbbT(n(9nCxE1a z@=-L{?>!w$;rMjspGO5dZSy;>U~G%MIGw4s6#thYnZNN;KpbtHRi^K%1K&tzTVn|U z%JgN$6W&(H!BGTkCc(aLh7}X+e!%?yiXY!Z&LQ5v=W1koYS2IbN~AnWDa6;lg&{v; zw#7yPkX}ELF}2sf94KmXia$V4y}rDs7j$N)OyhM0bgB}107S(EoA@m@2<$y6Ash?T zDU^qQGI)6RE$HoneS?OS9-O!X#q+;p)~86f80r6FP7h8#398ODy8eTc`w{O7U8s*G zsE~Nl^(wGGa}(D!nb3cMsRl;rUJ?mg>xKBX3Bab(3b>o}_< zP@0_xZ7DmO(^>GBTaqZHN4XJ@3=sJr(DQu}xiV!UQ4|q3=y#dmrta-Htc(Q#(FPAA zFf$R9SHOfj-9vZWxw03Do;{0~-e}36+%sD6jW)(iSdQ59h`O>fb`;fzdFGh&%&Wb~ zY2)bwkiqAS<%Lo^mO)hY@fG-e_XiX{_FaX3JLvbQ$8l`sX`eIx&%#YUw$gvhd7AS4 z4myZqFSme&{6YskcEr}G9nHk}2lRV<<*8#oAh?Eq-$n7y==gr(f8#~*Pnz(rxG4Uh z!1p=N+~iDZ8RK)FQk`df&cU0Ui4;4jItKx}$$7@J5V4z_gPu8v%g;L#)x7{n{i^c> z0G){)RK-50UFwJbFF)bkYmxfpZYFp41e(WE3Nev8)>(L1bsqIOk8(D=Ci*(4CWyrd zwc+#&?Y;YQE!QL|(APm>-{bZ8Rh>uvmdyIW%v7FupR->t462i?;x`tz9k=Zm3WtiF^e3`F;_MTa={z``IkejE-7AgAe+1kkqv2ju zmd8IEF3W)t_(PUZ4S%6hAU9+g8TX>HjE#_G-!bRDFKS}%ezyi%6jqH!ND+B=PvA7h zl)`}Jj_KS6VcI=DXX2mJ#0yRzclNxq=VDg43$19l;p`fvzRWEK7B({Cap#%i&Ql{B z&S^3n|M}sSwR5->sDNFg8N&!ocU0Vq%CaItmK`I@GO{s@EX&Ba7nP;|+;F{YKjz&2 zR~XKZF}nJ*&E)9CUDb1cOJ>`K>lcRf+@EW4BO_i^vulQiYxbGpQo!P#`wJ{?RNRZo z^1Dxm%ktF7vW#p+BUl_{85#GYvfLRV%jV&-pmw(XxwSJg;zgx6dUm)*o*XU(YG>PD zP&=dIUR0L+2w5H*S(cGCK0@t4mXUEUDof8N!}Zdobw17~d9UnzhIh-)R~$jNNvG=)bel({ONyXtKjv)z%l#G~^DZsjc$(%tyzA{uiN@HsqsNng zv3fNI^ZsX384E0cck6TV;d!5PFO9$Yocrlf)8~AR|L)E#=yM*J3y?7$rlG9*IE|Fw z<-^)zD@n+s1<5o1q>k9U2N-E*nW*%L*RS-j^zpalRam3KmKQ*^9jO(YMz#$4UCk(!$-*f>T@Qc zpm2lX`Kr$E^IW6*oZU3J)937>4Dd2#SD=3kmFdN`)7eFDIm@S$e!H~#Sx5CV2B5%Z z3y0JDC=td927Gd&)47`{gLrubrH(-Y()${{rJ`Vj@hf1EByz`dl;}KzUl#Zle$W~> zIlmr8O;iT;*NOVy%=|~dSbtHBJ4VNVH9ktEod*=J^Nh4{{TX@()Ma%k17Cwfm>`Afw~uV2DTOCXc0{4{v6z=!z3I}IpK(Ob)DGKnKlNs`?0 zv`9MUbf7un4Kf*zL|=KLT9y*;E04z`)>nQS53ROhNr)eO6bx>1{v3*vcbETMSADo@ z)Wj6O`zyR=fO2>=luUs#QnJr^kg{?BV_-Trr0bBMuK?m4kzN~#g7W<6dQ#(Q35C1~ z%6n)GwAknLlNJVuek3}*3jUkZ`a$cz$$7Npkhft_@~$6bvbqEF7(@(tdVu6}o}l34 z2yWa*{^btWN_xe{+=aqjO_FzgEK|mN*T*v@*1JBDDPvFq#(hsG)%Nuu4g3nW-RIm) zvXO0XMnb4jY^Dsdd0v~t8^uRcLHG;^ea_8#S%HKMc#N*%-8D4r&alVId4e-=JX zMLmBXj!2D{Unt+sn=<<8SYHy-dL@I{K49AHbA=CZydn6-x1y$NI)W zz|rlr0%Ts4kP6IhLeqRiqV`@6?QoS+IdqjyCftTIu*Ea5#W%Pua{HJ~qEh{EZJrK1 z1R~woU79LSb5;6Dl}G!Wr+|UxL<+R~%8zmdq83j{{n7!dy??^IE}FwwVENY|>_w7y z{VB_XZvgrf4AfuCq0~sY;QqDWM#?zC&!Lot)4)FsF{yL(?o;m28^&xhZJJp*)49w} zzqvO2`pVCE_r|K26`%@)x!S4F5RZiUKHh!1y!&R4z(al^-7dd?DU>rl!3TDF#+M#@ z%$X?MSUkD05MRxEX?#DxK-J)jSyk`pnf{ZQqDM*ogUZ;B*>{>Kg*-OE_7ZFvUp2?*28U!31oI+8=Z0~{>vPq({zJ*#nh6z{P(~Joc z!ulu->l0w@B=T2#Yr1M^{%|QxnC732qIp}3-2OWYD&h@fue$evt-9aeHkr!86889Q zdrsQ?d6*BMx=%BNKIai)1{vb}oc$C;OLZRPlfaW{Va$6VUUeQw>(SO9y!$12cVV#O zRrPhHwe7+!a(gH2RQ~!7P_|vTPHx|hXxoMB<#rDbTqAdkML^wi=$zbs45CSgFz(); z8C)^{HP0vB^+!PRDiF3wa>pJ#!C!sN>p5}_<&xF|nE+&zo#z`gZBG-y|4eN9#rlQL zY_I2&`Obs#L%V^FNurL!a>tJ;=sdBNCb%(1*-G=|KKH&(_nABHgtHd(Z5LKRWnB0T za{C@0xWlttXwxBgJWsjzbgm2jgyc|Wbv|&Tr1l&0*WMm!e>w^?({=gJdp?0Xg`1zVWg8~Mz4Ndf^a^sM z>QBd0jZIMtdi)Kr99kiwahk87$9rz9+)g5PE|oT2jeJ)kUoNiPUdW4o#CvXo{Ma7Q zJl->QPhcT6Nv?Eq0}wv&6;O!M#>?$@B3V?`0#HkbYPxj!L}gtgw?7Fwsw^7Fp`NZ& zUklYz;9bn%b>1fJm##5juLHK_2#VxmXKlIZSmZ(;^Vc72@nA*~hn1dP&3m;1Gl411yXeV`oHp9nr_#sl=8mL$h(NxSyrG7fou|umVKN@ z_eb--mNEp}Sl`M6a1u7(`h)6%6#r+J0eVzDuQdkm0Su&I{Q(>3c?Cg_LZxH(sQm#u z$(zG7=X)@^J zi0p*Inf!EG&)NNwVnx1ZUvVf=m$U(Tc7Gc|ET8U0(_$2~QIJVWgZF@)&+9V_YU9+P z{6kxcZ*$54ByQZnAMf-`VDb-PJOWAxkLbbJlp93w)r}Vj&+{eD)dL;X=E%#KTMZ zXl3JStfvwFVH5%HzSuwZQhmX-CHb!EDMFLD5L70099Lq4iQnb% z0m*X)?$|LM?)ZDZrmiOGj^4E60~WQnGfVO%b`Vy_Vb9>et44d>G6e!5_h`sO{QIH^ zK)N4zj6}rxl`lIb#XDqGz(9%T)j~_Kv7){D%J_cih># zq%`d;t*@qoDd^$>RR;mr*Rx6NSOz~Q78U&p7CAe5)Ltcn3Zb!7t%#(kSvLP<@ZO>c zsB%ellq|b{J7`JDL6P-tIGW(V*R+mHs}Hg#E{tzQiUR`4u$r`bi65HrA^{DtQ1FBA%T}N(#8e zV%4}h_Pw+>8@ybmhxzI@TQht`*YKeMwQmISux z#I~M~F{%BgsHl|{oP9i+^}H}tn%Cp|{Hf0Nl92x^^V>78hI-?1K zkuCwsZ%3XsDhjkR1zPdhIGv*2q38!s@==|`I}{^- z&5s1%97^dpD|dXIVplytvEy>bMv7h1hS*E(1bS6&rq*@}9>)fZnpa=N)o8O&)m9+vWBjBR~Ul6s8M> zLD{Hi%s&A8;JFF*t*O4nHs1tquic96FEE9T^!pQ=pib^2#Zsp!uv-p$_c>5wy`lXH zLhuQ2+t0(jP_56UR{XSXkMaxOCWbZWZ^mqV4Z9G6Q$Lmt5nH@HB>%)hB5i|6ff$gX z8Oq)B)bs6x{4?MNr+!MP(m9R{wJ`tvg!~R9681RtBda~cjimP9P6#gpfodD2UqMy* z3B8xlbzAX5+HTf~SC^KF8v_*fj%Cy7$rIKNOx**(vgL5QG+r0|3z=hV8#U0OKPhS6 zq0f{X;oWn+LqTP_cj$9v?lA{mZ<3K?>{;H0#w$_s4>1qJw*&R|MJ1x2L~(-0KNxsN z#2{cWII#x}bKu|>N*?$xl8-d_5Q>2|_VYahQE9Jw|0sDskV5*FcgJHF!_@ZUXi?`k zDCrmycD(BOlK1@eO1Ag>Ey^vRIDZGQXb^eW^Oo8V=j}ZwJqYxb$|UdkN%G@+eji9$G0(@O9_n=r|BL?4 zlpp*}ANjBa^6n&RnF1Ig3zz1tm4}98>Dwx8(Oob@~ju)}-OF)*I=>+O@;56kTs zMS|O9ZRc0Y?KdNfw(}c2r%=}&G;Wu>mrB4J_&K-#r4q-Y77dBft2d);j?T4~jqi~V z^M56G${>OpO;P>on*#~RZ%XHaDIGy&>ihxKuhe&(?W~nNeiCgu3EBq?F6h-HXkSOr z^A`N1!v_xD_Z@Qgm<219iUk{#EWFIM_jo?U#vydE^v+e&b<>KJWTi;n?IH;SPrzzl zo({>>PXoU}7~>5v3G78s>wjQ#v2u5g1XcsvQ675#qzpX&2Ckhs5@$=fgB>#OlDngk zdn$6DNUB2af%Rw@A$u467IFQ&L;Rqp*NN34!HT5XitOdDEyOQZ%9{gM8}@{vPwSjE zujBX1^!XRmKgsQj!5s=(AM~6;ZTe%e15ABISJ3AZp`cefe((ADa0SWj3qS}lhKgv5ud$*G0 z-G@5Y20NW-A98yg*~mG(t^Xd%Zaa5}@aJvku2=3n3tUMVi`Fl{GBMGm$&?QZ*%}@UHP%l#4p({r+TxP`2c$`_VVGdkLq1>QV2$XA66%DA%jM8hAX^AMGxeysubj zzTp+3*v(mu`SfUDh(g^?3(WBjXebfZIS|w3?S)Y)ljUwJ;Fm7g;Q0_WK349|l8`d+ z9{qgKdAAfuL(V%_qAY>!;FESd@I5?s-a>$XqtG1`dK{t7l~&|p9oQ_~+|niLez?@WM;>QSzxe!4VP&9ZmiD@li>^XmN=&2Q?n(ThC> zQt`aW_9DRDA9d1XhWc0yGmc;qJ-rE`RG_YF)zKJ<`BeOr~gUpgTOllriVIyZ-Ke4?^g%a^Zxh1h`PtO z(4PQXJ>T|b8(8=X_NjyZY7!qCkO~fBNY&8|GOD8mGnC60tWYNUJV$=I3*!Jj-uUCQ za(he^_##_KFdmXfN9Xs--kNBlvbUX^v8iCI++Kue+qo5z?1Cgq)0oqE)$*D0QFnAj$#t?DDaVzh!L*uE&&<+@1jGN%WsxLZ+ei z$?ZF#6QA=LN>q5!KtdRE5{SMBi->(rJ`0JNch&iv;U8%ZC0FKb_Jc8JgFLYK@t{54 z^IqqjvAzP#>mN|x_NVdY%opb%(qYK#T1sh^5C{~xkG`) z`d03wzW;~7oXpZmyF1jrfkeL@5_R-o$i3M1;58V=q^Pe`lL!phN^K^~7Wf2pjGBh; zrfs%9H}=OI)F;Slx>R=$DXRfhWGLyYSa6@ZPko0ssyQtm@m|KI=fI=zsP|FOh2Y zJC8^M{WV>ikllXdI>y^)3E0u-7fi!MG!WDwno347F(l2E+AeI6JFW(xZJmXA#s@l( z#QD*9SGiB!BX=*ibY@t9r<`uPaKCbI+lBR>a_@(d=Vg$i8A}7vB(K~}#q;h#FR&>y z=ozFX5%?TWKim#Ai;ul;O8(zs6B*vzR8K!V3uJ1$Wt!an0-QZO(!gctnmgQp^8ELQ zRN`~@1QLJ))dzCOdkqbAQ0xB<)%SX|Y@@yx{gKw0j=+mPfL3vC;4-8ALNdq);WC0s zJb9H3p3`!7CIJUNpvL_YmKxC}&dBZG#*0yB`BA?L_X@!R{g7Hc5cnK2oOSlc%N=h+ zU+T&O`<+`?^f{k_##o>gZJxMzum<5P--%a`7+*Qof_D11f{Sncu1*&=%6~>8-w2U? zi)`eA#)FY}{XtBLs4I5`N{ENPpWRnrCkNdF=05lKzs*>ML zSOq<3nsRq`Yz!Rrwdg0VQ4heOpc$)ZQ3YE!#f}N2LqOyK^JD=UI>N&tJunquC;}bN zP3V<)@89R7La{&>snsfcOGgq_taE1|o|B%0n1M11uHV-YMEiv5{kM}SqQm#>@{K_m zf^U%$Y1jZic&80x?Ewm-e<;`*cm{gcz0C8d6+-RF&vX0?$!pmG@&z zv>Dp~U=Gx`lJU`?@Hc)Ld<<(lHpn|{a=@>_0mJ%f3Z1B0I-0~5oa56J0~{KCMl zq>`1}X}HJBTW^f=-(*){1!dr3rU0@o1;4JLaOtyfFT7FRdS)dX~=J!KwJ#CuLljvJ%_pRqMouBqm$EnQOc=PUx zbf#Q_ddfn<`^HcdcHk?BSID~U#kTtsa;*gYtZLD1vYZ~ zIrAG1 zNcQ06z8t&v50cN8q&1)}Dnu~o`7ILAp*aMHz`X#6)+famCm@HdkuLpKq@tR8m2uR{ z+~eRXdTGL}9~#wh-o?<>=dts-W~aSv9`oD-6dKRc{FCjlK&7a^9nj8Z2`_B6Ewyc^ z6foTm*j66F{G(1l2}_Yc!v{T|wG>Bf^x^57Llo3us)O{(s=80;dBRtNg0iD-+kY=n z?Zv|Ccx}uw_H5Hb1Khk^F7!r(}`SomRzd$;CF>o zZz1IKocc*B6@IWrjRVWH!!>HWt{Y6Ak~)#h{6l>FD#1Bwby0qbv_1)=USIhsQ6u|_ z08sLv{yq={_JY*sJ`uPA?b;|`XU^yIv5Ch^lQS47ey;B4#qjfDypK7hb2Vx)N_QCt zClFZfpoI`^eC^$XM2VD4MIS=Z)dN$9yhBm)*WRJBoP&;_i%GyE4mIj+pDUF$-gzr% z5^E{f&>#>z?_&FZ+SwX4jmr%q6dkue7NTR?4pyqz_S?po%*uf@GOK1hQ8MxfSo$EF z8Wh#BLgAGncibClmXTEzSb;=dCpRs!$Q?A_TI1bdV{*qy1jEgEI}PKJAEW#{_5okb z{H36vJ_E)O7*CljvSG`i{K6s|Ss!0-#numG8c2oO<&OWP-xmtrukoInp^U>XwE1lv zHa{2KR30m~k+$Ua`w`x{GXO)*8iP)=W}yvD1;In8c8s^PZ41z6NS>3v?3DPFW!|CqHHm#$ zcB}Kb;chS(KOjUq+~p zVfKa%{Lp_Xk0erLi+?PSpe@o8;mGA_BsQn<7L4M!{<`93EPY@!|<@iuHa3;HdalkJM<$TTwR>2gYrH zV-&0u`0U;uTjw`|pMU=Or-vrJw(WP`_xMvV^4r2g+B%zgm;5VIGrr`UxWH8Gl26l|RjaTyLz>YvO-_}zby z1fDT_{PEsibh>Ph_qcWHg-&lWi3E@HE>uHxBDc4LQ|GoMz|ouXCXDqNny-5fDCi>n z{!%n1vd4$%<6@Ouz1}6 zIxnG`_`DpWTPOQJA;=3YLM9 zH6}w)rf*U3!33X|ysGHr0_zX zT~|cqSqi~1i1@1aCDK;VbLGG^oqtGyU&iaYf{(=7gs0Qlm zDpyxkxmsP-YiCVQORcW2XD(NZdv#r_;%;%(;2amXtFE!83D9cyNN~>JuIXuW1?{bC zTqPQHR((ZltGkskXG=>{i=(okd1*_X;!b62E5D+_nws5>b&abXHFfoX8;B+Dit1F> z0=%(~>ZV4wV=QwvLLf(lqoty{uF26<<5*i)t<*YhWRq(m(`wyyt7{b`rp~BqZ1yNK zD%Z|hmzD|<0BQ0lAi$~wi-T6dpY$4zCc>zgW3Ycr=e zkk~iOqFm{fhp|OjSvNYSEGjIY>X@5)L+Z>ghN0ApmZmnftagBIIwzQ(7NY#ic>TF~ z{_n=)mGpP;L+=c9N%xg7=>fZRWvtD%34;!LQK1bpC;u%N{2t;gE6!ml85d_;9K+M* z0iSYhO`M$l2(0^Bzv{R}l~ov(Fp9AS`*D{znhVK7Lq zM4|NDM~+~K-Mnz4>4eHlw2tmz@ZZAa%z4E6u+1A~ zoi1_Ji-IkRvA!A}&xjd~FO{G8*8U_Ij3zr=8E5xeEV;2!u^mgyn54uLnhtlb8 z25uH1f>k-1OK!|6dO2m(UKZef3h7=vDZhs;8F8^*D=@3a#l`0IBIEsWwyc<1Q%uI-(^wNb&-QC}!QsJ=2{ zkc8$N0)UKk*9AUp;FE`NnEfq^b2Npun4B2$OS^#k3~;@6fy?{TEX{XTTf=;37RNsg zeA~fb@B@uE$JczVB_|9Wg-QnwP1x@PzDvV5+n}RpmS+>#mrfYng`-4I3whGr@Zrn*raokZj>ys8sxL3-G z$qVyQ88P`FTZQ{G@OT=}usSgDSQJK;8v{cO`MHdkJB$d|BlWQ>4h4fRK>wnw+{V$C zHJ_0a*JH63jBMl}ao|3K`{-eFzY~9t(eIG$(4> z?iApX?;eJW5u4VVxkZ5dhXVX%z`u_0VY*;Q-5vK;WV7{1yNA+{uhB=*=r82v7sV7B z5keiU9?3T7&izF&NONjJXRr@_;6ku}T>sZJP~2r?y$$Q7bZ+V9Fjx;@PXe|r3|9XH zd=+3LUAf;xo5Q^h_rtiqiTfGcJ8p)Dr9v zvs(B^c<#l0829_Q2XR{-L*In^Qry?zPQ^VJcP8$9+)Hp*;=T*Fg8M<-5998_{Uq+E zaep88k8r<;dmrvMaleiG6z&gk58<{z2eG&laXWBdk9#)mn{nsjF2haN|K_s)jAgs) z-HJO4Q#^H574@a=Dw^kDr^V#Va4@?}a;~dWid&khFkix^NjY_m)mimTt!_4xhjZ#$ zT9q733uVA%a7ZBz%oTuDQcjE8onKekQqgiRYnK+em8_ndOxZB@jwP=VvRBk&hGn?8sn&dV#hM5(OS9%TRUlU` z2_#i)rEaCXv6kmj?Oa#oZYC{2Y)oFU$8BZxt;lvsMZL$(Ubbm7N{~WJ`@ftdLnX!LHtktc!Dw>;J%Dv5i9A~a7H|m11t0b4ZrKPcndK6bpGiI{f zfZmC)r@p?qLaAk2Bv)NiC0Zq(tyO~lzbr1y&=G?dEv{w({K!I?h#YUSRa7>$C@jlX zfisUOpIdD(5X^)zw%AtXuEQ{Psja4pS3X;1tEq2lYGGBj8k!t*wX(ZxH7%G9WOvgO z^4?>sX?45rW@~IUYiT|adnRlR8o%$`8Y)|rrnObAj6H8_a5q#n-^*CHtr_J4Q?}FA z+)~%5)Zl|78|DD3YAagUJ{#C`aSqs8ab|T5d))@%X{N5;&EBxJ)~#-=fQ)b3P#L@i z-lI^x8@m0IO=+rcT8p~1MXiCx1n=ol5I|{yC~ykoH~$9rVrNOAGyjHJe3lg~6Ty@2 zhSoJzEsB6nLHzIe4wn^0_{a5kq5+!s?wOwccOuO{#Q2}qfV4fGCF7pgmdDDtO^r2mt7p{RFmLXRs(V+jt!qpzWix7<8r(DPcGoGj zGl+_>NpjjsPhEYr!9`!KoL<$^)Y>||5i6o=+yecESy~nh%Y%-LQpc>+S@W3GRt7t@ z@ks`oL@8NmX<}W|F}*?YG`bhAb~n0P>Z%Z}XsN1QST|?hT*vg)`d`s3$8`O!;nHBe zbh;>vV|q7)LVeX&#RDG|~tZ zi_HYISfX2NF`9Omq4ucyCM=`#AC4AlRRd3Td)t|*=RWLslh)@ zIs6WiqFl{N3zLpe7?CPuDE)%Outm8lEAVb6{gRUGQLdW$iq%Ydi_&5d!+RROA){D4 z$S|rVrqVG2B!bjagJo+by-o3?D3{XET+@h+1xz|l?2_3S+s$}J=j7!(nRH?)WpN5W z7jTbdl!WoEHO)1p3qnHtxG_r=C)W?jJLLJWV*x=@dih}N6+ z7)r{l86<0rtGeRedfM~AY%4g|7#D3|xDRh;%(hZm3>;plQcTgt9!D7@&?xuuTCm+I zWdR&xuvjlx7#tqt9Ab2W4V)mlwxYFmO+~#+VNusp!J=!Gib@wjS=5YfupDFCh2Kja z!_VuunSl^@+%LSqxXVDmJ@(5C6Vlt~FK?q(NW ze{1U2xzb#;xr154VY3Cy8V;K$V73Ijy*BGqQ9Q=RBzPKI@apcac2O#ePFTa8jELD2 zuuldrT%Q(f4Z^{c=( z_yDz)&5rKbNjyAady9+gmqqU-1}sWM`fyY$Jhq+kq98XqE3*>ac(_@b_GxNyRW-FL zt(feNKKMP%4o6}C42yn42vzT{V9{?<*oH=5SEIPr;B7tnX9Tfp5cET6mC^kKi;ZgV z)GOGmgeivTLob3|yntZa42%9bp`=7r*R83;G)VLjN}m$d(6pu%YWO7;bpgfhLyUX1 z^r(6?FWURm3SAr}>TE)AyP(IqCKi2+K)IZzvK}>w8H(uR1j{GytpQH_4A~TO044-l zkny_&SrJv!>>_3?`aL44rMO`6KBd=FTq8I|fOSy~4eKBA-T8fpY z4C*Odky?_CC!Lvqh91r6Xmt@w9gVXAd-n#q>bfiOiCmWZ=c*;wA67t z)h1Fsn5;tk4Ns5Z>2{GGE@doFh?Nr2j;dWs#od^2Gu6Q*93fsqz<+Za2}$Ni*z0V4 z1C85G+M?FQTfB`~zmG5nl7Vrcg;{^91Ibdg4#|21;W4%iU=mZeZr)t2bQ2^AduYbk z$Uz7=c^EA*Q6lg}j!xr1SZ#G3e2Z}N(RWL?;{_&R8JLxo7dl;~S-H;aa*Q&{4@TiLMC2BQ36>@oHva5{rqT(`F#-eieB?FYPq$n?&^zOxp`b& zIe8FbiaDt?ENQAaDJQ4I=`3c~8&K!6GS|GBH_ZF0E32pw4xzBDlzqiWUgFFuD=Nvm z-RTmh$EF!+i(nCGmfSJ9N~ttxEctA@fkD9XLR~BQMKB9gXI=qpD0MWfQsjsBs-ev= zqZMalErx!zTF5IbEev7KG-H-6FLvfTOG{A=;8)7h%*iCnOjqV|SMjo<5;n_7By%i* z&~Ug^i>2gSpagcq7og;n6cuo!*&`xBu}hpKrD&F=Y>t5;yt>KU;K~FtDq*gHNtPli z!WEA3)e$j54CWchyh#+7=9cGVviSyB4hfDv{~~)HG8v>qWQn2d1blO?%6FyQbzvLjOC@S9CTXf z;xd2$qh{#_LU|!veLgkId}krcFcM00^K#14Sf&BF-ARphSs8k5m&mIyn`Ig4XwwBn z(1+Ft$=R@MBRMCdv`o_#a~j|*th%gSAp$qLOtlxQX^GGJ5=VR7WSSh0~JOiZ&zbPtq#+wkO^jC|yTp%iz_nFV>Q z#6Z!;DzMM&Jl+AKYRHq78Yn^!+%j010oJSXHcc7jMp8!ht>vglVK;1vkx+y&UtSJx zs_4*43)xa5EgyA{#dP~u@YZ@4Mu~hBx>Ort^08!%yF$U&A9$5$<>N>(%%u6nVZ+Sx zQrtvsNSRTBkr;JG=6EqFUK>+tC>%5|6H^N`(B!~n)KbL2k;gMjmu3`e<3tYNGDiuS zzl1EcF}4^MbHNOmZ59$Lh6d81*D<`>vFHgFD)OZ+d|0EnJoK`Mb#+%QzV2}e^oAOD zV-*n7Ecb)M7+VQ`C*s>5R~3EHqYbTZidu=&^b!h-glVz_3`3}d+4Qg^WYNQ#kVy|) zLTMg7qY|?Db4&ud7XV5zUd_rc%FJ}a8U(1?NJS78#e2hf(=5krI=T?_87t z*TFf&CWLox7%%ccW-%pVbcjePtQ5|H;&MU`dJ}DY9-lycUQS*K42KdEL{XOU{*kjD z&oOv#LV|M%@+S%&PfW-ZJWDaU!+6(7xiq1mKoj&bU6v48QkXy?;N_ZBA;1+HfJW3j zw<}TnG9!!Ru=EhoRS5+drHfr$OiuJA0pQ`Qxr{vMNWdVH*t)V{Or_`{CNb+qR4{)< zYeAKAn<{43N`zyoE7uucgEdrO?yAa8NR%*l_OPUCk<_}TWwtAl(9KhMHpldAVwm++ z;zmXab`7mG+q%YuojxrUu(qbkN?2ueC>ylI)pjDDXv`q-c~d^A7yYUIo-1IIa1>b> zPhe2UO(QSM1k1yk1Zn3)Yx)9^|(3^WU` zL&HEf;5BF%Xf|GV!a!x5*A>G-v+$y0VBJmwzBIh$7$BM$y(+95V9}S4m6Kqke3F5j zEQ`J(48omj3z;cjLvmF%c^a!}V_Nj2v3$Cp)73RrHPM1t1kyDe$xhC65Z0@=zLN;Y zz~^$8i;Z1qd6UNy0@iZ0^&mdE9bJA~9&Z9;J>=D`mtP4KyI2^BTph94XnR!!7BcKs z$kSZ!UgyvOHhr-uK9rmwBNx&o`h>05;Wu^1=ldh$hjMzc#t7%ME{V%?x1QtIg zK^iYv?N{0-+b3Z14c<{gD25>MFiT4ci;1}zQJB}YEN=oPA;z!OAL#muoJ`BM3H!x zUIsQK(Pb0ab$BGrW{W6~C<}bR|9@8liezDV_?4s!ahKp%!derS2buK6E8t;U02mAH z0U%lyWuaXp)~6-unroIXp1FGA^5rvU+-}!#5CUA2d%lwjRKP z)_bsa^TlEzbr>S;JGeLzkivI0d@%uItqQ(EPpu_AA&8Yj5yrk;EZB-Lt)7Yyt%$ltgnx$`D27Z=@jU?! zvQS*LxKElO>j(@}l^Ef;w5{9@1EOsLpBaLrVz)Ood-Ds;gjuDzNDJRvhA%cM@jj_t zWW`pAK7TV`seE?{WB7+3>~ow;vRZ<-A@_joLrNvinrKX|ay3=nMN~x1`A`I>N{Wlh zgsgErg`3>C0r??f>AK7$<_On5z-FQ~in8nF5>zDfmq3S6Mc9>EU7=KHah{h1@?n== z_K?id$Q{fH(Cx%c9IR3`eu<-TrM4KEQ7Nrbm5~@0`VGSL)u6yh2ul&c)Vr#%Lq1$T zy5_N6UemnNaxb<#4Zl7DV3n?)QFKV2@;f>XXF!Mee+|d_Y8HjFIq1}nKcNd25JI{f zIOveWAlCwNdkBJoaUHhdvmb>ZdhG~#NE@-3+qs$NsQ>7-LmCyeqo){8y>=V`3ClFn z^pLK3suQ8rZF-XFNt&mO1kRUDX?lcenT`P?nXD2W92Ko6g`PJ6+6*J%`ayX3rI%gc z5Fh#yA1WSpEd*^m4EADt1P<|`FYkw0oz`+wz+32tB#*pGK8^KIPB8vl=?GKrz8&;hh2J|P66zTWL^idc(@zG4t;<;6@uvU z^l%ADo)5s$Twi)#(?WTXWacY1tE4PtSvD6}*pI$FK!ZJ7>S0|W5+zKI7# zbbq)GVbK%SV9P`V8jIGN3R$RC`gi5?6?3Q2YxjGLi)8p16=}uRhoxi zGmfsqDA*-?Cg(UsOw?zLuehj9g!&Ls4HOedI;@aR4mz z14liqzKDYAlxkAcDQ$I)ym)^BBNTQR*;5lm9_7XL?Q}GbW6K5p0J%T{r3_CHUij6vIgw+ISX_r%aHYfDD=- zbgU-+^;Q_w2|(IH5M77y^9hH_^&W)Ad|%j=T1O+jlsW03Bx$WogUl^M#hM^mzWcMc_ChaHd4yBu3!SVch0&#YW&bB5*7bILQ$> zw2#)rc}`LU&W8~=i4i!bB5>j(aNdr*6=lc;jLlHPnN8p@^z}YR6iPyGn?MAOnf4#=5$5yd2~3RIgdu* z+!ujEC*hg$np+=%(;k6S7=hCkfpc>N&I1uR*GAy1i@+Hdfuls=3=MDZbDAS?PDS9< zN8lWZz^RSE*&BgV9f7kW0%uhO&NC4>D0}p@T z6FGX8 z60g-DsI-GHa!pkC0B0R;{PDWSC>TM#ml1rn0MZ=dL!5sM$Wc>Xy~F?)Q3xvP2UeM= z==-mOnpPo?IOcg2X}Pb`#arfY2K$P_?qp1LS~-DjSeo6V)<6#O1(SHdcetu7+Pt!07>7LKRx= zKv4Hu0`g6bkD=#YKy?2sa1H@-&?L`$8kHgQ9{@31!gx|1F2R|;D8d0YY+lF`C@q{gCL2HTE=IGbYzah#CbDt z^!G18^`C$&GjZM>!TC)<^tVW|9~@PVjURLwT0H?A1LD#S2wG>#{UhLAI2Eg~wD=2rqT#Z=M;!ZA_Nzjx9{O+ubW z2?s$naULph(0qQaIOX3kYZgm1u z&1IqL7o2m!r-$>=Axi+M4e=rRRg^m}t?jrl)$S@Ns|LgKIR6BQ z!vuK(5PhaXP;CW-E!qX8s>zd}of`JM6FAKwKKSO99|ATdBs12ixK^7(5X$Q?sKQ4w z;!v|~CY+PN=?QTrszE^LGBoyOOfzpX$$S$ar$baOaReG`GjYxX&QTMjjHatmFoSag zAZCxff#ZaGwnqV>v4)^>X@{pRGjaY7aAun{zm4T2g9)* z6X!vV549EY)2r{$~qIt#(&>R-?nHXk3jiShOhr zPcC{=Wo3(djh<4ElQZ=&|F16?VQG8t@Ucss!q?={{j@S3LRVR;RNxWp;NOJ}CH()*Fjro~>XwSN_`fvh81)DxK_q0i(AB9p|`O)mN$ zD>&q&ns(lqL3}eF2i@D~!rD2fO2_Vb5GwW9yiGI|ajm6~8zAOdrMAU|0}WhvyYJ;3 zBU4-4{FI4s1WxHH%P*y#yb|XWfvVX}TLoR(KdONq>AXtH?k}q8VdkM#d<`A^iSt8A zIFUE$z#QW*>7n%Mx)y$vOb9@)=KvZsG%7Ixc-Lrxw77AQju}aD*VmhH=;TigkW-RT z;B?W4e=f>~Y)gwk^Wp!#h@a=g*Vj_9L!aAhs@O+4cg~y}=76}a0SBhi3ADzkv+476 zxM;#I^I@&&X>%#ll5%`10x611o#ol|B~(7Xgx9vDYiy0fQ%B7qbXF?t4GVnqi9m}& zrOGjmxlNx<`GxOp*Z7Yl7cY-~Dl5oPI&tKXMuRhGL&xK$&t$IB(GRWV`Eq_*M*M7A zVdNpTg^uRsTH{S2R0g5ku!CelqTA!XYdl)h(`=_e$ZEQD{ln& zgoxCq^Akf1@wP}GOjK0i03ldMT~#Z$8-A8VQw7RyMk1_Tr2~Xv({bF9A3?$sfc+v(Ngq-leO%j5ggF09}`Um9tlC`LDf!Y z_Gm3vR8Z&`V2zi4U_ro|Ysj1auZCrS5E3TGB==@_BzUahB zHDL{nH;D?IX+%f48QSKPhoIKZbEZC#AKfj^nQ3t2TOC+^e%LwJWE8`THr!Ql(ZpMd z%awnc)~>j3)x|I!q0K#W z79Bv%>B2uOLNmmPIdq^jY6y}T2WRVb3ftkmJQ=6Xon{hD9#_oE>6Kg+LKLHhYWKR3 z0nm9tx)GT^aY8c+cXD*(mL`ID<<}zG+z>C4*)P)?khxNYm5y|@xuHMpJr|;n&|HNp z9LXxRmwbpwl^-fnn46=bLtlC!M)W)*^mn0y$wS^{_-K*)r;+^&|0jaO4tF<-s+~cO z&Qd?`e3;(|?*&AYSB#>eqz!0YnRHGf=tA8Cbs4%P(p!%%cjSLc99d>QErl<#X*kCD zX!AK3@`{FfRHxl{k%3bmu%9{Y-XzB8YaVja|`p`FZqOfwfmYYLT^fw<>qz z+ha(qJEyzdEsgGa97$6FV0g0&Ggxi0O?S;kg@=y^xICf%ZNNp9 zNVCr|RZKNrJG4H$%=pIwhCPouT>9b`KT_w!g&W=nXl5Peo=5lNdXJ3$$WU%*=;xxM g2w#ZdSJ-O~!Ei(Yc?rG2X+CzirY_R7#lH&pKkte&%K!iX literal 0 HcmV?d00001