From de3d06f207a2c2d2b71754bde09c0465355c5358 Mon Sep 17 00:00:00 2001 From: James South Date: Wed, 25 Jun 2014 19:02:07 +0100 Subject: [PATCH] Funky Nuget stuff Still can't copy unmanaged binaries across. Former-commit-id: 7e31a7b715087b080fb5d38c225d662dd6cb91bb --- build/NuSpecs/ImageProcessor.nuspec | 4 +- .../ImageProcessor/imageprocessor.targets | 10 ++ src/ImageProcessor/ImageProcessor.csproj | 5 +- .../Imaging/Formats/NativeMethods.cs | 100 ++++++++++++++++-- .../Imaging/Formats/WebPFormat.cs | 60 +++++++++-- src/ImageProcessor/libwebp.dll.REMOVED.git-id | 1 - .../x64/libwebp.dll.REMOVED.git-id | 1 + .../x86/libwebp.dll.REMOVED.git-id | 1 + src/ImageProcessorConsole/Program.cs | 2 +- .../images/output/120430.gif.REMOVED.git-id | 1 - .../images/output/4.sm.webp | Bin 12162 -> 0 bytes .../images/output/Tl4Yb.gif.REMOVED.git-id | 1 - .../images/output/circle.webp | Bin 1228 -> 0 bytes .../images/output/nLpfllv.gif.REMOVED.git-id | 1 - .../images/output/rotate.webp | Bin 1812 -> 1792 bytes .../images/output/test.webp | Bin 5590 -> 0 bytes 16 files changed, 164 insertions(+), 23 deletions(-) create mode 100644 build/content/ImageProcessor/imageprocessor.targets delete mode 100644 src/ImageProcessor/libwebp.dll.REMOVED.git-id create mode 100644 src/ImageProcessor/x64/libwebp.dll.REMOVED.git-id create mode 100644 src/ImageProcessor/x86/libwebp.dll.REMOVED.git-id delete mode 100644 src/ImageProcessorConsole/images/output/120430.gif.REMOVED.git-id delete mode 100644 src/ImageProcessorConsole/images/output/4.sm.webp delete mode 100644 src/ImageProcessorConsole/images/output/Tl4Yb.gif.REMOVED.git-id delete mode 100644 src/ImageProcessorConsole/images/output/circle.webp delete mode 100644 src/ImageProcessorConsole/images/output/nLpfllv.gif.REMOVED.git-id delete mode 100644 src/ImageProcessorConsole/images/output/test.webp diff --git a/build/NuSpecs/ImageProcessor.nuspec b/build/NuSpecs/ImageProcessor.nuspec index 85b661b2e..30e157086 100644 --- a/build/NuSpecs/ImageProcessor.nuspec +++ b/build/NuSpecs/ImageProcessor.nuspec @@ -25,6 +25,8 @@ Feedback is always welcome. - + + + \ No newline at end of file diff --git a/build/content/ImageProcessor/imageprocessor.targets b/build/content/ImageProcessor/imageprocessor.targets new file mode 100644 index 000000000..6922fa306 --- /dev/null +++ b/build/content/ImageProcessor/imageprocessor.targets @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/ImageProcessor/ImageProcessor.csproj b/src/ImageProcessor/ImageProcessor.csproj index 68702ed09..802dadb56 100644 --- a/src/ImageProcessor/ImageProcessor.csproj +++ b/src/ImageProcessor/ImageProcessor.csproj @@ -130,7 +130,10 @@ - + + PreserveNewest + + PreserveNewest diff --git a/src/ImageProcessor/Imaging/Formats/NativeMethods.cs b/src/ImageProcessor/Imaging/Formats/NativeMethods.cs index eb9062e91..059c5259a 100644 --- a/src/ImageProcessor/Imaging/Formats/NativeMethods.cs +++ b/src/ImageProcessor/Imaging/Formats/NativeMethods.cs @@ -37,8 +37,53 @@ namespace ImageProcessor.Imaging.Formats /// /// 1 if success, otherwise error code returned in the case of (a) formatting error(s). /// - [DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern int WebPGetInfo(IntPtr data, uint dataSize, out int width, out int height); + [DllImport("x86\\libwebp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetInfo")] + public static extern int WebPGetInfo86(IntPtr data, uint dataSize, out int width, out int height); + + /// + /// Validate the WebP image header and retrieve the image height and width. Pointers *width and *height can be passed NULL if deemed irrelevant + /// + /// + /// Pointer to WebP image data + /// + /// + /// This is the size of the memory block pointed to by data containing the image data + /// + /// + /// The width range is limited currently from 1 to 16383 + /// + /// + /// The height range is limited currently from 1 to 16383 + /// + /// + /// 1 if success, otherwise error code returned in the case of (a) formatting error(s). + /// + [DllImport("x64\\libwebp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetInfo")] + public static extern int WebPGetInfo64(IntPtr data, uint dataSize, out int width, out int height); + + /// + /// Decode WEBP image pointed to by *data and returns BGR samples into a pre-allocated buffer + /// + /// + /// Pointer to WebP image data + /// + /// + /// This is the size of the memory block pointed to by data containing the image data + /// + /// + /// Pointer to decoded WebP image + /// + /// + /// Size of allocated buffer + /// + /// + /// Specifies the distance between scan-lines + /// + /// + /// output_buffer if function succeeds; NULL otherwise + /// + [DllImport("x86\\libwebp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRAInto")] + public static extern IntPtr WebPDecodeBGRAInto86(IntPtr data, uint dataSize, IntPtr outputBuffer, int outputBufferSize, int outputStride); /// /// Decode WEBP image pointed to by *data and returns BGR samples into a pre-allocated buffer @@ -61,8 +106,35 @@ namespace ImageProcessor.Imaging.Formats /// /// output_buffer if function succeeds; NULL otherwise /// - [DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr WebPDecodeBGRAInto(IntPtr data, uint dataSize, IntPtr outputBuffer, int outputBufferSize, int outputStride); + [DllImport("x64\\libwebp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRAInto")] + public static extern IntPtr WebPDecodeBGRAInto64(IntPtr data, uint dataSize, IntPtr outputBuffer, int outputBufferSize, int outputStride); + + /// + /// Lossy encoding images pointed to by *data in WebP format + /// + /// + /// Pointer to RGB image data + /// + /// + /// The width range is limited currently from 1 to 16383 + /// + /// + /// The height range is limited currently from 1 to 16383 + /// + /// + /// The stride. + /// + /// + /// Ranges from 0 (lower quality) to 100 (highest quality). Controls the loss and quality during compression + /// + /// + /// output_buffer with WebP image + /// + /// + /// Size of WebP Image + /// + [DllImport("x86\\libwebp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGRA")] + public static extern int WebPEncodeBGRA86(IntPtr rgb, int width, int height, int stride, float qualityFactor, out IntPtr output); /// /// Lossy encoding images pointed to by *data in WebP format @@ -88,8 +160,20 @@ namespace ImageProcessor.Imaging.Formats /// /// Size of WebP Image /// - [DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern int WebPEncodeBGRA(IntPtr rgb, int width, int height, int stride, float qualityFactor, out IntPtr output); + [DllImport("x64\\libwebp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGRA")] + public static extern int WebPEncodeBGRA64(IntPtr rgb, int width, int height, int stride, float qualityFactor, out IntPtr output); + + /// + /// Frees the unmanaged memory. + /// + /// + /// The pointer. + /// + /// + /// 1 if success, otherwise error code returned in the case of (a) error(s). + /// + [DllImport("x86\\libwebp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFree")] + public static extern int WebPFree86(IntPtr pointer); /// /// Frees the unmanaged memory. @@ -100,8 +184,8 @@ namespace ImageProcessor.Imaging.Formats /// /// 1 if success, otherwise error code returned in the case of (a) error(s). /// - [DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern int WebPFree(IntPtr pointer); + [DllImport("x64\\libwebp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFree")] + public static extern int WebPFree64(IntPtr pointer); #endregion } } diff --git a/src/ImageProcessor/Imaging/Formats/WebPFormat.cs b/src/ImageProcessor/Imaging/Formats/WebPFormat.cs index d8c9bbf33..1617d37be 100644 --- a/src/ImageProcessor/Imaging/Formats/WebPFormat.cs +++ b/src/ImageProcessor/Imaging/Formats/WebPFormat.cs @@ -31,6 +31,12 @@ namespace ImageProcessor.Imaging.Formats [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Reviewed. Suppression is OK here.")] public class WebPFormat : FormatBase { + /// + /// Whether the process is running in 63bit mode. Used for calling the correct dllimport method. + /// Clunky I know but I couldn't get dynamic methods to work. + /// + private static readonly bool Is64Bit = Environment.Is64BitProcess; + /// /// Gets the file headers. /// @@ -184,9 +190,19 @@ namespace ImageProcessor.Imaging.Formats int width; int height; - if (NativeMethods.WebPGetInfo(ptrData, dataSize, out width, out height) != 1) + if (Is64Bit) + { + if (NativeMethods.WebPGetInfo64(ptrData, dataSize, out width, out height) != 1) + { + throw new ImageFormatException("WebP image header is corrupted."); + } + } + else { - throw new ImageFormatException("WebP image header is corrupted."); + if (NativeMethods.WebPGetInfo86(ptrData, dataSize, out width, out height) != 1) + { + throw new ImageFormatException("WebP image header is corrupted."); + } } try @@ -199,8 +215,17 @@ namespace ImageProcessor.Imaging.Formats int outputBufferSize = bitmapData.Stride * height; outputBuffer = Marshal.AllocHGlobal(outputBufferSize); - // Uncompress the image - outputBuffer = NativeMethods.WebPDecodeBGRAInto(ptrData, dataSize, outputBuffer, outputBufferSize, bitmapData.Stride); + // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression + if (Is64Bit) + { + // Uncompress the image + outputBuffer = NativeMethods.WebPDecodeBGRAInto64(ptrData, dataSize, outputBuffer, outputBufferSize, bitmapData.Stride); + } + else + { + // Uncompress the image + outputBuffer = NativeMethods.WebPDecodeBGRAInto86(ptrData, dataSize, outputBuffer, outputBufferSize, bitmapData.Stride); + } if (bitmapData.Scan0 != outputBuffer) { @@ -252,8 +277,19 @@ namespace ImageProcessor.Imaging.Formats try { - // Attempt to lossy encode the image. - int size = NativeMethods.WebPEncodeBGRA(bmpData.Scan0, bitmap.Width, bitmap.Height, bmpData.Stride, quality, out unmanagedData); + int size; + + // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression + if (Is64Bit) + { + // Attempt to lossy encode the image. + size = NativeMethods.WebPEncodeBGRA64(bmpData.Scan0, bitmap.Width, bitmap.Height, bmpData.Stride, quality, out unmanagedData); + } + else + { + // Attempt to lossy encode the image. + size = NativeMethods.WebPEncodeBGRA86(bmpData.Scan0, bitmap.Width, bitmap.Height, bmpData.Stride, quality, out unmanagedData); + } // Copy image compress data to output array webpData = new byte[size]; @@ -269,8 +305,16 @@ namespace ImageProcessor.Imaging.Formats // Unlock the pixels bitmap.UnlockBits(bmpData); - // Free memory - NativeMethods.WebPFree(unmanagedData); + if (Is64Bit) + { + // Free memory + NativeMethods.WebPFree64(unmanagedData); + } + else + { + // Free memory + NativeMethods.WebPFree86(unmanagedData); + } } return encoded; diff --git a/src/ImageProcessor/libwebp.dll.REMOVED.git-id b/src/ImageProcessor/libwebp.dll.REMOVED.git-id deleted file mode 100644 index e05b4f051..000000000 --- a/src/ImageProcessor/libwebp.dll.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -ed0333da619a813e8337d77ba7ee206ea5f20a51 \ No newline at end of file diff --git a/src/ImageProcessor/x64/libwebp.dll.REMOVED.git-id b/src/ImageProcessor/x64/libwebp.dll.REMOVED.git-id new file mode 100644 index 000000000..35684c541 --- /dev/null +++ b/src/ImageProcessor/x64/libwebp.dll.REMOVED.git-id @@ -0,0 +1 @@ +dcadab1b5b86469758707bff22558b33e5c51552 \ No newline at end of file diff --git a/src/ImageProcessor/x86/libwebp.dll.REMOVED.git-id b/src/ImageProcessor/x86/libwebp.dll.REMOVED.git-id new file mode 100644 index 000000000..129db9826 --- /dev/null +++ b/src/ImageProcessor/x86/libwebp.dll.REMOVED.git-id @@ -0,0 +1 @@ +ad47008dd1e64ea220bc745e28f568277434d661 \ No newline at end of file diff --git a/src/ImageProcessorConsole/Program.cs b/src/ImageProcessorConsole/Program.cs index 20e92e803..64053c5ed 100644 --- a/src/ImageProcessorConsole/Program.cs +++ b/src/ImageProcessorConsole/Program.cs @@ -52,7 +52,7 @@ namespace ImageProcessorConsole // ImageProcessor using (MemoryStream inStream = new MemoryStream(photoBytes)) { - using (ImageFactory imageFactory = new ImageFactory(true)) + using (ImageFactory imageFactory = new ImageFactory()) { Size size = new Size(200, 200); diff --git a/src/ImageProcessorConsole/images/output/120430.gif.REMOVED.git-id b/src/ImageProcessorConsole/images/output/120430.gif.REMOVED.git-id deleted file mode 100644 index 71ce555c1..000000000 --- a/src/ImageProcessorConsole/images/output/120430.gif.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -30ec5c05548fd350f9b7c699715848b9fbfb8ca9 \ No newline at end of file diff --git a/src/ImageProcessorConsole/images/output/4.sm.webp b/src/ImageProcessorConsole/images/output/4.sm.webp deleted file mode 100644 index 90a6308640402286dc34d6e178063681eb985089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12162 zcmV-|FMZHbNk&F`F8}~nMM6+kP&goNF8~0rh5(%bD#!qr06sAiheDzu3?B;=5CMW& z8x|I)$d+Y{Fb~Hq4V|a)--sPCop0KHN`An6AXneR|7HDk{m0#pSY2V|anN3Ezu5Y# z{T=^*+#B^@_3QjEWN+Qy#1DdBx1Y1V??3dtTmOXh1pgubGuIQ;@6a>Lr}t;!Z~LG9 zZ`@C6umAm&l#_v{ZIWL`#1eRa1Z65(*NLp zbM^oHmx7lGm z{7?E{d{6&g;eU1i{Cli^*#G=gyKFY$AWx_uPiu*pTy+_xN-=4HO(}0d)CF-mtQ(o< z`rYo=fR~U#M4!mu&!yz^{$04Pej8!-s`t(;H+_|kB+ZFyeDyN8PhumOH*Ujfl$NM< zB8^7SV18wGB1}fv0_4q5epO;0s>IyfYmBkWx@$&GP_U_%!2vjCItP*`#HV1E}YbL zl7=VQ^<@WN6SuKC_hxKs9MgQ1QGW(8OIe)G(+OaeMe!@&$a+9oa{FFqXhigos!H*( z>l|?FgKj&n1Wncu{BS(vDkS=(R&9ANlP1r<{ug7QsDn{mYYN&v@2Qyvk634Ms?Rr&^TT@2~Y|XKSXePwo^jN5d**!yJv!J?L zXxe1TE*%_C>f-szy;sS09Uq%eDu~B9g$8WAK5$8SnvuJO))Yu2My5#5-P~4!oJjqS zw-lW3R9Vf7SyjE$S=sI#7aahQ!-}h4*z=P)Zt$GNf|jk_r)dA(Z}tR1uiG{i_ZHXi zo2Wk%Qi0=MUrF#zi}K`~;@(mRyD7>4?mf!ei_KRieh*I+kbtf-oUk3RE)M12Tpr0X3IVmaP+KwFaG_rq9QP!=X$kBGB6kZ7@9ZKfr zvBDVCyZd$xrJO`7Sq$SdFo$xAOwH{}=>8Yze9m^TtXH@rV=^9aZ%umR*7%C=)Q#P~ z^JNr0L2@A>)Zs*;0092*S8qJ#+jtK-af(`B;11vJxz#Qcp%)^MwvlUuIzPwErr^Csn~qdH~8Yt+{~E4M*FUK%8bU+VQ?&oV85_n zFE|HatOq!EeTpndOXEcBykv}umpZ*LpS0m-iAIhR>!CBY=FtNB-%!7GBsTECyJa6A z#>GW%EXTb>3BAaWIZc38k_V*}%A?uNoJXUSu)eD-^)BYo?ktkwlprT=0ICU*O_-PiR3!uPK}34Z z-%>{JYX(fYJbiF_COr*xkplxG69)y*_Dhc@-h9v;sCm1!NtQw>Bh|ja>gskD`v2f1;{<2lG=OEN<8Pe*ncwymN zZSbjKJSBO!H;#S;@p={`5+p!;Z+Xi_ZGOd5zLHUgYL#XRhl5T(GN5)>%no1qYj%;) z`FG@9GXnXUpF&96FAIB=+M8m|w^T*I8>in&+8cI>sKJ3uUKK+)p3@!@Jk)Zb=;-nI zh+#R2B~jY=nfV`hr8L%T!7fTd1Z{sBvrD9xtDw`ta+Wj>u2~c*MX`PmpIa`S^9`qi zJLIRTlryi@^S)-g*0s1qqT8Qcrs=`k4*|J@((!lzHY8mhl#V+3^xlAf_N)Ou2|hL7 zHC<8o!rxN<)hpnRMu6+dz~19+EbV3|K*O0iyb#f?FcrTTB#&8J9LvH+;;s$0 z6ATwM%P$7ME{qf`&&z4B?H`j@hV$zZ@J9npT>)Byv0|CkZ6XdrVZg8!nO-+qy9e0i$i2RT!!ZJrfp(Ix~bKjxlOc45LA2#?i6mITB72WksEB zMF*zZuxJAdW|oCshk~gNm8=-7GJ1{&vVQYbl1=k~^%6uTaL=|m^dp%936=YfN(s{E zZB?|k9{_$DNuLIQ3jTa!;NIU15h(uyfWCqo3|)c3O9iL{GI8`M45LFWzr;&aVWnhYp@&sKaCywa zJN((pb!i47iO+78j%h^?>QP@(Ul+cZL=Tux5XoZUi&0lZJBPog$K(swIGw$6U89T$ zRLgIEz{hHf5xcf=Tktl_8yOUmM;fIMf>nmtgAz2`@Lx7~zQ+p+NNLjwpvs{W#yH^p zW{XJK>L%JvrW4#e1h$mmQ~3I>>Y>sh*9@k+S+08J4UFl;*d{KE-0sogRS=W#%C^UP8 zgTkWte%+00*3<7VoN}1W0VpeOYo^4`}P_V zA4)Iv|5xyRakk`8Wtc6{&mZgRUI;2aU7V{i6<(64gxSC(vQ-4mCA5?bp`XgME{5*a=vezp5T5CZVT{3@qj zsD9SV=5~=_=My=DnuH<)LBTMcR!0~r)fk@5;1?HEb3NJ5>nMjbu{a@4Z5t!bH|U#B z?rBEtVpD)#qB7NVKI@sh#=P3f;Fc_0$RnnhT%MjU;@NyuKP(9{u!nG;!v}~0VRORz zGD0C0>`(c;L^3WO;Yd<8>c9-87R51H(wVVPIYAK(VWJ2D;tk}s^ zkXI2EDwY@-@JWL!GLG>ZOBjLgn6RYW3BVgX3%Vz5HA!Z*drQj|Mx8${m8;kO$>e+Y z&En|Mba~n3@h$}5iw&8~z$D%XrAGH6-F}@-ua&KJ|9BmGUAHep)Li6vI(eJfS&*FA z>~`VZgVq{b>5?z~t;_RQ-j2ag{0cMskG7n;HB<^7!%3sR)v8E%j^<*|L;O&NkQ-!k z6pSr{-7MWalhL#QQ0Jc<(L20Ov~YIm37-TXSBbtdZSB7mCj`jN3cGiURTgwX_s}ZH zg+i#b)MRJPkHvkl{4R#2PX&85HN1hzhiQ#Od1Q2=#c=}rZ#74erIa$3QJQVHXG;#$ z7}A2deD^d_?*O-hR3E}iC|cUypqFcsBCY?wXXXj1Dpb%xR-*10p#5PDFSdK)^1JS7 z%5Atm{WwZ3QRa*wsn+f>Smm+~DM`~~0e?Bikz0Z>^! zKVlV~;4m_1r@4m^CUwuYP5fg$b#IQ|638k52mfMDf3Y@QV9fQrJkBc36gqUJPbyPQ zw72+ZjYYtpsKs)Bmy;4W>mE{=?o5mWpMVObB8#eH-~S;OSvmTPTc^Y$U~TS_RxCK%0don;NrZs;h`$70P%+ zSfZ^jhf>fdjA0F<;Ec*;>n;gYqm`%>y$ZYHKnx`t>JD0W{-r`jz6E#t-@o?nplgkR zE%o!dZ&CzT_bk+8*~OCAm!1JQ{j?+e=9w+v4{$%SwDX%n=aUzQS!HLb&}XpNC9NsL zDrPvH?FQ=JC~?>>gE%p;46QX9Wq*F}fs*yFm|BJurch-^663qdXCS1~+d>1m#Rp%_ z(CE9dw!XBf)R54h_#`~Hi&F&F^+Vx-xe3RdiseH41(a%l9m@qF2pBZ?&s)3rySEi- z`BA=?J`YD^0wQNg0+32I_7%ZOggzCFTcbd+n7hzCP})4i4+I=VIoD_|6NBm?OT)(R zhK2ESH3zSZ@PhwMV|*D{fV0*vvqn_vjT8`u@2L(&f^-myho8Gj7ZfaVvd~J z@<=l78|JFqU^Z0Ym+?ezWO=NEEHbt6E z#GQfMM5(aN|FjMB!63*~9I6p7iiFJMc2mPx{fKr@EJZ?fQkg;^w@p^zx)@gVDn7#3 z$(ZE-??C%@QlEG^<6lfd0}kjG^_jdX8J%kr7PC7%Ah=wyr}3|lcUW;T zaTfr4U$5aH^Hkl1#C7%UZ|Bapf>Zj%vOxRcjS5I_i^!~yHF3)%h9FUUHp!WPo4~MJ zZifo2gGV4jaiZ^HyzD|=ZJfsp; zu|vDi+vOiIxce~|AF`!_%9pel@c0p4em4#fzqd$%2PmK|r^3UOAL+$HY|ScZ%sGwg zScYEf&dg+v@v6oKBDEx};B)l2eBFY3qs}kk%g>c%6RRm$RsNgH{YLtWkl+e_TfOwI z7D8yhyKc$(5P4Adpc&SOB9R1MG-dA47-s@aNL&p?Y-4CnLfQRxh$IU(% zd-9=hU?68m*d*qXY+~co4naJ{>s&WwUhd2~>;rBz`msgzNH%_&t=2h)a`ZC{VcC9u zWVbnSfX&3Y%lRLTL?&=lW;gsGSg(z@(Fb!M?(P))DIRJGhBQ5gTK>&U z)BY@}dWfDM=?c#A^j;m;?pr{mX1ZX}(C6R##dkjepF~SXm2;os88w2gCEq(f@qWoM zZ~jo=vZoo5(d=?jK63pzOPq$KAKeaovm;y5p-Vn+6J54gW_~*M=2FVAOeE(w z;8IL(;hYFg7q%8%m(Tqn3g4-onqj3Tj=4950_RPS*9HRx|JQEAWClfPGvZGK;14Yv?Pr~-@|1h2n z0E5vs%VUzUEcUoZQ#`NJ?+2Bz#xz|6rL-N45&frv3!rYShRa-)167}?IDnd(-maax zV96x$)Zs%POU_h_s^F0W8&;NB&J*X*iz(n&L6mcSG4&S~PKvA}_$CmVeL30@a908d z=Y1kX5{C^pgK1zB$HZolm-ID*v^1W7&I2knKn}k zKK9oh%E}oUn7eTV0MZcBJm166e2ZpWr>SY1?>h`HcUkJ=;7lp1?s(PjAX0?h$i*5n z7iJ2;W;i6W5tT0M_>+dlnK$Z`4``Z;uX{Gt5#uIm5LfcSS=s;m3g*w@CZaptmV3-~ zNl_E=51m zZS+!#XCqGEq(#CvjYpz>_|Dq_{(sl>{(6gO+7jd=jW)#bVY0jdo1~h@Sl|1nC3qV) zq?z5Mp8Zx7aDsjq#b}RYNS2S9g`rKl9U?$2!A|wkUxynt&9=BQMbSz{n4eZ=e56E} ziY8zfftGCz%`EyQm&$r?vuXCXJ}Dh%DuCo1;(+4O62o!Ut$82Z~{D%`S8L*3-4*EarS+ z)R2f3kV1B@Mx_+ZVsv3tLw#4NTfk3hK~YH+*s0*_?e8UR)dH3I$VWmf z<-_wW?6#YbLlI1p-h2DJBRs>ZR=Fx~9+&|6#(0qY<50z`iVkbSxyq16$dBcfPK_p2 zxa}$hm#tu4EqjzgN5o+*nKd%B%Ch|z1O35ppB&oS$!k`Y>0ylGr;^>@xxXW~n{BAB zr0H+}sm(-#1D7Yc6fRw@Rfcy-#L9G*n&{Xgs;JyA=4Z&k)cDQSTc_}mO;V$!l~8_D+KuW;C@20MAB$53RMpzJcK`pi&WllgJ1hrr;X8D#KI5QJPGUv5dM7I0P}BH z8})Qin_zw)`XBUg|8aXSk+{ypZw(^+29!g7@OHxIY-JB`)YWp2+(v`0?I8%lG~V09 zL^JC;MR<1<_`h4-V5Vg-;3-wP9jPj5Rxgi>T6oQ$zn}`2f2fs~1k`y`c5f_3ty`OM zdJs&ZB_4)4O6R3#8G`XtqlGb^22SEKw;rDZ3%hVa!`tzfd2 zM=?bpQuIEXZm~9}U}r_P!`M!moT-R$`3w=ZHbEC$3MUwVayCGegK(WnoAfmjK3%Hy zINz4R&9;t6-N8jU#V8=4LB25Ai`O@6%!{T*bEf_?;EE#vt*I4w(o(Ra{0>kJTQAUAiscY=|ThtEwR?-!_!U%RZVhQ^J4m|C|y7-q(ly+A`Ti__V zxCaUpECKQbgfl=fM2`mh3w1{z@mnejQcV)zWF~ru|5nPeK=CTGn0>xrEJ9g*#o*$Qq!mt*poF{QdoN5tEbbYIp~9b902`zOVwq+Q4u0eS^oH+X>~7ij{uM*mGBBp26Z+q3(xOWl zrGe0_gyr`mF=M^dzF%;{Md5UCu=!v>M68L85NZ`=U7XxEW^g6Bhm|yOPyo$Y_0lCi z+V`uHV2F6mExNZnK=d06w^80LuKTz~)=)j9@^c)xOp5+>XOC@cddsae zTOSXuRoKnV4>UVDItTHq8=%SNjPl9cMZpG(b^F_B zY%*(MV2~e>QC5i_?w>gm#>hnGz}Ny04l@K%Urm-ja)~5hVA%Vt?5zoaVS#B!aJ)cM z#u11iWr1;Z6d3kj*$@DbYo|%)w|RzUj*u->Chlq4E_x4q%`o4Fl^)_FS4O)8!)#uz z!+8IV1F&DOo3vzRw`Gi|jsx_+G*TU-8Mc71ER0&hB%9v%mOGt)+!804YIE1nG&{5K z!ET|>6xakZa#sZTTuz^Qo7T<-jAJk@7~pjS_eo3y*{v2(AGQ=hl@#19!0cfVB>bSy=h)t1s`{hnr`xYQK{iFLD>(?W|>X=5ve? z@<3MbFGh$K8fiCzOIuuU6S#YFWMFGEnOqM13x--ZF6-A?V0HGKnT0((jCjpa*)}RR zN;l)!?v2x)xqWs1@2jU-BB=Pg-y2P~YSR%h=8nfQH&xdSZ2O9g(_cpI1^7;yBKu|_ zB30ZTx!WUQsjDm-SL=dssa1YCd^~w%Y{GGI-R|_!KsT_!4rxqk^k9pPLQPi)E_0`J zvtaFueeg|FWYZAtPm^9q*s=GvHXmECR2<&ktC-Ix0YRYg-4o9YZ~Pvv*92G`jWj|m z;erS_hcoOV(G$BAB}nNg(W(KG&O=x_Qo!qVa>r8D9hVy5%}=5P6wRoV1(UuXHkoCg zFarX|t&urU#+AWzvl?RIN3J07cbweMncd4$P{aqKA&bRD&t;dk;;?YyUqnG~rUH6Cj!ZRm`T9%pu43(`d|=a zW0MrbavZSpwq`o2{P#5a5s#hWTWcCL25vK~?GB)ues`!h^N9(T$3;3%*!nJgwDL2j z&!FxuJDOOlJ)h!uCU|(ScbrkuEfegcdaNC?_t*qfc?yTrK}+(yGhQeO2j=W&Eo~xZ zG!PUxpaR=3^>sdLe*g1wfbaQ>&kchr#*CK+E;xy=!{TYlxAVi`w;0ki2Y>D!wBC=% zu1{hQsXQ($_DRA|Y#L;z(L%ZvTPd2GHNh=w{2(~y@Y1r^sQM;Jc6N9YiZFq#Z4<&? z(e8Z+XHsJqUFv{gbF?xjWiD&;?&{c*8ls2MB_itaeoZwy1j|6Iuw)&n%CJ>6+z!yo zFP1v`y$MAHx`%dz9&UZ2pBV;9{QKF;Ekf+KZoqgO!v4=Mo)}a0QZPel=j9Wy$`tIj zzLTEkLDujq35${gL7m)>?lVSM>f*da!K~;0M|)z+M!OmLqOR; zJ`)fxh>$G(JND-0!>amk_w$oGtr~8yPHp(_-*Lus2SUKt?K#}tm2(0r9vVf%+>aOv z_DIIbVRxcZeVj?ayXuJ9hLDul$fwJ*`C&P`$I{K1`kKv?M5$d50B+eu{`&SaaTMOz z=j)N^IM&X%Eegx_M|>eD{td4fi+UTon0Wxs%2`yNJq{?pwpA04sLjJwj4e9Km7`E7f(ha17zpd<~s~`V$T)rln|| z6HI5pW9qUdEhh}Z`T=0xPZ0&VH>a(6FNdc$y@e*vzr+=}{*VfifmP^#=;5Efyo90e z1-U>&R!vKsn-U}U(QkKchxL)X5RvF($-MQ8|Cw=}EEz)Cz5pwzECa<>9HlC?(~Hbi zmWL=cD}Dl#@M6eU;FOAwZf&oLT9?1`AQ?aLfv2lXK^K7<_p2vw9PXdQpp*_CKZKvId{?(o*T&|;?m#59=TL+U>s);{sRpCwCZui3h z!$1{!$G1TK{PhcjLgMg2Yiy38^iMt4%pr~HvQHBw!MlLV7l*$8NNRC341sNbixk_X zBtRcBBTaS>md%a$^40m1Pk(d9FE=f!Hh0BUvxbTYpX24mXCq6n-oqTmP7(wS-QS!S zaw*Y~?jdh=!rVLRzv`HI?16H=AKGfQ-`=KoGgu1%z~>wd>jp<3;S1?*T{X>SJdYA+ zv*Mnji5+zP)k{Je6k}7bHg3|XkQ)Svn8W!z;{71jOsCOSlxQ)e3sLks~H z3?Q@_dmVPY#cM>r#%?W_>G#X?X7nRW^~!h*bCT9{2w+13&QNJrk!~R~qESHtak(h! z2cy>Kf{bL9%IaQ={xD1N9fOlRU=!h=WBYY2PXcAG%&$aQs5{Geqy6)iCS&2NSu<&;2A^-NNKE!TSI{nd@Q>fG zm1J;HSmK~veDl9!__3vgK=fYpX>XhRbRKPx-ovuHxUy!qul6eBX+RT2#_*v3HErBJ zhX$Mu?DEDx6&EE&$?A9ioU=8gt7<>=21`+qf0}*)`c41It=@jKJ%q> z;8Fv)zIHkz_o4#{KP9&d*Y^@2OdZcqD7N!k%P_%}22^V{iQAH+gdPSuZan%pXk zQPi5(-izK6f7;ic4b0MY^0WM(pW=){o2uA5TkD74>xCc)ma3K|7ji6J1x`GZx#*Q^ z*p!+=va6ET$!3~~?F{QZF>Wua+6de-8|ly=Jt1G_Ad9zj3j;VSQ5-cb8ep{%a4&`? z5H;7wG}gbtZMQ?UX(yyF&^*s=@rBa?+>@R_#q7i(au?_jCcDuZ0eF5!1H=(JPzLn( z6dc(*gW`ywr&}b9EG~`5@d0%`DjohIEq+;x8$8Sq0qPVu37x+cN^|Mb+Rb4~hM~qf z3zd9^KuoF9{S#a5mVjsgf+}1COg`+aGb$OvTjJoD%@HeD8W+lht3q2Y^vLu1p+d=- zUYf&>{5Mq<{~MD10OHTgEvGnk_%2;|Go|+Jj<<$t8=-)}2TJ85pcmwjv-lGHkO$t~ z$VeeLU+1>=uj&gHC*y#!`~FnWmZP8}`ABKzO&5YO6sOqu^M%6}SXQM6PCmJBgt~?DQt&Le{uCwtgT@8c0SN(AS~= z*)b85y9u$o0GPrBapXq|9<4#4)GCRF*2)+t7isNd>B_~3W@J!{*;1d%$@V#s?pLnO zRKb1F^q6qIZM*Sfph)|8!L)z|Kx$ew{EiyhT5cvgUU$&ydLsNAp)_3pH6c8VfL1iq zm29YF$spFZ5F+y>zAsH##=xGy$?BK`(U7-TlbrHGKpzoB9*y*>SY00r@}-0BAsu>f;0HkTyNg!w>P=){$? z;<@b9NjLL*%K8x66h4h1x9Y0e%^wT5=d= zvXz@P9`hQEaehv>5%Z%)eJ~YCE|My#)W)Cj1mjAf#5OPBDiTFvw0MS}(ohXO+}UOg z`~nAKK{E6-LH2~9x28K7r5u>Fq4rZV3HVkn!=3RhS)+w^)T#s#CIUW{UKj0ekY0cO zQBBc5xc`!we`-`49WEVsulpP{lNyPSl4o9VcGl|7pi`emYGvSq524^R@4Q)>xUp1w zIvaP}<;7&>-zi@0Oai^UhNGP73E3W;@sZ<)8N-Z2lQ7cB5I5g{C4k`RV3{sZjzNFJ z)-ok(gxWrcrQo3%iBWdjMagHKS@f!6*L)uQ*J$Syg_#f;>l8qAVDotwNqWZMX%I^7 z+FU_+@4@4oRlD1JuM9r`C^!Hw@q{x;6}i0e#%6i2RNI4Wbo7Zg4&tHS-WektsYHy_ z5WmJR2&C_ri+#sBg#c1_Kh^HL|7J1^X2P(M$eMCO(W;TaBXx2j5;rks>L&$IcYlA1~kO3s5+z%Y4` zicV&fW}ZSSO(}w`t$)jh%PGt7^D*h`6MOWLM&4;?V&_-fJ2pa%nVEH#VV>-!$2!J> z&R|8~eX*luQ{aVQFDYO!(QdbbzLfMHlNw)o^eRI6as2uOMr(EqhXy*M>Kz{NhPiK| z<&}XzAt9%^fSZl0K}x0N;Ei+Niueoj)K+~cKZ+f)vy7SWy&-H0&w6OtYw#9fEhNqc z0Er|62++_{HUhnAIg*Fp7#5K|z5ge?PCKS(8*x7WnVI+vK^ZD98;g&bCNbL9fGsOX zU-^xyLDl7%t&nrc`@8X|pIdYL^p0Vnvd?({r{4fkc>s3*i0f&0eyX*?j_{@lY#`sb z#JIyNF-HJ~&*pGY)!L;(w}aw4A@)|DLiv80N7fP+QrNp=+%R?DG3gj42HYR{U-8Wf z9uvT+=;!pYngg}ZzIW~IBg>7wezSH6q{_%UnPq?Yw8sYHW9D9%F;}gtz>-9HZ(-0= zK=I?+lxNX9TWrFSt^ol(Ixck2;tEz95S9R<2FOKcbZlvhPAw}4LYp}zCH z`CfAPa5y}$@{OSlDITIpx9dTv9!PoOPZt@aTou6KV8HVTN~8cTWFG#}`h7MoIP^PD zzZlT1`@nnUDrFbln_|qJT)*Y^!DVB|YXeQgfsK*WrV{!LM?y(qapQZd)9ys|Zb8jA z%pn{Hp8gAfWO)v?tDQnC32lF&Wcy}u*Lw-BhSZ>EZrNTDA_;k;10pwq9ff-(s^AJH zoR?qWjU`&Smw9_mI?w{`xS$x>M(>ZBqMch;AX5x#SS zolFu{w>fmMgsKD*HbBT1B8`1g`Y`nUeXEwcVuh&c9%Yz;e2{#e!|?aFuLPiGpkOG% zT}^zJm@H>%wc(vk+b^=Jw+Uuwh?oMYhn@kfhx}UJ4f4;8lLWC)_$^6$@~x6y{ndlB zOgbYeq=4y$DzDm^zg&jQs%GicH59v#dyg_yDVc<6auzt%Ls@W*$3 z&4?gUB^6H#!rr={h`6ew)@7*E6y*AEDm%Zym+apZes4rkn1^9D9S~-h%-#FIM8MCX z=U2RV%Mt<~{lAO+p{xFfpY%B2G?F)W{!i*n^>7{c#9{WlmXNudx{%6=O;b>+N|*oX zbJ+X;%h&>*k1Dq99rMs;}^~amj(VYeBf9%-a}!_40iblMFxNX E0HyKO%>V!Z diff --git a/src/ImageProcessorConsole/images/output/Tl4Yb.gif.REMOVED.git-id b/src/ImageProcessorConsole/images/output/Tl4Yb.gif.REMOVED.git-id deleted file mode 100644 index 6515d65a0..000000000 --- a/src/ImageProcessorConsole/images/output/Tl4Yb.gif.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -fdc62fc2d056ab885eb9e8fd12b9155ee86d7c43 \ No newline at end of file diff --git a/src/ImageProcessorConsole/images/output/circle.webp b/src/ImageProcessorConsole/images/output/circle.webp deleted file mode 100644 index ef0281087a99eab7de16954d2dfa362028c4127a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1228 zcmV;-1T*_mNk&G*1ONb6MM6+kP&il$0000G0002T0074T06|PpNZA7b00FnApluuJ zlJV!=%M>kRI3)5i{4Ayzc?jA9AQ_Ua zIJRxuwr$(CZQHhO+qi2Ze&~89qFy(m|B3AXv!gB9r0?WayN+GBarfS>E2j>upEsm! zl{^S+(Uz0;-u<1J`o3Yr(^eOPfBtopxZ4EowQf-)b}YPm|Devs+%TS!Mx}ElVY`ZAkE+2l=XT1y ztq;eXdnx$2A^dXeq2!l(u-in@x0PYGn6ghwz-knQ&*yv$?}fKS z+XyDJDF3JcESe-ze+?Y++@V2QTNuow#p8UCuNqB{Igmd{lc>rNZ=Ft;9T2}no0JBS z?nkiJZ#l!g#)lS!xD5I#by*vgQto_Cs_F?S7Vk zWPuO#8vx0+G~5lzWi)(W0E#zgn9&@9Wuxgh6@oozc@%;RX!#-+^iI$+sRrb7KBH$h z$W@4?=M2cTrs+1w^{43>$jzYX(;QG+L(|Viptgsmf0TpTahfL7fZ9cxX4Hq;O}aLL z+FiP~fZ9E}wt(6#x;BH_Rk}8U+8LUr)PmYUnnqWG+9sNQFA23pG<}^1Y9nZR4RW1n zx*u|NQt7!2as@xrb1?L-(K53s^fu7)dr{~Or{xt0)=i<~N(knCMaSMy+(W~tGEf{s z!wZlsA49+C&^$}KsSWK)2`@ zIt_;MY#Kew3*}XYHpCzIMo;Io9%&x*n5D24y152vDcD4W&;Ugcg=btK$sf1>6L_%-}W z#kp{7^pSdV;92uI#WE(swd{3D#SVgR!F?3^&BFwvfphU*XT(B>DhyrhV zAqd01GSb^hArKXIq%o2Yx+5U%E-_-?rsYFe2Hs^v{#a2C!O1=N2DAL@(h3MumqRhk z%KMW_BV5&H-pypzeA(VHCj!@e@y$5?-*-Fv6hjcJ4&8b;n*TB7&GG3i3L>QCJ4{%2 z;^D{N@frLxIqKWAy^C* zFuBMUSY7ZNV#olQj71_P%e@SX^TZ1*D&RS5jkJsPVmKGF6U00VE9#KY@1_7^gu3sVvM8B8y)i qMWUyzLkvUQ?iiyX>+LP4G&gQGqev8-o4qC3!qqv0UQ?*30000XdQ!pw diff --git a/src/ImageProcessorConsole/images/output/nLpfllv.gif.REMOVED.git-id b/src/ImageProcessorConsole/images/output/nLpfllv.gif.REMOVED.git-id deleted file mode 100644 index 4487aede0..000000000 --- a/src/ImageProcessorConsole/images/output/nLpfllv.gif.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -23a1c81a2d1422076373796e0c47f5d968c56d0b \ No newline at end of file diff --git a/src/ImageProcessorConsole/images/output/rotate.webp b/src/ImageProcessorConsole/images/output/rotate.webp index ca786888a0deb517cac3db1fb29b03564a0fec4c..3cc93f14973b480cd6270b3d3ec61cf86e4d1135 100644 GIT binary patch literal 1792 zcmV+b2mkm|Nk&Ha1^@t8MM6+kP&gp$1^@tXIRKpjD#!qq06&?;)nmCaE2gKltXm*6 z31e&3Uwu12@pYUxv9tO^7{%9@PvE<2^^K}ds+-BwTc0X#mf*8Q{BXhf@1XP21ha1R z&Rhz&J9QJ2A;I9vUTk}jXc0*$)MGHQ!ux{>7s0Dtz&iMx*kP7=iItI-3&0o3zwObg z8_ppO(=Y$faA}3B6kojQ$6C8EehUcJw931$(x79qDo1Ytw_oR@zs>ZqdwjO3N1!*2~%@-NGseIwdLi1P&3MFoq>u5CP3DvH;DZ-I&&sq3( z{x_j|hX)ifOq1Jy9~l;nGgBJ116yt7z`;#Qi;+b7$BT`7O~eVszvf+|FZLDw zIy)o?2Yp(phIpGohOIuB? zz9=607mv;5u?+a5EeZNhZf@9Q${?VOkPlD*{_4|e>1V71-|eAqPE$~ERYSt+m1AIT zhm0~^-!yp>E0gMb<>c2@NoXr!4LaEq$q1Cs8~$k_w$ylGf%f*MMb;=u?h|yohgG7u zTVlEktFqDtuD=zI2aIrkO(jwF*#ho~gUCm4ALf_R)d|NH7F+{-!}O{=$w_V5cLvt> zIUN{qiTPjt-c&J-gffM(&YJm1JZ{cQcH>S@z4WW*q!_g+=r?bbV-RHc}5`w$KOChyv+$kHY{rSHNpJn`i zWerg3EJO1wO{pi97q;@1$zcTWMEHBa%mH;cmm0)A&`V!mA&x~>+Qd-fG#5p4SwM1= zlT+e@1bnNVgEJryk{Ki&S@VVRQN;r@YtL#nYHXsM{Z)XLg9FU{CB|6c46M0N1d`@+ z-%O%3s;g0MPn?!6^P{I?sn2!Wm$f$gMs0KYWrYo`MqRpP73J0x9|x!=qd=7^(V{3X zzt55@sMAREviL*vaa!Q5%Y>sNXV%hFIl$8HbOUx-2UY#TudV4gQB>WlFQ*jln%%;| zlcP8&9T_z}569gAM#NGVM@9kD@KFL;3HDY^Fct)|b8$}36eEaLr1Fr`SPehOX7$bM zk*#fp7q!vaeUTcELM8*c{KHYQtCxRT)nNB2vCqx+st{p#Dp&(@x<5~jS~7}s$OysJ z?3#SPQCkjNlUZ)Y5B1tee@G@sP14ZTNu6B;>f--vn_VHZb$Q-M?CbbQ|!)~$vizpd5@=wfOEREJAp z0=Y0oE{tfJkZX8%D@1VtdXdAJDfu=2@=K%sj=dbN#D^mE%-P%;({98>ETYIbsNczsI}smAxL7ce~*5O#-?`kkydByfj4yei&98MmCg9L zo;hlP;TW72pv?Uox)CIGznIRgGr4JujuRA0*fs zRMvzUsFnPzPF-`hqmb$pccCzP=qjyhz@E)WG+{*rxt)T^y(_UeSIx^rsik@A!lB}n z)~jFLizqLj z2j?bUqQ?T2*2jh}yzlpEIjSoxT)Rjx7~>G)Biz~Ra>qijP)vS066>1xueUlYYu`9O zPsV{r1V*~Up%V4uS!2yf!@Af9VMf-b66nIW{3a}by5P<;>lyOBaNS1KwMqGd(uDt? zR-4L891vax=5EYl?D5O3#k}t4sX5RI*=7}%(@N2p#R{pnu!s$sKt|nCJr1c&JNfNr zPz2zG^)gC(i`Q;EM1U|THwE89-JD&(c)+Nh9N&Y2r_h^Wad_9>&Dm0h&3}W}FcVU0 ih!#}2)=Tn&I3iC4$Tqk!@#W|b_ISadJzM0~4*&oTZ-5p6 literal 1812 zcmV+v2kZD!Nk&Et2LJ$9MM6+kP&gm}2LJ$YHvpXhD#!qq06&?+*JU{{Dyb*6D7?ZXOJ~Jb@>@|KXOp0)kn(YZMY@XYT;)oYvHGCn zBmNPiq9qO5PqjX6WPi#}wR>w-(GvdQ_tN(ftl;WgB|{KzN_Tdc%RPkyK&u%ZQpxS= z+mj1Ae%9A0ooFtoVmIcM(?ebPkS<21zi`Q6O(h5T$u7hCWKr~?4wgKx5L^-{o2#$0 zu#bHwtOeQdwi-`UbASZ+(&uht6K?0$*aXKw+2?ZnXAPaH=1PQxO6XWWwl-iEk(I9; zwVG(^8x=ely=UppHR2$_-}P(k$pAsI@dc}uE4S*i+O`3VnDjAVUH#KND#PyAPKdSK z+2a`UX(|57^XYTYE~U|)Gt!4_d(l16=HTq>lRVI!|CKPiNn$Uefk%;Med0o3N ze(Ed2WlAyVH>ofH{@Oo9^9FYkV=X+JbsaR`wUb(b1QvP?F)iS6&Tw%qhW*cHB@@S| zdp=gkhGe{Bf#0;TBF4g&*n1**HcVI`8XbkloPPdgu@_}DdqAWpO0CR2JdB7x6DeAi zFGMg&VRyktJC{HBX7PPqBwU1W-Kf0a5P*B&>cX(7!>~UWoH1oEaL{i1{jdg=be-SK z_k~ar8_zfn?7kUK=RH&WoN4CB#Xt3LNg?aaf`HwlxP2bkB9Z)4Ez7+)P}U7f zPbMqM2vfxHsiDhd;KDYT#eoG&Ubq zkkAqnn)@#~#+uI;mLurWCNv1te+g05UsP}&6NT=zUGP^ULHc3PTOp50=y=f~` zY9N6W1`Qlj`h(Kz*!*|279Pp)lY1Nb5&J8n{aYtWHl6t>g*?YQj&`$+YSKrJ%?}75 z&HEfes6VvB$ZIaFl zON->0oBPA420(KdA%HFPtH)La@Nv*1DOU#&Cf})aP#9oV%E4HYFv53?i!C-narKpT z2pTJhVmRQX9yMR+q42$j_*N#)I6@)oM{FEVwyB@R!H%pMj`h25%v6|)#O_yifg&6y zNCy{2RCQeL|5LQ#G&A#eIidLmUr}@=6trBDhMPnBn88b?3azH=O8irEpzR6XtchUV zG3gn*LeD16Yt&kngei6I1P3P4Gyu$9j{A#8sV2oH+sXNmZ>tv=6N~QmZ2h zIgaF_{}_L4q4ZFzWe2Rc_GV}ZsjmKLW6Ne8+eKA zc7Y@^YFo+C%La$f@n_4=Bo_uF@I1X)+5DzD&laaTJ1eX{N*zI--k9IeNNzX@sam&b zhET9}=_GA9{w`5UaE<{0*5Mt3Fz$y)dHXk+h>L_w&+ounrmM#DhfV(<{xIxvAON`0PWdwPXOr_OsD)afKc$7<6X9bu|77Jltyi)bz`F#SWZ*f zq-!Oh*9SXGpka*!(LqfM<#?Br{EvCkZ3SXwHMFB zXe%=ZfjbB&bqI}S;)}dr?`>;`>xl>gnLH?(wV5%7fa{7)a#s_4ow zV}tSF+IwcI<55GH@~G@teR=r9I4fiUPPp7@tUO7Nt%U8&!g(0&lb#DnSw z4FL^p`m+dfGvlUu&cC@2Oj6<@Ojw-Zxs2Z%yGSVBI`x80001L Cv3s)s diff --git a/src/ImageProcessorConsole/images/output/test.webp b/src/ImageProcessorConsole/images/output/test.webp deleted file mode 100644 index 549fb9c6bfaba16b8249fc25324416aa3bfa02cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5590 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