diff options
Diffstat (limited to 'contrib/ffmpeg/tests')
-rw-r--r-- | contrib/ffmpeg/tests/Makefile | 33 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/audiogen.c | 19 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/ffmpeg.regression.ref | 128 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/ffserver.regression.ref | 20 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/lena.pnm | 2 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/libav.regression.ref | 51 | ||||
-rwxr-xr-x | contrib/ffmpeg/tests/regression.sh | 367 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/rotozoom.c | 21 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/rotozoom.regression.ref | 128 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/seek_test.c | 91 | ||||
-rwxr-xr-x | contrib/ffmpeg/tests/seek_test.sh | 25 | ||||
-rwxr-xr-x | contrib/ffmpeg/tests/server-regression.sh | 18 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/test.conf | 7 | ||||
-rw-r--r-- | contrib/ffmpeg/tests/videogen.c | 19 |
14 files changed, 552 insertions, 377 deletions
diff --git a/contrib/ffmpeg/tests/Makefile b/contrib/ffmpeg/tests/Makefile index c4c6925f8..3417c687e 100644 --- a/contrib/ffmpeg/tests/Makefile +++ b/contrib/ffmpeg/tests/Makefile @@ -6,6 +6,7 @@ include ../config.mak VPATH=$(SRC_PATH_BARE)/tests SRC_DIR=$(SRC_PATH)/tests +BUILD_DIR=$(BUILD_ROOT)/tests CFLAGS=-O2 -Wall -g REFFILE1=$(SRC_DIR)/ffmpeg.regression.ref @@ -15,9 +16,15 @@ SERVER_REFFILE=$(SRC_DIR)/ffserver.regression.ref LIBAV_REFFILE=$(SRC_DIR)/libav.regression.ref -all fulltest test: codectest libavtest test-server +SEEK_REFFILE=$(SRC_DIR)/seek.regression.ref + +all fulltest test: codectest libavtest test-server: vsynth1/00.pgm asynth1.sw + @echo + @echo "Unfortunately ffserver is broken and therefore its regression" + @echo "test fails randomly. Treat the results accordingly." + @echo @$(SRC_DIR)/server-regression.sh $(SERVER_REFFILE) $(SRC_DIR)/test.conf # fast regression tests for all codecs @@ -36,15 +43,27 @@ libavtest: @echo endif +ifeq ($(CONFIG_SWSCALER),yes) +test-server codectest mpeg4 mpeg ac3 snow snowll libavtest: swscale_error +swscale_error: + @echo + @echo "This regression test is incompatible with --enable-swscaler." + @echo + @exit 1 +endif + +seektest: seek_test$(EXESUF) + @$(SRC_DIR)/seek_test.sh $(SEEK_REFFILE) + # video generation vsynth1/00.pgm: videogen$(EXESUF) @mkdir -p vsynth1 - ./videogen 'vsynth1/' + $(BUILD_DIR)/$< 'vsynth1/' vsynth2/00.pgm: rotozoom$(EXESUF) @mkdir -p vsynth2 - ./rotozoom 'vsynth2/' $(SRC_DIR)/lena.pnm + $(BUILD_DIR)/$< 'vsynth2/' $(SRC_DIR)/lena.pnm videogen$(EXESUF): videogen.c $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $< @@ -55,7 +74,7 @@ rotozoom$(EXESUF): rotozoom.c # audio generation asynth1.sw: audiogen$(EXESUF) - ./audiogen $@ + $(BUILD_DIR)/$< $@ audiogen$(EXESUF): audiogen.c $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $< @@ -63,6 +82,10 @@ audiogen$(EXESUF): audiogen.c tiny_psnr$(EXESUF): tiny_psnr.c $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $< +#FIXME cleanup shit below +seek_test$(EXESUF): seek_test.c + $(CC) $(LDFLAGS) $(CFLAGS) -DHAVE_AV_CONFIG_H -I.. -I$(SRC_PATH)/libavformat/ -I$(SRC_PATH)/libavcodec/ -I$(SRC_PATH)/libavutil/ -o $@ $< $(SRC_PATH)/libavformat/libavformat.a $(SRC_PATH)/libavcodec/libavcodec.a $(SRC_PATH)/libavutil/libavutil.a $(EXTRALIBS) + DSPDEPS = $(SRC_PATH)/libavcodec/i386/dsputil_mmx.c \ $(SRC_PATH)/libavcodec/i386/dsputil_mmx_avg.h \ $(SRC_PATH)/libavcodec/i386/dsputil_mmx_rnd.h \ @@ -87,5 +110,5 @@ distclean clean: rm -rf vsynth1 vsynth2 data rm -f asynth1.sw *~ audiogen$(EXESUF) videogen$(EXESUF) rotozoom$(EXESUF) tiny_psnr$(EXESUF) -.PHONY: all fulltest test codectest libavtest test-server +.PHONY: all fulltest test codectest libavtest test-server seektest .PHONY: mpeg4 mpeg ac3 snow snowll distclean clean diff --git a/contrib/ffmpeg/tests/audiogen.c b/contrib/ffmpeg/tests/audiogen.c index 31c437149..68ae13586 100644 --- a/contrib/ffmpeg/tests/audiogen.c +++ b/contrib/ffmpeg/tests/audiogen.c @@ -1,7 +1,26 @@ /* * Generates a synthetic stereo sound * NOTE: no floats are used to guaranty a bit exact output. + * + * Copyright (c) 2002 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + #include <stdlib.h> #include <stdio.h> diff --git a/contrib/ffmpeg/tests/ffmpeg.regression.ref b/contrib/ffmpeg/tests/ffmpeg.regression.ref index 9db847a1f..ae5355406 100644 --- a/contrib/ffmpeg/tests/ffmpeg.regression.ref +++ b/contrib/ffmpeg/tests/ffmpeg.regression.ref @@ -7,10 +7,10 @@ f3b008355f68394b6cad694f3488ea2b *./data/a-mpeg2.mpg 736978 ./data/a-mpeg2.mpg 9f364a477987c3b14412e303b94377ca *./data/out.yuv stddev: 7.68 PSNR:30.41 bytes:7602176 -1ed851cc079a7bc999e1cc2dc2aa146c *./data/a-mpeg2ivlc.mpg -727637 ./data/a-mpeg2ivlc.mpg -9f364a477987c3b14412e303b94377ca *./data/out.yuv -stddev: 7.68 PSNR:30.41 bytes:7602176 +1716f466ea82b4d90677868b2ce1f8e2 *./data/a-mpeg2ivlc-qprd.mpg +708232 ./data/a-mpeg2ivlc-qprd.mpg +40746946d5661606f7a649c62b6c4bee *./data/out.yuv +stddev: 12.21 PSNR:26.38 bytes:7602176 2566ea5760247a9485c8281cb52291a8 *./data/a-mpeg2.mpg 735853 ./data/a-mpeg2.mpg 55c22a09e4924977ee2cc4180078d3ae *./data/out.yuv @@ -19,17 +19,17 @@ stddev: 7.67 PSNR:30.42 bytes:7602176 749746 ./data/a-mpeg2i.mpg 5189af71e6aa96cc2f6452e7f6b29287 *./data/out.yuv stddev: 7.68 PSNR:30.41 bytes:7602176 -f2067ddbe91a90ef12d606bba91cb900 *./data/a-mpeg2thread.mpg -812667 ./data/a-mpeg2thread.mpg -f101d3844ea2e12ac38001718c519232 *./data/out.yuv -stddev: 7.63 PSNR:30.46 bytes:7602176 -fb900ca681fc054ed634ee4eadc9dc38 *./data/a-mpeg2threadivlc.mpg -803035 ./data/a-mpeg2threadivlc.mpg -f101d3844ea2e12ac38001718c519232 *./data/out.yuv -stddev: 7.63 PSNR:30.46 bytes:7602176 -fd5f3e2a81558213bdfb8a7c86b3f541 *./data/a-mpeg2reuse.mpg -2099878 ./data/a-mpeg2reuse.mpg -e7f8692982e6d339a1f64bde4c297e59 *./data/out.yuv +69576facff13d45171e3a6c53b8018c4 *./data/a-mpeg2thread.mpg +813459 ./data/a-mpeg2thread.mpg +c0e8cbde76ff8377494fe6843fd03e11 *./data/out.yuv +stddev: 7.63 PSNR:30.47 bytes:7602176 +17af99d1a7fc391242a809b0782263af *./data/a-mpeg2threadivlc.mpg +803833 ./data/a-mpeg2threadivlc.mpg +c0e8cbde76ff8377494fe6843fd03e11 *./data/out.yuv +stddev: 7.63 PSNR:30.47 bytes:7602176 +c8d8b07b5fa97e0affb4a52d4d30a2b6 *./data/a-mpeg2reuse.mpg +2102956 ./data/a-mpeg2reuse.mpg +75d3dfc8133f0122cb9e272a21bc8c5c *./data/out.yuv stddev: 7.67 PSNR:30.42 bytes:7602176 c83ae8d8f3e2b4506df58e6a2f7e3b2a *./data/a-msmpeg4v2.avi 636512 ./data/a-msmpeg4v2.avi @@ -67,22 +67,30 @@ stddev: 7.99 PSNR:30.06 bytes:7602176 7933744 ./data/a-huffyuv.avi 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv stddev: 0.00 PSNR:99.99 bytes:7602176 -5f35533ff4357e405971466ee06375db *./data/a-mpeg4-rc.avi -814102 ./data/a-mpeg4-rc.avi -2cc2a0b6699d861b4cffad28a704067b *./data/out.yuv -stddev: 10.41 PSNR:27.76 bytes:7602176 +b27e911f1563455700c93e6ae39715ca *./data/a-mpeg4-rc.avi +813988 ./data/a-mpeg4-rc.avi +f57311745de96b6551c175679b138efc *./data/out.yuv +stddev: 10.40 PSNR:27.78 bytes:7602176 85e2456a673041d528b242d78318fb65 *./data/a-mpeg4-adv.avi 600188 ./data/a-mpeg4-adv.avi 60edc5a67271e425d0a2a52981895b81 *./data/out.yuv stddev: 10.25 PSNR:27.91 bytes:7602176 -c429ad61139904f03a211ba2bdf4cf01 *./data/a-mpeg4-thread.avi -761308 ./data/a-mpeg4-thread.avi -cd5bb5cbd9a7ea0953825482d2990f5a *./data/out.yuv -stddev: 12.31 PSNR:26.31 bytes:7602176 -339c0dd9f30afa33a6f7134f84d5b60a *./data/a-mpeg4-Q.avi -878910 ./data/a-mpeg4-Q.avi -83b3cef07c91a397c63bc4bc45df667f *./data/out.yuv +d099307d14c1a4daa145618ca0522888 *./data/a-mpeg4-qprd.avi +657996 ./data/a-mpeg4-qprd.avi +8a52c562082bad78cabb40ffa292ceec *./data/out.yuv +stddev: 12.12 PSNR:26.44 bytes:7602176 +9192b10ae298ba325d53abf7b5b91ba3 *./data/a-mpeg4-adap.avi +400650 ./data/a-mpeg4-adap.avi +0ce1d1fbebc9e9178e1a1d4a32a5804c *./data/out.yuv +stddev: 14.66 PSNR:24.80 bytes:7602176 +41b27141442f773eca9ef3d48d8d555a *./data/a-mpeg4-Q.avi +878264 ./data/a-mpeg4-Q.avi +8995abbcc97ed4767fcbc0bf46accd01 *./data/out.yuv stddev: 5.61 PSNR:33.13 bytes:7602176 +5fff534f0b958547dfdb811d4f289931 *./data/a-mpeg4-thread.avi +761170 ./data/a-mpeg4-thread.avi +fe1d119938f8a26174b38eeaa18dff85 *./data/out.yuv +stddev: 12.31 PSNR:26.31 bytes:7602176 c1dae02bddd79790266bc0a9f7d6eb0e *./data/a-mpeg4-PSP.mp4 406449 ./data/a-mpeg4-PSP.mp4 7315281e07830456208dff61337c982b *./data/a-error-mpeg4-adv.avi @@ -93,9 +101,9 @@ b699b2fd005571dda3f8d34cb0ce7aec *./data/a-mpeg4-nr.avi 688676 ./data/a-mpeg4-nr.avi 2c16e13b1367022d52b0e75d93a734ba *./data/out.yuv stddev: 7.02 PSNR:31.18 bytes:7602176 -215cd567b5001181c24128e535cf77b0 *./data/a-mpeg1b.mpg -1026948 ./data/a-mpeg1b.mpg -1ee27511d22a4a553cac2ca64a79f2e1 *./data/out.yuv +225ab004f6ac16e5ade3b453f45b9d96 *./data/a-mpeg1b.mpg +1026429 ./data/a-mpeg1b.mpg +dd9a471c6b2d1004a90e42f34707becf *./data/out.yuv stddev: 6.34 PSNR:32.07 bytes:7602176 2f9cb2ede35f7d12f6b518c50e20d81c *./data/a-mjpeg.avi 1567580 ./data/a-mjpeg.avi @@ -105,8 +113,8 @@ stddev: 7.93 PSNR:30.13 bytes:7602176 6264498 ./data/a-ljpeg.avi 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv stddev: 0.00 PSNR:99.99 bytes:7602176 -8b9359781a7e87d09af1b1c9a536cb75 *./data/a-jpegls.avi -9086694 ./data/a-jpegls.avi +dca9d700da7857217408c310c501b9bc *./data/a-jpegls.avi +9086676 ./data/a-jpegls.avi 0f8637e9b861230aff9894825af83720 *./data/out.yuv stddev: 2.84 PSNR:39.04 bytes:7602176 7eee6367442884321e27d15a26bc032a *./data/a-rv10.rm @@ -125,30 +133,30 @@ stddev: 20.00 PSNR:22.10 bytes:7602176 1454536 ./data/a-asv2.avi 0b310840a6d3970595983491687669df *./data/out.yuv stddev: 18.82 PSNR:22.63 bytes:7602176 -4478bd22d09ae383b5cff05100437727 *./data/a-flv.flv -649017 ./data/a-flv.flv +cbdb25fe5bb6a895baf9799b8ccb3038 *./data/a-flv.flv +649040 ./data/a-flv.flv 40281942d6ee254f7d3027b8593b19be *./data/out.yuv stddev: 8.06 PSNR:29.99 bytes:7602176 f8f51fa737add17f7fecaefa118b57ed *./data/a-ffv1.avi 2654678 ./data/a-ffv1.avi 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv stddev: 0.00 PSNR:99.99 bytes:7602176 -b12ff53580cd8a9ce92ab7a0649e99f9 *./data/a-snow.avi -155948 ./data/a-snow.avi -b3feb1bf17bb4e720da1f1e8b4da4c03 *./data/out.yuv -stddev: 23.19 PSNR:20.81 bytes:7602176 -265c4e0c45b2313817fa4d86dccbe6ba *./data/a-snow53.avi -3519574 ./data/a-snow53.avi +9078723c943de5d79490f54b99e6ea9e *./data/a-snow.avi +156656 ./data/a-snow.avi +f2932084b52e2ede167c9ba21eae0656 *./data/out.yuv +stddev: 23.14 PSNR:20.83 bytes:7602176 +ba999e86070aa971376e7f317a022c37 *./data/a-snow53.avi +3519486 ./data/a-snow53.avi 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv stddev: 0.00 PSNR:99.99 bytes:7602176 -2fcbcdc63816e1321bf4b6b5380338d2 *./data/a-dv.dv +c299f64c3e85b928c5bfe71629cee006 *./data/a-dv.dv 7200000 ./data/a-dv.dv -c2082cd8adf417c4ebc32654e446cba1 *./data/out.yuv -stddev: 8.86 PSNR:29.17 bytes:7602176 -4f71942eb699bf3b12508a9e777a319f *./data/a-dv.dv +3b9ead854b912e43ead976e4e86aab3b *./data/out.yuv +stddev: 8.91 PSNR:29.12 bytes:7602176 +70dc9a58345e603094dedcac71e2dcd2 *./data/a-dv.dv 14400000 ./data/a-dv.dv -fc866b8879a34f5b440647e5135e4bfb *./data/out.yuv -stddev: 8.45 PSNR:29.58 bytes:7602176 +d727da8c7ce387ebe68845a1be916ee3 *./data/out.yuv +stddev: 8.50 PSNR:29.52 bytes:7602176 6860534864cad0de4b1af9f987aaf9bf *./data/a-svq1.mov 1365791 ./data/a-svq1.mov fb0a97094a89d6f379535f615783d00c *./data/out.yuv @@ -158,25 +166,33 @@ stddev: 10.98 PSNR:27.30 bytes:7602176 83f8df5d5f84480566af548bb037fceb *./data/out.wav stddev:9330.70 PSNR:16.92 bytes:1054720 stddev:4396.13 PSNR:23.46 bytes:1052672 -dd68110cb7e5388392f89d5160d3a825 *./data/a-ac3.rm +aefe11ab5067621a1c674859d6413891 *./data/a-ac3.rm 98203 ./data/a-ac3.rm -9e6e66847a568ef4f1f229b0939d2aae *./data/a-g726.wav -24268 ./data/a-g726.wav -a719ab6d47d8d601520edb13bf6136b4 *./data/out.wav -stddev:8459.88 PSNR:17.77 bytes:96256 -ea2efb8ba20695a35ab0d71a7ee86f22 *./data/a-adpcm_ima.wav -266288 ./data/a-adpcm_ima.wav +39878597b1d65cce473639a7d8c93b02 *./data/a-g726.wav +24279 ./data/a-g726.wav +888f2f016e608d044a1bacbca5497ed2 *./data/out.wav +stddev:8368.02 PSNR:17.87 bytes:96256 +de3f0e1f50b19bd8572fdd3dee2e72c4 *./data/a-adpcm_ima.wav +266300 ./data/a-adpcm_ima.wav 60178d48204f5662d91776e36eddc82e *./data/out.wav stddev:11441.89 PSNR:15.15 bytes:1054720 -d2eee867856d2bdb6d08e936d4ceec0c *./data/a-adpcm_ms.wav -267308 ./data/a-adpcm_ms.wav +628d4789cf9ee16a756ac54b7fd8650d *./data/a-adpcm_ms.wav +267320 ./data/a-adpcm_ms.wav 91a84bb4f319a3a0bf0c0441b3d3a529 *./data/out.wav stddev:1050.18 PSNR:35.89 bytes:1054720 -48ae9fcb043a44e316998b85043b61bc *./data/a-adpcm_yam.wav -264236 ./data/a-adpcm_yam.wav +ab11d9151644cbff27827b7e89f37aa9 *./data/a-adpcm_yam.wav +264248 ./data/a-adpcm_yam.wav e92cec8c07913ffb91ad2b11f79cdc00 *./data/out.wav stddev:18312.68 PSNR:11.06 bytes:1056768 c3382f03ce2efb5d475240d288a33898 *./data/a-flac.flac 353368 ./data/a-flac.flac c4228df189aad9567a037727d0e763e4 *./data/out.wav stddev: 33.31 PSNR:65.87 bytes:1040384 +0c406c4e4586ca27064e28637b662631 *./data/a-wmav1.asf +106004 ./data/a-wmav1.asf +stddev:12251.50 PSNR:14.56 bytes:1056768 +stddev:2106.00 PSNR:29.85 bytes:1048576 +82442aaa5fdbd327769e4c4ad369147e *./data/a-wmav2.asf +106044 ./data/a-wmav2.asf +stddev:12255.92 PSNR:14.55 bytes:1056768 +stddev:2099.31 PSNR:29.88 bytes:1048576 diff --git a/contrib/ffmpeg/tests/ffserver.regression.ref b/contrib/ffmpeg/tests/ffserver.regression.ref index 7350fa481..851a40d22 100644 --- a/contrib/ffmpeg/tests/ffserver.regression.ref +++ b/contrib/ffmpeg/tests/ffserver.regression.ref @@ -1,10 +1,10 @@ -418d0c843a6605a7d48f285804a69df4 ff-test_h.avi -ad4605187044d5e169f32a2ea205f937 ff-test_l.avi -34f4f0c160efcdb37c0999680e07c41c ff-test.swf -fe6de6234a8bb4ace52b86763741cecd ff-test_h.asf -68e7c8a8ff64c4016a8d4e5ea27353f3 ff-test_l.asf -cba8663681bf3ef89c95c09bb90204db ff-test_h.rm -0a14086c708a7b8f4604e705a2bb7087 ff-test_l.rm -353a9a8fb3d5bb2334ac991b5c60f6d3 ff-test.jpg -7cbd46a6174d8203c26be333980595b5 ff-test_small.jpg -aaa459e638cd1dc2c120760fa4e1e384 ff-test.mjpg +b33ed697236149e1503b60ca9f645b6f ff-test_h.avi +3c104d3664ed260be9117ed1273c6dcc ff-test_l.avi +d976848a9e4d5d8fc2659e4841cdece5 ff-test.swf +5dd7a3cbc430f2534cdfc68030e4d5f5 ff-test_h.asf +1111699f36f2fe2240d3e5c73827df50 ff-test_l.asf +0b4c970507eeb57381c92c3309f2d982 ff-test_h.rm +daaaa2e170f48f8bd423c0c45ab632c7 ff-test_l.rm +e0dc91430660c619e97b5c82e0f398fc ff-test.jpg +0346739ee6ba2d3bbacb9814d00d7d2d ff-test_small.jpg +77a905f865ca536b6b92b9beb96beb94 ff-test.mjpg diff --git a/contrib/ffmpeg/tests/lena.pnm b/contrib/ffmpeg/tests/lena.pnm index 9fa0c923f..700508c86 100644 --- a/contrib/ffmpeg/tests/lena.pnm +++ b/contrib/ffmpeg/tests/lena.pnm @@ -2,7 +2,7 @@ P6 # CREATOR: The GIMP's PNM Filter Version 1.0 256 256 255 -}߈v|{|rބu݄nފv߂kބj܄pg݂tށsjrvrrwzyvxvtwfvvZaP_@T>\=YEXGXJZIZJ\NWJVLVOZLXLXNXLVNZNZJSJTOVSYTZXZTXZY^Z[\`\^\\Zf_b^ebabbbkhffd`b]b``^g_d^d`a^hahjb^ebfagfebe`ddfbgdhef`d^ffjffefbjfgbidibichjheghknhlffe_ddf^e]cbcbjhibdadddbb\e`hbf`g`jdd\fd``jjplgcd_bbe`d`fgb^b`e``eiebcc^b`cbccabadbbbd^^bcba\`[dZ`ZaX_T[PXHVLPV\`]lbqlzlt܄pވnފrڎv݂nzg~jڀjlހn܀rނr݀pކxނn߀hހj~j߀eހlf}f݂jށh܀eބh܄m܆n݂jކq݈q݄p܂hnn﹅ȐΖОԣԜԟȐ⪀rjM\HXPZOZX\Z\Za^`acX\^^ZZ^bdh[c\aZ[[^ZZZ^^^]`_^`c`b^_^]V\`c`bbh``[[bba`[]V\V\VZ\b{v撀zrd}߈v|{|rބu݄nފv߂kބj܄pg݂tށsjrvrrwzyvxvtwfvvZaP_@T>\=YEXGXJZIZJ\NWJVLVOZLXLXNXLVNZNZJSJTOVSYTZXZTXZY^Z[\`\^\\Zf_b^ebabbbkhffd`b]b``^g_d^d`a^hahjb^ebfagfebe`ddfbgdhef`d^ffjffefbjfgbidibichjheghknhlffe_ddf^e]cbcbjhibdadddbb\e`hbf`g`jdd\fd``jjplgcd_bbe`d`fgb^b`e``eiebcc^b`cbccabadbbbd^^bcba\`[dZ`ZaX_T[PXHVLPV\`]lbqlzlt܄pވnފrڎv݂nzg~jڀjlހn܀rނr݀pކxނn߀hހj~j߀eހlf}f݂jށh܀eބh܄m܆n݂jކq݈q݄p܂hnn﹅ȐΖОԣԜԟȐ⪀rjM\HXPZOZX\Z\Za^`acX\^^ZZ^bdh[c\aZ[[^ZZZ^^^]`_^`c`b^_^]V\`c`bbh``[[bba`[]V\V\VZ\b{v撀zrd|yvxvvno߄m߆p߀hhބog݀tނn߂lށntqryzyvvuowhomX_O^AW>Y<VBVFZFYJZJZKVJTJTLXISJVLWJTLXLWJRKUPWQXU[WYVZZX\Z\]][^^[[a^c^dbdda^heccfbc^a`a`fcd`b`b_iegjd_gdhdidfaeafbfbfbidd`c_ecgbdbfchbgahafbhdhfgagjhijjebb`bae^d]cab`fdjab_ddc_a\fbfafaf^gbe^d`b_hhjihddabad_c_ccd_a`daachi^`a^ccdea`bcce`bbd```a`a\_[b\`Y`W^TZOYJVJPTX_^jbplyl}r݂rއuߊrۊs݃m|jh~km}k~oނp܀m݂pރoh߀hj~f~lހh~iހhބi܁dރhނi܆o܃j݄qކnބp܁iفloŏΘМԡԝ֞˔求zmNXHXLVQ\X]Y\Y\\^``Z]]]\[^b`e]a[`[\Y\ZY\]_`^]^^_aa``_^\WZ_a^abd_`]Zbb`^\\U\V\Z\_btlޅv}lWZxqvnvte}lnih~gނkf|jނk߄nހgnrvt|xysngxifbZ\L[<U7S;T<S>T@TKZLYFSFQEPIVFRGSJVHOFNITGOKVLRORVXTXWY\\_Z\V^ZZUZX_\b\a[ec`\b_cba^`abbf`d_c]c`b]c`b\c\fgfdfbf`b^ebe`d^a[f^b^abcdc_c^fcfddaedfdc^b`dhkndfmjbbgbb`d``Zc`jfiebbe`^Xd\d^gdd^h`b`e`a]fbd^ffedd`a\_\`c`^fh^]b`a`a__^bea\abcabaab`^bd_\^^^`[]Z^\fW^T[RZLTKXEPUX\^e`lgvn{nہrۆpވt߈tބmނo~g}go|gހn܀ni݂n߂lfi߁fe~cih݀j߀f}deނg݂i܂l݄m܄rނk݂jiہhxʐКқԞ֞ҕÉߞsd_HXJWP]V]V[[]TW[^Z]ZZ`^Z^`a\^^b_d]^^\a[___[`_^]]\\^\Z^^[`^^``]b\[bd`\_`[\[]`cb`VZET~,KfEiprntrklknjiށn~m~hl~ijmrrwsrnpldtfjaWZNX=R:Q8N:O@RDTDRDPHSFPDNLWGRKRHRGOHNHRJTLUPYOXQYVZUWZ]YW]]^Y^]]Xa^]]`^_[d]c_b`b^d_d`a^b]b^d^b\b^f_bac`fagbfah^had^b_gbhadbb`kheddafbdba`efcad`bf`_`bdbb^gfba`\^\`]fbgdhced^V_[b\e_dcb^a]c`b[b_b\cad^fbec`\a^b``\bb]]b]`^`]\\^`^^]^baa__\`[b`[[^]]]_^\^Y_YaTXPXQSLUHTJUSY]^ffqlxp{n܂qބtߊu߅r߂n݂pހj~jރkl߂ijބm߁ijkge߁jg߀jj}eށj߂jރj܂l܁l݁nہm܁l܁kځh~mމn쮀̙КӞӛԙ͒~ЄlU[LYNUS\SZXZZ]\^Z_Z\]^[^]a\a\]X[Z`\^^^`^[X_^Z\_[\_^Z]\]^`\`c```]`_a]bbbd_^_\NT/Id@\B\Alnizkoklknnki~hhlbhjjnoqsonhm}eo^f]\[KT;O8Q8P<P@SBR@PHSCNGQFPGTIOIRDMGPIQDOJRKSOVOSQTVZW[[_]`\^[V^Z[Wb\^Zb__Za^`\a^_Zfdd^d`e_`]c\aZ`]e]`[dbfbfbb^b[dad`ebd^ca_\bbfbb^d`d_`]c^fabbc\c`cba^fddbb`b`cb`\a^a^`^fcb^cZc]bab\dacahdc]d`a]a_`_`[b_d_d_c^bbaZ`]`]a^bfb]``a__^aa^]`dd``_a]a`ba`]^_\`V\YbTZU`NVNXLYHVNXX^egjfsozr~t߄vuro߁lނpj߁lilmojljl߁j߀ijhjk~fg߁l}a݁nlڃlhۀfڂg|iktƒΘМԚ֜ӘƌulcJRIULURXSZVX\]ZZY^^aZZ]^Y\\]Y_ZZXZ\\\\^^]b]^^\\\^\\\^^^_^\_\\\^`dcfbhb_]HO,Fe@\@ZAZBnpknnjhljqlkj߀ijhjqnrpttknhh~gp\h]VTJR?Q7N:O=O<NBRDQIVGRLXKVMVNVFNDOIPCLFODOJRRVNWRRWVVZVYZ^X[\Z\Y\X]Y]V[X^Xb```b_d_ebd`c`b^bab`a\c\d``\bcgcb\b^d^gdg]c^b\b\fcddd`c`b]_]d_`adc`cc_b_eae`dadcd`b^`^b__\b^cac`c`_[`Zebb]hdhdhaddfbb`ebb^b]d`b_b^fbdfa\b`_Zcab`ba^]b`__c`^\]^`^`__^`^dd__]b\`\`Z^V`PZPXSZPZITHWS\_hkiqnvl}tmvssmm߅lނonlmokppjfljgkfހhh~d܂j܀j~j܂o܀fڀjڂm|h~k܄l|ʒЛԞ՜֞јrWYLXM[T\TZTXX]Y_X\\_\]ZZ\^[]Z\X[^c[[^a[Z]\ZY\]\\\\[\a^`[\[`a^`^^hcgc]YOV,Gb$HY@X=Z@\>pnje߄nhljmjgjgހjiippqrvrnnmof~hr^bVX\NW>R<Q<R<M?OFTCNFSIRJUKTJUJRHOCPIPKPBKDMJQMVOVPQTWTZVU[a^\^\\Y]Yb[^X^Yb^^Z^\b]d`c`a^d\b^a`a^_\c\d`c]c_b^b^aZheb`c]b`b[cbd`dbfec^`\``fddefdcbeca`c_dddac`c\d_b^b\c`d]dab`c`_Zc]e_b[d^had_gfddb]gdb]`^ddd`b_aacbc`bca^`\`\_]`^_``bbc`a`_b^a```e_ad^c^b^`\aX^WYR]T]VcN[KYJXNZVaehpkvr|qsޅtprvntrtnppojkkglhhh~fffh~h|j|hـkـp܀lڀop~jyhqč͘Ҝ՟֝՟ʓ簀{iMXMYMUNWOUZ[T\VZ\^Y[ZY`][[YX\]Z\\`\bZ^\\]`^]_`_^]^^^^^`Zcddceck`Z\EQ&Ea?\HZBZ<\B\Bpmmglgohgkjj~f~mjtntpqpplmnmg|go\f\WYHR<L7L6J=O:JFRGQ@LKRHOHRMVHTGTFQJTDMDNDKENMPNQQURSTSXVZ[\b]Z\Y]Z^Z`\_\_[ea`\a[d\b^a[b^c^b^faa^`Zc_c`f_fdd^c^gefbe`khegfca]d^f\efd^a_``fceccba_edgdffhdecb^ffeb`\_\`Zf]d_c`ba`]b]c^f]iffcjfe^cad`b\ebc^c`a_d\c`_\`\ba`[`_`]^Z[^_^_^bbaabc``bd`^bcb`_``bY\Z]TXQVT[ZcMXOWJ\HWS^^hoovpwp}q܄wptsstlppulqqmnonjnlfg}bhބr|ej|lۀm}l~m~h}i{i~h{ʑўӜ֢֠ҜÎvb`JXLVNZPWX\TZV[Z_Y\[[[ZZ[[]_\[\_a]_^^ab_b\\cea^`[b^b`b\d`hbfe\[@Ly!B^>W>X<ZBY>[9_@llshjihkkmipmlppronqppsjuod{jreje^aQ\@S8M9L?P@MDMCNBNFPGRLTIWFPHTJTFODNJSDLKSNRQWUZSWY_XXY\WZ^[\\YV`]`\^``[a_^\a\d\dbc_c]fdd`fca^b_daa]b`c``[aadbfbd_d_f`c_b^b^dac\b\ca^[bcjidbb^dbcbabaadbdagea`dfbe`bfbgbf`_]_^b]d]gagfigjfgddcfbdafcd`b_gffb`^a^\[a`cdcbde_Z`^^b_``\bbcaadab\Z__aa^dbg^dZ`VZTYS\P[NXNXHVFXQ^[gfgolxq~u܂utrxvwooqrummqjmjonphkdj݁l~l~jl}jـpln~izexf߉jŊΕӠԞ֟֝̓ЅlNXISM\NVTZV^TZX_Z\\Z_`\`_[``\]]`^`bb]^__^^b^bd^]b`fbg^gdiaZ[>Lu$CZ<V@YBZC^D\?\>`;jonlljmkll~nnnnoqtoprnopklod|fqbhb^^V\BR=O9N=J>JBPFPFOOWIRFNKQHPIQCODLKPELEKFROXOVRUQPUUVVWVZY\YZW\V\\\X_^a[`^a`a[cb`__]ef_[c`b`dab`dcbZabc`d\a`a]c`d`c^`ZaZc``_babad_cbaaeec``]`]_\ecfgbba`acbbb`jfbbe`c`cabb^\`Zb`a]caedghkmooefdeb^fdb_b`bafc`Za`]_b[_``]```\\]Z[```^^\`^``_^_\_^^Z^`\`]h\delV\PXT\LZJXNYFTOYV^ecokztzn܁s߄pvyvvpotxrnrpolnporfsjރp}k~n~lj܀jځol}o|k}l{kyetɒϚӠ֠ؤӘƌwjbLTR[NUT[PWX^X\X\Z\\``aZ^[]\_`eZ^^`aehjababb_feedhgiglf\]?Nx#D[AR@ZFXFX@\CZB]?aAql~ilminmrlnmjimtnttnlppljrh{hwhhe`dOZ@R8N;N?OAKALDNGPQXDMFODNELHNGNHNELIPGNHPLQPTNQUUSVZYWXWVZXZV\W\\`\_]`[c^b[`Yc_`\ccc_c``\`bb[`^b``Zc_dbb]b]c]dba^cf`]c]`[b_^Zc^_Zb^ec^^b^d`\X_[b`^]]]`\b^a^``\[b^c]b^``c`^\`\_Ybbfdbbedfdffbbc`bca`b`dbb`b]e`aaa_`[dd[Y\_]\\]^Z`^^Z`Z\]^\Z\\Za_`\]]\`[`[bY]X`RVQZPZS\JWJZO[P[`djixpzv܀x݄tyvwxnrmpstnkoqgmjjhmhl~jۀl|kۀj}j~l|i{k~k~lvevf܄j|É̒қԞ՞עҗfiTWJSPUPZRVV[Y\VXV\UX\\_][^\]WZ\`Z\adbcfidhddedgdhild\[>OnA_IV@XEZA\ LZ?]>\>b<c@hlntqjmlmlroqpstvsorqsrkllj}dtch\ZZLT@N6I5H>M<I=JBNJRJRHPHRCOJRJPFLFKELEMHNLPMPPULRQSWXZYZWWUZXYT`\_\_[`^ZV^\c]c_`[c_^__Zb^b_]^```^`^_\`Yb``Z^Yd_fde`_\a\`Y`Z```\b`fhgfdaa_a\^\^W_Z]XZV^[^[ZW]W]^\^^]]Y^Z`Z^[^Z`]\W][aa`_b`didbcbb`cabac_cbd__\`\^\\Z^Zb^`X\[_\\Y\[^^_\_\^[\Z[\\X```_\[\a^dZb_fV]Q\NWN[NWJVL\T`Yhafjltr{t~x߅y|vxxtuprrnlnkoi߁jljji߁ol~hl~mڀk}k}jl}l|j|izmxkydqǒКԞ֢ء֝ʎ~w`JUKSOXTWX^]]ZY\]Z]\Z^Z[]\YZ]ZZY\]cbf]_cbdfdhifjg\_<Nr#Gf4XWDV>W=X<Z=X:`;_?f?f@f߂pojnmiimrnmnprtrsroipnqjpn~gt^g[TQFL7F8L0G6I<LBMDNHNENGPHQLVJTITDNFPFQDLGNKOLPJNQWSTX\YXUUZ\ZV^\XYab^[b_^\]a^Y^_`Zbc^a^Z`^```ebcb_cbaac_`\^X\ZaZ_``_`]b^^Z]Z`\dbcddlhfgfeb`a^ZXXYV[WZZZZZW]W\X`\`b^[`[\_\Z_\`]^]^[baZX`b]^bbfecdcbaadbddcbfc_Z_]^Z^\^[__^`][ab^_]W_``^^]`X\\]Zb`^_^]^`]^Y`\_^a^dR\MXNWLSJQJYP^Wb[ffjolut܀xx{zuuwtsmqpmlhhkރll߄njkބmjހl~lmہmlhm|j}m~kwhzlvh܀dz͘ҙ՟إ۠ԙڜw\ZJPNTRWV[STac^c`aY^]^^^Z]\\V\ab^c\\_bbbd`hehh^X=MsAYA\FYDS:U7Z<\8_=c9h=j>c9pomjhnlhoojruotrtrpshkoqhnlcsZgZXRJN<K6H3H;ICN?MDOHSDNHPIRHNLVFNKVFNHPEPHMKTKOKRSVSRTWXUZ\YXYX\[]Z`Z`Z^W]Z]Za\^[_[_[\]b]aba_a`ch]]bbbaacabc]ac`]`]dd^^`a\]^^__^Z^^edfehhgaad[\ZX\Z[XZWVUWRZZVW]\bd^[ZY\`\XZ[YY^\^^\Za^a_b`^^bd`^bebfb^dchfbbb^\\_]^\_ba^`a`a^[\Z_]\X]\\Z]\Z]Z]a`^a_\]\\_^bU]X^V^YbOWQXNVLULXPaXcaifjprwt~wރy߄vx{txtvto߇tomjkjjimmqnlރr߂o݂s܄rހn~l~n~h~q{hxkxixdvglǑћԟ֠ؤآДɁlINMUOUTYUWVXZZ[^^]\Z[]]]ZZ[`]]^ab`^^fdfdjdZ_9Kt>W=V:ZCXA[BW;^?^<b=d=g@a>f'Ljqpmmkpiqnqnvrwrtrrljnrtknmfs^gXXUKP=K:N4K<K@MBRBLFRLVLVNVDNLUGMEPFOIRDPIQIRJOKQNRTUTVWV\_[Z[X\Z\ZZV_[\Y`^_]`_`\`^]Z^^\\`\_a``bfad``_cd__^b]c``\``cb^`a^`]`__^^^bfebdea`bbdc`c_\YVZZUUXVZVYW\[Z\\Z`]^^]`\\\X]^[\\[]\[Xcadgac`^b`bdeffha`dh^[a`]`bb\[\_b^``_^b^]\ZX^a_^[Z^^]`\`ba^\```abdX]T_V^V\V`TYLWNXNZKZOa[jclilkjwx|tހvxtsxwt߅vqvopighmjlenqrh~kރp݃rބp߂nނl~l܀ozljyjwgxjtf|gxʔҜա٧٤מ˒vd]JPOTPXUVVVXXV[^`]`Y\ZZ\^^]`b[]``cdgbgcZV=Ks<X9W@[@\@\BZ=]?^>b=e<e<b:bAcEgpnilhjlpvprstrrrtpeflpioijcv^hV[VHN<J9J9K?Q?PANBNDNGQHSKTKTNVFOCLCLEPENHOGPJSNUPVPQTUUVYZZ]\\VV[[\\_\^Zb]Z]`\^\a`_a^Z]`]Z`a`^`a`^`a```_aab]bbb]bc_`_^aeeh`^^]_\````cdbbdd\Z\Y`_[XXVZXZVXYVW[XVD[Y]Z]^Z[^[\\\XZZ\Y\Y[^_]ab_`be`a]`abhebecb_`__^]__^^aJab^`^^a_^\ZX`\`c\`]\[^^][]`]``]`^_[_W_X_T`RXQHL]N[HXJXLYY]^beljjqnws|rހrރvxwtv߄wކt߆s߆srmrolVopkqoj߄nނp߆nn߃Tރrހm݁no~q~o|nvmrOqe܃ildӂؗڞۡ֠Ƙښ\~NwNiPZVVWUUZXZ[Y_[^[^\aa^^_`d`geg][]CUw#R[NXNTG_DZ2]B\:`Hb?eBe;b<`<d@d >slnkmlnprtrqurqropkjmmllilg~er[fVVPHM>K6L;M;KBPBR@MIRGPHPHQJQFMFNISEKCMBMCMEOLTOWOURRSVSUXXWT[ZZV]Y\\[Z\Y`]__^]][`]_]_X`^ZZ]\YZ^`a_ceb^^`^\ZX``bd`ba``^^e`e``^^`_^]`acgda``^`][[XZYWUXY[\XZX[XVX[Z[\^^^b`XV[ZWWYWYX]\[X_^abaf_aefbcbfejgffjaa^\bd`_`abaa_\`][^^]\]Z]`]\]\\X[]`]]]^]_``d]^[_W^W^RYT^P[P[RZJXLYQ^VaYcbfhkqnwq}t}t߁utކvtuބvqo߄nkmnnnim݅pnppl߁on߃mހpmr߁p~op~p~pxjzjtctcves˗ҠרګۦڥΘ賆vfLUJSNXPWQTVYVX\]^^ZX[\^adhbbdbhg]\?Pu>Z9W;V=Z=Z@a"LaBfFdCf;iAd<b@d@f>e<wmolvrnnypstorppjnfjimnkjll|ep[dT[RHP<H5H4I9H@P@OCNDQFNDOFLFNHPHNEQEQCOJUISFPLTNTQXPUX[RVY[VTVXXX^YZ\VX^X_`^Y][\Zcd_\\W\ZYY^^X\^\\\``\][Z`_\V^\\_^b`__ackgkbd`^`]^^\\_^`^^]]^Z\\Z[[ZX[W[WYVYZ^`XT_a]X]X]VXTXU\XXZVW]ZZZ]]`b`cab`adcaefjccejab``]`^`^^`_`^`^]^^`][ZXZXZZ^__a[X][\Z\\]__cXZWZY]V\QZY`T]T\PVJTJZM[Uc[fblklmptrzq~uހu߂t܀t߃sttކrށmޅolrl߂p߃ooq߃lހornloko߂jހpp߃q~l{p{n{ozl{kvitfrc݁f~ƎИ֤ئک֣۫ōܞy^YDOFQOTRXSXTYZ\^^]_bb_cecfdfeVW:Js?X:W>V<Y>YC^D`FdDdCe>d@d?^>d=cAa<^;vnogrjqpsurrosojfkenkjrolng}gq]i]XQFK6F0C3G8J?NBNCPDJGMKTCKGNFNDLGPHNHQGPBNEPKRNSQTSUSUSXZ\VXVXVYW]^^]Y\]\\_Z[W]\_]^^\Y\ZVV]]`c`^^_`_ab^^ab^ZZY`^`b_a^]`c`b_a`c`^\\^\bc\[]]\[Z[[YZZZZ\]YZTT\^XYVVXX[XZZTSVTTXVVTWZ[Y[\^\Z\\`b]`_dbhbeehacab``^^^^^_^`^a```^Z\^a`_\Z]_^\[^Z\]X_`[X[\]\]bY^ZcV\UXV_WaWdU`NVJXHYKYR`]fchhkpnwszszq~o݀u܀u݄tv߅xކs߂o܆tjohpp߂lmo~j~kjroloރsnn~m~lzkzjzlyiwfufqbparbp˔Ԟ٪ڪ۬ܩҙhJRDOOXPVPTRYUZW`Y[_dacdfheW[>Nn@Y<X@U>Y?V=\Cb"Od'Pe#Kj%Ld$GdDb>d@b>_?^<`Cwpnpjpqvtuvopoikfkjlnmqjhlg}fp[bVUPAJ:I0F2G<N:KBPHRJTFPAPBLEPEPDNEQEODNENGPEMFNNTPTQSVWX\VVZ\YX\Y\^WZ][VTYZ]Z]Y]^\`^`[ZZZZWZ^YZ[]^`\Z^`^^_a^Z\Zba`b^]a_\]`d\^a`^\\`^a^^^a\^^b\\\\^^[[]a\[XY[WZUYTTPTTWVWSWYYUVVVQXZVVXXWW^\``]aabefafbdbf_^]`_e^]Z[^c^`_`_^^`][YX^`_`^^^b^Z]X\Z][^^]\\^[`Y_UZTZR[S\S\R\PZOZL\NYT_Zdbdfloprnwswo|tv݀u܁xނv݂tކs߅sނokl߂oiނtilj}i~i߀lpnrl߀jl~m}n~jzjzi{ivjubtbtbp_n_dyȎї֥ڪ۩ުפȍzf[EPLROXMSQYRZT\Z_\`ddd_\\?Lt?Z=V=X@X>\>Z@^@d@fAdAa>b<`@`<a:_>_9Z>\>mpopkppsyrxjlhfcfejnrhoojklzfp\gXYUEM7K1H4I:N<ODTDOEPDJHSHOHSGOLRALJPDODMIOFJIPMRNQRXUXXTYWTTTTZ_\[\[]ZYXXXZYZZ\b`_YZZZ\\YX_^^b`a^b^b][\_\Y\bZY`^[Z`]_`^^_b`^``]^^]__``]\\^^^ZZ\Zca^\ZX[WZX[UWVZVXTXVURXUUVWTSRXRTRXWVUVW\[\]^_\`_b_dadbe^a\^\a_`^_`eZ\`gbdeh[^\_bf^b][_b\X\YZZ]Y^]_aYZY[Z\XZRWX]RVS]Q\R]NYKXMZR]Xd\`jjljqntrxpypzp~s܀w~p܄w߃ttj߂ljnn݀rނl܀q~gkl~ln~jnqm~l|jzfwfxkvftgvjtbsbqdq^o\s_o̔բئڬۧܧԛъlMRGPLUMVOVRYSYZ]]bheYY>Hw"A^>V<V=X>Y>]A_BaHg"If&KdCb@_DaD`B]?^<^:]>\;pklllrquuvmheghbeigdmhnlnln|fubbWVSDM=L/E3F=M=NAMCPDQENEOGREQBNHRHOFLFPFOFPHPLRIRPTU\RVVVVXVXXY\Z^[ZY\Y][[Z\X\Y^`ZY\[Z[\^^\^b]]`bbl[^^^\_[]ZX_bc`^^`_^_bc\_ab[Z^`Z_[YbbbbZZ^ZXYZY[\_\[\Z^X[Z^Xcdqhrȇuzņy~v~jpkr[`X^WVWVXW[XXZWZ^^\_Z_[_X\^a^^^`^`^c]`^aaebc`d\\]]]^\``cb^[U^Z]Z]`]^\^Z^]\Y_S\T^Q\R\VaPXJTJZLYP\T`^chglknfvqtiwpzr}s|v|n݀uނtނrރq߁oހl߀mm܁ql߂pjjkii~hoi}hzlzgzjwjujqdwhqerctbrcsbp_rd{dxŌΘ֤ڨکܪ٣̐}hZFRJTKSPXU\RZ^bb`X\@Nv@[>X?W=X@X>\A_AdCa FeFg"IgFaEa@dAb>^9^<`;_>]<xqsnltnurhhh|c}cz_z[|bcljplqulpb~lt_j^\[GS;K3J2H<R=N>OCLFQFNHSKTLUGNFRGQFMENFPHNGNPWNURYQYUTXUWXZYVXZXZVYU[Z[Y\Z]\[\\`^c[\ZX]a^]a\\\[^`b^b`b]]Z]\]\^lj_a``bbdm]`\`]_YY_`[[^\hf_eY\\`Z\bn_fzpuus{xńʝϔΠԜΡКѨԤͤɠu}[]VYRTTTVVVZXZ\aZZZ_Z]\^Y]_b]abfbf`hac_d_cY_[]]a\\ZZYZ__\^[ZZ]Y_YYV\T_R[Q\S[R^LVKTHTNYUaU_`egdklqnsmuptoulxr{uzrہx݀tހo݃r߁lނp~j~mn}oހlހnigli|h~i|i|hyhvfxfvhwlvdvjrctgudpavdsdqaqbpȒӜצ۪ܪ۩ԜĈזtRWW_OXSZU]Y^_aVV8Jq B\:V?ZBZAY<Z@]@^BbDgGh"Fe#IcDfAcE`=]<]>]=\<^?\<unklnmysple}ew]w^u\xdw]jnhnmprrph}ds_e\]ZHO<M6L2J9K<L=O@LBQFRFUFQJXFPEMHOFMCNDLFLFLPSPVNQLPQVUSYYVWYXYZ\[ZY^[[V\Y^Z]^^^\^^]ZZ\\^\\\^`cd\a]^^_[_^`]_^^]_]\abb``b\^^\^]_[X[ZZ]^\birivrq}~}}|~ȉʖ͒ϔϥΡΣΟӭѥִ٨ְڳӤʧȘv|`hWZUXVYX^V]\_Z`ZZ\^]_`dehdlagdicd`b\^aeZX^^]^[^`_[^\^^`Z\Y^UVX^V\NVOZNZP[LXIVLXP]X`\cedkjqjsnqmtlxptl{xzr~p~vހpށpށqq{m~n~n~k}mjljgg{e|hzj}fzhxdwftfvjtdvhrbpar`scrbsdobubxew͘ԤبڨܩڧϗxaNUKTUZU\_\TV@Nq@X
:V<V>X:W>Z:`@`Ae!Ga@f$Id: lena.pnm,v 1.1.2.1 2006/12/02 01:20:05 dgp85 Exp $Jb"Gd"FbE^>[:Z:\;a<^;`<`=qrnntqsuqhbt]t\p^n\qcv`jomnlqqlnihscgXZVFL:G2H6F9I:G>N?LBRFPERIQDNDMENGPHPHOENFKJOMNNVOTQVTVY]WVXZVRWT\YZT`_ZT\X\Y[Z_\\Z[\\[eg`b_`__^`^b^^ac\\]aY^]`^]_`a\f_]\\\^\\YZXZ\[fivw{ɂ}ƃǃʐҠ̘͐͘ϞզԭѨͣҦҩЧѦң֯۶ڴسϥĔpz]fU[NWWYUXZ[Y[X^^b`ddjah_e^b`c\_^^Z^ZY\_\Z\[[^\^XYVWT_VZS[W`SXMWOZMWLYJ\KVP\V\_ffamlrltjsjsjumuqvlzmzr{nހsnހq߀n~nl߀p߀mk|h~o|g~gizf|hzhvfubwgudrdqgsbpfpfpapbp^pfn^n_pbve߄nƑК֧ڪܭئɎvc[PXX\]]XX=Lq>[;S:U<Y=Z<Z>Z?^?bDcCcBfCdBdEbA`EZ>X9Z:^8a8]7_=^;tlkrmpplmhx`r\lWiZm]kYw^glhoplosih|dr\fWWREM8G2E3F6K<L8LBODNGTFQFLIRDRKODMCLGQGPJPHNHPMTPRRVTSVVXWZVUVWTZXZX]Y]Z\VYVYUZZ\]^\_^_\]]`]ZZ`a__^^_\`_^a]^^^\[]^[Z^X]Y\`Z\[][afrtv~}ʆzs||z|ʊҖΝ̛ΘΝϣԪէԧХѬ͚ʝ̟ЪըөֳݺسХdoPWRXSZY_X^[^\a`d\a[`]`^`\e]c]`[]^_W[YYZ^^^X`T[VaUWSXT`RXOXP^QZJXIVIVMZX`bcgenjoixusntqroupwowrxq|wzs݂r}q~nq{l{g|l~j{l{i|hzh|hxjzfsdwescretdpen`qeo`odocp^rdscscn\pcqdudq˒Ӣاܬ߮֞֍rYZYZXYGQuA\<R=U
>X>V>X=[>Z>`@dDfDbCb>d@`>`@\@\@[>^<`9b:\8Z9]8hoisrornhesXlY`R^ReZl]u^gjimnplkpejrZjZVPFL6F.C6I5J:K<L?JAPCPFNAMBPFLFNFPEMIQCLEPJNMTRZVZRUTWVTSUWVZXYYYXZ][\\Y^ZZWZXZ[^Zbaa``]\\\\\b]\^`YY\\XY^ZUV\\^^^]^\\\Y][can_pfxy}qzɄzu~tyǂƂȂ̌ГɌ̔ИМԢУѮЦΤΡ̢РУҦӬֱڳٰݼ߷ยҪ|U^PVUZUZRW\_\b^hZb^d\bbj[^\cZ\^b[aY`Z\W[Y`SYX]TYR^PXR]O[QXPXJXIYP\NZZ```hflgshshtkrlsnsnvnvnxtzs~x~u~sq߀n|lyl{n}m{lzfvfvfzfvdxcubtcrbp`vhsdndnbodlbn`ocseodpdo`nbrckbv`zČИب۫ܯެҘuf\ZDOz"D\@T?T>XAXD\D`@`DbCcFdEd Eb@b>d@^>W?X>\FbHb=`:_?^9\9`<mlpqpqlhexZmUcSXO[R`Yo`{bfljknluppliubfXZTBI6J-F.D4E5H;H?K>M@LAMDO@LDLFOERBNFPIRIQFOISMTTZOQTVSRUVWVYVUT\\XZ\]WWZXYU[YZY`^YZ[ZZZ^^Z\_`]\`c\^\[XZYXXZ]]^`bneoppyjw`kdvtxˀv~zx~|~v{zxzzłȂx~ǂɁȆƐʇΒ͓̕ӠҤԨѢҦϢҩ՞ҪԯקӫڵݴشۺỦ̞jrPYPUT\X`]g[b`i`h^f\bZ_Zb\`\^Y`Z^VZX^XZUXS[RWNVQZR\NUR]JSO[HVQ^NVY_^_jipondshvmukritmuowoyqwq}x{v|u|m|q}iylvjzgxhwevcubxcwft`thrarbtcp`peqck`ndm`kXpbo]pbp`o^o^pbl^l`f֮̕ڮܬ߮ݩ̓yMR~#CX<W@S>U=W;Z?Z@_CdBgCe?cEcAb@cAaBZ@Z?`F`B`B]:\>Z9Z;_<`:ompozmmlzbrXdTVKSORNdZvh~lgllilllnnh}`vdh[VPCL4F*B/F2EAX>M@O>M>LANBKFS@ICMDL?L@JJSJPFOJROTNSQRTWTTTTVTXXX\VWZ\ZXZ\XUW\XT]X]^\Y^\^^Z\\_]^]^[ZZZX]U]alZkkx~~~rzfmXeYdixhrnspxrvx|rwqwvzȂ}ɄxzȁʆȍLjʔΘ̙ϔ͖ҤҜϗѨ֧ϜҬ٨ӫڸخֲܺݶܼܶ༦ֵ~T_NVV_[dV_Y`^e\dV\V[Xc[`Y^X]Z\X\W\TZRXR\QWNWMXOULVMYGTFTIWMZOVR\]`fdmlrkvnulultjsmsmtpvpzwwuxs|p}r}n|nzhugwftbxhxfsbr_veteuducqdp^rfpcpbpen`pfl\m`l^l`oao^o`sbmal\q\sĐϟתܭޱ߮ڠHP\>RAV@U?XAZAZ?X>bAeDf>d@bBd@eBdD_C^D[@^>aD`>]=\A]?\:_:b9rmxnvpjfzfiZXPJJEJOL`Xrb|dimpkommkjjgt[k\[PDM6H3G.G5M;N7J=LCSFPGTALAKAJDMALDKEMFQISHRKSJUMSLQTZSTUURUXZZ\UTW[TXWU\_YWZZVU\[[^ZX]`Z[]^^\[^UXX\TZelߛyс}|v{owbibi\c\i_ndllwlvnsfmkpjrzxqwutȁ|{ʅˀ~Ȅˆ͓Ґϒ͞ћʔ̘ҢԤҫգӞ״ܮ֬ظܱܰڷߺ⺡ݴۻ侦ݺǝguR_XcPXS[R\WZX_YZV^X^X^V\V]X^X]V]T[PTPXPVQWNXL\LWKUDREQKXOXRW`hedpiritnvnultirjqjwjwmvnsmvr}q|rzk|n~rzltdqctdqepbrbr`uetcvgqbr`pbqepbpgo`l`pap_n_o_pfrco`rdo_m^k^}dőҠبݰޣ.CM 8P>R=W?V@\@Z=\>dBhCc@bBbBdE`=]?Z=\B_@g#I_@^BW<^B`?_6d=f:rrpvqjhx`p]^OKM@J@JUPdXug~fdtlmjmlmoi~hvaf[XSFO6J,D0F2J8L6H:L=L=N@N@N?KANAMBIFMCLCLFOELJQLVNXPVQVTVPRTYWYZ^XZTSXXVUZZXVYZZVXX[\[YZYZ\XZXXY\XXwb``daemqllgjcj^jbh\g[j\h`rgnnzlpnvfrerhpwhtrxy|~}ʈȄň̎Ж͎͎Иɓ͠МЦ֬ѝҲײլֱۯ֥ײݸڮױܼݸհXfNZNXPXV]T\SZT[[`V]W[UXU_WYV[UZTZOWMSPZKWJYLWFSGU@JKWKUT^^`hflbqhwjvntmthslsjtnwrvowrunvn{uxkyl}o}qwhuirbn`nbrasbsbvftcqasgp`rbufpepcodpbpbo^p_sbqathqfl_oapfsfsОتްԐ|_Z8P>Q=T>W>Z?\@_?bBfBeDdAdCeA`<[<Y>Z>`@d!Db?]<\=X;\9`;b:hAf=mvsrvddw^iXQKBF3C9ERNbVsbfhnhmljnnmn}hv\fZWOCI4G+B-C2F0E4G:I?N?L@O=JCNAKDJCMBLFSFTFNHSHNMVFKOVRYQRTWS[VYSRUVRUZ[WZ[]Z\XWW[^_Z\ZZWY[^WUXYV\g_rNMV[_d\d_c`eX]]g\e\f`n^cblmsnvlpipdohpptsxprpwtw|~~t|˅˄~ΒɅĉ̖͍ӧӛКզٮٱֲڰ֥ԯڲ۲۵ڶްڭڸຨܸڻܾ⾪۷ÖcmLXNXNWNXT\YdT]U\SXTYS[SXTZS]TYQ\NVOVMXP_GTLXFSFTFRLZS\_affnhtivjyoujtgsjsjqitnrjtnsnuptnun|k|qyixopdpbnando`o^pbqavfp`oaqdscrdpeo`k`pbn^l_pauerfsetjrdpcqen`yk|ʕצ߲Օp)AL:Q>Q9U=X>YB^@dCgGfCcBdBhBb@[:Y<X<]@a@c@`BY=Y:\:]:c<g>c9\8pxrmkixbq``WJI:J+B>FQOe\ta~eknkljqjknhzbrYf[VNFN2E-F)C.G4H8M>N;L:G>L@K>K@MCOBQEPDOENHTBNGMFRDNNTNVPSQURXVVQTPSTX`cZ[XX\[Z[Z^ZYVVZXZZZ[XXQWXZ}o\:TNY\cZb`iX[^eX``j[e\eWbbijpflkoegfpjrlvnukos{nwxrtzƆŃăȌˉҥԞЛΣԤԦְخգشڴ٨ر۸ޮתصݶܺڻڼںݺԮt{N[FTIVOZU`PWNSRYRXR[TZRXT\PYLVOYJULYLZKXHQFRAQFVNZW^_ajfmgtlwlxnylxltfuqrmsptlqlrmpmpiupunxp{k{nrbphlbn`nanep`sdtbtepdoarfodqapeo`pbohoaqesgtep`tdugrfufteshmҞۥҖxBHT=N>Q>T@T@V<\Bb?gCf Fd@f EgAhC`BX>Y=]?cBbA^@X:Z?[>`;d>k?d>T2I2rwwrj}ftddVTR<F*B*B;IRMbZo\|`lkjqljmlli|bmYcUUQCK4D)B)B2F6H:K=L@N<LBPCR@NAODOBPDPGTCLDPFNHPKTLSNUPUPSNPOURTRRVZTVWYV[VZUWZYZ^VY]_ZXZZZXXX\\XVuXRTIZPXV_VY^cV`Xb_iei[hYd\ddpdnilkrfqfqgojsourvjnknpuxvx}vyƀ|ˆ̉ВГҤӢӠդ֤ԦԬجتدذް٪ܹടܯܴ߸Ảۼ²ݼڶڽܾ۾WcDTMXJUGPJSLWQXOWQZPXOXOUN[LUOZO]HXJWJVHRETGUNZP[`ejdpivnzq{mzmxqwltjtnrjromhtmnkokmfnhrl{mzpsdtjpendo`r`rasdugtepdr`pfoaqapdnbqhpgpdrjqhtfnbsetdukugxlxnxj~Ȓ̌qHNY?Q;T>V@U>V<[=\=dAa>d@cBfBgA`AZ@\A]@`BdA_AV=Z@[>\=bBi"Cg!DW9F3D3~pokhx^lYZTFN.>*C0F?LRNc\p\yagljrniqnmk{`lXfXVQEK/D(C(B2J8L4G;R@RFWHVGYHXBPGRCOAQEPDRIUDRKVJTITNRRXTYJPMQSVSXUXUZVZUYUVUZX[XX\[[\YXWZZ\XYZVpgNRMURZKVV]W_V]V_ZaZ^_h\e\g\edmlpnqksenkujsovoriracktt{krjt{yżЊ͒ӗԚӤآњҭإϠөۯ֣Ԧظܱ۸ߺ߱۵ᾥວݻݾܼúóˡYgCUBPHSHQJSJRMTPWRXNXPYNXNZMVK^IVJULXIYANFTJXR\Z]ihnfwnzrznzjyn|qyrwnrlmijllkjhklgdlhoiwkylvhthpbpbp_reofsft`tipao`piqbpfpdoesircrgtepesdtgtjtjwiujzn}p{nu}i<FX<W?WBW>V=X<Z>]>`<d<`@d@cCd?a@Y@ZBcFeDg@bB^EX<]A\@d>n(Jp,ObAI +}߈v|{|rބu݄nފv߂kބj܄pg݂tށsjrvrrwzyvxvtwfvvZaP_@T>\=YEXGXJZIZJ\NWJVLVOZLXLXNXLVNZNZJSJTOVSYTZXZTXZY^Z[\`\^\\Zf_b^ebabbbkhffd`b]b``^g_d^d`a^hahjb^ebfagfebe`ddfbgdhef`d^ffjffefbjfgbidibichjheghknhlffe_ddf^e]cbcbjhibdadddbb\e`hbf`g`jdd\fd``jjplgcd_bbe`d`fgb^b`e``eiebcc^b`cbccabadbbbd^^bcba\`[dZ`ZaX_T[PXHVLPV\`]lbqlzlt܄pވnފrڎv݂nzg~jڀjlހn܀rނr݀pކxނn߀hހj~j߀eހlf}f݂jށh܀eބh܄m܆n݂jކq݈q݄p܂hnn﹅ȐΖОԣԜԟȐ⪀rjM\HXPZOZX\Z\Za^`acX\^^ZZ^bdh[c\aZ[[^ZZZ^^^]`_^`c`b^_^]V\`c`bbh``[[bba`[]V\V\VZ\b{v撀zrd}߈v|{|rބu݄nފv߂kބj܄pg݂tށsjrvrrwzyvxvtwfvvZaP_@T>\=YEXGXJZIZJ\NWJVLVOZLXLXNXLVNZNZJSJTOVSYTZXZTXZY^Z[\`\^\\Zf_b^ebabbbkhffd`b]b``^g_d^d`a^hahjb^ebfagfebe`ddfbgdhef`d^ffjffefbjfgbidibichjheghknhlffe_ddf^e]cbcbjhibdadddbb\e`hbf`g`jdd\fd``jjplgcd_bbe`d`fgb^b`e``eiebcc^b`cbccabadbbbd^^bcba\`[dZ`ZaX_T[PXHVLPV\`]lbqlzlt܄pވnފrڎv݂nzg~jڀjlހn܀rނr݀pކxނn߀hހj~j߀eހlf}f݂jށh܀eބh܄m܆n݂jކq݈q݄p܂hnn﹅ȐΖОԣԜԟȐ⪀rjM\HXPZOZX\Z\Za^`acX\^^ZZ^bdh[c\aZ[[^ZZZ^^^]`_^`c`b^_^]V\`c`bbh``[[bba`[]V\V\VZ\b{v撀zrd|yvxvvno߄m߆p߀hhބog݀tނn߂lށntqryzyvvuowhomX_O^AW>Y<VBVFZFYJZJZKVJTJTLXISJVLWJTLXLWJRKUPWQXU[WYVZZX\Z\]][^^[[a^c^dbdda^heccfbc^a`a`fcd`b`b_iegjd_gdhdidfaeafbfbfbidd`c_ecgbdbfchbgahafbhdhfgagjhijjebb`bae^d]cab`fdjab_ddc_a\fbfafaf^gbe^d`b_hhjihddabad_c_ccd_a`daachi^`a^ccdea`bcce`bbd```a`a\_[b\`Y`W^TZOYJVJPTX_^jbplyl}r݂rއuߊrۊs݃m|jh~km}k~oނp܀m݂pރoh߀hj~f~lހh~iހhބi܁dރhނi܆o܃j݄qކnބp܁iفloŏΘМԡԝ֞˔求zmNXHXLVQ\X]Y\Y\\^``Z]]]\[^b`e]a[`[\Y\ZY\]_`^]^^_aa``_^\WZ_a^abd_`]Zbb`^\\U\V\Z\_btlޅv}lWZxqvnvte}lnih~gނkf|jނk߄nހgnrvt|xysngxifbZ\L[<U7S;T<S>T@TKZLYFSFQEPIVFRGSJVHOFNITGOKVLRORVXTXWY\\_Z\V^ZZUZX_\b\a[ec`\b_cba^`abbf`d_c]c`b]c`b\c\fgfdfbf`b^ebe`d^a[f^b^abcdc_c^fcfddaedfdc^b`dhkndfmjbbgbb`d``Zc`jfiebbe`^Xd\d^gdd^h`b`e`a]fbd^ffedd`a\_\`c`^fh^]b`a`a__^bea\abcabaab`^bd_\^^^`[]Z^\fW^T[RZLTKXEPUX\^e`lgvn{nہrۆpވt߈tބmނo~g}go|gހn܀ni݂n߂lfi߁fe~cih݀j߀f}deނg݂i܂l݄m܄rނk݂jiہhxʐКқԞ֞ҕÉߞsd_HXJWP]V]V[[]TW[^Z]ZZ`^Z^`a\^^b_d]^^\a[___[`_^]]\\^\Z^^[`^^``]b\[bd`\_`[\[]`cb`VZET~,KfEiprntrklknjiށn~m~hl~ijmrrwsrnpldtfjaWZNX=R:Q8N:O@RDTDRDPHSFPDNLWGRKRHRGOHNHRJTLUPYOXQYVZUWZ]YW]]^Y^]]Xa^]]`^_[d]c_b`b^d_d`a^b]b^d^b\b^f_bac`fagbfah^had^b_gbhadbb`kheddafbdba`efcad`bf`_`bdbb^gfba`\^\`]fbgdhced^V_[b\e_dcb^a]c`b[b_b\cad^fbec`\a^b``\bb]]b]`^`]\\^`^^]^baa__\`[b`[[^]]]_^\^Y_YaTXPXQSLUHTJUSY]^ffqlxp{n܂qބtߊu߅r߂n݂pހj~jރkl߂ijބm߁ijkge߁jg߀jj}eށj߂jރj܂l܁l݁nہm܁l܁kځh~mމn쮀̙КӞӛԙ͒~ЄlU[LYNUS\SZXZZ]\^Z_Z\]^[^]a\a\]X[Z`\^^^`^[X_^Z\_[\_^Z]\]^`\`c```]`_a]bbbd_^_\NT/Id@\B\Alnizkoklknnki~hhlbhjjnoqsonhm}eo^f]\[KT;O8Q8P<P@SBR@PHSCNGQFPGTIOIRDMGPIQDOJRKSOVOSQTVZW[[_]`\^[V^Z[Wb\^Zb__Za^`\a^_Zfdd^d`e_`]c\aZ`]e]`[dbfbfbb^b[dad`ebd^ca_\bbfbb^d`d_`]c^fabbc\c`cba^fddbb`b`cb`\a^a^`^fcb^cZc]bab\dacahdc]d`a]a_`_`[b_d_d_c^bbaZ`]`]a^bfb]``a__^aa^]`dd``_a]a`ba`]^_\`V\YbTZU`NVNXLYHVNXX^egjfsozr~t߄vuro߁lނpj߁lilmojljl߁j߀ijhjk~fg߁l}a݁nlڃlhۀfڂg|iktƒΘМԚ֜ӘƌulcJRIULURXSZVX\]ZZY^^aZZ]^Y\\]Y_ZZXZ\\\\^^]b]^^\\\^\\\^^^_^\_\\\^`dcfbhb_]HO,Fe@\@ZAZBnpknnjhljqlkj߀ijhjqnrpttknhh~gp\h]VTJR?Q7N:O=O<NBRDQIVGRLXKVMVNVFNDOIPCLFODOJRRVNWRRWVVZVYZ^X[\Z\Y\X]Y]V[X^Xb```b_d_ebd`c`b^bab`a\c\d``\bcgcb\b^d^gdg]c^b\b\fcddd`c`b]_]d_`adc`cc_b_eae`dadcd`b^`^b__\b^cac`c`_[`Zebb]hdhdhaddfbb`ebb^b]d`b_b^fbdfa\b`_Zcab`ba^]b`__c`^\]^`^`__^`^dd__]b\`\`Z^V`PZPXSZPZITHWS\_hkiqnvl}tmvssmm߅lނonlmokppjfljgkfހhh~d܂j܀j~j܂o܀fڀjڂm|h~k܄l|ʒЛԞ՜֞јrWYLXM[T\TZTXX]Y_X\\_\]ZZ\^[]Z\X[^c[[^a[Z]\ZY\]\\\\[\a^`[\[`a^`^^hcgc]YOV,Gb$HY@X=Z@\>pnje߄nhljmjgjgހjiippqrvrnnmof~hr^bVX\NW>R<Q<R<M?OFTCNFSIRJUKTJUJRHOCPIPKPBKDMJQMVOVPQTWTZVU[a^\^\\Y]Yb[^X^Yb^^Z^\b]d`c`a^d\b^a`a^_\c\d`c]c_b^b^aZheb`c]b`b[cbd`dbfec^`\``fddefdcbeca`c_dddac`c\d_b^b\c`d]dab`c`_Zc]e_b[d^had_gfddb]gdb]`^ddd`b_aacbc`bca^`\`\_]`^_``bbc`a`_b^a```e_ad^c^b^`\aX^WYR]T]VcN[KYJXNZVaehpkvr|qsޅtprvntrtnppojkkglhhh~fffh~h|j|hـkـp܀lڀop~jyhqč͘Ҝ՟֝՟ʓ簀{iMXMYMUNWOUZ[T\VZ\^Y[ZY`][[YX\]Z\\`\bZ^\\]`^]_`_^]^^^^^`Zcddceck`Z\EQ&Ea?\HZBZ<\B\Bpmmglgohgkjj~f~mjtntpqpplmnmg|go\f\WYHR<L7L6J=O:JFRGQ@LKRHOHRMVHTGTFQJTDMDNDKENMPNQQURSTSXVZ[\b]Z\Y]Z^Z`\_\_[ea`\a[d\b^a[b^c^b^faa^`Zc_c`f_fdd^c^gefbe`khegfca]d^f\efd^a_``fceccba_edgdffhdecb^ffeb`\_\`Zf]d_c`ba`]b]c^f]iffcjfe^cad`b\ebc^c`a_d\c`_\`\ba`[`_`]^Z[^_^_^bbaabc``bd`^bcb`_``bY\Z]TXQVT[ZcMXOWJ\HWS^^hoovpwp}q܄wptsstlppulqqmnonjnlfg}bhބr|ej|lۀm}l~m~h}i{i~h{ʑўӜ֢֠ҜÎvb`JXLVNZPWX\TZV[Z_Y\[[[ZZ[[]_\[\_a]_^^ab_b\\cea^`[b^b`b\d`hbfe\[@Ly!B^>W>X<ZBY>[9_@llshjihkkmipmlppronqppsjuod{jreje^aQ\@S8M9L?P@MDMCNBNFPGRLTIWFPHTJTFODNJSDLKSNRQWUZSWY_XXY\WZ^[\\YV`]`\^``[a_^\a\d\dbc_c]fdd`fca^b_daa]b`c``[aadbfbd_d_f`c_b^b^dac\b\ca^[bcjidbb^dbcbabaadbdagea`dfbe`bfbgbf`_]_^b]d]gagfigjfgddcfbdafcd`b_gffb`^a^\[a`cdcbde_Z`^^b_``\bbcaadab\Z__aa^dbg^dZ`VZTYS\P[NXNXHVFXQ^[gfgolxq~u܂utrxvwooqrummqjmjonphkdj݁l~l~jl}jـpln~izexf߉jŊΕӠԞ֟֝̓ЅlNXISM\NVTZV^TZX_Z\\Z_`\`_[``\]]`^`bb]^__^^b^bd^]b`fbg^gdiaZ[>Lu$CZ<V@YBZC^D\?\>`;jonlljmkll~nnnnoqtoprnopklod|fqbhb^^V\BR=O9N=J>JBPFPFOOWIRFNKQHPIQCODLKPELEKFROXOVRUQPUUVVWVZY\YZW\V\\\X_^a[`^a`a[cb`__]ef_[c`b`dab`dcbZabc`d\a`a]c`d`c^`ZaZc``_babad_cbaaeec``]`]_\ecfgbba`acbbb`jfbbe`c`cabb^\`Zb`a]caedghkmooefdeb^fdb_b`bafc`Za`]_b[_``]```\\]Z[```^^\`^``_^_\_^^Z^`\`]h\delV\PXT\LZJXNYFTOYV^ecokztzn܁s߄pvyvvpotxrnrpolnporfsjރp}k~n~lj܀jځol}o|k}l{kyetɒϚӠ֠ؤӘƌwjbLTR[NUT[PWX^X\X\Z\\``aZ^[]\_`eZ^^`aehjababb_feedhgiglf\]?Nx#D[AR@ZFXFX@\CZB]?aAql~ilminmrlnmjimtnttnlppljrh{hwhhe`dOZ@R8N;N?OAKALDNGPQXDMFODNELHNGNHNELIPGNHPLQPTNQUUSVZYWXWVZXZV\W\\`\_]`[c^b[`Yc_`\ccc_c``\`bb[`^b``Zc_dbb]b]c]dba^cf`]c]`[b_^Zc^_Zb^ec^^b^d`\X_[b`^]]]`\b^a^``\[b^c]b^``c`^\`\_Ybbfdbbedfdffbbc`bca`b`dbb`b]e`aaa_`[dd[Y\_]\\]^Z`^^Z`Z\]^\Z\\Za_`\]]\`[`[bY]X`RVQZPZS\JWJZO[P[`djixpzv܀x݄tyvwxnrmpstnkoqgmjjhmhl~jۀl|kۀj}j~l|i{k~k~lvevf܄j|É̒қԞ՞עҗfiTWJSPUPZRVV[Y\VXV\UX\\_][^\]WZ\`Z\adbcfidhddedgdhild\[>OnA_IV@XEZA\ LZ?]>\>b<c@hlntqjmlmlroqpstvsorqsrkllj}dtch\ZZLT@N6I5H>M<I=JBNJRJRHPHRCOJRJPFLFKELEMHNLPMPPULRQSWXZYZWWUZXYT`\_\_[`^ZV^\c]c_`[c_^__Zb^b_]^```^`^_\`Yb``Z^Yd_fde`_\a\`Y`Z```\b`fhgfdaa_a\^\^W_Z]XZV^[^[ZW]W]^\^^]]Y^Z`Z^[^Z`]\W][aa`_b`didbcbb`cabac_cbd__\`\^\\Z^Zb^`X\[_\\Y\[^^_\_\^[\Z[\\X```_\[\a^dZb_fV]Q\NWN[NWJVL\T`Yhafjltr{t~x߅y|vxxtuprrnlnkoi߁jljji߁ol~hl~mڀk}k}jl}l|j|izmxkydqǒКԞ֢ء֝ʎ~w`JUKSOXTWX^]]ZY\]Z]\Z^Z[]\YZ]ZZY\]cbf]_cbdfdhifjg\_<Nr#Gf4XWDV>W=X<Z=X:`;_?f?f@f߂pojnmiimrnmnprtrsroipnqjpn~gt^g[TQFL7F8L0G6I<LBMDNHNENGPHQLVJTITDNFPFQDLGNKOLPJNQWSTX\YXUUZ\ZV^\XYab^[b_^\]a^Y^_`Zbc^a^Z`^```ebcb_cbaac_`\^X\ZaZ_``_`]b^^Z]Z`\dbcddlhfgfeb`a^ZXXYV[WZZZZZW]W\X`\`b^[`[\_\Z_\`]^]^[baZX`b]^bbfecdcbaadbddcbfc_Z_]^Z^\^[__^`][ab^_]W_``^^]`X\\]Zb`^_^]^`]^Y`\_^a^dR\MXNWLSJQJYP^Wb[ffjolut܀xx{zuuwtsmqpmlhhkރll߄njkބmjހl~lmہmlhm|j}m~kwhzlvh܀dz͘ҙ՟إ۠ԙڜw\ZJPNTRWV[STac^c`aY^]^^^Z]\\V\ab^c\\_bbbd`hehh^X=MsAYA\FYDS:U7Z<\8_=c9h=j>c9pomjhnlhoojruotrtrpshkoqhnlcsZgZXRJN<K6H3H;ICN?MDOHSDNHPIRHNLVFNKVFNHPEPHMKTKOKRSVSRTWXUZ\YXYX\[]Z`Z`Z^W]Z]Za\^[_[_[\]b]aba_a`ch]]bbbaacabc]ac`]`]dd^^`a\]^^__^Z^^edfehhgaad[\ZX\Z[XZWVUWRZZVW]\bd^[ZY\`\XZ[YY^\^^\Za^a_b`^^bd`^bebfb^dchfbbb^\\_]^\_ba^`a`a^[\Z_]\X]\\Z]\Z]Z]a`^a_\]\\_^bU]X^V^YbOWQXNVLULXPaXcaifjprwt~wރy߄vx{txtvto߇tomjkjjimmqnlރr߂o݂s܄rހn~l~n~h~q{hxkxixdvglǑћԟ֠ؤآДɁlINMUOUTYUWVXZZ[^^]\Z[]]]ZZ[`]]^ab`^^fdfdjdZ_9Kt>W=V:ZCXA[BW;^?^<b=d=g@a>f'Ljqpmmkpiqnqnvrwrtrrljnrtknmfs^gXXUKP=K:N4K<K@MBRBLFRLVLVNVDNLUGMEPFOIRDPIQIRJOKQNRTUTVWV\_[Z[X\Z\ZZV_[\Y`^_]`_`\`^]Z^^\\`\_a``bfad``_cd__^b]c``\``cb^`a^`]`__^^^bfebdea`bbdc`c_\YVZZUUXVZVYW\[Z\\Z`]^^]`\\\X]^[\\[]\[Xcadgac`^b`bdeffha`dh^[a`]`bb\[\_b^``_^b^]\ZX^a_^[Z^^]`\`ba^\```abdX]T_V^V\V`TYLWNXNZKZOa[jclilkjwx|tހvxtsxwt߅vqvopighmjlenqrh~kރp݃rބp߂nނl~l܀ozljyjwgxjtf|gxʔҜա٧٤מ˒vd]JPOTPXUVVVXXV[^`]`Y\ZZ\^^]`b[]``cdgbgcZV=Ks<X9W@[@\@\BZ=]?^>b=e<e<b:bAcEgpnilhjlpvprstrrrtpeflpioijcv^hV[VHN<J9J9K?Q?PANBNDNGQHSKTKTNVFOCLCLEPENHOGPJSNUPVPQTUUVYZZ]\\VV[[\\_\^Zb]Z]`\^\a`_a^Z]`]Z`a`^`a`^`a```_aab]bbb]bc_`_^aeeh`^^]_\````cdbbdd\Z\Y`_[XXVZXZVXYVW[XVD[Y]Z]^Z[^[\\\XZZ\Y\Y[^_]ab_`be`a]`abhebecb_`__^]__^^aJab^`^^a_^\ZX`\`c\`]\[^^][]`]``]`^_[_W_X_T`RXQHL]N[HXJXLYY]^beljjqnws|rހrރvxwtv߄wކt߆s߆srmrolVopkqoj߄nނp߆nn߃Tރrހm݁no~q~o|nvmrOqe܃ildӂؗڞۡ֠Ƙښ\~NwNiPZVVWUUZXZ[Y_[^[^\aa^^_`d`geg][]CUw#R[NXNTG_DZ2]B\:`Hb?eBe;b<`<d@d >slnkmlnprtrqurqropkjmmllilg~er[fVVPHM>K6L;M;KBPBR@MIRGPHPHQJQFMFNISEKCMBMCMEOLTOWOURRSVSUXXWT[ZZV]Y\\[Z\Y`]__^]][`]_]_X`^ZZ]\YZ^`a_ceb^^`^\ZX``bd`ba``^^e`e``^^`_^]`acgda``^`][[XZYWUXY[\XZX[XVX[Z[\^^^b`XV[ZWWYWYX]\[X_^abaf_aefbcbfejgffjaa^\bd`_`abaa_\`][^^]\]Z]`]\]\\X[]`]]]^]_``d]^[_W^W^RYT^P[P[RZJXLYQ^VaYcbfhkqnwq}t}t߁utކvtuބvqo߄nkmnnnim݅pnppl߁on߃mހpmr߁p~op~p~pxjzjtctcves˗ҠרګۦڥΘ賆vfLUJSNXPWQTVYVX\]^^ZX[\^adhbbdbhg]\?Pu>Z9W;V=Z=Z@a"LaBfFdCf;iAd<b@d@f>e<wmolvrnnypstorppjnfjimnkjll|ep[dT[RHP<H5H4I9H@P@OCNDQFNDOFLFNHPHNEQEQCOJUISFPLTNTQXPUX[RVY[VTVXXX^YZ\VX^X_`^Y][\Zcd_\\W\ZYY^^X\^\\\``\][Z`_\V^\\_^b`__ackgkbd`^`]^^\\_^`^^]]^Z\\Z[[ZX[W[WYVYZ^`XT_a]X]X]VXTXU\XXZVW]ZZZ]]`b`cab`adcaefjccejab``]`^`^^`_`^`^]^^`][ZXZXZZ^__a[X][\Z\\]__cXZWZY]V\QZY`T]T\PVJTJZM[Uc[fblklmptrzq~uހu߂t܀t߃sttކrށmޅolrl߂p߃ooq߃lހornloko߂jހpp߃q~l{p{n{ozl{kvitfrc݁f~ƎИ֤ئک֣۫ōܞy^YDOFQOTRXSXTYZ\^^]_bb_cecfdfeVW:Js?X:W>V<Y>YC^D`FdDdCe>d@d?^>d=cAa<^;vnogrjqpsurrosojfkenkjrolng}gq]i]XQFK6F0C3G8J?NBNCPDJGMKTCKGNFNDLGPHNHQGPBNEPKRNSQTSUSUSXZ\VXVXVYW]^^]Y\]\\_Z[W]\_]^^\Y\ZVV]]`c`^^_`_ab^^ab^ZZY`^`b_a^]`c`b_a`c`^\\^\bc\[]]\[Z[[YZZZZ\]YZTT\^XYVVXX[XZZTSVTTXVVTWZ[Y[\^\Z\\`b]`_dbhbeehacab``^^^^^_^`^a```^Z\^a`_\Z]_^\[^Z\]X_`[X[\]\]bY^ZcV\UXV_WaWdU`NVJXHYKYR`]fchhkpnwszszq~o݀u܀u݄tv߅xކs߂o܆tjohpp߂lmo~j~kjroloރsnn~m~lzkzjzlyiwfufqbparbp˔Ԟ٪ڪ۬ܩҙhJRDOOXPVPTRYUZW`Y[_dacdfheW[>Nn@Y<X@U>Y?V=\Cb"Od'Pe#Kj%Ld$GdDb>d@b>_?^<`Cwpnpjpqvtuvopoikfkjlnmqjhlg}fp[bVUPAJ:I0F2G<N:KBPHRJTFPAPBLEPEPDNEQEODNENGPEMFNNTPTQSVWX\VVZ\YX\Y\^WZ][VTYZ]Z]Y]^\`^`[ZZZZWZ^YZ[]^`\Z^`^^_a^Z\Zba`b^]a_\]`d\^a`^\\`^a^^^a\^^b\\\\^^[[]a\[XY[WZUYTTPTTWVWSWYYUVVVQXZVVXXWW^\``]aabefafbdbf_^]`_e^]Z[^c^`_`_^^`][YX^`_`^^^b^Z]X\Z][^^]\\^[`Y_UZTZR[S\S\R\PZOZL\NYT_Zdbdfloprnwswo|tv݀u܁xނv݂tކs߅sނokl߂oiނtilj}i~i߀lpnrl߀jl~m}n~jzjzi{ivjubtbtbp_n_dyȎї֥ڪ۩ުפȍzf[EPLROXMSQYRZT\Z_\`ddd_\\?Lt?Z=V=X@X>\>Z@^@d@fAdAa>b<`@`<a:_>_9Z>\>mpopkppsyrxjlhfcfejnrhoojklzfp\gXYUEM7K1H4I:N<ODTDOEPDJHSHOHSGOLRALJPDODMIOFJIPMRNQRXUXXTYWTTTTZ_\[\[]ZYXXXZYZZ\b`_YZZZ\\YX_^^b`a^b^b][\_\Y\bZY`^[Z`]_`^^_b`^``]^^]__``]\\^^^ZZ\Zca^\ZX[WZX[UWVZVXTXVURXUUVWTSRXRTRXWVUVW\[\]^_\`_b_dadbe^a\^\a_`^_`eZ\`gbdeh[^\_bf^b][_b\X\YZZ]Y^]_aYZY[Z\XZRWX]RVS]Q\R]NYKXMZR]Xd\`jjljqntrxpypzp~s܀w~p܄w߃ttj߂ljnn݀rނl܀q~gkl~ln~jnqm~l|jzfwfxkvftgvjtbsbqdq^o\s_o̔բئڬۧܧԛъlMRGPLUMVOVRYSYZ]]bheYY>Hw"A^>V<V=X>Y>]A_BaHg"If&KdCb@_DaD`B]?^<^:]>\;pklllrquuvmheghbeigdmhnlnln|fubbWVSDM=L/E3F=M=NAMCPDQENEOGREQBNHRHOFLFPFOFPHPLRIRPTU\RVVVVXVXXY\Z^[ZY\Y][[Z\X\Y^`ZY\[Z[\^^\^b]]`bbl[^^^\_[]ZX_bc`^^`_^_bc\_ab[Z^`Z_[YbbbbZZ^ZXYZY[\_\[\Z^X[Z^Xcdqhrȇuzņy~v~jpkr[`X^WVWVXW[XXZWZ^^\_Z_[_X\^a^^^`^`^c]`^aaebc`d\\]]]^\``cb^[U^Z]Z]`]^\^Z^]\Y_S\T^Q\R\VaPXJTJZLYP\T`^chglknfvqtiwpzr}s|v|n݀uނtނrރq߁oހl߀mm܁ql߂pjjkii~hoi}hzlzgzjwjujqdwhqerctbrcsbp_rd{dxŌΘ֤ڨکܪ٣̐}hZFRJTKSPXU\RZ^bb`X\@Nv@[>X?W=X@X>\A_AdCa FeFg"IgFaEa@dAb>^9^<`;_>]<xqsnltnurhhh|c}cz_z[|bcljplqulpb~lt_j^\[GS;K3J2H<R=N>OCLFQFNHSKTLUGNFRGQFMENFPHNGNPWNURYQYUTXUWXZYVXZXZVYU[Z[Y\Z]\[\\`^c[\ZX]a^]a\\\[^`b^b`b]]Z]\]\^lj_a``bbdm]`\`]_YY_`[[^\hf_eY\\`Z\bn_fzpuus{xńʝϔΠԜΡКѨԤͤɠu}[]VYRTTTVVVZXZ\aZZZ_Z]\^Y]_b]abfbf`hac_d_cY_[]]a\\ZZYZ__\^[ZZ]Y_YYV\T_R[Q\S[R^LVKTHTNYUaU_`egdklqnsmuptoulxr{uzrہx݀tހo݃r߁lނp~j~mn}oހlހnigli|h~i|i|hyhvfxfvhwlvdvjrctgudpavdsdqaqbpȒӜצ۪ܪ۩ԜĈזtRWW_OXSZU]Y^_aVV8Jq B\:V?ZBZAY<Z@]@^BbDgGh"Fe#IcDfAcE`=]<]>]=\<^?\<unklnmysple}ew]w^u\xdw]jnhnmprrph}ds_e\]ZHO<M6L2J9K<L=O@LBQFRFUFQJXFPEMHOFMCNDLFLFLPSPVNQLPQVUSYYVWYXYZ\[ZY^[[V\Y^Z]^^^\^^]ZZ\\^\\\^`cd\a]^^_[_^`]_^^]_]\abb``b\^^\^]_[X[ZZ]^\birivrq}~}}|~ȉʖ͒ϔϥΡΣΟӭѥִ٨ְڳӤʧȘv|`hWZUXVYX^V]\_Z`ZZ\^]_`dehdlagdicd`b\^aeZX^^]^[^`_[^\^^`Z\Y^UVX^V\NVOZNZP[LXIVLXP]X`\cedkjqjsnqmtlxptl{xzr~p~vހpށpށqq{m~n~n~k}mjljgg{e|hzj}fzhxdwftfvjtdvhrbpar`scrbsdobubxew͘ԤبڨܩڧϗxaNUKTUZU\_\TV@Nq@X
:V<V>X:W>Z:`@`Ae!Ga@f$Id$Jb"Gd"FbE^>[:Z:\;a<^;`<`=qrnntqsuqhbt]t\p^n\qcv`jomnlqqlnihscgXZVFL:G2H6F9I:G>N?LBRFPERIQDNDMENGPHPHOENFKJOMNNVOTQVTVY]WVXZVRWT\YZT`_ZT\X\Y[Z_\\Z[\\[eg`b_`__^`^b^^ac\\]aY^]`^]_`a\f_]\\\^\\YZXZ\[fivw{ɂ}ƃǃʐҠ̘͐͘ϞզԭѨͣҦҩЧѦң֯۶ڴسϥĔpz]fU[NWWYUXZ[Y[X^^b`ddjah_e^b`c\_^^Z^ZY\_\Z\[[^\^XYVWT_VZS[W`SXMWOZMWLYJ\KVP\V\_ffamlrltjsjsjumuqvlzmzr{nހsnހq߀n~nl߀p߀mk|h~o|g~gizf|hzhvfubwgudrdqgsbpfpfpapbp^pfn^n_pbve߄nƑК֧ڪܭئɎvc[PXX\]]XX=Lq>[;S:U<Y=Z<Z>Z?^?bDcCcBfCdBdEbA`EZ>X9Z:^8a8]7_=^;tlkrmpplmhx`r\lWiZm]kYw^glhoplosih|dr\fWWREM8G2E3F6K<L8LBODNGTFQFLIRDRKODMCLGQGPJPHNHPMTPRRVTSVVXWZVUVWTZXZX]Y]Z\VYVYUZZ\]^\_^_\]]`]ZZ`a__^^_\`_^a]^^^\[]^[Z^X]Y\`Z\[][afrtv~}ʆzs||z|ʊҖΝ̛ΘΝϣԪէԧХѬ͚ʝ̟ЪըөֳݺسХdoPWRXSZY_X^[^\a`d\a[`]`^`\e]c]`[]^_W[YYZ^^^X`T[VaUWSXT`RXOXP^QZJXIVIVMZX`bcgenjoixusntqroupwowrxq|wzs݂r}q~nq{l{g|l~j{l{i|hzh|hxjzfsdwescretdpen`qeo`odocp^rdscscn\pcqdudq˒Ӣاܬ߮֞֍rYZYZXYGQuA\<R=U
>X>V>X=[>Z>`@dDfDbCb>d@`>`@\@\@[>^<`9b:\8Z9]8hoisrornhesXlY`R^ReZl]u^gjimnplkpejrZjZVPFL6F.C6I5J:K<L?JAPCPFNAMBPFLFNFPEMIQCLEPJNMTRZVZRUTWVTSUWVZXYYYXZ][\\Y^ZZWZXZ[^Zbaa``]\\\\\b]\^`YY\\XY^ZUV\\^^^]^\\\Y][can_pfxy}qzɄzu~tyǂƂȂ̌ГɌ̔ИМԢУѮЦΤΡ̢РУҦӬֱڳٰݼ߷ยҪ|U^PVUZUZRW\_\b^hZb^d\bbj[^\cZ\^b[aY`Z\W[Y`SYX]TYR^PXR]O[QXPXJXIYP\NZZ```hflgshshtkrlsnsnvnvnxtzs~x~u~sq߀n|lyl{n}m{lzfvfvfzfvdxcubtcrbp`vhsdndnbodlbn`ocseodpdo`nbrckbv`zČИب۫ܯެҘuf\ZDOz"D\@T?T>XAXD\D`@`DbCcFdEd Eb@b>d@^>W?X>\FbHb=`:_?^9\9`<mlpqpqlhexZmUcSXO[R`Yo`{bfljknluppliubfXZTBI6J-F.D4E5H;H?K>M@LAMDO@LDLFOERBNFPIRIQFOISMTTZOQTVSRUVWVYVUT\\XZ\]WWZXYU[YZY`^YZ[ZZZ^^Z\_`]\`c\^\[XZYXXZ]]^`bneoppyjw`kdvtxˀv~zx~|~v{zxzzłȂx~ǂɁȆƐʇΒ͓̕ӠҤԨѢҦϢҩ՞ҪԯקӫڵݴشۺỦ̞jrPYPUT\X`]g[b`i`h^f\bZ_Zb\`\^Y`Z^VZX^XZUXS[RWNVQZR\NUR]JSO[HVQ^NVY_^_jipondshvmukritmuowoyqwq}x{v|u|m|q}iylvjzgxhwevcubxcwft`thrarbtcp`peqck`ndm`kXpbo]pbp`o^o^pbl^l`f֮̕ڮܬ߮ݩ̓yMR~#CX<W@S>U=W;Z?Z@_CdBgCe?cEcAb@cAaBZ@Z?`F`B`B]:\>Z9Z;_<`:ompozmmlzbrXdTVKSORNdZvh~lgllilllnnh}`vdh[VPCL4F*B/F2EAX>M@O>M>LANBKFS@ICMDL?L@JJSJPFOJROTNSQRTWTTTTVTXXX\VWZ\ZXZ\XUW\XT]X]^\Y^\^^Z\\_]^]^[ZZZX]U]alZkkx~~~rzfmXeYdixhrnspxrvx|rwqwvzȂ}ɄxzȁʆȍLjʔΘ̙ϔ͖ҤҜϗѨ֧ϜҬ٨ӫڸخֲܺݶܼܶ༦ֵ~T_NVV_[dV_Y`^e\dV\V[Xc[`Y^X]Z\X\W\TZRXR\QWNWMXOULVMYGTFTIWMZOVR\]`fdmlrkvnulultjsmsmtpvpzwwuxs|p}r}n|nzhugwftbxhxfsbr_veteuducqdp^rfpcpbpen`pfl\m`l^l`oao^o`sbmal\q\sĐϟתܭޱ߮ڠHP\>RAV@U?XAZAZ?X>bAeDf>d@bBd@eBdD_C^D[@^>aD`>]=\A]?\:_:b9rmxnvpjfzfiZXPJJEJOL`Xrb|dimpkommkjjgt[k\[PDM6H3G.G5M;N7J=LCSFPGTALAKAJDMALDKEMFQISHRKSJUMSLQTZSTUURUXZZ\UTW[TXWU\_YWZZVU\[[^ZX]`Z[]^^\[^UXX\TZelߛyс}|v{owbibi\c\i_ndllwlvnsfmkpjrzxqwutȁ|{ʅˀ~Ȅˆ͓Ґϒ͞ћʔ̘ҢԤҫգӞ״ܮ֬ظܱܰڷߺ⺡ݴۻ侦ݺǝguR_XcPXS[R\WZX_YZV^X^X^V\V]X^X]V]T[PTPXPVQWNXL\LWKUDREQKXOXRW`hedpiritnvnultirjqjwjwmvnsmvr}q|rzk|n~rzltdqctdqepbrbr`uetcvgqbr`pbqepbpgo`l`pap_n_o_pfrco`rdo_m^k^}dőҠبݰޣ.CM 8P>R=W?V@\@Z=\>dBhCc@bBbBdE`=]?Z=\B_@g#I_@^BW<^B`?_6d=f:rrpvqjhx`p]^OKM@J@JUPdXug~fdtlmjmlmoi~hvaf[XSFO6J,D0F2J8L6H:L=L=N@N@N?KANAMBIFMCLCLFOELJQLVNXPVQVTVPRTYWYZ^XZTSXXVUZZXVYZZVXX[\[YZYZ\XZXXY\XXwb``daemqllgjcj^jbh\g[j\h`rgnnzlpnvfrerhpwhtrxy|~}ʈȄň̎Ж͎͎Иɓ͠МЦ֬ѝҲײլֱۯ֥ײݸڮױܼݸհXfNZNXPXV]T\SZT[[`V]W[UXU_WYV[UZTZOWMSPZKWJYLWFSGU@JKWKUT^^`hflbqhwjvntmthslsjtnwrvowrunvn{uxkyl}o}qwhuirbn`nbrasbsbvftcqasgp`rbufpepcodpbpbo^p_sbqathqfl_oapfsfsОتްԐ|_Z8P>Q=T>W>Z?\@_?bBfBeDdAdCeA`<[<Y>Z>`@d!Db?]<\=X;\9`;b:hAf=mvsrvddw^iXQKBF3C9ERNbVsbfhnhmljnnmn}hv\fZWOCI4G+B-C2F0E4G:I?N?L@O=JCNAKDJCMBLFSFTFNHSHNMVFKOVRYQRTWS[VYSRUVRUZ[WZ[]Z\XWW[^_Z\ZZWY[^WUXYV\g_rNMV[_d\d_c`eX]]g\e\f`n^cblmsnvlpipdohpptsxprpwtw|~~t|˅˄~ΒɅĉ̖͍ӧӛКզٮٱֲڰ֥ԯڲ۲۵ڶްڭڸຨܸڻܾ⾪۷ÖcmLXNXNWNXT\YdT]U\SXTYS[SXTZS]TYQ\NVOVMXP_GTLXFSFTFRLZS\_affnhtivjyoujtgsjsjqitnrjtnsnuptnun|k|qyixopdpbnando`o^pbqavfp`oaqdscrdpeo`k`pbn^l_pauerfsetjrdpcqen`yk|ʕצ߲Օp)AL:Q>Q9U=X>YB^@dCgGfCcBdBhBb@[:Y<X<]@a@c@`BY=Y:\:]:c<g>c9\8pxrmkixbq``WJI:J+B>FQOe\ta~eknkljqjknhzbrYf[VNFN2E-F)C.G4H8M>N;L:G>L@K>K@MCOBQEPDOENHTBNGMFRDNNTNVPSQURXVVQTPSTX`cZ[XX\[Z[Z^ZYVVZXZZZ[XXQWXZ}o\:TNY\cZb`iX[^eX``j[e\eWbbijpflkoegfpjrlvnukos{nwxrtzƆŃăȌˉҥԞЛΣԤԦְخգشڴ٨ر۸ޮתصݶܺڻڼںݺԮt{N[FTIVOZU`PWNSRYRXR[TZRXT\PYLVOYJULYLZKXHQFRAQFVNZW^_ajfmgtlwlxnylxltfuqrmsptlqlrmpmpiupunxp{k{nrbphlbn`nanep`sdtbtepdoarfodqapeo`pbohoaqesgtep`tdugrfufteshmҞۥҖxBHT=N>Q>T@T@V<\Bb?gCf Fd@f EgAhC`BX>Y=]?cBbA^@X:Z?[>`;d>k?d>T2I2rwwrj}ftddVTR<F*B*B;IRMbZo\|`lkjqljmlli|bmYcUUQCK4D)B)B2F6H:K=L@N<LBPCR@NAODOBPDPGTCLDPFNHPKTLSNUPUPSNPOURTRRVZTVWYV[VZUWZYZ^VY]_ZXZZZXXX\\XVuXRTIZPXV_VY^cV`Xb_iei[hYd\ddpdnilkrfqfqgojsourvjnknpuxvx}vyƀ|ˆ̉ВГҤӢӠդ֤ԦԬجتدذް٪ܹടܯܴ߸Ảۼ²ݼڶڽܾ۾WcDTMXJUGPJSLWQXOWQZPXOXOUN[LUOZO]HXJWJVHRETGUNZP[`ejdpivnzq{mzmxqwltjtnrjromhtmnkokmfnhrl{mzpsdtjpendo`r`rasdugtepdr`pfoaqapdnbqhpgpdrjqhtfnbsetdukugxlxnxj~Ȓ̌qHNY?Q;T>V@U>V<[=\=dAa>d@cBfBgA`AZ@\A]@`BdA_AV=Z@[>\=bBi"Cg!DW9F3D3~pokhx^lYZTFN.>*C0F?LRNc\p\yagljrniqnmk{`lXfXVQEK/D(C(B2J8L4G;R@RFWHVGYHXBPGRCOAQEPDRIUDRKVJTITNRRXTYJPMQSVSXUXUZVZUYUVUZX[XX\[[\YXWZZ\XYZVpgNRMURZKVV]W_V]V_ZaZ^_h\e\g\edmlpnqksenkujsovoriracktt{krjt{yżЊ͒ӗԚӤآњҭإϠөۯ֣Ԧظܱ۸ߺ߱۵ᾥວݻݾܼúóˡYgCUBPHSHQJSJRMTPWRXNXPYNXNZMVK^IVJULXIYANFTJXR\Z]ihnfwnzrznzjyn|qyrwnrlmijllkjhklgdlhoiwkylvhthpbpbp_reofsft`tipao`piqbpfpdoesircrgtepesdtgtjtjwiujzn}p{nu}i<FX<W?WBW>V=X<Z>]>`<d<`@d@cCd?a@Y@ZBcFeDg@bB^EX<]A\@d>n(Jp,ObAI 3?0R9ztlefr\cWTS;H.D(A3EBJQSbXp[|hjnpttrnlgj{boZg\TPBI-B,B(@1E6J:K>P?ODVDUARL^DTCN>MBN@MEQ?NEOGRKULXKRPXNXTZTZRUQYTWRTXYUXTTUVWWTXZZXXYXUVV[SWppdWMUQ[SVVXRWPWMVSaU\Vb^d\gbi^b`ijm^agnmpjrljmonmeoenrznr|yrp{~|w͍ΆΖӘБԣՙӜ֭ذڪը״߸ܱڶݹܵ۵ยܻݿںٹ·õĭΥbo>MBN>JBNDNIRLWR[KRPWLXJXHWJVL^PVIUETBRFVIXS\^ejjqnvh}n|k|m~pylzotlsjmfhdfdficfb_baiepixpymvirbobp`peqetguisdq_pepdp`oeobrfqfshrcsgrdvfqbvhxjyixjwjnllo\2C_AU?ZBVAV=Z@[?a?`=b@f>e>f@f;b>[<U;^Bg$JdC`>ZEV@Z>bEbCq)Ls.QfBT;D6K;E]xrnlxdl^VSDH1B-D*B4FBOVXdYn\hhlnqssmoiixar\bWVUCK,B*D*@2G6H:M@P=MBTAODRGSCQGSBRDQBQBODPERHRHRMVKTQYPWPVPZNTPUSWVUVZTVUVVUX[X\ZZXYYVWWW[f`~PQMXSWPSOUMVKWPWS]V]Y[ahfk[a`ghe_d]bgjlpjlopnpjwkouxmspplswzqx{˃z|ȍʇɖϐΎПؠ֨װܨڭ۳ݹݴ۲ܺ߶ݵܼۺܾܾڴݾƺҲ~tSb<K@ODQGRO[KVOXJSJUJXHSETJZDUDUBTCXKWN^^dnpwszn|l|lsr~oxpwjxnohebbd\`]dZ[\`bgnjrkzkvlsepen`rcucudxjwbl_nbpbn^odqfpfsetdshretjzotdvhxhwexjzlphkb7J`@X>V=V<Y=V:V9Y?aAg Ch!Cf?d<`=_:Z=X:^>dAgBdF\GZAYD]BfDh$Gr+Ng"EV:J5O;:Survpl~fq\`TLN5G9M2J,D4HCNUSdXq]{bhiojpnrkif|ct`bUVR@I,D*D*D1F4F3I@R?LGY@M>P@R@MDRCRCODOERDOFNHPJQLTOTMTNSSRT\QTQVRVZ[UVSVXZSXX\VXSVWX\\YXTZwpmUNUQPNSIPJSIPP]QVX`Y]T\]aX_cibe\a_cfllneihrchnnqupqprjllxszekxzz||~zǀ|͑˂~˚Ԥԙզ٭تکٳܲڨڱ۸ᴜ۰ܷ߸ສݻ༧ֶػڸӬѰҽξ`h5H;MDQMZIRKWLWHPDTHTGUIVFXFXBYEVK\S^bdnmsm{p~nmnn~s{n|sxlodd`\_V^PZTXT\`_edpiulxkufpdrdsgrbxgvjtdn^nepcp`pdpcrlrgrdqfreukqerhuiwixj{hoowhKPk@XAU@V?W=W<V:\>bDc?fBc@h@f<d:\>Y=^AeCe DfG]BXC\A\@`Dh!Fr2Sh$HS;J<N<y0Nio{vmiwdj\VR?G.D3G6I1E/FAMTSbZqb|chnsppunhjd~dr]fYTPEN2F(D/F2F:L5J?MFTH[BQ@OEQFQBQDTAPFTCODOGRGUIPNYPXTYU]TWNTPRPVUXQXXYTUV]V\YZVZVXVXXXVX\Vx^UWSSLRJTFOLXKSU_W]X]SXU\PXbfZ\dlXbbghmdldhafgmlnilnslnjrrprxsxz|zzyw|zˋΖҔҗݩئشݶܬק۷ܱۨ۷ܺᷦڮܿ༦ڷڷ֭ҭҸľҴDV4L8JERFTLVHPEPCQCOFUGVFXFX>TGXK\O`_clhukwl{np~lp|nzk{l|rrigbX^PXDNJVIVTZ]^kjoiwnxntir`rhrcrdtesdpfn`rhpcrepdodqfqepdobtgrbvlwkwlzn~qn|gVVz'HXCU@X>X@V8[AX<`@`>d@h@c=c<`8[:Z<]<d?jEb?_HVDX@^D^Bf$Kq.Py7Yf FO9Q@m'NYi~txfnycn`^WMO:K.A2G3H5G3HFRWTd^td|fgilnnpmjml|bq]aVRL@K5F*D&B2H4J8M<L?S>N?P@O?NFRER@NERFRDQCOETJPLVMVLSNUQXRWPVPUV[X\[\X_VW\bVZ\ZX^TTTWZ\Z]gb[VQRKRHPMXKTNWO[T]^^RXRXX_]c^d\c\d]b^bemdlcj[bjldolrhlqojiishlrvll|xπ}ˊΌ~ӟء֠ڰܩئ۶۫اٲݸްݴ۸ٯٱتӰԿ̾ھ|1H4K>MCRGTDQHVCTFTFWBSDTDV@VDXN\Q^`cgbslwi}n~l}kk}n|n}q|orfg`ZYJP?J;M;MIXU^cakmtpxlujsdoapbo`tcrdpbpdncqdodqhuiqgtirerdrfsbshwhthzlnzk_Z.JZ>VET=X?X<\>^>`>c?f Da>e@f>b@]AX=Z=cBjBhC\AVAXBX=^B`Go-R|:[t5XdHW=o)KXhxzۃuwvhtcdVQP@K.F0H4H4G0H5HCNTUd\q`|bfkknqrjtpkz`m[aZOP>K0F+C+F2F6I;L>R>L<OGTDTDPDPCPBPBNAODTHQHSITJRNTOZOTNVRTRVPTRVSUXYVXTXZ`WZWXTYYXXW[\\]]VQTINLQNTLUNUT_U`ZbWaRY[c]`X^[f[^Z`Z`_dT]cf`dhnckrubklqbdnrhklprqpropim~zzw͈ԕԏӘګܮ֢ر߳ڪޭ֧ڵݺۮ֧ҠҨҴɸ̺̿ʼͼĸ^l0I7J>NFSBQESESDPBSFVDSBV=UBVKZP\`djhrluhzjm{i~l|mzn|ozrsklj_`NW8J1H2J6MJX[_hinjtkvpserfobreufr`pboaofrjpbndpfqhvjrgshshsiulvivitpmc<O`@T>T?U8Z8Z8[;b>c>d@d@d@f=b>`@W<Y<b<i>i?`BU?ZBYB\AcFi(Or-Ts0Tn+P`?p&JSdpr~wهvߋu|dybm^ZQEO5J.D4K4I5H6J8HDOTTbVq_|dfnllpnnomdz_n[`TMQML5J+E,F2H6H8J?N@N?QBP@NBOCT@PL[HWDRFSANHUBOJRNVOWQTTXQTQXRZVYSVX[TXWVW]VVZ[VY]XYY[\aXPRHPMTIQKRLTOTX`V`V`T`]b\cVZZbZc]bT^^]Xbal`gfggnjmlnroipvvcfprklqvrsjnz|vẁҋφՙכלܯ߮ܩڬລݰٲڴܦԤΜϤѲĿʹ˽ɾɿɼ̺ŻʵдBT2F7L<M>P>MDR@O@QDV@QAU?R>TKZPY]defnjxlpm|k{mzn~p|pxpqjle_\NW:J%C"A(D@RTZcehirlvjujtkn`rfvetirgpdqdrhn`ndrfthobpdqfsjtjxivmylnviLPmCU=U9T
:V7[:]@b?d@f@fBc>f@c@`<X>W=_@d>iBbAZ=W@\?^B`Bg"Mq1Wv6[l)Pg%Jz1RNcmrx}t~uՆyvar^aRLL7G.B6L5H:L9J1D;NBLTVdXo[{hnhplrrnnmdzbn[bUTRFM6J-E2L3G:L8L:L<N@Q@MCPBNBPFQJXDQBQARDQDNHTJRKRLSNUQTPQPOPURTRVVZVWUUVVVWZ^YX\[Z\]YW\LTFPHRHNPZRVT^X`MXXa`hY_X_[bZaU\ZaU]V^^fbfghkobbnttthnollnooilrvzyoswukqπ|ֆҀԌԑۣ֘ݪؚٮݪܨگڭώϖΠո˻ȻîƵɺ˾̽ǺȻƹ̺ƹʶؿ:N-F2F;L>OCU@TASF[@R?T:O@TIXPX[_fcokzn~p~mzm|k|l}o|qzsqklfbdQW7M~=q@x=4ILWX\fhlmumvmvgriocofresindmdtloephpgrhpfnbodpfnepfxo~l|mc`%@[:R9U8X
6Y
:Z:^=eBgCgChCdBgCaBY@T
;\Bd?hBa>\@Y@\B_Cf1Vh2Zm'Rr6Zp1Xn*Rx2TLcls|xЁwzuzs}rq^fVTP>J2I2E7K8I8G4C2D7KEOTVe[sc{bpnloqlqqkey_o\bXROCM5I,F(C2G3G:O;N@P;Q>M?RFTFRFSHUFUEOCTDOESKSKTLTKSOVPVSURUT[QWVXW\VVVXXXXXYYXX\^`\RROXJQJOLXHPPUS]NVPXU^Z\Y_UZQX`gTXV`U_U`W\cg^bgj^glpkmorjidjqsfjnptxmrrrtvzwt}w҆~|דؔՓأީ١֡ڳۦҕϔʕմʸȼƺ¼ŴʼžȻȿķɼǺɹμƺ˹ӻ2G0H0F9N<PBS?TAT@SBV>RASGTPZZ\gdqnzn~q|l~m~k{l|pxnytvkljafV[@R"Dh=p>$@;LQX\ahgpiuozotjpfpfpdthqgogpbqfpgqirdshn_reqfqfui{q}jl_5FbAT8V?Y>Z;Z<`@dBjBgDdBfAf@`@\AU@Y>h Dj"Bd?\=X?YB^Aa#Je&Oh)Sl-Vt8az/Z~3YPiiuzx́~ЂzwsrqulfR^NFJ7G2H6H8J6G:G7E6H4EEMQR`Zq_ybfronnplnlbycnZ`UPLDN2G(B,E4J;N<P?PAT>P@SDVGUCNHVFPDNERCPCRHQIRJPJRLTPUPSSUTXPTTXWVZ`ZZXZQTZ\WZXY^YXUJQNXGNKQOXKWQ[RYMZ[`\aRWX_T_Z[W\QZQ^Z`^d[\djc`X_fjkovsgfnptrlmrnqquxvtrs|xzz|}yvρ|Ԍӆѐ٤ܪڝ٥۬ס̄~ƍϦݹȺȼ˶ĵļ¼ȾʸȴȿǽǺµȸżǹƹ[k/E1I6F8M7M>NCU?R@R<P?RFUQ]]_ddnlxo~ttso|j{mzn|sxqolefV_AP%Bd8^9y:1GFSR[__khumulwkrcpdrfpeqfmcpgnhrjnfqnrgpfuhvpwnxn~rscBNk@VAb8\`0S^IZ<\=eCfAgAe@gBfBcB^@X@X>b@jBfB]AY>[@\?`=d$Lh%Nm+Vt4_u0\:`Khfwvx|zЁxӃwqnnlzZNQN=H1I6I8L?N8J:M5G9J6G>LTS^Xr`{ghrpotnlngdz`lZ^SRR@H6I,G+F8L8L<N?QAQAP;N?LDO@PAMDQ@P@NBNFSHSHNFQIQQYPTPVSVRURUTTUWUVTW[\VXWXYYZ^[SMRJQJOKRMWRZQZPZNXW_W\V^W`V\U\V^N\M\Tb]ebcehafekhmhmwtmnsrvrptwsnpxxvuwvtkrusrqsvv{vӁ֒۞ٙڡܩՖϊȃǞܾĸĹŴ俵´ȺĺIJïŶĻͳAS-C1G0F6J9L8M;P;P<P@SGXQ]]_ihqlzm~mq|l}o|l}m|q|vskppglZcBT$Ab9W;fB,HDUKVX`gbojtlwpthpgsjpgndqfocncrjohrcrjqepduluk}prZV @Y@V@V;Z>Y;\>a<c>h>hAd>gBfA_>Z>X?a?n Bm$E]=Z@]D^D_@^Ab"Gh*Xl.Yv7b:_Jgatt|yw~{Ёx|xonwԋRPDH2F2F7H>N>L:I8H:H2D4HAMQQc^q\xbffnsqsunlj|dn``TOM@H3G+F1J4O<PBRARBPFSAUBNBNASDMDSCRFRCOBQJTHNGNJPMPQYPTRYUWRQTSUXTYVXV^Z`Z[ZZ]_TXTTKRHQNSSZPZLWT`R_W^T^V]TVJTS\HYP\TaZcV_ehblfnabghlhijrqgjtwvsrswr{zzvnlhowtlmyyyv{zא֒ک֔юŀ}ФǼƶȹ÷ửĸƿ˼ŵǽݻڶƾùʽɹɼ̾@M0F,D3G3H7K8L7K6O?OHXRX^[ifphxn}p~p}l~tzi~sv|rvnphb`VZ<J%B_
6P8`@v$F<UGWV^c`jgpkvlvmujpephldqflbpiphndqhpjqhsethxi|mmb7F^;R:R:W?X<]@bAh@fAg@g?j!De@`:X<R9^;fBpBfBV<[@^>aC_AaBfLi&Tr5b~8bPnbwv}~|zw|sqr{qԋ|ؐ{CK9I3F5N6G:L:K;K9L6F1D8J=IPTbYnZw`ijvpsurnul~in^e`RRLT2F)E4I5K;O<MBQ?MDPET?OAPAM@LCQDPBNHQFNFSFMERJRPTOTQRX]UWRTSVQVVXVXVZW\ZabaYZX_Q\PZU]IURZNZNXR\S\X\U^SUOZRVXdV\ZgX\\i`b\dkl_fhleaotlhbdrsoltrtnyvzvlorxssosrrtwyyւ{ҀԔڞՑxzt|٬ø¶´µ÷¸ûôɻིıหݼ¸úʹĸ°Ʊ²ƺɿŶ`t>O,B.B0B2F:G4K:NDQRZ]^hboixk}s~m}q~ryl{p~rynwnphdaY_<K">c9UBWFg G3MBTIU\\bbmhtntnufrbnbndmbmfmeoirlqjrhsjxjylzltiNPq>Z?Q 9V8W;W=`BfDjEj"DfAe@dBb;^<Z<[?iBnBiA[=X=aE`BbDd Fj*Qf&Qg"Nu3]Ijdtry{|~{{xvut~uЈy֎}ג;L2F6J6J7H;K>P:G;N9L4H4GDPOS^UmZyhfhmprtrllkydj[^VTSDL7K*C+B+E9L;Q@P?RBRCRBQDU@OCN@OBODOAOFPFRJOJQJSMUOZRVTYSUSVNQT[VWXXV]WY_ae^QVNTLVQWTZPVOWLTRXQWT[V^T\OVYcXc\dX`WdZbYaeifhbhjn`flrtrkotrfmnsurjjvmnnsrnlinrrpm|zxtvwӍٖԊ|ppo~̥߲幦ķ߹ƺɼȾ⺬Ļܾ۴ڿฦøʺŶིྶúú¸ʻ4F-F)A0F3H3H:LBOOZ\^icolwkp~p|lt~l|nzr}vztqldaVX>M&Af:X=X@`<p82H?LTZ[]geoivltgseqdqdmcmfkanfphrirjtkxlzlxh^Z*FZ;S:T
;V
;W:\@gAl"HjDhAhBg>f?]<Z:W>d>qCjC`@W@[BbB`CcD`Ie"Jh$Rl(S;_[nrzzz{z|vvx|zӌ}ՔՐ}ד:N4H7J<J8J9J7H8J<N8N5G6H?MPO^Xpbu`jnpjvzstrmzbpabYRSBM5F+C,D0C7H9J=N@Q@RGSCPBNDPEO@MFPAOHVIQDPHNHOMSJSMSPWTVRUSVV\TVTZX[TUW\i`_\HTIRHRKTTZPTN\NUNXNVQZTZV\NXXbW\XZXbX\_hdmbcfnba`jnufkorppfknppot{rpptllnmirlklsrtoqxy~{ӌЀ{imÂױὮݵⴠۺ߶ƶ弧ĵ´ܺ༯¹ݼǶܶݼݻļļŹȻƼǼȾʾʽıFP$@)D/F2G6KBOMTX\hdrkzn~p~p|n~s{myk~su߃lgdfRX@L'Dj<Z>U:W
9f9~;4JFVV]a`gethtgterfn_lblbqgpgndqitlulxm{kj`8Ib5T8T
8T9Y<\<^<h@i@jDl HgBfBfA\?V;`?kDlA`>^?\D\=fFbCc I`Lb!Nm$R{9^Rinxwxy|xvyzxxzщ~א~֑֓ؑ~<N7K9L<I<K:K<M=K:L9J6K9LANNMb\pbvdjprxtzwrsizdo`_XTVFN<O*D(B0F2F:K=M<KBP@N@NBSCQFRBODPFQEO@IFREJJNLRLQNSTVTWVXWXTVVXUXUXWZd^cYRULTPWEQLWOTRWOXRXNVQUR\NWPYTZU`RZWZYb^ffghlgj^dlspompwwsrhqzwjlnnonkrpofhlphjbmrsprtnnnkqrpnxɒܱ⺩⽮ڶ㼣۽ಠḧܺ߷ߵܾĴĮǸȾƻȾʼȼʺ̻̽ŰϾμ³}}%A"='@.C6L?OMV`afdocxsr}s|o~pzp|rzrpxrldb_RW@L'Dl:^=W:W4`;m:)C<LGS`adcohuitgtfqem`lakbndritjtkyn|rsdPTr;Z>T:V<V<Z>`Af@j Bh@i@h=fBeDa<[@_AgAjBf H\>\>c"Gb@cBaD`I]Hb Nv3\Vnlxywxw|zwxxxz΅~Ӑ}֔֔גՎ}4J8H:L<M<N<K<K?J<J;P6J>PBNUYaZo`uanopruvrpojzepbbXRTBM<R*D,H/F8K<M?N?LAM>Q>MFUIVBL@MBPBOEMDQDQELIPLSJQNVPVRXTWVZXYVYRXPU\_݊uSTHMBPEPEPEPNRRXV[RXKTSUOXTXU^PVR\X_VbX``_hkadfrrrijuvwunorvljnpvwqynturflmrlrlmhhmrrlknemjs|њܦᶡඦྰ߯߸ܸ۱ܸڴຮອݶžƷᾶƱɾ߽ƲʿȾƺȼʾøŸʻ̾ʾȼξؼξVjv:~"@)A4H>KNVZYd`ngyozl~p|ozm}pzr|o~uwnnkdcTZBN-Hj<\8[9X6X5b
5v6+E>JWZ][fcnfritendk_k`jbjatjrhtlznygc\(F^;V<V;\=Z>^<d=i>i>h@f@eBh"DcA^@[?dAh Fc<\;V:^?`Bc?h$IZB]H\Mp(TNjlx{||xvxyqusv~xҊ֔֔ՓՒԐ~6K4J:K>P<L;K>N@N=K:L:N;LGSQWc\lZvbmnpprtshrj{fp_f`RSDO6L,G,F/F5K:N<N>K<O?L?LCRFUCPDT@L@MBNDOFNFNHPKRMTPWMVPVV[QVQUQUNVNWބpmNRAMDPIUDOJQNZMRQYPTMTOUQXQVMWP\PZW`[^^hZ\\fmujm`jsrsssurn\`nsqnptyznqqsrrenio^hbnll`jbldr͕۲ڨڢޭỰ漤༯ݱ߸شٰܳڦڲڷļķĺƼἴƷƲõǿķʼ;ȺȸʼʻɼƸظɮ~*D~ ?#B/D;HHR[Zd]ofvl{n}n}l~o~t{r}r|wvpombdXYFR,En=]<^<]>Z7[
7f5~>2FDNUS`Zh`obvirak^j\k`lbrerhwpzmma>Ib:X>X<X=Z<X>`;iAj>hAgBi!EhAdC`@Z?^>gBfD`CY>^@dAfB`>_AVA_Kj%R?acwy}}{|rtnvpsҌ}ҏԒՑ~Ք֓~֑<J8I:L?L;L>L9J7I:J9J7L4FCPSX`Wnbzempoosqttro|ipccbRSEP<S,I,G3J5J8K<L<LANDRBOBPCRCNFPCPAOBNEMDPFMGOKRNSSYQTSXRXPNTVORPVTZꩄbEL=JDNKTHVNZRZLTR[LVOTNWPXMXT^U]X^V``f^dYcbb]cjqjpotztghajlrleiourjsorlochmn`j`f`b`j\ft~ӝݠ⸧ݬޮ߰崛ತ߶ܱ߶٭۲ڨװٴཱྲྀ³ĻĹƺ⽫ɹƽȺʼǺȽķĸĺĶѿft;J B*B8HFOUVbZnfvj|l~o|mq~qzt~tznxolgcdTVCR+Er>^;\>^9\7[ 6^4m5"=8FIOVU`Xj`qbpbj[j\h[n`qdtjwlvkRTt=V<V9U<Y=[=`Ed<j?f>h<gBfAf@cCZ>^BcBiDcBZA^DaCjBiF`@X@R=`I<d`wyЀ}|xzrqns~|͆}Ԍ{ՐԐ|֎|ԏ~ԓ֑}>P<J:H<J<M8L;L>M<J6H7K7KAPOTaZpewelnnqoopsxu|irde`VTEQ5M,H-K1J7M4F;L<L?MAOALBOFSDSFTFSDQDODVFRLXNVNUKRPTMUOVSXT\PXJUK\mduYBKBLEOHUKWKVJVLTNXKUPURWPWZ\Z^VZY_Z^Zbde^dalhlopppwnbchpjiilhstmjoqrmjflehahdeQ`PdVi֞ݙܯⰛఢ᳢ܦޮܯ߹ܹݯՠڶܸỪ߾ܶżżƴ°IJŽŸżĵµµǺ̻ĺXft='C2HHRZ^d`mfugzl|nzm~r}n~w|r|txpnib`SZDT.Jr?b>`<_:`:\5\5]5l5$>:GHNVXvyҐ֣֟Њi`nd܄}zjwfcZ'D[=YAW;[@Z;`Bb@h?j$Ig?f=iEhDdB_C^Bd>fDeE\?\BbBhBi!Cb>X=P9T@r*SUtt|}~}~x{pwprzuшӌ}Ռ֑|ԏԎ|ԎՎ|Ռ|<L@P;L:H<N>O=J=O:M:L0F4G>PMPd_pdxchnmrossovt}ir`c\SVFT4N.J+G2L6L7K>N>N:L>K<JBPAOFRIVBQDQETGXMZLYGQLSPWKRQZRVRVLRLTIXQ]誊b`?RIUHYFSFVGONWHUPWNTPTORPUSVV]YaR[[baa^gblioinsqhgfnklihhrnklhlvrupumrbg^lceP`Od`p̘ݦܨ۪ᯕ⯣㷜ޱަۯۨ߶ݰެԠӣܴྴ俲ᾮ۷ඦ߿ĶǾǻöƹƻĻƶƺصĽƼ̻Ǹɾ˰}"B~ C0IFTXXccldxoyhxlyj}p|q{q~t}s~wpl``X[FU+FpD`;]>a:_:[7\6X5Z diff --git a/contrib/ffmpeg/tests/libav.regression.ref b/contrib/ffmpeg/tests/libav.regression.ref index a5ea5f15d..a498d6799 100644 --- a/contrib/ffmpeg/tests/libav.regression.ref +++ b/contrib/ffmpeg/tests/libav.regression.ref @@ -2,35 +2,35 @@ ffmpeg regression test 8a0536ccfe36f4fff408b3327d33e1dd *./data/b-libav.avi 340344 ./data/b-libav.avi ./data/b-libav.avi CRC=0x400c29e9 -85caa242a36abeab85a27c82ba73cc28 *./data/b-libav.asf -339767 ./data/b-libav.asf +786446e80ead936e5faa8f5908f19281 *./data/b-libav.asf +339775 ./data/b-libav.asf ./data/b-libav.asf CRC=0x74113749 -1ad618e9fd318eb3483270cf9b9b3f43 *./data/b-libav.rm +1ce78eeb6881ffe5b649a9b5105de919 *./data/b-libav.rm 355405 ./data/b-libav.rm bdb7484c68db722f66ba1630cf79844c *./data/b-libav.mpg 378880 ./data/b-libav.mpg ./data/b-libav.mpg CRC=0x2b71a386 -0bf8fb3b4d7bb70ed89356e94cd8ffa2 *./data/b-libav.ts -471316 ./data/b-libav.ts +322d59758fe9446147223a607d1699bc *./data/b-libav.ts +471692 ./data/b-libav.ts ./data/b-libav.ts CRC=0xcc4948e1 -16cf1c37c123f8d3c4a31d192d9b0cc6 *./data/b-libav.swf -41836 ./data/b-libav.swf -./data/b-libav.swf CRC=0xcdec36a1 -87a8c8be5db2513356b28f29dff5769e *./data/b-libav.ffm +d6fdeb9f7083cc827f9510c6c4517dc0 *./data/b-libav.swf +335771 ./data/b-libav.swf +./data/b-libav.swf CRC=0xe14e8847 +a1cd7fff97d5e4c83f0d18a22d51c552 *./data/b-libav.ffm 380928 ./data/b-libav.ffm ./data/b-libav.ffm CRC=0x01522b4a -5e8aa303a877cfac6569ed11cf20e92b *./data/b-libav.flv -335810 ./data/b-libav.flv +f8ad5bd78f4d012a8ce9570aa395ac54 *./data/b-libav.flv +335833 ./data/b-libav.flv ./data/b-libav.flv CRC=0xe14e8847 16518706f425cb537362bfc1c58b8de5 *./data/b-libav.mov 366923 ./data/b-libav.mov ./data/b-libav.mov CRC=0x45079dca -26c41db318d9aacfd6b9e734c0ea4d94 *./data/b-libav.dv +7820fa85ab86c62028d8dbda94589573 *./data/b-libav.dv 3600000 ./data/b-libav.dv -./data/b-libav.dv CRC=0xa6b8b635 -2b3f921fb7a01bb126cab5ee21ae3f8d *./data/b-libav.gxf -815700 ./data/b-libav.gxf -./data/b-libav.gxf CRC=0x238a01b0 +./data/b-libav.dv CRC=0xf517e829 +feb04ba3cf4f607d5527664eb69ec72e *./data/b-libav.gxf +814640 ./data/b-libav.gxf +./data/b-libav.gxf CRC=0xa376c09e 9a9da315747599f7718cc9a9a09c21ff *./data/b-libav.pbm 317075 ./data/b-libav.pbm ./data/b-libav.pbm CRC=0xb92906cb @@ -45,8 +45,15 @@ bdb7484c68db722f66ba1630cf79844c *./data/b-libav.mpg b977a4fedff90a79baf70c8e02986820 *./data/b-libav.y4m 3801810 ./data/b-libav.y4m ./data/b-libav%02d.pgm CRC=0x84c09106 +de216b43403f51e57e644fbf812568bf *./data/b-libav02.pgm ./data/b-libav%02d.ppm CRC=0x25c06ecf +86bbdb77afa289ff363120f8044f29df *./data/b-libav02.ppm +./data/b-libav%02d.bmp CRC=0xf3a66ecf +c3a9f333ddebff6eae3f4360bad2de29 *./data/b-libav02.bmp +./data/b-libav%02d.tga CRC=0xf3a66ecf +f558eef0740c4b247f1eb17e1dbf7adf *./data/b-libav02.tga ./data/b-libav%02d.jpg CRC=0x62328baa +5d6c53e5297c4485e26c25e37885376f *./data/b-libav02.jpg b0a8c8063d81921db5d7c8f50a1cc454 *./data/b-libav.wav 89132 ./data/b-libav.wav ./data/b-libav.wav CRC=0x2a09519c @@ -62,8 +69,8 @@ e2a6d6fae17394dfe87cb5bb8ae11837 *./data/b-libav.al 272b91d8fc31ed43b08246d182719751 *./data/b-libav.mmf 22609 ./data/b-libav.mmf ./data/b-libav.mmf CRC=0x03633476 -c8cf5bac13fb7862bcbce76977328f92 *./data/b-libav.aif -89160 ./data/b-libav.aif +ae3a23a7ea13c92a2909445ca8144dcd *./data/b-libav.aif +89142 ./data/b-libav.aif ./data/b-libav.aif CRC=0x2a09519c 8d117c49d6b210abe783d1b0b897cec7 *./data/b-libav.voc 32768 ./data/b-libav.voc @@ -74,8 +81,8 @@ ce356ce2708cb6033ab5d762da93cfd4 *./data/b-libav-yuv422p.yuv 304128 ./data/b-libav-yuv422p.yuv ce356ce2708cb6033ab5d762da93cfd4 *./data/b-libav-yuv444p.yuv 304128 ./data/b-libav-yuv444p.yuv -ce356ce2708cb6033ab5d762da93cfd4 *./data/b-libav-yuv422.yuv - 304128 ./data/b-libav-yuv422.yuv +ce356ce2708cb6033ab5d762da93cfd4 *./data/b-libav-yuyv422.yuv + 304128 ./data/b-libav-yuyv422.yuv 545f61c353a8b4419808785cb4f0069d *./data/b-libav-yuv410p.yuv 304128 ./data/b-libav-yuv410p.yuv d6c03f930018ff859bd43f52b92e9321 *./data/b-libav-yuv411p.yuv @@ -90,8 +97,8 @@ deb2f7ebe297df2c1fe264d19b34d2fb *./data/b-libav-rgb24.yuv 304128 ./data/b-libav-rgb24.yuv deb2f7ebe297df2c1fe264d19b34d2fb *./data/b-libav-bgr24.yuv 304128 ./data/b-libav-bgr24.yuv -deb2f7ebe297df2c1fe264d19b34d2fb *./data/b-libav-rgba32.yuv - 304128 ./data/b-libav-rgba32.yuv +deb2f7ebe297df2c1fe264d19b34d2fb *./data/b-libav-rgb32.yuv + 304128 ./data/b-libav-rgb32.yuv 5d395f62bff8ac475f743268c772ca3a *./data/b-libav-rgb565.yuv 304128 ./data/b-libav-rgb565.yuv 2ffd6871fcbfe9570454e8703ac8ea01 *./data/b-libav-rgb555.yuv diff --git a/contrib/ffmpeg/tests/regression.sh b/contrib/ffmpeg/tests/regression.sh index 70f4eba12..c4c2f776b 100755 --- a/contrib/ffmpeg/tests/regression.sh +++ b/contrib/ffmpeg/tests/regression.sh @@ -4,7 +4,7 @@ # # #set -x -# Even in the 21st century some diffs are not supporting -u. +# Even in the 21st century some diffs do not support -u. diff -u "$0" "$0" > /dev/null 2>&1 if [ $? -eq 0 ]; then diff_cmd="diff -u" @@ -24,7 +24,7 @@ datadir="./data" logfile="$datadir/ffmpeg.regression" outfile="$datadir/a-" -# tests to do +# tests to run if [ "$1" = "mpeg4" ] ; then do_mpeg4=y elif [ "$1" = "mpeg" ] ; then @@ -41,7 +41,7 @@ elif [ "$1" = "snow" ] ; then elif [ "$1" = "snowll" ] ; then do_snowll=y elif [ "$1" = "libavtest" ] ; then - do_libav=y + do_libavtest=y logfile="$datadir/libav.regression" outfile="$datadir/b-" else @@ -69,6 +69,8 @@ else do_adpcm_ima_wav=y do_adpcm_ms=y do_flac=y + do_wma=y + do_vorbis=y do_rc=y do_mpeg4adv=y do_mpeg4thread=y @@ -93,6 +95,8 @@ ffmpeg="../ffmpeg_g" tiny_psnr="./tiny_psnr" reffile="$2" benchfile="$datadir/ffmpeg.bench" +bench="$datadir/bench.tmp" +bench2="$datadir/bench2.tmp" raw_src="$3/%02d.pgm" raw_dst="$datadir/out.yuv" raw_ref="$datadir/ref.yuv" @@ -107,7 +111,7 @@ else do_md5sum() { echo No md5sum program found; } fi -# create the data directory if it does not exists +# create the data directory if it does not exist mkdir -p $datadir FFMPEG_OPTS="-y -flags +bitexact -dct fastint -idct simple" @@ -117,7 +121,7 @@ do_ffmpeg() f="$1" shift echo $ffmpeg $FFMPEG_OPTS $* - $ffmpeg $FFMPEG_OPTS -benchmark $* > $datadir/bench.tmp 2> /tmp/ffmpeg$$ + $ffmpeg $FFMPEG_OPTS -benchmark $* > $bench 2> /tmp/ffmpeg$$ egrep -v "^(Stream|Press|Input|Output|frame| Stream| Duration|video:)" /tmp/ffmpeg$$ || true rm -f /tmp/ffmpeg$$ do_md5sum $f >> $logfile @@ -128,8 +132,27 @@ do_ffmpeg() else wc -c $f >> $logfile fi - expr "`cat $datadir/bench.tmp`" : '.*utime=\(.*s\)' > $datadir/bench2.tmp - echo `cat $datadir/bench2.tmp` $f >> $benchfile + expr "`cat $bench`" : '.*utime=\(.*s\)' > $bench2 + echo `cat $bench2` $f >> $benchfile +} + +do_ffmpeg_nomd5() +{ + f="$1" + shift + echo $ffmpeg $FFMPEG_OPTS $* + $ffmpeg $FFMPEG_OPTS -benchmark $* > $bench 2> /tmp/ffmpeg$$ + egrep -v "^(Stream|Press|Input|Output|frame| Stream| Duration|video:)" /tmp/ffmpeg$$ || true + rm -f /tmp/ffmpeg$$ + if [ $f = $raw_dst ] ; then + $tiny_psnr $f $raw_ref >> $logfile + elif [ $f = $pcm_dst ] ; then + $tiny_psnr $f $pcm_ref 2 >> $logfile + else + wc -c $f >> $logfile + fi + expr "`cat $bench`" : '.*utime=\(.*s\)' > $bench2 + echo `cat $bench2` $f >> $benchfile } do_ffmpeg_crc() @@ -148,27 +171,28 @@ do_ffmpeg_nocheck() f="$1" shift echo $ffmpeg $FFMPEG_OPTS $* - $ffmpeg $FFMPEG_OPTS -benchmark $* > $datadir/bench.tmp 2> /tmp/ffmpeg$$ + $ffmpeg $FFMPEG_OPTS -benchmark $* > $bench 2> /tmp/ffmpeg$$ egrep -v "^(Stream|Press|Input|Output|frame| Stream| Duration|video:)" /tmp/ffmpeg$$ || true rm -f /tmp/ffmpeg$$ - expr "`cat $datadir/bench.tmp`" : '.*utime=\(.*s\)' > $datadir/bench2.tmp - echo `cat $datadir/bench2.tmp` $f >> $benchfile + expr "`cat $bench`" : '.*utime=\(.*s\)' > $bench2 + echo `cat $bench2` $f >> $benchfile } do_video_decoding() { - do_ffmpeg $raw_dst -y -i $file -f rawvideo $@ $raw_dst + do_ffmpeg $raw_dst -y $1 -i $file -f rawvideo $2 $raw_dst } do_video_encoding() { - do_ffmpeg $file -y $1 -f pgmyuv -i $raw_src $2 $file + file=${outfile}$1 + do_ffmpeg $file -y $2 -f $3 -i $raw_src $4 $file } do_audio_encoding() { file=${outfile}$1 - do_ffmpeg $file -y -ab 128 -ac 2 -f s16le -i $pcm_src $3 $file + do_ffmpeg $file -y -ab 128k -ac 2 -f s16le -i $pcm_src $3 $file } do_audio_decoding() @@ -196,7 +220,7 @@ do_image_formats() file=${outfile}libav%02d.$1 $ffmpeg -t 0.5 -y -qscale 10 -f pgmyuv -i $raw_src $2 $3 $file do_ffmpeg_crc $file $3 -i $file - + do_md5sum ${outfile}libav02.$1 >> $logfile } do_audio_only() @@ -212,44 +236,33 @@ echo "ffmpeg benchmarks" > $benchfile ################################### # generate reference for quality check do_ffmpeg_nocheck $raw_ref -y -f pgmyuv -i $raw_src -an -f rawvideo $raw_ref -do_ffmpeg_nocheck $pcm_ref -y -ab 128 -ac 2 -ar 44100 -f s16le -i $pcm_src -f wav $pcm_ref +do_ffmpeg_nocheck $pcm_ref -y -ab 128k -ac 2 -ar 44100 -f s16le -i $pcm_src -f wav $pcm_ref ################################### if [ -n "$do_mpeg" ] ; then -# mpeg1 encoding -file=${outfile}mpeg1.mpg -do_video_encoding "-qscale 10" "-f mpeg1video" - -# mpeg1 decoding +# mpeg1 +do_video_encoding mpeg1.mpg "-qscale 10" pgmyuv "-f mpeg1video" do_video_decoding fi ################################### if [ -n "$do_mpeg2" ] ; then -# mpeg2 encoding -file=${outfile}mpeg2.mpg -do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video" - -# mpeg2 decoding +# mpeg2 +do_video_encoding mpeg2.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -f mpeg1video" do_video_decoding -# mpeg2 encoding using intra vlc -file=${outfile}mpeg2ivlc.mpg -do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video -flags2 +ivlc" +# mpeg2 encoding intra vlc qprd +do_video_encoding mpeg2ivlc-qprd.mpg "-vb 500k -bf 2 -flags +trell+qprd+mv0 -flags2 +ivlc -cmp 2 -subcmp 2 -mbd rd" pgmyuv "-vcodec mpeg2video -f mpeg2video" # mpeg2 decoding do_video_decoding -# mpeg2 encoding -file=${outfile}mpeg2.mpg -do_video_encoding "-qscale 10" "-vcodec mpeg2video -idct int -dct int -f mpeg1video" - -# mpeg2 decoding -do_ffmpeg $raw_dst -y -idct int -i $file -f rawvideo $raw_dst +# mpeg2 +do_video_encoding mpeg2.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -idct int -dct int -f mpeg1video" +do_video_decoding "-idct int" # mpeg2 encoding interlaced -file=${outfile}mpeg2i.mpg -do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video -flags +ildct+ilme" +do_video_encoding mpeg2i.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -f mpeg1video -flags +ildct+ilme" # mpeg2 decoding do_video_decoding @@ -258,15 +271,13 @@ fi ################################### if [ -n "$do_mpeg2thread" ] ; then # mpeg2 encoding interlaced -file=${outfile}mpeg2thread.mpg -do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video -bf 2 -flags +ildct+ilme -threads 2" +do_video_encoding mpeg2thread.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -f mpeg1video -bf 2 -flags +ildct+ilme -threads 2" # mpeg2 decoding do_video_decoding # mpeg2 encoding interlaced using intra vlc -file=${outfile}mpeg2threadivlc.mpg -do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video -bf 2 -flags +ildct+ilme -flags2 +ivlc -threads 2" +do_video_encoding mpeg2threadivlc.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -f mpeg1video -bf 2 -flags +ildct+ilme -flags2 +ivlc -threads 2" # mpeg2 decoding do_video_decoding @@ -281,381 +292,301 @@ fi ################################### if [ -n "$do_msmpeg4v2" ] ; then -# msmpeg4 encoding -file=${outfile}msmpeg4v2.avi -do_video_encoding "-qscale 10" "-an -vcodec msmpeg4v2" - -# msmpeg4v2 decoding +# msmpeg4 +do_video_encoding msmpeg4v2.avi "-qscale 10" pgmyuv "-an -vcodec msmpeg4v2" do_video_decoding fi ################################### if [ -n "$do_msmpeg4" ] ; then -# msmpeg4 encoding -file=${outfile}msmpeg4.avi -do_video_encoding "-qscale 10" "-an -vcodec msmpeg4" - -# msmpeg4 decoding +# msmpeg4 +do_video_encoding msmpeg4.avi "-qscale 10" pgmyuv "-an -vcodec msmpeg4" do_video_decoding fi ################################### if [ -n "$do_wmv1" ] ; then -# wmv1 encoding -file=${outfile}wmv1.avi -do_video_encoding "-qscale 10" "-an -vcodec wmv1" - -# wmv1 decoding +# wmv1 +do_video_encoding wmv1.avi "-qscale 10" pgmyuv "-an -vcodec wmv1" do_video_decoding fi ################################### if [ -n "$do_wmv2" ] ; then -# wmv2 encoding -file=${outfile}wmv2.avi -do_video_encoding "-qscale 10" "-an -vcodec wmv2" - -# wmv2 decoding +# wmv2 +do_video_encoding wmv2.avi "-qscale 10" pgmyuv "-an -vcodec wmv2" do_video_decoding fi ################################### if [ -n "$do_h261" ] ; then -# h261 encoding -file=${outfile}h261.avi -do_video_encoding "-qscale 11" "-s 352x288 -an -vcodec h261" - -# h261 decoding +# h261 +do_video_encoding h261.avi "-qscale 11" pgmyuv "-s 352x288 -an -vcodec h261" do_video_decoding fi ################################### if [ -n "$do_h263" ] ; then -# h263 encoding -file=${outfile}h263.avi -do_video_encoding "-qscale 10" "-s 352x288 -an -vcodec h263" - -# h263 decoding +# h263 +do_video_encoding h263.avi "-qscale 10" pgmyuv "-s 352x288 -an -vcodec h263" do_video_decoding fi ################################### if [ -n "$do_h263p" ] ; then -# h263p encoding -file=${outfile}h263p.avi -do_video_encoding "-qscale 2 -flags +umv+aiv+aic" "-s 352x288 -an -vcodec h263p -ps 300" - -# h263p decoding +# h263p +do_video_encoding h263p.avi "-qscale 2 -flags +umv+aiv+aic" pgmyuv "-s 352x288 -an -vcodec h263p -ps 300" do_video_decoding fi ################################### if [ -n "$do_mpeg4" ] ; then # mpeg4 -file=${outfile}odivx.mp4 -do_video_encoding "-flags +mv4 -mbd bits -qscale 10" "-an -vcodec mpeg4" - -# mpeg4 decoding +do_video_encoding odivx.mp4 "-flags +mv4 -mbd bits -qscale 10" pgmyuv "-an -vcodec mpeg4" do_video_decoding fi ################################### if [ -n "$do_huffyuv" ] ; then # huffyuv -file=${outfile}huffyuv.avi -do_video_encoding "" "-an -vcodec huffyuv -pix_fmt yuv422p" - -# huffyuv decoding -do_video_decoding -strict -2 -pix_fmt yuv420p +do_video_encoding huffyuv.avi "" pgmyuv "-an -vcodec huffyuv -pix_fmt yuv422p" +do_video_decoding "" "-strict -2 -pix_fmt yuv420p" fi ################################### if [ -n "$do_rc" ] ; then # mpeg4 rate control -file=${outfile}mpeg4-rc.avi -do_video_encoding "-b 400k -bf 2" "-an -vcodec mpeg4" - -# mpeg4 rate control decoding +do_video_encoding mpeg4-rc.avi "-b 400k -bf 2" pgmyuv "-an -vcodec mpeg4" do_video_decoding fi ################################### if [ -n "$do_mpeg4adv" ] ; then # mpeg4 -file=${outfile}mpeg4-adv.avi -do_video_encoding "-qscale 9 -flags +mv4+part+aic+trell -mbd bits -ps 200" "-an -vcodec mpeg4" +do_video_encoding mpeg4-adv.avi "-qscale 9 -flags +mv4+part+aic+trell -mbd bits -ps 200" pgmyuv "-an -vcodec mpeg4" +do_video_decoding -# mpeg4 decoding +# mpeg4 +do_video_encoding mpeg4-qprd.avi "-b 450k -bf 2 -flags +mv4+trell+qprd+mv0 -cmp 2 -subcmp 2 -mbd rd" pgmyuv "-an -vcodec mpeg4" do_video_decoding -fi -################################### -if [ -n "$do_mpeg4thread" ] ; then # mpeg4 -file=${outfile}mpeg4-thread.avi -do_video_encoding "-b 500k -flags +mv4+part+aic+trell -mbd bits -ps 200 -bf 2" "-an -vcodec mpeg4 -threads 2" +do_video_encoding mpeg4-adap.avi "-b 550k -bf 2 -flags +mv4+trell+mv0 -cmp 1 -subcmp 2 -mbd rd -scplx_mask 0.3" pgmyuv "-an -vcodec mpeg4" +do_video_decoding -# mpeg4 decoding +# mpeg4 +do_video_encoding mpeg4-Q.avi "-qscale 7 -flags +mv4+qpel -mbd 2 -bf 2 -cmp 1 -subcmp 2" pgmyuv "-an -vcodec mpeg4" do_video_decoding fi ################################### -if [ -n "$do_mpeg4adv" ] ; then +if [ -n "$do_mpeg4thread" ] ; then # mpeg4 -file=${outfile}mpeg4-Q.avi -do_video_encoding "-qscale 7 -flags +mv4+qpel -mbd 2 -bf 2 -cmp 1 -subcmp 2" "-an -vcodec mpeg4" - -# mpeg4 decoding +do_video_encoding mpeg4-thread.avi "-b 500k -flags +mv4+part+aic+trell -mbd bits -ps 200 -bf 2" pgmyuv "-an -vcodec mpeg4 -threads 2" do_video_decoding fi ################################### if [ -n "$do_mp4psp" ] ; then # mp4 PSP style -file=${outfile}mpeg4-PSP.mp4 -do_ffmpeg $file -y -b 768k -s 320x240 -f psp -ar 24000 -ab 32 -i $raw_src $file +do_video_encoding mpeg4-PSP.mp4 "-vb 768k -s 320x240" psp "-ar 24000 -ab 32k -i $raw_src" fi ################################### if [ -n "$do_error" ] ; then # damaged mpeg4 -file=${outfile}error-mpeg4-adv.avi -do_video_encoding "-qscale 7 -flags +mv4+part+aic -mbd rd -ps 250 -error 10" "-an -vcodec mpeg4" - -# damaged mpeg4 decoding +do_video_encoding error-mpeg4-adv.avi "-qscale 7 -flags +mv4+part+aic -mbd rd -ps 250 -error 10" pgmyuv "-an -vcodec mpeg4" do_video_decoding fi ################################### if [ -n "$do_mpeg4nr" ] ; then # noise reduction -file=${outfile}mpeg4-nr.avi -do_video_encoding "-qscale 8 -flags +mv4 -mbd rd -nr 200" "-an -vcodec mpeg4" - -# mpeg4 decoding +do_video_encoding mpeg4-nr.avi "-qscale 8 -flags +mv4 -mbd rd -nr 200" pgmyuv "-an -vcodec mpeg4" do_video_decoding fi ################################### if [ -n "$do_mpeg1b" ] ; then # mpeg1 -file=${outfile}mpeg1b.mpg -do_video_encoding "-qscale 8 -bf 3 -ps 200" "-an -vcodec mpeg1video -f mpeg1video" - -# mpeg1 decoding +do_video_encoding mpeg1b.mpg "-qscale 8 -bf 3 -ps 200" pgmyuv "-an -vcodec mpeg1video -f mpeg1video" do_video_decoding fi ################################### if [ -n "$do_mjpeg" ] ; then # mjpeg -file=${outfile}mjpeg.avi -do_video_encoding "-qscale 10" "-an -vcodec mjpeg -pix_fmt yuvj420p" - -# mjpeg decoding -do_video_decoding -pix_fmt yuv420p +do_video_encoding mjpeg.avi "-qscale 10" pgmyuv "-an -vcodec mjpeg -pix_fmt yuvj420p" +do_video_decoding "" "-pix_fmt yuv420p" fi ################################### if [ -n "$do_ljpeg" ] ; then # ljpeg -file=${outfile}ljpeg.avi -do_video_encoding "" "-an -vcodec ljpeg -strict -1" - -# ljpeg decoding +do_video_encoding ljpeg.avi "" pgmyuv "-an -vcodec ljpeg -strict -1" do_video_decoding fi ################################### if [ -n "$do_jpegls" ] ; then # jpeg ls -file=${outfile}jpegls.avi -do_video_encoding "" "-an -vcodec jpegls -vtag MJPG" - -# jpeg ls decoding -do_video_decoding -pix_fmt yuv420p +do_video_encoding jpegls.avi "" pgmyuv "-an -vcodec jpegls -vtag MJPG" +do_video_decoding "" "-pix_fmt yuv420p" fi ################################### if [ -n "$do_rv10" ] ; then # rv10 encoding -file=${outfile}rv10.rm -do_video_encoding "-qscale 10" "-an" - -# rv10 decoding +do_video_encoding rv10.rm "-qscale 10" pgmyuv "-an" do_video_decoding fi ################################### if [ -n "$do_rv20" ] ; then # rv20 encoding -file=${outfile}rv20.rm -do_video_encoding "-qscale 10" "-vcodec rv20 -an" - -# rv20 decoding +do_video_encoding rv20.rm "-qscale 10" pgmyuv "-vcodec rv20 -an" do_video_decoding fi ################################### if [ -n "$do_asv1" ] ; then # asv1 encoding -file=${outfile}asv1.avi -do_video_encoding "-qscale 10" "-an -vcodec asv1" - -# asv1 decoding +do_video_encoding asv1.avi "-qscale 10" pgmyuv "-an -vcodec asv1" do_video_decoding fi ################################### if [ -n "$do_asv2" ] ; then # asv2 encoding -file=${outfile}asv2.avi -do_video_encoding "-qscale 10" "-an -vcodec asv2" - -# asv2 decoding +do_video_encoding asv2.avi "-qscale 10" pgmyuv "-an -vcodec asv2" do_video_decoding fi ################################### if [ -n "$do_flv" ] ; then # flv encoding -file=${outfile}flv.flv -do_video_encoding "-qscale 10" "-an -vcodec flv" - -# flv decoding +do_video_encoding flv.flv "-qscale 10" pgmyuv "-an -vcodec flv" do_video_decoding fi ################################### if [ -n "$do_ffv1" ] ; then # ffv1 encoding -file=${outfile}ffv1.avi -do_video_encoding "-strict -2" "-an -vcodec ffv1" - -# ffv1 decoding +do_video_encoding ffv1.avi "-strict -2" pgmyuv "-an -vcodec ffv1" do_video_decoding fi ################################### if [ -n "$do_snow" ] ; then -# snow encoding -file=${outfile}snow.avi -do_video_encoding "-strict -2" "-an -vcodec snow -qscale 2 -flags +qpel -me iter -dia_size 2 -cmp 12 -subcmp 12 -s 128x64" - -# snow decoding -do_video_decoding -s 352x288 +# snow +do_video_encoding snow.avi "-strict -2" pgmyuv "-an -vcodec snow -qscale 2 -flags +qpel -me iter -dia_size 2 -cmp 12 -subcmp 12 -s 128x64" +do_video_decoding "" "-s 352x288" fi ################################### if [ -n "$do_snowll" ] ; then -# snow encoding -file=${outfile}snow53.avi -do_video_encoding "-strict -2" "-an -vcodec snow -qscale .001 -pred 1 -flags +mv4+qpel" - -# snow decoding +# snow +do_video_encoding snow53.avi "-strict -2" pgmyuv "-an -vcodec snow -qscale .001 -pred 1 -flags +mv4+qpel" do_video_decoding fi ################################### if [ -n "$do_dv" ] ; then -# dv encoding -file=${outfile}dv.dv -do_video_encoding "-dct int" "-s pal -an" - -# dv decoding -do_video_decoding -s cif +# dv +do_video_encoding dv.dv "-dct int" pgmyuv "-s pal -an" +do_video_decoding "" "-s cif" fi ################################### if [ -n "$do_dv50" ] ; then -# dv50 encoding -file=${outfile}dv.dv -do_video_encoding "-dct int" "-s pal -pix_fmt yuv422p -an" - -# dv50 decoding -do_video_decoding -s cif -pix_fmt yuv420p +# dv50 +do_video_encoding dv.dv "-dct int" pgmyuv "-s pal -pix_fmt yuv422p -an" +do_video_decoding "" "-s cif -pix_fmt yuv420p" fi ################################### if [ -n "$do_svq1" ] ; then -# svq1 encoding -file=${outfile}svq1.mov -do_video_encoding "" "-an -vcodec svq1 -qscale 3 -pix_fmt yuv410p" - -# svq1 decoding -do_video_decoding -pix_fmt yuv420p +# svq1 +do_video_encoding svq1.mov "" pgmyuv "-an -vcodec svq1 -qscale 3 -pix_fmt yuv410p" +do_video_decoding "" "-pix_fmt yuv420p" fi ################################### if [ -n "$do_mp2" ] ; then -# mp2 encoding +# mp2 do_audio_encoding mp2.mp2 "-ar 44100" - -# mp2 decoding do_audio_decoding $tiny_psnr $pcm_dst $pcm_ref 2 1924 >> $logfile fi ################################### if [ -n "$do_ac3" ] ; then -# ac3 encoding +# ac3 do_audio_encoding ac3.rm "" -vn - -# ac3 decoding #do_audio_decoding fi ################################### if [ -n "$do_g726" ] ; then -# g726 encoding -do_audio_encoding g726.wav "-ar 44100" "-ab 32 -ac 1 -ar 8000 -acodec g726" - -# g726 decoding +# g726 +do_audio_encoding g726.wav "-ar 44100" "-ab 32k -ac 1 -ar 8000 -acodec g726" do_audio_decoding fi ################################### if [ -n "$do_adpcm_ima_wav" ] ; then -# encoding +# adpcm ima do_audio_encoding adpcm_ima.wav "-ar 44100" "-acodec adpcm_ima_wav" - -# decoding do_audio_decoding fi ################################### if [ -n "$do_adpcm_ms" ] ; then -# encoding +# adpcm ms do_audio_encoding adpcm_ms.wav "-ar 44100" "-acodec adpcm_ms" - -# decoding do_audio_decoding fi ################################### if [ -n "$do_adpcm_yam" ] ; then -# encoding +# adpcm yamaha do_audio_encoding adpcm_yam.wav "-ar 44100" "-acodec adpcm_yamaha" - -# decoding do_audio_decoding fi ################################### if [ -n "$do_flac" ] ; then -# encoding +# flac do_audio_encoding flac.flac "-ar 44100" "-acodec flac -compression_level 2" - -# decoding do_audio_decoding fi ################################### -# libav testing +if [ -n "$do_wma" ] ; then +# wmav1 +do_audio_encoding wmav1.asf "-ar 44100" "-acodec wmav1" +do_ffmpeg_nomd5 $pcm_dst -y -i $file -f wav $pcm_dst +$tiny_psnr $pcm_dst $pcm_ref 2 8192 >> $logfile +# wmav2 +do_audio_encoding wmav2.asf "-ar 44100" "-acodec wmav2" +do_ffmpeg_nomd5 $pcm_dst -y -i $file -f wav $pcm_dst +$tiny_psnr $pcm_dst $pcm_ref 2 8192 >> $logfile +fi + ################################### +#if [ -n "$do_vorbis" ] ; then +# vorbis +#disabled because its broken +#do_audio_encoding vorbis.asf "-ar 44100" "-acodec vorbis" +#do_audio_decoding +#fi -if [ -n "$do_libav" ] ; then +################################### +# libavformat testing +################################### + +if [ -n "$do_libavtest" ] ; then # avi do_libav avi @@ -675,8 +606,8 @@ do_libav mpg # mpegts do_libav ts -# swf (decode audio only) -do_libav swf "-acodec mp2" +# swf +do_libav swf -an # ffm do_libav ffm @@ -724,13 +655,19 @@ do_ffmpeg $file -t 1 -y -qscale 10 -f pgmyuv -i $raw_src $file #################### # image formats -# pgm (we do not do md5 on image files yet) +# pgm do_image_formats pgm -# ppm (we do not do md5 on image files yet) +# ppm do_image_formats ppm -# jpeg (we do not do md5 on image files yet) +# bmp +do_image_formats bmp + +# tga +do_image_formats tga + +# jpeg do_image_formats jpg "-flags +bitexact -dct fastint -idct simple -pix_fmt yuvj420p" "-f image2" #################### @@ -759,8 +696,8 @@ do_audio_only voc #################### # pix_fmt conversions -conversions="yuv420p yuv422p yuv444p yuv422 yuv410p yuv411p yuvj420p \ - yuvj422p yuvj444p rgb24 bgr24 rgba32 rgb565 rgb555 gray monow \ +conversions="yuv420p yuv422p yuv444p yuyv422 yuv410p yuv411p yuvj420p \ + yuvj422p yuvj444p rgb24 bgr24 rgb32 rgb565 rgb555 gray monow \ monob pal8" for pix_fmt in $conversions ; do file=${outfile}libav-${pix_fmt}.yuv @@ -770,7 +707,7 @@ for pix_fmt in $conversions ; do -f rawvideo -s 352x288 -pix_fmt yuv444p $file done -fi +fi # [ -n "$do_libavtest" ] diff --git a/contrib/ffmpeg/tests/rotozoom.c b/contrib/ffmpeg/tests/rotozoom.c index 5549d6ec2..52f5546a3 100644 --- a/contrib/ffmpeg/tests/rotozoom.c +++ b/contrib/ffmpeg/tests/rotozoom.c @@ -1,8 +1,25 @@ /* * Generates a synthetic YUV video sequence suitable for codec testing. - * GPLv2 - * rotozoom.c -> s.bechet@av7.net + * + * copyright (c) Sebastien Bechet <s.bechet@av7.net> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + #include <stdlib.h> #include <stdio.h> #include <inttypes.h> diff --git a/contrib/ffmpeg/tests/rotozoom.regression.ref b/contrib/ffmpeg/tests/rotozoom.regression.ref index 91dbe27d9..94c4e1b72 100644 --- a/contrib/ffmpeg/tests/rotozoom.regression.ref +++ b/contrib/ffmpeg/tests/rotozoom.regression.ref @@ -7,10 +7,10 @@ stddev: 4.95 PSNR:34.21 bytes:7602176 198667 ./data/a-mpeg2.mpg b7cae8a1f751b821cddcbe4d5dbc518c *./data/out.yuv stddev: 4.96 PSNR:34.19 bytes:7602176 -6dc412b7972918b0c3be5b448c76cdbb *./data/a-mpeg2ivlc.mpg -197869 ./data/a-mpeg2ivlc.mpg -b7cae8a1f751b821cddcbe4d5dbc518c *./data/out.yuv -stddev: 4.96 PSNR:34.19 bytes:7602176 +4dd6e884eeccfb5c0d9b5542349e3d62 *./data/a-mpeg2ivlc-qprd.mpg +249692 ./data/a-mpeg2ivlc-qprd.mpg +99214c2a75ece2a0bf4f5afebc0f8ed7 *./data/out.yuv +stddev: 4.41 PSNR:35.22 bytes:7602176 f979bcca866e6e4cad5dc6cb06e56cfb *./data/a-mpeg2.mpg 198041 ./data/a-mpeg2.mpg f6d9bf24ff8676a7f6076c05cd2c81a3 *./data/out.yuv @@ -19,17 +19,17 @@ f90197a8b6e62ae25f82625337f27240 *./data/a-mpeg2i.mpg 204579 ./data/a-mpeg2i.mpg ea5057b60146c06d40449cdfc686bf13 *./data/out.yuv stddev: 4.98 PSNR:34.17 bytes:7602176 -dc359097986fc04df7541f720fa5da14 *./data/a-mpeg2thread.mpg -183314 ./data/a-mpeg2thread.mpg -354eb621a217e50252dbed937f9eab18 *./data/out.yuv -stddev: 4.76 PSNR:34.57 bytes:7602176 -fb02afb5a0c79c7e99a32e60e19a86bc *./data/a-mpeg2threadivlc.mpg -182460 ./data/a-mpeg2threadivlc.mpg -354eb621a217e50252dbed937f9eab18 *./data/out.yuv -stddev: 4.76 PSNR:34.57 bytes:7602176 -b567ce695c24fb1e08ff1c137a805e1a *./data/a-mpeg2reuse.mpg -394759 ./data/a-mpeg2reuse.mpg -c3a86762e97a8869ed3c969ee2e084b8 *./data/out.yuv +c346717be44450e41d9d6e07f59d1490 *./data/a-mpeg2thread.mpg +182959 ./data/a-mpeg2thread.mpg +02b85a7f67ced2d146a5c4e8000712b6 *./data/out.yuv +stddev: 4.75 PSNR:34.57 bytes:7602176 +ff30b3df75626398873ac4f30093a5ae *./data/a-mpeg2threadivlc.mpg +182105 ./data/a-mpeg2threadivlc.mpg +02b85a7f67ced2d146a5c4e8000712b6 *./data/out.yuv +stddev: 4.75 PSNR:34.57 bytes:7602176 +3942f86a6aa6fe5aea586fedf210e33e *./data/a-mpeg2reuse.mpg +394265 ./data/a-mpeg2reuse.mpg +afbc483eaa769925259e6094cfda2c72 *./data/out.yuv stddev: 4.76 PSNR:34.56 bytes:7602176 c09815e40a9d260628e1ebad8b2b3774 *./data/a-msmpeg4v2.avi 129918 ./data/a-msmpeg4v2.avi @@ -67,22 +67,30 @@ a1323da0c8b437cd6961f8c90451880b *./data/a-huffyuv.avi 6455232 ./data/a-huffyuv.avi dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv stddev: 0.00 PSNR:99.99 bytes:7602176 -a418db8cc1410a50a154e8418d78e3d7 *./data/a-mpeg4-rc.avi -227918 ./data/a-mpeg4-rc.avi -56b327651c526538576fbc104f696dde *./data/out.yuv -stddev: 4.24 PSNR:35.55 bytes:7602176 +968ca132d8cf46f84e657abcf8473b7c *./data/a-mpeg4-rc.avi +227934 ./data/a-mpeg4-rc.avi +895773fe8250c806a0d1592a6dd12401 *./data/out.yuv +stddev: 4.24 PSNR:35.56 bytes:7602176 9001cf571eb7f26fa5592bdec6538583 *./data/a-mpeg4-adv.avi 173590 ./data/a-mpeg4-adv.avi 699edf05648fdc42196b7bebef9be269 *./data/out.yuv stddev: 4.84 PSNR:34.41 bytes:7602176 -5d94ca237bd1ba1a6cdab6796485c6dc *./data/a-mpeg4-thread.avi -254248 ./data/a-mpeg4-thread.avi -1cb815783ab9dc787add51cdbc97e156 *./data/out.yuv -stddev: 4.03 PSNR:36.01 bytes:7602176 -59e682efe457070d21170fdb117c1961 *./data/a-mpeg4-Q.avi -165840 ./data/a-mpeg4-Q.avi -f5838ffcf1dd6c538e27dbe906e5eadd *./data/out.yuv +1e12bb209dae0ab4b64265b0a4262257 *./data/a-mpeg4-qprd.avi +234048 ./data/a-mpeg4-qprd.avi +1ec355ffb30d2adf302a550cf5812636 *./data/out.yuv +stddev: 4.23 PSNR:35.58 bytes:7602176 +d581d6f4a331325905b8ffb05cd3bfd3 *./data/a-mpeg4-adap.avi +204284 ./data/a-mpeg4-adap.avi +c2c7f1c7844ab92d34247ccb70198c61 *./data/out.yuv +stddev: 4.04 PSNR:35.99 bytes:7602176 +a5150067914ee1dee50f8fc8dcaee841 *./data/a-mpeg4-Q.avi +165802 ./data/a-mpeg4-Q.avi +4dcc71ad79bee90777cf5299044be362 *./data/out.yuv stddev: 4.00 PSNR:36.08 bytes:7602176 +8cd8940d7451925784536fe9b2f2a5e3 *./data/a-mpeg4-thread.avi +254260 ./data/a-mpeg4-thread.avi +d160a4224ea1af66c85178912f8d3a7c *./data/out.yuv +stddev: 4.03 PSNR:36.01 bytes:7602176 5b5b88ce610114e346a5df4f46995bb9 *./data/a-mpeg4-PSP.mp4 325006 ./data/a-mpeg4-PSP.mp4 90e65096aa9ebafa3fe3f44a5a47cdc4 *./data/a-error-mpeg4-adv.avi @@ -93,9 +101,9 @@ c41187c99588fb7229ad330b2f80d28b *./data/a-mpeg4-nr.avi 155044 ./data/a-mpeg4-nr.avi f7fc191308679f709405e62271f5c65f *./data/out.yuv stddev: 4.73 PSNR:34.62 bytes:7602176 -1244f602a39b255ca676ca1e47617afd *./data/a-mpeg1b.mpg -230033 ./data/a-mpeg1b.mpg -df02ed235141aa229b47b91b28f71da5 *./data/out.yuv +977f3caf286e8f36c6ab4c7464632f26 *./data/a-mpeg1b.mpg +229806 ./data/a-mpeg1b.mpg +f41c60846bfb8cb6dcf6071c846c82b4 *./data/out.yuv stddev: 4.13 PSNR:35.79 bytes:7602176 b179402bba391073b5f5f9324a834061 *./data/a-mjpeg.avi 703564 ./data/a-mjpeg.avi @@ -105,8 +113,8 @@ bc0d8c868c1a05db0ff03f41768f6c5e *./data/a-ljpeg.avi 4766558 ./data/a-ljpeg.avi dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv stddev: 0.00 PSNR:99.99 bytes:7602176 -8a2f3984a27a7513545cf98bc05fd066 *./data/a-jpegls.avi -8334508 ./data/a-jpegls.avi +f67cd488dfd06c03ad1d6d94d81b80c8 *./data/a-jpegls.avi +8334488 ./data/a-jpegls.avi a63d4e3ea1f0b0c0d44821da9e09b8f4 *./data/out.yuv stddev: 0.67 PSNR:51.57 bytes:7602176 989a42671603dc1a7e6b156dccf0e820 *./data/a-rv10.rm @@ -125,30 +133,30 @@ stddev: 10.47 PSNR:27.72 bytes:7602176 789072 ./data/a-asv2.avi 74a78015b64b2cf8cb9da2e44f508a69 *./data/out.yuv stddev: 10.28 PSNR:27.88 bytes:7602176 -bd76377d9e167caff10ebaf381f01a82 *./data/a-flv.flv -131337 ./data/a-flv.flv +7163b470e93feb36b3f01e82168a3d31 *./data/a-flv.flv +131360 ./data/a-flv.flv 8999c8264fb0941561f64c4a736e9d88 *./data/out.yuv stddev: 5.33 PSNR:33.58 bytes:7602176 d72b0960e162d4998b9acbabb07e99ab *./data/a-ffv1.avi 3525804 ./data/a-ffv1.avi dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv stddev: 0.00 PSNR:99.99 bytes:7602176 -4b306a67e21771eba4c61b1cf0f56141 *./data/a-snow.avi -68526 ./data/a-snow.avi -d2914543504345fad6e5593f66f072bc *./data/out.yuv -stddev: 10.93 PSNR:27.34 bytes:7602176 -892221ef4c1debf694a481a5e23e1136 *./data/a-snow53.avi -2722066 ./data/a-snow53.avi +40a6e938ac2bd92ee12cd57925e86454 *./data/a-snow.avi +68758 ./data/a-snow.avi +1e356854142898c7c4aab4bfedadf235 *./data/out.yuv +stddev: 10.86 PSNR:27.40 bytes:7602176 +3d0da6aeec9b80c6ee0ff4b747bdd0f0 *./data/a-snow53.avi +2721980 ./data/a-snow53.avi dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv stddev: 0.00 PSNR:99.99 bytes:7602176 -af9f474238c9c68cb32e389659ee25ab *./data/a-dv.dv +54cdeaee32d1007666a1e487e739daf6 *./data/a-dv.dv 7200000 ./data/a-dv.dv -bb69dda7a84a5b166434e28e1243d3d1 *./data/out.yuv -stddev: 2.99 PSNR:38.59 bytes:7602176 -91dc1c1dc4a8cca72f27d85db6d7636f *./data/a-dv.dv +75bf724e37f667f36af50e2051846574 *./data/out.yuv +stddev: 3.11 PSNR:38.24 bytes:7602176 +ac6741e4c79e9ed18f179c4124ede29c *./data/a-dv.dv 14400000 ./data/a-dv.dv -74b01209bb5e096d570dd4df112bb82d *./data/out.yuv -stddev: 2.98 PSNR:38.61 bytes:7602176 +ad9907f4ef608f025f5fc38b4b067b37 *./data/out.yuv +stddev: 3.11 PSNR:38.25 bytes:7602176 7ba9292d663819a9a1d1cdecc6f1b079 *./data/a-svq1.mov 768407 ./data/a-svq1.mov 6bc10518bc387c3bdf117997713ee69a *./data/out.yuv @@ -158,25 +166,33 @@ stddev: 3.44 PSNR:37.39 bytes:7602176 83f8df5d5f84480566af548bb037fceb *./data/out.wav stddev:9330.70 PSNR:16.92 bytes:1054720 stddev:4396.13 PSNR:23.46 bytes:1052672 -dd68110cb7e5388392f89d5160d3a825 *./data/a-ac3.rm +aefe11ab5067621a1c674859d6413891 *./data/a-ac3.rm 98203 ./data/a-ac3.rm -9e6e66847a568ef4f1f229b0939d2aae *./data/a-g726.wav -24268 ./data/a-g726.wav -a719ab6d47d8d601520edb13bf6136b4 *./data/out.wav -stddev:8459.88 PSNR:17.77 bytes:96256 -ea2efb8ba20695a35ab0d71a7ee86f22 *./data/a-adpcm_ima.wav -266288 ./data/a-adpcm_ima.wav +39878597b1d65cce473639a7d8c93b02 *./data/a-g726.wav +24279 ./data/a-g726.wav +888f2f016e608d044a1bacbca5497ed2 *./data/out.wav +stddev:8368.02 PSNR:17.87 bytes:96256 +de3f0e1f50b19bd8572fdd3dee2e72c4 *./data/a-adpcm_ima.wav +266300 ./data/a-adpcm_ima.wav 60178d48204f5662d91776e36eddc82e *./data/out.wav stddev:11441.89 PSNR:15.15 bytes:1054720 -d2eee867856d2bdb6d08e936d4ceec0c *./data/a-adpcm_ms.wav -267308 ./data/a-adpcm_ms.wav +628d4789cf9ee16a756ac54b7fd8650d *./data/a-adpcm_ms.wav +267320 ./data/a-adpcm_ms.wav 91a84bb4f319a3a0bf0c0441b3d3a529 *./data/out.wav stddev:1050.18 PSNR:35.89 bytes:1054720 -48ae9fcb043a44e316998b85043b61bc *./data/a-adpcm_yam.wav -264236 ./data/a-adpcm_yam.wav +ab11d9151644cbff27827b7e89f37aa9 *./data/a-adpcm_yam.wav +264248 ./data/a-adpcm_yam.wav e92cec8c07913ffb91ad2b11f79cdc00 *./data/out.wav stddev:18312.68 PSNR:11.06 bytes:1056768 c3382f03ce2efb5d475240d288a33898 *./data/a-flac.flac 353368 ./data/a-flac.flac c4228df189aad9567a037727d0e763e4 *./data/out.wav stddev: 33.31 PSNR:65.87 bytes:1040384 +0c406c4e4586ca27064e28637b662631 *./data/a-wmav1.asf +106004 ./data/a-wmav1.asf +stddev:12251.50 PSNR:14.56 bytes:1056768 +stddev:2106.00 PSNR:29.85 bytes:1048576 +82442aaa5fdbd327769e4c4ad369147e *./data/a-wmav2.asf +106044 ./data/a-wmav2.asf +stddev:12255.92 PSNR:14.55 bytes:1056768 +stddev:2099.31 PSNR:29.88 bytes:1048576 diff --git a/contrib/ffmpeg/tests/seek_test.c b/contrib/ffmpeg/tests/seek_test.c new file mode 100644 index 000000000..e17409439 --- /dev/null +++ b/contrib/ffmpeg/tests/seek_test.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2007 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include <stdlib.h> +#include <stdio.h> + +#include "avformat.h" + +int main(int argc, char **argv) +{ + const char *filename; + AVFormatContext *ic; + int i, ret, stream_id; + int64_t timestamp; + + /* initialize libavcodec, and register all codecs and formats */ + av_register_all(); + + if (argc != 2) { + printf("usage: %s input_file\n" + "\n", argv[0]); + exit(1); + } + + filename = argv[1]; + + /* allocate the media context */ + ic = av_alloc_format_context(); + if (!ic) { + fprintf(stderr, "Memory error\n"); + exit(1); + } + + ret = av_open_input_file(&ic, filename, NULL, 0, NULL); + if (ret < 0) { + fprintf(stderr, "cant open %s\n", filename); + exit(1); + } + + ret = av_find_stream_info(ic); + if (ret < 0) { + fprintf(stderr, "%s: could not find codec parameters\n", filename); + exit(1); + } + + for(i=0; ; i++){ + AVPacket pkt; + AVStream *st; + + memset(&pkt, 0, sizeof(pkt)); + if(ret>=0){ + ret= av_read_frame(ic, &pkt); + printf("ret:%2d", ret); + if(ret>=0){ + st= ic->streams[pkt.stream_index]; + printf(" st:%2d dts:%f pts:%f pos:%Ld size:%d flags:%d", pkt.stream_index, pkt.dts*av_q2d(st->time_base), pkt.pts*av_q2d(st->time_base), pkt.pos, pkt.size, pkt.flags); + } + printf("\n"); + } + + if(i>25) break; + + stream_id= (i>>1)%(ic->nb_streams+1) - 1; + timestamp= (i*19362894167LL) % (4*AV_TIME_BASE) - AV_TIME_BASE; + if(stream_id>=0){ + st= ic->streams[stream_id]; + timestamp= av_rescale_q(timestamp, AV_TIME_BASE_Q, st->time_base); + } + ret = av_seek_frame(ic, stream_id, timestamp, (i&1)*AVSEEK_FLAG_BACKWARD); + printf("ret:%2d st:%2d ts:%f flags:%d\n", ret, stream_id, timestamp*(stream_id<0 ? 1.0/AV_TIME_BASE : av_q2d(st->time_base)), i&1); + } + + return 0; +} diff --git a/contrib/ffmpeg/tests/seek_test.sh b/contrib/ffmpeg/tests/seek_test.sh new file mode 100755 index 000000000..eeac747b1 --- /dev/null +++ b/contrib/ffmpeg/tests/seek_test.sh @@ -0,0 +1,25 @@ +#!/bin/sh +#feel free to clean this up ive made no attempt to write this overly portable ... + +datadir="./data" + +logfile="$datadir/seek.regression" +reffile="$1" + +list=`ls data/a-* data/b-* | sort` +rm $logfile +for i in $list ; do + echo ---------------- >>$logfile + echo $i >>$logfile + ./seek_test $i >> $logfile +done + +if diff -u "$logfile" "$reffile" ; then + echo + echo Regression test succeeded. + exit 0 +else + echo + echo Regression test: Error. + exit 1 +fi diff --git a/contrib/ffmpeg/tests/server-regression.sh b/contrib/ffmpeg/tests/server-regression.sh index fb28fbae8..1f561aa54 100755 --- a/contrib/ffmpeg/tests/server-regression.sh +++ b/contrib/ffmpeg/tests/server-regression.sh @@ -10,26 +10,28 @@ fi # Make sure that the data directory exists mkdir -p data -cp "$2" data/test.conf #perl -e 'chomp($wd = `pwd`); print map { s!data/!!; "<Stream $_>\nFile $wd/data/$_\n</Stream>\n\n" } @ARGV' data/a* >> data/test.conf #perl -e 'chomp($wd = `pwd`); print map { s!data/!!; "<Stream $_.asf>\nFile $wd/data/$_\n</Stream>\n\n" } @ARGV' data/a* >> data/test.conf -FILES=`sed -n 's/^[^#]*<Stream \(.*\)>.*/\1/p' data/test.conf | grep -v html` +FILES=`sed -n 's/^[^#]*<Stream \(.*\)>.*/\1/p' test.conf | grep -v html` -rm -f /tmp/feed.ffm -../ffserver -d -f data/test.conf 2> /dev/null & +rm -f feed1.ffm +../ffserver -d -f test.conf 2> /dev/null & FFSERVER_PID=$! -echo "Waiting for feeds to startup..." sleep 2 +echo "Waiting for feeds to startup..." +../ffmpeg -loop_input -flags +bitexact -dct fastint -idct simple -y -f pgmyuv -i vsynth1/%02d.pgm http://localhost:9999/feed1.ffm 2> /dev/null & +FFMPEG_PID=$! +sleep 5 ( cd data || exit $? rm -f ff-*; WGET_OPTIONS="--user-agent=NSPlayer -q --proxy=off -e verbose=off -e server_response=off" for file in $FILES; do if [ `expr $file : "a-*"` != 0 ]; then - wget $WGET_OPTIONS --output-document=- http://localhost:9999/$file > ff-$file & + wget $WGET_OPTIONS --output-document=- http://localhost:9999/$file > ff-$file else - wget $WGET_OPTIONS --output-document=- http://localhost:9999/$file?date=19700101T000000Z | dd bs=1 count=100000 > ff-$file 2>/dev/null & + wget $WGET_OPTIONS --output-document=- http://localhost:9999/$file?date=19700101T000000Z | dd bs=1 count=20000 > ff-$file 2>/dev/null fi MDFILES="$MDFILES ff-$file" done @@ -37,8 +39,10 @@ sleep 2 # the status page is always different md5sum $MDFILES > ffserver.regression ) +kill $FFMPEG_PID kill $FFSERVER_PID wait > /dev/null 2>&1 +rm -f feed1.ffm if $diff_cmd data/ffserver.regression "$1" ; then echo echo Server regression test succeeded. diff --git a/contrib/ffmpeg/tests/test.conf b/contrib/ffmpeg/tests/test.conf index cc2038a60..afd4c16fb 100644 --- a/contrib/ffmpeg/tests/test.conf +++ b/contrib/ffmpeg/tests/test.conf @@ -52,13 +52,14 @@ CustomLog - # maximum size of the feed (100M bytes here). Default: # File=/tmp/feed_name.ffm FileMaxSize=5M -File /tmp/feed.ffm +File feed1.ffm FileMaxSize 100M # Fire up ffmpeg pointing at this stream -Launch ../ffmpeg -loop_input -flags +bitexact -dct fastint -idct simple -y -f pgmyuv -i vsynth1/%02d.pgm -acl allow localhost +#Launch ../../ffmpeg -loop_input -flags +bitexact -dct fastint -idct simple -y -f pgmyuv -i vsynth1/%02d.pgm + +ACL allow localhost </Feed> ################################################################## diff --git a/contrib/ffmpeg/tests/videogen.c b/contrib/ffmpeg/tests/videogen.c index a6b8ce167..39d85a26a 100644 --- a/contrib/ffmpeg/tests/videogen.c +++ b/contrib/ffmpeg/tests/videogen.c @@ -1,7 +1,26 @@ /* * Generates a synthetic YUV video sequence suitable for codec testing. * NOTE: no floats are used to guaranty a bit exact output. + * + * Copyright (c) 2002 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + #include <stdlib.h> #include <stdio.h> |