ffmpegfs-2.18/0000755000000000000000000000000015166203631010213 500000000000000ffmpegfs-2.18/ffmpegfs.1.txt0000644000000000000000000007260715166175573012661 00000000000000= FFMPEGFS(1) = :doctype: manpage :man source: ffmpegfs :man version: {revnumber} :man manual: User Commands == NAME == ffmpegfs - mounts and transcodes a multitude of formats to one of the target formats on the fly. == SYNOPSIS == *ffmpegfs* ['OPTION']... 'IN_DIR' 'OUT_DIR' == DESCRIPTION == The ffmpegfs(1) command will mount the directory 'IN_DIR' on 'OUT_DIR'. Thereafter, accessing 'OUT_DIR' will show the contents of 'IN_DIR', with all supported media files transparently renamed and transcoded to one of the supported target formats upon access. Supported output formats: [width="100%"] |=================================================================================== | *Format* | *Description* | *Audio* | *Video* | AIFF | Audio Interchange File Format | | PCM 16 bit BE | ALAC | Apple Lossless Audio Codec | | ALAC | FLAC | Free Lossless Audio | | FLAC | HLS | HTTP Live Streaming | H264 | AAC | MOV | QuickTime File Format | H264 | AAC | MP3 | MPEG-2 Audio Layer III | | MP3 | MP4 | MPEG-4 | H264 | AAC | OGG | | Theora | Vorbis | MKV | Matroska | H264 | AAC | Opus | | Opus | | ProRes | Apple ProRes | ProRes | PCM 16 bit LE | TS | MPEG Transport Stream | H264 | AAC | WAV | Waveform Audio File Format | | PCM 16 bit LE | WebM | | VP9 | Opus | BMP | Video to frameset | | BMP | JPG | Video to frameset | | JPEG | PNG | Video to frameset | | PNG |=================================================================================== == OPTIONS == Usage: ffmpegfs [OPTION]... IN_DIR OUT_DIR Mount IN_DIR on OUT_DIR, converting audio and video files upon access. === Encoding options === *--desttype*=TYPE, *-odesttype*=TYPE:: Select the destination format. 'TYPE' can currently be: + *AIFF*, *ALAC*, *BMP*, *FLAC*, *HLS*, *JPG*, *MOV*, *MP3*, *MP4*, *MKV*, *OGG*, *Opus*, *PNG*, *ProRes*, *TS*, *WAV*, *WebM*. + To stream videos, *MP4*, *TS*, *HLS*, *OGG*, *WEBM*, *MKV*, or *MOV*/*PRORES* must be selected. + To use HTTP Live Streaming, set *HLS*. + When a destination *JPG*, *PNG*, or *BMP* is chosen, all frames of a video source file will be presented in a virtual directory named after the source file. Audio will not be available. + To use the smart transcoding feature, specify a video and audio file type, separated by a "+" sign. For example, --desttype=mov+aiff will convert video files to Apple Quicktime MOV and audio-only files to AIFF. + Defaults to: *mp4* *--audiocodec*=TYPE, *-oaudiocodec*=TYPE:: Select an audio codec. 'TYPE' depends on the destination format and can currently be: + [width="100%"] |=================================================================================== | *Formats* | *Audio Codecs* | MP4 | **AAC**, MP3 | WebM | **OPUS**, VORBIS | MOV | **AAC**, AC3, MP3 | MKV | **AAC**, AC3, MP3 | TS, HLS | **AAC**, AC3, MP3 |=================================================================================== + Other destination formats do not support other codecs than the default. + Defaults to: The destination format's default setting, as indicated by the first codec name in the list. *--videocodec*=TYPE, *-ovideocodec*=TYPE:: Select a video codec. 'TYPE' depends on the destination format and can currently be: + [width="100%"] |=================================================================================== | *Formats* | *Video Codecs* | MP4 | **H264**, H265, MPEG1, MPEG2 | WebM | **VP9**, VP8, AV1 | MOV | **H264**, H265, MPEG1, MPEG2 | MKV | **H264**, H265, MPEG1, MPEG2 | TS, HLS | **H264**, H265, MPEG1, MPEG2 |=================================================================================== + Other destination formats do not support other codecs than the default. + Defaults to: The destination format's default setting, as indicated by the first codec name in the list. *--autocopy*=OPTION, *-oautocopy*=OPTION:: Select the auto copy option. 'OPTION' can be: + [width="100%"] |=================================================================================== |*OFF* |Never copy streams, transcode always. |*MATCH* |Copy stream if target supports codec. |*MATCHLIMIT* |Same as MATCH, only copy if target not larger, transcode otherwise. |*STRICT* |Copy stream if codec matches desired target, transcode otherwise. |*STRICTLIMIT* |Same as STRICT, only copy if target not larger, transcode otherwise. |=================================================================================== + This can speed up transcoding significantly as copying streams uses much less computing power as compared to transcoding. + *MATCH* copies a stream if the target supports it, e.g., an AAC audio stream will be copied to MPEG, although FFmpeg's target format is MP3 for this container. H264 would be copied to ProRes, although the result would be a regular MOV or MP4, not a ProRes file. + *STRICT* would convert AAC to MP3 for MPEG or H264 to ProRes for Prores files to strictly adhere to the output format setting. This will create homogenous results which might prevent problems with picky playback software. + Note: When the *--audiocodec* or *--videocodec* option is specified, the STRICT option should be used to ensure that the chosen output codec is used in any scenario. MATCH would enable copy if the output format supports the input codec. Defaults to: *OFF* *--recodesame*=OPTION, *-orecodesame*=OPTION:: Select recode to the same format option, 'OPTION' can be: + [width="100%"] |=================================================================================== |*NO* |Never recode to the same format. |*YES* |Always recode to the same format. |=================================================================================== + Defaults to: *NO* *--profile*=NAME, *-oprofile*=NAME:: Set profile for target audience, 'NAME' can be: + [width="100%"] |======================================================= |*NONE* |no profile |*FF* |optimise for Firefox |*EDGE* |optimise for MS Edge and Internet Explorer > 11 |*IE* |optimise for MS Edge and Internet Explorer <= 11 |*CHROME* |Google Chrome |*SAFARI* |Apple Safari |*OPERA* |Opera |*MAXTHON* |Maxthon |======================================================= + *Note:* applies to the MP4 output format only, and is ignored for all other formats. + Defaults to: *NONE* --*level*=NAME, -o *level*=NAME:: Set level for output if available. 'NAME' can be: + [width="100%"] |=========================== |*PROXY* |Proxy – apco |*LT* |LT – apcs |*STANDARD* |standard – apcn |*HQ* |HQ - apch |=========================== + *Note:* applies to the MP4 output format only, and is ignored for all other formats. + Defaults to: *HQ* *--include_extensions*=LIST, *-oinclude_extensions*=LIST:: Set the list of file extensions to be encoded. 'LIST' can have one or more entries that are separated by commas. These are the only file extensions that will be transcoded. Can be specified numerous times and will be merged, which is required when specifying them in the fstab because commas cannot be used to separate the extensions. The entries support shell wildcard patterns. + Example: --include_extensions=mp4,wmv to encode MPEG-4 and Windows Media files only. + Defaults to: Encode all supported files. *--hide_extensions*=LIST, *-ohide_extensions*=LIST:: Set a list of file extensions to exclude from the output. 'LIST' can have one or more entries that are separated by commas. Can be specified numerous times and will be merged, which is required when specifying them in the fstab because commas cannot be used to separate the extensions. The entries support shell wildcard patterns. + Example: --hide_extensions=jpg,png,cue to stop covers and cue sheets from showing up. + Defaults to: Show all files. === Audio Options === *--audiobitrate*=BITRATE, *-o audiobitrate*=BITRATE:: Select the audio encoding bitrate. + Defaults to: *128 kbit* + *Acceptable values for 'BITRATE':* + *mp4:* 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 288, 320, 352, 384, 416, and 448 kbps. + *mp3:* For sampling frequencies of 32, 44.1, and 48 kHz, 'BITRATE' can be among 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, and 320 kbps. + For sampling frequencies of 16, 22.05, and 24 kHz, 'BITRATE' can be among 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, and 160 kbps. + When in doubt, it is recommended to choose a bitrate among 96, 112, 128, 160, 192, 224, 256, and 320 kbps. + -- *BITRATE*:: can be defined as... * n bit/s: # or #bps * n kbit/s: #K or #Kbps * n Mbit/s: #M or #Mbps -- *--audiosamplerate*=SAMPLERATE, *-o audiosamplerate*=SAMPLERATE:: This limits the output sample rate to 'SAMPLERATE'. If the source file sample rate is higher, it will be downsampled automatically. + Typical values are 8000, 11025, 22050, 44100, 48000, 96000, and 192000. + If the target codec does not support the selected sample rate, the next matching rate will be chosen (e.g. if 24K is selected but only 22.05 or 44.1 KHz is supported, 22.05 KHz will be set). + Set to 0 to keep the source rate. + Defaults to: *44.1 kHz* + -- *SAMPLERATE*:: can be defined as... * In Hz: # or #Hz * In kHz: #K or #KHz -- *--audiochannels*=CHANNELS, *-o audiochannels*=CHANNELS:: This limits the number of output channels to 'CHANNELS'. If the source has more channels, the number will be reduced to this limit. + Typical values are 1, 2 or 6 (e.g., 5.1) channels. + If the target codec does not support the selected number of channels, transcoding may fail. + Set to 0 to keep the number of channels. + Defaults to: *2 channels (stereo)* *--audiosamplefmt*=SAMPLEFMT, *-o audiosamplefmt*=SAMPLEFMT:: This sets a sample format. 'SAMPLEFMT' can be: + 0 to use the predefined setting; 8, 16, 32, 64 for integer format, F16, F32, F64 for floating point. + Not all formats are supported by all destination types. Selecting an invalid format will be reported as a command line error and a list of values printed. + [width="100%"] |=========================== |*Container Format* | *Sample Format* |*AIFF* |0, 16, 32 |*ALAC* |0, 16, 24 |*WAV* |0, 8, 16, 32, 64, F16, F32, F64 |*FLAC* |0, 16, 24 |=========================== + Defaults to: 0 (Use the same as the source or the predefined format of the destination if the source format is not possible.) === Video Options === *--videobitrate*=BITRATE, *-o videobitrate*=BITRATE:: This sets the video encoding bit rate. Setting this too high or too low may cause transcoding to fail. + Defaults to: *2 Mbit* + *mp4:* May be specified as 500 to 25,000 kbps. + -- *BITRATE*:: can be defined as... * n bit/s: # or #bps * n kbit/s: #K or #Kbps * n Mbit/s: #M or #Mbps -- *--videoheight*=HEIGHT, -o *videoheight*=HEIGHT:: This sets the height of the transcoded video. + When the video is rescaled, the aspect ratio is preserved if --width is not set at the same time. + Defaults to: *keep source video height* *--videowidth*=WIDTH, -o *videowidth*=WIDTH:: This sets the width of the transcoded video. + When the video is rescaled, the aspect ratio is preserved if --height is not set at the same time. + Defaults to: *keep source video width* *--deinterlace*, -o *deinterlace*:: Deinterlace video if necessary while transcoding. + This may need a higher bit rate, but this will increase picture quality when streaming via HTML5. + Defaults to: "no deinterlace" === HLS Options === *--segment_duration*, -o *segment_duration*:: Set the duration of one video segment of the HLS stream. This argument is a floating point value, e.g., it can be set to 2.5 for 2500 milliseconds. + Should normally be left as the default. + *Note:* This applies to the HLS output format only, and is ignored for all other formats. + Defaults to: *10 seconds* *--min_seek_time_diff*, -o *min_seek_time_diff*:: If the requested HLS segment is less than min_seek_time seconds away, discard the seek request. The segment will be available very soon anyway, and that makes a re-transcode necessary. Set to 0 to disable. + Should normally be left as the default. + *Note:* This applies to the HLS output format only, and is ignored for all other formats. + Defaults to: *30 seconds* === Hardware Acceleration Options === *--hwaccel_enc*=API, *-o hwaccel_enc*=API:: Select the hardware acceleration API for encoding. + Defaults to: *NONE* (no acceleration). + -- *API*:: can be defined as... * *NONE*: use software encoder * *VAAPI*: Video Acceleration API (VA-API) * *OMX*: OpenMAX (Open Media Acceleration) -- *--hwaccel_dec_blocked*=CODEC[:PROFILE[:PROFILE]], *-o hwaccel_dec_blocked*=CODEC:[:PROFILE[:PROFILE]]:: Block a codec and, optionally, a profile for hardware decoding. The option can be repeated to block several codecs. + Defaults to: no codecs blocked. + -- *CODEC*:: can be defined as... * *H263*: H.263 * *H264*: H.264 * *HEVC*: H.265 / HEVC * *MPEG2*: MPEG-2 video * *MPEG4*: MPEG-4 video * *VC1*: SMPTE VC-1 * *VP8*: Google VP9 * *VP9*: Google VP9 * *WMV3*: Windows Media Video 9 -- + *PROFILE*:: can optionally be added to block a certain profile from the codec only. + Example: VP9:0 blocks Google VP profile 0. + Example: H264:1:33 blocks H.264 profile 1 and 33. *--hwaccel_enc_device*=DEVICE, -o *hwaccel_enc_device*=DEVICE:: Select the hardware acceleration device. May be required for VAAPI, especially if more than one device is available. + *Note:* This only applies to VAAPI hardware acceleration; all other types are ignored. + Defaults to: *empty* (use default device). + Example: */dev/dri/renderD128* *--hwaccel_dec*=API, *-o hwaccel_dec*=API:: Select the hardware acceleration API for decoding. + Defaults to: *NONE* (no acceleration) + -- *API*:: can be defined as... * *NONE*: use software decoder * *VAAPI*: Video Acceleration API (VA-API) * *MMAL*: Multimedia Abstraction Layer by Broadcom -- *--hwaccel_dec_device*=DEVICE, -o *hwaccel_dec_device*=DEVICE:: Select the hardware acceleration device. May be required for VAAPI, especially if more than one device is available. + *Note:* This only applies to VAAPI hardware acceleration; all other types are ignored. + Defaults to: *empty* (use default device) + Example: */dev/dri/renderD128* === Album Arts === --*noalbumarts*, -o *noalbumarts*:: Do not copy album art into the output file. + This will reduce the file size and may be useful when streaming via HTML5 when album art is not used anyway. + Defaults to: *add album arts* === Virtual Script === --*enablescript*, -o *enablescript*:: Add a virtual index.php to every directory. It reads scripts/videotag.php from the FFmpegfs binary directory. + This can be very handy for testing video playback. Of course, feel free to replace videotag.php with your own script. + Defaults to: *Do not generate script file* --*scriptfile*, -o *scriptfile*:: Set the name of the virtual script created in each directory. + Defaults to: *index.php* --*scriptsource*, -o *scriptsource*:: Use a different source file. + Defaults to: *scripts/videotag.php* === Cache Options === *--expiry_time*=TIME, *-o expiry_time*=TIME:: Cache entries expire after 'TIME' and will be deleted to save disc space. + Defaults to: *1 week* *--max_inactive_suspend*=TIME, *-o max_inactive_suspend*=TIME:: While being accessed, the file is transcoded to the target format in the background. When the client quits, transcoding will continue until this time out. Transcoding is suspended until it is accessed again, then transcoding will continue. + Defaults to: *15 seconds* *--max_inactive_abort*=TIME, *-o max_inactive_abort*=TIME:: While being accessed, the file is transcoded in the background to the target format. When the client quits, transcoding will continue until this time out, then the transcoder thread quits. + Defaults to: *30 seconds* *--prebuffer_time*=TIME, *-o prebuffer_time*=TIME:: Files will be decoded until the buffer contains the specified playing time, allowing playback to start smoothly without lags. Both options must be met if prebuffer time and prebuffer size are specified. + Set to 0 to disable pre-buffering. + Defaults to: *no prebuffer time* *--prebuffer_size*=SIZE, *-o prebuffer_size*=SIZE:: Files will be decoded until the specified number of bytes is present in the buffer, allowing playback to start smoothly without lags. Both options must be met if prebuffer size and prebuffer time are specified. + Set to 0 to disable pre-buffering. + Defaults to: *100 KB* *--max_cache_size*=SIZE, *-o max_cache_size*=SIZE:: Set the maximum diskspace used by the cache. If the cache grows beyond this limit when a file is transcoded, old entries will be deleted to keep the cache within the size limit. + Defaults to: *unlimited* *--min_diskspace*=SIZE, *-o min_diskspace*=SIZE:: Set the required diskspace on the cachepath mount. If the remaining space falls below 'SIZE' when a file is transcoded, old entries will be deleted to keep the diskspace within the limit. + Defaults to: *0 (no minimum space)* *--cachepath*=DIR, *-o cachepath*=DIR:: Sets the disc cache directory to 'DIR'. If it does not already exist, it will be created. The user running FFmpegfs must have write access to the location. + Defaults to: *$\{XDG_CACHE_HOME:-\~/.cache}/ffmpegfs* (as specified in the XDG Base Directory Specification). Falls back to $\{HOME:-~/.cache}/ffmpegfs if not defined. If executed with root privileges, "/var/cache/ffmpegfs" will be used. *--disable_cache*, -o *disable_cache*:: Disable the cache functionality completely. + Defaults to: *enabled* *--cache_maintenance*=TIME, *-o cache_maintenance*=TIME:: Starts cache maintenance in 'TIME' intervals. This will enforce the expery_time, max_cache_size and min_diskspace settings. Do not set it too low as this can slow down transcoding. + Only one FFmpegfs process will do the maintenance by becoming the master. If that process exits, another will take over, so that one will always do the maintenance. + Defaults to: *1 hour* *--prune_cache*:: Prune the cache immediately according to the above settings at application start up. + Defaults to: *Do not prune cache* *--clear_cache*, *-o clear_cache*:: On startup, clear the cache. All previously transcoded files will be deleted. + -- *TIME*:: can be defined as... * Seconds: # * Minutes: #m * Hours: #h * Days: #d * Weeks: #w -- + -- *SIZE*:: can be defined as... * In bytes: # or #B * In KBytes: #K or #KB * In MBytes: #M or #MB * In GBytes: #G or #GB * In TBytes: #T or #TB -- === Other === *--max_threads*=COUNT, *-o max_threads*=COUNT:: Limit concurrent transcoder threads. Set to 0 for unlimited threads. Recommended values are up to 16 times the number of CPU cores. Should be left as the default. + Defaults to: *16 times number of detected cpu cores* *--decoding_errors*, *-o decoding_errors*:: Decoding errors are normally ignored, leaving bloopers and hiccups in encoded audio or video but still creating a valid file. When this option is set, transcoding will stop with an error. + Defaults to: *Ignore errors* *--min_dvd_chapter_duration*=SECONDS, *-o min_dvd_chapter_duration*=SECONDS:: This ignores DVD chapters shorter than SECONDS. To disable, set to 0. This avoids transcoding errors for DVD chapters too short to detect its streams. + Defaults to: *1 second* *--win_smb_fix*, *-o win_smb_fix*:: Windows seems to access the files on Samba drives starting at the last 64K segment when the file is opened. Setting --win_smb_fix=1 will ignore these attempts (not decode the file up to this point). + Defaults to: *on* === Logging === *--log_maxlevel*=LEVEL, *-o log_maxlevel*=LEVEL:: Maximum level of messages to log, either ERROR, WARNING, INFO, DEBUG or TRACE. Defaults to INFO and is always set to DEBUG in debug mode. + Note that the other log flags must also be set to enable logging. *--log_stderr*, *-o log_stderr*:: Enable outputting logging messages to stderr. Automatically enabled in debug mode. *--log_syslog*, *-o log_syslog*:: Enable outputting logging messages to syslog. *--logfile*=FILE, *-o logfile*=FILE:: File to output log messages to. By default, no file will be written. === General/FUSE options === *-d*, *-o debug*:: Enable debug output. This will result in a large quantity of diagnostic information being printed to stderr as the programme runs. It implies *-f*. *-f*:: Run in the foreground instead of detaching from the terminal. *-h*, *--help*:: Print usage information. *-V*, *--version*:: Output version information. *-c*, *--capabilities*:: Output FFmpeg capabilities: a list of the system's available codecs. *-s*:: Force single-threaded operation. == Usage == Mount your file system as follows: ffmpegfs [--audiobitrate bitrate] [--videobitrate bitrate] musicdir mountpoint [-o fuse_options] To use FFmpegfs as a daemon and encode to MPEG-4, for instance: ffmpegfs --audiobitrate=256K --videobitrate=1.5M /mnt/music /mnt/ffmpegfs -o allow_other,ro,desttype=mp4 This will run FFmpegfs in the foreground and print the log output to the screen: ffmpegfs -f --log_stderr --audiobitrate=256K --videobitrate=1.5M --audiobitrate=256K --videobitrate=1.5M /mnt/music /mnt/ffmpegfs -o allow_other,ro,desttype=mp4 With the following entry in "/etc/fstab," the same result can be obtained with more recent versions of FUSE: ffmpegfs#/mnt/music /mnt/ffmpegfs fuse allow_other,ro,audiobitrate=256K,videobitrate=2000000,desttype=mp4 0 0 Another (more current) way to express this command: /mnt/music /mnt/ffmpegfs fuse.ffmpegfs allow_other,ro,audiobitrate=256K,videobitrate=2000000,desttype=mp4 0 0 At this point, files like `/mnt/music/**.flac` and `/mnt/music/**.ogg` will show up as `/mnt/ffmpegfs/**.mp4`. Audio bitrates will be reduced to 256 KBit, video to 1.5 MBit. The source bitrate will not be scaled up if it is lower; it will remain at the lower value. Keep in mind that only root can, by default, utilise the "allow other" option. Either use the "user allow other" key in /etc/fuse.conf or run FFmpegfs as root. Any user must have "allow other" enabled in order to access the mount. By default, only the user who initiated FFmpegfs has access to this. Examples: ffmpegfs -f $HOME/test/in $HOME/test/out --log_stderr --log_maxlevel=DEBUG -o allow_other,ro,desttype=mp4,cachepath=$HOME/test/cache Transcode files using FFmpegfs from test/in to test/out while logging to stderr at a noisy TRACE level. The cache resides in test/cache. All directories are under the current user's home directory. ffmpegfs -f $HOME/test/in $HOME/test/out --log_stderr --log_maxlevel=DEBUG -o allow_other,ro,desttype=mp4,cachepath=$HOME/test/cache,videowidth=640 Similar to the previous, but with a 640-pixel maximum video width. The aspect ratio will be maintained when scaling down larger videos. Videos that are smaller won't be scaled up. ffmpegfs -f $HOME/test/in $HOME/test/out --log_stderr --log_maxlevel=DEBUG -o allow_other,ro,desttype=mp4,cachepath=$HOME/test/cache,deinterlace Deinterlacing can be enabled for better image quality. == HOW IT WORKS == The decoder and encoder are initialised when a file is opened, and the file's metadata is also read. At this point, a rough estimate of the total file size can be made. Because the actual size greatly depends on the material encoded, this technique works fair-to-good for MP4 or WebM output files but works well for MP3, AIFF, or WAV output files. The file is transcoded as it is being read and stored in a private per-file buffer. This buffer keeps expanding as the file is read until the entire file has been transcoded. After being decoded, the file is stored in a disc buffer and is readily accessible. Other processes will share the same transcoded data if they access the same file because transcoding is done in a single additional thread, which saves CPU time. Transcoding will continue for a while if all processes close the file before it is finished. Transcoding will resume if the file is viewed once more before the timer expires. If not, it will halt and delete the current chunk to free up storage space. A file will be transcoded up to the seek point when you seek within it (if not already done). Since the majority of programmes will read a file from beginning to end, this is typically not a problem. Future upgrades might offer actual random seeking (but if this is feasible, it is not yet clear due to restrictions to positioning inside compressed streams). When HLS streaming is chosen, this already functions. The requested segment is immediately skipped to by FFmpegfs. *MP3:* The source file's comments are used to generate ID3 version 2.4 and 1.1 tags. They are correspondingly at the beginning and the end of the file. *MP4:* The same is true for meta atoms contained in MP4 containers. *WAV*: The estimated size of the WAV file will be included in a pro forma WAV header. When the file is complete, this header will be changed. Though most current gamers apparently disregard this information and continue to play the file, it does not seem required. Only for MP3 targets: A particular optimization has been done so that programmes that look for id3v1 tags don't have to wait for the entire file to be transcoded before reading the tag. This accelerates these apps *dramatically*. == ABOUT OUTPUT FORMATS == A few remarks regarding the output formats that are supported: Since these are plain vanilla constant bitrate (CBR) MP3 files, there isn't much to say about the MP3 output. Any modern player should be able to play them well. However, MP4 files are unique because standard MP4s aren't really ideal for live broadcasting. The start block of an MP4 has a field with the size of the compressed data section, which is the cause. It suffices to say that until the size is known, compression must be finished, a file seek must be performed to the beginning, and the size atom updated. That size is unknown for a live stream that is ongoing. To obtain that value for our transcoded files, one would need to wait for the entire file to be recoded. As if that weren't enough, the file's final section contains some crucial details, such as meta tags for the artist, album, etc. Additionally, the fact that there is just one enormous data block makes it difficult to do random searches among the contents without access to the entire data section. Many programmes will then read the crucial information from the end of an MP4 before returning to the file's head and beginning playback. This will destroy FFmpegfs' entire transcode-on-demand concept. Several extensions have been created to work around the restriction, including "faststart," which moves the aforementioned meta data from the end to the beginning of the MP4 file. Additionally, it is possible to omit the size field (0). An further plugin is isml (smooth live streaming). Older versions of FFmpeg do not support several new MP4 features that are required for direct-to-stream transcoding, like ISMV, faststart, separate moof/empty moov, to mention a few (or if available, not working properly). Faststart files are produced by default with an empty size field so that the file can be started to be written out at once rather than having to be encoded as a complete first. It would take some time before playback could begin if it were fully encoded. The data part is divided into chunks of about 1 second each, all with their own header, so it is possible to fill in the size fields early enough. One disadvantage is that not all players agree with the format, or they play it with odd side effects. VLC only refreshes the time display every several seconds while playing the file. There may not always be a complete duration displayed while streaming using HTML5 video tags, but that is fine as long as the content plays. Playback can only move backwards from the current playback position. However, that is the cost of commencing playback quickly. == DEVELOPMENT == Git is the revision control system used by FFmpegfs. The complete repository is available here: `git clone https://github.com/nschlia/ffmpegfs.git` or the mirror: `git clone https://salsa.debian.org/nschlia/ffmpegfs.git` FFmpegfs is composed primarily of C++17 with a small amount of C. The following libraries are utilised: * http://fuse.sourceforge.net/[FUSE] FFmpeg home pages: * https://www.ffmpeg.org/[FFmpeg] == FILES == */usr/local/bin/ffmpegfs*, */etc/fstab* == AUTHORS == This fork with FFmpeg support has been maintained by mailto:nschlia@oblivion-software.de[Norbert Schlia] since 2017 to date. Based on work by K. Henriksson (from 2008 to 2017) and the original author, David Collett (from 2006 to 2008). Much thanks to them for the original work and giving me a good head start! == LICENSE == This program can be distributed under the terms of the GNU GPL version 3 or later. It can be found http://www.gnu.org/licenses/gpl-3.0.html[online] or in the COPYING file. This file and other documentation files can be distributed under the terms of the GNU Free Documentation License 1.3 or later. It can be found http://www.gnu.org/licenses/fdl-1.3.html[online] or in the COPYING.DOC file. == FFMPEG LICENSE == FFmpeg is licensed under the GNU Lesser General Public License (LGPL) version 2.1 or later. However, FFmpeg incorporates several optional parts and optimizations that are covered by the GNU General Public License (GPL) version 2 or later. If those parts get used the GPL applies to all of FFmpeg. See https://www.ffmpeg.org/legal.html for details. == COPYRIGHT == This fork with FFmpeg support copyright \(C) 2017-2026 mailto:nschlia@oblivion-software.de[Norbert Schlia]. Based on work copyright \(C) 2006-2008 David Collett, 2008-2013 K. Henriksson. Much thanks to them for the original work! This is free software: you are free to change and redistribute it under the terms of the GNU General Public License (GPL) version 3 or later. This manual is copyright \(C) 2010-2011 K. Henriksson and \(C) 2017-2026 by N. Schlia and may be distributed under the GNU Free Documentation License (GFDL) 1.3 or later with no invariant sections, or alternatively under the GNU General Public License (GPL) version 3 or later. ffmpegfs-2.18/configure0000755000000000000000000111066215166201636012054 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for FFMPEGFS 2.18. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="as_nop=: if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='FFMPEGFS' PACKAGE_TARNAME='ffmpegfs' PACKAGE_VERSION='2.18' PACKAGE_STRING='FFMPEGFS 2.18' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="src/ffmpegfs.cc" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS ENABLE_EXTRA_VERSION_FALSE ENABLE_EXTRA_VERSION_TRUE EXTRA_VERSION NOCHANGELOG_FALSE NOCHANGELOG_TRUE DEBUG_FALSE DEBUG_TRUE GRAPHVIZ CURL DOXYGEN USE_LIBVCD_FALSE USE_LIBVCD_TRUE HINT_LIBBLURAY_FALSE HINT_LIBBLURAY_TRUE USE_LIBBLURAY_FALSE USE_LIBBLURAY_TRUE libbluray_LIBS libbluray_CFLAGS HINT_LIBDVD_FALSE HINT_LIBDVD_TRUE USE_LIBDVD_FALSE USE_LIBDVD_TRUE libdvdread_LIBS libdvdread_CFLAGS libswresample_LIBS libswresample_CFLAGS libswscale_LIBS libswscale_CFLAGS libavfilter_LIBS libavfilter_CFLAGS libavformat_LIBS libavformat_CFLAGS libavcodec_LIBS libavcodec_CFLAGS libavutil_LIBS libavutil_CFLAGS HAVE_W3M W3M HAVE_A2X A2X sqlite3_LIBS sqlite3_CFLAGS libcue_LIBS libcue_CFLAGS fuse3_LIBS fuse3_CFLAGS chardet_LIBS chardet_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG RANLIB am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V CSCOPE ETAGS CTAGS am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_largefile with_libdvd with_libbluray with_libvcd enable_debug enable_changelog with_extra_version ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR chardet_CFLAGS chardet_LIBS fuse3_CFLAGS fuse3_LIBS libcue_CFLAGS libcue_LIBS sqlite3_CFLAGS sqlite3_LIBS libavutil_CFLAGS libavutil_LIBS libavcodec_CFLAGS libavcodec_LIBS libavformat_CFLAGS libavformat_LIBS libavfilter_CFLAGS libavfilter_LIBS libswscale_CFLAGS libswscale_LIBS libswresample_CFLAGS libswresample_LIBS libdvdread_CFLAGS libdvdread_LIBS libbluray_CFLAGS libbluray_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures FFMPEGFS 2.18 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/ffmpegfs] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of FFMPEGFS 2.18:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-largefile omit support for large files --enable-debug Enable debugging, default=no --enable-changelog Turn on changelog, default=no Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-libdvd support using libdvd [default=check] --with-libbluray support using libbluray [default=check] --with-libvcd support using libvcd [default=check] --with-extra-version=STRING append STRING to version Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path chardet_CFLAGS C compiler flags for chardet, overriding pkg-config chardet_LIBS linker flags for chardet, overriding pkg-config fuse3_CFLAGS C compiler flags for fuse3, overriding pkg-config fuse3_LIBS linker flags for fuse3, overriding pkg-config libcue_CFLAGS C compiler flags for libcue, overriding pkg-config libcue_LIBS linker flags for libcue, overriding pkg-config sqlite3_CFLAGS C compiler flags for sqlite3, overriding pkg-config sqlite3_LIBS linker flags for sqlite3, overriding pkg-config libavutil_CFLAGS C compiler flags for libavutil, overriding pkg-config libavutil_LIBS linker flags for libavutil, overriding pkg-config libavcodec_CFLAGS C compiler flags for libavcodec, overriding pkg-config libavcodec_LIBS linker flags for libavcodec, overriding pkg-config libavformat_CFLAGS C compiler flags for libavformat, overriding pkg-config libavformat_LIBS linker flags for libavformat, overriding pkg-config libavfilter_CFLAGS C compiler flags for libavfilter, overriding pkg-config libavfilter_LIBS linker flags for libavfilter, overriding pkg-config libswscale_CFLAGS C compiler flags for libswscale, overriding pkg-config libswscale_LIBS linker flags for libswscale, overriding pkg-config libswresample_CFLAGS C compiler flags for libswresample, overriding pkg-config libswresample_LIBS linker flags for libswresample, overriding pkg-config libdvdread_CFLAGS C compiler flags for libdvdread, overriding pkg-config libdvdread_LIBS linker flags for libdvdread, overriding pkg-config libbluray_CFLAGS C compiler flags for libbluray, overriding pkg-config libbluray_LIBS linker flags for libbluray, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF FFMPEGFS configure 2.18 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 printf %s "checking for int$2_t... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main (void) { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main (void) { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if eval test \"x\$"$3"\" = x"no" then : else $as_nop break fi done fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 printf %s "checking for uint$2_t... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if eval test \"x\$"$3"\" = x"no" then : else $as_nop break fi done fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_try_run LINENO # ---------------------- # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid; break else $as_nop as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_lo=$ac_mid; break else $as_nop as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else $as_nop ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid else $as_nop as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval (void) { return $2; } static unsigned long int ulongval (void) { return $2; } #include #include int main (void) { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : echo >>conftest.val; read $3 &5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by FFMPEGFS $as_me 2.18, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' // Does the compiler advertise C99 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' // Does the compiler advertise C11 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" # Auxiliary files required by this configure script. ac_aux_files="compile config.guess config.sub missing install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/config" # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers src/config.h" # Get configure arguments configure_args="$*" printf "%s\n" "#define CONFIGURE_ARGS \"$configure_args\"" >>confdefs.h am__api_version='1.16' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ 'BusyBox '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else $as_nop cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='ffmpegfs' VERSION='2.18' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi if test -z "$ETAGS"; then ETAGS=etags fi if test -z "$CSCOPE"; then CSCOPE=cscope fi # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' # AC_CANONICAL_HOST is needed to access the 'host_os' variable # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac printf "%s\n" "#define HOST_OS \"$host_os\"" >>confdefs.h # Checks for programs ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else $as_nop ac_file='' fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test ${enable_dependency_tracking+y} then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else $as_nop CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else $as_nop ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CXX_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Checks for typedefs, structures, and compiler characteristics. ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes then : printf "%s\n" "#define HAVE__BOOL 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 printf %s "checking for stdbool.h that conforms to C99... " >&6; } if test ${ac_cv_header_stdbool_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __bool_true_false_are_defined #error "__bool_true_false_are_defined is not defined" #endif char a[__bool_true_false_are_defined == 1 ? 1 : -1]; /* Regardless of whether this is C++ or "_Bool" is a valid type name, "true" and "false" should be usable in #if expressions and integer constant expressions, and "bool" should be a valid type name. */ #if !true #error "'true' is not true" #endif #if true != 1 #error "'true' is not equal to 1" #endif char b[true == 1 ? 1 : -1]; char c[true]; #if false #error "'false' is not false" #endif #if false != 0 #error "'false' is not equal to 0" #endif char d[false == 0 ? 1 : -1]; enum { e = false, f = true, g = false * true, h = true * 256 }; char i[(bool) 0.5 == true ? 1 : -1]; char j[(bool) 0.0 == false ? 1 : -1]; char k[sizeof (bool) > 0 ? 1 : -1]; struct sb { bool s: 1; bool t; } s; char l[sizeof s.t > 0 ? 1 : -1]; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ bool m[h]; char n[sizeof m == h * sizeof m[0] ? 1 : -1]; char o[-1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html https://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ bool p = true; bool *pp = &p; /* C 1999 specifies that bool, true, and false are to be macros, but C++ 2011 and later overrule this. */ #if __cplusplus < 201103 #ifndef bool #error "bool is not defined" #endif #ifndef false #error "false is not defined" #endif #ifndef true #error "true is not defined" #endif #endif /* If _Bool is available, repeat with it all the tests above that used bool. */ #ifdef HAVE__BOOL struct sB { _Bool s: 1; _Bool t; } t; char q[(_Bool) 0.5 == true ? 1 : -1]; char r[(_Bool) 0.0 == false ? 1 : -1]; char u[sizeof (_Bool) > 0 ? 1 : -1]; char v[sizeof t.t > 0 ? 1 : -1]; _Bool w[h]; char x[sizeof m == h * sizeof m[0] ? 1 : -1]; char y[-1 - (_Bool) 0 < 0 ? 1 : -1]; _Bool z = true; _Bool *pz = &p; #endif int main (void) { bool ps = &s; *pp |= p; *pp |= ! p; #ifdef HAVE__BOOL _Bool pt = &t; *pz |= z; *pz |= ! z; #endif /* Refer to every declared value, so they cannot be discarded as unused. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !j + !k + !l + !m + !n + !o + !p + !pp + !ps #ifdef HAVE__BOOL + !q + !r + !u + !v + !w + !x + !y + !z + !pt #endif ); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_header_stdbool_h=yes else $as_nop ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 printf "%s\n" "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) printf "%s\n" "#define int32_t $ac_cv_c_int32_t" >>confdefs.h ;; esac ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes then : else $as_nop printf "%s\n" "#define off_t long int" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes then : else $as_nop printf "%s\n" "#define size_t unsigned int" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = xyes then : else $as_nop printf "%s\n" "#define ssize_t int" >>confdefs.h fi ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) printf "%s\n" "#define uint16_t $ac_cv_c_uint16_t" >>confdefs.h ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) printf "%s\n" "#define _UINT32_T 1" >>confdefs.h printf "%s\n" "#define uint32_t $ac_cv_c_uint32_t" >>confdefs.h ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) printf "%s\n" "#define _UINT64_T 1" >>confdefs.h printf "%s\n" "#define uint64_t $ac_cv_c_uint64_t" >>confdefs.h ;; esac # Checks for header files. #AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h sstream climits cstring]) # Check integer size # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 printf %s "checking size of int... " >&6; } if test ${ac_cv_sizeof_int+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default" then : else $as_nop if test "$ac_cv_type_int" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 printf "%s\n" "$ac_cv_sizeof_int" >&6; } printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 printf %s "checking size of long... " >&6; } if test ${ac_cv_sizeof_long+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default" then : else $as_nop if test "$ac_cv_type_long" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 printf "%s\n" "$ac_cv_sizeof_long" >&6; } printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5 printf %s "checking size of off_t... " >&6; } if test ${ac_cv_sizeof_off_t+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t" "$ac_includes_default" then : else $as_nop if test "$ac_cv_type_off_t" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (off_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_off_t=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5 printf "%s\n" "$ac_cv_sizeof_off_t" >&6; } printf "%s\n" "#define SIZEOF_OFF_T $ac_cv_sizeof_off_t" >>confdefs.h #AC_CHECK_SIZEOF([size_t] if test "$ac_cv_sizeof_int" -lt 4 then : as_fn_error $? "The size of an integer of type \"int\" must be at least 4 bytes." "$LINENO" 5 fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5 printf %s "checking size of time_t... " >&6; } if test ${ac_cv_sizeof_time_t+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" "#include " then : else $as_nop if test "$ac_cv_type_time_t" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (time_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_time_t=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5 printf "%s\n" "$ac_cv_sizeof_time_t" >&6; } printf "%s\n" "#define SIZEOF_TIME_T $ac_cv_sizeof_time_t" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of time_t type" >&5 printf %s "checking size of time_t type... " >&6; } if test "$ac_cv_sizeof_time_t" = "$ac_cv_sizeof_long" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: long" >&5 printf "%s\n" "long" >&6; } printf "%s\n" "#define FFMPEGFS_FORMAT_TIME_T \"ld\"" >>confdefs.h else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: int" >&5 printf "%s\n" "int" >&6; } printf "%s\n" "#define FFMPEGFS_FORMAT_TIME_T \"d\"" >>confdefs.h fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of pthread_t" >&5 printf %s "checking size of pthread_t... " >&6; } if test ${ac_cv_sizeof_pthread_t+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))" "ac_cv_sizeof_pthread_t" "#include " then : else $as_nop if test "$ac_cv_type_pthread_t" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (pthread_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_pthread_t=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_pthread_t" >&5 printf "%s\n" "$ac_cv_sizeof_pthread_t" >&6; } printf "%s\n" "#define SIZEOF_PTHREAD_T $ac_cv_sizeof_pthread_t" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of pthread_t type" >&5 printf %s "checking size of pthread_t type... " >&6; } if test "$ac_cv_sizeof_pthread_t" = "$ac_cv_sizeof_long" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: long" >&5 printf "%s\n" "long" >&6; } printf "%s\n" "#define FFMPEGFS_FORMAT_PTHREAD_T \"lx\"" >>confdefs.h else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: int" >&5 printf "%s\n" "int" >&6; } printf "%s\n" "#define FFMPEGFS_FORMAT_PTHREAD_T \"x\"" >>confdefs.h fi # Large file support # Check whether --enable-largefile was given. if test ${enable_largefile+y} then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 printf %s "checking for special C compiler options needed for large files... " >&6; } if test ${ac_cv_sys_largefile_CC+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : break fi rm -f core conftest.err conftest.$ac_objext conftest.beam CC="$CC -n32" if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if test ${ac_cv_sys_file_offset_bits+y} then : printf %s "(cached) " >&6 else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } if test ${ac_cv_sys_large_files+y} then : printf %s "(cached) " >&6 else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 printf "%s\n" "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h ;; esac rm -rf conftest* fi fi # Define POSIX standard conformance printf "%s\n" "#define _POSIX_C_SOURCE 200809L" >>confdefs.h # Bug#1037653: Fix build with GCC-13 printf "%s\n" "#define __STDC_CONSTANT_MACROS /**/" >>confdefs.h # This is because there are PKG_CHECK_MODULES calls inside conditionals. if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 printf "%s\n" "$PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } PKG_CONFIG="" fi fi # Checks for packages which use pkg-config. pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for chardet >= 1.0.4" >&5 printf %s "checking for chardet >= 1.0.4... " >&6; } if test -n "$chardet_CFLAGS"; then pkg_cv_chardet_CFLAGS="$chardet_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"chardet >= 1.0.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "chardet >= 1.0.4") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_chardet_CFLAGS=`$PKG_CONFIG --cflags "chardet >= 1.0.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$chardet_LIBS"; then pkg_cv_chardet_LIBS="$chardet_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"chardet >= 1.0.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "chardet >= 1.0.4") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_chardet_LIBS=`$PKG_CONFIG --libs "chardet >= 1.0.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then chardet_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "chardet >= 1.0.4" 2>&1` else chardet_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "chardet >= 1.0.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$chardet_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (chardet >= 1.0.4) were not met: $chardet_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables chardet_CFLAGS and chardet_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables chardet_CFLAGS and chardet_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else chardet_CFLAGS=$pkg_cv_chardet_CFLAGS chardet_LIBS=$pkg_cv_chardet_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse3 >= 3.4.1" >&5 printf %s "checking for fuse3 >= 3.4.1... " >&6; } if test -n "$fuse3_CFLAGS"; then pkg_cv_fuse3_CFLAGS="$fuse3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse3 >= 3.4.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "fuse3 >= 3.4.1") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fuse3_CFLAGS=`$PKG_CONFIG --cflags "fuse3 >= 3.4.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fuse3_LIBS"; then pkg_cv_fuse3_LIBS="$fuse3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse3 >= 3.4.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "fuse3 >= 3.4.1") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fuse3_LIBS=`$PKG_CONFIG --libs "fuse3 >= 3.4.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fuse3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fuse3 >= 3.4.1" 2>&1` else fuse3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fuse3 >= 3.4.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fuse3_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (fuse3 >= 3.4.1) were not met: $fuse3_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables fuse3_CFLAGS and fuse3_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables fuse3_CFLAGS and fuse3_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else fuse3_CFLAGS=$pkg_cv_fuse3_CFLAGS fuse3_LIBS=$pkg_cv_fuse3_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libcue >= 2.1.0" >&5 printf %s "checking for libcue >= 2.1.0... " >&6; } if test -n "$libcue_CFLAGS"; then pkg_cv_libcue_CFLAGS="$libcue_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcue >= 2.1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcue >= 2.1.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libcue_CFLAGS=`$PKG_CONFIG --cflags "libcue >= 2.1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libcue_LIBS"; then pkg_cv_libcue_LIBS="$libcue_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcue >= 2.1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcue >= 2.1.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libcue_LIBS=`$PKG_CONFIG --libs "libcue >= 2.1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libcue_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcue >= 2.1.0" 2>&1` else libcue_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcue >= 2.1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libcue_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libcue >= 2.1.0) were not met: $libcue_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables libcue_CFLAGS and libcue_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables libcue_CFLAGS and libcue_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else libcue_CFLAGS=$pkg_cv_libcue_CFLAGS libcue_LIBS=$pkg_cv_libcue_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi # Checks for sqlite3 # API misses a lot of functionality if not fairly recent pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3 >= 3.7.13" >&5 printf %s "checking for sqlite3 >= 3.7.13... " >&6; } if test -n "$sqlite3_CFLAGS"; then pkg_cv_sqlite3_CFLAGS="$sqlite3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sqlite3 >= 3.7.13\""; } >&5 ($PKG_CONFIG --exists --print-errors "sqlite3 >= 3.7.13") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sqlite3_CFLAGS=`$PKG_CONFIG --cflags "sqlite3 >= 3.7.13" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sqlite3_LIBS"; then pkg_cv_sqlite3_LIBS="$sqlite3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sqlite3 >= 3.7.13\""; } >&5 ($PKG_CONFIG --exists --print-errors "sqlite3 >= 3.7.13") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sqlite3_LIBS=`$PKG_CONFIG --libs "sqlite3 >= 3.7.13" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sqlite3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sqlite3 >= 3.7.13" 2>&1` else sqlite3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sqlite3 >= 3.7.13" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sqlite3_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (sqlite3 >= 3.7.13) were not met: $sqlite3_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables sqlite3_CFLAGS and sqlite3_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables sqlite3_CFLAGS and sqlite3_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else sqlite3_CFLAGS=$pkg_cv_sqlite3_CFLAGS sqlite3_LIBS=$pkg_cv_sqlite3_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing sqlite3_errstr" >&5 printf %s "checking for library containing sqlite3_errstr... " >&6; } if test ${ac_cv_search_sqlite3_errstr+y} then : printf %s "(cached) " >&6 else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char sqlite3_errstr (); int main (void) { return sqlite3_errstr (); ; return 0; } _ACEOF for ac_lib in '' sqlite3 do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_sqlite3_errstr=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_sqlite3_errstr+y} then : break fi done if test ${ac_cv_search_sqlite3_errstr+y} then : else $as_nop ac_cv_search_sqlite3_errstr=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqlite3_errstr" >&5 printf "%s\n" "$ac_cv_search_sqlite3_errstr" >&6; } ac_res=$ac_cv_search_sqlite3_errstr if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_SQLITE_ERRSTR 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing sqlite3_db_cacheflush" >&5 printf %s "checking for library containing sqlite3_db_cacheflush... " >&6; } if test ${ac_cv_search_sqlite3_db_cacheflush+y} then : printf %s "(cached) " >&6 else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char sqlite3_db_cacheflush (); int main (void) { return sqlite3_db_cacheflush (); ; return 0; } _ACEOF for ac_lib in '' sqlite3 do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_sqlite3_db_cacheflush=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_sqlite3_db_cacheflush+y} then : break fi done if test ${ac_cv_search_sqlite3_db_cacheflush+y} then : else $as_nop ac_cv_search_sqlite3_db_cacheflush=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqlite3_db_cacheflush" >&5 printf "%s\n" "$ac_cv_search_sqlite3_db_cacheflush" >&6; } ac_res=$ac_cv_search_sqlite3_db_cacheflush if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_SQLITE_CACHEFLUSH 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing sqlite3_expanded_sql" >&5 printf %s "checking for library containing sqlite3_expanded_sql... " >&6; } if test ${ac_cv_search_sqlite3_expanded_sql+y} then : printf %s "(cached) " >&6 else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char sqlite3_expanded_sql (); int main (void) { return sqlite3_expanded_sql (); ; return 0; } _ACEOF for ac_lib in '' sqlite3 do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_sqlite3_expanded_sql=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_sqlite3_expanded_sql+y} then : break fi done if test ${ac_cv_search_sqlite3_expanded_sql+y} then : else $as_nop ac_cv_search_sqlite3_expanded_sql=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqlite3_expanded_sql" >&5 printf "%s\n" "$ac_cv_search_sqlite3_expanded_sql" >&6; } ac_res=$ac_cv_search_sqlite3_expanded_sql if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_SQLITE_EXPANDED_SQL 1" >>confdefs.h fi # # Check for programs used when building manpages and help. # # Check for a2x (convert asciidoc to another format) # Extract the first word of "a2x", so it can be a program name with args. set dummy a2x; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_A2X+y} then : printf %s "(cached) " >&6 else $as_nop case $A2X in [\\/]* | ?:[\\/]*) ac_cv_path_A2X="$A2X" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_A2X="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi A2X=$ac_cv_path_A2X if test -n "$A2X"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $A2X" >&5 printf "%s\n" "$A2X" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "a2x", so it can be a program name with args. set dummy a2x; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_HAVE_A2X+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$HAVE_A2X"; then ac_cv_prog_HAVE_A2X="$HAVE_A2X" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_HAVE_A2X=""yes"" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_HAVE_A2X" && ac_cv_prog_HAVE_A2X=""no"" fi fi HAVE_A2X=$ac_cv_prog_HAVE_A2X if test -n "$HAVE_A2X"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAVE_A2X" >&5 printf "%s\n" "$HAVE_A2X" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "$HAVE_A2X" = "yes" then : else $as_nop as_fn_error $? "a2x could not be found. Install asciidoc to fix. Or asciidoc-base instead to save disc space." "$LINENO" 5 fi # Check for w3m (html -> text) # Extract the first word of "w3m", so it can be a program name with args. set dummy w3m; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_W3M+y} then : printf %s "(cached) " >&6 else $as_nop case $W3M in [\\/]* | ?:[\\/]*) ac_cv_path_W3M="$W3M" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_W3M="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi W3M=$ac_cv_path_W3M if test -n "$W3M"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $W3M" >&5 printf "%s\n" "$W3M" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "w3m", so it can be a program name with args. set dummy w3m; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_HAVE_W3M+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$HAVE_W3M"; then ac_cv_prog_HAVE_W3M="$HAVE_W3M" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_HAVE_W3M=""yes"" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_HAVE_W3M" && ac_cv_prog_HAVE_W3M=""no"" fi fi HAVE_W3M=$ac_cv_prog_HAVE_W3M if test -n "$HAVE_W3M"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAVE_W3M" >&5 printf "%s\n" "$HAVE_W3M" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "$HAVE_W3M" = "yes" then : else $as_nop as_fn_error $? "w3m could not be found. To fix, kindly install." "$LINENO" 5 fi # FFmpeg 4.1.8 "al-Khwarizmi" # # This version is packaged with Debian Buster. This is the lowest version # we support. # # 4.1.8 was released on 2021-10-17. It is the latest stable FFmpeg release # from the 4.1 release branch, which was cut from master on 2018-11-02. # # It includes the following library versions: # # libavutil 56. 22.100 # libavcodec 58. 35.100 # libavformat 58. 20.100 # libavdevice 58. 5.100 (not used) # libavfilter 7. 40.101 # libswscale 5. 3.100 # libswresample 3. 3.100 # libpostproc 55. 3.100 (not used) # # May work with older versions but this is not guaranteed. pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libavutil >= 56.22.100" >&5 printf %s "checking for libavutil >= 56.22.100... " >&6; } if test -n "$libavutil_CFLAGS"; then pkg_cv_libavutil_CFLAGS="$libavutil_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libavutil >= 56.22.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libavutil >= 56.22.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libavutil_CFLAGS=`$PKG_CONFIG --cflags "libavutil >= 56.22.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libavutil_LIBS"; then pkg_cv_libavutil_LIBS="$libavutil_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libavutil >= 56.22.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libavutil >= 56.22.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libavutil_LIBS=`$PKG_CONFIG --libs "libavutil >= 56.22.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libavutil_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libavutil >= 56.22.100" 2>&1` else libavutil_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libavutil >= 56.22.100" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libavutil_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libavutil >= 56.22.100) were not met: $libavutil_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables libavutil_CFLAGS and libavutil_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables libavutil_CFLAGS and libavutil_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else libavutil_CFLAGS=$pkg_cv_libavutil_CFLAGS libavutil_LIBS=$pkg_cv_libavutil_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libavcodec >= 58.35.100" >&5 printf %s "checking for libavcodec >= 58.35.100... " >&6; } if test -n "$libavcodec_CFLAGS"; then pkg_cv_libavcodec_CFLAGS="$libavcodec_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libavcodec >= 58.35.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libavcodec >= 58.35.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libavcodec_CFLAGS=`$PKG_CONFIG --cflags "libavcodec >= 58.35.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libavcodec_LIBS"; then pkg_cv_libavcodec_LIBS="$libavcodec_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libavcodec >= 58.35.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libavcodec >= 58.35.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libavcodec_LIBS=`$PKG_CONFIG --libs "libavcodec >= 58.35.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libavcodec_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libavcodec >= 58.35.100" 2>&1` else libavcodec_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libavcodec >= 58.35.100" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libavcodec_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libavcodec >= 58.35.100) were not met: $libavcodec_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables libavcodec_CFLAGS and libavcodec_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables libavcodec_CFLAGS and libavcodec_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else libavcodec_CFLAGS=$pkg_cv_libavcodec_CFLAGS libavcodec_LIBS=$pkg_cv_libavcodec_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libavformat >= 58.20.100" >&5 printf %s "checking for libavformat >= 58.20.100... " >&6; } if test -n "$libavformat_CFLAGS"; then pkg_cv_libavformat_CFLAGS="$libavformat_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libavformat >= 58.20.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libavformat >= 58.20.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libavformat_CFLAGS=`$PKG_CONFIG --cflags "libavformat >= 58.20.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libavformat_LIBS"; then pkg_cv_libavformat_LIBS="$libavformat_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libavformat >= 58.20.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libavformat >= 58.20.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libavformat_LIBS=`$PKG_CONFIG --libs "libavformat >= 58.20.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libavformat_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libavformat >= 58.20.100" 2>&1` else libavformat_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libavformat >= 58.20.100" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libavformat_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libavformat >= 58.20.100) were not met: $libavformat_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables libavformat_CFLAGS and libavformat_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables libavformat_CFLAGS and libavformat_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else libavformat_CFLAGS=$pkg_cv_libavformat_CFLAGS libavformat_LIBS=$pkg_cv_libavformat_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libavfilter >= 7.40.101" >&5 printf %s "checking for libavfilter >= 7.40.101... " >&6; } if test -n "$libavfilter_CFLAGS"; then pkg_cv_libavfilter_CFLAGS="$libavfilter_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libavfilter >= 7.40.101\""; } >&5 ($PKG_CONFIG --exists --print-errors "libavfilter >= 7.40.101") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libavfilter_CFLAGS=`$PKG_CONFIG --cflags "libavfilter >= 7.40.101" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libavfilter_LIBS"; then pkg_cv_libavfilter_LIBS="$libavfilter_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libavfilter >= 7.40.101\""; } >&5 ($PKG_CONFIG --exists --print-errors "libavfilter >= 7.40.101") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libavfilter_LIBS=`$PKG_CONFIG --libs "libavfilter >= 7.40.101" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libavfilter_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libavfilter >= 7.40.101" 2>&1` else libavfilter_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libavfilter >= 7.40.101" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libavfilter_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libavfilter >= 7.40.101) were not met: $libavfilter_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables libavfilter_CFLAGS and libavfilter_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables libavfilter_CFLAGS and libavfilter_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else libavfilter_CFLAGS=$pkg_cv_libavfilter_CFLAGS libavfilter_LIBS=$pkg_cv_libavfilter_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libswscale >= 5.3.100" >&5 printf %s "checking for libswscale >= 5.3.100... " >&6; } if test -n "$libswscale_CFLAGS"; then pkg_cv_libswscale_CFLAGS="$libswscale_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libswscale >= 5.3.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libswscale >= 5.3.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libswscale_CFLAGS=`$PKG_CONFIG --cflags "libswscale >= 5.3.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libswscale_LIBS"; then pkg_cv_libswscale_LIBS="$libswscale_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libswscale >= 5.3.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libswscale >= 5.3.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libswscale_LIBS=`$PKG_CONFIG --libs "libswscale >= 5.3.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libswscale_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libswscale >= 5.3.100" 2>&1` else libswscale_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libswscale >= 5.3.100" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libswscale_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libswscale >= 5.3.100) were not met: $libswscale_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables libswscale_CFLAGS and libswscale_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables libswscale_CFLAGS and libswscale_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else libswscale_CFLAGS=$pkg_cv_libswscale_CFLAGS libswscale_LIBS=$pkg_cv_libswscale_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libswresample >= 3.3.100" >&5 printf %s "checking for libswresample >= 3.3.100... " >&6; } if test -n "$libswresample_CFLAGS"; then pkg_cv_libswresample_CFLAGS="$libswresample_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libswresample >= 3.3.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libswresample >= 3.3.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libswresample_CFLAGS=`$PKG_CONFIG --cflags "libswresample >= 3.3.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libswresample_LIBS"; then pkg_cv_libswresample_LIBS="$libswresample_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libswresample >= 3.3.100\""; } >&5 ($PKG_CONFIG --exists --print-errors "libswresample >= 3.3.100") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libswresample_LIBS=`$PKG_CONFIG --libs "libswresample >= 3.3.100" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libswresample_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libswresample >= 3.3.100" 2>&1` else libswresample_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libswresample >= 3.3.100" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libswresample_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libswresample >= 3.3.100) were not met: $libswresample_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables libswresample_CFLAGS and libswresample_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables libswresample_CFLAGS and libswresample_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else libswresample_CFLAGS=$pkg_cv_libswresample_CFLAGS libswresample_LIBS=$pkg_cv_libswresample_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAVE_FFMPEG 1" >>confdefs.h fi fi fi fi fi fi # Optional libraries # Check whether --with-libdvd was given. if test ${with_libdvd+y} then : withval=$with_libdvd; else $as_nop with_libdvd=check fi case "$with_libdvd" in #( yes) : pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dvdread >= 5.0.0" >&5 printf %s "checking for dvdread >= 5.0.0... " >&6; } if test -n "$libdvdread_CFLAGS"; then pkg_cv_libdvdread_CFLAGS="$libdvdread_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dvdread >= 5.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dvdread >= 5.0.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libdvdread_CFLAGS=`$PKG_CONFIG --cflags "dvdread >= 5.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libdvdread_LIBS"; then pkg_cv_libdvdread_LIBS="$libdvdread_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dvdread >= 5.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dvdread >= 5.0.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libdvdread_LIBS=`$PKG_CONFIG --libs "dvdread >= 5.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libdvdread_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "dvdread >= 5.0.0" 2>&1` else libdvdread_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "dvdread >= 5.0.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libdvdread_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (dvdread >= 5.0.0) were not met: $libdvdread_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables libdvdread_CFLAGS and libdvdread_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables libdvdread_CFLAGS and libdvdread_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else libdvdread_CFLAGS=$pkg_cv_libdvdread_CFLAGS libdvdread_LIBS=$pkg_cv_libdvdread_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } HAVE_LIBDVDREAD=1 fi ;; #( no) : ;; #( *) : pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dvdread >= 5.0.0" >&5 printf %s "checking for dvdread >= 5.0.0... " >&6; } if test -n "$libdvdread_CFLAGS"; then pkg_cv_libdvdread_CFLAGS="$libdvdread_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dvdread >= 5.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dvdread >= 5.0.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libdvdread_CFLAGS=`$PKG_CONFIG --cflags "dvdread >= 5.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libdvdread_LIBS"; then pkg_cv_libdvdread_LIBS="$libdvdread_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dvdread >= 5.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dvdread >= 5.0.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libdvdread_LIBS=`$PKG_CONFIG --libs "dvdread >= 5.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libdvdread_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "dvdread >= 5.0.0" 2>&1` else libdvdread_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "dvdread >= 5.0.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libdvdread_PKG_ERRORS" >&5 HAVE_LIBDVDREAD=0 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } HAVE_LIBDVDREAD=0 else libdvdread_CFLAGS=$pkg_cv_libdvdread_CFLAGS libdvdread_LIBS=$pkg_cv_libdvdread_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } HAVE_LIBDVDREAD=1 fi ;; esac if test "$with_libdvd" != "no" -a "0$HAVE_LIBDVDREAD" -eq 1; then USE_LIBDVD_TRUE= USE_LIBDVD_FALSE='#' else USE_LIBDVD_TRUE='#' USE_LIBDVD_FALSE= fi if test "$with_libdvd" != "no" -a "0$HAVE_LIBDVDREAD" -eq 0; then HINT_LIBDVD_TRUE= HINT_LIBDVD_FALSE='#' else HINT_LIBDVD_TRUE='#' HINT_LIBDVD_FALSE= fi # Check whether --with-libbluray was given. if test ${with_libbluray+y} then : withval=$with_libbluray; else $as_nop with_libbluray=check fi case "$with_libbluray" in #( yes) : pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libbluray >= 0.6.2" >&5 printf %s "checking for libbluray >= 0.6.2... " >&6; } if test -n "$libbluray_CFLAGS"; then pkg_cv_libbluray_CFLAGS="$libbluray_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbluray >= 0.6.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libbluray >= 0.6.2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libbluray_CFLAGS=`$PKG_CONFIG --cflags "libbluray >= 0.6.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libbluray_LIBS"; then pkg_cv_libbluray_LIBS="$libbluray_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbluray >= 0.6.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libbluray >= 0.6.2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libbluray_LIBS=`$PKG_CONFIG --libs "libbluray >= 0.6.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libbluray_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libbluray >= 0.6.2" 2>&1` else libbluray_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libbluray >= 0.6.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libbluray_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libbluray >= 0.6.2) were not met: $libbluray_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables libbluray_CFLAGS and libbluray_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables libbluray_CFLAGS and libbluray_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else libbluray_CFLAGS=$pkg_cv_libbluray_CFLAGS libbluray_LIBS=$pkg_cv_libbluray_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } HAVE_LIBBLURAY=1 fi ;; #( no) : ;; #( *) : pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libbluray >= 0.6.2" >&5 printf %s "checking for libbluray >= 0.6.2... " >&6; } if test -n "$libbluray_CFLAGS"; then pkg_cv_libbluray_CFLAGS="$libbluray_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbluray >= 0.6.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libbluray >= 0.6.2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libbluray_CFLAGS=`$PKG_CONFIG --cflags "libbluray >= 0.6.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libbluray_LIBS"; then pkg_cv_libbluray_LIBS="$libbluray_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbluray >= 0.6.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libbluray >= 0.6.2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libbluray_LIBS=`$PKG_CONFIG --libs "libbluray >= 0.6.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libbluray_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libbluray >= 0.6.2" 2>&1` else libbluray_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libbluray >= 0.6.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libbluray_PKG_ERRORS" >&5 HAVE_LIBBLURAY=0 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } HAVE_LIBBLURAY=0 else libbluray_CFLAGS=$pkg_cv_libbluray_CFLAGS libbluray_LIBS=$pkg_cv_libbluray_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } HAVE_LIBBLURAY=1 fi ;; esac if test "$with_libbluray" != "no" -a "0$HAVE_LIBBLURAY" -eq 1; then USE_LIBBLURAY_TRUE= USE_LIBBLURAY_FALSE='#' else USE_LIBBLURAY_TRUE='#' USE_LIBBLURAY_FALSE= fi if test "$with_libbluray" != "no" -a "0$HAVE_LIBBLURAY" -eq 0; then HINT_LIBBLURAY_TRUE= HINT_LIBBLURAY_FALSE='#' else HINT_LIBBLURAY_TRUE='#' HINT_LIBBLURAY_FALSE= fi # Check for libvcd # Check whether --with-libvcd was given. if test ${with_libvcd+y} then : withval=$with_libvcd; else $as_nop with_libvcd=check fi if test "$with_libvcd" != "no"; then USE_LIBVCD_TRUE= USE_LIBVCD_FALSE='#' else USE_LIBVCD_TRUE='#' USE_LIBVCD_FALSE= fi if test -z "$USE_LIBVCD_TRUE"; then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Internal S/VCD support enabled... yes" >&5 printf "%s\n" "Internal S/VCD support enabled... yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Internal S/VCD support enabled... no" >&5 printf "%s\n" "Internal S/VCD support enabled... no" >&6; } fi # Check for doxygen. If not installed, go on, but make doxy won't work. for ac_prog in doxygen do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DOXYGEN+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DOXYGEN"; then ac_cv_prog_DOXYGEN="$DOXYGEN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DOXYGEN="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DOXYGEN=$ac_cv_prog_DOXYGEN if test -n "$DOXYGEN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5 printf "%s\n" "$DOXYGEN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$DOXYGEN" && break done if test -z "$DOXYGEN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Doxygen could not be found; we must continue without it. It is advised to be installed if you intend to use \"make doxy\"." >&5 printf "%s\n" "$as_me: WARNING: Doxygen could not be found; we must continue without it. It is advised to be installed if you intend to use \"make doxy\"." >&2;} fi # Check for curl. If not installed, go on, but make doxy won't work. for ac_prog in curl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CURL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CURL"; then ac_cv_prog_CURL="$CURL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CURL="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CURL=$ac_cv_prog_CURL if test -n "$CURL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CURL" >&5 printf "%s\n" "$CURL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CURL" && break done if test -z "$CURL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: curl could not be found; we must continue without it. It is advised to be installed if you intend to use \"make doxy\"." >&5 printf "%s\n" "$as_me: WARNING: curl could not be found; we must continue without it. It is advised to be installed if you intend to use \"make doxy\"." >&2;} fi # Check for dot (graphviz). If not installed, go on, but make doxy won't work. for ac_prog in dot do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_GRAPHVIZ+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$GRAPHVIZ"; then ac_cv_prog_GRAPHVIZ="$GRAPHVIZ" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_GRAPHVIZ="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GRAPHVIZ=$ac_cv_prog_GRAPHVIZ if test -n "$GRAPHVIZ"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GRAPHVIZ" >&5 printf "%s\n" "$GRAPHVIZ" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$GRAPHVIZ" && break done if test -z "$GRAPHVIZ"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: dot could not be found; we must continue without it. It is advised to be installed if you intend to use \"make doxy\"." >&5 printf "%s\n" "$as_me: WARNING: dot could not be found; we must continue without it. It is advised to be installed if you intend to use \"make doxy\"." >&2;} fi # Check whether --enable-debug was given. if test ${enable_debug+y} then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else $as_nop debug=false fi if test x"$debug" = x"true"; then DEBUG_TRUE= DEBUG_FALSE='#' else DEBUG_TRUE='#' DEBUG_FALSE= fi # Check whether --enable-changelog was given. if test ${enable_changelog+y} then : enableval=$enable_changelog; case "${enableval}" in yes) changelog=yes ;; no) changelog=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-changelog" "$LINENO" 5 ;; esac else $as_nop changelog=false fi if test x$changelog = xno; then NOCHANGELOG_TRUE= NOCHANGELOG_FALSE='#' else NOCHANGELOG_TRUE='#' NOCHANGELOG_FALSE= fi # Outputs resulting files. ac_config_files="$ac_config_files Makefile src/Makefile test/Makefile" # Check whether --with-extra-version was given. if test ${with_extra_version+y} then : withval=$with_extra_version; EXTRA_VERSION="${withval}" else $as_nop EXTRA_VERSION="" fi if test -n "$EXTRA_VERSION"; then ENABLE_EXTRA_VERSION_TRUE= ENABLE_EXTRA_VERSION_FALSE='#' else ENABLE_EXTRA_VERSION_TRUE='#' ENABLE_EXTRA_VERSION_FALSE= fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBDVD_TRUE}" && test -z "${USE_LIBDVD_FALSE}"; then as_fn_error $? "conditional \"USE_LIBDVD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HINT_LIBDVD_TRUE}" && test -z "${HINT_LIBDVD_FALSE}"; then as_fn_error $? "conditional \"HINT_LIBDVD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBBLURAY_TRUE}" && test -z "${USE_LIBBLURAY_FALSE}"; then as_fn_error $? "conditional \"USE_LIBBLURAY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HINT_LIBBLURAY_TRUE}" && test -z "${HINT_LIBBLURAY_FALSE}"; then as_fn_error $? "conditional \"HINT_LIBBLURAY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBVCD_TRUE}" && test -z "${USE_LIBVCD_FALSE}"; then as_fn_error $? "conditional \"USE_LIBVCD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then as_fn_error $? "conditional \"DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NOCHANGELOG_TRUE}" && test -z "${NOCHANGELOG_FALSE}"; then as_fn_error $? "conditional \"NOCHANGELOG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_EXTRA_VERSION_TRUE}" && test -z "${ENABLE_EXTRA_VERSION_FALSE}"; then as_fn_error $? "conditional \"ENABLE_EXTRA_VERSION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by FFMPEGFS $as_me 2.18, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ FFMPEGFS config.status 2.18 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi # Hints on options if test -z "$HINT_LIBDVD_TRUE"; then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: HINT: For DVD support, install the libdvdread development packages. Consult INSTALL.md for more information." >&5 printf "%s\n" "$as_me: HINT: For DVD support, install the libdvdread development packages. Consult INSTALL.md for more information." >&6;} fi if test -z "$HINT_LIBBLURAY_TRUE"; then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: HINT: For Blu-ray support, install the libbluray development package. Consult INSTALL.md for more information." >&5 printf "%s\n" "$as_me: HINT: For Blu-ray support, install the libbluray development package. Consult INSTALL.md for more information." >&6;} fi ffmpegfs-2.18/src/0000755000000000000000000000000015166203631011002 500000000000000ffmpegfs-2.18/src/thread_pool.cc0000644000000000000000000001033215166175407013541 00000000000000/* * Copyright (C) 2019-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file thread_pool.cc * @brief Thread pool class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2019-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "thread_pool.h" #include "logging.h" #include "config.h" thread_pool::thread_pool(unsigned int num_threads) : m_queue_shutdown(false) , m_num_threads(num_threads) , m_cur_threads(0) , m_threads_running(0) { } thread_pool::~thread_pool() { tear_down(true); } void thread_pool::loop_function_starter(thread_pool & tp) { tp.loop_function(); } void thread_pool::loop_function() { unsigned int thread_no = ++m_cur_threads; while (true) { FunctionPointer info; { std::unique_lock lock_queue_mutex(m_queue_mutex); m_queue_cond.wait(lock_queue_mutex, [this]{ return (!m_thread_queue.empty() || m_queue_shutdown); }); if (m_queue_shutdown) { break; } Logging::trace(nullptr, "Starting job taking pool thread no. %1 with id 0x%<" FFMPEGFS_FORMAT_PTHREAD_T ">2.", thread_no, pthread_self()); info = m_thread_queue.front(); m_thread_queue.pop(); } int ret = info(); Logging::trace(nullptr, "The job using pool thread no. %1 with id 0x%<" FFMPEGFS_FORMAT_PTHREAD_T ">2 has exited with return code %3.", thread_no, pthread_self(), ret); } } bool thread_pool::schedule_thread(FunctionPointer &&func) { if (!m_queue_shutdown) { Logging::trace(nullptr, "Queuing up a new thread. There are %1 threads in the pool.", m_thread_pool.size()); { std::lock_guard lock_queue_mutex(m_queue_mutex); m_thread_queue.push(func); } m_queue_cond.notify_one(); return true; } else { return false; } } unsigned int thread_pool::current_running() const { return m_threads_running; } unsigned int thread_pool::current_queued() { std::lock_guard lock_queue_mutex(m_queue_mutex); return static_cast(m_thread_queue.size()); } unsigned int thread_pool::pool_size() const { return static_cast(m_thread_pool.size()); } int thread_pool::init(unsigned int num_threads /*= 0*/) { if (!m_thread_pool.empty()) { Logging::warning(nullptr, "The thread pool already initialised"); return 0; } if (num_threads) { m_num_threads = num_threads; } Logging::info(nullptr, "The thread pool is being initialised with a maximum of %1 threads.", m_num_threads); for(unsigned int i = 0; i < m_num_threads; i++) { m_thread_pool.emplace_back(std::thread(&thread_pool::loop_function_starter, std::ref(*this))); } return static_cast(m_thread_pool.size()); } void thread_pool::tear_down(bool silent) { if (!silent) { Logging::debug(nullptr, "Tearing down the thread pool. There are %1 threads still in the pool.", m_thread_queue.size()); } { std::lock_guard lk(m_queue_mutex); m_queue_shutdown = true; } m_queue_cond.notify_all(); while (!m_thread_pool.empty()) { m_thread_pool.back().join(); m_thread_pool.pop_back(); } } ffmpegfs-2.18/src/ffmpeg_transcoder.cc0000644000000000000000000105342515166175513014742 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_transcoder.cc * @brief FFmpeg_Transcoder class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifdef __cplusplus extern "C" { #endif // Disable annoying warnings outside our code #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #include #include #include #include #include #include #include #include #include #include #include #include #pragma GCC diagnostic pop #ifdef __cplusplus } #endif #include "ffmpeg_transcoder.h" #include "buffer.h" #include "wave.h" #include "aiff.h" #include "logging.h" #include "ffmpegfs.h" #include #include #include #define FRAME_SEEK_THRESHOLD 25 /**< @brief Ignore seek if target is within the next n frames */ const std::vector FFmpeg_Transcoder::m_prores_bitrate = { // SD { 720, 486, { { 24, false } }, { 10, 23, 34, 50, 75, 113 } }, { 720, 486, { { 60, true }, { 30, false } }, { 12, 29, 42, 63, 94, 141 } }, { 720, 576, { { 50, true }, { 25, false } }, { 12, 28, 41, 61, 92, 138 } }, { 960, 720, { { 24, false } }, { 15, 35, 50, 75, 113, 170 } }, { 960, 720, { { 25, false } }, { 16, 36, 52, 79, 118, 177 } }, { 960, 720, { { 30, false } }, { 19, 44, 63, 94, 141, 212 } }, { 960, 720, { { 50, false } }, { 32, 73, 105, 157, 236, 354 } }, { 960, 720, { { 60, false } }, { 38, 87, 126, 189, 283, 424 } }, // HD { 1280, 720, { { 24, false } }, { 18, 41, 59, 88, 132, 198 } }, { 1280, 720, { { 25, false } }, { 19, 42, 61, 92, 138, 206 } }, { 1280, 720, { { 30, false } }, { 23, 51, 73, 110, 165, 247 } }, { 1280, 720, { { 50, false } }, { 38, 84, 122, 184, 275, 413 } }, { 1280, 720, { { 60, false } }, { 45, 101, 147, 220, 330, 495 } }, { 1280, 1080, { { 24, false } }, { 31, 70, 101, 151, 226, 339 } }, { 1280, 1080, { { 60, true }, { 30, false } }, { 38, 87, 126, 189, 283, 424 } }, { 1440, 1080, { { 24, false } }, { 31, 70, 101, 151, 226, 339 } }, { 1440, 1080, { { 50, true }, { 25, false } }, { 32, 73, 105, 157, 236, 354 } }, { 1440, 1080, { { 60, true }, { 30, false } }, { 38, 87, 126, 189, 283, 424 } }, // Full HD { 1920, 1080, { { 24, false } }, { 36, 82, 117, 176, 264, 396 } }, { 1920, 1080, { { 50, true }, { 25, false } }, { 38, 85, 122, 184, 275, 413 } }, { 1920, 1080, { { 60, true }, { 30, false } }, { 45, 102, 147, 220, 330, 495 } }, { 1920, 1080, { { 50, false } }, { 76, 170, 245, 367, 551, 826 } }, { 1920, 1080, { { 60, false } }, { 91, 204, 293, 440, 660, 990 } }, // 2K { 2048, 1080, { { 24, false } }, { 41, 93, 134, 201, 302, 453 } }, { 2048, 1080, { { 25, false } }, { 43, 97, 140, 210, 315, 472 } }, { 2048, 1080, { { 30, false } }, { 52, 116, 168, 251, 377, 566 } }, { 2048, 1080, { { 50, false } }, { 86, 194, 280, 419, 629, 944 } }, { 2048, 1080, { { 60, false } }, { 103, 232, 335, 503, 754, 1131 } }, // 2K { 2048, 1556, { { 24, false } }, { 56, 126, 181, 272, 407, 611 } }, { 2048, 1556, { { 25, false } }, { 58, 131, 189, 283, 425, 637 } }, { 2048, 1556, { { 30, false } }, { 70, 157, 226, 340, 509, 764 } }, { 2048, 1556, { { 50, false } }, { 117, 262, 377, 567, 850, 1275 } }, { 2048, 1556, { { 60, false } }, { 140, 314, 452, 679, 1019, 1528 } }, // QFHD { 3840, 2160, { { 24, false } }, { 145, 328, 471, 707, 1061, 1591 } }, { 3840, 2160, { { 25, false } }, { 151, 342, 492, 737, 1106, 1659 } }, { 3840, 2160, { { 30, false } }, { 182, 410, 589, 884, 1326, 1989 } }, { 3840, 2160, { { 50, false } }, { 303, 684, 983, 1475, 2212, 3318 } }, { 3840, 2160, { { 60, false } }, { 363, 821, 1178, 1768, 2652, 3977 } }, // 4K { 4096, 2160, { { 24, false } }, { 155, 350, 503, 754, 1131, 1697 } }, { 4096, 2160, { { 25, false } }, { 162, 365, 524, 786, 1180, 1769 } }, { 4096, 2160, { { 30, false } }, { 194, 437, 629, 943, 1414, 2121 } }, { 4096, 2160, { { 50, false } }, { 323, 730, 1049, 1573, 2359, 3539 } }, { 4096, 2160, { { 60, false } }, { 388, 875, 1257, 1886, 2828, 4242 } }, // 5K { 5120, 2700, { { 24, false } }, { 243, 547, 786, 1178, 1768, 2652 } }, { 5120, 2700, { { 25, false } }, { 253, 570, 819, 1229, 1843, 2765 } }, { 5120, 2700, { { 30, false } }, { 304, 684, 982, 1473, 2210, 3314 } }, { 5120, 2700, { { 50, false } }, { 507, 1140, 1638, 2458, 3686, 5530 } }, { 5120, 2700, { { 60, false } }, { 608, 1367, 1964, 2946, 4419, 6629 } }, // 6K { 6144, 3240, { { 24, false } }, { 350, 788, 1131, 1697, 2545, 3818 } }, { 6144, 3240, { { 25, false } }, { 365, 821, 1180, 1769, 2654, 3981 } }, { 6144, 3240, { { 30, false } }, { 437, 985, 1414, 2121, 3182, 4772 } }, { 6144, 3240, { { 50, false } }, { 730, 1643, 2359, 3539, 5308, 7962 } }, { 6144, 3240, { { 60, false } }, { 875, 1969, 2828, 4242, 6364, 9545 } }, // 8K { 8192, 4320, { { 24, false } }, { 622, 1400, 2011, 3017, 4525, 6788 } }, { 8192, 4320, { { 25, false } }, { 649, 1460, 2097, 3146, 4719, 7078 } }, { 8192, 4320, { { 30, false } }, { 778, 1750, 2514, 3771, 5657, 8485 } }, { 8192, 4320, { { 50, false } }, { 1298, 2920, 4194, 6291, 9437, 14156 } }, { 8192, 4320, { { 60, false } }, { 1556, 3500, 5028, 7542, 11313, 16970 } } }; const FFmpeg_Transcoder::DEVICETYPE_MAP FFmpeg_Transcoder::m_devicetype_map = { { AV_HWDEVICE_TYPE_VAAPI, AV_PIX_FMT_NV12 }, ///< VAAPI uses the NV12 pix format #if 0 { AV_HWDEVICE_TYPE_CUDA, AV_PIX_FMT_CUDA }, ///< @todo HWACCEL - Cuda pix_fmt: to be added. { AV_HWDEVICE_TYPE_VDPAU, AV_PIX_FMT_YUV420P }, ///< @todo HWACCEL - VDPAU pix_fmt: to be added. { AV_HWDEVICE_TYPE_QSV, AV_PIX_FMT_QSV }, ///< @todo HWACCEL - QSV pix_fmt untested: Seems to be AV_PIX_FMT_P010 or AV_PIX_FMT_QSV. To be added. { AV_HWDEVICE_TYPE_OPENCL, AV_PIX_FMT_OPENCL }, ///< @todo HWACCEL - OpenCL pix_fmt: Seems to be AV_PIX_FMT_OPENCL or AV_PIX_FMT_NV12. To be added. #if HAVE_VULKAN_HWACCEL { AV_HWDEVICE_TYPE_VULKAN, AV_PIX_FMT_VULKAN }, ///< @todo HWACCEL - Vulkan pix_fmt: to be added. #endif // HAVE_VULKAN_HWACCEL #if __APPLE__ { AV_HWDEVICE_TYPE_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX }, ///< Videotoolbox pix_fmt: MacOS acceleration APIs not supported #endif // __APPLE__ #if __ANDROID__ { AV_HWDEVICE_TYPE_MEDIACODEC, AV_PIX_FMT_MEDIACODEC }, ///< Mediacodec pix_fmt: Android acceleration APIs not supported #endif // __ANDROID__ #if _WIN32 { AV_HWDEVICE_TYPE_DRM, AV_PIX_FMT_DRM_PRIME }, ///< DRM prime pix_fmt: Windows acceleration APIs not supported { AV_HWDEVICE_TYPE_DXVA2, AV_PIX_FMT_DXVA2_VLD }, ///< DXVA2 pix_fmt: Windows acceleration APIs not supported { AV_HWDEVICE_TYPE_D3D11VA, AV_PIX_FMT_D3D11VA_VLD }, ///< D3D11VA pix_fmt: Windows acceleration APIs not supported #endif // _WIN32 #endif }; FFmpeg_Transcoder::StreamRef::StreamRef() : m_codec_ctx(nullptr), m_stream(nullptr), m_stream_idx(INVALID_STREAM), m_start_time(0) { } FFmpeg_Transcoder::StreamRef::~StreamRef() { reset(); } template< typename T > struct av_context_deleter /**< @brief Delete helper struct for std::shared_ptr */ { /** * @brief Delete for std::shared_ptr: Deletes the AVCodecContext pointer * @param[in] p - AVCodecContext pointer to delete */ void operator ()( T * p) const { avcodec_free_context(&p); } }; void FFmpeg_Transcoder::StreamRef::set_codec_ctx(AVCodecContext *codec_ctx) { if (codec_ctx != nullptr) { std::shared_ptr sp(codec_ctx, av_context_deleter()); m_codec_ctx = sp; } else { m_codec_ctx.reset(); } } void FFmpeg_Transcoder::StreamRef::reset() { m_codec_ctx.reset(); } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" FFmpeg_Transcoder::FFmpeg_Transcoder() : m_fileio(nullptr) , m_last_seek_frame_no(0) , m_have_seeked(false) , m_skip_next_frame(false) , m_is_video(false) , m_cur_sample_fmt(AV_SAMPLE_FMT_NONE) , m_cur_sample_rate(-1) , m_audio_resample_ctx(nullptr) , m_audio_fifo(nullptr) , m_sws_ctx(nullptr) , m_buffer_sink_context(nullptr) , m_buffer_source_context(nullptr) , m_filter_graph(nullptr) , m_pts(AV_NOPTS_VALUE) , m_pos(AV_NOPTS_VALUE) , m_current_segment(1) , m_insert_keyframe(true) , m_copy_audio(false) , m_copy_video(false) , m_cur_audio_ts(0) , m_cur_video_ts(0) , m_current_format(nullptr) , m_buffer(nullptr) , m_reset_pts(0) , m_fake_frame_no(0) , m_hwaccel_enc_mode(HWACCELMODE::NONE) , m_hwaccel_dec_mode(HWACCELMODE::NONE) , m_hwaccel_enable_enc_buffering(false) , m_hwaccel_enable_dec_buffering(false) , m_hwaccel_enc_device_ctx(nullptr) , m_hwaccel_dec_device_ctx(nullptr) , m_enc_hw_pix_fmt(AV_PIX_FMT_NONE) , m_dec_hw_pix_fmt(AV_PIX_FMT_NONE) , m_active_stream_msk(0) , m_inhibit_stream_msk(0) { #pragma GCC diagnostic pop Logging::trace(nullptr, "The FFmpeg trancoder is ready to initialise."); std::memset(&m_mtime, 0, sizeof(m_mtime)); #if LAVU_DEP_OLD_CHANNEL_LAYOUT av_channel_layout_default(&m_cur_ch_layout, params.m_audiochannels); #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT m_cur_channel_layout = static_cast(av_get_default_channel_layout(params.m_audiochannels)); #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT // Initialise ID3v1.1 tag structure init_id3v1(&m_out.m_id3v1); } FFmpeg_Transcoder::~FFmpeg_Transcoder() { // Close files and resample context closeio(); Logging::trace(nullptr, "The FFmpeg transcoder object was destroyed."); } bool FFmpeg_Transcoder::is_video() const { bool is_video = false; if (m_in.m_video.m_codec_ctx != nullptr && m_in.m_video.m_stream != nullptr) { is_video = !is_album_art(m_in.m_video.m_codec_ctx->codec_id, &m_in.m_video.m_stream->r_frame_rate); } return is_video; } bool FFmpeg_Transcoder::is_open() const { return (m_in.m_format_ctx != nullptr); } int FFmpeg_Transcoder::open_input_file(LPVIRTUALFILE virtualfile, std::shared_ptr fio) { AVDictionary * opt = nullptr; int ret; if (virtualfile == nullptr) { Logging::error(filename(), "INTERNAL ERROR: FFmpeg_Transcoder::open_input_file()! virtualfile is NULL."); return AVERROR(EINVAL); } m_virtualfile = virtualfile; m_mtime = m_virtualfile->m_st.st_mtime; m_current_format = params.current_format(m_virtualfile); if (is_open()) { Logging::warning(filename(), "The file is already open."); return 0; } // This allows selecting if the demuxer should consider all streams to be // found after the first PMT and add further streams during decoding or if it rather // should scan all that are within the analyze-duration and other limits ret = dict_set_with_check(&opt, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE); if (ret < 0) { return ret; } // avioflags direct: Reduce buffering. //ret = dict_set_with_check(&opt, "avioflags", "direct", AV_DICT_DONT_OVERWRITE); //if (ret < 0) //{ // return ret; //} // analyzeduration: Defaults to 5,000,000 microseconds = 5 seconds. ret = dict_set_with_check(&opt, "analyzeduration", "15000000", 0); // <<== honored: 15 seconds if (ret < 0) { return ret; } // probesize: 5000000 by default. ret = dict_set_with_check(&opt, "probesize", "15000000", 0); // <<== honoured: ~15 MB if (ret < 0) { return ret; } // using own I/O if (fio == nullptr) { // Open new file io m_fileio = FileIO::alloc(m_virtualfile->m_type); } else { // Use already open file io m_fileio = fio; } if (m_fileio == nullptr) { int orgerrno = errno; Logging::error(filename(), "Error opening file: (%1) %2", errno, strerror(errno)); return AVERROR(orgerrno); } ret = m_fileio->openio(m_virtualfile); if (ret) { return AVERROR(ret); } m_in.m_format_ctx = avformat_alloc_context(); if (m_in.m_format_ctx == nullptr) { Logging::error(filename(), "Out of memory opening file: format context could not be allocated."); return AVERROR(ENOMEM); } unsigned char *iobuffer = static_cast(av_malloc(m_fileio->bufsize() + FF_INPUT_BUFFER_PADDING_SIZE)); if (iobuffer == nullptr) { Logging::error(filename(), "Out of memory opening file: I/O buffer could not be allocated."); avformat_free_context(m_in.m_format_ctx); m_in.m_format_ctx = nullptr; return AVERROR(ENOMEM); } AVIOContext * pb = avio_alloc_context( iobuffer, static_cast(m_fileio->bufsize()), 0, static_cast(m_fileio.get()), input_read, nullptr, // input_write seek); // input_seek m_in.m_format_ctx->pb = pb; #if IF_DECLARED_CONST const AVInputFormat * infmt = nullptr; #else // !IF_DECLARED_CONST AVInputFormat * infmt = nullptr; #endif // !IF_DECLARED_CONST #ifdef USE_LIBVCD if (m_virtualfile->m_type == VIRTUALTYPE::VCD) { Logging::debug(filename(), "To avoid misdetection, forcing MPEG format for VCD source."); infmt = av_find_input_format("mpeg"); } #endif // USE_LIBVCD #ifdef USE_LIBDVD if (m_virtualfile->m_type == VIRTUALTYPE::DVD) { Logging::debug(filename(), "To avoid misdetection, forcing MPEG format for DVD source."); infmt = av_find_input_format("mpeg"); } #endif // USE_LIBDVD #ifdef USE_LIBBLURAY if (m_virtualfile->m_type == VIRTUALTYPE::BLURAY) { Logging::debug(filename(), "To avoid misdetection, forcing MPEGTS format for Blu-ray source."); infmt = av_find_input_format("mpegts"); } #endif // USE_LIBBLURAY /** @bug Fix memory leak: Probably in FFmpeg API av_probe_input_buffer2(), the av_reallocp * is missing a matching free() call... @n * @n * 102,400 bytes in 1 blocks are definitely lost in loss record 248 of 249 @n * in FFmpeg_Transcoder::open_input_file(VIRTUALFILE*, FileIO*) in /home/norbert/dev/prj/ffmpegfs/src/ffmpeg_transcoder.cc:368 @n * 1: realloc in ./coregrind/m_replacemalloc/vg_replace_malloc.c:834 @n * 2: av_realloc_f in /usr/lib/x86_64-linux-gnu/libavutil.so.56.51.100 @n * 3: /usr/lib/x86_64-linux-gnu/libavformat.so.58.45.100 @n * 4: av_probe_input_buffer2 in /usr/lib/x86_64-linux-gnu/libavformat.so.58.45.100 @n * 5: avformat_open_input in /usr/lib/x86_64-linux-gnu/libavformat.so.58.45.100 @n * 6: FFmpeg_Transcoder::open_input_file(VIRTUALFILE*, FileIO*) in /home/norbert/dev/prj/ffmpegfs/src/ffmpeg_transcoder.cc:368 @n * 7: transcoder_predict_filesize(VIRTUALFILE*, Cache_Entry*) in /home/norbert/dev/prj/ffmpegfs/src/transcode.cc:320 @n * 8: transcoder_new(VIRTUALFILE*, bool) in /home/norbert/dev/prj/ffmpegfs/src/transcode.cc:425 @n * 9: ffmpegfs_getattr(char const*, stat*) in /home/norbert/dev/prj/ffmpegfs/src/fuseops.cc:1323 @n * 10: /usr/lib/x86_64-linux-gnu/libfuse.so.2.9.9 @n * 11: /usr/lib/x86_64-linux-gnu/libfuse.so.2.9.9 @n * 12: /usr/lib/x86_64-linux-gnu/libfuse.so.2.9.9 @n * 13: /usr/lib/x86_64-linux-gnu/libfuse.so.2.9.9 @n * 14: start_thread in ./nptl/pthread_create.c:477 @n * 15: clone in ./misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:95 @n */ // Open the input file to read from it. ret = avformat_open_input(&m_in.m_format_ctx, filename(), infmt, &opt); if (ret < 0) { Logging::error(filename(), "Could not open input file (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } m_in.m_filetype = get_filetype_from_list(m_in.m_format_ctx->iformat->name); #if HAVE_AV_FORMAT_INJECT_GLOBAL_SIDE_DATA av_format_inject_global_side_data(m_in.m_format_ctx); #endif // Get information on the input file (number of streams etc.). ret = avformat_find_stream_info(m_in.m_format_ctx, nullptr); if (ret < 0) { Logging::error(filename(), "Could not find stream info (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } #ifdef USE_LIBDVD if (m_virtualfile->m_type == VIRTUALTYPE::DVD) { // FFmpeg API calculates a wrong duration, so use value from IFO m_in.m_format_ctx->duration = m_fileio->duration(); } #endif // USE_LIBDVD #ifdef USE_LIBBLURAY if (m_virtualfile->m_type == VIRTUALTYPE::BLURAY) { // FFmpeg API calculates a wrong duration, so use value from Blu-ray directory m_in.m_format_ctx->duration = m_fileio->duration(); } #endif // USE_LIBBLURAY m_virtualfile->m_duration = m_in.m_format_ctx->duration; ret = open_bestmatch_video(); if (ret < 0) { // Already logged return ret; } #ifdef USE_LIBDVD if (m_virtualfile->m_type == VIRTUALTYPE::DVD && m_in.m_video.m_codec_ctx != nullptr && m_in.m_video.m_stream != nullptr) { // FFmpeg API sometimes cannot detect video size or frame rate, so use value from IFO if (!m_in.m_video.m_codec_ctx->width || !m_in.m_video.m_stream->codecpar->height) { m_in.m_video.m_codec_ctx->width = m_in.m_video.m_stream->codecpar->width = m_virtualfile->m_width; m_in.m_video.m_codec_ctx->height = m_in.m_video.m_stream->codecpar->height = m_virtualfile->m_height; } if (!m_in.m_video.m_stream->avg_frame_rate.den) { m_in.m_video.m_stream->avg_frame_rate = m_virtualfile->m_framerate; } } #endif // USE_LIBDVD #ifdef USE_LIBBLURAY if (m_virtualfile->m_type == VIRTUALTYPE::BLURAY && m_in.m_video.m_codec_ctx != nullptr && m_in.m_video.m_stream != nullptr) { // FFmpeg API sometimes cannot detect video size or frame rate, so use value from Blu-ray directory if (!m_in.m_video.m_codec_ctx->width || !m_in.m_video.m_stream->codecpar->height) { m_in.m_video.m_codec_ctx->width = m_in.m_video.m_stream->codecpar->width = m_virtualfile->m_width; m_in.m_video.m_codec_ctx->height = m_in.m_video.m_stream->codecpar->height = m_virtualfile->m_height; } if (!m_in.m_video.m_stream->avg_frame_rate.den) { m_in.m_video.m_stream->avg_frame_rate = m_virtualfile->m_framerate; } } #endif // USE_LIBBLURAY ret = open_bestmatch_audio(); if (ret < 0) { // Already logged return ret; } if (!stream_exists(m_in.m_audio.m_stream_idx) && !stream_exists(m_in.m_video.m_stream_idx)) { Logging::error(filename(), "The file contains neither a video nor an audio stream."); return AVERROR(EINVAL); } if (!params.m_no_subtitles) { ret = open_subtitles(); if (ret < 0) { // Already logged return ret; } } // Predict size of transcoded file as exact as possible m_virtualfile->m_predicted_size = calculate_predicted_filesize(); // Calculate number or video frames in file based on duration and frame rate if (m_in.m_video.m_stream != nullptr && m_in.m_video.m_stream->avg_frame_rate.den) { // Number of frames: should be quite accurate m_virtualfile->m_video_frame_count = static_cast(ffmpeg_rescale_q(m_in.m_video.m_stream->duration, m_in.m_video.m_stream->time_base, av_inv_q(m_in.m_video.m_stream->avg_frame_rate))); } ret = open_albumarts(); if (ret < 0) { // Already logged return ret; } if (m_virtualfile->m_flags & VIRTUALFLAG_CUESHEET) { // Position to start of cue sheet track ret = av_seek_frame(m_in.m_format_ctx, -1, m_virtualfile->m_cuesheet_track.m_start, 0); if (ret < 0) { Logging::error(filename(), "The track start was nout found (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } } return 0; } int FFmpeg_Transcoder::open_bestmatch_video() { // Issue #80: Open input video codec, but only if target supports video. // Saves resources: no need to decode video frames if not used. if (m_current_format->video_codec() != AV_CODEC_ID_NONE) { int ret; // Open best match video codec AVCodecContext * codec_ctx = nullptr; ret = open_bestmatch_decoder(m_in.m_format_ctx, &codec_ctx, &m_in.m_video.m_stream_idx, AVMEDIA_TYPE_VIDEO); if (ret < 0 && ret != AVERROR_STREAM_NOT_FOUND) // AVERROR_STREAM_NOT_FOUND is not an error { Logging::error(filename(), "The video codec could not be opened (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } m_in.m_video.set_codec_ctx(codec_ctx); if (stream_exists(m_in.m_video.m_stream_idx)) { // We have a video stream // Check to see if encoder hardware acceleration is both requested and supported by codec. std::string hw_encoder_codec_name; if (!get_hw_encoder_name(m_current_format->video_codec(), &hw_encoder_codec_name)) { // API supports hardware frame buffers m_hwaccel_enable_enc_buffering = (params.m_hwaccel_enc_device_type != AV_HWDEVICE_TYPE_NONE); } if (m_hwaccel_enable_enc_buffering) { // Hardware buffers available, enabling encoder hardware accceleration. Logging::trace(virtname(), "Hardware encoder frame buffering %1 is enabled.", get_hwaccel_API_text(params.m_hwaccel_enc_API).c_str()); ret = hwdevice_ctx_create(&m_hwaccel_enc_device_ctx, params.m_hwaccel_enc_device_type, params.m_hwaccel_enc_device); if (ret < 0) { Logging::error(virtname(), "Failed to create a %1 device for encoding (error %2).", get_hwaccel_API_text(params.m_hwaccel_enc_API).c_str(), ffmpeg_geterror(ret).c_str()); return ret; } Logging::info(virtname(), "Hardware encoder acceleration and frame buffering are active using codec '%1'.", hw_encoder_codec_name.c_str()); } else if (params.m_hwaccel_enc_device_type != AV_HWDEVICE_TYPE_NONE) { // No hardware acceleration, fallback to software, Logging::debug(virtname(), "Hardware encoder frame buffering %1 is not supported by codec '%2'. Falling back to software.", get_hwaccel_API_text(params.m_hwaccel_enc_API).c_str(), get_codec_name(m_in.m_video.m_codec_ctx->codec_id, true)); } else if (!hw_encoder_codec_name.empty()) { // No frame buffering (e.g. OpenMAX or MMAL), but hardware acceleration possible. Logging::info(virtname(), "Hardware encoder acceleration is active using codec '%1'.", hw_encoder_codec_name.c_str()); } m_in.m_video.m_stream = m_in.m_format_ctx->streams[m_in.m_video.m_stream_idx]; #ifdef USE_LIBDVD if (m_virtualfile->m_type == VIRTUALTYPE::DVD) { // FFmpeg API calculates a wrong duration, so use value from IFO m_in.m_video.m_stream->duration = ffmpeg_rescale_q(m_in.m_format_ctx->duration, av_get_time_base_q(), m_in.m_video.m_stream->time_base); } #endif // USE_LIBDVD #ifdef USE_LIBBLURAY if (m_virtualfile->m_type == VIRTUALTYPE::BLURAY) { // FFmpeg API calculates a wrong duration, so use value from Blu-ray m_in.m_video.m_stream->duration = ffmpeg_rescale_q(m_in.m_format_ctx->duration, av_get_time_base_q(), m_in.m_video.m_stream->time_base); } #endif // USE_LIBBLURAY video_info(false, m_in.m_format_ctx, m_in.m_video.m_stream); m_is_video = is_video(); #if !LAVC_DEP_FLAG_TRUNCATED #ifdef AV_CODEC_CAP_TRUNCATED if (m_in.m_video.m_codec_ctx->codec->capabilities & AV_CODEC_CAP_TRUNCATED) { m_in.m_video.m_codec_ctx->flags|= AV_CODEC_FLAG_TRUNCATED; // we do not send complete frames } #else #warning "Your FFMPEG distribution is missing AV_CODEC_CAP_TRUNCATED flag. Probably requires fixing!" #endif #endif // !LAVC_DEP_FLAG_TRUNCATED } } return 0; } int FFmpeg_Transcoder::open_bestmatch_audio() { int ret; // Open best match audio codec AVCodecContext * codec_ctx = nullptr; ret = open_bestmatch_decoder(m_in.m_format_ctx, &codec_ctx, &m_in.m_audio.m_stream_idx, AVMEDIA_TYPE_AUDIO); if (ret < 0 && ret != AVERROR_STREAM_NOT_FOUND) // AVERROR_STREAM_NOT_FOUND is not an error { Logging::error(filename(), "The audio codec could not be opened (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } m_in.m_audio.set_codec_ctx(codec_ctx); if (stream_exists(m_in.m_audio.m_stream_idx)) { // We have an audio stream m_in.m_audio.m_stream = m_in.m_format_ctx->streams[m_in.m_audio.m_stream_idx]; #ifdef USE_LIBDVD if (m_virtualfile->m_type == VIRTUALTYPE::DVD) { // FFmpeg API calculates a wrong duration, so use value from IFO m_in.m_audio.m_stream->duration = ffmpeg_rescale_q(m_in.m_format_ctx->duration, av_get_time_base_q(), m_in.m_audio.m_stream->time_base); } #endif // USE_LIBDVD #ifdef USE_LIBBLURAY if (m_virtualfile->m_type == VIRTUALTYPE::BLURAY) { // FFmpeg API calculates a wrong duration, so use value from Blu-ray directory m_in.m_audio.m_stream->duration = ffmpeg_rescale_q(m_in.m_format_ctx->duration, av_get_time_base_q(), m_in.m_audio.m_stream->time_base); } #endif // USE_LIBBLURAY audio_info(false, m_in.m_format_ctx, m_in.m_audio.m_stream); } return 0; } int FFmpeg_Transcoder::open_subtitles() { // If target supports subtitles, check to transcode subtitles for (int stream_idx = 0; stream_idx < static_cast(m_in.m_format_ctx->nb_streams); stream_idx++) { AVStream * stream = m_in.m_format_ctx->streams[stream_idx]; if (avcodec_get_type(stream->codecpar->codec_id) != AVMEDIA_TYPE_SUBTITLE) { continue; } if (m_current_format->subtitle_codec(stream->codecpar->codec_id) == AV_CODEC_ID_NONE) { // No match, no support for this type of subtitle continue; } AVCodecContext * codec_ctx = nullptr; int ret; ret = open_decoder(m_in.m_format_ctx, &codec_ctx, stream_idx, nullptr, AVMEDIA_TYPE_SUBTITLE); if (ret < 0) { Logging::error(filename(), "The subtitle codec could not be opened (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } codec_ctx->pkt_timebase = codec_ctx->time_base = stream->time_base; StreamRef input_streamref; // We have a subtitle stream input_streamref.set_codec_ctx(codec_ctx); input_streamref.m_stream = stream; input_streamref.m_stream_idx = stream_idx; m_in.m_subtitle.insert(std::make_pair(input_streamref.m_stream_idx, input_streamref)); subtitle_info(false, m_in.m_format_ctx, input_streamref.m_stream); } return 0; } int FFmpeg_Transcoder::open_albumarts() { // Open album art streams if present and supported by both source and target if (!params.m_noalbumarts && m_in.m_audio.m_stream != nullptr) { for (int stream_idx = 0; stream_idx < static_cast(m_in.m_format_ctx->nb_streams); stream_idx++) { AVStream *input_stream = m_in.m_format_ctx->streams[stream_idx]; if (is_album_art(input_stream->codecpar->codec_id, &input_stream->r_frame_rate)) { StreamRef streamref; AVCodecContext * input_codec_ctx; int ret; Logging::trace(filename(), "Found album art."); ret = open_decoder(m_in.m_format_ctx, &input_codec_ctx, stream_idx, nullptr, AVMEDIA_TYPE_VIDEO); if (ret < 0) { Logging::error(filename(), "The album art codec could not be opened (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } streamref.set_codec_ctx(input_codec_ctx); streamref.m_stream = input_stream; streamref.m_stream_idx = input_stream->index; m_in.m_album_art.push_back(streamref); } } } return 0; } bool FFmpeg_Transcoder::can_copy_stream(const AVStream *stream) const { if (params.m_autocopy == AUTOCOPY::OFF) { // Auto copy disabled return false; } if (stream == nullptr) { // Should normally not happen: Input stream stream unknown, no way to check - no auto copy return false; } AVMediaType codec_type = stream->codecpar->codec_type; AVCodecID codec_in = stream->codecpar->codec_id; std::string codec_type_str; AVCodecID codec_out; int64_t bitrate_out; if (codec_type == AVMEDIA_TYPE_VIDEO) { codec_type_str = "video"; codec_out = m_current_format->video_codec(); bitrate_out = params.m_videobitrate; } else if (codec_type == AVMEDIA_TYPE_AUDIO) { codec_type_str = "audio"; codec_out = m_current_format->audio_codec(); bitrate_out = params.m_audiobitrate; } else { // Codec is not video or audio return false; } if ((params.m_autocopy == AUTOCOPY::MATCH || params.m_autocopy == AUTOCOPY::MATCHLIMIT)) { // Any codec supported by output format OK const AVOutputFormat* oformat = av_guess_format(nullptr, virtname(), nullptr); if (oformat->codec_tag == nullptr || av_codec_get_tag(oformat->codec_tag, stream->codecpar->codec_id) <= 0) { // Codec not supported - no auto copy return false; } } else if ((params.m_autocopy == AUTOCOPY::STRICT || params.m_autocopy == AUTOCOPY::STRICTLIMIT)) { // Output codec must strictly match Logging::debug(virtname(), "Check autocopy strict: %1: %2 -> %3", codec_type_str.c_str(), avcodec_get_name(codec_in), avcodec_get_name(codec_out)); if (codec_in != codec_out) { // Different codecs - no auto copy return false; } } if (params.m_autocopy == AUTOCOPY::MATCHLIMIT || params.m_autocopy == AUTOCOPY::STRICTLIMIT) { BITRATE orig_bit_rate = (stream->codecpar->bit_rate != 0) ? stream->codecpar->bit_rate : m_in.m_format_ctx->bit_rate; if (get_output_bit_rate(orig_bit_rate, bitrate_out)) { // Bit rate changed, no auto copy Logging::info(virtname(), "Because the bit rate has changed, no auto copy is possible."); return false; } } return true; } int FFmpeg_Transcoder::open_output_file(Buffer *buffer) { if (buffer == nullptr) { Logging::error(virtname(), "INTERNAL ERROR: FFmpeg_Transcoder::open_output_file()! buffer == nullptr in open_output_file()"); return AVERROR(EINVAL); } m_out.m_filetype = m_current_format->filetype(); Logging::debug(virtname(), "Opening the output file."); if (!stream_exists(m_in.m_audio.m_stream_idx) && m_current_format->video_codec() == AV_CODEC_ID_NONE) { Logging::error(virtname(), "Unable to transcode. The source contains no audio stream, but the target just supports audio."); m_virtualfile->m_flags |= VIRTUALFLAG_HIDDEN; // Hide file from now on return AVERROR(ENOENT); // Report file not found } if (!is_frameset()) { // Not a frame set, open regular buffer return open_output(buffer); } else { Logging::debug(virtname(), "Opening frame set type '%1'.", m_current_format->desttype().c_str()); // Open frame set buffer return open_output_frame_set(buffer); } } int FFmpeg_Transcoder::open_bestmatch_decoder(AVFormatContext *format_ctx, AVCodecContext **codec_ctx, int *stream_idx, AVMediaType type) { #if IF_DECLARED_CONST const AVCodec *input_codec = nullptr; #else // !IF_DECLARED_CONST AVCodec *input_codec = nullptr; #endif // !IF_DECLARED_CONST int ret; *codec_ctx = nullptr; *stream_idx = INVALID_STREAM; ret = av_find_best_stream(format_ctx, type, INVALID_STREAM, INVALID_STREAM, &input_codec, 0); if (ret < 0) { if (ret != AVERROR_STREAM_NOT_FOUND) // Not an error { Logging::error(filename(), "Could not find a %1 stream in the input file (error '%2').", get_media_type_string(type), ffmpeg_geterror(ret).c_str()); } return ret; } *stream_idx = ret; return open_decoder(format_ctx, codec_ctx, *stream_idx, input_codec, type); } #if IF_DECLARED_CONST AVPixelFormat FFmpeg_Transcoder::get_hw_pix_fmt(const AVCodec *codec, AVHWDeviceType dev_type, bool use_device_ctx) const #else // !IF_DECLARED_CONST AVPixelFormat FFmpeg_Transcoder::get_hw_pix_fmt(AVCodec *codec, AVHWDeviceType dev_type, bool use_device_ctx) const #endif // !IF_DECLARED_CONST { AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE; if (codec != nullptr && dev_type != AV_HWDEVICE_TYPE_NONE) { int method = use_device_ctx ? AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX : AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX; for (int i = 0;; i++) { const AVCodecHWConfig *config = avcodec_get_hw_config(codec, i); if (!config) { Logging::error(av_codec_is_decoder(codec) ? filename() : virtname(), "%1 '%2' does not support device type %3.\n", av_codec_is_encoder(codec) ? "Encoder" : "Decoder", codec->name, hwdevice_get_type_name(dev_type)); break; } if ((config->methods & method) && (config->device_type == dev_type)) { hw_pix_fmt = config->pix_fmt; Logging::debug(av_codec_is_decoder(codec) ? filename() : virtname(), "%1 '%2' requests %3 for device type %4.\n", av_codec_is_encoder(codec) ? "Encoder" : "Decoder", codec->name, av_get_pix_fmt_name(hw_pix_fmt), hwdevice_get_type_name(dev_type)); break; } } } return hw_pix_fmt; } #if IF_DECLARED_CONST int FFmpeg_Transcoder::open_decoder(AVFormatContext *format_ctx, AVCodecContext **codec_ctx, int stream_idx, const AVCodec *input_codec, AVMediaType mediatype) #else // !IF_DECLARED_CONST int FFmpeg_Transcoder::open_decoder(AVFormatContext *format_ctx, AVCodecContext **codec_ctx, int stream_idx, AVCodec *input_codec, AVMediaType mediatype) #endif // !IF_DECLARED_CONST { while (true) { AVCodecContext *input_codec_ctx = nullptr; AVStream * input_stream = nullptr; AVDictionary * opt = nullptr; AVCodecID codec_id = AV_CODEC_ID_NONE; int ret; input_stream = format_ctx->streams[stream_idx]; // Init the decoders, with or without reference counting // av_dict_set_with_check(&opt, "refcounted_frames", refcount ? "1" : "0", 0); // allocate a new decoding context input_codec_ctx = avcodec_alloc_context3(nullptr); if (input_codec_ctx == nullptr) { Logging::error(filename(), "Decoding context could not be allocated."); return AVERROR(ENOMEM); } // initialise the stream parameters with demuxer information ret = avcodec_parameters_to_context(input_codec_ctx, input_stream->codecpar); if (ret < 0) { return ret; } codec_id = input_stream->codecpar->codec_id; if (params.m_hwaccel_dec_API != HWACCELAPI::NONE) { if (mediatype == AVMEDIA_TYPE_VIDEO) { if (check_hwaccel_dec_blocked(input_stream->codecpar->codec_id, input_stream->codecpar->profile)) { const char *profile = ::avcodec_profile_name(codec_id, input_stream->codecpar->profile); Logging::info(filename(), "Codec '%1' profile '%2' is blocked from hardware decoding. Reverting to software decoder.", ::get_codec_name(codec_id), profile != nullptr ? profile : "unknown"); m_hwaccel_dec_mode = HWACCELMODE::FALLBACK; } } if (mediatype == AVMEDIA_TYPE_VIDEO && m_hwaccel_dec_mode != HWACCELMODE::FALLBACK) { // Decide whether to use a hardware decoder // Check to see if decoder hardware acceleration is both requested and supported by codec. std::string hw_decoder_codec_name; if (!get_hw_decoder_name(input_codec_ctx->codec_id, &hw_decoder_codec_name)) { m_dec_hw_pix_fmt = get_hw_pix_fmt(input_codec, params.m_hwaccel_dec_device_type, true); m_hwaccel_enable_dec_buffering = (params.m_hwaccel_dec_device_type != AV_HWDEVICE_TYPE_NONE && m_dec_hw_pix_fmt != AV_PIX_FMT_NONE); //{ // std::string fourcc2str; // fourcc_make_string(&fourcc2str, input_codec_ctx->codec_tag); // fprintf(stderr, "fourcc2str %s\n", fourcc2str.c_str()); //} } if (m_hwaccel_enable_dec_buffering) { // Hardware buffers available, enabling decoder hardware acceleration. Logging::trace(filename(), "Hardware decoder frame buffering %1 is enabled.", get_hwaccel_API_text(params.m_hwaccel_dec_API).c_str()); ret = hwdevice_ctx_create(&m_hwaccel_dec_device_ctx, params.m_hwaccel_dec_device_type, params.m_hwaccel_dec_device); if (ret < 0) { Logging::error(filename(), "Failed to create a %1 device for decoding (error %2).", get_hwaccel_API_text(params.m_hwaccel_dec_API).c_str(), ffmpeg_geterror(ret).c_str()); return ret; } Logging::info(filename(), "Hardware decoder acceleration and frame buffering are active using codec '%1'.", (input_codec != nullptr) ? input_codec->name : "unknown"); m_hwaccel_dec_mode = HWACCELMODE::ENABLED; // Hardware acceleration active } else if (params.m_hwaccel_dec_device_type != AV_HWDEVICE_TYPE_NONE) { // No hardware acceleration, fallback to software, Logging::debug(filename(), "Hardware decoder frame buffering %1 not supported by codec '%2'. Falling back to software.", get_hwaccel_API_text(params.m_hwaccel_dec_API).c_str(), get_codec_name(input_codec_ctx->codec_id, true)); } else if (!hw_decoder_codec_name.empty()) { // No frame buffering (e.g. OpenMAX or MMAL), but hardware acceleration possible. // Open hw_decoder_codec_name codec here input_codec = avcodec_find_decoder_by_name(hw_decoder_codec_name.c_str()); if (input_codec == nullptr) { Logging::error(filename(), "Decoder '%1' could not be found.", hw_decoder_codec_name.c_str()); return AVERROR(EINVAL); } Logging::info(filename(), "Hardware decoder acceleration is active using codec '%1'.", input_codec->name); m_hwaccel_dec_mode = HWACCELMODE::ENABLED; // Hardware acceleration active } if (m_hwaccel_enable_dec_buffering) { ret = hwdevice_ctx_add_ref(input_codec_ctx); if (ret < 0) { return ret; } } } } if (input_codec == nullptr) { // Find a decoder for the stream. input_codec = avcodec_find_decoder(codec_id); if (input_codec == nullptr) { Logging::error(filename(), "Failed to find %1 input codec '%2'.", get_media_type_string(mediatype), avcodec_get_name(codec_id)); return AVERROR(EINVAL); } } input_codec_ctx->codec_id = input_codec->id; //input_codec_ctx->time_base = input_stream->time_base; ret = avcodec_open2(input_codec_ctx, input_codec, &opt); av_dict_free(&opt); if (ret < 0) { if (m_hwaccel_dec_mode == HWACCELMODE::ENABLED) { Logging::info(filename(), "Unable to use %1 input codec '%2' with hardware acceleration. Falling back to software.", get_media_type_string(mediatype), avcodec_get_name(codec_id)); m_hwaccel_dec_mode = HWACCELMODE::FALLBACK; m_hwaccel_enable_dec_buffering = false; m_dec_hw_pix_fmt = AV_PIX_FMT_NONE; // Free hardware device contexts if open hwdevice_ctx_free(&m_hwaccel_dec_device_ctx); m_in.m_video.reset(); // Try again with a software decoder continue; } Logging::error(filename(), "Failed to open %1 input codec for stream #%1 (error '%2').", get_media_type_string(mediatype), input_stream->index, ffmpeg_geterror(ret).c_str()); return ret; } Logging::debug(filename(), "Opened input codec for stream #%1: %2", input_stream->index, get_codec_name(codec_id, true)); *codec_ctx = input_codec_ctx; return 0; }; } int FFmpeg_Transcoder::open_output_frame_set(Buffer *buffer) { const AVCodec * output_codec = nullptr; AVCodecContext *output_codec_ctx = nullptr; AVDictionary * opt = nullptr; int ret = 0; m_buffer = buffer; { std::lock_guard lock_seek_to_fifo_mutex(m_seek_to_fifo_mutex); while (m_seek_to_fifo.size()) { m_seek_to_fifo.pop(); } } m_have_seeked = false; output_codec = avcodec_find_encoder(m_current_format->video_codec()); if (output_codec == nullptr) { Logging::error(virtname(), "Codec not found."); return AVERROR(EINVAL); } output_codec_ctx = avcodec_alloc_context3(output_codec); if (output_codec_ctx == nullptr) { Logging::error(virtname(), "The video codec context could not be allocated."); return AVERROR(ENOMEM); } output_codec_ctx->bit_rate = 400000; /** @todo Make frame image compression rate command line settable */ output_codec_ctx->width = m_in.m_video.m_codec_ctx->width; output_codec_ctx->height = m_in.m_video.m_codec_ctx->height; output_codec_ctx->time_base = {1, 25}; const AVPixFmtDescriptor *dst_desc = av_pix_fmt_desc_get(m_in.m_video.m_codec_ctx->pix_fmt); int loss = 0; #if LAVC_USE_SUPPORTED_CFG { const enum AVPixelFormat *pix_list = nullptr; int npix = 0; int ret_cfg = avcodec_get_supported_config(output_codec_ctx, output_codec, AV_CODEC_CONFIG_PIX_FORMAT, 0, (const void**)&pix_list, &npix); if (ret_cfg >= 0 && pix_list && npix > 0) { output_codec_ctx->pix_fmt = avcodec_find_best_pix_fmt_of_list(pix_list, m_in.m_video.m_codec_ctx->pix_fmt, (dst_desc->flags & AV_PIX_FMT_FLAG_ALPHA) ? 1 : 0, &loss); } else { output_codec_ctx->pix_fmt = m_in.m_video.m_codec_ctx->pix_fmt; } } #else output_codec_ctx->pix_fmt = avcodec_find_best_pix_fmt_of_list(output_codec->pix_fmts, m_in.m_video.m_codec_ctx->pix_fmt, (dst_desc->flags & AV_PIX_FMT_FLAG_ALPHA) ? 1 : 0, &loss); #endif if (output_codec_ctx->pix_fmt == AV_PIX_FMT_NONE) { // No best match found, use default switch (m_current_format->video_codec()) { case AV_CODEC_ID_MJPEG: { output_codec_ctx->pix_fmt = AV_PIX_FMT_YUVJ444P; break; } case AV_CODEC_ID_PNG: { output_codec_ctx->pix_fmt = AV_PIX_FMT_RGB24; break; } case AV_CODEC_ID_BMP: { output_codec_ctx->pix_fmt = AV_PIX_FMT_BGR24; break; } default: { break; } } Logging::debug(virtname(), "There was no best match output pixel format found, so we used the default: %1", get_pix_fmt_name(output_codec_ctx->pix_fmt).c_str()); } else { Logging::debug(virtname(), "Output pixel format: %1", get_pix_fmt_name(output_codec_ctx->pix_fmt).c_str()); } switch (m_current_format->video_codec()) { case AV_CODEC_ID_MJPEG: { // set -strict -1 for JPG dict_set_with_check(&opt, "strict", "-1", 0); // Allow the use of unoffical extensions output_codec_ctx->strict_std_compliance = FF_COMPLIANCE_UNOFFICIAL; break; } case AV_CODEC_ID_PNG: { output_codec_ctx->pix_fmt = AV_PIX_FMT_RGB24; break; } case AV_CODEC_ID_BMP: { output_codec_ctx->pix_fmt = AV_PIX_FMT_BGR24; break; } default: { break; } } //codec_ctx->sample_aspect_ratio = frame->sample_aspect_ratio; //codec_ctx->sample_aspect_ratio = m_in.m_video.m_codec_ctx->sample_aspect_ratio; ret = avcodec_open2(output_codec_ctx, output_codec, &opt); if (ret < 0) { Logging::error(virtname(), "The image codec could not be opened."); return ret; } // Initialise pixel format conversion and rescaling if necessary get_pix_formats(&m_in.m_pix_fmt, &m_out.m_pix_fmt, output_codec_ctx); ret = init_rescaler(m_in.m_pix_fmt, m_in.m_video.m_stream->codecpar->width, m_in.m_video.m_stream->codecpar->height, m_out.m_pix_fmt, output_codec_ctx->width, output_codec_ctx->height); if (ret < 0) { return ret; } if (params.m_deinterlace) { ret = init_deinterlace_filters(output_codec_ctx, m_in.m_pix_fmt, m_in.m_video.m_stream->avg_frame_rate, m_in.m_video.m_stream->time_base); if (ret < 0) { return ret; } } m_out.m_video.set_codec_ctx(output_codec_ctx); m_out.m_video.m_stream_idx = INVALID_STREAM; m_out.m_video.m_stream = nullptr; // No audio m_out.m_audio.set_codec_ctx(nullptr); m_out.m_audio.m_stream_idx = INVALID_STREAM; m_out.m_audio.m_stream = nullptr; // Open for read/write // Pre-allocate the predicted file size to reduce memory reallocations size_t buffsize = predicted_filesize() * video_frame_count(); if (!buffer->open_file(0, CACHE_FLAG_RW, buffsize)) { return AVERROR(EPERM); } return 0; } int FFmpeg_Transcoder::open_output(Buffer *buffer) { int ret = 0; m_buffer = buffer; m_insert_keyframe = false; if (!m_out.m_video_pts && is_hls()) { m_current_segment = 1; Logging::info(virtname(), "Starting HLS segment no. %1 of %2.", m_current_segment, m_virtualfile->get_segment_count()); } while (true) { // Open the output file for writing. If buffer == nullptr continue using existing buffer. ret = open_output_filestreams(buffer); if (ret) { if (m_hwaccel_enc_mode == HWACCELMODE::ENABLED) { Logging::info(virtname(), "Unable to use output codec '%1' with hardware acceleration. Falling back to software.", avcodec_get_name(m_current_format->video_codec())); m_hwaccel_enc_mode = HWACCELMODE::FALLBACK; m_hwaccel_enable_enc_buffering = false; m_enc_hw_pix_fmt = AV_PIX_FMT_NONE; // Free hardware device contexts if open hwdevice_ctx_free(&m_hwaccel_enc_device_ctx); close_output_file(); // Try again with a software decoder continue; } return ret; } break; } if (stream_exists(m_out.m_audio.m_stream_idx)) { audio_info(true, m_out.m_format_ctx, m_out.m_audio.m_stream); if (m_out.m_audio.m_codec_ctx != nullptr) { // If not just copying the stream, initialise the audio FIFO buffer to store audio samples to be encoded. ret = init_audio_fifo(); if (ret) { return ret; } } } if (stream_exists(m_out.m_video.m_stream_idx)) { video_info(true, m_out.m_format_ctx, m_out.m_video.m_stream); } for (const auto & [key, value] : m_out.m_subtitle) { subtitle_info(true, m_out.m_format_ctx, value.m_stream); } // Open for read/write // Pre-allocate the predicted file size to reduce memory reallocations size_t buffsize = predicted_filesize(); if (!buffer->open_file(0, CACHE_FLAG_RW, buffsize)) { return AVERROR(EPERM); } ret = process_output(); if (ret) { return ret; } // process_output() calls avformat_write_header which feels free to change the stream time bases sometimes. // This means we have to do the following calculations here to use the correct values, otherwise this can cause // a lot of havoc. if (m_in.m_audio.m_stream != nullptr && m_out.m_audio.m_stream != nullptr && m_in.m_audio.m_stream->start_time != AV_NOPTS_VALUE) { m_in.m_audio.m_start_time = m_in.m_audio.m_stream->start_time; m_out.m_audio.m_start_time = ffmpeg_rescale_q_rnd(m_in.m_audio.m_stream->start_time, m_in.m_audio.m_stream->time_base, m_out.m_audio.m_stream->time_base); m_out.m_audio.m_stream->start_time = m_out.m_audio.m_start_time; } else { m_in.m_audio.m_start_time = 0; m_out.m_audio.m_start_time = 0; if (m_out.m_audio.m_stream) { m_out.m_audio.m_stream->start_time = AV_NOPTS_VALUE; } } if (m_in.m_video.m_stream != nullptr && m_out.m_video.m_stream != nullptr && m_in.m_video.m_stream->start_time != AV_NOPTS_VALUE) { m_in.m_video.m_start_time = m_in.m_video.m_stream->start_time; m_out.m_video.m_start_time = ffmpeg_rescale_q_rnd(m_in.m_video.m_stream->start_time, m_in.m_video.m_stream->time_base, m_out.m_video.m_stream->time_base); m_out.m_video.m_stream->start_time = m_out.m_video.m_start_time; } else { m_in.m_video.m_start_time = 0; m_out.m_video.m_start_time = 0; if (m_out.m_video.m_stream) { m_out.m_video.m_stream->start_time = AV_NOPTS_VALUE; } } for (auto & [key, value] : m_out.m_subtitle) { StreamRef * out_streamref = get_out_subtitle_stream(map_in_to_out_stream(key)); if (out_streamref != nullptr) { value.m_start_time = value.m_stream->start_time; out_streamref->m_start_time = ffmpeg_rescale_q_rnd(value.m_stream->start_time, value.m_stream->time_base, out_streamref->m_stream->time_base); out_streamref->m_stream->start_time = out_streamref->m_start_time; } } m_out.m_audio_pts = m_out.m_audio.m_start_time; m_out.m_video_pts = m_out.m_video.m_start_time; m_out.m_last_mux_dts = AV_NOPTS_VALUE; return 0; } int FFmpeg_Transcoder::process_output() { // Process metadata. The decoder will call the encoder to set appropriate // tag values for the output file. int ret = process_metadata(); if (ret) { return ret; } // Write the header of the output file container. ret = write_output_file_header(); if (ret) { return ret; } // Process album arts: copy all from source file to target. return process_albumarts(); } bool FFmpeg_Transcoder::get_output_sample_rate(int input_sample_rate, int max_sample_rate, int *output_sample_rate /*= nullptr*/) { if (input_sample_rate > max_sample_rate) { if (output_sample_rate != nullptr) { *output_sample_rate = max_sample_rate; } return true; } else { if (output_sample_rate != nullptr) { *output_sample_rate = input_sample_rate; } return false; } } bool FFmpeg_Transcoder::get_output_bit_rate(BITRATE input_bit_rate, BITRATE max_bit_rate, BITRATE * output_bit_rate /*= nullptr*/) { if (!input_bit_rate || input_bit_rate > max_bit_rate) { if (output_bit_rate != nullptr) { *output_bit_rate = max_bit_rate; } return true; } else { if (output_bit_rate != nullptr) { *output_bit_rate = input_bit_rate; } return false; } } bool FFmpeg_Transcoder::get_aspect_ratio(int width, int height, const AVRational & sar, AVRational *ar) const { // Try to determine display aspect ratio AVRational dar; ::av_reduce(&dar.num, &dar.den, static_cast(width) * sar.num, static_cast(height) * sar.den, 1024 * 1024); ar->num = ar->den = 0; if (dar.num && dar.den) { *ar = dar; } // If that fails, try sample aspect ratio instead if (!ar->den && sar.num != 0 && sar.den != 0) { *ar = sar; } // If even that fails, try to use video size if (!ar->den && height) { ar->num = width; ar->den = height; } if (!ar->den) { // Return false if all above failed return false; } ::av_reduce(&ar->num, &ar->den, ar->num, ar->den, 1024 * 1024); return true; } bool FFmpeg_Transcoder::get_video_size(int *output_width, int *output_height) const { if (!params.m_videowidth && !params.m_videoheight) { // No options, leave as is return false; } int input_width = m_in.m_video.m_stream->codecpar->width; int input_height = m_in.m_video.m_stream->codecpar->height; AVRational sar = m_in.m_video.m_stream->codecpar->sample_aspect_ratio; if (params.m_videowidth && params.m_videoheight) { // Both width/source set. May look strange, but this is an order... *output_width = params.m_videowidth; *output_height = params.m_videoheight; } else if (params.m_videowidth) { // Only video width AVRational ar; *output_width = params.m_videowidth; if (!get_aspect_ratio(input_width, input_height, sar, &ar)) { *output_height = input_height; } else { *output_height = static_cast(params.m_videowidth / av_q2d(ar)); *output_height &= ~(static_cast(0x1)); // height must be multiple of 2 } } else //if (params.m_videoheight) { // Only video height AVRational ar; if (!get_aspect_ratio(input_width, input_height, sar, &ar)) { *output_width = input_width; } else { *output_width = static_cast(params.m_videoheight / av_q2d(ar)); *output_width &= ~(static_cast(0x1)); // width must be multiple of 2 } *output_height = params.m_videoheight; } return (input_width > *output_width || input_height > *output_height); } int FFmpeg_Transcoder::update_codec(void *opt, const PROFILE_OPTION_VEC& profile_option_vec) const { int ret = 0; for (const PROFILE_OPTION & profile_option : profile_option_vec) { if ((m_hwaccel_enable_enc_buffering && profile_option.m_options & OPT_SW_ONLY) || (!m_hwaccel_enable_enc_buffering && profile_option.m_options & OPT_HW_ONLY)) { continue; } Logging::trace(virtname(), "Profile codec option -%1%2%3.", profile_option.m_key, *profile_option.m_value ? " " : "", profile_option.m_value); ret = opt_set_with_check(opt, profile_option.m_key, profile_option.m_value, profile_option.m_flags, virtname()); if (ret < 0) { break; } } return ret; } int FFmpeg_Transcoder::prepare_codec(void *opt, FILETYPE filetype) const { int ret = 0; for (const PROFILE_LIST & profile : m_profile) { if (profile.m_filetype == filetype) { ret = AVERROR_OPTION_NOT_FOUND; // Once we found the file type, we also need to find the profile. Otherwise we have an invalid command line option. if (profile.m_profile == params.m_profile) { ret = update_codec(opt, profile.m_option_codec); break; } } } return ret; } int FFmpeg_Transcoder::init_rescaler(AVPixelFormat in_pix_fmt, int in_width, int in_height, AVPixelFormat out_pix_fmt, int out_width, int out_height) { if (in_pix_fmt != out_pix_fmt || in_width != out_width || in_height != out_height) { // Rescale image if required if (in_pix_fmt != out_pix_fmt) { Logging::trace(virtname(), "Initialising pixel format conversion from %1 to %2.", get_pix_fmt_name(in_pix_fmt).c_str(), get_pix_fmt_name(out_pix_fmt).c_str()); } if (in_width != out_width || in_height != out_height) { Logging::debug(virtname(), "Rescaling video size from %1:%2 to %3:%4.", in_width, in_height, out_width, out_height); } m_sws_ctx = sws_getContext( // Source settings in_width, // width in_height, // height in_pix_fmt, // format // Target settings out_width, // width out_height, // height out_pix_fmt, // format SWS_FAST_BILINEAR, nullptr, nullptr, nullptr); // Maybe SWS_LANCZOS | SWS_ACCURATE_RND if (m_sws_ctx == nullptr) { Logging::error(virtname(), "Could not allocate a scaling/conversion context."); return AVERROR(ENOMEM); } } return 0; } int FFmpeg_Transcoder::add_stream(AVCodecID codec_id) { AVCodecContext *output_codec_ctx = nullptr; AVStream * output_stream = nullptr; #if IF_DECLARED_CONST const AVCodec * output_codec = nullptr; #else // !IF_DECLARED_CONST AVCodec * output_codec = nullptr; #endif // !IF_DECLARED_CONST AVDictionary * opt = nullptr; int ret; std::string codec_name; if (get_hw_encoder_name(codec_id, &codec_name) || m_hwaccel_enc_mode == HWACCELMODE::FALLBACK) { // find the encoder output_codec = avcodec_find_encoder(codec_id); if (output_codec == nullptr) { Logging::error(virtname(), "Could not find encoder '%1'.", avcodec_get_name(codec_id)); return AVERROR(EINVAL); } } else { output_codec = avcodec_find_encoder_by_name(codec_name.c_str()); if (output_codec == nullptr) { Logging::error(virtname(), "Could not find encoder '%1'.", codec_name.c_str()); return AVERROR(EINVAL); } //Logging::info(virtname(), "Hardware encoder acceleration active with codec '%1'.", output_codec->name); m_hwaccel_enc_mode = HWACCELMODE::ENABLED; } output_stream = avformat_new_stream(m_out.m_format_ctx, output_codec); if (output_stream == nullptr) { Logging::error(virtname(), "Could not allocate stream for encoder '%1'.", avcodec_get_name(codec_id)); return AVERROR(ENOMEM); } output_stream->id = static_cast(m_out.m_format_ctx->nb_streams - 1); output_codec_ctx = avcodec_alloc_context3(output_codec); if (output_codec_ctx == nullptr) { Logging::error(virtname(), "Could not allocate an encoding context."); return AVERROR(ENOMEM); } switch (output_codec->type) { case AVMEDIA_TYPE_AUDIO: { BITRATE orig_bit_rate; int orig_sample_rate; // Set the basic encoder parameters orig_bit_rate = (m_in.m_audio.m_stream->codecpar->bit_rate != 0) ? m_in.m_audio.m_stream->codecpar->bit_rate : m_in.m_format_ctx->bit_rate; if (get_output_bit_rate(orig_bit_rate, params.m_audiobitrate, &output_codec_ctx->bit_rate)) { // Limit bit rate Logging::trace(virtname(), "Limiting audio bit rate from %1 to %2.", format_bitrate(orig_bit_rate).c_str(), format_bitrate(output_codec_ctx->bit_rate).c_str()); } if (params.m_audiochannels > 0 && get_channels(m_in.m_audio.m_codec_ctx.get()) > params.m_audiochannels) { Logging::trace(virtname(), "Limiting audio channels from %1 to %2.", get_channels(m_in.m_audio.m_codec_ctx.get()), params.m_audiochannels); set_channels(output_codec_ctx, params.m_audiochannels); } else { set_channels(output_codec_ctx, m_in.m_audio.m_codec_ctx.get()); } #if LAVU_DEP_OLD_CHANNEL_LAYOUT av_channel_layout_default(&output_codec_ctx->ch_layout, output_codec_ctx->ch_layout.nb_channels); #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT output_codec_ctx->channel_layout = static_cast(av_get_default_channel_layout(output_codec_ctx->channels)); #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT output_codec_ctx->sample_rate = m_in.m_audio.m_codec_ctx->sample_rate; orig_sample_rate = m_in.m_audio.m_codec_ctx->sample_rate; if (get_output_sample_rate(m_in.m_audio.m_stream->codecpar->sample_rate, params.m_audiosamplerate, &output_codec_ctx->sample_rate)) { // Limit sample rate Logging::trace(virtname(), "Limiting audio sample rate from %1 to %2.", format_samplerate(orig_sample_rate).c_str(), format_samplerate(output_codec_ctx->sample_rate).c_str()); orig_sample_rate = output_codec_ctx->sample_rate; } #if LAVC_USE_SUPPORTED_CFG { const int *supported_samplerates = nullptr; int num_samplerates = 0; int ret_cfg = avcodec_get_supported_config(output_codec_ctx, output_codec, AV_CODEC_CONFIG_SAMPLE_RATE, 0, (const void**)&supported_samplerates, &num_samplerates); if (ret_cfg >= 0 && supported_samplerates && num_samplerates > 0) { bool exact_match = false; for (int n = 0; n < num_samplerates; n++) { if (supported_samplerates[n] == output_codec_ctx->sample_rate) { exact_match = true; break; } } if (!exact_match) { int min_samplerate = 0, max_samplerate = INT_MAX; for (int n = 0; n < num_samplerates; n++) { int s = supported_samplerates[n]; if (min_samplerate <= s && output_codec_ctx->sample_rate >= s) min_samplerate = s; } for (int n = 0; n < num_samplerates; n++) { int s = supported_samplerates[n]; if (max_samplerate >= s && output_codec_ctx->sample_rate <= s) max_samplerate = s; } if (min_samplerate != 0 && max_samplerate != INT_MAX) { if (output_codec_ctx->sample_rate - min_samplerate < max_samplerate - output_codec_ctx->sample_rate) output_codec_ctx->sample_rate = min_samplerate; else output_codec_ctx->sample_rate = max_samplerate; } else if (min_samplerate != 0) { output_codec_ctx->sample_rate = min_samplerate; } else if (max_samplerate != INT_MAX) { output_codec_ctx->sample_rate = max_samplerate; } else { for (int n = 0; n < num_samplerates; n++) if (supported_samplerates[n] == 48000) { output_codec_ctx->sample_rate = 48000; break; } if (output_codec_ctx->sample_rate <= 0) output_codec_ctx->sample_rate = supported_samplerates[0]; } } } } #else if (output_codec->supported_samplerates != nullptr) { // Go through supported sample rates and adjust if necessary bool supported = false; for (int n = 0; output_codec->supported_samplerates[n] != 0; n++) { if (output_codec->supported_samplerates[n] == output_codec_ctx->sample_rate) { // Is supported supported = true; break; } } if (!supported) { int min_samplerate = 0; int max_samplerate = INT_MAX; // Find next lower sample rate in probably unsorted list for (int n = 0; output_codec->supported_samplerates[n] != 0; n++) { if (min_samplerate <= output_codec->supported_samplerates[n] && output_codec_ctx->sample_rate >= output_codec->supported_samplerates[n]) { min_samplerate = output_codec->supported_samplerates[n]; } } // Find next higher sample rate in probably unsorted list for (int n = 0; output_codec->supported_samplerates[n] != 0; n++) { if (max_samplerate >= output_codec->supported_samplerates[n] && output_codec_ctx->sample_rate <= output_codec->supported_samplerates[n]) { max_samplerate = output_codec->supported_samplerates[n]; } } if (min_samplerate != 0 && max_samplerate != INT_MAX) { // set to nearest value if (output_codec_ctx->sample_rate - min_samplerate < max_samplerate - output_codec_ctx->sample_rate) { output_codec_ctx->sample_rate = min_samplerate; } else { output_codec_ctx->sample_rate = max_samplerate; } } else if (min_samplerate != 0) { // No higher sample rate, use next lower output_codec_ctx->sample_rate = min_samplerate; } else if (max_samplerate != INT_MAX) { // No lower sample rate, use higher lower output_codec_ctx->sample_rate = max_samplerate; } else { // Should never happen... There must at least be one. Logging::error(virtname(), "The codec does not support an audio sample rate of %1.", format_samplerate(output_codec_ctx->sample_rate).c_str()); return AVERROR(EINVAL); } Logging::debug(virtname(), "Because the requested value is not supported by codec, the audio sample rate was changed from %1 to %2.", format_samplerate(orig_sample_rate).c_str(), format_samplerate(output_codec_ctx->sample_rate).c_str()); } } #endif // If sample format not pre-defined (not AV_SAMPLE_FMT_NONE), use input file setting. AVSampleFormat in_sample_format = (m_current_format->sample_format() == AV_SAMPLE_FMT_NONE) ? m_in.m_audio.m_codec_ctx->sample_fmt : m_current_format->sample_format(); #if LAVC_USE_SUPPORTED_CFG { // Query supported sample formats via the new API const enum AVSampleFormat *sample_fmts = nullptr; int num_fmts = 0; int ret_cfg = avcodec_get_supported_config(output_codec_ctx, output_codec, AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, (const void**)&sample_fmts, &num_fmts); if (ret_cfg >= 0 && sample_fmts && num_fmts > 0) { AVSampleFormat input_fmt_planar = av_get_planar_sample_fmt(in_sample_format); for (int i = 0; i < num_fmts; i++) { AVSampleFormat output_fmt_planar = av_get_planar_sample_fmt(sample_fmts[i]); if (sample_fmts[i] == in_sample_format || (input_fmt_planar != AV_SAMPLE_FMT_NONE && input_fmt_planar == output_fmt_planar)) { output_codec_ctx->sample_fmt = sample_fmts[i]; break; } } if (output_codec_ctx->sample_fmt == AV_SAMPLE_FMT_NONE) { // Fallback: first supported format output_codec_ctx->sample_fmt = sample_fmts[0]; } } else { // If supported sample formats are unknown simply take input format output_codec_ctx->sample_fmt = in_sample_format; } } #else if (output_codec->sample_fmts != nullptr) { // Check if input sample format is supported and if so, use it (avoiding resampling) AVSampleFormat input_fmt_planar = av_get_planar_sample_fmt(in_sample_format); output_codec_ctx->sample_fmt = AV_SAMPLE_FMT_NONE; for (const AVSampleFormat *sample_fmt = output_codec->sample_fmts; *sample_fmt != -1; sample_fmt++) { AVSampleFormat output_fmt_planar = av_get_planar_sample_fmt(*sample_fmt); if (*sample_fmt == in_sample_format || (input_fmt_planar != AV_SAMPLE_FMT_NONE && input_fmt_planar == output_fmt_planar)) { output_codec_ctx->sample_fmt = *sample_fmt; break; } } // If none of the supported formats match use the first supported if (output_codec_ctx->sample_fmt == AV_SAMPLE_FMT_NONE) { output_codec_ctx->sample_fmt = output_codec->sample_fmts[0]; } } else { // If supported sample formats are unknown simply take input format and cross our fingers it'll work... output_codec_ctx->sample_fmt = in_sample_format; } #endif // Set the sample rate for the container. output_stream->time_base.den = output_codec_ctx->sample_rate; output_stream->time_base.num = 1; output_codec_ctx->time_base = output_stream->time_base; // set -strict -2 for aac (required for FFmpeg 2) dict_set_with_check(&opt, "strict", "-2", 0); // Allow the use of the experimental AAC encoder output_codec_ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; // Set duration as hint for muxer if (m_in.m_audio.m_stream->duration != AV_NOPTS_VALUE) { output_stream->duration = ffmpeg_rescale_q(m_in.m_audio.m_stream->duration, m_in.m_audio.m_stream->time_base, output_stream->time_base); } else if (m_in.m_format_ctx->duration != AV_NOPTS_VALUE) { output_stream->duration = ffmpeg_rescale_q(m_in.m_format_ctx->duration, av_get_time_base_q(), output_stream->time_base); } //av_dict_set_int(&output_stream->metadata, "DURATION", output_stream->duration, AV_DICT_IGNORE_SUFFIX); // Save the encoder context for easier access later. m_out.m_audio.set_codec_ctx(output_codec_ctx); // Save the stream index m_out.m_audio.m_stream_idx = output_stream->index; // Save output audio stream for faster reference m_out.m_audio.m_stream = output_stream; // Update input to output stream map, this is rather boring because currently we only have a single audio stream add_stream_map(m_in.m_audio.m_stream_idx, m_out.m_audio.m_stream_idx); break; } case AVMEDIA_TYPE_VIDEO: { BITRATE orig_bit_rate; if (m_hwaccel_enable_enc_buffering && m_hwaccel_enc_device_ctx != nullptr) { Logging::debug(virtname(), "Hardware encoder init: Creating a new hardware frame context for the encoder.", get_hwaccel_API_text(params.m_hwaccel_enc_API).c_str()); m_enc_hw_pix_fmt = get_hw_pix_fmt(output_codec, params.m_hwaccel_enc_device_type, false); ret = hwframe_ctx_set(output_codec_ctx, m_in.m_video.m_codec_ctx.get(), m_hwaccel_enc_device_ctx); if (ret < 0) { return ret; } } output_codec_ctx->codec_id = codec_id; // Set the basic encoder parameters orig_bit_rate = (m_in.m_video.m_stream->codecpar->bit_rate != 0) ? m_in.m_video.m_stream->codecpar->bit_rate : m_in.m_format_ctx->bit_rate; if (get_output_bit_rate(orig_bit_rate, params.m_videobitrate, &output_codec_ctx->bit_rate)) { // Limit sample rate Logging::trace(virtname(), "Limiting video bit rate from %1 to %2.", format_bitrate(orig_bit_rate).c_str(), format_bitrate(output_codec_ctx->bit_rate).c_str()); } // output_codec_ctx->rc_min_rate = output_codec_ctx->bit_rate * 75 / 100; // output_codec_ctx->rc_max_rate = output_codec_ctx->bit_rate * 125 / 100; // output_codec_ctx->qmin = 1; // output_codec_ctx->qmax = 31; int width = 0; int height = 0; if (get_video_size(&width, &height)) { Logging::trace(virtname(), "Changing video size from %1/%2 to %3/%4.", output_codec_ctx->width, output_codec_ctx->height, width, height); output_codec_ctx->width = width; output_codec_ctx->height = height; } else { output_codec_ctx->width = m_in.m_video.m_stream->codecpar->width; output_codec_ctx->height = m_in.m_video.m_stream->codecpar->height; } video_stream_setup(output_codec_ctx, output_stream, m_in.m_video.m_codec_ctx.get(), m_in.m_video.m_stream->avg_frame_rate, m_enc_hw_pix_fmt); AVRational sample_aspect_ratio = m_in.m_video.m_stream->codecpar->sample_aspect_ratio; if (output_codec_ctx->codec_id != AV_CODEC_ID_VP9 && m_out.m_filetype != FILETYPE::MKV) { output_codec_ctx->sample_aspect_ratio = sample_aspect_ratio; output_stream->codecpar->sample_aspect_ratio = sample_aspect_ratio; } else { // WebM and MKV do not respect the aspect ratio and always use 1:1 so we need to rescale "manually". /** * @todo FFmpeg actually *can* transcode while presevering the SAR. * FFmpegfs rescales to fix that problem. * Need to find out what I am doing wrong here... */ output_codec_ctx->sample_aspect_ratio = { 1, 1 }; output_stream->codecpar->sample_aspect_ratio = { 1, 1 }; // Make sure we do not zero width if (sample_aspect_ratio.num && sample_aspect_ratio.den) { output_codec_ctx->width = output_codec_ctx->width * sample_aspect_ratio.num / sample_aspect_ratio.den; } //output_codec_ctx->height *= sample_aspect_ratio.den; } // Set up optimisations switch (output_codec_ctx->codec_id) { case AV_CODEC_ID_H264: { ret = prepare_codec(output_codec_ctx->priv_data, m_out.m_filetype); if (ret < 0) { Logging::error(virtname(), "Could not set profile for %1 output codec %2 (error '%3').", get_media_type_string(output_codec->type), get_codec_name(codec_id), ffmpeg_geterror(ret).c_str()); return ret; } if (m_hwaccel_enable_enc_buffering) { // For hardware encoding only // Defaults to 20. Set to 40 to create slightly smaller results (the bigger, the smaller the files). // Values seem to range between 1 and 51. // Must be non-zero, otherwise hardware encoding my fail with: // "Driver does not support any RC mode compatible with selected options (supported modes: CQP)." output_codec_ctx->global_quality = 40; } // Avoid mismatches for H264 and profile uint8_t *out_val; ret = av_opt_get(output_codec_ctx->priv_data, "profile", 0, &out_val); if (!ret) { if (!strcasecmp(reinterpret_cast(out_val), "high")) { switch (output_codec_ctx->pix_fmt) { case AV_PIX_FMT_YUYV422: case AV_PIX_FMT_YUV422P: case AV_PIX_FMT_YUVJ422P: case AV_PIX_FMT_UYVY422: case AV_PIX_FMT_YUV422P16LE: case AV_PIX_FMT_YUV422P16BE: case AV_PIX_FMT_YUV422P10BE: case AV_PIX_FMT_YUV422P10LE: case AV_PIX_FMT_YUV422P9BE: case AV_PIX_FMT_YUV422P9LE: case AV_PIX_FMT_YUVA422P9BE: case AV_PIX_FMT_YUVA422P9LE: case AV_PIX_FMT_YUVA422P10BE: case AV_PIX_FMT_YUVA422P10LE: case AV_PIX_FMT_YUVA422P16BE: case AV_PIX_FMT_YUVA422P16LE: case AV_PIX_FMT_NV16: case AV_PIX_FMT_NV20LE: case AV_PIX_FMT_NV20BE: case AV_PIX_FMT_YVYU422: case AV_PIX_FMT_YUVA422P: case AV_PIX_FMT_YUV422P12BE: case AV_PIX_FMT_YUV422P12LE: case AV_PIX_FMT_YUV422P14BE: case AV_PIX_FMT_YUV422P14LE: { ret = av_opt_set(output_codec_ctx->priv_data, "profile", "high422", 0); if (ret < 0) { Logging::error(virtname(), "Could not set profile=high422 for %1 output codec %2 (error '%3').", get_media_type_string(output_codec->type), get_codec_name(codec_id), ffmpeg_geterror(ret).c_str()); return ret; } break; } case AV_PIX_FMT_YUV444P: case AV_PIX_FMT_YUVJ444P: case AV_PIX_FMT_YUV444P16LE: case AV_PIX_FMT_YUV444P16BE: case AV_PIX_FMT_RGB444LE: case AV_PIX_FMT_RGB444BE: case AV_PIX_FMT_BGR444LE: case AV_PIX_FMT_BGR444BE: case AV_PIX_FMT_YUV444P9BE: case AV_PIX_FMT_YUV444P9LE: case AV_PIX_FMT_YUV444P10BE: case AV_PIX_FMT_YUV444P10LE: case AV_PIX_FMT_GBRP: case AV_PIX_FMT_GBRP9BE: case AV_PIX_FMT_GBRP9LE: case AV_PIX_FMT_GBRP10BE: case AV_PIX_FMT_GBRP10LE: case AV_PIX_FMT_GBRP16BE: case AV_PIX_FMT_GBRP16LE: case AV_PIX_FMT_YUVA444P9BE: case AV_PIX_FMT_YUVA444P9LE: case AV_PIX_FMT_YUVA444P10BE: case AV_PIX_FMT_YUVA444P10LE: case AV_PIX_FMT_YUVA444P16BE: case AV_PIX_FMT_YUVA444P16LE: case AV_PIX_FMT_XYZ12LE: case AV_PIX_FMT_XYZ12BE: case AV_PIX_FMT_YUVA444P: case AV_PIX_FMT_GBRAP: case AV_PIX_FMT_GBRAP16BE: case AV_PIX_FMT_GBRAP16LE: case AV_PIX_FMT_YUV444P12BE: case AV_PIX_FMT_YUV444P12LE: case AV_PIX_FMT_YUV444P14BE: case AV_PIX_FMT_YUV444P14LE: case AV_PIX_FMT_GBRP12BE: case AV_PIX_FMT_GBRP12LE: case AV_PIX_FMT_GBRP14BE: case AV_PIX_FMT_GBRP14LE: case AV_PIX_FMT_AYUV64LE: case AV_PIX_FMT_AYUV64BE: { ret = av_opt_set(output_codec_ctx->priv_data, "profile", "high444", 0); if (ret < 0) { Logging::error(virtname(), "Could not set profile=high444 for %1 output codec %2 (error '%3').", get_media_type_string(output_codec->type), get_codec_name(codec_id), ffmpeg_geterror(ret).c_str()); return ret; } break; } default: { break; } } } av_free(out_val); } break; } case AV_CODEC_ID_VP9: { ret = prepare_codec(output_codec_ctx->priv_data, FILETYPE::WEBM); if (ret < 0) { Logging::error(virtname(), "Could not set profile for %1 output codec %2 (error '%3').", get_media_type_string(output_codec->type), get_codec_name(codec_id), ffmpeg_geterror(ret).c_str()); return ret; } break; } case AV_CODEC_ID_PRORES: { ret = prepare_codec(output_codec_ctx->priv_data, FILETYPE::PRORES); if (ret < 0) { Logging::error(virtname(), "Could not set profile for %1 output codec %2 (error '%3').", get_media_type_string(output_codec->type), get_codec_name(codec_id), ffmpeg_geterror(ret).c_str()); return ret; } // 0 = ‘proxy’, // 1 = ‘lt’, // 2 = ‘standard’, // 3 = ‘hq’ output_codec_ctx->profile = static_cast(params.m_level); break; } case AV_CODEC_ID_ALAC: { ret = prepare_codec(output_codec_ctx->priv_data, FILETYPE::ALAC); if (ret < 0) { Logging::error(virtname(), "Could not set profile for %1 output codec %2 (error '%3').", get_media_type_string(output_codec->type), get_codec_name(codec_id), ffmpeg_geterror(ret).c_str()); return ret; } break; } default: { break; } } // Initialise pixel format conversion and rescaling if necessary get_pix_formats(&m_in.m_pix_fmt, &m_out.m_pix_fmt, output_codec_ctx); ret = init_rescaler(m_in.m_pix_fmt, m_in.m_video.m_stream->codecpar->width, m_in.m_video.m_stream->codecpar->height, m_out.m_pix_fmt, output_codec_ctx->width, output_codec_ctx->height); if (ret < 0) { return ret; } // set -strict -2 for aac (required for FFmpeg 2) dict_set_with_check(&opt, "strict", "-2", 0); // Allow the use of the experimental AAC encoder output_codec_ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; #ifdef _DEBUG print_stream_info(output_stream); #endif // _DEBUG // Set duration as hint for muxer if (m_in.m_video.m_stream->duration != AV_NOPTS_VALUE) { output_stream->duration = ffmpeg_rescale_q(m_in.m_video.m_stream->duration, m_in.m_video.m_stream->time_base, output_stream->time_base); } else if (m_in.m_format_ctx->duration != AV_NOPTS_VALUE) { output_stream->duration = ffmpeg_rescale_q(m_in.m_format_ctx->duration, av_get_time_base_q(), output_stream->time_base); } //av_dict_set_int(&output_stream->metadata, "DURATION", output_stream->duration, AV_DICT_IGNORE_SUFFIX); // Save the encoder context for easier access later. m_out.m_video.set_codec_ctx(output_codec_ctx); // Save the stream index m_out.m_video.m_stream_idx = output_stream->index; // Save output video stream for faster reference m_out.m_video.m_stream = output_stream; // Update input to output stream map, this is rather boring because currently we only have a single video stream add_stream_map(m_in.m_video.m_stream_idx, m_out.m_video.m_stream_idx); break; } default: break; } // Although docs state this is "Demuxing only", this is actually used by encoders like Matroska/WebM, so we need to set this here. m_out.m_format_ctx->duration = m_in.m_format_ctx->duration; if (m_virtualfile->m_flags & VIRTUALFLAG_CUESHEET) { av_dict_set_int(&m_out.m_format_ctx->metadata, "DURATION", m_virtualfile->m_cuesheet_track.m_duration, AV_DICT_IGNORE_SUFFIX); } else { av_dict_set_int(&m_out.m_format_ctx->metadata, "DURATION", m_out.m_format_ctx->duration, AV_DICT_IGNORE_SUFFIX); } // Some formats want stream headers to be separate. if (m_out.m_format_ctx->oformat->flags & AVFMT_GLOBALHEADER) { output_codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } if (!av_dict_get(opt, "threads", nullptr, 0)) { Logging::trace(virtname(), "Setting threads to auto for codec %1.", get_codec_name(output_codec_ctx->codec_id)); dict_set_with_check(&opt, "threads", "auto", 0, virtname()); } // Open the encoder for the stream to use it later. ret = avcodec_open2(output_codec_ctx, output_codec, &opt); if (ret < 0) { Logging::error(virtname(), "Could not open %1 output codec %2 for stream #%3 (error '%4').", get_media_type_string(output_codec->type), get_codec_name(codec_id), output_stream->index, ffmpeg_geterror(ret).c_str()); return ret; } Logging::debug(virtname(), "Opened %1 output codec %2 for stream #%3.", get_media_type_string(output_codec->type), get_codec_name(codec_id, true), output_stream->index); ret = avcodec_parameters_from_context(output_stream->codecpar, output_codec_ctx); if (ret < 0) { Logging::error(virtname(), "Could not initialise stream parameters (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } return (output_stream->index); } int FFmpeg_Transcoder::add_subtitle_stream(AVCodecID codec_id, StreamRef & input_streamref, const std::optional & language) { AVCodecContext *output_codec_ctx = nullptr; AVStream * output_stream = nullptr; #if IF_DECLARED_CONST const AVCodec * output_codec = nullptr; #else // !IF_DECLARED_CONST AVCodec * output_codec = nullptr; #endif // !IF_DECLARED_CONST AVDictionary * opt = nullptr; int ret; // find the encoder output_codec = avcodec_find_encoder(codec_id); if (output_codec == nullptr) { Logging::error(virtname(), "'%1' encoder could not be found.", avcodec_get_name(codec_id)); return AVERROR(EINVAL); } output_stream = avformat_new_stream(m_out.m_format_ctx, output_codec); if (output_stream == nullptr) { Logging::error(virtname(), "Could not allocate stream for encoder '%1'.", avcodec_get_name(codec_id)); return AVERROR(ENOMEM); } output_stream->id = static_cast(m_out.m_format_ctx->nb_streams - 1); output_codec_ctx = avcodec_alloc_context3(output_codec); if (output_codec_ctx == nullptr) { Logging::error(virtname(), "Could not allocate an encoding context for encoder '%1'.", avcodec_get_name(codec_id)); return AVERROR(ENOMEM); } output_stream->time_base = input_streamref.m_stream->time_base; output_codec_ctx->time_base = output_stream->time_base; // set -strict -2 for aac (required for FFmpeg 2) dict_set_with_check(&opt, "strict", "-2", 0); // Allow the use of the experimental AAC encoder output_codec_ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; // Set duration as hint for muxer if (m_in.m_video.m_stream != nullptr && m_in.m_video.m_stream->duration != AV_NOPTS_VALUE) { output_stream->duration = ffmpeg_rescale_q(m_in.m_video.m_stream->duration, m_in.m_video.m_stream->time_base, output_stream->time_base); } if (m_in.m_audio.m_stream != nullptr && m_in.m_audio.m_stream->duration != AV_NOPTS_VALUE) { output_stream->duration = ffmpeg_rescale_q(m_in.m_audio.m_stream->duration, m_in.m_audio.m_stream->time_base, output_stream->time_base); } else if (m_in.m_format_ctx != nullptr && m_in.m_format_ctx->duration != AV_NOPTS_VALUE) { output_stream->duration = ffmpeg_rescale_q(m_in.m_format_ctx->duration, av_get_time_base_q(), output_stream->time_base); } AVCodecContext * input_codec_ctx = input_streamref.m_codec_ctx.get(); if (input_codec_ctx != nullptr && input_codec_ctx->subtitle_header != nullptr) { // ASS code assumes this buffer is null terminated so add extra byte. output_codec_ctx->subtitle_header = static_cast(av_mallocz(static_cast(input_codec_ctx->subtitle_header_size) + 1)); if (output_codec_ctx->subtitle_header == nullptr) { return AVERROR(ENOMEM); } std::memcpy(output_codec_ctx->subtitle_header, input_codec_ctx->subtitle_header, static_cast(input_codec_ctx->subtitle_header_size)); output_codec_ctx->subtitle_header_size = input_codec_ctx->subtitle_header_size; } else if (output_codec_ctx->codec_id == AV_CODEC_ID_WEBVTT || output_codec_ctx->codec_id == AV_CODEC_ID_SUBRIP) { // If source had no header, we create a default one ret = get_script_info(output_codec_ctx, ASS_DEFAULT_PLAYRESX, ASS_DEFAULT_PLAYRESY, ASS_DEFAULT_FONT, ASS_DEFAULT_FONT_SIZE, ASS_DEFAULT_COLOUR, ASS_DEFAULT_COLOUR, ASS_DEFAULT_BACK_COLOUR, ASS_DEFAULT_BACK_COLOUR, ASS_DEFAULT_BOLD, ASS_DEFAULT_ITALIC, ASS_DEFAULT_UNDERLINE, ASS_DEFAULT_BORDERSTYLE, ASS_DEFAULT_ALIGNMENT); if (ret) { Logging::error(virtname(), "Could not create ASS script info for encoder '%1'.", avcodec_get_name(codec_id)); return ret; } } // Open the encoder for the stream to use it later. ret = avcodec_open2(output_codec_ctx, output_codec, &opt); if (ret < 0) { Logging::error(virtname(), "Could not open %1 output codec %2 for stream #%3 (error '%4').", get_media_type_string(output_codec->type), get_codec_name(codec_id), output_stream->index, ffmpeg_geterror(ret).c_str()); return ret; } Logging::debug(virtname(), "Opened %1 output codec %2 for stream #%3.", get_media_type_string(output_codec->type), get_codec_name(codec_id, true), output_stream->index); ret = avcodec_parameters_from_context(output_stream->codecpar, output_codec_ctx); if (ret < 0) { Logging::error(virtname(), "Could not initialise stream parameters (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } if (!language) { // Copy language AVDictionaryEntry *tag = nullptr; tag = av_dict_get(input_streamref.m_stream->metadata, "language", nullptr, AV_DICT_IGNORE_SUFFIX); if (tag != nullptr) { av_dict_set(&output_stream->metadata, "language", tag->value, AV_DICT_IGNORE_SUFFIX); } } else { // Use predefined value av_dict_set(&output_stream->metadata, "language", language->c_str(), AV_DICT_IGNORE_SUFFIX); } // Save the encoder context for easier access later. StreamRef output_streamref; output_streamref.set_codec_ctx(output_codec_ctx); // Save the stream index output_streamref.m_stream_idx = output_stream->index; // Save output audio stream for faster reference output_streamref.m_stream = output_stream; m_out.m_subtitle.insert(std::make_pair(output_streamref.m_stream_idx, output_streamref)); // Update input to output stream map add_stream_map(input_streamref.m_stream_idx, output_streamref.m_stream_idx); return output_streamref.m_stream_idx; } int FFmpeg_Transcoder::add_stream_copy(AVCodecID codec_id, AVMediaType codec_type) { AVStream * output_stream = nullptr; int ret; output_stream = avformat_new_stream(m_out.m_format_ctx, nullptr); if (output_stream == nullptr) { Logging::error(virtname(), "Could not allocate stream for encoder '%1'.", avcodec_get_name(codec_id)); return AVERROR(ENOMEM); } output_stream->id = static_cast(m_out.m_format_ctx->nb_streams - 1); switch (codec_type) { case AVMEDIA_TYPE_AUDIO: { ret = avcodec_parameters_copy(output_stream->codecpar, m_in.m_audio.m_stream->codecpar); if (ret < 0) { Logging::error(virtname(), "Could not allocate an encoding context (error '%2').", ffmpeg_geterror(ret).c_str()); return ret; } // Set the sample rate for the container. output_stream->time_base = m_in.m_audio.m_stream->time_base; // Set duration as hint for muxer output_stream->duration = ffmpeg_rescale_q(m_in.m_audio.m_stream->duration, m_in.m_audio.m_stream->time_base, output_stream->time_base); // Save the encoder context for easier access later. m_out.m_audio.set_codec_ctx(nullptr); // Save the stream index m_out.m_audio.m_stream_idx = output_stream->index; // Save output audio stream for faster reference m_out.m_audio.m_stream = output_stream; // Update input to output stream map, this is rather boring because currently we only have a single audio stream add_stream_map(m_in.m_audio.m_stream_idx, m_out.m_audio.m_stream_idx); break; } case AVMEDIA_TYPE_VIDEO: { ret = avcodec_parameters_copy(output_stream->codecpar, m_in.m_video.m_stream->codecpar); if (ret < 0) { Logging::error(virtname(), "Could not allocate an encoding context (error '%2').", ffmpeg_geterror(ret).c_str()); return ret; } output_stream->time_base = m_in.m_video.m_stream->time_base; #ifdef _DEBUG print_stream_info(output_stream); #endif // _DEBUG // Set duration as hint for muxer output_stream->duration = ffmpeg_rescale_q(m_in.m_video.m_stream->duration, m_in.m_video.m_stream->time_base, output_stream->time_base); // Save the encoder context for easier access later. m_out.m_video.set_codec_ctx(nullptr); // Save the stream index m_out.m_video.m_stream_idx = output_stream->index; // Save output video stream for faster reference m_out.m_video.m_stream = output_stream; // Update input to output stream map, this is rather boring because currently we only have a single video stream add_stream_map(m_in.m_video.m_stream_idx, m_out.m_video.m_stream_idx); break; } default: break; } output_stream->codecpar->codec_tag = 0; return 0; } int FFmpeg_Transcoder::add_albumart_stream(const AVCodecContext * input_codec_ctx) { AVCodecContext * output_codec_ctx = nullptr; AVStream * output_stream = nullptr; const AVCodec * input_codec = input_codec_ctx->codec; const AVCodec * output_codec = nullptr; AVDictionary * opt = nullptr; int ret; // find the encoder output_codec = avcodec_find_encoder(input_codec->id); if (output_codec == nullptr) { Logging::error(virtname(), "'%1' encoder could not be found.", avcodec_get_name(input_codec->id)); return AVERROR(EINVAL); } // Must be a video codec if (output_codec->type != AVMEDIA_TYPE_VIDEO) { Logging::error(virtname(), "INTERNAL TROUBLE! Encoder '%1' is not a video codec.", avcodec_get_name(input_codec->id)); return AVERROR(EINVAL); } output_stream = avformat_new_stream(m_out.m_format_ctx, output_codec); if (output_stream == nullptr) { Logging::error(virtname(), "Could not allocate stream for encoder '%1'.", avcodec_get_name(input_codec->id)); return AVERROR(ENOMEM); } output_stream->id = static_cast(m_out.m_format_ctx->nb_streams - 1); output_codec_ctx = avcodec_alloc_context3(output_codec); if (output_codec_ctx == nullptr) { Logging::error(virtname(), "Could not allocate an encoding context."); return AVERROR(ENOMEM); } // Ignore missing width/height when adding album arts #if !IF_DECLARED_CONST m_out.m_format_ctx->oformat->flags |= AVFMT_NODIMENSIONS; #endif // !IF_DECLARED_CONST // This is required for some reason (let encoder decide?) // If not set, write header will fail! //output_codec_ctx->codec_tag = 0; //av_codec_get_tag(of->codec_tag, codec->codec_id); //output_stream->codec->framerate = { 1, 0 }; /** @todo Add support for album arts */ // mp4 album arts do not work with ipod profile. Set mp4. //if (m_out.m_format_ctx->oformat->mime_type != nullptr && (!strcmp(m_out.m_format_ctx->oformat->mime_type, "application/mp4") || !strcmp(m_out.m_format_ctx->oformat->mime_type, "video/mp4"))) //{ // m_out.m_format_ctx->oformat->name = "mp4"; // m_out.m_format_ctx->oformat->mime_type = "application/mp4"; //} // copy disposition // output_stream->disposition = input_stream->disposition; output_stream->disposition = AV_DISPOSITION_ATTACHED_PIC; // copy estimated duration as a hint to the muxer if (output_stream->duration <= 0 && m_in.m_audio.m_stream->duration > 0) { output_stream->duration = ffmpeg_rescale_q(m_in.m_audio.m_stream->duration, m_in.m_audio.m_stream->time_base, output_stream->time_base); } output_codec_ctx->time_base = { 1, 90000 }; output_stream->time_base = { 1, 90000 }; output_codec_ctx->pix_fmt = input_codec_ctx->pix_fmt; output_codec_ctx->width = input_codec_ctx->width; output_codec_ctx->height = input_codec_ctx->height; // Some formats want stream headers to be separate. if (m_out.m_format_ctx->oformat->flags & AVFMT_GLOBALHEADER) { output_codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } // Open the encoder for the stream to use it later. ret = avcodec_open2(output_codec_ctx, output_codec, &opt); if (ret < 0) { Logging::error(virtname(), "Could not open %1 output codec %2 for stream #%3 (error '%4').", get_media_type_string(output_codec->type), get_codec_name(input_codec->id), output_stream->index, ffmpeg_geterror(ret).c_str()); return ret; } Logging::debug(virtname(), "Opened album art output codec %1 for stream #%2 (dimensions %3x%4).", get_codec_name(input_codec->id, true), output_stream->index, output_codec_ctx->width, output_codec_ctx->height); ret = avcodec_parameters_from_context(output_stream->codecpar, output_codec_ctx); if (ret < 0) { Logging::error(virtname(), "Could not initialise stream parameters stream #%1 (error '%2').", output_stream->index, ffmpeg_geterror(ret).c_str()); return ret; } StreamRef streamref; streamref.set_codec_ctx(output_codec_ctx); streamref.m_stream = output_stream; streamref.m_stream_idx = output_stream->index; m_out.m_album_art.push_back(streamref); return 0; } int FFmpeg_Transcoder::add_albumart_frame(AVStream *output_stream, AVPacket *pkt_in) { AVPacket *tmp_pkt; int ret = 0; tmp_pkt = av_packet_clone(pkt_in); if (tmp_pkt == nullptr) { ret = AVERROR(ENOMEM); Logging::error(virtname(), "Could not write album art packet (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } Logging::trace(virtname(), "Adding album art stream #%1.", output_stream->index); tmp_pkt->stream_index = output_stream->index; tmp_pkt->flags |= AV_PKT_FLAG_KEY; // Contains a single frame, make sure it's a key frame tmp_pkt->pos = 0; tmp_pkt->dts = 0; ret = store_packet(tmp_pkt, AVMEDIA_TYPE_ATTACHMENT); av_packet_unref(tmp_pkt); return ret; } int FFmpeg_Transcoder::open_output_filestreams(Buffer *buffer) { m_out.m_filetype = m_current_format->filetype(); Logging::debug(virtname(), "Opening output format '%1'.", m_current_format->desttype().c_str()); // Reset active streams m_active_stream_msk = 0; m_inhibit_stream_msk = 0; // Check if we can copy audio or video. m_copy_audio = can_copy_stream(m_in.m_audio.m_stream); m_copy_video = can_copy_stream(m_in.m_video.m_stream); // Create a new format context for the output container format. if (m_current_format->format_name() != "m4a") { avformat_alloc_output_context2(&m_out.m_format_ctx, nullptr, m_current_format->format_name().c_str(), nullptr); } else { avformat_alloc_output_context2(&m_out.m_format_ctx, nullptr, nullptr, ".m4a"); } if (m_out.m_format_ctx == nullptr) { Logging::error(virtname(), "Could not allocate an output format context."); return AVERROR(ENOMEM); } if (!m_is_video) { m_in.m_video.m_stream_idx = INVALID_STREAM; } //video_codec = m_out.m_format_ctx->oformat->video_codec; // Open video streams if (stream_exists(m_in.m_video.m_stream_idx) && m_current_format->video_codec() != AV_CODEC_ID_NONE) { m_active_stream_msk |= FFMPEGFS_VIDEO; if (!m_copy_video) { int ret; ret = add_stream(m_current_format->video_codec()); if (ret < 0) { return ret; } if (params.m_deinterlace) { // Init deinterlace filters ret = init_deinterlace_filters(m_in.m_video.m_codec_ctx.get(), m_in.m_pix_fmt, m_in.m_video.m_stream->avg_frame_rate, m_in.m_video.m_stream->time_base); if (ret < 0) { return ret; } } } else { int ret; Logging::info(virtname(), "Copying video stream."); ret = add_stream_copy(m_current_format->video_codec(), AVMEDIA_TYPE_VIDEO); if (ret < 0) { return ret; } } } // Open audio streams if (stream_exists(m_in.m_audio.m_stream_idx) && m_current_format->audio_codec() != AV_CODEC_ID_NONE) { m_active_stream_msk |= FFMPEGFS_AUDIO; if (!m_copy_audio) { int ret; ret = add_stream(m_current_format->audio_codec()); if (ret < 0) { return ret; } } else { int ret; Logging::info(virtname(), "Copying audio stream."); ret = add_stream_copy(m_current_format->audio_codec(), AVMEDIA_TYPE_AUDIO); if (ret < 0) { return ret; } } } if (stream_exists(m_in.m_video.m_stream_idx) && m_current_format->video_codec() != AV_CODEC_ID_NONE) { int ret; // Open subtitle streams if (m_in.m_subtitle.size()) { // No copy option, not worth it for a few frames // Create as many subtitle streams as required ret = add_subtitle_streams(); if (ret < 0) { return ret; } } // Open streams for external subtitle files ret = add_external_subtitle_streams(); if (ret < 0) { return ret; } } if (!params.m_noalbumarts && m_current_format->albumart_supported()) { for (StreamRef & album_art : m_in.m_album_art) { int ret; ret = add_albumart_stream(album_art.m_codec_ctx.get()); if (ret < 0) { return ret; } } } const int buf_size = 5*1024*1024; unsigned char *iobuffer = static_cast(av_malloc(buf_size + FF_INPUT_BUFFER_PADDING_SIZE)); if (iobuffer == nullptr) { Logging::error(virtname(), "Out of memory opening output file: Unable to allocate I/O buffer."); return AVERROR(ENOMEM); } // open the output file m_out.m_format_ctx->pb = avio_alloc_context( iobuffer, buf_size, 1, static_cast(buffer), nullptr, // read not required output_write, // write (m_current_format->audio_codec() != AV_CODEC_ID_OPUS) ? seek : nullptr); // seek if (m_out.m_format_ctx->pb == nullptr) { Logging::error(virtname(), "Out of memory opening output file: Unable to allocate format context."); return AVERROR(ENOMEM); } return 0; } int FFmpeg_Transcoder::add_subtitle_streams() { for (auto & [key, value] : m_in.m_subtitle) { AVCodecID codec_id = m_current_format->subtitle_codec(value.m_stream->codecpar->codec_id); // Get matching output codec if (codec_id == AV_CODEC_ID_NONE) { // No matching output codec continue; } if (map_in_to_out_stream(value.m_stream_idx) != INVALID_STREAM) { // Already existing continue; } //m_active_stream_msk |= FFMPEGFS_SUBTITLE; int ret; ret = add_subtitle_stream(codec_id, value); if (ret < 0) { return ret; } } return 0; } int FFmpeg_Transcoder::init_resampler() { // Fail save: if channel layout not known assume mono or stereo #if LAVU_DEP_OLD_CHANNEL_LAYOUT if (!m_in.m_audio.m_codec_ctx->ch_layout.nb_channels) { av_channel_layout_default(&m_in.m_audio.m_codec_ctx->ch_layout, 2); } #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT if (!m_in.m_audio.m_codec_ctx->channel_layout) { m_in.m_audio.m_codec_ctx->channel_layout = static_cast(av_get_default_channel_layout(m_in.m_audio.m_codec_ctx->channels)); } if (!m_in.m_audio.m_codec_ctx->channel_layout) { m_in.m_audio.m_codec_ctx->channel_layout = AV_CH_LAYOUT_STEREO; } #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT // Only initialise the resampler if it is necessary, i.e., // if and only if the sample formats differ. #if LAVU_DEP_OLD_CHANNEL_LAYOUT if (m_in.m_audio.m_codec_ctx->sample_fmt == m_out.m_audio.m_codec_ctx->sample_fmt && m_in.m_audio.m_codec_ctx->sample_rate == m_out.m_audio.m_codec_ctx->sample_rate && !av_channel_layout_compare(&m_in.m_audio.m_codec_ctx->ch_layout, &m_out.m_audio.m_codec_ctx->ch_layout)) #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT if (m_in.m_audio.m_codec_ctx->sample_fmt == m_out.m_audio.m_codec_ctx->sample_fmt && m_in.m_audio.m_codec_ctx->sample_rate == m_out.m_audio.m_codec_ctx->sample_rate && m_in.m_audio.m_codec_ctx->channel_layout == m_out.m_audio.m_codec_ctx->channel_layout) #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT { // Formats are same close_resample(); return 0; } if ((m_audio_resample_ctx == nullptr) || (m_cur_sample_fmt != m_in.m_audio.m_codec_ctx->sample_fmt) || (m_cur_sample_rate != m_in.m_audio.m_codec_ctx->sample_rate) || #if LAVU_DEP_OLD_CHANNEL_LAYOUT av_channel_layout_compare(&m_cur_ch_layout, &m_in.m_audio.m_codec_ctx->ch_layout)) #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT (m_cur_channel_layout != m_in.m_audio.m_codec_ctx->channel_layout)) #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT { int ret; #if LAVU_DEP_OLD_CHANNEL_LAYOUT Logging::debug(virtname(), "Creating audio resampler: %1 -> %2 / %3 -> %4 / %5 -> %6.", get_sample_fmt_name(m_in.m_audio.m_codec_ctx->sample_fmt).c_str(), get_sample_fmt_name(m_out.m_audio.m_codec_ctx->sample_fmt).c_str(), format_samplerate(m_in.m_audio.m_codec_ctx->sample_rate).c_str(), format_samplerate(m_out.m_audio.m_codec_ctx->sample_rate).c_str(), get_channel_layout_name(&m_in.m_audio.m_codec_ctx->ch_layout).c_str(), get_channel_layout_name(&m_out.m_audio.m_codec_ctx->ch_layout).c_str()); #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT Logging::debug(virtname(), "Creating audio resampler: %1 -> %2 / %3 -> %4 / %5 -> %6.", get_sample_fmt_name(m_in.m_audio.m_codec_ctx->sample_fmt).c_str(), get_sample_fmt_name(m_out.m_audio.m_codec_ctx->sample_fmt).c_str(), format_samplerate(m_in.m_audio.m_codec_ctx->sample_rate).c_str(), format_samplerate(m_out.m_audio.m_codec_ctx->sample_rate).c_str(), get_channel_layout_name(m_in.m_audio.m_codec_ctx->channels, m_in.m_audio.m_codec_ctx->channel_layout).c_str(), get_channel_layout_name(m_out.m_audio.m_codec_ctx->channels, m_out.m_audio.m_codec_ctx->channel_layout).c_str()); #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT close_resample(); m_cur_sample_fmt = m_in.m_audio.m_codec_ctx->sample_fmt; m_cur_sample_rate = m_in.m_audio.m_codec_ctx->sample_rate; #if LAVU_DEP_OLD_CHANNEL_LAYOUT av_channel_layout_copy(&m_cur_ch_layout, &m_in.m_audio.m_codec_ctx->ch_layout); #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT m_cur_channel_layout = m_in.m_audio.m_codec_ctx->channel_layout; #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT // Create a resampler context for the conversion. // Set the conversion parameters. #if SWR_DEP_ALLOC_SET_OPTS ret = swr_alloc_set_opts2(&m_audio_resample_ctx, &m_out.m_audio.m_codec_ctx->ch_layout, m_out.m_audio.m_codec_ctx->sample_fmt, m_out.m_audio.m_codec_ctx->sample_rate, &m_in.m_audio.m_codec_ctx->ch_layout, m_in.m_audio.m_codec_ctx->sample_fmt, m_in.m_audio.m_codec_ctx->sample_rate, 0, nullptr); if (ret < 0) { Logging::error(virtname(), "Could not allocate resample context (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } #else m_audio_resample_ctx = swr_alloc_set_opts(nullptr, static_cast(m_out.m_audio.m_codec_ctx->channel_layout), m_out.m_audio.m_codec_ctx->sample_fmt, m_out.m_audio.m_codec_ctx->sample_rate, static_cast(m_in.m_audio.m_codec_ctx->channel_layout), m_in.m_audio.m_codec_ctx->sample_fmt, m_in.m_audio.m_codec_ctx->sample_rate, 0, nullptr); if (m_audio_resample_ctx == nullptr) { Logging::error(virtname(), "Could not allocate a resample context."); return AVERROR(ENOMEM); } #endif // Open the resampler with the specified parameters. ret = swr_init(m_audio_resample_ctx); if (ret < 0) { Logging::error(virtname(), "Could not open resampler context (error '%1').", ffmpeg_geterror(ret).c_str()); swr_free(&m_audio_resample_ctx); m_audio_resample_ctx = nullptr; return ret; } } return 0; } int FFmpeg_Transcoder::init_audio_fifo() { // Create the audio FIFO buffer based on the specified output sample format. m_audio_fifo = av_audio_fifo_alloc(m_out.m_audio.m_codec_ctx->sample_fmt, get_channels(m_out.m_audio.m_codec_ctx.get()), 1); if (m_audio_fifo == nullptr) { Logging::error(virtname(), "Could not allocate an audio FIFO."); return AVERROR(ENOMEM); } return 0; } int FFmpeg_Transcoder::update_format(AVDictionary** dict, const PROFILE_OPTION_VEC &option_vec) const { int ret = 0; for (const PROFILE_OPTION & option : option_vec) { if ((option.m_options & OPT_AUDIO) && stream_exists(m_out.m_video.m_stream_idx)) { // Option for audio only, but file contains video stream continue; } if ((option.m_options & OPT_VIDEO) && !stream_exists(m_out.m_video.m_stream_idx)) { // Option for video, but file contains no video stream continue; } Logging::trace(virtname(), "Profile format option -%1%2%3.", option.m_key, *option.m_value ? " " : "", option.m_value); ret = dict_set_with_check(dict, option.m_key, option.m_value, option.m_flags, virtname()); if (ret < 0) { break; } } return ret; } int FFmpeg_Transcoder::prepare_format(AVDictionary** dict, FILETYPE filetype) const { int ret = 0; for (const PROFILE_LIST & profile : m_profile) { if (profile.m_filetype == filetype) { ret = AVERROR_OPTION_NOT_FOUND; // Once we found the file type, we also need to find the profile. Otherwise we have an invalid command line option. if (profile.m_profile == params.m_profile) { ret = update_format(dict, profile.m_option_format); break; } } } if (filetype == FILETYPE::MP4 || filetype == FILETYPE::PRORES || filetype == FILETYPE::TS || filetype == FILETYPE::HLS) { // All dict_set_with_check(dict, "flags:a", "+global_header", 0, virtname()); dict_set_with_check(dict, "flags:v", "+global_header", 0, virtname()); } return ret; } int FFmpeg_Transcoder::create_fake_wav_header() const { // Insert fake WAV header (fill in size fields with estimated values instead of setting to -1) AVIOContext * output_io_context = static_cast(m_out.m_format_ctx->pb); Buffer *buffer = static_cast(output_io_context->opaque); size_t current_offset = buffer->tell(); size_t read_offset = 0; WAV_HEADER wav_header; WAV_LIST_HEADER list_header; WAV_DATA_HEADER data_header; buffer->copy(reinterpret_cast(&wav_header), 0, sizeof(WAV_HEADER)); read_offset = sizeof(WAV_HEADER); if (wav_header.m_audio_format == 0xfffe) { //WAV_HEADER_EX wav_header_ex; WAV_FACT wav_fact; //buffer->copy(reinterpret_cast(&wav_header_ex), read_offset, sizeof(WAV_HEADER_EX)); read_offset += sizeof(WAV_HEADER_EX); // Need to skip extension header // Check for presence of "fact" chunk buffer->copy(reinterpret_cast(&wav_fact), read_offset, sizeof(WAV_FACT)); if (!memcmp(&wav_fact.m_chunk_id, "fact", sizeof(wav_fact.m_chunk_id))) { read_offset += sizeof(WAV_FACT); // Also skip fact header } } // Read list header buffer->copy(reinterpret_cast(&list_header), read_offset, sizeof(WAV_LIST_HEADER)); read_offset += sizeof(WAV_LIST_HEADER) + list_header.m_data_bytes - 4; // Read data header buffer->copy(reinterpret_cast(&data_header), read_offset, sizeof(WAV_DATA_HEADER)); // Fill in size fields with predicted size wav_header.m_wav_size = static_cast(predicted_filesize() - 8); data_header.m_data_bytes = static_cast(predicted_filesize() - (read_offset + sizeof(WAV_DATA_HEADER))); #if __BYTE_ORDER == __BIG_ENDIAN wav_header.m_wav_size = __builtin_bswap32(wav_header.m_wav_size); data_header.m_data_bytes = __builtin_bswap32(data_header.m_data_bytes); #endif // Write updated wav header buffer->seek(0, SEEK_SET); buffer->writeio(reinterpret_cast(&wav_header), sizeof(WAV_HEADER)); // Write updated data header buffer->seek(static_cast(read_offset), SEEK_SET); buffer->writeio(reinterpret_cast(&data_header), sizeof(WAV_DATA_HEADER)); // Restore write position buffer->seek(static_cast(current_offset), SEEK_SET); return 0; } int FFmpeg_Transcoder::read_aiff_chunk(Buffer *buffer, size_t *buffoffset, const char *ID, uint8_t *chunk, size_t *size) const { AIFF_CHUNK *p = reinterpret_cast(chunk); size_t buffsize = *size; for (;;) { if (!buffer->copy(chunk, *buffoffset, buffsize)) { return -1; } if (buffer->eof()) { errno = 0; return -1; } if (!memcmp(&p->m_ckID, AIFF_FORMID, sizeof(p->m_ckID))) { // Special case: FormChunk has a fixed size *size = sizeof(AIFF_FORMCHUNK); } else { #if __BYTE_ORDER == __BIG_ENDIAN *size = p->m_ckSize + 8; #else *size = __builtin_bswap32(p->m_ckSize) + 8; #endif } if (!memcmp(&p->m_ckID, ID, sizeof(p->m_ckID))) { // Found break; } // Advance to next potential position *buffoffset += *size; } return 0; } int FFmpeg_Transcoder::create_fake_aiff_header() const { // Insert fake WAV header (fill in size fields with estimated values instead of setting to -1) AVIOContext * output_io_context = static_cast(m_out.m_format_ctx->pb); Buffer *buffer = static_cast(output_io_context->opaque); size_t current_offset = buffer->tell(); size_t read_offset = 0; size_t size; AIFF_FORMCHUNK form_chunk; AIFF_COMMONCHUNK common_chunk; size = sizeof(form_chunk); if (read_aiff_chunk(buffer, &read_offset, AIFF_FORMID, reinterpret_cast(&form_chunk), &size)) { return -1; } read_offset += size; form_chunk.m_ckSize = static_cast(predicted_filesize() - 8); #if __BYTE_ORDER != __BIG_ENDIAN form_chunk.m_ckSize = __builtin_bswap32(form_chunk.m_ckSize); #endif size = sizeof(common_chunk); if (read_aiff_chunk(buffer, &read_offset, AIFF_COMMONID, reinterpret_cast(&common_chunk), &size)) { return -1; } read_offset += size; AIFF_SOUNDDATACHUNK sounddata_chunk; size = sizeof(sounddata_chunk); if (read_aiff_chunk(buffer, &read_offset, AIFF_SOUNDATAID, reinterpret_cast(&sounddata_chunk), &size)) { return -1; } sounddata_chunk.m_ckSize = static_cast(predicted_filesize() - read_offset); #if __BYTE_ORDER != __BIG_ENDIAN sounddata_chunk.m_ckSize = __builtin_bswap32(sounddata_chunk.m_ckSize); #endif // Write updated AIFF header buffer->seek(0, SEEK_SET); buffer->writeio(reinterpret_cast(&form_chunk), sizeof(form_chunk)); // Write updated data header buffer->seek(static_cast(read_offset), SEEK_SET); buffer->writeio(reinterpret_cast(&sounddata_chunk), sizeof(sounddata_chunk)); // Restore write position buffer->seek(static_cast(current_offset), SEEK_SET); return 0; } int FFmpeg_Transcoder::write_output_file_header() { AVDictionary* dict = nullptr; int ret; ret = prepare_format(&dict, m_out.m_filetype); if (ret < 0) { return ret; } ret = avformat_write_header(m_out.m_format_ctx, &dict); if (ret < 0) { Logging::error(virtname(), "Could not write output file header (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } switch (m_current_format->filetype()) { case FILETYPE::WAV: { ret = create_fake_wav_header(); break; } case FILETYPE::AIFF: { ret = create_fake_aiff_header(); break; } default: { break; } } return ret; } int FFmpeg_Transcoder::alloc_picture(AVFrame *frame, AVPixelFormat pix_fmt, int width, int height) const { int ret; frame->format = pix_fmt; frame->width = width; frame->height = height; // allocate the buffers for the frame data ret = av_frame_get_buffer(frame, 32); if (ret < 0) { Logging::error(virtname(), "Could not allocate frame data (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } return 0; } int FFmpeg_Transcoder::decode(AVCodecContext *codec_ctx, AVFrame *frame, int *got_frame, const AVPacket *pkt) const { int ret; *got_frame = 0; if (pkt != nullptr) { ret = avcodec_send_packet(codec_ctx, pkt); if (ret < 0 && ret != AVERROR_EOF) { // In particular, we don't expect AVERROR(EAGAIN), because we read all // decoded frames with avcodec_receive_frame() until done, so this should be handled // as an error. if (ret == AVERROR(EAGAIN)) { ret = AVERROR_EXTERNAL; } if (is_audio_stream(pkt->stream_index) && stream_exists(m_out.m_audio.m_stream_idx)) { Logging::error(filename(), "Could not send audio packet at PTS=%1 to decoder (error '%2').", ffmpeg_rescale_q(pkt->pts, m_in.m_audio.m_stream->time_base), ffmpeg_geterror(ret).c_str()); } else if (is_video_stream(pkt->stream_index) && stream_exists(m_out.m_video.m_stream_idx)) { Logging::error(filename(), "Could not send video packet at PTS=%1 to decoder (error '%2').", ffmpeg_rescale_q(pkt->pts, m_in.m_video.m_stream->time_base), ffmpeg_geterror(ret).c_str()); } else { // Should never come here, but what the heck... Logging::error(filename(), "Could not send packet at PTS=%1 to decoder (error '%2').", pkt->pts, ffmpeg_geterror(ret).c_str()); } return ret; } } ret = avcodec_receive_frame(codec_ctx, frame); if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) { Logging::error(filename(), "Could not receive packet from decoder (error '%1').", ffmpeg_geterror(ret).c_str()); } /** * @note Only after the first hardware decoded video packet arrived we have a * @note hardware frame context. * @note We should create the output stream now, open a codec etc. and call * @note hwframe_ctx_set. */ *got_frame = (ret >= 0) ? 1 : 0; return ret; } int FFmpeg_Transcoder::decode_audio_frame(AVPacket *pkt, int *decoded) { int data_present = 0; int ret = 0; *decoded = 0; // Decode the audio frame stored in the temporary packet. // The input audio stream decoder is used to do this. // If we are at the end of the file, pass an empty packet to the decoder // to flush it. // Since FFMpeg version >= 3.2 this is deprecated bool again = false; data_present = 0; // read all the output frames (in general there may be any number of them) while (ret >= 0) { FFmpeg_Frame frame(m_out.m_audio.m_stream_idx); ret = frame.res(); if (ret < 0) { Logging::error(filename(), "Could not decode audio frame (error '%1').", ffmpeg_geterror(ret).c_str()); break; } ret = decode(m_in.m_audio.m_codec_ctx.get(), frame, &data_present, again ? nullptr : pkt); if (!data_present) { break; } if (ret < 0) { // Anything else is an error, report it! Logging::error(filename(), "Could not decode audio frame (error '%1').", ffmpeg_geterror(ret).c_str()); break; } again = true; *decoded += pkt->size; // If there is decoded data, convert and store it if (frame->nb_samples) { // Temporary storage for the converted input samples. uint8_t **converted_input_samples = nullptr; try { int nb_output_samples; // Initialise the resampler to be able to convert audio sample formats. ret = init_resampler(); if (ret) { throw ret; } nb_output_samples = (m_audio_resample_ctx != nullptr) ? swr_get_out_samples(m_audio_resample_ctx, frame->nb_samples) : frame->nb_samples; // Store audio frame // Initialise the temporary storage for the converted input samples. ret = init_converted_samples(&converted_input_samples, nb_output_samples); if (ret < 0) { throw ret; } // Convert the input samples to the desired output sample format. // This requires a temporary storage provided by converted_input_samples. ret = convert_samples(frame->extended_data, frame->nb_samples, converted_input_samples, &nb_output_samples); if (ret < 0) { throw ret; } // Add the converted input samples to the audio FIFO buffer for later processing. ret = add_samples_to_fifo(converted_input_samples, nb_output_samples); if (ret < 0) { throw ret; } ret = 0; } catch (int _ret) { ret = _ret; } if (converted_input_samples != nullptr) { av_freep(&converted_input_samples[0]); av_free(converted_input_samples); } } } return ret; } int FFmpeg_Transcoder::decode_video_frame(AVPacket *pkt, int *decoded) { int data_present; int ret = 0; *decoded = 0; // NOTE1: some codecs are stream based (mpegvideo, mpegaudio) // and this is the only method to use them because you cannot // know the compressed data size before analysing it. // BUT some other codecs (msmpeg4, mpeg4) are inherently frame // based, so you must call them with all the data for one // frame exactly. You must also initialise 'width' and // 'height' before initialising them. // NOTE2: some codecs allow the raw parameters (frame size, // sample rate) to be changed at any frame. We handle this, so // you should also take care of it // Since FFMpeg version >= 3.2 this is deprecated bool again = false; data_present = 0; // read all the output frames (in general there may be any number of them) while (ret >= 0) { FFmpeg_Frame frame(m_out.m_video.m_stream_idx); ret = frame.res(); if (ret < 0) { Logging::error(filename(), "Could not decode video frame (error '%1').", ffmpeg_geterror(ret).c_str()); break; } ret = decode(m_in.m_video.m_codec_ctx.get(), frame, &data_present, again ? nullptr : pkt); if (!data_present) { // No data available break; } if (ret < 0) { // Anything else is an error, report it! Logging::error(filename(), "Could not decode video frame (error '%1').", ffmpeg_geterror(ret).c_str()); break; } if (m_hwaccel_enable_dec_buffering && frame != nullptr) { FFmpeg_Frame sw_frame(m_out.m_video.m_stream_idx); ret = sw_frame.res(); if (ret < 0) { Logging::error(filename(), "Could not decode video frame (error '%1').", ffmpeg_geterror(ret).c_str()); break; } // If decoding is done in hardware, the resulting frame data needs to be copied to software memory //ret = hwframe_copy_from_hw(m_in.m_video.m_codec_ctx.get(), &sw_frame, frame); // retrieve data from GPU to CPU ret = av_hwframe_transfer_data(sw_frame, frame, 0); // hwframe_copy_from_hw if (ret < 0) { Logging::error(filename(), "Error transferring the data to system memory (error '%1').", ffmpeg_geterror(ret).c_str()); break; } frame = sw_frame; } again = true; *decoded += pkt->size; // Sometimes only a few packets contain valid dts/pts/pos data, so we keep it if (pkt->dts != AV_NOPTS_VALUE) { int64_t pkt_dts = pkt->dts; if (pkt_dts > m_pts) { m_pts = pkt_dts; } } else if (pkt->pts != AV_NOPTS_VALUE) { int64_t pkt_pts = pkt->pts; if (pkt_pts > m_pts) { m_pts = pkt_pts; } } if (pkt->pos > -1) { m_pos = pkt->pos; } if (frame != nullptr) { if (!(frame->flags & AV_FRAME_FLAG_CORRUPT || frame->flags & AV_FRAME_FLAG_DISCARD)) { ret = send_filters(&frame, ret); if (ret) { break; } if (m_sws_ctx != nullptr) { FFmpeg_Frame tmp_frame(m_out.m_video.m_stream_idx); ret = tmp_frame.res(); if (ret < 0) { Logging::error(filename(), "Could not decode video frame (error '%1').", ffmpeg_geterror(ret).c_str()); break; } AVCodecContext *output_codec_ctx = m_out.m_video.m_codec_ctx.get(); ret = alloc_picture(tmp_frame, m_out.m_pix_fmt, output_codec_ctx->width, output_codec_ctx->height); if (ret < 0) { break; } sws_scale(m_sws_ctx, static_cast(frame->data), frame->linesize, 0, frame->height, tmp_frame->data, tmp_frame->linesize); tmp_frame->pts = frame->pts; tmp_frame->best_effort_timestamp = frame->best_effort_timestamp; frame = tmp_frame; } int64_t best_effort_timestamp = frame->best_effort_timestamp; if (best_effort_timestamp != AV_NOPTS_VALUE) { frame->pts = best_effort_timestamp; } if (frame->pts == AV_NOPTS_VALUE) { frame->pts = m_pts; } int64_t video_start_time = m_out.m_video.m_start_time; if (m_out.m_video.m_stream != nullptr && frame->pts != AV_NOPTS_VALUE) { if (m_in.m_video.m_stream->time_base.den != m_out.m_video.m_stream->time_base.den || m_in.m_video.m_stream->time_base.num != m_out.m_video.m_stream->time_base.num) { frame->pts = ffmpeg_rescale_q_rnd(frame->pts, m_in.m_video.m_stream->time_base, m_out.m_video.m_stream->time_base); video_start_time = ffmpeg_rescale_q_rnd(video_start_time, m_in.m_video.m_stream->time_base, m_out.m_video.m_stream->time_base); } // Fix for issue #46: bitrate too high. // Solution found here https://stackoverflow.com/questions/11466184/setting-video-bit-rate-through-ffmpeg-api-is-ignored-for-libx264-codec // This is permanently used in the current ffmpeg.c code (see commit: e3fb9af6f1353f30855eaa1cbd5befaf06e303b8 Date:Wed Jan 22 15:52:10 2020 +0100) frame->pts = ffmpeg_rescale_q_rnd(frame->pts, m_out.m_video.m_stream->time_base, m_out.m_video.m_codec_ctx->time_base); video_start_time = ffmpeg_rescale_q_rnd(video_start_time, m_out.m_video.m_stream->time_base, m_out.m_video.m_codec_ctx->time_base); } frame->quality = m_out.m_video.m_codec_ctx->global_quality; #if !LAVU_ADD_NEW_FRAME_FLAGS frame->key_frame = 0; // Leave that decision to encoder #endif frame->pict_type = AV_PICTURE_TYPE_NONE; // other than AV_PICTURE_TYPE_NONE causes warnings if (frame->pts != AV_NOPTS_VALUE) { int64_t tmp_pts = frame->pts - video_start_time; int64_t pos = ffmpeg_rescale_q_rnd(tmp_pts, m_out.m_video.m_codec_ctx->time_base); if (pos < 0) { pos = 0; } if (is_hls()) { // Issue #90: Insert key frame at start of each subsequent HLS segment uint32_t next_segment = get_next_segment(pos); if (goto_next_segment(next_segment) && !m_insert_keyframe) { Logging::debug(virtname(), "Force key frame for next segment no. %1 at PTS=%2 (%3).", next_segment, tmp_pts, format_duration(pos).c_str()); #if LAVU_ADD_NEW_FRAME_FLAGS frame->flags |= AV_FRAME_FLAG_KEY; // This is required to reset the GOP counter (insert the next key frame after gop_size frames) #else // !LAVU_ADD_NEW_FRAME_FLAGS frame->key_frame = 1; // This is required to reset the GOP counter (insert the next key frame after gop_size frames) #endif // !LAVU_ADD_NEW_FRAME_FLAGS frame->pict_type = AV_PICTURE_TYPE_I; m_insert_keyframe = true; } } m_frame_map.insert(std::make_pair(pos, frame)); } else { m_frame_map.insert(std::make_pair(0, frame)); } } } } return ret; } int FFmpeg_Transcoder::decode_subtitle(AVPacket *pkt, int *decoded) { StreamRef_map::const_iterator it = m_in.m_subtitle.find(pkt->stream_index); *decoded = 0; if (it == m_in.m_subtitle.cend()) { // Should never happen, this should never be called with anything else than subtitle packets. int ret = AVERROR_STREAM_NOT_FOUND; Logging::error(filename(), "INTERNAL ERROR: FFmpeg_Transcoder::decode_subtitle()! Subtitle stream #%1 not found (error '%2').", ffmpeg_geterror(ret).c_str()); return ret; } // Decode the audio frame stored in the temporary packet. // The input audio stream decoder is used to do this. // If we are at the end of the file, pass an empty packet to the decoder // to flush it. // Temporary storage of the input samples of the frame read from the file. int out_stream_idx = map_in_to_out_stream(it->first); if (out_stream_idx == INVALID_STREAM) { Logging::error(virtname(), "INTERNAL ERROR: FFmpeg_Transcoder::decode_subtitle()! Unable to map input subtitle stream #%1 to output stream.", it->first); throw AVERROR(EINVAL); } return decode_subtitle(it->second.m_codec_ctx.get(), pkt, decoded, out_stream_idx); } int FFmpeg_Transcoder::decode_subtitle(AVCodecContext *codec_ctx, AVPacket *pkt, int *decoded, int out_stream_idx) { FFmpeg_Subtitle subtitle(out_stream_idx); int data_present = 0; int ret = 0; *decoded = 0; ret = subtitle.res(); if (ret < 0) { Logging::error(filename(), "Could not decode subtitle (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } ret = avcodec_decode_subtitle2(codec_ctx, subtitle, &data_present, pkt); if (ret < 0 && ret != AVERROR(EINVAL)) { Logging::error(filename(), "Could not decode subtitle frame (error '%1').", ffmpeg_geterror(ret).c_str()); data_present = 0; } else { *decoded = ret; ret = 0; } if (data_present) { // If there is decoded data, store it // sub->pts is already in AV_TIME_BASE m_frame_map.insert(std::make_pair(subtitle->pts, subtitle)); } return ret; } int FFmpeg_Transcoder::store_packet(AVPacket *pkt, AVMediaType mediatype) { if (is_hls() && pkt->pts != AV_NOPTS_VALUE) { switch (mediatype) { case AVMEDIA_TYPE_AUDIO: { int64_t pos = ffmpeg_rescale_q_rnd(pkt->pts - m_out.m_audio.m_start_time, m_out.m_audio.m_stream->time_base); if (pos < 0) { pos = 0; } uint32_t next_segment = get_next_segment(pos); if (goto_next_segment(next_segment)) { if (!(m_inhibit_stream_msk & FFMPEGFS_AUDIO)) { m_inhibit_stream_msk |= FFMPEGFS_AUDIO; Logging::trace(virtname(), "Buffering audio packets until the next segment no. %1 from position %2 (%3).", next_segment, pos, format_duration(pos).c_str()); } m_hls_packet_fifo.push(av_packet_clone(pkt)); return 0; } break; } case AVMEDIA_TYPE_VIDEO: { int64_t pos = ffmpeg_rescale_q_rnd(pkt->pts - m_out.m_video.m_start_time, m_out.m_video.m_stream->time_base); if (pos < 0) { pos = 0; } uint32_t next_segment = get_next_segment(pos); if (goto_next_segment(next_segment)) { if (!(m_inhibit_stream_msk & FFMPEGFS_VIDEO)) { m_inhibit_stream_msk |= FFMPEGFS_VIDEO; Logging::trace(virtname(), "Buffering video packets until the next segment no. %1 from position %2 (%3).", next_segment, pos, format_duration(pos).c_str()); } m_hls_packet_fifo.push(av_packet_clone(pkt)); return 0; } break; } case AVMEDIA_TYPE_SUBTITLE: { StreamRef * subtitle = get_out_subtitle_stream(pkt->stream_index); if (subtitle != nullptr && subtitle->m_stream != nullptr) { int64_t pos = ffmpeg_rescale_q_rnd(pkt->pts - subtitle->m_start_time, subtitle->m_stream->time_base); if (pos < 0) { pos = 0; } uint32_t next_segment = get_next_segment(pos); if (goto_next_segment(next_segment)) { m_hls_packet_fifo.push(av_packet_clone(pkt)); return 0; } } break; } default: { break; } } } int ret = av_write_frame(m_out.m_format_ctx, pkt); if (ret < 0) { const char *type; if (mediatype != AVMEDIA_TYPE_ATTACHMENT) { type = av_get_media_type_string(mediatype); if (type == nullptr) { type = "unknown"; } } else { type = "album art"; } Logging::error(virtname(), "Could not write %1 frame (error '%2').", type, ffmpeg_geterror(ret).c_str()); } return ret; } void FFmpeg_Transcoder::make_pts(AVPacket *pkt, int64_t *cur_ts) const { if (pkt->pts != AV_NOPTS_VALUE) { *cur_ts = pkt->pts + pkt->duration; } else if (pkt->dts != AV_NOPTS_VALUE) { *cur_ts = pkt->dts; } if (pkt->duration) { if (pkt->pts == AV_NOPTS_VALUE) { pkt->pts = *cur_ts; } *cur_ts += pkt->duration; if (pkt->dts == AV_NOPTS_VALUE) { pkt->dts = *cur_ts; } } } int FFmpeg_Transcoder::decode_frame(AVPacket *pkt) { int ret = 0; if (m_in.m_audio.m_stream != nullptr && is_audio_stream(pkt->stream_index) && stream_exists(m_out.m_audio.m_stream_idx)) { if (m_reset_pts & FFMPEGFS_AUDIO && pkt->pts != AV_NOPTS_VALUE) { m_reset_pts &= ~FFMPEGFS_AUDIO; // Clear reset bit int64_t pkt_pts = ffmpeg_rescale_q(pkt->pts, m_in.m_audio.m_stream->time_base); m_out.m_audio_pts = ffmpeg_rescale_q(pkt_pts, av_get_time_base_q(), m_out.m_audio.m_stream->time_base); Logging::debug(virtname(), "Reset the PTS from the audio packet to %1.", format_duration(pkt_pts).c_str()); } if (!m_copy_audio) { int decoded = 0; ret = decode_audio_frame(pkt, &decoded); } else { // Simply copy packet without recoding pkt->stream_index = m_out.m_audio.m_stream_idx; // Rescale packet av_packet_rescale_ts(pkt, m_in.m_audio.m_stream->time_base, m_out.m_audio.m_stream->time_base); // Make PTS/DTS if missing make_pts(pkt, &m_cur_audio_ts); pkt->pos = -1; ret = store_packet(pkt, AVMEDIA_TYPE_AUDIO); } } else if (m_in.m_video.m_stream != nullptr && is_video_stream(pkt->stream_index) && (stream_exists(m_out.m_video.m_stream_idx) || is_frameset())) { if (m_reset_pts & FFMPEGFS_VIDEO && pkt->pts != AV_NOPTS_VALUE) { m_reset_pts &= ~FFMPEGFS_VIDEO; // Clear reset bit int64_t pkt_pts = ffmpeg_rescale_q(pkt->pts, m_in.m_video.m_stream->time_base); m_out.m_video_pts = ffmpeg_rescale_q(pkt_pts, av_get_time_base_q(), m_out.m_video.m_stream->time_base); Logging::debug(virtname(), "Reset PTS from the video packet to %1.", format_duration(pkt_pts).c_str()); } if (!m_copy_video) { int decoded = 0; /** * @todo Calling decode_video_frame until all data has been used, but for * DVDs only. Can someone tell me why this seems required??? If this is not * done some videos become garbled. But only for DVDs... @n * @n * With fix: all DVDs OK, some Blurays (e.g. Phil Collins) not... @n * With fix: all DVDs shitty, but Blurays OK. @n * @n * Applying fix for DVDs only. */ #ifndef USE_LIBDVD ret = decode_video_frame(pkt, &decoded); #else //USE_LIBDVD if (m_virtualfile->m_type != VIRTUALTYPE::DVD) { ret = decode_video_frame(pkt, &decoded); } else { int lastret = 0; do { // Decode one frame. ret = decode_video_frame(pkt, &decoded); if ((ret == AVERROR(EAGAIN) && ret == lastret) || ret == AVERROR_EOF) { // If EAGAIN reported twice or stream at EOF // quit loop, but this is not an error // (must process all streams). break; } if (ret < 0 && ret != AVERROR(EAGAIN)) { Logging::error(filename(), "Could not decode video frame (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } lastret = ret; pkt->data += decoded; pkt->size -= decoded; } while (pkt->size > 0 && (ret == 0 || ret == AVERROR(EAGAIN))); ret = 0; } #endif // USE_LIBDVD } else { // Simply copy packet without recoding pkt->stream_index = m_out.m_video.m_stream_idx; // Rescale packet av_packet_rescale_ts(pkt, m_in.m_video.m_stream->time_base, m_out.m_video.m_stream->time_base); // Make PTS/DTS if missing make_pts(pkt, &m_cur_video_ts); pkt->pos = -1; ret = store_packet(pkt, AVMEDIA_TYPE_VIDEO); } } else if (is_subtitle_stream(pkt->stream_index)) { // Decode subtitle. No copy option available. int decoded = 0; ret = decode_subtitle(pkt, &decoded); } else { // Finally process album arts switch (m_in.m_format_ctx->streams[pkt->stream_index]->codecpar->codec_type) { case AVMEDIA_TYPE_VIDEO: { for (size_t n = 0; n < m_in.m_album_art.size() && n < m_out.m_album_art.size(); n++) { AVStream *input_stream = m_in.m_album_art.at(n).m_stream; // AV_DISPOSITION_ATTACHED_PIC streams already processed in process_albumarts() if (pkt->stream_index == input_stream->index && !(input_stream->disposition & AV_DISPOSITION_ATTACHED_PIC)) { AVStream *output_stream = m_out.m_album_art.at(n).m_stream; ret = add_albumart_frame(output_stream, pkt); break; } } break; } default: { break; } } } // If decoding errors should be ignored by command line, reset return code. // Exemptions that need to be passed on anyway: // * EAGAIN tells the caller to retry, this is not an error // * AVERROR_EXTERNAL is an unrecoverable error and should be handled if (!params.m_decoding_errors && ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EXTERNAL) { // Ignore error, go on with transcoding ret = 0; } return ret; } int FFmpeg_Transcoder::init_converted_samples(uint8_t ***converted_input_samples, int frame_size) { int ret; // Allocate as many pointers as there are audio channels. // Each pointer will later point to the audio samples of the corresponding // channels (although it may be nullptr for interleaved formats). *converted_input_samples = static_cast(av_calloc(static_cast(get_channels(m_out.m_audio.m_codec_ctx.get())), sizeof(**converted_input_samples))); if (*converted_input_samples == nullptr) { Logging::error(virtname(), "Could not allocate converted input sample pointers."); return AVERROR(ENOMEM); } // Allocate memory for the samples of all channels in one consecutive // block for convenience. ret = av_samples_alloc(*converted_input_samples, nullptr, get_channels(m_out.m_audio.m_codec_ctx.get()), frame_size, m_out.m_audio.m_codec_ctx->sample_fmt, 0); if (ret < 0) { Logging::error(virtname(), "Could not allocate converted input samples (error '%1').", ffmpeg_geterror(ret).c_str()); av_freep(&(*converted_input_samples)[0]); av_free(*converted_input_samples); return ret; } return 0; } int FFmpeg_Transcoder::convert_samples(uint8_t **input_data, int in_samples, uint8_t **converted_data, int *out_samples) { if (m_audio_resample_ctx != nullptr) { int ret; // Convert the samples using the resampler. ret = swr_convert(m_audio_resample_ctx, converted_data, *out_samples, const_cast(input_data), in_samples); if (ret < 0) { Logging::error(virtname(), "Could not convert input samples (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } *out_samples = ret; } else { *out_samples = in_samples; // No resampling, just copy samples if (!av_sample_fmt_is_planar(m_out.m_audio.m_codec_ctx->sample_fmt)) { // Interleaved format int samples = in_samples * av_get_bytes_per_sample(m_out.m_audio.m_codec_ctx->sample_fmt) * get_channels(m_in.m_audio.m_codec_ctx.get()); std::memcpy(converted_data[0], input_data[0], static_cast(samples)); } else { // Planar format int samples = in_samples * av_get_bytes_per_sample(m_out.m_audio.m_codec_ctx->sample_fmt); for (int n = 0; n < get_channels(m_out.m_audio.m_codec_ctx.get()); n++) { std::memcpy(converted_data[n], input_data[n], static_cast(samples)); } } } return 0; } int FFmpeg_Transcoder::add_samples_to_fifo(uint8_t **converted_input_samples, int frame_size) { int ret; // Make the audio FIFO as large as it needs to be to hold both, // the old and the new samples. ret = av_audio_fifo_realloc(m_audio_fifo, av_audio_fifo_size(m_audio_fifo) + frame_size); if (ret < 0) { Logging::error(virtname(), "Could not reallocate the audio FIFO."); return ret; } // Store the new samples in the audio FIFO buffer. ret = av_audio_fifo_write(m_audio_fifo, reinterpret_cast(converted_input_samples), frame_size); if (ret < frame_size) { if (ret < 0) { Logging::error(virtname(), "Could not write data to audio FIFO (error '%1').", ffmpeg_geterror(ret).c_str()); } else { Logging::error(virtname(), "Could not write data to audio FIFO."); } return AVERROR_EXIT; } return 0; } int FFmpeg_Transcoder::flush_frames_all(bool use_flush_packet) { int ret = 0; if (m_in.m_audio.m_codec_ctx != nullptr) { int ret2 = flush_frames_single(m_in.m_audio.m_stream_idx, use_flush_packet); if (ret2 < 0) { ret = ret2; } } if (m_in.m_video.m_codec_ctx != nullptr) { int ret2 = flush_frames_single(m_in.m_video.m_stream_idx, use_flush_packet); if (ret2 < 0) { ret = ret2; } } return ret; } int FFmpeg_Transcoder::flush_frames_single(int stream_idx, bool use_flush_packet) { int ret = 0; if (stream_exists(stream_idx)) { int (FFmpeg_Transcoder::*decode_frame_ptr)(AVPacket *pkt, int *decoded) = nullptr; if (!m_copy_audio && is_audio_stream(stream_idx) && stream_exists(m_out.m_audio.m_stream_idx)) { decode_frame_ptr = &FFmpeg_Transcoder::decode_audio_frame; } else if (!m_copy_video && is_video_stream(stream_idx) && (stream_exists(m_out.m_video.m_stream_idx) || is_frameset())) { decode_frame_ptr = &FFmpeg_Transcoder::decode_video_frame; } if (decode_frame_ptr != nullptr) { #if !LAVC_DEP_AV_INIT_PACKET AVPacket pkt; #endif // !LAVC_DEP_AV_INIT_PACKET AVPacket *flush_packet = nullptr; if (use_flush_packet) { #if LAVC_DEP_AV_INIT_PACKET flush_packet = av_packet_alloc(); #else // !LAVC_DEP_AV_INIT_PACKET flush_packet = &pkt; init_packet(flush_packet); #endif // !LAVC_DEP_AV_INIT_PACKET flush_packet->data = nullptr; flush_packet->size = 0; flush_packet->stream_index = stream_idx; } // cppcheck-suppress knownConditionTrueFalse for (int decoded = 1; decoded;) { ret = (this->*decode_frame_ptr)(flush_packet, &decoded); if (ret < 0 && ret != AVERROR(EAGAIN)) { break; } } av_packet_unref(flush_packet); #if LAVC_DEP_AV_INIT_PACKET av_packet_free(&flush_packet); #endif // LAVC_DEP_AV_INIT_PACKET } } return ret; } int FFmpeg_Transcoder::read_decode_convert_and_store(int *finished) { // Packet used for temporary storage. AVPacket pkt; int ret = 0; try { // Read one frame from the input file into a temporary packet. ret = av_read_frame(m_in.m_format_ctx, &pkt); if (ret < 0) { if (ret == AVERROR_EOF) { // If we are the the end of the file, flush the decoder below. *finished = 1; Logging::trace(virtname(), "Read input file to EOF."); } else { Logging::error(virtname(), "Could not read frame (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } } if (m_virtualfile->m_flags & VIRTUALFLAG_CUESHEET) { // Check for end of cue sheet track ///<* @todo Cue sheet track: Must check video stream, too and end if both all video and audio packets arrived. Discard packets exceeding duration. if (is_audio_stream(pkt.stream_index)) { int64_t pkt_pts = ffmpeg_rescale_q(pkt.pts, m_in.m_audio.m_stream->time_base); if (pkt_pts > m_virtualfile->m_cuesheet_track.m_start + m_virtualfile->m_cuesheet_track.m_duration) { Logging::trace(virtname(), "Read to end of track."); *finished = 1; ret = AVERROR_EOF; } } } if (!*finished) { // Decode one packet, at least with the old API (!LAV_NEW_PACKET_INTERFACE) // it seems a packet can contain more than one frame so loop around it // if necessary... ret = decode_frame(&pkt); if (ret < 0 && ret != AVERROR(EAGAIN)) { throw ret; } } else { // Flush cached frames, ignoring any errors flush_frames_all(true); } ret = 0; // Errors will be reported by exception } catch (int _ret) { ret = _ret; } av_packet_unref(&pkt); return ret; } int FFmpeg_Transcoder::init_audio_output_frame(AVFrame *frame, int frame_size) const { int ret; // // Set the frame's parameters, especially its size and format. // av_frame_get_buffer needs this to allocate memory for the // audio samples of the frame. // Default channel layouts based on the number of channels // are assumed for simplicity. frame->nb_samples = frame_size; #if LAVU_DEP_OLD_CHANNEL_LAYOUT ret = av_channel_layout_copy(&frame->ch_layout, &m_out.m_audio.m_codec_ctx->ch_layout); if (ret < 0) { Logging::error(virtname(), "Unable to copy channel layout (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT frame->channel_layout = m_out.m_audio.m_codec_ctx->channel_layout; #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT frame->format = m_out.m_audio.m_codec_ctx->sample_fmt; frame->sample_rate = m_out.m_audio.m_codec_ctx->sample_rate; // Allocate the samples of the created frame. This call will make // sure that the audio frame can hold as many samples as specified. // 29.05.2021: Let API decide about alignment. Should be properly set for the current CPU. ret = av_frame_get_buffer(frame, 0); if (ret < 0) { Logging::error(virtname(), "Could allocate output frame samples (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } return 0; } void FFmpeg_Transcoder::produce_audio_dts(AVPacket *pkt) { if (pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE) { // Normally we have already added the PTS to the frame when it was created. Just in case // this failed, and there are no valid PTS/DTS values, we add it here. int64_t pkt_duration; // Some encoders to not produce dts/pts. // So we make some up. if (pkt->duration) { pkt_duration = pkt->duration; #if !LAVC_DEP_TICKSPERFRAME // This has probably long since been fixed in FFmpeg, so we remove this completly // instead of replacing it with updated code. if (m_out.m_audio.m_codec_ctx->codec_id == AV_CODEC_ID_OPUS || m_current_format->filetype() == FILETYPE::TS || m_current_format->filetype() == FILETYPE::HLS) { /** @todo Is this a FFmpeg bug or am I too stupid? @n * OPUS is a bit strange. Whatever we feed into the encoder, the result will always be floating point planar * at 48 K sampling rate. @n * For some reason the duration calculated by the FFMpeg API is wrong. We have to rescale it to the correct value. * Same applies to mpegts, so let's rescale. */ if (pkt_duration > 0 && m_out.m_audio.m_stream->codecpar->sample_rate > 0) { pkt->duration = pkt_duration = static_cast(av_rescale(pkt_duration, static_cast(m_out.m_audio.m_stream->time_base.den) * m_out.m_audio.m_codec_ctx->ticks_per_frame, m_out.m_audio.m_stream->codecpar->sample_rate * static_cast(m_out.m_audio.m_stream->time_base.num))); } } #endif } else { pkt_duration = 1; } pkt->dts = m_out.m_audio_pts - 1; pkt->pts = m_out.m_audio_pts; m_out.m_audio_pts += pkt_duration; } } int FFmpeg_Transcoder::encode_audio_frame(const AVFrame *frame, int *data_present) { // Packet used for temporary storage. #if !LAVC_DEP_AV_INIT_PACKET AVPacket tmp_pkt; #endif // !LAVC_DEP_AV_INIT_PACKET AVPacket *pkt; int ret = 0; #if LAVC_DEP_AV_INIT_PACKET pkt = av_packet_alloc(); #else // !LAVC_DEP_AV_INIT_PACKET pkt = &tmp_pkt; init_packet(pkt); #endif // !LAVC_DEP_AV_INIT_PACKET try { // Encode the audio frame and store it in the temporary packet. // The output audio stream encoder is used to do this. *data_present = 0; // send the frame for encoding ret = avcodec_send_frame(m_out.m_audio.m_codec_ctx.get(), frame); if (ret < 0 && ret != AVERROR_EOF) { Logging::error(virtname(), "Could not encode audio frame (error %1').", ffmpeg_geterror(ret).c_str()); throw ret; } // read all the available output packets (in general there may be any number of them) while (ret >= 0) { *data_present = 0; ret = avcodec_receive_packet(m_out.m_audio.m_codec_ctx.get(), pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { throw ret; } else if (ret < 0) { Logging::error(virtname(), "Could not encode audio frame (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } *data_present = 1; // Write one audio frame from the temporary packet to the output buffer. { pkt->stream_index = m_out.m_audio.m_stream_idx; produce_audio_dts(pkt); ret = store_packet(pkt, AVMEDIA_TYPE_AUDIO); if (ret < 0) { throw ret; } } } av_packet_unref(pkt); } catch (int _ret) { av_packet_unref(pkt); ret = _ret; } #if LAVC_DEP_AV_INIT_PACKET av_packet_free(&pkt); #endif // LAVC_DEP_AV_INIT_PACKET return ret; } int FFmpeg_Transcoder::encode_image_frame(const AVFrame *frame, int *data_present) { *data_present = 0; if (frame == nullptr || m_skip_next_frame) { // This called internally to flush frames. We do not have a cache to flush, so simply ignore that. // After seek oprations we need to skip the first frame. m_skip_next_frame = false; return 0; } if (m_current_format == nullptr) { Logging::error(virtname(), "INTERNAL ERROR: FFmpeg_Transcoder::encode_image_frame()! Missing format."); return AVERROR(EINVAL); } if (m_buffer == nullptr) { Logging::error(virtname(), "INTERNAL ERROR: FFmpeg_Transcoder::encode_image_frame()! Cache not open."); return AVERROR(EINVAL); } #if !LAVC_DEP_AV_INIT_PACKET AVPacket tmp_pkt; #endif // !LAVC_DEP_AV_INIT_PACKET AVPacket *pkt = nullptr; int ret = 0; try { FFmpeg_Frame cloned_frame(frame); // Clone frame. Does not copy data but references it, only the properties are copied. Not a big memory impact. ret = cloned_frame.res(); if (ret < 0) { Logging::error(virtname(), "Could not encode image frame (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } #if LAVC_DEP_AV_INIT_PACKET pkt = av_packet_alloc(); #else // !LAVC_DEP_AV_INIT_PACKET pkt = &tmp_pkt; init_packet(pkt); #endif // !LAVC_DEP_AV_INIT_PACKET uint32_t frame_no = pts_to_frame(m_in.m_video.m_stream, frame->pts); if (m_current_format->video_codec() == AV_CODEC_ID_MJPEG) { // The MJEPG codec requires monotonically growing PTS values so we fake some to avoid them going backwards after seeks cloned_frame->pts = frame_to_pts(m_in.m_video.m_stream, ++m_fake_frame_no); } *data_present = 0; // send the frame for encoding ret = avcodec_send_frame(m_out.m_video.m_codec_ctx.get(), cloned_frame); if (ret < 0 && ret != AVERROR_EOF) { Logging::error(virtname(), "Could not encode image frame (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } // read all the available output packets (in general there may be any number of them while (ret >= 0) { *data_present = 0; ret = avcodec_receive_packet(m_out.m_video.m_codec_ctx.get(), pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { av_packet_unref(pkt); break; } else if (ret < 0) { Logging::error(virtname(), "Could not encode image frame (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } *data_present = 1; // Write one video frame from the temporary packet to the output buffer. { // Store current video PTS if (pkt->pts != AV_NOPTS_VALUE) { m_out.m_video_pts = pkt->pts; } m_buffer->write_frame(pkt->data, static_cast(pkt->size), frame_no); if (m_last_seek_frame_no == frame_no) // Skip frames until seek pos { m_last_seek_frame_no = 0; } } av_packet_unref(pkt); } } catch (int _ret) { av_packet_unref(pkt); ret = _ret; } #if LAVC_DEP_AV_INIT_PACKET av_packet_free(&pkt); #endif // LAVC_DEP_AV_INIT_PACKET return ret; } int FFmpeg_Transcoder::encode_video_frame(const AVFrame *frame, int *data_present) { if (m_out.m_video.m_stream == nullptr) { return 0; // ignore, avoid crash } // Packet used for temporary storage. if (frame != nullptr) { #if LAVU_ADD_NEW_FRAME_FLAGS if (frame->flags & AV_FRAME_FLAG_INTERLACED) { if (m_out.m_video.m_codec_ctx->codec->id == AV_CODEC_ID_MJPEG) { m_out.m_video.m_stream->codecpar->field_order = (frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST) ? AV_FIELD_TT : AV_FIELD_BB; } else { m_out.m_video.m_stream->codecpar->field_order = (frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST) ? AV_FIELD_TB : AV_FIELD_BT; } } #else // !LAVU_ADD_NEW_FRAME_FLAGS if (frame->interlaced_frame) { if (m_out.m_video.m_codec_ctx->codec->id == AV_CODEC_ID_MJPEG) { m_out.m_video.m_stream->codecpar->field_order = frame->top_field_first ? AV_FIELD_TT : AV_FIELD_BB; } else { m_out.m_video.m_stream->codecpar->field_order = frame->top_field_first ? AV_FIELD_TB : AV_FIELD_BT; } } #endif // !LAVU_ADD_NEW_FRAME_FLAGS else { m_out.m_video.m_stream->codecpar->field_order = AV_FIELD_PROGRESSIVE; } } #if !LAVC_DEP_AV_INIT_PACKET AVPacket tmp_pkt; #endif // !LAVC_DEP_AV_INIT_PACKET FFmpeg_Frame *hw_frame = nullptr; AVPacket *pkt = nullptr; int ret = 0; try { if (m_hwaccel_enable_enc_buffering && frame != nullptr) { hw_frame = new (std::nothrow) FFmpeg_Frame(m_out.m_video.m_stream_idx); if (hw_frame == nullptr) { ret = AVERROR(ENOMEM); Logging::error(virtname(), "Could not encode video frame at PTS=%1 (error %2').", ffmpeg_rescale_q(frame->pts, m_in.m_video.m_stream->time_base), ffmpeg_geterror(ret).c_str()); throw ret; } ret = hw_frame->res(); if (ret < 0) { Logging::error(virtname(), "Could not encode video frame at PTS=%1 (error %2').", ffmpeg_rescale_q(frame->pts, m_in.m_video.m_stream->time_base), ffmpeg_geterror(ret).c_str()); throw ret; } // If encoding is done in hardware, the resulting frame data needs to be copied to hardware ret = hwframe_copy_to_hw(m_out.m_video.m_codec_ctx.get(), hw_frame, frame); if (ret < 0) { throw ret; } frame = *hw_frame; // Copy, not clone! } #if LAVC_DEP_AV_INIT_PACKET pkt = av_packet_alloc(); #else // !LAVC_DEP_AV_INIT_PACKET pkt = &tmp_pkt; init_packet(pkt); #endif // !LAVC_DEP_AV_INIT_PACKET // Encode the video frame and store it in the temporary packet. // The output video stream encoder is used to do this. *data_present = 0; // send the frame for encoding ret = avcodec_send_frame(m_out.m_video.m_codec_ctx.get(), frame); if (ret < 0 && ret != AVERROR_EOF) { Logging::error(virtname(), "Could not encode video frame (error %1').", ffmpeg_geterror(ret).c_str()); throw ret; } // read all the available output packets (in general there may be any number of them while (ret >= 0) { *data_present = 0; ret = avcodec_receive_packet(m_out.m_video.m_codec_ctx.get(), pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { av_packet_unref(pkt); break; } else if (ret < 0) { Logging::error(virtname(), "Could not encode video frame (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } *data_present = 1; // Write one video frame from the temporary packet to the output buffer. { // Fix for issue #46: bitrate too high. av_packet_rescale_ts(pkt, m_out.m_video.m_codec_ctx->time_base, m_out.m_video.m_stream->time_base); if (!(m_out.m_format_ctx->oformat->flags & AVFMT_NOTIMESTAMPS)) { if (pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && m_out.m_last_mux_dts != AV_NOPTS_VALUE) { Logging::warning(virtname(), "Invalid DTS=%1 PTS=%2 in video output, replacing by guess.", pkt->dts, pkt->pts); pkt->pts = pkt->dts = pkt->pts + pkt->dts + m_out.m_last_mux_dts + 1 - FFMIN3(pkt->pts, pkt->dts, m_out.m_last_mux_dts + 1) - FFMAX3(pkt->pts, pkt->dts, m_out.m_last_mux_dts + 1); } if (pkt->dts != AV_NOPTS_VALUE && m_out.m_last_mux_dts != AV_NOPTS_VALUE) { int64_t max = m_out.m_last_mux_dts + !(m_out.m_format_ctx->oformat->flags & AVFMT_TS_NONSTRICT); // AVRational avg_frame_rate = { m_out.m_video.m_stream->avg_frame_rate.den, m_out.m_video.m_stream->avg_frame_rate.num }; // int64_t max = m_out.m_last_mux_dts + ffmpeg_rescale_q(1, avg_frame_rate, m_out.m_video.m_stream->time_base); if (pkt->dts < max) { Logging::trace(virtname(), "Non-monotonous DTS in video output stream; previous: %1, current: %2; changing to %3. This may result in incorrect timestamps in the output.", m_out.m_last_mux_dts, pkt->dts, max); if (pkt->pts >= pkt->dts) { pkt->pts = FFMAX(pkt->pts, max); } pkt->dts = max; } } } if (frame != nullptr && !pkt->duration) { #if !LAVU_DEP_PKT_DURATION pkt->duration = frame->pkt_duration; #else pkt->duration = frame->duration; #endif } if (pkt->pts != AV_NOPTS_VALUE) { m_out.m_video_pts = pkt->pts; m_out.m_last_mux_dts = (pkt->dts != AV_NOPTS_VALUE) ? pkt->dts : (pkt->pts - pkt->duration); } // Write packet to buffer ret = store_packet(pkt, AVMEDIA_TYPE_VIDEO); if (ret < 0) { throw ret; } } av_packet_unref(pkt); } } catch (int _ret) { if (pkt != nullptr) { av_packet_unref(pkt); } ret = _ret; } delete hw_frame; #if LAVC_DEP_AV_INIT_PACKET av_packet_free(&pkt); #endif // LAVC_DEP_AV_INIT_PACKET return ret; } int FFmpeg_Transcoder::encode_subtitle(const AVSubtitle *sub, int out_stream_idx, int *data_present) { StreamRef * out_streamref = get_out_subtitle_stream(out_stream_idx); *data_present = 0; if (out_streamref == nullptr) { Logging::error(virtname(), "INTERNAL ERROR: FFmpeg_Transcoder::encode_subtitle()! Invalid stream index #%1.", out_stream_idx); return AVERROR(EINVAL); } // Packet used for temporary storage. #if !LAVC_DEP_AV_INIT_PACKET AVPacket tmp_pkt; #endif // !LAVC_DEP_AV_INIT_PACKET AVPacket *pkt; int ret = 0; #if LAVC_DEP_AV_INIT_PACKET pkt = av_packet_alloc(); #else // !LAVC_DEP_AV_INIT_PACKET pkt = &tmp_pkt; init_packet(pkt); #endif // !LAVC_DEP_AV_INIT_PACKET AVSubtitle subtmp; // Make a local copy, we have to modify it std::memcpy(&subtmp, sub, sizeof(AVSubtitle)); try { int nb; int64_t sub_pts; if (subtmp.pts == AV_NOPTS_VALUE) { Logging::error(virtname(), "Subtitle packets must have a PTS (stream index #%1).", out_streamref->m_stream_idx); throw AVERROR(EINVAL); } // Allocate a packet with 1KB buffer, hope that's sufficient ret = av_new_packet(pkt, 1024 * 1024); if (ret < 0) { Logging::error(virtname(), "Failed to allocate new packet (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } // Note: DVB subtitles need one packet to draw them and one other packet to clear them if (out_streamref->m_codec_ctx->codec_id == AV_CODEC_ID_DVB_SUBTITLE) { nb = 2; } else { nb = 1; } // shift timestamp sub_pts = subtmp.pts; //if (out_streamref->m_stream->start_time != AV_NOPTS_VALUE) //{ // pts -= ffmpeg_rescale_q(out_streamref->m_stream->start_time, out_streamref->m_stream->time_base); //} for (int i = 0; i < nb; i++) { unsigned save_num_rects = subtmp.num_rects; subtmp.pts = sub_pts; // Some decoders may return end_display_time as UINT32_MAX, this causes strange results. if (subtmp.end_display_time == UINT32_MAX) { subtmp.end_display_time = 0; } // start_display_time is required to be 0 subtmp.pts += ffmpeg_rescale_q(subtmp.start_display_time, AVRational({ 1, 1000 })); subtmp.end_display_time -= subtmp.start_display_time; subtmp.start_display_time = 0; if (i == 1) { subtmp.num_rects = 0; } // The avcodec_encode_subtitle seems to be not completely ready ret = avcodec_encode_subtitle(out_streamref->m_codec_ctx.get(), pkt->data, pkt->size, &subtmp); if (i == 1) { subtmp.num_rects = save_num_rects; } if (ret < 0) { Logging::error(virtname(), "Could not encode subtitle frame (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } pkt->size = ret; pkt->pts = ffmpeg_rescale_q(subtmp.pts, av_get_time_base_q(), out_streamref->m_stream->time_base); pkt->duration = ffmpeg_rescale_q(subtmp.end_display_time, AVRational({ 1, 1000 }), out_streamref->m_stream->time_base); pkt->stream_index = out_streamref->m_stream_idx; if (out_streamref->m_codec_ctx->codec_id == AV_CODEC_ID_DVB_SUBTITLE) { // the pts correction is handled here. Maybe handling it in the codec would be better if (i) { pkt->pts += ffmpeg_rescale_q(subtmp.end_display_time, AVRational({ 1, 1000 }), out_streamref->m_stream->time_base); } } pkt->dts = pkt->pts; ret = store_packet(pkt, AVMEDIA_TYPE_SUBTITLE); if (ret < 0) { throw ret; } *data_present = 1; } av_packet_unref(pkt); } catch (int _ret) { av_packet_unref(pkt); ret = _ret; } #if LAVC_DEP_AV_INIT_PACKET av_packet_free(&pkt); #endif // LAVC_DEP_AV_INIT_PACKET return ret; } int FFmpeg_Transcoder::create_audio_frame(int frame_size) { // Temporary storage of the output samples of the frame written to the file. FFmpeg_Frame output_frame(m_out.m_audio.m_stream_idx); int ret = 0; ret = output_frame.res(); if (ret < 0) { Logging::error(virtname(), "Could not read data from the audio FIFO (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } // Use the maximum number of possible samples per frame. // If there is less than the maximum possible frame size in the audio FIFO // buffer use this number. Otherwise, use the maximum possible frame size frame_size = FFMIN(av_audio_fifo_size(m_audio_fifo), frame_size); // Initialise temporary storage for one output frame. ret = init_audio_output_frame(output_frame, frame_size); if (ret < 0) { return ret; } // Read as many samples from the FIFO buffer as required to fill the frame. // The samples are stored in the frame temporarily. ret = av_audio_fifo_read(m_audio_fifo, reinterpret_cast(output_frame->data), frame_size); if (ret < frame_size) { if (ret < 0) { Logging::error(virtname(), "Could not read data from the audio FIFO (error '%1').", ffmpeg_geterror(ret).c_str()); } else { Logging::error(virtname(), "Could not read data from the audio FIFO."); ret = AVERROR_EXIT; } return ret; } // Build correct PTS if (output_frame->sample_rate) { /* * FFmpeg API docs say: * * best_effort_timestamp: frame timestamp estimated using various heuristics, in stream time base. * Unused for encoding, but we set it anyways. * * pts: Presentation timestamp, they say in ffmpeg time_base units, but nevertheless it seems to be * in stream time base. When not converted the audio comes out wobbly. */ // Not sure if this is use anywhere, but let's set it anyway. output_frame->best_effort_timestamp = ffmpeg_rescale_q(m_out.m_audio_pts, m_out.m_audio.m_stream->time_base, m_in.m_audio.m_stream->time_base); output_frame->pts = m_out.m_audio_pts; // duration = `a * b / c` = AV_TIME_BASE * output_frame->nb_samples / output_frame->sample_rate; int64_t sample_duration = av_rescale(AV_TIME_BASE, output_frame->nb_samples, output_frame->sample_rate); sample_duration = ffmpeg_rescale_q(sample_duration, av_get_time_base_q(), m_out.m_audio.m_stream->time_base); m_out.m_audio_pts += sample_duration; } int64_t pos = ffmpeg_rescale_q_rnd(output_frame->pts - m_out.m_audio.m_start_time, m_out.m_audio.m_stream->time_base); m_frame_map.insert(std::make_pair(pos, output_frame)); return ret; } int FFmpeg_Transcoder::write_output_file_trailer() { int ret; ret = av_write_trailer(m_out.m_format_ctx); if (ret < 0) { Logging::error(virtname(), "Could not write output file trailer (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } return 0; } time_t FFmpeg_Transcoder::mtime() const { return m_mtime; } template const char * FFmpeg_Transcoder::tagcpy(char (&out) [ size ], const std::string & in) const // NOLINT(modernize-avoid-c-arrays) { std::memset(out, ' ', size); std::memcpy(out, in.c_str(), std::min(size, in.size())); return out; } template const T & FFmpeg_Transcoder::tagcpy(T & out, const std::string & in) const { out.fill(' '); std::memcpy(out.data(), in.c_str(), std::min(out.size(), in.size())); // std::memset(out, ' ', size); // std::memcpy(out, in.c_str(), std::min(size, in.size())); return out; } void FFmpeg_Transcoder::copy_metadata(AVDictionary **metadata_out, const AVDictionary *metadata_in, bool contentstream) { AVDictionaryEntry *tag = nullptr; while ((tag = av_dict_get(metadata_in, "", tag, AV_DICT_IGNORE_SUFFIX)) != nullptr) { std::string value(tag->value); if (contentstream && m_virtualfile != nullptr && m_virtualfile->m_flags & VIRTUALFLAG_CUESHEET) { // Replace tags with cue sheet values if (!strcasecmp(tag->key, "ARTIST")) { value = m_virtualfile->m_cuesheet_track.m_artist; } else if (!strcasecmp(tag->key, "TITLE")) { value = m_virtualfile->m_cuesheet_track.m_title; } else if (!strcasecmp(tag->key, "TRACK")) { strsprintf(&value, "%i", m_virtualfile->m_cuesheet_track.m_trackno); } } dict_set_with_check(metadata_out, tag->key, value.c_str(), 0, virtname()); if (contentstream && m_out.m_filetype == FILETYPE::MP3) { // For MP3 fill in ID3v1 structure if (!strcasecmp(tag->key, "ARTIST")) { tagcpy(m_out.m_id3v1.m_artist, value); } else if (!strcasecmp(tag->key, "TITLE")) { tagcpy(m_out.m_id3v1.m_title, value); } else if (!strcasecmp(tag->key, "ALBUM")) { tagcpy(m_out.m_id3v1.m_album, value); } else if (!strcasecmp(tag->key, "COMMENT")) { tagcpy(m_out.m_id3v1.m_comment, value); } else if (!strcasecmp(tag->key, "YEAR") || !strcasecmp(tag->key, "DATE")) { tagcpy(m_out.m_id3v1.m_year, value); } else if (!strcasecmp(tag->key, "TRACK")) { m_out.m_id3v1.m_title_no = static_cast(std::stoi(value)); } } } } int FFmpeg_Transcoder::process_metadata() { Logging::trace(virtname(), "Processing metadata."); if (m_in.m_audio.m_stream != nullptr && m_in.m_audio.m_stream->codecpar->codec_id == AV_CODEC_ID_VORBIS) { // For some formats (namely ogg) FFmpeg returns the tags, odd enough, with streams... copy_metadata(&m_out.m_format_ctx->metadata, m_in.m_audio.m_stream->metadata); } copy_metadata(&m_out.m_format_ctx->metadata, m_in.m_format_ctx->metadata); if (m_out.m_audio.m_stream != nullptr && m_in.m_audio.m_stream != nullptr) { // Copy audio stream meta data copy_metadata(&m_out.m_audio.m_stream->metadata, m_in.m_audio.m_stream->metadata); } if (m_out.m_video.m_stream != nullptr && m_in.m_video.m_stream != nullptr) { // Copy video stream meta data copy_metadata(&m_out.m_video.m_stream->metadata, m_in.m_video.m_stream->metadata); } // Also copy album art meta tags for (size_t n = 0; n < m_in.m_album_art.size() && n < m_out.m_album_art.size(); n++) { AVStream *input_stream = m_in.m_album_art.at(n).m_stream; AVStream *output_stream = m_out.m_album_art.at(n).m_stream; copy_metadata(&output_stream->metadata, input_stream->metadata, is_audio_stream(input_stream->index) || is_video_stream(input_stream->index)); } if (m_virtualfile != nullptr && m_virtualfile->m_flags & VIRTUALFLAG_CUESHEET) { dict_set_with_check(&m_out.m_format_ctx->metadata, "TRACKTOTAL", m_virtualfile->m_cuesheet_track.m_tracktotal, 0, virtname()); dict_set_with_check(&m_out.m_format_ctx->metadata, "TRACK", m_virtualfile->m_cuesheet_track.m_trackno, 0, virtname(), true); dict_set_with_check(&m_out.m_format_ctx->metadata, "ARTIST", m_virtualfile->m_cuesheet_track.m_artist.c_str(), 0, virtname(), true); if (av_dict_get(m_out.m_format_ctx->metadata, "ALBUM_ARTIST", nullptr, 0) == nullptr) { // Issue #78: duplicate ARTIST tag to ALBUM_ARTIST, if target is empty. dict_set_with_check(&m_out.m_format_ctx->metadata, "ALBUM_ARTIST", m_virtualfile->m_cuesheet_track.m_artist.c_str(), 0, virtname(), true); } dict_set_with_check(&m_out.m_format_ctx->metadata, "TITLE", m_virtualfile->m_cuesheet_track.m_title.c_str(), 0, virtname(), true); dict_set_with_check(&m_out.m_format_ctx->metadata, "ALBUM", m_virtualfile->m_cuesheet_track.m_album.c_str(), 0, virtname(), true); dict_set_with_check(&m_out.m_format_ctx->metadata, "GENRE", m_virtualfile->m_cuesheet_track.m_genre.c_str(), 0, virtname(), true); dict_set_with_check(&m_out.m_format_ctx->metadata, "DATE", m_virtualfile->m_cuesheet_track.m_date.c_str(), 0, virtname(), true); } return 0; } int FFmpeg_Transcoder::process_albumarts() { int ret = 0; for (size_t n = 0; n < m_in.m_album_art.size() && n < m_out.m_album_art.size(); n++) { AVStream *input_stream = m_in.m_album_art.at(n).m_stream; if (input_stream->disposition & AV_DISPOSITION_ATTACHED_PIC) { AVStream *output_stream = m_out.m_album_art.at(n).m_stream; ret = add_albumart_frame(output_stream, &input_stream->attached_pic); if (ret < 0) { break; } } } return ret; } void FFmpeg_Transcoder::flush_buffers() { if (m_in.m_audio.m_codec_ctx != nullptr) { avcodec_flush_buffers(m_in.m_audio.m_codec_ctx.get()); } if (m_in.m_video.m_codec_ctx != nullptr) { avcodec_flush_buffers(m_in.m_video.m_codec_ctx.get()); } } int FFmpeg_Transcoder::do_seek_frame(uint32_t frame_no) { m_have_seeked = true; // Note that we have seeked, thus skipped frames. We need to start transcoding over to fill any gaps. //m_skip_next_frame = true; /**< @todo Take deinterlace into account. If deinterlace is on the frame number is decreased by one. */ if (m_skip_next_frame) { --frame_no; } int64_t vstream_pts = frame_to_pts(m_in.m_video.m_stream, frame_no); if (m_in.m_video.m_stream->start_time != AV_NOPTS_VALUE) { vstream_pts += m_in.m_video.m_stream->start_time; } return av_seek_frame(m_in.m_format_ctx, m_in.m_video.m_stream_idx, vstream_pts, AVSEEK_FLAG_BACKWARD|AVSEEK_FLAG_FRAME); } int FFmpeg_Transcoder::skip_decoded_frames(uint32_t frame_no, bool forced_seek) { int ret = 0; uint32_t next_frame_no = frame_no; // Seek next undecoded frame for (; m_buffer->have_frame(next_frame_no); next_frame_no++) { std::this_thread::yield(); } if (next_frame_no > m_virtualfile->m_video_frame_count) { // Reached end of file // Set PTS to end of file m_out.m_video_pts = m_in.m_video.m_stream->duration; if (m_in.m_video.m_stream->start_time != AV_NOPTS_VALUE) { m_out.m_video_pts += m_in.m_video.m_stream->start_time; } // Seek to end of file to force AVERROR_EOF from next av_read_frame() call. Ignore errrors. av_seek_frame(m_in.m_format_ctx, m_in.m_video.m_stream_idx, m_out.m_video_pts, AVSEEK_FLAG_ANY); return 0; } uint32_t last_frame_no = pts_to_frame(m_in.m_video.m_stream, m_out.m_video_pts); // Ignore seek if target is within the next FRAME_SEEK_THRESHOLD frames if (next_frame_no >= last_frame_no /*+ 1*/ && next_frame_no <= last_frame_no + FRAME_SEEK_THRESHOLD) { return 0; } if (forced_seek || (frame_no != next_frame_no && next_frame_no > 1)) { // If frame changed, skip to it ret = do_seek_frame(next_frame_no); if (ret < 0) { Logging::error(virtname(), "Could not encode audio frame: Seek to frame #%1 failed (error '%2').", next_frame_no, ffmpeg_geterror(ret).c_str()); } } return ret; } int FFmpeg_Transcoder::flush_delayed_audio() { int ret = 0; if (m_out.m_audio.m_codec_ctx != nullptr) { // Flush the encoder as it may have delayed frames. int data_written = 0; do { ret = encode_audio_frame(nullptr, &data_written); if (ret == AVERROR_EOF) { // Not an error break; } if (ret < 0 && ret != AVERROR(EAGAIN)) { Logging::error(virtname(), "Could not encode audio frame (error '%1').", ffmpeg_geterror(ret).c_str()); break; } } while (data_written); } return ret; } int FFmpeg_Transcoder::flush_delayed_video() { int ret = 0; if (m_out.m_video.m_codec_ctx != nullptr) { // Flush the encoder as it may have delayed frames. int data_written = 0; do { if (!is_frameset()) { // Encode regular frame ret = encode_video_frame(nullptr, &data_written); } else { // Encode seperate image frame ret = encode_image_frame(nullptr, &data_written); } if (ret == AVERROR_EOF) { // Not an error break; } if (ret < 0 && ret != AVERROR(EAGAIN)) { Logging::error(virtname(), "Could not encode video frame (error '%1').", ffmpeg_geterror(ret).c_str()); break; } } while (data_written); } return ret; } int FFmpeg_Transcoder::flush_delayed_subtitles() /** @todo Implement flush_delayed_subtitles() if required */ { return 0; } int FFmpeg_Transcoder::copy_audio_to_frame_buffer(int *finished) { int output_frame_size; if (m_out.m_audio.m_codec_ctx->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) { // Encode supports variable frame size, use an arbitrary value output_frame_size = 10000; } else { // Use the encoder's desired frame size for processing. output_frame_size = m_out.m_audio.m_codec_ctx->frame_size; } // Make sure that there is one frame worth of samples in the audio FIFO // buffer so that the encoder can do its work. // Since the decoder's and the encoder's frame size may differ, we // need to FIFO buffer to store as many frames worth of input samples // that they make up at least one frame worth of output samples. while (av_audio_fifo_size(m_audio_fifo) < output_frame_size) { int ret = 0; // Decode one frame worth of audio samples, convert it to the // output sample format and put it into the audio FIFO buffer. ret = read_decode_convert_and_store(finished); if (ret < 0) { return ret; } // If we are at the end of the input file, we continue // encoding the remaining audio samples to the output file. if (*finished) { break; } } // If we have enough samples for the encoder, we encode them. // At the end of the file, we pass the remaining samples to // the encoder. while (av_audio_fifo_size(m_audio_fifo) >= output_frame_size || (*finished && av_audio_fifo_size(m_audio_fifo) > 0)) { int ret = 0; // Take one frame worth of audio samples from the audio FIFO buffer, // create a frame and store in audio frame buffer. ret = create_audio_frame(output_frame_size); if (ret < 0) { return ret; } } return 0; } int FFmpeg_Transcoder::process_single_fr(DECODER_STATUS *status) { int finished = 0; *status = DECODER_STATUS::DEC_SUCCESS; try { if (m_in.m_video.m_stream != nullptr && is_frameset()) { int ret = 0; // Direct access handling for frame sets: seek to frame if requested. ret = seek_frame(); if (ret == AVERROR_EOF) { *status = DECODER_STATUS::DEC_EOF; // Report EOF, but return no error throw 0; } if (ret < 0) { throw ret; } } if (!m_copy_audio && stream_exists(m_out.m_audio.m_stream_idx)) { int ret = 0; // Copy audio FIFO into frame buffer ret = copy_audio_to_frame_buffer(&finished); if (ret < 0) { throw ret; } } else { int ret = 0; // If we have no audio stream, we'll only get video data // or we simply copy audio and/or video frames into the packet queue ret = read_decode_convert_and_store(&finished); if (ret < 0) { throw ret; } if (finished) { *status = DECODER_STATUS::DEC_EOF; // Report EOF } } do { if (!is_frameset()) { int64_t delay; // The following values are arbitrarily chosen and seem to work. if (is_hls()) { delay = params.m_segment_duration * 75 / 100; // 75% of the segment duration } else { delay = 6 * AV_TIME_BASE; // 6 seconds } if (!finished && (!m_frame_map.empty() && m_frame_map.cbegin()->first + delay > m_frame_map.crbegin()->first)) { return 0; } while (!m_frame_map.empty()) { // Take first entry in map MULTIFRAME_MAP::const_iterator it = m_frame_map.cbegin(); if (is_hls()) { uint32_t next_segment = get_next_segment(it->first); if (goto_next_segment(next_segment)) { // Reached next segment, end current now, and force new. m_inhibit_stream_msk = m_active_stream_msk; break; } } // Get multiframe from map MULTIFRAME multiframe = it->second; // Drop key from map, we've got a clone in multiframe now. m_frame_map.erase(it); if (std::holds_alternative(multiframe)) { // Object is an audio/video frame const FFmpeg_Frame & frame = std::get(multiframe); int stream_idx = frame.m_stream_idx; if (!stream_exists(stream_idx)) { Logging::error(virtname(), "INTERNAL ERROR: FFmpeg_Transcoder::process_single_fr()! Invalid stream index in audio/video buffer skipped."); continue; } if (stream_idx == m_out.m_audio.m_stream_idx) { // Encode audio int ret = 0; int data_written; // Encode one frame worth of audio samples. ret = encode_audio_frame(frame, &data_written); if (ret < 0 && ret != AVERROR(EAGAIN)) { throw ret; } } else if (stream_idx == m_out.m_video.m_stream_idx) { // Encode video int ret = 0; int data_written = 0; ret = encode_video_frame(frame, &data_written); if (ret < 0 && ret != AVERROR(EAGAIN)) { throw ret; } } } else if (std::holds_alternative(multiframe)) { // Object is a subtitle const FFmpeg_Subtitle & subtitle = std::get(multiframe); int stream_idx = subtitle.m_stream_idx; if (!stream_exists(stream_idx)) { Logging::error(virtname(), "INTERNAL ERROR: FFmpeg_Transcoder::process_single_fr()! Invalid stream index in subtitle buffer skipped."); continue; } // Encode subtitles int ret = 0; int data_written = 0; ret = encode_subtitle(subtitle, stream_idx, &data_written); if (ret < 0 && ret != AVERROR(EAGAIN)) { throw ret; } } } } else { // Frame sets: no audio, no subtitles, no output stream (index) while (!m_frame_map.empty()) { // Although I abhore "auto", it seems that nodes are declared slightly different throughout // several std::map implementations. To avoid #ifdef orgies, I resign: Using "auto" here // is much more coherent. auto nh = m_frame_map.extract(m_frame_map.cbegin()); const MULTIFRAME & multiframe = nh.mapped(); int ret = 0; int data_written = 0; // Encode video ret = encode_image_frame(std::get(multiframe), &data_written); if (ret < 0 && ret != AVERROR(EAGAIN)) { throw ret; } } } if (is_hls() && m_active_stream_msk == m_inhibit_stream_msk) { // Start new HLS segment int ret = 0; ret = start_new_segment(); if (ret < 0) { throw ret; } } } while (finished && !m_frame_map.empty()); // Ensure we've processed all frames in our buffer // If we are at the end of the input file and have encoded // all remaining samples, we can exit this loop and finish. if (finished && m_frame_map.empty()) { flush_delayed_audio(); flush_delayed_video(); flush_delayed_subtitles(); *status = DECODER_STATUS::DEC_EOF; // Report EOF } } catch (int _ret) { *status = (_ret != AVERROR_EOF ? DECODER_STATUS::DEC_ERROR : DECODER_STATUS::DEC_EOF); // If _ret == AVERROR_EOF, simply signal EOF return _ret; } return 0; } int FFmpeg_Transcoder::seek_frame() { if (!m_last_seek_frame_no) { // No current seek frame, check if new seek frame was stacked. { std::lock_guard lock_seek_to_fifo_mutex(m_seek_to_fifo_mutex); while (!m_seek_to_fifo.empty()) { uint32_t frame_no = m_seek_to_fifo.front(); m_seek_to_fifo.pop(); if (!m_buffer->have_frame(frame_no)) { // Frame not yet decoded, so skip to it. m_last_seek_frame_no = frame_no; break; } } } if (m_last_seek_frame_no) { int ret = 0; // The first frame that FFmpeg API returns after av_seek_frame is wrong (the last frame before seek). // We are unable to detect that because the pts seems correct (the one that we requested). // So we position before the frame requested, and simply throw the first away. //#define PRESCAN_FRAMES 3 uint32_t seek_frame_no = m_last_seek_frame_no.exchange(0); #ifdef PRESCAN_FRAMES if (seek_frame_no > PRESCAN_FRAMES) { seek_frame_no -= PRESCAN_FRAMES; //m_skip_next_frame = true; /**< @todo Take deinterlace into account */ } else { seek_frame_no = 1; } #endif ret = skip_decoded_frames(seek_frame_no, true); if (ret < 0) { return ret; } } } return 0; } int FFmpeg_Transcoder::start_new_segment() { bool opened = false; encode_finish(); // Go to next requested segment... uint32_t next_segment = m_current_segment + 1; // ...or process any stacked seek requests. while (!m_seek_to_fifo.empty()) { uint32_t segment_no = m_seek_to_fifo.front(); m_seek_to_fifo.pop(); // No check if m_segment_duration == 0, values <= 0 not accepted // Cast is OK here, the result will always be small enough for an int32. uint32_t min_seek_segments = static_cast(params.m_min_seek_time_diff / params.m_segment_duration); if (min_seek_segments && segment_no >= next_segment && segment_no <= next_segment + min_seek_segments) { Logging::info(virtname(), "Discarding seek request to HLS segment no. %1, less than %2 seconds (%3 segments) away.", segment_no, params.m_min_seek_time_diff / AV_TIME_BASE, min_seek_segments); continue; } if (!m_buffer->segment_exists(segment_no) || !m_buffer->tell(segment_no)) // NOT EXIST or NO DATA YET { int ret = 0; m_reset_pts = FFMPEGFS_AUDIO | FFMPEGFS_VIDEO; // Note that we have to reset audio/video pts to the new position m_have_seeked = true; // Note that we have seeked, thus skipped frames. We need to start transcoding over to fill any gaps. Logging::info(virtname(), "Performing seek request to HLS segment no. %1.", segment_no); int64_t pos = (segment_no - 1) * params.m_segment_duration; if (m_in.m_video.m_stream_idx && stream_exists(m_out.m_video.m_stream_idx) && m_in.m_video.m_stream != nullptr) { int64_t vstream_pts = ffmpeg_rescale_q(pos, av_get_time_base_q(), m_in.m_video.m_stream->time_base); if (m_in.m_video.m_stream->start_time != AV_NOPTS_VALUE) { vstream_pts += m_in.m_video.m_stream->start_time; } ret = av_seek_frame(m_in.m_format_ctx, m_in.m_video.m_stream_idx, vstream_pts, AVSEEK_FLAG_BACKWARD); } else if (m_in.m_audio.m_stream_idx && stream_exists(m_out.m_audio.m_stream_idx) && m_in.m_audio.m_stream != nullptr) { int64_t astream_pts = ffmpeg_rescale_q(pos, av_get_time_base_q(), m_in.m_audio.m_stream->time_base); if (m_in.m_audio.m_stream->start_time != AV_NOPTS_VALUE) { astream_pts += m_in.m_audio.m_stream->start_time; } ret = av_seek_frame(m_in.m_format_ctx, m_in.m_audio.m_stream_idx, astream_pts, AVSEEK_FLAG_BACKWARD); } if (ret < 0) { Logging::error(virtname(), "Seek failed on input file (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } flush_buffers(); close_output_file(); purge_hls_fifo(); // We do not need the packets for the next frame, we start a new one at another position! ret = open_output(m_buffer); if (ret < 0) { return ret; } next_segment = segment_no; opened = true; break; } Logging::info(virtname(), "Discarded seek request to HLS segment no. %1.", segment_no); } // Set current segment m_current_segment = next_segment; m_inhibit_stream_msk = 0; m_insert_keyframe = false; Logging::info(virtname(), "Starting HLS segment no. %1 of %2.", m_current_segment, m_virtualfile->get_segment_count()); if (!m_buffer->set_segment(m_current_segment, m_virtualfile->m_predicted_size / m_virtualfile->get_segment_count())) /** @todo Set reasonable size here */ { return AVERROR(errno); } if (!opened) { int ret = 0; // Process output file, already done by open_output() if file has been newly opened. ret = process_output(); if (ret) { return ret; } } // Flush delayed packets to disk, if any while (!m_hls_packet_fifo.empty()) { int ret = 0; AVPacket *pkt = m_hls_packet_fifo.front(); m_hls_packet_fifo.pop(); ret = av_write_frame(m_out.m_format_ctx, pkt); if (ret < 0) { Logging::error(virtname(), "Could not write frame (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } av_packet_unref(pkt); } return 0; } BITRATE FFmpeg_Transcoder::get_prores_bitrate(int width, int height, const AVRational &framerate, bool interleaved, PRORESLEVEL profile) { unsigned int mindist; size_t match = UINT_MAX; // Find best match resolution mindist = UINT_MAX; for (size_t i = 0; i < m_prores_bitrate.size(); i++) { unsigned int x = static_cast(width - m_prores_bitrate[i].m_width); unsigned int y = static_cast(height - m_prores_bitrate[i].m_height); unsigned int dist = (x * x) + (y * y); if (dist < mindist) { mindist = dist; match = i; } if (!dist) { // Exact match, won't find a better one. break; } } if (match == UINT_MAX) { return 0; } width = m_prores_bitrate[match].m_width; height = m_prores_bitrate[match].m_height; // Find best match framerate double framerateX = av_q2d(framerate); mindist = UINT_MAX; for (size_t i = match; width == m_prores_bitrate[i].m_width && height == m_prores_bitrate[i].m_height; i++) { unsigned int dist = UINT_MAX; for (size_t j = 0; j < MAX_PRORES_FRAMERATE && m_prores_bitrate[i].m_framerate[j].m_framerate; j++) { unsigned int x = static_cast(framerateX - m_prores_bitrate[i].m_framerate[j].m_framerate); unsigned int y = static_cast(interleaved - m_prores_bitrate[i].m_framerate[j].m_interleaved); dist = (x * x) + (y * y); if (dist < mindist) { mindist = dist; match = i; } if (!dist) { // Exact match, won't find a better one. break; } } if (!dist) { // Exact match, won't find a better one. break; } } if (match == UINT_MAX) { return 0; } return m_prores_bitrate[match].m_bitrate[static_cast(profile)] * (1000 * 1000); } bool FFmpeg_Transcoder::audio_size(size_t *filesize, AVCodecID codec_id, BITRATE bit_rate, int64_t duration, int channels, int sample_rate, AVSampleFormat sample_format) { BITRATE output_audio_bit_rate; int output_sample_rate; bool success = true; get_output_bit_rate(bit_rate, params.m_audiobitrate, &output_audio_bit_rate); get_output_sample_rate(sample_rate, params.m_audiosamplerate, &output_sample_rate); switch (codec_id) { case AV_CODEC_ID_AAC: { // Try to predict the size of the AAC stream (this is fairly accurate, sometimes a bit larger, sometimes a bit too small *filesize += static_cast(duration * output_audio_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1025 * (*filesize) / 1000); // add overhead (empirically determined value) break; } case AV_CODEC_ID_MP3: { // Kbps = bits per second / 8 = Bytes per second x 60 seconds = Bytes per minute x 60 minutes = Bytes per hour // This is the sum of the size of // ID3v2, ID3v1, and raw MP3 data. This is theoretically only approximate // but in practice gives excellent answers, usually exactly correct. // Cast to 64-bit int to avoid overflow. *filesize += static_cast(duration * output_audio_bit_rate / (8LL * AV_TIME_BASE)) + ID3V1_TAG_LENGTH; break; } case AV_CODEC_ID_PCM_U8: case AV_CODEC_ID_PCM_S8: { int bytes_per_sample = av_get_bytes_per_sample(AV_SAMPLE_FMT_U8); // Unsigned/signed 8 have the same width // File size: // file duration * sample rate (HZ) * channels * bytes per sample // + WAV_HEADER + DATA_HEADER + (with FFMpeg always) LIST_HEADER // The real size of the list header is unkown as we don't know the contents (meta tags) *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); break; } case AV_CODEC_ID_PCM_S8_PLANAR: { int bytes_per_sample = av_get_bytes_per_sample(AV_SAMPLE_FMT_U8P); // File size: // file duration * sample rate (HZ) * channels * bytes per sample // + WAV_HEADER + DATA_HEADER + (with FFMpeg always) LIST_HEADER // The real size of the list header is unkown as we don't know the contents (meta tags) *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); break; } case AV_CODEC_ID_PCM_U16LE: case AV_CODEC_ID_PCM_U16BE: case AV_CODEC_ID_PCM_S16LE: case AV_CODEC_ID_PCM_S16BE: { int bytes_per_sample = av_get_bytes_per_sample(AV_SAMPLE_FMT_S16); // Unsigned/signed 16 have the same width // File size: // file duration * sample rate (HZ) * channels * bytes per sample // + WAV_HEADER + DATA_HEADER + (with FFMpeg always) LIST_HEADER // The real size of the list header is unkown as we don't know the contents (meta tags) *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); break; } case AV_CODEC_ID_PCM_S16LE_PLANAR: case AV_CODEC_ID_PCM_S16BE_PLANAR: { int bytes_per_sample = av_get_bytes_per_sample(AV_SAMPLE_FMT_S16P); // Unsigned/signed 16 have the same width // File size: // file duration * sample rate (HZ) * channels * bytes per sample // + WAV_HEADER + DATA_HEADER + (with FFMpeg always) LIST_HEADER // The real size of the list header is unkown as we don't know the contents (meta tags) *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); break; } case AV_CODEC_ID_PCM_U24LE: // U/S24 uses U/S32 storage case AV_CODEC_ID_PCM_U24BE: case AV_CODEC_ID_PCM_S24LE: case AV_CODEC_ID_PCM_S24BE: case AV_CODEC_ID_PCM_U32LE: case AV_CODEC_ID_PCM_U32BE: case AV_CODEC_ID_PCM_S32LE: case AV_CODEC_ID_PCM_S32BE: { int bytes_per_sample = av_get_bytes_per_sample(AV_SAMPLE_FMT_S32); // Unsigned/signed 32 have the same width // File size: // file duration * sample rate (HZ) * channels * bytes per sample // + WAV_HEADER + DATA_HEADER + (with FFMpeg always) LIST_HEADER // The real size of the list header is unkown as we don't know the contents (meta tags) *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); break; } case AV_CODEC_ID_PCM_S24LE_PLANAR: // S24 uses S32 storage case AV_CODEC_ID_PCM_S32LE_PLANAR: { int bytes_per_sample = av_get_bytes_per_sample(AV_SAMPLE_FMT_S32P); // File size: // file duration * sample rate (HZ) * channels * bytes per sample // + WAV_HEADER + DATA_HEADER + (with FFMpeg always) LIST_HEADER // The real size of the list header is unkown as we don't know the contents (meta tags) *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); break; } case AV_CODEC_ID_PCM_S64LE: case AV_CODEC_ID_PCM_S64BE: { int bytes_per_sample = av_get_bytes_per_sample(AV_SAMPLE_FMT_S64); // File size: // file duration * sample rate (HZ) * channels * bytes per sample // + WAV_HEADER + DATA_HEADER + (with FFMpeg always) LIST_HEADER // The real size of the list header is unkown as we don't know the contents (meta tags) *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); break; } case AV_CODEC_ID_PCM_F16LE: case AV_CODEC_ID_PCM_F24LE: case AV_CODEC_ID_PCM_F32BE: case AV_CODEC_ID_PCM_F32LE: case AV_CODEC_ID_PCM_F64BE: case AV_CODEC_ID_PCM_F64LE: { int bytes_per_sample = av_get_bytes_per_sample(AV_SAMPLE_FMT_FLT); // File size: // file duration * sample rate (HZ) * channels * bytes per sample // + WAV_HEADER + DATA_HEADER + (with FFMpeg always) LIST_HEADER // The real size of the list header is unkown as we don't know the contents (meta tags) *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); break; } case AV_CODEC_ID_VORBIS: { // Kbps = bits per second / 8 = Bytes per second x 60 seconds = Bytes per minute x 60 minutes = Bytes per hour *filesize += static_cast(duration * output_audio_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(900 * (*filesize) / 1000); // OGG files seem to be rather smaller than expected (empirically determined value) break; } case AV_CODEC_ID_OPUS: { // Kbps = bits per second / 8 = Bytes per second x 60 seconds = Bytes per minute x 60 minutes = Bytes per hour *filesize += static_cast(duration * output_audio_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1020 * (*filesize) / 1000); // add overhead (empirically determined value) break; } case AV_CODEC_ID_ALAC: { int bytes_per_sample = av_get_bytes_per_sample(AV_SAMPLE_FMT_S16); // File size: // Apple Lossless Audio Coding promises a compression rate of 60-70%. The actual result ranges // between 30 and over 50%, heavily depending on the input. *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); *filesize = static_cast(620 * (*filesize) / 1000); // Estimate 38% compression rate (empirically determined value) break; } case AV_CODEC_ID_AC3: { // Kbps = bits per second / 8 = Bytes per second x 60 seconds = Bytes per minute x 60 minutes = Bytes per hour *filesize += static_cast(duration * output_audio_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1025 * (*filesize) / 1000); // add overhead (empirically determined value) break; } case AV_CODEC_ID_FLAC: { int bytes_per_sample = av_get_bytes_per_sample(sample_format != AV_SAMPLE_FMT_NONE ? sample_format : AV_SAMPLE_FMT_S16); // File size: // file duration * sample rate (HZ) * channels * bytes per sample // We do not add the overhead for headers, as this is an estimation and not exact anyways. *filesize += static_cast(duration * sample_rate * (channels >= 2 ? 2 : 1) * bytes_per_sample / AV_TIME_BASE); *filesize = static_cast(600 * (*filesize) / 1000); // Estimate 40% compression rate (empirically determined value) break; } case AV_CODEC_ID_NONE: { break; } default: { success = false; break; } } return success; } bool FFmpeg_Transcoder::video_size(size_t *filesize, AVCodecID codec_id, BITRATE bit_rate, int64_t duration, int width, int height, bool interleaved, const AVRational &framerate) { BITRATE out_video_bit_rate; bool success = true; get_output_bit_rate(bit_rate, params.m_videobitrate, &out_video_bit_rate); switch (codec_id) { case AV_CODEC_ID_MPEG1VIDEO: { *filesize += static_cast(duration * out_video_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1020 * (*filesize) / 1000); // add overhead break; } case AV_CODEC_ID_MPEG2VIDEO: { *filesize += static_cast(duration * out_video_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1020 * (*filesize) / 1000); // add overhead break; } case AV_CODEC_ID_H264: { *filesize += static_cast(duration * out_video_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1050 * (*filesize) / 1000); // add overhead break; } case AV_CODEC_ID_H265: { *filesize += static_cast(duration * out_video_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1250 * (*filesize) / 1000); // add overhead break; } case AV_CODEC_ID_THEORA: { *filesize += static_cast(duration * out_video_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1025 * (*filesize) / 1000); // add overhead break; } case AV_CODEC_ID_VP8: { *filesize += static_cast(duration * out_video_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1020 * (*filesize) / 1000); // add overhead break; } case AV_CODEC_ID_VP9: { *filesize += static_cast(duration * out_video_bit_rate / (8LL * AV_TIME_BASE)); *filesize = static_cast(1450 * (*filesize) / 1000); // add overhead break; } case AV_CODEC_ID_AV1: /** @todo AV1 prediction has not been tested yet */ { *filesize += static_cast(duration * out_video_bit_rate / (8LL * AV_TIME_BASE)); //*filesize = static_cast(1150 * (*filesize) / 1000); // add overhead break; } case AV_CODEC_ID_PRORES: { *filesize += static_cast(duration * get_prores_bitrate(width, height, framerate, interleaved, params.m_level) / (8LL * AV_TIME_BASE)); break; } case AV_CODEC_ID_PNG: case AV_CODEC_ID_BMP: case AV_CODEC_ID_MJPEG: { // Max. file size = (pixel dimensions x bit depth) / 8 for an uncompressed BMP, // more than sufficient for JPG/PNG as they should never get this large. *filesize += static_cast(width * height * 24 / 8); // Get the max. size break; } case AV_CODEC_ID_NONE: { break; } default: { success = false; break; } } return success; } bool FFmpeg_Transcoder::total_overhead(size_t *filesize, FILETYPE filetype) { bool success = true; switch (filetype) { // // Audio only // case FILETYPE::MP3: { // The FFmpeg API always adds an IDv2 header, size of which is unknown and // really hard to determine. So we simply add something reasonable (empirically determined value). *filesize += 250000; break; } case FILETYPE::WAV: { // This could actually precise, but yet the FFmpeg API always adds an IDv2 header, // size of which is unknown and really hard to determine. The header is small, ~30 bytes, // so we ignore that deliberatly. *filesize += sizeof(WAV_HEADER) + sizeof(WAV_LIST_HEADER) + sizeof(WAV_DATA_HEADER); break; } case FILETYPE::AIFF: { // These two "chunks" will always be there, others may be there, may be not. Their // size is hard to precalculate and small (~100 bytes), so we disregard the rest. *filesize += sizeof(AIFF_FORMCHUNK) + sizeof(AIFF_COMMONCHUNK); break; } case FILETYPE::OPUS: case FILETYPE::ALAC: case FILETYPE::FLAC: { break; } // // Video // case FILETYPE::TS: case FILETYPE::HLS: { *filesize += 1600000; // empirically determined value break; } case FILETYPE::MP4: case FILETYPE::OGG: case FILETYPE::WEBM: case FILETYPE::MOV: case FILETYPE::PRORES: case FILETYPE::MKV: { break; } // // Stills // case FILETYPE::PNG: case FILETYPE::JPG: case FILETYPE::BMP: { break; } // // Invalid // case FILETYPE::UNKNOWN: { success = false; break; } } return success; } size_t FFmpeg_Transcoder::calculate_predicted_filesize() const { if (m_in.m_format_ctx == nullptr) { return 0; } if (m_current_format == nullptr) { // Should ever happen, but better check this to avoid crashes. return 0; } size_t filesize = 0; int64_t file_duration = m_in.m_format_ctx->duration != AV_NOPTS_VALUE ? m_in.m_format_ctx->duration : 0; BITRATE input_audio_bit_rate = 0; int input_sample_rate = 0; BITRATE input_video_bit_rate = 0; if (m_fileio->duration() != AV_NOPTS_VALUE) { file_duration = m_fileio->duration(); } if (stream_exists(m_in.m_audio.m_stream_idx)) { input_sample_rate = m_in.m_audio.m_stream->codecpar->sample_rate; input_audio_bit_rate = (m_in.m_audio.m_stream->codecpar->bit_rate != 0) ? m_in.m_audio.m_stream->codecpar->bit_rate : m_in.m_format_ctx->bit_rate; } if (stream_exists(m_in.m_video.m_stream_idx)) { input_video_bit_rate = (m_in.m_video.m_stream->codecpar->bit_rate != 0) ? m_in.m_video.m_stream->codecpar->bit_rate : m_in.m_format_ctx->bit_rate; } if (input_audio_bit_rate) { int channels = get_channels(m_in.m_audio.m_codec_ctx.get()); if (!audio_size(&filesize, m_current_format->audio_codec(), input_audio_bit_rate, file_duration, channels, input_sample_rate, m_cur_sample_fmt)) { Logging::warning(filename(), "Unsupported audio codec '%1' for format %2.", get_codec_name(m_current_format->audio_codec()), m_current_format->desttype().c_str()); } } if (input_video_bit_rate) { if (m_is_video) { int width = m_in.m_video.m_stream->codecpar->width; int height = m_in.m_video.m_stream->codecpar->height; bool interleaved = params.m_deinterlace ? false : (m_in.m_video.m_stream->codecpar->field_order != AV_FIELD_PROGRESSIVE); // Deinterlace only if source is interlaced AVRational framerate = m_in.m_video.m_stream->avg_frame_rate; if (!video_size(&filesize, m_current_format->video_codec(), input_video_bit_rate, file_duration, width, height, interleaved, framerate)) { Logging::warning(filename(), "Unsupported video codec '%1' for format %2.", get_codec_name(m_current_format->video_codec()), m_current_format->desttype().c_str()); } } // else /** @todo Feature #2260: Add picture size */ // { // } } // Support #2654: Test Code // add total overhead total_overhead(&filesize, m_current_format->filetype()); return filesize; } int64_t FFmpeg_Transcoder::duration() const { return SAFE_VALUE(m_virtualfile, m_duration, 0); } size_t FFmpeg_Transcoder::predicted_filesize() const { return SAFE_VALUE(m_virtualfile, m_predicted_size, 0); } uint32_t FFmpeg_Transcoder::video_frame_count() const { return SAFE_VALUE(m_virtualfile, m_video_frame_count, 0); } uint32_t FFmpeg_Transcoder::segment_count() const { return SAFE_VALUE(m_virtualfile, get_segment_count(), 0); } int FFmpeg_Transcoder::encode_finish() { int ret = 0; if (!is_frameset()) { // If not a frame set, write trailer // Write the trailer of the output file container. ret = write_output_file_trailer(); } if (is_hls()) { m_buffer->finished_segment(); // Get segment VIRTUALFILE object std::string seg_filename(m_buffer->virtualfile()->m_destfile + "/" + make_filename(m_current_segment, params.current_format(m_buffer->virtualfile())->fileext())); LPVIRTUALFILE virtualfile = find_file(seg_filename); if (virtualfile != nullptr) { virtualfile->m_predicted_size = m_buffer->buffer_watermark(m_current_segment); stat_set_size(&virtualfile->m_st, virtualfile->m_predicted_size); } } else //if (m_virtualfile->m_flags & VIRTUALFLAG_CUESHEET) { // Save actual result size of the file stat_set_size(&m_virtualfile->m_st, m_buffer->buffer_watermark()); } return ret; } const ID3v1 * FFmpeg_Transcoder::id3v1tag() const { return &m_out.m_id3v1; } int FFmpeg_Transcoder::input_read(void * opaque, unsigned char * data, int size) { FileIO * io = static_cast(opaque); if (io == nullptr) { Logging::error(nullptr, "input_read(): Internal error: FileIO is NULL!"); return AVERROR(EINVAL); } if (io->eof()) { // At EOF return AVERROR_EOF; } int read = static_cast(io->readio(reinterpret_cast(data), static_cast(size))); if (read != size && io->error()) { // Read failed return AVERROR(io->error()); } return read; } #if LAVF_WRITEPACKET_CONST int FFmpeg_Transcoder::output_write(void * opaque, const uint8_t * data, int size) #else int FFmpeg_Transcoder::output_write(void * opaque, unsigned char * data, int size) #endif { Buffer * buffer = static_cast(opaque); if (buffer == nullptr) { Logging::error(nullptr, "input_write(): Internal error: FileIO is NULL!"); return AVERROR(EINVAL); } #if LAVF_WRITEPACKET_CONST int written = static_cast(buffer->writeio(data, static_cast(size))); #else int written = static_cast(buffer->writeio(static_cast(data), static_cast(size))); #endif if (written != size) { // Write error return (AVERROR(errno)); } return written; } int64_t FFmpeg_Transcoder::seek(void * opaque, int64_t offset, int whence) { FileIO * io = static_cast(opaque); int64_t res_offset = 0; if (io == nullptr) { Logging::error(nullptr, "seek(): Internal error: FileIO is NULL!"); return AVERROR(EINVAL); } if (whence & AVSEEK_SIZE) { // Return file size res_offset = static_cast(io->size()); } else { whence &= ~(AVSEEK_SIZE | AVSEEK_FORCE); if (!io->seek(offset, whence)) { // OK: Return position res_offset = offset; } else { // Error res_offset = AVERROR(errno); } } return res_offset; } bool FFmpeg_Transcoder::close_resample() { if (m_audio_resample_ctx) { swr_free(&m_audio_resample_ctx); m_audio_resample_ctx = nullptr; return true; } return false; } int FFmpeg_Transcoder::purge_audio_fifo() { int audio_samples_left = 0; if (m_audio_fifo != nullptr) { audio_samples_left = av_audio_fifo_size(m_audio_fifo); av_audio_fifo_free(m_audio_fifo); m_audio_fifo = nullptr; } return audio_samples_left; } size_t FFmpeg_Transcoder::purge_multiframe_map() { size_t frames_left = m_frame_map.size(); m_frame_map.clear(); return frames_left; } size_t FFmpeg_Transcoder::purge_hls_fifo() { size_t hls_packets_left = m_hls_packet_fifo.size(); while (!m_hls_packet_fifo.empty()) { AVPacket *pkt = m_hls_packet_fifo.front(); m_hls_packet_fifo.pop(); av_packet_unref(pkt); } return hls_packets_left; } void FFmpeg_Transcoder::purge() { std::string outfile; int audio_samples_left = purge_audio_fifo(); size_t frames_left = purge_multiframe_map(); size_t hls_packets_left = purge_hls_fifo(); if (m_out.m_format_ctx != nullptr && m_out.m_format_ctx->url != nullptr) { outfile = m_out.m_format_ctx->url; } else if (m_virtualfile != nullptr) { outfile = m_virtualfile->m_virtfile; } const char *p = outfile.empty() ? nullptr : outfile.c_str(); if (audio_samples_left) { Logging::warning(p, "%1 audio samples left in buffer and not written to target file!", audio_samples_left); } if (frames_left) { Logging::warning(p, "%1 frames left in buffer and not written to target file!", frames_left); } if (hls_packets_left) { Logging::warning(p, "%1 HLS packets left in buffer and not written to target file!", hls_packets_left); } } bool FFmpeg_Transcoder::close_output_file() { bool closed = false; purge(); close_resample(); sws_freeContext(m_sws_ctx); m_sws_ctx = nullptr; // Close output file m_out.m_audio.reset(); m_out.m_video.reset(); m_out.m_album_art.clear(); m_out.m_subtitle.clear(); if (m_out.m_format_ctx != nullptr) { closed = true; if (m_out.m_format_ctx->pb != nullptr) { // 2017-09-01 - xxxxxxx - lavf 57.80.100 / 57.11.0 - avio.h // Add avio_context_free(). From now on it must be used for freeing AVIOContext. #if (LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 80, 0)) av_freep(&m_out.m_format_ctx->pb->buffer); avio_context_free(&m_out.m_format_ctx->pb); #else av_freep(m_out.m_format_ctx->pb); #endif m_out.m_format_ctx->pb = nullptr; } avformat_free_context(m_out.m_format_ctx); m_out.m_format_ctx = nullptr; } return closed; } bool FFmpeg_Transcoder::close_input_file() { bool closed = false; m_in.m_audio.reset(); m_in.m_video.reset(); m_in.m_album_art.clear(); m_in.m_subtitle.clear(); if (m_in.m_format_ctx != nullptr) { closed = true; if (m_fileio.use_count() <= 1 && m_fileio != nullptr) { m_fileio->closeio(); } m_fileio.reset(); if (m_in.m_format_ctx->pb != nullptr) { // 2017-09-01 - xxxxxxx - lavf 57.80.100 / 57.11.0 - avio.h // Add avio_context_free(). From now on it must be used for freeing AVIOContext. #if (LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 80, 0)) avio_context_free(&m_in.m_format_ctx->pb); #else av_freep(m_in.m_format_ctx->pb); #endif m_in.m_format_ctx->pb = nullptr; } avformat_close_input(&m_in.m_format_ctx); m_in.m_format_ctx = nullptr; } free_filters(); return closed; } void FFmpeg_Transcoder::closeio() { bool closed = false; // Close input file closed |= close_input_file(); // Close output file closed |= close_output_file(); // Free hardware device contexts if open hwdevice_ctx_free(&m_hwaccel_dec_device_ctx); hwdevice_ctx_free(&m_hwaccel_enc_device_ctx); // Closed anything (anything had been open to be closed in the first place)... if (closed) { Logging::trace(nullptr, "FFmpeg transcoder closed."); } } const char *FFmpeg_Transcoder::filename() const { return (m_virtualfile != nullptr ? m_virtualfile->m_origfile.c_str() : ""); } const char *FFmpeg_Transcoder::destname() const { return (m_virtualfile != nullptr ? m_virtualfile->m_destfile.c_str() : ""); } const char *FFmpeg_Transcoder::virtname() const { return (m_virtualfile != nullptr ? m_virtualfile->m_virtfile.c_str() : ""); } // create int FFmpeg_Transcoder::init_deinterlace_filters(AVCodecContext *codec_ctx, AVPixelFormat pix_fmt, const AVRational & avg_frame_rate, const AVRational & time_base) { const AVFilter * buffer_src = avfilter_get_by_name("buffer"); const AVFilter * buffer_sink = avfilter_get_by_name("buffersink"); AVFilterInOut * outputs = avfilter_inout_alloc(); AVFilterInOut * inputs = avfilter_inout_alloc(); int ret = 0; m_buffer_sink_context = nullptr; m_buffer_source_context = nullptr; m_filter_graph = nullptr; try { if (!avg_frame_rate.den && !avg_frame_rate.num) { // No framerate, so this video "stream" has only one picture throw static_cast(AVERROR(EINVAL)); // Einzelbild-"Stream" } m_filter_graph = avfilter_graph_alloc(); if (outputs == nullptr || inputs == nullptr || m_filter_graph == nullptr) { throw static_cast(AVERROR(ENOMEM)); } // --- buffersrc (Quelle) direkt mit Args erstellen --- std::string args; strsprintf(&args, "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", codec_ctx->width, codec_ctx->height, pix_fmt, time_base.num, time_base.den, codec_ctx->sample_aspect_ratio.num, FFMAX(codec_ctx->sample_aspect_ratio.den, 1)); ret = avfilter_graph_create_filter(&m_buffer_source_context, buffer_src, "in", args.c_str(), nullptr, m_filter_graph); if (ret < 0) { Logging::error(virtname(), "Cannot create buffer source (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } // --- buffersink (Senke) mit Pre-Init-Optionen --- #if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(10, 6, 100) && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(59, 36, 100) // Neuer Weg: Array-Optionen (pixel_formats) + av_opt_set_array() m_buffer_sink_context = avfilter_graph_alloc_filter(m_filter_graph, buffer_sink, "out"); if (!m_buffer_sink_context) { throw static_cast(AVERROR(ENOMEM)); } // Nicht-Runtime-Optionen vor dem Init setzen { const enum AVPixelFormat pf = pix_fmt; // Wir ersetzen (ab Index 0) 1 Element in "pixel_formats" ret = av_opt_set_array(m_buffer_sink_context, "pixel_formats", AV_OPT_SEARCH_CHILDREN | AV_OPT_ARRAY_REPLACE, 0, /* start_elem */ 1, /* nb_elems */ AV_OPT_TYPE_PIXEL_FMT, &pf); if (ret < 0) { Logging::error(virtname(), "Cannot set buffersink pixel_formats (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } } ret = avfilter_init_str(m_buffer_sink_context, nullptr); if (ret < 0) { Logging::error(virtname(), "Cannot init buffer sink (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } #else // Alter Weg: int-list-Option (pix_fmts) vor Init setzen m_buffer_sink_context = avfilter_graph_alloc_filter(m_filter_graph, buffer_sink, "out"); if (!m_buffer_sink_context) { throw static_cast(AVERROR(ENOMEM)); } // Liste inkl. Terminator, wie in älteren Beispielen enum AVPixelFormat pixel_fmts[] = { pix_fmt, AV_PIX_FMT_NONE }; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" ret = av_opt_set_int_list(m_buffer_sink_context, "pix_fmts", pixel_fmts, AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN); #pragma GCC diagnostic pop if (ret < 0) { Logging::error(virtname(), "Cannot set output pixel format (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } ret = avfilter_init_str(m_buffer_sink_context, nullptr); if (ret < 0) { Logging::error(virtname(), "Cannot init buffer sink (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } #endif // Endpunkte für Graph outputs->name = av_strdup("in"); outputs->filter_ctx = m_buffer_source_context; outputs->pad_idx = 0; outputs->next = nullptr; inputs->name = av_strdup("out"); inputs->filter_ctx = m_buffer_sink_context; inputs->pad_idx = 0; inputs->next = nullptr; // args "null" passthrough (dummy) filter for video // args "null" passthrough (dummy) filter for audio // --- Deinterlace-Filterkette const char * filters; //filters = "yadif=mode=send_frame:parity=auto:deint=interlaced"; filters = "yadif=mode=send_frame:parity=auto:deint=all"; //filters = "yadif=0:-1:0"; //filters = "bwdif=mode=send_frame:parity=auto:deint=all"; //filters = "kerndeint=thresh=10:map=0:order=0:sharp=1:twoway=1"; //filters = "zoompan=z='min(max(zoom,pzoom)+0.0015,1.5)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'"; // vaapi_deinterlace=rate=field // format=nv12,hwupload,deinterlace_vaapi,hwdownload,format=nv12 // deinterlace_vaapi,scale_vaapi=w=1280:h=720,hwdownload,format=nv12 ret = avfilter_graph_parse_ptr(m_filter_graph, filters, &inputs, &outputs, nullptr); if (ret < 0) { Logging::error(virtname(), "avfilter_graph_parse_ptr failed (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } ret = avfilter_graph_config(m_filter_graph, nullptr); if (ret < 0) { Logging::error(virtname(), "avfilter_graph_config failed (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } Logging::debug(virtname(), "Deinterlacing initialised with filters '%1'.", filters); } catch (int _ret) { ret = _ret; } if (inputs != nullptr) { avfilter_inout_free(&inputs); } if (outputs != nullptr) { avfilter_inout_free(&outputs); } return ret; } int FFmpeg_Transcoder::send_filters(FFmpeg_Frame *srcframe, int & ret) { ret = 0; if (m_buffer_source_context != nullptr) { try { FFmpeg_Frame filterframe(srcframe->m_stream_idx); ret = filterframe.res(); if (ret < 0) { Logging::error(virtname(), "Unable to allocate filter frame (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } // push the decoded frame into the filtergraph ret = av_buffersrc_add_frame_flags(m_buffer_source_context, *srcframe, AV_BUFFERSRC_FLAG_KEEP_REF); if (ret < 0) { Logging::warning(virtname(), "Error while feeding the frame to filtergraph (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } // pull filtered frames from the filtergraph ret = av_buffersink_get_frame(m_buffer_sink_context, filterframe); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { // Not an error, go on ret = 0; } else if (ret < 0) { Logging::error(virtname(), "Error while getting frame from filtergraph (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } else { // All OK; copy filtered frame and unref original filterframe->pts = (*srcframe)->pts; filterframe->best_effort_timestamp = (*srcframe)->best_effort_timestamp; *srcframe = filterframe; } } catch (int _ret) { ret = _ret; } } return ret; } // free void FFmpeg_Transcoder::free_filters() { if (m_buffer_sink_context != nullptr) { avfilter_free(m_buffer_sink_context); m_buffer_sink_context = nullptr; } if (m_buffer_source_context != nullptr) { avfilter_free(m_buffer_source_context); m_buffer_source_context = nullptr; } if (m_filter_graph != nullptr) { avfilter_graph_free(&m_filter_graph); m_filter_graph = nullptr; } } int FFmpeg_Transcoder::stack_seek_frame(uint32_t frame_no) { if (frame_no > 0 && frame_no <= video_frame_count()) { std::lock_guard lock_seek_to_fifo_mutex(m_seek_to_fifo_mutex); m_seek_to_fifo.push(frame_no); // Seek to this frame next decoding operation return 0; } else { errno = EINVAL; Logging::error(virtname(), "stack_seek_frame() failed: Frame %1 was requested, but is out of range (1...%2)", frame_no, video_frame_count() + 1); return AVERROR(EINVAL); } } int FFmpeg_Transcoder::stack_seek_segment(uint32_t segment_no) { if (segment_no > 0 && segment_no <= segment_count()) { std::lock_guard lock_seek_to_fifo_mutex(m_seek_to_fifo_mutex); m_seek_to_fifo.push(segment_no); // Seek to this segment next decoding operation return 0; } else { errno = EINVAL; Logging::error(virtname(), "stack_seek() failed: Segment no. %1 was requested, but is out of range (1...%2)", segment_no, video_frame_count() + 1); return AVERROR(EINVAL); } } bool FFmpeg_Transcoder::is_multiformat() const { if (m_current_format == nullptr) { return false; } else { return m_current_format->is_multiformat(); } } bool FFmpeg_Transcoder::is_frameset() const { if (m_current_format == nullptr) { return false; } else { return m_current_format->is_frameset(); } } bool FFmpeg_Transcoder::is_hls() const { if (m_current_format == nullptr) { return false; } else { return m_current_format->is_hls(); } } bool FFmpeg_Transcoder::have_seeked() const { return m_have_seeked; } enum AVPixelFormat FFmpeg_Transcoder::get_format_static(AVCodecContext *input_codec_ctx, const enum AVPixelFormat *pix_fmts) { FFmpeg_Transcoder * pThis = static_cast(input_codec_ctx->opaque); return pThis->get_format(input_codec_ctx, pix_fmts); } enum AVPixelFormat FFmpeg_Transcoder::get_format(__attribute__((unused)) AVCodecContext *input_codec_ctx, const enum AVPixelFormat *pix_fmts) const { if (params.m_hwaccel_dec_device_type == AV_HWDEVICE_TYPE_NONE) { // We should never happen to end up here... Logging::error(filename(), "Unable to decode this file using hardware acceleration: Internal error! No hardware device type set."); return AV_PIX_FMT_NONE; } AVPixelFormat pix_fmt_expected = m_dec_hw_pix_fmt; for (const AVPixelFormat *p = pix_fmts; *p != AV_PIX_FMT_NONE; p++) { if (*p == pix_fmt_expected) { return pix_fmt_expected; } } Logging::error(filename(), "Unable to decode this file using hardware acceleration. Expected format '%1' not supported.", get_pix_fmt_name(pix_fmt_expected).c_str()); return AV_PIX_FMT_NONE; } int FFmpeg_Transcoder::hwdevice_ctx_create(AVBufferRef ** hwaccel_enc_device_ctx, AVHWDeviceType dev_type, const std::string & device) const { std::string active_device(device); int ret; if (active_device == "AUTO" && dev_type == AV_HWDEVICE_TYPE_VAAPI) { active_device = "/dev/dri/renderD128"; //** @todo HWACCEL - Try to autodetect rendering device } ret = av_hwdevice_ctx_create(hwaccel_enc_device_ctx, dev_type, !active_device.empty() ? active_device.c_str() : nullptr, nullptr, 0); if (ret < 0) { Logging::error(virtname(), "Failed to create a %1 device (error '%2').", hwdevice_get_type_name(dev_type), ffmpeg_geterror(ret).c_str()); return ret; } return 0; } int FFmpeg_Transcoder::hwdevice_ctx_add_ref(AVCodecContext *input_codec_ctx) { if (m_hwaccel_dec_device_ctx == nullptr) { int ret = AVERROR(EINVAL); Logging::error(virtname(), "INTERNAL ERROR: FFmpeg_Transcoder::hwdevice_ctx_add_ref()! HW decoder device context is NULL (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } input_codec_ctx->hw_device_ctx = av_buffer_ref(m_hwaccel_dec_device_ctx); if (input_codec_ctx->hw_device_ctx == nullptr) { int ret = AVERROR(ENOMEM); Logging::error(virtname(), "A hardware device reference create failed (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } input_codec_ctx->opaque = static_cast(this); input_codec_ctx->get_format = &FFmpeg_Transcoder::get_format_static; return 0; } void FFmpeg_Transcoder::hwdevice_ctx_free(AVBufferRef **hwaccel_device_ctx) { if (*hwaccel_device_ctx != nullptr) { av_buffer_unref(hwaccel_device_ctx); *hwaccel_device_ctx = nullptr; } } int FFmpeg_Transcoder::hwframe_ctx_set(AVCodecContext *output_codec_ctx, AVCodecContext *input_codec_ctx, AVBufferRef *hw_device_ctx) const { AVBufferRef *hw_new_frames_ref; AVHWFramesContext *frames_ctx = nullptr; int ret = 0; hw_new_frames_ref = av_hwframe_ctx_alloc(hw_device_ctx); if (hw_new_frames_ref == nullptr) { ret = AVERROR(ENOMEM); Logging::error(virtname(), "hwframe_ctx_set(): Failed to create hwframe context (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } frames_ctx = reinterpret_cast(hw_new_frames_ref->data); frames_ctx->format = m_enc_hw_pix_fmt; frames_ctx->sw_format = /*input_codec_ctx->sw_pix_fmt; */find_sw_fmt_by_hw_type(params.m_hwaccel_enc_device_type); frames_ctx->width = input_codec_ctx->width; frames_ctx->height = input_codec_ctx->height; frames_ctx->initial_pool_size = 20; // Driver default seems to be 17 ret = av_hwframe_ctx_init(hw_new_frames_ref); if (ret < 0) { Logging::error(virtname(), "hwframe_ctx_set(): Failed to initialise hwframe context (error '%1').", ffmpeg_geterror(ret).c_str()); av_buffer_unref(&hw_new_frames_ref); return ret; } output_codec_ctx->hw_frames_ctx = av_buffer_ref(hw_new_frames_ref); if (output_codec_ctx->hw_frames_ctx == nullptr) { ret = AVERROR(ENOMEM); Logging::error(virtname(), "hwframe_ctx_set(): A hardware frame reference create failed (error '%1').", ffmpeg_geterror(ret).c_str()); } av_buffer_unref(&hw_new_frames_ref); return ret; } //int FFmpeg_Transcoder::hwframe_ctx_set(AVCodecContext *output_codec_ctx, AVCodecContext *input_codec_ctx, AVBufferRef *hw_device_ctx) //{ // // If the decoder runs in hardware, we should use the decoder's frames context. This will save us from // // having to transfer frames from hardware to software and vice versa. // // If the decoder runs in software, create a new frames context. // if (input_codec_ctx->hw_frames_ctx != nullptr) // { // Logging::debug(virtname(), "Hardware encoder init: Hardware decoder active, using decoder hw_frames_ctx for encoder."); // /* we need to ref hw_frames_ctx of decoder to initialize encoder's codec. // Only after we get a decoded frame, can we obtain its hw_frames_ctx */ // output_codec_ctx->hw_frames_ctx = av_buffer_ref(input_codec_ctx->hw_frames_ctx); // if (!output_codec_ctx->hw_frames_ctx) // { // int ret = AVERROR(ENOMEM); // Logging::error(virtname(), "A hardware frame reference create failed (error '%1').", ffmpeg_geterror(ret).c_str()); // return ret; // } // m_hwaccel_dec = true; /* Doing decoding in hardware */ // } // else { // Logging::debug(virtname(), "Hardware encoder init: Software decoder active, creating new hw_frames_ctx for encoder."); // AVBufferRef *hw_new_frames_ref; // AVHWFramesContext *frames_ctx = nullptr; // int ret = 0; // if (!(hw_new_frames_ref = av_hwframe_ctx_alloc(hw_device_ctx))) // { // ret = AVERROR(ENOMEM); // Logging::error(virtname(), "Failed to create hwframe context (error '%1').", ffmpeg_geterror(ret).c_str()); // return ret; // } // frames_ctx = (AVHWFramesContext *)(hw_new_frames_ref->data); // frames_ctx->format = m_hw_pix_fmt; // frames_ctx->sw_format = find_sw_fmt_by_hw_type(params.m_hwaccel_enc_device_type); // frames_ctx->width = input_codec_ctx->width; // frames_ctx->height = input_codec_ctx->height; // frames_ctx->initial_pool_size = 20; // Driver default: 17 // if ((ret = av_hwframe_ctx_init(hw_new_frames_ref)) < 0) // { // Logging::error(virtname(), "Failed to initialise hwframe context (error '%1').", ffmpeg_geterror(ret).c_str()); // av_buffer_unref(&hw_new_frames_ref); // return ret; // } // output_codec_ctx->hw_frames_ctx = av_buffer_ref(hw_new_frames_ref); // if (!output_codec_ctx->hw_frames_ctx) // { // Logging::error(virtname(), "A hardware frame reference create failed (error '%1').", ffmpeg_geterror(AVERROR(ENOMEM))); // ret = AVERROR(ENOMEM); // } // av_buffer_unref(&hw_new_frames_ref); // m_hwaccel_dec = false; /* Doing decoding in software */ // } // return 0; //} int FFmpeg_Transcoder::hwframe_copy_from_hw(AVCodecContext * /*ctx*/, FFmpeg_Frame *sw_frame, const AVFrame * hw_frame) const { int ret; ret = av_frame_copy_props(*sw_frame, hw_frame); if (ret < 0) { Logging::error(filename(), "Failed to copy frame properties (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } ret = av_hwframe_transfer_data(*sw_frame, hw_frame, 0); if (ret < 0) { Logging::error(filename(), "Error while transferring frame data from surface (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } return 0; } int FFmpeg_Transcoder::hwframe_copy_to_hw(AVCodecContext *output_codec_ctx, FFmpeg_Frame *hw_frame, const AVFrame * sw_frame) const { int ret; ret = av_frame_copy_props(*hw_frame, sw_frame); if (ret < 0) { Logging::error(virtname(), "Failed to copy frame properties (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } ret = av_hwframe_get_buffer(output_codec_ctx->hw_frames_ctx, *hw_frame, 0); if (ret < 0) { Logging::error(virtname(), "Failed to copy frame buffers to hardware memory (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } if ((*hw_frame)->hw_frames_ctx == nullptr) { ret = AVERROR(ENOMEM); Logging::error(virtname(), "Failed to copy frame buffers to hardware memory (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } ret = av_hwframe_transfer_data(*hw_frame, sw_frame, 0); if (ret < 0) { Logging::error(virtname(), "Error while transferring frame data to surface (error '%1').", ffmpeg_geterror(ret).c_str()); return ret; } return 0; } /** * @todo HWACCEL - Supported formats * * Tested and working: VA-API, MMAL and OMX. * * Some VA-API formats do not yet work, see "fixit" * * V4LM2M: implemented, but untested * NIVIDA/CUDA: implemented, but untested * */ int FFmpeg_Transcoder::get_hw_decoder_name(AVCodecID codec_id, std::string *codec_name) const { std::string codec_name_buf; int ret = 0; switch (params.m_hwaccel_dec_API) { case HWACCELAPI::VAAPI: { ret = get_hw_vaapi_codec_name(codec_id, &codec_name_buf); break; } case HWACCELAPI::MMAL: { ret = get_hw_mmal_decoder_name(codec_id, &codec_name_buf); break; } //case HWACCELAPI::V4L2M2M: //{ // ret = get_hw_v4l2m2m_decoder_name(codec_id, &codec_name_buf); // break; //} case HWACCELAPI::NONE: default: { ret = AVERROR_DECODER_NOT_FOUND; break; } } if (codec_name != nullptr) { if (!ret) { *codec_name = codec_name_buf; } else { codec_name->clear(); } } return ret; } int FFmpeg_Transcoder::get_hw_encoder_name(AVCodecID codec_id, std::string *codec_name) const { std::string codec_name_buf; int ret = 0; switch (params.m_hwaccel_enc_API) { case HWACCELAPI::VAAPI: { ret = get_hw_vaapi_codec_name(codec_id, &codec_name_buf); break; } case HWACCELAPI::OMX: { ret = get_hw_omx_encoder_name(codec_id, &codec_name_buf); break; } //case HWACCELAPI::V4L2M2M: //{ // ret = get_hw_v4l2m2m_encoder_name(codec_id, &codec_name_buf); // break; //} case HWACCELAPI::NONE: default: { ret = AVERROR_DECODER_NOT_FOUND; break; } } if (codec_name != nullptr) { if (!ret) { *codec_name = codec_name_buf; } else { codec_name->clear(); } } return ret; } int FFmpeg_Transcoder::get_hw_vaapi_codec_name(AVCodecID codec_id, std::string *codec_name) const { int ret = 0; /** * *** Intel VAAPI de/encoder *** * * h264_vaapi H.264/AVC (VAAPI) (codec h264) * hevc_vaapi H.265/HEVC (VAAPI) (codec hevc) * mjpeg_vaapi MJPEG (VAAPI) (codec mjpeg) * mpeg2_vaapi MPEG-2 (VAAPI) (codec mpeg2video) * vp1_vaapi VC1 (VAAPI) (codec vc1) seems to be possible on my hardware * vp8_vaapi VP8 (VAAPI) (codec vp8) * vp9_vaapi VP9 (VAAPI) (codec vp9) * */ switch (codec_id) { case AV_CODEC_ID_H264: { *codec_name = "h264_vaapi"; break; } /** * @todo fixit, MPEG-1 decoding does not work... * * Program terminated with signal SIGSEGV, Segmentation fault. * #0 __memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:383 * 383 ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S: Datei oder Verzeichnis nicht gefunden. * [Current thread is 1 (Thread 0x7f95a24d4700 (LWP 16179))] * (gdb) bt * #0 __memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:383 * #1 0x00007f95903c4e26 in ?? () from /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so * #2 0x00007f95aaae80b8 in vaGetImage () from /lib/x86_64-linux-gnu/libva.so.2 * #3 0x00007f95af524bb5 in ?? () from /lib/x86_64-linux-gnu/libavutil.so.56 * #4 0x00007f95af5250fb in ?? () from /lib/x86_64-linux-gnu/libavutil.so.56 * #5 0x00007f95af51c37f in av_hwframe_transfer_data () from /lib/x86_64-linux-gnu/libavutil.so.56 * #6 0x00007f95af51c406 in av_hwframe_transfer_data () from /lib/x86_64-linux-gnu/libavutil.so.56 * #7 0x0000555da4fde146 in FFmpeg_Transcoder::decode_video_frame (this=0x7f9598002e90, pkt=0x7f95a24d2f90, decoded=0x7f95a24d2ec4) at ffmpeg_transcoder.cc:2655 * #8 0x0000555da4fde5cd in FFmpeg_Transcoder::decode_frame (this=0x7f9598002e90, pkt=0x7f95a24d2f90) at ffmpeg_transcoder.cc:2852 * #9 0x0000555da4fdea4b in FFmpeg_Transcoder::read_decode_convert_and_store (this=0x7f9598002e90, finished=0x7f95a24d3030) at ffmpeg_transcoder.cc:3189 * #10 0x0000555da4fdfa73 in FFmpeg_Transcoder::process_single_fr (this=this\@entry=0x7f9598002e90, status=@0x7f95a24d3134: 0) at ffmpeg_transcoder.cc:3987 * #11 0x0000555da4f8c997 in transcoder_thread (arg=optimized out) at transcode.cc:874 * #12 0x0000555da4fc54ef in thread_pool::loop_function (this=0x7f959c002b40) at thread_pool.cc:78 * #13 0x00007f95aeaf4c10 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6 * #14 0x00007f95ae9f0ea7 in start_thread (arg=optimized out) at pthread_create.c:477 * #15 0x00007f95ae920d4f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95 * */ //case AV_CODEC_ID_MJPEG: //{ // *codec_name = "mjpeg_vaapi"; // break; //} case AV_CODEC_ID_MPEG2VIDEO: { *codec_name = "mpeg2_vaapi"; break; } case AV_CODEC_ID_HEVC: { *codec_name = "hevc_vaapi"; break; } case AV_CODEC_ID_VC1: { *codec_name = "vc1_vaapi"; break; } case AV_CODEC_ID_VP8: { *codec_name = "vp9_vaapi"; break; } case AV_CODEC_ID_VP9: { *codec_name = "vp9_vaapi"; break; } default: { ret = AVERROR_DECODER_NOT_FOUND; break; } } return ret; } int FFmpeg_Transcoder::get_hw_mmal_decoder_name(AVCodecID codec_id, std::string *codec_name) const { int ret = 0; /** * *** MMAL decoder *** * * h264_mmal h264 (mmal) (codec h264) * mpeg2_mmal mpeg2 (mmal) (codec mpeg2video) * mpeg4_mmal mpeg4 (mmal) (codec mpeg4) * vc1_mmal vc1 (mmal) (codec vc1) * */ switch (codec_id) { case AV_CODEC_ID_H264: { *codec_name = "h264_mmal"; break; } /** * @todo mmal MPEG1 hardware acceleration not working. Probably because I have not bought a key... @n * @n * INFO : [/root/test/in/En Vogue - Don-t Let Go (Love) (Official Music Video) (mpeg2).mpeg] Transcoding to ts. @n * INFO : [/root/test/in/En Vogue - Don-t Let Go (Love) (Official Music Video) (mpeg2).mpeg] Hardware decoder acceleration active using codec 'mpeg2_mmal'. @n * INFO : [/root/test/in/En Vogue - Don-t Let Go (Love) (Official Music Video) (mpeg2).mpeg] Hardware decoder acceleration enabled. Codec 'mpeg2_mmal'. @n * mmal: mmal_vc_port_info_set: failed to set port info (2:0): EINVAL @n * mmal: mmal_vc_port_set_format: mmal_vc_port_info_set failed 0x6b985440 (EINVAL) @n * mmal: mmal_port_disable: port vc.ril.video_decode:in:0(MP2V)(0x6b985440) is not enabled @n * mmal: mmal_port_disable: port vc.ril.video_decode:out:0(0x6b985890) is not enabled @n * mmal: mmal_port_disable: port vc.ril.video_decode:ctr:0(0x6b94db90) is not enabled @n * ERROR : [/root/test/in/En Vogue - Don-t Let Go (Love) (Official Music Video) (mpeg2).mpeg] Failed to open video input codec for stream video (error '0'). @n * ERROR : [/root/test/in/En Vogue - Don-t Let Go (Love) (Official Music Video) (mpeg2).mpeg] Failed to open video codec (error 'Unknown error occurred'). @n * ERROR : [/root/test/out/En Vogue - Don-t Let Go (Love) (Official Music Video) (mpeg2).ts] Transcoding exited with error. @n * ERROR : [/root/test/out/En Vogue - Don-t Let Go (Love) (Official Music Video) (mpeg2).ts] System error: (5) Input/output error @n * ERROR : [/root/test/out/En Vogue - Don-t Let Go (Love) (Official Music Video) (mpeg2).ts] FFMpeg error: (-1313558101) Unknown error occurred */ case AV_CODEC_ID_MPEG2VIDEO: { *codec_name = "mpeg2_mmal"; break; } case AV_CODEC_ID_MPEG4: { *codec_name = "mpeg4_mmal"; break; } /** * @todo mmal VC1 hardware acceleration not working. Probably because I have not bought a key... @n * @n * INFO : [/root/test/in/Test_1440x576_WVC1_6Mbps.wmv] Hardware decoder acceleration active using codec 'vc1_mmal'. @n * INFO : [/root/test/in/Test_1440x576_WVC1_6Mbps.wmv] Hardware decoder acceleration enabled. Codec 'vc1_mmal'. @n * mmal: mmal_vc_port_info_set: failed to set port info (2:0): EINVAL @n * mmal: mmal_vc_port_set_format: mmal_vc_port_info_set failed 0x6e54c560 (EINVAL) @n * mmal: mmal_port_disable: port vc.ril.video_decode:in:0(WVC1)(0x6e54c560) is not enabled @n * mmal: mmal_port_disable: port vc.ril.video_decode:out:0(0x6e546660) is not enabled @n * mmal: mmal_port_disable: port vc.ril.video_decode:ctr:0(0x6e54c240) is not enabled @n * ERROR : [/root/test/in/Test_1440x576_WVC1_6Mbps.wmv] Failed to open video input codec for stream video (error '0'). @n * ERROR : [/root/test/in/Test_1440x576_WVC1_6Mbps.wmv] Failed to open video codec (error 'Unknown error occurred'). */ case AV_CODEC_ID_VC1: { *codec_name = "vc1_mmal"; break; } default: { ret = AVERROR_DECODER_NOT_FOUND; break; } } return ret; } //int FFmpeg_Transcoder::get_hw_v4l2m2m_decoder_name(AVCodecID codec_id, std::string *codec_name) const //{ // int ret = 0; // /** // * *** v4l2m2m (Video2linux) decoder *** // * // * h263_v4l2m2m V4L2 mem2mem H.263 decoder wrapper (codec h263) // * h264_v4l2m2m V4L2 mem2mem H.264 decoder wrapper (codec h264) // * hevc_v4l2m2m V4L2 mem2mem HEVC decoder wrapper (codec hevc) // * mpeg1_v4l2m2m V4L2 mem2mem MPEG1 decoder wrapper (codec mpeg1video) // * mpeg2_v4l2m2m V4L2 mem2mem MPEG2 decoder wrapper (codec mpeg2video) // * mpeg4_v4l2m2m V4L2 mem2mem MPEG4 decoder wrapper (codec mpeg4) // * vc1_v4l2m2m V4L2 mem2mem VC1 decoder wrapper (codec vc1) // * vp8_v4l2m2m V4L2 mem2mem VP8 decoder wrapper (codec vp8) // * vp9_v4l2m2m V4L2 mem2mem VP9 decoder wrapper (codec vp9) // */ // switch (codec_id) // { // case AV_CODEC_ID_H263: // { // *codec_name = "h263_v4l2m2m"; // break; // } // case AV_CODEC_ID_H264: // { // *codec_name = "h264_v4l2m2m"; // break; // } // case AV_CODEC_ID_H265: // { // *codec_name = "hevc_v4l2m2m"; // break; // } // case AV_CODEC_ID_MPEG1VIDEO: // { // *codec_name = "mpeg1_v4l2m2m"; // break; // } // case AV_CODEC_ID_MPEG2VIDEO: // { // *codec_name = "mpeg2_v4l2m2m"; // break; // } // case AV_CODEC_ID_MPEG4: // { // *codec_name = "mpeg4_v4l2m2m"; // break; // } // //case AV_CODEC_ID_VC1: /** @todo WMV is currently not supported */ // //{ // // *codec_name = "vc1_v4l2m2m"; // // break; // //} // case AV_CODEC_ID_VP8: // { // *codec_name = "vp8_v4l2m2m"; // break; // } // case AV_CODEC_ID_VP9: // { // *codec_name = "vp9_v4l2m2m"; // break; // } // default: // { // ret = AVERROR_DECODER_NOT_FOUND; // break; // } // } // return ret; //} int FFmpeg_Transcoder::get_hw_omx_encoder_name(AVCodecID codec_id, std::string *codec_name) const { int ret = 0; /** * *** Openmax encoder *** * * h264_omx OpenMAX IL H.264 video encoder (codec h264) */ switch (codec_id) { case AV_CODEC_ID_H264: { *codec_name = "h264_omx"; break; } default: { ret = AVERROR_DECODER_NOT_FOUND; break; } } return ret; } int FFmpeg_Transcoder::get_hw_v4l2m2m_encoder_name(AVCodecID codec_id, std::string *codec_name) const { int ret = 0; /** * * *** v4l2m2m (Video2linux) encoder *** * * h263_v4l2m2m V4L2 mem2mem H.263 encoder wrapper (codec h263) * h264_v4l2m2m V4L2 mem2mem H.264 encoder wrapper (codec h264) * hevc_v4l2m2m V4L2 mem2mem HEVC encoder wrapper (codec hevc) * mpeg4_v4l2m2m V4L2 mem2mem MPEG4 encoder wrapper (codec mpeg4) * vp8_v4l2m2m V4L2 mem2mem VP8 encoder wrapper (codec vp8) */ switch (codec_id) { case AV_CODEC_ID_H263: { *codec_name = "h263_v4l2m2m"; break; } case AV_CODEC_ID_H264: { *codec_name = "h264_v4l2m2m"; break; } case AV_CODEC_ID_H265: { *codec_name = "hevc_v4l2m2m"; break; } case AV_CODEC_ID_MPEG4: { *codec_name = "mpeg4_v4l2m2m"; break; } case AV_CODEC_ID_VP8: { *codec_name = "vp8_v4l2m2m"; break; } default: { ret = AVERROR_DECODER_NOT_FOUND; break; } } return ret; } AVPixelFormat FFmpeg_Transcoder::find_sw_fmt_by_hw_type(AVHWDeviceType type) { DEVICETYPE_MAP::const_iterator it = m_devicetype_map.find(type); if (it == m_devicetype_map.cend()) { return AV_PIX_FMT_NONE; } return it->second; } void FFmpeg_Transcoder::get_pix_formats(AVPixelFormat *in_pix_fmt, AVPixelFormat *out_pix_fmt, AVCodecContext* output_codec_ctx) const { *in_pix_fmt = static_cast(m_in.m_video.m_stream->codecpar->format); if (m_hwaccel_enable_dec_buffering) { *in_pix_fmt = find_sw_fmt_by_hw_type(params.m_hwaccel_dec_device_type); } if (output_codec_ctx == nullptr) { output_codec_ctx = m_out.m_video.m_codec_ctx.get(); } // Fail safe: If output_codec_ctx is NULL, set to something common (AV_PIX_FMT_YUV420P is widely used) *out_pix_fmt = (output_codec_ctx != nullptr) ? output_codec_ctx->pix_fmt : AV_PIX_FMT_YUV420P; if (*in_pix_fmt == AV_PIX_FMT_NONE) { // If input's stream pixel format is unknown, use same as output (may not work but at least will not crash FFmpeg) *in_pix_fmt = *out_pix_fmt; } // If hardware acceleration is enabled, e.g., output_codec_ctx->pix_fmt is AV_PIX_FMT_VAAPI // but the format actually is AV_PIX_FMT_NV12 so we use the correct value from sw_format in // the hardware frames context. if (m_hwaccel_enable_enc_buffering && output_codec_ctx != nullptr && output_codec_ctx->hw_frames_ctx != nullptr && output_codec_ctx->hw_frames_ctx->data != nullptr) { *out_pix_fmt = reinterpret_cast(output_codec_ctx->hw_frames_ctx->data)->sw_format; } } uint32_t FFmpeg_Transcoder::get_next_segment(int64_t pos) const { return (static_cast(pos / params.m_segment_duration + 1)); } bool FFmpeg_Transcoder::goto_next_segment(uint32_t next_segment) const { return (next_segment == m_current_segment + 1 && next_segment <= m_virtualfile->get_segment_count()); } bool FFmpeg_Transcoder::is_audio_stream(int stream_idx) const { return (stream_exists(stream_idx) && stream_idx == m_in.m_audio.m_stream_idx); } bool FFmpeg_Transcoder::is_video_stream(int stream_idx) const { return (stream_exists(stream_idx) && stream_idx == m_in.m_video.m_stream_idx); } bool FFmpeg_Transcoder::is_subtitle_stream(int stream_idx) const { StreamRef_map::const_iterator it = m_in.m_subtitle.find(stream_idx); return (it != m_in.m_subtitle.cend()); } FFmpeg_Transcoder::StreamRef * FFmpeg_Transcoder::get_out_subtitle_stream(int stream_idx) { StreamRef_map::iterator it = m_out.m_subtitle.find(stream_idx); if (it == m_out.m_subtitle.end()) { return nullptr; } return &it->second; } bool FFmpeg_Transcoder::stream_exists(int stream_idx) const { return (stream_idx != INVALID_STREAM); } void FFmpeg_Transcoder::add_stream_map(int in_stream_idx, int out_stream_idx) { if (in_stream_idx != INVALID_STREAM) { m_stream_map.insert(std::make_pair(in_stream_idx, out_stream_idx)); } } int FFmpeg_Transcoder::map_in_to_out_stream(int in_stream_idx) const { STREAM_MAP::const_iterator it = m_stream_map.find(in_stream_idx); if (it == m_stream_map.cend()) { return INVALID_STREAM; } return (it->second); } inline int FFmpeg_Transcoder::foreach_subtitle_file(const std::string& search_path, const std::regex& regex, int depth, const std::function &)> &f) { int ret = 0; try { const std::filesystem::directory_iterator end; for (std::filesystem::directory_iterator iter{ search_path }; iter != end && ret == 0; iter++) { const std::string subtitle_filename(iter->path().filename().string()); if (std::filesystem::is_regular_file(*iter)) { if (std::regex_match(subtitle_filename, regex)) { std::smatch res; if (std::regex_search(subtitle_filename.cbegin(), subtitle_filename.cend(), res, regex)) { if (res[2].length()) { ret = f(iter->path().string(), res[2]); } else { ret = f(iter->path().string(), std::nullopt); } } } } else if (std::filesystem::is_directory(*iter) && depth > 0) { ret = foreach_subtitle_file(iter->path().string(), regex, depth - 1, f); } } } catch (std::filesystem::filesystem_error& e) { ret = AVERROR(e.code().value()); Logging::error(filename(), "Could not open directory '%1' (error '%2').", search_path.c_str(), ffmpeg_geterror(ret).c_str()); } catch (std::bad_alloc & e) { ret = AVERROR(ENOMEM); Logging::error(filename(), "Could not open directory '%1' (error '%2').", search_path.c_str(), ffmpeg_geterror(ret).c_str()); } return ret; } int FFmpeg_Transcoder::read_packet(void *opaque, uint8_t *buf, int buf_size) { BUFFER_DATA *bd = static_cast(opaque); buf_size = FFMIN(buf_size, static_cast(bd->size)); if (!buf_size) { return AVERROR_EOF; } /* copy internal buffer data to buf */ std::memcpy(buf, bd->ptr, static_cast(buf_size)); bd->ptr += buf_size; bd->size -= static_cast(buf_size); return buf_size; } int FFmpeg_Transcoder::add_external_subtitle_stream(const std::string & subtitle_file, const std::optional & language) { AVFormatContext *format_ctx = nullptr; AVIOContext *avio_ctx = nullptr; uint8_t *buffer = nullptr; size_t buffer_size; int ret = 0; if (language) { Logging::debug(filename(), "Adding external subtitle stream: %1 [%2]", subtitle_file.c_str(), language->c_str()); } else { Logging::debug(filename(), "Adding external subtitle stream: %1", subtitle_file.c_str()); } try { uint8_t *avio_ctx_buffer = nullptr; int avio_ctx_buffer_size = 4096; BUFFER_DATA bd = { nullptr, 0 }; // slurp file content into buffer ret = av_file_map(subtitle_file.c_str(), &buffer, &buffer_size, 0, nullptr); if (ret < 0) { throw ret; } // fill opaque structure used by the AVIOContext read callback bd.ptr = buffer; bd.size = buffer_size; format_ctx = avformat_alloc_context(); if (format_ctx == nullptr) { throw AVERROR(ENOMEM); } avio_ctx_buffer = reinterpret_cast(av_malloc(static_cast(avio_ctx_buffer_size))); if (avio_ctx_buffer == nullptr) { throw AVERROR(ENOMEM); } avio_ctx = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size, 0, &bd, &read_packet, nullptr, nullptr); if (avio_ctx == nullptr) { throw AVERROR(ENOMEM); } format_ctx->pb = avio_ctx; ret = avformat_open_input(&format_ctx, nullptr, nullptr, nullptr); if (ret < 0) { Logging::error(filename(), "Could not open input file (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } ret = avformat_find_stream_info(format_ctx, nullptr); if (ret < 0) { Logging::error(filename(), "Could not find stream info (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } //av_dump_format(format_ctx, 0, subtitle_file.c_str(), 0); AVCodecContext * codec_ctx = nullptr; int stream_idx = INVALID_STREAM; ret = open_bestmatch_decoder(format_ctx, &codec_ctx, &stream_idx, AVMEDIA_TYPE_SUBTITLE); if (ret < 0 && ret != AVERROR_STREAM_NOT_FOUND) // AVERROR_STREAM_NOT_FOUND is not an error { Logging::error(filename(), "Failed to open video codec (error '%1').", ffmpeg_geterror(ret).c_str()); throw ret; } if (ret != AVERROR_STREAM_NOT_FOUND) { AVCodecID codec_id = m_current_format->subtitle_codec(codec_ctx->codec_id); // Get matching output codec if (codec_id != AV_CODEC_ID_NONE) { StreamRef input_streamref; codec_ctx->pkt_timebase = codec_ctx->time_base = format_ctx->streams[0]->time_base; // We have a subtitle stream input_streamref.set_codec_ctx(codec_ctx); input_streamref.m_stream = format_ctx->streams[0]; input_streamref.m_stream_idx = INVALID_STREAM; //m_active_stream_msk |= FFMPEGFS_SUBTITLE; ret = add_subtitle_stream(codec_id, input_streamref, language); if (ret < 0) { throw ret; } AVPacket pkt; int output_stream_index = ret; // Read one frame from the input file into a temporary packet. while ((ret = av_read_frame(format_ctx, &pkt)) == 0) { int decoded; ret = decode_subtitle(codec_ctx, &pkt, &decoded, output_stream_index); if (ret < 0) { throw ret; } } } } if (ret == AVERROR_EOF) { ret = 0; } } catch (int _ret) { ret = _ret; } avformat_close_input(&format_ctx); // note: the internal buffer could have changed, and be != avio_ctx_buffer if (avio_ctx != nullptr) { av_freep(&avio_ctx->buffer); } avio_context_free(&avio_ctx); av_file_unmap(buffer, buffer_size); return ret; } int FFmpeg_Transcoder::add_external_subtitle_streams() { int ret; try { std::filesystem::path file(filename()); std::string stem(file.stem().string()); // Escape characters that are meaningful to regexp. regex_escape(&stem); std::string regex_string("^(" + stem + "[.])(.*)([.]srt|[.]vtt)|^(" + stem + ")([.]srt|[.]vtt)"); // filename.srt/vtt or filename.lang.srt/vtt std::regex regex(regex_string, std::regex::ECMAScript); //ret = foreach_subtitle_file( // file.parent_path(), // regex, // 0, // std::bind(&FFmpeg_Transcoder::add_external_subtitle_stream, this, std::placeholders::_1, std::placeholders::_2)); // clang-tidy now recommends a lambda ret = foreach_subtitle_file( file.parent_path().string(), regex, 0, [this](const std::string & subtitle_file, const std::optional & language) { add_external_subtitle_stream(std::forward(subtitle_file), std::forward(language)); return 0; }); // Ugly, but a lambda would also be possible //ret = foreach_subtitle_file( // file.parent_path(), // regex, // 0, // [this](const std::string & subtitle_file, const std::optional & language) //{ // if (language) // { // Logging::error(filename(), "[%1] %2", language->c_str(), subtitle_file.c_str()); // } // else // { // Logging::error(filename(), "%1", subtitle_file.c_str()); // } // return 0; //}); } catch (std::regex_error & e) { ret = 0; // Ignore error Logging::error(filename(), "INTERNAL ERROR: FFmpeg_Transcoder::add_external_subtitle_streams()! Unable to create reg exp: %1", e.what()); } return ret; } int64_t FFmpeg_Transcoder::pts() const { MULTIFRAME_MAP::const_reverse_iterator it = m_frame_map.crbegin(); if (it != m_frame_map.crend()) { return it->first; } else { return 0; } } uint32_t FFmpeg_Transcoder::last_seek_frame_no() const { return m_last_seek_frame_no; } ffmpegfs-2.18/src/blurayio.h0000644000000000000000000001416615166175407012742 00000000000000/* * Copyright (C) 2018-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file blurayio.h * @brief Blu-ray I/O * * This is only available if built with -DUSE_LIBBLURAY parameter. * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2018-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef BLURAYIO_H #define BLURAYIO_H #pragma once #ifdef USE_LIBBLURAY #include "fileio.h" #include typedef struct bluray BLURAY; /**< @brief Forward declaration of libbluray handle */ /** * @brief Blu-ray I/O class */ class BlurayIO : public FileIO { public: /** * @brief Create #BlurayIO object */ explicit BlurayIO(); /** * @brief Free #BlurayIO object */ virtual ~BlurayIO(); /** * @brief Get type of the virtual file * @return Returns the type of the virtual file. */ virtual VIRTUALTYPE type() const override; /** * @brief Get the ideal buffer size. * @return Return the ideal buffer size. */ virtual size_t bufsize() const override; /** * @brief Open a virtual file * @param[in] virtualfile - LPCVIRTUALFILE of file to open * @return Upon successful completion, #openio() returns 0. @n * On error, an nonzero value is returned and errno is set to indicate the error. */ virtual int openio(LPVIRTUALFILE virtualfile) override; /** * @brief Read data from file * @param[out] data - buffer to store read bytes in. Must be large enough to hold up to size bytes. * @param[in] size - number of bytes to read * @return Upon successful completion, #readio() returns the number of bytes read. @n * This may be less than size. @n * On error, the value 0 is returned and errno is set to indicate the error. @n * If at end of file, 0 may be returned but errno not set. error() will return 0 if at EOF. */ virtual size_t readio(void *data, size_t size) override; /** * @brief Get last error. * @return errno value of last error. */ virtual int error() const override; /** * @brief Get the duration of the file, in AV_TIME_BASE fractional seconds. * @return Returns the duration of the file, in AV_TIME_BASE fractional seconds. */ virtual int64_t duration() const override; /** * @brief Get the file size. * @return Returns the file size. */ virtual size_t size() const override; /** * @brief Get current read position. * @return Gets the current read position. */ virtual size_t tell() const override; /** * @brief Seek to position in file * * Repositions the offset of the open file to the argument offset according to the directive whence. * * @param[in] offset - offset in bytes * @param[in] whence - how to seek: @n * SEEK_SET: The offset is set to offset bytes. @n * SEEK_CUR: The offset is set to its current location plus offset bytes. @n * SEEK_END: The offset is set to the size of the file plus offset bytes. * @return Upon successful completion, #seek() returns the resulting offset location as measured in bytes * from the beginning of the file. @n * On error, the value -1 is returned and errno is set to indicate the error. */ virtual int seek(int64_t offset, int whence) override; /** * @brief Check if at end of file. * @return Returns true if at end of file. */ virtual bool eof() const override; /** * @brief Close virtual file. */ virtual void closeio() override; private: /** * @brief Close virtual file. * Non-virtual version to be safely called from constructor/destructor */ void pvt_close(); protected: BLURAY * m_bd; /**< @brief Blu-ray disk handle */ bool m_is_eof; /**< @brief true if at end of virtual file */ int m_errno; /**< @brief Last errno */ size_t m_rest_size; /**< @brief Rest bytes in buffer */ size_t m_rest_pos; /**< @brief Position in buffer */ int64_t m_cur_pos; /**< @brief Current position in virtual file */ int64_t m_start_pos; /**< @brief Start offset in bytes */ int64_t m_end_pos; /**< @brief End offset in bytes (not including this byte) */ bool m_full_title; /**< @brief If true, ignore m_chapter_no and provide full track */ uint32_t m_title_idx; /**< @brief Track index (track number - 1) */ unsigned m_chapter_idx; /**< @brief Chapter index (chapter number - 1) */ unsigned m_angle_idx; /**< @brief Selected angle index (angle number -1) */ std::array m_data; /**< @brief Buffer for readio() data */ int64_t m_duration; /**< @brief Track/chapter duration, in AV_TIME_BASE fractional seconds. */ }; #endif // USE_LIBBLURAY #endif // BLURAYIO_H ffmpegfs-2.18/src/cache_maintenance.cc0000644000000000000000000002412515166175407014653 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file cache_maintenance.cc * @brief #Cache maintenance implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "cache_maintenance.h" #include "ffmpegfs.h" #include "logging.h" #include #include #include /* shmat(), IPC_RMID */ #include /* sem_open(), sem_destroy(), sem_wait().. */ #define CLOCKID CLOCK_REALTIME /**< @brief Use real time clock here. */ #define SIGMAINT SIGRTMIN /**< @brief Map maintenance signal. */ #define SEM_OPEN_FILE "/" PACKAGE_NAME "_04806785-b5fb-4615-ba56-b30a2946e80b" /**< @brief Shared semaphore name, should be unique system wide. */ static sigset_t mask; /**< @brief Process mask for timer */ static timer_t timerid; /**< @brief Timer id */ static sem_t * sem; /**< @brief Semaphore used to synchronise between master and slave processes */ static int shmid; /**< @brief Shared memory segment ID */ static pid_t * pid_master; /**< @brief PID of master process */ static bool master; /**< @brief If true, we are master */ static void maintenance_handler(int sig, __attribute__((unused)) siginfo_t *si, __attribute__((unused)) void *uc); static bool start_timer(time_t interval); static bool stop_timer(); static bool link_up(); static void master_check(); static bool link_down(); /** * @brief Run maintenance handler * @param[in] sig - Signal, must be SIGMAINT. * @param[in] si * @param[in] uc */ static void maintenance_handler(int sig, __attribute__((unused)) siginfo_t *si, __attribute__((unused)) void *uc) { if (sig != SIGMAINT) { // Wrong signal. Should never happen. return; } master_check(); if (master) { Logging::info(nullptr, "Running periodic cache maintenance."); transcoder_cache_maintenance(); } } /** * @brief Start the maintenance timer at predefined interval. * @param[in] interval - Timer interval in seconds. * @return On success, returns true. On error, returns false. Check errno for details. */ static bool start_timer(time_t interval) { struct sigevent sev; struct itimerspec its; long long freq_nanosecs; struct sigaction sa; freq_nanosecs = interval * 1000000000LL; Logging::trace(nullptr, "Starting maintenance timer with %1period.", format_time(interval).c_str()); // Establish maintenance_handler for timer signal sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = maintenance_handler; sigemptyset(&sa.sa_mask); if (sigaction(SIGMAINT, &sa, nullptr) == -1) { Logging::error(nullptr, "start_timer(): sigaction failed: (%1) %2", errno, strerror(errno)); return false; } // Block timer signal temporarily sigemptyset(&mask); sigaddset(&mask, SIGMAINT); if (sigprocmask(SIG_SETMASK, &mask, nullptr) == -1) { Logging::error(nullptr, "start_timer(): sigprocmask(SIG_SETMASK) failed: (%1) %2", errno, strerror(errno)); return false; } // Create the timer sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIGMAINT; sev.sigev_value.sival_ptr = &timerid; if (timer_create(CLOCKID, &sev, &timerid) == -1) { Logging::error(nullptr, "start_timer(): timer_create failed: (%1) %2", errno, strerror(errno)); return false; } // Start the timer its.it_value.tv_sec = static_cast(freq_nanosecs / 1000000000); its.it_value.tv_nsec = static_cast(freq_nanosecs % 1000000000); its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; if (timer_settime(timerid, 0, &its, nullptr) == -1) { Logging::error(nullptr, "start_timer(): timer_settime failed: (%1) %2", errno, strerror(errno)); return false; } if (sigprocmask(SIG_UNBLOCK, &mask, nullptr) == -1) { Logging::error(nullptr, "start_timer(): sigprocmask(SIG_UNBLOCK) failed: (%1) %2", errno, strerror(errno)); } Logging::trace(nullptr, "The maintenance timer started successfully."); return true; } /** * @brief Stop the maintenance timer. * @return On success, returns true. On error, returns false. Check errno for details. */ static bool stop_timer() { Logging::info(nullptr, "Stopping the maintenance timer."); if (timer_delete(timerid) == -1 && errno) { Logging::error(nullptr, "stop_timer(): timer_delete failed: (%1) %2", errno, strerror(errno)); return false; } return true; } /** * @brief Set system wide inter process link up. * @return On success, returns true. On error, returns false. Check errno for details. */ static bool link_up() { key_t shmkey; Logging::debug(nullptr, "Activating " PACKAGE " inter-process link."); // initialise a shared variable in shared memory shmkey = ftok ("/dev/null", 5); // valid directory name and a number if (shmkey == -1) { Logging::error(nullptr, "link_up(): ftok error (%1) %2", errno, strerror(errno)); return false; } // First try to open existing memory. shmid = shmget (shmkey, sizeof (pid_t), S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); if (shmid != -1) { // Shared memory already exists, seems we are client. master = false; } else { // Ignore error at first, try to create memory. shmid = shmget (shmkey, sizeof (pid_t), IPC_CREAT | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); if (shmid != -1) { // Shared memory freshly created, seems we are master. master = true; } else { Logging::error(nullptr, "link_up(): shmget error (%1) %2", errno, strerror(errno)); return false; } } pid_master = static_cast(shmat (shmid, nullptr, 0)); // attach pid_master to shared memory if (master) { *pid_master = getpid(); Logging::info(nullptr, "The process with PID %1 is now master.", *pid_master); } else { Logging::info(nullptr, "The process with PID %1 is now a client, and PID %2 is the master.", getpid(), *pid_master); } // Also create inter-process semaphore. sem = sem_open(const_cast(SEM_OPEN_FILE), O_CREAT, 0777, 1); if (sem == SEM_FAILED) { Logging::error(nullptr, "link_up(): sem_open error (%1) %2", errno, strerror(errno)); link_down(); return false; } return true; } /** * @brief Check if a master is already running. We become master if not. */ static void master_check() { pid_t pid_self = getpid(); if (*pid_master == pid_self) { Logging::trace(nullptr, "The process with PID %1 is already master.", pid_self); return; } sem_wait(sem); // Check if master process still exists int master_running = (getpgid(*pid_master) >= 0); Logging::trace(nullptr, "Master with PID %1 is %2 running.", *pid_master, master_running ? "still" : "NOT"); if (!master_running) { Logging::info(nullptr, "Master with PID %1 is gone. PID %2 taking over as new master.", *pid_master, pid_self); // Register us as master *pid_master = pid_self; master = true; } sem_post(sem); } /** * @brief Set system wide inter process link down. * @return On success, returns true. On error, returns false. Check errno for details. */ static bool link_down() { struct shmid_ds buf; bool success = true; Logging::info(nullptr, "Shutting " PACKAGE " inter-process link down."); if (sem != nullptr && sem_close(sem)) { Logging::error(nullptr, "link_down(): sem_close error (%1) %2", errno, strerror(errno)); success = false; } // shared memory detach if (shmdt (pid_master)) { Logging::error(nullptr, "link_down(): shmdt error (%1) %2", errno, strerror(errno)); success = false; } if (shmctl(shmid, IPC_STAT, &buf)) { Logging::error(nullptr, "link_down(): shmctl error (%1) %2", errno, strerror(errno)); success = false; } else { if (!buf.shm_nattch) { if (shmctl (shmid, IPC_RMID, nullptr)) { Logging::error(nullptr, "link_down(): shmctl error (%1) %2", errno, strerror(errno)); success = false; } // unlink prevents the semaphore existing forever // if a crash occurs during the execution if (sem_unlink(SEM_OPEN_FILE)) { Logging::error(nullptr, "link_down(): sem_unlink error (%1) %2", errno, strerror(errno)); success = false; } } } return success; } bool start_cache_maintenance(time_t interval) { // Start link if (!link_up()) { return false; } // Now start timer return start_timer(interval); } bool stop_cache_maintenance() { bool success = true; // Stop timer first if (!stop_timer()) { success = false; } // Now shut down link if (!link_down()) { success = false; } return success; } ffmpegfs-2.18/src/ffmpeg_utils.h0000644000000000000000000012277015166176107013577 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_utils.h * @brief Various FFmpegfs utility functions * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef FFMPEG_UTILS_H #define FFMPEG_UTILS_H #pragma once #ifdef HAVE_CONFIG_H #include "config.h" #endif #if !defined(EXTRA_VERSION) #define FFMPEFS_VERSION PACKAGE_VERSION /**< @brief FFmpegfs version number */ #else #define FFMPEFS_VERSION PACKAGE_VERSION "-" EXTRA_VERSION /**< @brief FFmpegfs version number */ #endif #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS 1 /**< @brief Force PRId64 defines */ #endif // !__STDC_FORMAT_MACROS #include "ffmpeg_compat.h" #include #include #include #include #include #include #include #ifndef PATH_MAX #include #endif #ifdef __cplusplus extern "C" { #endif // Disable annoying warnings outside our code #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #include #pragma GCC diagnostic pop #ifdef __cplusplus } #endif #define INVALID_STREAM -1 /**< @brief Denote an invalid stream */ #ifndef LIBAVUTIL_VERSION_MICRO #error "LIBAVUTIL_VERSION_MICRO not defined. Missing include header?" #endif /** * Allow use of av_format_inject_global_side_data when available */ #define HAVE_AV_FORMAT_INJECT_GLOBAL_SIDE_DATA (LIBAVFORMAT_VERSION_MICRO >= 100 && LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 64, 101) && LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(60, 14, 100)) /** * Add av_get_media_type_string function if missing */ #define HAVE_MEDIA_TYPE_STRING (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(55, 34, 101)) #if HAVE_MEDIA_TYPE_STRING /** * Map to av_get_media_type_string function. */ #define get_media_type_string av_get_media_type_string #else /** * @brief av_get_media_type_string is missing, so we provide our own. * @param[in] media_type - Media type to map. * @return Pointer to media type string. */ const char *get_media_type_string(enum AVMediaType media_type); #endif /** * Min. FFmpeg version for VULKAN hardware acceleration support * 2020-02-04 - xxxxxxxxxx - lavu 56.39.100 - hwcontext.h * Add AV_PIX_FMT_VULKAN * Add AV_HWDEVICE_TYPE_VULKAN and implementation. */ #define HAVE_VULKAN_HWACCEL (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(56, 39, 100)) #ifndef AV_ROUND_PASS_MINMAX /** * Ignore if this is missing */ #define AV_ROUND_PASS_MINMAX 0 #endif // These once had a different name #if !defined(AV_CODEC_CAP_TRUNCATED) && defined(CODEC_CAP_TRUNCATED) #define AV_CODEC_CAP_TRUNCATED CODEC_CAP_TRUNCATED /**< @brief AV_CODEC_CAP_TRUNCATED is missing in older FFmpeg versions */ #endif #if !defined(AV_CODEC_FLAG_TRUNCATED) && defined(CODEC_FLAG_TRUNCATED) #define AV_CODEC_FLAG_TRUNCATED CODEC_FLAG_TRUNCATED /**< @brief AV_CODEC_FLAG_TRUNCATED is missing in older FFmpeg versions */ #endif #ifndef AV_CODEC_FLAG_GLOBAL_HEADER #define AV_CODEC_FLAG_GLOBAL_HEADER CODEC_FLAG_GLOBAL_HEADER /**< @brief AV_CODEC_FLAG_GLOBAL_HEADER is missing in older FFmpeg versions */ #endif #ifndef FF_INPUT_BUFFER_PADDING_SIZE #define FF_INPUT_BUFFER_PADDING_SIZE 256 /**< @brief FF_INPUT_BUFFER_PADDING_SIZE is missing in newer FFmpeg versions */ #endif #ifndef AV_CODEC_CAP_VARIABLE_FRAME_SIZE #define AV_CODEC_CAP_VARIABLE_FRAME_SIZE CODEC_CAP_VARIABLE_FRAME_SIZE /**< @brief AV_CODEC_CAP_VARIABLE_FRAME_SIZE is missing in older FFmpeg versions */ #endif #if (LIBAVUTIL_VERSION_MAJOR > 54) #define BITRATE int64_t /**< @brief For FFmpeg bit rate is an int64. */ #else #define BITRATE int /**< @brief For FFmpeg bit rate is an int. */ #endif #define SAFE_VALUE(p, v, d) (((p) != nullptr) ? (p)->v : d) /**< @brief Access struct/class pointer safely, return default if nullptr */ /** * File types */ enum class FILETYPE { UNKNOWN, MP3, MP4, WAV, OGG, WEBM, MOV, AIFF, OPUS, PRORES, ALAC, PNG, JPG, BMP, TS, HLS, FLAC, MKV, }; /** * MP4/MOV/ALAC profiles */ enum class PROFILE { INVALID = -1, /**< @brief Profile is invalid */ DEFAULT = 0, /**< @brief No specific profile/Don't care */ // MP4 MP4_FF = 1, /**< @brief Firefox */ MP4_EDGE, /**< @brief MS Edge */ MP4_IE, /**< @brief MS Internet Explorer */ MP4_CHROME, /**< @brief Google Chrome */ MP4_SAFARI, /**< @brief Apple Safari */ MP4_OPERA, /**< @brief Opera */ MP4_MAXTHON, /**< @brief Maxthon */ // HLS/ts HLS_DEFAULT = DEFAULT, /**< @brief HLS/ts uses no profile */ // mov MOV_DEFAULT = DEFAULT, /**< @brief MOV uses no profile */ // MOV/ProRes PRORES_DEFAULT = DEFAULT, /**< @brief MOV/ProRes uses no profile */ // MOV/ProRes ALAC_DEFAULT = DEFAULT, /**< @brief Default profile */ ALAC_ITUNES = 10, /**< @brief Optimised for iTunes */ // WebM WEBM_DEFAULT = DEFAULT, /**< @brief WebM uses no profile */ }; /** * Prores levels */ enum class PRORESLEVEL { NONE = -1, /**< @brief No level */ // Prores profiles PRORES_PROXY = 0, /**< @brief Prores Level: PROXY */ PRORES_LT, /**< @brief Prores Level: LT */ PRORES_STANDARD, /**< @brief Prores Level: STANDARD */ PRORES_HQ, /**< @brief Prores Level: HQ */ }; /** * Auto copy options */ enum class AUTOCOPY { OFF = 0, /**< @brief Never copy streams, transcode always. */ MATCH, /**< @brief Copy stream if target supports codec. */ MATCHLIMIT, /**< @brief Same as MATCH, only copy if target not larger transcode otherwise. */ STRICT, /**< @brief Copy stream if codec matches desired target, transcode otherwise. */ STRICTLIMIT, /**< @brief Same as STRICT, only copy if target not larger, transcode otherwise. */ }; /** * Recode to same format options */ enum class RECODESAME { NO = 0, /**< @brief Never recode to same format. */ YES, /**< @brief Always recode to same format. */ }; /** * List of sample formats. * User selection, we don't care about planar or interleaved. */ enum class SAMPLE_FMT { FMT_DONTCARE = -1, /**< @brief Don't care, leave to FFmpegfs to choose */ FMT_8, /**< @brief 8 bit integer */ FMT_16, /**< @brief 16 bit integer */ FMT_24, /**< @brief 24 bit integer */ FMT_32, /**< @brief 32 bit integer */ FMT_64, /**< @brief 64 bit integer */ FMT_F16, /**< @brief 16 bit floating point */ FMT_F24, /**< @brief 24 bit floating point */ FMT_F32, /**< @brief 32 bit floating point */ FMT_F64 /**< @brief 64 bit floating point */ }; /** * Format options: Defines file extension, codecs etc. * for each format. */ struct Format_Options { friend class FFmpegfs_Format; typedef std::vector CODEC_VECT; /**< @brief Vector with valid codec ids for file format */ /** * Format options: Audio/video codecs and sample format */ typedef struct _tagFORMAT { CODEC_VECT m_video_codec; /**< @brief AVCodec used for video encoding */ CODEC_VECT m_audio_codec; /**< @brief AVCodec used for audio encoding */ CODEC_VECT m_subtitle_codec; /**< @brief AVCodec used for subtitle encoding */ AVSampleFormat m_sample_format; /**< @brief AVSampleFormat for audio encoding, may be AV_SAMPLE_FMT_NONE for "don't care" */ } FORMAT; typedef std::map FORMAT_MAP; /**< @brief Map of formats. One entry per format derivative. */ public: /** * @brief Construct Format_Options object with defaults (empty) */ Format_Options(); /** * @brief Construct Format_Options object * @param[in] format_name - Descriptive name of the format, e.g. "Opus Audio", * @param[in] fileext - File extension: mp4, mp3, flac or other * @param[in] format - Format options: Possible audio/video codecs and sample formats * @param[in] albumart_supported - true if album arts are supported (eg. mp3) or false if not (e.g. wav, aiff */ Format_Options(std::string format_name, std::string fileext, FORMAT_MAP format, bool albumart_supported ); /** * @brief Convert destination type to "real" type, i.e., the file extension to be used. * @note Currently "prores" is mapped to "mov". * @return Destination type */ const std::string & format_name() const; /** * @brief Get file extension * @return File extension */ const std::string & fileext() const; /** * @brief Get video codec_id * @return Returns video codec_id */ AVCodecID video_codec() const; /** * @brief Check if video codec/file format combination is supported * @param[in] codec_id - Codec ID to check * @return Returns true if supported, false if not. */ bool is_video_codec_supported(AVCodecID codec_id) const; /** * @brief Create a list of supported audio codecs for current audio codec * @return Returns comma separated list of formats, or empty if not available. */ std::string video_codec_list() const; /** * @brief Get audio codec_id * @return Returns audio codec_id */ AVCodecID audio_codec() const; /** * @brief Check if audio codec/file format combination is supported * @param[in] codec_id - Codec ID to check * @return Returns true if supported, false if not. */ bool is_audio_codec_supported(AVCodecID codec_id) const; /** * @brief Create a list of supported audio codecs for current audio codec * @return Returns comma separated list of formats, or empty if not available. */ std::string audio_codec_list() const; /** * @brief Get sample format (bit width) * @return Returns sample format */ AVSampleFormat sample_format() const; /** * @brief Check if audio codec/sample format combination is supported * @return Returns true if supported, false if not. */ bool is_sample_fmt_supported() const; /** * @brief Create a list of supported sample formats for current audio codec * @return Returns comma separated list of formats, or empty if not available. */ std::string sample_fmt_list() const; /** * @brief Get subtitle codec_id * @param[in] codec_id - Input stream codec ID * @return Returns subtitle codec_id that matches the input stream codec ID, or AV_CODEC_ID_NONE of no match. */ AVCodecID subtitle_codec(AVCodecID codec_id) const; protected: /** * @brief Descriptive name of the format. * Descriptive name of the format, e.g. "opus", "mpegts". * Please note that m_format_name is used to select the FFmpeg container * by passing it to avformat_alloc_output_context2(). * Mostly, but not always, same as m_fileext. */ std::string m_format_name; std::string m_fileext; /**< @brief File extension: mp4, mp3, flac or other. Mostly, but not always, same as m_format_name. */ FORMAT_MAP m_format_map; /**< @brief Format definition (audio/videocodec, sample format) */ bool m_albumart_supported; /**< @brief true if album arts are supported (eg. mp3) or false if not (e.g. wav, aiff) */ }; /** * @brief The #FFmpegfs_Format class */ class FFmpegfs_Format { typedef std::map OPTIONS_MAP; /**< @brief Map of options. One entry per supported destination type. */ public: /** * @brief Construct FFmpegfs_Format object */ FFmpegfs_Format(); /** * @brief Get codecs for the selected destination type. * @param[in] desttype - Destination type (MP4, WEBM etc.). * @return Returns true if format was found; false if not. */ bool init(const std::string & desttype); /** * @brief Convert destination type to "real" type, i.e., the file extension to be used. * @note Currently "prores" is mapped to "mov". * @return Destination type */ const std::string & format_name() const; /** * @brief Get destination type * @return Destination type */ const std::string & desttype() const; /** * @brief Get file extension * @return File extension */ const std::string & fileext() const; /** * @brief Get selected filetype. * @return Returns selected filetype. */ FILETYPE filetype() const; /** * @brief Get video codec_id * @return Returns video codec_id */ AVCodecID video_codec() const; /** * @brief Check if video codec/file format combination is supported * @param[in] codec_id - Codec ID to check * @return Returns true if supported, false if not. */ bool is_video_codec_supported(AVCodecID codec_id) const; /** * @brief Create a list of supported audio codecs for current audio codec * @return Returns comma separated list of formats, or empty if not available. */ std::string video_codec_list() const; /** * @brief Get audio codec_id * @return Returns audio codec_id */ AVCodecID audio_codec() const; /** * @brief Check if audio codec/file format combination is supported * @param[in] codec_id - Codec ID to check * @return Returns true if supported, false if not. */ bool is_audio_codec_supported(AVCodecID codec_id) const; /** * @brief Create a list of supported audio codecs for current audio codec * @return Returns comma separated list of formats, or empty if not available. */ std::string audio_codec_list() const; /** * @brief Get sample format (bit width) * @return Returns sample format */ AVSampleFormat sample_format() const; /** * @brief Check if audio codec/sample format combination is supported * @return Returns true if supported, false if not. */ bool is_sample_fmt_supported() const; /** * @brief Create a list of supported sample formats for current audio codec * @return Returns comma separated list of formats, or empty if not available. */ std::string sample_fmt_list() const; /** * @brief Get subtitle codec_id * @param[in] codec_id - Input stream codec ID * @return Returns subtitle codec_id that matches the input stream codec ID, or AV_CODEC_ID_NONE of no match. */ AVCodecID subtitle_codec(AVCodecID codec_id) const; /** * @brief Check if this is some sort of multi file format * (any of the following: is_frameset() or is_hls()). * @return Returns true for a multi file format. */ bool is_multiformat() const; /** * @brief Check for an export frame format * @return Returns true for formats that export all frames as images. */ bool is_frameset() const; /** * @brief Check for HLS format * @return Returns true for formats that create an HLS set including the m3u file. */ bool is_hls() const; /** * @brief Check if album arts are supported * @return true if album arts are supported or false if not */ bool albumart_supported() const; protected: const Format_Options m_empty_options; /**< @brief Set of empty (invalid) options as default */ const Format_Options * m_cur_opts; /**< @brief Currently selected options. Will never be nullptr */ static const OPTIONS_MAP m_options_map; /**< @brief Map of options. One entry per supported destination type. */ std::string m_desttype; /**< @brief Destination type: mp4, mp3 or other */ FILETYPE m_filetype; /**< @brief File type, MP3, MP4, OPUS etc. */ }; /** * @brief The FORMAT enum */ typedef enum _tagFORMAT // Cannot use enum class, won't work as array index { VIDEO, /**< @brief FFmpegfs_Format info, 0: video file */ AUDIO /**< @brief FFmpegfs_Format info, 1: audio file */ } FORMAT; typedef std::array FFMPEGFS_FORMAT_ARR; /**< @brief Array of FFmpegfs formats. There are two, for audio and video */ /** * @brief Add / to the path if required * @param[in] path - Path to add separator to. * @return Returns constant reference to path. */ const std::string & append_sep(std::string * path); /** * @brief Add filename to path, including / after the path if required * @param[in] path - Path to add filename to. * @param[in] filename - File name to add. * @return Returns constant reference to path. */ const std::string & append_filename(std::string * path, const std::string & filename); /** * @brief Remove / from the path * @param[in] path - Path to remove separator from. * @return Returns constant reference to path. */ const std::string & remove_sep(std::string * path); /** * @brief Remove filename from path. Handy dirname alternative. * @param[in] filepath - Path to remove filename from. * @return Returns constant reference to path. */ const std::string & remove_filename(std::string *filepath); /** * @brief Remove path from filename. Handy basename alternative. * @param[in] filepath - Filename to remove path from. * @return Returns constant reference to filename. */ const std::string & remove_path(std::string *filepath); /** * @brief Remove extension from filename. * @param[in] filepath - Filename to remove path from. * @return Returns constant reference to filename. */ const std::string & remove_ext(std::string *filepath); /** * @brief Find extension in filename, if existing. * @param[in] ext - Extension, if found. * @param[in] filename - Filename to inspect. * @return Returns true if extension was found, false if there was none */ bool find_ext(std::string * ext, const std::string & filename); /** * @brief Check if filename has a certain extension. The check is case sensitive. * @param ext - Extension to check. * @param filename - Filename to check * @return Returns true if extension matches, false if not */ bool check_ext(const std::string & ext, const std::string & filename); /** * @brief Replace extension in filename, taking into account that there might not be an extension already. * @param[in] filepath - Filename to replace extension. * @param[in] ext - Extension to replace. * @return Returns constant reference to filename. */ const std::string & replace_ext(std::string * filepath, const std::string & ext); /** * @brief Append extension to filename. If ext is the same as * @param[in] filepath - Filename to add extension to. * @param[in] ext - Extension to add. * @return Returns constant reference to filename. */ const std::string & append_ext(std::string * filepath, const std::string & ext); /** * @brief strdup() variant taking a std::string as input. * @param[in] str - String to duplicate. * @return Copy of the input string. Remember to delete the allocated memory. */ std::shared_ptr new_strdup(const std::string & str); /** * @brief Get FFmpeg error string for errnum. Internally calls av_strerror(). * @param[in] errnum - FFmpeg error code. * @return Returns std::string with the error defined by errnum. */ std::string ffmpeg_geterror(int errnum); /** * @brief Convert a FFmpeg time from in timebase to outtime base. * * If out time base is omitted, returns standard AV_TIME_BASE fractional seconds * Avoids conversion of AV_NOPTS_VALUE. * * @param[in] ts - Time in input timebase. * @param[in] timebase_in - Input timebase. * @param[in] timebase_out - Output timebase, defaults to AV_TIMEBASE if unset. * @return Returns converted value, or AV_NOPTS_VALUE if ts is AV_NOPTS_VALUE. */ int64_t ffmpeg_rescale_q(int64_t ts, const AVRational & timebase_in, const AVRational & timebase_out = av_get_time_base_q()); /** * @brief Convert a FFmpeg time from in timebase to out timebase with rounding. * * If out time base is omitted, returns standard AV_TIME_BASE fractional seconds * Avoids conversion of AV_NOPTS_VALUE. * * @param[in] ts - Time in input timebase. * @param[in] timebase_in - Input timebase. * @param[in] timebase_out - Output timebase, defaults to AV_TIMEBASE if unset. * @return Returns converted value, or AV_NOPTS_VALUE if ts is AV_NOPTS_VALUE. */ int64_t ffmpeg_rescale_q_rnd(int64_t ts, const AVRational & timebase_in, const AVRational & timebase_out = av_get_time_base_q()); /** * @brief Format numeric value. * @param[in] value - Value to format. * @return Returns std::string with formatted value; if value == AV_NOPTS_VALUE returns "unset"; "unlimited" if value == 0. */ std::string format_number(int64_t value); /** * @brief Format a bit rate. * @param[in] value - Bit rate to format. * @return Returns std::string with formatted value in bit/s, kbit/s or Mbit/s. If value == AV_NOPTS_VALUE returns "unset". */ std::string format_bitrate(BITRATE value); /** * @brief Format a samplerate. * @param[in] value - Sample rate to format. * @return Returns std::string with formatted value in Hz or kHz. If value == AV_NOPTS_VALUE returns "unset". */ std::string format_samplerate(int value); /** * @brief Format a time in format HH:MM:SS.fract * @param[in] value - Time value in AV_TIME_BASE factional seconds. * @param[in] fracs - Fractional digits. * @return Returns std::string with formatted value. If value == AV_NOPTS_VALUE returns "unset". */ std::string format_duration(int64_t value, uint32_t fracs = 3); /** * @brief Format a time in format "w d m s". * @param[in] value - Time value in AV_TIME_BASE factional seconds. * @return Returns std::string with formatted value. If value == AV_NOPTS_VALUE returns "unset". */ std::string format_time(time_t value); /** * @brief Format size. * @param[in] value - Size to format. * @return Returns std::string with formatted value in bytes, KB, MB or TB; if value == AV_NOPTS_VALUE returns "unset"; "unlimited" if value == 0. */ std::string format_size(uint64_t value); /** * @brief Format size. * @param[in] value - Size to format. * @return Returns std::string with formatted value in bytes plus KB, MB or TB; if value == AV_NOPTS_VALUE returns "unset"; "unlimited" if value == 0. */ std::string format_size_ex(uint64_t value); /** * @brief Format size of transcoded file including difference between predicted and resulting size. * @param[in] size_resulting - Resulting size. * @param[in] size_predicted - Predicted size. * @return Returns std::string with formatted value in bytes plus difference; if value == AV_NOPTS_VALUE returns "unset"; "unlimited" if value == 0. */ std::string format_result_size(size_t size_resulting, size_t size_predicted); /** * @brief Format size of transcoded file including difference between predicted and resulting size. * @param[in] size_resulting - Resulting size. * @param[in] size_predicted - Predicted size. * @return Returns std::string with formatted value in bytes plus KB, MB or TB and difference; if value == AV_NOPTS_VALUE returns "unset"; "unlimited" if value == 0. */ std::string format_result_size_ex(size_t size_resulting, size_t size_predicted); /** * @brief Path to FFmpegfs binary. * @param[in] path - Path to FFmpegfs binary. */ void exepath(std::string *path); /** * @brief trim from start * @param[in] s - String to trim. * @return Reference to string s. */ std::string & ltrim(std::string &s); /** * @brief trim from end * @param[in] s - String to trim. * @return Reference to string s. */ std::string & rtrim(std::string &s); /** * @brief trim from both ends * @param[in] s - String to trim. * @return Reference to string s. */ std::string & trim(std::string &s); /** * @brief Same as std::string replace(), but replaces all occurrences. * @param[inout] str - Source string. * @param[in] from - String to replace. * @param[in] to - Replacement string. * @return Source string with all occurrences of from replaced with to. */ std::string replace_all(std::string str, const std::string& from, const std::string& to); /** * @brief Same as std::string replace(), but replaces string in-place. * @param[inout] str - Source string. * @param[in] from - String to replace. * @param[in] to - Replacement string. * @return Source string with all occurrences of from replaced with to. */ std::string replace_all(std::string * str, const std::string& from, const std::string& to = ""); /** * @brief Replace start of string from "from" to "to". * @param[inout] str - Source string. * @param[in] from - String to replace. * @param[in] to - Replacement string. * @return True if from has been replaced, false if not. */ bool replace_start(std::string *str, const std::string& from, const std::string& to = ""); /** * @brief Format a std::string sprintf-like. * @param[out] str - The pointer to std::string object where the resulting string is stored. * @param[in] format - sprintf-like format string. * @param[in] args - Arguments. * @return Returns the formatted string. */ template const std::string & strsprintf(std::string *str, const std::string & format, Args ... args) { size_t size = static_cast(snprintf(nullptr, 0, format.c_str(), args ...)) + 1; // Extra space for '\0' std::unique_ptr buf(new(std::nothrow) char[size]); std::snprintf(buf.get(), size, format.c_str(), args ...); str->clear(); str->insert(0, buf.get(), size - 1); // We don't want the '\0' inside return *str; } /** * @brief strcasecmp() equivalent for std::string. * @param[in] s1 - std:string #1 * @param[in] s2 - std:string #2 * @return Returns same as strcasecmp() for char *. */ int strcasecmp(const std::string & s1, const std::string & s2); /** * @brief Convert string to upper case * @param[inout] input String to convert */ void make_upper(std::string * input); /** * @brief Convert string to lower case * @param[inout] input String to convert */ void make_lower(std::string * input); /** * @brief Get info about the FFmpeg libraries used. * @return std::tring with info about the linked FFmpeg libraries. */ std::string ffmpeg_libinfo(); /** * @brief Lists all supported codecs and devices. * @param[in] device_only - If true lists devices only. * @return On success, returns 0; on error, a negative AVERROR value. */ int show_caps(int device_only); /** * @brief Safe way to get the codec name. Function never fails, will return "unknown" on error. * @param[in] codec_id - ID of codec * @param[in] long_name - If true, gets the long name. * @return Returns the codec name or "unknown" on error. */ const char * get_codec_name(AVCodecID codec_id, bool long_name = false); /** * @brief Check if file type supports album arts. * @param[in] filetype - File type: MP3, MP4 etc. * @return Returns true if album arts are supported, false if not. */ int supports_albumart(FILETYPE filetype); /** * @brief Get the FFmpegfs filetype, desttype must be one of FFmpeg's "official" short names for formats. * @param[in] desttype - Destination type (MP4, WEBM etc.). * @return On success, returns FILETYPE enum; On error, returns FILETYPE::UNKNOWN. */ FILETYPE get_filetype(const std::string & desttype); /** * @brief Convert FILETYPE enum to human readable text. * @param[in] filetype - FILETYPE enum value to convert. * @return FILETYPE enum as text or "INVALID" if not known. */ std::string get_filetype_text(FILETYPE filetype); /** * @brief Get the FFmpegfs filetype, desttypelist must be a comma separated list of FFmpeg's "official" short names for formats. * Will return the first match. Same as get_filetype, but accepts a comma separated list. * @param[in] desttypelist - Destination type list (MP4, WEBM etc.) separated by commas. * @return On success, returns FILETYPE enum; On error, returns FILETYPE::UNKNOWN. */ FILETYPE get_filetype_from_list(const std::string & desttypelist); /** * @brief Print info about an AVStream. * @param[in] stream - Stream to print. * @return On success, returns 0; on error, a negative AVERROR value. */ int print_stream_info(const AVStream* stream); /** * Fill the provided buffer with a string containing a FourCC (four-character * code) representation. * * @param[in] buf - Upon return, filled in with the FourCC representation. * @param[in] fourcc - The fourcc to represent * @return The buffer in input. */ std::string fourcc_make_string(std::string * buf, uint32_t fourcc); /** * @brief Compare value with pattern. * @param[in] value - Value to check. * @param[in] pattern - Regexp pattern to match. * @param[in] flag - On of the flag_type constants, see https://en.cppreference.com/w/cpp/regex/basic_regex for options. Mostly std::regex::icase is used to make matches case insensitive. * @return Returns 0 if pattern matches; 1 if not; -1 if pattern is no valid regex */ int reg_compare(const std::string &value, const std::string &pattern, std::regex::flag_type flag = std::regex::ECMAScript); /** * @brief Expand path, e.g., expand ~/ to home directory. * @param[out] tgt - Expanded source path. * @param[in] src - Path to expand. * @return On success, returns expanded source path. */ const std::string & expand_path(std::string *tgt, const std::string &src); /** * @brief Check if path is a mount. * @param[in] path - Path to check. * @return Returns 1 if path is a mount point; 0 if not. On error, returns -1. Check errorno for details. */ int is_mount(const std::string & path); /** * @brief Make directory tree. * @param[in] path - Path to create * @param[in] mode - Directory mode, see mkdir() function. * @return On success, returns 0; on error, returns non-zero errno value. */ int mktree(const std::string & path, mode_t mode); /** * @brief Get temporary directory. * @param[out] path - Path to temporary directory. */ void tempdir(std::string & path); /** * @brief Split string into an array delimited by a regular expression. * @param[in] input - Input string. * @param[in] regex - Regular expression to match. * @return Returns an array with separate elements. */ std::vector split(const std::string& input, const std::string & regex); /** * Safe countof() implementation: Retuns number of elements in an array. */ template constexpr std::size_t countof(T const (&)[N]) noexcept { return N; } /** * @brief Sanitise file name. Calls realpath() to remove duplicate // or resolve ../.. etc. * @param[in] filepath - File name and path to sanitise. * @return Returns sanitised file name and path. */ std::string sanitise_filepath(const std::string & filepath); /** * @brief Sanitise file name. Calls realpath() to remove duplicate // or resolve ../.. etc. * Changes the path in place. * @param[in] filepath - File name and path to sanitise. * @return Returns sanitised file name and path. */ std::string sanitise_filepath(std::string * filepath); /** * @brief Translate file names from FUSE to the original absolute path. * @param[out] origpath - Upon return, contains the name and path of the original file. * @param[in] path - Filename and relative path of the original file. */ void append_basepath(std::string *origpath, const char* path); /** * @brief Minimal check if codec is an album art. * Requires frame_rate to decide whether this is a video stream if codec_id is * not BMP or PNG (which means its undoubtedly an album art). For MJPEG this may * also be a video stream if the frame rate is high enough. * @param[in] codec_id - ID of codec. * @param[in] frame_rate - Video frame rate, if known. * @return Returns true if codec is for an image; false if not. */ bool is_album_art(AVCodecID codec_id, const AVRational *frame_rate = nullptr); /** * @brief nocasecompare to make std::string find operations case insensitive * @param[in] lhs - left hand string * @param[in] rhs - right hand string * @return -1 if lhs < rhs; 0 if lhs == rhs and 1 if lhs > rhs */ int nocasecompare(const std::string & lhs, const std::string &rhs); /** * @brief The comp struct to make std::string find operations case insensitive */ struct comp { /** * @brief operator () to make std::string find operations case insensitive * @param[in] lhs - left hand string * @param[in] rhs - right hand string * @return true if lhs < rhs; false if lhs >= rhs */ bool operator() (const std::string& lhs, const std::string& rhs) const { return (nocasecompare(lhs, rhs) < 0); } }; /** * @brief Get free disk space. * @param[in] path - Path or file on disk. * @return Returns the free disk space. */ size_t get_disk_free(std::string & path); /** * @brief For use with win_smb_fix=1: Check if this an illegal access offset by Windows * @param[in] size - sizeof of the file * @param[in] offset - offset at which file is accessed * @return If request should be ignored, returns true; otherwise false */ bool check_ignore(size_t size, size_t offset); /** * @brief Make a file name from file number and file extension. * @param[in] file_no - File number 1...n * @param[in] fileext - Extension of file (e.g mp4, webm) * @return Returns the file name. */ std::string make_filename(uint32_t file_no, const std::string &fileext); /** * @brief Check if file exists. * @param[in] filename - File to check. * @return Returns true if file exists, false if not. */ bool file_exists(const std::string & filename); /** Save version of hwdevice_get_type_name: * Get the string name of an AVHWDeviceType. * * @param[in] dev_type - Type from enum AVHWDeviceType. * @return Pointer to a static string containing the name, or "unknown" if the type * is not valid. */ const char * hwdevice_get_type_name(AVHWDeviceType dev_type); /** * Detected encoding types * Note: Muste be > 0! */ enum class ENCODING { ASCII = -1, /**< @brief Some sort of ASCII encoding. */ UTF8_BOM = -2, /**< @brief UTF-8 with bottom mark. */ UTF16LE_BOM = -3, /**< @brief UTF-16 little-endian with bottom mark. */ UTF16BE_BOM = -4, /**< @brief UTF-16 big-endian with bottom mark. */ UTF32LE_BOM = -5, /**< @brief UTF-16 little-endian with bottom mark. */ UTF32BE_BOM = -6, /**< @brief UTF-16 big-endian with bottom mark. */ }; /** * @brief Convert almost any encoding to UTF-8. * To get a list of all possible encodings run "iconv --list". * @param[in] text - Text to be converted * @param[in] encoding - Encoding of input text. * @return Returns 0 if successful and the converted text, * or errno value On error, and text is unchanged. */ int to_utf8(std::string & text, const std::string & encoding); /** * @brief Try to detect the encoding of str. This is relatively realiable, * but may be wrong. * @param[in] str - Text string to be checked. * @param[out] encoding - Detected encoding. * @return Returns 0 if successful, or CHARDET_OUT_OF_MEMORY/CHARDET_MEM_ALLOCATED_FAIL * on error. */ int get_encoding (const char * str, std::string & encoding); /** * @brief Read text file and return in UTF-8 format, no matter in which * encoding the input file is. UTF-8/16/32 with BOM will always return a * correct result. For all other encodings the function tries to detect it, * that may fail. * @param[in] path - Path and filename of input file * @param[out] result - File contents as UTF-8 * @return Returns one of the ENCODING enum values on success, which are always * negative; or errno on error. Basically a return code > 0 means there is an error. */ int read_file(const std::string & path, std::string & result); /** * @brief Properly fill in all size related members in stat struct * @param[inout] st stat structure to update * @param[in] size size value to copy */ void stat_set_size(struct stat *st, size_t size); /** * @brief Detect if we are running under Docker. * @return Returns true, if running under Docker, or false if not. */ bool detect_docker(); /** * @brief Iterate through all elements in map and search for the passed element. * @param[in] mapOfWords - map to search. * @param[in] value - Search value * @return If found, retuns const_iterator to element. Returns mapOfWords.cend() if not. */ template typename std::map::const_iterator search_by_value(const std::map & mapOfWords, T value) { typename std::map::const_iterator it = mapOfWords.cbegin(); while (it != mapOfWords.cend()) { if (it->second == value) { return it; } ++it; } return mapOfWords.cend(); } /** * @brief Check if subtitle codec is a text or graphical codec * @param[in] codec_id - Codec to check, must be one of the subtitle codecs. * @return Returns true if codec_id is a text based codec, false if it is bitmap based. */ bool is_text_codec(AVCodecID codec_id); /** * @brief Get first audio stream * @param[in] format_ctx - Format context of file * @param[out] channels - Number of audio channels in stream * @param[out] samplerate - Audio sample rate of stream * @return Returns stream number (value greater or equal zero) or negative errno value */ int get_audio_props(AVFormatContext *format_ctx, int *channels, int *samplerate); /** * @brief Escape characters that are meaningful to regexp. * @param[in] str - String to escape * @return Returns reference to string. */ const std::string & regex_escape(std::string *str); /** * @brief Find extension in include list, if existing. * @param[in] ext - Extension, if found. * @return Returns true if extension was found, false if there was none */ bool is_selected(const std::string & ext); /** * @brief Check if filename should be hidden from output path * @param[in] filename - Name to check * @return Returns true, if filename is blocked, false if not. */ bool is_blocked(const std::string & filename); typedef std::vector MATCHVEC; /**< @brief Array of strings, sorted/search case insensitive */ /** * @brief Combine array of strings into comma separated list. * @param[in] s - std::set object to combine * @return List of strings, separated by commas. */ template std::string implode(const T &s) { std::ostringstream stream; std::copy(s.begin(), s.end(), std::ostream_iterator(stream, ",")); std::string str(stream.str()); // Remove trailing , if (str.size()) { str.pop_back(); } return str; } /** * @brief Savely delete memory: Pointer will be set to nullptr before deleted is actually called. * @param[inout] p - Pointer to delete */ template void save_delete(T **p) { T * tmp = __atomic_exchange_n(p, nullptr, __ATOMIC_RELEASE); if (tmp != nullptr) { delete tmp; } } /** * @brief Savely free memory: Pointer will be set to nullptr before it is actually freed. * @param[inout] p - Pointer to delete */ void save_free(void **p); /** * @brief Sleep for specified time * @param milliseconds - Milliseconds to sleep */ void mssleep(int milliseconds); /** * @brief Sleep for specified time * @param microseconds - Microseconds to sleep */ void ussleep(int microseconds); /** * @brief Sleep for specified time * @param nanoseconds - Nanoseconds to sleep */ void nssleep(int nanoseconds); #endif ffmpegfs-2.18/src/ffmpeg_subtitle.cc0000644000000000000000000000450215166175407014422 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_subtitle.cc * @brief FFmpeg_Subtitle class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifdef __cplusplus extern "C" { #endif // Disable annoying warnings outside our code #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #include #pragma GCC diagnostic pop #ifdef __cplusplus } #endif #include "ffmpeg_subtitle.h" FFmpeg_Subtitle::FFmpeg_Subtitle(int stream_index) : std::shared_ptr(alloc_subtitle(), &FFmpeg_Subtitle::delete_subtitle), m_res(0), m_stream_idx(stream_index) { m_res = (get() != nullptr) ? 0 : AVERROR(ENOMEM); } void FFmpeg_Subtitle::unref() noexcept { reset(); } int FFmpeg_Subtitle::res() const { return m_res; } FFmpeg_Subtitle::operator AVSubtitle*() { return get(); } FFmpeg_Subtitle::operator const AVSubtitle*() const { return get(); } AVSubtitle* FFmpeg_Subtitle::operator->() { return get(); } AVSubtitle* FFmpeg_Subtitle::alloc_subtitle() { return reinterpret_cast(av_mallocz(sizeof(AVSubtitle))); } void FFmpeg_Subtitle::delete_subtitle(AVSubtitle *subtitle) { if (subtitle != nullptr) { avsubtitle_free(subtitle); av_free(subtitle); } } ffmpegfs-2.18/src/fileio.cc0000644000000000000000000000566515166175407012525 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file fileio.cc * @brief FileIO class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "fileio.h" #include "ffmpegfs.h" #include "diskio.h" #ifdef USE_LIBVCD #include "vcdio.h" #endif // USE_LIBVCD #ifdef USE_LIBDVD #include "dvdio.h" #endif // USE_LIBDVD #ifdef USE_LIBBLURAY #include "blurayio.h" #endif // USE_LIBBLURAY uint32_t VIRTUALFILE::get_segment_count() const { if (m_duration && params.m_segment_duration) { return static_cast((m_duration - 200000) / params.m_segment_duration) + 1; } else { return 0; } } FileIO::FileIO() : m_virtualfile(nullptr) { } std::shared_ptr FileIO::alloc(VIRTUALTYPE type) { switch (type) { case VIRTUALTYPE::DISK: { return std::make_shared(); } #ifdef USE_LIBVCD case VIRTUALTYPE::VCD: { return std::make_shared(); } #endif // USE_LIBVCD #ifdef USE_LIBDVD case VIRTUALTYPE::DVD: { return std::make_shared(); } #endif // USE_LIBDVD #ifdef USE_LIBBLURAY case VIRTUALTYPE::BLURAY: { return std::make_shared(); } #endif // USE_LIBBLURAY default: { return std::make_shared(); } } } void FileIO::set_virtualfile(LPVIRTUALFILE virtualfile) { m_virtualfile = virtualfile; if (virtualfile != nullptr) { // Store path to original file without file name for fast access m_path = m_virtualfile->m_origfile; remove_filename(&m_path); } else { m_path.clear(); } } LPVIRTUALFILE FileIO::virtualfile() { return m_virtualfile; } const std::string & FileIO::path() const { return m_path; } const std::string & FileIO::filename() const { if (m_virtualfile == nullptr) { static const std::string empty; return empty; } return m_virtualfile->m_destfile; } ffmpegfs-2.18/src/ffmpeg_frame.h0000644000000000000000000000776615166175407013542 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_frame.h * @brief FFmpeg AVFrame extension * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef FFMPEG_FRAME_H #define FFMPEG_FRAME_H #pragma once struct AVFrame; /** * @brief The #FFmpeg_Frame class */ class FFmpeg_Frame { public: /** * @brief Construct FFmpeg_Frame object. * @param[in] stream_index - Index of stream */ explicit FFmpeg_Frame(int stream_index = INVALID_STREAM); /** * @brief Copy construct from FFmpeg_Frame object. * @param[in] frame - Pointer to source FFmpeg_Frame object. * @note Do not declare explicit, breaks use in std::variant */ FFmpeg_Frame(const FFmpeg_Frame & frame); /** * @brief Copy construct from AVFrame struct. * @param[in] frame - Pointer to source AVFrame struct. * @note Do not declare explicit, breaks use in std::variant */ FFmpeg_Frame(const AVFrame * frame); // cppcheck-suppress noExplicitConstructor /** * @brief Destruct FFmpeg_Frame object. */ virtual ~FFmpeg_Frame(); /** * @brief Get result of last operation * @return Returns 0 if last operation was successful, or negative AVERROR value. */ int res() const; /** * @brief Clone frame to a new AVFrame * struct. Needs to be freed by a av_frame_free() call. * @return Returns cloned AVFrame * struct, or nullptr on error. */ AVFrame* clone(); /** * @brief Unreference underlying frame */ void unref(); /** * @brief Free underlying frame */ void free(); /** * @brief Access the underlying frame * @return Returns the unerlying AVFrame * struct, or nullptr not valid. */ AVFrame* get(); /** * @brief operator AVFrame *: Do as if we were a pointer to AVFrame */ operator AVFrame*(); /** * @brief operator const AVFrame *: Do as if we were a const pointer to AVFrame */ operator const AVFrame*() const; /** * @brief operator ->: Do as if we were a pointer to AVFrame * @return Pointer to AVFrame struct. */ AVFrame* operator->(); /** * @brief Make copy from other FFmpeg_Frame object. * @param[in] frame - Reference to source FFmpeg_Frame object. * @return Reference to new FFmpeg_Frame object. */ FFmpeg_Frame& operator=(const FFmpeg_Frame & frame) noexcept; /** * @brief Make copy from AVFrame structure. * @param[in] frame - Pointer to source AVFrame structure. * @return Reference to new FFmpeg_Frame object. */ FFmpeg_Frame& operator=(const AVFrame * frame) noexcept; protected: AVFrame * m_frame; /**< @brief Pointer to underlying AVFrame struct */ int m_res; /**< @brief 0 if last operation was successful, or negative AVERROR value */ public: int m_stream_idx; /**< @brief Stream index frame belongs to, or -1 (INVALID_STREAM) */ }; #endif // FFMPEG_FRAME_H ffmpegfs-2.18/src/cache_entry.cc0000644000000000000000000002605515166175407013536 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file cache_entry.cc * @brief Cache_Entry class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "cache_entry.h" #include "ffmpegfs.h" #include "buffer.h" #include "logging.h" #include Cache_Entry::Cache_Entry(Cache *owner, LPVIRTUALFILE virtualfile) : m_owner(owner) , m_ref_count(0) , m_virtualfile(virtualfile) , m_is_decoding(false) , m_suspend_timeout(false) , m_seek_to_no(0) { m_cache_info.m_origfile = virtualfile->m_origfile; m_cache_info.m_destfile = virtualfile->m_destfile; m_cache_info.m_desttype[0] = '\0'; strncat(m_cache_info.m_desttype.data(), params.current_format(virtualfile)->desttype().c_str(), m_cache_info.m_desttype.size() - 1); m_buffer = std::make_unique(); if (m_buffer != nullptr) { m_buffer->openio(virtualfile); } clear(); Logging::trace(filename(), "Created a new cache entry."); } Cache_Entry::~Cache_Entry() { std::unique_lock lock_active_mutex(m_active_mutex); unlock(); Logging::trace(filename(), "Deleted buffer."); } Cache_Entry * Cache_Entry::create(Cache *owner, LPVIRTUALFILE virtualfile) { return new(std::nothrow) Cache_Entry(owner, virtualfile); } bool Cache_Entry::destroy() { delete this; /** @todo Implement delete later mechanism */ return true; /** @todo Return true when deleted, false if kept for delete later */ } void Cache_Entry::clear(bool fetch_file_time /*= true*/) { m_is_decoding = false; // Initialise ID3v1.1 tag structure init_id3v1(&m_id3v1); //m_cache_info.m_enable_ismv = params.m_enable_ismv; m_cache_info.m_audiobitrate = params.m_audiobitrate; m_cache_info.m_audiosamplerate = params.m_audiosamplerate; m_cache_info.m_videobitrate = params.m_videobitrate; m_cache_info.m_videowidth = params.m_videowidth; m_cache_info.m_videoheight = params.m_videoheight; m_cache_info.m_deinterlace = params.m_deinterlace; m_cache_info.m_predicted_filesize = 0; m_cache_info.m_encoded_filesize = 0; m_cache_info.m_video_frame_count = 0; m_cache_info.m_result = RESULTCODE::NONE; m_cache_info.m_error = false; m_cache_info.m_errno = 0; m_cache_info.m_averror = 0; m_cache_info.m_access_time = m_cache_info.m_creation_time = time(nullptr); m_cache_info.m_access_count = 0; if (fetch_file_time) { struct stat sb; if (stat(filename(), &sb) == -1) { m_cache_info.m_file_time = 0; m_cache_info.m_file_size = 0; } else { m_cache_info.m_file_time = sb.st_mtime; m_cache_info.m_file_size = static_cast(sb.st_size); } } if (m_buffer != nullptr) { m_buffer->clear(); } } bool Cache_Entry::read_info() { return m_owner->read_info(&m_cache_info); } bool Cache_Entry::write_info() { return m_owner->write_info(&m_cache_info); } bool Cache_Entry::delete_info() { return m_owner->delete_info(filename(), m_cache_info.m_desttype.data()); } bool Cache_Entry::update_access(bool update_database /*= false*/) { m_cache_info.m_access_time = time(nullptr); if (update_database) { return m_owner->write_info(&m_cache_info); } else { return true; } } bool Cache_Entry::openio(bool create_cache /*= true*/) { if (m_buffer == nullptr) { errno = EINVAL; return false; } if (m_ref_count++ > 0) // fetch_and_add { // Already open return true; } bool erase_cache = !read_info(); // If read_info fails, rebuild cache entry if (!create_cache) { return true; } if (!is_finished()) { // If no database entry found (database is not consistent), // or file was not completely transcoded last time, // simply create a new file. erase_cache = true; } Logging::trace(filename(), "The last transcode was completed. Result %1 Erasing cache: %2.", static_cast(m_cache_info.m_result), erase_cache); // Store access time update_access(true); // Open the cache if (m_buffer->init(erase_cache)) { return true; } else { clear(false); return false; } } void Cache_Entry::close_buffer(int flags) { if (m_buffer->release(flags)) { if (flags) { delete_info(); } } } bool Cache_Entry::closeio(int flags) { write_info(); if (m_buffer == nullptr) { errno = EINVAL; return false; } if (!m_ref_count) { close_buffer(flags); return true; } if (--m_ref_count > 0) // sub_and_fetch { // Just flush to disk flush(); return false; } close_buffer(flags); return true; } bool Cache_Entry::flush() { if (m_buffer == nullptr) { errno = EINVAL; return false; } m_buffer->flush(); //write_info(); return true; } size_t Cache_Entry::size() const { if (m_cache_info.m_encoded_filesize) { return m_cache_info.m_encoded_filesize; } else { if (m_buffer == nullptr) { return m_cache_info.m_predicted_filesize; } else { size_t current_size = m_buffer->buffer_watermark(); return std::max(current_size, m_cache_info.m_predicted_filesize); } } } uint32_t Cache_Entry::video_frame_count() const { return m_cache_info.m_video_frame_count; } time_t Cache_Entry::age() const { return (time(nullptr) - m_cache_info.m_creation_time); } time_t Cache_Entry::last_access() const { return m_cache_info.m_access_time; } bool Cache_Entry::expired() const { return (age() > params.m_expiry_time); } bool Cache_Entry::suspend_timeout() const { return (((time(nullptr) - m_cache_info.m_access_time) >= params.m_max_inactive_suspend) && m_ref_count <= 1); } bool Cache_Entry::decode_timeout() const { return (((time(nullptr) - m_cache_info.m_access_time) >= params.m_max_inactive_abort) && m_ref_count <= 1); } const char * Cache_Entry::filename() const { return (m_virtualfile != nullptr ? m_virtualfile->m_origfile.c_str() : ""); } const char *Cache_Entry::destname() const { return (m_virtualfile != nullptr ? m_virtualfile->m_destfile.c_str() : ""); } const char * Cache_Entry::virtname() const { return (m_virtualfile != nullptr ? m_virtualfile->m_virtfile.c_str() : ""); } void Cache_Entry::lock() { m_mutex.lock(); } void Cache_Entry::unlock() { m_mutex.unlock(); } int Cache_Entry::ref_count() const { return m_ref_count; } int Cache_Entry::inc_refcount() { return m_ref_count++; // fetch_and_add } int Cache_Entry::decr_refcount() { return --m_ref_count; // sub_and_fetch } bool Cache_Entry::outdated() const { struct stat sb; if (m_cache_info.m_audiobitrate != params.m_audiobitrate) { if (m_cache_info.m_audiobitrate) { // Report if old rate is known Logging::debug(filename(), "Triggering re-transcode: Selected audio bitrate changed from %1 to %2.", m_cache_info.m_audiobitrate, params.m_audiobitrate); } return true; } if (m_cache_info.m_audiosamplerate != params.m_audiosamplerate) { if (m_cache_info.m_audiosamplerate) { // Report if old rate is known Logging::debug(filename(), "Triggering re-transcode: Selected audio samplerate changed from %1 to %2.", m_cache_info.m_audiosamplerate, params.m_audiosamplerate); } return true; } if (m_cache_info.m_videobitrate != params.m_videobitrate) { if (m_cache_info.m_videobitrate) { // Report if old rate is known Logging::debug(filename(), "Triggering re-transcode: Selected video bitrate changed from %1 to %2.", m_cache_info.m_audiobitrate, params.m_audiobitrate); } return true; } if (m_cache_info.m_videowidth != params.m_videowidth || m_cache_info.m_videoheight != params.m_videoheight) { if (m_cache_info.m_videowidth && m_cache_info.m_videoheight) { // Report if old dimensions is known Logging::debug(filename(), "Triggering re-transcode: Selected video witdh/height changed from %1/%2 to %3/%4.", m_cache_info.m_videowidth, m_cache_info.m_videoheight, params.m_videowidth, params.m_videoheight); } return true; } if (m_cache_info.m_deinterlace != (params.m_deinterlace ? true : false)) { Logging::debug(filename(), "Triggering re-transcode: Selected video deinterlace changed from %1 to %2.", m_cache_info.m_deinterlace, params.m_deinterlace); return true; } if (stat(filename(), &sb) != -1) { // If source file exists, check file date/size if (m_cache_info.m_file_time < sb.st_mtime) { Logging::debug(filename(), "Triggering re-transcode: File time has gone forward."); return true; } if (m_cache_info.m_file_size != static_cast(sb.st_size)) { Logging::debug(filename(), "Triggering re-transcode: File size has changed."); return true; } } return false; } LPVIRTUALFILE Cache_Entry::virtualfile() { return m_virtualfile; } void Cache_Entry::update_read_count() { m_cache_info.m_access_count++; } unsigned int Cache_Entry::read_count() const { return m_cache_info.m_access_count; } bool Cache_Entry::is_finished() const { return (m_cache_info.m_result != RESULTCODE::NONE); } bool Cache_Entry::is_finished_incomplete() const { return (m_cache_info.m_result == RESULTCODE::FINISHED_INCOMPLETE); } bool Cache_Entry::is_finished_success() const { return (m_cache_info.m_result == RESULTCODE::FINISHED_SUCCESS); } bool Cache_Entry::is_finished_error() const { return (m_cache_info.m_result == RESULTCODE::FINISHED_ERROR); } ffmpegfs-2.18/src/diskio.h0000644000000000000000000001060115166175407012364 00000000000000/* * Copyright (C) 2018-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file diskio.h * @brief Direct disk I/O * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2018-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef DISKIO_H #define DISKIO_H #pragma once #include "fileio.h" /** @brief Disk file I/O class */ class DiskIO : public FileIO { public: explicit DiskIO(); virtual ~DiskIO(); /** * @brief Get type of the virtual file * @return Returns the type of the virtual file. */ virtual VIRTUALTYPE type() const override; /** * @brief Get the ideal buffer size. * @return Return the ideal buffer size. */ virtual size_t bufsize() const override; /** @brief Open a file * @param[in] virtualfile - LPCVIRTUALFILE of file to open * @return Upon successful completion, #openio() returns 0. @n * On error, an nonzero value is returned and errno is set to indicate the error. */ virtual int openio(LPVIRTUALFILE virtualfile) override; /** @brief Read data from file * @param[out] data - buffer to store read bytes in. Must be large enough to hold up to size bytes. * @param[in] size - number of bytes to read * @return Upon successful completion, #readio() returns the number of bytes read. @n * This may be less than size. @n * On error, the value 0 is returned and errno is set to indicate the error. @n * If at end of file, 0 may be returned by errno not set. error() will return 0 if at EOF. */ virtual size_t readio(void *data, size_t size) override; /** * @brief Get last error. * @return errno value of last error. */ virtual int error() const override; /** @brief Get the duration of the file, in AV_TIME_BASE fractional seconds. * * Not applicable to generic disk files, always returns AV_NOPTS_VALUE. */ virtual int64_t duration() const override; /** * @brief Get the file size. * @return Returns the file size. */ virtual size_t size() const override; /** * @brief Get current read position. * @return Gets the current read position. */ virtual size_t tell() const override; /** @brief Seek to position in file * * Repositions the offset of the open file to the argument offset according to the directive whence. * * @param[in] offset - offset in bytes * @param[in] whence - how to seek: @n * SEEK_SET: The offset is set to offset bytes. @n * SEEK_CUR: The offset is set to its current location plus offset bytes. @n * SEEK_END: The offset is set to the size of the file plus offset bytes. * @return Upon successful completion, #seek() returns the resulting offset location as measured in bytes * from the beginning of the file. @n * On error, the value -1 is returned and errno is set to indicate the error. */ virtual int seek(int64_t offset, int whence) override; /** * @brief Check if at end of file. * @return Returns true if at end of file. */ virtual bool eof() const override; /** * @brief Close virtual file. */ virtual void closeio() override; private: /** * @brief Close virtual file. * Non-virtual version to be safely called from constructor/destructor */ void pvt_close(); protected: FILE * m_fpi; /**< @brief File pointer to source media */ }; #endif // DISKIO_H ffmpegfs-2.18/src/ffmpegfs.h0000644000000000000000000005227415166175407012713 00000000000000/* * Copyright (C) 2006-2008 David Collett * Copyright (C) 2008-2013 K. Henriksson * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ #ifndef FFMPEGFS_H #define FFMPEGFS_H #pragma once /** * @file ffmpegfs.h * @ingroup ffmpegfs * @brief Main include for FFmpegfs project * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2006-2008 David Collett @n * Copyright (C) 2008-2013 K. Henriksson @n * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) */ /** @mainpage FFmpegfs FUSE Filesystem * * @section ffmpeg_introduction Introduction to FFmpegfs * * FFmpegfs is a read-only FUSE filesystem which transcodes various audio and video formats to MP4, WebM, * and many more on the fly when opened and read using the FFmpeg library, thus supporting a multitude of * input formats and a variety of common output formats. * * This allows access to a multi-media file collection with software and/or hardware which only understands * one of the supported output formats, or transcodes files through simple drag-and-drop in a file browser. * * FFmpegfs can be downloaded [from Github](https://github.com/nschlia/ffmpegfs). * * @section ffmpeg_documentation FFmpegfs Documentation * * @li [Introduction](README.md) * @li [**Man Pages**](manpages.html) * @li [Features In Detail](FEATURES.md) * @li [Revision History](HISTORY.md) * @li [Installation Instructions](INSTALL.md) * @li [Fixing Problems](PROBLEMS.md) * @li @ref todo * @li @ref bug * @li @ref ffmpegfs_NEWS * @li @ref ffmpegfs_TODO * * @section ffmpeg_licences Licenses * * @li @ref ffmpegfs_COPYING * @li @ref ffmpegfs_COPYING.DOC * @li @ref ffmpegfs_COPYING.CC0 * * @section ffmpegfs_external External Links * * @li [**FFmpegfs on Github**](https://github.com/nschlia/ffmpegfs) * @li [**FFmpeg Homepages**](https://www.ffmpeg.org/) */ /** * @page ffmpegfs_NEWS Online News List * * \include NEWS * * @page ffmpegfs_TODO Online TODO List * * \include TODO * * @page ffmpegfs_COPYING General License * * \include COPYING * * @page ffmpegfs_COPYING.DOC Documentation License * * \include COPYING.DOC * * @page ffmpegfs_COPYING.CC0 Demo Files License * * \include COPYING.CC0 */ #define FUSE_USE_VERSION 30 /**< @brief Requested minimum FUSE version */ #ifdef __cplusplus extern "C" { #endif #include #ifdef __cplusplus } #endif #include #include "ffmpeg_utils.h" #include "fileio.h" /** * * @brief Hardware acceleration types. */ enum class HWACCELAPI { NONE, VAAPI, /**< Intel: VAAPI */ MMAL, /**< Raspberry: MMAL */ OMX, /**< Raspberry: OpenMAX */ // Additional formats #if 0 CUDA, /**< Nividia: CUDA to be added */ V4L2M2M, /**< v4l2 mem to mem to be added */ VDPAU, /**< VDPAU to be added */ QSV, /**< QSV to be added */ OPENCL, /**< OPENCL to be added */ #if HAVE_VULKAN_HWACCEL VULKAN, /**< VULKAN to be added */ #endif // HAVE_VULKAN_HWACCEL #if __APPLE__ // MacOS acceleration APIs not supported VIDEOTOOLBOX, /**< VIDEOTOOLBOX not supported */ #endif #if __ANDROID__ // Android acceleration APIs not supported MEDIACODEC, /**< MediaCodec API not supported */ #endif #if _WIN32 // Windows acceleration APIs not supported DRM, /**< DRM not supported */ DXVA2, /**< DXVA2 not supported */ D3D11VA, /**< D3D11VA not supported */ #endif #endif }; typedef std::multimap HWACCEL_BLOCKED_MAP; /**< @brief Map command line option to AVCodecID */ extern FFMPEGFS_FORMAT_ARR ffmpeg_format; /**< @brief Two FFmpegfs_Format infos, 0: video file, 1: audio file */ /** * @brief Global program parameters */ extern struct FFMPEGFS_PARAMS { FFMPEGFS_PARAMS(); /** * @brief Make copy from other FFMPEGFS_PARAMS object. * @param[in] other - Reference to source FFmpeg_Frame object. */ FFMPEGFS_PARAMS(const FFMPEGFS_PARAMS & other); ~FFMPEGFS_PARAMS(); // Do not make virtual, breaks fuse API compatibility! /** * @brief Check for smart transcode mode * @return true if smart transcode is active, false if not */ bool smart_transcode() const; /** * @brief Get FFmpegfs_Format for a virtual file. * @param[in] virtualfile - VIRTUALFILE struct of a file. * @return On success, returns pointer to format. On error, returns nullptr. */ const FFmpegfs_Format * current_format(LPCVIRTUALFILE virtualfile) const; /** * @brief Make copy from other FFMPEGFS_PARAMS object. * @param[in] other - Reference to source FFmpeg_Frame object. * @return Reference to new FFmpeg_Frame object. */ FFMPEGFS_PARAMS& operator=(const FFMPEGFS_PARAMS & other) noexcept; // Paths std::string m_basepath; /**< @brief Base path: Files from this directory (including all sub directories) will be mapped to m_mountpath. */ std::string m_mountpath; /**< @brief Mount path: Files from m_mountpath will be mapped to this directory. */ // Output type AVCodecID m_audio_codec; /**< @brief Either AV_CODEC_ID_NONE for default, or a user selected codec */ AVCodecID m_video_codec; /**< @brief Either AV_CODEC_ID_NONE for default, or a user selected codec */ AUTOCOPY m_autocopy; /**< @brief Copy streams if codec matches */ RECODESAME m_recodesame; /**< @brief Recode to same format options */ PROFILE m_profile; /**< @brief Target profile: Firefox, MS Edge/IE or other */ PRORESLEVEL m_level; /**< @brief Level, currently proxy/hq/lt/HQ (ProRes only) */ // Audio BITRATE m_audiobitrate; /**< @brief Output audio bit rate (bits per second) */ int m_audiosamplerate; /**< @brief Output audio sample rate (in Hz) */ int m_audiochannels; /**< @brief Max. number of audio channels */ SAMPLE_FMT m_sample_fmt; /**< @brief Sample format */ // Video BITRATE m_videobitrate; /**< @brief Output video bit rate (bits per second) */ int m_videowidth; /**< @brief Output video width */ int m_videoheight; /**< @brief Output video height */ int m_deinterlace; /**< @brief 1: deinterlace video, 0: no deinterlace */ // HLS Options int64_t m_segment_duration; /**< @brief Duration of one HLS segment file, in AV_TIME_BASE fractional seconds. */ int64_t m_min_seek_time_diff; /**< @brief Minimum time diff from current to next requested segment to perform a seek, in AV_TIME_BASE fractional seconds. */ // Hardware acceleration HWACCELAPI m_hwaccel_enc_API; /**< @brief Encoder API */ AVHWDeviceType m_hwaccel_enc_device_type; /**< @brief Enable hardware acceleration buffering for encoder */ std::string m_hwaccel_enc_device; /**< @brief Encoder device. May be AUTO to auto detect or empty */ HWACCELAPI m_hwaccel_dec_API; /**< @brief Decoder API */ AVHWDeviceType m_hwaccel_dec_device_type; /**< @brief Enable hardware acceleration buffering for decoder */ std::string m_hwaccel_dec_device; /**< @brief Decoder device. May be AUTO to auto detect or empty */ HWACCEL_BLOCKED_MAP* m_hwaccel_dec_blocked; /**< @brief List of blocked decoders and optional profiles */ // Subtitles int m_no_subtitles; /**< @brief 0: allow subtitles, 1: do no transcode subtitles */ // Album arts int m_noalbumarts; /**< @brief Skip album arts */ // Virtual script int m_enablescript; /**< @brief Enable virtual script */ std::string m_scriptfile; /**< @brief Script name */ std::string m_scriptsource; /**< @brief Source script */ // FFmpegfs options int m_debug; /**< @brief Debug mode (stay in foreground */ std::string m_log_maxlevel; /**< @brief Max. log level */ int m_log_stderr; /**< @brief Log output to standard error */ int m_log_syslog; /**< @brief Log output to system log */ std::string m_logfile; /**< @brief Output filename if logging to file */ // Background recoding/caching time_t m_expiry_time; /**< @brief Time (seconds) after which an cache entry is deleted */ time_t m_max_inactive_suspend; /**< @brief Time (seconds) that must elapse without access until transcoding is suspended */ time_t m_max_inactive_abort; /**< @brief Time (seconds) that must elapse without access until transcoding is aborted */ time_t m_prebuffer_time; /**< @brief Playing time that will be decoded before the output can be accessed */ size_t m_prebuffer_size; /**< @brief Number of bytes that will be decoded before the output can be accessed */ size_t m_max_cache_size; /**< @brief Max. cache size in MB. When exceeded, oldest entries will be pruned */ size_t m_min_diskspace; /**< @brief Min. diskspace required for cache */ std::string m_cachepath; /**< @brief Disk cache path, defaults to $XDG_CACHE_HOME */ int m_disable_cache; /**< @brief Disable cache */ time_t m_cache_maintenance; /**< @brief Prune timer interval */ int m_prune_cache; /**< @brief Prune cache immediately */ int m_clear_cache; /**< @brief Clear cache on start up */ unsigned int m_max_threads; /**< @brief Max. number of recoder threads */ // Miscellanous options int m_decoding_errors; /**< @brief Break transcoding on decoding error */ int m_min_dvd_chapter_duration; /**< @brief Min. DVD chapter duration. Shorter chapters will be ignored. */ int m_oldnamescheme; /**< @brief Use old output name scheme, can create duplicate filenames */ std::unique_ptr m_include_extensions; /**< @brief Set of extensions to include. If empty, include all. Must be a pointer as the fuse API cannot handle advanced c++ objects. */ std::unique_ptr m_hide_extensions; /**< @brief Set of extensions to block/hide. Must be a pointer as the fuse API cannot handle advanced c++ objects. */ // Experimental options int m_win_smb_fix; /**< @brief Experimental Windows fix for access to EOF at file open */ } params; /**< @brief Command line parameters */ class Cache_Entry; extern bool docker_client; /**< @brief True if running inside a Docker container */ /** * @brief Fuse operations struct */ extern fuse_operations ffmpegfs_ops; class thread_pool; /** * @brief Thread pool object */ extern std::unique_ptr tp; /** * @brief Initialise FUSE operation structure. */ void init_fuse_ops(); #endif /** * @brief Get transcoder cache path. * @param[out] path - Path to transcoder cache. */ void transcoder_cache_path(std::string *path); /** * @brief Initialise transcoder, create cache. * @return Returns true on success; false on error. Check errno for details. */ bool transcoder_init(); /** * @brief Free transcoder. */ void transcoder_free(); /** * @brief Run cache maintenance. * @return Returns true on success; false on error. Check errno for details. */ bool transcoder_cache_maintenance(); /** * @brief Clear transcoder cache. * @return Returns true on success; false on error. Check errno for details. */ bool transcoder_cache_clear(); /** * @brief Add new virtual file to internal list. * * For Blu-ray/DVD/VCD, actually, no physical input file exists, so virtual and * origfile are the same. * * The input file is handled by the BlurayIO or VcdIO classes. * * For cue sheets, the original (huge) input file is used. Start positions are * sought; end positions are reported as EOF. * * @param[in] type - Type of virtual file. * @param[in] virtfile - Name of virtual file. * @param[in] stbuf - stat buffer with file size, time etc. * @param[in] flags - One of the VIRTUALFLAG_* flags to control the detailed behaviour. * @return Returns constant pointer to VIRTUALFILE object of file, nullptr if not found */ LPVIRTUALFILE insert_file(VIRTUALTYPE type, const std::string & virtfile, const struct stat *stbuf, int flags = VIRTUALFLAG_NONE); /** * @brief Add new virtual file to internal list. If the file already exists, it will be updated. * @param[in] type - Type of virtual file. * @param[in] virtfile - Name of virtual file. * @param[in] origfile - Original file name. * @param[in] stbuf - stat buffer with file size, time etc. * @param[in] flags - One of the VIRTUALFLAG_* flags to control the detailed behaviour. * @return Returns constant pointer to VIRTUALFILE object of file, nullptr if not found */ LPVIRTUALFILE insert_file(VIRTUALTYPE type, const std::string &virtfile, const std::string & origfile, const struct stat *stbuf, int flags = VIRTUALFLAG_NONE); /** * @brief Add new virtual directory to the internal list. If the file already exists, it will be updated. * @param[in] type - Type of virtual file. * @param[in] virtdir - Name of virtual directory. * @param[in] stbuf - stat buffer with file size, time etc. * @param[in] flags - One of the VIRTUALFLAG_* flags to control the detailed behaviour. * @return Returns constant pointer to VIRTUALFILE object of file, nullptr if not found */ LPVIRTUALFILE insert_dir(VIRTUALTYPE type, const std::string & virtdir, const struct stat * stbuf, int flags = VIRTUALFLAG_NONE); /** * @brief Find file in cache. * @param[in] virtfile - Virtual filename and path of file to find. * @return If found, returns VIRTUALFILE object, if not found returns nullptr. */ LPVIRTUALFILE find_file(const std::string &virtfile); /** * @brief Look for the file in the cache. * @param[in] origfile - Filename and path of file to find. * @return If found, returns VIRTUALFILE object, if not found returns nullptr. */ LPVIRTUALFILE find_file_from_orig(const std::string &origfile); /** * @brief Check if the path has already been parsed. * Only useful if for DVD, Blu-ray or VCD where it is guaranteed that all files have been parsed whenever the directory is in the hash. * @param[in] path - Path to parse. * @return Returns true if path was found; false if not. */ bool check_path(const std::string & path); /** * @brief Load a path with virtual files for FUSE. * @param[in] path - Physical path to load. * @param[in] statbuf - stat buffer to load. * @param[in] buf - FUSE buffer to fill. * @param[in] filler - Filler function. * @return Returns number of files found. */ int load_path(const std::string & path, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler); /** * @brief Given the destination (post-transcode) file name, determine the parent of the file to be transcoded. * @param[in] origpath - The original file * @return Returns contstant pointer to VIRTUALFILE object of file, nullptr if not found */ LPVIRTUALFILE find_original(const std::string & origpath); /** * @brief Given the destination (post-transcode) file name, determine the name of the original file to be transcoded. * @param[inout] filepath - Input the original file, output name of transcoded file. * @return Returns contstant pointer to VIRTUALFILE object of file, nullptr if not found */ LPVIRTUALFILE find_original(std::string *filepath); /** * @brief Given the destination (post-transcode) file name, determine the parent of the file to be transcoded. * @param[in] origpath - The original file * @return Returns contstant pointer to VIRTUALFILE object of file, nullptr if not found */ LPVIRTUALFILE find_parent(const std::string & origpath); /** * @brief Convert SAMPLE_FMT enum to human readable text. * @return SAMPLE_FMT enum as text or "INVALID" if not known. */ std::string get_sampleformat_text(SAMPLE_FMT sample_fmt); /** * @brief Convert AVCodecID enum for audio codec to human readable text. * @param[in] audio_codec - AVCodecID enum value to convert. * @return AVCodecID as text or "INVALID" if not known. */ std::string get_audio_codec_text(AVCodecID audio_codec); /** * @brief Convert AVCodecID enum for video codec to human readable text. * @param[in] video_codec - AVCodecID enum value to convert. * @return AVCodecID as text or "INVALID" if not known. */ std::string get_video_codec_text(AVCodecID video_codec); /** * @brief Convert AUTOCOPY enum to human readable text. * @param[in] autocopy - AUTOCOPY enum value to convert. * @return AUTOCOPY enum as text or "INVALID" if not known. */ std::string get_autocopy_text(AUTOCOPY autocopy); /** * @brief Convert RECODESAME enum to human readable text. * @param[in] recode - RECODESAME enum value to convert. * @return RECODESAME enum as text or "INVALID" if not known. */ std::string get_recodesame_text(RECODESAME recode); /** * @brief Convert PROFILE enum to human readable text. * @param[in] profile - PROFILE enum value to convert. * @return PROFILE enum as text or "INVALID" if not known. */ std::string get_profile_text(PROFILE profile); /** * @brief Convert PRORESLEVEL enum to human readable text. * @param[in] level - PRORESLEVEL enum value to convert. * @return PRORESLEVEL enum as text or "INVALID" if not known. */ std::string get_level_text(PRORESLEVEL level); /** * @brief Get the selected hardware acceleration as text. * @param[in] hwaccel_API - Hardware acceleration buffering API. * @return Hardware acceleration API as string. */ std::string get_hwaccel_API_text(HWACCELAPI hwaccel_API); /** * @brief Check if codec_id and the optional profile are in the block list. * @param[in] codec_id - Codec ID to check * @param[in] profile - Profile to check. Set to FF_PROFILE_UNKOWN to ignore. * @return Returns true if codec is in block list, false if not. */ bool check_hwaccel_dec_blocked(AVCodecID codec_id, int profile); /** * @brief Wrapper to the Fuse filler function. * @param[inout] buf - The buffer passed to the readdir() operation. May be nullptr. * @param[in] filler - Function pointer to the Fuse update function. May be nullptr. * @param[in] name - The file name of the directory entry. Do not include the path! * @param[in] stbuf - File attributes, can be nullptr. * @param[in] off - Offset of the next entry or zero. * @return 1 if buffer is full, zero otherwise or if buf or filler is nullptr. */ int add_fuse_entry(void *buf, fuse_fill_dir_t filler, const std::string & name, const struct stat *stbuf, off_t off); /** * @brief Make dot and double dot entries for a virtual directory. * @param[inout] buf - The buffer passed to the readdir() operation. May be nullptr. * @param[in] filler - Function pointer to the Fuse update function. May be nullptr. * @param[in] stbuf - File attributes. May be nullptr. * @param[in] off - Offset of the next entry or zero. * @return Returns 1 if the buffer is full, zero otherwise. If buf or filler is nullptr, returns zero. */ int add_dotdot(void *buf, fuse_fill_dir_t filler, const struct stat *stbuf, off_t off); ffmpegfs-2.18/src/ffmpeg_profiles.h0000644000000000000000000001007715166175407014260 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_profiles.h * @brief FFmpeg encoder profiles * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef FFMPEG_PROFILES_H #define FFMPEG_PROFILES_H #pragma once #include "ffmpeg_utils.h" /** * @brief The #FFmpeg_Profiles class */ class FFmpeg_Profiles { public: #define OPT_ALL 0x00000000 /**< @brief All files */ #define OPT_AUDIO 0x00000001 /**< @brief For audio only files */ #define OPT_VIDEO 0x00000002 /**< @brief For videos (not audio only) */ #define OPT_SW_ONLY 0x00000004 /**< @brief Use this option for software encoding only */ #define OPT_HW_ONLY 0x00000008 /**< @brief Use this option for hardware encoding only */ typedef struct PROFILE_OPTION /**< @brief Profiles options */ { const char * m_key; /**< @brief Key, see av_opt_set() and av_dict_set() FFmpeg API function */ const char * m_value; /**< @brief Value, see av_opt_set() and av_dict_set() FFmpeg API function */ const int m_flags; /**< @brief Flags, see av_opt_set() and av_dict_set() FFmpeg API function */ const int m_options; /**< @brief One of the OPT_* flags */ } PROFILE_OPTION; /**< @brief Profile option */ typedef PROFILE_OPTION * LPPROFILE_OPTION; /**< @brief Pointer version of PROFILE_OPTION */ typedef PROFILE_OPTION const * LPCPROFILE_OPTION; /**< @brief Pointer to const version of PROFILE_OPTION */ typedef std::vector PROFILE_OPTION_VEC; /**< @brief PROFILE_OPTION array */ typedef struct PROFILE_LIST /**< @brief List of profiles */ { FILETYPE m_filetype; /**< @brief File type this option set is for */ PROFILE m_profile; /**< @brief One of PROFILE_ */ const PROFILE_OPTION_VEC m_option_codec; /**< @brief av_opt_set() options */ const PROFILE_OPTION_VEC m_option_format; /**< @brief av_dict_set() options */ } PROFILE_LIST; /**< @brief Profile list */ typedef PROFILE_LIST * LPPROFILE_LIST; /**< @brief Pointer version of PROFILE_LIST */ typedef PROFILE_LIST const * LPCPROFILE_LIST; /**< @brief Pointer to const version of PROFILE_LIST */ typedef std::vector PROFILE_LIST_VEC; /**< @brief PROFILE_LIST array */ protected: /** * @brief Construct a FFmpeg_Profiles object. */ explicit FFmpeg_Profiles() = default; /** * @brief Destruct a FFmpeg_Profiles object. */ virtual ~FFmpeg_Profiles() = default; protected: static const PROFILE_LIST_VEC m_profile; /**< @brief List of profile options */ }; #endif // FFMPEG_PROFILES_H ffmpegfs-2.18/src/transcode.cc0000644000000000000000000011171515166175407013232 00000000000000/* * Copyright (C) 2006-2008 David Collett * Copyright (C) 2008-2013 K. Henriksson * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file transcode.cc * @brief File transcoder interface implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2006-2008 David Collett @n * Copyright (C) 2008-2013 K. Henriksson @n * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) */ #include "transcode.h" #include "ffmpegfs.h" #include "ffmpeg_transcoder.h" #include "buffer.h" #include "cache.h" #include "logging.h" #include "cache_entry.h" #include "thread_pool.h" #include #include const int GRANULARITY = 250; /**< @brief Image frame conversion: ms between checks if a picture frame is available */ const int FRAME_TIMEOUT = 60; /**< @brief Image frame conversion: timout seconds to wait if a picture frame is available */ const int TOTAL_RETRIES = FRAME_TIMEOUT*1000/GRANULARITY; /**< @brief Number of retries */ /** * @brief THREAD_DATA struct to pass data from parent to child thread */ typedef struct THREAD_DATA { std::mutex m_thread_running_mutex; /**< @brief Mutex when thread is running */ std::condition_variable m_thread_running_cond; /**< @brief Condition when thread is running */ std::atomic_bool m_thread_running_lock_guard; /**< @brief Lock guard to avoid spurious or missed unlocks */ bool m_initialised; /**< @brief True when this object is completely initialised */ Cache_Entry * m_cache_entry; /**< @brief Cache entry object. Will not be freed by child thread. */ } THREAD_DATA; static std::unique_ptr cache; /**< @brief Global cache manager object */ static std::atomic_bool thread_exit; /**< @brief Used for shutdown: if true, forcibly exit all threads */ static bool transcode(std::shared_ptr thread_data, Cache_Entry *cache_entry, FFmpeg_Transcoder & transcoder, bool *timeout); static int transcoder_thread(std::shared_ptr thread_data); static bool transcode_until(Cache_Entry* cache_entry, size_t offset, size_t len, uint32_t segment_no); static int transcode_finish(Cache_Entry* cache_entry, FFmpeg_Transcoder & transcoder); /** * @brief Transcode the buffer until the buffer has enough or until an error occurs. * The buffer needs at least 'end' bytes before transcoding stops. Returns true * if no errors and false otherwise. * @param[in] cache_entry - corresponding cache entry * @param[in] offset - byte offset to start reading at * @param[in] len - length of data chunk to be read. * @param[in] segment_no - HLS segment file number. * @return On success, returns true. Returns false if an error occurred. */ static bool transcode_until(Cache_Entry* cache_entry, size_t offset, size_t len, uint32_t segment_no) { size_t end = offset + len; // Cast OK: offset will never be < 0. bool success = true; if (cache_entry->is_finished() || cache_entry->m_buffer->is_segment_finished(segment_no) || cache_entry->m_buffer->tell(segment_no) >= end) { return true; } try { // Wait until decoder thread has reached the desired position if (cache_entry->m_is_decoding) { bool reported = false; while (!(cache_entry->is_finished() || cache_entry->m_buffer->is_segment_finished(segment_no) || cache_entry->m_buffer->tell(segment_no) >= end) && !cache_entry->m_cache_info.m_error) { if (fuse_interrupted()) { Logging::info(cache_entry->virtname(), "The client has gone away."); errno = 0; // No error break; } if (thread_exit) { Logging::warning(cache_entry->virtname(), "Thread exit was received."); errno = EINTR; throw false; } if (!reported) { if (!segment_no) { Logging::trace(cache_entry->virtname(), "Cache miss at offset %1 with length %2.", offset, len); } else { Logging::trace(cache_entry->virtname(), "Cache miss at offset %1 with length %2 for segment no. %3.", offset, len, segment_no); } reported = true; } mssleep(250); } if (reported) { if (!segment_no) { Logging::trace(cache_entry->virtname(), "Cache hit at offset %1 with length %2.", offset, len); } else { Logging::trace(cache_entry->virtname(), "Cache hit at offset %1 with length %2 for segment no. %3.", offset, len, segment_no); } } success = !cache_entry->m_cache_info.m_error; } } catch (bool _success) { success = _success; } return success; } /** * @brief Close the input file and free everything but the initial buffer. * @param[in] cache_entry - corresponding cache entry * @param[in] transcoder - Current FFmpeg_Transcoder object. * @return On success, returns 0; on error, a negative AVERROR value. */ static int transcode_finish(Cache_Entry* cache_entry, FFmpeg_Transcoder & transcoder) { int res = transcoder.encode_finish(); if (res < 0) { return res; } // Check encoded buffer size. Does not affect HLS segments. cache_entry->m_cache_info.m_duration = transcoder.duration(); cache_entry->m_cache_info.m_encoded_filesize = cache_entry->m_buffer->buffer_watermark(); cache_entry->m_cache_info.m_video_frame_count = transcoder.video_frame_count(); cache_entry->m_cache_info.m_segment_count = transcoder.segment_count(); cache_entry->m_cache_info.m_result = !transcoder.have_seeked() ? RESULTCODE::FINISHED_SUCCESS : RESULTCODE::FINISHED_INCOMPLETE; cache_entry->m_is_decoding = false; cache_entry->m_cache_info.m_errno = 0; cache_entry->m_cache_info.m_averror = 0; Logging::debug(transcoder.virtname(), "Finishing file."); if (!cache_entry->m_buffer->reserve(cache_entry->m_cache_info.m_encoded_filesize)) { Logging::debug(transcoder.virtname(), "Unable to truncate the buffer."); } if (!transcoder.is_multiformat()) { Logging::debug(transcoder.virtname(), "Predicted size: %1 Final: %2 Diff: %3 (%4%).", format_size_ex(cache_entry->m_cache_info.m_predicted_filesize).c_str(), format_size_ex(cache_entry->m_cache_info.m_encoded_filesize).c_str(), format_result_size_ex(cache_entry->m_cache_info.m_encoded_filesize, cache_entry->m_cache_info.m_predicted_filesize).c_str(), ((static_cast(cache_entry->m_cache_info.m_encoded_filesize) * 1000 / (static_cast(cache_entry->m_cache_info.m_predicted_filesize) + 1)) + 5) / 10); } cache_entry->flush(); return 0; } void transcoder_cache_path(std::string * path) { if (params.m_cachepath.size()) { *path = params.m_cachepath; } else { if (geteuid() == 0) { // Running as root *path = "/var/cache"; } else { // Running as regular user, put cache in home dir if (const char* cache_home = std::getenv("XDG_CACHE_HOME")) { *path = cache_home; } else { expand_path(path, "~/.cache"); } } } append_sep(path); *path += PACKAGE; append_sep(path); } bool transcoder_init() { if (cache == nullptr) { Logging::debug(nullptr, "Creating new media file cache."); cache = std::make_unique(); if (cache == nullptr) { Logging::error(nullptr, "Unable to create new media file cache. Out of memory."); std::fprintf(stderr, "ERROR: Creating new media file cache. Out of memory.\n"); return false; } if (!cache->load_index()) { std::fprintf(stderr, "ERROR: Creating media file cache failed.\n"); return false; } } return true; } void transcoder_free() { if (cache != nullptr) { cache.reset(); Logging::debug(nullptr, "Deleting media file cache."); } } bool transcoder_cached_filesize(LPVIRTUALFILE virtualfile, struct stat *stbuf) { Cache_Entry* cache_entry = cache->openio(virtualfile); if (cache_entry == nullptr) { return false; } size_t encoded_filesize = cache_entry->m_cache_info.m_encoded_filesize; if (!encoded_filesize) { // If not yet encoded, return predicted file size encoded_filesize = cache_entry->m_cache_info.m_predicted_filesize; } if (encoded_filesize) { stat_set_size(stbuf, encoded_filesize); return true; } else { return false; } } bool transcoder_set_filesize(LPVIRTUALFILE virtualfile, int64_t duration, BITRATE audio_bit_rate, int channels, int sample_rate, AVSampleFormat sample_format, BITRATE video_bit_rate, int width, int height, bool interleaved, const AVRational &framerate) { Cache_Entry* cache_entry = cache->openio(virtualfile); if (cache_entry == nullptr) { Logging::error(nullptr, "Out of memory getting file size."); return false; } const FFmpegfs_Format *current_format = params.current_format(virtualfile); if (current_format == nullptr) { Logging::error(cache_entry->virtname(), "Internal error getting file size."); return false; } size_t filesize = 0; if (!FFmpeg_Transcoder::audio_size(&filesize, current_format->audio_codec(), audio_bit_rate, duration, channels, sample_rate, sample_format)) { Logging::warning(cache_entry->virtname(), "Unsupported audio codec '%1' for format %2.", get_codec_name(current_format->audio_codec()), current_format->desttype().c_str()); } if (!FFmpeg_Transcoder::video_size(&filesize, current_format->video_codec(), video_bit_rate, duration, width, height, interleaved, framerate)) { Logging::warning(cache_entry->virtname(), "Unsupported video codec '%1' for format %2.", get_codec_name(current_format->video_codec()), current_format->desttype().c_str()); } if (!FFmpeg_Transcoder::total_overhead(&filesize, current_format->filetype())) { Logging::warning(cache_entry->virtname(), "Unsupported file type '%1' for format %2.", get_filetype_text(current_format->filetype()).c_str(), current_format->desttype().c_str()); } cache_entry->m_cache_info.m_predicted_filesize = virtualfile->m_predicted_size = filesize; Logging::trace(cache_entry->virtname(), "Predicted transcoded size of %1.", format_size_ex(cache_entry->m_cache_info.m_predicted_filesize).c_str()); return true; } bool transcoder_predict_filesize(LPVIRTUALFILE virtualfile, Cache_Entry* cache_entry) { FFmpeg_Transcoder transcoder; bool success = false; if (transcoder.open_input_file(virtualfile) >= 0) { if (cache_entry != nullptr) { cache_entry->m_cache_info.m_predicted_filesize = transcoder.predicted_filesize(); cache_entry->m_cache_info.m_video_frame_count = transcoder.video_frame_count(); cache_entry->m_cache_info.m_segment_count = transcoder.segment_count(); cache_entry->m_cache_info.m_duration = transcoder.duration(); } Logging::trace(transcoder.filename(), "Predicted transcoded size of %1.", format_size_ex(transcoder.predicted_filesize()).c_str()); transcoder.closeio(); success = true; } return success; } Cache_Entry* transcoder_new(LPVIRTUALFILE virtualfile, bool begin_transcode) { // Allocate transcoder structure Cache_Entry* cache_entry = cache->openio(virtualfile); if (cache_entry == nullptr) { return nullptr; } Logging::trace(cache_entry->filename(), "Creating transcoder object."); try { cache_entry->lock(); if (!cache_entry->openio(begin_transcode)) { throw static_cast(errno); } if (params.m_disable_cache) { // Disable cache cache_entry->clear(); } else if (!cache_entry->m_is_decoding && cache_entry->outdated()) { cache_entry->clear(); } if (cache_entry->m_cache_info.m_duration) { virtualfile->m_duration = cache_entry->m_cache_info.m_duration; } if (cache_entry->m_cache_info.m_predicted_filesize) { virtualfile->m_predicted_size = cache_entry->m_cache_info.m_predicted_filesize; } if (cache_entry->m_cache_info.m_video_frame_count) { virtualfile->m_video_frame_count = cache_entry->m_cache_info.m_video_frame_count; } if (!cache_entry->m_is_decoding && !cache_entry->is_finished_success()) { if (begin_transcode) { Logging::debug(cache_entry->filename(), "Starting transcoder thread."); // Clear cache to remove any older remains cache_entry->clear(); // Must decode the file, otherwise simply use cache cache_entry->m_is_decoding = true; std::shared_ptr thread_data = std::make_unique(); thread_data->m_initialised = false; thread_data->m_cache_entry = cache_entry; thread_data->m_thread_running_lock_guard = false; { std::unique_lock lock_thread_running_mutex(thread_data->m_thread_running_mutex); tp->schedule_thread(std::bind(&transcoder_thread, thread_data)); // Let decoder get into gear before returning from open while (!thread_data->m_thread_running_lock_guard) { thread_data->m_thread_running_cond.wait(lock_thread_running_mutex); } } if (cache_entry->m_cache_info.m_error) { int ret; Logging::trace(cache_entry->filename(), "Transcoder error!"); ret = cache_entry->m_cache_info.m_errno; if (!ret) { ret = EIO; // Must return something, be it a simple I/O error... } throw ret; } Logging::debug(cache_entry->filename(), "Transcoder thread is running."); } else if (!cache_entry->m_cache_info.m_predicted_filesize) { if (!transcoder_predict_filesize(virtualfile, cache_entry)) { throw static_cast(errno); } } } else if (begin_transcode) { Logging::trace(cache_entry->virtname(), "Reading file from cache."); } cache_entry->unlock(); } catch (int orgerrno) { cache_entry->m_is_decoding = false; cache_entry->unlock(); cache->closeio(&cache_entry, CACHE_CLOSE_DELETE); cache_entry = nullptr; // Make sure to return NULL here even if the cache could not be deleted now (still in use) errno = orgerrno; // Restore last errno } return cache_entry; } bool transcoder_read(Cache_Entry* cache_entry, char* buff, size_t offset, size_t len, int * bytes_read, uint32_t segment_no) { bool success = true; if (!segment_no) { Logging::trace(cache_entry->virtname(), "Reading %1 bytes from offset %2 to %3.", len, offset, len + offset); } else { Logging::trace(cache_entry->virtname(), "Reading %1 bytes from offset %2 to %3 for segment no. %4.", len, offset, len + offset, segment_no); } // Store access time cache_entry->update_access(); // Update read counter cache_entry->update_read_count(); try { // Try to read requested segment, stack a seek to if if this fails. // No seek if not HLS (segment_no) and not required if < MIN_SEGMENT if (segment_no && !cache_entry->m_buffer->segment_exists(segment_no)) { cache_entry->m_seek_to_no = segment_no; } // Open for reading if necessary if (!cache_entry->m_buffer->open_file(segment_no, CACHE_FLAG_RO)) { throw false; } if (!cache_entry->is_finished_success()) { switch (params.current_format(cache_entry->virtualfile())->filetype()) { case FILETYPE::MP3: { // If we are encoding to MP3 and the requested data overlaps the ID3v1 tag // at the end of the file, do not encode data first up to that position. // This optimises the case where applications read the end of the file // first to read the ID3v1 tag. if ((offset > cache_entry->m_buffer->tell(segment_no)) && (offset + len >= (cache_entry->size() - ID3V1_TAG_LENGTH))) { // Stuff buffer with garbage, apps won't try to play that chunk anyway. std::memset(buff, 0xFF, len); if (cache_entry->size() - offset == ID3V1_TAG_LENGTH) { std::memcpy(buff, &cache_entry->m_id3v1, std::min(len, ID3V1_TAG_LENGTH)); } errno = 0; throw true; // OK } break; } default: { break; } } // Windows seems to access the files on Samba drives starting at the last 64K segment simply when // the file is opened. Setting win_smb_fix=1 will ignore these attempts (not decode the file up // to this point). // Access will only be ignored if occurring at the second access. if (params.m_win_smb_fix && cache_entry->read_count() == 2) { if ((offset > cache_entry->m_buffer->tell(segment_no)) && (len <= 65536) && check_ignore(cache_entry->size(), offset) && ((offset + len) > (cache_entry->size()))) { Logging::warning(cache_entry->virtname(), "Ignoring Windows' groundless access to the last 8K boundary of the file."); errno = 0; *bytes_read = 0; // We've read nothing len = 0; throw true; // OK } } } success = transcode_until(cache_entry, offset, len, segment_no); if (!success) { errno = cache_entry->m_cache_info.m_errno ? cache_entry->m_cache_info.m_errno : EIO; throw false; } // truncate if we didn't actually get len if (cache_entry->m_buffer->buffer_watermark(segment_no) < offset) { len = 0; } else if (cache_entry->m_buffer->buffer_watermark(segment_no) < offset + len) { len = cache_entry->m_buffer->buffer_watermark(segment_no) - offset; } if (len) { if (!cache_entry->m_buffer->copy(reinterpret_cast(buff), offset, len, segment_no)) { len = 0; // We already capped len to not overread the buffer, so it is an error if we end here. throw false; } if (cache_entry->m_cache_info.m_error) { errno = cache_entry->m_cache_info.m_errno ? cache_entry->m_cache_info.m_errno : EIO; throw false; } } errno = 0; } catch (bool _success) { success = _success; } *bytes_read = static_cast(len); return success; } bool transcoder_read_frame(Cache_Entry* cache_entry, char* buff, size_t offset, size_t len, uint32_t frame_no, int * bytes_read, LPVIRTUALFILE virtualfile) { bool success = false; Logging::trace(cache_entry->virtname(), "Reading %1 bytes from offset %2 to %3 for frame no. %4.", len, offset, len + offset, frame_no); // Store access time cache_entry->update_access(); // Update read counter cache_entry->update_read_count(); try { // Open for reading if necessary if (!cache_entry->m_buffer->open_file(0, CACHE_FLAG_RO)) { throw false; } std::vector data; // Wait until decoder thread has the requested frame available if (cache_entry->m_is_decoding || cache_entry->m_suspend_timeout) { // Try to read requested frame, stack a seek to if if this fails. if (!cache_entry->m_buffer->read_frame(&data, frame_no)) { bool reported = false; cache_entry->m_seek_to_no = frame_no; int retries = TOTAL_RETRIES; while (!cache_entry->m_buffer->read_frame(&data, frame_no) && !thread_exit) { if (errno != EAGAIN) { Logging::error(cache_entry->virtname(), "Reading image frame no. %1: (%2) %3", frame_no, errno, strerror(errno)); throw false; } if (!cache_entry->m_suspend_timeout) { if (errno == EAGAIN && !--retries) { errno = ETIMEDOUT; Logging::error(cache_entry->virtname(), "Timeout reading image frame no. %1: (%2) %3", frame_no, errno, strerror(errno)); throw false; } } else { retries = TOTAL_RETRIES; } if (thread_exit) { Logging::warning(cache_entry->virtname(), "Thread exit was received."); errno = EINTR; throw false; } if (!reported) { Logging::trace(cache_entry->virtname(), "Frame no. %1: Cache miss at offset %<11zu>2 (length %<6u>3).", frame_no, offset, len); reported = true; } mssleep(GRANULARITY); } } Logging::trace(cache_entry->virtname(), "Frame no. %1: Cache hit at offset %<11zu>2 (length %<6u>3).", frame_no, offset, len); success = !cache_entry->m_cache_info.m_error; } else { success = cache_entry->m_buffer->read_frame(&data, frame_no); if (!success) { Logging::error(cache_entry->virtname(), "Reading image frame no. %1: (%2) %3", frame_no, errno, strerror(errno)); throw false; } } if (success) { if (data.size() < offset) { len = 0; } else if (data.size() < offset + len) { len = data.size() - offset; } if (len) { std::memcpy(buff, data.data() + offset, len); } stat_set_size(&virtualfile->m_st, data.size()); *bytes_read = static_cast(len); } } catch (bool _success) { success = _success; } return success; } void transcoder_delete(Cache_Entry* cache_entry) { cache->closeio(&cache_entry); } size_t transcoder_get_size(Cache_Entry* cache_entry) { return cache_entry->size(); } size_t transcoder_buffer_watermark(Cache_Entry* cache_entry, uint32_t segment_no) { return cache_entry->m_buffer->buffer_watermark(segment_no); } size_t transcoder_buffer_tell(Cache_Entry* cache_entry, uint32_t segment_no) { return cache_entry->m_buffer->tell(segment_no); } void transcoder_exit() { thread_exit = true; } bool transcoder_cache_maintenance() { if (cache != nullptr) { return cache->maintenance(); } else { return false; } } bool transcoder_cache_clear() { if (cache != nullptr) { return cache->clear(); } else { return false; } } /** * @brief Actually transcode file * @param[inout] thread_data - Thread data with lock objects * @param[inout] cache_entry - Underlying thread entry * @param[in] transcoder - Transcoder object for transcoding * @param[out] timeout - True if transcoding timed out, false if not * @return On success, returns true; on error, returns false */ static bool transcode(std::shared_ptr thread_data, Cache_Entry *cache_entry, FFmpeg_Transcoder & transcoder, bool *timeout) { int averror = 0; int syserror = 0; bool success = true; // Clear cache to remove any older remains cache_entry->clear(); // Must decode the file, otherwise simply use cache cache_entry->m_is_decoding = true; try { bool unlocked = false; Logging::info(cache_entry->filename(), "Transcoding to %1.", params.current_format(cache_entry->virtualfile())->desttype().c_str()); if (!cache_entry->openio()) { throw (static_cast(errno)); } averror = transcoder.open_input_file(cache_entry->virtualfile()); if (averror < 0) { throw (static_cast(errno)); } if (!cache_entry->m_cache_info.m_duration) { cache_entry->m_cache_info.m_duration = transcoder.duration(); } if (!cache_entry->m_cache_info.m_predicted_filesize) { cache_entry->m_cache_info.m_predicted_filesize = transcoder.predicted_filesize(); } if (!cache_entry->m_cache_info.m_video_frame_count) { cache_entry->m_cache_info.m_video_frame_count = transcoder.video_frame_count(); } if (!cache_entry->m_cache_info.m_segment_count) { cache_entry->m_cache_info.m_segment_count = transcoder.segment_count(); } if (cache != nullptr && !cache->maintenance(transcoder.predicted_filesize())) { throw (static_cast(errno)); } averror = transcoder.open_output_file(cache_entry->m_buffer.get()); if (averror < 0) { throw (static_cast(errno)); } std::memcpy(&cache_entry->m_id3v1, transcoder.id3v1tag(), sizeof(ID3v1)); thread_data->m_initialised = true; unlocked = false; if ((!params.m_prebuffer_size && !params.m_prebuffer_time) || transcoder.is_frameset()) { // Unlock frame set from beginning unlocked = true; thread_data->m_thread_running_lock_guard = true; thread_data->m_thread_running_cond.notify_all(); // signal that we are running } else { if (params.m_prebuffer_time) { Logging::debug(cache_entry->virtname(), "Pre-buffering up to %1.", format_time(params.m_prebuffer_time).c_str()); } if (params.m_prebuffer_size) { Logging::debug(cache_entry->virtname(), "Pre-buffering up to %1.", format_size(params.m_prebuffer_size).c_str()); } } cache_entry->m_suspend_timeout = false; while (!cache_entry->is_finished() && !(*timeout = cache_entry->decode_timeout()) && !thread_exit) { DECODER_STATUS status = DECODER_STATUS::DEC_SUCCESS; if (cache_entry->ref_count() > 1) { // Set last access time cache_entry->update_access(false); } if (transcoder.is_frameset()) { uint32_t frame_no = cache_entry->m_seek_to_no; if (frame_no) { cache_entry->m_seek_to_no = 0; averror = transcoder.stack_seek_frame(frame_no); if (averror < 0) { throw (static_cast(errno)); } } } else if (transcoder.is_hls()) { uint32_t segment_no = cache_entry->m_seek_to_no; if (segment_no) { cache_entry->m_seek_to_no = 0; averror = transcoder.stack_seek_segment(segment_no); if (averror < 0) { throw (static_cast(errno)); } } } averror = transcoder.process_single_fr(&status); if (status == DECODER_STATUS::DEC_ERROR) { errno = EIO; throw (static_cast(errno)); } else if (status == DECODER_STATUS::DEC_EOF) { cache_entry->m_suspend_timeout = true; // Suspend read_frame time out until transcoder is reopened. averror = transcode_finish(cache_entry, transcoder); if (averror < 0) { errno = EIO; throw (static_cast(errno)); } } if (!unlocked && cache_entry->m_buffer->buffer_watermark() > params.m_prebuffer_size && transcoder.pts() > static_cast(params.m_prebuffer_time) * AV_TIME_BASE) { unlocked = true; Logging::debug(cache_entry->virtname(), "Pre-buffer limit reached."); thread_data->m_thread_running_lock_guard = true; thread_data->m_thread_running_cond.notify_all(); // signal that we are running } if (cache_entry->ref_count() <= 1 && cache_entry->suspend_timeout()) { if (!unlocked && (params.m_prebuffer_size || params.m_prebuffer_time)) { unlocked = true; thread_data->m_thread_running_lock_guard = true; thread_data->m_thread_running_cond.notify_all(); // signal that we are running } Logging::info(cache_entry->virtname(), "Suspend timeout. Transcoding suspended after %1 seconds inactivity.", params.m_max_inactive_suspend); while (cache_entry->suspend_timeout() && !(*timeout = cache_entry->decode_timeout()) && !thread_exit) { mssleep(GRANULARITY); } if (*timeout) { break; } Logging::info(cache_entry->virtname(), "Transcoding resumed."); } } if (!unlocked && (params.m_prebuffer_size || params.m_prebuffer_time)) { Logging::debug(cache_entry->virtname(), "File transcode complete, releasing buffer early: Size %1.", cache_entry->m_buffer->buffer_watermark()); thread_data->m_thread_running_lock_guard = true; thread_data->m_thread_running_cond.notify_all(); // signal that we are running } } catch (int _syserror) { success = false; syserror = _syserror; if (!syserror && averror > -512) { // If no system error reported explicitly, and averror is a POSIX error // (we simply assume that if averror < 512, I think averrors are all higher values) syserror = AVUNERROR(averror); } cache_entry->m_cache_info.m_error = true; if (!syserror) { // If system error is still zero, set to EIO to return at least anything else than success. syserror = EIO; } thread_data->m_thread_running_lock_guard = true; thread_data->m_thread_running_cond.notify_all(); // unlock main thread } cache_entry->m_suspend_timeout = false; // Should end that suspension; otherwise, read may hang. cache_entry->m_cache_info.m_errno = syserror; // Preserve errno cache_entry->m_cache_info.m_averror = averror; // Preserve averror transcoder.closeio(); return success; } /** * @brief Transcoding thread * @param[in] thread_data - Corresponding thread data object. * @returns Returns 0 on success; or errno code on error. */ static int transcoder_thread(std::shared_ptr thread_data) { Cache_Entry * cache_entry = thread_data->m_cache_entry; FFmpeg_Transcoder transcoder; bool timeout = false; bool success = true; std::unique_lock lock_active_mutex(cache_entry->m_active_mutex); std::unique_lock lock_restart_mutex(cache_entry->m_restart_mutex); uint32_t seek_frame = 0; do { if (seek_frame) { Logging::error(transcoder.virtname(), "Transcoder completed with last seek frame to %1. Transcoder is being restarted.", seek_frame); } success = transcode(thread_data, cache_entry, transcoder, &timeout); seek_frame = cache_entry->m_seek_to_no != 0 ? cache_entry->m_seek_to_no.load() : transcoder.last_seek_frame_no(); } while (success && !thread_exit && cache != nullptr && seek_frame); cache_entry->m_is_decoding = false; if (timeout || thread_exit || transcoder.have_seeked()) { if (!transcoder.have_seeked()) { cache_entry->m_cache_info.m_error = true; cache_entry->m_cache_info.m_errno = EIO; // Report I/O error if (timeout) { Logging::warning(cache_entry->virtname(), "Timeout! Transcoding aborted after %1 seconds inactivity.", params.m_max_inactive_abort); } else if (thread_exit) { Logging::info(cache_entry->virtname(), "Thread exit! Transcoding aborted."); } else { Logging::info(cache_entry->virtname(), "Transcoding aborted."); } } else { // Must restart from scratch, but this is not an error. cache_entry->m_cache_info.m_error = false; cache_entry->m_cache_info.m_errno = 0; cache_entry->m_cache_info.m_averror = 0; } } else { cache_entry->m_cache_info.m_error = !success; if (success) { Logging::info(cache_entry->virtname(), "Transcoding completed successfully."); cache_entry->m_cache_info.m_errno = 0; cache_entry->m_cache_info.m_averror = 0; } else { Logging::error(cache_entry->virtname(), "Transcoding exited with error."); if (cache_entry->m_cache_info.m_errno) { Logging::error(cache_entry->virtname(), "System error: (%1) %2", cache_entry->m_cache_info.m_errno, strerror(cache_entry->m_cache_info.m_errno)); } if (cache_entry->m_cache_info.m_averror) { Logging::error(cache_entry->virtname(), "FFMpeg error: (%1) %2", cache_entry->m_cache_info.m_averror, ffmpeg_geterror(cache_entry->m_cache_info.m_averror).c_str()); } } } int _errno = cache_entry->m_cache_info.m_errno; if (cache != nullptr) { cache->closeio(&cache_entry, timeout ? CACHE_CLOSE_DELETE : CACHE_CLOSE_NOOPT); } thread_data.reset(); errno = _errno; return errno; } ffmpegfs-2.18/src/aiff.h0000644000000000000000000000747115166175407012022 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file aiff.h * @brief AIFF file structures * http://paulbourke.net/dataformats/audio/ * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef AIFF_H #define AIFF_H #pragma once #include #include #pragma pack(push, 1) typedef std::array AIFF_ID; /**< @brief AIFF fourcc ID */ #define AIFF_FORMID "FORM" /**< @brief ckID for Form Chunk */ /** * AIFF format chunk */ typedef struct { AIFF_ID m_ckID; /**< @brief Chunk ID, always "FORM" */ uint32_t m_ckSize; /**< @brief Total file size - 8 */ AIFF_ID formType; /**< @brief */ //uint8_t chunks[]; } AIFF_FORMCHUNK; /** * AIFF chunk (anything else than the special chunks like form, common etc.) */ typedef struct { AIFF_ID m_ckID; /**< @brief Chunk ID */ uint32_t m_ckSize; /**< @brief Size of this chunk - 8 */ //uint8_t data[]; } AIFF_CHUNK; #define AIFF_COMMONID "COMM" /**< @brief ckID for Common Chunk */ /** * AIFF Common chunk */ typedef struct { AIFF_ID m_ckID; /**< @brief Chunk ID, always "COMM" */ uint32_t m_ckSize; /**< @brief Size of this chunk - 8 */ uint8_t m_numChannels; /**< @brief Number of audio channels for the sound. */ uint32_t m_numSampleFrames; /**< @brief Number of sample frames in the sound data chunk. */ uint8_t m_sampleSize; /**< @brief Number of bits in each sample point. */ //extended sampleRate; } AIFF_COMMONCHUNK; #define AIFF_SOUNDATAID "SSND" /**< @brief ckID for Sound Data Chunk */ /** * AIFF sound data chunk */ typedef struct { AIFF_ID m_ckID; /**< @brief Chunk ID, always "SSND" */ uint32_t m_ckSize; /**< @brief Total size of sound data chunk - 8 */ uint32_t m_offset; /**< @brief Determines where the first sample frame in the soundData starts. */ uint32_t m_blockSize; /**< @brief Contains the size in bytes of the blocks that sound data is aligned to. */ //uint8_t soundData[]; } AIFF_SOUNDDATACHUNK; #define AIFF_NAMEID "NAME" /**< @brief ckID for Name Chunk. */ #define AIFF_AUTHORID "AUTH" /**< @brief ckID for Author Chunk. */ #define AIFF_COPYRIGHTID "(c) " /**< @brief ckID for Copyright Chunk. */ #define AIFF_ANNOTATIONID "ANNO" /**< @brief ckID for Annotation Chunk. */ /** * AIFF name chunk */ typedef struct { AIFF_ID m_ckID; /**< @brief Chunk ID, one of "NAME", "AUTH", "(c) ", "ANNO" */ uint32_t m_ckSize; /**< @brief Size of this chunk - 8 */ //uint8_t text[]; } AIFF_TEXTCHUNK; #pragma pack(pop) #endif // AIFF_H ffmpegfs-2.18/src/cuesheetparser.cc0000644000000000000000000004045715166175407014276 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file cuesheetparser.cc * @brief Cue sheet parser implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "ffmpegfs.h" #include "cuesheetparser.h" #include "transcode.h" #include "logging.h" #include #define FPS (75) ///<* On sector contains 75 frames per CD specs #define VAL_OR_EMPTY(val) ((val) != nullptr ? (val) : "") ///<* Return string or empty string if val is nullptr /** * @brief Cuesheet structure * Structure see https://en.wikipedia.org/wiki/Cue_sheet_(computing) @n * @n * Real life example: @n * @n * PERFORMER "Subway to Sally" @n * TITLE "Nord Nord Ost" @n * CATALOG 0727361134129 @n * REM DATE 2005 @n * REM DISCNUMBER 1 @n * REM TOTALDISCS 1 @n * FILE "Subway to Sally - Nord Nord Ost.flac" WAVE @n * TRACK 01 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "Sarabande de noir" @n * INDEX 01 00:00:00 @n * TRACK 02 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "Schneekönigin" @n * INDEX 01 00:55:30 @n * TRACK 03 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "Feuerland" @n * INDEX 01 06:41:38 @n * TRACK 04 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "Sieben" @n * INDEX 01 10:48:42 @n * TRACK 05 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "Lacrimae '74" @n * INDEX 01 14:11:14 @n * TRACK 06 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "Feuerkind" @n * INDEX 01 15:57:07 @n * TRACK 07 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "Das Rätsel II" @n * INDEX 01 22:03:28 @n * TRACK 08 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "S.O.S." @n * INDEX 01 26:25:23 @n * TRACK 09 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "Eisblumen" @n * INDEX 01 32:21:42 @n * TRACK 10 AUDIO @n * PERFORMER "Subway to Sally" @n * TITLE "Seemannslied" @n * INDEX 01 36:53:71 @n */ static bool create_cuesheet_virtualfile(LPCVIRTUALFILE virtualfile, Track *track, int titleno, const std::string & path, const struct stat * statbuf, int trackcount, int trackno, const std::string &aperformer, const std::string & album, const std::string & genre, const std::string & date, int64_t *remainingduration, LPVIRTUALFILE *lastfile); static int parse_cuesheet_file(LPCVIRTUALFILE virtualfile, const std::string & cuesheet, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler); static int parse_cuesheet_text(LPCVIRTUALFILE virtualfile, void *buf, fuse_fill_dir_t filler); static int parse_cuesheet(LPCVIRTUALFILE virtualfile, const std::string & cuesheet, Cd *cd, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler); /** * @brief Create a virtual file entry of a cue sheet title. * @param[in] virtualfile - VIRTUALFILE struct of a file. * @param[in] track - libcue2 track handle * @param[in] titleno - Title number. * @param[in] path - Path to check. * @param[in] statbuf - File status structure of original file. * @param[in] trackcount - Number of tracks in cue sheet. * @param[in] trackno - Track number. * @param[in] aperformer - Album performer. * @param[in] album - Name of album. * @param[in] genre - Album genre. * @param[in] date - Publishing date. * @param[inout] remainingduration - Remaining duration of file in AV_TIME_BASE fractions. * @param[in] lastfile - Pointer to last virtual file. May be nullptr if none exists. * @return On error, returns false. On success, returns true. */ static bool create_cuesheet_virtualfile(LPCVIRTUALFILE virtualfile, Track *track, int titleno, const std::string & path, const struct stat * statbuf, int trackcount, int trackno, const std::string & aperformer, const std::string & album, const std::string & genre, const std::string & date, int64_t *remainingduration, LPVIRTUALFILE *lastfile) { Cdtext *cuesheetcdtext = track_get_cdtext(track); if (cuesheetcdtext == nullptr) { Logging::error(virtualfile->m_origfile, "The track CD text could not be extracted from the cue sheet."); errno = EIO; return false; } std::string performer = VAL_OR_EMPTY(cdtext_get(PTI_PERFORMER, cuesheetcdtext)); std::string title = VAL_OR_EMPTY(cdtext_get(PTI_TITLE, cuesheetcdtext)); if (performer.empty()) { // If track performer is empty, try album performer. performer = aperformer; } int64_t start = AV_TIME_BASE * static_cast(track_get_start(track)) / FPS; int64_t length = track_get_length(track); int64_t duration; if (length > -1) { duration = AV_TIME_BASE * length / FPS; *remainingduration -= duration; } else { // Length of duration = *remainingduration; } std::string virtfilename; strsprintf(&virtfilename, "%02d. %s - %s [%s].%s", titleno, performer.c_str(), title.c_str(), replace_all(format_duration(duration), ":", "-").c_str(), ffmpeg_format[virtualfile->m_format_idx].fileext().c_str()); // Filenames can't contain '/' in POSIX etc. std::replace(virtfilename.begin(), virtfilename.end(), '/', '-'); LPVIRTUALFILE newvirtualfile = nullptr; if (!ffmpeg_format[FORMAT::VIDEO].is_multiformat()) { newvirtualfile = insert_file(VIRTUALTYPE::DISK, path + virtfilename, virtualfile->m_origfile, statbuf, VIRTUALFLAG_CUESHEET); } else { newvirtualfile = insert_dir(VIRTUALTYPE::DISK, path + virtfilename, statbuf, VIRTUALFLAG_CUESHEET); } if (newvirtualfile == nullptr) { Logging::error(path, "Failed to create virtual path: %1", (path + virtfilename).c_str()); errno = EIO; return false; } // We do not add the file to fuse here because it's in a sub directory. // Will be done later on request by load_path() newvirtualfile->m_format_idx = virtualfile->m_format_idx; // Store the correct index (audio) in m_format_idx if (!transcoder_cached_filesize(newvirtualfile, &newvirtualfile->m_st)) { BITRATE video_bit_rate = 0; ///< @todo probe original file for info BITRATE audio_bit_rate = 0; int width = 0; int height = 0; AVRational framerate = { 0, 0 }; bool interleaved = false; newvirtualfile->m_duration = duration; newvirtualfile->m_cuesheet_track.m_duration = duration; newvirtualfile->m_cuesheet_track.m_start = start; newvirtualfile->m_cuesheet_track.m_tracktotal = trackcount; newvirtualfile->m_cuesheet_track.m_trackno = trackno; newvirtualfile->m_cuesheet_track.m_artist = performer; newvirtualfile->m_cuesheet_track.m_title = title; newvirtualfile->m_cuesheet_track.m_album = album; newvirtualfile->m_cuesheet_track.m_genre = genre; newvirtualfile->m_cuesheet_track.m_date = date; if (*lastfile != nullptr) { (*lastfile)->m_cuesheet_track.m_nextfile = newvirtualfile; } *lastfile = newvirtualfile; transcoder_set_filesize(newvirtualfile, duration, audio_bit_rate, virtualfile->m_channels, virtualfile->m_sample_rate, AV_SAMPLE_FMT_NONE, video_bit_rate, width, height, interleaved, framerate); stat_set_size(&newvirtualfile->m_st, newvirtualfile->m_predicted_size); } return true; } /** * @brief Parse a cue sheet file and build virtual set of files * @param[in] virtualfile - VIRTUALFILE struct of a file. * @param[in] cuesheet - Name of cue sheet file * @param[in] statbuf - File status structure of original file. * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @return On success, returns number of titles in cue sheet. On error, returns -errno. */ static int parse_cuesheet_file(LPCVIRTUALFILE virtualfile, const std::string & cuesheet, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler) { // Check for cue sheet std::string text; int res = read_file(cuesheet, text); if (res >= 0) { return -res; } // Found cue sheet Logging::trace(cuesheet, "Found an external cue sheet file."); return parse_cuesheet(virtualfile, cuesheet, cue_parse_string(text.c_str()), statbuf, buf, filler); } /** * @brief Parse a cue sheet and build virtual set of files * @param[in] virtualfile - VIRTUALFILE struct of a file. * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @return On success, returns number of titles in cue sheet. On error, returns -errno. */ static int parse_cuesheet_text(LPCVIRTUALFILE virtualfile, void *buf, fuse_fill_dir_t filler) { // Found cue sheet Logging::trace(virtualfile->m_origfile, "Found an embedded cue sheet file."); return parse_cuesheet(virtualfile, virtualfile->m_origfile, cue_parse_string(virtualfile->m_cuesheet.c_str()), &virtualfile->m_st, buf, filler); } /** * @brief Parse a cue sheet and build virtual set of files * @param[in] virtualfile - VIRTUALFILE struct of a file. * @param[in] cuesheet - Name of cue sheet file * @param[in] cd - libcue2 cue sheet handle * @param[in] statbuf - File status structure of original file. * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @return On success, returns number of titles in cue sheet or 0 if not found. On error, returns -errno. */ static int parse_cuesheet(LPCVIRTUALFILE virtualfile, const std::string & cuesheet, Cd *cd, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler) { int res = 0; try { if (cd == nullptr) { Logging::error(cuesheet, "The cue sheet could not be parsed."); throw AVERROR(EIO); } Rem *rem = cd_get_rem(cd); if (rem == nullptr) { Logging::error(cuesheet, "Unable to parse remarks from the cue sheet."); throw AVERROR(EIO); } Cdtext *cdtext = cd_get_cdtext(cd); if (cdtext == nullptr) { Logging::error(cuesheet, "The CD text could not be extracted from the cue sheet."); throw AVERROR(EIO); } std::string performer = VAL_OR_EMPTY(cdtext_get(PTI_PERFORMER, cdtext)); std::string album = VAL_OR_EMPTY(cdtext_get(PTI_TITLE, cdtext)); std::string genre = VAL_OR_EMPTY(cdtext_get(PTI_GENRE, cdtext)); std::string date = VAL_OR_EMPTY(rem_get(REM_DATE, rem)); int trackcount = static_cast(cd_get_ntrack(cd)); if (trackcount) { LPVIRTUALFILE insertedvirtualfile = nullptr; std::string subbdir(virtualfile->m_origfile); append_ext(&subbdir, TRACKDIR); std::string dirname(subbdir); append_sep(&subbdir); remove_path(&dirname); insertedvirtualfile = insert_dir(VIRTUALTYPE::DISK, subbdir, statbuf, VIRTUALFLAG_CUESHEET); if (insertedvirtualfile == nullptr) { Logging::error(cuesheet, "Failed to create virtual path: %1", subbdir.c_str()); errno = EIO; return -errno; } if (buf != nullptr && filler(buf, dirname.c_str(), &insertedvirtualfile->m_st, 0, FUSE_FILL_DIR_PLUS)) { // break; } std::string path(virtualfile->m_origfile); remove_filename(&path); LPVIRTUALFILE lastfile = nullptr; int64_t remainingduration = virtualfile->m_duration; for (int trackno = 1; trackno <= trackcount; trackno++) { Track *track = cd_get_track(cd, trackno); if (track == nullptr) { Logging::error(cuesheet, "Track no. %1 could not be obtained from the cue sheet.", trackno); errno = EIO; throw -errno; } if (!create_cuesheet_virtualfile(virtualfile, track, trackno, path + dirname + "/", statbuf, trackcount, trackno, performer, album, genre, date, &remainingduration, &lastfile)) { throw -errno; } } } res = trackcount; } catch (int _res) { res = _res; } if (cd != nullptr) { cd_delete(cd); } return res; } int check_cuesheet(const std::string & filename, void *buf, fuse_fill_dir_t filler) { std::string trackdir(filename); // Tracks directory (with extra TRACKDIR extension) std::string cuesheet(filename); // Cue sheet name (original name, extension replaced by .cue) struct stat stbuf; int res = 0; append_ext(&trackdir, TRACKDIR); // Need to add TRACKDIR to file name append_sep(&trackdir); replace_ext(&cuesheet, "cue"); // Get the cue sheet file name by replacing the extension with .cue try { LPCVIRTUALFILE virtualfile = find_file_from_orig(filename); if (virtualfile == nullptr) { // Should never happen... Logging::error(filename, "INTERNAL ERROR: check_cuesheet()! virtualfile is NULL."); errno = EINVAL; throw -errno; } if (stat(filename.c_str(), &stbuf) == -1) { // Media file does not exist, can be ignored silently throw 0; } if (stat(cuesheet.c_str(), &stbuf) != -1) { // Cue sheet file exists, preferrably use its contents if (!check_path(trackdir)) { // Not a virtual directory res = parse_cuesheet_file(virtualfile, cuesheet, &stbuf, buf, filler); Logging::trace(cuesheet, "%1 titles were discovered.", res); } else { // Obviously a virtual directory, simply add it std::string dirname(trackdir); remove_path(&dirname); LPCVIRTUALFILE virtualdir = find_file(trackdir); if (virtualdir == nullptr) { Logging::error(filename, "INTERNAL ERROR: check_cuesheet()! virtualdir is NULL."); errno = EIO; throw -errno; } if (buf != nullptr && filler(buf, dirname.c_str(), &virtualdir->m_st, 0, FUSE_FILL_DIR_PLUS)) { // break; } res = 0; } } else if (!virtualfile->m_cuesheet.empty()) { // No cue sheet file, but there is one embedded in media file res = parse_cuesheet_text(virtualfile, buf, filler); } } catch (int _res) { res = _res; } return res; } ffmpegfs-2.18/src/vcdparser.h0000644000000000000000000000367315166175407013106 00000000000000/* * Copyright (C) 2018-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file vcdparser.h * @brief Video CD and Super Video CD parser * * This is only available if built with -DUSE_LIBVCD parameter. * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2018-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef VCDPARSER_H #define VCDPARSER_H #pragma once #ifdef USE_LIBVCD /** * @brief Get number of chapters on S/VCD * @param[in] path - Path to check * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @note buf and filler can be nullptr. In that case the call will run faster, so these parameters should only be passed if to be filled in. * @return -errno or number of chapters on S/VCD. */ int check_vcd(const std::string & path, void *buf = nullptr, fuse_fill_dir_t filler = nullptr); #endif // USE_LIBVCD #endif // VCDPARSER_H ffmpegfs-2.18/src/ffmpeg_base.h0000644000000000000000000003136415166175407013351 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_base.h * @brief FFmpeg transcoder base * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef FFMPEG_BASE_H #define FFMPEG_BASE_H #pragma once #include "ffmpeg_utils.h" struct VIRTUALFILE; struct AVCodecContext; /** * @brief The #FFmpeg_Base class */ class FFmpeg_Base { public: /** * @brief Construct FFmpeg_Base object. */ explicit FFmpeg_Base(); /** * @brief Destruct FFmpeg_Base object. */ virtual ~FFmpeg_Base() = default; protected: #if !LAVC_DEP_AV_INIT_PACKET /** * @brief Initialise one data packet for reading or writing. * @param[in] pkt - Packet to be initialised. */ void init_packet(AVPacket *pkt) const; #endif // !LAVC_DEP_AV_INIT_PACKET /** * @brief Set up a video stream. * @param[in] output_codec_ctx - Output codec context. * @param[in] output_stream - Output stream object. * @param[in] input_codec_ctx - Input codec context. * @param[in] framerate - Frame rate of input stream. * @param[in] enc_hw_pix_fmt - Forcibly set the destination pixel format. Set it to AV_PIX_FMT_NONE for automatic selection. */ void video_stream_setup(AVCodecContext *output_codec_ctx, AVStream* output_stream, AVCodecContext *input_codec_ctx, AVRational framerate, AVPixelFormat enc_hw_pix_fmt) const; /** * @brief Call av_dict_set and check the result code. It displays an error message if appropriate. * @param[in] pm - Pointer to a pointer to a dictionary struct. * @param[in] key - Entry key to add to *pm. * @param[in] value - Entry value to add to *pm. * @param[in] flags - AV_DICT_* flags. * @param[in] filename - Filename this frame was created for. Only used for logging; may be nullptr. * @param[in] nodelete - If true, the tag is not deleted if the value is 0. * @return On success, returns 0; on error, a negative AVERROR value. */ int dict_set_with_check(AVDictionary **pm, const char *key, const char *value, int flags, const char *filename = nullptr, bool nodelete = false) const; /** * @brief Call av_dict_set and check the result code. It displays an error message if appropriate. * @param[in] pm - Pointer to a pointer to a dictionary struct. * @param[in] key - Entry key to add to *pm. * @param[in] value - Entry value to add to *pm. * @param[in] flags - AV_DICT_* flags. * @param[in] filename - Filename this frame was created for. Only used for logging; may be nullptr. * @param[in] nodelete - If true, the tag is not deleted if the value is 0. * @return On success, returns 0; on error, a negative AVERROR value. */ int dict_set_with_check(AVDictionary **pm, const char *key, int64_t value, int flags, const char *filename = nullptr, bool nodelete = false) const; /** * @brief Call av_opt_set and check result code. Displays an error message if appropriate. * @param[in] obj - A structure whose first element is a pointer to an AVClass. * @param[in] key - The name of the field to be set. * @param[in] value - The value to be set. * @param[in] flags - Flags to be passed to av_opt_find2. * @param[in] filename - Filename this frame was created for. Only used for logging; may be nullptr. * @return On success, returns 0; on error, a negative AVERROR value. */ int opt_set_with_check(void *obj, const char *key, const char *value, int flags, const char *filename = nullptr) const; /** * @brief Print data from the video stream to a log. * @param[in] out_file - True if the file is output. * @param[in] format_ctx - AVFormatContext belonging to the stream. * @param[in] stream - Stream to show data for. */ void video_info(bool out_file, const AVFormatContext *format_ctx, const AVStream *stream) const; /** * @brief Print data from the audio stream to log. * @param[in] out_file - True if the file is output. * @param[in] format_ctx - AVFormatContext belonging to the stream. * @param[in] stream - Stream to show data for. */ void audio_info(bool out_file, const AVFormatContext *format_ctx, const AVStream *stream) const; /** * @brief Print data from the subtitle stream to log. * @param[in] out_file - True if the file is output. * @param[in] format_ctx - AVFormatContext belonging to the stream. * @param[in] stream - Stream to show data for. */ void subtitle_info(bool out_file, const AVFormatContext *format_ctx, const AVStream *stream) const; /** * @brief Calls av_get_pix_fmt_name and returns a std::string with the pix format name. * @param[in] pix_fmt - AVPixelFormat enum to convert. * @return Returns a std::string with the pix format name. */ static std::string get_pix_fmt_name(AVPixelFormat pix_fmt); /** * @brief Calls av_get_sample_fmt_name and returns a std::string with the format name. * @param[in] sample_fmt - AVSampleFormat enum to convert. * @return Returns a std::string with the format name. */ static std::string get_sample_fmt_name(AVSampleFormat sample_fmt); #if LAVU_DEP_OLD_CHANNEL_LAYOUT /** * @brief Calls av_channel_layout_describe and returns a std::string with the channel layout. * @param[in] ch_layout - Channel layout * @return Returns a std::string with the channel layout. */ static std::string get_channel_layout_name(const AVChannelLayout * ch_layout); #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT /** * @brief Calls av_get_channel_layout_string and returns a std::string with the channel layout. * @param[in] nb_channels - Number of channels. * @param[in] channel_layout - Channel layout index. * @return Returns a std::string with the channel layout. */ static std::string get_channel_layout_name(int nb_channels, uint64_t channel_layout); #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT /** * @brief Return source filename. Must be implemented in child class. * @return Returns filename. */ virtual const char *filename() const = 0; /** * @brief Return destination filename. Must be implemented in child class. * @return Returns filename. */ virtual const char *destname() const = 0; /** * @brief Return virtual filename. Must be implemented in child class. * @return Returns filename. */ virtual const char *virtname() const = 0; /** * @brief Convert PTS value to frame number. * @param[in] stream - Source video stream. * @param[in] pts - PTS of current frame in stream's time_base units. * @return Returns frame number. */ uint32_t pts_to_frame(AVStream* stream, int64_t pts) const; /** * @brief Convert frame number to PTS value. * @param[in] stream - Source video stream. * @param[in] frame_no - Number of frame. * @return Returns PTS of frame in the stream's time_base units. */ int64_t frame_to_pts(AVStream* stream, uint32_t frame_no) const; /** * @brief Get the number of channels from AVCodecParameters. * @param[in] codecpar - AVCodecParameters to check. * @return Returns the number of channels. */ int get_channels(const AVCodecParameters *codecpar) const; /** * @brief Set the number of channels from AVCodecParameters. * @param[inout] codecpar_out - AVCodecParameters to set. * @param[in] codecpar_in - AVCodecParameters to get channels from. */ void set_channels(AVCodecParameters *codecpar_out, const AVCodecParameters *codecpar_in) const; /** * @brief Get the number of channels from AVCodecContext. * @param[in] codec_ctx - AVCodecContext to check. * @return Returns the number of channels. */ int get_channels(const AVCodecContext *codec_ctx) const; /** * @brief Set the number of channels from AVCodecContext. * @param[inout] codec_ctx_out - AVCodecContext to set channels for. * @param[in] codec_ctx_in - AVCodecContext to copy channels from. */ void set_channels(AVCodecContext *codec_ctx_out, const AVCodecContext *codec_ctx_in) const; /** * @brief Set the number of channels from AVCodecContext. * @param[inout] codec_ctx_out - AVCodecContext to set. * @param[in] channels - Number of channels to set. */ void set_channels(AVCodecContext *codec_ctx_out, int channels) const; #define ASS_DEFAULT_PLAYRESX 384 /**< @brief Default X resolution */ #define ASS_DEFAULT_PLAYRESY 288 /**< @brief Default Y resolution */ #define ASS_DEFAULT_FONT "Arial" /**< @brief Default font name */ #define ASS_DEFAULT_FONT_SIZE 16 /**< @brief Default font size */ /** * @brief Default foreground colour: white. * * Colour values are expressed in hexadecimal BGR format * as &HBBGGRR& or ABGR (with alpha channel) as &HAABBGGRR&. * * Transparency (alpha) can be expressed as &HAA&. * * Note that in the alpha channel, 00 is opaque and FF is transparent. */ #define ASS_DEFAULT_COLOUR 0xffffff #define ASS_DEFAULT_BACK_COLOUR 0 /**< @brief Default background colour */ #define ASS_DEFAULT_BOLD 0 /**< @brief Default no bold font */ #define ASS_DEFAULT_ITALIC 0 /**< @brief Default no italics */ #define ASS_DEFAULT_UNDERLINE 0 /**< @brief Default no underline */ /** * @brief Default alignment: bottom centre * Alignment values are based on the numeric keypad. * 1 - bottom left, * 2 - bottom centre, * 3 - bottom right, * 4 - center left, * 5 - center centre, * 6 - center right, * 7 - top left, * 8 - top center, * 9 - top right. * In addition to determining the position of the subtitle, * this also determines the alignment of the text itself. */ #define ASS_DEFAULT_ALIGNMENT 2 /** * @brief Default border style: outline with shadow * 1 - Outline with shadow, * 3 - Rendered with an opaque box. */ #define ASS_DEFAULT_BORDERSTYLE 1 /** * @brief Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS. * Nicked from the FFmpeg API function ff_ass_subtitle_header_full(). :) * @param[in] codec_ctx pointer to the AVCodecContext * @param[in] play_res_x subtitle frame width * @param[in] play_res_y subtitle frame height * @param[in] font name of the default font face to use * @param[in] font_size default font size to use * @param[in] primary_color default text color to use (ABGR) * @param[in] secondary_color default secondary text color to use (ABGR) * @param[in] outline_color default outline color to use (ABGR) * @param[in] back_color default background color to use (ABGR) * @param[in] bold 1 for bold text, 0 for normal text * @param[in] italic 1 for italic text, 0 for normal text * @param[in] underline 1 for underline text, 0 for normal text * @param[in] border_style 1 for outline, 3 for opaque box * @param[in] alignment position of the text (left, center, top...), defined after the layout of the numpad (1-3 sub, 4-6 mid, 7-9 top) * @return On success, returns 0; on error, negative AVERROR value. */ int get_script_info(AVCodecContext *codec_ctx, int play_res_x, int play_res_y, const char *font, int font_size, int primary_color, int secondary_color, int outline_color, int back_color, int bold, int italic, int underline, int border_style, int alignment) const; protected: VIRTUALFILE * m_virtualfile; /**< @brief Underlying virtual file object */ }; #endif // FFMPEG_BASE_H ffmpegfs-2.18/src/buffer.h0000644000000000000000000005275115166175407012367 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file buffer.h * @brief Buffer class * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef BUFFER_H #define BUFFER_H #pragma once #include "fileio.h" #include #include #include #define CACHE_CHECK_BIT(mask, var) ((mask) == (mask & (var))) /**< @brief Check bit in bitmask */ #define CACHE_CLOSE_NOOPT 0x00000000 /**< @brief Dummy, do nothing special */ #define CACHE_CLOSE_FREE 0x00000001 /**< @brief Free memory for cache entry */ #define CACHE_CLOSE_DELETE (0x00000002 | CACHE_CLOSE_FREE) /**< @brief Delete cache entry, will unlink cached file! Implies CACHE_CLOSE_FREE. */ #define CACHE_FLAG_RO 0x00000001 /**< @brief Mark cache file read-only */ #define CACHE_FLAG_RW 0x00000002 /**< @brief Mark cache file writeable, implies read permissions */ /** * @brief The #Buffer class */ class Buffer : public FileIO { /** * @brief PREALLOC_FACTOR - Number of elements allocated on reallocate calls * Number of elements allocated on reallocate calls. The buffer keeps track of the * typical buffer write size. To prevent repeated reallocations, reallocate() * attempts to set aside enough memory for PREALLOC FACTOR average elements whenever * it is invoked. */ static constexpr int PREALLOC_FACTOR = 5; public: /** * @brief Structure to hold current cache state */ typedef struct _tagCACHEINFO { public: _tagCACHEINFO() : m_fd(-1) , m_buffer(nullptr) , m_buffer_pos(0) , m_buffer_watermark(0) , m_buffer_size(0) , m_seg_finished(false) , m_fd_idx(-1) , m_buffer_idx(nullptr) , m_buffer_size_idx(0) , m_flags(0) , m_buffer_write_size(0) , m_buffer_writes(0) { } /** * @brief Reset buffer pointers */ void reset() { m_fd = -1; m_buffer = nullptr; m_buffer_pos = 0; m_buffer_watermark = 0; m_buffer_size = 0; m_buffer_write_size = 0; m_buffer_writes = 0; } // Main cache std::string m_cachefile; /**< @brief Cache file name */ int m_fd; /**< @brief File handle for buffer */ uint8_t * m_buffer; /**< @brief Pointer to buffer memory */ size_t m_buffer_pos; /**< @brief Read/write position */ size_t m_buffer_watermark; /**< @brief Number of bytes in buffer */ size_t m_buffer_size; /**< @brief Current buffer size */ bool m_seg_finished; /**< @brief True if segment completely decoded */ // Index for frame sets std::string m_cachefile_idx; /**< @brief Index file name */ int m_fd_idx; /**< @brief File handle for index */ uint8_t * m_buffer_idx; /**< @brief Pointer to index memory */ size_t m_buffer_size_idx; /**< @brief Size of index buffer */ // Flags uint32_t m_flags; /**< @brief CACHE_FLAG_* options */ // Statistics size_t m_buffer_write_size; /**< @brief Sum of bytes written to the buffer */ unsigned int m_buffer_writes; /**< @brief Total number of writes to the buffer */ } CACHEINFO, *LPCACHEINFO; /**< @brief Pointer version of CACHEINFO */ typedef CACHEINFO const * LPCCACHEINFO; /**< @brief Pointer to const version of CACHEINFO */ public: /** * @brief Create #Buffer object */ explicit Buffer(); /** * @brief Free #Buffer object * * Release memory and close files */ virtual ~Buffer(); /** * @brief Get type of this virtual file. * @return Returns VIRTUALTYPE::BUFFER. */ virtual VIRTUALTYPE type() const override; /** * @brief Initialise cache * @param[in] erase_cache - If true, delete the old file before opening. * @return Returns true on success; false on error. */ bool init(bool erase_cache); /** * @brief Set the current segment. * @param[in] segment_no - [1..n] HLS segment file number. * @param[in] size - Estimated size of segment. Should be large enough to hold the resulting size. * @return Returns true on success; if segment_no is 0 or greater, then segment_count() returns false and sets errno to EINVALID. */ bool set_segment(uint32_t segment_no, size_t size); /** * @brief Get segment count. * @return Number of segments. */ uint32_t segment_count(); /** * @brief Get the currently selected segment. * @return current segment number [1..n], or 0 if none is chosen. */ uint32_t current_segment_no(); /** * @brief Check if segment exists. * @param[in] segment_no - [1..n] HLS segment file number. * @return Returns true if it exists, or false if it still has to be decoded. */ bool segment_exists(uint32_t segment_no); /** * @brief Release cache buffer. * @param[in] flags - One of the CACHE_CLOSE_* flags. * @return Returns true on success; false on error. */ bool release(int flags = CACHE_CLOSE_NOOPT); /** * @brief Size of this buffer. * @return Not applicable, returns 0. */ virtual size_t bufsize() const override; /** @brief Open a virtual file * @param[in] virtualfile - LPCVIRTUALFILE of file to open * @return Upon successful completion, #openio() returns 0. * On error, an nonzero value is returned and errno is set to indicate the error. */ virtual int openio(LPVIRTUALFILE virtualfile) override; /** * @brief Not implemented. * @param[out] data - unused * @param[in] size - unused * @return Always returns 0 and errno is EPERM. */ virtual size_t readio(void *data, size_t size) override; /** * @brief Write image data for the frame number into the buffer. * @param[out] data - Buffer to read data in. * @param[in] frame_no - Number of the frame to write. * @return Upon successful completion, #readio() returns the number of bytes read. @n * This may be less than size. @n * On error, the value 0 is returned and errno is set to indicate the error. @n * If at the end of the file, 0 may be returned by errno not set. error() will return 0 if at EOF. @n * If the image frame is not yet read, the function also returns 0 and errno is EAGAIN. */ size_t read_frame(std::vector * data, uint32_t frame_no); /** * @brief Get last error. * @return errno value of last error. */ virtual int error() const override; /** @brief Get the duration of the file, in AV_TIME_BASE fractional seconds. * @return Not applicable to buffer, always returns AV_NOPTS_VALUE. */ virtual int64_t duration() const override; /** * @brief Get the value of the internal buffer size pointer. * @return Returns the value of the internal buffer size pointer. */ virtual size_t size() const override; /** * @brief Get the value of the internal buffer size pointer. * @param[in] segment_no - [1..n] HLS segment file number or 0 for the current segment. * @return Returns the value of the internal buffer size pointer. */ virtual size_t size(uint32_t segment_no) const; /** * @brief Get the value of the internal read position pointer. * @return Returns the value of the internal read position pointer. */ virtual size_t tell() const override; /** * @brief Get the value of the internal read position pointer. * @param[in] segment_no - [1..n] HLS segment file number or 0 for the current segment. * @return Returns the value of the internal read position pointer. */ virtual size_t tell(uint32_t segment_no) const; /** @brief Seek to position in file * * Repositions the offset of the open file to the argument offset according to the directive whence. * May block for a long time if the buffer has not been filled to the requested offset. * * @param[in] offset - offset in bytes * @param[in] whence - how to seek: @n * SEEK_SET: The offset is set to offset bytes. @n * SEEK_CUR: The offset is set to its current location plus offset bytes. @n * SEEK_END: The offset is set to the size of the file plus offset bytes. * @return Upon successful completion, #seek() returns the resulting offset location as measured in bytes * from the beginning of the file. */ virtual int seek(int64_t offset, int whence) override; /** @brief Seek to position in file * * Repositions the offset of the open file to the argument offset according to the directive whence. * May block for a long time if the buffer has not been filled to the requested offset. * * @param[in] offset - offset in bytes * @param[in] whence - how to seek: @n * SEEK_SET: The offset is set to offset bytes. @n * SEEK_CUR: The offset is set to its current location plus offset bytes. @n * SEEK_END: The offset is set to the size of the file plus offset bytes. * @param[in] segment_no - [1..n] HLS segment file number or 0 for the current segment. * @return Upon successful completion, #seek() returns the resulting offset location as measured in bytes * from the beginning of the file. */ virtual int seek(int64_t offset, int whence, uint32_t segment_no); /** * @brief Check if at end of file. * @return Returns true if at end of buffer. */ virtual bool eof() const override; /** * @brief Check if at end of file. * @param[in] segment_no - [1..n] HLS segment file number or 0 for the current segment. * @return Returns true if at end of buffer. */ virtual bool eof(uint32_t segment_no) const; /** * @brief Close buffer. */ virtual void closeio() override; /** * @brief Write data to the current position in the buffer. The position pointer will be updated. * @param[in] data - Buffer with data to write. * @param[in] length - Length of buffer to write. * @return Returns the bytes written to the buffer. If less than length, this indicates an error. Consult errno for details. */ size_t writeio(const uint8_t* data, size_t length); /** * @brief Write image data for the frame number into the buffer. * @param[in] data - Buffer with data to write. * @param[in] length - Length of buffer to write. * @param[in] frame_no - Number of the frame to write. * @return Returns the bytes written to the buffer. If less than length, this indicates an error. Consult errno for details. */ size_t write_frame(const uint8_t* data, size_t length, uint32_t frame_no); /** * @brief Flush buffer to disk * @return Returns true on success; false on error. Check errno for details. */ bool flush(); /** * @brief Clear (delete) buffer. * @return Returns true on success; false on error. Check errno for details. */ bool clear(); /** * @brief Reserve memory without changing size to reduce re-allocations. * @param[in] size - Size of buffer to reserve. * @return Returns true on success; false on error. */ bool reserve(size_t size); /** @brief Return the current watermark of the file while transcoding. * * While transcoding, this value reflects the current size of the transcoded file. * This is the maximum byte offset until the file can be read so far. * * @param[in] segment_no - If > 0 returns watermark for specific segment. * If 0, returns watermark for current write segment. * @return Returns the current watermark. */ size_t buffer_watermark(uint32_t segment_no = 0) const; /** * @brief Copy buffered data into output buffer. * @param[in] out_data - Buffer to copy data to. * @param[in] offset - Offset in buffer to copy data from. * @param[in] segment_no - HLS segment file number [1..n] or 0 for current segment. * @return Returns true on success; false on error. */ bool copy(std::vector * out_data, size_t offset, uint32_t segment_no = 0); /** * @brief Copy buffered data into output buffer. * @param[in] out_data - Buffer to copy data to. * @param[in] offset - Offset in buffer to copy data from. * @param[in] bufsize - Size of out_data buffer. * @param[in] segment_no - [1..n] HLS segment file number or 0 for the current segment. * @return Returns true on success; false on error. */ bool copy(uint8_t* out_data, size_t offset, size_t bufsize, uint32_t segment_no = 0); /** * @brief Get cache filename. * @param[in] segment_no - [1..n] HLS segment file number or 0 for the current segment. * @return Returns cache filename. */ const std::string & cachefile(uint32_t segment_no) const; /** * @brief Make up a cache file name, including the full path. * @param[out] cachefile - Name of cache file. * @param[in] filename - Source file name. * @param[in] fileext - File extension (MP4, WEBM etc.). * @param[in] is_idx - If true, create an index file; otherwise, create a cache. * @return Returns the name of the cache/index file. */ static const std::string & make_cachefile_name(std::string *cachefile, const std::string & filename, const std::string &fileext, bool is_idx); /** * @brief Remove (unlink) the file. * @param[in] filename - Name of the file to remove. * @return Returns true on success; false on error. */ static bool remove_file(const std::string & filename); /** * @brief Check if we have the requested frame number. Works only when processing a frame set. * @param[in] frame_no - 1...frames * @return Returns true if the frame is already in the cache, false if not. */ bool have_frame(uint32_t frame_no); /** * @brief Complete the segment decoding. */ void finished_segment(); /** * @brief Return true if transcoding of the segment is finished. * @param[in] segment_no - [1..n] HLS segment file number or 0 for the current segment. * @return Returns true if finished, false if not. */ bool is_segment_finished(uint32_t segment_no) const; /** * @brief Open the cache file if not already open. * @param[in] segment_no - [0..n-1] Index of segment file number. * @param[in] flags - CACHE_FLAG_* options. * @param[in] defaultsize - If nonzero, after opening, the file will be resized to this value. Works on writeable files only. * @return Returns true if the operation was successful or the file was already open; false otherwise. */ bool open_file(uint32_t segment_no, uint32_t flags, size_t defaultsize = 0); /** * @brief If it hasn't already been done, close the cache file. * @param[in] segment_no - [0..n-1] Index of segment file number. * @param[in] flags - CACHE_FLAG_* options * @return Returns true if the operation was successful or the file was already closed; false otherwise. */ bool close_file(uint32_t segment_no, uint32_t flags); protected: /** * @brief Remove the cachefile. * @param[in] segment_no - [1..n] HLS segment file number or 0 for the current segment. * @return Returns true on success; false on error. */ bool remove_cachefile(uint32_t segment_no = 0) const; /** * @brief Check if the cache file is open. * @return Returns true if the cache file is open; false if not. */ bool is_open(); private: /** * @brief Prepare for the writing operation. * * Ensure the buffer has sufficient space for the quantity of data and return * a pointer to where the data may be written. The position pointer should be * updated afterward with increment_pos(). * @param[in] length - Buffer length to prepare. * @return Returns a pointer to the memory to write to. */ uint8_t* write_prepare(size_t length); /** * @brief Increment buffer position. * * Increment the location of the internal pointer. This cannot fail and so * returns void. It does not ensure the position is valid memory. That is * done by the write_prepare methods via reallocate. * @param[in] increment - Increment size. */ void increment_pos(size_t increment); /** * @brief Reallocate the buffer to a new size. * * Ensure the allocation has at least the size of bytes available. * If not, reallocate memory to make more available. Fill the newly * allocated memory with zeroes. * @param[in] newsize - New buffer size. * @return Returns true on success; false on error. */ bool reallocate(size_t newsize); /** * @brief Map memory to a file. * @param[in] filename - Name of the cache file to open. * @param[out] fd - The file descriptor of the open cache file. * @param[out] p - Memory pointer to the cache file. * @param[out] filesize - Actual size of the cache file after this call. * @param[inout] isdefaultsize -@n * In: If false, the file size will be the size of the existing file, returning the size in filesize. If the file does not exist, it will be sized to defaultsize. * If true, the defaultsize will be used in any case, resizing an existing file if necessary.@n * Out: true if the file size was set to default. * @param[out] defaultsize - The default size of the file if it does not exist. This parameter can be zero, in which case the size will be set to the system's page size. * @param[out] truncate - If true, when the file is opened, it is truncated. * @return Returns true if successful and fd, p, filesize, and isdefaultsize are filled in, or false on error. */ bool map_file(const std::string & filename, volatile int *fd, uint8_t **p, size_t *filesize, bool *isdefaultsize, size_t defaultsize, bool truncate) const; /** * @brief Unmap memory from the file. * @param[in] filename - Name of cache file to unmap. * @param[in] fd - The file descriptor of the open cache file. * @param[in] p - Memory pointer to the cache file. * @param[in] len - Length of the allocated block. * @param[in] filesize - Actual size of the cache file. * @return Returns true on success; false on error. */ bool unmap_file(const std::string & filename, volatile int *fd, uint8_t **p, size_t len, size_t *filesize) const; /** * @brief Get cache information. * @param[in] segment_no - HLS segment file number [1..n] or 0 for the current segment. * @return Pointer to CACHEINFO object, or nullptr on error. */ LPCACHEINFO cacheinfo(uint32_t segment_no); /** * @brief Get cache information. * @param[in] segment_no - HLS segment file number [1..n] or 0 for the current segment. * @return Pointer to CACHEINFO object, or nullptr on error. */ LPCCACHEINFO const_cacheinfo(uint32_t segment_no) const; private: std::recursive_mutex m_mutex; /**< @brief Access mutex */ LPCACHEINFO m_cur_ci; /**< @brief Convenience pointer to current write segment */ uint32_t m_cur_open; /**< @brief Number of open files */ std::vector m_ci; /**< @brief Cache info */ }; #endif ffmpegfs-2.18/src/cuesheetparser.h0000644000000000000000000000377015166175407014135 00000000000000/* * Copyright (C) 2018-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file cuesheetparser.h * @brief Clue sheet parser * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2018-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef CUESHEETPARSER_H #define CUESHEETPARSER_H #pragma once #include #define TRACKDIR "tracks" ///<* Extension of virtual tracks directory struct AVFormatContext; /** * @brief Get number of titles in cue sheet * @param[in] filename - Path to check * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @note buf and filler can be nullptr. In that case the call will run faster, so these parameters should only be passed if to be filled in. * @return -errno or number or titles in cue sheet */ int check_cuesheet(const std::string & filename, void *buf = nullptr, fuse_fill_dir_t filler = nullptr); #endif // CUESHEETPARSER_H ffmpegfs-2.18/src/vcd/0000755000000000000000000000000015166203631011556 500000000000000ffmpegfs-2.18/src/vcd/vcdutils.h0000644000000000000000000001347215166175407013524 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ /** * @file vcdutils.h * @brief S/VCD utility functions * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2013-2026 Norbert Schlia (nschlia@oblivion-software.de) @n * From BullysPLayer Copyright (C) 1984-2026 by Oblivion Software/Norbert Schlia */ #ifndef VCDUTILS_H #define VCDUTILS_H #pragma once #include "vcd/vcdchapter.h" #include #include /** Convert BCD value to hex */ #define BCD2DEC(hex) (((hex & 0xF0) >> 4) * 10 + (hex & 0x0F)) /** Max. number of chapters on video CD */ #define VCD_MAX_CHAPTERS 500 #pragma pack(push, 1) /** @brief Video CD MSF time format * * MSF in minutes, seconds, and fractional seconds (frames). @n * * @note The fields in this structure are BCD encoded */ typedef struct VCDMSF { uint8_t m_min; /**< @brief Minute in BCD code */ uint8_t m_sec; /**< @brief Second in BCD code */ uint8_t m_frame; /**< @brief Number of frames, for a 25 frames per second movie 0...24. */ } VCDMSF, *LPVCDMSF; /**< @brief Pointer version of VCDMSF */ typedef const VCDMSF * LPCVCDMSF; /**< @brief Pointer to const version of VCDMSF */ /** @brief Video CD chapter */ typedef struct VCDCHAPTER { uint8_t m_track_no; /**< @brief Track number */ VCDMSF m_msf; /**< @brief MSF position of chapter in file */ } VCDCHAPTER, *LPVCDCHAPTER; /**< @brief Pointer version of VCDCHAPTER */ typedef const VCDCHAPTER * LPCVCDCHAPTER; /**< @brief Pointer to const version of VCDCHAPTER */ /** @brief Video CD entry */ typedef struct VCDENTRIES { std::array m_ID; /**< @brief 8 Bytes: ID "ENTRYVCD" or "ENTRYSVD" */ /** @brief 1 Byte: CD type * * 1 for VCD 1.0, VCD 1.1, SVCD 1.0 and HQVCD @n * 2 for VCD 2.0 @n * Identical with value in INFO.VCD/SVD @n */ uint8_t m_type; /** @brief 1 Byte: System Profile Tag. * * 0 for VCD 1.0, VCD 2.0, SVCD und HQVCD * 1 for VCD 1.1 * Identical with value in INFO.VCD/SVD */ uint8_t m_profile_tag; /** @brief 2 Bytes: 1 <= tracks <= 500 * * There must be at least 1 chapter */ uint16_t m_num_entries; /** @brief Chapters * * Number of chapters as in m_profile_tag @n * @n * 1 Byte: Tracknummer @n * 3 Byte: Adresse MSF */ std::array m_chapter; std::array reserved; /**< @brief RESERVED, must be 0x00 */ } VCDENTRY, *LPVCDENTRIES; /**< @brief Pointer version of VCDENTRY */ typedef const VCDENTRY * LPCVCDENTRIES; /**< @brief Pointer to const version of VCDENTRY */ #pragma pack(pop) extern const std::array SYNC; /**< @brief Chapter synchronisation in S/VCD mpeg/dat files (12 byte: 0x00FFFFFFFFFFFFFFFFFFFF00) */ /** @namespace VCDUTILS * @brief Video CD utility functions */ namespace VCDUTILS { /** * @brief Non-zero terminated text is converted to std::string. * @param[in] txt - Text for conversion (not zero-terminated). * @param[in] size - Length of string. * @param[in] trimmed - If true, trim trailing white spaces. * @return Converted text */ std::string convert_txt2string(const char * txt, int size, bool trimmed = true); /** * @brief Check if path is a S/VCD * @param[in] path - Path to check * @param[in] filename - File name to check, can be done per ENTRIES or INFO (extension .SVD or .VCD will be added automatically). * @param[out] fullname - Path and filename of ENTRIES.SVC/VCD or INFO.SVC/VCD, if found. * @param[out] is_vcd - True if the directory contains a Super Video CD, false if it's a Video CD. * @return true if path contains a S/VCD, false if not. */ bool locate_file(const std::string & path, const std::string & filename, std::string & fullname, bool & is_vcd); /** * @brief Locate AVSEQ*DAT/MPEG video file for track_no. * @param[in] path - path to search in. * @param[in] track_no - track number (1...n). * @param[out] fullname - name and path of file if found. * @return If successful, it returns 0 or errno if not. */ int locate_video(const std::string & path, int track_no, std::string & fullname); /** * @brief Return disk type as a human readable string. * @param[in] type - 1: VCD 1.0, VCD 1.1, SVCD 1.0, HQVCD, 2: VCD 2.0 * @return Disk type as a human readable string. */ std::string get_type_str(VCDTYPE type); /** * @brief Profile as a human readable string. * @param[in] tag - 1: VCD 1.0, VCD 2.0, SVCD, HQVCD, 2: VCD 1.1 * @return Returns profile as a human readable string. */ std::string get_profile_tag_str(VCDPROFILETAG tag); /** * @brief Check if fullname is a directory. Remove the filename if necessary. * @note Really checks if fullname is a path even if the trailing slash is missing. * @param[in] fullname - Path and optional filename. * @param[out] directory - Directory without a file name. */ void get_directory(const std::string & fullname, std::string * directory); } #endif // VCDUTILS_H ffmpegfs-2.18/src/vcd/vcdentries.cc0000644000000000000000000002653015166175407014172 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ /** * @file vcdentries.cc * @brief S/VCD VcdEntries class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2013-2026 Norbert Schlia (nschlia@oblivion-software.de) @n * From BullysPLayer Copyright (C) 1984-2026 by Oblivion Software/Norbert Schlia */ #include "vcdentries.h" #include "vcdutils.h" #include #include #include #define VCD_SECTOR_SIZE 2352 /**< @brief Video CD sector size */ #define VCD_SECTOR_OFFS 24 /**< @brief Video CD sector offset */ #define VCD_SECTOR_DATA 2324 /**< @brief Video CD data sector size */ /** * Sync bytes for a Video CD sector. */ const std::array SYNC = { '\x00', '\xFF', '\xFF', '\xFF', '\xFF', '\xFF', '\xFF', '\xFF', '\xFF', '\xFF', '\xFF', '\x00' }; /** * Sync bytes for a Video CD picture start. */ //static const char PICTURE_START_CODE[4] = { '\x00', '\x00', '\x01', '\x00' }; /** * Sync bytes for a Video CD video stream. */ //static const char VIDEO_STREAM_1[4] = { '\x00', '\x00', '\x01', '\xE0' }; VcdEntries::VcdEntries() { clear(); } void VcdEntries::clear() { m_file_date = -1; m_id.clear(); m_type = VCDTYPE::UNKNOWN; m_profile_tag = VCDPROFILETAG::UNKNOWN; m_chapters.clear(); m_disk_path.clear(); m_duration = 0; } int VcdEntries::load_file(const std::string & path) { FILE * fpi = nullptr; std::string fullname; bool is_vcd = false; clear(); if (!VCDUTILS::locate_file(path, "ENTRIES", fullname, is_vcd)) { return ENOENT; } VCDUTILS::get_directory(path, &m_disk_path); try { VCDENTRY vcdentry; struct stat stbuf; uint32_t num_entries = 0; fpi = fopen(fullname.c_str(), "rb"); if (fpi == nullptr) { throw static_cast(errno); } if (fstat(fileno(fpi), &stbuf) != 0) { throw static_cast(ferror(fpi)); } m_file_date = stbuf.st_mtime; std::memset(&vcdentry, 0, sizeof(vcdentry)); if (fread(reinterpret_cast(&vcdentry), 1, sizeof(vcdentry), fpi) != sizeof(vcdentry)) { throw static_cast(ferror(fpi)); } m_id = VCDUTILS::convert_txt2string(reinterpret_cast(vcdentry.m_ID.data()), vcdentry.m_ID.size()); m_type = static_cast(vcdentry.m_type); m_profile_tag = static_cast(vcdentry.m_profile_tag); num_entries = htons(vcdentry.m_num_entries); m_duration = 0; int sec = BCD2DEC(vcdentry.m_chapter[0].m_msf.m_min) * 60 + BCD2DEC(vcdentry.m_chapter[0].m_msf.m_sec); for (uint32_t chapter_no = 0, total = num_entries; chapter_no < total; chapter_no++) { if (chapter_no && BCD2DEC(vcdentry.m_chapter[chapter_no].m_msf.m_min) * 60 + BCD2DEC(vcdentry.m_chapter[chapter_no].m_msf.m_sec) - sec < 1) { // Skip chapters shorter than 1 second sec = BCD2DEC(vcdentry.m_chapter[chapter_no].m_msf.m_min) * 60 + BCD2DEC(vcdentry.m_chapter[chapter_no].m_msf.m_sec); --num_entries; continue; } VcdChapter chapter(vcdentry.m_chapter[chapter_no], is_vcd); m_chapters.push_back(chapter); } // Calculate durations of all chapters until last. This will be done later as we do not yet know the duration of the stream for (size_t chapter_no = 0; chapter_no < m_chapters.size() - 1; chapter_no++) { VcdChapter & chapter1 = m_chapters[chapter_no]; const VcdChapter & chapter2 = m_chapters[chapter_no + 1]; int64_t chapter_duration = chapter2.get_start_time() - chapter1.get_start_time(); // Chapter duration chapter1.m_duration = chapter_duration; // Total duration m_duration += chapter_duration; } } catch (int orgerrno) { if (fpi != nullptr) { fclose(fpi); } return orgerrno; } fclose(fpi); return scan_chapters(); } int VcdEntries::scan_chapters() { FILE * fpi = nullptr; struct stat stbuf; std::memset(&stbuf, 0, sizeof(stbuf)); if (!m_chapters.size()) { return EIO; // Fail safe only: Should not happen, at least 1 chapter is required. } try { int last_track_no = -1; int64_t first_sync = -1; // Build list of chapters for (size_t chapter_no = 0; chapter_no < m_chapters.size(); chapter_no++) { if (last_track_no != m_chapters[chapter_no].get_track_no()) { std::string fullname; last_track_no = m_chapters[chapter_no].get_track_no(); int orgerrno = VCDUTILS::locate_video(m_disk_path, last_track_no, fullname); if (orgerrno != 0) { throw static_cast(orgerrno); } if (chapter_no) { m_chapters[chapter_no - 1].m_end_pos = static_cast(stbuf.st_size); } if (fpi != nullptr) { fclose(fpi); } fpi = fopen(fullname.c_str(), "rb"); if (fpi == nullptr) { throw static_cast(errno); } if (fstat(fileno(fpi), &stbuf) != 0) { throw static_cast(ferror(fpi)); } // Locate the first sync bytes SEEKRES res = seek_sync(fpi, SYNC); if (res != SEEKRES::FOUND) { throw static_cast(EIO); } first_sync = ftell(fpi) - static_cast(SYNC.size()); } int64_t total_chunks = (stbuf.st_size - first_sync) / VCD_SECTOR_SIZE; int64_t first = 0; int64_t last = total_chunks - 1; int64_t middle = (first + last) / 2; // Locate sector with correct start time while (first <= last) { VcdChapter buffer(m_chapters[chapter_no].get_is_svcd()); long int file_pos = static_cast(first_sync + middle * VCD_SECTOR_SIZE); if (fseek(fpi, file_pos, SEEK_SET)) { throw static_cast(ferror(fpi)); } int orgerrno = buffer.readio(fpi, last_track_no); if (orgerrno) { throw static_cast(orgerrno); } if (buffer < m_chapters[chapter_no]) { first = middle + 1; } else if (buffer == m_chapters[chapter_no]) { m_chapters[chapter_no].m_start_pos = static_cast(file_pos); if (chapter_no) { m_chapters[chapter_no - 1].m_end_pos = static_cast(file_pos); } break; } else { last = middle - 1; } middle = (first + last) / 2; } } { VcdChapter buffer(m_chapters[m_chapters.size() - 1].get_is_svcd()); int64_t total_chunks = (stbuf.st_size - first_sync) / VCD_SECTOR_SIZE; // Read time stamp of last sector if (fseek(fpi, static_cast(first_sync + (total_chunks - 1) * VCD_SECTOR_SIZE), SEEK_SET)) { throw static_cast(ferror(fpi)); } int orgerrno = buffer.readio(fpi, last_track_no); if (orgerrno) { throw static_cast(orgerrno); } VcdChapter & chapter1 = m_chapters[m_chapters.size() - 1]; int64_t chapter_duration = buffer.get_start_time() - chapter1.get_start_time(); // Chapter duration chapter1.m_duration = chapter_duration; // Total duration m_duration += chapter_duration; } } catch (int orgerrno) { if (fpi != nullptr) { fclose(fpi); } return orgerrno; } // End of last chapter m_chapters[m_chapters.size() - 1].m_end_pos = static_cast(stbuf.st_size); if (fpi != nullptr) { fclose(fpi); } return 0; } VcdEntries::SEEKRES VcdEntries::seek_sync(FILE *fpi, const std::array & sync) const { char ch; // Read first char if (fread(&ch, 1, 1, fpi) != 1) { return SEEKRES::NOTFOUND; } for (size_t n = 1; n <= sync.size(); n++) { if (ch != sync[n - 1]) { if (n > 1) { // Restart check n = 0; continue; } n = 0; } if (n == sync.size()) { // Found! break; } if (fread(&ch, 1, 1, fpi) != 1) { return SEEKRES::NOTFOUND; } } return SEEKRES::FOUND; } time_t VcdEntries::get_file_date() const { return m_file_date; } const std::string & VcdEntries::get_id() const { return m_id; } VCDTYPE VcdEntries::get_type() const { return m_type; } std::string VcdEntries::get_type_str() const { return VCDUTILS::get_type_str(m_type); } VCDPROFILETAG VcdEntries::get_profile_tag() const { return m_profile_tag; } std::string VcdEntries::get_profile_tag_str() const { return VCDUTILS::get_profile_tag_str(m_profile_tag); } int VcdEntries::get_number_of_chapters() const { return static_cast(m_chapters.size()); } const VcdChapter *VcdEntries::get_chapter(int chapter_idx) const { if (chapter_idx < 0 || chapter_idx >= get_number_of_chapters()) { return nullptr; } return &m_chapters[static_cast(chapter_idx)]; } int64_t VcdEntries::get_duration() const { return m_duration; } uint64_t VcdEntries::get_size() const { size_t chapters = static_cast(get_number_of_chapters()); if (!chapters) { return 0; } return (m_chapters[chapters - 1].get_end_pos() - m_chapters[0].get_start_pos()); } const std::string & VcdEntries::get_disk_path() const { return m_disk_path; } ffmpegfs-2.18/src/vcd/vcdchapter.h0000644000000000000000000001621215166175407014005 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ /** * @file vcdchapter.h * @brief S/VCD VcdChapter class * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2013-2026 Norbert Schlia (nschlia@oblivion-software.de) @n * From BullysPLayer Copyright (C) 1984-2026 by Oblivion Software/Norbert Schlia */ #ifndef VCDCHAPTER_H #define VCDCHAPTER_H #pragma once #include #include /** * S/VCD type */ enum class VCDTYPE { UNKNOWN = -1, /**< @brief unknown type */ VCD_10_11_SVCD_10_HQVCD = 1, /**< @brief VCD 1.0, VCD 1.1, SVCD 1.0 und HQVCD */ VCD_20 = 2 /**< @brief VCD 2.0 */ }; /** * S/VCD profile tag */ enum class VCDPROFILETAG { UNKNOWN = -1, /**< @brief unknown file tag */ VCD_10_20_SVCD_HQVCD = 0, /**< @brief VCD 1.0, VCD 2.0, SVCD und HQVCD */ VCD_11 = 1 /**< @brief VCD 1.1 */ }; struct VCDCHAPTER; /**< @brief Video CD chapter forward declaration */ typedef struct VCDCHAPTER VCDCHAPTER; /** @brief Video CD chapter */ class VcdChapter { friend class VcdEntries; public: /** * @brief Construct VcdChapter object * @param[in] is_svcd - true for SVCD CD, false for VCD */ explicit VcdChapter(bool is_svcd); /** * @brief Construct VcdChapter object * @param[in] VcdChapter - source object to copy from * @param[in] is_svcd - true for SVCD CD, false for VCD */ explicit VcdChapter(const VCDCHAPTER & VcdChapter, bool is_svcd); /** * @brief Construct VcdChapter object * @param[in] track_no - track number 1.. * @param[in] min - Start minute * @param[in] sec - Start second * @param[in] frame - Start frame * @param[in] is_svcd - true for SVCD CD, false for VCD * @param[in] duration - Chapter duration, in AV_TIME_BASE fractional seconds */ explicit VcdChapter(int track_no, int min, int sec, int frame, bool is_svcd, int64_t duration); /** * @brief Destroy VcdChapter object */ virtual ~VcdChapter() = default; /** * @brief Check if this is a Super Video CD. * @return Returns true for SVCD, false for VCD. */ bool get_is_svcd() const; /** * @brief Get the track number of this chapter. * @return Returns track number. */ int get_track_no() const; /** * @brief Get MSF (minutes, seconds, and fractional seconds/frames) minute. * @return Returns MSF minute. */ int get_min() const; /** * @brief Get MSF (minutes, seconds, and fractional seconds/frames) second. * @return Returns MSF second. */ int get_sec() const; /** * @brief Get MSF (minutes, seconds, and fractional seconds/frames) frame. * * Each timecode frame is one seventy-fifth of a second. * * @return Returns MSF frame. */ int get_frame() const; /** * @brief Get chapter duration, in AV_TIME_BASE fractional seconds. * @return Returns the chapter duration, in AV_TIME_BASE fractional seconds. */ int64_t get_duration() const; /** * @brief Get file name and path of source file (e.g. MPEG/AVSEQ##.MPG). * @return Returns file name and path of source file. */ std::string get_filename() const; /** * @brief Get file position of chapter in bytes. * @return Returns file position of chapter in bytes. */ uint64_t get_start_pos() const; /** * @brief Get end position of chapter in bytes. * @return Returns end position of chapter in bytes. */ uint64_t get_end_pos() const; /** * @brief Get start position of chapter in AV_TIME_BASE units. * @return Returns start position of chapter in AV_TIME_BASE units. */ int64_t get_start_time() const; /** * @brief Get the size of this chapter in bytes. * @return Returns chapter size in bytes. */ uint64_t get_size() const; /** * @brief Get LBA (large block address) of chapter. * @return Returns LBA of chapter. */ int get_lba() const; /** * @brief Assignment operator = * @param[in] other * @return this */ VcdChapter & operator= (VcdChapter const & other); /** * @brief Comparison operator == * @param[in] other * @return Nonzero if equal, 0 if not */ int operator==(const VcdChapter & other) const; /** * @brief Comparison operator < * @param[in] other * @return Nonzero if this object is smaller, 0 if not */ int operator<(const VcdChapter & other) const; /** * @brief Comparison operator <= * @param[in] other * @return Nonzero if this object is smaller or equal, 0 if not */ int operator<=(const VcdChapter & other) const; /** * @brief Comparison operator > * @param[in] other * @return Nonzero if this object is greater, 0 if not */ int operator>(const VcdChapter & other) const; /** * @brief Comparison operator >= * @param[in] other * @return Nonzero if this object is greater or equal, 0 if not */ int operator>=(const VcdChapter & other) const; /** * @brief Comparison operator != * @param[in] other * @return Nonzero if this object is not equal, 0 if equal */ int operator!=(const VcdChapter & other) const; protected: /** * @brief Read file from disk * @param[in] fpi - Open file object to read from * @param[in] track_no - Track number 1... * @return */ int readio(FILE *fpi, int track_no); protected: bool m_is_svcd; /**< @brief true for SVCD, false for VCD */ int m_track_no; /**< @brief Track no */ int m_min; /**< @brief MSF minute */ int m_sec; /**< @brief MSF second */ int m_frame; /**< @brief MSF frame */ int64_t m_duration; /**< @brief Chapter duration, in AV_TIME_BASE fractional seconds */ uint64_t m_start_pos; /**< @brief Start offset in bytes */ uint64_t m_end_pos; /**< @brief End offset in bytes (not including this byte) */ }; #endif // VCDCHAPTER_H ffmpegfs-2.18/src/vcd/vcdinfo.cc0000644000000000000000000001240615166175407013451 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ /** * @file vcdinfo.cc * @brief S/VCD VcdInfo class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2013-2026 Norbert Schlia (nschlia@oblivion-software.de) @n * From BullysPLayer Copyright (C) 1984-2026 by Oblivion Software/Norbert Schlia */ #include "ffmpegfs.h" #include "vcdinfo.h" #include "vcdutils.h" #include #include #include #include /** * @brief VCDINFO structure of INFO.VCD/SVD file */ typedef struct VCDINFO { #pragma pack(1) /** * @brief 8 Byte: ID for this CD * * This ID is CD type dependant: VIDEO_CD, SUPERVCD or HQ-VCD. It is always 8 bytes long. */ std::array m_ID; /** * @brief 1 Byte: CD type * * 1 for VCD 1.0, VCD 1.1, SVCD 1.0 and HQVCD * 2 for VCD 2.0 */ char m_type; /** * @brief 1 Byte: System profile tag * * 0 fuer VCD 1.0, VCD 2.0, SVCD und HQVCD * 1 fuer VCD 1.1 */ char m_profile_tag; /** * @brief 16 Byte: Album ID * * The album ID is the name of this album. */ std::array m_albumid; /** * @brief 2 Byte: Number of CDs in set * * Total number of CDs in this set. */ short m_numberof_cds; /** * @brief 2 Byte: Number of this CD * * Defines which number this CD is in this set. */ short m_cd_number; /** * @brief 98 Byte: PAL Flags * * The meaning of these flags is unknown to me. */ std::array m_palflags; // reserved1: // restriction: // special info: // user data cc: // start lid #2: // start track #2: // reserved2: // psd size: // first segment addr: // offset multiplier: // maximum lid: // maximum segment number: // SEGMENT[1]: audio: video: // volume start time[0]: // ... } VCDINFO, *LPVCDINFO; /**< @brief Pointer version of VCDINFO */ typedef const VCDINFO * LPCVCDINFO; /**< @brief Pointer to const version of VCDINFO */ static_assert(sizeof(VCDINFO) == 128); VcdInfo::VcdInfo() { clear(); } void VcdInfo::clear() { m_disk_path.clear(); m_file_date = -1; m_id.clear(); m_type = VCDTYPE::UNKNOWN; m_profile_tag = VCDPROFILETAG::UNKNOWN; m_album_id.clear(); m_number_of_cds = 0; m_cd_number = 0; } int VcdInfo::load_file(const std::string & path) { std::string fullname; bool is_svcd = false; clear(); if (!VCDUTILS::locate_file(path, "INFO", fullname, is_svcd)) { return errno; } VCDUTILS::get_directory(path, &m_disk_path); FILE *fpi; VCDINFO vi; bool success = true; fpi = fopen(fullname.c_str(), "rb"); if (fpi == nullptr) { return errno; } struct stat stbuf; if (fstat(fileno(fpi), &stbuf) != 0) { return ferror(fpi); } m_file_date = stbuf.st_mtime; std::memset(&vi, 0, sizeof(vi)); if (fread(reinterpret_cast(&vi), 1, sizeof(vi), fpi) == sizeof(vi)) { m_id = VCDUTILS::convert_txt2string(vi.m_ID.data(), vi.m_ID.size()); m_type = static_cast(vi.m_type); m_profile_tag = static_cast(vi.m_profile_tag); m_album_id = VCDUTILS::convert_txt2string(vi.m_albumid.data(), vi.m_albumid.size()); m_number_of_cds = htons(static_cast(vi.m_numberof_cds)); m_cd_number = htons(static_cast(vi.m_cd_number)); } else { success = false; } int orgerrno = 0; if (success) { orgerrno = ferror(fpi); } fclose(fpi); return orgerrno; } const time_t &VcdInfo::get_file_date() const { return m_file_date; } const std::string & VcdInfo::get_id() const { return m_id; } VCDTYPE VcdInfo::get_type() const { return m_type; } std::string VcdInfo::get_type_str() const { return VCDUTILS::get_type_str(m_type); } VCDPROFILETAG VcdInfo::get_profile_tag() const { return m_profile_tag; } std::string VcdInfo::get_profile_tag_str() const { return VCDUTILS::get_profile_tag_str(m_profile_tag); } const std::string & VcdInfo::get_album_id() const { return m_album_id; } int VcdInfo::get_number_of_cds() const { return m_number_of_cds; } int VcdInfo::get_cd_number() const { return m_cd_number; } ffmpegfs-2.18/src/vcd/vcdutils.cc0000644000000000000000000000724215166175407013660 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ /** * @file vcdutils.cc * @brief S/VCD utility functions implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2013-2026 Norbert Schlia (nschlia@oblivion-software.de) @n * From BullysPLayer Copyright (C) 1984-2026 by Oblivion Software/Norbert Schlia */ #include "ffmpegfs.h" #include "vcd/vcdchapter.h" #include "vcdutils.h" #include "ffmpeg_utils.h" #include #include #include namespace VCDUTILS { std::string convert_txt2string(const char * txt, int size, bool trimmed) { std::unique_ptr buffer = std::make_unique(static_cast(size + 1)); std::string ret_value; if (buffer != nullptr) { std::memcpy(buffer.get(), txt, static_cast(size)); *(buffer.get() + size) = '\0'; ret_value = buffer.get(); } if (trimmed) { return trim(ret_value); } else { return ret_value; } } bool locate_file(const std::string & path, const std::string & filename, std::string & fullname, bool & is_vcd) { is_vcd = false; // Try VCD fullname = path + "VCD/" + filename + ".VCD"; if (!access(fullname.c_str(), F_OK)) { return true; } // Try SVCD fullname = path + "SVCD/" + filename + ".SVD"; if (!access(fullname.c_str(), F_OK)) { is_vcd = true; return true; } return false; } int locate_video(const std::string & path, int track_no, std::string & fullname) { std::string buffer; // Try VCD strsprintf(&buffer, "MPEGAV/AVSEQ%02i.DAT", track_no - 1); fullname = path + buffer; if (!access(fullname.c_str(), F_OK)) { return 0; } // Try SVCD strsprintf(&buffer, "MPEG2/AVSEQ%02i.MPG", track_no - 1); fullname = path + buffer; if (!access(fullname.c_str(), F_OK)) { return 0; } return ENOENT; } std::string get_type_str(VCDTYPE type) { switch (type) { case VCDTYPE::VCD_10_11_SVCD_10_HQVCD: { return "VCD 1.0, VCD 1.1, SVCD 1.0, HQVCD"; } case VCDTYPE::VCD_20: { return "VCD 2.0"; } default: { return ""; } } } std::string get_profile_tag_str(VCDPROFILETAG tag) { switch (tag) { case VCDPROFILETAG::VCD_10_20_SVCD_HQVCD: { return "VCD 1.0, VCD 2.0, SVCD, HQVCD"; } case VCDPROFILETAG::VCD_11: { return "VCD 1.1"; } default: { return ""; } } } void get_directory(const std::string & fullname, std::string *directory) { struct stat stbuf; stat(fullname.c_str(), &stbuf); if (S_ISDIR(stbuf.st_mode)) { // Already a directory *directory = fullname; append_sep(directory); } else { // Make it a directory *directory = fullname; remove_filename(directory); } } } ffmpegfs-2.18/src/vcd/vcdentries.h0000644000000000000000000001250515166175407014031 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ /** * @file vcdentries.h * @brief S/VCD VcdEntries class * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2013-2026 Norbert Schlia (nschlia@oblivion-software.de) @n * From BullysPLayer Copyright (C) 1984-2026 by Oblivion Software/Norbert Schlia */ #ifndef VCDENTRIES_H #define VCDENTRIES_H #pragma once #include "vcdchapter.h" #include #include /** @brief Video CD entries */ class VcdEntries { public: /** * Seek results */ enum class SEEKRES { NOTFOUND, /**< @brief Sync not found */ FOUND, /**< @brief Sync found */ ERROR /**< @brief Seek error */ }; typedef SEEKRES *LPSEEKRES; /**< @brief Pointer to SEEKRES */ typedef const SEEKRES *LPCSEEKRES; /**< @brief Const pointer to SEEKRES */ public: /** * @brief Construct #VcdEntries object */ explicit VcdEntries(); /** * @brief Destroy VcdEntries object */ virtual ~VcdEntries() = default; /** * @brief Reset this object */ void clear(); /** * @brief Load VCD from path * @param[in] path - path to locate VCD in * @return On success, returns 0; in case of error returns errno */ int load_file(const std::string & path); /** * @brief Get date of disk (taken from INFO.VCD or SVD). * @return Returns date of disk. */ time_t get_file_date() const; /** * @brief Get disk ID. * @return Returns disk ID. */ const std::string & get_id() const; /** * @brief Get disk type. * @return Returns disk type. */ VCDTYPE get_type() const; /** * @brief Get disk type as string. * @return Returns disk type as string. */ std::string get_type_str() const; /** * @brief Get disk profile tag. * @return Returns disk profile tag. */ VCDPROFILETAG get_profile_tag() const; /** * @brief Get disk profile tag as string. * @return Returns disk profile tag as string. */ std::string get_profile_tag_str() const; /** * @brief Get number of chapters on this disk. * @return Returns number of chapters on this disk. */ int get_number_of_chapters() const; /** * @brief Get chapter object. * @note If a disk is successfully read, at least one chapter is guaranteed to exist. * @param[in] chapter_idx - 0..number of chapters - 1 * @return VcdChapter object with this chapter, nullptr if chapter_idx is invalid. */ const VcdChapter * get_chapter(int chapter_idx) const; /** * @brief Get the total disk duration in AV_TIME_BASE fractional seconds. * @return Returns total disk duration. */ int64_t get_duration() const; /** * @brief Get disk size (DAT/MPEG only). * @return Returns disk size. */ uint64_t get_size() const; /** @brief Get disk directory. * @return Returns disk directory. */ const std::string & get_disk_path() const; protected: /** * @brief Scan the disk for chapters. * @return On success, returns 0; on error, returns errno. */ int scan_chapters(); /** * @brief Seek for sync bytes. * @param[in] fpi - file pointer of open file * @param[in] sync - sync bytes * @return Returns SEEKRES result code. */ SEEKRES seek_sync(FILE *fpi, const std::array & sync) const; protected: // Common data time_t m_file_date; /**< @brief File date */ std::string m_id; /**< @brief ID of CD. */ VCDTYPE m_type; /**< @brief Type of CD. */ VCDPROFILETAG m_profile_tag; /**< @brief System profile tag. */ // ENTRIES.XXX data std::vector m_chapters; /**< @brief VCD chapters */ int64_t m_duration; /**< @brief Total disk duration, in AV_TIME_BASE fractional seconds. */ // misc. std::string m_disk_path; /**< @brief Path to this disk */ }; #endif // VCDENTRIES_H ffmpegfs-2.18/src/vcd/vcdchapter.cc0000644000000000000000000001540115166175407014142 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ /** * @file vcdchapter.cc * @brief S/VCD VcdChapter class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2013-2026 Norbert Schlia (nschlia@oblivion-software.de) @n * From BullysPLayer Copyright (C) 1984-2026 by Oblivion Software/Norbert Schlia */ #include "ffmpegfs.h" #include "vcdchapter.h" #include "vcdutils.h" #include "ffmpeg_utils.h" #include VcdChapter::VcdChapter(bool is_svcd) : m_is_svcd(is_svcd), m_track_no(0), m_min(0), m_sec(0), m_frame(0), m_duration(0), m_start_pos(0), m_end_pos(0) { } VcdChapter::VcdChapter(const VCDCHAPTER & VcdChapter, bool is_svcd) : m_is_svcd(is_svcd), m_track_no(VcdChapter.m_track_no), m_min(BCD2DEC(VcdChapter.m_msf.m_min)), m_sec(BCD2DEC(VcdChapter.m_msf.m_sec)), m_frame(BCD2DEC(VcdChapter.m_msf.m_frame)), m_duration(0), m_start_pos(0), m_end_pos(0) { } VcdChapter::VcdChapter(int track_no, int min, int sec, int frame, bool is_svcd, int64_t duration) : m_is_svcd(is_svcd), m_track_no(track_no), m_min(min), m_sec(sec), m_frame(frame), m_duration(duration), m_start_pos(0), m_end_pos(0) { } int VcdChapter::readio(FILE *fpi, int track_no) { VCDMSF msf; std::array buffer; // Read first sync if (fread(&buffer, 1, buffer.size(), fpi) != buffer.size()) { return ferror(fpi); } // Validate sync if (buffer != SYNC) { return EIO; } // Read position block std::memset(&msf, 0, sizeof(msf)); if (fread(reinterpret_cast(&msf), 1, sizeof(msf), fpi) != sizeof(msf)) { return ferror(fpi); } m_track_no = track_no; m_min = BCD2DEC(msf.m_min); m_sec = BCD2DEC(msf.m_sec); m_frame = BCD2DEC(msf.m_frame); return 0; } bool VcdChapter::get_is_svcd() const { return m_is_svcd; } int VcdChapter::get_track_no() const { return m_track_no; } int VcdChapter::get_min() const { return m_min; } int VcdChapter::get_sec() const { return m_sec; } int VcdChapter::get_frame() const { return m_frame; } int64_t VcdChapter::get_duration() const { return m_duration; } std::string VcdChapter::get_filename() const { std::string buffer; if (m_is_svcd) { strsprintf(&buffer, "MPEG2/AVSEQ%02i.MPG", m_track_no - 1); } else { strsprintf(&buffer, "MPEGAV/AVSEQ%02i.DAT", m_track_no - 1); } return buffer; } uint64_t VcdChapter::get_start_pos() const { return m_start_pos; } uint64_t VcdChapter::get_end_pos() const { return m_end_pos; } uint64_t VcdChapter::get_size() const { return (m_end_pos - m_start_pos); } int64_t VcdChapter::get_start_time() const { // MSF format: minutes, seconds, and fractional seconds called frames. Each timecode frame is one seventy-fifth of a second. return static_cast(m_min * 60 + m_sec) * AV_TIME_BASE + (static_cast(m_frame) * AV_TIME_BASE / 75); } //Conversion from MSF to LBA //-------------------------- //As from Red book because there are 75 frames in 1 second, so, //LBA = Minute * 60 * 75 + Second * 75 + Frame - 150 //The minus 150 is the 2 second pregap that is recorded on every CD. //Conversion from LBA to MSF //-------------------------- //Minute = Int((LBA + 150) / (60 * 75)) //Second = Int(LBA + 150 - Minute * 60 * 75) / 75) //Frame = LBA + 150 - Minute * 60 * 75 - Second * 75 //Where Int() is a function that truncates the fractional part giving only the whole number part. int VcdChapter::get_lba() const { return m_frame + (m_sec + m_min * 60) * 75; } VcdChapter & VcdChapter::operator= (VcdChapter const & other) { if (this != & other) //oder if (*this != rhs) { m_is_svcd = other.m_is_svcd; m_track_no = other.m_track_no; m_min = other.m_min; m_sec = other.m_sec; m_frame = other.m_frame; m_start_pos = other.m_start_pos; m_end_pos = other.m_end_pos; m_duration = other.m_duration; } return *this; //Referenz auf das Objekt selbst zurückgeben } int VcdChapter::operator==(const VcdChapter & other) const { return (m_track_no == other.m_track_no && m_min == other.m_min && m_sec == other.m_sec && m_frame == other.m_frame); } int VcdChapter::operator<(const VcdChapter & other) const { int res; res = (m_track_no - other.m_track_no); if (res < 0) { return 1; } if (res > 0) { return 0; } res = (m_min - other.m_min); if (res < 0) { return 1; } if (res > 0) { return 0; } res = (m_sec - other.m_sec); if (res < 0) { return 1; } if (res > 0) { return 0; } res = (m_frame - other.m_frame); if (res < 0) { return 1; } return 0; } int VcdChapter::operator<=(const VcdChapter & other) const { if (*this == other) { return 1; } return (*this < other); } int VcdChapter::operator>(const VcdChapter & other) const { int res; res = (m_track_no - other.m_track_no); if (res > 0) { return 1; } if (res < 0) { return 0; } res = (m_min - other.m_min); if (res > 0) { return 1; } if (res < 0) { return 0; } res = (m_sec - other.m_sec); if (res > 0) { return 1; } if (res < 0) { return 0; } res = (m_frame - other.m_frame); if (res > 0) { return 1; } //if (res <= 0) return 0; } int VcdChapter::operator>=(const VcdChapter & other) const { if (*this == other) { return 1; } return (*this > other); } int VcdChapter::operator!=(const VcdChapter & other) const { return (m_track_no != other.m_track_no && m_min != other.m_min && m_sec != other.m_sec && m_frame != other.m_frame); } ffmpegfs-2.18/src/vcd/vcdinfo.h0000644000000000000000000000637215166175407013320 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ /** * @file vcdinfo.h * @brief S/VCD VcdInfo class * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2013-2026 Norbert Schlia (nschlia@oblivion-software.de) @n * From BullysPLayer Copyright (C) 1984-2026 by Oblivion Software/Norbert Schlia */ #ifndef VCDINFO_H #define VCDINFO_H #pragma once #include "vcdchapter.h" /** * @brief The #VcdInfo class */ class VcdInfo { public: /** * @brief Construct VcdInfo object */ explicit VcdInfo(); /** * @brief Destruct VcdInfo object */ virtual ~VcdInfo() = default; /** * @brief Reset this object */ void clear(); /** * @brief Load VCD from path * @param[in] path - path to locate VCD in * @return If successful, returns 0; otherwise, returns errno. */ int load_file(const std::string & path); const time_t & get_file_date() const; /**< @brief Date of disk (of INFO.VCD or SVD) */ const std::string & get_id() const; /**< @brief Get disk ID */ VCDTYPE get_type() const; /**< @brief Get disk type */ std::string get_type_str() const; /**< @brief Get disk type as string */ VCDPROFILETAG get_profile_tag() const; /**< @brief Get disk profile tag */ std::string get_profile_tag_str() const; /**< @brief Get disk profile tag as string */ const std::string & get_album_id() const; /**< @brief Get album ID */ int get_number_of_cds() const; /**< @brief Get number of CDs in set */ int get_cd_number() const; /**< @brief Get CD number in set */ protected: // Common data std::string m_disk_path; /**< @brief Path to disk */ time_t m_file_date; /**< @brief File date */ std::string m_id; /**< @brief ID of this CD. */ VCDTYPE m_type; /**< @brief Type of CD. */ VCDPROFILETAG m_profile_tag; /**< @brief System profile tag. */ // INFO.XXX data std::string m_album_id; /**< @brief Album ID */ int m_number_of_cds; /**< @brief Number of CDs in set */ int m_cd_number; /**< @brief Number of this CD in set */ }; #endif // VCDINFO_H ffmpegfs-2.18/src/ffmpegfs.cc0000644000000000000000000025267015166176020013043 00000000000000/* * Copyright (C) 2006-2008 David Collett * Copyright (C) 2008-2012 K. Henriksson * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpegfs.cc * @brief FFmpeg main function and utilities implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2006-2008 David Collett @n * Copyright (C) 2008-2013 K. Henriksson @n * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) */ #ifdef __cplusplus extern "C" { #endif #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #include #include #include #pragma GCC diagnostic pop #ifdef __cplusplus } #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "ffmpegfs.h" #include "logging.h" #include "ffmpegfshelp.h" #include #include #include #include #include #ifdef USE_LIBBLURAY #include #endif #ifdef __clang__ // Silence this in fuse API code for clang #pragma GCC diagnostic ignored "-Wimplicit-int-conversion" #endif // Define as FF_PROFILE_UNKNOWN in older versions #ifndef AV_PROFILE_UNKNOWN #define AV_PROFILE_UNKNOWN FF_PROFILE_UNKNOWN #endif FFMPEGFS_FORMAT_ARR ffmpeg_format; /**< @brief Two FFmpegfs_Format infos, 0: video file, 1: audio file */ FFMPEGFS_PARAMS params; /**< @brief FFmpegfs command line parameters */ FFMPEGFS_PARAMS::FFMPEGFS_PARAMS() : m_basepath("") // required parameter , m_mountpath("") // required parameter , m_audio_codec(AV_CODEC_ID_NONE) // default: use predefined option , m_video_codec(AV_CODEC_ID_NONE) // default: use predefined option , m_autocopy(AUTOCOPY::OFF) // default: off , m_recodesame(RECODESAME::NO) // default: off , m_profile(PROFILE::DEFAULT) // default: no profile , m_level(PRORESLEVEL::NONE) // default: no level // Format // Audio , m_audiobitrate(128*1024) // default: 128 kBit , m_audiosamplerate(44100) // default: 44.1 kHz , m_audiochannels(2) // default: 2 channels , m_sample_fmt(SAMPLE_FMT::FMT_DONTCARE) // default: use source format // Video , m_videobitrate(2*1024*1024) // default: 2 MBit , m_videowidth(0) // default: do not change width , m_videoheight(0) // default: do not change height , m_deinterlace(0) // default: do not interlace video , m_segment_duration(10 * AV_TIME_BASE) // default: 10 seconds , m_min_seek_time_diff(30 * AV_TIME_BASE) // default: 30 seconds // Hardware acceleration , m_hwaccel_enc_API(HWACCELAPI::NONE) // default: Use software encoder , m_hwaccel_enc_device_type(AV_HWDEVICE_TYPE_NONE) // default: Use software encoder , m_hwaccel_dec_API(HWACCELAPI::NONE) // default: Use software encoder , m_hwaccel_dec_device_type(AV_HWDEVICE_TYPE_NONE) // default: Use software decoder , m_hwaccel_dec_blocked(nullptr) // default: No blocked encoders // Subtitles , m_no_subtitles(0) // default: enable subtitles // Album arts , m_noalbumarts(0) // default: copy album arts // Virtual Script , m_enablescript(0) // default: no virtual script , m_scriptfile("index.php") // default name , m_scriptsource("scripts/videotag.php") // default name // Other , m_debug(0) // default: no debug messages , m_log_maxlevel("INFO") // default: INFO level , m_log_stderr(0) // default: do not log to stderr , m_log_syslog(0) // default: do not use syslog , m_logfile("") // default: none // Cache/recoding options , m_expiry_time((60*60*24 /* d */) * 7) // default: 1 week) , m_max_inactive_suspend(15) // default: 15 seconds , m_max_inactive_abort(30) // default: 30 seconds , m_prebuffer_time(0) // default: no prebuffer time , m_prebuffer_size(100 /* KB */ * 1024) // default: 100 KB , m_max_cache_size(0) // default: no limit , m_min_diskspace(0) // default: no minimum , m_cachepath("") // default: $XDG_CACHE_HOME/ffmpegfs , m_disable_cache(0) // default: enabled , m_cache_maintenance((60*60)) // default: prune every 60 minutes , m_prune_cache(0) // default: Do not prune cache immediately , m_clear_cache(0) // default: Do not clear cache on startup , m_max_threads(0) // default: 16 * CPU cores (this value here is overwritten later) , m_decoding_errors(0) // default: ignore errors , m_min_dvd_chapter_duration(1) // default: 1 second , m_oldnamescheme(0) // default: new scheme , m_include_extensions(new (std::nothrow) MATCHVEC) // default: empty list , m_hide_extensions(new (std::nothrow) MATCHVEC) // default: empty list , m_win_smb_fix(1) // default: fix enabled { } FFMPEGFS_PARAMS::FFMPEGFS_PARAMS(const FFMPEGFS_PARAMS & other) { *this = other; } FFMPEGFS_PARAMS::~FFMPEGFS_PARAMS() { delete m_hwaccel_dec_blocked; } FFMPEGFS_PARAMS& FFMPEGFS_PARAMS::operator=(const FFMPEGFS_PARAMS & other) noexcept { if (this != &other) // Self assignment check { m_basepath = other.m_basepath; m_mountpath = other.m_mountpath; m_audio_codec = other.m_audio_codec; m_video_codec = other.m_video_codec; m_autocopy = other.m_autocopy; m_recodesame = other.m_recodesame; m_profile = other.m_profile; m_level = other.m_level; m_audiobitrate = other.m_audiobitrate; m_audiosamplerate = other.m_audiosamplerate; m_audiochannels = other.m_audiochannels; m_sample_fmt = other.m_sample_fmt; m_videobitrate = other.m_videobitrate; m_videowidth = other.m_videowidth; m_videoheight = other.m_videoheight; m_deinterlace = other.m_deinterlace; m_segment_duration = other.m_segment_duration; m_min_seek_time_diff = other.m_min_seek_time_diff; m_hwaccel_enc_API = other.m_hwaccel_enc_API; m_hwaccel_enc_device_type = other.m_hwaccel_enc_device_type; m_hwaccel_enc_device = other.m_hwaccel_enc_device; m_hwaccel_dec_API = other.m_hwaccel_dec_API; m_hwaccel_dec_device_type = other.m_hwaccel_dec_device_type; m_hwaccel_dec_device = other.m_hwaccel_dec_device; m_hwaccel_dec_blocked = other.m_hwaccel_dec_blocked; m_no_subtitles = other.m_no_subtitles; m_noalbumarts = other.m_noalbumarts; m_enablescript = other.m_enablescript; m_scriptfile = other.m_scriptfile; m_scriptsource = other.m_scriptsource; m_debug = other.m_debug; m_log_maxlevel = other.m_log_maxlevel; m_log_stderr = other.m_log_stderr; m_log_syslog = other.m_log_syslog; m_logfile = other.m_logfile; m_expiry_time = other.m_expiry_time; m_max_inactive_suspend = other.m_max_inactive_suspend; m_max_inactive_abort = other.m_max_inactive_abort; m_prebuffer_time = other.m_prebuffer_time; m_prebuffer_size = other.m_prebuffer_size; m_max_cache_size = other.m_max_cache_size; m_min_diskspace = other.m_min_diskspace; m_cachepath = other.m_cachepath; m_disable_cache = other.m_disable_cache; m_cache_maintenance = other.m_cache_maintenance; m_prune_cache = other.m_prune_cache; m_clear_cache = other.m_clear_cache; m_max_threads = other.m_max_threads; m_decoding_errors = other.m_decoding_errors; m_min_dvd_chapter_duration = other.m_min_dvd_chapter_duration; m_oldnamescheme = other.m_oldnamescheme; *m_include_extensions = *other.m_include_extensions; *m_hide_extensions = *other.m_hide_extensions; m_win_smb_fix = other.m_win_smb_fix; } return *this; } bool FFMPEGFS_PARAMS::smart_transcode() const { return (ffmpeg_format[FORMAT::AUDIO].filetype() != FILETYPE::UNKNOWN && ffmpeg_format[FORMAT::VIDEO].filetype() != ffmpeg_format[FORMAT::AUDIO].filetype()); } const FFmpegfs_Format *FFMPEGFS_PARAMS::current_format(LPCVIRTUALFILE virtualfile) const { if (virtualfile == nullptr || virtualfile->m_format_idx > 1) { return nullptr; } return &ffmpeg_format[virtualfile->m_format_idx]; } enum // enum class or typedef here is not compatible with Fuse API { KEY_HELP, KEY_VERSION, KEY_FFMPEG_CAPS, KEY_KEEP_OPT, // Intelligent parameters KEY_DESTTYPE, KEY_AUDIOCODEC, KEY_VIDEOCODEC, KEY_AUDIO_BITRATE, KEY_AUDIO_SAMPLERATE, KEY_AUDIO_CHANNELS, KEY_AUDIO_SAMPLE_FMT, KEY_VIDEO_BITRATE, KEY_SEGMENT_DURATION, KEY_MIN_SEEK_TIME_DIFF, KEY_SCRIPTFILE, KEY_SCRIPTSOURCE, KEY_EXPIRY_TIME, KEY_MAX_INACTIVE_SUSPEND_TIME, KEY_MAX_INACTIVE_ABORT_TIME, KEY_PREBUFFER_TIME, KEY_PREBUFFER_SIZE, KEY_MAX_CACHE_SIZE, KEY_MIN_DISKSPACE_SIZE, KEY_CACHEPATH, KEY_CACHE_MAINTENANCE, KEY_AUTOCOPY, KEY_RECODESAME, KEY_PROFILE, KEY_LEVEL, KEY_LOG_MAXLEVEL, KEY_LOGFILE, KEY_HWACCEL_ENCODER_API, KEY_HWACCEL_ENCODER_DEVICE, KEY_HWACCEL_DECODER_API, KEY_HWACCEL_DECODER_DEVICE, KEY_HWACCEL_DECODER_BLOCKED, KEY_INCLUDE_EXTENSIONS, KEY_HIDE_EXTENSIONS }; /** * Map FFmpegfs options to FUSE parameters */ #define FFMPEGFS_OPT(templ, param, value) { templ, offsetof(FFMPEGFS_PARAMS, param), value } /** * FUSE option descriptions * * Need to ignore annoying warnings caused by fuse.h */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnarrowing" #pragma GCC diagnostic ignored "-Wsign-conversion" static struct fuse_opt ffmpegfs_opts[] = // NOLINT(modernize-avoid-c-arrays) { // Output type FUSE_OPT_KEY("--desttype=%s", KEY_DESTTYPE), FUSE_OPT_KEY("desttype=%s", KEY_DESTTYPE), FUSE_OPT_KEY("--audiocodec=%s", KEY_AUDIOCODEC), FUSE_OPT_KEY("audiocodec=%s", KEY_AUDIOCODEC), FUSE_OPT_KEY("--videocodec=%s", KEY_VIDEOCODEC), FUSE_OPT_KEY("videocodec=%s", KEY_VIDEOCODEC), FUSE_OPT_KEY("--profile=%s", KEY_PROFILE), FUSE_OPT_KEY("profile=%s", KEY_PROFILE), FUSE_OPT_KEY("--autocopy=%s", KEY_AUTOCOPY), FUSE_OPT_KEY("autocopy=%s", KEY_AUTOCOPY), FUSE_OPT_KEY("--recodesame=%s", KEY_RECODESAME), FUSE_OPT_KEY("recodesame=%s", KEY_RECODESAME), FUSE_OPT_KEY("--level=%s", KEY_LEVEL), FUSE_OPT_KEY("level=%s", KEY_LEVEL), // Audio FUSE_OPT_KEY("--audiobitrate=%s", KEY_AUDIO_BITRATE), FUSE_OPT_KEY("audiobitrate=%s", KEY_AUDIO_BITRATE), FUSE_OPT_KEY("--audiosamplerate=%s", KEY_AUDIO_SAMPLERATE), FUSE_OPT_KEY("audiosamplerate=%s", KEY_AUDIO_SAMPLERATE), FUSE_OPT_KEY("--audiochannels=%s", KEY_AUDIO_CHANNELS), FUSE_OPT_KEY("audiochannels=%s", KEY_AUDIO_CHANNELS), FUSE_OPT_KEY("--audiosamplefmt=%s", KEY_AUDIO_SAMPLE_FMT), FUSE_OPT_KEY("audiosamplefmt=%s", KEY_AUDIO_SAMPLE_FMT), // Video FUSE_OPT_KEY("--videobitrate=%s", KEY_VIDEO_BITRATE), FUSE_OPT_KEY("videobitrate=%s", KEY_VIDEO_BITRATE), FFMPEGFS_OPT("--videoheight=%u", m_videoheight, 0), FFMPEGFS_OPT("videoheight=%u", m_videoheight, 0), FFMPEGFS_OPT("--videowidth=%u", m_videowidth, 0), FFMPEGFS_OPT("videowidth=%u", m_videowidth, 0), FFMPEGFS_OPT("--deinterlace", m_deinterlace, 1), FFMPEGFS_OPT("deinterlace", m_deinterlace, 1), // HLS FUSE_OPT_KEY("--segment_duration=%s", KEY_SEGMENT_DURATION), FUSE_OPT_KEY("segment_duration=%s", KEY_SEGMENT_DURATION), FUSE_OPT_KEY("--min_seek_time_diff=%s", KEY_MIN_SEEK_TIME_DIFF), FUSE_OPT_KEY("min_seek_time_diff=%s", KEY_MIN_SEEK_TIME_DIFF), // Hardware acceleration FUSE_OPT_KEY("--hwaccel_enc=%s", KEY_HWACCEL_ENCODER_API), FUSE_OPT_KEY("hwaccel_enc=%s", KEY_HWACCEL_ENCODER_API), FUSE_OPT_KEY("--hwaccel_enc_device=%s", KEY_HWACCEL_ENCODER_DEVICE), FUSE_OPT_KEY("hwaccel_enc_device=%s", KEY_HWACCEL_ENCODER_DEVICE), FUSE_OPT_KEY("--hwaccel_dec=%s", KEY_HWACCEL_DECODER_API), FUSE_OPT_KEY("hwaccel_dec=%s", KEY_HWACCEL_DECODER_API), FUSE_OPT_KEY("--hwaccel_dec_device=%s", KEY_HWACCEL_DECODER_DEVICE), FUSE_OPT_KEY("hwaccel_dec_device=%s", KEY_HWACCEL_DECODER_DEVICE), FUSE_OPT_KEY("--hwaccel_dec_blocked=%s", KEY_HWACCEL_DECODER_BLOCKED), FUSE_OPT_KEY("hwaccel_dec_blocked=%s", KEY_HWACCEL_DECODER_BLOCKED), // Subtitles FFMPEGFS_OPT("--no_subtitles", m_no_subtitles, 1), FFMPEGFS_OPT("no_subtitles", m_no_subtitles, 1), // Album arts FFMPEGFS_OPT("--noalbumarts", m_noalbumarts, 1), FFMPEGFS_OPT("noalbumarts", m_noalbumarts, 1), // Virtual script FFMPEGFS_OPT("--enablescript", m_enablescript, 1), FFMPEGFS_OPT("enablescript", m_enablescript, 1), FUSE_OPT_KEY("--scriptfile=%s", KEY_SCRIPTFILE), FUSE_OPT_KEY("scriptfile=%s", KEY_SCRIPTFILE), FUSE_OPT_KEY("--scriptsource=%s", KEY_SCRIPTSOURCE), FUSE_OPT_KEY("scriptsource=%s", KEY_SCRIPTSOURCE), // Background recoding/caching // Cache FUSE_OPT_KEY("--expiry_time=%s", KEY_EXPIRY_TIME), FUSE_OPT_KEY("expiry_time=%s", KEY_EXPIRY_TIME), FUSE_OPT_KEY("--max_inactive_suspend=%s", KEY_MAX_INACTIVE_SUSPEND_TIME), FUSE_OPT_KEY("max_inactive_suspend=%s", KEY_MAX_INACTIVE_SUSPEND_TIME), FUSE_OPT_KEY("--max_inactive_abort=%s", KEY_MAX_INACTIVE_ABORT_TIME), FUSE_OPT_KEY("max_inactive_abort=%s", KEY_MAX_INACTIVE_ABORT_TIME), FUSE_OPT_KEY("--prebuffer_time=%s", KEY_PREBUFFER_TIME), FUSE_OPT_KEY("prebuffer_time=%s", KEY_PREBUFFER_TIME), FUSE_OPT_KEY("--prebuffer_size=%s", KEY_PREBUFFER_SIZE), FUSE_OPT_KEY("prebuffer_size=%s", KEY_PREBUFFER_SIZE), FUSE_OPT_KEY("--max_cache_size=%s", KEY_MAX_CACHE_SIZE), FUSE_OPT_KEY("max_cache_size=%s", KEY_MAX_CACHE_SIZE), FUSE_OPT_KEY("--min_diskspace=%s", KEY_MIN_DISKSPACE_SIZE), FUSE_OPT_KEY("min_diskspace=%s", KEY_MIN_DISKSPACE_SIZE), FUSE_OPT_KEY("--cachepath=%s", KEY_CACHEPATH), FUSE_OPT_KEY("cachepath=%s", KEY_CACHEPATH), FFMPEGFS_OPT("--disable_cache", m_disable_cache, 1), FFMPEGFS_OPT("disable_cache", m_disable_cache, 1), FUSE_OPT_KEY("--cache_maintenance=%s", KEY_CACHE_MAINTENANCE), FUSE_OPT_KEY("cache_maintenance=%s", KEY_CACHE_MAINTENANCE), FFMPEGFS_OPT("--prune_cache", m_prune_cache, 1), FFMPEGFS_OPT("--clear_cache", m_clear_cache, 1), FFMPEGFS_OPT("clear_cache", m_clear_cache, 1), // Other FFMPEGFS_OPT("--max_threads=%u", m_max_threads, 0), FFMPEGFS_OPT("max_threads=%u", m_max_threads, 0), FFMPEGFS_OPT("--decoding_errors=%u", m_decoding_errors, 0), FFMPEGFS_OPT("decoding_errors=%u", m_decoding_errors, 0), FFMPEGFS_OPT("--min_dvd_chapter_duration=%u", m_min_dvd_chapter_duration, 0), FFMPEGFS_OPT("min_dvd_chapter_duration=%u", m_min_dvd_chapter_duration, 0), FFMPEGFS_OPT("--oldnamescheme=%u", m_oldnamescheme, 0), FFMPEGFS_OPT("oldnamescheme=%u", m_oldnamescheme, 0), FUSE_OPT_KEY("--include_extensions=%s", KEY_INCLUDE_EXTENSIONS), FUSE_OPT_KEY("include_extensions=%s", KEY_INCLUDE_EXTENSIONS), FUSE_OPT_KEY("--hide_extensions=%u", KEY_HIDE_EXTENSIONS), FUSE_OPT_KEY("hide_extensions=%u", KEY_HIDE_EXTENSIONS), // Experimental FFMPEGFS_OPT("--win_smb_fix=%u", m_win_smb_fix, 1), FFMPEGFS_OPT("win_smb_fix=%u", m_win_smb_fix, 1), // FFmpegfs options FFMPEGFS_OPT("-d", m_debug, 1), FFMPEGFS_OPT("debug", m_debug, 1), FUSE_OPT_KEY("--log_maxlevel=%s", KEY_LOG_MAXLEVEL), FUSE_OPT_KEY("log_maxlevel=%s", KEY_LOG_MAXLEVEL), FFMPEGFS_OPT("--log_stderr", m_log_stderr, 1), FFMPEGFS_OPT("log_stderr", m_log_stderr, 1), FFMPEGFS_OPT("--log_syslog", m_log_syslog, 1), FFMPEGFS_OPT("log_syslog", m_log_syslog, 1), FUSE_OPT_KEY("--logfile=%s", KEY_LOGFILE), FUSE_OPT_KEY("logfile=%s", KEY_LOGFILE), FUSE_OPT_KEY("-h", KEY_HELP), FUSE_OPT_KEY("--help", KEY_HELP), FUSE_OPT_KEY("-V", KEY_VERSION), FUSE_OPT_KEY("--version", KEY_VERSION), FUSE_OPT_KEY("-c", KEY_FFMPEG_CAPS), FUSE_OPT_KEY("--capabilities", KEY_FFMPEG_CAPS), FUSE_OPT_KEY("-d", KEY_KEEP_OPT), FUSE_OPT_KEY("debug", KEY_KEEP_OPT), FUSE_OPT_END }; #pragma GCC diagnostic pop typedef std::map AUTOCOPY_MAP; /**< @brief Map command line option to AUTOCOPY enum */ typedef std::map PROFILE_MAP; /**< @brief Map command line option to PROFILE enum */ typedef std::map LEVEL_MAP; /**< @brief Map command line option to LEVEL enum */ typedef std::map RECODESAME_MAP; /**< @brief Map command line option to RECODESAME enum */ typedef struct HWACCEL /**< @brief Hardware acceleration device and type */ { bool m_supported; /**< @brief true if API supported, false if not */ HWACCELAPI m_hwaccel_API; /**< @brief Acceleration API, e.g VAAPI, MMAL or OMX */ AVHWDeviceType m_hwaccel_device_type; /**< @brief Hardware buffering type, NONE if not used */ } HWACCEL; typedef std::map HWACCEL_MAP; /**< @brief Map command line option to HWACCEL struct */ typedef std::map CODEC_MAP; /**< @brief Map command line option to AVCodecID */ typedef std::map SAMPLE_FMT_MAP; /**< @brief Map command line option to SAMPLE_FMT */ typedef std::map AUDIOCODEC_MAP; /**< @brief Map command line option to audio AVCodecID */ typedef std::map VIDEOCODEC_MAP; /**< @brief Map command line option to video AVCodecID */ /** * @brief List of audio codecs */ static const AUDIOCODEC_MAP audiocodec_map { { "AAC", AV_CODEC_ID_AAC }, // TS, MP4, MOV, MKV { "AC3", AV_CODEC_ID_AC3 }, // MP4, MOV, MKV { "MP3", AV_CODEC_ID_MP3 }, // TS, MP4, MOV, MKV { "OPUS", AV_CODEC_ID_OPUS }, // webm { "VORBIS", AV_CODEC_ID_VORBIS }, /** @todo webm: sound skips */ { "DTS", AV_CODEC_ID_DTS }, /** @todo invalid argument? */ { "PCM16", AV_CODEC_ID_PCM_S16LE }, /** @todo is this useable? */ { "PCM24", AV_CODEC_ID_PCM_S24LE }, /** @todo is this useable? */ { "PCM32", AV_CODEC_ID_PCM_S32LE }, /** @todo is this useable? */ }; /** * @brief List of video codecs */ const static VIDEOCODEC_MAP videocodec_map { { "MPEG1", AV_CODEC_ID_MPEG1VIDEO }, // TS, MP4, MKV { "MPEG2", AV_CODEC_ID_MPEG2VIDEO }, // TS, MP4, MKV { "H264", AV_CODEC_ID_H264 }, // TS, MP4, MKV { "H265", AV_CODEC_ID_H265 }, // TS, MP4, MKV { "VP8", AV_CODEC_ID_VP8 }, // WebM { "VP9", AV_CODEC_ID_VP9 }, // WebM //{ "AV1", AV_CODEC_ID_AV1 }, /** @todo WebM ends with "Could not write video frame (error 'Invalid data found when processing input')." */ }; /** * List of AUTOCOPY options */ static const AUTOCOPY_MAP autocopy_map { { "OFF", AUTOCOPY::OFF }, { "MATCH", AUTOCOPY::MATCH }, { "MATCHLIMIT", AUTOCOPY::MATCHLIMIT }, { "STRICT", AUTOCOPY::STRICT }, { "STRICTLIMIT", AUTOCOPY::STRICTLIMIT }, }; /** * List if MP4 profiles */ static const PROFILE_MAP profile_map { { "NONE", PROFILE::DEFAULT }, // MP4 { "FF", PROFILE::MP4_FF }, { "EDGE", PROFILE::MP4_EDGE }, { "IE", PROFILE::MP4_IE }, { "CHROME", PROFILE::MP4_CHROME }, { "SAFARI", PROFILE::MP4_SAFARI }, { "OPERA", PROFILE::MP4_OPERA }, { "MAXTHON", PROFILE::MP4_MAXTHON }, // ALAC { "ITUNES", PROFILE::ALAC_ITUNES }, // WEBM }; /** * List if ProRes levels. */ static const LEVEL_MAP prores_level_map { // ProRes { "PROXY", PRORESLEVEL::PRORES_PROXY }, { "LT", PRORESLEVEL::PRORES_LT }, { "STANDARD", PRORESLEVEL::PRORES_STANDARD }, { "HQ", PRORESLEVEL::PRORES_HQ }, }; /** * List if recode options. */ static const RECODESAME_MAP recode_map { // Recode to same format { "NO", RECODESAME::NO }, { "YES", RECODESAME::YES }, }; /** * List if hardware acceleration options. * See https://trac.ffmpeg.org/wiki/HWAccelIntro * * AV_HWDEVICE_TYPE_NONE will be set to the appropriate device type * in build_device_type_list() by asking the FFmpeg API for the proper * type. */ static HWACCEL_MAP hwaccel_map { { "NONE", { true, HWACCELAPI::NONE, AV_HWDEVICE_TYPE_NONE } }, // **** Supported by Linux **** { "VAAPI", { true, HWACCELAPI::VAAPI, AV_HWDEVICE_TYPE_NONE } }, // Video Acceleration API (VA-API), https://trac.ffmpeg.org/wiki/Hardware/VAAPI // RaspberryPi { "MMAL", { true, HWACCELAPI::MMAL, AV_HWDEVICE_TYPE_NONE } }, // Multimedia Abstraction Layer by Broadcom. Encoding only. { "OMX", { true, HWACCELAPI::OMX, AV_HWDEVICE_TYPE_NONE } }, // OpenMAX (Open Media Acceleration). Decoding only. #if 0 // Additional formats { "CUDA", { false, HWACCELAPI::CUDA, AV_HWDEVICE_TYPE_NONE } }, // Compute Unified Device Architecture, see https://developer.nvidia.com/ffmpeg and https://en.wikipedia.org/wiki/CUDA { "V4L2M2M", { false, HWACCELAPI::V4L2M2M, AV_HWDEVICE_TYPE_NONE } }, // v4l2 mem to mem (Video4linux) { "VDPAU", { false, HWACCELAPI::VDPAU, AV_HWDEVICE_TYPE_NONE } }, // Video Decode and Presentation API for Unix, see https://en.wikipedia.org/wiki/VDPAU { "QSV", { false, HWACCELAPI::QSV, AV_HWDEVICE_TYPE_NONE } }, // QuickSync, see https://trac.ffmpeg.org/wiki/Hardware/QuickSync { "OPENCL", { false, HWACCELAPI::OPENCL, AV_HWDEVICE_TYPE_NONE } }, // Open Standard for Parallel Programming of Heterogeneous Systems, see https://trac.ffmpeg.org/wiki/HWAccelIntro#OpenCL #if HAVE_VULKAN_HWACCEL { "VULKAN", { false, HWACCELAPI::VULKAN, AV_HWDEVICE_TYPE_NONE } }, // Low-overhead, cross-platform 3D graphics and computing API, requires Libavutil >= 56.30.100, see https://en.wikipedia.org/wiki/Vulkan_(API) #endif // HAVE_VULKAN_HWACCEL #if __APPLE__ // MacOS, not supported { "VIDEOTOOLBOX", { false, HWACCELAPI::VIDEOTOOLBOX, AV_HWDEVICE_TYPE_NONE } }, // https://trac.ffmpeg.org/wiki/HWAccelIntro#VideoToolbox #endif #if __ANDROID__ // Android { "MEDIACODEC", { false, HWACCELAPI::MEDIACODEC, AV_HWDEVICE_TYPE_NONE } }, // See https://developer.android.com/reference/android/media/MediaCodec #endif #if _WIN32 // **** Not supported **** // Digital Rights Management { "DRM", { false, HWACCELAPI::DRM, AV_HWDEVICE_TYPE_NONE } }, // Windows only, not supported { "DXVA2", { false, HWACCELAPI::DXVA2, AV_HWDEVICE_TYPE_NONE } }, // Direct3D 9 / DXVA2 { "D3D11VA", { false, HWACCELAPI::D3D11VA, AV_HWDEVICE_TYPE_NONE } }, // Direct3D 11 #endif #endif }; /** * List of AUTOCOPY options */ static const CODEC_MAP hwaccel_codec_map { { "H263", AV_CODEC_ID_H263 }, { "H264", AV_CODEC_ID_H264 }, { "HEVC", AV_CODEC_ID_HEVC }, { "MPEG2", AV_CODEC_ID_MPEG2VIDEO }, { "MPEG4", AV_CODEC_ID_MPEG4 }, { "VC1", AV_CODEC_ID_VC1 }, { "VP8", AV_CODEC_ID_VP8 }, { "VP9", AV_CODEC_ID_VP9 }, { "WMV3", AV_CODEC_ID_WMV3 }, }; /** * List of sample formats. */ static const SAMPLE_FMT_MAP sample_fmt_map { { "0", SAMPLE_FMT::FMT_DONTCARE }, { "8", SAMPLE_FMT::FMT_8 }, { "16", SAMPLE_FMT::FMT_16 }, { "24", SAMPLE_FMT::FMT_24 }, { "32", SAMPLE_FMT::FMT_32 }, { "64", SAMPLE_FMT::FMT_64 }, { "F16", SAMPLE_FMT::FMT_F16 }, { "F24", SAMPLE_FMT::FMT_F24 }, { "F32", SAMPLE_FMT::FMT_F32 }, { "F64", SAMPLE_FMT::FMT_F64 }, }; static int get_bitrate(const std::string & arg, BITRATE *bitrate); static int get_samplerate(const std::string & arg, int * samplerate); static int get_sampleformat(const std::string & arg, SAMPLE_FMT * sample_fmt); static int get_time(const std::string & arg, time_t *time); static int get_size(const std::string & arg, size_t *size); static int get_desttype(const std::string & arg, FFMPEGFS_FORMAT_ARR & format); static int get_audiocodec(const std::string & arg, AVCodecID *audio_codec); static int get_videocodec(const std::string & arg, AVCodecID *video_codec); static int get_autocopy(const std::string & arg, AUTOCOPY *autocopy); static int get_recodesame(const std::string & arg, RECODESAME *recode); static int get_profile(const std::string & arg, PROFILE *profile); static int get_level(const std::string & arg, PRORESLEVEL *level); static int get_segment_duration(const std::string & arg, int64_t *value); static int get_seek_time_diff(const std::string & arg, int64_t *value); static int get_hwaccel(const std::string & arg, HWACCELAPI *hwaccel_API, AVHWDeviceType *hwaccel_device_type); static int get_codec(const std::string & codec, AVCodecID *codec_id); static int get_hwaccel_dec_blocked(const std::string & arg, HWACCEL_BLOCKED_MAP **hwaccel_dec_blocked); static int get_value(const std::string & arg, int *value); static int get_value(const std::string & arg, std::string *value); static int get_value(const std::string & arg, MATCHVEC *value); //static int get_value(const std::string & arg, std::optional *value); static int get_value(const std::string & arg, double *value); static int ffmpegfs_opt_proc(__attribute__((unused)) void* data, const char* arg, int key, struct fuse_args *outargs); static bool set_defaults(); static void build_device_type_list(); static void print_params(); static void usage(); static void ffmpeg_log(void *ptr, int level, const char *fmt, va_list vl); static bool init_logging(const std::string &logfile, const std::string & max_level, bool to_stderr, bool to_syslog); /** * @brief Print program usage info. */ static void usage() { std::string help; size_t pos; help.assign(reinterpret_cast(ffmpegfshelp), ffmpegfshelp_len); pos = help.find("OPTIONS\n"); std::cout << help.substr(pos + sizeof("OPTIONS\n")); } /** * @brief Iterate through all elements in map print all keys * @param[in] info - Informative text, will be printed before the list. May be nullptr. * @param[in] map - Map to go through. */ template static void list_options(const char * info, const T & map) { std::string buffer; for (typename T::const_iterator it = map.cbegin(); it != map.cend();) { buffer += it->first.c_str(); if (++it != map.cend()) { buffer += ", "; } } if (info != nullptr) { std::fprintf(stderr, "%s: %s\n", info, buffer.c_str()); } else { std::fprintf(stderr, "%s\n", buffer.c_str()); } } /** * @brief Get formatted bitrate. @verbatim Supported formats: In bit/s: # or #bps In kbit/s: #M or #Mbps In Mbit/s: #M or #Mbps @endverbatim * @param[in] arg - Bitrate as string. * @param[in] bitrate - On return, contains parsed bitrate. * @return Returns 0 if valid; if invalid returns -1. */ static int get_bitrate(const std::string & arg, BITRATE *bitrate) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); int reti; // Check for decimal number reti = reg_compare(data, "^([1-9][0-9]*|0)?(bps)?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *bitrate = static_cast(std::stol(data)); return 0; // OK } // Check for number with optional descimal point and K modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?K(bps)?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *bitrate = static_cast(std::stof(data) * 1000); return 0; // OK } // Check for number with optional descimal point and M modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?M(bps)?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *bitrate = static_cast(std::stof(data) * 1000000); return 0; // OK } std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid bit rate '%s'\n", param.c_str(), data.c_str()); } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } /** * @brief Get formatted sample rate. @verbatim Supported formats: In Hz: # or #Hz In kHz: #K or #KHz @endverbatim * @param[in] arg - Samplerate as string. * @param[in] samplerate - On return, contains parsed sample rate. * @return Returns 0 if valid; if invalid returns -1. */ static int get_samplerate(const std::string & arg, int * samplerate) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); int reti; // Check for decimal number reti = reg_compare(data, "^([1-9][0-9]*|0)(Hz)?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *samplerate = std::stoi(data); return 0; // OK } // Check for number with optional descimal point and K modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?K(Hz)?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *samplerate = static_cast(std::stof(data) * 1000); return 0; // OK } std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid sample rate '%s'\n", param.c_str(), data.c_str()); } else { std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); } return -1; } /** * @brief Get sample format * @param[in] arg - Sample format as string. * @param[in] sample_fmt - On return, contains parsed sample format. * @return Returns 0 if valid; if invalid returns -1. */ static int get_sampleformat(const std::string & arg, SAMPLE_FMT * sample_fmt) { size_t pos = arg.find('='); *sample_fmt = SAMPLE_FMT::FMT_DONTCARE; if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); SAMPLE_FMT_MAP::const_iterator it = sample_fmt_map.find(data); if (it == sample_fmt_map.cend()) { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid sample format option: %s\n", param.c_str(), data.c_str()); list_options("Valid sample formats are", sample_fmt_map); return -1; } // May fail later: Can only be checked when destination format is known. *sample_fmt = it->second; return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } std::string get_sampleformat_text(SAMPLE_FMT sample_fmt) { SAMPLE_FMT_MAP::const_iterator it = search_by_value(sample_fmt_map, sample_fmt); if (it != sample_fmt_map.cend()) { return it->first; } return "INVALID"; } /** * @brief Get formatted time, @verbatim Supported formats: Seconds: # @n Minutes: #m @n Hours: #h @n Days: #d @n Weeks: #w @endverbatim * @param[in] arg - Time as string. * @param[in] time - On return, contains parsed time. * @return Returns 0 if valid; if invalid returns -1. */ static int get_time(const std::string & arg, time_t *time) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); int reti; // Check for decimal number reti = reg_compare(data, "^([1-9][0-9]*|0)?s?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *time = static_cast(std::stol(data)); return 0; // OK } // Check for number with optional descimal point and m modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?m$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *time = static_cast(std::stof(data) * 60); return 0; // OK } // Check for number with optional descimal point and h modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?h$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *time = static_cast(std::stof(data) * 60 * 60); return 0; // OK } // Check for number with optional descimal point and d modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?d$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *time = static_cast(std::stof(data) * 60 * 60 * 24); return 0; // OK } // Check for number with optional descimal point and w modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?w$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *time = static_cast(std::stof(data) * 60 * 60 * 24 * 7); return 0; // OK } std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid time format '%s'\n", param.c_str(), data.c_str()); } else { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid time format\n", arg.c_str()); } return -1; } /** * @brief Read size: @n @verbatim Supported formats: In bytes: # or #B @n In KBytes: #K or #KB @n In MBytes: #B or #MB @n In GBytes: #G or #GB @n In TBytes: #T or #TB @endverbatim * @param[in] arg - Time as string. * @param[out] size - On return, contains parsed size. * @return Returns 0 if valid; if invalid returns -1. */ static int get_size(const std::string & arg, size_t *size) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); int reti; // Check for decimal number reti = reg_compare(data, "^([1-9][0-9]*|0)?B?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *size = static_cast(std::stol(data)); return 0; // OK } // Check for number with optional descimal point and K/KB modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?KB?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *size = static_cast(std::stof(data) * 1024); return 0; // OK } // Check for number with optional descimal point and M/MB modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?MB?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *size = static_cast(std::stof(data) * 1024 * 1024); return 0; // OK } // Check for number with optional descimal point and G/GB modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?GB?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *size = static_cast(std::stof(data) * 1024 * 1024 * 1024); return 0; // OK } // Check for number with optional descimal point and T/TB modifier reti = reg_compare(data, "^[1-9][0-9]*(\\.[0-9]+)?TB?$", std::regex::icase); if (reti == -1) { return -1; } else if (!reti) { *size = static_cast(std::stof(data) * 1024 * 1024 * 1024 * 1024); return 0; // OK } std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid size '%s'\n", param.c_str(), data.c_str()); } else { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid size\n", arg.c_str()); } return -1; } /** * @brief Get destination type. * @param[in] arg - Format as string (MP4, OGG etc.). * @param[out] format - Index 0: Selected video format.@n * Index 1: Selected audio format. * @return Returns 0 if found; if not found returns -1. */ static int get_desttype(const std::string & arg, FFMPEGFS_FORMAT_ARR & format) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::vector results = split(arg.substr(pos + 1), "\\+"); if (results.size() > 0 && results.size() < 3) { // Check for valid destination type and obtain codecs and file type. if (!format[0].init(results[0])) { std::fprintf(stderr, "INVALID PARAMETER (%s): No codecs available for desttype: %s\n", param.c_str(), results[0].c_str()); return 1; } if (results.size() == 2) { if (format[0].video_codec() == AV_CODEC_ID_NONE) { std::fprintf(stderr, "INVALID PARAMETER (%s): First format %s does not support video\n", param.c_str(), results[0].c_str()); return 1; } if (!format[1].init(results[1])) { std::fprintf(stderr, "INVALID PARAMETER (%s): No codecs available for desttype: %s\n", param.c_str(), results[1].c_str()); return 1; } if (format[1].video_codec() != AV_CODEC_ID_NONE) { std::fprintf(stderr, "INVALID PARAMETER (%s): Second format %s should be audio only\n", param.c_str(), results[1].c_str()); return 1; } } return 0; } } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } /** * @brief Get the audio codec. * @param[in] arg - One of the possible audio codecs. * @param[out] audio_codec - Upon return contains selected AVCodecID enum. * @return Returns 0 if found; if not found returns -1. */ static int get_audiocodec(const std::string & arg, AVCodecID *audio_codec) { *audio_codec = AV_CODEC_ID_NONE; size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); AUDIOCODEC_MAP::const_iterator it = audiocodec_map.find(data); if (it == audiocodec_map.cend()) { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid videocodec option: %s\n", param.c_str(), data.c_str()); list_options("Valid audio codecs", audiocodec_map); return -1; } *audio_codec = it->second; return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } /** * @brief Get the video codec. * @param[in] arg - One of the possible video codecs. * @param[out] video_codec - Upon return contains selected AVCodecID enum. * @return Returns 0 if found; if not found returns -1. */ static int get_videocodec(const std::string & arg, AVCodecID *video_codec) { *video_codec = AV_CODEC_ID_NONE; size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); VIDEOCODEC_MAP::const_iterator it = videocodec_map.find(data); if (it == videocodec_map.cend()) { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid videocodec option: %s\n", param.c_str(), data.c_str()); list_options("Valid video codecs", videocodec_map); return -1; } *video_codec = it->second; return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } /** * @brief Get autocopy option. * @param[in] arg - One of the auto copy options. * @param[out] autocopy - Upon return contains selected AUTOCOPY enum. * @return Returns 0 if found; if not found returns -1. */ static int get_autocopy(const std::string & arg, AUTOCOPY *autocopy) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); AUTOCOPY_MAP::const_iterator it = autocopy_map.find(data); if (it == autocopy_map.cend()) { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid autocopy option: %s\n", param.c_str(), data.c_str()); list_options("Valid autocopy options are", autocopy_map); return -1; } *autocopy = it->second; return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } std::string get_audio_codec_text(AVCodecID audio_codec) { AUDIOCODEC_MAP::const_iterator it = search_by_value(audiocodec_map, audio_codec); if (it != audiocodec_map.cend()) { return it->first; } return "INVALID"; } std::string get_video_codec_text(AVCodecID video_codec) { AUDIOCODEC_MAP::const_iterator it = search_by_value(videocodec_map, video_codec); if (it != videocodec_map.cend()) { return it->first; } return "INVALID"; } std::string get_autocopy_text(AUTOCOPY autocopy) { AUTOCOPY_MAP::const_iterator it = search_by_value(autocopy_map, autocopy); if (it != autocopy_map.cend()) { return it->first; } return "INVALID"; } /** * @brief Get recode option. * @param[in] arg - One of the recode options. * @param[out] recode - Upon return contains selected RECODESAME enum. * @return Returns 0 if found; if not found returns -1. */ static int get_recodesame(const std::string & arg, RECODESAME *recode) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); RECODESAME_MAP::const_iterator it = recode_map.find(data); if (it == recode_map.cend()) { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid recode option: %s\n", param.c_str(), data.c_str()); list_options("Valid recode options are", recode_map); return -1; } *recode = it->second; return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } std::string get_recodesame_text(RECODESAME recode) { RECODESAME_MAP::const_iterator it = search_by_value(recode_map, recode); if (it != recode_map.cend()) { return it->first; } return "INVALID"; } /** * @brief Get profile option. * @param[in] arg - One of the auto profile options. * @param[out] profile - Upon return contains selected PROFILE enum. * @return Returns 0 if found; if not found returns -1. */ static int get_profile(const std::string & arg, PROFILE *profile) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); PROFILE_MAP::const_iterator it = profile_map.find(data); if (it == profile_map.cend()) { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid profile: %s\n", param.c_str(), data.c_str()); list_options("Valid profiles are", profile_map); return -1; } *profile = it->second; return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } std::string get_profile_text(PROFILE profile) { PROFILE_MAP::const_iterator it = search_by_value(profile_map, profile); if (it != profile_map.cend()) { return it->first; } return "INVALID"; } // Read level /** * @brief Get ProRes level * @param[in] arg - One of the ProRes levels. * @param[out] level - Upon return contains selected PRORESLEVEL enum. * @return Returns 0 if found; if not found returns -1. */ static int get_level(const std::string & arg, PRORESLEVEL *level) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); LEVEL_MAP::const_iterator it = prores_level_map.find(data); if (it == prores_level_map.cend()) { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid level: %s\n", param.c_str(), data.c_str()); list_options("Valid levels are", prores_level_map); return -1; } *level = it->second; return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } // Get level text std::string get_level_text(PRORESLEVEL level) { LEVEL_MAP::const_iterator it = search_by_value(prores_level_map, level); if (it != prores_level_map.cend()) { return it->first; } return "INVALID"; } /** * @brief Get HLS segment duration. Input value must be in seconds. * @param[in] arg - Segment duration in seconds. Must be greater than 0. * @param[out] value - Upon return contains segment duration in AV_TIME_BASE units. * @return Returns 0 if valid; if out of range returns -1. */ static int get_segment_duration(const std::string & arg, int64_t *value) { double duration; if (get_value(arg, &duration) < 0) { return -1; } if (*value <= 0) { std::fprintf(stderr, "INVALID PARAMETER: segment_duration %.1f is out of range. For obvious reasons this must be greater than zero.\n", duration); return -1; } *value = static_cast(duration * AV_TIME_BASE); return 0; } /** * @brief Get seek time diff. Input value must be in seconds. * @param[in] arg - Segment duration in seconds. Must be greater or equal 0. * @param[out] value - Upon return contains seek time diff in AV_TIME_BASE units. * @return Returns 0 if valid; if out of range returns -1. */ static int get_seek_time_diff(const std::string & arg, int64_t *value) { double duration; if (get_value(arg, &duration) < 0) { return -1; } if (*value <= 0) { std::fprintf(stderr, "INVALID PARAMETER: seek time %.1f is out of range. For obvious reasons this must be greater than or equal zero.\n", duration); return -1; } *value = static_cast(duration * AV_TIME_BASE); return 0; } /** * @brief Get type of hardware acceleration. * To keep it simple, currently all values are accepted. * @param[in] arg - One of the hardware acceleration types, e.g. VAAPI. * @param[out] hwaccel_API - Upon return contains the hardware acceleration API. * @param[out] hwaccel_device_type - Upon return contains the hardware acceleration device type. * @return Returns 0 if found; if not found returns -1. */ static int get_hwaccel(const std::string & arg, HWACCELAPI *hwaccel_API, AVHWDeviceType *hwaccel_device_type) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::string data(arg.substr(pos + 1)); HWACCEL_MAP::const_iterator it = hwaccel_map.find(data); if (it == hwaccel_map.cend()) { std::fprintf(stderr, "INVALID PARAMETER (%s): Invalid hardware acceleration API: %s\n", param.c_str(), data.c_str()); list_options("Valid hardware acceleration APIs are", hwaccel_map); return -1; } const HWACCEL & hwaccel = it->second; if (!hwaccel.m_supported) { std::fprintf(stderr, "INVALID PARAMETER (%s): Unsupported hardware acceleration API: %s\n", param.c_str(), data.c_str()); return -1; } *hwaccel_API = hwaccel.m_hwaccel_API; *hwaccel_device_type = hwaccel.m_hwaccel_device_type; return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } /** * @brief Get AVCodecID for codec string * @param[in] codec - Codec string * @param[out] codec_id - AVCodecID of codec string * @return Returns 0 if found; if not found returns -1 and codec_id set to AV_CODEC_ID_NONE. */ static int get_codec(const std::string & codec, AVCodecID *codec_id) { CODEC_MAP::const_iterator it = hwaccel_codec_map.find(codec); if (it == hwaccel_codec_map.cend()) { std::fprintf(stderr, "INVALID PARAMETER: Unknown codec '%s'.\n", codec.c_str()); list_options("Valid hardware acceleration APIs are", hwaccel_codec_map); *codec_id = AV_CODEC_ID_NONE; return -1; } *codec_id = it->second; return 0; } /** * @brief Get list of codecs and optional profiles blocked for hardware accelerated decoding * @param[in] arg - Parameter with codec string and optional profile * @param[out] hwaccel_dec_blocked - Map with blocked codecs and profiles. Will be allocated if necessary. * @return Returns 0 on success; on error returns -1. */ static int get_hwaccel_dec_blocked(const std::string & arg, HWACCEL_BLOCKED_MAP **hwaccel_dec_blocked) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::string param(arg.substr(0, pos)); std::stringstream data(arg.substr(pos + 1)); std::string codec; if (*hwaccel_dec_blocked == nullptr) { *hwaccel_dec_blocked = new (std::nothrow) HWACCEL_BLOCKED_MAP; } if (!std::getline(data, codec, ':')) { std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", param.c_str()); return -1; } AVCodecID codec_id; if (get_codec(codec, &codec_id)) { std::fprintf(stderr, "INVALID PARAMETER (%s): Unknown codec '%s'\n", param.c_str(), codec.c_str()); return -1; } int nProfilesFound = 0; for (std::string profile; std::getline(data, profile, ':');) { nProfilesFound++; // Block codec and profile (*hwaccel_dec_blocked)->insert(std::pair(codec_id, std::stoi(profile))); } if (!nProfilesFound) { // No profile (*hwaccel_dec_blocked)->insert(std::pair(codec_id, AV_PROFILE_UNKNOWN)); } return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } bool check_hwaccel_dec_blocked(AVCodecID codec_id, int profile) { if (params.m_hwaccel_dec_blocked == nullptr) { return false; // Nothing blocked } for (HWACCEL_BLOCKED_MAP::const_iterator it = params.m_hwaccel_dec_blocked->find(codec_id); it != params.m_hwaccel_dec_blocked->cend(); ++it) { if (it->first == codec_id && (it->second == profile || it->second == AV_PROFILE_UNKNOWN)) { return true; } } return false; } std::string get_hwaccel_API_text(HWACCELAPI hwaccel_API) { HWACCEL_MAP::const_iterator it = hwaccel_map.cbegin(); while (it != hwaccel_map.cend()) { if (it->second.m_hwaccel_API == hwaccel_API) { return it->first; } ++it; } return "INVALID"; } /** * @brief Get value from command line string. * Finds whatever is after the "=" sign. * @param[in] arg - Command line option. * @param[in] value - Upon return, contains the value after the "=" sign. * @return Returns 0 if valid; if invalid returns -1. */ static int get_value(const std::string & arg, int *value) { size_t pos = arg.find('='); if (pos != std::string::npos) { *value = std::stoi(arg.substr(pos + 1)); return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } /** * @brief Get value from command line string. * Finds whatever is after the "=" sign. * @param[in] arg - Command line option. * @param[in] value - Upon return, contains the value after the "=" sign. * @return Returns 0 if valid; if invalid returns -1. */ static int get_value(const std::string & arg, std::string *value) { size_t pos = arg.find('='); if (pos != std::string::npos) { *value = arg.substr(pos + 1); return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } /** * @brief Get comma separated values from command line string. * Finds whatever is after the "=" sign. * @param[in] arg - Command line option. * @param[in] value - Upon return, contains a set of the values after the "=" sign. * @return Returns 0 if valid; if invalid returns -1. */ static int get_value(const std::string & arg, MATCHVEC *value) { size_t pos = arg.find('='); if (pos != std::string::npos) { std::vector v = split(arg.substr(pos + 1), ","); for (const std::string & str : v) { int res = fnmatch(str.c_str(), "", 0); if (res != 0 && res != FNM_NOMATCH) { std::fprintf(stderr, "INVALID PARAMETER (%s): Error in wildcard pattern\n", str.c_str()); return -1; } } value->insert(value->end(), v.begin(), v.end()); return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } #if 0 /** * @brief Get value from command line string. * Finds whatever is after the "=" sign. * @param[in] arg - Command line option. * @param[in] value - Upon return, contains the value after the "=" sign. * @return Returns 0 if valid; if invalid returns -1. */ static int get_value(const std::string & arg, std::optional *value) { size_t pos = arg.find('='); if (pos != std::string::npos) { *value = arg.substr(pos + 1); return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } #endif /** * @brief Get value from command line string. * Finds whatever is after the "=" sign. * @param[in] arg - Command line option. * @param[in] value - Upon return, contains the value after the "=" sign. * @return Returns 0 if valid; if invalid returns -1. */ static int get_value(const std::string & arg, double *value) { size_t pos = arg.find('='); if (pos != std::string::npos) { *value = std::stof(arg.substr(pos + 1)); return 0; } std::fprintf(stderr, "INVALID PARAMETER (%s): Missing argument\n", arg.c_str()); return -1; } /** * @brief FUSE option parsing function. * @param[in] data - is the user data passed to the fuse_opt_parse() function * @param[in] arg - is the whole argument or option * @param[in] key - determines why the processing function was called * @param[in] outargs - the current output argument list * @return -1 on error, 0 if arg is to be discarded, 1 if arg should be kept */ static int ffmpegfs_opt_proc(__attribute__((unused)) void* data, const char* arg, int key, struct fuse_args *outargs) { switch (key) { case FUSE_OPT_KEY_NONOPT: { static int n; // check for basepath and bitrate parameters if (n == 0 && params.m_basepath.empty()) { expand_path(¶ms.m_basepath, arg); sanitise_filepath(¶ms.m_basepath); append_sep(¶ms.m_basepath); n++; return 0; } else if (n == 1 && params.m_mountpath.empty()) { expand_path(¶ms.m_mountpath, arg); sanitise_filepath(¶ms.m_mountpath); append_sep(¶ms.m_mountpath); if (!docker_client) { switch (is_mount(params.m_mountpath)) { case 1: { std::fprintf(stderr, "%-25s: already mounted\n", params.m_mountpath.c_str()); exit(1); } //case -1: //{ // // Error already reported // exit(1); //} } } n++; return 1; } break; } case KEY_HELP: { usage(); fuse_opt_add_arg(outargs, "-ho"); fuse_main(outargs->argc, outargs->argv, &ffmpegfs_ops, nullptr); exit(1); } case KEY_VERSION: { std::printf("-------------------------------------------------------------------------------------------\n"); #ifdef __GNUC__ #ifndef __clang_version__ std::printf("%-20s: %s (%s)\n", "Built with", "gcc " __VERSION__, HOST_OS); #else std::printf("%-20s: %s (%s)\n", "Built with", "clang " __clang_version__, HOST_OS); #endif #endif std::printf("%-20s: %s\n\n", "configuration", CONFIGURE_ARGS); std::printf("%-20s: %s\n", PACKAGE_NAME " Version", FFMPEFS_VERSION); std::printf("%s", ffmpeg_libinfo().c_str()); #ifdef USE_LIBVCD std::printf("%-20s: %s\n", "Video CD Library", "enabled"); #endif // USE_LIBVCD #ifdef USE_LIBDVD std::printf("%-20s: %s\n", "DVD Library", "enabled"); #endif // USE_LIBDVD #ifdef USE_LIBBLURAY std::printf("%-20s: %s\n", "Blu-ray Library", BLURAY_VERSION_STRING); #endif // USE_LIBBLURAY fuse_opt_add_arg(outargs, "--version"); fuse_main(outargs->argc, outargs->argv, &ffmpegfs_ops, nullptr); exit(0); } case KEY_FFMPEG_CAPS: { std::printf("-------------------------------------------------------------------------------------------\n\n"); std::printf("%-20s: %s\n", PACKAGE_NAME " Version", FFMPEFS_VERSION); std::printf("%s", ffmpeg_libinfo().c_str()); std::printf("\nFFMpeg Capabilities\n\n"); show_caps(0); exit(0); } case KEY_DESTTYPE: { return get_desttype(arg, ffmpeg_format); } case KEY_AUDIOCODEC: { return get_audiocodec(arg, ¶ms.m_audio_codec); } case KEY_VIDEOCODEC: { return get_videocodec(arg, ¶ms.m_video_codec); } case KEY_AUTOCOPY: { return get_autocopy(arg, ¶ms.m_autocopy); } case KEY_RECODESAME: { return get_recodesame(arg, ¶ms.m_recodesame); } case KEY_PROFILE: { return get_profile(arg, ¶ms.m_profile); } case KEY_LEVEL: { return get_level(arg, ¶ms.m_level); } case KEY_AUDIO_BITRATE: { return get_bitrate(arg, ¶ms.m_audiobitrate); } case KEY_AUDIO_SAMPLERATE: { return get_samplerate(arg, ¶ms.m_audiosamplerate); } case KEY_AUDIO_CHANNELS: { return get_value(arg, ¶ms.m_audiochannels); } case KEY_AUDIO_SAMPLE_FMT: { return get_sampleformat(arg, ¶ms.m_sample_fmt); } case KEY_SCRIPTFILE: { return get_value(arg, ¶ms.m_scriptfile); } case KEY_SCRIPTSOURCE: { return get_value(arg, ¶ms.m_scriptsource); } case KEY_VIDEO_BITRATE: { return get_bitrate(arg, ¶ms.m_videobitrate); } case KEY_SEGMENT_DURATION: { return get_segment_duration(arg, ¶ms.m_segment_duration); } case KEY_MIN_SEEK_TIME_DIFF: { return get_seek_time_diff(arg, ¶ms.m_min_seek_time_diff); } case KEY_HWACCEL_ENCODER_API: { return get_hwaccel(arg, ¶ms.m_hwaccel_enc_API, ¶ms.m_hwaccel_enc_device_type); } case KEY_HWACCEL_ENCODER_DEVICE: { return get_value(arg, ¶ms.m_hwaccel_enc_device); } case KEY_HWACCEL_DECODER_API: { return get_hwaccel(arg, ¶ms.m_hwaccel_dec_API, ¶ms.m_hwaccel_dec_device_type); } case KEY_HWACCEL_DECODER_DEVICE: { return get_value(arg, ¶ms.m_hwaccel_dec_device); } case KEY_HWACCEL_DECODER_BLOCKED: { return get_hwaccel_dec_blocked(arg, ¶ms.m_hwaccel_dec_blocked); } case KEY_EXPIRY_TIME: { return get_time(arg, ¶ms.m_expiry_time); } case KEY_MAX_INACTIVE_SUSPEND_TIME: { return get_time(arg, ¶ms.m_max_inactive_suspend); } case KEY_MAX_INACTIVE_ABORT_TIME: { return get_time(arg, ¶ms.m_max_inactive_abort); } case KEY_PREBUFFER_TIME: { return get_time(arg, ¶ms.m_prebuffer_time); } case KEY_PREBUFFER_SIZE: { return get_size(arg, ¶ms.m_prebuffer_size); } case KEY_MAX_CACHE_SIZE: { return get_size(arg, ¶ms.m_max_cache_size); } case KEY_MIN_DISKSPACE_SIZE: { return get_size(arg, ¶ms.m_min_diskspace); } case KEY_CACHEPATH: { return get_value(arg, ¶ms.m_cachepath); } case KEY_CACHE_MAINTENANCE: { return get_time(arg, ¶ms.m_cache_maintenance); } case KEY_LOG_MAXLEVEL: { return get_value(arg, ¶ms.m_log_maxlevel); } case KEY_LOGFILE: { std::string logfile; int res = get_value(arg, &logfile); if (res) { return res; } expand_path(¶ms.m_logfile, logfile); sanitise_filepath(¶ms.m_logfile); return 0; } case KEY_INCLUDE_EXTENSIONS: { return get_value(arg, params.m_include_extensions.get()); } case KEY_HIDE_EXTENSIONS: { return get_value(arg, params.m_hide_extensions.get()); } } return 1; } /** * @brief Set default values. * @return Returns true if options are OK, false if option combination is invalid. */ static bool set_defaults() { if (ffmpeg_format[FORMAT::VIDEO].video_codec() == AV_CODEC_ID_PRORES) { if (params.m_level == PRORESLEVEL::NONE) { params.m_level = PRORESLEVEL::PRORES_HQ; } } return true; } /** * @brief Build list of available device types. * Builds a list of device types supported by the current * FFmpeg libary. */ static void build_device_type_list() { for (AVHWDeviceType device_type = AV_HWDEVICE_TYPE_NONE; (device_type = av_hwdevice_iterate_types(device_type)) != AV_HWDEVICE_TYPE_NONE;) { HWACCEL_MAP::iterator it = hwaccel_map.find(av_hwdevice_get_type_name(device_type)); if (it == hwaccel_map.end()) { continue; } it->second.m_hwaccel_device_type = device_type; } } /** * @brief Print currently selected parameters. */ static void print_params() { std::string cachepath; transcoder_cache_path(&cachepath); Logging::trace(nullptr, "********* " PACKAGE_NAME " Options *********"); Logging::trace(nullptr, "Base Path : %1", params.m_basepath.c_str()); Logging::trace(nullptr, "Mount Path : %1", params.m_mountpath.c_str()); Logging::trace(nullptr, "--------- Format ---------"); if (ffmpeg_format[FORMAT::AUDIO].filetype() != FILETYPE::UNKNOWN) { Logging::trace(nullptr, "Audio File Type : %1", ffmpeg_format[FORMAT::AUDIO].desttype().c_str()); if (ffmpeg_format[FORMAT::AUDIO].audio_codec() != AV_CODEC_ID_NONE) { Logging::trace(nullptr, "Audio Codec : %1 (%2)", get_codec_name(ffmpeg_format[FORMAT::AUDIO].audio_codec(), false), get_codec_name(ffmpeg_format[FORMAT::AUDIO].audio_codec(), true)); } Logging::trace(nullptr, "Video File Type : %1", ffmpeg_format[FORMAT::VIDEO].desttype().c_str()); if (ffmpeg_format[FORMAT::VIDEO].audio_codec() != AV_CODEC_ID_NONE) { Logging::trace(nullptr, "Audio Codec : %1 (%2)", get_codec_name(ffmpeg_format[FORMAT::VIDEO].audio_codec(), false), get_codec_name(ffmpeg_format[FORMAT::VIDEO].audio_codec(), true)); } if (ffmpeg_format[FORMAT::VIDEO].video_codec() != AV_CODEC_ID_NONE) { Logging::trace(nullptr, "Video Codec : %1 (%2)", get_codec_name(ffmpeg_format[FORMAT::VIDEO].video_codec(), false), get_codec_name(ffmpeg_format[FORMAT::VIDEO].video_codec(), true)); } } else { Logging::trace(nullptr, "File Type : %1", ffmpeg_format[FORMAT::VIDEO].desttype().c_str()); if (ffmpeg_format[FORMAT::VIDEO].audio_codec() != AV_CODEC_ID_NONE) { Logging::trace(nullptr, "Audio Codec : %1 (%2)", get_codec_name(ffmpeg_format[FORMAT::VIDEO].audio_codec(), false), get_codec_name(ffmpeg_format[FORMAT::VIDEO].audio_codec(), true)); } if (ffmpeg_format[FORMAT::VIDEO].video_codec() != AV_CODEC_ID_NONE) { Logging::trace(nullptr, "Video Codec : %1 (%2)", get_codec_name(ffmpeg_format[FORMAT::VIDEO].video_codec(), false), get_codec_name(ffmpeg_format[FORMAT::VIDEO].video_codec(), true)); } } Logging::trace(nullptr, "Smart Transcode : %1", params.smart_transcode() ? "yes" : "no"); Logging::trace(nullptr, "Auto Copy : %1", get_autocopy_text(params.m_autocopy).c_str()); Logging::trace(nullptr, "Recode to same fmt: %1", get_recodesame_text(params.m_recodesame).c_str()); Logging::trace(nullptr, "Profile : %1", get_profile_text(params.m_profile).c_str()); Logging::trace(nullptr, "Level : %1", get_level_text(params.m_level).c_str()); Logging::trace(nullptr, "Include Extensions: %1", implode(*params.m_include_extensions).c_str()); Logging::trace(nullptr, "Hide Extensions : %1", implode(*params.m_hide_extensions).c_str()); Logging::trace(nullptr, "--------- Audio ---------"); Logging::trace(nullptr, "Codecs : %1+%2", get_codec_name(ffmpeg_format[FORMAT::VIDEO].audio_codec(), true), get_codec_name(ffmpeg_format[FORMAT::AUDIO].audio_codec(), true)); Logging::trace(nullptr, "Bitrate : %1", format_bitrate(params.m_audiobitrate).c_str()); Logging::trace(nullptr, "Sample Rate : %1", format_samplerate(params.m_audiosamplerate).c_str()); Logging::trace(nullptr, "Max. Channels : %1", params.m_audiochannels); if (params.m_sample_fmt != SAMPLE_FMT::FMT_DONTCARE) { Logging::trace(nullptr, "Sample Format : %1", get_sampleformat_text(params.m_sample_fmt).c_str()); } Logging::trace(nullptr, "--------- Video ---------"); Logging::trace(nullptr, "Codec : %1", get_codec_name(ffmpeg_format[FORMAT::VIDEO].video_codec(), true)); Logging::trace(nullptr, "Bitrate : %1", format_bitrate(params.m_videobitrate).c_str()); Logging::trace(nullptr, "Dimension : width=%1 height=%2", format_number(params.m_videowidth).c_str(), format_number(params.m_videoheight).c_str()); Logging::trace(nullptr, "Deinterlace : %1", params.m_deinterlace ? "yes" : "no"); Logging::trace(nullptr, "--------- HLS Options ---------"); Logging::trace(nullptr, "Segment Duration : %1", format_time(static_cast(params.m_segment_duration / AV_TIME_BASE)).c_str()); Logging::trace(nullptr, "Seek Time Diff : %1", format_time(static_cast(params.m_min_seek_time_diff / AV_TIME_BASE)).c_str()); Logging::trace(nullptr, "---- Hardware Acceleration ----"); Logging::trace(nullptr, "Hardware Decoder:"); Logging::trace(nullptr, "API : %1", get_hwaccel_API_text(params.m_hwaccel_dec_API).c_str()); Logging::trace(nullptr, "Frame Buffering : %1", av_hwdevice_get_type_name(params.m_hwaccel_dec_device_type)); Logging::trace(nullptr, "Device : %1", params.m_hwaccel_dec_device.c_str()); Logging::trace(nullptr, "Hardware Encoder:"); Logging::trace(nullptr, "API : %1", get_hwaccel_API_text(params.m_hwaccel_enc_API).c_str()); Logging::trace(nullptr, "Frame Buffering : %1", av_hwdevice_get_type_name(params.m_hwaccel_enc_device_type)); Logging::trace(nullptr, "Device : %1", params.m_hwaccel_enc_device.c_str()); Logging::trace(nullptr, "--------- Subtitles ---------"); Logging::trace(nullptr, "No subtitles : %1", params.m_no_subtitles ? "yes" : "no"); Logging::trace(nullptr, "--------- Virtual Script ---------"); Logging::trace(nullptr, "Create script : %1", params.m_enablescript ? "yes" : "no"); Logging::trace(nullptr, "Script file name : %1", params.m_scriptfile.c_str()); Logging::trace(nullptr, "Input file : %1", params.m_scriptsource.c_str()); Logging::trace(nullptr, "--------- Logging ---------"); Logging::trace(nullptr, "Max. Log Level : %1", params.m_log_maxlevel.c_str()); Logging::trace(nullptr, "Log to stderr : %1", params.m_log_stderr ? "yes" : "no"); Logging::trace(nullptr, "Log to syslog : %1", params.m_log_syslog ? "yes" : "no"); Logging::trace(nullptr, "Logfile : %1", !params.m_logfile.empty() ? params.m_logfile.c_str() : "none"); Logging::trace(nullptr, "--------- Cache Settings ---------"); Logging::trace(nullptr, "Expiry Time : %1", format_time(params.m_expiry_time).c_str()); Logging::trace(nullptr, "Inactivity Suspend: %1", format_time(params.m_max_inactive_suspend).c_str()); Logging::trace(nullptr, "Inactivity Abort : %1", format_time(params.m_max_inactive_abort).c_str()); Logging::trace(nullptr, "Pre-buffer Time : %1", format_time(params.m_prebuffer_time).c_str()); Logging::trace(nullptr, "Pre-buffer Size : %1", format_size(params.m_prebuffer_size).c_str()); Logging::trace(nullptr, "Max. Cache Size : %1", format_size(params.m_max_cache_size).c_str()); Logging::trace(nullptr, "Min. Disk Space : %1", format_size(params.m_min_diskspace).c_str()); Logging::trace(nullptr, "Cache Path : %1", cachepath.c_str()); Logging::trace(nullptr, "Disable Cache : %1", params.m_disable_cache ? "yes" : "no"); Logging::trace(nullptr, "Maintenance Timer : %1", params.m_cache_maintenance ? format_time(params.m_cache_maintenance).c_str() : "inactive"); Logging::trace(nullptr, "Clear Cache : %1", params.m_clear_cache ? "yes" : "no"); Logging::trace(nullptr, "--------- Various Options ---------"); Logging::trace(nullptr, "Remove Album Arts : %1", params.m_noalbumarts ? "yes" : "no"); Logging::trace(nullptr, "Max. Threads : %1", format_number(params.m_max_threads).c_str()); Logging::trace(nullptr, "Decoding Errors : %1", params.m_decoding_errors ? "break transcode" : "ignore"); Logging::trace(nullptr, "Min. DVD Chapter : %1", format_duration(params.m_min_dvd_chapter_duration * AV_TIME_BASE).c_str()); Logging::trace(nullptr, "Old Name Scheme : %1", params.m_oldnamescheme ? "yes" : "no"); Logging::trace(nullptr, "--------- Experimental Options ---------"); Logging::trace(nullptr, "Windows 10 Fix : %1", params.m_win_smb_fix ? "SMB Lockup Fix Active" : "inactive"); } /** * @brief Custom FFmpeg log function. Used with av_log_set_callback(). * @param[in] ptr - See av_log_set_callback() in FFmpeg API. * @param[in] level - See av_log_set_callback() in FFmpeg API. * @param[in] fmt - See av_log_set_callback() in FFmpeg API. * @param[in] vl - See av_log_set_callback() in FFmpeg API. */ static void ffmpeg_log(void *ptr, int level, const char *fmt, va_list vl) { Logging::LOGLEVEL ffmpegfs_level; // Map log level // AV_LOG_PANIC 0 // AV_LOG_FATAL 8 // AV_LOG_ERROR 16 if (level <= AV_LOG_ERROR) { ffmpegfs_level = LOGERROR; } // AV_LOG_WARNING 24 else if (level <= AV_LOG_WARNING) { ffmpegfs_level = LOGWARN; } #ifdef AV_LOG_TRACE // AV_LOG_INFO 32 //else if (level <= AV_LOG_INFO) //{ // ffmpegfs_level = LOGINFO; //} // AV_LOG_VERBOSE 40 // AV_LOG_DEBUG 48 else if (level < AV_LOG_DEBUG) { ffmpegfs_level = LOGDEBUG; } // AV_LOG_TRACE 56 else // if (level <= AV_LOG_TRACE) { ffmpegfs_level = LOGTRACE; } #else // AV_LOG_INFO 32 else // if (level <= AV_LOG_INFO) { ffmpegfs_level = DEBUG; } #endif if (!Logging::show(ffmpegfs_level)) { return; } va_list vl2; static int print_prefix = 1; #if (LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(55, 23, 0)) char * line; int line_size; std::string category; if (ptr != nullptr) { AVClass* avc = *(AVClass **)ptr; switch (avc->category) { case AV_CLASS_CATEGORY_NA: { break; } case AV_CLASS_CATEGORY_INPUT: { category = "INPUT "; break; } case AV_CLASS_CATEGORY_OUTPUT: { category = "OUTPUT "; break; } case AV_CLASS_CATEGORY_MUXER: { category = "MUXER "; break; } case AV_CLASS_CATEGORY_DEMUXER: { category = "DEMUXER "; break; } case AV_CLASS_CATEGORY_ENCODER: { category = "ENCODER "; break; } case AV_CLASS_CATEGORY_DECODER: { category = "DECODER "; break; } case AV_CLASS_CATEGORY_FILTER: { category = "FILTER "; break; } case AV_CLASS_CATEGORY_BITSTREAM_FILTER: { category = "BITFILT "; break; } case AV_CLASS_CATEGORY_SWSCALER: { category = "SWSCALE "; break; } case AV_CLASS_CATEGORY_SWRESAMPLER: { category = "SWRESAM "; break; } default: { strsprintf(&category, "CAT %3i ", static_cast(avc->category)); break; } } } va_copy(vl2, vl); av_log_default_callback(ptr, level, fmt, vl); line_size = av_log_format_line2(ptr, level, fmt, vl2, nullptr, 0, &print_prefix); if (line_size < 0) { va_end(vl2); return; } line = static_cast(av_malloc(static_cast(line_size))); if (line == nullptr) { return; } av_log_format_line2(ptr, level, fmt, vl2, line, line_size, &print_prefix); va_end(vl2); #else char line[1024]; va_copy(vl2, vl); av_log_default_callback(ptr, level, fmt, vl); av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix); va_end(vl2); #endif Logging::log_with_level(ffmpegfs_level, "", category + line); #if (LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(55, 23, 0)) av_free(line); #endif } /** * @brief Inititalise logging facility * @param[in] logfile - Name of log file if file writing is selected. * @param[in] max_level - Maximum level to log. * @param[in] to_stderr - If true, log to stderr. * @param[in] to_syslog - If true, log to syslog. * @return Returns true on success; false on error. */ static bool init_logging(const std::string &logfile, const std::string & max_level, bool to_stderr, bool to_syslog) { static const std::map log_level_map = { { "ERROR", LOGERROR }, { "WARNING", LOGWARN }, { "INFO", LOGINFO }, { "DEBUG", LOGDEBUG }, { "TRACE", LOGTRACE }, }; std::map::const_iterator it = log_level_map.find(max_level); if (it == log_level_map.cend()) { std::fprintf(stderr, "Invalid logging level string: %s\n", max_level.c_str()); return false; } return Logging::init_logging(logfile, it->second, to_stderr, to_syslog); } /** * @brief Main program entry point. * @param[in] argc - Number of command line arguments. * @param[in] argv - Command line argument array. * @return Return value will be the errorlevel of the executable. * Returns 0 on success, 1 on error. */ int main(int argc, char *argv[]) { int ret; struct fuse_args args = FUSE_ARGS_INIT(argc, argv); // Check if run from other process group like mount and if so, inhibit startup message if (getppid() == getpgid(0)) { std::printf("%s V%s\n", PACKAGE_NAME, FFMPEFS_VERSION); std::printf("Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de)\n" "David Collett (2006-2008) and K. Henriksson (2008-2012)\n\n"); } // Check if run under Docker docker_client = detect_docker(); init_fuse_ops(); // Redirect FFmpeg logs av_log_set_callback(ffmpeg_log); // Set default params.m_max_threads = static_cast(get_nprocs() * 16); // Build list of supported device types build_device_type_list(); if (fuse_opt_parse(&args, ¶ms, ffmpegfs_opts, ffmpegfs_opt_proc)) { std::fprintf(stderr, "\nError parsing command line options.\n\n"); //usage(argv[0]); return 1; } // Expand cache path if (!params.m_cachepath.empty()) { expand_path(¶ms.m_cachepath, params.m_cachepath); append_sep(¶ms.m_cachepath); } // Log to the screen, and enable debug messages, if debug is enabled. if (params.m_debug) { params.m_log_stderr = 1; params.m_log_maxlevel = "DEBUG"; av_log_set_level(AV_LOG_INFO); // Do not use AV_LOG_DEBUG; AV_LOG_INFO is chatty enough } else { av_log_set_level(AV_LOG_QUIET); } if (!init_logging(params.m_logfile, params.m_log_maxlevel, params.m_log_stderr ? true : false, params.m_log_syslog ? true : false)) { std::fprintf(stderr, "ERROR: Failed to initialise logging module.\n"); std::fprintf(stderr, "Maybe log file couldn't be opened for writing?\n\n"); return 1; } if (params.m_prune_cache) { if (args.argc > 1) { std::fprintf(stderr, "INVALID PARAMETER: Invalid additional parameters for --prune_cache:\n"); for (int n = 1; n < args.argc; n++) { std::fprintf(stderr, "Invalid: '%s'\n", args.argv[n]); } return 1; } // Prune cache and exit if (!transcoder_init()) { return 1; } transcoder_cache_maintenance(); return 0; } if (params.m_basepath.empty()) { std::fprintf(stderr, "INVALID PARAMETER: No valid basepath specified.\n\n"); return 1; } if (params.m_basepath.front() != '/') { std::fprintf(stderr, "INVALID PARAMETER: basepath must be an absolute path.\n\n"); return 1; } struct stat stbuf; if (stat(params.m_basepath.c_str(), &stbuf) != 0 || !S_ISDIR(stbuf.st_mode)) { std::fprintf(stderr, "INVALID PARAMETER: basepath is not a valid directory: %s\n\n", params.m_basepath.c_str()); return 1; } if (params.m_mountpath.empty()) { std::fprintf(stderr, "INVALID PARAMETER: No valid mountpath specified.\n\n"); return 1; } if (params.m_mountpath.front() != '/') { std::fprintf(stderr, "INVALID PARAMETER: mountpath must be an absolute path.\n\n"); return 1; } if (stat(params.m_mountpath.c_str(), &stbuf) != 0 || !S_ISDIR(stbuf.st_mode)) { std::fprintf(stderr, "INVALID PARAMETER: mountpath is not a valid directory: %s\n\n", params.m_mountpath.c_str()); return 1; } // Check if sample format is supported for (const FFmpegfs_Format & fmt : ffmpeg_format) { if (fmt.filetype() != FILETYPE::UNKNOWN && !fmt.is_sample_fmt_supported()) { std::fprintf(stderr, "INVALID PARAMETER: %s does not support the sample format %s\n\n", fmt.desttype().c_str(), get_sampleformat_text(params.m_sample_fmt).c_str()); std::fprintf(stderr, "Supported formats: %s\n\n", fmt.sample_fmt_list().c_str()); return 1; } } // Check if audio or video codec is supported for (const FFmpegfs_Format & fmt : ffmpeg_format) { if (fmt.filetype() != FILETYPE::UNKNOWN) { if (params.m_audio_codec != AV_CODEC_ID_NONE && !fmt.is_audio_codec_supported(params.m_audio_codec)) { std::fprintf(stderr, "INVALID PARAMETER: %s does not support audio codec %s\n\n", fmt.desttype().c_str(), get_audio_codec_text(params.m_audio_codec).c_str()); std::fprintf(stderr, "Supported formats: %s\n\n", fmt.audio_codec_list().c_str()); return 1; } if (params.m_video_codec != AV_CODEC_ID_NONE && !fmt.is_video_codec_supported(params.m_video_codec)) { std::fprintf(stderr, "INVALID PARAMETER: %s does not support video codec %s\n\n", fmt.desttype().c_str(), get_video_codec_text(params.m_video_codec).c_str()); std::fprintf(stderr, "Supported formats: %s\n\n", fmt.video_codec_list().c_str()); return 1; } } } if (!set_defaults()) { return 1; } if (!transcoder_init()) { return 1; } print_params(); if (params.m_clear_cache) { // Prune cache and exit if (!transcoder_cache_clear()) { return 1; } } // start FUSE ret = fuse_main(args.argc, args.argv, &ffmpegfs_ops, nullptr); fuse_opt_free_args(&args); return ret; } ffmpegfs-2.18/src/dvdparser.h0000644000000000000000000000331715166175407013102 00000000000000/* * Copyright (C) 2018-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file dvdparser.h * @brief DVD parser * * This is only available if built with -DUSE_LIBDVD parameter. * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2018-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef DVDPARSER_H #define DVDPARSER_H #pragma once #ifdef USE_LIBDVD #include /** * @brief Get number of titles on DVD * @param[in] path - Path to check * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see0 * @return -errno or number or titles on DVD */ int check_dvd(const std::string & path, void *buf = nullptr, fuse_fill_dir_t filler = nullptr); #endif // USE_LIBDVD #endif // DVDPARSER_H ffmpegfs-2.18/src/blurayio.cc0000644000000000000000000001571315166175407013077 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ #ifdef USE_LIBBLURAY /** * @file blurayio.cc * @brief BlurayIO class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "blurayio.h" #include "logging.h" #include BlurayIO::BlurayIO() : m_bd(nullptr) , m_is_eof(false) , m_errno(0) , m_rest_size(0) , m_rest_pos(0) , m_cur_pos(0) , m_start_pos(0) , m_end_pos(AV_NOPTS_VALUE) , m_full_title(false) , m_title_idx(0) , m_chapter_idx(0) , m_angle_idx(0) , m_duration(AV_NOPTS_VALUE) { m_data.fill(0); } BlurayIO::~BlurayIO() { pvt_close(); } VIRTUALTYPE BlurayIO::type() const { return VIRTUALTYPE::BLURAY; } size_t BlurayIO::bufsize() const { return sizeof(m_data); } int BlurayIO::openio(LPVIRTUALFILE virtualfile) { uint32_t title_count; uint32_t chapter_end; BLURAY_TITLE_INFO *ti; set_virtualfile(virtualfile); if (virtualfile != nullptr) { m_full_title = virtualfile->m_full_title; m_title_idx = virtualfile->m_bluray.m_title_no - 1; m_chapter_idx = virtualfile->m_bluray.m_chapter_no - 1; m_angle_idx = virtualfile->m_bluray.m_angle_no - 1; m_duration = virtualfile->m_duration; } else { m_full_title = false; m_title_idx = 0; m_chapter_idx = 0; m_angle_idx = 0; m_duration = AV_NOPTS_VALUE; } chapter_end = m_chapter_idx + 1; Logging::debug(path(), "Opening input Blu-ray."); m_bd = bd_open(path().c_str(), nullptr); if (m_bd == nullptr) { Logging::error(path(), "Failed to open disc."); return 1; } title_count = bd_get_titles(m_bd, TITLES_RELEVANT, 0); if (title_count == 0) { Logging::error(path(), "There were no titles found."); return 1; } if (!bd_select_title(m_bd, m_title_idx)) { Logging::error(path(), "The Blu-ray title no. %1 could not be opened.", m_title_idx); return 1; } ti = bd_get_title_info(m_bd, m_title_idx, m_angle_idx); if (m_angle_idx >= ti->angle_count) { Logging::warning(path(), "The angle %1 is greater than the angle count %2. Using angle 1.", m_angle_idx + 1, ti->angle_count); m_angle_idx = 0; } bd_select_angle(m_bd, m_angle_idx); if (m_chapter_idx >= ti->chapter_count) { Logging::error(path(), "The first chapter %1 is greater than the chapter count %2.", m_chapter_idx + 1, ti->chapter_count); return 1; } if (chapter_end >= ti->chapter_count) { chapter_end = 0; } if (chapter_end > 0 && !m_full_title) { m_end_pos = bd_chapter_pos(m_bd, chapter_end) - 1; } else { m_end_pos = static_cast(bd_get_title_size(m_bd)); } if (m_full_title) { m_duration = static_cast(ti->duration * AV_TIME_BASE / 90000); } else { BLURAY_TITLE_CHAPTER *chapter = &ti->chapters[m_chapter_idx]; m_duration = static_cast(chapter->duration * AV_TIME_BASE / 90000); } bd_free_title_info(ti); m_start_pos = bd_seek_chapter(m_bd, m_chapter_idx); m_rest_size = 0; m_rest_pos = 0; return 0; } size_t BlurayIO::readio(void * data, size_t size) { size_t result_len = 0; if (m_rest_size) { result_len = m_rest_size; if (m_rest_size > size) { errno = EINVAL; return 0; } std::memcpy(data, &m_data[m_rest_pos], m_rest_size); m_rest_size = m_rest_pos = 0; return result_len; } m_cur_pos = static_cast(bd_tell(m_bd)); if (m_end_pos < 0 || m_cur_pos < m_end_pos) { int maxsize = sizeof(m_data); if (maxsize > (m_end_pos - m_cur_pos)) { maxsize = static_cast(m_end_pos - m_cur_pos); } int res = bd_read(m_bd, m_data.data(), maxsize); if (res < 0) { Logging::error(path(), "bd_read has failed."); return 0; } size_t bytes = static_cast(res); m_cur_pos = static_cast(bd_tell(m_bd)); if (bytes > size) { result_len = size; std::memcpy(data, m_data.data(), result_len); m_rest_size = bytes - size; m_rest_pos = size; } else { result_len = bytes; std::memcpy(data, m_data.data(), result_len); } } return result_len; } int BlurayIO::error() const { return m_errno; } int64_t BlurayIO::duration() const { return m_duration; } size_t BlurayIO::size() const { return static_cast(m_end_pos - m_start_pos); } size_t BlurayIO::tell() const { return static_cast(static_cast(bd_tell(m_bd)) - m_start_pos); } int BlurayIO::seek(int64_t offset, int whence) { int64_t seek_pos; switch (whence) { case SEEK_SET: { seek_pos = m_start_pos + offset; break; } case SEEK_CUR: { seek_pos = m_start_pos + offset + static_cast(bd_tell(m_bd)); break; } case SEEK_END: { seek_pos = m_end_pos + offset; break; } default: { errno = EINVAL; return (EOF); } } if (seek_pos > m_end_pos) { m_cur_pos = m_end_pos; // Cannot go beyond EOF. Set position to end, leave errno untouched. return 0; } if (seek_pos < 0) // Cannot go before head, set errno. { errno = EINVAL; return (EOF); } m_cur_pos = bd_seek(m_bd, static_cast(seek_pos)); return (m_cur_pos == seek_pos ? 0 : -1); } bool BlurayIO::eof() const { return (m_cur_pos >= m_end_pos); } void BlurayIO::closeio() { pvt_close(); } void BlurayIO::pvt_close() { BLURAY * bd = m_bd; if (bd != nullptr) { m_bd = nullptr; bd_close(bd); } } #endif // USE_LIBBLURAY ffmpegfs-2.18/src/dvdio.cc0000644000000000000000000006043215166175407012354 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ #ifdef USE_LIBDVD /** * @file dvdio.cc * @brief DvdIO class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "dvdio.h" #include "logging.h" #include #include #include DvdIO::DvdIO() : m_dvd(nullptr) , m_dvd_title(nullptr) , m_vmg_file(nullptr) , m_vts_file(nullptr) , m_cur_pgc(nullptr) , m_start_cell(0) , m_end_cell(0) , m_cur_cell(0) , m_next_cell(0) , m_goto_next_cell(false) , m_cur_block(0) , m_is_eof(false) , m_errno(0) , m_rest_size(0) , m_rest_pos(0) , m_cur_pos(0) , m_full_title(false) , m_title_idx(0) , m_chapter_idx(0) , m_angle_idx(0) , m_duration(AV_NOPTS_VALUE) , m_size(0) { std::memset(&m_data, 0, sizeof(m_data)); std::memset(&m_buffer, 0, sizeof(m_buffer)); } DvdIO::~DvdIO() { pvt_close(); } VIRTUALTYPE DvdIO::type() const { return VIRTUALTYPE::DVD; } size_t DvdIO::bufsize() const { return sizeof(m_data); } int DvdIO::openio(LPVIRTUALFILE virtualfile) { int pgc_id; int ttn; int pgn; tt_srpt_t *tt_srpt; vts_ptt_srpt_t *vts_ptt_srpt; set_virtualfile(virtualfile); if (virtualfile != nullptr) { m_full_title = virtualfile->m_full_title; m_title_idx = virtualfile->m_dvd.m_title_no - 1; m_chapter_idx = virtualfile->m_dvd.m_chapter_no - 1; m_angle_idx = virtualfile->m_dvd.m_angle_no - 1; m_duration = virtualfile->m_duration; } else { m_full_title = false; m_title_idx = 0; m_chapter_idx = 0; m_angle_idx = 0; m_duration = AV_NOPTS_VALUE; } Logging::debug(path(), "Opening the input DVD."); // Open the disc. m_dvd = DVDOpen(path().c_str()); if (m_dvd == nullptr) { Logging::error(path(), "Couldn't open the DVD."); return EINVAL; } // Load the video manager to find out the information about the titles on this disc. m_vmg_file = ifoOpen(m_dvd, 0); if (m_vmg_file == nullptr) { Logging::error(path(), "Can't open VMG info."); DVDClose(m_dvd); return EINVAL; } tt_srpt = m_vmg_file->tt_srpt; // Make sure our title number is valid. Logging::trace(path(), "There are %1 titles on this DVD.", static_cast(tt_srpt->nr_of_srpts)); if (m_title_idx < 0 || m_title_idx >= tt_srpt->nr_of_srpts) { Logging::error(path(), "Invalid title %1.", m_title_idx + 1); ifoClose(m_vmg_file); DVDClose(m_dvd); return EINVAL; } // Make sure the chapter number is valid for this title. Logging::trace(nullptr, "There are %1 chapters in this title.", static_cast(tt_srpt->title[m_title_idx].nr_of_ptts)); if (m_chapter_idx < 0 || m_chapter_idx >= tt_srpt->title[m_title_idx].nr_of_ptts) { Logging::error(path(), "Invalid chapter %1.", m_chapter_idx + 1); ifoClose(m_vmg_file); DVDClose(m_dvd); return EINVAL; } // Make sure the angle number is valid for this title. Logging::trace(path(), "There are %1 angles in this title.", tt_srpt->title[m_title_idx].nr_of_angles); if (m_angle_idx < 0 || m_angle_idx >= tt_srpt->title[m_title_idx].nr_of_angles) { Logging::error(nullptr, "Invalid angle %1.", m_angle_idx + 1); ifoClose(m_vmg_file); DVDClose(m_dvd); return EINVAL; } // Load the VTS information for the title set our title is in. m_vts_file = ifoOpen(m_dvd, tt_srpt->title[m_title_idx].title_set_nr); if (m_vts_file == nullptr) { Logging::error(path(), "Can't open the title %1 info file.", tt_srpt->title[m_title_idx].title_set_nr); ifoClose(m_vmg_file); DVDClose(m_dvd); return EINVAL; } // Determine which program chain we want to watch. This is based on the chapter number. ttn = tt_srpt->title[m_title_idx].vts_ttn; vts_ptt_srpt = m_vts_file->vts_ptt_srpt; pgc_id = vts_ptt_srpt->title[ttn - 1].ptt[m_chapter_idx].pgcn; pgn = vts_ptt_srpt->title[ttn - 1].ptt[m_chapter_idx].pgn; m_cur_pgc = m_vts_file->vts_pgcit->pgci_srp[pgc_id - 1].pgc; m_start_cell = m_cur_pgc->program_map[pgn - 1] - 1; if (pgn < m_cur_pgc->nr_of_programs) { m_end_cell = m_cur_pgc->program_map[pgn] - 1; } else { m_end_cell = m_cur_pgc->nr_of_cells; } // We've got enough info, time to open the title set data. m_dvd_title = DVDOpenFile(m_dvd, tt_srpt->title[m_title_idx].title_set_nr, DVD_READ_TITLE_VOBS); if (m_dvd_title == nullptr) { Logging::error(path(), "Can't open title VOBS (VTS_%<02d>1_X.VOB).", tt_srpt->title[m_title_idx].title_set_nr); ifoClose(m_vts_file); ifoClose(m_vmg_file); DVDClose(m_dvd); return EINVAL; } rewind(); // Determine the net file size m_size = 0; size_t bytes_read; while ((bytes_read = readio(nullptr, ULONG_MAX)) != 0 && !eof()) { m_size += bytes_read; } rewind(); return 0; } // Demux and cell navigation nicked from https://www.videolan.org/vlc/download-sources.html // More details see http://stnsoft.com/DVD/vobov.html #define PS_STREAM_ID_END_STREAM 0xB9 /**< @brief ??? */ #define PS_STREAM_ID_PACK_HEADER 0xBA /**< @brief MPEG-2 Pack Header */ #define PS_STREAM_ID_SYSTEM_HEADER 0xBB /**< @brief Program Stream System Header */ #define PS_STREAM_ID_MAP 0xBC /**< @brief ??? */ #define PS_STREAM_ID_PRIVATE_STREAM1 0xBD /**< @brief Private stream 1 (non MPEG audio, subpictures) */ #define PS_STREAM_ID_PADDING 0xBE /**< @brief Padding stream */ #define PS_STREAM_ID_PRIVATE 0xBF /**< @brief Private stream 2 (navigation data) */ #define PS_STREAM_ID_AUDIO 0xC0 /**< @brief - 0xDF MPEG-1 or MPEG-2 audio stream number (note: DVD allows only 8 audio streams) */ #define PS_STREAM_ID_VIDEO 0xE0 /**< @brief - 0xEF MPEG-1 or MPEG-2 video stream number (note: DVD allows only 1 video stream) */ #define PS_STREAM_ID_EXTENDED 0xFD /**< @brief ??? */ #define PS_STREAM_ID_DIRECTORY 0xFF /**< @brief ??? */ #define PS_STREAM_ID 3 /**< @brief ??? */ bool DvdIO::get_packet_size(const uint8_t *p, size_t peek, size_t *size) const { if (peek < 4) { return false; // Invalid size } switch (p[PS_STREAM_ID]) { case PS_STREAM_ID_END_STREAM: { *size = 4; return true; } case PS_STREAM_ID_PACK_HEADER: { // MPEG-2 pack header, see http://stnsoft.com/DVD/packhdr.html if (peek > 4) { if (peek >= 14 && (p[4] >> 6) == 0x01) { *size = 14 + static_cast(p[13] & 0x07); // Byte 13 Bit 0..2: Pack stuffing length return true; } else if (peek >= 12 && (p[4] >> 4) == 0x02) { *size = 12; // unclear what this is for return true; } } break; } case PS_STREAM_ID_SYSTEM_HEADER: // http://stnsoft.com/DVD/sys_hdr.html, see http://stnsoft.com/DVD/sys_hdr.html case PS_STREAM_ID_MAP: // ??? case PS_STREAM_ID_DIRECTORY: // ??? default: { if (peek >= 6) { *size = (6 + ((static_cast(p[4]) << 8) | p[5])); // Byte 4/5: header length return true; } break; } } return false; // unknown ID } int DvdIO::get_pes_id(const uint8_t *buffer, size_t size) const { if (buffer[PS_STREAM_ID] == PS_STREAM_ID_PRIVATE_STREAM1) { uint8_t sub_id = 0; if (size >= 9 && size >= static_cast(9 + buffer[8])) { const size_t start = static_cast(9 + buffer[8]); sub_id = buffer[start]; if ((sub_id & 0xfe) == 0xa0 && size >= start + 7 && (buffer[start + 5] >= 0xc0 || buffer[start + 6] != 0x80)) { // AOB LPCM/MLP extension // XXX for MLP I think that the !=0x80 test is not good and // will fail for some valid files return (0xa000 | (sub_id & 0x01)); } } // VOB extension return (0xbd00 | sub_id); } else if (buffer[PS_STREAM_ID] == PS_STREAM_ID_EXTENDED && size >= 9 && (buffer[6] & 0xC0) == 0x80 && // mpeg2 (buffer[7] & 0x01) == 0x01) // extension_flag { // ISO 13818 amendment 2 and SMPTE RP 227 const uint8_t flags = buffer[7]; size_t skip = 9; // Find PES extension if ((flags & 0x80)) { skip += 5; // pts if ((flags & 0x40)) { skip += 5; // dts } } if ((flags & 0x20)) { skip += 6; } if ((flags & 0x10)) { skip += 3; } if ((flags & 0x08)) { skip += 1; } if ((flags & 0x04)) { skip += 1; } if ((flags & 0x02)) { skip += 2; } if (skip < size && (buffer[skip] & 0x01)) { const uint8_t flags2 = buffer[skip]; // Find PES extension 2 skip += 1; if (flags2 & 0x80) { skip += 16; } if ((flags2 & 0x40) && skip < size) { skip += static_cast(1 + buffer[skip]); } if (flags2 & 0x20) { skip += 2; } if (flags2 & 0x10) { skip += 2; } if (skip + 1 < size) { const int i_extension_field_length = buffer[skip] & 0x7f; if (i_extension_field_length >=1) { int i_stream_id_extension_flag = (buffer[skip+1] >> 7) & 0x1; if (i_stream_id_extension_flag == 0) { return (0xfd00 | (buffer[skip+1] & 0x7f)); } } } } } return buffer[PS_STREAM_ID]; } size_t DvdIO::demux_pes(uint8_t *out, const uint8_t *in, size_t len) const { size_t netsize = 0; while (len > 0) { size_t pktsize = 0; if (!get_packet_size(in, len, &pktsize) || pktsize > len) { break; } // Parse block and copy to buffer switch (0x100 | in[PS_STREAM_ID]) { // Ignore thesse... case (0x100 | PS_STREAM_ID_END_STREAM): case (0x100 | PS_STREAM_ID_SYSTEM_HEADER): case (0x100 | PS_STREAM_ID_MAP): { break; } case (0x100 | PS_STREAM_ID_PACK_HEADER): // MPEG-2 Pack Header { std::memcpy(out, in, pktsize); out += pktsize; netsize += pktsize; break; } default: { int id = get_pes_id(in, pktsize); if (id >= PS_STREAM_ID_AUDIO) // Audio/Video/Extended or Directory { // Probably this is sufficient here: // 110x xxxx 0xC0 - 0xDF MPEG-1 or MPEG-2 audio stream number x xxxx // 1110 xxxx 0xE0 - 0xEF MPEG-1 or MPEG-2 video stream number xxxx std::memcpy(out, in, pktsize); out += pktsize; netsize += pktsize; } break; } } in += pktsize; len -= pktsize; } return netsize; } DvdIO::DSITYPE DvdIO::handle_DSI(void *_dsi_pack, size_t * cur_output_size, unsigned int *next_block, uint8_t *data) { dsi_t * dsi_pack = reinterpret_cast(_dsi_pack); DSITYPE dsitype = DSITYPE::CONTINUE; bool end_of_cell; navRead_DSI(dsi_pack, &data[DSI_START_BYTE]); // Determine where we go next. These values are the ones we mostly // care about. m_cur_block = dsi_pack->dsi_gi.nv_pck_lbn; *cur_output_size = dsi_pack->dsi_gi.vobu_ea; // If we're not at the end of this cell, we can determine the next // VOBU to display using the VOBU_SRI information section of the // DSI. Using this value correctly follows the current angle, // avoiding the doubled scenes in The Matrix, and makes our life // really happy. *next_block = m_cur_block + (dsi_pack->vobu_sri.next_vobu & 0x7fffffff); end_of_cell = (dsi_pack->vobu_sri.next_vobu == SRI_END_OF_CELL || *next_block >= m_cur_pgc->cell_playback[m_cur_cell].last_sector); // Double check end of cell: DVD transcoding stops in the middle of the chapter #48 if (!end_of_cell && m_angle_idx > 1) { switch ((dsi_pack->sml_pbi.category & 0xf000) >> 12) { case 0x4: { // Interleaved unit with no angle // dsi_pack->sml_pbi.ilvu_sa // relative offset to the next ILVU block (not VOBU) for this angle or scene. // 00 00 00 00 for PREU and non-interleaved blocks // ff ff ff ff for the last interleaved block, indicating the end of interleaving if (dsi_pack->sml_pbi.ilvu_sa != 0 && dsi_pack->sml_pbi.ilvu_sa != 0xffffffff) { *next_block = m_cur_block + dsi_pack->sml_pbi.ilvu_sa; *cur_output_size = dsi_pack->sml_pbi.ilvu_ea; } else { *next_block = m_cur_block + dsi_pack->dsi_gi.vobu_ea + 1; } break; } case 0x5: { // vobu is end of ilvu if (dsi_pack->sml_agli.data[m_angle_idx].address) { *next_block = m_cur_block + dsi_pack->sml_agli.data[m_angle_idx].address; *cur_output_size = dsi_pack->sml_pbi.ilvu_ea; break; } } // fall through case 0x6: // vobu is beginning of ilvu case 0x9: // next scr is 0 case 0xa: // entering interleaved section case 0x8: // non interleaved cells in interleaved section default: { *next_block = m_cur_block + (dsi_pack->vobu_sri.next_vobu & 0x7fffffff); break; } } } else if (end_of_cell) { if (m_next_cell >= m_cur_pgc->nr_of_cells) { *next_block = 0; dsitype = DSITYPE::EOF_TITLE; } else { m_cur_cell = m_next_cell; next_cell(); if (m_cur_cell >= m_end_cell) { dsitype = DSITYPE::EOF_CHAPTER; } *next_block = m_cur_pgc->cell_playback[m_cur_cell].first_sector; } } return dsitype; } void DvdIO::next_cell() { // Check if we're entering an angle block if (m_cur_pgc->cell_playback[m_cur_cell].block_type == static_cast(BLOCK_TYPE_ANGLE_BLOCK)) { m_cur_cell += m_angle_idx; for (int i = 0;; ++i) { if (m_cur_pgc->cell_playback[m_cur_cell + i].block_mode == static_cast(BLOCK_MODE_LAST_CELL)) { m_next_cell = m_cur_cell + i + 1; break; } } } else { m_next_cell = m_cur_cell + 1; } } size_t DvdIO::readio(void * data, size_t size) { size_t cur_output_size; size_t result_len = 0; DSITYPE dsitype; if (m_rest_size) { size_t rest_size = m_rest_size; if (m_rest_size > size) { errno = EINVAL; return 0; } if (data != nullptr) { std::memcpy(data, &m_data[m_rest_pos], rest_size); } m_rest_size = m_rest_pos = 0; return rest_size; } // Playback by cell in this pgc, starting at the cell for our chapter. //while (next_cell < last_cell) { if (m_goto_next_cell) { m_goto_next_cell = false; m_cur_cell = m_next_cell; next_cell(); m_cur_block = m_cur_pgc->cell_playback[m_cur_cell].first_sector; } if (m_cur_block >= m_cur_pgc->cell_playback[m_cur_cell].last_sector) { m_is_eof = false; return 0; } // We loop until we're out of this cell. //for(cur_pack = cur_pgc->cell_playback[cur_cell].first_sector; // cur_pack < cur_pgc->cell_playback[cur_cell].last_sector;) { dsi_t dsi_pack; unsigned int next_block; ssize_t maxlen; // Read NAV packet. maxlen = DVDReadBlocks(m_dvd_title, static_cast(m_cur_block), 1, m_buffer.data()); if (maxlen != 1) { Logging::error(path(), "Read failed for block at %1.", m_cur_block); m_errno = EIO; return 0; } if (!is_nav_pack(m_buffer.data())) { Logging::warning(path(), "Block at %1 is probably not a NAV packet. Transcode may fail.", m_cur_block); } // Parse the contained dsi packet. dsitype = handle_DSI(&dsi_pack, &cur_output_size, &next_block, m_buffer.data()); if (m_cur_block != dsi_pack.dsi_gi.nv_pck_lbn) { Logging::error(path(), "Read failed at %1 because current block != dsi_pack.dsi_gi.nv_pck_lbn.", m_cur_block); m_errno = EIO; return 0; } if (cur_output_size >= 1024) { Logging::error(path(), "Read failed at %1 because current output size %2 >= 1024.", m_cur_block, cur_output_size); m_errno = EIO; return 0; } m_cur_block++; // Read in and output cur_output_size packs. maxlen = DVDReadBlocks(m_dvd_title, static_cast(m_cur_block), cur_output_size, m_buffer.data()); if (maxlen != static_cast(cur_output_size)) { Logging::error(path(), "Read failed for %1 blocks at %2.", cur_output_size, m_cur_block); m_errno = EIO; return 0; } size_t netsize = cur_output_size * DVD_VIDEO_LB_LEN; netsize = demux_pes(m_data.data(), m_buffer.data(), netsize); if (data != nullptr) { if (netsize > size) { result_len = size; std::memcpy(data, m_data.data(), result_len); m_rest_size = netsize - size; m_rest_pos = size; } else { result_len = netsize; std::memcpy(data, m_data.data(), result_len); } } else { if (netsize > size) { result_len = size; } else { result_len = netsize; } } m_cur_block = next_block; } //break; } // DSITYPE::EOF_TITLE - end of title // DSITYPE::EOF_CHAPTER - end of chapter if ((dsitype != DSITYPE::CONTINUE && !m_full_title) || // Stop at end of chapter/title (dsitype == DSITYPE::EOF_TITLE)) // Stop at end of title { m_is_eof = true; } m_cur_pos += result_len; return result_len; } int DvdIO::error() const { return m_errno; } int64_t DvdIO::duration() const { return m_duration; } size_t DvdIO::size() const { return m_size; } size_t DvdIO::tell() const { return m_cur_pos; } void DvdIO::rewind() { m_next_cell = m_start_cell; m_cur_cell = m_start_cell; m_goto_next_cell = true; m_is_eof = false; m_errno = 0; m_rest_size = 0; m_rest_pos = 0; m_cur_pos = 0; } int DvdIO::seek(int64_t offset, int whence) { errno = 0; if (whence == SEEK_SET && !offset) { // Only rewind (seek(0, SEEK_SET) is implemented yet rewind(); return 0; } size_t cur_pos = tell(); size_t abs_offset = 0; switch (whence) { case SEEK_SET: abs_offset = static_cast(offset); break; case SEEK_CUR: abs_offset += cur_pos; break; case SEEK_END: abs_offset = size() - abs_offset; break; default: errno = EINVAL; return (EOF); } if (cur_pos == abs_offset) { // Already at right position return static_cast(abs_offset); } if (cur_pos > abs_offset) { // Need to start from beginning to find byte position rewind(); cur_pos = 0; } size_t total_read = 0; size_t bytes_read; while ((bytes_read = readio(nullptr, abs_offset - total_read - cur_pos)) != 0 && total_read < abs_offset && !eof()) { total_read += bytes_read; } if (total_read) { return static_cast(cur_pos + total_read); } errno = EPERM; return (EOF); } bool DvdIO::eof() const { return m_is_eof; } void DvdIO::closeio() { pvt_close(); } void DvdIO::pvt_close() { ifo_handle_t * vts_file = m_vts_file; if (vts_file != nullptr) { m_vts_file = nullptr; ifoClose(vts_file); } ifo_handle_t * vmg_file = m_vmg_file; if (vmg_file != nullptr) { m_vmg_file = nullptr; ifoClose(vmg_file); } dvd_file_t * dvd_title = m_dvd_title; if (dvd_title != nullptr) { m_dvd_title = nullptr; DVDCloseFile(dvd_title); } dvd_reader_t * dvd = m_dvd; if (dvd != nullptr) { m_dvd = nullptr; DVDClose(dvd); } } // Code nicked from Handbrake (https://github.com/HandBrake/HandBrake/blob/master/libhb/dvd.c) bool DvdIO::is_nav_pack(const unsigned char *buffer) const { /* * The NAV Pack is comprised of the PCI Packet and DSI Packet, both * of these start at known offsets and start with a special identifier. * * NAV = { * PCI = { 00 00 01 bf # private stream header * ?? ?? # length * 00 # substream * ... * } * DSI = { 00 00 01 bf # private stream header * ?? ?? # length * 01 # substream * ... * } * * The PCI starts at offset 0x26 into the sector, and the DSI starts at 0x400 * * This information from: http://dvd.sourceforge.net/dvdinfo/ */ if ((buffer[0x26] == 0x00 && // PCI buffer[0x27] == 0x00 && buffer[0x28] == 0x01 && buffer[0x29] == 0xbf && buffer[0x2c] == 0x00) && (buffer[0x400] == 0x00 && // DSI buffer[0x401] == 0x00 && buffer[0x402] == 0x01 && buffer[0x403] == 0xbf && buffer[0x406] == 0x01)) { return true; } else { return false; } } #endif // USE_LIBDVD ffmpegfs-2.18/src/ffmpeg_subtitle.h0000644000000000000000000000602715166175407014270 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_subtitle.h * @brief FFmpeg AVSubtitle extension * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef FFMPEG_SUBTITLE_H #define FFMPEG_SUBTITLE_H #pragma once #include "ffmpeg_utils.h" #include struct AVSubtitle; /** * @brief The #FFmpeg_Subtitle class */ class FFmpeg_Subtitle : public std::shared_ptr { public: /** * @brief Construct FFmpeg_Subtitle object. * @param[in] stream_index - Index of stream */ explicit FFmpeg_Subtitle(int stream_index = INVALID_STREAM); /** * @brief Destruct FFmpeg_Subtitle object. */ virtual ~FFmpeg_Subtitle() = default; /** * @brief Get result of last operation * @return Returns 0 if last operation was successful, or negative AVERROR value. */ int res() const; /** * @brief Unreference underlying frame. Synonym for shared_ptr::reset(). */ void unref() noexcept; /** * @brief operator AVSubtitle *: Do as if we were a pointer to AVSubtitle */ operator AVSubtitle*(); /** * @brief operator const AVSubtitle *: Do as if we were a const pointer to AVSubtitle */ operator const AVSubtitle*() const; /** * @brief operator ->: Do as if we were a pointer to AVSubtitle * @return Pointer to AVSubtitle struct. */ AVSubtitle* operator->(); protected: /** * @brief Allocate a subtitle * @return Returns a newly allocated AVSubtitle field, or nullptr if out of memory. */ AVSubtitle* alloc_subtitle(); /** * @brief Delete a subtitle * @param[in] subtitle - AVSubtitle structure to delete/free. */ static void delete_subtitle(AVSubtitle *subtitle); protected: int m_res; /**< @brief 0 if last operation was successful, or negative AVERROR value */ public: int m_stream_idx; /**< @brief Stream index frame belongs to, or -1 (INVALID_STREAM) */ }; #endif // FFMPEG_SUBTITLE_H ffmpegfs-2.18/src/ffmpeg_base.cc0000644000000000000000000004322415166175407013505 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_base.cc * @brief FFmpeg_Base class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifdef __cplusplus extern "C" { #endif // Disable annoying warnings outside our code #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #include #include #include #include #include #pragma GCC diagnostic pop #ifdef __cplusplus } #endif #include "ffmpeg_base.h" #include "logging.h" FFmpeg_Base::FFmpeg_Base() : m_virtualfile(nullptr) { } #if !LAVC_DEP_AV_INIT_PACKET void FFmpeg_Base::init_packet(AVPacket *pkt) const { av_init_packet(pkt); // Set the packet data and size so that it is recognised as being empty. pkt->data = nullptr; pkt->size = 0; } #endif // !LAVC_DEP_AV_INIT_PACKET void FFmpeg_Base::video_stream_setup(AVCodecContext *output_codec_ctx, AVStream* output_stream, AVCodecContext *input_codec_ctx, AVRational framerate, AVPixelFormat enc_hw_pix_fmt) const { AVRational time_base_tbn; AVRational time_base_tbc; if (!framerate.num || !framerate.den) { framerate.num = 25; framerate.den = 1; Logging::warning(nullptr, "No information about the input framerate is available. Falling back to a default value of 25fps for the output stream."); } // timebase: This is the fundamental unit of time (in seconds) in terms // of which frame timestamps are represented. For fixed-fps content, // timebase should be 1/framerate and timestamp increments should be // identical to 1. //time_base = m_in.m_pVideo_stream->time_base; // tbn: must be set differently for the target format. Otherwise produces strange results. switch (output_codec_ctx->codec_id) { case AV_CODEC_ID_THEORA: // ogg case AV_CODEC_ID_MPEG1VIDEO: case AV_CODEC_ID_MPEG2VIDEO: { time_base_tbn = av_inv_q(framerate); time_base_tbc = time_base_tbn; break; } case AV_CODEC_ID_VP9: // webm { time_base_tbn.num = 1; time_base_tbn.den = 1000; time_base_tbc = time_base_tbn; break; } case AV_CODEC_ID_H264: // h264 case AV_CODEC_ID_H265: // h265 { time_base_tbn.num = 1; time_base_tbn.den = 90000; time_base_tbc = av_inv_q(framerate); break; } default: // mp4 and all others { time_base_tbn.num = 1; time_base_tbn.den = 90000; time_base_tbc = time_base_tbn; break; } } // tbn output_stream->time_base = time_base_tbn; // tbc output_codec_ctx->time_base = time_base_tbc; // tbr // output_stream->r_frame_rate = m_in.m_pVideo_stream->r_frame_rate; output_stream->r_frame_rate = framerate; // fps output_stream->avg_frame_rate = framerate; // output_codec_ctx->framerate = framerate; if (enc_hw_pix_fmt == AV_PIX_FMT_NONE) { // Automatic pix_fmt selection int loss = 0; AVPixelFormat src_pix_fmt = input_codec_ctx->pix_fmt; #if LAVC_USE_SUPPORTED_CFG { const enum AVPixelFormat *pix_list = nullptr; int npix = 0; int ret_cfg = avcodec_get_supported_config(output_codec_ctx, output_codec_ctx->codec, AV_CODEC_CONFIG_PIX_FORMAT, 0, (const void**)&pix_list, &npix); if (ret_cfg >= 0 && pix_list && npix > 0) { int alpha = 0; enc_hw_pix_fmt = avcodec_find_best_pix_fmt_of_list(pix_list, src_pix_fmt, alpha, &loss); } } #else if (output_codec_ctx->codec->pix_fmts != nullptr) { int alpha = 0; enc_hw_pix_fmt = avcodec_find_best_pix_fmt_of_list(output_codec_ctx->codec->pix_fmts, src_pix_fmt, alpha, &loss); } #endif if (enc_hw_pix_fmt == AV_PIX_FMT_NONE) { // Fail safe if avcodec_find_best_pix_fmt_of_list has no idea what to use. switch (output_codec_ctx->codec_id) { case AV_CODEC_ID_PRORES: // mov/prores { // yuva444p10le // ProRes 4:4:4 if the source is RGB and ProRes 4:2:2 if the source is YUV. enc_hw_pix_fmt = AV_PIX_FMT_YUV422P10LE; break; } default: // all others { // At this moment the output format must be AV_PIX_FMT_YUV420P; enc_hw_pix_fmt = AV_PIX_FMT_YUV420P; break; } } } } output_codec_ctx->pix_fmt = enc_hw_pix_fmt; output_codec_ctx->gop_size = 12; // emit one intra frame every twelve frames at most } int FFmpeg_Base::dict_set_with_check(AVDictionary **pm, const char *key, const char *value, int flags, const char * filename, bool nodelete) const { if (nodelete && !*value) { return 0; } int ret = av_dict_set(pm, key, value, flags); if (ret < 0) { Logging::error(filename, "Error setting dictionary option key(%1)='%2' (error '%3').", key, value, ffmpeg_geterror(ret).c_str()); } return ret; } int FFmpeg_Base::dict_set_with_check(AVDictionary **pm, const char *key, int64_t value, int flags, const char * filename, bool nodelete) const { if (nodelete && !value) { return 0; } int ret = av_dict_set_int(pm, key, value, flags); if (ret < 0) { Logging::error(filename, "Error setting dictionary option key(%1)='%2' (error '%3').", key, value, ffmpeg_geterror(ret).c_str()); } return ret; } int FFmpeg_Base::opt_set_with_check(void *obj, const char *key, const char *value, int flags, const char * filename) const { int ret = av_opt_set(obj, key, value, flags); if (ret < 0) { Logging::error(filename, "Error setting dictionary option key(%1)='%2' (error '%3').", key, value, ffmpeg_geterror(ret).c_str()); } return ret; } void FFmpeg_Base::video_info(bool out_file, const AVFormatContext *format_ctx, const AVStream *stream) const { if (stream != nullptr && stream->codecpar != nullptr) { int64_t duration = AV_NOPTS_VALUE; if (stream->duration != AV_NOPTS_VALUE) { duration = ffmpeg_rescale_q_rnd(stream->duration, stream->time_base); } Logging::debug(out_file ? virtname() : filename(), "Video %1 #%2: %3@%4 [%5]", out_file ? "out" : "in", stream->index, get_codec_name(stream->codecpar->codec_id), format_bitrate((stream->codecpar->bit_rate != 0) ? stream->codecpar->bit_rate : format_ctx->bit_rate).c_str(), format_duration(duration).c_str()); } else { Logging::debug(out_file ? virtname() : filename(), "Video %1: invalid stream", out_file ? "out" : "in"); } } void FFmpeg_Base::audio_info(bool out_file, const AVFormatContext *format_ctx, const AVStream *stream) const { if (stream != nullptr && stream->codecpar != nullptr) { int64_t duration = AV_NOPTS_VALUE; if (stream->duration != AV_NOPTS_VALUE) { duration = ffmpeg_rescale_q_rnd(stream->duration, stream->time_base); } Logging::debug(out_file ? virtname() : filename(), "Audio %1 #2: %3@%4 %5 Channels %6 [%7]", out_file ? "out" : "in", stream->index, get_codec_name(stream->codecpar->codec_id), format_bitrate((stream->codecpar->bit_rate != 0) ? stream->codecpar->bit_rate : format_ctx->bit_rate).c_str(), get_channels(stream->codecpar), format_samplerate(stream->codecpar->sample_rate).c_str(), format_duration(duration).c_str()); } else { Logging::debug(out_file ? virtname() : filename(), "Audio %1: invalid stream", out_file ? "out" : "in"); } } void FFmpeg_Base::subtitle_info(bool out_file, const AVFormatContext * /*format_ctx*/, const AVStream *stream) const { if (stream != nullptr && stream->codecpar != nullptr) { Logging::debug(out_file ? virtname() : filename(), "Subtitle %1 #%2: %3", out_file ? "out" : "in", stream->index, get_codec_name(stream->codecpar->codec_id)); } else { Logging::debug(out_file ? virtname() : filename(), "Subtitle %1: invalid stream", out_file ? "out" : "in"); } } std::string FFmpeg_Base::get_pix_fmt_name(enum AVPixelFormat pix_fmt) { const char *fmt_name = av_get_pix_fmt_name(pix_fmt); return (fmt_name != nullptr ? fmt_name : "none"); } std::string FFmpeg_Base::get_sample_fmt_name(AVSampleFormat sample_fmt) { return av_get_sample_fmt_name(sample_fmt); } #if LAVU_DEP_OLD_CHANNEL_LAYOUT std::string FFmpeg_Base::get_channel_layout_name(const AVChannelLayout * ch_layout) { std::array buffer; av_channel_layout_describe(ch_layout, buffer.data(), buffer.size() - 1); return buffer.data(); } #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT std::string FFmpeg_Base::get_channel_layout_name(int nb_channels, uint64_t channel_layout) { std::array buffer; av_get_channel_layout_string(buffer.data(), buffer.size() - 1, nb_channels, channel_layout); return buffer.data(); } #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT uint32_t FFmpeg_Base::pts_to_frame(AVStream* stream, int64_t pts) const { if (pts == AV_NOPTS_VALUE) { return 0; } int64_t start_time = (stream->start_time != AV_NOPTS_VALUE) ? stream->start_time : 0; AVRational factor = av_mul_q(stream->avg_frame_rate, stream->time_base); return static_cast(av_rescale(pts - start_time, factor.num, factor.den) + 1); } int64_t FFmpeg_Base::frame_to_pts(AVStream* stream, uint32_t frame_no) const { int64_t start_time = (stream->start_time != AV_NOPTS_VALUE) ? stream->start_time : 0; AVRational factor = av_mul_q(stream->avg_frame_rate, stream->time_base); return static_cast(av_rescale(frame_no - 1, factor.den, factor.num) + start_time); } int FFmpeg_Base::get_channels(const AVCodecParameters *codecpar) const { #if LAVU_DEP_OLD_CHANNEL_LAYOUT return codecpar->ch_layout.nb_channels; #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT return codecpar->channels; #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT } void FFmpeg_Base::set_channels(AVCodecParameters *codecpar_out, const AVCodecParameters *codecpar_in) const { #if LAVU_DEP_OLD_CHANNEL_LAYOUT codecpar_out->ch_layout.nb_channels = codecpar_in->ch_layout.nb_channels; #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT codecpar_out->channels = codecpar_in->channels; #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT } int FFmpeg_Base::get_channels(const AVCodecContext *codec_ctx) const { #if LAVU_DEP_OLD_CHANNEL_LAYOUT return codec_ctx->ch_layout.nb_channels; #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT return codec_ctx->channels; #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT } void FFmpeg_Base::set_channels(AVCodecContext *codec_ctx_out, const AVCodecContext *codec_ctx_in) const { #if LAVU_DEP_OLD_CHANNEL_LAYOUT codec_ctx_out->ch_layout.nb_channels= codec_ctx_in->ch_layout.nb_channels; #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT codec_ctx_out->channels = codec_ctx_in->channels; #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT } void FFmpeg_Base::set_channels(AVCodecContext *codec_ctx_out, int channels) const { #if LAVU_DEP_OLD_CHANNEL_LAYOUT codec_ctx_out->ch_layout.nb_channels = channels; #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT codec_ctx_out->channels = channels; #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT } // See... // // https://en.wikipedia.org/wiki/SubStation_Alpha // https://datatracker.ietf.org/doc/html/draft-ietf-cellar-codec-02 // https://fileformats.fandom.com/wiki/SubStation_Alpha int FFmpeg_Base::get_script_info(AVCodecContext *codec_ctx, int play_res_x, int play_res_y, const char *font, int font_size, int primary_color, int secondary_color, int outline_color, int back_color, int bold, int italic, int underline, int border_style, int alignment) const { const char *format = "[Script Info]\r\n" // "; Script generated by ffmpegfs " FFMPEFS_VERSION "\r\n" // "; https://github.com/nschlia/ffmpegfs\r\n" // "ScriptType: v4.00+\r\n" // "PlayResX: %d\r\n" // "PlayResY: %d\r\n" // "ScaledBorderAndShadow: yes\r\n" // // Some other tags... //"Title: NAME (Language)\r\n" // //"Original Script: ???\r\n" // //"Script Updated By: version 2.8.01\r\n" // //"Collisions: Normal\r\n" // //"PlayDepth: 0\r\n" // //"Timer: 100,0000\r\n" // //"Video Aspect Ratio: 0\r\n" // //"Video Zoom: 6\r\n" // //"Video Position: 0\r\n" // "\r\n" // "[V4+ Styles]\r\n" // "Format: " // "Name, " // "Fontname, Fontsize, " // "PrimaryColour, SecondaryColour, OutlineColour, BackColour, " // "Bold, Italic, Underline, StrikeOut, " // "ScaleX, ScaleY, " // "Spacing, Angle, " // "BorderStyle, Outline, Shadow, " // "Alignment, MarginL, MarginR, MarginV, " // "Encoding\r\n" // "Style: " // "Default," // Name "%s,%d," // Font{name,size} "&H%x,&H%x,&H%x,&H%x," // {Primary,Secondary,Outline,Back}Colour "%d,%d,%d,0," // Bold, Italic, Underline, StrikeOut "100,100," // Scale{X,Y} "0,0," // Spacing, Angle "%d,1,0," // BorderStyle, Outline, Shadow "%d,10,10,10," // Alignment, Margin[LRV] "0\r\n" // Encoding "\r\n" // "[Events]\r\n" // "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n"; size_t size = static_cast(snprintf(nullptr, 0, format, play_res_x, play_res_y, font, font_size, primary_color, secondary_color, outline_color, back_color, -bold, -italic, -underline, border_style, alignment)) + 1; // Extra space for '\0' codec_ctx->subtitle_header = reinterpret_cast(av_malloc(size + 1)); if (codec_ctx->subtitle_header == nullptr) { return AVERROR(ENOMEM); } snprintf(reinterpret_cast(codec_ctx->subtitle_header), size, format, play_res_x, play_res_y, font, font_size, primary_color, secondary_color, outline_color, back_color, -bold, -italic, -underline, border_style, alignment); codec_ctx->subtitle_header_size = static_cast(size); return 0; } ffmpegfs-2.18/src/vcdio.cc0000644000000000000000000001116215166175407012347 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ #ifdef USE_LIBVCD /** * @file vcdio.cc * @brief VcdIO class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "vcdio.h" #include "vcd/vcdutils.h" #include "logging.h" VcdIO::VcdIO() : m_fpi(nullptr) , m_full_title(false) , m_track_no(0) , m_chapter_no(0) , m_start_pos(0) , m_end_pos(0) { } VcdIO::~VcdIO() { pvt_close(); } VIRTUALTYPE VcdIO::type() const { return VIRTUALTYPE::VCD; } size_t VcdIO::bufsize() const { return (32 * 1024); } int VcdIO::openio(LPVIRTUALFILE virtualfile) { std::string src_filename; set_virtualfile(virtualfile); if (virtualfile != nullptr) { m_full_title = virtualfile->m_full_title; m_track_no = virtualfile->m_vcd.m_track_no; m_chapter_no = virtualfile->m_vcd.m_chapter_no; m_start_pos = virtualfile->m_vcd.m_start_pos; m_end_pos = virtualfile->m_vcd.m_end_pos; } else { m_full_title = false; m_track_no = 1; m_chapter_no = 0; m_start_pos = 0; m_end_pos = size(); } VCDUTILS::locate_video(path(), m_track_no, src_filename); Logging::info(src_filename.c_str(), "Opening the input VCD."); m_fpi = fopen(src_filename.c_str(), "rb"); if (m_fpi == nullptr) { return errno; } return seek(0, SEEK_SET); } size_t VcdIO::readio(void * data, size_t size) { if (static_cast(ftell(m_fpi)) + size > m_end_pos) { size = static_cast(m_end_pos - static_cast(ftell(m_fpi))); } if (!size) { return 0; } return fread(data, 1, size, m_fpi); } int VcdIO::error() const { return ferror(m_fpi); } int64_t VcdIO::duration() const { return AV_NOPTS_VALUE; } size_t VcdIO::size() const { if (m_fpi == nullptr) { errno = EINVAL; return 0; } if (m_end_pos) { return static_cast(m_end_pos - m_start_pos); } struct stat stbuf; fstat(fileno(m_fpi), &stbuf); return static_cast(stbuf.st_size); } size_t VcdIO::tell() const { return static_cast(static_cast(ftell(m_fpi)) - m_start_pos); } int VcdIO::seek(int64_t offset, int whence) { off_t seek_pos; switch (whence) { case SEEK_SET: { seek_pos = static_cast(m_start_pos) + offset; break; } case SEEK_CUR: { seek_pos = static_cast(m_start_pos) + ftell(m_fpi) + offset; break; } case SEEK_END: { seek_pos = static_cast(m_end_pos) - offset; break; } default: { errno = EINVAL; return (EOF); } } if (static_cast(seek_pos) > m_end_pos) { seek_pos = static_cast(m_end_pos); // Cannot go beyond EOF. Set position to end, leave errno untouched. } if (static_cast(seek_pos) < m_start_pos) // Cannot go before head, leave position untouched, set errno. { errno = EINVAL; return (EOF); } return fseek(m_fpi, static_cast(seek_pos), SEEK_SET); } bool VcdIO::eof() const { return ((feof(m_fpi) || (static_cast(ftell(m_fpi)) >= m_end_pos)) ? true : false); } void VcdIO::closeio() { pvt_close(); } void VcdIO::pvt_close() { FILE *fpi = m_fpi; if (fpi != nullptr) { m_fpi = nullptr; fclose(fpi); } } #endif // USE_LIBVCD ffmpegfs-2.18/src/diskio.cc0000644000000000000000000000515315166175407012530 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file diskio.cc * @brief DiskIO class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "diskio.h" #include "logging.h" #include DiskIO::DiskIO() : m_fpi(nullptr) { } DiskIO::~DiskIO() { pvt_close(); } VIRTUALTYPE DiskIO::type() const { return VIRTUALTYPE::DISK; } size_t DiskIO::bufsize() const { return (100 /* KB */ * 1024); } int DiskIO::openio(LPVIRTUALFILE virtualfile) { set_virtualfile(virtualfile); Logging::debug(virtualfile->m_origfile, "Opening the input file."); m_fpi = fopen(virtualfile->m_origfile.c_str(), "rb"); if (m_fpi != nullptr) { return 0; } else { return errno; } } size_t DiskIO::readio(void * data, size_t size) { return fread(data, 1, size, m_fpi); } int DiskIO::error() const { return ferror(m_fpi); } int64_t DiskIO::duration() const { return AV_NOPTS_VALUE; // not applicable } size_t DiskIO::size() const { if (m_fpi == nullptr) { errno = EINVAL; return 0; } struct stat stbuf; fstat(fileno(m_fpi), &stbuf); return static_cast(stbuf.st_size); } size_t DiskIO::tell() const { return static_cast(ftell(m_fpi)); } int DiskIO::seek(int64_t offset, int whence) { return fseek(m_fpi, static_cast(offset), whence); } bool DiskIO::eof() const { return feof(m_fpi) ? true : false; } void DiskIO::closeio() { pvt_close(); } void DiskIO::pvt_close() { FILE *fpi = m_fpi; if (fpi != nullptr) { m_fpi = nullptr; fclose(fpi); } } ffmpegfs-2.18/src/config.h.in0000644000000000000000000001007715166201703012750 00000000000000/* src/config.h.in. Generated from configure.ac by autoheader. */ /* Arguments passed to configure */ #undef CONFIGURE_ARGS /* format string for pthread_t */ #undef FFMPEGFS_FORMAT_PTHREAD_T /* format string for time_t */ #undef FFMPEGFS_FORMAT_TIME_T /* Use FFMPEG libraries. */ #undef HAVE_FFMPEG /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* libsqlite3 has sqlite3_db_cacheflush() function. */ #undef HAVE_SQLITE_CACHEFLUSH /* libsqlite3 has sqlite3_errstr() function. */ #undef HAVE_SQLITE_ERRSTR /* libsqlite3 has sqlite3_expanded_sql() function. */ #undef HAVE_SQLITE_EXPANDED_SQL /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Host operating system */ #undef HOST_OS /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `off_t', as computed by sizeof. */ #undef SIZEOF_OFF_T /* The size of `pthread_t', as computed by sizeof. */ #undef SIZEOF_PTHREAD_T /* The size of `time_t', as computed by sizeof. */ #undef SIZEOF_TIME_T /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define the POSIX version */ #undef _POSIX_C_SOURCE /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Must be defined for build with GCC 13 */ #undef __STDC_CONSTANT_MACROS /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to `long int' if does not define. */ #undef off_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t ffmpegfs-2.18/src/ffmpeg_utils.cc0000644000000000000000000021316015166176073013731 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_utils.cc * @brief FFmpegfs utility set implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifdef __cplusplus extern "C" { #endif // Disable annoying warnings outside our code #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #include #include "libavutil/ffversion.h" #include #pragma GCC diagnostic pop #ifdef __cplusplus } #endif #include "id3v1tag.h" #include "ffmpegfs.h" #include "ffmpeg_utils.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_CONFIG_H // This causes problems because it includes defines that collide // with out config.h. #undef HAVE_CONFIG_H #endif // HAVE_CONFIG_H #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" #include #pragma GCC diagnostic pop #include #include #ifdef __cplusplus extern "C" { #endif // Disable annoying warnings outside our code #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #include #pragma GCC diagnostic pop #ifdef __cplusplus } #endif static int is_device(__attribute__((unused)) const AVClass *avclass); static std::string ffmpeg_libinfo(bool lib_exists, __attribute__((unused)) unsigned int version, __attribute__((unused)) const char *cfg, int version_minor, int version_major, int version_micro, const char * libname); #ifndef AV_ERROR_MAX_STRING_SIZE #define AV_ERROR_MAX_STRING_SIZE 128 /**< @brief Max. length of a FFmpeg error string */ #endif // AV_ERROR_MAX_STRING_SIZE typedef std::map FILETYPE_MAP; /**< @brief Map of file type. One entry per supported type. */ /** * List of supported file types */ static const FILETYPE_MAP filetype_map = { { "mp3", FILETYPE::MP3 }, { "mp4", FILETYPE::MP4 }, { "wav", FILETYPE::WAV }, { "ogg", FILETYPE::OGG }, { "webm", FILETYPE::WEBM }, { "mov", FILETYPE::MOV }, { "aiff", FILETYPE::AIFF }, { "opus", FILETYPE::OPUS }, { "prores", FILETYPE::PRORES }, { "alac", FILETYPE::ALAC }, { "png", FILETYPE::PNG }, { "jpg", FILETYPE::JPG }, { "bmp", FILETYPE::BMP }, { "ts", FILETYPE::TS }, { "hls", FILETYPE::HLS }, { "flac", FILETYPE::FLAC }, { "mkv", FILETYPE::MKV }, }; Format_Options::Format_Options() : m_format_map{ { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_NONE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE }}} , m_albumart_supported(false) { } Format_Options::Format_Options( std::string format_name, std::string fileext, FORMAT_MAP format, bool albumart_supported ) : m_format_name(std::move(format_name)) , m_fileext(std::move(fileext)) , m_format_map(std::move(format)) , m_albumart_supported(albumart_supported) { } AVCodecID Format_Options::video_codec() const { FORMAT_MAP::const_iterator it = m_format_map.find(params.m_sample_fmt); if (it == m_format_map.cend()) { // Output supports no video. End of story. return AV_CODEC_ID_NONE; } if (params.m_video_codec == AV_CODEC_ID_NONE) { return (it->second.m_video_codec[0]); // 1st array entry is the predefined codec } return params.m_video_codec; } bool Format_Options::is_video_codec_supported(AVCodecID codec_id) const { FORMAT_MAP::const_iterator it = m_format_map.find(params.m_sample_fmt); if (it != m_format_map.cend()) { for (const AVCodecID & video_codec_id : it->second.m_video_codec) { if (video_codec_id == codec_id) { return true; } } } return false; } std::string Format_Options::video_codec_list() const { std::string buffer; FORMAT_MAP::const_iterator it = m_format_map.find(params.m_sample_fmt); if (it != m_format_map.cend()) { for (const AVCodecID & video_codec_id : it->second.m_video_codec) { if (!buffer.empty()) { buffer += ", "; } buffer += get_video_codec_text(video_codec_id); } } return buffer; } AVCodecID Format_Options::audio_codec() const { FORMAT_MAP::const_iterator it = m_format_map.find(params.m_sample_fmt); if (it == m_format_map.cend()) { // Output supports no audio??? Well then, end of story. return AV_CODEC_ID_NONE; } if (params.m_audio_codec == AV_CODEC_ID_NONE) { return (it->second.m_audio_codec[0]); // 1st array entry is the predefined codec } return params.m_audio_codec; } bool Format_Options::is_audio_codec_supported(AVCodecID codec_id) const { FORMAT_MAP::const_iterator it = m_format_map.find(params.m_sample_fmt); if (it != m_format_map.cend()) { for (const AVCodecID & audio_codec_id : it->second.m_audio_codec) { if (audio_codec_id == codec_id) { return true; } } } return false; } std::string Format_Options::audio_codec_list() const { std::string buffer; FORMAT_MAP::const_iterator it = m_format_map.find(params.m_sample_fmt); if (it != m_format_map.cend()) { for (const AVCodecID & audio_codec_id : it->second.m_audio_codec) { if (!buffer.empty()) { buffer += ", "; } buffer += get_audio_codec_text(audio_codec_id); } } return buffer; } AVSampleFormat Format_Options::sample_format() const { FORMAT_MAP::const_iterator it = m_format_map.find(params.m_sample_fmt); if (it == m_format_map.cend()) { return AV_SAMPLE_FMT_NONE; } return (it->second.m_sample_format); } bool Format_Options::is_sample_fmt_supported() const { FORMAT_MAP::const_iterator it = m_format_map.find(params.m_sample_fmt); return (it != m_format_map.cend()); } std::string Format_Options::sample_fmt_list() const { std::string buffer; for (typename FORMAT_MAP::const_iterator it = m_format_map.cbegin(); it != m_format_map.cend();) { buffer += get_sampleformat_text(it->first); if (++it != m_format_map.cend()) { buffer += ", "; } } return buffer; } AVCodecID Format_Options::subtitle_codec(AVCodecID codec_id) const { FORMAT_MAP::const_iterator it = m_format_map.find(params.m_sample_fmt); if (it == m_format_map.cend()) { // Output supports no subtitles. End of story. return AV_CODEC_ID_NONE; } // Try to find direct match, prefer same as input stream for (const AVCodecID & subtitle_codec_id : it->second.m_subtitle_codec) { // Also match AV_CODEC_ID_DVD_SUBTITLE to AV_CODEC_ID_DVB_SUBTITLE if (subtitle_codec_id == codec_id || (codec_id == AV_CODEC_ID_DVD_SUBTITLE && subtitle_codec_id == AV_CODEC_ID_DVB_SUBTITLE)) { return subtitle_codec_id; } } // No direct match, try to find a text/text or bitmap/bitmap pair if (is_text_codec(codec_id)) { // Find a text based codec in the list for (const AVCodecID & subtitle_codec_id : it->second.m_subtitle_codec) { if (is_text_codec(subtitle_codec_id)) { return subtitle_codec_id; } } } else { // Find a bitmap based codec in the list for (const AVCodecID & subtitle_codec_id : it->second.m_subtitle_codec) { if (!is_text_codec(subtitle_codec_id)) { return subtitle_codec_id; } } } // No matching codec support return AV_CODEC_ID_NONE; } const FFmpegfs_Format::OPTIONS_MAP FFmpegfs_Format::m_options_map = { //{ // Descriptive name of the format. // File extension: Mostly, but not always, same as format. // { // { // SAMPLE_FMT enum, or SAMPLE_FMT::FMT_DONTCARE if source format decides // { // List of video codecs // List of audio codec(s) // List of subtitle codec(s) // AVSampleFormat to be used in encoding, if AV_SAMPLE_FMT_NONE will be determined by source // } // } // }, // If album arts are supported, true; false if no album arts are supported //} // ----------------------------------------------------------------------------------------------------------------------- // MP3 // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::MP3, { "mp3", "mp3", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_MP3 }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } } }, true } }, // ----------------------------------------------------------------------------------------------------------------------- // MP4 // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::MP4, { "mp4", "mp4", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_H264, AV_CODEC_ID_H265, AV_CODEC_ID_MPEG1VIDEO, AV_CODEC_ID_MPEG2VIDEO }, { AV_CODEC_ID_AAC, AV_CODEC_ID_MP3 }, { AV_CODEC_ID_MOV_TEXT }, // MOV Text (Apple Text Media Handler): should be AV_CODEC_ID_WEBVTT, but we get "codec not currently supported in container" AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // WAV // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::WAV, { "wav", "wav", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_S16LE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_8, // 8 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_U8 }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_16, // 32 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_S16LE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_24, // 24 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_S24LE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_32, // 32 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_S32LE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_64, // 64 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_S64LE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_F16, // 16 bit float { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_F16LE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_F24, // 24 bit float { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_F24LE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_F32, // 32 bit float { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_F32LE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_F64, // 64 bit float { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_F64LE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // OGG // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::OGG, { "ogg", "ogg", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_THEORA }, { AV_CODEC_ID_VORBIS }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // WebM // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::WEBM, { "webm", "webm", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_VP9, AV_CODEC_ID_VP8, AV_CODEC_ID_AV1 }, { AV_CODEC_ID_OPUS, AV_CODEC_ID_VORBIS }, { AV_CODEC_ID_WEBVTT }, AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // MOV // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::MOV, { "mov", "mov", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_H264, AV_CODEC_ID_H265, AV_CODEC_ID_MPEG1VIDEO, AV_CODEC_ID_MPEG2VIDEO }, { AV_CODEC_ID_AAC, AV_CODEC_ID_AC3, AV_CODEC_ID_MP3 }, { AV_CODEC_ID_MOV_TEXT }, // MOV Text (Apple Text Media Handler): should be AV_CODEC_ID_WEBVTT, but we get "codec not currently supported in container" AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // AIFF // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::AIFF, { "aiff", "aiff", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_S16BE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_16, // 16 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_S16BE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_S16, // 16 bit } }, { SAMPLE_FMT::FMT_32, // 32 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_PCM_S32BE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_S32, // 32 bit } }, }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // Opus // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::OPUS, { "opus", "opus", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_OPUS }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // Opus // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::PRORES, { "mov", "mov", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_PRORES }, { AV_CODEC_ID_PCM_S16LE }, { AV_CODEC_ID_MOV_TEXT }, // MOV Text (Apple Text Media Handler): should be AV_CODEC_ID_WEBVTT, but we get "codec not currently supported in container" AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // ALAC // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::ALAC, { "m4a", "m4a", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_ALAC }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_16, // 16 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_ALAC }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_S16P, // 16 bit planar } }, { SAMPLE_FMT::FMT_24, // 24 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_ALAC }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_S32P, // 32 bit planar, creates 24 bit ALAC } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // PNG // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::PNG, { "png", "png", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_PNG }, { AV_CODEC_ID_NONE }, // Audio codec(s) { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // JPG // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::JPG, { "jpg", "jpg", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_MJPEG }, { AV_CODEC_ID_NONE }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // BMP // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::BMP, { "bmp", "bmp", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_BMP }, { AV_CODEC_ID_NONE }, // Audio codec(s) { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // TS // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::TS, { "mpegts", "ts", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_H264, AV_CODEC_ID_H265, AV_CODEC_ID_MPEG1VIDEO, AV_CODEC_ID_MPEG2VIDEO }, { AV_CODEC_ID_AAC, AV_CODEC_ID_AC3, AV_CODEC_ID_MP3 }, { AV_CODEC_ID_DVB_SUBTITLE }, AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // HLS, same as TS // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::HLS, { "mpegts", "ts", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_H264, AV_CODEC_ID_H265, AV_CODEC_ID_MPEG1VIDEO, AV_CODEC_ID_MPEG2VIDEO }, { AV_CODEC_ID_AAC, AV_CODEC_ID_AC3, AV_CODEC_ID_MP3 }, { AV_CODEC_ID_DVB_SUBTITLE }, AV_SAMPLE_FMT_NONE, } } }, false } }, // ----------------------------------------------------------------------------------------------------------------------- // FLAC // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::FLAC, { "flac", "flac", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_FLAC }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_NONE, } }, { SAMPLE_FMT::FMT_16, // 16 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_FLAC }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_S16, // Use 16 bit samples } }, { SAMPLE_FMT::FMT_24, // 24 bit { { AV_CODEC_ID_NONE }, { AV_CODEC_ID_FLAC }, { AV_CODEC_ID_NONE }, AV_SAMPLE_FMT_S32, // Use 24 bit samples (yes, S32 creates 24 bit samples) } } }, true } }, // ----------------------------------------------------------------------------------------------------------------------- // MKV // ----------------------------------------------------------------------------------------------------------------------- { FILETYPE::MKV, { "matroska", "mkv", { { SAMPLE_FMT::FMT_DONTCARE, { { AV_CODEC_ID_H264, AV_CODEC_ID_H265, AV_CODEC_ID_MPEG1VIDEO, AV_CODEC_ID_MPEG2VIDEO }, { AV_CODEC_ID_AAC, AV_CODEC_ID_AC3, AV_CODEC_ID_MP3 }, { AV_CODEC_ID_ASS, AV_CODEC_ID_SUBRIP, AV_CODEC_ID_WEBVTT, AV_CODEC_ID_DVB_SUBTITLE }, AV_SAMPLE_FMT_NONE, } } }, false } }, }; FFmpegfs_Format::FFmpegfs_Format() : m_cur_opts(&m_empty_options), m_filetype(FILETYPE::UNKNOWN) { } bool FFmpegfs_Format::init(const std::string & desttype) { OPTIONS_MAP::const_iterator it = m_options_map.find(get_filetype(desttype)); if (it == m_options_map.cend()) { // Not found/invalid desttype m_desttype.clear(); m_filetype = FILETYPE::UNKNOWN; m_cur_opts = &m_empty_options; return false; } else { // OK m_desttype = desttype; m_filetype = it->first; m_cur_opts = &it->second; return true; } } const std::string & FFmpegfs_Format::desttype() const { return m_desttype; } const std::string & FFmpegfs_Format::format_name() const { return m_cur_opts->m_format_name; } const std::string & FFmpegfs_Format::fileext() const { return m_cur_opts->m_fileext; } FILETYPE FFmpegfs_Format::filetype() const { return m_filetype; } bool FFmpegfs_Format::is_multiformat() const { return (is_frameset() || is_hls()); } bool FFmpegfs_Format::is_frameset() const { return (m_filetype == FILETYPE::JPG || m_filetype == FILETYPE::PNG || m_filetype == FILETYPE::BMP); } bool FFmpegfs_Format::is_hls() const { return (m_filetype == FILETYPE::HLS); } bool FFmpegfs_Format::albumart_supported() const { return m_cur_opts->m_albumart_supported; } AVCodecID FFmpegfs_Format::video_codec() const { return m_cur_opts->video_codec(); } bool FFmpegfs_Format::is_video_codec_supported(AVCodecID codec_id) const { return m_cur_opts->is_video_codec_supported(codec_id); } std::string FFmpegfs_Format::video_codec_list() const { return m_cur_opts->video_codec_list(); } AVCodecID FFmpegfs_Format::audio_codec() const { return m_cur_opts->audio_codec(); } bool FFmpegfs_Format::is_audio_codec_supported(AVCodecID codec_id) const { return m_cur_opts->is_audio_codec_supported(codec_id); } std::string FFmpegfs_Format::audio_codec_list() const { return m_cur_opts->audio_codec_list(); } AVSampleFormat FFmpegfs_Format::sample_format() const { return m_cur_opts->sample_format(); } bool FFmpegfs_Format::is_sample_fmt_supported() const { return m_cur_opts->is_sample_fmt_supported(); } std::string FFmpegfs_Format::sample_fmt_list() const { return m_cur_opts->sample_fmt_list(); } AVCodecID FFmpegfs_Format::subtitle_codec(AVCodecID codec_id) const { return m_cur_opts->subtitle_codec(codec_id); } const std::string & append_sep(std::string * path) { if (path->back() != '/') { *path += '/'; } return *path; } const std::string & append_filename(std::string * path, const std::string & filename) { append_sep(path); *path += filename; return *path; } const std::string & remove_sep(std::string * path) { if (path->back() == '/') { (*path).pop_back(); } return *path; } const std::string & remove_filename(std::string * filepath) { std::shared_ptr p = new_strdup(*filepath); if (p == nullptr) { errno = ENOMEM; return *filepath; } *filepath = dirname(p.get()); append_sep(filepath); return *filepath; } const std::string & remove_path(std::string *filepath) { std::shared_ptr p = new_strdup(*filepath); if (p == nullptr) { errno = ENOMEM; return *filepath; } *filepath = basename(p.get()); return *filepath; } const std::string & remove_ext(std::string *filepath) { size_t found; found = filepath->rfind('.'); if (found != std::string::npos) { // Have extension filepath->resize(found); } return *filepath; } bool find_ext(std::string * ext, const std::string & filename) { size_t found; found = filename.rfind('.'); if (found == std::string::npos) { // No extension ext->clear(); return false; } else { // Have extension *ext = filename.substr(found + 1); return true; } } bool check_ext(const std::string & ext, const std::string & filename) { std::string ext1; return (find_ext(&ext1, filename) && ext1 == ext); } const std::string & replace_ext(std::string * filepath, const std::string & ext) { size_t found; found = filepath->rfind('.'); if (found == std::string::npos) { // No extension, just add *filepath += '.'; } else { // Have extension, so replace filepath->resize(found + 1); } *filepath += ext; return *filepath; } const std::string & append_ext(std::string * filepath, const std::string & ext) { size_t found; found = filepath->rfind('.'); if (found == std::string::npos || strcasecmp(filepath->substr(found + 1), ext) != 0) { // No extension or different extension *filepath += '.' + ext; } return *filepath; } std::shared_ptr new_strdup(const std::string & str) { size_t n = str.size() + 1; std::shared_ptr p(new (std::nothrow) char[n]); if (p == nullptr) { errno = ENOMEM; return nullptr; } memcpy(p.get(), str.data(), n - 1); p.get()[n - 1] = '\0'; return p; } std::string ffmpeg_geterror(int errnum) { if (errnum < 0) { std::array error; av_strerror(errnum, error.data(), error.size() - 1); return error.data(); } else { // Prefer thread-safe strerror_r where available #if defined(__GLIBC__) || defined(_POSIX_C_SOURCE) char buf[256]; buf[0] = '\0'; # if ((_POSIX_C_SOURCE >= 200112L) && ! _GNU_SOURCE) if (strerror_r(errnum, buf, sizeof(buf)) == 0) { return std::string(buf); } else { return std::string("Unknown error: ") + std::to_string(errnum); } # else // GNU-specific strerror_r returns char* char *msg = strerror_r(errnum, buf, sizeof(buf)); if (msg) return std::string(msg); return std::string("Unknown error: ") + std::to_string(errnum); # endif #else // Fallback (may not be thread-safe on some platforms) return std::string(strerror(errnum)); #endif } } int64_t ffmpeg_rescale_q(int64_t ts, const AVRational & timebase_in, const AVRational &timebase_out) { if (ts == AV_NOPTS_VALUE) { return AV_NOPTS_VALUE; } if (ts == 0) { return 0; } return av_rescale_q(ts, timebase_in, timebase_out); } int64_t ffmpeg_rescale_q_rnd(int64_t ts, const AVRational & timebase_in, const AVRational &timebase_out) { if (ts == AV_NOPTS_VALUE) { return AV_NOPTS_VALUE; } if (ts == 0) { return 0; } return av_rescale_q_rnd(ts, timebase_in, timebase_out, static_cast(AV_ROUND_UP | AV_ROUND_PASS_MINMAX)); } #if !HAVE_MEDIA_TYPE_STRING const char *get_media_type_string(enum AVMediaType media_type) { switch (media_type) { case AVMEDIA_TYPE_VIDEO: return "video"; case AVMEDIA_TYPE_AUDIO: return "audio"; case AVMEDIA_TYPE_DATA: return "data"; case AVMEDIA_TYPE_SUBTITLE: return "subtitle"; case AVMEDIA_TYPE_ATTACHMENT: return "attachment"; default: return "unknown"; } } #endif /** * @brief Get FFmpeg library info. * @param[in] lib_exists - Set to true if library exists. * @param[in] version - Library version number. * @param[in] cfg - Library configuration. * @param[in] version_minor - Library version minor. * @param[in] version_major - Library version major. * @param[in] version_micro - Library version micro. * @param[in] libname - Name of the library. * @return Formatted library information. */ static std::string ffmpeg_libinfo(bool lib_exists, __attribute__((unused)) unsigned int version, __attribute__((unused)) const char *cfg, int version_minor, int version_major, int version_micro, const char * libname) { std::string info; if (lib_exists) { strsprintf(&info, "lib%-17s: %d.%d.%d\n", libname, version_minor, version_major, version_micro); } return info; } #define PRINT_LIB_INFO(libname, LIBNAME) \ ffmpeg_libinfo(true, libname##_version(), libname##_configuration(), \ LIB##LIBNAME##_VERSION_MAJOR, LIB##LIBNAME##_VERSION_MINOR, LIB##LIBNAME##_VERSION_MICRO, #libname) /**< @brief Print info about a FFmpeg library */ std::string ffmpeg_libinfo() { std::string info; info = "FFmpeg Version : " FFMPEG_VERSION "\n"; // cppcheck-suppress ConfigurationNotChecked info += PRINT_LIB_INFO(avutil, AVUTIL); info += PRINT_LIB_INFO(avcodec, AVCODEC); info += PRINT_LIB_INFO(avformat, AVFORMAT); // info += PRINT_LIB_INFO(avdevice, AVDEVICE); // info += PRINT_LIB_INFO(avfilter, AVFILTER); info += PRINT_LIB_INFO(swresample, SWRESAMPLE); info += PRINT_LIB_INFO(swscale, SWSCALE); // info += PRINT_LIB_INFO(postproc, POSTPROC); return info; } /** * @brief Check if class is a FMmpeg device * @todo Currently always returns 0. Must implement real check. * @param[in] avclass - Private class object * @return Returns 1 if object is a device, 0 if not. */ static int is_device(__attribute__((unused)) const AVClass *avclass) { //if (avclass == nullptr) // return 0; return 0; //return AV_IS_INPUT_DEVICE(avclass->category) || AV_IS_OUTPUT_DEVICE(avclass->category); } int show_caps(int device_only) { const AVInputFormat *ifmt = nullptr; const AVOutputFormat *ofmt = nullptr; const char *last_name; int is_dev; std::printf("%s\n" " D. = Demuxing supported\n" " .E = Muxing supported\n" " --\n", device_only ? "Devices:" : "File formats:"); last_name = "000"; for (;;) { int decode = 0; int encode = 0; const char *name = nullptr; const char *long_name = nullptr; const char *extensions = nullptr; void *ofmt_opaque = nullptr; ofmt_opaque = nullptr; while ((ofmt = av_muxer_iterate(&ofmt_opaque))) { is_dev = is_device(ofmt->priv_class); if (!is_dev && device_only) { continue; } if ((!name || strcmp(ofmt->name, name) < 0) && strcmp(ofmt->name, last_name) > 0) { name = ofmt->name; long_name = ofmt->long_name; encode = 1; } } void *ifmt_opaque = nullptr; ifmt_opaque = nullptr; while ((ifmt = av_demuxer_iterate(&ifmt_opaque)) != nullptr) { is_dev = is_device(ifmt->priv_class); if (!is_dev && device_only) { continue; } if ((!name || strcmp(ifmt->name, name) < 0) && strcmp(ifmt->name, last_name) > 0) { name = ifmt->name; long_name = ifmt->long_name; extensions = ifmt->extensions; encode = 0; } if (name && strcmp(ifmt->name, name) == 0) { decode = 1; } } if (name == nullptr) { break; } last_name = name; if (extensions == nullptr) { continue; } std::printf(" %s%s %-15s %-15s %s\n", decode ? "D" : " ", encode ? "E" : " ", extensions, name, (long_name != nullptr) ? long_name : " "); } return 0; } const char * get_codec_name(AVCodecID codec_id, bool long_name) { const AVCodecDescriptor * pCodecDescriptor; const char * psz = "unknown"; pCodecDescriptor = avcodec_descriptor_get(codec_id); if (pCodecDescriptor != nullptr) { if (pCodecDescriptor->long_name != nullptr && long_name) { psz = pCodecDescriptor->long_name; } else { psz = pCodecDescriptor->name; } } return psz; } int mktree(const std::string & path, mode_t mode) { std::shared_ptr buffer = new_strdup(path); if (buffer == nullptr) { return ENOMEM; } std::string dir; char *saveptr; char *p = strtok_r(buffer.get(), "/", &saveptr); int status = 0; while (p != nullptr) { int newstat; dir += "/"; dir += p; errno = 0; newstat = mkdir(dir.c_str(), mode); if (!status && newstat && errno != EEXIST) { status = -1; break; } status = newstat; p = strtok_r(nullptr, "/", &saveptr); } return status; } void tempdir(std::string & path) { const char *temp = getenv("TMPDIR"); if (temp != nullptr) { path = temp; return; } path = P_tmpdir; if (!path.empty()) { return; } path = "/tmp"; } int supports_albumart(FILETYPE filetype) { // Could also allow OGG but the format requires special handling for album arts return (filetype == FILETYPE::MP3 || filetype == FILETYPE::MP4); } FILETYPE get_filetype(const std::string & desttype) { try { return (filetype_map.at(desttype.c_str())); } catch (const std::out_of_range& /*oor*/) { //std::cerr << "Out of Range error: " << oor.what() << std::endl; return FILETYPE::UNKNOWN; } } std::string get_filetype_text(FILETYPE filetype) { FILETYPE_MAP::const_iterator it = search_by_value(filetype_map, filetype); if (it != filetype_map.cend()) { return it->first; } return "INVALID"; } FILETYPE get_filetype_from_list(const std::string & desttypelist) { std::vector desttype = split(desttypelist, ","); FILETYPE filetype = FILETYPE::UNKNOWN; // Find first matching entry for (size_t n = 0; n < desttype.size() && filetype != FILETYPE::UNKNOWN; n++) { filetype = get_filetype(desttype[n]); } return filetype; } void init_id3v1(ID3v1 *id3v1) { // Initialise ID3v1.1 tag structure std::memset(id3v1, ' ', sizeof(ID3v1)); std::memcpy(&id3v1->m_tag, "TAG", 3); id3v1->m_padding = '\0'; id3v1->m_title_no = 0; id3v1->m_genre = 0; } std::string format_number(int64_t value) { if (!value) { return "unlimited"; } if (value == AV_NOPTS_VALUE) { return "unset"; } std::string buffer; return strsprintf(&buffer, "%" PRId64, value); } std::string format_bitrate(BITRATE value) { if (value == static_cast(AV_NOPTS_VALUE)) { return "unset"; } if (value > 1000000) { std::string buffer; return strsprintf(&buffer, "%.2f Mbps", static_cast(value) / 1000000); } else if (value > 1000) { std::string buffer; return strsprintf(&buffer, "%.1f kbps", static_cast(value) / 1000); } else { std::string buffer; return strsprintf(&buffer, "%" PRId64 " bps", value); } } std::string format_samplerate(int value) { if (value == static_cast(AV_NOPTS_VALUE)) { return "unset"; } if (value < 1000) { std::string buffer; return strsprintf(&buffer, "%u Hz", value); } else { std::string buffer; return strsprintf(&buffer, "%.3f kHz", static_cast(value) / 1000); } } #define STR_VALUE(arg) #arg /**< @brief Convert macro to string */ #define X(name) STR_VALUE(name) /**< @brief Convert macro to string */ std::string format_duration(int64_t value, uint32_t fracs /*= 3*/) { if (value == AV_NOPTS_VALUE) { return "unset"; } std::string buffer; std::string duration; unsigned hours = static_cast((value / AV_TIME_BASE) / (3600)); unsigned mins = static_cast(((value / AV_TIME_BASE) % 3600) / 60); unsigned secs = static_cast((value / AV_TIME_BASE) % 60); if (hours) { duration = strsprintf(&buffer, "%02u:", hours); } duration += strsprintf(&buffer, "%02u:%02u", mins, secs); if (fracs) { unsigned decimals = static_cast(value % AV_TIME_BASE); duration += strsprintf(&buffer, ".%0*u", sizeof(X(AV_TIME_BASE)) - 2, decimals).substr(0, fracs + 1); } return duration; } std::string format_time(time_t value) { if (!value) { return "unlimited"; } if (value == static_cast(AV_NOPTS_VALUE)) { return "unset"; } std::string buffer; std::string time; int weeks; int days; int hours; int mins; int secs; weeks = static_cast(value / (60*60*24*7)); value -= weeks * (60*60*24*7); days = static_cast(value / (60*60*24)); value -= days * (60*60*24); hours = static_cast(value / (60*60)); value -= hours * (60*60); mins = static_cast(value / (60)); value -= mins * (60); secs = static_cast(value); if (weeks) { time = strsprintf(&buffer, "%iw ", weeks); } if (days) { time += strsprintf(&buffer, "%id ", days); } if (hours) { time += strsprintf(&buffer, "%ih ", hours); } if (mins) { time += strsprintf(&buffer, "%im ", mins); } if (secs) { time += strsprintf(&buffer, "%is ", secs); } return time; } std::string format_size(uint64_t value) { if (!value) { return "unlimited"; } if (value == static_cast(AV_NOPTS_VALUE)) { return "unset"; } if (value > 1024*1024*1024*1024LL) { std::string buffer; return strsprintf(&buffer, "%.3f TB", static_cast(value) / (1024*1024*1024*1024LL)); } else if (value > 1024*1024*1024) { std::string buffer; return strsprintf(&buffer, "%.2f GB", static_cast(value) / (1024*1024*1024)); } else if (value > 1024*1024) { std::string buffer; return strsprintf(&buffer, "%.1f MB", static_cast(value) / (1024*1024)); } else if (value > 1024) { std::string buffer; return strsprintf(&buffer, "%.1f KB", static_cast(value) / (1024)); } else { std::string buffer; return strsprintf(&buffer, "%" PRIu64 " bytes", value); } } std::string format_size_ex(uint64_t value) { std::string buffer; return format_size(value) + strsprintf(&buffer, " (%" PRIu64 " bytes)", value); } std::string format_result_size(size_t size_resulting, size_t size_predicted) { if (size_resulting >= size_predicted) { size_t value = size_resulting - size_predicted; return format_size(value); } else { size_t value = size_predicted - size_resulting; return "-" + format_size(value); } } std::string format_result_size_ex(size_t size_resulting, size_t size_predicted) { if (size_resulting >= size_predicted) { std::string buffer; size_t value = size_resulting - size_predicted; return format_size(value) + strsprintf(&buffer, " (%zu bytes)", value); } else { std::string buffer; size_t value = size_predicted - size_resulting; return "-" + format_size(value) + strsprintf(&buffer, " (-%zu bytes)", value); } } /** * @brief Print frames per second. * @param[in] d - Frames per second. * @param[in] postfix - Postfix text. */ static void print_fps(double d, const char *postfix) { long v = lrint(d * 100); if (!v) { std::printf("%1.4f %s\n", d, postfix); } else if (v % 100) { std::printf("%3.2f %s\n", d, postfix); } else if (v % (100 * 1000)) { std::printf("%1.0f %s\n", d, postfix); } else { std::printf("%1.0fk %s\n", d / 1000, postfix); } } int print_stream_info(const AVStream* stream) { int ret = 0; AVCodecContext *avctx = avcodec_alloc_context3(nullptr); if (avctx == nullptr) { return AVERROR(ENOMEM); } ret = avcodec_parameters_to_context(avctx, stream->codecpar); if (ret < 0) { avcodec_free_context(&avctx); return ret; } // Fields which are missing from AVCodecParameters need to be taken from the AVCodecContext // avctx->properties = output_stream->codec->properties; // avctx->codec = output_stream->codec->codec; // avctx->qmin = output_stream->codec->qmin; // avctx->qmax = output_stream->codec->qmax; // avctx->coded_width = output_stream->codec->coded_width; // avctx->coded_height = output_stream->codec->coded_height; int fps = stream->avg_frame_rate.den && stream->avg_frame_rate.num; int tbr = stream->r_frame_rate.den && stream->r_frame_rate.num; int tbn = stream->time_base.den && stream->time_base.num; int tbc = avctx->time_base.den && avctx->time_base.num; // Even the currently latest (lavf 58.10.100) refers to AVStream codec->time_base member... (See dump.c dump_stream_format) if (fps) print_fps(av_q2d(stream->avg_frame_rate), "avg fps"); if (tbr) print_fps(av_q2d(stream->r_frame_rate), "Real base framerate (tbr)"); if (tbn) print_fps(1 / av_q2d(stream->time_base), "stream timebase (tbn)"); if (tbc) print_fps(1 / av_q2d(avctx->time_base), "codec timebase (tbc)"); avcodec_free_context(&avctx); return ret; } std::string fourcc_make_string(std::string * buf, uint32_t fourcc) { std::string fourcc2str(AV_FOURCC_MAX_STRING_SIZE, '\0'); av_fourcc_make_string(&fourcc2str[0], fourcc); fourcc2str.resize(std::strlen(fourcc2str.c_str())); *buf = fourcc2str; return *buf; } void exepath(std::string * path) { std::array result; ssize_t count = readlink("/proc/self/exe", result.data(), result.size() - 1); if (count != -1) { *path = dirname(result.data()); append_sep(path); } else { path->clear(); } } std::string <rim(std::string &s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not_fn(std::function(isspace)))); return s; } std::string &rtrim(std::string &s) { s.erase(std::find_if(s.rbegin(), s.rend(), std::not_fn(std::function(isspace))).base(), s.end()); return s; } std::string &trim(std::string &s) { return ltrim(rtrim(s)); } std::string replace_all(std::string str, const std::string& from, const std::string& to) { return replace_all(&str, from, to); } std::string replace_all(std::string *str, const std::string& from, const std::string& to) { size_t start_pos = 0; while ((start_pos = str->find(from, start_pos)) != std::string::npos) { str->replace(start_pos, from.length(), to); start_pos += to.length(); // Handles case where 'to' is a substring of 'from' } return *str; } bool replace_start(std::string *str, const std::string& from, const std::string& to) { #if __cplusplus >= 202002L // C++20 (and later) code if (str->starts_with(from) == 0) #else if (str->find(from, 0) == 0) #endif { str->replace(0, from.length(), to); return true; } return false; } int strcasecmp(const std::string & s1, const std::string & s2) { return ::strcasecmp(s1.c_str(), s2.c_str()); } int reg_compare(const std::string & value, const std::string & pattern, std::regex::flag_type flag) { int reti; try { std::regex rgx(pattern, flag); reti = (std::regex_search(value, rgx) == true) ? 0 : 1; } catch(const std::regex_error& e) { std::cerr << "regex_error caught: " << e.what() << std::endl; if(e.code() == std::regex_constants::error_brack) std::cerr << "The code was error_brack" << std::endl; reti = -1; } return reti; } const std::string & expand_path(std::string *tgt, const std::string & src) { wordexp_t exp_result; if (!wordexp(replace_all(src, " ", "\\ ").c_str(), &exp_result, 0)) { *tgt = exp_result.we_wordv[0]; wordfree(&exp_result); } else { *tgt = src; } return *tgt; } int is_mount(const std::string & path) { int ret = 0; try { std::shared_ptr orig_name; struct stat file_stat; struct stat parent_stat; char * parent_name = nullptr; orig_name = new_strdup(path); if (orig_name == nullptr) { std::fprintf(stderr, "is_mount(): Out of memory\n"); errno = ENOMEM; throw -1; } // get the parent directory of the file parent_name = dirname(orig_name.get()); // get the file's stat info if (-1 == stat(path.c_str(), &file_stat)) { std::fprintf(stderr, "is_mount(): (%i) %s\n", errno, strerror(errno)); throw -1; } //determine whether the supplied file is a directory // if it isn't, then it can't be a mountpoint. if (!(file_stat.st_mode & S_IFDIR)) { std::fprintf(stderr, "is_mount(): %s is not a directory.\n", path.c_str()); throw -1; } // get the parent's stat info if (-1 == stat(parent_name, &parent_stat)) { std::fprintf(stderr, "is_mount(): (%i) %s\n", errno, strerror(errno)); throw -1; } // if file and parent have different device ids, // then the file is a mount point // or, if they refer to the same file, // then it's probably the root directory // and therefore a mountpoint // style: Redundant condition: file_stat.st_dev==parent_stat.st_dev. // 'A || (!A && B)' is equivalent to 'A || B' [redundantCondition] //if (file_stat.st_dev != parent_stat.st_dev || // (file_stat.st_dev == parent_stat.st_dev && // file_stat.st_ino == parent_stat.st_ino)) if (file_stat.st_dev != parent_stat.st_dev || file_stat.st_ino == parent_stat.st_ino) { // IS a mountpoint ret = 1; } else { // is NOT a mountpoint ret = 0; } } catch (int _ret) { ret = _ret; } return ret; } std::vector split(const std::string& input, const std::string & regex) { // passing -1 as the submatch index parameter performs splitting std::regex re(regex); std::sregex_token_iterator first{input.cbegin(), input.cend(), re, -1}, last; return {first, last}; } std::string sanitise_filepath(std::string * filepath) { std::array resolved_name; if (realpath(filepath->c_str(), resolved_name.data()) != nullptr) { *filepath = resolved_name.data(); return *filepath; } // realpath has the strange feature to remove a trailing slash if there. // To mimick its behaviour, if realpath fails, at least remove it. std::string _filepath(*filepath); remove_sep(&_filepath); return _filepath; } std::string sanitise_filepath(const std::string & filepath) { std::string buffer(filepath); return sanitise_filepath(&buffer); } void append_basepath(std::string *origpath, const char* path) { *origpath = params.m_basepath; if (*path == '/') { ++path; } *origpath += path; sanitise_filepath(origpath); } bool is_album_art(AVCodecID codec_id, const AVRational * frame_rate) { if (codec_id == AV_CODEC_ID_PNG || codec_id == AV_CODEC_ID_BMP) { // PNG or BMP: must be an album art stream return true; } if (codec_id != AV_CODEC_ID_MJPEG) { // Anything else than MJPEG is never an album art stream return false; } if (frame_rate != nullptr && frame_rate->den) { double dbFrameRate = static_cast(frame_rate->num) / frame_rate->den; // If frame rate is < 300 fps this most likely is a video if (dbFrameRate < 300) { // This is a video return false; } } return true; } int nocasecompare(const std::string & lhs, const std::string &rhs) { return (strcasecmp(lhs, rhs)); } size_t get_disk_free(std::string & path) { struct statvfs buf; if (statvfs(path.c_str(), &buf)) { return 0; } return static_cast(buf.f_bfree * buf.f_bsize); } bool check_ignore(size_t size, size_t offset) { std::array blocksize_arr = { 0x2000, 0x8000, 0x10000 }; bool ignore = false; for (const size_t & blocksize: blocksize_arr) { size_t rest; bool match; match = !(offset % blocksize); // Must be multiple of block size if (!match) { continue; } rest = size % offset; // Calculate rest. ignore = match && (rest < blocksize); // Ignore of rest is less than block size if (ignore) { break; } } return ignore; } std::string make_filename(uint32_t file_no, const std::string & fileext) { std::string buffer; return strsprintf(&buffer, "%06u.%s", file_no, fileext.c_str()); } bool file_exists(const std::string & filename) { return (access(filename.c_str(), F_OK) != -1); } void make_upper(std::string * input) { std::for_each(std::begin(*input), std::end(*input), [](char& c) { c = static_cast(std::toupper(static_cast(c))); }); } void make_lower(std::string * input) { std::for_each(std::begin(*input), std::end(*input), [](char& c) { c = static_cast(std::tolower(static_cast(c))); }); } const char * hwdevice_get_type_name(AVHWDeviceType dev_type) { const char *type_name = av_hwdevice_get_type_name(dev_type); return (type_name != nullptr ? type_name : "unknown"); } int to_utf8(std::string & text, const std::string & encoding) { iconv_t conv = iconv_open("UTF-8", encoding.c_str()); if (conv == (iconv_t) -1) { int open_err = errno; // Some platforms (e.g. BSD/macOS) use UCS-* names instead of UTF-* const char *fallback = nullptr; if (open_err == EINVAL) { if (encoding == "UTF-32LE") fallback = "UCS-4LE"; else if (encoding == "UTF-32BE") fallback = "UCS-4BE"; else if (encoding == "UTF-16LE") fallback = "UCS-2LE"; else if (encoding == "UTF-16BE") fallback = "UCS-2BE"; } if (fallback != nullptr) { conv = iconv_open("UTF-8", fallback); if (conv == (iconv_t) -1) { // Fallback also failed return errno; } } else { // Error in iconv_open, errno in return code. return open_err; } } { // Error in iconv_open, errno in return code. return errno; } std::vector src; std::vector dst; size_t srclen = text.size(); size_t dstlen = 2 * srclen; src.resize(srclen + 1); dst.resize(dstlen + 2); char * pIn = src.data(); char * pOut = dst.data(); memcpy(pIn, text.data(), srclen); pIn[srclen] = '\0'; size_t len = iconv(conv, &pIn, &srclen, &pOut, &dstlen); if (len != (size_t) -1) { *pOut = '\0'; iconv_close(conv); text = dst.data(); return 0; // Conversion OK } else { int orgerrno = errno; iconv_close(conv); // Error in iconv, errno in return code. return orgerrno; } } int get_encoding (const char * str, std::string & encoding) { DetectObj *obj = detect_obj_init(); if (obj == nullptr) { // Memory Allocation failed return ENOMEM; // CHARDET_MEM_ALLOCATED_FAIL; } #ifndef CHARDET_BINARY_SAFE // before 1.0.5. This API is deprecated on 1.0.5 switch (detect (str, &obj)) #else // from 1.0.5 switch (detect_r (str, strlen (str), &obj)) #endif { case CHARDET_OUT_OF_MEMORY : // Out of memory on handle processing detect_obj_free (&obj); return ENOMEM; // CHARDET_OUT_OF_MEMORY; case CHARDET_NULL_OBJECT : // 1st argument of chardet() must be allocated with detect_obj_init API return EINVAL; // CHARDET_NULL_OBJECT; } //#ifndef CHARDET_BOM_CHECK // printf ("encoding: %s, confidence: %f\n", obj->encoding, obj->confidence); //#else // // from 1.0.6 support return whether exists BOM // printf ( // "encoding: %s, confidence: %f, exist BOM: %d\n", // obj->encoding, obj->confidence, obj->bom // ); //#endif encoding = obj->encoding; detect_obj_free (&obj); return 0; } int read_file(const std::string & path, std::string & result) { constexpr std::array UTF_8_BOM = { '\xEF', '\xBB', '\xBF' }; constexpr std::array UTF_16_BE_BOM = { '\xFE', '\xFF' }; constexpr std::array UTF_16_LE_BOM = { '\xFF', '\xFE' }; constexpr std::array UTF_32_BE_BOM = { '\x00', '\x00', '\xFE', '\xFF' }; constexpr std::array UTF_32_LE_BOM = { '\xFF', '\xFE', '\x00', '\x00' }; std::ifstream ifs; ENCODING encoding = ENCODING::ASCII; int res = 0; try { ifs.open(path, std::ios::binary); if (!ifs.is_open()) { // Unable to read file result.clear(); throw errno; } if (ifs.eof()) { // Empty file result.clear(); throw ENCODING::ASCII; } // Read the bottom mark std::array BOM; ifs.read(BOM.data(), BOM.size()); // If you feel tempted to reorder these checks please note // that UTF_32_LE_BOM must be done before UTF_16_LE_BOM to // avoid misdetection :) if (!memcmp(BOM.data(), UTF_32_LE_BOM.data(), UTF_32_LE_BOM.size())) { // The file contains UTF-32LE BOM encoding = ENCODING::UTF32LE_BOM; ifs.seekg(UTF_32_LE_BOM.size()); } else if (!memcmp(BOM.data(), UTF_32_BE_BOM.data(), UTF_32_BE_BOM.size())) { // The file contains UTF-32BE BOM encoding = ENCODING::UTF32BE_BOM; ifs.seekg(UTF_32_BE_BOM.size()); } else if (!memcmp(BOM.data(), UTF_16_LE_BOM.data(), UTF_16_LE_BOM.size())) { // The file contains UTF-16LE BOM encoding = ENCODING::UTF16LE_BOM; ifs.seekg(UTF_16_LE_BOM.size()); } else if (!memcmp(BOM.data(), UTF_16_BE_BOM.data(), UTF_16_BE_BOM.size())) { // The file contains UTF-16BE BOM encoding = ENCODING::UTF16BE_BOM; ifs.seekg(UTF_16_BE_BOM.size()); } else if (!memcmp(BOM.data(), UTF_8_BOM.data(), UTF_8_BOM.size())) { // The file contains UTF-8 BOM encoding = ENCODING::UTF8_BOM; ifs.seekg(UTF_8_BOM.size()); } else { // The file does not have BOM encoding = ENCODING::ASCII; ifs.seekg(0); } switch (encoding) { case ENCODING::UTF16LE_BOM: { std::stringstream ss; ss << ifs.rdbuf(); result = ss.str(); // raw UTF-16LE bytes (without BOM) res = to_utf8(result, "UTF-16LE"); if (res) { throw res; } break; } case ENCODING::UTF16BE_BOM: { std::stringstream ss; ss << ifs.rdbuf(); result = ss.str(); // raw UTF-16BE bytes (without BOM) res = to_utf8(result, "UTF-16BE"); if (res) { throw res; } break; } case ENCODING::UTF32LE_BOM: { std::stringstream ss; ss << ifs.rdbuf(); result = ss.str(); // raw UTF-32LE bytes (without BOM) res = to_utf8(result, "UTF-32LE"); if (res) { throw res; } break; } case ENCODING::UTF32BE_BOM: { std::stringstream ss; ss << ifs.rdbuf(); result = ss.str(); // raw UTF-32BE bytes (without BOM) res = to_utf8(result, "UTF-32BE"); if (res) { throw res; } break; } case ENCODING::UTF8_BOM: { // Already UTF-8, nothing to do std::stringstream ss; ss << ifs.rdbuf(); result = ss.str(); break; } default: // ENCODING::ASCII { // This is a bit tricky, we have to try to determine the actual encoding. std::stringstream ss; ss << ifs.rdbuf(); result = ss.str(); // Using libchardet to guess the encoding std::string encoding_name; res = get_encoding(result.c_str(), encoding_name); if (res) { throw res; } if (encoding_name != "UTF-8") { // If not UTF-8, do the actual conversion res = to_utf8(result, encoding_name); if (res) { throw res; } } break; } } res = static_cast(encoding); } catch (const std::system_error& e) { res = errno; } catch (int _res) { res = _res; } return res; } void stat_set_size(struct stat *st, size_t size) { #if defined __x86_64__ || !defined __USE_FILE_OFFSET64 st->st_size = static_cast<__off_t>(size); #else st->st_size = static_cast<__off64_t>(size); #endif st->st_blocks = (st->st_size + 512 - 1) / 512; } bool detect_docker() { try { std::ifstream const in_stream("/proc/self/cgroup"); std::stringstream buffer; buffer << in_stream.rdbuf(); auto const& content_as_string = buffer.str(); return std::string::npos != content_as_string.find("/docker"); } catch (std::exception const& ex) { std::fprintf(stderr, "detect_docker(): Unable check if running in docker or not, exception: %s.", ex.what()); return false; } } bool is_text_codec(AVCodecID codec_id) { //AV_CODEC_ID_DVD_SUBTITLE = 0x17000, //AV_CODEC_ID_DVB_SUBTITLE, //AV_CODEC_ID_TEXT, ///< raw UTF-8 text //AV_CODEC_ID_XSUB, //AV_CODEC_ID_SSA, //AV_CODEC_ID_MOV_TEXT, //AV_CODEC_ID_HDMV_PGS_SUBTITLE, //AV_CODEC_ID_DVB_TELETEXT, //AV_CODEC_ID_SRT, //AV_CODEC_ID_MICRODVD, //AV_CODEC_ID_EIA_608, //AV_CODEC_ID_JACOSUB, //AV_CODEC_ID_SAMI, //AV_CODEC_ID_REALTEXT, //AV_CODEC_ID_STL, //AV_CODEC_ID_SUBVIEWER1, //AV_CODEC_ID_SUBVIEWER, //AV_CODEC_ID_SUBRIP, //AV_CODEC_ID_WEBVTT, //AV_CODEC_ID_MPL2, //AV_CODEC_ID_VPLAYER, //AV_CODEC_ID_PJS, //AV_CODEC_ID_ASS, //AV_CODEC_ID_HDMV_TEXT_SUBTITLE, //AV_CODEC_ID_TTML, //AV_CODEC_ID_ARIB_CAPTION, return (codec_id != AV_CODEC_ID_DVD_SUBTITLE && codec_id != AV_CODEC_ID_DVB_SUBTITLE && codec_id != AV_CODEC_ID_HDMV_PGS_SUBTITLE); } int get_audio_props(AVFormatContext *format_ctx, int *channels, int *samplerate) { int ret; ret = av_find_best_stream(format_ctx, AVMEDIA_TYPE_AUDIO, INVALID_STREAM, INVALID_STREAM, nullptr, 0); if (ret >= 0) { #if LAVU_DEP_OLD_CHANNEL_LAYOUT *channels = format_ctx->streams[ret]->codecpar->ch_layout.nb_channels; #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT *channels = format_ctx->streams[ret]->codecpar->channels; #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT *samplerate = format_ctx->streams[ret]->codecpar->sample_rate; } return ret; } const std::string & regex_escape(std::string * str) { // Escape characters that are meaningful to regexp. // Note that "\\" must be first so we do not escape our own escapes... const std::vector charlist {"\\", "+", "*", "?", "^", "$", "(", ")", "[", "]", "{", "}", "|"}; for (const std::string & ch : charlist) { replace_all(str, ch, "\\" + ch); } replace_all(str, ".", "[.]"); return *str; } bool is_selected(const std::string & ext) { if (params.m_include_extensions->empty()) { // If set is empty, allow all extensions return true; } auto is_match = [ext](const std::string & regex_string) { return (fnmatch(regex_string.c_str(), ext.c_str(), 0) == 0); }; return (find_if(begin(*params.m_include_extensions), end(*params.m_include_extensions), is_match) != end(*params.m_include_extensions)); } bool is_blocked(const std::string & filename) { std::string ext; if (!find_ext(&ext, filename)) { return false; // no extension } // These are blocked by default, they confuse players like VLC or mpv which // auto load them. As they get incorporated as subtitle tracks by FFmpegfs // they would end up as duplicates. if (!strcasecmp(ext, "srt") || !strcasecmp(ext, "vtt")) { return true; } auto is_match = [ext](const std::string & regex_string) { return (fnmatch(regex_string.c_str(), ext.c_str(), 0) == 0); }; // Check block list return (find_if(begin(*params.m_hide_extensions), end(*params.m_hide_extensions), is_match) != end(*params.m_hide_extensions)); } void save_free(void **p) { void * tmp = __atomic_exchange_n(p, nullptr, __ATOMIC_RELEASE); if (tmp != nullptr) { free(tmp); } } void mssleep(int milliseconds) { std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds)); } void ussleep(int microseconds) { std::this_thread::sleep_for(std::chrono::microseconds(microseconds)); } void nssleep(int nanoseconds) { std::this_thread::sleep_for(std::chrono::nanoseconds(nanoseconds)); } ffmpegfs-2.18/src/Makefile.am0000644000000000000000000000450115055047166012764 00000000000000EXTRA_DIST = $(wildcard scripts/*) # Add fuse3 AM_CPPFLAGS = $(fuse3_CFLAGS) -D_FILE_OFFSET_BITS=64 bin_PROGRAMS = ffmpegfs ffmpegfs_SOURCES = ffmpegfs.cc ffmpegfs.h fuseops.cc transcode.cc transcode.h cache.cc cache.h buffer.cc buffer.h logging.cc logging.h cache_entry.cc cache_entry.h cache_maintenance.cc cache_maintenance.h id3v1tag.h aiff.h wave.h cuesheetparser.cc cuesheetparser.h diskio.cc diskio.h fileio.cc fileio.h ffmpeg_compat.h ffmpeg_profiles.h thread_pool.cc thread_pool.h ffmpegfs_LDADD = $(libcue_LIBS) $(fuse3_LIBS) -lrt -lstdc++fs ffmpegfs_SOURCES += ffmpeg_base.cc ffmpeg_base.h ffmpeg_transcoder.cc ffmpeg_transcoder.h ffmpeg_utils.cc ffmpeg_utils.h ffmpeg_profiles.cc ffmpeg_frame.h ffmpeg_frame.cc ffmpeg_subtitle.h ffmpeg_subtitle.cc ffmpegfs_LDADD += $(libavcodec_LIBS) $(libavutil_LIBS) $(libavformat_LIBS) $(libswscale_LIBS) $(libavfilter_LIBS) $(libswresample_LIBS) AM_CPPFLAGS += $(libavcodec_CFLAGS) $(libavutil_CFLAGS) $(libavformat_CFLAGS) $(libswscale_CFLAGS) $(libavfilter_CFLAGS) $(libswresample_CFLAGS) # Add sqlite3 ffmpegfs_LDADD += $(sqlite3_LIBS) # Add libchardet AM_CPPFLAGS += $(chardet_CFLAGS) ffmpegfs_LDADD += $(chardet_LIBS) # DVD support: requires both libdbdnav and libdvdread if USE_LIBDVD AM_CPPFLAGS += -DUSE_LIBDVD AM_CPPFLAGS += $(libdvdnav_CFLAGS) $(libdvdread_CFLAGS) ffmpegfs_SOURCES += dvdio.cc dvdio.h dvdparser.cc dvdparser.h ffmpegfs_LDADD += $(libdvdnav_LIBS) $(libdvdread_LIBS) endif # Blu-ray support: requires libbluray if USE_LIBBLURAY AM_CPPFLAGS += -DUSE_LIBBLURAY AM_CPPFLAGS += $(libbluray_CFLAGS) ffmpegfs_SOURCES += blurayio.cc blurayio.h blurayparser.cc blurayparser.h ffmpegfs_LDADD += $(libbluray_LIBS) endif # VCD support: uses internal code if USE_LIBVCD AM_CPPFLAGS += -DUSE_LIBVCD AM_CPPFLAGS += $(libvcd_CFLAGS) ffmpegfs_SOURCES += vcdio.cc vcdio.h vcdparser.cc vcdparser.h vcd/vcdchapter.cc vcd/vcdchapter.h vcd/vcdentries.cc vcd/vcdentries.h vcd/vcdinfo.cc vcd/vcdinfo.h vcd/vcdutils.cc vcd/vcdutils.h endif # Add conversion of manpages source. Will be used in binary. BUILT_SOURCES = ../ffmpegfs.1.text ffmpegfshelp.h ../ffmpegfs.1.text: ../ffmpegfs.1.txt $(AM_V_GEN)a2x -a revnumber="$(VERSION)" \ -a revdate="$(shell date +'%B %Y')" -D ".." -f text $< # sed in makefiles is a menace so we use a helper script ffmpegfshelp.h: ../ffmpegfs.1.text $(srcdir)/makehelp.sh $@ ffmpegfs-2.18/src/thread_pool.h0000644000000000000000000001045515166175407013411 00000000000000/* * Copyright (C) 2019-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file thread_pool.h * @brief Thread pool class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2019-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef THREAD_POOL_H #define THREAD_POOL_H #pragma once #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include /** * @brief The thread_pool class. */ class thread_pool { public: typedef std::function FunctionPointer; /**< @brief Pointer to thread pool function */ public: /** * @brief Construct a thread_pool object. * @param[in] num_threads - Optional: number of threads to create in pool. Defaults to Defaults to 4 x number of CPU cores. */ explicit thread_pool(unsigned int num_threads = std::thread::hardware_concurrency() * 4); /** * @brief Object destructor. Ends all threads and cleans up resources. */ virtual ~thread_pool(); /** * @brief Initialise thread pool. * Initialise the thread pool. Does nothing if called more than once. * @param[in] num_threads - Optional: number of threads to create in pool. Defaults to Defaults to 4x number of CPU cores. * @return Number of threads created on success; on error or if called more than once, returns 0. */ int init(unsigned int num_threads = 0); /** * @brief Shut down the thread pool. * @param[in] silent - If true, no log messages will be issued. */ void tear_down(bool silent = false); /** * @brief Schedule a new thread from pool. * @param[in] func - std::function object to call * @return Returns true if thread was successfully scheduled, false if not. */ bool schedule_thread(FunctionPointer && func); /** * @brief Get number of currently running threads. * @return Returns number of currently running threads. */ unsigned int current_running() const; /** * @brief Get number of currently queued threads. * @return Returns number of currently queued threads. */ unsigned int current_queued(); /** * @brief Get current pool size. * @return Return current pool size. */ unsigned int pool_size() const; private: /** * @brief Start loop function. * @param[in] tp - Thread pool object of caller. */ static void loop_function_starter(thread_pool &tp); /** * @brief Start loop function */ void loop_function(); protected: std::vector m_thread_pool; /**< Thread pool */ std::mutex m_queue_mutex; /**< Mutex for critical section */ std::condition_variable m_queue_cond; /**< Condition for critical section */ std::queue m_thread_queue; /**< Thread queue parameters */ std::atomic_bool m_queue_shutdown; /**< If true all threads have been shut down */ unsigned int m_num_threads; /**< Max. number of threads. Defaults to 4x number of CPU cores. */ unsigned int m_cur_threads; /**< Current number of threads. */ std::atomic_uint32_t m_threads_running; /**< Currently running threads. */ }; #endif // THREAD_POOL_H ffmpegfs-2.18/src/id3v1tag.h0000644000000000000000000000414415166175407012531 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file id3v1tag.h * @brief %ID3v1 tag structure * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef ID3V1TAG_H #define ID3V1TAG_H #pragma once #include /** @brief %ID3 version 1 tag */ struct ID3v1 { std::array m_tag; /**< @brief Contains "TAG" */ std::array m_title; /**< @brief Title of sound track */ std::array m_artist; /**< @brief Artist name */ std::array m_album; /**< @brief Album name */ std::array m_year; /**< @brief Year of publishing */ std::array m_comment; /**< @brief Any user comments */ char m_padding; /**< @brief Padding byte, must be '\0' */ char m_title_no; /**< @brief Title number */ char m_genre; /**< @brief Type of music */ }; static_assert(sizeof(ID3v1) == 128); extern void init_id3v1(ID3v1 *id3v1); /**< @brief Initialise ID3v1 tag */ #define ID3V1_TAG_LENGTH sizeof(ID3v1) /**< @brief Fixed 128 bytes */ #endif // ID3V1TAG_H ffmpegfs-2.18/src/fileio.h0000644000000000000000000004110515166175407012354 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file fileio.h * @brief FileIO class * * This class allows transparent access to files from DVD, Blu-ray, Video CD or * to regular disk files. * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef FILEIO_H #define FILEIO_H #pragma once #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include // Disable annoying warnings outside our code #ifdef __cplusplus extern "C" { #endif #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #include #pragma GCC diagnostic pop #ifdef __cplusplus } #endif #pragma pack(push, 1) #define IMAGE_FRAME_TAG "IMGFRAME" /**< @brief Tag of an image frame header for the frame images buffer. */ /** * @brief Image frame header * * This image frame header will always start at an 8K boundary of the cache. * * It can be used to find the next image by seeking an 8K block starting with the tag. */ typedef struct IMAGE_FRAME { std::array m_tag; /**< @brief Start tag, always ascii "IMGFRAME". */ uint32_t m_frame_no; /**< @brief Number of the frame image. 0 if not yet decoded. */ uint64_t m_offset; /**< @brief Offset in index file. */ uint32_t m_size; /**< @brief Image size in bytes. */ std::array m_reserved; /**< @brief Reserved. Pad structure to 32 bytes. */ // ...data } IMAGE_FRAME; #pragma pack(pop) typedef IMAGE_FRAME const *LPCIMAGE_FRAME; /**< @brief Pointer version of IMAGE_FRAME */ typedef IMAGE_FRAME *LPIMAGE_FRAME; /**< @brief Pointer to const version of IMAGE_FRAME */ /** @brief Virtual file types enum */ enum class VIRTUALTYPE { PASSTHROUGH, /**< @brief passthrough file, not used */ DISK, /**< @brief Regular disk file to transcode */ SCRIPT, /**< @brief Virtual script */ #ifdef USE_LIBVCD VCD, /**< @brief Video CD file */ #endif // USE_LIBVCD #ifdef USE_LIBDVD DVD, /**< @brief DVD file */ #endif // USE_LIBDVD #ifdef USE_LIBBLURAY BLURAY, /**< @brief Blu-ray disk file */ #endif // USE_LIBBLURAY BUFFER, /**< @brief Buffer file */ }; typedef VIRTUALTYPE const *LPCVIRTUALTYPE; /**< @brief Pointer version of VIRTUALTYPE */ typedef VIRTUALTYPE LPVIRTUALTYPE; /**< @brief Pointer to const version of VIRTUALTYPE */ #define VIRTUALFLAG_NONE 0x00000000 /**< @brief No flags */ #define VIRTUALFLAG_PASSTHROUGH 0x00000001 /**< @brief passthrough file, not used */ #define VIRTUALFLAG_DIRECTORY 0x00000002 /**< @brief File is a virtual directory */ #define VIRTUALFLAG_FILESET 0x00000004 /**< @brief File is file set (images, HLS) */ #define VIRTUALFLAG_FRAME 0x00000008 /**< @brief File is part of a set of frames */ #define VIRTUALFLAG_HLS 0x00000010 /**< @brief File is part of a set of HLS transport stream (ts) files */ #define VIRTUALFLAG_CUESHEET 0x00000020 /**< @brief File is part of a set of cue sheet tracks or the directory */ #define VIRTUALFLAG_HIDDEN 0x00000040 /**< @brief File is not transcodable or should otherwise show in listings */ /** @brief Virtual file definition */ typedef struct VIRTUALFILE { VIRTUALFILE() : m_type(VIRTUALTYPE::DISK) , m_flags(VIRTUALFLAG_NONE) , m_format_idx(0) , m_full_title(false) , m_duration(0) , m_predicted_size(0) , m_video_frame_count(0) , m_has_audio(false) , m_has_video(false) , m_has_subtitle(false) , m_channels(0) , m_sample_rate(0) , m_width(0) , m_height(0) , m_framerate{ 0, 0 } { std::memset(&m_st, 0, sizeof(m_st)); } uint32_t get_segment_count() const; /**< @brief Number of HLS segments in set */ VIRTUALTYPE m_type; /**< @brief Type of this virtual file */ int m_flags; /**< @brief One of the VIRTUALFLAG_* flags */ size_t m_format_idx; /**< @brief Index into params.format[] array */ std::string m_destfile; /**< @brief Name and path of destination file */ std::string m_virtfile; /**< @brief Name and path of virtual file */ std::string m_origfile; /**< @brief Sanitised name and path of original file */ struct stat m_st; /**< @brief stat structure with size etc. */ bool m_full_title; /**< @brief If true, ignore m_chapter_no and provide full track */ int64_t m_duration; /**< @brief Track/chapter duration, in AV_TIME_BASE fractional seconds. */ size_t m_predicted_size; /**< @brief Use this as the size instead of computing it over and over. */ uint32_t m_video_frame_count; /**< @brief Number of frames in video or 0 if not a video */ bool m_has_audio; /**< @brief True if file has an audio track */ bool m_has_video; /**< @brief True if file has a video track */ bool m_has_subtitle; /**< @brief True if file has a subtitle track */ std::vector m_file_contents; /**< @brief Buffer for virtual files */ #ifdef USE_LIBVCD /** @brief Extra value structure for Video CDs. * @note Only available if compiled with -DUSE_LIBVCD. */ struct VCD_CHAPTER { VCD_CHAPTER() : m_track_no(0) , m_chapter_no(0) , m_start_pos(0) , m_end_pos(0) {} int m_track_no; /**< @brief Track number (1..) */ int m_chapter_no; /**< @brief Chapter number (1..) */ uint64_t m_start_pos; /**< @brief Start offset in bytes */ uint64_t m_end_pos; /**< @brief End offset in bytes (not including this byte) */ } m_vcd; /**< @brief S/VCD track/chapter info */ #endif //USE_LIBVCD #ifdef USE_LIBDVD /** @brief Extra value structure for DVDs. * @note Only available if compiled with -DUSE_LIBDVD. */ struct DVD_CHAPTER { DVD_CHAPTER() : m_title_no(0) , m_chapter_no(0) , m_angle_no(0) {} int m_title_no; /**< @brief Track number (1...n) */ int m_chapter_no; /**< @brief Chapter number (1...n) */ int m_angle_no; /**< @brief Selected angle number (1...n) */ } m_dvd; /**< @brief DVD title/chapter info */ #endif // USE_LIBDVD #ifdef USE_LIBBLURAY /** @brief Extra value structure for Blu-ray disks. * @note Only available if compiled with -DUSE_LIBBLURAY. */ struct BLURAY_CHAPTER { BLURAY_CHAPTER() : m_title_no(0) , m_playlist_no(0) , m_chapter_no(0) , m_angle_no(0) {} uint32_t m_title_no; /**< @brief Track number (1...n) */ uint32_t m_playlist_no; /**< @brief Playlist number (1...n) */ unsigned m_chapter_no; /**< @brief Chapter number (1...n) */ unsigned m_angle_no; /**< @brief Selected angle number (1...n) */ } m_bluray; /**< @brief Blu-ray title/chapter info */ #endif // USE_LIBBLURAY /** @brief Extra value structure for cue sheets. */ struct CUESHEET_TRACK { CUESHEET_TRACK() : m_tracktotal(0) , m_trackno(0) , m_start(0) , m_duration(0) , m_nextfile(nullptr) {} int m_tracktotal; /**< @brief Total number of tracks in cue sheet. */ int m_trackno; /**< @brief Track number */ std::string m_artist; /**< @brief Track artist */ std::string m_title; /**< @brief Track title */ std::string m_album; /**< @brief Album title */ std::string m_genre; /**< @brief Album genre */ std::string m_date; /**< @brief Publishing date */ int64_t m_start; /**< @brief Track start time, in AV_TIME_BASE fractional seconds. */ int64_t m_duration; /**< @brief Track/chapter duration, in AV_TIME_BASE fractional seconds. */ VIRTUALFILE* m_nextfile; /**< @brief Next (probable) file to be played. Used for cuesheet lists. */ } m_cuesheet_track; /**< @brief Cue sheet data for track. */ std::string m_cuesheet; /**< @brief Cue sheet file contents for physical file. */ // These may be filled in for DVD/Blu-ray int m_channels; /**< @brief Audio channels - Filled in for the DVD/Blu-ray directory. */ int m_sample_rate; /**< @brief Audio sample rate - Filled in for the DVD/Blu-ray directory. */ int m_width; /**< @brief Video width - Filled in for the DVD/Blu-ray directory. */ int m_height; /**< @brief Video height - Filled in for the DVD/Blu-ray directory. */ AVRational m_framerate; /**< @brief Video frame rate - Filled in for the DVD/Blu-ray directory. */ } VIRTUALFILE; typedef VIRTUALFILE const *LPCVIRTUALFILE; /**< @brief Pointer to const version of VIRTUALFILE. */ typedef VIRTUALFILE *LPVIRTUALFILE; /**< @brief Pointer version of VIRTUALFILE. */ /** @brief Base class for I/O */ class FileIO { public: /** * @brief Create #FileIO object */ explicit FileIO(); /** * @brief Free #FileIO object */ virtual ~FileIO() = default; /** @brief Allocate the correct object for type(). * * Free with delete if no longer required. * * @param[in] type - VIRTUALTYPE of new object. * @return Upon successful completion, #FileIO of the requested type. * On error, (out of memory), it returns a nullptr. */ static std::shared_ptr alloc(VIRTUALTYPE type); /** * @brief Get type of the virtual file. * @return Returns the type of the virtual file. */ virtual VIRTUALTYPE type() const = 0; /** * @brief Get the ideal buffer size. * @return Return the ideal buffer size. */ virtual size_t bufsize() const = 0; /** @brief Open a virtual file. * @param[in] virtualfile - LPCVIRTUALFILE of file to open. * @return Upon successful completion, #openio() returns 0. @n * On error, a nonzero value is returned and errno is set to indicate the error. */ virtual int openio(LPVIRTUALFILE virtualfile) = 0; /** @brief Read data from a file. * @param[out] data - A buffer to store read bytes in. It must be large enough to hold up to size bytes. * @param[in] size - The number of bytes to read. * @return Upon successful completion, #readio() returns the number of bytes read. @n * This may be less than size. @n * On error, the value 0 is returned and errno is set to indicate the error. @n * If at the end of the file, 0 may be returned but errno is not set. error() will return 0 if at EOF. */ virtual size_t readio(void *data, size_t size) = 0; /** * @brief Get last error. * @return errno value of last error. */ virtual int error() const = 0; /** @brief Get the duration of the file, in AV_TIME_BASE fractional seconds. * * This is only possible for file formats that are aware of the play time. * May be AV_NOPTS_VALUE if the time is not known. */ virtual int64_t duration() const = 0; /** * @brief Get the file size. * @return Returns the file size. */ virtual size_t size() const = 0; /** * @brief Get current read position. * @return Gets the current read position. */ virtual size_t tell() const = 0; /** @brief Seek to position in file * * Repositions the offset of the open file to the argument offset according to the directive whence. * * @param[in] offset - offset in bytes * @param[in] whence - how to seek: @n * SEEK_SET: The offset is set to offset bytes. @n * SEEK_CUR: The offset is set to its current location plus offset bytes. @n * SEEK_END: The offset is set to the size of the file plus offset bytes. * @return Upon successful completion, #seek() returns the resulting offset location as measured in bytes * from the beginning of the file. @n * On error, the value -1 is returned and errno is set to indicate the error. */ virtual int seek(int64_t offset, int whence) = 0; /** * @brief Check if at end of file. * @return Returns true if at end of file. */ virtual bool eof() const = 0; /** * @brief Close virtual file. */ virtual void closeio() = 0; /** * @brief Get virtual file object * @return Current virtual file object or nullptr if unset. */ LPVIRTUALFILE virtualfile(); /** * @brief Get source filename. * @return Returns source filename. */ const std::string & filename() const; /** * @brief Path to source file (without file name) * @return Returns path to source file. */ const std::string & path() const; protected: /** @brief Set the virtual file object. * @param[in] virtualfile - LPCVIRTUALFILE of file to set. */ void set_virtualfile(LPVIRTUALFILE virtualfile); private: std::string m_path; /**< @brief Source path (directory without file name) */ LPVIRTUALFILE m_virtualfile; /**< @brief Virtual file object of current file */ }; #endif // FILEIO_H ffmpegfs-2.18/src/cache_entry.h0000644000000000000000000002352315166175407013375 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file cache_entry.h * @brief %Cache entry * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef CACHE_ENTRY_H #define CACHE_ENTRY_H #pragma once #include "cache.h" #include "id3v1tag.h" #include class Buffer; /** * @brief The #Cache_Entry class */ class Cache_Entry { private: /** * @brief Create Cache_Entry object. * @param[in] owner - Cache object of owner. * @param[in] virtualfile - Requesting virtual file. */ explicit Cache_Entry(Cache *owner, LPVIRTUALFILE virtualfile); /** * @brief Copy constructor declared deleted, should use create to get this object to maintain reference count. */ Cache_Entry(Cache_Entry &) = delete; /** * @brief Destroy Cache_Entry object. */ virtual ~Cache_Entry(); public: /** * @brief operator = declared deleted, should use create to get this object to maintain reference count. * @param[in] other - Assignment object * @return Pointer to this */ Cache_Entry & operator= (Cache_Entry const & other) = delete; /** * @brief Create a new Cache_Entry object. * @param[in] owner - Cache object of owner. * @param[in] virtualfile - Requesting virtual file. * @return On success, returns a Cache_Entry object; on error (out of memory) returns a nullptr */ static Cache_Entry * create(Cache *owner, LPVIRTUALFILE virtualfile); /** * @brief Destroy this Cache_Entry object. * @return true if object was destroyed right away; false if it will be destroyed later (NOT IMPLEMENTED, WILL BE DESTROYED AT ONCE). */ bool destroy(); /** * @brief Open the cache file. * @param[in] create_cache - If true, the cache will be created if it does not yet exist. * @return On success returns true; on error returns false and errno contains the error code. */ bool openio(bool create_cache = true); /** * @brief Flush current memory cache to disk. * @return On success returns true; on error returns false and errno contains the error code. */ bool flush(); /** * @brief Clear the cache entry * @param[in] fetch_file_time - If true, the entry file time will be filled in from the source file. */ void clear(bool fetch_file_time = true); /** @brief Return size of output file, as computed by encoder. * * Returns the file size, either the predicted size (which may be inaccurate) or * the real size (which is only available once the file was completely recoded). * * @return The size of the file. Function never fails. */ size_t size() const; /** * @brief Get the video frame count. * @return On success, returns the number of frames; on error, returns 0 (calculation failed or no video source file). */ uint32_t video_frame_count() const; /** * @brief Get the age of the cache entry. * @return Returns the age of the cache entry in seconds since epoch. */ time_t age() const; /** * @brief Get last access time. * @return Returns last access time in seconds since epoch. */ time_t last_access() const; /** * @brief Check if cache entry expired. * * Checks if entry is older or larger than the limit. * * @return If entry is expired, returns true. */ bool expired() const; /** * @brief Check for decode suspend timeout. * @return Returns true if decoding was suspended. */ bool suspend_timeout() const; /** * @brief Check for decode timeout. * @return Returns true if decoding timed out. */ bool decode_timeout() const; /** * @brief Return source filename. * @return Returns the name of the transcoded file. */ const char * filename() const; /** * @brief Return destination filename. * @return Returns the name of the transcoded file. */ const char * destname() const; /** * @brief Return virtual filename. Same as destination filename, but with virtual (mount) path.. * @return Returns the name of the transcoded file. */ const char * virtname() const; /** * @brief Update last access time. * @param[in] update_database - If true, also persist in SQL database. * @return If update was successful, returns true; returns false on error. */ bool update_access(bool update_database = false); /** * @brief Lock the access mutex. */ void lock(); /** * @brief Unlock the access mutex. */ void unlock(); /** * @brief Get the current reference counter. * @return Returns the current reference counter. */ int ref_count() const; /** * @brief Increment the current reference counter. * @return Returns the current reference counter. */ int inc_refcount(); /** * @brief Decrement the current reference counter. * @return Returns the current reference counter. */ int decr_refcount(); /** * @brief Check if cache entry needs to be recoded */ bool outdated() const; /** * @brief Get the underlying VIRTUALFILE object. * @return Return the underlying VIRTUALFILE object. */ LPVIRTUALFILE virtualfile(); /** * @brief Close the cache entry * @param[in] flags - one of the CACHE_CLOSE_* flags * @return Returns true if entry may be deleted, false if still in use. */ bool closeio(int flags); /** * @brief Update read counter. */ void update_read_count(); /** * @brief Get read counter. * * This is the number of read accesses to the cache entry. * * @return Returns current read counter */ unsigned int read_count() const; /** * @brief Get if cache has been finished. * @return Returns true if cache is finished, false if not. */ bool is_finished() const; /** * @brief Get if cache has been finished, but not completely filled. * @return Returns true if cache is finished, but not completely filled, false if not. */ bool is_finished_incomplete() const; /** * @brief Get if cache has been finished and filled successfully. * @return Returns true if cache is finished successfully, false if not. */ bool is_finished_success() const; /** * @brief Get if cache has been finished and with an error. * @return Returns true if cache is finished with error, false if not. */ bool is_finished_error() const; protected: /** * @brief Close buffer object. * @param[in] flags - one of the CACHE_CLOSE_* flags */ void close_buffer(int flags); /** * @brief Read cache info. * @return On success, returns true; returns false on error. */ bool read_info(); /** * @brief Write cache info. * @return On success, returns true; returns false on error. */ bool write_info(); /** * @brief Delete cache info. * @return On success, returns true; returns false on error. */ bool delete_info(); protected: Cache * m_owner; /**< @brief Owner cache object */ std::recursive_mutex m_mutex; /**< @brief Access mutex */ std::atomic_int m_ref_count; /**< @brief Reference counter */ LPVIRTUALFILE m_virtualfile; /**< @brief Underlying virtual file object */ public: std::unique_ptr m_buffer; /**< @brief Buffer object */ std::atomic_bool m_is_decoding; /**< @brief true while file is decoding */ std::recursive_mutex m_active_mutex; /**< @brief Mutex while thread is active */ std::recursive_mutex m_restart_mutex; /**< @brief Mutex while thread is restarted */ std::atomic_bool m_suspend_timeout; /**< @brief true to temporarly disable read_frame timeout */ CACHE_INFO m_cache_info; /**< @brief Info about cached object */ ID3v1 m_id3v1; /**< @brief ID3v1 structure which is used to send to clients */ std::atomic_uint32_t m_seek_to_no; /**< @brief If not 0, seeks to specified frame */ }; #endif // CACHE_ENTRY_H ffmpegfs-2.18/src/logging.cc0000644000000000000000000001744215166175407012700 00000000000000/* * Copyright (C) 2017 Original author K. Henriksson * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file logging.cc * @brief Log facilities implementation * * @ingroup ffmpegfs * * @author K. Henriksson, Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017 Original author K. Henriksson @n * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "logging.h" #include "ffmpegfs.h" #include #include #include #include #include #define COLOUR_BLACK "\033[0;30m" /**< @brief ANSI ESC for black foreground */ #define COLOUR_DARK_GRAY "\033[1;30m" /**< @brief ANSI ESC for dark gray foreground */ #define COLOUR_LIGHT_GRAY "\033[0;37m" /**< @brief ANSI ESC for light gray foreground */ #define COLOUR_RED "\033[0;31m" /**< @brief ANSI ESC for red foreground */ #define COLOUR_LIGHT_RED "\033[1;31m" /**< @brief ANSI ESC for light red foreground */ #define COLOUR_GREEN "\033[0;32m" /**< @brief ANSI ESC for green foreground */ #define COLOUR_LIGHT_GREEN "\033[1;32m" /**< @brief ANSI ESC for light green foreground */ #define COLOUR_BROWN_ORANGE "\033[0;33m" /**< @brief ANSI ESC for brown orange foreground */ #define COLOUR_YELLOW "\033[1;33m" /**< @brief ANSI ESC for yellow foreground */ #define COLOUR_BLUE "\033[0;34m" /**< @brief ANSI ESC for blue foreground */ #define COLOUR_LIGHT_BLUE "\033[1;34m" /**< @brief ANSI ESC for light blue foreground */ #define COLOUR_PURPLE "\033[0;35m" /**< @brief ANSI ESC for purple foreground */ #define COLOUR_LIGHT_PURPLE "\033[1;35m" /**< @brief ANSI ESC for light purple foreground */ #define COLOUR_CYAN "\033[0;36m" /**< @brief ANSI ESC for cyan foreground */ #define COLOUR_LIGHT_CYAN "\033[1;36m" /**< @brief ANSI ESC for light cyan foreground */ #define COLOUR_WHITE "\033[1;37m" /**< @brief ANSI ESC for white foreground */ #define COLOUR_RESET "\033[0m" /**< @brief ANSI ESC to reset the foreground colour */ std::unique_ptr Logging::m_logging; std::recursive_mutex Logging::m_mutex; const std::map Logging::Logger::m_syslog_level_map = { { LOGERROR, LOG_ERR }, { LOGWARN, LOG_WARNING }, { LOGINFO, LOG_INFO }, { LOGDEBUG, LOG_DEBUG }, { LOGTRACE, LOG_DEBUG }, }; const std::map Logging::Logger::m_level_name_map = { { LOGERROR, "ERROR " }, { LOGWARN, "WARNING" }, { LOGINFO, "INFO " }, { LOGDEBUG, "DEBUG " }, { LOGTRACE, "TRACE " }, }; const std::map Logging::Logger::m_level_colour_map = { { LOGERROR, COLOUR_RED }, { LOGWARN, COLOUR_YELLOW }, { LOGINFO, COLOUR_WHITE }, { LOGDEBUG, COLOUR_GREEN }, { LOGTRACE, COLOUR_BLUE }, }; Logging::Logging(const std::string &logfile, LOGLEVEL max_level, bool to_stderr, bool to_syslog) : m_max_level(max_level), m_to_stderr(to_stderr), m_to_syslog(to_syslog) { if (!logfile.empty()) { m_logfile.open(logfile); } if (m_to_syslog) { openlog(PACKAGE, 0, LOG_USER); } } Logging::Logger::~Logger() { std::lock_guard lock_mutex(m_mutex); // Construct string containing time struct timeval tv; long int millisec; std::string time_string(sizeof("YYYY-MM-DD MM:HH:SS.###"), '\0'); // Reserve space for "YYYY-MM-DD MM:HH:SS.###" plus \0 std::string fmt; std::string loglevel; std::string filename; std::string msg; gettimeofday(&tv, NULL); millisec = std::lrint(static_cast(tv.tv_usec) / 1000.0); // Round to nearest millisec if (millisec >= 1000) { // Allow for rounding up to nearest second millisec -= 1000; tv.tv_sec++; } strsprintf(&fmt, "%%F %%T.%03d", millisec); struct tm buf; time_string.resize(strftime(&time_string[0], time_string.size(), fmt.c_str(), localtime_r(&tv.tv_sec, &buf))); // Mind the blank at the end loglevel = m_level_name_map.at(m_loglevel) + ":"; msg = str(); trim(msg); if (!m_filename.empty()) { filename = m_filename; if (replace_start(&filename, params.m_basepath)) { filename = "INPUT [" + filename + "] "; } else if (replace_start(&filename, params.m_mountpath)) { filename = "OUTPUT [" + filename + "] "; } else { std::string cachepath; transcoder_cache_path(&cachepath); if (replace_start(&filename, cachepath + params.m_mountpath + params.m_basepath)) { filename = "CACHE [" + filename + "] "; } else { if (filename.size() && filename[0] == '/') { filename.erase(0, 1); } filename = "OTHER [" + filename + "] "; } } } if (m_logging->m_to_syslog) { syslog(m_syslog_level_map.at(m_loglevel), "%s %s%s", loglevel.c_str(), filename.c_str(), msg.c_str()); } if (m_logging->m_logfile.is_open()) { m_logging->m_logfile << time_string << " " << loglevel << " " << filename << msg << std::endl; } if (m_logging->m_to_stderr) { if (!filename.empty()) { filename = COLOUR_LIGHT_PURPLE + filename + COLOUR_RESET; } if (m_loglevel <= LOGERROR) { msg = COLOUR_LIGHT_RED + msg + COLOUR_RESET; } std::clog << COLOUR_DARK_GRAY << time_string << " " << loglevel << COLOUR_RESET << " " << filename << msg << std::endl; } } bool Logging::GetFail() const { return m_logfile.fail(); } Logging::Logger Log(Logging::LOGLEVEL loglevel, const std::string & filename) { return {loglevel, filename}; } bool Logging::init_logging(const std::string & logfile, LOGLEVEL max_level, bool to_stderr, bool to_syslog) { if (m_logging != nullptr) { // Do not alloc twice return false; } m_logging = std::make_unique(logfile, max_level, to_stderr, to_syslog); if (m_logging == nullptr) { return false; // Out of memory... } return !m_logging->GetFail(); } void Logging::log_with_level(LOGLEVEL loglevel, const char * filename, const std::string & message) { log_with_level(loglevel, std::string(filename != nullptr ? filename : ""), message); } void Logging::log_with_level(LOGLEVEL loglevel, const std::string & filename, const std::string & message) { Log(loglevel, filename) << message; } std::string Logging::format_helper(const std::string &string_to_update, const size_t __attribute__((unused)) index_to_replace) { return string_to_update; } ffmpegfs-2.18/src/dvdparser.cc0000644000000000000000000005310315166175407013236 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ #ifdef USE_LIBDVD /** * @file dvdparser.cc * @brief dvdparser class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "ffmpegfs.h" #include "dvdparser.h" #include "transcode.h" #include "logging.h" #include #include extern "C" { #include } typedef struct AUDIO_SETTINGS /** @brief Audio stream settings */ { BITRATE m_audio_bit_rate; /**< @brief average bitrate of audio data (in bits per second) */ int m_channels; /**< @brief number of channels (1: mono, 2: stereo, or more) */ int m_sample_rate; /**< @brief number of audio samples per second */ } AUDIO_SETTINGS; typedef AUDIO_SETTINGS const *LPCAUDIO_SETTINGS; /**< @brief Pointer to const version of AUDIO_SETTINGS */ typedef AUDIO_SETTINGS *LPAUDIO_SETTINGS; /**< @brief Pointer version of AUDIO_SETTINGS */ typedef struct VIDEO_SETTINGS /** @brief Video stream settings */ { BITRATE m_video_bit_rate; /**< @brief average bitrate of video data (in bits per second) */ int m_width; /**< @brief video width in pixels */ int m_height; /**< @brief video height in pixels */ } VIDEO_SETTINGS; typedef VIDEO_SETTINGS const *LPCVIDEO_SETTINGS; /**< @brief Pointer to const version of VIDEO_SETTINGS */ typedef VIDEO_SETTINGS *LPVIDEO_SETTINGS; /**< @brief Pointer version of VIDEO_SETTINGS */ static int dvd_find_best_audio_stream(const vtsi_mat_t *vtsi_mat, int *best_channels, int *best_sample_frequency); static AVRational dvd_frame_rate(const uint8_t * ptr); static int64_t BCDtime(const dvd_time_t * dvd_time); static bool create_dvd_virtualfile(const ifo_handle_t *vts_file, const std::string & path, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler, bool full_title, int title_idx, int chapter_idx, int angles, int ttnnum, int audio_stream, const AUDIO_SETTINGS & audio_settings, const VIDEO_SETTINGS & video_settings); static int parse_dvd(const std::string & path, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler); /** * @brief Locate best matching audio stream. * @param[in] vtsi_mat - Video Title Set Information (VTSI) * @param[out] best_channels - Number of channels in best stream. * @param[out] best_sample_frequency - Sample frequency in best stream. * @return Returns number of best stream (0..8). */ static int dvd_find_best_audio_stream(const vtsi_mat_t *vtsi_mat, int *best_channels, int *best_sample_frequency) { int best_stream = -1; int best_application_mode = INT_MAX; int best_lang_extension = INT_MAX; int best_quantization = 0; *best_channels = 0; *best_sample_frequency = 0; for(int i = 0; i < vtsi_mat->nr_of_vts_audio_streams; i++) { const audio_attr_t *attr = &vtsi_mat->vts_audio_attr[i]; if (attr->audio_format == 0 && attr->multichannel_extension == 0 && attr->lang_type == 0 && attr->application_mode == 0 && attr->quantization == 0 && attr->sample_frequency == 0 && attr->unknown1 == 0 && attr->channels == 0 && attr->lang_extension == 0 && attr->unknown3 == 0) { // Unspecified continue; } // Preference in this order, if higher value is same, compare next and so on. // // application_mode: prefer not specified. // 0: not specified // 1: karaoke mode // 2: surround sound mode // lang_extension: prefer not specified or normal audio // 0: Not specified // 1: Normal audio/Caption // 2: visually impaired // 3: Director's comments 1 // 4: Director's comments 2 // sample_frequency: maybe 48K only // 0: 48kHz // 1: ??kHz // quantization prefer highest bit width or drc // 0: 16bit // 1: 20bit // 2: 24bit // 3: drc // channels: prefer no extension // multichannel_extension // if ((best_multiframe > multiframe) || // (best_multiframe == multiframe && best_bitrate > bitrate) || // (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count)) // Specs keep the meaning of the values of this field other than 0 secret, so we nail it to 48 kHz. int sample_frequency = 48000; if ((best_application_mode < attr->application_mode) || (best_application_mode == attr->application_mode && best_lang_extension < attr->lang_extension) || (best_application_mode == attr->application_mode && best_lang_extension == attr->lang_extension && *best_sample_frequency > sample_frequency) || (best_application_mode == attr->application_mode && best_lang_extension == attr->lang_extension && *best_sample_frequency == sample_frequency && *best_channels > attr->channels) || (best_application_mode == attr->application_mode && best_lang_extension == attr->lang_extension && *best_sample_frequency == sample_frequency && *best_channels == attr->channels && best_quantization > attr->quantization) ) { continue; } best_stream = i; best_application_mode = attr->application_mode; best_lang_extension = attr->lang_extension; *best_sample_frequency = sample_frequency; *best_channels = attr->channels; best_quantization = attr->quantization; } if (best_stream > -1) { ++*best_channels; } return best_stream; } /** * @brief Get the frame rate of the DVD. Can be 25 fps (PAL) or 29.97 (NTCS). * @param[in] ptr - Pointer to frame_u element in dvd_time_t structure. * @return On success, returns AVRational with frame rate. On error, returns frame rate { 0, 0 }. */ static AVRational dvd_frame_rate(const uint8_t * ptr) { AVRational framerate = { 0, 0 }; // 11 = 30 fps, 10 = illegal, 01 = 25 fps, 00 = illegal unsigned fps = ((ptr[3] & 0xC0) >> 6) & 0x03; switch (fps) { case 3: // PAL { framerate = av_make_q(25000, 1000); break; } case 1: // NTSC { framerate = av_make_q(30000, 10001); break; } default: { // Frame rate is illegal, so we need to set anything. Assume PAL. framerate = av_make_q(25000, 1000); break; } } return framerate; } /** * @brief Convert a time in BCD format into AV_TIMEBASE fractional seconds. * @param[in] dvd_time - dvd_time_t object. * @return Time in AV_TIMEBASE fractional seconds. */ static int64_t BCDtime(const dvd_time_t * dvd_time) { std::array time; AVRational framerate = dvd_frame_rate(&dvd_time->frame_u); if (!framerate.den) { framerate = av_make_q(25000, 1000); // Avoid divisions by 0 } time[0] = dvd_time->hour; time[1] = dvd_time->minute; time[2] = dvd_time->second; time[3] = dvd_time->frame_u & 0x3F; // Number of frame // convert BCD (two digits) to binary for (int64_t & tm : time) { tm = ((tm & 0xf0) >> 4) * 10 + (tm & 0x0f); } return (AV_TIME_BASE * (time[0] * 3600 + time[1] * 60 + time[2]) + static_cast(static_cast(AV_TIME_BASE * time[3]) / av_q2d(framerate))); } /** * @brief Create a virtual file for a DVD. * @param[in] vts_file - Structure defines an IFO file * @param[in] path - Path to DVD files. * @param[in] statbuf - File status structure of original file. * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @param[in] full_title - If true, create virtual file of all title. If false, include single chapter only. * @param[in] title_idx - Index of DVD title. * @param[in] chapter_idx - Index of DVD chapter. * @param[in] angles - Number of angles. * @param[in] ttnnum - DVD title number. * @param[in] audio_stream - Audio stream index. * @param[in] audio_settings - Audio stream settings. * @param[in] video_settings - Video stream settings. * @return Returns true if successful. Returns false on error. */ static bool create_dvd_virtualfile(const ifo_handle_t *vts_file, const std::string & path, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler, bool full_title, int title_idx, int chapter_idx, int angles, int ttnnum, int audio_stream, const AUDIO_SETTINGS & audio_settings, const VIDEO_SETTINGS & video_settings) { const vts_ptt_srpt_t *vts_ptt_srpt = vts_file->vts_ptt_srpt; int title_no = title_idx + 1; int chapter_no = chapter_idx + 1; int pgcnum = vts_ptt_srpt->title[ttnnum - 1].ptt[chapter_idx].pgcn; int pgn = vts_ptt_srpt->title[ttnnum - 1].ptt[chapter_idx].pgn; const pgc_t *cur_pgc = vts_file->vts_pgcit->pgci_srp[pgcnum - 1].pgc; AVRational framerate; int64_t duration = 0; uint64_t size = 0; bool interleaved = false; int start_cell = cur_pgc->program_map[pgn - 1] - 1; int end_cell = 0; if (pgn < cur_pgc->nr_of_programs && !full_title) { end_cell = cur_pgc->program_map[pgn] - 1; } else { end_cell = cur_pgc->nr_of_cells; } interleaved = cur_pgc->cell_playback[start_cell].interleaved ? true : false; framerate = dvd_frame_rate(&cur_pgc->cell_playback[start_cell].playback_time.frame_u); bool has_angles = false; for (int cell_no = start_cell; cell_no < end_cell; cell_no++) { cell_playback_t *cell_playback = &cur_pgc->cell_playback[cell_no]; // Only count normal cells and the first of an angle to avoid duplicate sizes if (cell_playback->block_mode == static_cast(BLOCK_MODE_NOT_IN_BLOCK) || cell_playback->block_mode == static_cast(BLOCK_MODE_FIRST_CELL)) { size += (cell_playback->last_sector - cell_playback->first_sector) * 2048; duration += BCDtime(&cell_playback->playback_time); } if (cell_playback->block_type == static_cast(BLOCK_TYPE_ANGLE_BLOCK)) { has_angles = true; } } if (duration < params.m_min_dvd_chapter_duration * AV_TIME_BASE) { Logging::debug(nullptr, "Skipping short DVD chapter."); return true; } if (!has_angles) { // If this chapter has no angle cells, reset angles to 1 angles = 1; } // Split file if chapter has several angles for (int angle_idx = 0; angle_idx < angles; angle_idx++) { std::string title_buf; int angle_no = angle_idx + 1; // can safely assume this a video if (!full_title) { // Single chapter if (angles > 1) { strsprintf(&title_buf, "%02d. Chapter %03d (Angle %d) [%s].%s", title_no, chapter_no, angle_no, replace_all(format_duration(duration), ":", "-").c_str(), ffmpeg_format[FORMAT::VIDEO].fileext().c_str()); } else { strsprintf(&title_buf, "%02d. Chapter %03d [%s].%s", title_no, chapter_no, replace_all(format_duration(duration), ":", "-").c_str(), ffmpeg_format[FORMAT::VIDEO].fileext().c_str()); } } else { // Full title if (angles > 1) { strsprintf(&title_buf, "%02d. Title (Angle %d) [%s].%s", title_no, angle_no, replace_all(format_duration(duration), ":", "-").c_str(), ffmpeg_format[FORMAT::VIDEO].fileext().c_str()); } else { strsprintf(&title_buf, "%02d. Title [%s].%s", title_no, replace_all(format_duration(duration), ":", "-").c_str(), ffmpeg_format[FORMAT::VIDEO].fileext().c_str()); } } LPVIRTUALFILE virtualfile = nullptr; if (!ffmpeg_format[FORMAT::VIDEO].is_multiformat()) { virtualfile = insert_file(VIRTUALTYPE::DVD, path + title_buf, statbuf); } else { virtualfile = insert_dir(VIRTUALTYPE::DVD, path + title_buf, statbuf); } if (virtualfile == nullptr) { Logging::error(path, "Failed to create virtual path: %1", (path + title_buf).c_str()); errno = EIO; return false; } if (add_fuse_entry(buf, filler, title_buf, &virtualfile->m_st, 0)) { // break; } // DVD is video format anyway virtualfile->m_format_idx = 0; // Mark title/chapter/angle virtualfile->m_full_title = full_title; virtualfile->m_dvd.m_title_no = title_no; virtualfile->m_dvd.m_chapter_no = chapter_no; virtualfile->m_dvd.m_angle_no = angle_no; if (!transcoder_cached_filesize(virtualfile, &virtualfile->m_st)) { virtualfile->m_duration = duration; BITRATE video_bit_rate = 8*1024*1024; // In case the real bitrate cannot be calculated later, assume 8 Mbit video bitrate if (duration) { /** * @todo We actually calculate the overall DVD bitrate here, including all audio * streams, not just the video bitrate. This should be the video bitrate alone. We * should also calculate the audio bitrate for the selected stream. */ video_bit_rate = static_cast(size * 8LL * AV_TIME_BASE / static_cast(duration)); // calculate bitrate in bps } Logging::trace(virtualfile->m_destfile, "Video %1 %2x%3@%<5.2f>4%5 fps %6 [%7]", format_bitrate(video_settings.m_video_bit_rate).c_str(), video_settings.m_width, video_settings.m_height, av_q2d(framerate), interleaved ? "i" : "p", format_size(size).c_str(), format_duration(duration).c_str()); virtualfile->m_width = video_settings.m_width; virtualfile->m_height = video_settings.m_height; virtualfile->m_framerate = framerate; if (audio_stream > -1) { Logging::trace(virtualfile->m_destfile, "Audio Channels %1 Sample Rate %2", audio_settings.m_channels, audio_settings.m_sample_rate); virtualfile->m_channels = audio_settings.m_channels; virtualfile->m_sample_rate = audio_settings.m_sample_rate; } transcoder_set_filesize(virtualfile, duration, audio_settings.m_audio_bit_rate, audio_settings.m_channels, audio_settings.m_sample_rate, AV_SAMPLE_FMT_NONE, video_bit_rate, video_settings.m_width, video_settings.m_height, interleaved, framerate); virtualfile->m_video_frame_count = static_cast(av_rescale_q(duration, av_get_time_base_q(), av_inv_q(framerate))); virtualfile->m_predicted_size = static_cast(size); } } return true; } /** * @brief Parse DVD directory and get all DVD titles and chapters as virtual files. * @param[in] path - Path to check. * @param[in] statbuf - File status structure of original file. * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @return On success, returns number of chapters found. On error, returns -errno. */ static int parse_dvd(const std::string & path, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler) { dvd_reader_t *dvd; ifo_handle_t *ifo_file; tt_srpt_t *tt_srpt; int titles; bool success = true; Logging::debug(path, "Parsing the DVD."); dvd = DVDOpen(path.c_str()); if (dvd == nullptr) { Logging::error(path, "Couldn't open the DVD."); return ENOENT; } ifo_file = ifoOpen(dvd, 0); if (ifo_file == nullptr) { Logging::error(path, "Can't open VMG info for the DVD."); DVDClose(dvd); return -EINVAL; } tt_srpt = ifo_file->tt_srpt; titles = tt_srpt->nr_of_srpts; Logging::debug(path, "There are %1 titles on this DVD.", titles); for (int title_idx = 0; title_idx < titles && success; ++title_idx) { ifo_handle_t *vts_file; int vtsnum = tt_srpt->title[title_idx].title_set_nr; int ttnnum = tt_srpt->title[title_idx].vts_ttn; int chapters = tt_srpt->title[title_idx].nr_of_ptts; int angles = tt_srpt->title[title_idx].nr_of_angles; Logging::trace(path, "Title: %1 VTS: %2 TTN: %3", title_idx + 1, vtsnum, ttnnum); Logging::trace(path, "DVD title has %1 chapters and %2 angles.", chapters, angles); vts_file = ifoOpen(dvd, vtsnum); if (vts_file == nullptr) { Logging::error(path, "Can't open info file for title %1.", vtsnum); DVDClose(dvd); return -EINVAL; } // Set reasonable defaults AUDIO_SETTINGS audio_settings; audio_settings.m_audio_bit_rate = 256000; audio_settings.m_channels = 2; audio_settings.m_sample_rate = 48000; int audio_stream = 0; VIDEO_SETTINGS video_settings; video_settings.m_video_bit_rate = 8000000; video_settings.m_width = 720; video_settings.m_height = 576; if (vts_file->vtsi_mat) { audio_stream = dvd_find_best_audio_stream(vts_file->vtsi_mat, &audio_settings.m_channels, &audio_settings.m_sample_rate); video_settings.m_height = (vts_file->vtsi_mat->vts_video_attr.video_format != 0) ? 576 : 480; switch(vts_file->vtsi_mat->vts_video_attr.picture_size) { case 0: { video_settings.m_width = 720; break; } case 1: { video_settings.m_width = 704; break; } case 2: { video_settings.m_width = 352; break; } case 3: { video_settings.m_width = 352; video_settings.m_height /= 2; break; } default: { Logging::warning(path, "DVD video contains invalid picture size attribute."); } } } // Add separate chapters for (int chapter_idx = 0; chapter_idx < chapters && success; ++chapter_idx) { success = create_dvd_virtualfile(vts_file, path, statbuf, buf, filler, false, title_idx, chapter_idx, angles, ttnnum, audio_stream, audio_settings, video_settings); } if (success && chapters > 1) { // If more than 1 chapter, add full title as well success = create_dvd_virtualfile(vts_file, path, statbuf, buf, filler, true, title_idx, 0, 1, ttnnum, audio_stream, audio_settings, video_settings); } ifoClose(vts_file); } ifoClose(ifo_file); DVDClose(dvd); if (success) { return titles; // Number of titles on disk } else { return -errno; } } int check_dvd(const std::string & path, void *buf, fuse_fill_dir_t filler) { std::string _path(path); struct stat stbuf; int res = 0; append_sep(&_path); if (stat((_path + "VIDEO_TS.IFO").c_str(), &stbuf) == 0 || stat((_path + "VIDEO_TS/VIDEO_TS.IFO").c_str(), &stbuf) == 0) { if (!check_path(_path)) { Logging::trace(_path, "DVD detected."); res = parse_dvd(_path, &stbuf, buf, filler); Logging::trace(_path, "%1 titles were discovered.", res); } else { res = load_path(_path, &stbuf, buf, filler); } add_dotdot(buf, filler, &stbuf, 0); } return res; } #endif // USE_LIBDVD ffmpegfs-2.18/src/dvdio.h0000644000000000000000000002316415166175407012217 00000000000000/* * Copyright (C) 2018-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file dvdio.h * @brief DVD I/O * * This is only available if built with -DUSE_LIBDVD parameter. * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2018-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef DVDIO_H #define DVDIO_H #pragma once #ifdef USE_LIBDVD #include "fileio.h" #include #include /** @brief DVD I/O class */ class DvdIO : public FileIO { /** * @brief Type of a DSI block. * * This is used to identify a DSI block on a DVD: Until end of a chapter * we simply continue. At the end of chapters we may stop continue to * the end of a title */ enum class DSITYPE { CONTINUE, /**< @brief Chapter continues */ EOF_CHAPTER, /**< @brief End of chapter */ EOF_TITLE /**< @brief End of title */ }; public: /** * @brief Create #DvdIO object */ explicit DvdIO(); /** * @brief Free #DvdIO object */ virtual ~DvdIO(); /** * @brief Get type of the virtual file * @return Returns the type of the virtual file. */ virtual VIRTUALTYPE type() const override; /** * @brief Get the ideal buffer size. * @return Return the ideal buffer size. */ virtual size_t bufsize() const override; /** * @brief Open a virtual file * @param[in] virtualfile - LPCVIRTUALFILE of file to open * @return Upon successful completion, #openio() returns 0. @n * On error, an nonzero value is returned and errno is set to indicate the error. */ virtual int openio(LPVIRTUALFILE virtualfile) override; /** * @brief Read data from file * @param[out] data - buffer to store read bytes in. Must be large enough to hold up to size bytes. * Special case: If set to nullptr as many bytes as possible are "read" (and discarded). Can be used * to determine the net file size of the virtual stream. * @param[in] size - number of bytes to read * @return Upon successful completion, #readio() returns the number of bytes read. @n * This may be less than size. @n * On error, the value 0 is returned and errno is set to indicate the error. @n * If at end of file, 0 may be returned by errno not set. error() will return 0 if at EOF. */ virtual size_t readio(void *data, size_t size) override; /** * @brief Get last error. * @return errno value of last error. */ virtual int error() const override; /** * @brief Get the duration of the file, in AV_TIME_BASE fractional seconds. * @return Returns the duration of the file, in AV_TIME_BASE fractional seconds. */ virtual int64_t duration() const override; /** * @brief Get the file size. * @return Returns the file size. */ virtual size_t size() const override; /** * @brief Get current read position. * @return Gets the current read position. */ virtual size_t tell() const override; /** * @brief Seek to position in file * * Repositions the offset of the open file to the argument offset according to the directive whence. * * @param[in] offset - offset in bytes * @param[in] whence - how to seek: @n * SEEK_SET: The offset is set to offset bytes. @n * SEEK_CUR: The offset is set to its current location plus offset bytes. @n * SEEK_END: The offset is set to the size of the file plus offset bytes. * @return Upon successful completion, #seek() returns the resulting offset location as measured in bytes * from the beginning of the file. @n * On error, the value -1 is returned and errno is set to indicate the error. */ virtual int seek(int64_t offset, int whence) override; /** * @brief Check if at end of file. * @return Returns true if at end of file. */ virtual bool eof() const override; /** * @brief Close virtual file. */ virtual void closeio() override; private: /** * @brief Close virtual file. * Non-virtual version to be safely called from constructor/destructor */ void pvt_close(); /** * @brief Do a rough check if this is really a navigation packet. * @param[in] buffer - Buffer with data. * @return true if the pack is a NAV pack. */ bool is_nav_pack(const unsigned char *buffer) const; /** * @brief return the size of the next packet * @param[in] p - Buffer with PES data. * @param[in] peek - How many bytes to peek. * @param[in] size - Size of the next packet * @return Size ofr ID invalid. */ bool get_packet_size(const uint8_t *p, size_t peek, size_t *size) const; /** * @brief return the id of a Packetized Elementary Stream (PES) (should be valid) * @param[in] buffer - Buffer with PES data. * @param[in] size - Size of buffer. * @return The id of a PES (should be valid) */ int get_pes_id(const uint8_t *buffer, size_t size) const; /** * @brief Extract only the interesting portion of the VOB input stream * @param[out] out - Stream stripped from unnessessary data * @param[in] in - Input raw stream * @param[in] len - Length of input raw stream * @return Size of restulting data block. */ size_t demux_pes(uint8_t *out, const uint8_t *in, size_t len) const; /** * @brief Handle DSI (Data Search Information) packet * @param[out] _dsi_pack - buffer with DSI packet. * @param[out] cur_output_size - Net size of packet. * @param[out] next_block - Address of next VOBU (Video Object Unit). * @param[out] data - Data extracted from DSI packet. * @return */ DSITYPE handle_DSI(void *_dsi_pack, size_t *cur_output_size, unsigned int * next_block, uint8_t *data); /** * @brief Goto next DVD cell */ void next_cell(); /** * @brief Rewind to start of stream */ void rewind(); protected: dvd_reader_t * m_dvd; /**< @brief DVD reader handle */ dvd_file_t * m_dvd_title; /**< @brief DVD title handle */ ifo_handle_t * m_vmg_file; /**< @brief DVD video manager handle */ ifo_handle_t * m_vts_file; /**< @brief DVD video title stream handle */ pgc_t * m_cur_pgc; /**< @brief Current program chain */ int m_start_cell; /**< @brief Start cell */ int m_end_cell; /**< @brief End cell (of title) */ int m_cur_cell; /**< @brief Current cell */ int m_next_cell; /**< @brief Next cell to be processed */ bool m_goto_next_cell; /**< @brief If logc needs to go to next cell before next read */ unsigned int m_cur_block; /**< @brief Current processing block */ bool m_is_eof; /**< @brief true if at "end of file", i.e, end of chapter or title */ int m_errno; /**< @brief errno of last operation */ size_t m_rest_size; /**< @brief Rest bytes in buffer */ size_t m_rest_pos; /**< @brief Position in buffer */ size_t m_cur_pos; /**< @brief Current position in virtual file */ bool m_full_title; /**< @brief If true, ignore m_chapter_no and provide full track */ int m_title_idx; /**< @brief Track index (track number - 1) */ int m_chapter_idx; /**< @brief Chapter index (chapter number - 1) */ int m_angle_idx; /**< @brief Selected angle index (angle number -1) */ std::array m_data; /**< @brief Buffer for readio() data */ std::array m_buffer; /**< @brief Buffer for data extracted from VOB file */ int64_t m_duration; /**< @brief Track/chapter duration, in AV_TIME_BASE fractional seconds. */ size_t m_size; /**< @brief Size of virtual file */ }; #endif // USE_LIBDVD #endif // DVDIO_H ffmpegfs-2.18/src/cache.cc0000644000000000000000000013726615166175407012324 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file cache.cc * @brief Cache class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "cache.h" #include "cache_entry.h" #include "ffmpegfs.h" #include "logging.h" #include #include #include #ifndef HAVE_SQLITE_ERRSTR #define sqlite3_errstr(rc) "" /**< @brief If our version of SQLite hasn't go this function */ #endif // HAVE_SQLITE_ERRSTR #define STRINGIFY(x) #x /**< @brief Stringification helper for STRINGIFY. Not to be used separately. */ #define TOSTRING(x) STRINGIFY(x) /**< @brief Convert a macro argument into a string constant */ Cache::sqlite_t::sqlite_t(const std::string & filename, int flags, const char *zVfs) : m_ret(SQLITE_OK) , m_filename(filename) , m_select_stmt(nullptr) , m_insert_stmt(nullptr) , m_delete_stmt(nullptr) { m_ret = sqlite3_open_v2(m_filename.c_str(), &m_db_handle, flags, zVfs); } Cache::sqlite_t::~sqlite_t() { if (m_db_handle != nullptr) { #ifdef HAVE_SQLITE_CACHEFLUSH flush_index(); #endif // HAVE_SQLITE_CACHEFLUSH sqlite3_finalize(m_select_stmt); sqlite3_finalize(m_insert_stmt); sqlite3_finalize(m_delete_stmt); sqlite3_close(m_db_handle); } sqlite3_shutdown(); } const Cache::TABLE_DEF Cache::m_table_cache_entry = { // // Table name // "cache_entry", // // Primary key // "PRIMARY KEY(`filename`,`desttype`)" }; const Cache::TABLECOLUMNS_VEC Cache::m_columns_cache_entry = { // // Primary key: filename + desttype // { "filename", "TEXT NOT NULL" }, { "desttype", "CHAR ( 10 ) NOT NULL" }, // // Encoding parameters // { "enable_ismv", "BOOLEAN NOT NULL" }, { "audiobitrate", "UNSIGNED INT NOT NULL" }, { "audiosamplerate", "UNSIGNED INT NOT NULL" }, { "videobitrate", "UNSIGNED INT NOT NULL" }, { "videowidth", "UNSIGNED INT NOT NULL" }, { "videoheight", "UNSIGNED INT NOT NULL" }, { "deinterlace", "BOOLEAN NOT NULL" }, // // Encoding results // { "duration", "UNSIGNED BIG INT NOT NULL" }, { "predicted_filesize", "UNSIGNED BIG INT NOT NULL" }, { "encoded_filesize", "UNSIGNED BIG INT NOT NULL" }, { "video_frame_count", "UNSIGNED BIG INT NOT NULL" }, { "segment_count", "UNSIGNED BIG INT NOT NULL" }, { "finished", "INT NOT NULL" }, { "error", "BOOLEAN NOT NULL" }, { "errno", "INT NOT NULL" }, { "averror", "INT NOT NULL" }, { "creation_time", "DATETIME NOT NULL" }, { "access_time", "DATETIME NOT NULL" }, { "file_time", "DATETIME NOT NULL" }, { "file_size", "UNSIGNED BIG INT NOT NULL" } }; const Cache::TABLE_DEF Cache::m_table_version = { // // Table name // "version", // nullptr }; const Cache::TABLECOLUMNS_VEC Cache::m_columns_version = { { "db_version_major", "INTEGER NOT NULL" }, { "db_version_minor", "INTEGER NOT NULL" } }; Cache::Cache() { } Cache::~Cache() { // Clean up memory for (auto& [key, value] : m_cache) { value->destroy(); } m_cache.clear(); close_index(); } bool Cache::prepare_stmts() { int ret; const char * sql; sql = "INSERT OR REPLACE INTO cache_entry\n" "(filename, desttype, enable_ismv, audiobitrate, audiosamplerate, videobitrate, videowidth, videoheight, deinterlace, duration, predicted_filesize, encoded_filesize, video_frame_count, segment_count, finished, error, errno, averror, creation_time, access_time, file_time, file_size) VALUES\n" "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime(?, 'unixepoch'), datetime(?, 'unixepoch'), datetime(?, 'unixepoch'), ?);\n"; if (SQLITE_OK != (ret = sqlite3_prepare_v2(*m_cacheidx_db, sql, -1, &m_cacheidx_db->m_insert_stmt, nullptr))) { Logging::error(m_cacheidx_db->filename(), "Failed to prepare insert: (%1) %2\n%3", ret, sqlite3_errmsg(*m_cacheidx_db), sql); return false; } sql = "SELECT desttype, enable_ismv, audiobitrate, audiosamplerate, videobitrate, videowidth, videoheight, deinterlace, duration, predicted_filesize, encoded_filesize, video_frame_count, segment_count, finished, error, errno, averror, strftime('%s', creation_time), strftime('%s', access_time), strftime('%s', file_time), file_size FROM cache_entry WHERE filename = ? AND desttype = ?;\n"; if (SQLITE_OK != (ret = sqlite3_prepare_v2(*m_cacheidx_db, sql, -1, &m_cacheidx_db->m_select_stmt, nullptr))) { Logging::error(m_cacheidx_db->filename(), "Failed to prepare select: (%1) %2\n%3", ret, sqlite3_errmsg(*m_cacheidx_db), sql); return false; } sql = "DELETE FROM cache_entry WHERE filename = ? AND desttype = ?;\n"; if (SQLITE_OK != (ret = sqlite3_prepare_v2(*m_cacheidx_db, sql, -1, &m_cacheidx_db->m_delete_stmt, nullptr))) { Logging::error(m_cacheidx_db->filename(), "Failed to prepare delete: (%1) %2\n%3", ret, sqlite3_errmsg(*m_cacheidx_db), sql); return false; } return true; } bool Cache::table_exists(const char *table) { std::string sql; sqlite3_stmt * stmt = nullptr; int results = 0; int ret; sql = "SELECT Count(*) FROM sqlite_master WHERE type='table' AND name='"; sql += table; sql += "'"; if (SQLITE_OK != (ret = sqlite3_prepare_v2(*m_cacheidx_db, sql.c_str(), -1, &stmt, nullptr))) { Logging::error(m_cacheidx_db->filename(), "Failed to prepare statement for table_exists: (%1) %2\n%3", ret, sqlite3_errmsg(*m_cacheidx_db), sql.c_str()); return false; } ret = sqlite3_step(stmt); if (ret == SQLITE_ROW) { results = sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); return (results == 1); } bool Cache::column_exists(const char *table, const char *column) { std::string sql; sqlite3_stmt * stmt = nullptr; int results = 0; int ret; sql = "SELECT COUNT(*) AS CNTREC FROM pragma_table_info('"; sql += table; sql += "') WHERE name='"; sql += column; sql += "';"; if (SQLITE_OK != (ret = sqlite3_prepare_v2(*m_cacheidx_db, sql.c_str(), -1, &stmt, nullptr))) { Logging::error(m_cacheidx_db->filename(), "Failed to prepare statement for table_exists: (%1) %2\n%3", ret, sqlite3_errmsg(*m_cacheidx_db), sql.c_str()); return false; } ret = sqlite3_step(stmt); if (ret == SQLITE_ROW) { results = sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); return (results == 1); } bool Cache::check_min_version(int *db_version_major, int *db_version_minor) { std::string sql; sqlite3_stmt * stmt = nullptr; int ret; sql = "SELECT db_version_major, db_version_minor FROM version;"; if (SQLITE_OK != (ret = sqlite3_prepare_v2(*m_cacheidx_db, sql.c_str(), -1, &stmt, nullptr))) { Logging::error(m_cacheidx_db->filename(), "Failed to prepare statement for check_min_version: (%1) %2\n%3", ret, sqlite3_errmsg(*m_cacheidx_db), sql.c_str()); return false; } ret = sqlite3_step(stmt); if (ret == SQLITE_ROW) { *db_version_major = sqlite3_column_int(stmt, 0); *db_version_minor = sqlite3_column_int(stmt, 1); } sqlite3_finalize(stmt); return (cmp_version(*db_version_major, *db_version_minor, DB_MIN_VERSION_MAJOR, DB_MIN_VERSION_MINOR) >= 0); } int Cache::cmp_version(int version_major_l, int version_minor_l, int version_major_r, int version_minor_r) { if (version_major_l > version_major_r) { return 1; } if (version_major_l < version_major_r) { return -1; } // version_major_l == version_major_r if (version_minor_l > version_minor_r) { return 1; } if (version_minor_l < version_minor_r) { return -1; } // version_minor_l == version_minor_r return 0; } bool Cache::begin_transaction() { char *errmsg = nullptr; const char * sql; int ret; sql = "BEGIN TRANSACTION;"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql, nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 begin transaction failed: (%1) %2\n%3", ret, errmsg, sql); sqlite3_free(errmsg); return false; } return true; } bool Cache::end_transaction() { char *errmsg = nullptr; const char * sql; int ret; sql = "END TRANSACTION;"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql, nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 end transaction failed: (%1) %2\n%3", ret, errmsg, sql); sqlite3_free(errmsg); return false; } return true; } bool Cache::rollback_transaction() { char *errmsg = nullptr; const char * sql; int ret; sql = "ROLLBACK;"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql, nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 rollback transaction failed: (%1) %2\n%3", ret, errmsg, sql); sqlite3_free(errmsg); return false; } return true; } bool Cache::create_table_cache_entry(LPCTABLE_DEF table, const TABLECOLUMNS_VEC & columns) { char *errmsg = nullptr; std::string sql; int ret; sql = "CREATE TABLE `"; sql += table->name; sql += "` (\n"; int i = 0; for (const TABLE_COLUMNS & col : columns) { if (i++) { sql += ",\n"; } sql += "`"; sql += col.name; sql += "` "; sql += col.type; } if (table->primary_key != nullptr) { sql += ",\n"; sql += table->primary_key; } sql += "\n"; sql += ");\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } return true; } bool Cache::upgrade_db(int *db_version_major, int *db_version_minor) { if (!column_exists("cache_entry", "video_frame_count")) { // If video_frame_count is missing, this db is definetly old { char *errmsg = nullptr; std::string sql; int ret; Logging::debug(m_cacheidx_db->filename(), "Adding `video_frame_count` column."); // Add `video_frame_count` UNSIGNED BIG INT NOT NULL DEFAULT 0 sql = "ALTER TABLE `"; sql += m_table_cache_entry.name; sql += "` ADD COLUMN `video_frame_count` UNSIGNED BIG INT NOT NULL DEFAULT 0;\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error adding column `video_frame_count`: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } Logging::debug(m_cacheidx_db->filename(), "Altering `finished` from BOOLEAN to INT."); } { char *errmsg = nullptr; std::string sql; int ret; //ALTER `finished` from BOOLEAN to INT NOT NULL // sqlite can't do that for us, we must... // // 1. Rename `cache_entry` to `cache_entry_old` // 2. Create new table `cache_entry` with new structure // 3. Copy all data from `cache_entry_old` to `cache_entry`, converting old to new column // 4. Delete `cache_entry_old` sql = "PRAGMA foreign_keys=off;\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } } // Step 1 { char *errmsg = nullptr; std::string sql; int ret; sql = "ALTER TABLE `"; sql += m_table_cache_entry.name; sql += "` RENAME TO `"; sql += m_table_cache_entry.name; sql += "_old`;\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } } // Step 2 if (!create_table_cache_entry(&m_table_cache_entry, m_columns_cache_entry)) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error creating 'cache_entry' table."); return false; } // Step 3 { char *errmsg = nullptr; std::string sql; std::string columns; int ret; for (const TABLE_COLUMNS & col : m_columns_cache_entry) { if (!columns.empty()) { columns += ","; } columns += "`"; columns += col.name; columns += "`"; } sql = "INSERT INTO `"; sql += m_table_cache_entry.name; sql += "` ("; sql += columns; sql += ")\nSELECT "; sql += columns; sql += " FROM `"; sql += m_table_cache_entry.name; sql += "_old`;"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } } { char *errmsg = nullptr; std::string sql; int ret; // Old 0 is RESULTCODE::NONE (0) // Old 1 is RESULTCODE::FINISHED (2) sql = "UPDATE `"; sql += m_table_cache_entry.name; sql += "`\n"; sql += "SET `finished` = 3\n"; sql += "WHERE `finished` = 1\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error updating column `finished`: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } } // Step 4 { char *errmsg = nullptr; std::string sql; int ret; sql = "DROP TABLE `cache_entry_old`"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error adding column `video_frame_count`: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } sql = "PRAGMA foreign_keys=on;\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } } } if (!column_exists("cache_entry", "duration")) { char *errmsg = nullptr; std::string sql; int ret; Logging::debug(m_cacheidx_db->filename(), "Adding `duration` column."); // Add `duration` UNSIGNED BIG INT NOT NULL DEFAULT 0 sql = "ALTER TABLE `"; sql += m_table_cache_entry.name; sql += "` ADD COLUMN `duration` UNSIGNED BIG INT NOT NULL DEFAULT 0;\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error adding column `duration`: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } } if (!column_exists("cache_entry", "segment_count")) { char *errmsg = nullptr; std::string sql; int ret; Logging::debug(m_cacheidx_db->filename(), "Adding `segment_count` column."); // Add `segment_count` UNSIGNED BIG INT NOT NULL DEFAULT 0 sql = "ALTER TABLE `"; sql += m_table_cache_entry.name; sql += "` ADD COLUMN `segment_count` UNSIGNED BIG INT NOT NULL DEFAULT 0;\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql.c_str(), nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error adding column `segment_count`: (%1) %2\n%3", ret, errmsg, sql.c_str()); sqlite3_free(errmsg); return false; } } // Update DB version Logging::debug(m_cacheidx_db->filename(), "Updating version table to V%1.%2.", DB_VERSION_MAJOR, DB_VERSION_MINOR); { char *errmsg = nullptr; const char * sql; int ret; sql = "UPDATE `version` SET db_version_major = " TOSTRING(DB_VERSION_MAJOR) ", db_version_minor = " TOSTRING(DB_VERSION_MINOR) ";\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql, nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error: (%1) %2\n%3", ret, errmsg, sql); sqlite3_free(errmsg); return false; } *db_version_major = DB_VERSION_MAJOR; *db_version_minor = DB_VERSION_MINOR; } Logging::info(m_cacheidx_db->filename(), "Database successfully upgraded to V%1.%2.", *db_version_major, *db_version_minor); return true; } bool Cache::load_index() { bool success = true; try { std::string filename; char *errmsg = nullptr; int ret; bool new_database = false; bool need_upate = false; transcoder_cache_path(&filename); if (mktree(filename, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) && errno != EEXIST) { Logging::error(filename, "Error creating cache directory: (%1) %2\n%3", errno, strerror(errno), m_cacheidx_db->filename().c_str()); throw false; } append_filename(&filename, "cacheidx.sqlite"); // initialise engine if (SQLITE_OK != (ret = sqlite3_initialize())) { Logging::error(filename, "Failed to initialise SQLite3 library: (%1) %2", ret, sqlite3_errstr(ret)); throw false; } // open connection to a DB m_cacheidx_db = std::make_unique(filename, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_SHAREDCACHE); if (m_cacheidx_db == nullptr) { Logging::error(filename, "Out of memory."); throw false; } if (SQLITE_OK != (ret = m_cacheidx_db->ret())) { Logging::error(m_cacheidx_db->filename(), "Failed to initialise SQLite3 connection: (%1) %2", ret, sqlite3_errmsg(*m_cacheidx_db)); throw false; } if (SQLITE_OK != (ret = sqlite3_busy_timeout(*m_cacheidx_db, 1000))) { Logging::error(m_cacheidx_db->filename(), "Failed to set SQLite3 busy timeout: (%1) %2", ret, sqlite3_errmsg(*m_cacheidx_db)); throw false; } // Beginning with version 3.7.0 (2010-07-21), a new "Write-Ahead Log" option // We support Sqlite from 3.7.13 anyway if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, "pragma journal_mode = WAL", nullptr, nullptr, nullptr))) { Logging::error(m_cacheidx_db->filename(), "Failed to set SQLite3 WAL mode: (%1) %2", ret, sqlite3_errmsg(*m_cacheidx_db)); throw false; } // Very strange: Compare operations with =, > etc. are case sensitive, while LIKE by default ignores upper/lowercase. // Produces strange results when reading from a Samba drive and different cases are used... if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, "PRAGMA case_sensitive_like = 1;", nullptr, nullptr, nullptr))) { Logging::error(m_cacheidx_db->filename(), "Failed to set SQLite3 case_sensitive_like = 1: (%1) %2", ret, sqlite3_errmsg(*m_cacheidx_db)); throw false; } // Make sure the next changes are either all successfull or rolled back if (!begin_transaction()) { throw false; } // Check if we got a new, empty database and create necessary tables // Create cache_entry table if not already existing if (!table_exists("cache_entry")) { Logging::debug(m_cacheidx_db->filename(), "Creating 'cache_entry' table in database."); if (!create_table_cache_entry(&m_table_cache_entry, m_columns_cache_entry)) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error creating 'cache_entry' table: (%1) %2", ret, errmsg); throw false; } new_database = true; // Created a new database } // If version table does not exist add it if (!table_exists("version")) { const char * sql; Logging::debug(m_cacheidx_db->filename(), "Creating 'version' table in database."); if (!create_table_cache_entry(&m_table_version, m_columns_version)) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error creating 'cache_entry' table: (%1) %2", ret, errmsg); throw false; } sql = "INSERT INTO `version` (db_version_major, db_version_minor) VALUES (" TOSTRING(DB_VERSION_MAJOR) ", " TOSTRING(DB_VERSION_MINOR) ");\n"; if (SQLITE_OK != (ret = sqlite3_exec(*m_cacheidx_db, sql, nullptr, nullptr, &errmsg))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 exec error: (%1) %2\n%3", ret, errmsg, sql); sqlite3_free(errmsg); throw false; } if (!new_database) { // Added version only, old database, need upgrade need_upate = true; } } // Check if database needs a structure upgrade int db_version_major = DB_BASE_VERSION_MAJOR; // Old database contains no version table. This is the version of this database. int db_version_minor = DB_BASE_VERSION_MINOR; if (need_upate || !check_min_version(&db_version_major, &db_version_minor)) { // No version table found, or minimum version too low, do an upgrade. Logging::warning(m_cacheidx_db->filename(), "Database version is %1.%2, but a least %3.%4 required. Upgrading database now.", db_version_major, db_version_minor, DB_MIN_VERSION_MAJOR, DB_MIN_VERSION_MINOR); if (!upgrade_db(&db_version_major, &db_version_minor)) { throw false; } } if (!end_transaction()) { throw false; } #ifdef HAVE_SQLITE_CACHEFLUSH if (!m_cacheidx_db->flush_index()) { throw false; } #endif // HAVE_SQLITE_CACHEFLUSH // prepare the statements if (!prepare_stmts()) { throw false; } } catch (bool _success) { success = _success; } return success; } #ifdef HAVE_SQLITE_CACHEFLUSH bool Cache::sqlite_t::flush_index() { if (m_db_handle != nullptr) { int ret; // Flush cache to disk if (SQLITE_OK != (ret = sqlite3_db_cacheflush(m_db_handle))) { Logging::error(m_filename, "SQLite3 cache flush error: (%1) %2", ret, sqlite3_errstr(ret)); return false; } } return true; } #endif // HAVE_SQLITE_CACHEFLUSH bool Cache::read_info(LPCACHE_INFO cache_info) { bool success = true; //cache_info->m_enable_ismv = 0; cache_info->m_audiobitrate = 0; cache_info->m_audiosamplerate = 0; cache_info->m_videobitrate = 0; cache_info->m_videowidth = 0; cache_info->m_videoheight = 0; cache_info->m_deinterlace = false; cache_info->m_duration = 0; cache_info->m_predicted_filesize = 0; cache_info->m_encoded_filesize = 0; cache_info->m_video_frame_count = 0; cache_info->m_segment_count = 0; cache_info->m_result = RESULTCODE::NONE; cache_info->m_error = false; cache_info->m_errno = 0; cache_info->m_averror = 0; cache_info->m_creation_time = 0; cache_info->m_access_time = 0; cache_info->m_file_time = 0; cache_info->m_file_size = 0; if (m_cacheidx_db->m_select_stmt == nullptr) { Logging::error(m_cacheidx_db->filename(), "SQLite3 select statement not open."); return false; } std::lock_guard lock_mutex(m_mutex); try { int ret; assert(sqlite3_bind_parameter_count(m_cacheidx_db->m_select_stmt) == 2); if (SQLITE_OK != (ret = sqlite3_bind_text(m_cacheidx_db->m_select_stmt, 1, cache_info->m_destfile.c_str(), -1, nullptr))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 select error binding 'filename': (%1) %2", ret, sqlite3_errstr(ret)); throw false; } if (SQLITE_OK != (ret = sqlite3_bind_text(m_cacheidx_db->m_select_stmt, 2, cache_info->m_desttype.data(), -1, nullptr))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 select error binding 'desttype': (%1) %2", ret, sqlite3_errstr(ret)); throw false; } ret = sqlite3_step(m_cacheidx_db->m_select_stmt); if (ret == SQLITE_ROW) { const char *text = reinterpret_cast(sqlite3_column_text(m_cacheidx_db->m_select_stmt, 0)); if (text != nullptr) { cache_info->m_desttype[0] = '\0'; strncat(cache_info->m_desttype.data(), text, cache_info->m_desttype.size() - 1); } //cache_info->m_enable_ismv = sqlite3_column_int(m_cacheidx_db->m_cacheidx_select_stmt, 1); cache_info->m_audiobitrate = sqlite3_column_int(m_cacheidx_db->m_select_stmt, 2); cache_info->m_audiosamplerate = sqlite3_column_int(m_cacheidx_db->m_select_stmt, 3); cache_info->m_videobitrate = sqlite3_column_int(m_cacheidx_db->m_select_stmt, 4); cache_info->m_videowidth = sqlite3_column_int(m_cacheidx_db->m_select_stmt, 5); cache_info->m_videoheight = sqlite3_column_int(m_cacheidx_db->m_select_stmt, 6); cache_info->m_deinterlace = sqlite3_column_int(m_cacheidx_db->m_select_stmt, 7); cache_info->m_duration = sqlite3_column_int64(m_cacheidx_db->m_select_stmt, 8); cache_info->m_predicted_filesize = static_cast(sqlite3_column_int64(m_cacheidx_db->m_select_stmt, 9)); cache_info->m_encoded_filesize = static_cast(sqlite3_column_int64(m_cacheidx_db->m_select_stmt, 10)); cache_info->m_video_frame_count = static_cast(sqlite3_column_int(m_cacheidx_db->m_select_stmt, 11)); cache_info->m_segment_count = static_cast(sqlite3_column_int(m_cacheidx_db->m_select_stmt, 12)); cache_info->m_result = static_cast(sqlite3_column_int(m_cacheidx_db->m_select_stmt, 13)); cache_info->m_error = sqlite3_column_int(m_cacheidx_db->m_select_stmt, 14); cache_info->m_errno = sqlite3_column_int(m_cacheidx_db->m_select_stmt, 15); cache_info->m_averror = sqlite3_column_int(m_cacheidx_db->m_select_stmt, 16); cache_info->m_creation_time = static_cast(sqlite3_column_int64(m_cacheidx_db->m_select_stmt, 17)); cache_info->m_access_time = static_cast(sqlite3_column_int64(m_cacheidx_db->m_select_stmt, 18)); cache_info->m_file_time = static_cast(sqlite3_column_int64(m_cacheidx_db->m_select_stmt, 19)); cache_info->m_file_size = static_cast(sqlite3_column_int64(m_cacheidx_db->m_select_stmt, 20)); } else if (ret != SQLITE_DONE) { Logging::error(m_cacheidx_db->filename(), "Sqlite 3 could not step (execute) select statement: (%1) %2", ret, sqlite3_errstr(ret)); throw false; } } catch (bool _success) { success = _success; } sqlite3_reset(m_cacheidx_db->m_select_stmt); if (success) { errno = 0; // sqlite3 sometimes sets errno without any reason, better reset any error } return success; } #define SQLBINDTXT(idx, var) \ if (SQLITE_OK != (ret = sqlite3_bind_text(m_cacheidx_db->m_insert_stmt, idx, var, -1, nullptr))) \ { \ Logging::error(m_cacheidx_db->filename(), "SQLite3 select column #%1 error: %2\n%3", idx, ret, sqlite3_errstr(ret)); \ throw false; \ } /**< @brief Bind text column to SQLite statement */ #define SQLBINDNUM(func, idx, var) \ if (SQLITE_OK != (ret = func(m_cacheidx_db->m_insert_stmt, idx, var))) \ { \ Logging::error(m_cacheidx_db->filename(), "SQLite3 select column #%1 error: %2\n%3", idx, ret, sqlite3_errstr(ret)); \ throw false; \ } /**< @brief Bind numeric column to SQLite statement */ bool Cache::write_info(LPCCACHE_INFO cache_info) { bool success = true; if (m_cacheidx_db->m_insert_stmt == nullptr) { Logging::error(m_cacheidx_db->filename(), "SQLite3 select statement not open."); return false; } std::lock_guard lock_mutex(m_mutex); try { int ret; bool enable_ismv_dummy = false; assert(sqlite3_bind_parameter_count(m_cacheidx_db->m_insert_stmt) == 22); SQLBINDTXT(1, cache_info->m_destfile.c_str()); SQLBINDTXT(2, cache_info->m_desttype.data()); //SQLBINDNUM(sqlite3_bind_int, 3, cache_info->m_enable_ismv); SQLBINDNUM(sqlite3_bind_int, 3, enable_ismv_dummy); SQLBINDNUM(sqlite3_bind_int64, 4, cache_info->m_audiobitrate); SQLBINDNUM(sqlite3_bind_int, 5, cache_info->m_audiosamplerate); SQLBINDNUM(sqlite3_bind_int64, 6, cache_info->m_videobitrate); SQLBINDNUM(sqlite3_bind_int, 7, static_cast(cache_info->m_videowidth)); SQLBINDNUM(sqlite3_bind_int, 8, static_cast(cache_info->m_videoheight)); SQLBINDNUM(sqlite3_bind_int, 9, cache_info->m_deinterlace); SQLBINDNUM(sqlite3_bind_int64, 10, static_cast(cache_info->m_duration)); SQLBINDNUM(sqlite3_bind_int64, 11, static_cast(cache_info->m_predicted_filesize)); SQLBINDNUM(sqlite3_bind_int64, 12, static_cast(cache_info->m_encoded_filesize)); SQLBINDNUM(sqlite3_bind_int, 13, static_cast(cache_info->m_video_frame_count)); SQLBINDNUM(sqlite3_bind_int, 14, static_cast(cache_info->m_segment_count)); SQLBINDNUM(sqlite3_bind_int, 15, static_cast(cache_info->m_result)); SQLBINDNUM(sqlite3_bind_int, 16, cache_info->m_error); SQLBINDNUM(sqlite3_bind_int, 17, cache_info->m_errno); SQLBINDNUM(sqlite3_bind_int, 18, cache_info->m_averror); SQLBINDNUM(sqlite3_bind_int64, 19, cache_info->m_creation_time); SQLBINDNUM(sqlite3_bind_int64, 20, cache_info->m_access_time); SQLBINDNUM(sqlite3_bind_int64, 21, cache_info->m_file_time); SQLBINDNUM(sqlite3_bind_int64, 22, static_cast(cache_info->m_file_size)); ret = sqlite3_step(m_cacheidx_db->m_insert_stmt); if (ret != SQLITE_DONE) { Logging::error(m_cacheidx_db->filename(), "Sqlite 3 could not step (execute) insert statement: (%1) %2", ret, sqlite3_errstr(ret)); throw false; } } catch (bool _success) { success = _success; } sqlite3_reset(m_cacheidx_db->m_insert_stmt); if (success) { errno = 0; // sqlite3 sometimes sets errno without any reason, better reset any error } return success; } bool Cache::delete_info(const std::string & filename, const std::string & desttype) { bool success = true; if (m_cacheidx_db->m_delete_stmt == nullptr) { Logging::error(m_cacheidx_db->filename(), "SQLite3 delete statement not open."); return false; } std::lock_guard lock_mutex(m_mutex); try { int ret; assert(sqlite3_bind_parameter_count(m_cacheidx_db->m_delete_stmt) == 2); if (SQLITE_OK != (ret = sqlite3_bind_text(m_cacheidx_db->m_delete_stmt, 1, filename.c_str(), -1, nullptr))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 select error binding 'filename': (%1) %2", ret, sqlite3_errstr(ret)); throw false; } if (SQLITE_OK != (ret = sqlite3_bind_text(m_cacheidx_db->m_delete_stmt, 2, desttype.c_str(), -1, nullptr))) { Logging::error(m_cacheidx_db->filename(), "SQLite3 select error binding 'desttype': (%1) %2", ret, sqlite3_errstr(ret)); throw false; } ret = sqlite3_step(m_cacheidx_db->m_delete_stmt); if (ret != SQLITE_DONE) { Logging::error(m_cacheidx_db->filename(), "Sqlite 3 could not step (execute) delete statement: (%1) %2", ret, sqlite3_errstr(ret)); throw false; } } catch (bool _success) { success = _success; } sqlite3_reset(m_cacheidx_db->m_delete_stmt); if (success) { errno = 0; // sqlite3 sometimes sets errno without any reason, better reset any error } return success; } void Cache::close_index() { m_cacheidx_db.reset(); } Cache_Entry* Cache::create_entry(LPVIRTUALFILE virtualfile, const std::string & desttype) { //Cache_Entry* cache_entry = new (std::nothrow) Cache_Entry(this, filename); Cache_Entry* cache_entry = Cache_Entry::create(this, virtualfile); if (cache_entry == nullptr) { Logging::error(m_cacheidx_db->filename(), "Out of memory creating cache entry."); return nullptr; } m_cache.insert(make_pair(make_pair(virtualfile->m_destfile, desttype), cache_entry)); return cache_entry; } bool Cache::delete_entry(Cache_Entry ** cache_entry, int flags) { if (*cache_entry == nullptr) { return true; } bool deleted = false; if ((*cache_entry)->closeio(flags)) { // If CACHE_CLOSE_FREE is set, also free memory if (CACHE_CHECK_BIT(CACHE_CLOSE_FREE, flags)) { m_cache.erase(make_pair((*cache_entry)->m_cache_info.m_destfile, (*cache_entry)->m_cache_info.m_desttype.data())); deleted = (*cache_entry)->destroy(); *cache_entry = nullptr; } } return deleted; } Cache_Entry *Cache::openio(LPVIRTUALFILE virtualfile) { Cache_Entry* cache_entry = nullptr; cache_t::const_iterator p = m_cache.find(make_pair(virtualfile->m_destfile, params.current_format(virtualfile)->desttype())); if (p == m_cache.cend()) { Logging::trace(virtualfile->m_destfile, "Created new transcoder."); cache_entry = create_entry(virtualfile, params.current_format(virtualfile)->desttype()); } else { Logging::trace(virtualfile->m_destfile, "Reusing cached transcoder."); cache_entry = p->second; } return cache_entry; } bool Cache::closeio(Cache_Entry **cache_entry, int flags /*= CACHE_CLOSE_NOOPT*/) { if (*cache_entry == nullptr) { return true; } bool deleted; std::string filename((*cache_entry)->filename()); if (delete_entry(cache_entry, flags)) { Logging::trace(filename, "Freed cache entry."); deleted = true; } else { Logging::trace(filename, "Keeping cache entry."); deleted = false; } return deleted; } bool Cache::prune_expired() { if (params.m_expiry_time <= 0) { // There's no limit. return true; } std::vector keys; sqlite3_stmt * stmt; time_t now = time(nullptr); std::string sql; Logging::trace(m_cacheidx_db->filename(), "Pruning expired cache entries older than %1...", format_time(params.m_expiry_time).c_str()); strsprintf(&sql, "SELECT filename, desttype, strftime('%%s', access_time) FROM cache_entry WHERE strftime('%%s', access_time) + %" FFMPEGFS_FORMAT_TIME_T " < %" FFMPEGFS_FORMAT_TIME_T ";\n", params.m_expiry_time, now); std::lock_guard lock_mutex(m_mutex); sqlite3_prepare(*m_cacheidx_db, sql.c_str(), -1, &stmt, nullptr); int ret = 0; while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) { const char *filename = reinterpret_cast(sqlite3_column_text(stmt, 0)); const char *desttype = reinterpret_cast(sqlite3_column_text(stmt, 1)); keys.emplace_back(filename, desttype); Logging::trace(filename, "Found %1 old entries.", format_time(now - static_cast(sqlite3_column_int64(stmt, 2))).c_str()); } Logging::trace(m_cacheidx_db->filename(), "%1 expired cache entries found.", keys.size()); if (ret == SQLITE_DONE) { for (const auto& [key, value] : keys) { Logging::trace(m_cacheidx_db->filename(), "Pruning '%1' - Type: %2", key.c_str(), value.c_str()); cache_t::iterator p = m_cache.find(make_pair(key, value)); if (p != m_cache.end()) { delete_entry(&p->second, CACHE_CLOSE_DELETE); } if (delete_info(key, value)) { remove_cachefile(key, value); } } } else { Logging::error(m_cacheidx_db->filename(), "Failed to execute select. Return code: %1 Error: %2 SQL: %3", ret, sqlite3_errmsg(*m_cacheidx_db), expanded_sql(stmt).c_str()); } sqlite3_finalize(stmt); return true; } bool Cache::prune_cache_size() { if (!params.m_max_cache_size) { // There's no limit. return true; } std::vector keys; std::vector filesizes; sqlite3_stmt * stmt; const char * sql; Logging::trace(m_cacheidx_db->filename(), "Pruning oldest cache entries exceeding %1 cache size...", format_size(params.m_max_cache_size).c_str()); sql = "SELECT filename, desttype, encoded_filesize FROM cache_entry ORDER BY access_time ASC;\n"; std::lock_guard lock_mutex(m_mutex); sqlite3_prepare(*m_cacheidx_db, sql, -1, &stmt, nullptr); int ret = 0; size_t total_size = 0; while((ret = sqlite3_step(stmt)) == SQLITE_ROW) { const char *filename = reinterpret_cast(sqlite3_column_text(stmt, 0)); const char *desttype = reinterpret_cast(sqlite3_column_text(stmt, 1)); size_t size = static_cast(sqlite3_column_int64(stmt, 2)); keys.emplace_back(filename, desttype); filesizes.push_back(size); total_size += size; } Logging::trace(m_cacheidx_db->filename(), "%1 in cache.", format_size(total_size).c_str()); if (total_size > params.m_max_cache_size) { Logging::trace(m_cacheidx_db->filename(), "Pruning %1 of oldest cache entries to limit cache size.", format_size(total_size - params.m_max_cache_size).c_str()); if (ret == SQLITE_DONE) { size_t n = 0; for (const auto& [key, value] : keys) { Logging::trace(m_cacheidx_db->filename(), "Pruning: %1 Type: %2", key.c_str(), value.c_str()); cache_t::iterator p = m_cache.find(make_pair(key, value)); if (p != m_cache.end()) { delete_entry(&p->second, CACHE_CLOSE_DELETE); } if (delete_info(key, value)) { remove_cachefile(key, value); } total_size -= filesizes[n++]; if (total_size <= params.m_max_cache_size) { break; } } Logging::trace(m_cacheidx_db->filename(), "%1 left in cache.", format_size(total_size).c_str()); } else { Logging::error(m_cacheidx_db->filename(), "Failed to execute select. Return code: %1 Error: %2 SQL: %3", ret, sqlite3_errmsg(*m_cacheidx_db), expanded_sql(stmt).c_str()); } } sqlite3_finalize(stmt); return true; } bool Cache::prune_disk_space(size_t predicted_filesize) { std::string cachepath; transcoder_cache_path(&cachepath); size_t free_bytes = get_disk_free(cachepath); if (!free_bytes && errno) { if (errno == ENOENT) { // Cache path does not exist. Strange problem, but not error. Ignore silently. return true; } Logging::error(cachepath, "prune_disk_space() cannot determine free disk space: (%1) %2", errno, strerror(errno)); return false; } if (free_bytes < predicted_filesize) { Logging::error(cachepath, "prune_disk_space() : Insufficient disk space %1 on cache drive, at least %2 required.", format_size(free_bytes).c_str(), format_size(predicted_filesize).c_str()); errno = ENOSPC; return false; } std::lock_guard lock_mutex(m_mutex); Logging::trace(cachepath, "%1 disk space before prune.", format_size(free_bytes).c_str()); if (free_bytes < params.m_min_diskspace + predicted_filesize) { std::vector keys; std::vector filesizes; sqlite3_stmt * stmt; const char * sql; sql = "SELECT filename, desttype, encoded_filesize FROM cache_entry ORDER BY access_time ASC;\n"; sqlite3_prepare(*m_cacheidx_db, sql, -1, &stmt, nullptr); int ret = 0; while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) { const char *filename = reinterpret_cast(sqlite3_column_text(stmt, 0)); const char *desttype = reinterpret_cast(sqlite3_column_text(stmt, 1)); size_t size = static_cast(sqlite3_column_int64(stmt, 2)); keys.emplace_back(filename, desttype); filesizes.push_back(size); } Logging::trace(cachepath, "Pruning %1 of oldest cache entries to keep disk space above %2 limit...", format_size(params.m_min_diskspace + predicted_filesize - free_bytes).c_str(), format_size(params.m_min_diskspace).c_str()); if (ret == SQLITE_DONE) { size_t n = 0; for (const auto& [key, value] : keys) { Logging::trace(cachepath, "Pruning: %1 Type: %2", key.c_str(), value.c_str()); cache_t::iterator p = m_cache.find(make_pair(key, value)); if (p != m_cache.end()) { delete_entry(&p->second, CACHE_CLOSE_DELETE); } if (delete_info(key, value)) { remove_cachefile(key, value); } free_bytes += filesizes[n++]; if (free_bytes >= params.m_min_diskspace + predicted_filesize) { break; } } Logging::trace(cachepath, "Disk space after prune: %1", format_size(free_bytes).c_str()); } else { Logging::error(cachepath, "Failed to execute select. Return code: %1 Error: %2 SQL: %3", ret, sqlite3_errmsg(*m_cacheidx_db), expanded_sql(stmt).c_str()); } sqlite3_finalize(stmt); } return true; } bool Cache::maintenance(size_t predicted_filesize) { bool success = true; // Find and remove expired cache entries success &= prune_expired(); // Check max. cache size success &= prune_cache_size(); // Check min. diskspace required for cache success &= prune_disk_space(predicted_filesize); return success; } bool Cache::clear() { bool success = true; std::lock_guard lock_mutex(m_mutex); std::vector keys; sqlite3_stmt * stmt; const char * sql; sql = "SELECT filename, desttype FROM cache_entry;\n"; sqlite3_prepare(*m_cacheidx_db, sql, -1, &stmt, nullptr); int ret = 0; while((ret = sqlite3_step(stmt)) == SQLITE_ROW) { const char *filename = reinterpret_cast(sqlite3_column_text(stmt, 0)); const char *desttype = reinterpret_cast(sqlite3_column_text(stmt, 1)); keys.emplace_back(filename, desttype); } Logging::trace(m_cacheidx_db->filename(), "Clearing all %1 entries from cache...", keys.size()); if (ret == SQLITE_DONE) { for (const auto& [key, value] : keys) { Logging::trace(m_cacheidx_db->filename(), "Pruning: %1 Type: %2", key.c_str(), value.c_str()); cache_t::iterator p = m_cache.find(make_pair(key, value)); if (p != m_cache.end()) { delete_entry(&p->second, CACHE_CLOSE_DELETE); } if (delete_info(key, value)) { remove_cachefile(key, value); } } } else { Logging::error(m_cacheidx_db->filename(), "Failed to execute select. Return code: %1 Error: %2 SQL: %3", ret, sqlite3_errmsg(*m_cacheidx_db), expanded_sql(stmt).c_str()); } sqlite3_finalize(stmt); return success; } bool Cache::remove_cachefile(const std::string & filename, const std::string & fileext) { std::string cachefile; bool success; Buffer::make_cachefile_name(&cachefile, filename, fileext, false); success = Buffer::remove_file(cachefile); Buffer::make_cachefile_name(&cachefile, filename, fileext, true); if (!Buffer::remove_file(cachefile) && errno != ENOENT) { success = false; } return success; } std::string Cache::expanded_sql(sqlite3_stmt *pStmt) { std::string sql; #ifdef HAVE_SQLITE_EXPANDED_SQL char * p = sqlite3_expanded_sql(pStmt); sql = p; sqlite3_free(p); #else const char *p = sqlite3_sql(pStmt); if (p != nullptr) { sql=p; } else { sql="(nullptr)"; } #endif return sql; } ffmpegfs-2.18/src/makehelp.sh0000755000000000000000000000202615166175407013060 00000000000000# Copyright (C) 2019-2026 Norbert Schlia (nschlia@oblivion-software.de) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # # On Debian systems, the complete text of the GNU General Public License # Version 3 can be found in `/usr/share/common-licenses/GPL-3'. set -e sed '1,/OPTIONS/d;/General\/FUSE options/,$d' ../ffmpegfs.1.text > ffmpegfshelp xxd -i ffmpegfshelp > $1 rm ffmpegfshelp ffmpegfs-2.18/src/blurayparser.cc0000644000000000000000000004744715166175407013775 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ #ifdef USE_LIBBLURAY /** * @file blurayparser.cc * @brief Blu-ray disk parser implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "ffmpegfs.h" #include "blurayparser.h" #include "transcode.h" #include "logging.h" #include "libbluray/bluray.h" #include "libbluray/bluray-version.h" extern "C" { #include } static bool audio_stream_info(const std::string &path, BLURAY_STREAM_INFO *ss, int *channels, int *sample_rate); static bool video_stream_info(const std::string &path, BLURAY_STREAM_INFO *ss, int *width, int *height, AVRational *framerate, bool *interleaved); static int parse_find_best_audio_stream(); static int parse_find_best_video_stream(); static bool create_bluray_virtualfile(BLURAY *bd, const BLURAY_TITLE_INFO* ti, const std::string & path, const struct stat * statbuf, void * buf, fuse_fill_dir_t filler, bool is_main_title, bool full_title, uint32_t title_idx, uint32_t chapter_idx); static int parse_bluray(const std::string & path, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler); /** * @brief Get information about Blu-ray stream * @param[in] path - Path to Blu-ray disk. * @param[in] ss - BLURAY_STREAM_INFO object. * @param[out] channels - Number of audio channels in stream. * @param[out] sample_rate - Sample rate of stream. * @return Returns true if stream has video, false if not. */ static bool audio_stream_info(const std::string & path, BLURAY_STREAM_INFO *ss, int *channels, int *sample_rate) { bool audio = false; switch (ss->coding_type) { // Video case 0x01: case 0x02: case 0xea: case 0x1b: case 0x24: { break; } // Audio case 0x03: case 0x04: case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0xa1: case 0xa2: { switch (ss->format) { case BLURAY_AUDIO_FORMAT_MONO: { *channels = 1; // Mono break; } case BLURAY_AUDIO_FORMAT_STEREO: { *channels = 2; // Stereo break; } case BLURAY_AUDIO_FORMAT_MULTI_CHAN: { *channels = 2; // Multi Channel break; } case BLURAY_AUDIO_FORMAT_COMBO: { *channels = 2; // Stereo ac3/dts break; } default: { Logging::error(path, "Unknown number of audio channels %1. Assuming 2 channel/stereo - may be totally wrong.", ss->format); *channels = 2; // Stereo break; } } switch (ss->rate) { case BLURAY_AUDIO_RATE_48: { *sample_rate = 48000; break; } case BLURAY_AUDIO_RATE_96: { *sample_rate = 96000; break; } case BLURAY_AUDIO_RATE_192: { *sample_rate = 192000; break; } // 48 or 96 ac3/dts // 192 mpl/dts-hd case BLURAY_AUDIO_RATE_192_COMBO: { // *sample_rate = "48/192 Khz"; break; } // 48 ac3/dts // 96 mpl/dts-hd case BLURAY_AUDIO_RATE_96_COMBO: { // *sample_rate = "48/96 Khz"; break; } default: { Logging::error(path, "Unknown audio sample rate %1. Assuming 48 kHz - may be totally wrong.", ss->rate); *sample_rate = 48000; break; } } audio = true; break; } case 0x90: case 0x91: { // Language ss->lang break; } case 0x92: { // Char Code ss->char_code); // Language ss->lang); break; } default: { Logging::error(path, "Unrecognised coding type %<02x>1.", ss->coding_type); break; } } return audio; } /** * @brief Get information about Blu-ray stream * @param[in] path - Path to Blu-ray disk. * @param[in] ss - BLURAY_STREAM_INFO object. * @param[out] width - Width of video stream. * @param[out] height - Height of video stream. * @param[out] framerate - Frame rate of video stream. * @param[out] interleaved - true: video stream is interleaved, false: video stream is not interleaved. * @return Returns true if stream has video, false if not. */ static bool video_stream_info(const std::string & path, BLURAY_STREAM_INFO *ss, int *width, int *height, AVRational *framerate, bool *interleaved) { bool video = false; switch (ss->coding_type) { // Video case 0x01: case 0x02: case 0xea: case 0x1b: case 0x24: { // SD // 720×480, 59.94i, 4:3 or 16:9 // 720×576, 50i, 4:3 or 16:9 // HD // 1280×720, 59.94p, 16:9 // 1280×720, 50p, 16:9 // 1280×720, 24p, 16:9 // 1280×720, 23.976p, 16:9 // 1440×1080, 59.94i, 16:9 // 1440×1080, 50i, 16:9 // 1440×1080, 24p, 16:9 // 1440×1080, 23.976p, 16:9 // 1920×1080, 59.94i, 16:9 // 1920×1080, 50i, 16:9 // 1920×1080, 24p, 16:9 // 1920×1080, 23.976p, 16:9 // HD // 1920×1080, 60p, 16:9 // 1920×1080, 59.94p, 16:9 // 1920×1080, 50p, 16:9 // 1920×1080, 25p, 16:9 // 4K UHD // 3840×2160, 60p, 16:9 // 3840×2160, 59.94p, 16:9 // 3840×2160, 50p, 16:9 // 3840×2160, 25p, 16:9 // 3840×2160, 24p, 16:9 // 3840×2160, 23.976p, 16:9 switch (ss->format) { case BLURAY_VIDEO_FORMAT_480I: // ITU-R BT.601-5 { *width = 720; *height = 480; *interleaved = true; break; } case BLURAY_VIDEO_FORMAT_576I: // ITU-R BT.601-4 { *width = 720; *height = 576; *interleaved = true; break; } case BLURAY_VIDEO_FORMAT_480P: // SMPTE 293M { *width = 720; *height = 480; *interleaved = false; break; } case BLURAY_VIDEO_FORMAT_1080I: // SMPTE 274M { *width = 1920; *height = 1080; *interleaved = true; break; } case BLURAY_VIDEO_FORMAT_720P: // SMPTE 296M { *height = 1280; *width = 720; *interleaved = false; break; } case BLURAY_VIDEO_FORMAT_1080P: // SMPTE 274M { *width = 1920; *height = 1080; *interleaved = false; break; } case BLURAY_VIDEO_FORMAT_576P: // ITU-R BT.1358 { *width = 720; *height = 576; *interleaved = false; break; } // Added with libluray change 14aa7e9c0 (hpi1 2017-08-28 09:50:43 +0300) // Available since version 1.1.0 #if (BLURAY_VERSION_MAJOR > 1 || (BLURAY_VERSION_MAJOR == 1 && BLURAY_VERSION_MINOR >= 1)) case BLURAY_VIDEO_FORMAT_2160P: // UHD { *width = 3840; *height = 2160; *interleaved = false; break; } #endif default: { Logging::error(path, "Unknown video format %1. Assuming 1920x1080P - may be totally wrong.", ss->format); *width = 1920; *height = 1080; *interleaved = false; break; } } switch (ss->rate) { case BLURAY_VIDEO_RATE_24000_1001: { *framerate = av_make_q(24000, 1001); break; } case BLURAY_VIDEO_RATE_24: { *framerate = av_make_q(24000, 1000); break; } case BLURAY_VIDEO_RATE_25: { *framerate = av_make_q(25000, 1000); break; } case BLURAY_VIDEO_RATE_30000_1001: { *framerate = av_make_q(30000, 1001); break; } case BLURAY_VIDEO_RATE_50: { *framerate = av_make_q(50000, 1000); break; } case BLURAY_VIDEO_RATE_60000_1001: { *framerate = av_make_q(60000, 1001); break; } default: { Logging::error(path, "Unknown video frame rate %1. Assuming 25 fps - may be totally wrong.", ss->rate); *framerate = av_make_q(25000, 1000); break; } } video = true; break; } // Audio case 0x03: case 0x04: case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0xa1: case 0xa2: { break; } case 0x90: case 0x91: { // Language ss->lang break; } case 0x92: { // Char Code ss->char_code); // Language ss->lang); break; } default: { Logging::error(path, "Unrecognised coding type %<02x>1.", ss->coding_type); break; } } return video; } /** * @brief Find best match audio stream. * @todo Returning 0 is not necessarily the best match. Probably better to parse. * For "The life of Brian", e.g., this is the Hungarian audio track. No big deal, * though, I can recite mostly all dialogs in English and German (and Latin :), * but should be fixed anyway. * @return Returns index of best match stream. */ static int parse_find_best_audio_stream() { return 0; } /** * @brief Find best match video stream. * @todo Returning 0 is not necessarily the best match. Probably better to parse. * Most DVDs contain only one video track anyway, so this does not hurt at the moment. * @return Returns index of best match stream. */ static int parse_find_best_video_stream() { return 0; } /** * @brief Create a virtual file entry of a Blu-ray chapter or title. * @param[in] bd - Blu-ray disk clip info. * @param[in] ti - Blu-ray disk title info. * @param[in] path - Path to check. * @param[in] statbuf - File status structure of original file. * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @param[in] is_main_title - true if title_idx is the main title * @param[in] full_title - If true, create virtual file of all title. If false, include single chapter only. * @param[in] title_idx - Zero-based title index on Blu-ray * @param[in] chapter_idx - Zero-based chapter index on Blu-ray * @note buf and filler can be nullptr. In that case the call will run faster, so these parameters should only be passed if to be filled in. * @return On error, returns false. On success, returns true. */ static bool create_bluray_virtualfile(BLURAY *bd, const BLURAY_TITLE_INFO* ti, const std::string & path, const struct stat * statbuf, void * buf, fuse_fill_dir_t filler, bool is_main_title, bool full_title, uint32_t title_idx, uint32_t chapter_idx) { BLURAY_CLIP_INFO *clip = &ti->clips[0]; BLURAY_TITLE_CHAPTER *chapter = &ti->chapters[chapter_idx]; std::string title_buf; int64_t duration; if (full_title) { duration = static_cast(ti->duration) * AV_TIME_BASE / 90000; if (duration < AV_TIME_BASE) { Logging::trace(path, "Title %1: skipping empty title.", title_idx + 1); return true; } strsprintf(&title_buf, "%02u. Title [%s]%s.%s", title_idx + 1, replace_all(format_duration(duration), ":", "-").c_str(), is_main_title ? "+" : "", ffmpeg_format[FORMAT::VIDEO].fileext().c_str()); // can safely assume this is a video format } else { duration = static_cast(chapter->duration) * AV_TIME_BASE / 90000; if (duration < AV_TIME_BASE) { Logging::trace(path, "Title %1 Chapter %2: skipping empty chapter.", title_idx + 1, chapter_idx + 1); return true; } strsprintf(&title_buf, "%02u. Chapter %03u [%s]%s.%s", title_idx + 1, chapter_idx + 1, replace_all(format_duration(duration), ":", "-").c_str(), is_main_title ? "+" : "", ffmpeg_format[FORMAT::VIDEO].fileext().c_str()); // can safely assume this is a video format } LPVIRTUALFILE virtualfile = nullptr; if (!ffmpeg_format[FORMAT::VIDEO].is_multiformat()) { virtualfile = insert_file(VIRTUALTYPE::BLURAY, path + title_buf, statbuf); } else { virtualfile = insert_dir(VIRTUALTYPE::BLURAY, path + title_buf, statbuf); } if (virtualfile == nullptr) { Logging::error(path, "Failed to create virtual path: %1", (path + title_buf).c_str()); errno = EIO; return false; } if (add_fuse_entry(buf, filler, title_buf, &virtualfile->m_st, 0)) { // break; } // Blu-ray is video format anyway virtualfile->m_format_idx = 0; // Mark title/chapter/angle virtualfile->m_full_title = full_title; virtualfile->m_bluray.m_title_no = title_idx + 1; virtualfile->m_bluray.m_playlist_no = ti->playlist; virtualfile->m_bluray.m_chapter_no = chapter_idx + 1; virtualfile->m_bluray.m_angle_no = 1; if (!transcoder_cached_filesize(virtualfile, &virtualfile->m_st)) { BITRATE video_bit_rate = 29*1024*1024; // In case the real bitrate cannot be calculated later, assume 20 Mbit video bitrate BITRATE audio_bit_rate = 256*1024; // In case the real bitrate cannot be calculated later, assume 256 kBit audio bitrate bool audio = false; bool interleaved = false; if (!bd_select_title(bd, title_idx)) { Logging::error(path, "The Blu-ray title %1 could not be opened.", title_idx); errno = EIO; return false; } uint64_t size = bd_get_title_size(bd); virtualfile->m_duration = duration; if (duration) { /** * @todo We actually calculate the overall Blu-ray bitrate here, including all audio * streams, not just the video bitrate. This should be the video bitrate alone. We * should also calculate the audio bitrate for the selected stream. */ video_bit_rate = static_cast(size * 8LL * AV_TIME_BASE / static_cast(duration)); // calculate bitrate in bps } // Get details if (clip->audio_stream_count) { audio_stream_info(path, &clip->audio_streams[parse_find_best_audio_stream()], &virtualfile->m_channels, &virtualfile->m_sample_rate); } if (clip->video_stream_count) { audio = video_stream_info(path, &clip->video_streams[parse_find_best_video_stream()], &virtualfile->m_width, &virtualfile->m_height, &virtualfile->m_framerate, &interleaved); } Logging::trace(path, "Video %1 %2x%3@%<5.2f>4%5 fps %6 [%7]", format_bitrate(video_bit_rate).c_str(), virtualfile->m_width, virtualfile->m_height, av_q2d(virtualfile->m_framerate), interleaved ? "i" : "p", format_size(size).c_str(), format_duration(duration).c_str()); if (audio) { Logging::trace(path, "Audio %1 channels %2", virtualfile->m_channels, format_samplerate(virtualfile->m_sample_rate).c_str()); } transcoder_set_filesize(virtualfile, duration, audio_bit_rate, virtualfile->m_channels, virtualfile->m_sample_rate, AV_SAMPLE_FMT_NONE, video_bit_rate, virtualfile->m_width, virtualfile->m_height, interleaved, virtualfile->m_framerate); virtualfile->m_video_frame_count = static_cast(av_rescale_q(duration, av_get_time_base_q(), av_inv_q(virtualfile->m_framerate))); virtualfile->m_predicted_size = static_cast(size); } return true; } /** * @brief Parse Blu-ray directory and get all Blu-ray titles and chapters as virtual files. * @param[in] path - Path to check. * @param[in] statbuf - File status structure of original file. * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @return On success, returns number of chapters found. On error, returns -errno. */ static int parse_bluray(const std::string & path, const struct stat * statbuf, void * buf, fuse_fill_dir_t filler) { BLURAY *bd; uint32_t title_count; int main_title; unsigned int seconds = 0; uint8_t flags = TITLES_RELEVANT; const char *bd_dir = nullptr; bool success = true; bd_dir = path.c_str(); Logging::debug(path, "Parsing Blu-ray."); bd = bd_open(bd_dir, nullptr); title_count = bd_get_titles(bd, flags, seconds); main_title = bd_get_main_title(bd); if (main_title >= 0) { Logging::trace(path, "Main title: %1", main_title + 1); } for (uint32_t title_idx = 0; title_idx < title_count && success; title_idx++) { BLURAY_TITLE_INFO* ti = bd_get_title_info(bd, title_idx, 0); bool is_main_title = (main_title >= 0 && title_idx == static_cast(main_title)); // Add separate chapters for (uint32_t chapter_idx = 0; chapter_idx < ti->chapter_count && success; chapter_idx++) { success = create_bluray_virtualfile(bd, ti, path, statbuf, buf, filler, is_main_title, false, title_idx, chapter_idx); } if (success && ti->chapter_count > 1) { // If more than 1 chapter, add full title as well success = create_bluray_virtualfile(bd, ti, path, statbuf, buf, filler, is_main_title, true, title_idx, 0); } bd_free_title_info(ti); } bd_close(bd); if (success) { return static_cast(title_count); } else { return -errno; } } int check_bluray(const std::string & path, void *buf, fuse_fill_dir_t filler) { std::string _path(path); struct stat stbuf; int res = 0; append_sep(&_path); if (stat((_path + "BDMV/index.bdmv").c_str(), &stbuf) == 0) { if (!check_path(_path)) { Logging::trace(_path, "Blu-ray detected."); res = parse_bluray(_path, &stbuf, buf, filler); Logging::trace(_path, "%1 titles were discovered.", res); } else { res = load_path(_path, &stbuf, buf, filler); } add_dotdot(buf, filler, &stbuf, 0); } return res; } #endif // USE_LIBBLURAY ffmpegfs-2.18/src/vcdio.h0000644000000000000000000001241215166175407012210 00000000000000/* * Copyright (C) 2018-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file vcdio.h * @brief Video CD and Super Video CD I/O * * This is only available if built with -DUSE_LIBVCD parameter. * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2018-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef VCDIO_H #define VCDIO_H #pragma once #ifdef USE_LIBVCD #include "fileio.h" /** @brief Video CD and Super Video CD I/O class */ class VcdIO : public FileIO { public: /** * @brief Create #VcdIO object */ explicit VcdIO(); /** * @brief Free #VcdIO object * * Close file pointers */ virtual ~VcdIO(); /** * @brief Get type of the virtual file * @return Returns the type of the virtual file. */ virtual VIRTUALTYPE type() const override; /** * @brief Get the ideal buffer size. * @return Return the ideal buffer size. */ virtual size_t bufsize() const override; /** * @brief Open a virtual file * @param[in] virtualfile - LPCVIRTUALFILE of file to open * @return Upon successful completion, #openio() returns 0. @n * On error, an nonzero value is returned and errno is set to indicate the error. */ virtual int openio(LPVIRTUALFILE virtualfile) override; /** * @brief Read data from file * @param[out] data - buffer to store read bytes in. Must be large enough to hold up to size bytes. * @param[in] size - number of bytes to read * @return Upon successful completion, #readio() returns the number of bytes read. @n * This may be less than size. @n * On error, the value 0 is returned and errno is set to indicate the error. @n * If at end of file, 0 may be returned by errno not set. error() will return 0 if at EOF. */ virtual size_t readio(void *data, size_t size) override; /** * @brief Get last error. * @return errno value of last error. */ virtual int error() const override; /** * @brief Get the duration of the file, in AV_TIME_BASE fractional seconds. * @return Could work for VCD, but always returns AV_NOPTS_VALUE. * @todo Implement duration of video CD chapters */ virtual int64_t duration() const override; /** * @brief Get the file size. * @return Returns the file size. */ virtual size_t size() const override; /** * @brief Get current read position. * @return Gets the current read position. */ virtual size_t tell() const override; /** * @brief Seek to position in file * * Repositions the offset of the open file to the argument offset according to the directive whence. * * @param[in] offset - offset in bytes * @param[in] whence - how to seek: @n * SEEK_SET: The offset is set to offset bytes. @n * SEEK_CUR: The offset is set to its current location plus offset bytes. @n * SEEK_END: The offset is set to the size of the file plus offset bytes. * @return Upon successful completion, #seek() returns the resulting offset location as measured in bytes * from the beginning of the file. @n * On error, the value -1 is returned and errno is set to indicate the error. */ virtual int seek(int64_t offset, int whence) override; /** * @brief Check if at end of file. * @return Returns true if at end of file. */ virtual bool eof() const override; /** * @brief Close virtual file. */ virtual void closeio() override; private: /** * @brief Close virtual file. * Non-virtual version to be safely called from constructor/destructor */ void pvt_close(); protected: FILE * m_fpi; /**< @brief File pointer to source media */ bool m_full_title; /**< @brief If true, ignore m_chapter_no and provide full track */ int m_track_no; /**< @brief Track number (1..) */ int m_chapter_no; /**< @brief Chapter number (1..) */ uint64_t m_start_pos; /**< @brief Start offset in bytes */ uint64_t m_end_pos; /**< @brief End offset in bytes (not including this byte) */ }; #endif // USE_LIBVCD #endif // VCDIO_H ffmpegfs-2.18/src/ffmpeg_transcoder.h0000644000000000000000000020144015166175407014575 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_transcoder.h * @brief FFmpeg transcoder * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef FFMPEG_TRANSCODER_H #define FFMPEG_TRANSCODER_H #pragma once #include "ffmpeg_base.h" #include "ffmpeg_frame.h" #include "ffmpeg_subtitle.h" #include "id3v1tag.h" #include "fileio.h" #include "ffmpeg_profiles.h" #include #include #include #include #include #include class Buffer; struct SwrContext; struct SwsContext; struct AVFilterContext; struct AVFilterGraph; struct AVAudioFifo; struct AVCodecContext; struct AVSubtitle; /** * @brief Decoder status codes. Can be error, success or end of file. */ enum class DECODER_STATUS { DEC_ERROR = -1, /**< @brief Decoder error, see return code */ DEC_SUCCESS = 0, /**< @brief Frame decoded successfully */ DEC_EOF = 1 /**< @brief Read to end of file */ }; typedef DECODER_STATUS *LPDECODER_STATUS; /**< @brief Pointer version of DECODER_STATUS */ typedef DECODER_STATUS const * LPCDECODER_STATUS; /**< @brief Pointer to const version of DECODER_STATUS */ /** * @brief The #FFmpeg_Transcoder class */ class FFmpeg_Transcoder : public FFmpeg_Base, FFmpeg_Profiles { protected: /** * @brief Buffer structure, used in FFmpeg_Transcoder::read_packet */ typedef struct BUFFER_DATA { uint8_t * ptr; ///< Pointer to buffer size_t size; ///< Size left in the buffer } BUFFER_DATA; #define MAX_PRORES_FRAMERATE 2 /**< @brief Number of selectable fram rates */ /** * @brief Predicted bitrates for Apple Prores, see https://www.apple.com/final-cut-pro/docs/Apple_ProRes_White_Paper.pdf */ typedef struct PRORES_BITRATE /**< @brief List of ProRes bit rates */ { int m_width; /**< @brief Resolution: width */ int m_height; /**< @brief Resolution: height */ struct PRORES_FRAMERATE /**< @brief List of ProRes frame rates */ { int m_framerate; /**< @brief Frame rate */ bool m_interleaved; /**< @brief Format is interleaved */ } m_framerate[MAX_PRORES_FRAMERATE]; /**< @brief Array of frame rates */ /** * Bitrates in MB/s * 0: ProRes 422 Proxy * 1: ProRes 422 LT * 2: ProRes 422 standard * 3: ProRes 422 HQ * 4: ProRes 4444 (no alpha) * 5: ProRes 4444 XQ (no alpha) */ std::array m_bitrate; /**< @brief Bitrates for this format */ } PRORES_BITRATE, *LPPRORES_BITRATE; /**< @brief Pointer version of PRORES_BITRATE */ typedef PRORES_BITRATE const * LPCPRORES_BITRATE; /**< @brief Pointer to const version of PRORES_BITRATE */ class StreamRef /**< @brief In/output stream reference data */ { public: StreamRef(); virtual ~StreamRef(); /** * @brief Set the AVCodecContext pointer. Will be shared and deleted after the last consumer freed it. * @param[in] codec_ctx - AVCodecContext pointer to store */ void set_codec_ctx(AVCodecContext *codec_ctx); /** * @brief Close (reset) AVCodecContext pointer */ void reset(); public: std::shared_ptr m_codec_ctx; /**< @brief AVCodecContext for this encoder stream */ AVStream * m_stream; /**< @brief AVStream for this encoder stream */ int m_stream_idx; /**< @brief Stream index in AVFormatContext */ int64_t m_start_time; /**< @brief Start time of the stream in stream time base units, may be 0 */ }; typedef std::map StreamRef_map; /**< @brief Map stream index to StreamRef */ struct INPUTFILE /**< @brief Input file definition */ { INPUTFILE() : m_filetype(FILETYPE::UNKNOWN), m_format_ctx(nullptr), m_pix_fmt(AV_PIX_FMT_NONE) {} FILETYPE m_filetype; /**< @brief File type, MP3, MP4, OPUS etc. */ AVFormatContext * m_format_ctx; /**< @brief Output format context */ StreamRef m_audio; /**< @brief Audio stream information */ StreamRef m_video; /**< @brief Video stream information */ AVPixelFormat m_pix_fmt; /**< @brief Video stream pixel format */ StreamRef_map m_subtitle; /**< @brief Subtitle stream information */ std::vector m_album_art; /**< @brief Album art stream */ }; // Output file struct OUTPUTFILE : public INPUTFILE /**< @brief Output file definition */ { OUTPUTFILE() : m_audio_pts(0), m_video_pts(0), m_last_mux_dts(AV_NOPTS_VALUE) { std::memset(&m_id3v1, 0, sizeof(m_id3v1)); } int64_t m_audio_pts; /**< @brief Global timestamp for the audio frames in output audio stream time base units */ int64_t m_video_pts; /**< @brief Global timestamp for the video frames in output video stream time base units */ int64_t m_last_mux_dts; /**< @brief Last muxed DTS */ ID3v1 m_id3v1; /**< @brief mp3 only, can be referenced at any time */ }; typedef std::map DEVICETYPE_MAP; /**< @brief Map device types to pixel formats */ enum class HWACCELMODE /**< @brief Currently active hardware acceleration mode */ { NONE, /**< @brief Hardware acceleration not active */ ENABLED, /**< @brief Hardware acceleration is active */ FALLBACK /**< @brief Hardware acceleration selected, but fell back to software */ }; typedef std::variant MULTIFRAME; /**< @brief Combined audio/videoframe and subtitle */ typedef std::multimap MULTIFRAME_MAP; /**< @brief Audio frame/video frame/subtitle buffer */ typedef std::map STREAM_MAP; /**< @brief Map input subtitle stream to output stream */ public: /** * Construct FFmpeg_Transcoder object */ explicit FFmpeg_Transcoder(); /** * Destroy FFMPEG_Transcoder object * Close and free all internal structures. */ virtual ~FFmpeg_Transcoder(); /** * Check if input file is already open. * * @return true if open; false if closed */ bool is_open() const; /** * Open the given FFmpeg file and prepare for decoding. * Collect information for the file (duration, bitrate, etc.). * After this function, the other methods can be used to process the file. * * @param[in,out] virtualfile - Virtualfile object for desired file. May be a physical file, a DVD, Blu-ray or video CD * @param[in,out] fio - Pass an already open fileio object. Normally the file is opened, but if this parameter is not nullptr the already existing object is used. * * @return On success, returns 0; on error, a negative AVERROR value. */ int open_input_file(LPVIRTUALFILE virtualfile, std::shared_ptr fio = nullptr); /** * @brief Open output file. Data will actually be written to buffer and copied by FUSE when accessed. * @param[in] buffer - Cache buffer to be written. * @return On success, returns 0; on error, a negative AVERROR value. */ int open_output_file(Buffer* buffer); /** * Process a single frame of audio data. The encode_pcm_data() method * of the Encoder will be used to process the resulting audio data, with the * result going into the given Buffer. * @param[out] status - On success, returns DECODER_SUCCESS; if at EOF, returns DECODER_EOF; on error, returns DECODER_ERROR * @return On success, returns 0; on error, a negative AVERROR value. If EOF is reached, it returns 1. */ int process_single_fr(DECODER_STATUS *status); /** * Encode any remaining PCM data to the given buffer. This should be called * after all input data has already been passed to encode_pcm_data(). * @return On success, returns 0; on error, a negative AVERROR value. */ int encode_finish(); /** * @brief Close transcoder, free all ressources. */ void closeio(); /** * @brief Get last modification time of file. * @return Modification time (seconds since epoch) */ time_t mtime() const; /** * @brief Get the file duration. * @return Returns the duration of the file in AV_TIME_BASE units. */ int64_t duration() const; /** * @brief Try to predict the recoded file size. This may (better will surely) be inaccurate. * @return Predicted file size in bytes. */ size_t predicted_filesize() const; /** * @brief Get the number of video frames in file. * @return On success, returns the number of frames; on error, returns 0 (calculation failed or no video source file). */ uint32_t video_frame_count() const; /** * @brief Get the number of HLS segments of file. * @return On success, returns the number of segments; on error, returns 0 (calculation failed). */ uint32_t segment_count() const; /** * @brief Assemble an ID3v1 file tag * @return Returns an ID3v1 file tag. */ const ID3v1 * id3v1tag() const; /** * @brief Return source filename. * @return Returns filename. */ virtual const char * filename() const override; /** * @brief Return destination filename. * @return Returns filename. */ virtual const char * destname() const override; /** * @brief Return virtual filename. Same as destination filename, but with virtual (mount) path.. * @return Returns filename. */ virtual const char * virtname() const override; /** * @brief Predict audio file size. This may (better will surely) be inaccurate. * @param[out] filesize - Predicted file size in bytes, including audio stream size. * @param[in] codec_id - Target codec ID. * @param[in] bit_rate - Target bit rate. * @param[in] duration - File duration. * @param[in] channels - Number of channels in target file. * @param[in] sample_rate - Sample rate of target file. * @param[in] sample_format - Selected sample format * @return On success, returns true; on failure, returns false. */ static bool audio_size(size_t *filesize, AVCodecID codec_id, BITRATE bit_rate, int64_t duration, int channels, int sample_rate, AVSampleFormat sample_format); /** * @brief Predict video file size. This may (better will surely) be inaccurate. * @param[out] filesize - Predicted file size in bytes, including video stream size. * @param[in] codec_id - Target codec ID. * @param[in] bit_rate - Target bit rate. * @param[in] duration - File duration. * @param[in] width - Target video width. * @param[in] height- Target video height. * @param[in] interleaved - True if target video is interleaved, false if not. * @param[in] framerate - Frame rate of target video. * @return On success, returns true; on failure, returns false. */ static bool video_size(size_t *filesize, AVCodecID codec_id, BITRATE bit_rate, int64_t duration, int width, int height, bool interleaved, const AVRational & framerate); /** * @brief Predict overhead in file size. This may (better will surely) be inaccurate. * @param[out] filesize - Predicted file size in bytes, including overhead. * @param[in] filetype - File type: MP3, TS etc. * @return On success, returns true; on failure, returns false. */ static bool total_overhead(size_t *filesize, FILETYPE filetype); /** * @brief Closes the output file if open and reports lost packets. Can safely be called again after the file was already closed or if the file was never open. * @return Returns true if anything has been closed; false if not. */ bool close_output_file(); /** * @brief Closes the input file if open. Can safely be called again after the file was already closed or if the file was never open. * @return Returns true if anything has been closed; false if not. */ bool close_input_file(); /** * @brief Seek to a specific frame. Does not actually perform the seek, this is done asynchronously by the transcoder thread. * @param[in] frame_no - Frame number to seek 1...n * @return On success, returns 0; On error, negative AVERROR value and sets errno to EINVAL. */ int stack_seek_frame(uint32_t frame_no); /** * @brief Seek to a specific HLS segment. Does not actually perform the seek, this is done asynchronously by the transcoder thread. * @param[in] segment_no - Segment number to seek 1...n * @return On success, returns 0; On error, negative AVERROR value and sets errno to EINVAL. */ int stack_seek_segment(uint32_t segment_no); /** * @brief Check for an export frame format * @return Returns true for formats that export all frames as images. */ bool is_multiformat() const; /** * @brief Check for an export frame format * @return Returns true for formats that export all frames as images. */ bool is_frameset() const; /** * @brief Check for HLS format * @return Returns true for formats that create an HLS set including the m3u file. */ bool is_hls() const; /** * @brief Check if we made a seek operation * @return Returns true if a seek was done, false if not. */ bool have_seeked() const; /** * @brief Flush FFmpeg's input buffers */ void flush_buffers(); /** * @brief Flush delayed audio packets, if there are any */ int flush_delayed_audio(); /** * @brief Flush delayed video packets, if there are any */ int flush_delayed_video(); /** * @brief Flush delayed subtitle packets, if there are any */ int flush_delayed_subtitles(); /** * @brief Get PTS (presentation time stamp) of decoded audio/video so far. * @return Returns the PTS (presentation time stamp) of decoded audio/video so far in AV_TIME_BASE units. */ int64_t pts() const; /** * @brief Current seek frame if available. * @return Returns the current seek frame; 0 if none available. */ uint32_t last_seek_frame_no() const; protected: /** * @brief Copy data from audio FIFO to frame buffer. * Divides WAV data into proper chunks to be fed into the * encoder. * @return On success, returns 0; on error, a negative AVERROR value. */ int copy_audio_to_frame_buffer(int *finished); /** * @brief Find best match stream and open codec context for it. * @param[in] format_ctx - Output format context * @param[out] codec_ctx, - Newly created codec context * @param[in] stream_idx - Stream index of new stream. * @param[in] type - Type of media: audio or video. * @return On success, returns 0; on error, a negative AVERROR value. */ int open_bestmatch_decoder(AVFormatContext *format_ctx, AVCodecContext **codec_ctx, int *stream_idx, AVMediaType type); /** * @brief Open the best match video stream, if present in input file. * @return On success, returns 0; on error, a negative AVERROR value. */ int open_bestmatch_video(); /** * @brief Open the best match audio stream. * @return On success, returns 0; on error, a negative AVERROR value. */ int open_bestmatch_audio(); /** * @brief Open all subtitles streams, if present in input file * and if supported by output file. The input and output codec * type must also match: Can only transcode bitmap subtitles * into bitmap subtitles or text to text. * @todo Add text to bitmap conversion. * @return On success, returns 0; on error, a negative AVERROR value. */ int open_subtitles(); /** * @brief open_albumarts * @return On success, returns 0; on error, a negative AVERROR value. */ int open_albumarts(); /** * @brief Determine the hardware pixel format for the codec, if applicable. * @param[in] codec - Input codec used * @param[in] dev_type - Hardware device type * @param[in] use_device_ctx - If true checks for pix format if using a hardware device context, for a pix format using a hardware frames context otherwise. * @return Returns hardware pixel format, or AV_PIX_FMT_NONE if not applicable. */ #if IF_DECLARED_CONST AVPixelFormat get_hw_pix_fmt(const AVCodec *codec, AVHWDeviceType dev_type, bool use_device_ctx) const; #else // !IF_DECLARED_CONST AVPixelFormat get_hw_pix_fmt(AVCodec *codec, AVHWDeviceType dev_type, bool use_device_ctx) const; #endif // !IF_DECLARED_CONST /** * @brief Open codec context for stream_idx. * @param[in] format_ctx - Output format context * @param[out] codec_ctx - Newly created codec context * @param[in] stream_idx - Stream index of new stream. * @param[in] input_codec - Decoder codec to open, may be nullptr. Will open a matching codec automatically. * @param[in] mediatype - Type of media: audio or video. * @return On success, returns 0; on error, a negative AVERROR value. */ #if IF_DECLARED_CONST int open_decoder(AVFormatContext *format_ctx, AVCodecContext **codec_ctx, int stream_idx, const AVCodec *input_codec, AVMediaType mediatype); #else // !IF_DECLARED_CONST int open_decoder(AVFormatContext *format_ctx, AVCodecContext **codec_ctx, int stream_idx, AVCodec *input_codec, AVMediaType mediatype); #endif // !IF_DECLARED_CONST /** * @brief Open output frame set. Data will actually be written to buffer and copied by FUSE when accessed. * @param[in] buffer - Stream buffer to operate on * @return On success, returns 0; on error, a negative AVERROR value. */ int open_output_frame_set(Buffer *buffer); /** * @brief Open output file. Data will actually be written to buffer and copied by FUSE when accessed. * @param[in] buffer - Stream buffer to operate on * @return On success, returns 0; on error, a negative AVERROR value. */ int open_output(Buffer *buffer); /** * @brief Process headers of output file * Write file header, process meta data and add album arts. * @return On success, returns 0; on error, a negative AVERROR value. */ int process_output(); /** * FFmpeg handles cover arts like video streams. * Try to find out if we have a video stream or a cover art. * @return Return true if file contains a video stream. */ bool is_video() const; /** * @brief Prepare codec options. * @param[in] opt - Codec private data. * @param[in] profile_option_vec - Selected profile option. * @return On success, returns 0; on error, a negative AVERROR value. */ int update_codec(void *opt, const PROFILE_OPTION_VEC & profile_option_vec) const; /** * @brief Prepare codec options for a file type. * @param[in] opt - Codec private data. * @param[in] filetype - File type: MP3, MP4 etc. * @return On success, returns 0; on error, a negative AVERROR value. */ int prepare_codec(void *opt, FILETYPE filetype) const; /** * @brief Add new stream to output file. * @param[in] codec_id - Codec for this stream. * @return On success, returns index of new stream [0...n]; On error, negative AVERROR value. */ int add_stream(AVCodecID codec_id); /** * @brief Add new subtitle stream to output file. * @param[in] codec_id - Codec for this stream. * @param[in] input_streamref - Streamref of input stream. * @param[in] language - (Optional) Language or subtitle file, or std::nullopt if unknown. * @return On success, returns index of new stream [0...n]; On error, negative AVERROR value. */ int add_subtitle_stream(AVCodecID codec_id, StreamRef & input_streamref, const std::optional &language = std::nullopt); /** * @brief Add new stream copy to output file. * @param[in] codec_id - Codec for this stream. * @param[in] codec_type - Codec type: audio or video. * @return On success, returns 0; on error, a negative AVERROR value. */ int add_stream_copy(AVCodecID codec_id, AVMediaType codec_type); /** * @brief Add a stream for an album art. * @param[in] input_codec_ctx - Input codec context. * @return On success, returns 0; on error, a negative AVERROR value. */ int add_albumart_stream(const AVCodecContext *input_codec_ctx); /** * @brief Add album art to stream. * @param[in] output_stream - Output stream. * @param[in] pkt_in - Packet with album art. * @return On success, returns 0; on error, a negative AVERROR value. */ int add_albumart_frame(AVStream *output_stream, AVPacket *pkt_in); /** * @brief Open an output file and the required encoder. * Also set some basic encoder parameters. * Some of these parameters are based on the input file's parameters. * @param[in] buffer - Stream buffer to operate on * @return On success, returns 0; on error, a negative AVERROR value. */ int open_output_filestreams(Buffer *buffer); /** * @brief Safely copy a tag to a target buffer. If the input buffer size * is larger than output the data will be truncated to avoid overruns. * The function never appends a /0 terminator. * @param[out] out - Target buffer * @param[in] in - Input buffer * @return Constant pointer to target buffer. */ template const char * tagcpy(char (&out) [ size ], const std::string & in) const; /** * @brief Safely copy a tag to a target buffer. If the input buffer size * is larger than output the data will be truncated to avoid overruns. * The function never appends a /0 terminator. * @param[out] out - Target buffer * @param[in] in - Input buffer * @return Constant pointer to target buffer. */ template const T & tagcpy(T & out, const std::string & in) const; /** * @brief Process the metadata in the FFmpeg file. * This should be called at the beginning, before reading audio data. * The set_text_tag() and set_picture_tag() methods of the given Encoder will * be used to set the metadata, with results going into the given Buffer. * This function will also read the actual PCM stream parameters. * @param[in] metadata_out - Dictionary of output file. Metadata will be copied into it. * @param[in] metadata_in - Dictionary of input file. Metadata will be copied out of it. * @param[in] contentstream - True if this is a content stream, i.e, audio or video. False for album arts or sub titles. */ void copy_metadata(AVDictionary **metadata_out, const AVDictionary *metadata_in, bool contentstream = true); /** * @brief Copy metadata from source to target * @return On success, returns 0; on error, a negative AVERROR value. */ int process_metadata(); /** * @brief Copy all album arts from source to target. * @return On success, returns 0; on error, a negative AVERROR value. */ int process_albumarts(); /** * @brief Initialize the audio resampler based on the input and output codec settings. * If the input and output sample formats differ, a conversion is required * libswresample takes care of this, but requires initialization. * @return On success, returns 0; on error, a negative AVERROR value. */ int init_resampler(); /** * @brief Initialise a FIFO buffer for the audio samples to be encoded. * @return On success, returns 0; on error, a negative AVERROR value. */ int init_audio_fifo(); /** * @brief Update format options * @param[in] dict - Dictionary to update. * @param[in] option_vec - Profile option to set. * @return On success, returns 0; on error, a negative AVERROR value. */ int update_format(AVDictionary** dict, const PROFILE_OPTION_VEC & option_vec) const; /** * @brief Prepare format optimisations * @param[in] dict - Dictionary to update. * @param[in] filetype - File type: MP3, MP4 etc. * @return On success, returns 0; on error, a negative AVERROR value. */ int prepare_format(AVDictionary **dict, FILETYPE filetype) const; /** * @brief Write the header of the output file container. * @return On success, returns 0; on error, a negative AVERROR value. */ int write_output_file_header(); /** * @brief Store packet in output stream. * @param[in] pkt - Packet to store. * @param[in] mediatype - Typo of packet: audio, video, image (attachment) * @return On success, returns 0; on error, a negative AVERROR value. */ int store_packet(AVPacket *pkt, AVMediaType mediatype); /** * @brief Decode one audio frame * @param[in] pkt - Packet to decode. * @param[in] decoded - 1 if packet was decoded, 0 if it did not contain data. * @return On success, returns 0; on error, a negative AVERROR value. */ int decode_audio_frame(AVPacket *pkt, int *decoded); /** * @brief Decode one video frame * @param[in] pkt - Packet to decode. * @param[in] decoded - 1 if packet was decoded, 0 if it did not contain data. * @return On success, returns 0; on error, a negative AVERROR value. */ int decode_video_frame(AVPacket *pkt, int *decoded); /** * @brief Decode one subtitle * @param[in] pkt - Packet to decode. * @param[in] decoded - 1 if packet was decoded, 0 if it did not contain data. * @return On success, returns 0; on error, a negative AVERROR value. */ int decode_subtitle(AVPacket *pkt, int *decoded); /** * @brief Decode one subtitle * @param[in] codec_ctx - AVCodecContext object of output codec context. * @param[in] pkt - Packet to decode. * @param[in] decoded - 1 if packet was decoded, 0 if it did not contain data. * @param[in] out_stream_idx - Output stream index. * @return On success, returns 0; on error, a negative AVERROR value. */ int decode_subtitle(AVCodecContext *codec_ctx, AVPacket *pkt, int *decoded, int out_stream_idx); /** * @brief Create PTS/DTS and update the packet. * If the update packet lacks time stamps, create a fictitious PTS or DTS and update it. * If the packet already has valid time stamps, nothing is changed. * @param[inout] pkt - Audio/video packet to update. * @param[inout] cur_ts - Current time stamp, will be updated to the next position. */ void make_pts(AVPacket *pkt, int64_t *cur_ts) const; /** * @brief Decode one frame. * @param[in] pkt - Packet to decode. * @return On success, returns 0; on error, a negative AVERROR value. */ int decode_frame(AVPacket *pkt); /** * @brief Initialise a temporary storage for the specified number of audio samples. * The conversion requires temporary storage due to the different format. * The number of audio samples to be allocated is specified in frame_size. * @param[out] converted_input_samples - Memory for input samples. * @param[in] frame_size - Size of one frame. * @return On success, returns 0; on error, a negative AVERROR value. */ int init_converted_samples(uint8_t ***converted_input_samples, int frame_size); /** * @brief Convert the input audio samples into the output sample format. * The conversion happens on a per-frame basis, the size of which is * specified by frame_size. * @param[in] input_data - Input data. * @param[in] in_samples - Number of input samples. * @param[out] converted_data - Converted data. * @param[out] out_samples - Number of output samples * @return On success, returns 0; on error, a negative AVERROR value. */ int convert_samples(uint8_t **input_data, int in_samples, uint8_t **converted_data, int *out_samples); /** * @brief Add converted input audio samples to the FIFO buffer for later processing. * @param[in] converted_input_samples - Samples to add. * @param[in] frame_size - Frame size * @return On success, returns 0; on error, a negative AVERROR value. */ int add_samples_to_fifo(uint8_t **converted_input_samples, int frame_size); /** * @brief Flush the remaining frames for all streams. * @return On success, returns 0; on error, a negative AVERROR value. */ int flush_frames_all(bool use_flush_packet); /** * @brief Flush the remaining frames * @param[in] stream_idx - Stream index to flush. * @param[in] use_flush_packet - If true, use flush packet. Otherwise pass nullptr to avcodec_receive_frame. * @return On success, returns 0; on error, a negative AVERROR value. */ int flush_frames_single(int stream_idx, bool use_flush_packet); /** * @brief Read frame from source file, decode and store in FIFO. * @param[in] finished - 1 if at EOF. * @return On success, returns 0; on error, a negative AVERROR value. */ int read_decode_convert_and_store(int *finished); /** * @brief Initialise one input frame for writing to the output file. * The frame will be exactly frame_size samples large. * @param[in] frame - Newly initialised frame. * @param[in] frame_size - Size of new frame. * @return On success, returns 0; on error, a negative AVERROR value. */ int init_audio_output_frame(AVFrame *frame, int frame_size) const; /** * @brief Allocate memory for one picture. * @param[in] frame - Frame to prepare * @param[in] pix_fmt - Pixel format * @param[in] width - Picture width * @param[in] height - Picture height * @return On success, returns 0; on error, a negative AVERROR value. */ int alloc_picture(AVFrame *frame, AVPixelFormat pix_fmt, int width, int height) const; /** * @brief Produce audio dts/pts. This is required because the target codec usually has a different * frame size than the source, so the number of packets will not match 1:1. * @param[in] pkt - Packet to add dts/pts to. */ void produce_audio_dts(AVPacket * pkt); /** * This does not quite work like avcodec_decode_audio4/avcodec_decode_video2. * There is the following difference: if you got a frame, you must call * it again with pkt=nullptr. pkt==nullptr is treated differently from pkt->size==0 * (pkt==nullptr means get more output, pkt->size==0 is a flush/drain packet) * @param[in] codec_ctx - AVCodecContext of input stream. * @param[in] frame - Decoded frame * @param[out] got_frame - 1 if a frame was decoded, 0 if not * @param[in] pkt - Packet to decode * @return On success, returns 0. On error, returns a negative AVERROR value. */ int decode(AVCodecContext *codec_ctx, AVFrame *frame, int *got_frame, const AVPacket *pkt) const; /** * @brief Load one audio frame from the FIFO buffer and store in frame buffer. * @param[in] frame_size - Size of frame. * @return On success, returns 0. On error, returns a negative AVERROR value. */ int create_audio_frame(int frame_size); /** * @brief Create one frame worth of audio to the output file. * @param[in] frame - Audio frame to encode * @param[in] data_present - 1 if frame contained data that could be encoded, 0 if not. * @return On success, returns 0. On error, returns a negative AVERROR value. */ int encode_audio_frame(const AVFrame *frame, int *data_present); /** * @brief Encode one frame worth of video to the output file. * @param[in] frame - Video frame to encode * @param[in] data_present - 1 if frame contained data that could be encoded, 0 if not. * @return On success, returns 0. On error, returns a negative AVERROR value. */ int encode_video_frame(const AVFrame *frame, int *data_present); /** * @brief Encode one subtitle frame to the output file. * @param[in] sub - Subtitle frame to encode * @param[in] out_stream_idx - Index of stream to encode to. * @param[in] data_present - 1 if frame contained data that could be encoded, 0 if not. * @return On success, returns 0. On error, returns a negative AVERROR value. */ int encode_subtitle(const AVSubtitle *sub, int out_stream_idx, int *data_present); /** * @brief Encode frame to image * @param[in] frame - Video frame to encode * @param[out] data_present - Set to 1 if data was encoded. 0 if not. * @return On success, returns 0. On error, returns a negative AVERROR value. */ int encode_image_frame(const AVFrame *frame, int *data_present); /** * @brief Write the trailer of the output file container. * @return On success, returns 0. On error, returns a negative AVERROR value. */ int write_output_file_trailer(); /** * @brief Custom read function for FFmpeg * * Read from virtual files, may be a physical file but also a DVD, VCD or Blu-ray chapter. * * @param[in] opaque - Payload given to FFmpeg, basically the FileIO object * @param[in] data - Returned data read from file. * @param[in] size - Size of data buffer. * @return On success, returns bytes read. May be less than size or even 0. On error, returns a negative AVERROR value. */ static int input_read(void * opaque, unsigned char * data, int size); /** * @brief Custom write function for FFmpeg * @param[in] opaque - Payload given to FFmpeg, basically the FileIO object * @param[in] data - Data to be written * @param[in] size - Size of data block. * @return On success, returns bytes written. On error, returns a negative AVERROR value. */ #if LAVF_WRITEPACKET_CONST static int output_write(void * opaque, const uint8_t * data, int size); #else static int output_write(void * opaque, unsigned char * data, int size); #endif /** * @brief Custom seek function for FFmpeg * * Write to virtual files, currently only physical files. * * @param[in] opaque - Payload given to FFmpeg, basically the FileIO object * @param[in] offset - Offset to seek to. * @param[in] whence - One of the regular seek() constants like SEEK_SET/SEEK_END. Additionally FFmpeg constants like AVSEEK_SIZE are supported. * @return On successs returns 0. On error, returns -1 and sets errno accordingly. */ static int64_t seek(void * opaque, int64_t offset, int whence); /** * @brief Calculate the appropriate bitrate for a ProRes file given several parameters. * @param[in] width - Video width in pixels. * @param[in] height - Video height in pixels. * @param[in] framerate - Video frame rate. * @param[in] interleaved - If true, video is interleaved; false if not. * @param[in] profile - Selected ProRes profile. * @return Bitrate in bit/s. */ static BITRATE get_prores_bitrate(int width, int height, const AVRational &framerate, bool interleaved, PRORESLEVEL profile); /** * @brief Try to predict final file size. */ size_t calculate_predicted_filesize() const; /** * @brief Get the size of the output video based on user selection and apsect ratio. * @param[in] output_width - Output video width. * @param[in] output_height - Output video height. * @return Returns true if video height/width was reduces; false if not. */ bool get_video_size(int *output_width, int *output_height) const; /** * @brief Calculate output sample rate based on user option. * @param[in] input_sample_rate - Sample rate from input file. * @param[in] max_sample_rate - Max. sample rate if set by user * @param[in] output_sample_rate - Selected output sample rate. * @return Returns true if sample rate was changed; false if not. */ static bool get_output_sample_rate(int input_sample_rate, int max_sample_rate, int * output_sample_rate = nullptr); /** * @brief Calculate output bit rate based on user option. * @param[in] input_bit_rate - Bit rate from input file. * @param[in] max_bit_rate - Max. bit rate if set by user. * @param[in] output_bit_rate - Selected output bit rate. * @return Returns true if bit rate was changed; false if not. */ static bool get_output_bit_rate(BITRATE input_bit_rate, BITRATE max_bit_rate, BITRATE * output_bit_rate = nullptr); /** * @brief Calculate aspect ratio for width/height and sample aspect ratio (sar). * @param[in] width - Video width in pixels. * @param[in] height - Video height in pixels. * @param[in] sar - Aspect ratio of input video. * @param[in] ar - Calulcated aspect ratio, if computeable. * @return On success, returns true; if false is returned ar may not be used. */ bool get_aspect_ratio(int width, int height, const AVRational & sar, AVRational * ar) const; /** * @brief Initialise video filters * @param[in] codec_ctx - AVCodecContext object of output video. * @param[in] pix_fmt - Output stream pixel format. * @param[in] avg_frame_rate - Average output stream frame rate. * @param[in] time_base - Output stream time base. * @return Returns 0 if OK, or negative AVERROR value. */ int init_deinterlace_filters(AVCodecContext *codec_ctx, AVPixelFormat pix_fmt, const AVRational &avg_frame_rate, const AVRational &time_base); /** * @brief Send video frame to the filters. * @param[inout] srcframe - On input video frame to process, on output video frame that was filtered. * @param[in] ret - 0 if OK, or negative AVERROR value. * @return Returns 0 if OK, or negative AVERROR value. */ int send_filters(FFmpeg_Frame * srcframe, int &ret); /** * @brief Free filter sinks. */ void free_filters(); /** * @brief Check if stream can be copied from input to output (AUTOCOPY option). * @param[in] stream - Input stream to check. * @return Returns true if stream can be copied; false if not. */ bool can_copy_stream(const AVStream *stream) const; /** * @brief Close and free the resampler context. * @return If an open context was closed, returns true; if nothing had been done returns false. */ bool close_resample(); /** * @brief Init image size rescaler and pixel format converter. * @param[in] in_pix_fmt - Input pixel format * @param[in] in_width - Input image width * @param[in] in_height - Input image height * @param[in] out_pix_fmt - Output pixel format * @param[in] out_width - Output image width * @param[in] out_height - Output pixel format * @return Returns 0 if OK, or negative AVERROR value. */ int init_rescaler(AVPixelFormat in_pix_fmt, int in_width, int in_height, AVPixelFormat out_pix_fmt, int out_width, int out_height); /** * @brief Purge all samples in audio FIFO * @return Number of samples that have been purged. Function never fails. */ int purge_audio_fifo(); /** * @brief Purge all frames in buffer * @return Number of frames that have been purged. Function never fails. */ size_t purge_multiframe_map(); /** * @brief Purge all packets in HLS FIFO buffer * @return Number of Packets that have been purged. Function never fails. */ size_t purge_hls_fifo(); /** * @brief Purge FIFO and map buffers and report lost packets/frames/samples. */ void purge(); /** * @brief Actually perform seek for frame. * This function ensures that it is positioned at a key frame, so the resulting position may be different from the requested. * If e.g. frame no. 24 is a key frame, and frame_no is set to 28, the actual position will be at frame 24. * @param[in] frame_no - Frame number 1...n to seek to. * @return Returns 0 if OK, or negative AVERROR value. */ int do_seek_frame(uint32_t frame_no); /** * @brief Skip decoded frames or force seek to frame_no. * @param[in] frame_no - Frame to seek to. * @param[in] forced_seek - Force seek even if np frames skipped. * @return Returns 0 if OK, or negative AVERROR value. */ int skip_decoded_frames(uint32_t frame_no, bool forced_seek); /** * @brief Get correct input and output pixel format * @param[in] output_codec_ctx - Output codec context. * @param[out] in_pix_fmt - Input pixel format. * @param[out] out_pix_fmt - Output pixel format. */ void get_pix_formats(AVPixelFormat *in_pix_fmt, AVPixelFormat *out_pix_fmt, AVCodecContext* output_codec_ctx = nullptr) const; // Hardware de/encoding /** * Callback to negotiate the pixelFormat * @param[in] input_codec_ctx - Input codec context * @param[in] pix_fmts is the list of formats which are supported by the codec, * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. * The first is always the native one. * @note The callback may be called again immediately if initialization for * the selected (hardware-accelerated) pixel format failed. * @warning Behavior is undefined if the callback returns a value not * in the fmt list of formats. * @return the chosen format * - encoding: unused * - decoding: Set by user, if not set the native format will be chosen. */ static enum AVPixelFormat get_format_static(AVCodecContext *input_codec_ctx, const enum AVPixelFormat *pix_fmts); /** * Callback to negotiate the pixelFormat * @param[in] input_codec_ctx - Input codec context * @param[in] pix_fmts is the list of formats which are supported by the codec, * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. * The first is always the native one. * @note The callback may be called again immediately if initialization for * the selected (hardware-accelerated) pixel format failed. * @warning Behavior is undefined if the callback returns a value not * in the fmt list of formats. * @return the chosen format * - encoding: unused * - decoding: Set by user, if not set the native format will be chosen. */ enum AVPixelFormat get_format(AVCodecContext *input_codec_ctx, const enum AVPixelFormat *pix_fmts) const; /** * Open a device of the specified type and create an AVHWDeviceContext for it. * * This is a convenience function intended to cover the simple cases. Callers * who need to fine-tune device creation/management should open the device * manually and then wrap it in an AVHWDeviceContext using * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init(). * * The returned context is already initialized and ready for use, the caller * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of * the created AVHWDeviceContext are set by this function and should not be * touched by the caller. * * @param[out] hwaccel_enc_device_ctx - On success, a * reference to the newly-created device context will be * written here. * @param[in] dev_type - The type of the device to create. * @param[in] device - A type-specific string identifying the device to open. * * @return 0 on success, a negative AVERROR code on failure. */ int hwdevice_ctx_create(AVBufferRef **hwaccel_enc_device_ctx, AVHWDeviceType dev_type, const std::string & device) const; /** * @brief Add reference to hardware device context. * @param[in] input_codec_ctx - Input codec context * @return 0 on success, a negative AVERROR code on failure. */ int hwdevice_ctx_add_ref(AVCodecContext *input_codec_ctx); /** * @brief Free (remove reference) to hardware device context * @param[inout] hwaccel_device_ctx - Hardware device context to free */ void hwdevice_ctx_free(AVBufferRef **hwaccel_device_ctx); /** * @brief Adds a reference to an existing decoder hardware frame context or * allocates a new AVHWFramesContext tied to the given hardware device context * if if the decoder runs in software. * @param[in] output_codec_ctx - Encoder codexc context * @param[in] input_codec_ctx - Decoder codexc context * @param[in] hw_device_ctx - Existing hardware device context * @return 0 on success, a negative AVERROR code on failure. */ int hwframe_ctx_set(AVCodecContext *output_codec_ctx, AVCodecContext *input_codec_ctx, AVBufferRef *hw_device_ctx) const; /** * Copy data hardware surface to software. * @param[in] output_codec_ctx - Codec context * @param[inout] sw_frame - AVFrame to copy data to * @param[in] hw_frame - AVFrame to copy data from * @return 0 on success, a negative AVERROR code on failure. */ int hwframe_copy_from_hw(AVCodecContext *output_codec_ctx, FFmpeg_Frame *sw_frame, const AVFrame *hw_frame) const; /** * Copy data software to a hardware surface. * @param[in] output_codec_ctx - Codec context * @param[inout] hw_frame - AVFrame to copy data to * @param[in] sw_frame - AVFrame to copy data from * @return 0 on success, a negative AVERROR code on failure. */ int hwframe_copy_to_hw(AVCodecContext *output_codec_ctx, FFmpeg_Frame *hw_frame, const AVFrame *sw_frame) const; /** * @brief Get the hardware codec name as string. This is required, because e.g. * the name for the software codec is libx264, but for hardware it is h264_vaapi * under VAAPI. * @param[in] codec_id - Id of encoder/decoder codec * @param[out] codec_name - Returns the name of the codec, may be nullptr if not requitred. * @return 0 on success, a negative AVERROR code on failure. */ int get_hw_decoder_name(AVCodecID codec_id, std::string *codec_name = nullptr) const; /** * @brief Get the hardware codec name as string. This is required, because e.g. * the name for the software codec is libx264, but for hardware it is h264_vaapi * under VAAPI. * @param[in] codec_id - Id of encoder/decoder codec * @param[out] codec_name - Returns the name of the codec, may be nullptr if not requitred. * @return 0 on success, AVERROR_DECODER_NOT_FOUND if no codec available. */ int get_hw_encoder_name(AVCodecID codec_id, std::string *codec_name = nullptr) const; /** * @brief Determine VAAPI codec name * @param[in] codec_id - Id of encoder/decoder codec * @param[out] codec_name - Name of the codec. * @return 0 on success, AVERROR_DECODER_NOT_FOUND if no codec available. */ int get_hw_vaapi_codec_name(AVCodecID codec_id, std::string *codec_name) const; /** * @brief Determine MMAL decoder codec name * @param[in] codec_id - Id of encoder/decoder codec * @param[out] codec_name - Name of the codec. * @return 0 on success, AVERROR_DECODER_NOT_FOUND if no codec available. */ int get_hw_mmal_decoder_name(AVCodecID codec_id, std::string *codec_name) const; /* * @brief Determine video for linux decoder codec name * @param[in] codec_id - Id of encoder/decoder codec * @param[out] codec_name - Name of the codec. * @return 0 on success, AVERROR_DECODER_NOT_FOUND if no codec available. */ //int get_hw_v4l2m2m_decoder_name(AVCodecID codec_id, std::string *codec_name) const; /** * @brief Determine OMX encoder codec name * @param[in] codec_id - Id of encoder/decoder codec * @param[out] codec_name - Name of the codec. * @return 0 on success, AVERROR_DECODER_NOT_FOUND if no codec available. */ int get_hw_omx_encoder_name(AVCodecID codec_id, std::string *codec_name) const; /** * @brief Determine video for linux encoder codec name * @param[in] codec_id - Id of encoder/decoder codec * @param[out] codec_name - Name of the codec. * @return 0 on success, AVERROR_DECODER_NOT_FOUND if no codec available. */ int get_hw_v4l2m2m_encoder_name(AVCodecID codec_id, std::string *codec_name) const; /** * @brief Get the software pixel format for the given hardware acceleration. * @param[in] type - Selected hardware acceleration. * @return 0 on success, a negative AVERROR code on failure. */ static AVPixelFormat find_sw_fmt_by_hw_type(AVHWDeviceType type); /** * @brief Calculate next HLS segment from position * @param[in] pos - Current transcoder position in AV_TIMEBASE fractional seconds. * @return Number of next segment */ uint32_t get_next_segment(int64_t pos) const; /** * @brief Check if segment number is next designated segment. * @param[in] next_segment - Number next current segment * @return Returns true if next segment should start, false if not. */ bool goto_next_segment(uint32_t next_segment) const; /** * @brief Create a fake WAV header * Create a fake WAV header. Inserts predicted file sizes to allow playback * to start directly. * @return 0 on success, a negative AVERROR code on failure. */ int create_fake_wav_header() const; /** * @brief Create a fake AIFF header * Create a fake AIFF header. Inserts predicted file sizes to allow playback * to start directly. * @return 0 on success, a negative AVERROR code on failure. */ int create_fake_aiff_header() const; /** * @brief Read AIFF chunk * @param[in] buffer - Cache buffer to read from * @param[inout] buffoffset - Byte offset into buffer. Upon return holds offset to the position of the chunk. * @param[in] ID - Chunk ID (fourCC) * @param[out] chunk - Buffer for chunk * @param[inout] size - Size of chunk. Buffer for chunk must be large enough to hold it. Upon return holds the actual size of the chunk read. * @return Returns 0 if successful or -1 On error, or end of file. Check buffer->eof(). */ int read_aiff_chunk(Buffer *buffer, size_t *buffoffset, const char *ID, uint8_t *chunk, size_t *size) const; /** * @brief Check for audio stream * @param[in] stream_idx - ID of stream to check * @return Returns true if stream is an audio stream, false if not. */ bool is_audio_stream(int stream_idx) const; /** * @brief Check for video stream * @param[in] stream_idx - ID of stream to check * @return Returns true if stream is a video stream, false if not. */ bool is_video_stream(int stream_idx) const; /** * @brief Check for subtitle stream * @param[in] stream_idx - ID of stream to check * @return Returns true if stream is a subtitle stream, false if not. */ bool is_subtitle_stream(int stream_idx) const; /** * @brief Get subtitle stream for the stream index * @param[in] stream_idx - Stream index to get subtitle stream for * @return Pointer to subbtitle stream or nullptr if not found */ StreamRef * get_out_subtitle_stream(int stream_idx); /** * @brief Check if stream exists * @param[in] stream_idx - ID of stream to check * @return Returns 0 if stream exists, false if not. */ bool stream_exists(int stream_idx) const; /** * @brief Add entry to input stream to output stream map. * @param[in] in_stream_idx - Index of input stream * @param[in] out_stream_idx - Index of output stream */ void add_stream_map(int in_stream_idx, int out_stream_idx); /** * @brief Map input stream index to output stream index * @param[in] in_stream_idx - Index of input stream * @return Returns output stream index or INVALID_STREAM if no match */ int map_in_to_out_stream(int in_stream_idx) const; /** * @brief Add all subtitle streams. Already existing streams are not * added again. * @return 0 on success, a negative AVERROR code on failure. */ int add_subtitle_streams(); /** * @brief Frame sets only: perform seek to a certain frame. * @return 0 on success, a negative AVERROR code on failure. */ int seek_frame(); /** * @brief HLS only: start a new HLS segment. * @return 0 on success, a negative AVERROR code on failure. */ int start_new_segment(); /** * @brief FFmpeg_Transcoder::read_packet * @param[in] opaque * @param[in] buf * @param[in] buf_size * @return */ static int read_packet(void *opaque, uint8_t *buf, int buf_size); /** * @brief Scan for external subtitle files * @return 0 on success, a negative AVERROR code on failure. */ int add_external_subtitle_streams(); /** * @brief add_external_subtitle_stream * @param[in] subtitle_file - Name of subtitle fule * @param[in] language - Language or subtitle file, or std::nullopt if unknown. * @return 0 on success, a negative AVERROR code on failure. */ int add_external_subtitle_stream(const std::string & subtitle_file, const std::optional & language); /** * @brief foreach_subititle_file * @param[in] search_path - Directory with subtitle files * @param[in] regex - Regular expression to select subtitle files * @param[in] depth - Recursively scan for subtitles, should be 0. * @param[in] f - Funtion to be called for each file found * @return 0 on success, a negative AVERROR code on failure. */ int foreach_subtitle_file(const std::string& search_path, const std::regex& regex, int depth, const std::function &)> & f); private: std::shared_ptr m_fileio; /**< @brief FileIO object of input file */ time_t m_mtime; /**< @brief Modified time of input file */ std::recursive_mutex m_seek_to_fifo_mutex; /**< @brief Access mutex for seek FIFO */ std::queue m_seek_to_fifo; /**< @brief Stack of seek requests. Will be processed FIFO */ std::atomic_uint32_t m_last_seek_frame_no; /**< @brief If not 0, this is the last frame that we seeked to. Video sources only. */ bool m_have_seeked; /**< @brief After seek operations this is set to make sure the trancoding result is marked RESULTCODE_INCOMPLETE to start transcoding over next access to fill the gaps. */ bool m_skip_next_frame; /**< @brief After seek, skip next video frame */ bool m_is_video; /**< @brief true if input is a video file */ MULTIFRAME_MAP m_frame_map; /**< @brief Audio/video/subtitle frame map */ // Audio conversion and buffering AVSampleFormat m_cur_sample_fmt; /**< @brief Currently selected audio sample format */ int m_cur_sample_rate; /**< @brief Currently selected audio sample rate */ #if LAVU_DEP_OLD_CHANNEL_LAYOUT AVChannelLayout m_cur_ch_layout; /**< @brief Currently selected audio channel layout */ #else // !LAVU_DEP_OLD_CHANNEL_LAYOUT uint64_t m_cur_channel_layout; /**< @brief Currently selected audio channel layout */ #endif // !LAVU_DEP_OLD_CHANNEL_LAYOUT SwrContext * m_audio_resample_ctx; /**< @brief SwResample context for audio resampling */ AVAudioFifo * m_audio_fifo; /**< @brief Audio sample FIFO */ // Video conversion and buffering SwsContext * m_sws_ctx; /**< @brief Context for video filtering */ AVFilterContext * m_buffer_sink_context; /**< @brief Video filter sink context */ AVFilterContext * m_buffer_source_context; /**< @brief Video filter source context */ AVFilterGraph * m_filter_graph; /**< @brief Video filter graph */ int64_t m_pts; /**< @brief Generated PTS */ int64_t m_pos; /**< @brief Generated position */ // Common things for audio/video/subtitles INPUTFILE m_in; /**< @brief Input file information */ OUTPUTFILE m_out; /**< @brief Output file information */ STREAM_MAP m_stream_map; /**< @brief Input stream to output stream map */ uint32_t m_current_segment; /**< @brief HLS only: Segment file number currently being encoded */ bool m_insert_keyframe; /**< @brief HLS only: Allow insertion of 1 keyframe */ // If the audio and/or video stream is copied, packets will be stuffed into the packet queue. bool m_copy_audio; /**< @brief If true, copy audio stream from source to target (just remux, no recode). */ bool m_copy_video; /**< @brief If true, copy video stream from source to target (just remux, no recode). */ // Time stamps int64_t m_cur_audio_ts; /**< @brief If the audio stream is copied and the time stamps are absent from the input stream, we have to generate them. */ int64_t m_cur_video_ts; /**< @brief If the video stream is copied and the time stamps are absent from the input stream, we have to generate them. */ const FFmpegfs_Format * m_current_format; /**< @brief Currently used output format(s) */ Buffer * m_buffer; /**< @brief Pointer to cache buffer object */ uint32_t m_reset_pts; /**< @brief We have to reset audio/video pts to the new position */ uint32_t m_fake_frame_no; /**< @brief The MJEPG codec requires monotonically growing PTS values so we fake some to avoid them going backwards after seeks */ static const std::vector m_prores_bitrate; /**< @brief ProRes bitrate table. Used for file size prediction. */ // Hardware acceleration static const DEVICETYPE_MAP m_devicetype_map; /**< @brief List of AVPixelFormats mapped to hardware acceleration types */ HWACCELMODE m_hwaccel_enc_mode; /**< @brief Current hardware acceleration mode for encoder */ HWACCELMODE m_hwaccel_dec_mode; /**< @brief Current hardware acceleration mode for decoder */ bool m_hwaccel_enable_enc_buffering; /**< @brief Enable hardware acceleration frame buffers for encoder */ bool m_hwaccel_enable_dec_buffering; /**< @brief Enable hardware acceleration frame buffers for decoder */ AVBufferRef * m_hwaccel_enc_device_ctx; /**< @brief Hardware acceleration device context for encoder */ AVBufferRef * m_hwaccel_dec_device_ctx; /**< @brief Hardware acceleration device context for decoder */ AVPixelFormat m_enc_hw_pix_fmt; /**< @brief Requested encoder hardware pixel format */ AVPixelFormat m_dec_hw_pix_fmt; /**< @brief Requested decoder hardware pixel format */ #define FFMPEGFS_AUDIO static_cast(0x0001) /**< @brief Denote an audio stream */ #define FFMPEGFS_VIDEO static_cast(0x0002) /**< @brief Denote a video stream */ #define FFMPEGFS_SUBTITLE static_cast(0x0004) /**< @brief Denote a subtitle stream */ uint32_t m_active_stream_msk; /**< @brief HLS: Currently active streams bit mask. Set FFMPEGFS_AUDIO and/or FFMPEGFS_VIDEO */ uint32_t m_inhibit_stream_msk; /**< @brief HLS: Currently inhibited streams bit mask. Packets temporarly go to m_hls_packet_fifo and will be prepended to next segment. Set FFMPEGFS_AUDIO and/or FFMPEGFS_VIDEO */ std::queue m_hls_packet_fifo; /**< @brief HLS packet FIFO */ }; #endif // FFMPEG_TRANSCODER_H ffmpegfs-2.18/src/ffmpeg_compat.h0000644000000000000000000001504015166175407013713 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_compat.h * @brief FFmpeg API compatibility * * This file makes it possible to support FFmpeg 2.x to 4. * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef FFMPEG_COMPAT_H #define FFMPEG_COMPAT_H #pragma once #ifdef __clang__ #define FALLTHROUGH_INTENDED [[clang::fallthrough]] /**< @brief Allow fallthrough in case statements for Clang */ #else #define FALLTHROUGH_INTENDED [[gnu::fallthrough]] /**< @brief Allow fallthrough in case statements for GCC */ #endif /** * FFmpeg compatibility layer: Maintain support for older versions while removing * deprecated functions as needed. * * See doc/APIchanges * https://raw.githubusercontent.com/FFmpeg/FFmpeg/master/doc/APIchanges */ /** * 2022-07-xx - xxxxxxxxxx - lavu 57.30.100 - frame.h * Add AVFrame.duration, deprecate AVFrame.pkt_duration. */ #define LAVU_DEP_PKT_DURATION (LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 30, 0)) /** * 2021-03-17 - f7db77bd87 - lavc 58.133.100 - codec.h * Deprecated av_init_packet(). Once removed, sizeof(AVPacket) will * no longer be a part of the public ABI. * Deprecated AVPacketList. * * Note from libacodec/packet.h: * * sizeof(AVPacket) being a part of the public ABI is deprecated. once * av_init_packet() is removed, new packets will only be able to be allocated * with av_packet_alloc(), and new fields may be added to the end of the struct * with a minor bump. * * * see av_packet_alloc * see av_packet_ref * see av_packet_unref */ #define LAVC_DEP_AV_INIT_PACKET (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(58, 133, 0)) /** * This is big fun... Of course making these const is a good idea, but nevertheless * a PITA to keep the code working with newer AND older versions... * * 2021-04-27 - cb3ac722f4 - lavc 59.0.100 - avcodec.h * Constified AVCodecParserContext.parser. * * 2021-04-27 - 8b3e6ce5f4 - lavd 59.0.100 - avdevice.h * The av_*_device_next API functions now accept and return * pointers to const AVInputFormat resp. AVOutputFormat. * * 2021-04-27 - d7e0d428fa - lavd 59.0.100 - avdevice.h * avdevice_list_input_sources and avdevice_list_output_sinks now accept * pointers to const AVInputFormat resp. const AVOutputFormat. * * 2021-04-27 - 46dac8cf3d - lavf 59.0.100 - avformat.h * av_find_best_stream now uses a const AVCodec ** parameter * for the returned decoder. * * 2021-04-27 - 626535f6a1 - lavc 59.0.100 - codec.h * avcodec_find_encoder_by_name(), avcodec_find_encoder(), * avcodec_find_decoder_by_name() and avcodec_find_decoder() * now return a pointer to const AVCodec. * * 2021-04-27 - 14fa0a4efb - lavf 59.0.100 - avformat.h * Constified AVFormatContext.*_codec. * * 2021-04-27 - 56450a0ee4 - lavf 59.0.100 - avformat.h * Constified the pointers to AVInputFormats and AVOutputFormats * in AVFormatContext, avformat_alloc_output_context2(), * av_find_input_format(), av_probe_input_format(), * av_probe_input_format2(), av_probe_input_format3(), * av_probe_input_buffer2(), av_probe_input_buffer(), * avformat_open_input(), av_guess_format() and av_guess_codec(). * Furthermore, constified the AVProbeData in av_probe_input_format(), * av_probe_input_format2() and av_probe_input_format3(). */ #define IF_DECLARED_CONST (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 0, 0)) /** * 2022-03-15 - cdba98bb80 - lavu 57.24.100 - channel_layout.h frame.h opt.h * Add new channel layout API based on the AVChannelLayout struct. * Add support for Ambisonic audio. * Deprecate previous channel layout API based on uint64 bitmasks. */ #define LAVU_DEP_OLD_CHANNEL_LAYOUT (LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 24, 0)) /** * 2022-03-15 - cdba98bb80 - swr 4.5.100 - swresample.h * Add swr_alloc_set_opts2() and swr_build_matrix2(). * Deprecate swr_alloc_set_opts() and swr_build_matrix(). */ #define SWR_DEP_ALLOC_SET_OPTS (LIBSWRESAMPLE_VERSION_INT >= AV_VERSION_INT(4, 5, 0)) /** * 2023-05-04 - xxxxxxxxxx - lavu 58.7.100 - frame.h * Deprecate AVFrame.interlaced_frame, AVFrame.top_field_first, and * AVFrame.key_frame. * Add AV_FRAME_FLAG_INTERLACED, AV_FRAME_FLAG_TOP_FIELD_FIRST, and * AV_FRAME_FLAG_KEY flags as replacement. */ #define LAVU_ADD_NEW_FRAME_FLAGS (LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(58, 7, 0)) /** * 2021-09-20 - dd846bc4a91 - lavc 59.8.100 - avcodec.h codec.h * Deprecate AV_CODEC_FLAG_TRUNCATED and AV_CODEC_CAP_TRUNCATED, * as they are redundant with parsers. */ #define LAVC_DEP_FLAG_TRUNCATED (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 8, 0)) /** * 2023-09-07 - 2a68d945cd7 - lavf 60.12.100 - avio.h * Constify the buffer pointees in the write_packet and write_data_type * callbacks of AVIOContext on the next major bump. */ #define LAVF_WRITEPACKET_CONST (LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(61, 0, 0)) /** * 2023-05-15 - 7d1d61cc5f5 - lavc 60 - avcodec.h * Depreate AVCodecContext.ticks_per_frame in favor of * AVCodecContext.framerate (encoding) and * AV_CODEC_PROP_FIELDS (decoding). */ #define LAVC_DEP_TICKSPERFRAME (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60, 0, 0)) /** * 2024-09-08 - 3305767560a - lavc 61.13.100 - avcodec.h * Add avcodec_get_supported_config() and enum AVCodecConfig; deprecate * AVCodec.pix_fmts, AVCodec.sample_fmts, AVCodec.supported_framerates, * AVCodec.supported_samplerates and AVCodec.ch_layouts. */ #define LAVC_USE_SUPPORTED_CFG (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 0)) #endif // FFMPEG_COMPAT_H ffmpegfs-2.18/src/ffmpeg_profiles.cc0000644000000000000000000006002015166175407014407 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ #include "ffmpeg_transcoder.h" /** * @file ffmpeg_profiles.cc * @brief Make audience audience specific optimisations * @see https://www.ffmpeg.org/ffmpeg-formats.html#mov_002c-mp4_002c-ismv * * MOV/MP4/ISMV (Smooth Streaming) muxer * ===================================== * * The mov/mp4/ismv muxer supports fragmentation. Normally, a MOV/MP4 file has all the metadata about all packets * stored in one location (written at the end of the file, it can be moved to the start for better playback by * adding faststart to the movflags, or using the qt-faststart tool). A fragmented file consists of a number of * fragments, where packets and metadata about these packets are stored together. Writing a fragmented file has * the advantage that the file is decodable even if the writing is interrupted (while a normal MOV/MP4 is undecodable * if it is not properly finished), and it requires less memory when writing very long files (since writing normal * MOV/MP4 files stores info about every single packet in memory until the file is closed). The downside is that it * is less compatible with other applications. * * Options * ------- * * Fragmentation is enabled by setting one of the AVOptions that define how to cut the file into fragments: * * -moov_size bytes * * Reserves space for the moov atom at the beginning of the file instead of placing the moov atom at the end. * If the space reserved is insufficient, muxing will fail. * * -movflags frag_keyframe * * Start a new fragment at each video keyframe. * * -frag_duration duration * * Create fragments that are duration microseconds long. * * -frag_size size * * Create fragments that contain up to size bytes of payload data. * * -movflags frag_custom * * Allow the caller to manually choose when to cut fragments, by calling av_write_frame(ctx, nullptr) to write a * fragment with the packets written so far. (This is only useful with other applications integrating libavformat, * not from ffmpeg.) * * -min_frag_duration duration * * Don’t create fragments that are shorter than duration microseconds long. * * If more than one condition is specified, fragments are cut when one of the specified conditions is fulfilled. * The exception to this is -min_frag_duration, which has to be fulfilled for any of the other conditions to apply. * * Additionally, the way the output file is written can be adjusted through a few other options: * * -movflags empty_moov * * Write an initial moov atom directly at the start of the file, without describing any samples in it. Generally, * an mdat/moov pair is written at the start of the file, as a normal MOV/MP4 file, containing only a short portion * of the file. With this option set, there is no initial mdat atom, and the moov atom only describes the tracks * but has a zero duration. * * This option is implicitly set when writing ismv (Smooth Streaming) files. * * -movflags separate_moof * * Write a separate moof (movie fragment) atom for each track. Normally, packets for all tracks are written in a * moof atom (which is slightly more efficient), but with this option set, the muxer writes one moof/mdat pair for * each track, making it easier to separate tracks. * * This option is implicitly set when writing ismv (Smooth Streaming) files. * * -movflags faststart * * Run a second pass moving the index (moov atom) to the beginning of the file. This operation can take a while, * and will not work in various situations such as fragmented output, thus it is not enabled by default. * * -movflags rtphint * * Add RTP hinting tracks to the output file. * * -movflags disable_chpl * * Disable Nero chapter markers (chpl atom). Normally, both Nero chapters and a QuickTime chapter track are written * to the file. With this option set, only the QuickTime chapter track will be written. Nero chapters can cause * failures when the file is reprocessed with certain tagging programs, like mp3Tag 2.61a and iTunes 11.3, most likely * other versions are affected as well. * * -movflags omit_tfhd_offset * * Do not write any absolute base_data_offset in tfhd atoms. This avoids tying fragments to absolute byte positions * in the file/streams. * * -movflags default_base_moof * * Similarly to the omit_tfhd_offset, this flag avoids writing the absolute base_data_offset field in tfhd atoms, but * does so by using the new default-base-is-moof flag instead. This flag is new from 14496-12:2012. This may make the * fragments easier to parse in certain circumstances (avoiding basing track fragment location calculations on the * implicit end of the previous track fragment). * * -write_tmcd * * Specify on to force writing a timecode track, off to disable it and auto to write a timecode track only for mov and * mp4 output (default). * * -movflags negative_cts_offsets * * Enables utilization of version 1 of the CTTS box, in which the CTS offsets can be negative. This enables the initial * sample to have DTS/CTS of zero, and reduces the need for edit lists for some cases such as video tracks with B-frames. * Additionally, eases conformance with the DASH-IF interoperability guidelines. * * Possible codec options: * * @code * // -profile:v baseline -level 3.0 * { "profile", "baseline", 0, 0 }, * { "level", "3.0", 0, 0 }, * * // -profile:v high -level 3.1 - REQUIRED FOR PLAYBACK UNDER WIN7 * { "profile", "high", 0, 0 }, * { "level", "3.1", 0, 0 }, * * // Set speed (changes profile!): utra/veryfast and zerolatency * { "preset", "ultrafast", 0, OPT_SW_ONLY }, * { "preset", "veryfast", 0, OPT_SW_ONLY }, * { "tune", "zerolatency", 0, OPT_SW_ONLY }, * @endcode * * Possible format options: * * @code * { "moov_size", "1000000", 0, OPT_ALL }, // bytes * { "movflags", "+frag_keyframe", 0, OPT_ALL }, * { "frag_duration", "1000000", 0, OPT_ALL }, // microseconds * { "frag_size", "100000", 0, OPT_ALL }, // bytes * { "min_frag_duration", "1000", 0, OPT_ALL }, // microseconds * { "movflags", "+empty_moov", 0, OPT_ALL }, * { "movflags", "+delay_moov", 0, OPT_ALL }, * { "movflags", "+separate_moof", 0, OPT_ALL }, * { "movflags", "+faststart", 0, OPT_ALL }, * { "movflags", "+rtphint", 0, OPT_ALL }, * { "movflags", "+disable_chpl", 0, OPT_ALL }, * { "movflags", "+omit_tfhd_offset", 0, OPT_ALL }, * { "movflags", "+default_base_moof", 0, OPT_ALL }, * { "write_tmcd", "on", 0, OPT_ALL }, // on, off or auto * { "movflags", "+negative_cts_offsets", 0, OPT_ALL }, * { "movflags", "+isml", 0, OPT_ALL }, * @endcode * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ // **************************************************************************************************************** // Profiles // **************************************************************************************************************** const FFmpeg_Profiles::PROFILE_LIST_VEC FFmpeg_Profiles::m_profile = { // **************************************************************************************************************** // MP4 Container // **************************************************************************************************************** { FILETYPE::MP4, PROFILE::DEFAULT, //! @brief No opimisations, just plain mp4. MP4 codec options. { // -profile:v high -level 3.1 - REQUIRED FOR PLAYBACK UNDER WIN7. (Partially or totally overwritten by profile!) { "profile", "high", 0, 0 }, { "level", "3.1", 0, 0 }, // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, //! @brief No optimisations, just plain mp4. MP4 format options. { { "movflags", "+faststart", 0, OPT_ALL }, { "frag_duration", "1000000", 0, OPT_ALL }, // microseconds { "movflags", "+empty_moov", 0, OPT_ALL }, } }, // ---------------------------------------------------------------------------------------------------------------- { FILETYPE::MP4, PROFILE::MP4_FF, //! @brief Firefox profile: MP4 codec options. //! Use: -movflags +empty_moov @n //! -frag_duration 1000000 (for audio files only) @n //! GOOD: Starts immediately while still decoding. { // -profile:v high -level 3.1 - REQUIRED FOR PLAYBACK UNDER WIN7 (Partially or totally overwritten by profile!) { "profile", "high", 0, 0 }, { "level", "3.1", 0, 0 }, // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, // // @brief Firefox profile: MP4 format options. // { { "frag_duration", "1000000", 0, OPT_AUDIO }, // microseconds { "movflags", "+empty_moov", 0, OPT_ALL }, } }, // ---------------------------------------------------------------------------------------------------------------- { FILETYPE::MP4, PROFILE::MP4_EDGE, //! //! @brief MS Edge profile: MP4 codec options. //! Use: -movflags +faststart+empty_moov+separate_moof -frag_duration 1000000 @n //! GOOD: Starts immediately while still decoding. //! { // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, //! //! @brief MS Edge profile: MP4 format options. //! { { "frag_duration", "1000000", 0, OPT_ALL }, // microseconds { "movflags", "+empty_moov", 0, OPT_ALL }, { "movflags", "+separate_moof", 0, OPT_ALL }, { "movflags", "+faststart", 0, OPT_ALL }, } }, // ---------------------------------------------------------------------------------------------------------------- { FILETYPE::MP4, PROFILE::MP4_IE, //! //! @brief MS Internet Explorer profile: MP4 codec options. //! //! Use: -movflags +faststart+empty_moov+separate_moof -frag_duration 1000000 @n //! NOT GOOD: Only starts after decode is complete. //! { // -profile:v high -level 3.1 - REQUIRED FOR PLAYBACK UNDER WIN7 (Partially or totally overwritten by profile!) { "profile", "high", 0, 0 }, { "level", "3.1", 0, 0 }, // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, //! //! @brief MS Internet Explorer profile: MP4 format options. //! { } }, // ---------------------------------------------------------------------------------------------------------------- { FILETYPE::MP4, PROFILE::MP4_CHROME, //! //! @brief Google Chrome profile: MP4 codec options. //! //! NOT GOOD: Only starts after decode is complete. //! { // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, //! //! @brief Google Chrome profile: MP4 format options. //! { }, }, // ---------------------------------------------------------------------------------------------------------------- { FILETYPE::MP4, PROFILE::MP4_SAFARI, //! //! @brief Apple Safari profile: MP4 codec options. //! Safari uses Quicktime for playback. Files must be suitable for playback with Quicktime. //! NOT GOOD: Only starts after decode is complete. Makes crazy things, stops, jumps, gaga. Comes from the inventors of MP4... //! { // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, //! //! @brief Apple Safari profile: MP4 format options. //! { } }, // ---------------------------------------------------------------------------------------------------------------- { FILETYPE::MP4, PROFILE::MP4_OPERA, //! //! @brief Opera profile: MP4 codec options. //! //! NOT GOOD: Only starts after decode is complete. //! { // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, //! //! @brief Opera profile: MP4 format options. //! { } }, // ---------------------------------------------------------------------------------------------------------------- { FILETYPE::MP4, PROFILE::MP4_MAXTHON, //! //! @brief Maxthon profile: MP4 codec options. //! //! NOT GOOD: Only starts after decode is complete. //! { // -profile:v high -level 3.1 (Partially or totally overwritten by profile!) { "profile", "high", 0, 0 }, { "level", "3.1", 0, 0 }, // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, //! //! @brief Maxthon profile: MP4 format options. //! { } }, // **************************************************************************************************************** // MOV container // **************************************************************************************************************** { FILETYPE::MOV, PROFILE::MOV_DEFAULT, //! //! @brief Basic MOV profile: MOV codec options. //! { // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, //! //! @brief Basic MOV profile: MOV format options. //! { { "movflags", "+delay_moov", 0, OPT_ALL }, } }, // **************************************************************************************************************** // ProRes/MOV container // **************************************************************************************************************** { FILETYPE::PRORES, PROFILE::PRORES_DEFAULT, //! //! @brief ProRes profile: ProRes/MOV codec options. //! { }, //! //! @brief ProRes profile: ProRes/MOV format options. //! { { "movflags", "+delay_moov", 0, OPT_ALL }, } }, // **************************************************************************************************************** // ProRes/ALAC container // **************************************************************************************************************** { FILETYPE::ALAC, PROFILE::ALAC_DEFAULT, //! //! @brief ALAC profile: ProRes/ALAC codec options. //! { }, //! //! @brief ALAC profile: ProRes/ALAC format options. //! { { "movflags", "+delay_moov", 0, OPT_ALL }, } }, // ---------------------------------------------------------------------------------------------------------------- { FILETYPE::ALAC, PROFILE::ALAC_ITUNES, //! //! @brief ALAC profile: ProRes/ALAC codec options. //! { }, //! //! @brief ALAC profile: ProRes/ALAC format options. //! { //-movflags E……. MOV muxer flags (default 0) // empty_moov E……. Make the initial moov atom empty (not supported by QuickTime) // separate_moof E……. Write separate moof/mdat atoms for each track // isml E……. Create a live smooth streaming feed (for pushing to a publishing point) // faststart E……. Run a second pass to put the index (moov atom) at the beginning of the file // omit_tfhd_offset E……. Omit the base data offset in tfhd atoms //-moov_size E……. maximum moov size so it can be placed at the begin (from 0 to INT_MAX) (default 0) //{ "movflags", "+empty_moov", 0, OPT_ALL }, //{ "movflags", "+delay_moov", 0, OPT_ALL }, //{ "movflags", "+separate_moof", 0, OPT_ALL }, //{ "movflags", "+faststart", 0, OPT_ALL }, // FEHLER: Unable to re-open .m4a output file for shifting data //{ "movflags", "+delay_moov", 0, OPT_ALL }, //{ "moov_size", "200000", 0, OPT_ALL }, // No options: iTunes plays the files, but only after they have been fully recoded. } }, // **************************************************************************************************************** // HLS/ts container // **************************************************************************************************************** { FILETYPE::HLS, PROFILE::HLS_DEFAULT, //! //! @brief HLS/ts codec options. //! { { "profile", "high", 0, 0 }, { "level", "3.1", 0, 0 }, // Set speed (changes profile!) { "preset", "ultrafast", 0, OPT_SW_ONLY }, }, //! //! @brief No optimisations, just plain ts. ts format options. //! { //{ "flags", "+cgop", 0, 0 }, { "movflags", "+faststart", 0, OPT_ALL }, { "frag_duration", "1000000", 0, OPT_ALL }, // microseconds { "movflags", "+empty_moov", 0, OPT_ALL }, } }, //! //! ******************************************************************************************************************* //! //! webm //! ==== //! //! https://trac.ffmpeg.org/wiki/Encode/VP9 //! //! Controlling Speed and Quality //! ============================= //! //! libvpx-vp9 has two main control knobs for speed and quality: //! //! Deadline / Quality //! //! -deadline can be set to realtime, good, or best. For legacy reasons, the option is also accessible with -quality in ffmpeg. //! //! good is the default and recommended for most applications. //! best is recommended if you have lots of time and want the best compression efficiency. //! realtime is recommended for live / fast encoding. //! //! CPU Utilization / Speed //! ======================= //! //! -cpu-used sets how efficient the compression will be. For legacy reasons, the option is also accessible with -speed in ffmpeg. //! //! When the deadline/quality parameter is good or best, values for -cpu-used can be set between 0 and 5. The default is 0. //! Using 1 or 2 will increase encoding speed at the expense of having some impact on quality and rate control accuracy. //! 4 or 5 will turn off rate distortion optimization, having even more of an impact on quality. //! //! When the deadline/quality is set to realtime, the encoder will try to hit a particular CPU utilization target, and encoding quality //! will depend on CPU speed and the complexity of the clip that you are encoding. See ​the vpx documentation for more info. In this case, //! the valid values for -cpu-used are between 0 and 15, where the CPU utilization target (in per cent) is calculated as //! (100*(16-cpu-used)/16)%. //! //! ******************************************************************************************************************* //! { FILETYPE::WEBM, PROFILE::WEBM_DEFAULT, //! //! @brief WebM codec options. //! { { "deadline", "realtime", 0, OPT_SW_ONLY }, { "cpu-used", "8", 0, OPT_SW_ONLY }, // ffmpeg -i -c:v libvpx-vp9 -pass 2 -b:v 1000K -threads 8 -speed 1 // -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 // -c:a libopus -b:a 64k -f webm out.webm // Most of the current VP9 decoders use tile-based, multi-threaded decoding. In order for the decoders to take advantage // of multiple cores, the encoder must set tile-columns and frame-parallel. // Setting auto-alt-ref and lag-in-frames >= 12 will turn on VP9's alt-ref frames, a VP9 feature that enhances quality. // speed 4 tells VP9 to encode really fast, sacrificing quality. Useful to speed up the first pass. // speed 1 is a good speed vs. quality compromise. Produces output quality typically very close to speed 0, but usually encodes much faster. // Multi-threaded encoding may be used if -threads > 1 and -tile-columns > 0. //{ "threads", "8", 0, OPT_SW_ONLY }, //{ "speed", "4", 0, OPT_SW_ONLY }, { "tile-columns", "6", 0, OPT_SW_ONLY }, { "frame-parallel", "1", 0, OPT_SW_ONLY }, { "auto-alt-ref", "1", 0, OPT_SW_ONLY }, { "lag-in-frames", "25", 0, OPT_SW_ONLY }, }, //! //! @brief WebM format options. //! { } } }; ffmpegfs-2.18/src/logging.h0000644000000000000000000004152115166175407012535 00000000000000/* * Copyright (C) 2017 Original author K. Henriksson @n * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file logging.h * @brief Provide various log facilities to stderr, disk or syslog * * @ingroup ffmpegfs * * @author K. Henriksson, Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017 Original author K. Henriksson @n * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef LOGGING_H #define LOGGING_H #pragma once #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include /** * @brief #Logging facility * * @anchor format Within the log message text, escape sequences are supported for dynamically formatting the message. * * Escape sequences have either the form %n or %\n, where the index n starts at 1. * * The index specifies the position of the argument in the list. They can appear in any given order. * An index can be used more than once, and not all indexes have to be present (in which case the * argument will not be printed). The input value is automatically converted to string format and * can be among std::string, char *, int, uint64_t and more. * * The format specifier is the same as used in printf and sprintf. * * @code * int channels = 2; * int sample_rate = 44100: * Logging::debug(filename, "Audio %1 channels %2 Hz", channels, sample_rate); * @endcode * * Prints "Audio 2 channels 44100 Hz". * * @code * int channels = 2; * double sample_rate = 44.1: * Logging::debug(filename, "Audio %1 %<.3f>2 KHz", channels == 2 ? "stereo" : "mono", sample_rate); * @endcode * * Prints "Audio stereo 44.100 KHz". */ class Logging { public: /** @brief Logging level types enum */ enum class LOGLEVEL { LOGERROR = 1, /**< @brief Error level */ LOGWARN = 2, /**< @brief Warning level */ LOGINFO = 3, /**< @brief Info level */ LOGDEBUG = 4, /**< @brief Debug level */ LOGTRACE = 5 /**< @brief Error level */ }; /** * Construct Logging object. * * @param[in] logfile - The name of a file to write logging output to. If empty, no output will be written. * @param[in] max_level - The maximum level of log output to write. * @param[in] to_stderr - Whether to write log output to stderr. * @param[in] to_syslog - Whether to write log output to syslog. */ explicit Logging(const std::string & logfile, LOGLEVEL max_level, bool to_stderr, bool to_syslog); /** * @brief Check whether either failbit or badbit is set. * @return Returns true if either (or both) the failbit or the badbit error state flags are set for the stream. */ bool GetFail() const; private: /** * @brief Logging helper class. */ class Logger : public std::ostringstream { public: /** * @brief Construct Logger object. * @param[in] loglevel - The maximum level of log output to write. * @param[in] filename - Name of file for which this log entry was written. May be empty. */ Logger(LOGLEVEL loglevel, const std::string & filename) : m_loglevel(loglevel), m_filename(filename) {} /** * @brief Construct Logger object */ explicit Logger() : m_loglevel(LOGLEVEL::LOGDEBUG) {} /** * @brief Destroy Logger object */ virtual ~Logger(); private: const LOGLEVEL m_loglevel; /**< @brief Log level required to write log entry */ const std::string m_filename; /**< @brief Name of file for which this log entry was written. May be empty. */ static const std::map m_syslog_level_map; /**< @brief Map our log levels to syslog levels */ static const std::map m_level_name_map; /**< @brief Map log level enums to strings */ static const std::map m_level_colour_map; /**< @brief Map log level enums to colours (logging to stderr only) */ }; public: /** * @brief Initialise the logging facility. * @param[in] logfile - The name of a file to write logging output to. If empty, no output will be written. * @param[in] max_level - The maximum level of log output to write. * @param[in] to_stderr - Whether to write log output to stderr. * @param[in] to_syslog - Whether to write log output to syslog. * @return On success, returns true. On error, returns false. * @note It will only fail if the file cannot be opened. Writing to stderr or syslog will never fail. errno is not set. */ static bool init_logging(const std::string & logfile, LOGLEVEL max_level, bool to_stderr, bool to_syslog); /** * @brief Write trace level log entry. * @param[in] filename - Name of the file for which this log entry was written. May be empty. * @param[in] format_string - Format a string in FFmpegfs logger format. * @param[in] args - 0 or more format arguments. See @ref format. */ template static void trace(const T filename, const std::string &format_string, Args &&...args) { LOGLEVEL loglevel = LOGLEVEL::LOGTRACE; if (!show(loglevel)) { return; } log_with_level(loglevel, filename, format_helper(format_string, 1, std::forward(args)...)); } /** * @brief Write debug level log entry. * @param[in] filename - Name of the file for which this log entry was written. May be empty. * @param[in] format_string - Format a string in FFmpegfs logger format. * @param[in] args - 0 or more format arguments. See @ref format. */ template static void debug(const T filename, const std::string &format_string, Args &&...args) { LOGLEVEL loglevel = LOGLEVEL::LOGDEBUG; if (!show(loglevel)) { return; } log_with_level(loglevel, filename, format_helper(format_string, 1, std::forward(args)...)); } /** * @brief Write info level log entry. * @param[in] filename - Name of the file for which this log entry was written. May be empty. * @param[in] format_string - Format a string in FFmpegfs logger format. * @param[in] args - 0 or more format arguments. See @ref format. */ template static void info(const T filename, const std::string &format_string, Args &&...args) { LOGLEVEL loglevel = LOGLEVEL::LOGINFO; if (!show(loglevel)) { return; } log_with_level(loglevel, filename, format_helper(format_string, 1, std::forward(args)...)); } /** * @brief Write warning level log entry. * @param[in] filename - Name of the file for which this log entry was written. May be empty. * @param[in] format_string - Format a string in FFmpegfs logger format. * @param[in] args - 0 or more format arguments. See @ref format. */ template static void warning(const T filename, const std::string &format_string, Args &&...args) { LOGLEVEL loglevel = LOGLEVEL::LOGWARN; if (!show(loglevel)) { return; } log_with_level(loglevel, filename, format_helper(format_string, 1, std::forward(args)...)); } /** * @brief Write error level log entry. * @param[in] filename - Name of the file for which this log entry was written. May be empty. * @param[in] format_string - Format a string in FFmpegfs logger format. * @param[in] args - 0 or more format arguments. See @ref format. */ template static void error(const T filename, const std::string &format_string, Args &&...args) { LOGLEVEL loglevel = LOGLEVEL::LOGERROR; if (!show(loglevel)) { return; } log_with_level(loglevel, filename, format_helper(format_string, 1, std::forward(args)...)); } /** * @brief Write log entry * @param[in] loglevel - The level of log this message is for. * @param[in] filename - Name of the file for which this log entry was written. May be nullptr. * @param[in] message - Message to log. */ static void log_with_level(LOGLEVEL loglevel, const char *filename, const std::string & message); /** * @brief Write log entry * @param[in] loglevel - The level of log this message is for. * @param[in] filename - Name of the file for which this log entry was written. May be empty. * @param[in] message - Message to log. */ static void log_with_level(LOGLEVEL loglevel, const std::string & filename, const std::string & message); /** * @brief Check if log entry should be displayed at the current log level. * @param[in] loglevel - Log level of log entry. * @return True, if entry should be be shown; false if not. */ static bool show(LOGLEVEL loglevel) { return (m_logging && loglevel <= m_logging->m_max_level); } private: /** * @brief Dummy: return orignal value unchanged * @param[in] val - Original value * @return Reference to original value. */ template static T & convert(T & val) { return val; } /** * @brief Convert const char* to std::string * @param[in] val - Original value as pointer to zero terminated const char * @return Value converted to std::string or (null) if original pointer is NULL. */ static std::string convert(const char * val) { if (val != nullptr) { return val; } else { return "(null)"; } } /** * @brief Convert char* to std::string * @param[in] val - Original value as pointer to zero terminated char * @return Value converted to std::string or (null) if original pointer is NULL. */ static std::string convert(char * val) { if (val != nullptr) { return val; } else { return "(null)"; } } // std::string cannot actually be passed to %s. That's how it works... /** * @brief Dummy: return orignal value unchanged if not type std::string * @param[in] val - Original value * @return Reference to original value. */ template::value, bool>::type = true> static T & fix_std_string(T & val) { return val; } /** * @brief Convert std::string to const char* * @param[in] val - Original value as constant reference to std::string * @return Value converted to const char *. */ static const char * fix_std_string(const std::string & val) { return val.c_str(); } /** * @brief Standard format_helper without parameters. * @param[in] string_to_update - Original string. * @param[in] index_to_replace - unused * @return Returns original string. */ static std::string format_helper( const std::string &string_to_update, const size_t __attribute__((unused)) index_to_replace); /** * @brief format_helper with variadic parameters. * * Calls itself recursively until all tokens are replaced. * * @param[in] string_to_search - format string to be searched. * @param[in] index_to_replace - index number (%n) to be replaced. May be present 0...x times. * @param[in] val - Replacement value to fill in tokens. * @param[in] args - Further arguments. * @return Contents of string_to_search with all tokens replaced. */ template static std::string format_helper( const std::string &string_to_search, const size_t index_to_replace, T &&val, Args &&...args) { // Match %# exactly (e.g. %12 and %123 literally) std::regex exp("%(<([^>]+)>)*" + std::to_string(index_to_replace) + "(?=[^0-9]|$)"); std::smatch res; std::string string_to_update(string_to_search); std::string::const_iterator searchStart(string_to_search.cbegin()); size_t offset = 0; while (std::regex_search(searchStart, string_to_search.cend(), res, exp)) { std::ostringstream ostr; if (res[2].length()) { // Found match with printf format in res[2] std::vector fmt; std::string ftmspec = res[2].str(); if (ftmspec.front() != '%') { fmt.push_back('%'); } fmt.insert(fmt.end(), ftmspec.begin(), ftmspec.end()); fmt.push_back('\0'); size_t size = static_cast(std::snprintf(nullptr, 0, fmt.data(), fix_std_string(val))) + 1; std::vector buffer; buffer.resize(size); std::snprintf(buffer.data(), size, fmt.data(), fix_std_string(val)); ostr << buffer.data(); } else { // No printf format, replace literally ostr << convert(val); } string_to_update.replace(static_cast(res.position()) + offset, static_cast(res[0].length()), ostr.str()); offset += static_cast(res.position()) + ostr.str().length(); searchStart = res.suffix().first; } return format_helper( string_to_update, index_to_replace + 1, std::forward(args)...); } /** * @brief format string with single token * * @param[in] format_string - Format string to be searched. * @param[in] args - arguments * @return Contents of format_string with all tokens replaced. */ template static std::string format(const std::string &format_string, Args &&...args) { return format_helper(format_string, 1, std::forward(args)...); } protected: /** * @brief Make logger class our friend for our constructor * @param[in] loglevel - The level of log this message is for. * @param[in] filename - Name of the file for which this log entry was written. May be empty. */ friend Logger Log(LOGLEVEL loglevel, const std::string & filename); friend Logger; /**< @brief Make logger class our friend */ static std::unique_ptr m_logging; /**< @brief Reference to self, Logging is a singleton */ static std::recursive_mutex m_mutex; /**< @brief Access mutex */ std::ofstream m_logfile; /**< @brief Log file object for writing to disk */ const LOGLEVEL m_max_level; /**< @brief The maximum level of log output to write. */ const bool m_to_stderr; /**< @brief Whether to write log output to stderr. */ const bool m_to_syslog; /**< @brief Whether to write log output to syslog. */ }; constexpr Logging::LOGLEVEL LOGERROR = Logging::LOGLEVEL::LOGERROR; /**< @brief Shorthand for log level ERROR */ constexpr Logging::LOGLEVEL LOGWARN = Logging::LOGLEVEL::LOGWARN; /**< @brief Shorthand for log level WARNING */ constexpr Logging::LOGLEVEL LOGINFO = Logging::LOGLEVEL::LOGINFO; /**< @brief Shorthand for log level INFO */ constexpr Logging::LOGLEVEL LOGDEBUG = Logging::LOGLEVEL::LOGDEBUG; /**< @brief Shorthand for log level DEBUG */ constexpr Logging::LOGLEVEL LOGTRACE = Logging::LOGLEVEL::LOGTRACE; /**< @brief Shorthand for log level TRACE */ #endif ffmpegfs-2.18/src/cache_maintenance.h0000644000000000000000000000410715166175407014513 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file cache_maintenance.h * @brief %Cache maintenance * * Creates a POSIX timer that starts the cache maintenance in preset * intervals. To ensure that only one instance of FFmpegfs cleans up * the cache a shared memory area and a named semaphore is also created. * * The first FFmpegfs process acts as master, all subsequently started * instances will be clients. If the master process goes away one of * the clients will automatically take over as master. * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef CACHE_MAINTENANCE_H #define CACHE_MAINTENANCE_H #pragma once #include /** * @brief Start cache maintenance timer. * @param[in] interval - Interval in seconds to run timer at. * @return On success, returns true. On error, returns false. Check errno for details. */ bool start_cache_maintenance(time_t interval); /** * @brief Stop cache maintenance timer. * @return On success, returns true. On error, returns false. Check errno for details. */ bool stop_cache_maintenance(); #endif // CACHE_MAINTENANCE_H ffmpegfs-2.18/src/cache.h0000644000000000000000000004067115166175407012157 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file cache.h * @brief Data cache management * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef CACHE_H #define CACHE_H #pragma once #include "buffer.h" #include #include #define DB_BASE_VERSION_MAJOR 1 /**< @brief The oldest database version major (Release < 1.95) */ #define DB_BASE_VERSION_MINOR 0 /**< @brief The oldest database version minor (Release < 1.95) */ #define DB_VERSION_MAJOR 1 /**< @brief Current database version major */ #define DB_VERSION_MINOR 97 /**< @brief Current database version minor */ #define DB_MIN_VERSION_MAJOR 1 /**< @brief Required database version major (required 1.95) */ #define DB_MIN_VERSION_MINOR 97 /**< @brief Required database version minor (required 1.95) */ typedef struct sqlite3 sqlite3; /**< @brief Forward declaration of sqlite3 handle */ typedef struct sqlite3_stmt sqlite3_stmt; /**< @brief Forward declaration of sqlite3 statement handle */ /** * @brief RESULTCODE of transcoding operation */ enum class RESULTCODE { NONE, /**< @brief No result code available */ FINISHED_INCOMPLETE, /**< @brief Transcode finished, but incomplete */ FINISHED_SUCCESS, /**< @brief Transcode finished successfully */ FINISHED_ERROR, /**< @brief Transcode finished with error */ }; typedef RESULTCODE const *LPCRESULTCODE; /**< @brief Pointer version of RESULTCODE */ typedef RESULTCODE *LPRESULTCODE; /**< @brief Pointer to const version of RESULTCODE */ /** * @brief Cache information block */ typedef struct CACHE_INFO { std::string m_origfile; /**< @brief Original filename before transcode */ std::string m_destfile; /**< @brief Destination filename after transcode */ std::array m_desttype; /**< @brief Destination type */ int64_t m_audiobitrate; /**< @brief Audio bitrate in bit/s */ int m_audiosamplerate; /**< @brief Audio sample rate in Hz */ int64_t m_videobitrate; /**< @brief Video bitrate in bit/s */ int m_videowidth; /**< @brief Video width */ int m_videoheight; /**< @brief Video height */ bool m_deinterlace; /**< @brief true if video was deinterlaced */ int64_t m_duration; /**< @brief File duration, in AV_TIME_BASE fractional seconds. */ size_t m_predicted_filesize; /**< @brief Predicted file size */ size_t m_encoded_filesize; /**< @brief Actual file size after encode */ uint32_t m_video_frame_count; /**< @brief Number of frames in video or 0 if not a video */ uint32_t m_segment_count; /**< @brief Number of segments for HLS */ RESULTCODE m_result; /**< @brief Result code: */ bool m_error; /**< @brief true if encode failed */ int m_errno; /**< @brief errno if encode failed */ int m_averror; /**< @brief FFmpeg error code if encode failed */ time_t m_creation_time; /**< @brief Source file creation time */ time_t m_access_time; /**< @brief Source file last access time */ time_t m_file_time; /**< @brief Source file file time */ size_t m_file_size; /**< @brief Source file file size */ unsigned int m_access_count; /**< @brief Read access counter */ } CACHE_INFO; typedef CACHE_INFO const *LPCCACHE_INFO; /**< @brief Pointer version of CACHE_INFO */ typedef CACHE_INFO *LPCACHE_INFO; /**< @brief Pointer to const version of CACHE_INFO */ class Cache_Entry; /** * @brief The #Cache class */ class Cache { typedef std::pair cache_key_t; /**< @brief Filenames and destination types */ typedef std::map cache_t; /**< @brief Map of cache entries */ public: /** * @brief Definition of sql table */ typedef struct { const char * name; /**< @brief Table name */ const char * primary_key; /**< @brief Primary key of table */ } TABLE_DEF; typedef TABLE_DEF const *LPCTABLE_DEF; /**< @brief Pointer version of TABLE_DEF */ typedef TABLE_DEF *LPTABLE_DEF; /**< @brief Pointer to const version of TABLE_DEF */ /** * @brief Column definition of sql table */ typedef struct { const char * name; /**< @brief Column name */ const char * type; /**< @brief Column type (INT, CHAR etc) */ } TABLE_COLUMNS; typedef TABLE_COLUMNS const *LPCTABLE_COLUMNS; /**< @brief Pointer version of TABLE_COLUMNS */ typedef TABLE_COLUMNS *LPTABLE_COLUMNS; /**< @brief Pointer to const version of TABLE_COLUMNS */ typedef std::vector TABLECOLUMNS_VEC; /**< @brief Table columns array */ typedef TABLECOLUMNS_VEC const *LPCTABLECOLUMNS_VEC; /**< @brief Pointer version of TABLECOLUMNS_VEC */ typedef TABLECOLUMNS_VEC *LPTABLECOLUMNS_VEC; /**< @brief Pointer to const version of TABLECOLUMNS_VEC */ friend class Cache_Entry; /** * @brief The sqlite_t class * Wrapper for sqlite3 struct to make use of std::shared_ptr */ class sqlite_t { public: /** * @brief Construct #sqlite_t object * @param[in] filename - Database filename (UTF-8) * @param[in] flags - Flags * @param[in] zVfs - Name of VFS module to use */ explicit sqlite_t(const std::string & filename, int flags, const char *zVfs = nullptr); /** * @brief Free #sqlite_t object */ virtual ~sqlite_t(); /** * @brief Return code of last Sqlite operation * @return Returns result code of last Sqlite operation */ int ret() const { return m_ret; }; #ifdef HAVE_SQLITE_CACHEFLUSH /** * @brief Flush cache index to disk. * @return Returns true on success; false on error. */ bool flush_index(); #endif // HAVE_SQLITE_CACHEFLUSH /** * @brief operator sqlite_t * * Default return operator. * @return Returns sqlite_t handle. May be nullptr if invalid. */ operator sqlite3*() { return m_db_handle; }; /** * @brief Get current database file name * @return Returns current database file name */ const std::string & filename() const { return m_filename; }; protected: int m_ret; /**< @brief Return code of last SQL operation */ std::string m_filename; /**< @brief Name of SQLite cache index database */ sqlite3* m_db_handle; /**< @brief SQLite handle of cache index database */ public: sqlite3_stmt * m_select_stmt; /**< @brief Prepared select statement */ sqlite3_stmt * m_insert_stmt; /**< @brief Prepared insert statement */ sqlite3_stmt * m_delete_stmt; /**< @brief Prepared delete statement */ }; public: /** * @brief Construct #Cache object. */ explicit Cache(); /** * @brief Destruct #Cache object. */ virtual ~Cache(); /** * @brief Open cache entry. * * Opens a cache entry and opens the cache file. * * @param[in] virtualfile - VIRTUALFILE struct of a file. * @return On success, returns pointer to a Cache_Entry. On error, returns nullptr. */ Cache_Entry * openio(LPVIRTUALFILE virtualfile); /** * @brief Close a cache entry. * * If the cache entry is in use will not be deleted. * * @param[in, out] cache_entry - Cache entry object to be closed. * @param[in] flags - One of the CACHE_CLOSE_* flags. * @return Returns true if the object was deleted; false if not. */ bool closeio(Cache_Entry **cache_entry, int flags = CACHE_CLOSE_NOOPT); /** * @brief Load cache index from disk. * @return Returns true on success; false on error. */ bool load_index(); /** * @brief Run disk maintenance. * * Can be done before a new file is added. Set predicted_filesize to make sure disk space * or cache size will be kept within limits. * * @param[in] predicted_filesize - Size of new file * @return Returns true on success; false on error. */ bool maintenance(size_t predicted_filesize = 0); /** * @brief Clear cache: deletes all entries. * @return Returns true on success; false on error. */ bool clear(); /** * @brief Prune expired cache entries. * @return Returns true on success; false on error. */ bool prune_expired(); /** * @brief Prune cache entries to keep cache size within limit. * @return Returns true on success; false on error. */ bool prune_cache_size(); /** * @brief Prune cache entries to ensure disk space. * @return Returns true on success; false on error. */ bool prune_disk_space(size_t predicted_filesize); /** * @brief Remove a cache file from disk. * @param[in] filename - Source file name. * @param[in] fileext - File extension of target file. * @return Returns true on success; false on error. */ bool remove_cachefile(const std::string & filename, const std::string &fileext); protected: /** * @brief Read cache file info. * @param[in] cache_info - Structure with cache info data. * @return Returns true on success; false on error. */ bool read_info(LPCACHE_INFO cache_info); /** * @brief Write cache file info. * @param[in] cache_info - Structure with cache info data. * @return Returns true on success; false on error. */ bool write_info(LPCCACHE_INFO cache_info); /** * @brief Delete cache file info. * @param[in] filename - Source file name. * @param[in] desttype - Destination type (MP4, WEBM etc.). * @return Returns true on success; false on error. */ bool delete_info(const std::string & filename, const std::string & desttype); /** * @brief Create cache entry object for a VIRTUALFILE. * @param[in] virtualfile - VIRTUALFILE struct of a file. * @param[in] desttype - Destination type (MP4, WEBM etc.). * @return On success, returns pointer to a Cache_Entry. On error, returns nullptr. */ Cache_Entry* create_entry(LPVIRTUALFILE virtualfile, const std::string & desttype); /** * @brief Delete cache entry object. * @param[in, out] cache_entry - Cache entry object to be closed. * @param[in] flags - One of the CACHE_CLOSE_* flags. * @return Returns true if the object was deleted; false if not. */ bool delete_entry(Cache_Entry **cache_entry, int flags); /** * @brief Close cache index. */ void close_index(); /** * @brief Get expanded SQL string for a statement. * @param[in] pStmt - SQLite statement handle. * @return Returns the SQL string bound to the statement handle. */ std::string expanded_sql(sqlite3_stmt *pStmt); /** * @brief Prepare all SQL statements * @return Returns true on success, false on error. */ bool prepare_stmts(); /** * @brief Check if SQL table exists in database. * @param[in] table - name of table * @return Returns true if table exists, false if not. */ bool table_exists(const char *table); /** * @brief Check if column exists in SQL table. * @param[in] table - name of table * @param[in] column - name of column * @return Returns true if table exists, false if not. */ bool column_exists(const char *table, const char *column); /** * @brief Check the db version if upgrade needed. * @param[out] db_version_major - Upon return, contains the major database version. * @param[out] db_version_minor - Upon return, contains the minor database version. * @return Returns true of version is OK, false if upgrade is needed. */ bool check_min_version(int *db_version_major, int *db_version_minor); /** * @brief Compare two versions. * @param[in] version_major_l - Left major version * @param[in] version_minor_l - Left minor version * @param[in] version_major_r - Right major version * @param[in] version_minor_r - Right minor version * @return Returns +1 if left version is larger then right, 0 if versions are the same, -1 if right version is larger than left. */ int cmp_version(int version_major_l, int version_minor_l, int version_major_r, int version_minor_r); /** * @brief Begin a database transactio.n * @return Returns true on success; false on error. */ bool begin_transaction(); /** * @brief End a database transaction. * @return Returns true on success; false on error. */ bool end_transaction(); /** * @brief Rollback a database transaction. * @return Returns true on success; false on error. */ bool rollback_transaction(); /** * @brief Create cache_entry table * @return Returns true on success; false on error. */ bool create_table_cache_entry(LPCTABLE_DEF table, const TABLECOLUMNS_VEC & columns); /* */ /** * @brief Upgrade database from version below 1.95 * @param[out] db_version_major - Upon return, contains the new major database version. * @param[out] db_version_minor - Upon return, contains the new minor database version. * @return Returns true on success; false on error. */ bool upgrade_db(int *db_version_major, int *db_version_minor); private: static const TABLE_DEF m_table_cache_entry; /**< @brief Definition and indexes of table "cache_entry" */ static const TABLECOLUMNS_VEC m_columns_cache_entry; /**< @brief Columns of table "cache_entry" */ static const TABLE_DEF m_table_version; /**< @brief Definition and indexes of table "version" */ static const TABLECOLUMNS_VEC m_columns_version; /**< @brief Columns of table "version" */ std::recursive_mutex m_mutex; /**< @brief Access mutex */ std::unique_ptr m_cacheidx_db; /**< @brief SQLite handle of cache index database */ cache_t m_cache; /**< @brief Cache file (memory mapped file) */ }; #endif ffmpegfs-2.18/src/wave.h0000644000000000000000000001274415166175407012056 00000000000000/* * Copyright (C) 2017-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file wave.h * @brief WAVE file structures * https://wavefilegem.com/how_wave_files_work.html * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef WAVE_H #define WAVE_H #pragma once #include #include #pragma pack(push, 1) /** * @brief WAVE header structure * * @note All numeric values are in big-endian format. */ typedef struct WAV_HEADER { /**@{*/ std::array m_riff_header; /**< @brief RIFF Header: Contains the letters "RIFF" in ASCII form (0x52494646 big-endian form). */ /** * Size of the wav portion of the file, which follows the first 8 bytes (File size - 8).@n * 36 + fmt_chunk_size, or more precisely:@n * 4 + (8 + fmt_chunk_size) + (8 + fmt_chunk_size) * This is the size of the rest of the chunk * following this number. This is the size of the * entire file in bytes minus 8 bytes for the * two fields not included in this count: * riff_header and wav_size. */ uint32_t m_wav_size; std::array m_wave_header; /**< @brief Contains the letters "WAVE" (0x57415645 big-endian form). */ /**@}*/ /**@{*/ std::array m_fmt_header; /**< @brief RIFF Format Header: Contains "fmt " including trailing space (0x666d7420 big-endian form). */ uint32_t m_fmt_chunk_size; /**< @brief Should be 16 for PCM This is the size of the rest of the chunk size which follows this number. */ uint16_t m_audio_format; /**< @brief Should be 1 for PCM. 3 for IEEE Float */ uint16_t m_num_channels; /**< @brief Number of channels 1...n (1: mono, 2: stereo/dual channel;...) */ uint32_t m_sample_rate; /**< @brief 8000, 44100, etc. */ uint32_t m_byte_rate; /**< @brief Number of bytes per second. sample_rate * num_channels * bit_depth / 8 */ uint16_t m_sample_alignment; /**< @brief num_channels * bit_depth / 8 */ uint16_t m_bit_depth; /**< @brief Number of bits per sample: 8 bits = 8, 16 bits = 16, etc. */ /**@}*/ } WAV_HEADER; static_assert(sizeof(WAV_HEADER) == 36); /** * @brief WAVE extended header structure * * @note All numeric values are in big-endian format. */ typedef struct WAV_HEADER_EX { uint16_t m_extension_size; /**< @brief Extension Size 2 16-bit unsigned integer (value 22) */ uint16_t m_valid_bits_per_sample; /**< @brief Valid Bits Per Sample 2 16-bit unsigned integer */ uint32_t m_channel_mask; /**< @brief Channel Mask 4 32-bit unsigned integer */ std::array m_sub_format_guid; /**< @brief Sub Format GUID 16 16-byte GUID */ } WAV_HEADER_EX; static_assert(sizeof(WAV_HEADER_EX) == 24); /** * @brief WAVE "fact" header structure * * @note All numeric values are in big-endian format. */ typedef struct WAV_FACT { std::array m_chunk_id; /**< @brief Chunk ID 4 0x66 0x61 0x63 0x74 (i.e. "fact") */ uint32_t m_body_size; /**< @brief Chunk Body Size 4 32-bit unsigned integer */ uint32_t m_number_of_sample_frames; /**< @brief Number of sample frames 4 32-bit unsigned integer */ } WAV_FACT; static_assert(sizeof(WAV_FACT) == 12); /** * @brief WAVE list header structure * * @note All numeric values are in big-endian format. */ typedef struct WAV_LIST_HEADER { std::array m_list_header; /**< @brief Contains "list" (0x6C696E74) */ uint32_t m_data_bytes; /**< @brief Number of bytes in list. */ std::array m_list_type; /**< @brief Contains "adtl" (0x6164746C) */ } WAV_LIST_HEADER; static_assert(sizeof(WAV_LIST_HEADER) == 12); /** @brief WAVE data header structure * * @note All numeric values are in big-endian format. */ typedef struct WAV_DATA_HEADER { std::array m_data_header; /**< @brief Contains "data" (0x64617461 big-endian form). */ uint32_t m_data_bytes; /**< @brief Number of bytes in data. Number of samples * num_channels * bit_depth / 8 */ // Remainder of wave file: actual sound data // uint8_t m_bytes[]; } WAV_DATA_HEADER; static_assert(sizeof(WAV_DATA_HEADER) == 8); #pragma pack(pop) #endif // WAVE_H ffmpegfs-2.18/src/vcdparser.cc0000644000000000000000000001567315166175407013247 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ #ifdef USE_LIBVCD /** * @file vcdparser.cc * @brief Video/Super Video CD parser implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "ffmpegfs.h" #include "vcdparser.h" #include "logging.h" #include "vcd/vcdentries.h" extern "C" { #include } static int parse_vcd(const std::string & path, const struct stat * statbuf, void * buf, fuse_fill_dir_t filler); static bool create_vcd_virtualfile(const VcdEntries &vcd, const struct stat * statbuf, void * buf, fuse_fill_dir_t filler, bool full_title, int chapter_no); /** * @brief Create a virtual file for a video CD. * @param[in] vcd - Video CD handle. * @param[in] statbuf - File status structure of original file. * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @param[in] full_title - If true, create virtual file of all title. If false, include single chapter only. * @param[in] chapter_no - Chapter number of virtual file. * @return Returns true if successful. Returns false on error. */ static bool create_vcd_virtualfile(const VcdEntries & vcd, const struct stat * statbuf, void * buf, fuse_fill_dir_t filler, bool full_title, int chapter_no) { const VcdChapter * chapter1 = vcd.get_chapter(chapter_no); std::string title_buf; size_t size; int64_t duration; if (!full_title) { size = static_cast(chapter1->get_size()); duration = chapter1->get_duration(); strsprintf(&title_buf, "%02d. Chapter %03d [%s].%s", chapter1->get_track_no(), chapter_no + 1, replace_all(format_duration(duration), ":", "-").c_str(), ffmpeg_format[FORMAT::VIDEO].fileext().c_str()); // can safely assume this a video } else { size = static_cast(vcd.get_size()); duration = vcd.get_duration(); strsprintf(&title_buf, "%02d. Title [%s].%s", chapter1->get_track_no(), replace_all(format_duration(duration), ":", "-").c_str(), ffmpeg_format[FORMAT::VIDEO].fileext().c_str()); // can safely assume this a video } LPVIRTUALFILE virtualfile = nullptr; if (!ffmpeg_format[FORMAT::VIDEO].is_multiformat()) { virtualfile = insert_file(VIRTUALTYPE::VCD, vcd.get_disk_path() + title_buf, statbuf); } else { virtualfile = insert_dir(VIRTUALTYPE::VCD, vcd.get_disk_path() + title_buf, statbuf); } if (virtualfile == nullptr) { Logging::error(vcd.get_disk_path(), "Failed to create virtual path: %1", (vcd.get_disk_path() + title_buf).c_str()); errno = EIO; return false; } if (add_fuse_entry(buf, filler, title_buf, &virtualfile->m_st, 0)) { // break; } // Video CD is video format anyway virtualfile->m_format_idx = 0; // Mark title/chapter/angle virtualfile->m_full_title = full_title; virtualfile->m_vcd.m_track_no = chapter1->get_track_no(); virtualfile->m_vcd.m_chapter_no = chapter_no; virtualfile->m_vcd.m_start_pos = chapter1->get_start_pos(); if (!full_title) { virtualfile->m_vcd.m_end_pos = chapter1->get_end_pos(); } else { virtualfile->m_vcd.m_end_pos = size; } virtualfile->m_duration = duration; AVRational framerate = av_make_q(25000, 1000); //*** @todo check disk which framerate is correct, can be 25 or 29.996 fps! virtualfile->m_video_frame_count = static_cast(av_rescale_q(duration, av_get_time_base_q(), av_inv_q(framerate))); virtualfile->m_predicted_size = size; return true; } /** * @brief Parse VCD directory and get all VCD chapters as virtual files. * @param[in] path - Path to check. * @param[in] statbuf - File status structure of original file. * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @return On success, returns number of chapters found. On error, returns -errno. */ static int parse_vcd(const std::string & path, const struct stat * statbuf, void * buf, fuse_fill_dir_t filler) { VcdEntries vcd; bool success = true; vcd.load_file(path); Logging::debug(path, "Parsing the Video CD."); for (int chapter_no = 0; chapter_no < vcd.get_number_of_chapters() && success; chapter_no++) { success = create_vcd_virtualfile(vcd, statbuf, buf, filler, false, chapter_no); } if (success && vcd.get_number_of_chapters() > 1) { success = create_vcd_virtualfile(vcd, statbuf, buf, filler, true, 0); } if (success) { return vcd.get_number_of_chapters(); } else { return -errno; } } int check_vcd(const std::string & path, void *buf, fuse_fill_dir_t filler) { std::string _path(path); struct stat stbuf; int res = 0; append_sep(&_path); if (stat((_path + "SVCD/INFO.SVD").c_str(), &stbuf) == 0) { if (!check_path(_path)) { Logging::trace(_path, "SVCD detected."); res = parse_vcd(_path, &stbuf, buf, filler); Logging::trace(nullptr, "%1 titles were discovered.", res); } else { res = load_path(_path, &stbuf, buf, filler); } add_dotdot(buf, filler, &stbuf, 0); } else if (stat((_path + "VCD/INFO.VCD").c_str(), &stbuf) == 0) { if (!check_path(_path)) { Logging::trace(_path, "VCD detected."); res = parse_vcd(_path, &stbuf, buf, filler); Logging::trace(nullptr, "%1 titles were discovered.", res); } else { res = load_path(_path, &stbuf, buf, filler); } add_dotdot(buf, filler, &stbuf, 0); } return res; } #endif // USE_LIBVCD ffmpegfs-2.18/src/ffmpeg_frame.cc0000644000000000000000000000730015166175407013660 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file ffmpeg_frame.cc * @brief FFmpeg_Frame class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifdef __cplusplus extern "C" { #endif // Disable annoying warnings outside our code #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #include #pragma GCC diagnostic pop #ifdef __cplusplus } #endif #include "ffmpeg_utils.h" #include "ffmpeg_frame.h" FFmpeg_Frame::FFmpeg_Frame(int stream_index) : m_frame(av_frame_alloc()), m_res(0), m_stream_idx(stream_index) { m_res = (m_frame != nullptr) ? 0 : AVERROR(ENOMEM); } FFmpeg_Frame::FFmpeg_Frame(const FFmpeg_Frame& frame) : m_frame(nullptr), m_res(0), m_stream_idx(frame.m_stream_idx) { if (frame.m_frame != nullptr) { m_frame = av_frame_clone(frame.m_frame); m_res = (m_frame != nullptr) ? 0 : AVERROR(ENOMEM); } else { m_res = AVERROR(EINVAL); } } FFmpeg_Frame::FFmpeg_Frame(const AVFrame * frame) : m_frame(nullptr), m_res(0), m_stream_idx(INVALID_STREAM) { if (frame != nullptr) { m_frame = av_frame_clone(frame); m_res = (m_frame != nullptr) ? 0 : AVERROR(ENOMEM); } else { m_res = AVERROR(EINVAL); } } FFmpeg_Frame::~FFmpeg_Frame() { free(); } AVFrame* FFmpeg_Frame::clone() { return av_frame_clone(m_frame); } void FFmpeg_Frame::unref() { if (m_frame != nullptr) { av_frame_unref(m_frame); } } void FFmpeg_Frame::free() { if (m_frame != nullptr) { av_frame_free(&m_frame); m_frame = nullptr; } } int FFmpeg_Frame::res() const { return m_res; } AVFrame* FFmpeg_Frame::get() { return m_frame; } FFmpeg_Frame::operator AVFrame*() { return m_frame; } FFmpeg_Frame::operator const AVFrame*() const { return m_frame; } AVFrame* FFmpeg_Frame::operator->() { return m_frame; } FFmpeg_Frame& FFmpeg_Frame::operator=(const FFmpeg_Frame & frame) noexcept { // Do self assignment check if (this != &frame && m_frame != frame.m_frame) { AVFrame *new_frame = av_frame_clone(frame.m_frame); free(); m_frame = new_frame; m_stream_idx = frame.m_stream_idx; m_res = (m_frame != nullptr) ? 0 : AVERROR(ENOMEM); } return *this; } FFmpeg_Frame& FFmpeg_Frame::operator=(const AVFrame * frame) noexcept { if (m_frame != frame) { AVFrame *new_frame = av_frame_clone(frame); free(); m_frame = new_frame; m_stream_idx = INVALID_STREAM; m_res = (m_frame != nullptr) ? 0 : AVERROR(ENOMEM); } return *this; } ffmpegfs-2.18/src/blurayparser.h0000644000000000000000000000373515166175407013627 00000000000000/* * Copyright (C) 2018-2026 by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file blurayparser.h * @brief Blu-ray parser * * This is only available if built with -DUSE_LIBBLURAY parameter. * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2018-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef BLURAYPARSER_H #define BLURAYPARSER_H #pragma once #ifdef USE_LIBBLURAY #include /** * @brief Get number of titles on Blu-ray. * @param[in] path - Path to check * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @note buf and filler can be nullptr. In that case, the call will run faster, so these parameters should only be passed if they are to be filled in. * @return -errno or number of titles on Blu-ray. */ int check_bluray(const std::string & path, void *buf = nullptr, fuse_fill_dir_t filler = nullptr); #endif // USE_LIBBLURAY #endif // BLURAYPARSER_H ffmpegfs-2.18/src/fuseops.cc0000644000000000000000000024217515166175407012741 00000000000000/* * Copyright (C) 2006-2008 David Collett * Copyright (C) 2008-2012 K. Henriksson * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file fuseops.cc * @brief Fuse operations implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2006-2008 David Collett @n * Copyright (C) 2008-2013 K. Henriksson @n * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) */ #include "transcode.h" #include "cache_maintenance.h" #include "logging.h" #ifdef USE_LIBVCD #include "vcdparser.h" #endif // USE_LIBVCD #ifdef USE_LIBDVD #include "dvdparser.h" #endif // USE_LIBDVD #ifdef USE_LIBBLURAY #include "blurayparser.h" #endif // USE_LIBBLURAY #include "cuesheetparser.h" #include "thread_pool.h" #include "buffer.h" #include "cache_entry.h" #include #include #include #include typedef std::map FILENAME_MAP; /**< @brief Map virtual file names to virtual file objects. */ typedef std::map RFILENAME_MAP; /**< @brief Map source file names to virtual file objects. */ static void init_stat(struct stat *stbuf, size_t fsize, time_t ftime, bool directory); static LPVIRTUALFILE make_file(void *buf, fuse_fill_dir_t filler, VIRTUALTYPE type, const std::string & origpath, const std::string & filename, size_t fsize, time_t ftime = time(nullptr), int flags = VIRTUALFLAG_NONE); static void prepare_script(); static bool is_passthrough(const std::string & ext); static bool virtual_name(std::string *virtualpath, const std::string &origpath = "", const FFmpegfs_Format **current_format = nullptr); static FILENAME_MAP::const_iterator find_prefix(const FILENAME_MAP & map, const std::string & search_for); static void stat_to_dir(struct stat *stbuf); static void flags_to_dir(int *flags); static void insert(const VIRTUALFILE & virtualfile); static int get_source_properties(const std::string & origpath, LPVIRTUALFILE virtualfile); static int make_hls_fileset(void * buf, fuse_fill_dir_t filler, const std::string & origpath, LPVIRTUALFILE virtualfile); static int kick_next(LPVIRTUALFILE virtualfile); static void sighandler(int signum); static std::string get_number(const char *path, uint32_t *value); static size_t guess_format_idx(const std::string & filepath); static int parse_file(LPVIRTUALFILE newvirtualfile); static const FFmpegfs_Format * get_format(LPVIRTUALFILE newvirtualfile); static int selector(const struct dirent * de); static int scandir(const char *dirp, std::vector * _namelist, int (*selector) (const struct dirent *), int (*cmp) (const struct dirent **, const struct dirent **)); static int ffmpegfs_readlink(const char *path, char *buf, size_t size); static int ffmpegfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi, enum fuse_readdir_flags); static int ffmpegfs_getattr(const char *path, struct stat *stbuf, fuse_file_info *fi); //static int ffmpegfs_fgetattr(const char *path, struct stat * stbuf, struct fuse_file_info *fi); static int ffmpegfs_open(const char *path, struct fuse_file_info *fi); static int ffmpegfs_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi); static int ffmpegfs_statfs(const char *path, struct statvfs *stbuf); static int ffmpegfs_release(const char *path, struct fuse_file_info *fi); static void * ffmpegfs_init(struct fuse_conn_info *conn, fuse_config *cfg); static void ffmpegfs_destroy(__attribute__((unused)) void * p); static FILENAME_MAP filenames; /**< @brief Map files to virtual files */ static RFILENAME_MAP rfilenames; /**< @brief Reverse map virtual files to real files */ static std::vector script_file; /**< @brief Buffer for the virtual script if enabled */ static struct sigaction oldHandler; /**< @brief Saves old SIGINT handler to restore on shutdown */ bool docker_client; /**< @brief True if running inside a Docker container */ fuse_operations ffmpegfs_ops; /**< @brief FUSE file system operations */ std::unique_ptr tp; /**< @brief Thread pool object */ /** * @brief Check if a file should be treated passthrough, i.e. bitmaps etc. * @param[in] ext - Extension of file to check * @return Returns true if file is passthrough, false if not */ static bool is_passthrough(const std::string & ext) { /** * * List of passthrough file extensions */ static const std::set passthrough_set = { "AA", "ACR", // Dicom/ACR/IMA file format for medical images "AI", // PostScript Formats (Ghostscript required) "ANI", // Animated Cursor "ARW", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "AWD", // Artweaver format "B3D", // BodyPaint 3D format "BMP", // Windows Bitmap "CAM", // Casio digital camera format (JPG version only) "CEL", "CGM", // CAD Formats (Shareware PlugIns) "CIN", // Digital Picture Exchange/Cineon Format "CLP", // Windows Clipboard "CPT", // CorelDraw Photopaint format (CPT version 6 only) "CR2", // Canon RAW format "CRW", // Canon RAW format "CUR", // Animated Cursor "DCM", // Dicom/ACR/IMA file format for medical images "DCR", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "DCX", // Multipage PCX format "DDS", // Direct Draw Surface format "DIB", // Windows Bitmap "DJVU", // DjVu File Format "DNG", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "DPX", // Digital Picture Exchange/Cineon Format "DWG", // CAD Formats (Shareware PlugIns) "DXF", // Drawing Interchange Format, CAD format "ECW", // Enhanced Compressed Wavelet "EEF", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "EMF", // Enhanced Metafile Format "EPS", // PostScript Formats (Ghostscript required) "EXR", // EXR format "FITS", // Flexible Image Transport System "FLI", "FLIF", // Free Lossless Image format "FPX", // FlashPix format "G3", // Group 3 Facsimile Apparatus format "GIF", // Graphics Interchange Format "HDP", // JPEG-XR/Microsoft HD Photo format "HDR", // High Dynamic Range format "HEIC", // High Efficiency Image format "HPGL", // CAD Formats (Shareware PlugIns) "HRZ", "ICL", // Icon Library formats "ICO", // Windows Icon "ICS", // Image Cytometry Standard format "IFF", // Interchange File Format "IMA", // Dicom/ACR/IMA file format for medical images "IMG", // GEM Raster format "IW44", // DjVu File Format "J2K", // JPEG 2000 format "JLS", // JPEG-LS, JPEG Lossless "JNG", // Multiple Network Graphics "JP2", // JPEG 2000 format "JPC", // JPEG 2000 format "JPEG", // Joint Photographic Experts Group "JPG", // Joint Photographic Experts Group "JPM", // JPEG2000/Part6, LuraDocument.jpm "JXR", // JPEG-XR/Microsoft HD Photo format "KDC", // Kodak digital camera format "LBM", // Interchange File Format "M3U8", // Apple HTTP Live Streaming "MIFF", "MNG", // Multiple Network Graphics "MRC", // MRC format "MrSID", // LizardTech's SID Wavelet format "MRW", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "NEF", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "NRW", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "ORF", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "PBM", // Portable Bitmap format "PCD", // Kodak Photo CD "PCX", // PC Paintbrush format from ZSoft Corporation "PDF", // PostScript Formats (Ghostscript required) "PDF", // Portable Document format "PDN", // Paint.NET file format "PEF", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "PGM", // Portable Greymap format "PICT", // Macintosh PICT format "PIX", "PNG", // Portable Network Graphics "PNM", "PPM", // Portable Pixelmap format "PS", // PostScript Formats (Ghostscript required) "PSD", // Adobe PhotoShop format "PSP", // Paint Shop Pro format "PVR", // DreamCast Texture format "QTIF", // Macintosh PICT format "RAF", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "RAS", // Sun Raster format "RAW", // Raw (binary) data "RGB", // Silicon Graphics format "RLE", // Utah RLE format "RW2", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "SFF", // Structured Fax File "SFW", // Seattle Film Works format "SGI", // Silicon Graphics format "SID", // LizardTech's SID Wavelet format "SIF", // SIF format "SRF", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "SUN", // Sun Raster format "Sunras", "SVG", // CAD Formats (Shareware PlugIns) "TGA", // Truevision Advanced Raster Graphics Adapter (TARGA) "TIF", // Tagged Image File Format "TIFF", "TTF", // True Type Font "TXT", // Text (ASCII) File (as image) "VTF", // Valve Texture format "WAD", // WAD3 Game format "WAL", // Quake 2 textures "WBC", // Webshots formats "WBZ", // Webshots formats "WBMP", // WAP Bitmap format "WDP", // JPEG-XR/Microsoft HD Photo format "WebP", // Weppy file format "WMF", // Windows Metafile Format "WSQ", // Wavelet Scaler Quantization format "X", "X3F", // Digital camera RAW formats (Adobe, Epson, Nikon, Minolta, Olympus, Fuji, Kodak, Sony, Pentax, Sigma) "XBM", // X11 Bitmap "XCF", // GIMP file format "XPM", "XWD", "YUV" // Raw (binary) data }; return (passthrough_set.find(ext) != passthrough_set.cend()); } void init_fuse_ops() { std::memset(&ffmpegfs_ops, 0, sizeof(fuse_operations)); ffmpegfs_ops.getattr = ffmpegfs_getattr; // ffmpegfs_ops.fgetattr = ffmpegfs_fgetattr; ffmpegfs_ops.readlink = ffmpegfs_readlink; ffmpegfs_ops.readdir = ffmpegfs_readdir; ffmpegfs_ops.open = ffmpegfs_open; ffmpegfs_ops.read = ffmpegfs_read; ffmpegfs_ops.statfs = ffmpegfs_statfs; ffmpegfs_ops.release = ffmpegfs_release; ffmpegfs_ops.init = ffmpegfs_init; ffmpegfs_ops.destroy = ffmpegfs_destroy; } /** * @brief Read the target of a symbolic link. * @param[in] path * @param[in] buf - FUSE buffer to fill. * @param[in] size * @return On success, returns 0. On error, returns -errno. */ static int ffmpegfs_readlink(const char *path, char *buf, size_t size) { std::string origpath; std::string transcoded; ssize_t len; Logging::trace(path, "readlink"); append_basepath(&origpath, path); find_original(&origpath); len = readlink(origpath.c_str(), buf, size - 2); if (len != -1) { buf[len] = '\0'; transcoded = buf; virtual_name(&transcoded, origpath); buf[0] = '\0'; strncat(buf, transcoded.c_str(), size); errno = 0; // Just to make sure - reset any error } return -errno; } /** * @brief Read directory * @param[in] path - Physical path to load. * @param[in] buf - FUSE buffer to fill. * @param[in] filler - Filler function. * @return On success, returns 0. On error, returns -errno. */ static int ffmpegfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t /*offset*/, struct fuse_file_info * /*fi*/, enum fuse_readdir_flags) { std::string origpath; Logging::trace(path, "readdir"); append_basepath(&origpath, path); append_sep(&origpath); // Add a virtual script if enabled if (params.m_enablescript) { LPVIRTUALFILE virtualfile = make_file(buf, filler, VIRTUALTYPE::SCRIPT, origpath, params.m_scriptfile, script_file.size()); virtualfile->m_file_contents = script_file; } LPVIRTUALFILE virtualfile = find_original(origpath); if (virtualfile == nullptr) { #if defined(USE_LIBBLURAY) || defined(USE_LIBDVD) || defined(USE_LIBVCD) int res; #endif #ifdef USE_LIBVCD res = check_vcd(origpath, buf, filler); if (res != 0) { // Found VCD or error reading VCD return (res >= 0 ? 0 : res); } #endif // USE_LIBVCD #ifdef USE_LIBDVD res = check_dvd(origpath, buf, filler); if (res != 0) { // Found DVD or error reading DVD return (res >= 0 ? 0 : res); } #endif // USE_LIBDVD #ifdef USE_LIBBLURAY res = check_bluray(origpath, buf, filler); if (res != 0) { // Found Blu-ray or error reading Blu-ray return (res >= 0 ? 0 : res); } #endif // USE_LIBBLURAY } if (virtualfile == nullptr || !(virtualfile->m_flags & VIRTUALFLAG_FILESET)) { DIR *dp = opendir(origpath.c_str()); if (dp != nullptr) { try { std::map files; // Read directory contents for (struct dirent *de = readdir(dp); de != nullptr; de = readdir(dp)) { struct stat stbuf; if (lstat((origpath + de->d_name).c_str(), &stbuf) == -1) { // Should actually not happen, file listed by readdir, so it should exist throw ENOENT; } files.insert({ de->d_name, stbuf }); } // Process files for (auto& [key, value] : files) { std::string origname(key); if (is_blocked(origname)) { continue; } std::string origfile; std::string filename(key); struct stat & stbuf = value; int flags = 0; origfile = origpath + origname; std::string origext; find_ext(&origext, filename); if (S_ISREG(stbuf.st_mode) || S_ISLNK(stbuf.st_mode)) { const FFmpegfs_Format *current_format = nullptr; // Check if file can be transcoded if (virtual_name(&filename, origpath, ¤t_format)) { if (current_format->video_codec() == AV_CODEC_ID_NONE) { LPVIRTUALFILE newvirtualfile = find_file_from_orig(origfile); if (newvirtualfile == nullptr) { // Should never happen, we've just created this entry in virtual_name... Logging::error(origfile, "INTERNAL ERROR: ffmpegfs_readdir()! newvirtualfile is NULL."); throw EINVAL; } // If target supports no video, we need to do some extra work and checkF // the input file to actually have an audio stream. If not, hide the file, // makes no sense to transcode anyway. if (!newvirtualfile->m_has_audio) { Logging::debug(origfile, "Unable to transcode. The source has no audio stream, but the target just supports audio."); flags |= VIRTUALFLAG_HIDDEN; } } if (!(flags & VIRTUALFLAG_HIDDEN)) { if (check_cuesheet(origfile, buf, filler) < 0) { throw EINVAL; } } std::string newext; find_ext(&newext, filename); if (!current_format->is_multiformat()) { if (origext != newext || params.m_recodesame == RECODESAME::YES) { insert_file(VIRTUALTYPE::DISK, origpath + filename, origfile, &stbuf, flags); } else { insert_file(VIRTUALTYPE::DISK, origpath + filename, origfile, &stbuf, flags | VIRTUALFLAG_PASSTHROUGH); } } else { // Change file to directory for the frame set stat_to_dir(&stbuf); flags_to_dir(&flags); filename = origname; // Restore original name insert_file(VIRTUALTYPE::DISK, origfile, &stbuf, flags); } } } if (!(flags & VIRTUALFLAG_HIDDEN)) { if (add_fuse_entry(buf, filler, filename, &stbuf, 0)) { break; } } } closedir(dp); errno = 0; // Just to make sure - reset any error } catch (int _errno) { closedir(dp); errno = _errno; } } } else { try { if (virtualfile->m_flags & (VIRTUALFLAG_FILESET | VIRTUALFLAG_FRAME | VIRTUALFLAG_HLS | VIRTUALFLAG_DIRECTORY)) { add_dotdot(buf, filler, &virtualfile->m_st, 0); } const FFmpegfs_Format *ffmpegfs_format = params.current_format(virtualfile); if (ffmpegfs_format->is_frameset()) { // Generate set of all frames if (!virtualfile->m_video_frame_count) { int res = get_source_properties(origpath, virtualfile); if (res < 0) { throw EINVAL; } } //Logging::debug(origpath, "readdir: Creating frame set of %1 frames. %2", virtualfile->m_video_frame_count, virtualfile->m_origfile); for (uint32_t frame_no = 1; frame_no <= virtualfile->m_video_frame_count; frame_no++) { make_file(buf, filler, virtualfile->m_type, origpath, make_filename(frame_no, params.current_format(virtualfile)->fileext()), virtualfile->m_predicted_size, virtualfile->m_st.st_ctime, VIRTUALFLAG_FRAME); /**< @todo Calculate correct file size for frame image in set */ } } else if (ffmpegfs_format->is_hls()) { int res = make_hls_fileset(buf, filler, origpath, virtualfile); if (res < 0) { throw EINVAL; } } else if (/*virtualfile != nullptr && */virtualfile->m_flags & VIRTUALFLAG_CUESHEET) { // Fill in list for cue sheet load_path(origpath, nullptr, buf, filler); } errno = 0; // Just to make sure - reset any error } catch (int _errno) { errno = _errno; } } return -errno; } /** * @brief Get file attributes. * @param[in] path - Path of virtual file. * @param[in] stbuf - Buffer to store information. * @return On success, returns 0. On error, returns -errno. */ static int ffmpegfs_getattr(const char *path, struct stat *stbuf, struct fuse_file_info * /*fi*/) { Logging::trace(path, "getattr"); if (is_blocked(path)) { errno = ENOENT; return -errno; } std::string origpath; append_basepath(&origpath, path); LPVIRTUALFILE virtualfile = find_original(&origpath); VIRTUALTYPE type = (virtualfile != nullptr) ? virtualfile->m_type : VIRTUALTYPE::DISK; int flags = (virtualfile != nullptr) ? virtualfile->m_flags : VIRTUALFLAG_NONE; if (virtualfile != nullptr && (virtualfile->m_flags & VIRTUALFLAG_HIDDEN)) { errno = ENOENT; return -errno; } if (virtualfile == nullptr && lstat(origpath.c_str(), stbuf) == 0) { // File was not yet created as virtual file, but physically exists const FFmpegfs_Format *current_format = nullptr; std::string filename(origpath); if (S_ISREG(stbuf->st_mode) && virtual_name(&filename, "", ¤t_format)) { if (!current_format->is_multiformat()) { // Regular files Logging::trace(origpath, "getattr: Existing file."); errno = 0; return 0; } else { Logging::trace(origpath, "getattr: Creating frame set directory of file."); flags |= VIRTUALFLAG_FILESET; if (current_format->is_frameset()) { flags |= VIRTUALFLAG_FRAME; } else if (current_format->is_hls()) { flags |= VIRTUALFLAG_HLS; } } } else { // Pass-through for regular files Logging::trace(origpath, "getattr: Treating existing file/directory as passthrough."); errno = 0; return 0; } } else if ((flags & VIRTUALFLAG_PASSTHROUGH) && lstat(origpath.c_str(), stbuf) == 0) { // File physically exists and is marked as passthrough Logging::debug(origpath, "getattr: File not recoded because --recodesame=NO."); errno = 0; return 0; } else { // Not really an error. errno = 0; } // This is a virtual file bool no_check = false; switch (type) { case VIRTUALTYPE::SCRIPT: { // Use stored status mempcpy(stbuf, &virtualfile->m_st, sizeof(struct stat)); errno = 0; break; } #ifdef USE_LIBVCD case VIRTUALTYPE::VCD: #endif // USE_LIBVCD #ifdef USE_LIBDVD case VIRTUALTYPE::DVD: #endif // USE_LIBDVD #ifdef USE_LIBBLURAY case VIRTUALTYPE::BLURAY: #endif // USE_LIBBLURAY { // Use stored status mempcpy(stbuf, &virtualfile->m_st, sizeof(struct stat)); no_check = true; // FILETYPE already known, no need to check again. FALLTHROUGH_INTENDED; } case VIRTUALTYPE::DISK: { if (virtualfile != nullptr && (flags & (VIRTUALFLAG_FRAME | VIRTUALFLAG_HLS | VIRTUALFLAG_DIRECTORY | VIRTUALFLAG_CUESHEET))) { mempcpy(stbuf, &virtualfile->m_st, sizeof(struct stat)); errno = 0; // Just to make sure - reset any error break; } if (virtualfile == nullptr || !(virtualfile->m_flags & VIRTUALFLAG_FILESET)) { if (!no_check && lstat(origpath.c_str(), stbuf) == -1) { // If file does not exist here we can assume it's some sort of virtual file: Regular, DVD, S/VCD, cue sheet track int error = -errno; virtualfile = find_original(&origpath); if (virtualfile == nullptr) { std::string pathonly(origpath); int res = 0; remove_filename(&pathonly); #ifdef USE_LIBVCD //if (res <= 0) Not necessary here, will always be true { // Returns -errno or number or titles on VCD res = check_vcd(pathonly); } #endif // USE_LIBVCD #ifdef USE_LIBDVD if (res <= 0) { // Returns -errno or number or titles on DVD res = check_dvd(pathonly); } #endif // USE_LIBDVD #ifdef USE_LIBBLURAY if (res <= 0) { // Returns -errno or number or titles on Blu-ray res = check_bluray(pathonly); } #endif // USE_LIBBLURAY if (res <= 0) { if (check_ext(TRACKDIR, origpath)) { std::string origfile(origpath); remove_ext(&origfile); // remove TRACKDIR extension to get original media file name Logging::trace(origfile, "getattr: Checking for cue sheet."); if (virtual_name(&origfile)) { // Returns -errno or number or titles in cue sheet res = check_cuesheet(origfile); } } } if (ffmpeg_format[FORMAT::VIDEO].is_frameset()) { LPVIRTUALFILE parent_file = find_parent(origpath); if (parent_file != nullptr && (parent_file->m_flags & VIRTUALFLAG_DIRECTORY) && (parent_file->m_flags & VIRTUALFLAG_FILESET)) { // Generate set of all frames if (!parent_file->m_video_frame_count) { int res2 = get_source_properties(origpath, parent_file); if (res2 < 0) { return res2; } } for (uint32_t frame_no = 1; frame_no <= parent_file->m_video_frame_count; frame_no++) { make_file(nullptr, nullptr, parent_file->m_type, parent_file->m_destfile + "/", make_filename(frame_no, params.current_format(parent_file)->fileext()), parent_file->m_predicted_size, parent_file->m_st.st_ctime, VIRTUALFLAG_FRAME); /**< @todo Calculate correct file size for frame image in set */ } LPVIRTUALFILE virtualfile2 = find_original(origpath); if (virtualfile2 == nullptr) { // File does not exist return -ENOENT; } mempcpy(stbuf, &virtualfile2->m_st, sizeof(struct stat)); // Clear errors errno = 0; return 0; } } else if (ffmpeg_format[FORMAT::VIDEO].is_hls()) { LPVIRTUALFILE parent_file = find_parent(origpath); if (parent_file != nullptr && (parent_file->m_flags & VIRTUALFLAG_DIRECTORY) && (parent_file->m_flags & VIRTUALFLAG_FILESET)) { if (!parent_file->m_video_frame_count) //***< @todo HLS format: Do audio files source properties get checked over and over? { int res2 = get_source_properties(origpath, parent_file); if (res2 < 0) { return res2; } } make_hls_fileset(nullptr, nullptr, parent_file->m_destfile + "/", parent_file); LPVIRTUALFILE virtualfile2 = find_original(origpath); if (virtualfile2 == nullptr) { // File does not exist return -ENOENT; } mempcpy(stbuf, &virtualfile2->m_st, sizeof(struct stat)); // Clear errors errno = 0; return 0; } } if (res <= 0) { // No Blu-ray/DVD/VCD found or error reading disk return (!res ? error : res); } } virtualfile = find_original(&origpath); if (virtualfile == nullptr) { // Not a DVD/VCD/Blu-ray file or cue sheet track return -ENOENT; } mempcpy(stbuf, &virtualfile->m_st, sizeof(struct stat)); } if (flags & VIRTUALFLAG_FILESET) { int flags2 = 0; // Change file to virtual directory for the frame set. Keep permissions. stat_to_dir(stbuf); flags_to_dir(&flags2); append_sep(&origpath); insert_file(type, origpath, stbuf, flags2); } else if (S_ISREG(stbuf->st_mode)) { // Get size for resulting output file from regular file, otherwise it's a symbolic link or a virtual frame set. if (virtualfile == nullptr) { // We should not never end here - report bad file number. return -EBADF; } if (!transcoder_cached_filesize(virtualfile, stbuf)) { Cache_Entry* cache_entry = transcoder_new(virtualfile, false); if (cache_entry == nullptr) { return -errno; } stat_set_size(stbuf, transcoder_get_size(cache_entry)); transcoder_delete(cache_entry); } } errno = 0; // Just to make sure - reset any error } else // if (virtualfile != nullptr && (virtualfile->m_flags & VIRTUALFLAG_DIRECTORY)) { // Frame set, simply report stat. mempcpy(stbuf, &virtualfile->m_st, sizeof(struct stat)); errno = 0; } break; } // We should never come here but this shuts up a warning case VIRTUALTYPE::PASSTHROUGH: case VIRTUALTYPE::BUFFER: { break; } } return 0; } /** * @brief Get attributes from an open file * @param[in] path * @param[in] stbuf * @param[in] fi * @return On success, returns 0. On error, returns -errno. */ //static int ffmpegfs_fgetattr(const char *path, struct stat * stbuf, struct fuse_file_info *fi) //{ // std::string origpath; // Logging::trace(path, "fgetattr"); // errno = 0; // append_basepath(&origpath, path); // LPCVIRTUALFILE virtualfile = find_original(&origpath); // if (virtualfile != nullptr && (virtualfile->m_flags & VIRTUALFLAG_HIDDEN)) // { // errno = ENOENT; // return -errno; // } // if ((virtualfile == nullptr || (virtualfile->m_flags & VIRTUALFLAG_PASSTHROUGH)) && lstat(origpath.c_str(), stbuf) == 0) // { // // passthrough for regular files // errno = 0; // return 0; // } // else // { // // Not really an error. // errno = 0; // } // // This is a virtual file // bool no_check = false; // switch (virtualfile->m_type) // { //#ifdef USE_LIBVCD // case VIRTUALTYPE::VCD: //#endif // USE_LIBVCD //#ifdef USE_LIBDVD // case VIRTUALTYPE::DVD: //#endif // USE_LIBDVD //#ifdef USE_LIBBLURAY // case VIRTUALTYPE::BLURAY: //#endif // USE_LIBBLURAY // { // // Use stored status // mempcpy(stbuf, &virtualfile->m_st, sizeof(struct stat)); // no_check = true; // FALLTHROUGH_INTENDED; // } // case VIRTUALTYPE::DISK: // { // if (virtualfile->m_flags & (VIRTUALFLAG_FILESET | VIRTUALFLAG_FRAME | VIRTUALFLAG_HLS | VIRTUALFLAG_DIRECTORY)) // { // mempcpy(stbuf, &virtualfile->m_st, sizeof(struct stat)); // } // else // { // if (!no_check) // { // if (lstat(origpath.c_str(), stbuf) == -1) // { // return -errno; // } // } // // Get size for resulting output file from regular file, otherwise it's a symbolic link. // if (S_ISREG(stbuf->st_mode)) // { // Cache_Entry* cache_entry = reinterpret_cast(fi->fh); // if (cache_entry == nullptr) // { // Logging::error(path, "fgetattr: Tried to stat unopen file."); // errno = EBADF; // return -errno; // } // uint32_t segment_no = 0; // stat_set_size(stbuf, transcoder_buffer_watermark(cache_entry, segment_no)); // } // } // errno = 0; // Just to make sure - reset any error // break; // } // case VIRTUALTYPE::SCRIPT: // { // mempcpy(stbuf, &virtualfile->m_st, sizeof(struct stat)); // break; // } // // We should never come here but this shuts up a warning // case VIRTUALTYPE::PASSTHROUGH: // case VIRTUALTYPE::BUFFER: // { // break; // } // } // return 0; //} /** * @brief File open operation * @param[in] path * @param[in] fi * @return On success, returns 0. On error, returns -errno. */ static int ffmpegfs_open(const char *path, struct fuse_file_info *fi) { std::string origpath; Logging::trace(path, "open"); append_basepath(&origpath, path); LPVIRTUALFILE virtualfile = find_original(&origpath); if (virtualfile == nullptr || (virtualfile->m_flags & VIRTUALFLAG_PASSTHROUGH)) { int fd = open(origpath.c_str(), fi->flags); if (fd != -1) { close(fd); // File is real and can be opened. errno = 0; } else { if (errno == ENOENT) { // File does not exist? We should never end up here... errno = EINVAL; } // If file does exist, but can't be opened, return error. } return -errno; } // This is a virtual file kick_next(virtualfile); switch (virtualfile->m_type) { case VIRTUALTYPE::SCRIPT: { errno = 0; break; } #ifdef USE_LIBVCD case VIRTUALTYPE::VCD: #endif // USE_LIBVCD #ifdef USE_LIBDVD case VIRTUALTYPE::DVD: #endif // USE_LIBDVD #ifdef USE_LIBBLURAY case VIRTUALTYPE::BLURAY: #endif // USE_LIBBLURAY case VIRTUALTYPE::DISK: { if (virtualfile->m_flags & (VIRTUALFLAG_FRAME | VIRTUALFLAG_HLS)) { LPVIRTUALFILE parent_file = find_parent(origpath); if (parent_file != nullptr) { Cache_Entry* cache_entry; cache_entry = transcoder_new(parent_file, true); if (cache_entry == nullptr) { return -errno; } // Store transcoder in the fuse_file_info structure. fi->fh = reinterpret_cast(cache_entry); // Need this because we do not know the exact size in advance. fi->direct_io = 1; //fi->keep_cache = 1; // Clear errors errno = 0; } } else if (!(virtualfile->m_flags & VIRTUALFLAG_FILESET)) { Cache_Entry* cache_entry; cache_entry = transcoder_new(virtualfile, true); if (cache_entry == nullptr) { return -errno; } // Store transcoder in the fuse_file_info structure. fi->fh = reinterpret_cast(cache_entry); // Need this because we do not know the exact size in advance. fi->direct_io = 1; //fi->keep_cache = 1; // Clear errors errno = 0; } break; } // We should never come here but this shuts up a warning case VIRTUALTYPE::PASSTHROUGH: case VIRTUALTYPE::BUFFER: { break; } } return 0; } /** * @brief Read data from an open file * @param[in] path * @param[in] buf * @param[in] size * @param[in] offset * @param[in] fi * @return On success, returns 0. On error, returns -errno. */ static int ffmpegfs_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { std::string origpath; size_t locoffset = static_cast(offset); // Cast OK: offset can never be < 0. int bytes_read = 0; Logging::trace(path, "read: Reading %1 bytes from offset %2 to %3.", size, locoffset, size + locoffset); append_basepath(&origpath, path); LPVIRTUALFILE virtualfile = find_original(&origpath); if (virtualfile == nullptr || (virtualfile->m_flags & VIRTUALFLAG_PASSTHROUGH)) { int fd = open(origpath.c_str(), O_RDONLY); if (fd != -1) { // If this is a real file, pass the call through. bytes_read = static_cast(pread(fd, buf, size, offset)); close(fd); if (bytes_read >= 0) { return bytes_read; } else { return -errno; } } else if (errno != ENOENT) { // File does exist, but can't be opened. return -errno; } else { // File does not exist, and this is fine. errno = 0; } } // This is a virtual file bool success = true; if (virtualfile == nullptr) { errno = EINVAL; Logging::error(origpath.c_str(), "read: INTERNAL ERROR: ffmpegfs_read()! virtualfile == NULL"); return -errno; } switch (virtualfile->m_type) { case VIRTUALTYPE::SCRIPT: { if (locoffset >= virtualfile->m_file_contents.size()) { bytes_read = 0; break; } size_t bytes = size; if (locoffset + bytes > virtualfile->m_file_contents.size()) { bytes = virtualfile->m_file_contents.size() - locoffset; } if (bytes) { std::memcpy(buf, &virtualfile->m_file_contents[locoffset], bytes); } bytes_read = static_cast(bytes); break; } #ifdef USE_LIBVCD case VIRTUALTYPE::VCD: #endif // USE_LIBVCD #ifdef USE_LIBDVD case VIRTUALTYPE::DVD: #endif // USE_LIBDVD #ifdef USE_LIBBLURAY case VIRTUALTYPE::BLURAY: #endif // USE_LIBBLURAY case VIRTUALTYPE::DISK: { if (virtualfile->m_flags & VIRTUALFLAG_FRAME) { Cache_Entry* cache_entry; cache_entry = reinterpret_cast(fi->fh); if (cache_entry == nullptr) { if (errno) { Logging::error(origpath.c_str(), "read: Tried to read from unopen file: (%1) %2", errno, strerror(errno)); } return -errno; } uint32_t frame_no = 0; std::string filename = get_number(path, &frame_no); if (!frame_no) { errno = EINVAL; Logging::error(origpath.c_str(), "read: Unable to deduct frame no. from file name (%1): (%2) %3", filename.c_str(), errno, strerror(errno)); return -errno; } success = transcoder_read_frame(cache_entry, buf, locoffset, size, frame_no, &bytes_read, virtualfile); } else if (!(virtualfile->m_flags & VIRTUALFLAG_FILESET)) { Cache_Entry* cache_entry; cache_entry = reinterpret_cast(fi->fh); if (cache_entry == nullptr) { if (errno) { Logging::error(origpath.c_str(), "read: Tried to read from unopen file: (%1) %2", errno, strerror(errno)); } return -errno; } uint32_t segment_no = 0; if (virtualfile->m_flags & VIRTUALFLAG_HLS) { std::string filename = get_number(path, &segment_no); if (!segment_no) { errno = EINVAL; Logging::error(origpath.c_str(), "read: Unable to deduct segment no. from file name (%1): (%2) %3", filename.c_str(), errno, strerror(errno)); return -errno; } } success = transcoder_read(cache_entry, buf, locoffset, size, &bytes_read, segment_no); } break; } case VIRTUALTYPE::PASSTHROUGH: case VIRTUALTYPE::BUFFER: { break; } } if (success) { if (bytes_read) { Logging::trace(path, "read: Read %1 bytes from offset %2 to %3.", bytes_read, locoffset, static_cast(bytes_read) + locoffset); } else { Logging::trace(path, "read: Read output file to EOF."); } return bytes_read; } else { return -errno; } } /** * @brief Get file system statistics * @param[in] path * @param[in] stbuf * @return On success, returns 0. On error, returns -errno. */ static int ffmpegfs_statfs(const char *path, struct statvfs *stbuf) { std::string origpath; Logging::trace(path, "statfs"); append_basepath(&origpath, path); // passthrough for regular files if (!origpath.empty() && statvfs(origpath.c_str(), stbuf) == 0) { errno = 0; // Just to make sure - reset any error return 0; } else { // Not really an error. errno = 0; } find_original(&origpath); statvfs(origpath.c_str(), stbuf); errno = 0; // Just to make sure - reset any error return 0; } /** * @brief Release an open file * @param[in] path * @param[in] fi * @return On success, returns 0. On error, returns -errno. */ static int ffmpegfs_release(const char *path, struct fuse_file_info *fi) { Cache_Entry* cache_entry = reinterpret_cast(fi->fh); Logging::trace(path, "release"); if (cache_entry != nullptr) { uint32_t segment_no = 0; if (cache_entry->virtualfile()->m_flags & VIRTUALFLAG_HLS) { std::string filename = get_number(path, &segment_no); if (!segment_no) { errno = EINVAL; Logging::error(path, "release: Unable to deduct segment no. from file name (%1): (%2) %3", filename.c_str(), errno, strerror(errno)); } else { cache_entry->m_buffer->close_file(segment_no - 1, CACHE_FLAG_RO); } } transcoder_delete(cache_entry); } return 0; } /** * @brief Initialise filesystem * @param[in] conn - fuse_conn_info structure of FUSE. See FUSE docs for details. * @return nullptr */ static void *ffmpegfs_init(struct fuse_conn_info * /*conn*/, struct fuse_config * /*cfg*/) { Logging::info(nullptr, "%1 V%2 initialising.", PACKAGE_NAME, FFMPEFS_VERSION); Logging::info(nullptr, "Mapping '%1' to '%2'.", params.m_basepath.c_str(), params.m_mountpath.c_str()); if (docker_client) { Logging::info(nullptr, "Running inside Docker."); } struct sigaction sa; std::memset(&sa, 0, sizeof(sa)); sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGINT); sa.sa_handler = sighandler; sigaction(SIGINT, &sa, &oldHandler); // We need synchronous reads. //conn->async_read = 0; //conn->async_read = 1; //conn->want |= FUSE_CAP_ASYNC_READ; //conn->want |= FUSE_CAP_SPLICE_READ; if (params.m_cache_maintenance) { if (!start_cache_maintenance(params.m_cache_maintenance)) { exit(1); } } if (params.m_enablescript) { prepare_script(); } if (tp == nullptr) { tp = std::make_unique(params.m_max_threads); } tp->init(); return nullptr; } /** * @brief Clean up filesystem * @param[in] p - unused */ static void ffmpegfs_destroy(__attribute__((unused)) void * p) { Logging::info(nullptr, "%1 V%2 terminating.", PACKAGE_NAME, FFMPEFS_VERSION); std::printf("%s V%s terminating\n", PACKAGE_NAME, FFMPEFS_VERSION); stop_cache_maintenance(); transcoder_exit(); transcoder_free(); if (tp != nullptr) { tp->tear_down(); tp.reset(); } script_file.clear(); Logging::info(nullptr, "%1 V%2 terminated.", PACKAGE_NAME, FFMPEFS_VERSION); } /** * @brief Calculate the video frame count. * @param[in] origpath - Path of original file. * @param[inout] virtualfile - Virtual file object to modify. * @return On success, returns 0. On error, returns -errno. */ static int get_source_properties(const std::string & origpath, LPVIRTUALFILE virtualfile) { Cache_Entry* cache_entry = transcoder_new(virtualfile, false); if (cache_entry == nullptr) { return -errno; } transcoder_delete(cache_entry); Logging::debug(origpath, "Duration: %1 Frames: %2 Segments: %3", virtualfile->m_duration, virtualfile->m_video_frame_count, virtualfile->get_segment_count()); return 0; } /** * @brief Initialise a stat structure. * @param[in] stbuf - struct stat to fill in. * @param[in] fsize - size of the corresponding file. * @param[in] ftime - File time (creation/modified/access) of the corresponding file. * @param[in] directory - If true, the structure is set up for a directory. */ static void init_stat(struct stat * stbuf, size_t fsize, time_t ftime, bool directory) { std::memset(stbuf, 0, sizeof(struct stat)); stbuf->st_mode = DEFFILEMODE; //S_IFREG | S_IRUSR | S_IRGRP | S_IROTH; if (directory) { stbuf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; stbuf->st_nlink = 2; } else { stbuf->st_mode |= S_IFREG; stbuf->st_nlink = 1; } stat_set_size(stbuf, fsize); // Set current user as owner stbuf->st_uid = getuid(); stbuf->st_gid = getgid(); // Use current date/time stbuf->st_atime = stbuf->st_mtime = stbuf->st_ctime = ftime; } /** * @brief Make a virtual file. * @param[in] buf - FUSE buffer to fill. * @param[in] filler - Filler function. * @param[in] type - Type of virtual file. * @param[in] origpath - Original path. * @param[in] filename - Name of virtual file. * @param[in] flags - On of the VIRTUALFLAG_ macros. * @param[in] fsize - Size of virtual file. * @param[in] ftime - Time of virtual file. * @return Returns constant pointer to VIRTUALFILE object of file. */ static LPVIRTUALFILE make_file(void *buf, fuse_fill_dir_t filler, VIRTUALTYPE type, const std::string & origpath, const std::string & filename, size_t fsize, time_t ftime, int flags) { struct stat stbuf; init_stat(&stbuf, fsize, ftime, false); if (add_fuse_entry(buf, filler, filename, &stbuf, 0)) { return nullptr; } return insert_file(type, origpath + filename, &stbuf, flags); } /** * @brief Read the virtual script file into memory and store in buffer. */ static void prepare_script() { std::string scriptsource; exepath(&scriptsource); scriptsource += params.m_scriptsource; Logging::debug(scriptsource, "Reading virtual script source."); FILE *fpi = fopen(scriptsource.c_str(), "rt"); if (fpi == nullptr) { Logging::warning(scriptsource, "File open failed. Disabling script: (%1) %2", errno, strerror(errno)); params.m_enablescript = false; } else { struct stat stbuf; if (fstat(fileno(fpi), &stbuf) == -1) { Logging::warning(scriptsource, "File could not be accessed. Disabling script: (%1) %2", errno, strerror(errno)); params.m_enablescript = false; } else { script_file.resize(static_cast(stbuf.st_size)); if (fread(&script_file[0], 1, static_cast(stbuf.st_size), fpi) != static_cast(stbuf.st_size)) { Logging::warning(scriptsource, "File could not be read. Disabling script: (%1) %2", errno, strerror(errno)); params.m_enablescript = false; } else { Logging::trace(scriptsource, "Read %1 bytes of script file.", script_file.size()); } } fclose(fpi); } } /** * @brief Convert file name from source to destination name. * @param[in] virtualpath - Name of source file, will be changed to destination name. * @param[in] origpath - Original path to file. May be empty string if filepath is already a full path. * @param[out] current_format - If format has been found points to format info, nullptr if not. * @return Returns true if format has been found and filename changed, false if not. */ static bool virtual_name(std::string * virtualpath, const std::string & origpath /*= ""*/, const FFmpegfs_Format **current_format /*= nullptr*/) { std::string ext; if (current_format != nullptr) { *current_format = nullptr; } if (!find_ext(&ext, *virtualpath) || is_passthrough(ext)) { return false; } if (!is_selected(ext)) { return false; } VIRTUALFILE newvirtualfile; newvirtualfile.m_origfile = origpath + *virtualpath; const FFmpegfs_Format *ffmpegfs_format = get_format(&newvirtualfile); if (ffmpegfs_format != nullptr) { if (params.m_oldnamescheme) { // Old filename scheme, creates duplicates replace_ext(virtualpath, ffmpegfs_format->fileext()); } else { // New name scheme append_ext(virtualpath, ffmpegfs_format->fileext()); } newvirtualfile.m_destfile = origpath + *virtualpath; newvirtualfile.m_virtfile = params.m_mountpath + *virtualpath; if (lstat(newvirtualfile.m_destfile.c_str(), &newvirtualfile.m_st) == 0) { if (params.m_recodesame == RECODESAME::NO) { newvirtualfile.m_flags |= VIRTUALFLAG_PASSTHROUGH; } if (ffmpegfs_format->is_multiformat()) { // Change file to directory for the frame set // Change file to virtual directory for the frame set. Keep permissions. stat_to_dir(&newvirtualfile.m_st); flags_to_dir(&newvirtualfile.m_flags); } } insert(newvirtualfile); if (current_format != nullptr) { *current_format = ffmpegfs_format; } return true; } return false; } /** * @brief Find mapped file by prefix. Normally used to find a path. * @param[in] map - File map with virtual files. * @param[in] search_for - Prefix (path) to search for. * @return If found, returns const_iterator to map entry. Returns map.cend() if not found. */ static FILENAME_MAP::const_iterator find_prefix(const FILENAME_MAP & map, const std::string & search_for) { FILENAME_MAP::const_iterator it = map.lower_bound(search_for); if (it != map.cend()) { const std::string & key = it->first; if (key.compare(0, search_for.size(), search_for) == 0) // Really a prefix? { return it; } } return map.cend(); } /** * @brief Insert virtualfile into list. * @param[in] virtualfile - VIRTUALFILE object to insert */ static void insert(const VIRTUALFILE & virtualfile) { filenames.insert(make_pair(virtualfile.m_destfile, virtualfile)); rfilenames.insert(make_pair(virtualfile.m_origfile, virtualfile)); } LPVIRTUALFILE insert_file(VIRTUALTYPE type, const std::string & virtfile, const struct stat * stbuf, int flags) { return insert_file(type, virtfile, virtfile, stbuf, flags); } LPVIRTUALFILE insert_file(VIRTUALTYPE type, const std::string & virtfile, const std::string & origfile, const struct stat * stbuf, int flags) { std::string sanitised_virtfile(sanitise_filepath(virtfile)); FILENAME_MAP::iterator it = filenames.find(sanitised_virtfile); if (it == filenames.cend()) { // Create new std::string sanitised_origfile(sanitise_filepath(origfile)); VIRTUALFILE virtualfile; std::memcpy(&virtualfile.m_st, stbuf, sizeof(struct stat)); virtualfile.m_type = type; virtualfile.m_flags = flags; virtualfile.m_format_idx = guess_format_idx(sanitised_origfile); // Make a guess, will be finalised later virtualfile.m_destfile = sanitised_virtfile; virtualfile.m_origfile = sanitised_origfile; virtualfile.m_virtfile = sanitised_origfile; //virtualfile.m_predicted_size = static_cast(stbuf->st_size); replace_start(&virtualfile.m_virtfile, params.m_basepath, params.m_mountpath); insert(virtualfile); it = filenames.find(sanitised_virtfile); } return &it->second; } /** * @brief Convert stbuf to directory * @param[inout] stbuf - Buffer to convert to directory */ static void stat_to_dir(struct stat *stbuf) { stbuf->st_mode &= ~static_cast(S_IFREG | S_IFLNK); stbuf->st_mode |= S_IFDIR; if (stbuf->st_mode & S_IRWXU) { stbuf->st_mode |= S_IXUSR; // Add user execute bit if user has read or write access } if (stbuf->st_mode & S_IRWXG) { stbuf->st_mode |= S_IXGRP; // Add group execute bit if group has read or write access } if (stbuf->st_mode & S_IRWXO) { stbuf->st_mode |= S_IXOTH; // Add other execute bit if other has read or write access } stbuf->st_nlink = 2; stbuf->st_size = stbuf->st_blksize; } /** * @brief Convert flags to directory * @param[inout] flags - Flags variable to change */ static void flags_to_dir(int *flags) { *flags |= VIRTUALFLAG_FILESET | VIRTUALFLAG_DIRECTORY; if (ffmpeg_format[FORMAT::VIDEO].is_frameset()) { *flags |= VIRTUALFLAG_FRAME; } else if (ffmpeg_format[FORMAT::VIDEO].is_hls()) { *flags |= VIRTUALFLAG_HLS; } } LPVIRTUALFILE insert_dir(VIRTUALTYPE type, const std::string & virtdir, const struct stat * stbuf, int flags) { struct stat stbufdir; std::memcpy(&stbufdir, stbuf, sizeof(stbufdir)); // Change file to directory for the frame set // Change file to virtual directory for the frame set. Keep permissions. stat_to_dir(&stbufdir); flags_to_dir(&flags); std::string path(virtdir); append_sep(&path); return insert_file(type, path, &stbufdir, flags); } LPVIRTUALFILE find_file(const std::string & virtfile) { FILENAME_MAP::iterator it = filenames.find(sanitise_filepath(virtfile)); errno = 0; return (it != filenames.end() ? &it->second : nullptr); } LPVIRTUALFILE find_file_from_orig(const std::string &origfile) { RFILENAME_MAP::iterator it = rfilenames.find(sanitise_filepath(origfile)); errno = 0; return (it != rfilenames.end() ? &it->second : nullptr); } bool check_path(const std::string & path) { FILENAME_MAP::const_iterator it = find_prefix(filenames, path); return (it != filenames.cend()); } int load_path(const std::string & path, const struct stat *statbuf, void *buf, fuse_fill_dir_t filler) { if (buf == nullptr) { // We can't add anything here if buf == nullptr return 0; } int title_count = 0; for (FILENAME_MAP::iterator it = filenames.lower_bound(path); it != filenames.end(); ++it) { std::string virtfilepath = it->first; LPVIRTUALFILE virtualfile = &it->second; if ( #ifdef USE_LIBVCD (virtualfile->m_type != VIRTUALTYPE::VCD) && #endif // USE_LIBVCD #ifdef USE_LIBDVD (virtualfile->m_type != VIRTUALTYPE::DVD) && #endif // USE_LIBDVD #ifdef USE_LIBBLURAY (virtualfile->m_type != VIRTUALTYPE::BLURAY) && #endif // USE_LIBBLURAY !(virtualfile->m_flags & VIRTUALFLAG_CUESHEET) ) { continue; } remove_filename(&virtfilepath); if (virtfilepath == path) // Really a prefix? { struct stat stbuf; std::string destfile(virtualfile->m_destfile); if (virtualfile->m_flags & VIRTUALFLAG_DIRECTORY) { // Is a directory, no need to translate the file name, just drop terminating separator remove_sep(&destfile); } remove_path(&destfile); title_count++; std::string cachefile; Buffer::make_cachefile_name(&cachefile, virtualfile->m_destfile, params.current_format(virtualfile)->fileext(), false); struct stat stbuf2; if (!lstat(cachefile.c_str(), &stbuf2)) { // Cache file exists, use cache file size here stat_set_size(&virtualfile->m_st, static_cast(stbuf2.st_size)); std::memcpy(&stbuf, &virtualfile->m_st, sizeof(struct stat)); } else { if (statbuf == nullptr) { std::memcpy(&stbuf, &virtualfile->m_st, sizeof(struct stat)); } else { std::memcpy(&stbuf, statbuf, sizeof(struct stat)); stat_set_size(&stbuf, static_cast(virtualfile->m_st.st_size)); } } if (add_fuse_entry(buf, filler, destfile, &stbuf, 0)) { // break; } } } return title_count; } /** * @brief Filter function used for scandir. * * Selects files only that can be processed with FFmpeg API. * * @param[in] de - dirent to check * @return Returns nonzero if dirent matches, 0 if not. */ static int selector(const struct dirent * de) { if (de->d_type & (DT_REG | DT_LNK)) { return (av_guess_format(nullptr, de->d_name, nullptr) != nullptr); } else { return 0; } } /** * @brief Scans the directory dirp * Works exactly like the scandir(3) function, the only * difference is that it returns the result in a std:vector. * @param[in] dirp - Directory to be searched. * @param[out] _namelist - Returns the list of files found * @param[in] selector - Entries for which selector() returns nonzero are stored in _namelist * @param[in] cmp - Entries are sorted using qsort(3) with the comparison function cmp(). May be nullptr for no sort. * @return Returns the number of directory entries selected. * On error, -1 is returned, with errno set to indicate * the error. */ static int scandir(const char *dirp, std::vector * _namelist, int (*selector) (const struct dirent *), int (*cmp) (const struct dirent **, const struct dirent **)) { struct dirent **namelist; int count = scandir(dirp, &namelist, selector, cmp); // cppcheck-suppress [nullPointer, ctunullpointer] _namelist->clear(); if (count != -1) { for (int n = 0; n < count; n++) { _namelist->push_back(*namelist[n]); free(namelist[n]); } free(namelist); } return count; } LPVIRTUALFILE find_original(const std::string & origpath) { std::string buffer(origpath); return find_original(&buffer); } LPVIRTUALFILE find_original(std::string * filepath) { sanitise_filepath(filepath); LPVIRTUALFILE virtualfile = find_file(*filepath); errno = 0; if (virtualfile != nullptr) { *filepath = virtualfile->m_origfile; return virtualfile; } else { // Fallback to old method (required if file accessed directly) std::string ext; if (!ffmpeg_format[FORMAT::VIDEO].is_hls() && find_ext(&ext, *filepath) && (strcasecmp(ext, ffmpeg_format[FORMAT::VIDEO].fileext()) == 0 || (params.smart_transcode() && strcasecmp(ext, ffmpeg_format[FORMAT::AUDIO].fileext()) == 0))) { std::string dir(*filepath); std::string searchexp(*filepath); std::string origfile; std::vector namelist; struct stat stbuf; int count; int found = 0; remove_filename(&dir); origfile = dir; // cppcheck-suppress nullPointer count = scandir(dir.c_str(), &namelist, selector, nullptr); if (count == -1) { if (errno != ENOTDIR) // If not a directory, simply ignore error { Logging::error(dir, "Error scanning directory: (%1) %2", errno, strerror(errno)); } return nullptr; } remove_path(&searchexp); remove_ext(&searchexp); for (size_t n = 0; n < static_cast(count); n++) { if (!strcmp(namelist[n].d_name, searchexp.c_str())) { append_filename(&origfile, namelist[n].d_name); sanitise_filepath(&origfile); found = 1; break; } } if (found && lstat(origfile.c_str(), &stbuf) == 0) { // The original file exists LPVIRTUALFILE virtualfile2; if (*filepath != origfile) { virtualfile2 = insert_file(VIRTUALTYPE::DISK, *filepath, origfile, &stbuf); ///<* @todo This probably won't work, need to redo "Fallback to old method" *filepath = origfile; } else { virtualfile2 = insert_file(VIRTUALTYPE::DISK, origfile, &stbuf, VIRTUALFLAG_PASSTHROUGH); } return virtualfile2; } else { // File does not exist; this is a virtual file, not an error errno = 0; } } } // Source file exists with no supported extension, keep path return nullptr; } LPVIRTUALFILE find_parent(const std::string & origpath) { std::string filepath(origpath); remove_filename(&filepath); remove_sep(&filepath); return find_original(&filepath); } /** * @brief Build a virtual HLS file set * @param[in, out] buf - The buffer passed to the readdir() operation. * @param[in, out] filler - Function to add an entry in a readdir() operation (see https://libfuse.github.io/doxygen/fuse_8h.html#a7dd132de66a5cc2add2a4eff5d435660) * @param[in] origpath - The original file * @param[in] virtualfile - LPCVIRTUALFILE of file to create file set for * @return On success, returns 0. On error, returns -errno. */ static int make_hls_fileset(void * buf, fuse_fill_dir_t filler, const std::string & origpath, LPVIRTUALFILE virtualfile) { // Generate set of TS segment files and necessary M3U lists if (!virtualfile->get_segment_count()) { int res = get_source_properties(origpath, virtualfile); if (res < 0) { return res; } } if (virtualfile->get_segment_count()) { std::string master_contents; std::string index_0_av_contents; // Examples... //"#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1250,RESOLUTION=720x406,CODECS= \"avc1.77.30, mp4a.40.2 \",CLOSED-CAPTIONS=NONE\n" //"index_0_av.m3u8\n"; //"#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2647000,RESOLUTION=1280x720,CODECS= \"avc1.77.30, mp4a.40.2 \",CLOSED-CAPTIONS=NONE\n" //"index_1_av.m3u8\n" //"#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=922000,RESOLUTION=640x360,CODECS= \"avc1.77.30, mp4a.40.2 \",CLOSED-CAPTIONS=NONE\n" //"index_2_av.m3u8\n" //"#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=448000,RESOLUTION=384x216,CODECS= \"avc1.66.30, mp4a.40.2 \",CLOSED-CAPTIONS=NONE\n" //"index_3_av.m3u8\n" //"#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=61000,CODECS= \"mp4a.40.2 \",CLOSED-CAPTIONS=NONE\n" //"index_3_a.m3u8\n"; master_contents = "#EXTM3U\n" "#EXT-X-STREAM-INF:PROGRAM-ID=1\n" "index_0_av.m3u8\n"; strsprintf(&index_0_av_contents, "#EXTM3U\n" "#EXT-X-TARGETDURATION:%i\n" "#EXT-X-ALLOW-CACHE:YES\n" "#EXT-X-PLAYLIST-TYPE:VOD\n" "#EXT-X-VERSION:3\n" "#EXT-X-MEDIA-SEQUENCE:1\n", static_cast(params.m_segment_duration / AV_TIME_BASE)); int64_t remaining_duration = virtualfile->m_duration % params.m_segment_duration; size_t segment_size = virtualfile->m_predicted_size / virtualfile->get_segment_count(); for (uint32_t file_no = 1; file_no <= virtualfile->get_segment_count(); file_no++) { std::string buffer; std::string segment_name = make_filename(file_no, params.current_format(virtualfile)->fileext()); struct stat stbuf; std::string cachefile; std::string _origpath(origpath); remove_sep(&_origpath); std::string filename(_origpath); filename.append("."); filename.append(segment_name); Buffer::make_cachefile_name(&cachefile, filename, params.current_format(virtualfile)->fileext(), false); if (!lstat(cachefile.c_str(), &stbuf)) { make_file(buf, filler, virtualfile->m_type, origpath, segment_name, static_cast(stbuf.st_size), virtualfile->m_st.st_ctime, VIRTUALFLAG_HLS); } else { make_file(buf, filler, virtualfile->m_type, origpath, segment_name, segment_size, virtualfile->m_st.st_ctime, VIRTUALFLAG_HLS); } if (file_no < virtualfile->get_segment_count()) { strsprintf(&buffer, "#EXTINF:%.3f,\n", static_cast(params.m_segment_duration) / AV_TIME_BASE); } else { strsprintf(&buffer, "#EXTINF:%.3f,\n", static_cast(remaining_duration) / AV_TIME_BASE); } index_0_av_contents += buffer; index_0_av_contents += segment_name; index_0_av_contents += "\n"; } index_0_av_contents += "#EXT-X-ENDLIST\n"; LPVIRTUALFILE child_file; child_file = make_file(buf, filler, VIRTUALTYPE::SCRIPT, origpath, "master.m3u8", master_contents.size(), virtualfile->m_st.st_ctime); std::copy(master_contents.begin(), master_contents.end(), std::back_inserter(child_file->m_file_contents)); child_file = make_file(buf, filler, VIRTUALTYPE::SCRIPT, origpath, "index_0_av.m3u8", index_0_av_contents.size(), virtualfile->m_st.st_ctime, VIRTUALFLAG_NONE); std::copy(index_0_av_contents.begin(), index_0_av_contents.end(), std::back_inserter(child_file->m_file_contents)); { // Demo code adapted from: https://github.com/video-dev/hls.js/ std::string hls_html; hls_html = "\n" "\n" "\n" " HLS Demo\n" " \n" " \n" "\n" "\n" "\n" "
\n" "

Hls.js demo - basic usage

\n" " \n" "
\n" " \n" "\n" "\n" "\n"; child_file = make_file(buf, filler, VIRTUALTYPE::SCRIPT, origpath, "hls.html", hls_html.size(), virtualfile->m_st.st_ctime, VIRTUALFLAG_NONE); std::copy(hls_html.begin(), hls_html.end(), std::back_inserter(child_file->m_file_contents)); } } return 0; } /** * @brief Give next song in cuesheet list a kick start * Starts transcoding of the next song on the cuesheet list * to ensure a somewhat gapless start when the current song * finishes. Next song can be played from cache and start * faster then. * @todo Will work only if transcoding finishes within timeout. * Probably remove or raise timeout here. * @param[in] virtualfile - VIRTUALFILE object of current song * @return On success, returns 0. On error, returns -errno. */ static int kick_next(LPVIRTUALFILE virtualfile) { if (virtualfile == nullptr) { // Not OK, should not happen return -EINVAL; } if (virtualfile->m_cuesheet_track.m_nextfile == nullptr) { // No next file return 0; } LPVIRTUALFILE nextvirtualfile = virtualfile->m_cuesheet_track.m_nextfile; Logging::debug(virtualfile->m_destfile, "Preparing next file: %1", nextvirtualfile->m_destfile.c_str()); Cache_Entry* cache_entry = transcoder_new(nextvirtualfile, true); /** @todo Disable timeout */ if (cache_entry == nullptr) { return -errno; } transcoder_delete(cache_entry); return 0; } /** * @brief Replacement SIGINT handler. * * FUSE handles SIGINT internally, but because there are extra threads running while transcoding this * mechanism does not properly work. We implement our own SIGINT handler to ensure proper shutdown of * all threads. Next we restore the original handler and dispatch the signal to it. * * @param[in] signum - Signal to handle. Must be SIGINT. */ static void sighandler(int signum) { if (signum == SIGINT) { Logging::warning(nullptr, "Caught SIGINT, shutting down now..."); // Make our threads terminate now transcoder_exit(); // Restore fuse's handler sigaction(SIGINT, &oldHandler, nullptr); // Dispatch to fuse's handler raise(SIGINT); } } /** * @brief Extract the number for a file name * @param[in] path - Path and filename of requested file * @param[out] value - Returns the number extracted * @return Returns the filename that was processed, without path. */ static std::string get_number(const char *path, uint32_t *value) { std::string filename(path); // Get frame number remove_path(&filename); *value = static_cast(std::stoi(filename)); // Extract frame or segment number. May be more fancy in the future. Currently just get number from filename part. return filename; } /** * @brief Try to guess the format index (audio or video) for a file. * @param[in] filepath - Name of the file, path my be included, but not required. * @return Index 0 or 1 */ static size_t guess_format_idx(const std::string & filepath) { const AVOutputFormat* oformat = ::av_guess_format(nullptr, filepath.c_str(), nullptr); if (oformat != nullptr) { if (!params.smart_transcode()) { // Not smart encoding: use first format (video file) return 0; } else { // Smart transcoding if (ffmpeg_format[FORMAT::VIDEO].video_codec() != AV_CODEC_ID_NONE && oformat->video_codec != AV_CODEC_ID_NONE && !is_album_art(oformat->video_codec)) { // Is a video: use first format (video file) return 0; } else if (ffmpeg_format[FORMAT::AUDIO].audio_codec() != AV_CODEC_ID_NONE && oformat->audio_codec != AV_CODEC_ID_NONE) { // For audio only, use second format (audio only file) return 1; } } } return 0; } /** * @brief Open file with FFmpeg API and parse for streams and cue sheet. * @param[inout] newvirtualfile - VIRTUALFILE object of file to parse * @return On success, returns 0. On error, returns a negative AVERROR value. */ static int parse_file(LPVIRTUALFILE newvirtualfile) { AVFormatContext *format_ctx = nullptr; int res; try { Logging::debug(newvirtualfile->m_origfile, "Creating a new format context and parsing the file."); res = avformat_open_input(&format_ctx, newvirtualfile->m_origfile.c_str(), nullptr, nullptr); if (res) { Logging::trace(newvirtualfile->m_origfile, "No parseable file: %1", ffmpeg_geterror(res).c_str()); throw res; } res = avformat_find_stream_info(format_ctx, nullptr); if (res < 0) { Logging::error(newvirtualfile->m_origfile, "Cannot find stream information: %1", ffmpeg_geterror(res).c_str()); throw res; } // Check for an embedded cue sheet AVDictionaryEntry *tag = av_dict_get(format_ctx->metadata, "CUESHEET", nullptr, AV_DICT_IGNORE_SUFFIX); if (tag != nullptr) { // Found cue sheet Logging::trace(newvirtualfile->m_origfile, "Found an embedded cue sheet."); newvirtualfile->m_cuesheet = tag->value; newvirtualfile->m_cuesheet += "\r\n"; // cue_parse_string() reports syntax error if string does not end with newline replace_all(&newvirtualfile->m_cuesheet, "\r\n", "\n"); // Convert all to unix } // Check for audio/video/subtitles int ret = get_audio_props(format_ctx, &newvirtualfile->m_channels, &newvirtualfile->m_sample_rate); if (ret < 0) { if (ret != AVERROR_STREAM_NOT_FOUND) // Not an error, no audio is OK { Logging::error(newvirtualfile->m_origfile, "Could not find audio stream in input file (error '%1').", ffmpeg_geterror(ret).c_str()); } } else { newvirtualfile->m_has_audio = true; } newvirtualfile->m_duration = format_ctx->duration; struct stat stbuf; if (lstat(newvirtualfile->m_origfile.c_str(), &stbuf) == 0) { std::memcpy(&newvirtualfile->m_st, &stbuf, sizeof(stbuf)); } for (unsigned int stream_idx = 0; stream_idx < format_ctx->nb_streams; stream_idx++) { switch (format_ctx->streams[stream_idx]->codecpar->codec_type) { case AVMEDIA_TYPE_VIDEO: { if (!is_album_art(format_ctx->streams[stream_idx]->codecpar->codec_id)) { newvirtualfile->m_has_video = true; } break; } case AVMEDIA_TYPE_SUBTITLE: { newvirtualfile->m_has_subtitle = true; break; } default: { break; } } } } catch (int _res) { res = _res; } if (format_ctx != nullptr) { avformat_close_input(&format_ctx); } return res; } /** * @brief Get FFmpegfs_Format for the file. * @param[inout] newvirtualfile - VIRTUALFILE object of file to parse * @return On success, returns true. On error, returns false. */ static const FFmpegfs_Format * get_format(LPVIRTUALFILE newvirtualfile) { LPVIRTUALFILE virtualfile = find_file_from_orig(newvirtualfile->m_origfile); if (virtualfile != nullptr) { // We already know the file! return params.current_format(virtualfile); } if (parse_file(newvirtualfile) < 0) { return nullptr; } Logging::trace(newvirtualfile->m_origfile, "Audio: %1 Video: %2 Subtitles: %3", newvirtualfile->m_has_audio, newvirtualfile->m_has_video, newvirtualfile->m_has_subtitle); if (!params.smart_transcode()) { // Not smart encoding: use first format (video file) newvirtualfile->m_format_idx = 0; return &ffmpeg_format[FORMAT::VIDEO]; } else { if (newvirtualfile->m_has_video) { newvirtualfile->m_format_idx = 0; return &ffmpeg_format[FORMAT::VIDEO]; } if (newvirtualfile->m_has_audio) { newvirtualfile->m_format_idx = 1; return &ffmpeg_format[FORMAT::AUDIO]; } } return nullptr; } int add_fuse_entry(void *buf, fuse_fill_dir_t filler, const std::string & name, const struct stat *stbuf, off_t /*off*/) { if (buf == nullptr || filler == nullptr) { return 0; } // Issue #173: FUSE_FILL_DIR_PLUS erstmal NICHT nutzen return filler(buf, name.c_str(), stbuf, 0, static_cast(0)); } int add_dotdot(void *buf, fuse_fill_dir_t filler, const struct stat *stbuf, off_t off) { struct stat *stbuf2 = nullptr; struct stat stbuf3; if (stbuf != nullptr) { stbuf2 = &stbuf3; init_stat(stbuf2, 0, stbuf->st_ctime, true); } add_fuse_entry(buf, filler, ".", stbuf2, off); add_fuse_entry(buf, filler, "..", stbuf2, off); return 0; } ffmpegfs-2.18/src/scripts/0000755000000000000000000000000015166203631012471 500000000000000ffmpegfs-2.18/src/scripts/videotag.php0000644000000000000000000001050015052412651014716 00000000000000 Transcoder Test
\n\n"; echo "\n\n"; } foreach ($dirs as &$value) { echo "\n\n"; } echo ""; foreach ($files as &$value) { echo "\n\n"; } ?>
"; echo "Go back"; echo ""; echo "
"; echo ""; echo "
"; echo "" . utf8_encode($value) . " "; echo "\n"; echo "
"; echo ""; echo "
"; echo "" . utf8_encode($value) . " "; echo ""; echo "Preload"; echo "

Supported file types
ffmpegfs-2.18/src/scripts/videotag.txt0000644000000000000000000000054415052412651014755 00000000000000videotag.php is a small script that allows testing the video tag easily. Just put it into the base path directory, mount it to a folder that is accessible to your (PHP enabled) web server. When the page is opened, all transcoded files are listed on the right and playback can be started by clicking on the link. Very handy to test browser capabilities...ffmpegfs-2.18/src/scripts/hls.html0000644000000000000000000000237715052412651014074 00000000000000 HLS Demo

Hls.js demo - basic usage

ffmpegfs-2.18/src/buffer.cc0000644000000000000000000007042715166175407012525 00000000000000/* * Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file buffer.cc * @brief Buffer class implementation * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2017-2026 Norbert Schlia (nschlia@oblivion-software.de) */ #include "buffer.h" #include "ffmpegfs.h" #include "logging.h" #include #include #include #include // Initially Buffer is empty. It will be allocated as needed. Buffer::Buffer() : m_cur_ci(nullptr) , m_cur_open(0) { } // If buffer_data was never allocated, this is a no-op. Buffer::~Buffer() { release(); } VIRTUALTYPE Buffer::type() const { return VIRTUALTYPE::BUFFER; } size_t Buffer::bufsize() const { return 0; // Not applicable } int Buffer::openio(LPVIRTUALFILE virtualfile) { if (virtualfile == nullptr) { errno = EINVAL; return (EOF); } set_virtualfile(virtualfile); return 0; } bool Buffer::open_file(uint32_t segment_no, uint32_t flags, size_t defaultsize) { std::lock_guard lock_mutex(m_mutex); uint32_t index = segment_no; if (index) { index--; } CACHEINFO & ci = m_ci[index]; ci.m_flags |= flags; if (ci.m_fd != -1) { Logging::trace(ci.m_cachefile, "Cache file is already open."); if (defaultsize) { // Make sure the requested size is available reserve(defaultsize); } // Already open return true; } if (flags & CACHE_FLAG_RW) { Logging::debug(ci.m_cachefile, "Writing to cache file."); } else { Logging::debug(ci.m_cachefile, "Reading from cache file."); } size_t filesize = 0; bool isdefaultsize = false; uint8_t *p = nullptr; if (!map_file(ci.m_cachefile, &ci.m_fd, &p, &filesize, &isdefaultsize, defaultsize, (flags & CACHE_FLAG_RW) ? true : false)) { return false; } if (!isdefaultsize) { ci.m_buffer_pos = ci.m_buffer_watermark = filesize; } ci.m_buffer_size = filesize; ci.m_buffer = static_cast(p); ci.m_buffer_write_size = 0; ci.m_buffer_writes = 0; ++m_cur_open; // track open files return true; } bool Buffer::close_file(uint32_t segment_no, uint32_t flags) { std::lock_guard lock_mutex(m_mutex); uint32_t index = segment_no; if (index) { index--; } CACHEINFO & ci = m_ci[index]; ci.m_flags &= ~flags; if (ci.m_flags) { Logging::trace(ci.m_cachefile, "While attempting to close, the cache file is still in use. Currently open: %1", m_cur_open); return true; } if (ci.m_fd == -1) { // Already closed Logging::trace(ci.m_cachefile, "No need to close the unopened cache file. Currently open: %1", m_cur_open); return true; } Logging::trace(ci.m_cachefile, "Closing cache file."); bool success = unmap_file(ci.m_cachefile, &ci.m_fd, &ci.m_buffer, ci.m_buffer_size, &ci.m_buffer_watermark); ci.m_buffer_pos = 0; ci.m_buffer_size = 0; if (success && m_cur_open > 0) { --m_cur_open; // track open files } return success; } bool Buffer::init(bool erase_cache) { std::lock_guard lock_mutex(m_mutex); if (is_open()) { return true; } bool success = true; try { if ((virtualfile()->m_flags & VIRTUALFLAG_HLS)) { // HLS format: create several segments if (virtualfile()->get_segment_count()) { m_ci.resize(virtualfile()->get_segment_count()); for (uint32_t segment_no = 1; segment_no <= virtualfile()->get_segment_count(); segment_no++) { make_cachefile_name(&m_ci[segment_no - 1].m_cachefile, filename() + "." + make_filename(segment_no, params.current_format(virtualfile())->fileext()), params.current_format(virtualfile())->fileext(), false); } } else { Logging::error(filename(), "INTERNAL ERROR: Buffer::init()! Segment count is 0."); errno = EINVAL; throw false; } } else { // All other formats: create just a single segment. m_ci.resize(1); make_cachefile_name(&m_ci[0].m_cachefile, filename(), params.current_format(virtualfile())->fileext(), false); if ((virtualfile()->m_flags & VIRTUALFLAG_FRAME)) { // Create extra index cash for frame sets only make_cachefile_name(&m_ci[0].m_cachefile_idx, filename(), params.current_format(virtualfile())->fileext(), true); } } // Set current segment m_cur_ci = &m_ci[0]; // Create the path to the cache file. All paths are the same, so this is required only once. std::shared_ptr cachefiletmp = new_strdup(m_ci[0].m_cachefile); if (cachefiletmp == nullptr) { Logging::error(m_ci[0].m_cachefile, "Error opening the cache file: out of memory."); errno = ENOMEM; throw false; } if (mktree(dirname(cachefiletmp.get()), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) && errno != EEXIST) { Logging::error(m_ci[0].m_cachefile, "Error creating cache directory: (%1) %2", errno, strerror(errno)); throw false; } errno = 0; // reset EEXIST, error can safely be ignored here #if __cplusplus >= 202002L // C++20 (and later) code for (uint32_t index = 0; CACHEINFO & ci : m_ci) #else uint32_t index = 0; for (CACHEINFO & ci : m_ci) #endif { ci.reset(); if (erase_cache) { remove_cachefile(index + 1); errno = 0; // ignore this error } index++; } // Index only required for frame sets and there is only one. if (!m_ci[0].m_cachefile_idx.empty()) { if (virtualfile()->m_video_frame_count == 0) { errno = EINVAL; Logging::error(m_ci[0].m_cachefile, "INTERNAL ERROR: Buffer::init()! Frame count is zero (%1) %2", errno, strerror(errno)); throw false; } static_assert(sizeof(IMAGE_FRAME) == 32, "sizeof(IMAGE_FRAME) must be 32 bytes"); size_t filesize = 0; bool isdefaultsize = false; uint8_t *p = nullptr; if (!map_file(m_ci[0].m_cachefile_idx, &m_ci[0].m_fd_idx, &p, &filesize, &isdefaultsize, sizeof(IMAGE_FRAME) * virtualfile()->m_video_frame_count, false)) { throw false; } m_ci[0].m_buffer_size_idx = filesize; m_ci[0].m_buffer_idx = static_cast(p); } } catch (bool _success) { success = _success; if (!success) { for (CACHEINFO & ci : m_ci) { ci.reset(); } } } return success; } bool Buffer::set_segment(uint32_t segment_no, size_t size) { std::lock_guard lock_mutex(m_mutex); if (!segment_no || segment_no > segment_count()) { errno = EINVAL; return false; } if (!close_file(current_segment_no(), CACHE_FLAG_RW)) { return false; } if (!open_file(segment_no, CACHE_FLAG_RW, size)) { return false; } m_cur_ci = &m_ci[segment_no - 1]; // Reserve enough buffer space for segment to avoid frequent resizes return reserve(size); } uint32_t Buffer::segment_count() { std::lock_guard lock_mutex(m_mutex); return static_cast(m_ci.size()); } uint32_t Buffer::current_segment_no() { std::lock_guard lock_mutex(m_mutex); if (!segment_count() || m_cur_ci == nullptr) { return 0; } return static_cast(m_cur_ci - &m_ci[0]) + 1; } bool Buffer::segment_exists(uint32_t segment_no) { std::lock_guard lock_mutex(m_mutex); if (!segment_count() || m_cur_ci == nullptr) { return false; } return file_exists(m_ci[segment_no - 1].m_cachefile); } bool Buffer::map_file(const std::string & filename, volatile int *fd, uint8_t **p, size_t *filesize, bool *isdefaultsize, size_t defaultsize, bool truncate) const { bool success = true; if (!defaultsize) { Logging::trace(filename, "Mapping cache file."); } else { Logging::trace(filename, "Mapping cache file with %1.", format_size(defaultsize).c_str()); } try { struct stat sb; *fd = ::open(filename.c_str(), O_CREAT | O_RDWR | (truncate ? O_TRUNC : 0), static_cast(0644)); if (*fd == -1) { Logging::error(filename, "The cache file could not be opened due to an error: (%1) %2", errno, strerror(errno)); throw false; } if (fstat(*fd, &sb) == -1) { Logging::error(filename, "File stat failed: (%1) %2 (fd = %3)", errno, strerror(errno), *fd); throw false; } if (!S_ISREG(sb.st_mode)) { Logging::error(filename, "Not a file."); throw false; } if (!sb.st_size || defaultsize) { // If file is empty or did not exist set file size to default if (!defaultsize) { defaultsize = static_cast(sysconf(_SC_PAGESIZE)); } if (ftruncate(*fd, static_cast(defaultsize)) == -1) { Logging::error(filename, "Error calling ftruncate() to 'stretch' the file: (%1) %2 (fd = %3)", errno, strerror(errno), *fd); throw false; } *filesize = defaultsize; *isdefaultsize = true; } else { // Keep size *filesize = static_cast(sb.st_size); *isdefaultsize = false; } *p = static_cast(mmap(nullptr, *filesize, PROT_READ | PROT_WRITE, MAP_SHARED, *fd, 0)); if (*p == MAP_FAILED) { Logging::error(filename, "File mapping failed: (%1) %2 (fd = %3)", errno, strerror(errno), *fd); *p = nullptr; throw false; } } catch (bool _success) { success = _success; if (!success && *fd != -1) { ::close(*fd); *fd = -1; } } return success; } bool Buffer::unmap_file(const std::string &filename, volatile int *fd, uint8_t **p, size_t len, size_t * filesize) const { bool success = true; Logging::trace(filename, "Unmapping cache file."); void * _p = *p; size_t _filesize = *filesize; int _fd = *fd; // Clear all variables *p = nullptr; *filesize = 0; *fd = -1; if (_p != nullptr) { if (munmap(_p, len ? len : static_cast(sysconf(_SC_PAGESIZE))) == -1) // Make sure we do not unmap a zero size file (spits EINVAL error) { Logging::error(filename, "Unmapping cache file failed: (%1) %2 Size: %3", errno, strerror(errno), len); success = false; } } if (_fd != -1) { if (_filesize) { if (ftruncate(_fd, static_cast(_filesize)) == -1) { Logging::error(filename, "Error calling ftruncate() to resize and close the cache file: (%1) %2 (fd = %3) Size: %5", errno, strerror(errno), _fd, _filesize); success = false; } ::close(_fd); } else { ::close(_fd); if (unlink(filename.c_str()) && errno != ENOENT) // Ignore if file does not exist { Logging::error(filename, "Error removing the cache file: (%1) %2 (fd = %3)", errno, strerror(errno), _fd); success = false; } } } return success; } bool Buffer::release(int flags /*= CACHE_CLOSE_NOOPT*/) { std::lock_guard lock_mutex(m_mutex); bool success = true; if (!is_open()) { if (CACHE_CHECK_BIT(CACHE_CLOSE_DELETE, flags)) { for (uint32_t n = 1; n <= segment_count(); n++) { remove_cachefile(n); } errno = 0; // ignore this error } return true; } // Write active cache to disk flush(); // Close anything that's still open for (uint32_t index = 0; index < segment_count(); index++) { if (!close_file(index + 1, CACHE_FLAG_RO | CACHE_FLAG_RW)) { success = false; } if (CACHE_CHECK_BIT(CACHE_CLOSE_DELETE, flags)) { remove_cachefile(index + 1); errno = 0; // ignore this error } } // Remove index for frame sets. There is only one. if (!m_ci[0].m_cachefile_idx.empty()) { if (!unmap_file(m_ci[0].m_cachefile_idx, &m_ci[0].m_fd_idx, &m_ci[0].m_buffer_idx, m_ci[0].m_buffer_size_idx, &m_ci[0].m_buffer_size_idx)) { success = false; } } return success; } bool Buffer::remove_cachefile(uint32_t segment_no) const { const CACHEINFO & ci = !segment_no ? *m_cur_ci : m_ci[segment_no - 1]; bool success = remove_file(ci.m_cachefile); if (!ci.m_cachefile_idx.empty()) { if (!remove_file(ci.m_cachefile_idx)) { success = false; } } return success; } bool Buffer::flush() { std::lock_guard lock_mutex(m_mutex); if (!segment_count() || m_cur_ci == nullptr || m_cur_ci->m_buffer == nullptr) { errno = EPERM; return false; } if (msync(m_cur_ci->m_buffer, m_cur_ci->m_buffer_size, MS_SYNC) == -1) { Logging::error(m_cur_ci->m_cachefile, "Could not sync to disk: (%1) %2", errno, strerror(errno)); return false; } if (m_cur_ci->m_buffer_idx != nullptr) { if (msync(m_cur_ci->m_buffer_idx, m_cur_ci->m_buffer_size_idx, MS_SYNC) == -1) { Logging::error(m_cur_ci->m_cachefile_idx, "Could not sync to disk: (%1) %2", errno, strerror(errno)); return false; } } return true; } bool Buffer::clear() { std::lock_guard lock_mutex(m_mutex); bool success = true; for (CACHEINFO & ci : m_ci) { ci.m_buffer_pos = 0; ci.m_buffer_watermark = 0; ci.m_buffer_size = 0; ci.m_seg_finished = false; ci.m_buffer_write_size = 0; ci.m_buffer_writes = 0; if (ci.m_fd != -1) { // If empty set file size to 1 page long filesize = sysconf(_SC_PAGESIZE); if (ftruncate(ci.m_fd, filesize) == -1) { Logging::error(ci.m_cachefile, "Error calling ftruncate() to clear the file: (%1) %2 (fd = %3)", errno, strerror(errno), ci.m_fd); success = false; } } else { remove_file(ci.m_cachefile); } if (ci.m_fd_idx != -1) { std::memset(ci.m_buffer_idx, 0, ci.m_buffer_size_idx); } } return success; } bool Buffer::reserve(size_t size) { std::lock_guard lock_mutex(m_mutex); if (m_cur_ci == nullptr) { errno = ENOMEM; Logging::error(nullptr, "INTERNAL ERROR: Buffer::reserve() - m_cur_ci == nullptr!"); return false; } if (m_cur_ci->m_buffer == nullptr) { errno = ENOMEM; Logging::error(nullptr, "INTERNAL ERROR: Buffer::reserve() - m_cur_ci->m_buffer == nullptr!"); return false; } if (m_cur_ci->m_buffer_size >= size) { // Do not shrink return true; } m_cur_ci->m_buffer = static_cast(mremap(m_cur_ci->m_buffer, m_cur_ci->m_buffer_size, size, MREMAP_MAYMOVE)); if (m_cur_ci->m_buffer == MAP_FAILED) { Logging::error(m_cur_ci->m_cachefile, "Error calling mremap() to resize the file: (%1) %2 (fd = %3) Old size: %4 New: %5", errno, strerror(errno), m_cur_ci->m_fd, m_cur_ci->m_buffer_size, size); m_cur_ci->m_buffer = nullptr; return false; } // Save size m_cur_ci->m_buffer_size = size; if (ftruncate(m_cur_ci->m_fd, static_cast(m_cur_ci->m_buffer_size)) == -1) { Logging::error(m_cur_ci->m_cachefile, "Error calling ftruncate() to resize the file: (%1) %2 (fd = %3)", errno, strerror(errno), m_cur_ci->m_fd); return false; } return true; } size_t Buffer::writeio(const uint8_t* data, size_t length) { std::lock_guard lock_mutex(m_mutex); if (m_cur_ci == nullptr || m_cur_ci->m_buffer == nullptr) { errno = ENOMEM; return 0; } uint8_t* write_ptr = write_prepare(length); if (write_ptr == nullptr) { length = 0; } else { m_cur_ci->m_buffer_write_size += length; m_cur_ci->m_buffer_writes++; std::memcpy(write_ptr, data, length); increment_pos(length); } return length; } size_t Buffer::write_frame(const uint8_t *data, size_t length, uint32_t frame_no) { std::lock_guard lock_mutex(m_mutex); if (data == nullptr || m_cur_ci == nullptr || m_cur_ci->m_buffer_idx == nullptr || frame_no < 1 || frame_no > virtualfile()->m_video_frame_count) { // Invalid parameter errno = EINVAL; return 0; } LPIMAGE_FRAME old_image_frame; IMAGE_FRAME new_image_frame; size_t bytes_written; size_t start = static_cast(frame_no - 1) * sizeof(IMAGE_FRAME); old_image_frame = reinterpret_cast(m_cur_ci->m_buffer_idx + start); if (old_image_frame->m_frame_no && (old_image_frame->m_size <= static_cast(length))) { // Frame already exists and has enough space old_image_frame->m_size = static_cast(length); // Write image seek(static_cast(old_image_frame->m_offset), SEEK_SET); bytes_written = writeio(data, old_image_frame->m_size); if (bytes_written != old_image_frame->m_size) { return 0; } } else { // Create new frame if not existing or not enough space std::memset(&new_image_frame, 0xFF, sizeof(new_image_frame)); std::memcpy(new_image_frame.m_tag.data(), IMAGE_FRAME_TAG, sizeof(new_image_frame.m_tag)); new_image_frame.m_frame_no = frame_no; new_image_frame.m_offset = buffer_watermark(); new_image_frame.m_size = static_cast(length); // Write image seek(static_cast(new_image_frame.m_offset), SEEK_SET); bytes_written = writeio(data, new_image_frame.m_size); if (bytes_written != new_image_frame.m_size) { return 0; } std::memcpy(reinterpret_cast(m_cur_ci->m_buffer_idx + start), &new_image_frame, sizeof(IMAGE_FRAME)); } return bytes_written; } uint8_t* Buffer::write_prepare(size_t length) { if (reallocate(m_cur_ci->m_buffer_pos + length)) { if (m_cur_ci->m_buffer_watermark < m_cur_ci->m_buffer_pos + length) { m_cur_ci->m_buffer_watermark = m_cur_ci->m_buffer_pos + length; } return m_cur_ci->m_buffer + m_cur_ci->m_buffer_pos; } else { errno = ESPIPE; return nullptr; } } void Buffer::increment_pos(size_t increment) { m_cur_ci->m_buffer_pos += increment; } int Buffer::seek(int64_t offset, int whence) { return seek(offset, whence, 0); } int Buffer::seek(int64_t offset, int whence, uint32_t segment_no) { LPCACHEINFO ci = cacheinfo(segment_no); if (ci == nullptr || ci->m_buffer == nullptr) { errno = ENOMEM; return (EOF); } off_t seek_pos; switch (whence) { case SEEK_SET: { seek_pos = offset; break; } case SEEK_CUR: { seek_pos = static_cast(tell(segment_no)) + offset; break; } case SEEK_END: { seek_pos = static_cast(size(segment_no)) + offset; break; } default: { errno = EINVAL; return (EOF); } } if (seek_pos > static_cast(size(segment_no))) { ci->m_buffer_pos = size(segment_no); // Cannot go beyond EOF. Set position to end, leave errno untouched. return 0; } if (seek_pos < 0) // Cannot go before head, leave position untouched, set errno. { errno = EINVAL; return (EOF); } ci->m_buffer_pos = static_cast(seek_pos); return 0; } size_t Buffer::tell() const { return tell(0); } size_t Buffer::tell(uint32_t segment_no) const { LPCCACHEINFO ci = const_cacheinfo(segment_no); if (ci == nullptr) { errno = EBADF; return 0; } return ci->m_buffer_pos; } int64_t Buffer::duration() const { return AV_NOPTS_VALUE; // not applicable } size_t Buffer::size() const { return size(0); } size_t Buffer::size(uint32_t segment_no) const { LPCCACHEINFO ci = const_cacheinfo(segment_no); if (ci == nullptr) { errno = EBADF; return 0; } return ci->m_buffer_size; } size_t Buffer::buffer_watermark(uint32_t segment_no) const { LPCCACHEINFO ci = const_cacheinfo(segment_no); if (ci == nullptr) { errno = EBADF; return 0; } return ci->m_buffer_watermark; } bool Buffer::copy(std::vector * out_data, size_t offset, uint32_t segment_no) { return copy(out_data->data(), offset, out_data->size(), segment_no); } bool Buffer::copy(uint8_t* out_data, size_t offset, size_t bufsize, uint32_t segment_no) { std::lock_guard lock_mutex(m_mutex); LPCCACHEINFO ci = const_cacheinfo(segment_no); if (ci == nullptr) { errno = EBADF; return false; } if (ci->m_buffer == nullptr) { errno = ENOMEM; return false; } size_t segment_size = ci->m_buffer_size; if (!segment_size && errno) { Logging::error(ci->m_cachefile, "INTERNAL ERROR: Buffer::copy()! size(segment_no) returned error. Segment: %1 (%2) %3", segment_no, errno, strerror(errno)); return false; } if (segment_size > offset) { if (segment_size < offset + bufsize) { bufsize = segment_size - offset - 1; } std::memcpy(out_data, ci->m_buffer + offset, bufsize); return true; } else { Logging::error(ci->m_cachefile, "INTERNAL ERROR: Buffer::copy()! segment_size <= offset - Segment: %1 Segment Size: %2 Offset: %3", segment_no, segment_size, offset); errno = ESPIPE; return false; } } bool Buffer::reallocate(size_t newsize) { if (newsize > size()) { if (m_cur_ci->m_buffer_writes) { size_t alloc_size = newsize - size(); size_t write_avg = m_cur_ci->m_buffer_write_size / m_cur_ci->m_buffer_writes; size_t write_size = PREALLOC_FACTOR * write_avg; if (write_size > alloc_size) { alloc_size = write_size; newsize = size() + alloc_size; } } Logging::trace(filename(), "Buffer reallocate: %1 -> %2 (Diff %3).", size(), newsize, newsize - size()); if (!reserve(newsize)) { return false; } } return true; } const std::string & Buffer::cachefile(uint32_t segment_no) const { LPCCACHEINFO ci = const_cacheinfo(segment_no); if (ci == nullptr) { static std::string empty; errno = EBADF; return empty; } return ci->m_cachefile; } const std::string & Buffer::make_cachefile_name(std::string * cachefile, const std::string & filename, const std::string & fileext, bool is_idx) { transcoder_cache_path(cachefile); *cachefile += params.m_mountpath; *cachefile += filename; if (is_idx) { *cachefile += ".idx."; } else { *cachefile += ".cache."; } *cachefile += fileext; return *cachefile; } bool Buffer::remove_file(const std::string & filename) { if (unlink(filename.c_str()) && errno != ENOENT) { Logging::warning(filename, "Cannot unlink the file: (%1) %2", errno, strerror(errno)); return false; } else { errno = 0; return true; } } size_t Buffer::readio(void * /*data*/, size_t /*size*/) { // Not implemented errno = EPERM; return 0; } size_t Buffer::read_frame(std::vector * data, uint32_t frame_no) { std::lock_guard lock_mutex(m_mutex); if (data == nullptr || m_cur_ci->m_buffer_idx == nullptr || frame_no < 1 || frame_no > virtualfile()->m_video_frame_count) { // Invalid parameter errno = EINVAL; return 0; } LPCIMAGE_FRAME image_frame; size_t start = static_cast(frame_no - 1) * sizeof(IMAGE_FRAME); image_frame = reinterpret_cast(m_cur_ci->m_buffer_idx + start); if (!image_frame->m_frame_no) { errno = EAGAIN; return 0; } data->resize(image_frame->m_size); return copy(data, static_cast(image_frame->m_offset)); } int Buffer::error() const { return errno; } bool Buffer::eof() const { return eof(0); } bool Buffer::eof(uint32_t segment_no) const { return (tell(segment_no) == size(segment_no)); } void Buffer::closeio() { release(); } bool Buffer::have_frame(uint32_t frame_no) { std::lock_guard lock_mutex(m_mutex); if (m_cur_ci->m_buffer_idx == nullptr || frame_no < 1 || frame_no > virtualfile()->m_video_frame_count) { // Invalid parameter errno = EINVAL; return false; } LPCIMAGE_FRAME image_frame; size_t start = static_cast(frame_no - 1) * sizeof(IMAGE_FRAME); image_frame = reinterpret_cast(m_cur_ci->m_buffer_idx + start); return (image_frame->m_frame_no ? true : false); } bool Buffer::is_open() { std::lock_guard lock_mutex(m_mutex); for (const CACHEINFO & ci : m_ci) { if ((ci.m_fd != -1 && (fcntl(ci.m_fd, F_GETFL) != -1 || errno != EBADF))) { return true; } } return false; } void Buffer::finished_segment() { if (m_cur_ci == nullptr) { return; } m_cur_ci->m_seg_finished = true; flush(); } bool Buffer::is_segment_finished(uint32_t segment_no) const { LPCCACHEINFO ci = const_cacheinfo(segment_no); if (ci == nullptr) { errno = EBADF; return false; } return ci->m_seg_finished; } Buffer::LPCACHEINFO Buffer::cacheinfo(uint32_t segment_no) { if (segment_no) { segment_no--; if (segment_no >= segment_count()) { return nullptr; } return (&m_ci[segment_no]); } return m_cur_ci; } Buffer::LPCCACHEINFO Buffer::const_cacheinfo(uint32_t segment_no) const { if (segment_no) { segment_no--; if (segment_no >= m_ci.size()) { return nullptr; } return (&m_ci[segment_no]); } return m_cur_ci; } ffmpegfs-2.18/src/Makefile.in0000644000000000000000000007353115166201636013003 00000000000000# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = ffmpegfs$(EXEEXT) # DVD support: requires both libdbdnav and libdvdread @USE_LIBDVD_TRUE@am__append_1 = -DUSE_LIBDVD $(libdvdnav_CFLAGS) \ @USE_LIBDVD_TRUE@ $(libdvdread_CFLAGS) @USE_LIBDVD_TRUE@am__append_2 = dvdio.cc dvdio.h dvdparser.cc dvdparser.h @USE_LIBDVD_TRUE@am__append_3 = $(libdvdnav_LIBS) $(libdvdread_LIBS) # Blu-ray support: requires libbluray @USE_LIBBLURAY_TRUE@am__append_4 = -DUSE_LIBBLURAY $(libbluray_CFLAGS) @USE_LIBBLURAY_TRUE@am__append_5 = blurayio.cc blurayio.h blurayparser.cc blurayparser.h @USE_LIBBLURAY_TRUE@am__append_6 = $(libbluray_LIBS) # VCD support: uses internal code @USE_LIBVCD_TRUE@am__append_7 = -DUSE_LIBVCD $(libvcd_CFLAGS) @USE_LIBVCD_TRUE@am__append_8 = vcdio.cc vcdio.h vcdparser.cc vcdparser.h vcd/vcdchapter.cc vcd/vcdchapter.h vcd/vcdentries.cc vcd/vcdentries.h vcd/vcdinfo.cc vcd/vcdinfo.h vcd/vcdutils.cc vcd/vcdutils.h subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__ffmpegfs_SOURCES_DIST = ffmpegfs.cc ffmpegfs.h fuseops.cc \ transcode.cc transcode.h cache.cc cache.h buffer.cc buffer.h \ logging.cc logging.h cache_entry.cc cache_entry.h \ cache_maintenance.cc cache_maintenance.h id3v1tag.h aiff.h \ wave.h cuesheetparser.cc cuesheetparser.h diskio.cc diskio.h \ fileio.cc fileio.h ffmpeg_compat.h ffmpeg_profiles.h \ thread_pool.cc thread_pool.h ffmpeg_base.cc ffmpeg_base.h \ ffmpeg_transcoder.cc ffmpeg_transcoder.h ffmpeg_utils.cc \ ffmpeg_utils.h ffmpeg_profiles.cc ffmpeg_frame.h \ ffmpeg_frame.cc ffmpeg_subtitle.h ffmpeg_subtitle.cc dvdio.cc \ dvdio.h dvdparser.cc dvdparser.h blurayio.cc blurayio.h \ blurayparser.cc blurayparser.h vcdio.cc vcdio.h vcdparser.cc \ vcdparser.h vcd/vcdchapter.cc vcd/vcdchapter.h \ vcd/vcdentries.cc vcd/vcdentries.h vcd/vcdinfo.cc \ vcd/vcdinfo.h vcd/vcdutils.cc vcd/vcdutils.h @USE_LIBDVD_TRUE@am__objects_1 = dvdio.$(OBJEXT) dvdparser.$(OBJEXT) @USE_LIBBLURAY_TRUE@am__objects_2 = blurayio.$(OBJEXT) \ @USE_LIBBLURAY_TRUE@ blurayparser.$(OBJEXT) am__dirstamp = $(am__leading_dot)dirstamp @USE_LIBVCD_TRUE@am__objects_3 = vcdio.$(OBJEXT) vcdparser.$(OBJEXT) \ @USE_LIBVCD_TRUE@ vcd/vcdchapter.$(OBJEXT) \ @USE_LIBVCD_TRUE@ vcd/vcdentries.$(OBJEXT) \ @USE_LIBVCD_TRUE@ vcd/vcdinfo.$(OBJEXT) vcd/vcdutils.$(OBJEXT) am_ffmpegfs_OBJECTS = ffmpegfs.$(OBJEXT) fuseops.$(OBJEXT) \ transcode.$(OBJEXT) cache.$(OBJEXT) buffer.$(OBJEXT) \ logging.$(OBJEXT) cache_entry.$(OBJEXT) \ cache_maintenance.$(OBJEXT) cuesheetparser.$(OBJEXT) \ diskio.$(OBJEXT) fileio.$(OBJEXT) thread_pool.$(OBJEXT) \ ffmpeg_base.$(OBJEXT) ffmpeg_transcoder.$(OBJEXT) \ ffmpeg_utils.$(OBJEXT) ffmpeg_profiles.$(OBJEXT) \ ffmpeg_frame.$(OBJEXT) ffmpeg_subtitle.$(OBJEXT) \ $(am__objects_1) $(am__objects_2) $(am__objects_3) ffmpegfs_OBJECTS = $(am_ffmpegfs_OBJECTS) am__DEPENDENCIES_1 = @USE_LIBDVD_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) @USE_LIBBLURAY_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) ffmpegfs_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/blurayio.Po \ ./$(DEPDIR)/blurayparser.Po ./$(DEPDIR)/buffer.Po \ ./$(DEPDIR)/cache.Po ./$(DEPDIR)/cache_entry.Po \ ./$(DEPDIR)/cache_maintenance.Po ./$(DEPDIR)/cuesheetparser.Po \ ./$(DEPDIR)/diskio.Po ./$(DEPDIR)/dvdio.Po \ ./$(DEPDIR)/dvdparser.Po ./$(DEPDIR)/ffmpeg_base.Po \ ./$(DEPDIR)/ffmpeg_frame.Po ./$(DEPDIR)/ffmpeg_profiles.Po \ ./$(DEPDIR)/ffmpeg_subtitle.Po \ ./$(DEPDIR)/ffmpeg_transcoder.Po ./$(DEPDIR)/ffmpeg_utils.Po \ ./$(DEPDIR)/ffmpegfs.Po ./$(DEPDIR)/fileio.Po \ ./$(DEPDIR)/fuseops.Po ./$(DEPDIR)/logging.Po \ ./$(DEPDIR)/thread_pool.Po ./$(DEPDIR)/transcode.Po \ ./$(DEPDIR)/vcdio.Po ./$(DEPDIR)/vcdparser.Po \ vcd/$(DEPDIR)/vcdchapter.Po vcd/$(DEPDIR)/vcdentries.Po \ vcd/$(DEPDIR)/vcdinfo.Po vcd/$(DEPDIR)/vcdutils.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ffmpegfs_SOURCES) DIST_SOURCES = $(am__ffmpegfs_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/config/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CURL = @CURL@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOXYGEN = @DOXYGEN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ EXTRA_VERSION = @EXTRA_VERSION@ GRAPHVIZ = @GRAPHVIZ@ HAVE_A2X = @HAVE_A2X@ HAVE_W3M = @HAVE_W3M@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ W3M = @W3M@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ chardet_CFLAGS = @chardet_CFLAGS@ chardet_LIBS = @chardet_LIBS@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ fuse3_CFLAGS = @fuse3_CFLAGS@ fuse3_LIBS = @fuse3_LIBS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libavcodec_CFLAGS = @libavcodec_CFLAGS@ libavcodec_LIBS = @libavcodec_LIBS@ libavfilter_CFLAGS = @libavfilter_CFLAGS@ libavfilter_LIBS = @libavfilter_LIBS@ libavformat_CFLAGS = @libavformat_CFLAGS@ libavformat_LIBS = @libavformat_LIBS@ libavutil_CFLAGS = @libavutil_CFLAGS@ libavutil_LIBS = @libavutil_LIBS@ libbluray_CFLAGS = @libbluray_CFLAGS@ libbluray_LIBS = @libbluray_LIBS@ libcue_CFLAGS = @libcue_CFLAGS@ libcue_LIBS = @libcue_LIBS@ libdir = @libdir@ libdvdread_CFLAGS = @libdvdread_CFLAGS@ libdvdread_LIBS = @libdvdread_LIBS@ libexecdir = @libexecdir@ libswresample_CFLAGS = @libswresample_CFLAGS@ libswresample_LIBS = @libswresample_LIBS@ libswscale_CFLAGS = @libswscale_CFLAGS@ libswscale_LIBS = @libswscale_LIBS@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sqlite3_CFLAGS = @sqlite3_CFLAGS@ sqlite3_LIBS = @sqlite3_LIBS@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = $(wildcard scripts/*) # Add fuse3 # Add libchardet AM_CPPFLAGS = $(fuse3_CFLAGS) -D_FILE_OFFSET_BITS=64 \ $(libavcodec_CFLAGS) $(libavutil_CFLAGS) $(libavformat_CFLAGS) \ $(libswscale_CFLAGS) $(libavfilter_CFLAGS) \ $(libswresample_CFLAGS) $(chardet_CFLAGS) $(am__append_1) \ $(am__append_4) $(am__append_7) ffmpegfs_SOURCES = ffmpegfs.cc ffmpegfs.h fuseops.cc transcode.cc \ transcode.h cache.cc cache.h buffer.cc buffer.h logging.cc \ logging.h cache_entry.cc cache_entry.h cache_maintenance.cc \ cache_maintenance.h id3v1tag.h aiff.h wave.h cuesheetparser.cc \ cuesheetparser.h diskio.cc diskio.h fileio.cc fileio.h \ ffmpeg_compat.h ffmpeg_profiles.h thread_pool.cc thread_pool.h \ ffmpeg_base.cc ffmpeg_base.h ffmpeg_transcoder.cc \ ffmpeg_transcoder.h ffmpeg_utils.cc ffmpeg_utils.h \ ffmpeg_profiles.cc ffmpeg_frame.h ffmpeg_frame.cc \ ffmpeg_subtitle.h ffmpeg_subtitle.cc $(am__append_2) \ $(am__append_5) $(am__append_8) # Add sqlite3 ffmpegfs_LDADD = $(libcue_LIBS) $(fuse3_LIBS) -lrt -lstdc++fs \ $(libavcodec_LIBS) $(libavutil_LIBS) $(libavformat_LIBS) \ $(libswscale_LIBS) $(libavfilter_LIBS) $(libswresample_LIBS) \ $(sqlite3_LIBS) $(chardet_LIBS) $(am__append_3) \ $(am__append_6) # Add conversion of manpages source. Will be used in binary. BUILT_SOURCES = ../ffmpegfs.1.text ffmpegfshelp.h all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cc .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) vcd/$(am__dirstamp): @$(MKDIR_P) vcd @: > vcd/$(am__dirstamp) vcd/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) vcd/$(DEPDIR) @: > vcd/$(DEPDIR)/$(am__dirstamp) vcd/vcdchapter.$(OBJEXT): vcd/$(am__dirstamp) \ vcd/$(DEPDIR)/$(am__dirstamp) vcd/vcdentries.$(OBJEXT): vcd/$(am__dirstamp) \ vcd/$(DEPDIR)/$(am__dirstamp) vcd/vcdinfo.$(OBJEXT): vcd/$(am__dirstamp) \ vcd/$(DEPDIR)/$(am__dirstamp) vcd/vcdutils.$(OBJEXT): vcd/$(am__dirstamp) \ vcd/$(DEPDIR)/$(am__dirstamp) ffmpegfs$(EXEEXT): $(ffmpegfs_OBJECTS) $(ffmpegfs_DEPENDENCIES) $(EXTRA_ffmpegfs_DEPENDENCIES) @rm -f ffmpegfs$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ffmpegfs_OBJECTS) $(ffmpegfs_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f vcd/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blurayio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blurayparser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_entry.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_maintenance.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cuesheetparser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dvdio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dvdparser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffmpeg_base.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffmpeg_frame.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffmpeg_profiles.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffmpeg_subtitle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffmpeg_transcoder.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffmpeg_utils.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffmpegfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuseops.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logging.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread_pool.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transcode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdparser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@vcd/$(DEPDIR)/vcdchapter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@vcd/$(DEPDIR)/vcdentries.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@vcd/$(DEPDIR)/vcdinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@vcd/$(DEPDIR)/vcdutils.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) config.h installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f vcd/$(DEPDIR)/$(am__dirstamp) -rm -f vcd/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/blurayio.Po -rm -f ./$(DEPDIR)/blurayparser.Po -rm -f ./$(DEPDIR)/buffer.Po -rm -f ./$(DEPDIR)/cache.Po -rm -f ./$(DEPDIR)/cache_entry.Po -rm -f ./$(DEPDIR)/cache_maintenance.Po -rm -f ./$(DEPDIR)/cuesheetparser.Po -rm -f ./$(DEPDIR)/diskio.Po -rm -f ./$(DEPDIR)/dvdio.Po -rm -f ./$(DEPDIR)/dvdparser.Po -rm -f ./$(DEPDIR)/ffmpeg_base.Po -rm -f ./$(DEPDIR)/ffmpeg_frame.Po -rm -f ./$(DEPDIR)/ffmpeg_profiles.Po -rm -f ./$(DEPDIR)/ffmpeg_subtitle.Po -rm -f ./$(DEPDIR)/ffmpeg_transcoder.Po -rm -f ./$(DEPDIR)/ffmpeg_utils.Po -rm -f ./$(DEPDIR)/ffmpegfs.Po -rm -f ./$(DEPDIR)/fileio.Po -rm -f ./$(DEPDIR)/fuseops.Po -rm -f ./$(DEPDIR)/logging.Po -rm -f ./$(DEPDIR)/thread_pool.Po -rm -f ./$(DEPDIR)/transcode.Po -rm -f ./$(DEPDIR)/vcdio.Po -rm -f ./$(DEPDIR)/vcdparser.Po -rm -f vcd/$(DEPDIR)/vcdchapter.Po -rm -f vcd/$(DEPDIR)/vcdentries.Po -rm -f vcd/$(DEPDIR)/vcdinfo.Po -rm -f vcd/$(DEPDIR)/vcdutils.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/blurayio.Po -rm -f ./$(DEPDIR)/blurayparser.Po -rm -f ./$(DEPDIR)/buffer.Po -rm -f ./$(DEPDIR)/cache.Po -rm -f ./$(DEPDIR)/cache_entry.Po -rm -f ./$(DEPDIR)/cache_maintenance.Po -rm -f ./$(DEPDIR)/cuesheetparser.Po -rm -f ./$(DEPDIR)/diskio.Po -rm -f ./$(DEPDIR)/dvdio.Po -rm -f ./$(DEPDIR)/dvdparser.Po -rm -f ./$(DEPDIR)/ffmpeg_base.Po -rm -f ./$(DEPDIR)/ffmpeg_frame.Po -rm -f ./$(DEPDIR)/ffmpeg_profiles.Po -rm -f ./$(DEPDIR)/ffmpeg_subtitle.Po -rm -f ./$(DEPDIR)/ffmpeg_transcoder.Po -rm -f ./$(DEPDIR)/ffmpeg_utils.Po -rm -f ./$(DEPDIR)/ffmpegfs.Po -rm -f ./$(DEPDIR)/fileio.Po -rm -f ./$(DEPDIR)/fuseops.Po -rm -f ./$(DEPDIR)/logging.Po -rm -f ./$(DEPDIR)/thread_pool.Po -rm -f ./$(DEPDIR)/transcode.Po -rm -f ./$(DEPDIR)/vcdio.Po -rm -f ./$(DEPDIR)/vcdparser.Po -rm -f vcd/$(DEPDIR)/vcdchapter.Po -rm -f vcd/$(DEPDIR)/vcdentries.Po -rm -f vcd/$(DEPDIR)/vcdinfo.Po -rm -f vcd/$(DEPDIR)/vcdutils.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check install install-am install-exec install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-hdr \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS .PRECIOUS: Makefile ../ffmpegfs.1.text: ../ffmpegfs.1.txt $(AM_V_GEN)a2x -a revnumber="$(VERSION)" \ -a revdate="$(shell date +'%B %Y')" -D ".." -f text $< # sed in makefiles is a menace so we use a helper script ffmpegfshelp.h: ../ffmpegfs.1.text $(srcdir)/makehelp.sh $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ffmpegfs-2.18/src/transcode.h0000644000000000000000000001631315166175407013072 00000000000000/* * Copyright (C) 2006-2008 David Collett @n * Copyright (C) 2008-2013 K. Henriksson @n * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * On Debian systems, the complete text of the GNU General Public License * Version 3 can be found in `/usr/share/common-licenses/GPL-3'. */ /** * @file transcode.h * @brief File transcoder interface (for use with by FUSE) * * @ingroup ffmpegfs * * @author Norbert Schlia (nschlia@oblivion-software.de) * @copyright Copyright (C) 2006-2008 David Collett @n * Copyright (C) 2008-2013 K. Henriksson @n * Copyright (C) 2017-2026 FFmpeg support by Norbert Schlia (nschlia@oblivion-software.de) */ #ifndef TRANSCODE_H #define TRANSCODE_H #pragma once #include "ffmpegfs.h" #include "fileio.h" /** * @brief Simply get encoded file size (do not create the whole encoder/decoder objects) * @param[in] virtualfile - virtual file object to open * @param[out] stbuf - stat struct filled in with the size of the cached file * @return Returns true if file was found in cache, false if not (stbuf will be unchanged) */ bool transcoder_cached_filesize(LPVIRTUALFILE virtualfile, struct stat *stbuf); /** * @brief Set the file size * @param[in] virtualfile - virtual file object to open. * @param[in] duration - duration of the file, in AV_TIME_BASE fractional seconds. * @param[in] audio_bit_rate - average bitrate of audio data (in bits per second). * @param[in] channels - number of channels (1: mono, 2: stereo, or more). * @param[in] sample_rate - number of audio samples per second. * @param[in] sample_format - Selected sample format * @param[in] video_bit_rate - average bitrate of video data (in bits per second). * @param[in] width - video width in pixels. * @param[in] height - video height in pixels. * @param[in] interleaved - true if video is interleaved, false if not. * @param[in] framerate - frame rate per second (e.g. 24, 25, 30...). * @return On error, returns false (size could not be set) or true on success. */ bool transcoder_set_filesize(LPVIRTUALFILE virtualfile, int64_t duration, BITRATE audio_bit_rate, int channels, int sample_rate, AVSampleFormat sample_format, BITRATE video_bit_rate, int width, int height, bool interleaved, const AVRational & framerate); /** * @brief Predict file size * @param[in] virtualfile - virtual file object to open * @param[in] cache_entry - corresponding cache entry * @return On error, returns false (size could not be predicted) or true on success */ bool transcoder_predict_filesize(LPVIRTUALFILE virtualfile, Cache_Entry* cache_entry = nullptr); // Functions for doing transcoding, called by main program body /** * @brief Allocate and initialise the transcoder * * Opens a file and starts the decoding thread if begin_transcode is true. * File will be scanned to detect bit rate, duration etc. only if begin_transcode is false. * * @param[in] virtualfile - virtual file object to open * @param[in] begin_transcode - if true, transcoding starts, if false file will be scanned only * @return On success, returns cache entry object. On error, returns nullptr and sets errno accordingly. */ Cache_Entry* transcoder_new(LPVIRTUALFILE virtualfile, bool begin_transcode); /** * @brief Read some bytes from the internal buffer and into the given buffer. * @note buff must be large enough to hold len number of bytes. * @note Returns number of bytes read, may be less than len bytes. * @param[in] cache_entry - corresponding cache entry * @param[out] buff - will be filled in with data read * @param[in] offset - byte offset to start reading at * @param[in] len - length of data chunk to be read. * @param[out] bytes_read - Bytes read from transcoder. * @param[in] segment_no - HLS segment file number. * @return On success, returns true. On error, returns false and sets errno accordingly. */ bool transcoder_read(Cache_Entry* cache_entry, char* buff, size_t offset, size_t len, int *bytes_read, uint32_t segment_no); /** * @brief Read one image frame from the internal buffer and into the given buffer. * @note buff must be large enough to hold len number of bytes. * @note Returns number of bytes read, may be less than len bytes. * @param[in] cache_entry - corresponding cache entry * @param[out] buff - will be filled in with data read * @param[in] offset - byte offset to start reading at * @param[in] len - length of data chunk to be read. * @param[in] frame_no - Number of frame to return. * @param[out] bytes_read - Bytes read from transcoder. * @param[in,out] virtualfile - Birtual file object of image, may be modified. * @return On success, returns true. On error, returns false and sets errno accordingly. */ bool transcoder_read_frame(Cache_Entry* cache_entry, char* buff, size_t offset, size_t len, uint32_t frame_no, int * bytes_read, LPVIRTUALFILE virtualfile); /** * @brief Free the cache entry structure. * * Call this to free the cache entry structure. @n * The structure is reference counted, after calling this function, if the cache entry is not * use by another thread, the cache entry may no longer be valid. * * @param[in] cache_entry - corresponding cache entry */ void transcoder_delete(Cache_Entry* cache_entry); /** * @brief Return size of output file, as computed by encoder. * * Returns the file size, either the predicted size (which may be inaccurate) or * the real size (which is only available once the file was completely recoded). * * @param[in] cache_entry - corresponding cache entry * @return The size of the file. Function never fails. */ size_t transcoder_get_size(Cache_Entry* cache_entry); /** * @brief Return the current watermark of the file while transcoding * * While transcoding, this value reflects the current size of the transcoded file. * This is the maximum byte offset until the file can be read so far. * * @param[in] cache_entry - corresponding cache entry * @param[in] segment_no - HLS segment file number. * @return Returns the current watermark */ size_t transcoder_buffer_watermark(Cache_Entry* cache_entry, uint32_t segment_no); /** * @brief Return the current file position in the file * @param[in] cache_entry - corresponding cache entry * @param[in] segment_no - HLS segment file number. * @return Returns the current file position */ size_t transcoder_buffer_tell(Cache_Entry* cache_entry, uint32_t segment_no); /** * @brief Exit transcoding * * Send signal to exit transcoding (ending all transcoder threads). */ void transcoder_exit(); #endif ffmpegfs-2.18/COPYING0000644000000000000000000010451515052412651011172 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ffmpegfs-2.18/aclocal.m40000644000000000000000000015542115166201635012005 00000000000000# generated automatically by aclocal 1.16.5 -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, [m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and use pkg-config. -*- Autoconf -*- # serial 12 (pkg-config-0.29.2) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.2]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurrence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES # Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.5], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.5])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_COND_IF -*- Autoconf -*- # Copyright (C) 2008-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_COND_IF # _AM_COND_ELSE # _AM_COND_ENDIF # -------------- # These macros are only used for tracing. m4_define([_AM_COND_IF]) m4_define([_AM_COND_ELSE]) m4_define([_AM_COND_ENDIF]) # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) # --------------------------------------- # If the shell condition COND is true, execute IF-TRUE, otherwise execute # IF-FALSE. Allow automake to learn about conditional instantiating macros # (the AC_CONFIG_FOOS). AC_DEFUN([AM_COND_IF], [m4_ifndef([_AM_COND_VALUE_$1], [m4_fatal([$0: no such condition "$1"])])dnl _AM_COND_IF([$1])dnl if test -z "$$1_TRUE"; then : m4_n([$2])[]dnl m4_ifval([$3], [_AM_COND_ELSE([$1])dnl else $3 ])dnl _AM_COND_ENDIF([$1])dnl fi[]dnl ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE="gmake" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl m4_ifdef([_$0_ALREADY_INIT], [m4_fatal([$0 expanded multiple times ]m4_defn([_$0_ALREADY_INIT]))], [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi AC_SUBST([CTAGS]) if test -z "$ETAGS"; then ETAGS=etags fi AC_SUBST([ETAGS]) if test -z "$CSCOPE"; then CSCOPE=cscope fi AC_SUBST([CSCOPE]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR ffmpegfs-2.18/ffmpegfs.10000644000000000000000000011076215166202011012010 00000000000000'\" t .\" Title: ffmpegfs .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: April 2026 .\" Manual: User Commands .\" Source: ffmpegfs 2.18 .\" Language: English .\" .TH "FFMPEGFS" "1" "April 2026" "ffmpegfs 2\&.18" "User Commands" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" ffmpegfs \- mounts and transcodes a multitude of formats to one of the target formats on the fly\&. .SH "SYNOPSIS" .sp \fBffmpegfs\fR [\fIOPTION\fR]\&... \fIIN_DIR\fR \fIOUT_DIR\fR .SH "DESCRIPTION" .sp The ffmpegfs(1) command will mount the directory \fIIN_DIR\fR on \fIOUT_DIR\fR\&. Thereafter, accessing \fIOUT_DIR\fR will show the contents of \fIIN_DIR\fR, with all supported media files transparently renamed and transcoded to one of the supported target formats upon access\&. .sp Supported output formats: .TS allbox tab(:); lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBFormat\fR T}:T{ .sp \fBDescription\fR T}:T{ .sp \fBAudio\fR T}:T{ .sp \fBVideo\fR T} T{ .sp AIFF T}:T{ .sp Audio Interchange File Format T}:T{ .sp T}:T{ .sp PCM 16 bit BE T} T{ .sp ALAC T}:T{ .sp Apple Lossless Audio Codec T}:T{ .sp T}:T{ .sp ALAC T} T{ .sp FLAC T}:T{ .sp Free Lossless Audio T}:T{ .sp T}:T{ .sp FLAC T} T{ .sp HLS T}:T{ .sp HTTP Live Streaming T}:T{ .sp H264 T}:T{ .sp AAC T} T{ .sp MOV T}:T{ .sp QuickTime File Format T}:T{ .sp H264 T}:T{ .sp AAC T} T{ .sp MP3 T}:T{ .sp MPEG\-2 Audio Layer III T}:T{ .sp T}:T{ .sp MP3 T} T{ .sp MP4 T}:T{ .sp MPEG\-4 T}:T{ .sp H264 T}:T{ .sp AAC T} T{ .sp OGG T}:T{ .sp T}:T{ .sp Theora T}:T{ .sp Vorbis T} T{ .sp MKV T}:T{ .sp Matroska T}:T{ .sp H264 T}:T{ .sp AAC T} T{ .sp Opus T}:T{ .sp T}:T{ .sp Opus T}:T{ .sp T} T{ .sp ProRes T}:T{ .sp Apple ProRes T}:T{ .sp ProRes T}:T{ .sp PCM 16 bit LE T} T{ .sp TS T}:T{ .sp MPEG Transport Stream T}:T{ .sp H264 T}:T{ .sp AAC T} T{ .sp WAV T}:T{ .sp Waveform Audio File Format T}:T{ .sp T}:T{ .sp PCM 16 bit LE T} T{ .sp WebM T}:T{ .sp T}:T{ .sp VP9 T}:T{ .sp Opus T} T{ .sp BMP T}:T{ .sp Video to frameset T}:T{ .sp T}:T{ .sp BMP T} T{ .sp JPG T}:T{ .sp Video to frameset T}:T{ .sp T}:T{ .sp JPEG T} T{ .sp PNG T}:T{ .sp Video to frameset T}:T{ .sp T}:T{ .sp PNG T} .TE .sp 1 .SH "OPTIONS" .sp Usage: ffmpegfs [OPTION]\&... IN_DIR OUT_DIR .sp Mount IN_DIR on OUT_DIR, converting audio and video files upon access\&. .SS "Encoding options" .PP \fB\-\-desttype\fR=TYPE, \fB\-odesttype\fR=TYPE .RS 4 Select the destination format\&. \fITYPE\fR can currently be: .sp \fBAIFF\fR, \fBALAC\fR, \fBBMP\fR, \fBFLAC\fR, \fBHLS\fR, \fBJPG\fR, \fBMOV\fR, \fBMP3\fR, \fBMP4\fR, \fBMKV\fR, \fBOGG\fR, \fBOpus\fR, \fBPNG\fR, \fBProRes\fR, \fBTS\fR, \fBWAV\fR, \fBWebM\fR\&. .sp To stream videos, \fBMP4\fR, \fBTS\fR, \fBHLS\fR, \fBOGG\fR, \fBWEBM\fR, \fBMKV\fR, or \fBMOV\fR/\fBPRORES\fR must be selected\&. .sp To use HTTP Live Streaming, set \fBHLS\fR\&. .sp When a destination \fBJPG\fR, \fBPNG\fR, or \fBBMP\fR is chosen, all frames of a video source file will be presented in a virtual directory named after the source file\&. Audio will not be available\&. .sp To use the smart transcoding feature, specify a video and audio file type, separated by a "+" sign\&. For example, \-\-desttype=mov+aiff will convert video files to Apple Quicktime MOV and audio\-only files to AIFF\&. .sp Defaults to: \fBmp4\fR .RE .PP \fB\-\-audiocodec\fR=TYPE, \fB\-oaudiocodec\fR=TYPE .RS 4 Select an audio codec\&. \fITYPE\fR depends on the destination format and can currently be: .TS allbox tab(:); lt lt lt lt lt lt lt lt lt lt lt lt. T{ \fBFormats\fR T}:T{ \fBAudio Codecs\fR T} T{ MP4 T}:T{ \fBAAC\fR, MP3 T} T{ WebM T}:T{ \fBOPUS\fR, VORBIS T} T{ MOV T}:T{ \fBAAC\fR, AC3, MP3 T} T{ MKV T}:T{ \fBAAC\fR, AC3, MP3 T} T{ TS, HLS T}:T{ \fBAAC\fR, AC3, MP3 T} .TE .sp 1 Other destination formats do not support other codecs than the default\&. .sp Defaults to: The destination format\(cqs default setting, as indicated by the first codec name in the list\&. .RE .PP \fB\-\-videocodec\fR=TYPE, \fB\-ovideocodec\fR=TYPE .RS 4 Select a video codec\&. \fITYPE\fR depends on the destination format and can currently be: .TS allbox tab(:); lt lt lt lt lt lt lt lt lt lt lt lt. T{ \fBFormats\fR T}:T{ \fBVideo Codecs\fR T} T{ MP4 T}:T{ \fBH264\fR, H265, MPEG1, MPEG2 T} T{ WebM T}:T{ \fBVP9\fR, VP8, AV1 T} T{ MOV T}:T{ \fBH264\fR, H265, MPEG1, MPEG2 T} T{ MKV T}:T{ \fBH264\fR, H265, MPEG1, MPEG2 T} T{ TS, HLS T}:T{ \fBH264\fR, H265, MPEG1, MPEG2 T} .TE .sp 1 Other destination formats do not support other codecs than the default\&. .sp Defaults to: The destination format\(cqs default setting, as indicated by the first codec name in the list\&. .RE .PP \fB\-\-autocopy\fR=OPTION, \fB\-oautocopy\fR=OPTION .RS 4 Select the auto copy option\&. \fIOPTION\fR can be: .TS allbox tab(:); lt lt lt lt lt lt lt lt lt lt. T{ \fBOFF\fR T}:T{ Never copy streams, transcode always\&. T} T{ \fBMATCH\fR T}:T{ Copy stream if target supports codec\&. T} T{ \fBMATCHLIMIT\fR T}:T{ Same as MATCH, only copy if target not larger, transcode otherwise\&. T} T{ \fBSTRICT\fR T}:T{ Copy stream if codec matches desired target, transcode otherwise\&. T} T{ \fBSTRICTLIMIT\fR T}:T{ Same as STRICT, only copy if target not larger, transcode otherwise\&. T} .TE .sp 1 This can speed up transcoding significantly as copying streams uses much less computing power as compared to transcoding\&. .sp \fBMATCH\fR copies a stream if the target supports it, e\&.g\&., an AAC audio stream will be copied to MPEG, although FFmpeg\(cqs target format is MP3 for this container\&. H264 would be copied to ProRes, although the result would be a regular MOV or MP4, not a ProRes file\&. .sp \fBSTRICT\fR would convert AAC to MP3 for MPEG or H264 to ProRes for Prores files to strictly adhere to the output format setting\&. This will create homogenous results which might prevent problems with picky playback software\&. .sp Note: When the \fB\-\-audiocodec\fR or \fB\-\-videocodec\fR option is specified, the STRICT option should be used to ensure that the chosen output codec is used in any scenario\&. MATCH would enable copy if the output format supports the input codec\&. .RE .sp Defaults to: \fBOFF\fR .PP \fB\-\-recodesame\fR=OPTION, \fB\-orecodesame\fR=OPTION .RS 4 Select recode to the same format option, \fIOPTION\fR can be: .TS allbox tab(:); lt lt lt lt. T{ \fBNO\fR T}:T{ Never recode to the same format\&. T} T{ \fBYES\fR T}:T{ Always recode to the same format\&. T} .TE .sp 1 Defaults to: \fBNO\fR .RE .PP \fB\-\-profile\fR=NAME, \fB\-oprofile\fR=NAME .RS 4 Set profile for target audience, \fINAME\fR can be: .TS allbox tab(:); lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ \fBNONE\fR T}:T{ no profile T} T{ \fBFF\fR T}:T{ optimise for Firefox T} T{ \fBEDGE\fR T}:T{ optimise for MS Edge and Internet Explorer > 11 T} T{ \fBIE\fR T}:T{ optimise for MS Edge and Internet Explorer ⇐ 11 T} T{ \fBCHROME\fR T}:T{ Google Chrome T} T{ \fBSAFARI\fR T}:T{ Apple Safari T} T{ \fBOPERA\fR T}:T{ Opera T} T{ \fBMAXTHON\fR T}:T{ Maxthon T} .TE .sp 1 \fBNote:\fR applies to the MP4 output format only, and is ignored for all other formats\&. .sp Defaults to: \fBNONE\fR .RE .PP \-\-\fBlevel\fR=NAME, \-o \fBlevel\fR=NAME .RS 4 Set level for output if available\&. \fINAME\fR can be: .TS allbox tab(:); lt lt lt lt lt lt lt lt. T{ \fBPROXY\fR T}:T{ Proxy \(en apco T} T{ \fBLT\fR T}:T{ LT \(en apcs T} T{ \fBSTANDARD\fR T}:T{ standard \(en apcn T} T{ \fBHQ\fR T}:T{ HQ \- apch T} .TE .sp 1 \fBNote:\fR applies to the MP4 output format only, and is ignored for all other formats\&. .sp Defaults to: \fBHQ\fR .RE .PP \fB\-\-include_extensions\fR=LIST, \fB\-oinclude_extensions\fR=LIST .RS 4 Set the list of file extensions to be encoded\&. \fILIST\fR can have one or more entries that are separated by commas\&. These are the only file extensions that will be transcoded\&. Can be specified numerous times and will be merged, which is required when specifying them in the fstab because commas cannot be used to separate the extensions\&. The entries support shell wildcard patterns\&. .sp Example: \-\-include_extensions=mp4,wmv to encode MPEG\-4 and Windows Media files only\&. .sp Defaults to: Encode all supported files\&. .RE .PP \fB\-\-hide_extensions\fR=LIST, \fB\-ohide_extensions\fR=LIST .RS 4 Set a list of file extensions to exclude from the output\&. \fILIST\fR can have one or more entries that are separated by commas\&. Can be specified numerous times and will be merged, which is required when specifying them in the fstab because commas cannot be used to separate the extensions\&. The entries support shell wildcard patterns\&. .sp Example: \-\-hide_extensions=jpg,png,cue to stop covers and cue sheets from showing up\&. .sp Defaults to: Show all files\&. .RE .SS "Audio Options" .PP \fB\-\-audiobitrate\fR=BITRATE, \fB\-o audiobitrate\fR=BITRATE .RS 4 Select the audio encoding bitrate\&. .sp Defaults to: \fB128 kbit\fR .sp \fBAcceptable values for \fR\fB\fIBITRATE\fR\fR\fB:\fR .sp \fBmp4:\fR 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 288, 320, 352, 384, 416, and 448 kbps\&. .sp \fBmp3:\fR For sampling frequencies of 32, 44\&.1, and 48 kHz, \fIBITRATE\fR can be among 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, and 320 kbps\&. .sp For sampling frequencies of 16, 22\&.05, and 24 kHz, \fIBITRATE\fR can be among 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, and 160 kbps\&. .sp When in doubt, it is recommended to choose a bitrate among 96, 112, 128, 160, 192, 224, 256, and 320 kbps\&. .PP \fBBITRATE\fR .RS 4 can be defined as\&... .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} n bit/s: # or #bps .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} n kbit/s: #K or #Kbps .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} n Mbit/s: #M or #Mbps .RE .RE .RE .PP \fB\-\-audiosamplerate\fR=SAMPLERATE, \fB\-o audiosamplerate\fR=SAMPLERATE .RS 4 This limits the output sample rate to \fISAMPLERATE\fR\&. If the source file sample rate is higher, it will be downsampled automatically\&. .sp Typical values are 8000, 11025, 22050, 44100, 48000, 96000, and 192000\&. .sp If the target codec does not support the selected sample rate, the next matching rate will be chosen (e\&.g\&. if 24K is selected but only 22\&.05 or 44\&.1 KHz is supported, 22\&.05 KHz will be set)\&. .sp Set to 0 to keep the source rate\&. .sp Defaults to: \fB44\&.1 kHz\fR .PP \fBSAMPLERATE\fR .RS 4 can be defined as\&... .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} In Hz: # or #Hz .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} In kHz: #K or #KHz .RE .RE .RE .PP \fB\-\-audiochannels\fR=CHANNELS, \fB\-o audiochannels\fR=CHANNELS .RS 4 This limits the number of output channels to \fICHANNELS\fR\&. If the source has more channels, the number will be reduced to this limit\&. .sp Typical values are 1, 2 or 6 (e\&.g\&., 5\&.1) channels\&. .sp If the target codec does not support the selected number of channels, transcoding may fail\&. .sp Set to 0 to keep the number of channels\&. .sp Defaults to: \fB2 channels (stereo)\fR .RE .PP \fB\-\-audiosamplefmt\fR=SAMPLEFMT, \fB\-o audiosamplefmt\fR=SAMPLEFMT .RS 4 This sets a sample format\&. \fISAMPLEFMT\fR can be: .sp 0 to use the predefined setting; 8, 16, 32, 64 for integer format, F16, F32, F64 for floating point\&. .sp Not all formats are supported by all destination types\&. Selecting an invalid format will be reported as a command line error and a list of values printed\&. .TS allbox tab(:); lt lt lt lt lt lt lt lt lt lt. T{ \fBContainer Format\fR T}:T{ \fBSample Format\fR T} T{ \fBAIFF\fR T}:T{ 0, 16, 32 T} T{ \fBALAC\fR T}:T{ 0, 16, 24 T} T{ \fBWAV\fR T}:T{ 0, 8, 16, 32, 64, F16, F32, F64 T} T{ \fBFLAC\fR T}:T{ 0, 16, 24 T} .TE .sp 1 Defaults to: 0 (Use the same as the source or the predefined format of the destination if the source format is not possible\&.) .RE .SS "Video Options" .PP \fB\-\-videobitrate\fR=BITRATE, \fB\-o videobitrate\fR=BITRATE .RS 4 This sets the video encoding bit rate\&. Setting this too high or too low may cause transcoding to fail\&. .sp Defaults to: \fB2 Mbit\fR .sp \fBmp4:\fR May be specified as 500 to 25,000 kbps\&. .PP \fBBITRATE\fR .RS 4 can be defined as\&... .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} n bit/s: # or #bps .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} n kbit/s: #K or #Kbps .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} n Mbit/s: #M or #Mbps .RE .RE .RE .PP \fB\-\-videoheight\fR=HEIGHT, \-o \fBvideoheight\fR=HEIGHT .RS 4 This sets the height of the transcoded video\&. .sp When the video is rescaled, the aspect ratio is preserved if \-\-width is not set at the same time\&. .sp Defaults to: \fBkeep source video height\fR .RE .PP \fB\-\-videowidth\fR=WIDTH, \-o \fBvideowidth\fR=WIDTH .RS 4 This sets the width of the transcoded video\&. .sp When the video is rescaled, the aspect ratio is preserved if \-\-height is not set at the same time\&. .sp Defaults to: \fBkeep source video width\fR .RE .PP \fB\-\-deinterlace\fR, \-o \fBdeinterlace\fR .RS 4 Deinterlace video if necessary while transcoding\&. .sp This may need a higher bit rate, but this will increase picture quality when streaming via HTML5\&. .sp Defaults to: "no deinterlace" .RE .SS "HLS Options" .PP \fB\-\-segment_duration\fR, \-o \fBsegment_duration\fR .RS 4 Set the duration of one video segment of the HLS stream\&. This argument is a floating point value, e\&.g\&., it can be set to 2\&.5 for 2500 milliseconds\&. .sp Should normally be left as the default\&. .sp \fBNote:\fR This applies to the HLS output format only, and is ignored for all other formats\&. .sp Defaults to: \fB10 seconds\fR .RE .PP \fB\-\-min_seek_time_diff\fR, \-o \fBmin_seek_time_diff\fR .RS 4 If the requested HLS segment is less than min_seek_time seconds away, discard the seek request\&. The segment will be available very soon anyway, and that makes a re\-transcode necessary\&. Set to 0 to disable\&. .sp Should normally be left as the default\&. .sp \fBNote:\fR This applies to the HLS output format only, and is ignored for all other formats\&. .sp Defaults to: \fB30 seconds\fR .RE .SS "Hardware Acceleration Options" .PP \fB\-\-hwaccel_enc\fR=API, \fB\-o hwaccel_enc\fR=API .RS 4 Select the hardware acceleration API for encoding\&. .sp Defaults to: \fBNONE\fR (no acceleration)\&. .PP \fBAPI\fR .RS 4 can be defined as\&... .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBNONE\fR: use software encoder .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBVAAPI\fR: Video Acceleration API (VA\-API) .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBOMX\fR: OpenMAX (Open Media Acceleration) .RE .RE .RE .PP \fB\-\-hwaccel_dec_blocked\fR=CODEC[:PROFILE[:PROFILE]], \fB\-o hwaccel_dec_blocked\fR=CODEC:[:PROFILE[:PROFILE]] .RS 4 Block a codec and, optionally, a profile for hardware decoding\&. The option can be repeated to block several codecs\&. .sp Defaults to: no codecs blocked\&. .PP \fBCODEC\fR .RS 4 can be defined as\&... .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBH263\fR: H\&.263 .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBH264\fR: H\&.264 .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBHEVC\fR: H\&.265 / HEVC .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBMPEG2\fR: MPEG\-2 video .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBMPEG4\fR: MPEG\-4 video .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBVC1\fR: SMPTE VC\-1 .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBVP8\fR: Google VP9 .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBVP9\fR: Google VP9 .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBWMV3\fR: Windows Media Video 9 .RE .RE .RE .PP \fBPROFILE\fR .RS 4 can optionally be added to block a certain profile from the codec only\&. .sp Example: VP9:0 blocks Google VP profile 0\&. .sp Example: H264:1:33 blocks H\&.264 profile 1 and 33\&. .RE .PP \fB\-\-hwaccel_enc_device\fR=DEVICE, \-o \fBhwaccel_enc_device\fR=DEVICE .RS 4 Select the hardware acceleration device\&. May be required for VAAPI, especially if more than one device is available\&. .sp \fBNote:\fR This only applies to VAAPI hardware acceleration; all other types are ignored\&. .sp Defaults to: \fBempty\fR (use default device)\&. .sp Example: \fB/dev/dri/renderD128\fR .RE .PP \fB\-\-hwaccel_dec\fR=API, \fB\-o hwaccel_dec\fR=API .RS 4 Select the hardware acceleration API for decoding\&. .sp Defaults to: \fBNONE\fR (no acceleration) .PP \fBAPI\fR .RS 4 can be defined as\&... .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBNONE\fR: use software decoder .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBVAAPI\fR: Video Acceleration API (VA\-API) .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBMMAL\fR: Multimedia Abstraction Layer by Broadcom .RE .RE .RE .PP \fB\-\-hwaccel_dec_device\fR=DEVICE, \-o \fBhwaccel_dec_device\fR=DEVICE .RS 4 Select the hardware acceleration device\&. May be required for VAAPI, especially if more than one device is available\&. .sp \fBNote:\fR This only applies to VAAPI hardware acceleration; all other types are ignored\&. .sp Defaults to: \fBempty\fR (use default device) .sp Example: \fB/dev/dri/renderD128\fR .RE .SS "Album Arts" .PP \-\-\fBnoalbumarts\fR, \-o \fBnoalbumarts\fR .RS 4 Do not copy album art into the output file\&. .sp This will reduce the file size and may be useful when streaming via HTML5 when album art is not used anyway\&. .sp Defaults to: \fBadd album arts\fR .RE .SS "Virtual Script" .PP \-\-\fBenablescript\fR, \-o \fBenablescript\fR .RS 4 Add a virtual index\&.php to every directory\&. It reads scripts/videotag\&.php from the FFmpegfs binary directory\&. .sp This can be very handy for testing video playback\&. Of course, feel free to replace videotag\&.php with your own script\&. .sp Defaults to: \fBDo not generate script file\fR .RE .PP \-\-\fBscriptfile\fR, \-o \fBscriptfile\fR .RS 4 Set the name of the virtual script created in each directory\&. .sp Defaults to: \fBindex\&.php\fR .RE .PP \-\-\fBscriptsource\fR, \-o \fBscriptsource\fR .RS 4 Use a different source file\&. .sp Defaults to: \fBscripts/videotag\&.php\fR .RE .SS "Cache Options" .PP \fB\-\-expiry_time\fR=TIME, \fB\-o expiry_time\fR=TIME .RS 4 Cache entries expire after \fITIME\fR and will be deleted to save disc space\&. .sp Defaults to: \fB1 week\fR .RE .PP \fB\-\-max_inactive_suspend\fR=TIME, \fB\-o max_inactive_suspend\fR=TIME .RS 4 While being accessed, the file is transcoded to the target format in the background\&. When the client quits, transcoding will continue until this time out\&. Transcoding is suspended until it is accessed again, then transcoding will continue\&. .sp Defaults to: \fB15 seconds\fR .RE .PP \fB\-\-max_inactive_abort\fR=TIME, \fB\-o max_inactive_abort\fR=TIME .RS 4 While being accessed, the file is transcoded in the background to the target format\&. When the client quits, transcoding will continue until this time out, then the transcoder thread quits\&. .sp Defaults to: \fB30 seconds\fR .RE .PP \fB\-\-prebuffer_time\fR=TIME, \fB\-o prebuffer_time\fR=TIME .RS 4 Files will be decoded until the buffer contains the specified playing time, allowing playback to start smoothly without lags\&. Both options must be met if prebuffer time and prebuffer size are specified\&. .sp Set to 0 to disable pre\-buffering\&. .sp Defaults to: \fBno prebuffer time\fR .RE .PP \fB\-\-prebuffer_size\fR=SIZE, \fB\-o prebuffer_size\fR=SIZE .RS 4 Files will be decoded until the specified number of bytes is present in the buffer, allowing playback to start smoothly without lags\&. Both options must be met if prebuffer size and prebuffer time are specified\&. .sp Set to 0 to disable pre\-buffering\&. .sp Defaults to: \fB100 KB\fR .RE .PP \fB\-\-max_cache_size\fR=SIZE, \fB\-o max_cache_size\fR=SIZE .RS 4 Set the maximum diskspace used by the cache\&. If the cache grows beyond this limit when a file is transcoded, old entries will be deleted to keep the cache within the size limit\&. .sp Defaults to: \fBunlimited\fR .RE .PP \fB\-\-min_diskspace\fR=SIZE, \fB\-o min_diskspace\fR=SIZE .RS 4 Set the required diskspace on the cachepath mount\&. If the remaining space falls below \fISIZE\fR when a file is transcoded, old entries will be deleted to keep the diskspace within the limit\&. .sp Defaults to: \fB0 (no minimum space)\fR .RE .PP \fB\-\-cachepath\fR=DIR, \fB\-o cachepath\fR=DIR .RS 4 Sets the disc cache directory to \fIDIR\fR\&. If it does not already exist, it will be created\&. The user running FFmpegfs must have write access to the location\&. .sp Defaults to: \fB${XDG_CACHE_HOME:\-~/\&.cache}/ffmpegfs\fR (as specified in the XDG Base Directory Specification)\&. Falls back to ${HOME:\-~/\&.cache}/ffmpegfs if not defined\&. If executed with root privileges, "/var/cache/ffmpegfs" will be used\&. .RE .PP \fB\-\-disable_cache\fR, \-o \fBdisable_cache\fR .RS 4 Disable the cache functionality completely\&. .sp Defaults to: \fBenabled\fR .RE .PP \fB\-\-cache_maintenance\fR=TIME, \fB\-o cache_maintenance\fR=TIME .RS 4 Starts cache maintenance in \fITIME\fR intervals\&. This will enforce the expery_time, max_cache_size and min_diskspace settings\&. Do not set it too low as this can slow down transcoding\&. .sp Only one FFmpegfs process will do the maintenance by becoming the master\&. If that process exits, another will take over, so that one will always do the maintenance\&. .sp Defaults to: \fB1 hour\fR .RE .PP \fB\-\-prune_cache\fR .RS 4 Prune the cache immediately according to the above settings at application start up\&. .sp Defaults to: \fBDo not prune cache\fR .RE .PP \fB\-\-clear_cache\fR, \fB\-o clear_cache\fR .RS 4 On startup, clear the cache\&. All previously transcoded files will be deleted\&. .PP \fBTIME\fR .RS 4 can be defined as\&... .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Seconds: # .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Minutes: #m .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Hours: #h .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Days: #d .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Weeks: #w .RE .RE .PP \fBSIZE\fR .RS 4 can be defined as\&... .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} In bytes: # or #B .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} In KBytes: #K or #KB .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} In MBytes: #M or #MB .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} In GBytes: #G or #GB .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} In TBytes: #T or #TB .RE .RE .RE .SS "Other" .PP \fB\-\-max_threads\fR=COUNT, \fB\-o max_threads\fR=COUNT .RS 4 Limit concurrent transcoder threads\&. Set to 0 for unlimited threads\&. Recommended values are up to 16 times the number of CPU cores\&. Should be left as the default\&. .sp Defaults to: \fB16 times number of detected cpu cores\fR .RE .PP \fB\-\-decoding_errors\fR, \fB\-o decoding_errors\fR .RS 4 Decoding errors are normally ignored, leaving bloopers and hiccups in encoded audio or video but still creating a valid file\&. When this option is set, transcoding will stop with an error\&. .sp Defaults to: \fBIgnore errors\fR .RE .PP \fB\-\-min_dvd_chapter_duration\fR=SECONDS, \fB\-o min_dvd_chapter_duration\fR=SECONDS .RS 4 This ignores DVD chapters shorter than SECONDS\&. To disable, set to 0\&. This avoids transcoding errors for DVD chapters too short to detect its streams\&. .sp Defaults to: \fB1 second\fR .RE .PP \fB\-\-win_smb_fix\fR, \fB\-o win_smb_fix\fR .RS 4 Windows seems to access the files on Samba drives starting at the last 64K segment when the file is opened\&. Setting \-\-win_smb_fix=1 will ignore these attempts (not decode the file up to this point)\&. .sp Defaults to: \fBon\fR .RE .SS "Logging" .PP \fB\-\-log_maxlevel\fR=LEVEL, \fB\-o log_maxlevel\fR=LEVEL .RS 4 Maximum level of messages to log, either ERROR, WARNING, INFO, DEBUG or TRACE\&. Defaults to INFO and is always set to DEBUG in debug mode\&. .sp Note that the other log flags must also be set to enable logging\&. .RE .PP \fB\-\-log_stderr\fR, \fB\-o log_stderr\fR .RS 4 Enable outputting logging messages to stderr\&. Automatically enabled in debug mode\&. .RE .PP \fB\-\-log_syslog\fR, \fB\-o log_syslog\fR .RS 4 Enable outputting logging messages to syslog\&. .RE .PP \fB\-\-logfile\fR=FILE, \fB\-o logfile\fR=FILE .RS 4 File to output log messages to\&. By default, no file will be written\&. .RE .SS "General/FUSE options" .PP \fB\-d\fR, \fB\-o debug\fR .RS 4 Enable debug output\&. This will result in a large quantity of diagnostic information being printed to stderr as the programme runs\&. It implies \fB\-f\fR\&. .RE .PP \fB\-f\fR .RS 4 Run in the foreground instead of detaching from the terminal\&. .RE .PP \fB\-h\fR, \fB\-\-help\fR .RS 4 Print usage information\&. .RE .PP \fB\-V\fR, \fB\-\-version\fR .RS 4 Output version information\&. .RE .PP \fB\-c\fR, \fB\-\-capabilities\fR .RS 4 Output FFmpeg capabilities: a list of the system\(cqs available codecs\&. .RE .PP \fB\-s\fR .RS 4 Force single\-threaded operation\&. .RE .SH "USAGE" .sp Mount your file system as follows: .sp .if n \{\ .RS 4 .\} .nf ffmpegfs [\-\-audiobitrate bitrate] [\-\-videobitrate bitrate] musicdir mountpoint [\-o fuse_options] .fi .if n \{\ .RE .\} .sp To use FFmpegfs as a daemon and encode to MPEG\-4, for instance: .sp .if n \{\ .RS 4 .\} .nf ffmpegfs \-\-audiobitrate=256K \-\-videobitrate=1\&.5M /mnt/music /mnt/ffmpegfs \-o allow_other,ro,desttype=mp4 .fi .if n \{\ .RE .\} .sp This will run FFmpegfs in the foreground and print the log output to the screen: .sp .if n \{\ .RS 4 .\} .nf ffmpegfs \-f \-\-log_stderr \-\-audiobitrate=256K \-\-videobitrate=1\&.5M \-\-audiobitrate=256K \-\-videobitrate=1\&.5M /mnt/music /mnt/ffmpegfs \-o allow_other,ro,desttype=mp4 .fi .if n \{\ .RE .\} .sp With the following entry in "/etc/fstab," the same result can be obtained with more recent versions of FUSE: .sp .if n \{\ .RS 4 .\} .nf ffmpegfs#/mnt/music /mnt/ffmpegfs fuse allow_other,ro,audiobitrate=256K,videobitrate=2000000,desttype=mp4 0 0 .fi .if n \{\ .RE .\} .sp Another (more current) way to express this command: .sp .if n \{\ .RS 4 .\} .nf /mnt/music /mnt/ffmpegfs fuse\&.ffmpegfs allow_other,ro,audiobitrate=256K,videobitrate=2000000,desttype=mp4 0 0 .fi .if n \{\ .RE .\} .sp At this point, files like /mnt/music/**\&.flac and /mnt/music/**\&.ogg will show up as /mnt/ffmpegfs/**\&.mp4\&. .sp Audio bitrates will be reduced to 256 KBit, video to 1\&.5 MBit\&. The source bitrate will not be scaled up if it is lower; it will remain at the lower value\&. .sp Keep in mind that only root can, by default, utilise the "allow other" option\&. Either use the "user allow other" key in /etc/fuse\&.conf or run FFmpegfs as root\&. .sp Any user must have "allow other" enabled in order to access the mount\&. By default, only the user who initiated FFmpegfs has access to this\&. .sp Examples: .sp .if n \{\ .RS 4 .\} .nf ffmpegfs \-f $HOME/test/in $HOME/test/out \-\-log_stderr \-\-log_maxlevel=DEBUG \-o allow_other,ro,desttype=mp4,cachepath=$HOME/test/cache .fi .if n \{\ .RE .\} .sp Transcode files using FFmpegfs from test/in to test/out while logging to stderr at a noisy TRACE level\&. The cache resides in test/cache\&. All directories are under the current user\(cqs home directory\&. .sp .if n \{\ .RS 4 .\} .nf ffmpegfs \-f $HOME/test/in $HOME/test/out \-\-log_stderr \-\-log_maxlevel=DEBUG \-o allow_other,ro,desttype=mp4,cachepath=$HOME/test/cache,videowidth=640 .fi .if n \{\ .RE .\} .sp Similar to the previous, but with a 640\-pixel maximum video width\&. The aspect ratio will be maintained when scaling down larger videos\&. Videos that are smaller won\(cqt be scaled up\&. .sp .if n \{\ .RS 4 .\} .nf ffmpegfs \-f $HOME/test/in $HOME/test/out \-\-log_stderr \-\-log_maxlevel=DEBUG \-o allow_other,ro,desttype=mp4,cachepath=$HOME/test/cache,deinterlace .fi .if n \{\ .RE .\} .sp Deinterlacing can be enabled for better image quality\&. .SH "HOW IT WORKS" .sp The decoder and encoder are initialised when a file is opened, and the file\(cqs metadata is also read\&. At this point, a rough estimate of the total file size can be made\&. Because the actual size greatly depends on the material encoded, this technique works fair\-to\-good for MP4 or WebM output files but works well for MP3, AIFF, or WAV output files\&. .sp The file is transcoded as it is being read and stored in a private per\-file buffer\&. This buffer keeps expanding as the file is read until the entire file has been transcoded\&. After being decoded, the file is stored in a disc buffer and is readily accessible\&. .sp Other processes will share the same transcoded data if they access the same file because transcoding is done in a single additional thread, which saves CPU time\&. Transcoding will continue for a while if all processes close the file before it is finished\&. Transcoding will resume if the file is viewed once more before the timer expires\&. If not, it will halt and delete the current chunk to free up storage space\&. .sp A file will be transcoded up to the seek point when you seek within it (if not already done)\&. Since the majority of programmes will read a file from beginning to end, this is typically not a problem\&. Future upgrades might offer actual random seeking (but if this is feasible, it is not yet clear due to restrictions to positioning inside compressed streams)\&. When HLS streaming is chosen, this already functions\&. The requested segment is immediately skipped to by FFmpegfs\&. .sp \fBMP3:\fR The source file\(cqs comments are used to generate ID3 version 2\&.4 and 1\&.1 tags\&. They are correspondingly at the beginning and the end of the file\&. .sp \fBMP4:\fR The same is true for meta atoms contained in MP4 containers\&. .sp \fBWAV\fR: The estimated size of the WAV file will be included in a pro forma WAV header\&. When the file is complete, this header will be changed\&. Though most current gamers apparently disregard this information and continue to play the file, it does not seem required\&. .sp Only for MP3 targets: A particular optimization has been done so that programmes that look for id3v1 tags don\(cqt have to wait for the entire file to be transcoded before reading the tag\&. This accelerates these apps \fBdramatically\fR\&. .SH "ABOUT OUTPUT FORMATS" .sp A few remarks regarding the output formats that are supported: .sp Since these are plain vanilla constant bitrate (CBR) MP3 files, there isn\(cqt much to say about the MP3 output\&. Any modern player should be able to play them well\&. .sp However, MP4 files are unique because standard MP4s aren\(cqt really ideal for live broadcasting\&. The start block of an MP4 has a field with the size of the compressed data section, which is the cause\&. It suffices to say that until the size is known, compression must be finished, a file seek must be performed to the beginning, and the size atom updated\&. .sp That size is unknown for a live stream that is ongoing\&. To obtain that value for our transcoded files, one would need to wait for the entire file to be recoded\&. As if that weren\(cqt enough, the file\(cqs final section contains some crucial details, such as meta tags for the artist, album, etc\&. Additionally, the fact that there is just one enormous data block makes it difficult to do random searches among the contents without access to the entire data section\&. .sp Many programmes will then read the crucial information from the end of an MP4 before returning to the file\(cqs head and beginning playback\&. This will destroy FFmpegfs\*(Aq entire transcode\-on\-demand concept\&. .sp Several extensions have been created to work around the restriction, including "faststart," which moves the aforementioned meta data from the end to the beginning of the MP4 file\&. Additionally, it is possible to omit the size field (0)\&. An further plugin is isml (smooth live streaming)\&. .sp Older versions of FFmpeg do not support several new MP4 features that are required for direct\-to\-stream transcoding, like ISMV, faststart, separate moof/empty moov, to mention a few (or if available, not working properly)\&. .sp Faststart files are produced by default with an empty size field so that the file can be started to be written out at once rather than having to be encoded as a complete first\&. It would take some time before playback could begin if it were fully encoded\&. The data part is divided into chunks of about 1 second each, all with their own header, so it is possible to fill in the size fields early enough\&. .sp One disadvantage is that not all players agree with the format, or they play it with odd side effects\&. VLC only refreshes the time display every several seconds while playing the file\&. There may not always be a complete duration displayed while streaming using HTML5 video tags, but that is fine as long as the content plays\&. Playback can only move backwards from the current playback position\&. .sp However, that is the cost of commencing playback quickly\&. .SH "DEVELOPMENT" .sp Git is the revision control system used by FFmpegfs\&. The complete repository is available here: .sp git clone https://github\&.com/nschlia/ffmpegfs\&.git .sp or the mirror: .sp git clone https://salsa\&.debian\&.org/nschlia/ffmpegfs\&.git .sp FFmpegfs is composed primarily of C++17 with a small amount of C\&. The following libraries are utilised: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} FUSE .RE .sp FFmpeg home pages: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} FFmpeg .RE .SH "FILES" .sp \fB/usr/local/bin/ffmpegfs\fR, \fB/etc/fstab\fR .SH "AUTHORS" .sp This fork with FFmpeg support has been maintained by Norbert Schlia since 2017 to date\&. .sp Based on work by K\&. Henriksson (from 2008 to 2017) and the original author, David Collett (from 2006 to 2008)\&. .sp Much thanks to them for the original work and giving me a good head start! .SH "LICENSE" .sp This program can be distributed under the terms of the GNU GPL version 3 or later\&. It can be found online or in the COPYING file\&. .sp This file and other documentation files can be distributed under the terms of the GNU Free Documentation License 1\&.3 or later\&. It can be found online or in the COPYING\&.DOC file\&. .SH "FFMPEG LICENSE" .sp FFmpeg is licensed under the GNU Lesser General Public License (LGPL) version 2\&.1 or later\&. However, FFmpeg incorporates several optional parts and optimizations that are covered by the GNU General Public License (GPL) version 2 or later\&. If those parts get used the GPL applies to all of FFmpeg\&. .sp See https://www\&.ffmpeg\&.org/legal\&.html for details\&. .SH "COPYRIGHT" .sp This fork with FFmpeg support copyright (C) 2017\-2026 Norbert Schlia\&. .sp Based on work copyright (C) 2006\-2008 David Collett, 2008\-2013 K\&. Henriksson\&. .sp Much thanks to them for the original work! .sp This is free software: you are free to change and redistribute it under the terms of the GNU General Public License (GPL) version 3 or later\&. .sp This manual is copyright (C) 2010\-2011 K\&. Henriksson and (C) 2017\-2026 by N\&. Schlia and may be distributed under the GNU Free Documentation License (GFDL) 1\&.3 or later with no invariant sections, or alternatively under the GNU General Public License (GPL) version 3 or later\&. ffmpegfs-2.18/FEATURES.md0000644000000000000000000005064415052412651011702 00000000000000Hardware Acceleration ===================== The hardware acceleration feature depends heavily on the hardware used. As this is a personal project, I cannot go out and buy and test all possible devices. So I'll have to rely on you to report your issues so we can iron them out. Even different hardware supporting the same API may behave differently. Sometimes the format range is not the same, sometimes subfeatures are missing, and so on. ## How It Works Acceleration is done by specialised graphics adapters. The FFmpeg API can use several types using a range of APIs. As of today, even cheap on-board chips can do hardware acceleration. Here is an incomplete list. Hardware acceleration using hardware buffered frames: * VAAPI: Intel, AMD (Decoders: H.264, MPEG-2, MPEG-4 part 2, VC-1. H.265, H.265 10-bit on recent devices. Encoder: H.264, H.265, MPJEPG, MPEG-2, VP8/9, MPEG-4 part 2 can probably be enabled.) * VDPAU: Nividia, AMD (H.264, MPEG-1/2/4, and VC-1) * CUDA: Compute Unified Device Architecture (Decoders: VP9, H.264, MPEG-2, MPEG-4. Encoding: H.264, H.265), see https://developer.nvidia.com/ffmpeg and https://en.wikipedia.org/wiki/CUDA * QSV: QuickSync, see https://trac.ffmpeg.org/wiki/Hardware/QuickSync * OPENCL: Open Standard for Parallel Programming of Heterogeneous Systems, see https://trac.ffmpeg.org/wiki/HWAccelIntro#OpenCL * VULKAN: Low-overhead, cross-platform 3D graphics and computing API, requires Libavutil >= 56.30.100, see https://en.wikipedia.org/wiki/Vulkan_(API) These use software frames: * v4l2m2m: Intel (Encoders: H.263, H.264, H.265, MPEG-4, VP8). Decoders: H.263, H.264, H.265, MPEG-1, MPEG-2, MPEG-4, VC-1, VP8, VP9.) * OpenMAX: Encoding on Raspberry (H.264, MPEG-4. Requires key to unlock.) * MMAL: Decoding on Raspberry (H.264, MPEG-2, MPEG-4, VC-1. Requires key to unlock.) More information can be found at https://trac.ffmpeg.org/wiki/HWAccelIntro. ## Current Implementation ### Supported Hardware Acceleration APIs These APIs are implemented and tested. VAAPI mostly targets Intel hardware, but there are other hardware vendors that offer support now. MMAL and OpenMAX are supported by Raspberry PI boards. | API | Decode | Encode | Description | Details see | | --------- | ------ | ------ | ----------------------------------------------- | ------------------------------------------------------------ | | **VAAPI** | x | x | Video Acceleration API (VA-API), formerly Intel | https://en.wikipedia.org/wiki/Video_Acceleration_API
https://trac.ffmpeg.org/wiki/Hardware/VAAPI | | **MMAL** | | x | Multimedia Abstraction Layer by Broadcom | https://github.com/techyian/MMALSharp/wiki/What-is-MMAL%3F
http://www.jvcref.com/files/PI/documentation/html/ | | **OMX** | x | | OpenMAX (Open Media Acceleration) | https://en.wikipedia.org/wiki/OpenMAX | #### Tested On | System | CPU | GPU | APIs | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------- | ------------ | | Debian 10 | Intel Core i5-6500 CPU @ 3.20GHz | Intel HD Graphics 530 (rev 06) | VAAPI | | Debian 11 | Intel Core i5-8250U CPU @ 1.60GHz | Intel UHD Graphics 620 (rev 07) | VAAPI | | Debian 11 | Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz | NVIDIA GP108M, GeForce MX330 | VAAPI | | Raspbian 10
Raspberry Pi 2 Model B Rev 1.1
Raspberry Pi 3 Model B Plus Rev 1.3 |
ARMv7 Processor rev 5 (v7l)
ARMv7 Processor rev 4 (v7l) | | OpenMAX/MMAL | ## Planned Hardware Acceleration APIs There are several more APIs that could be added. Currently, this is not possible due to a lack of hardware. | API | Decode | Encode | Notes | Details see | | ----------- | ------ | ------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | **CUDA** | | | Compute Unified Device Architecture | https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
https://en.wikipedia.org/wiki/CUDA
https://developer.nvidia.com/ffmpeg | | **OPENCL** | | | Open Standard for Parallel Programming of Heterogeneous Systems | https://trac.ffmpeg.org/wiki/HWAccelIntro#OpenCL | | **VDPAU** | | | Video Decode and Presentation API for Unix | https://en.wikipedia.org/wiki/VDPAU | | **QSV** | | | QuickSync | https://trac.ffmpeg.org/wiki/Hardware/QuickSync | | **V4L2M2M** | | | v4l2 mem to mem (Video4linux) | | | **VULKAN** | | | Low-overhead, cross-platform 3D graphics and computing API, requires Libavutil >= 56.30.100 | https://en.wikipedia.org/wiki/Vulkan_(API) | ## Hardware Encoding This version has been tested with VAAPI (Debian) and OpenMAX (Raspberry). It may be possible that other APIs work, but this has not been confirmed yet. To enable hardware support, use these parameters respectively (of course, use only one): ``` --hwaccel_enc=VAAPI --hwaccel_enc=OMX ``` If your system supports VAAPI: * It could be possible that the rendering device on your system goes by a different name than the default "/dev/dri/renderD128". You can use the --hwaccel_enc_device parameter to set it. * Depending on what your renderer supports, setting a bitrate will fail. On my test system, for example, CQG (Constant Quantisation parameter) is the only valid rendering control mode. The driver ignores bitrate settings and accepts the qp option only. As found in libavcodec/vaapi_encode.c: Rate control mode selection: * If the user has set a mode explicitly with the rc_mode option, use it and fail if it is not available. * If an explicit QP option has been set, use CQP. * If the codec is CQ-only, use CQP. * If the QSCALE avcodec option is set, use CQP. * If bitrate and quality are both set, try QVBR. * If quality is set, try ICQ, then CQP. * If bitrate and maxrate are set and have the same value, try CBR. * If a bitrate is set, try AVBR, then VBR, then CBR. * If no bitrate is set, try ICQ, then CQP. At the moment, this is hardwired into the code. None of these values can be controlled now by the command line. This is planned, of course, but not implemented in the current version yet. ## Hardware Decoding This version has been tested with VAAPI (Debian) and MMAL (Raspberry). It may be possible that other APIs work, but this has not been confirmed yet. To enable hardware support, use these parameters respectively (of course, use only one): ``` --hwaccel_dec=VAAPI --hwaccel_dec=MMAL ``` If your system supports VAAPI: - It could be possible that the rendering device on your system goes by a different name than the default "/dev/dri/renderD128". You can use the --hwaccel_enc_device parameter to set it. On slow machines like the Raspberry, this should give an extra kick and also relieve the CPU from load. On faster machines, this impact may be smaller, yet noticeable. The decoding part is a bit tricky. If encoding is set to hardware, and this hardware is there and capable of encoding, it will work. If hardware decoding is possible, it depends on the source file. Therefore, the file needs to be checked first and then it needs to be decided if hardware acceleration can be used or if a fallback to software is required. FFmpeg requires that to be set via the command line, but FFmpegfs must be able to decide that automatically. ### TODOs Doing both de- and encoding in hardware can make costly transfers of frames between software and hardware memory unneccessary. It is not clear, at the moment, if it is possible to keep the frames in hardware as FFmpegfs does some processing with the frames (for example, rescaling or deinterlacing), which probably cannot be done without transferring buffers from hardware to software memory and vice versa. We'll see. As seen above, selecting a target bitrate turns out to be a bit tricky. I'll have to work out a way to reach the desired bitrate in any case (no matter if the hardware supports CQP, VBR, CBR, ICQ, or AVBR). On the other hand, everything seems to work and there are no show stoppers in sight. Sheesh, wiping the sweat off my chin :) HTTP Live Streaming =================== FFmpegfs supports HLS (HTTP Live Streaming). FFmpegfs will create transport stream (ts) segments and the required m3u8 playlists. For your convenience, it will also offer a virtual test.html file that can playback the segments using the hls.js library (see https://github.com/video-dev/hls.js/). To use the new HLS feature, invoke FFmpegfs with: ffmpegfs -f $HOME/test/in $HOME/test/out -o allow_other,ro,desttype=hls Please note that this will only work over http because most browsers refuse to load multimedia files from the local file system, so you need to publish the directory on a web server. Security restrictions prevent direct playback from a disk. Simply navigate to the directory and open test.html. Cue Sheets ========== Cue sheets, or cue sheet files, were first introduced for the CDRWIN CD/DVD burning software. Basically, they are used to define a CD or DVD track layout. Today, they are supported by a wide range of optical disk authoring applications and, moreover, media players. When a media file is accompanied by a cue sheet, its contents are read and a virtual directory with separate tracks is created. The cue sheet file must have the same name but the extension ".cue" instead. It can also be embedded into the media file. The directory is named after the source media, with an additional ".tracks" extension. If several media files with different extensions exist, for example, different formats, several ".tracks" directories will be visible. Example: myfile.mp4 myfile.ogv myfile.cue If the destination type is TS, the following files and directories will appear: myfile.mp4 myfile.mp4.ts myfile.ogv myfile.ogv.ts myfile.cue myfile.mp4.tracks/ myfile.ogv.tracks/ Tracks defined in the cue sheet will show up in the *.tracks subdirectories. Selecting Audio and Video Codecs ========== Some new codec combinations are now possible (the default codecs are in bold): | Formats | Audio Codecs | Video Codecs | | ------- | ----------------- | ---------------------------- | | MP4 | **AAC**, MP3 | **H264**, H265, MPEG1, MPEG2 | | WebM | **OPUS**, VORBIS | **VP9**, VP8 | | MOV | **AAC**, AC3, MP3 | **H264**, H265, MPEG1, MPEG2 | | TS, HLS | **AAC**, AC3, MP3 | **H264**, H265, MPEG1, MPEG2 | For audio, the codec can be selected with --audiocodec. For videos, use --videocodec. Without these parameters, FFmpegfs will use the codecs as before (no change). Please note that hardware acceleration might not work, e.g., my hardware encoder supports H264 but not H265. So even though H265 creates much smaller files, it takes 10 times longer to transcode. Building A Docker Container ========== FFmpegfs can run under Docker. A Dockerfile is provided to build a container for FFmpegfs. Change to the "docker" directory and run docker build --build-arg BRANCH=master -t nschlia/ffmpegfs . Depending on the machine speed, this will take quite a while. After the command is completed, the container can be started with docker run --rm \ --cgroupns host \ --name=ffmpegfs \ --device /dev/fuse \ --cap-add SYS_ADMIN \ --security-opt apparmor:unconfined \ -v /path/to/source:/src:ro \ -v /path/to/output:/dst:rshared \ nschlia/ffmpegfs \ -f --log_stderr --audiobitrate=256K -o allow_other,ro,desttype=mp3,log_maxlevel=INFO Of course, */path/to/source* must be changed to a directory with multi-media files and */path/to/output* to where the converted files should be visible. The output type may be changed to MP4 or whatever is desired. Auto Copy ========= "Auto copy" performs intelligent stream copy. For example, if transcoding a transport stream that already represents a H264 video and/or AAC audio stream, it is possible to simply repackage it to an mp4 container without recoding. This is very efficient because it does not require as much computing as de- and encoding, and it also does not degrade quality because the original file remains essentially unchanged. The function detects if the target format supports the source codec and simply remuxes the stream even if recoding from one format (for example, TS) to another (for example, MOV, MP4). There are three options: | Option | Description | | ------ | ------------------------------------------------------------ | | OFF | no auto copy. | | LIMIT | only auto copy if the target file will not become significantly larger. | | ALWAYS | auto copy whenever possible, even if the target file becomes larger. | Smart Transcoding ================= Smart transcoding can create different output formats for video and audio files. For example, video files can be converted to ProRes and audio files to AIFF. Of course, combinations like MP4/MP3 or WebM/WAV are possible but do not make sense, as MP4 or WebM work perfectly with audio-only content. To use the new feature, simply specify a video and audio file type, separated by a "+" sign. For example, *--desttype=mov+aiff* will convert video files to Apple Quicktime MOV and audio only files to AIFF. This can be handy if the results are consumed, for example, by some Apple editing software, which is very picky about the input format. *Notes* 1. The first format must be a video codec, and the second must be an audio codec. For example, *--desttype=wav+mp4* is invalid, and instead it should be *--desttype=mp4+wav*. 2. Smart transcoding currently determines the output format by taking the input format type into account, e.g., an MP3 would be recoded to AIFF, an MP4 to MOV even if the input MP4 does not contain a video stream. The input format should be scanned for streams and the output selected appropriately: An MP4 with video should be transcoded to MOV, an MP4 with audio only to AIFF. See [Issue #86] (https://github.com/nschlia/ffmpegfs/issues/86) for details. Transcoding To Frame Images ========================= To transcode a video to frame images, set the destination type to JPG, PNG, or BMP. This will convert videos into virtual folders with one image for each frame. ``` $ ls /storage/videos video1.mp4 video2.mov $ ffmpegfs /storage/videos /mnt/ffmpegfs $ find /mnt/ffmpegfs /mnt/ffmpegfs/video1.mp4/00001.png /mnt/ffmpegfs/video1.mp4/00002.png ... /mnt/ffmpegfs/video1.mov/00001.png /mnt/ffmpegfs/video1.mov/00002.png ``` A Few Words On ProRes ===================== Apple's ProRes is a so-called intermediate format, intended for post-production editing. It combines the highest possible quality while still saving some disk space and not requiring high-performance disk systems. On the other hand, this means that ProRes encoded videos will become quite large—for example, a 60-minute video may require up to 25 GB. It is not for target audience use, and certainly not suitable for internet streaming. Also, please keep in mind that when using lossy source input formats, the quality will not get better, but the files can be fed into software like Final Cut Pro, which only accepts a small number of input formats. Transcoding Subtitles ===================== Closed captions are converted to the output files, if possible. There are two general subtitle formats: text and bitmap. Subtitle transcoding is currently only possible from text to text or bitmap to bitmap. It may be relatively easy to convert text to bitmap, but not vice versa. This would require some sort of OCR and could become arbitrarily complex. That may work well for Latin alphabets, but there are others. Guess what would happen with Georgian, Indian, Chinese, or Arabic... | Output Format | Subtitle Codec | Format | | ---------------- | ------------------------------------------------------ | ------ | | MP4, MOV, ProRes | MOV Text (Apple Text Media Handler) | Text | | WebM | WebVTT Subtitles (Web Video Text Tracks Format) | Text | | TS, HLS | DVB Subtitles | Bitmap | | MKV | ASS (Advanced SSA), SubRip Subtitles, WebVTT Subtitles | Text | | MKV | DVB Subtitles | Bitmap | Matroska (MKV) supports a wide range of subtitle formats, both text and bitmap. FFmpegfs automatically selects the best matching output codec. MKV would be the best choice to cover all input subtitle formats. ## External Subtitle Files Subtitles can reside in separate files. These must have the same filename but the extension "srt" for ASS/SubRip or "vtt" for WebVTT. The language can be defined with a second level extension, e.g. "mediafile.en.srt" would define the contents as "English". There is no convention for the language name, so it could even be the full language name like "mediafile.french.srt" or similar. Example | Filename | Contents | | -------------- | -------------------------- | | myvideo.mkv | Video | | myvideo.de.srt | German Subtitles | | myvideo.en.srt | English Subtitles | | myvideo.es.srt | Spanish Subtitles | | myvideo.fr.srt | French Subtitles | | myvideo.hu.srt | Hungarian Subtitles | | myvideo.it.srt | Italian Subtitles | | myvideo.jp.srt | Japanese Subtitles | | myvideo.srt | Unknown Language Subtitles | **TODO:** * Maybe FFmpeg could convert text to bitmap for TS/HLS if the input format is not bitmapped. MP4 Format Profiles ================== The MP4 container has several derivative formats that are not compatible with all target audiences. To successfully feed the resulting files into, for example, MS Edge, the subformat must be different than for Firefox, unfortunately. The --profile option allows you to select the format. | Profile | OS | Target | Remarks | | ------- | --------------------- | ------------------------------ | ------------------------------ | | NONE | all | VLC, Windows Media Player etc. | Playback (default) | | FF | Linux, Win10, Android | Firefox | OK: Playback while transcoding | | | Win7 | Firefox | OK: Playback while transcoding | | EDGE | Win10 | MS Edge, IE > 11 | OK: Playback while transcoding | | | Win10 Mobile | | OK: Playback while transcoding | | IE | Win10 | MS IE <= 11 | OK: Playback while transcoding | | | Win7 | | Must decode first (1) | | CHROME | all | Google Chrome | Must decode first (1) | | SAFARI | Win | Apple Safari | Must decode first (1) | | OPERA | All | Opera | Must decode first (1) | | MAXTHON | Win | Maxthon | Must decode first (1) | (1) * An error message appears when the file is opened while transcoding. * Must start again when the file is transcoded. * It works fine when the file is loaded directly from the buffer. This all boils down to the fact that Firefox and Edge are the only browsers that support the necessary extensions to start playback while still transcoding. In most cases, files will not play if they are not properly optimised. ffmpegfs-2.18/README.md0000644000000000000000000004162415166203530011417 00000000000000# FFmpegfs FFmpegfs is a read-only FUSE filesystem that transcodes various audio and video formats to MP4, WebM, and many more **on the fly** using the FFmpeg library. It thus supports a multitude of input formats and provides access in a variety of common output formats. This enables seamless access to a multimedia file collection with software and/or hardware that only supports one of the output formats, or allows transcoding files simply via drag-and-drop in a file browser. 📌 Website: [https://nschlia.github.io/ffmpegfs/](https://nschlia.github.io/ffmpegfs/) --- ## Code Status | Branch | Build State | | --------------------------------------------------------- | ------------------------------------------------------------ | | [master](https://github.com/nschlia/ffmpegfs/tree/master) | [![C/C++](https://github.com/nschlia/ffmpegfs/actions/workflows/main.yml/badge.svg)](https://github.com/nschlia/ffmpegfs/actions/workflows/main.yml) | | [master](https://github.com/nschlia/ffmpegfs/tree/master) | [![Clang (GNU Make)](https://github.com/nschlia/ffmpegfs/actions/workflows/make-clang.yml/badge.svg)](https://github.com/nschlia/ffmpegfs/actions/workflows/make-clang.yml) | | [master](https://github.com/nschlia/ffmpegfs/tree/master) | [![GCC (GNU Make)](https://github.com/nschlia/ffmpegfs/actions/workflows/make-gcc.yml/badge.svg)](https://github.com/nschlia/ffmpegfs/actions/workflows/make-gcc.yml) | | [master](https://github.com/nschlia/ffmpegfs/tree/master) | [![CodeQL](https://github.com/nschlia/ffmpegfs/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/nschlia/ffmpegfs/actions/workflows/codeql-analysis.yml) | | [master](https://github.com/nschlia/ffmpegfs/tree/master) | [![Docker Image](https://github.com/nschlia/ffmpegfs/actions/workflows/docker-image.yml/badge.svg)](https://github.com/nschlia/ffmpegfs/actions/workflows/docker-image.yml) | ## Packaging Status [![Packaging status](https://repology.org/badge/vertical-allrepos/ffmpegfs.svg?columns=4)](https://repology.org/project/ffmpegfs/versions) --- ## News ### Windows Version A Windows version of FFmpegfs has frequently been requested; see issue [#76](https://github.com/nschlia/ffmpegfs/issues/76) for more information. In essence, this failed because Windows doesn't support FUSE. I discovered [WinFSP](https://winfsp.dev/), which offers everything necessary. To see what's been done so far, checkout the [windows](https://github.com/nschlia/ffmpegfs/tree/windows) branch. --- ### New in 2.18 (2026-04-10): - **Feature:** Added ALAC profile for iTunes (`--desttype=ALAC --profile=ITUNES`). Playback of the file will not commence until it is fully recoded; however, it can be played in iTunes. - **Feature:** Implemented a validation check for the combination of TYPE and PROFILE in `--desttype=TYPE --profile=PROFILE`. - Updated Dockerfile to include FUSE 3. - **Bugfix:** Fix error with new FFmpeg API: *"Option 'pix_fmts' is not a runtime option and so cannot be set after the object has been initialized"*. - **Fixed deprecation:** Replace `avcodec_get_supported_config()`. - **Fixed deprecation:** Remove `avcodec_close()`. - **Fixed deprecation:** Remove `av_format_inject_global_side_data()`. - **Fixed deprecation:** Replace `std::codecvt` with `iconv` in `read_file`. - **Bugfix:** `reserve()` only guarantees capacity, not size → writing via `.data()` is undefined behaviour. Using `resize()` makes the memory usable. - As `strerror()` is not thread-safe, use `strerror_r()` where available. - `strncpy` likes to copy without NUL → terminate explicitly. - **Bugfix:** Issue [#173](https://github.com/nschlia/ffmpegfs/issues/173): Fixed output directory no showing complete list of files under Debian 13. - **Bugfix:** Updated Dockerfile for Trixie - **Bugfix:** Closes [#1115015](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1115015): Fix build with FFmpeg 8 (already applied in Debian via NMU) - **Bugfix:** Closes [#1119414](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1119414) Changed configure.ac and makefile.am to preserve the default build flags --- ### New in 2.17 (2024-11-10) - **Bugfix:** Issue [#164](https://github.com/nschlia/ffmpegfs/issues/164): Fixed incorrectly discarded HLS seek requests. - **Bugfix:** Wrong error message fixed when an invalid audio/video codec was selected. The message should rather say "unsupported codec" instead of talking about "sample format not supported.". - **Bugfix:** Issue [#162](https://github.com/nschlia/ffmpegfs/issues/162): If not present, add time stamps to the copied streams. - Changed quality from 34 to 40 for hardware encoded video streams to create slightly smaller files. - [Closes#1084487:](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1084487): Moved from the FUSE 2 to the FUSE 3 API. 📜 See [HISTORY.md](HISTORY.md) for the complete changelog. --- ## Supported Formats ### Input Making a full list of the formats the FFmpeg API supports would be somewhat pointless. See [Demuxers](https://ffmpeg.org/ffmpeg-formats.html#Demuxers) on FFmpeg's home pages and [Supported Formats](https://en.wikipedia.org/wiki/FFmpeg#Supported_formats) on Wikipedia to get an idea. Sadly, it also depends on the codecs that have been built into the Linux distribution's library. Some, like openSUSE, only include royalty-free codecs, while others, like Red Hat, completely omit FFmpeg. You can use the following command to find out: ```bash ffmpeg -formats ``` A list of the available codecs will be created as a result. In the case of missing codecs or no FFmpeg at all, your only option is to build FFmpeg yourself. Big fun... ### Output As output, only formats that can be read while being written to can be used. Whereas MP4 is not one of them, it can be supported through the use of format extensions. #### Audio Formats | Format | Description | Audio | | ------------- | ------------- | ------------- | | AIFF | Audio Interchange File Format | PCM 16 bit BE | | ALAC | Apple Lossless Audio Codec | ALAC | | FLAC | Free Lossless Audio | FLAC | | MP3 | MPEG-2 Audio Layer III | MP3 | | Opus |Opus Audio| Opus | | WAV | Waveform Audio File Format | PCM 16 bit LE | #### Video Formats | Format | Description | Video | Audio | | ------------- | ------------- | ------------- | ------------- | | HLS | HTTP Live Streaming | H264 | AAC | | MOV | QuickTime File Format | H264 | AAC | | MP4 | MPEG-4 | H264 | AAC | | OGG|Free Open Container Format| Theora | Vorbis | | ProRes | Apple ProRes | ProRes | PCM 16 bit LE | | TS | MPEG Transport Stream | H264 | AAC | | WebM|Free Open Web Media Project| VP9 | Opus | #### Stills | Format | Description | Video | | ------------- | ------------- | ------------- | | BMP | Video to frameset |BMP| | JPG | Video to frameset |JPEG| | PNG | Video to frameset |PNG| ### What can it do? You can use a collection of several media files with software and/or hardware that only supports one of the permitted output formats or convert files using simple drag-and-drop operations in a file browser with FFmpegfs. Choose WebM or MP4 for live streaming for the best results. While *MP3* will work if video transcoding is not needed, *WebM* and *MP4* produce superior results. The *OGG* encoder is too slow for real-time file recoding. All the frames from a video source file will be displayed in a virtual directory called after the source file when a destination of *JPG*, *PNG*, or *BMP* is selected. Audio will not be available. By choosing *HLS*, TS segments and an M3U playlist (master.m3u8 and index_0_av.m3u8) are created in a directory. A generated hls.html file that can be accessed in a browser can also be used to play the segments. Please be aware that since most browsers cannot open the files from disc due to restrictions, they must be on a web server. For further information, see [problems](PROBLEMS.md#open-hlshtml-from-disk-to-play-hls-output). --- ## Installation Instructions A rather detailed description can be found under [install](INSTALL.md). --- ## Fixing Problems This part has been transferred to a different file because it has gotten too big. Details can be found in [problems](PROBLEMS.md). --- ## Usage Mount your file system as follows: ffmpegfs [--audiobitrate bitrate] [--videobitrate bitrate] musicdir mountpoint [-o fuse_options] To use FFmpegfs as a daemon and encode to MPEG-4, for instance: ffmpegfs --audiobitrate=256K --videobitrate=1.5M /mnt/music /mnt/ffmpegfs -o allow_other,ro,desttype=mp4 This will run FFmpegfs in the foreground and print the log output to the screen: ffmpegfs -f --log_stderr --audiobitrate=256K --videobitrate=1.5M --audiobitrate=256K --videobitrate=1.5M /mnt/music /mnt/ffmpegfs -o allow_other,ro,desttype=mp4 With the following entry in "/etc/fstab," the same result can be obtained with more recent versions of FUSE: ffmpegfs#/mnt/music /mnt/ffmpegfs fuse allow_other,ro,audiobitrate=256K,videobitrate=2000000,desttype=mp4 0 0 Another (more current) way to express this command: /mnt/music /mnt/ffmpegfs fuse.ffmpegfs allow_other,ro,audiobitrate=256K,videobitrate=2000000,desttype=mp4 0 0 At this point, files like `/mnt/music/**.flac` and `/mnt/music/**.ogg` will show up as `/mnt/ffmpegfs/**.mp4`. Audio bitrates will be reduced to 256 KBit, video to 1.5 MBit. The source bitrate will not be scaled up if it is lower; it will remain at the lower value. Keep in mind that only root can, by default, use the "allow_other" option. Either use the "user_allow_other" key in `/etc/fuse.conf` or run FFmpegfs as root. Any user must have "allow_other" enabled in order to access the mount. By default, only the user who initiated FFmpegfs has access to this. Examples: ffmpegfs -f $HOME/test/in $HOME/test/out --log_stderr --log_maxlevel=DEBUG -o allow_other,ro,desttype=mp4,cachepath=$HOME/test/cache Transcode files using FFmpegfs from `test/in` to `test/out` while logging to stderr at a noisy DEBUG level. The cache resides in `test/cache`. All directories are under the current user's home directory. ffmpegfs -f $HOME/test/in $HOME/test/out --log_stderr --log_maxlevel=DEBUG -o allow_other,ro,desttype=mp4,cachepath=$HOME/test/cache,videowidth=640 Similar to the previous, but with a 640-pixel maximum video width. The aspect ratio will be maintained when scaling down larger videos. Videos that are smaller won't be scaled up. ffmpegfs -f $HOME/test/in $HOME/test/out --log_stderr --log_maxlevel=DEBUG -o allow_other,ro,desttype=mp4,cachepath=$HOME/test/cache,deinterlace Deinterlacing can be enabled for better image quality. ## More About Features There is a [feature list](FEATURES.md) with detailed explanations. --- ## How It Works The decoder and encoder are initialised when a file is opened, and the file's metadata is also read. At this point, a rough estimate of the total file size can be made. Because the actual size greatly depends on the material encoded, this technique works fair-to-good for MP4 or WebM output files but works well for MP3, AIFF, or WAV output files. The file is transcoded as it is being read and stored in a private per-file buffer. This buffer keeps expanding as the file is read until the entire file has been transcoded. After being decoded, the file is stored in a disc buffer and is readily accessible. Other processes will share the same transcoded data if they access the same file because transcoding is done in a single additional thread, which saves CPU time. Transcoding will continue for a while if all processes close the file before it is finished. Transcoding will resume if the file is viewed once more before the timer expires. If not, it will halt and delete the current chunk to free up storage space. A file will be transcoded up to the seek point when you seek within it (if not already done). Since the majority of programmes will read a file from beginning to end, this is typically not a problem. Future upgrades might offer actual random seeking (but if this is feasible, it is not yet clear due to restrictions to positioning inside compressed streams). When HLS streaming is chosen, this already functions. The requested segment is immediately skipped to by FFmpegfs. **MP3:** The source file's comments are used to generate ID3 version 2.4 and 1.1 tags. They are correspondingly at the beginning and the end of the file. **MP4:** The same is true for meta atoms contained in MP4 containers. **WAV:** The estimated size of the WAV file will be included in a pro forma WAV header. When the file is complete, this header will be changed. Though most current players apparently disregard this information and continue to play the file, it does not seem required. Only for MP3 targets: A particular optimization has been done so that programmes that look for id3v1 tags don't have to wait for the entire file to be transcoded before reading the tag. This accelerates these apps *dramatically*. --- ## About Output Formats A few remarks regarding the output formats that are supported: Since these are plain vanilla constant bitrate (CBR) MP3 files, there isn't much to say about the MP3 output. Any modern player should be able to play them well. However, MP4 files are unique because standard MP4s aren't really ideal for live broadcasting. The start block of an MP4 has a field with the size of the compressed data section, which is the cause. It suffices to say that until the size is known, compression must be finished, a file seek must be performed to the beginning, and the size atom updated. That size is unknown for a live stream that is ongoing. To obtain that value for our transcoded files, one would need to wait for the entire file to be recoded. As if that weren't enough, the file's final section contains some crucial details, such as meta tags for the artist, album, etc. Additionally, the fact that there is just one enormous data block makes it difficult to do random searches among the contents without access to the entire data section. Many programmes will then read the crucial information from the end of an MP4 before returning to the file's head and beginning playback. This will destroy FFmpegfs' entire transcode-on-demand concept. Several extensions have been created to work around the restriction, including "faststart," which moves the aforementioned meta data from the end to the beginning of the MP4 file. Additionally, it is possible to omit the size field (0). An further plugin is isml (smooth live streaming). Older versions of FFmpeg do not support several new MP4 features that are required for direct-to-stream transcoding, like ISMV, faststart, separate moof/empty moov, to mention a few (or if available, not working properly). Faststart files are produced by default with an empty size field so that the file can be started to be written out at once rather than having to be encoded as a complete first. It would take some time before playback could begin if it were fully encoded. The data part is divided into chunks of about 1 second each, all with their own header, so it is possible to fill in the size fields early enough. One disadvantage is that not all players agree with the format, or they play it with odd side effects. VLC only refreshes the time display every several seconds while playing the file. There may not always be a complete duration displayed while streaming using HTML5 video tags, but that is fine as long as the content plays. Playback can only move backwards from the current playback position. However, that is the cost of commencing playback quickly. --- ## Development Git is the revision control system used by FFmpegfs. The complete repository is available here: `git clone https://github.com/nschlia/ffmpegfs.git` or the mirror: `git clone https://salsa.debian.org/nschlia/ffmpegfs.git` FFmpegfs is composed primarily of C++17 with a small amount of C. The following libraries are utilised: \* [FUSE](http://fuse.sourceforge.net/) FFmpeg library: \* [FFmpeg](https://www.FFmpeg.org/) Please be aware that the main branch of FFmpegfs may not be stable as it is still under active development (but offers nice gimmicks). Get a release if you require a stable version, ideally the most recent. You are welcome to clone this project and add new features. They might be brought back into this project if additional people find them intriguing. The same holds true for bug fixes; if you find a bug, feel free to patch it! --- ## Future Objectives *Any ideas or wishes?* Free to create [an issue](https://github.com/nschlia/ffmpegfs/issues) and let me know. Some great features started this way! For more information, see [TODO](TODO). --- ## Authors - **Current maintainer (2017–present):** Norbert Schlia (nschlia@oblivion-software.de) - **Earlier maintainer (2008–2017):** K. Henriksson - **Original author (2006–2008):** David Collett Thanks to all for their foundational work. --- ## License - FFmpegfs: **GPLv3 or later** - Documentation: **GFDL 1.3 or later** (or alternatively GPLv3+) - FFmpeg itself: **LGPL 2.1+**, with some optional GPL components. See [FFmpeg Legal](https://www.ffmpeg.org/legal.html). ffmpegfs-2.18/Makefile.am0000644000000000000000000001633515166201601012172 00000000000000# Definitions for sub-makes if DEBUG OPTIMISATION = -DDEBUG -ggdb else OPTIMISATION = -DNDEBUG endif WARNINGS = -Wall -Wextra -Wconversion -Wsign-compare -Wsign-conversion -Wpedantic AM_CFLAGS = -std=c17 $(INCLUDES) $(WARNINGS) $(OPTIMISATION) -D_GNU_SOURCE AM_CXXFLAGS = -std=c++17 $(INCLUDES) $(WARNINGS) $(OPTIMISATION) -D_GNU_SOURCE if ENABLE_EXTRA_VERSION AM_CFLAGS += -DEXTRA_VERSION=\"$(EXTRA_VERSION)\" AM_CXXFLAGS += -DEXTRA_VERSION=\"$(EXTRA_VERSION)\" endif export CACHEDIR = $(DESTDIR)/var/cache/ffmpegfs SUBDIRS = src test dist_man_MANS = ffmpegfs.1 MAINTAINERCLEANFILES = ffmpegfs.1 EXTRA_DIST = INSTALL.md README.md HISTORY.md PROBLEMS.md FEATURES.md COPYING.CC0 ffmpegfs.1.txt src/makehelp.sh #CLEANFILES = ffmpegfs.1: ffmpegfs.1.txt $(AM_V_GEN)a2x -a revnumber="$(VERSION)" \ -a revdate="$(shell date +'%B %Y')" -f manpage -D . --xsltproc-opts="-param ulink.show 1" $< # Just for the fun of it # PDF help - needs FOP ffmpegfs.1.pdf: ffmpegfs.1.txt $(AM_V_GEN)a2x -a revnumber="$(VERSION)" \ -a revdate="$(shell date +'%B %Y')" -f pdf --fop --xsltproc-opts="-param ulink.show 1" $< #--xsltproc-opts="-param ulink.show 0" help-pdf: ffmpegfs.1.pdf # HTML help ffmpegfs.1.htmlhelp: ffmpegfs.1.txt $(AM_V_GEN)a2x -a revnumber="$(VERSION)" \ -a revdate="$(shell date +'%B %Y')" -D "`pwd`" -f htmlhelp $< @mv ffmpegfs.1.htmlhelp/index.html ffmpegfs.1.htmlhelp/manpages.html help-html: ffmpegfs.1.htmlhelp # Remove absolutely every generated file .PHONY: squeaky-clean squeaky-clean: maintainer-clean rm -rf aclocal.m4 autom4te.cache config config.log configure ffmpegfs.1 ffmpegfs.1.hhc ffmpegfs.1.hhp ffmpegfs.1.htmlhelp ffmpegfs.1.pdf ffmpegfs.1.text ffmpegfs.layout Makefile.in src/config.h.in src/.deps src/ffmpegfshelp.h src/Makefile.in src/vcd/.deps test/.deps test/Makefile.in dist-hook: if NOCHANGELOG @echo 'Not generating ChangeLog' else @echo 'Creating ChangeLog file from git log' @( set -o pipefail && \ echo 'Automatically generated by Makefile' ; echo ; \ git log --pretty="format:%d %h / %aD%n %an <%ae>%n * %s%n" \ | sed -E -e 'N;N;N' \ -e 's|^ \(.*tag: ([0-9\.]+).*\)[^\n]* (.{5,6} [0-9]{4}) .*|Changes for version \1 (\2):\n|' \ -e 's|^ \(.*\)||' ) > ChangeLog.tmp \ && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \ || ( rm -f ChangeLog.tmp ; exit 1 ) endif SRCS = $(OBJS:.o=.c) #.PHONY: all distclean doxy cppcheck # If makefile changes, maybe the list of sources has changed, so update doxygens list doxyfile.inc: Doxyfile Makefile @echo "PROJECT_NAME = \"FFmpegfs Fuse Multi Media Filesystem\"" > doxyfile.inc @echo "OUTPUT_DIRECTORY = doxygen" >> doxyfile.inc @echo "PREDEFINED = USE_LIBBLURAY" >> doxyfile.inc @echo "PREDEFINED += USE_LIBDVD" >> doxyfile.inc @echo "PREDEFINED += USE_LIBVCD" >> doxyfile.inc @echo "INPUT = $(SUBDIRS)" >> doxyfile.inc @echo "FILE_PATTERNS = *.h *.cc $(SRCS)" >> doxyfile.inc @echo "EXCLUDE = src/config.h" >> doxyfile.inc @echo "EXCLUDE += src/ffmpegfshelp.h" >> doxyfile.inc @echo "EXCLUDE += doxyfile.inc" >> doxyfile.inc @echo "HTML_EXTRA_FILES += ffmpegfs.1.htmlhelp/manpages.html" >> doxyfile.inc @echo "HTML_EXTRA_FILES += ffmpegfs.1.htmlhelp/docbook-xsl.css" >> doxyfile.inc @echo "INPUT += README.md" >> doxyfile.inc @echo "INPUT += INSTALL.md" >> doxyfile.inc @echo "INPUT += HISTORY.md" >> doxyfile.inc @echo "INPUT += PROBLEMS.md" >> doxyfile.inc @echo "INPUT += FEATURES.md" >> doxyfile.inc @echo "EXAMPLE_PATH += NEWS" >> doxyfile.inc @echo "EXAMPLE_PATH += TODO" >> doxyfile.inc @echo "EXAMPLE_PATH += COPYING" >> doxyfile.inc @echo "EXAMPLE_PATH += COPYING.DOC" >> doxyfile.inc @echo "EXAMPLE_PATH += COPYING.CC0" >> doxyfile.inc @echo "RECURSIVE = YES" >> doxyfile.inc @echo "SOURCE_BROWSER = YES" >> doxyfile.inc @echo "DISTRIBUTE_GROUP_DOC = YES" >> doxyfile.inc @echo "REFERENCED_BY_RELATION = YES" >> doxyfile.inc @echo "REFERENCES_RELATION = YES" >> doxyfile.inc @echo "EXTRACT_STATIC = YES" >> doxyfile.inc @echo "EXTRACT_PRIVATE = YES" >> doxyfile.inc @echo "PROJECT_NUMBER = $(VERSION)" >> doxyfile.inc # Run doxygen, first render Github markdown documents, see https://developer.github.com/v3/markdown/#render-an-arbitrary-markdown-document doxy: doxyfile.inc ffmpegfs.1.htmlhelp $(SRCS) @doxygen Doxyfile # Clean up Doxygen files doxy-clean: rm -Rf doxyfile.inc doxygen doxygen.log # Clean up extra stuff clean-local: doxy-clean rm -Rf ffmpegfs.1.htmlhelp ffmpegfs.1 ffmpegfs.1.hhc ffmpegfs.1.hhp ffmpegfs.1.pdf ffmpegfs.1.text src/ffmpegfshelp.h # Really clean up everything wipe-all: doxy-clean distclean rm -Rf autom4te.cache configure config aclocal.m4 Makefile.in test/Makefile.in test/.deps src/Makefile.in src/config.h.in src/.deps src/vcd/.deps src/config.h.in ffmpegfs.layout # Run cppcheck cppcheck: cppcheck --inline-suppr --force --enable=all --inconclusive --library=posix --output-file=cppcheck.log --suppressions-list=cppcheck-suppressions.txt -I src/ -I src/vcd/ -DUSE_LIBBLURAY -DUSE_LIBDVD -DUSE_LIBVCD -DHAVE_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -DUSE_LIBSWRESAMPLE -DLAVU_DEP_OLD_CHANNEL_LAYOUT=1 -D__GNUC_ -DPACKAGE_NAME="FFmpegfs" -DFFMPEFS_VERSION=\"V0.0\" -U__clang_version__ -UPRESCAN_FRAMES -DEXTRA_VERSION="" src/ src/vcd/ # android- Checks related to Android. # boost- Checks related to Boost library. # bugprone- Checks that target bugprone code constructs. CLANGCHECKS = bugprone-*,-bugprone-branch-clone # cert- Checks related to CERT Secure Coding Guidelines. CLANGCHECKS += ,cert-*,-cert-err09-cpp,-cert-err61-cpp,-cert-err58-cpp # cppcoreguidelines- Checks related to C++ Core Guidelines. # clang-analyzer- Clang Static Analyzer checks. CLANGCHECKS += ,clang-analyzer-* # google- Checks related to Google coding conventions. # hicpp- Checks related to High Integrity C++ Coding Standard. # llvm- Checks related to the LLVM coding conventions. # misc- Checks that we didn’t have a better category for. # modernize- Checks that advocate usage of modern (currently “modern” means “C++11”) language constructs. CLANGCHECKS += ,modernize-*,-modernize-use-trailing-return-type,-modernize-use-auto CLANGCHECKS += ,-modernize-use-using # mpi- Checks related to MPI (Message Passing Interface). # performance- Checks that target performance-related issues. CLANGCHECKS += ,performance-* # readability- Checks that target readability-related issues that don’t relate to any particular coding style. CLANGTIDY = clang-tidy -extra-arg="--std=c++17" -warnings-as-errors='*' --checks='$(CLANGCHECKS)' --quiet lint: $(CLANGTIDY) src/*.c* src/vcd/*.c* -- -Isrc -Isrc/vcd -I/usr/include/chardet -DHAVE_CONFIG_H -D_FILE_OFFSET_BITS=64 -DUSE_LIBDVD -DUSE_LIBBLURAY -DUSE_LIBVCD -D_GNU_SOURCE > lint.log install-exec-hook: @if [ -d "$(CACHEDIR)" ]; \ then \ echo "$(CACHEDIR) already exists."; \ else \ echo "Creating cache in $(CACHEDIR)."; \ mkdir -p "$(CACHEDIR)" || true; \ fi uninstall-hook: @if [ -d "$(CACHEDIR)" ]; \ then \ echo "Removing cache directory $(CACHEDIR)."; \ rm -Rf "$(CACHEDIR)" || true; \ fiffmpegfs-2.18/ChangeLog0000644000000000000000000154044115166203631011716 00000000000000Automatically generated by Makefile 5b414150 / Fri, 10 Apr 2026 16:22:07 +0200 Norbert Schlia * V2.18 release notes 45f51bca / Fri, 10 Apr 2026 16:09:26 +0200 Norbert Schlia * build: fix handling of compiler flags and Debian hardening 1408725b / Fri, 10 Apr 2026 15:58:58 +0200 Norbert Schlia * Fix https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1119414: preserve the default build flags a20dfee8 / Fri, 10 Apr 2026 15:53:12 +0200 Norbert Schlia * Updated to latest 8c88477d / Fri, 10 Apr 2026 15:52:46 +0200 Norbert Schlia * Updated (c) to 2026 0aff42e2 / Fri, 10 Apr 2026 15:34:14 +0200 Norbert Schlia * Fix https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1115015: Added missing #include 161bf758 / Fri, 10 Apr 2026 15:32:00 +0200 Norbert Schlia * Updated (c) to 2026 b01442fc / Thu, 4 Dec 2025 12:52:45 +0100 Norbert Schlia * CodeQL and Docker Image build states 2dbd0565 / Thu, 4 Dec 2025 12:49:29 +0100 Norbert Schlia * Add CodeQL and Docker Image build states 04b9f2e5 / Thu, 4 Dec 2025 12:48:58 +0100 Norbert Schlia * Fix Dockerfile ec905ae7 / Thu, 4 Dec 2025 12:32:26 +0100 Norbert Schlia * Nail dockerfile to Trixie b3551a9f / Thu, 4 Dec 2025 12:24:01 +0100 Norbert Schlia * Refactoring/make up to date to fix build problem a7110fac / Thu, 4 Dec 2025 12:16:43 +0100 Norbert Schlia * Update list of libraries 24b9f214 / Thu, 4 Dec 2025 12:13:04 +0100 Norbert Schlia * Update list of libraries c3b7ec6f / Thu, 4 Dec 2025 11:50:59 +0100 Norbert Schlia * Modernised old code dad07910 / Thu, 4 Dec 2025 11:50:19 +0100 Norbert Schlia * Ignore /build/ directory 5581dadf / Thu, 4 Dec 2025 11:49:47 +0100 Norbert Schlia * Issue #173: Fix list of files in output directory which was incomplete 22a58538 / Thu, 4 Dec 2025 11:45:15 +0100 Norbert Schlia * fuse3 must obviously be explicitly installed, libfuse3-dev does not seem to bring it along bff843db / Thu, 4 Dec 2025 11:44:17 +0100 Norbert Schlia * Revised for more readablity; fixed minor mistakes 323b55bb / Thu, 4 Dec 2025 11:34:40 +0100 Norbert Schlia * Move #define AV_PROFILE_UNKNOWN near to where it is used 9d0abcc8 / Thu, 4 Dec 2025 11:29:46 +0100 Norbert Schlia * Cosmetical: do not return inside function but use return at end cca1e251 / Thu, 4 Dec 2025 11:29:00 +0100 Norbert Schlia * (c) to 2025 45d2ba24 / Sun, 31 Aug 2025 17:47:46 +0200 Norbert Schlia * Corrected markup syntax af7002fc / Sun, 31 Aug 2025 16:45:20 +0200 Norbert Schlia * Removed outdated compiler and OS versions from build list 14af81cc / Sun, 31 Aug 2025 16:33:57 +0200 Norbert Schlia * Reduce list of test builds da7681e4 / Sun, 31 Aug 2025 16:31:44 +0200 Norbert Schlia * Update news f8d50b37 / Thu, 28 Aug 2025 14:46:57 +0200 Norbert Schlia * Udpate upload-artifact@v3 to 4 0a377714 / Thu, 28 Aug 2025 14:44:06 +0200 Norbert Schlia * Deprecation fixed: 979f69a4 / Thu, 28 Aug 2025 14:42:43 +0200 Norbert Schlia * Avoid missing \0 with strncpy 66e1df28 / Thu, 28 Aug 2025 14:42:15 +0200 Norbert Schlia * Prefer thread-safe strerror_r where available 341a3576 / Thu, 28 Aug 2025 14:41:57 +0200 Norbert Schlia * to_utf8(): more UTF formats dedaf3ed / Thu, 28 Aug 2025 14:40:46 +0200 Norbert Schlia * Replace deprected std::codecvt with iconv in read_file f5e62b6d / Thu, 28 Aug 2025 14:38:10 +0200 Norbert Schlia * Fix "ERROR : FILTER [out @ 0x7f2c690ecc80] Option 'pix_fmts' is not a runtime option and so cannot be set after the object has been initialized" 8d3eb2c9 / Thu, 28 Aug 2025 14:36:45 +0200 Norbert Schlia * av_format_inject_global_side_data() has been deprecated & removed 6867c802 / Thu, 28 Aug 2025 14:34:50 +0200 Norbert Schlia * #define AV_PROFILE_UNKNOWN when required 023e68d3 / Thu, 28 Aug 2025 14:34:11 +0200 Norbert Schlia * (c) to 2025 3d22245d / Thu, 28 Aug 2025 14:33:24 +0200 Norbert Schlia * Removed unneccessary unlock call Use std::lock_guard instead of manual lock/unlock c86db8ba / Thu, 28 Aug 2025 14:32:38 +0200 Norbert Schlia * avcodec_close(9 is deprecated, and was removed recently c9090ff8 / Thu, 28 Aug 2025 14:32:15 +0200 Norbert Schlia * (c) to 2025 b5ce779f / Thu, 28 Aug 2025 14:31:26 +0200 Norbert Schlia * Removed unneccessary "volatile" declaration af58f7ec / Thu, 28 Aug 2025 14:30:14 +0200 Norbert Schlia * Version to 2.18 (c) to 2015 a5645b02 / Sun, 26 Jan 2025 19:19:57 +0100 Norbert Schlia * Check if --profile and format versions are compatible ff0caf3d / Sun, 26 Jan 2025 19:18:00 +0100 Norbert Schlia * Fix several warnings 4629655c / Sun, 26 Jan 2025 19:17:14 +0100 Norbert Schlia * Format f6ca3fb7 / Sun, 26 Jan 2025 19:16:33 +0100 Norbert Schlia * Add --profile=itunes option for ALAC 969063ea / Sun, 26 Jan 2025 19:08:35 +0100 Norbert Schlia * Ignore /.qtc_clangd/ und /CMakeCache.txt.prev 593c47fe / Fri, 29 Nov 2024 08:30:50 +0100 Norbert Schlia * Removed download url containing outdated version bf347371 / Sun, 10 Nov 2024 17:14:34 +0100 Norbert Schlia * Update CodeQL Action v2 to v3 fd88b514 / Sun, 10 Nov 2024 17:03:01 +0100 Norbert Schlia * Update with libfuse3 00d8f56a / Sun, 10 Nov 2024 16:59:09 +0100 Norbert Schlia * Update with Fuse 3 d0d5195a / Sun, 10 Nov 2024 16:58:41 +0100 Norbert Schlia * Update prequisites with Fuse 3 1a4d8375 / Sun, 10 Nov 2024 16:26:46 +0100 Norbert Schlia * Move from Fuse 2 to Fuse 3 API 40944bed / Sun, 6 Oct 2024 08:41:58 +0200 Norbert Schlia * Bring news up to date efd6821c / Tue, 1 Oct 2024 21:39:07 +0200 Norbert Schlia * Use std::shared/unique_ptr to avoid memory leaks e029bd9f / Tue, 1 Oct 2024 20:48:56 +0200 Norbert Schlia * Add std::nothrow to new calls 05d21280 / Tue, 1 Oct 2024 20:36:00 +0200 Norbert Schlia * Remove unnecessary variables 22fa9e89 / Tue, 1 Oct 2024 20:31:56 +0200 Norbert Schlia * Change enum to enum class 297fe62a / Tue, 1 Oct 2024 19:51:37 +0200 Norbert Schlia * Replace C-style arrays with std::array 65034a2a / Tue, 1 Oct 2024 18:49:28 +0200 Norbert Schlia * Ignore annoying warnings in FFmmpeg headers 6223a195 / Sun, 22 Sep 2024 16:38:32 +0200 Norbert Schlia * Closes #164: Allow jumping back in time to lower HLS segments 754655ce / Sun, 22 Sep 2024 16:32:03 +0200 Norbert Schlia * Log more details about buffer::reserve errors 682859e1 / Fri, 9 Aug 2024 21:22:48 +0200 Norbert Schlia * Remove experimental code 012378b6 / Fri, 9 Aug 2024 09:58:32 +0200 Norbert Schlia * Changed quality from 34 to 40 for hardware encoded video streams to create slightly smaller files. cae2930d / Fri, 9 Aug 2024 09:50:57 +0200 Norbert Schlia * Closes #162: If not present, add time stamps to the copied streams 44ed90cc / Fri, 9 Aug 2024 09:49:01 +0200 Norbert Schlia * Add current 2.17 to history e70809b6 / Fri, 9 Aug 2024 09:48:18 +0200 Norbert Schlia * 'Closes' does not work in Github, replaced with 'Issue' bb0af93e / Thu, 8 Aug 2024 09:37:35 +0200 Norbert Schlia * Issue #161: Edit documentation of --autocopy in connection with --audio/videcodec e15605e4 / Wed, 7 Aug 2024 22:25:09 +0200 Norbert Schlia * Update Doxygen comments 01610b94 / Wed, 7 Aug 2024 22:11:30 +0200 Norbert Schlia * Update to V2.17 873ad163 / Wed, 7 Aug 2024 22:10:24 +0200 Norbert Schlia * Fix format 75804391 / Wed, 7 Aug 2024 22:09:59 +0200 Norbert Schlia * Update to Doxygen 1.9.4 beaecfbf / Wed, 7 Aug 2024 22:09:13 +0200 Norbert Schlia * Update code to C++17 22110e42 / Wed, 7 Aug 2024 22:00:08 +0200 Norbert Schlia * Refactoring: preloading static variables 070b4b44 / Wed, 7 Aug 2024 21:59:05 +0200 Norbert Schlia * Make log entries for unsupported sample/video/audio formats more concise 47b6f371 / Wed, 7 Aug 2024 21:56:25 +0200 Norbert Schlia * Amend doxygen comments 47931037 / Wed, 7 Aug 2024 21:55:14 +0200 Norbert Schlia * Reformat 269a8476 / Wed, 7 Aug 2024 21:54:18 +0200 Norbert Schlia * Remove unused includes d8144119 / Thu, 13 Jun 2024 21:30:27 +0200 Norbert Schlia * Set version to 2.17 542697f1 / Thu, 13 Jun 2024 05:24:26 +0200 Norbert Schlia * Fix watch line to current Github structure eefbadeb / Thu, 13 Jun 2024 05:23:54 +0200 Norbert Schlia * (c) to 2024 11efa6b0 / Mon, 10 Jun 2024 20:43:41 +0200 Norbert Schlia * Update formatting 03366d5e / Mon, 10 Jun 2024 19:16:55 +0200 Norbert Schlia * Prepare release 2.16 392ebe51 / Mon, 10 Jun 2024 09:16:11 +0200 Norbert Schlia * Update docs 7cd5f5dd / Mon, 10 Jun 2024 09:15:39 +0200 Norbert Schlia * Fixed deprecation: 2014-05-18 - 68c0518 / fd05602 - lavc 55.63.100 / 55.52.0 - avcodec.h Add avcodec_free_context(). From now on it should be used for freeing AVCodecContext. 455e4c17 / Mon, 10 Jun 2024 09:14:35 +0200 Norbert Schlia * Fixed deprecation: 2023-05-15 - 7d1d61cc5f5 - lavc 60 - avcodec.h Depreate AVCodecContext.ticks_per_frame in favor of AVCodecContext.framerate (encoding) and AV_CODEC_PROP_FIELDS (decoding). 288b7450 / Mon, 10 Jun 2024 09:12:46 +0200 Norbert Schlia * Bugfix: Closes#1072412: Fix build with FFmpeg 7.0. write_packet() now with const buffer as of Libavformat 61+. dc020311 / Mon, 10 Jun 2024 09:00:31 +0200 Norbert Schlia * Fix syntax error: duplicate 'in' 7702ff4a / Mon, 10 Jun 2024 08:58:09 +0200 Norbert Schlia * Logging: Generated format specifier was missing the \0 ff03576a / Mon, 10 Jun 2024 08:56:01 +0200 Norbert Schlia * Fix docs: Sample rate is in Hz, not kHz d2879e40 / Mon, 10 Jun 2024 08:55:32 +0200 Norbert Schlia * Fix case fallthrough warnings 61c2d5e3 / Fri, 19 Apr 2024 21:34:16 +0200 Norbert Schlia * Use new condensed syntax for format strings in logging 051c746a / Fri, 19 Apr 2024 21:28:40 +0200 Norbert Schlia * Enable condensed logging format strings: Allow %n instead of %<%f>n Also fixes problems with mistakeable strings like %<%02x>n cd8c64d9 / Tue, 13 Feb 2024 20:52:35 +0100 Norbert Schlia * Set version to 2.16 16b8fceb / Tue, 13 Feb 2024 20:42:16 +0100 Norbert Schlia * Enable std::string objects to be passed to logging dbe1498a / Sat, 3 Feb 2024 20:38:03 +0100 Norbert Schlia * Get release 2.15 ready 9c2ad450 / Sun, 21 Jan 2024 23:12:47 +0100 Norbert Schlia * Refactoring 200a3fa0 / Sun, 21 Jan 2024 20:19:36 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 48eb91cf / Sat, 20 Jan 2024 21:47:59 +0100 Norbert Schlia * Issue #156: AV1 not supported yet de159194 / Thu, 18 Jan 2024 16:11:49 +0100 Norbert Schlia * Issue #136: dumped and even more cmake remains eea712b6 / Thu, 18 Jan 2024 16:07:51 +0100 Norbert Schlia * Issue #136: hopefully now removed all cmake builds 0429ddf6 / Thu, 18 Jan 2024 07:54:13 +0100 Norbert Schlia * Issue #136: remove from Github build b64f812f / Thu, 18 Jan 2024 07:53:14 +0100 Norbert Schlia * List of versions now up-to-date ac1000bf / Thu, 18 Jan 2024 07:25:34 +0100 Norbert Schlia * Issue #136: Documentation f63fd2b3 / Thu, 18 Jan 2024 07:14:08 +0100 Norbert Schlia * Closes #136: The CMake build files have been removed. Support was never more than experimental, and CMake lacks a good uninstall option. Will stick to automake systems from now on. e2e62fc4 / Wed, 17 Jan 2024 17:17:39 +0100 Norbert Schlia * Reformat, added bugfix infos 6b2bd159 / Wed, 17 Jan 2024 17:16:50 +0100 Norbert Schlia * (c) to 2024 9547df13 / Sat, 13 Jan 2024 22:09:03 +0100 Norbert Schlia * Closes #153: added description for --include_extensions parameter 8d165553 / Wed, 20 Dec 2023 13:08:18 +0100 Norbert Schlia * Issue #151: Update fix list 705aef3f / Wed, 20 Dec 2023 11:36:49 +0100 Norbert Schlia * Merge pull request #152 from mihaiush/master fcd5ffa1 / Wed, 20 Dec 2023 08:30:12 +0200 Mihai Craiu * fix "cannot pass object ... through variadic function" c6bab015 / Tue, 19 Dec 2023 19:44:36 +0200 Mihai Craiu * check if stream audio/video in FFmpeg_Transcoder::can_copy_stream dc593957 / Tue, 19 Dec 2023 17:51:33 +0100 Norbert Schlia * Formatting 97432d8b / Fri, 8 Dec 2023 08:20:12 +0100 Norbert Schlia * Better put xxd in main list 5517c7e5 / Fri, 8 Dec 2023 08:18:06 +0100 Norbert Schlia * xxd was missing e3f10737 / Sun, 10 Sep 2023 17:12:36 +0200 Norbert Schlia * Standards-Version: 4.6.2 Fix release URL 481ddbbe / Thu, 31 Aug 2023 21:20:37 +0200 Norbert Schlia * Suppress single errors inline 7cc0c2a8 / Tue, 29 Aug 2023 05:35:45 +0200 Norbert Schlia * Fix: Condition 'version_major_l==version_major_r' is always true 1a938da6 / Tue, 29 Aug 2023 05:32:52 +0200 Norbert Schlia * Added comment bde4c73d / Tue, 29 Aug 2023 05:23:09 +0200 Norbert Schlia * Revert "Fix cppcheck: Condition 'decoded' is always true [knownConditionTrueFalse]" bd4a7220 / Tue, 29 Aug 2023 05:22:40 +0200 Norbert Schlia * Fix: performance: Ineffective call of function 'substr' 4d7b6b54 / Tue, 29 Aug 2023 05:22:10 +0200 Norbert Schlia * Fix: Redundant condition f3c8f764 / Tue, 29 Aug 2023 05:21:14 +0200 Norbert Schlia * Fix ccppcheck: Suppress ridiculous warning 8f7d0962 / Tue, 29 Aug 2023 05:20:20 +0200 Norbert Schlia * Fix ccppcheck: information: Unmatched suppression: unusedStructMember 794f9d29 / Sun, 27 Aug 2023 21:49:21 +0200 Norbert Schlia * Fix cppcheck: The scope of the variable 'fullname' can be reduced. 88ffc220 / Sun, 27 Aug 2023 21:29:07 +0200 Norbert Schlia * Fix cppcheck: Condition 'decoded' is always true [knownConditionTrueFalse] a8eca334 / Sun, 27 Aug 2023 21:28:42 +0200 Norbert Schlia * Fix cppcheck: Condition 'data_present' is always true [knownConditionTrueFalse] c92971b4 / Sun, 27 Aug 2023 21:04:14 +0200 Norbert Schlia * Fix cppcheck: scope of the variable 'master_contents' can be reduced. 4d2dc523 / Sun, 27 Aug 2023 20:59:33 +0200 Norbert Schlia * Fix cppcheck: Variable can be declared as reference to const [constVariable] 4870d040 / Sun, 27 Aug 2023 20:57:39 +0200 Norbert Schlia * Fix cppcheck: Local variable shadows outer function/variable 0e417496 / Sun, 27 Aug 2023 20:36:02 +0200 Norbert Schlia * Fix cppcheck: Member variable 'Cache_Entry::m_suspend_timeout' is not initialized in the constructor. [uninitMemberVarPrivate] 833491ff / Sun, 27 Aug 2023 20:33:37 +0200 Norbert Schlia * Fix cppcheck: Local variable 'level_map' shadows outer variable [shadowVariable] d3ec4404 / Sun, 27 Aug 2023 20:21:49 +0200 Norbert Schlia * Fix cppcheck: Variable 'ci' can be declared as reference to const 8374cebd / Sun, 27 Aug 2023 20:20:12 +0200 Norbert Schlia * Fix cppcheck: Local variable 'cachefile' shadows outer function eb362b6a / Sun, 27 Aug 2023 20:18:12 +0200 Norbert Schlia * Fix cppcheck: Condition 'ci->m_buffer_size!=segment_size' is always false 6c8a3165 / Sun, 27 Aug 2023 18:59:28 +0200 Norbert Schlia * Fix file sizes to new FFmpeg API cd372010 / Sun, 27 Aug 2023 18:58:51 +0200 Norbert Schlia * V2.15 date to 08/2023 fe54b06f / Sun, 27 Aug 2023 18:58:17 +0200 Norbert Schlia * Set version to 2.15 005c12f0 / Fri, 7 Jul 2023 05:14:40 +0200 Norbert Schlia * Add V2.13/14 40832445 / Thu, 6 Jul 2023 21:39:13 +0200 Norbert Schlia * Set development version to 2.14 Fix deprecations in FFmpeg 6.x b95ece14 / Thu, 15 Jun 2023 21:25:06 +0200 Norbert Schlia * Update docker image for Debian Bookworm 4452aebc / Thu, 15 Jun 2023 21:22:31 +0200 Norbert Schlia * Update docker image for Debian Bookworm 180d88b0 / Thu, 15 Jun 2023 20:55:27 +0200 Norbert Schlia * Prepare v2.14 a8d33438 / Thu, 15 Jun 2023 20:54:50 +0200 Norbert Schlia * Closes#1037653: Fix build with GCC-13 db6947ee / Wed, 17 May 2023 07:08:21 +0200 Norbert Schlia * Formatting bbf89140 / Fri, 12 May 2023 21:45:04 +0200 Norbert Schlia * Set V2.14 date to 05/23 eaf2aeec / Thu, 27 Apr 2023 19:05:58 +0200 Norbert Schlia * Projects renamed, removed (). Would not build every now or then a3db7358 / Thu, 27 Apr 2023 17:42:51 +0200 Norbert Schlia * Enforce more binary security f90dbc66 / Thu, 27 Apr 2023 17:42:07 +0200 Norbert Schlia * Parameter size should be index_to_replace in format_helper overload 69356277 / Thu, 27 Apr 2023 17:40:55 +0200 Norbert Schlia * Fix some typos in doxygen comments b8395384 / Thu, 27 Apr 2023 17:39:59 +0200 Norbert Schlia * Should end timeout suspension; otherwise, read may hang. 7fa559c1 / Thu, 27 Apr 2023 17:39:25 +0200 Norbert Schlia * Should report every cache hit, even after misses 605b2f06 / Tue, 14 Mar 2023 02:31:16 +0100 Norbert Schlia * Closes #146: Fix build with FFmpeg 6 122c2696 / Sun, 26 Feb 2023 00:06:02 +0100 Norbert Schlia * Fix typo in Doxygen comment c2d4df1f / Sat, 25 Feb 2023 19:15:45 +0100 Norbert Schlia * Revisited misleading paragraph 875bbe00 / Sat, 25 Feb 2023 18:39:09 +0100 Norbert Schlia * Documentation fefd1dda / Sat, 25 Feb 2023 18:18:31 +0100 Norbert Schlia * Issue #144: revert memmove to memcpy 15f0ef58 / Sat, 25 Feb 2023 16:27:31 +0100 Norbert Schlia * Add missing Doxygen comment 36e496f7 / Sat, 25 Feb 2023 16:24:27 +0100 Norbert Schlia * Issue #143: additional thread synchronisation c0dbe3f5 / Sat, 25 Feb 2023 16:20:46 +0100 Norbert Schlia * Refactoring and more c++17 constructs 2454505e / Sat, 25 Feb 2023 02:12:00 +0100 Norbert Schlia * Issue #143: Added some missing synchronisation objects 246960a3 / Sat, 25 Feb 2023 02:10:33 +0100 Norbert Schlia * Fix logging: got confused which HLS segment log entries where about c86e1102 / Thu, 23 Feb 2023 09:40:47 +0100 Norbert Schlia * Force rebuild 9ac25659 / Thu, 23 Feb 2023 09:32:25 +0100 Norbert Schlia * Force rebuild ad6b9e62 / Thu, 23 Feb 2023 09:25:09 +0100 Norbert Schlia * Formatting f72548c1 / Thu, 23 Feb 2023 09:24:32 +0100 Norbert Schlia * Capitalise headlines 31212744 / Thu, 23 Feb 2023 09:23:46 +0100 Norbert Schlia * Renamed built-in logfiles to *_builtin.log 709db3c6 / Thu, 23 Feb 2023 09:20:56 +0100 Norbert Schlia * Revisited: corrected grammar, rephrased some parts a8f7d5c9 / Thu, 23 Feb 2023 09:19:29 +0100 Norbert Schlia * Issue #144 is not yet fixed, removed from fix list 6fd9ca12 / Thu, 23 Feb 2023 09:18:36 +0100 Norbert Schlia * Do not forcibly rebuild all every time d1732e8e / Mon, 20 Feb 2023 18:48:56 +0100 Norbert Schlia * Refactoring 5627f4b8 / Mon, 20 Feb 2023 17:36:26 +0100 Norbert Schlia * Issue #144: Using memmove instead of memcpy (although no overlap occurs, seems to fix the issue 130f293b / Mon, 20 Feb 2023 17:31:20 +0100 Norbert Schlia * When transferring from cache to Fuse buffer, avoid a possible 1 byte overrun 6721dabe / Mon, 20 Feb 2023 17:26:05 +0100 Norbert Schlia * Cleanup #includes 4291f3ba / Mon, 20 Feb 2023 17:23:29 +0100 Norbert Schlia * Replace memset/memcpy with std:memset/std::memcpy bed02944 / Sat, 18 Feb 2023 20:52:06 +0100 Norbert Schlia * Revisited 4fccf9c3 / Sat, 18 Feb 2023 19:11:19 +0100 Norbert Schlia * Issue #143: do not try to copy zero sized memory blocks e5a8825e / Sat, 18 Feb 2023 13:39:13 +0100 Norbert Schlia * Cleanup 95a9eacf / Fri, 17 Feb 2023 21:37:54 +0100 Norbert Schlia * Constructors have no return code 64346dd9 / Fri, 17 Feb 2023 21:34:21 +0100 Norbert Schlia * Constructors have no return code 3caa1bfe / Fri, 17 Feb 2023 21:23:14 +0100 Norbert Schlia * Doxygen: hwdevice_ctx_free() has no return code 4ace1d21 / Fri, 17 Feb 2023 19:31:35 +0100 Norbert Schlia * Report internal error if size(segment_no) fails 3d6d0be1 / Thu, 16 Feb 2023 20:42:21 +0100 Norbert Schlia * Formatting a689c383 / Thu, 16 Feb 2023 20:40:46 +0100 Norbert Schlia * Frame sets: ignore fuse_interrupted 40c294c1 / Thu, 16 Feb 2023 20:39:09 +0100 Norbert Schlia * fuse_interrupted is no error. Return ERROR_SUCCES (though by design there is noone to receive it) 1a19f9e3 / Thu, 16 Feb 2023 20:38:26 +0100 Norbert Schlia * Return errno=EINTR on thread_exit 875386de / Thu, 16 Feb 2023 20:35:36 +0100 Norbert Schlia * Fix seek requests that are being ignored with frame sets. 7bdc6459 / Thu, 16 Feb 2023 20:31:36 +0100 Norbert Schlia * Fix PTS to frame number and vice versa conversion 2a1768d8 / Thu, 16 Feb 2023 20:29:55 +0100 Norbert Schlia * Changed log entry which was a bit unclear 593c33c2 / Tue, 14 Feb 2023 14:21:38 +0100 Norbert Schlia * Fix doygen comments 4e66687b / Sun, 12 Feb 2023 14:32:55 +0100 Norbert Schlia * Move code/packing status up 155d8ccc / Sun, 12 Feb 2023 14:32:39 +0100 Norbert Schlia * Enhance readability of the logs bc04d86a / Sun, 12 Feb 2023 12:53:01 +0100 Norbert Schlia * Remove duplicated issue 6c7aa21e / Sat, 11 Feb 2023 23:06:35 +0100 Norbert Schlia * JPG frame set images may be 1 tooting byte larger 78b305b1 / Sat, 11 Feb 2023 23:03:45 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 1ab7e791 / Sat, 11 Feb 2023 23:03:36 +0100 Norbert Schlia * Silence make output 8bea5986 / Sat, 11 Feb 2023 22:55:57 +0100 Norbert Schlia * Archive all results 4134a309 / Sat, 11 Feb 2023 22:47:33 +0100 Norbert Schlia * Update the following actions to use Node.js 16: actions/checkout@v2, actions/upload-artifact@v2 8bac3b3e / Sat, 11 Feb 2023 22:36:52 +0100 Norbert Schlia * Speed up builds 7b1b57c7 / Sat, 11 Feb 2023 22:25:29 +0100 Norbert Schlia * Debian 12 GCC is now at V12.2.0 4062ed0f / Sat, 11 Feb 2023 22:21:38 +0100 Norbert Schlia * Closes #119: Fix frame set generation 7a9aa614 / Sat, 11 Feb 2023 09:26:38 +0100 Norbert Schlia * Replace defines with const int 0e64be50 / Sat, 11 Feb 2023 09:23:08 +0100 Norbert Schlia * Log EOFs more explicitly d47203a0 / Fri, 10 Feb 2023 23:54:42 +0100 Norbert Schlia * Use reentrant replacement function 'localtime_r' ee5065e8 / Fri, 10 Feb 2023 23:53:43 +0100 Norbert Schlia * Initialise all variables in CACHEINFO df8239aa / Fri, 10 Feb 2023 22:16:22 +0100 Norbert Schlia * Clean up 7352d2fa / Fri, 10 Feb 2023 22:12:02 +0100 Norbert Schlia * Clean up cf87efc4 / Fri, 10 Feb 2023 22:10:47 +0100 Norbert Schlia * Fix typo in comment bc4804fc / Fri, 10 Feb 2023 09:56:00 +0100 Norbert Schlia * Avoid crash when cache object is deleted 3fc59a53 / Fri, 10 Feb 2023 09:47:40 +0100 Norbert Schlia * Improved readability of log output 2ba6d9d5 / Thu, 9 Feb 2023 20:19:32 +0100 Norbert Schlia * Cleanup cf32ae00 / Thu, 9 Feb 2023 12:22:11 +0300 Norbert Schlia * Added file size check to frame set checks 0c1fa0dc / Thu, 9 Feb 2023 12:18:29 +0300 Norbert Schlia * Better readable output of size check 165c692a / Thu, 9 Feb 2023 12:17:16 +0300 Norbert Schlia * Package name fpr cppcheck was accidentally called XXX 4b873f6a / Thu, 9 Feb 2023 12:16:24 +0300 Norbert Schlia * Formatting 40ea1fc7 / Thu, 9 Feb 2023 12:14:59 +0300 Norbert Schlia * Bugfix: Use AVSEEK_FLAG_FRAME for frame sets 909e05bc / Thu, 9 Feb 2023 12:09:35 +0300 Norbert Schlia * Revisited log entries c41fe13c / Thu, 9 Feb 2023 12:04:45 +0300 Norbert Schlia * Clean up 924c6841 / Thu, 9 Feb 2023 12:04:27 +0300 Norbert Schlia * Rearrange includes e7204043 / Thu, 9 Feb 2023 12:03:22 +0300 Norbert Schlia * Clean up a31e6dbc / Thu, 9 Feb 2023 12:03:06 +0300 Norbert Schlia * If cache path does not exist, ignore silently 1048c73c / Thu, 9 Feb 2023 12:02:21 +0300 Norbert Schlia * 'Clean up ca48f989 / Thu, 9 Feb 2023 12:01:52 +0300 Norbert Schlia * 'Mapping cache file* log entry is just trace, not error. Change size to be human readable. 191d9e8b / Thu, 9 Feb 2023 12:00:42 +0300 Norbert Schlia * Use speaking names fpr lock_guards instead of just lock 07a4cb44 / Thu, 9 Feb 2023 11:53:17 +0300 Norbert Schlia * cp to temp directory instead of /dev/null Use -p parameter with cp 9f9736e6 / Thu, 9 Feb 2023 11:53:02 +0300 Norbert Schlia * Note use of -p parameter in cp operations 07ee39fb / Sat, 4 Feb 2023 20:52:38 +0300 Norbert Schlia * Changed mutex names to better match purpose 61871469 / Sat, 4 Feb 2023 11:25:01 +0300 Norbert Schlia * Refactoring 5264e128 / Sat, 4 Feb 2023 11:19:12 +0300 Norbert Schlia * Avoid crash during shutdown if cache object had already been closed 4fe760d0 / Sat, 4 Feb 2023 11:17:46 +0300 Norbert Schlia * Clean up 40b71d05 / Sat, 4 Feb 2023 11:12:11 +0300 Norbert Schlia * Use std::this_thread::yield() in place of sleep(0) eff9e551 / Sat, 4 Feb 2023 11:09:35 +0300 Norbert Schlia * Enhancement: Record milliseconds for every log event 0eb83c23 / Sat, 4 Feb 2023 11:08:52 +0300 Norbert Schlia * Remove trailing / from file names b9c6841d / Sat, 4 Feb 2023 11:05:18 +0300 Norbert Schlia * Use std::this_thread::sleep_for replacing of own sleep() implementations 02b37267 / Sat, 4 Feb 2023 10:52:27 +0300 Norbert Schlia * Remove superfluous include transcode.h\nMove ffmpegfs.h to cc c2ea6be0 / Sat, 4 Feb 2023 10:43:32 +0300 Norbert Schlia * FFmpeg_Transcoder::process_single_fr(): use new DECODER_STATUS enum instead of magic numbers e85d7649 / Sat, 4 Feb 2023 10:34:25 +0300 Norbert Schlia * Replace volatile variables with std::atomic 5fb503e7 / Sat, 4 Feb 2023 07:30:41 +0100 Norbert Schlia * Merge pull request #142 from Longhao-Chen/patch-1 e4bcbbec / Sat, 4 Feb 2023 14:17:22 +0800 Longhao.Chen * Fix minor typos in man page 210f7c55 / Thu, 2 Feb 2023 06:58:58 +0100 Norbert Schlia * Add missing underscores to index_0_av.m3u8 23e269c1 / Thu, 2 Feb 2023 06:48:13 +0100 Norbert Schlia * Fix type: senconds -> seconds 97764eb3 / Thu, 2 Feb 2023 06:42:59 +0100 Norbert Schlia * Remove forgotten debug log entry 0b4a4727 / Wed, 1 Feb 2023 16:38:22 +0100 Norbert Schlia * Manual reverse merge from windows branch 653eab6f / Wed, 1 Feb 2023 15:23:59 +0100 Norbert Schlia * Update seek request AFTER decoding a frame ac4598c6 / Wed, 1 Feb 2023 09:02:18 +0100 Norbert Schlia * Date to 02/23 8c6fb2cd / Wed, 1 Feb 2023 08:48:43 +0100 Norbert Schlia * Avoid reallocations: restore cache size after invalidation 767415c9 / Wed, 1 Feb 2023 08:43:13 +0100 Norbert Schlia * Avoid race condition causing the inter-process semaphore creation to fail for sencond process 69d68978 / Wed, 1 Feb 2023 08:32:55 +0100 Norbert Schlia * Avoid reallocations: reserve sufficient space for whole frame set 3f1fb884 / Wed, 1 Feb 2023 08:31:59 +0100 Norbert Schlia * Add last_seek_frame_no() accessor 291623a3 / Wed, 1 Feb 2023 08:31:12 +0100 Norbert Schlia * Format 1b57e0e0 / Wed, 1 Feb 2023 08:30:46 +0100 Norbert Schlia * Frame sets: do not call read_frame over when first call succeeded d3f2da46 / Wed, 1 Feb 2023 08:28:57 +0100 Norbert Schlia * Fix comment 76fd5050 / Wed, 1 Feb 2023 08:28:27 +0100 Norbert Schlia * Frame set check with regexp actually checked the same files over 7ef89fe7 / Wed, 25 Jan 2023 19:51:27 +0100 Norbert Schlia * Checking folders to see if they can be transcoded is completely pointless. Directories are now immediately skipped. 702a931f / Mon, 23 Jan 2023 13:35:39 +0100 Norbert Schlia * Define preallocation factor as PREALLOC_FACTOR const 43ad4eac / Mon, 23 Jan 2023 13:35:06 +0100 Norbert Schlia * Report "stop_timer(): timer_delete failed" if errno != 0 only a0b09a28 / Mon, 16 Jan 2023 18:45:21 +0100 Norbert Schlia * Fix warning a5fbd2da / Sun, 15 Jan 2023 21:25:10 +0100 Norbert Schlia * Issue #141: Documentation fd438844 / Sun, 15 Jan 2023 21:23:47 +0100 Norbert Schlia * Format 405921b9 / Sun, 15 Jan 2023 21:22:34 +0100 Norbert Schlia * Version to 2.14 029f3648 / Sun, 15 Jan 2023 20:57:00 +0100 Norbert Schlia * Issue #141: Reduce allocations by grabbing larger blocks Allocate full expected file size right when opening instead of getting one small block first f47989d4 / Sun, 15 Jan 2023 12:00:07 +0100 Norbert Schlia * Date of v2.13 97548973 / Sun, 15 Jan 2023 11:45:52 +0100 Norbert Schlia * Add V2.13 dd9c7bb1 / Sun, 15 Jan 2023 08:58:15 +0100 Norbert Schlia * Prepare 2.13 release b857c2b7 / Sun, 15 Jan 2023 08:12:58 +0100 Norbert Schlia * Also include CC0 1.0 Universal license into dist c49e713c / Sat, 14 Jan 2023 21:29:22 +0100 Norbert Schlia * Released Windows version 53cff28b / Sat, 14 Jan 2023 16:12:09 +0100 Norbert Schlia * Cleanup a7859c31 / Fri, 13 Jan 2023 22:40:52 +0100 Norbert Schlia * Mention windows under development 336a1b83 / Fri, 13 Jan 2023 22:40:12 +0100 Norbert Schlia * Fix misaligned log entries 0817ca8e / Thu, 12 Jan 2023 17:56:43 +0100 Norbert Schlia * Fix typo ae19f23b / Thu, 12 Jan 2023 17:26:13 +0100 Norbert Schlia * Date to 1/2023 f2baac27 / Thu, 12 Jan 2023 17:25:03 +0100 Norbert Schlia * Fixe crash in implode() 58460da9 / Thu, 12 Jan 2023 17:20:30 +0100 Norbert Schlia * Fix crash in implode() when empty string was passed (windows only) 3d377a7b / Thu, 12 Jan 2023 17:19:37 +0100 Norbert Schlia * libcue 2.1.0 is sufficient, lowered version requirement 99407067 / Thu, 12 Jan 2023 17:18:23 +0100 Norbert Schlia * Pass error conditions to make utility dd06460e / Thu, 12 Jan 2023 17:17:20 +0100 Norbert Schlia * ffmpegfs_statfs() should never return an error 52c4f2a4 / Thu, 12 Jan 2023 17:16:36 +0100 Norbert Schlia * Fix crash in implode() when empty string was passed (windows only) 45f8a3fb / Thu, 12 Jan 2023 17:14:44 +0100 Norbert Schlia * Format problems fixed 5de4b35d / Sat, 7 Jan 2023 20:05:32 +0100 Norbert Schlia * Fix typos in comments 457a3f9f / Fri, 6 Jan 2023 21:19:36 +0100 Norbert Schlia * Fix Doxygen 1af8c1b9 / Fri, 6 Jan 2023 10:38:07 +0100 Norbert Schlia * Fix typo in comment c39fdb9e / Fri, 6 Jan 2023 10:37:46 +0100 Norbert Schlia * config.h was missing 969158a0 / Fri, 6 Jan 2023 10:37:08 +0100 Norbert Schlia * Renamed open/read/write/close functions to avoid clashes with Gnulib's unistd.h 1609ad14 / Thu, 5 Jan 2023 11:35:46 +0100 Norbert Schlia * Reorder includes b908b924 / Thu, 5 Jan 2023 11:35:25 +0100 Norbert Schlia * Hide *~ 99f871fa / Thu, 5 Jan 2023 11:35:03 +0100 Norbert Schlia * Fix comments a21f39b8 / Thu, 5 Jan 2023 11:34:45 +0100 Norbert Schlia * Reordered command sequence to keep things belonging to each other together 20409e25 / Thu, 5 Jan 2023 11:34:21 +0100 Norbert Schlia * Removed obsolete AC_HEADER_STDC command 9abed9db / Thu, 5 Jan 2023 11:33:40 +0100 Norbert Schlia * Guard __STDC_FORMAT_MACROS define, may already exist 6e8f63af / Thu, 5 Jan 2023 11:33:17 +0100 Norbert Schlia * Avoid autmatic cast from std::filesystem::path to std::string 4d0e97f8 / Thu, 5 Jan 2023 11:32:09 +0100 Norbert Schlia * Include fuse.h as external C ba42f44a / Thu, 5 Jan 2023 11:31:51 +0100 Norbert Schlia * Hide annoying warning in 3rd party code 9cdbf6b5 / Thu, 5 Jan 2023 11:31:14 +0100 Norbert Schlia * Should use stat, not lstat e8952491 / Thu, 5 Jan 2023 11:30:00 +0100 Norbert Schlia * Change _open/_read/_write/_close to pvt_* to avoid naming collisions fcfa4c13 / Thu, 5 Jan 2023 09:57:06 +0100 Norbert Schlia * Removed unused header 578c77e7 / Thu, 5 Jan 2023 09:56:52 +0100 Norbert Schlia * Formatting c03d89c3 / Thu, 5 Jan 2023 09:56:31 +0100 Norbert Schlia * (c) to 2023 e4b4aabb / Thu, 5 Jan 2023 09:53:19 +0100 Norbert Schlia * (c) of package to 2023 41be2ed1 / Tue, 3 Jan 2023 17:02:14 +0100 Norbert Schlia * Fix checks with ffmpeg version N-109474-gc94988a781 f9abb37c / Tue, 3 Jan 2023 15:48:53 +0100 Norbert Schlia * Revised texts 20eceaa9 / Sun, 2 Oct 2022 20:48:40 +0200 Norbert Schlia * Issue #139: Enable shell wildcard patterns c3a52e00 / Sun, 2 Oct 2022 19:54:44 +0200 Norbert Schlia * Issue #140: Enable shell wildcard patterns 2b7246d5 / Sun, 2 Oct 2022 19:47:53 +0200 Norbert Schlia * Closes #139: remove --extensions parameter 613ba96e / Sun, 2 Oct 2022 19:30:54 +0200 Norbert Schlia * Format 87117222 / Sun, 2 Oct 2022 19:30:12 +0200 Norbert Schlia * Revisited comment c4f33ee4 / Sun, 2 Oct 2022 19:28:30 +0200 Norbert Schlia * Remove unused header dc2a4b27 / Sun, 2 Oct 2022 19:27:57 +0200 Norbert Schlia * Change implode() function to template c514384e / Sun, 2 Oct 2022 17:00:53 +0200 Norbert Schlia * Fix typo 66b51ace / Sun, 2 Oct 2022 16:38:51 +0200 Norbert Schlia * Closes #140: Positive list for transcoding d2ca8a9b / Sun, 2 Oct 2022 13:22:04 +0200 Norbert Schlia * Closes #139: remove --extensions parameter 6389bd77 / Sun, 2 Oct 2022 13:18:09 +0200 Norbert Schlia * Again some lines too long 3b9686a4 / Sun, 2 Oct 2022 13:17:28 +0200 Norbert Schlia * Add missing : 6aaf726d / Sun, 2 Oct 2022 13:17:10 +0200 Norbert Schlia * V2.13 not to October 2022 0997066e / Sun, 2 Oct 2022 13:16:23 +0200 Norbert Schlia * Revisited some comments 027519ea / Sun, 2 Oct 2022 13:15:19 +0200 Norbert Schlia * Add missing comment to m_hide_extensions instantiation 0531ddd7 / Sun, 2 Oct 2022 12:47:49 +0200 Norbert Schlia * Fix deprecations: * 2022-03-15 - cdba98bb80 - lavu 57.24.100 - channel_layout.h frame.h opt.h * Add new channel layout API based on the AVChannelLayout struct. * Add support for Ambisonic audio. * Deprecate previous channel layout API based on uint64 bitmasks. 3b0fe612 / Sun, 2 Oct 2022 12:45:34 +0200 Norbert Schlia * Set include paths for debug FFmpeg libraries 681f7015 / Sat, 1 Oct 2022 21:32:23 +0200 Norbert Schlia * Get duration first, then calc video pts/last mux dts c28ec01b / Wed, 28 Sep 2022 21:30:53 +0200 Norbert Schlia * Fix deprecation: 2022-07-xx - xxxxxxxxxx - lavu 57.30.100 - frame.h Add AVFrame.duration, deprecate AVFrame.pkt_duration. 27dd4502 / Wed, 28 Sep 2022 21:30:34 +0200 Norbert Schlia * Revisited texts 43d57860 / Wed, 28 Sep 2022 21:30:12 +0200 Norbert Schlia * Add #pragma once where missing a32f3f20 / Tue, 27 Sep 2022 20:05:58 +0200 Norbert Schlia * Change log entries to single line ea5b89e8 / Tue, 27 Sep 2022 20:05:10 +0200 Norbert Schlia * Set (c) to 2022 ebacf2cc / Tue, 27 Sep 2022 20:04:40 +0200 Norbert Schlia * Formatting 66706612 / Mon, 19 Sep 2022 13:38:12 +0200 Norbert Schlia * Date V2.13 to September 6dfa1ba0 / Mon, 19 Sep 2022 08:58:15 +0200 Norbert Schlia * Added --prebuffer_time parameter 6f629372 / Mon, 19 Sep 2022 08:47:32 +0200 Norbert Schlia * Fix Doxygen comment (missing word 'duration' added) 48908cda / Mon, 19 Sep 2022 06:52:59 +0200 Norbert Schlia * 'Unable to use output codec' belongs to OUTPUT log entries ca6af006 / Mon, 12 Sep 2022 21:25:26 +0200 Norbert Schlia * Revisited 79d71261 / Mon, 12 Sep 2022 21:24:14 +0200 Norbert Schlia * Fix deprecation c15eb2d7 / Mon, 12 Sep 2022 21:23:20 +0200 Norbert Schlia * Formatierung ee63f047 / Fri, 2 Sep 2022 20:03:21 +0200 Norbert Schlia * Revised texts 0ae07fd9 / Sat, 27 Aug 2022 19:33:10 +0200 Norbert Schlia * Oops, meant 'efficiently', not 'inefficiently' 80eb79fc / Sat, 27 Aug 2022 18:36:53 +0200 Norbert Schlia * Line endings to *nix 798ae45f / Sat, 27 Aug 2022 18:34:01 +0200 Norbert Schlia * Clean-up: remove trailing blanks 249fb9c3 / Sat, 27 Aug 2022 18:11:26 +0200 Norbert Schlia * Update Debian control folder for 2.12-1 4f04f79f / Sat, 27 Aug 2022 18:05:12 +0200 Norbert Schlia * Set version to 2.13 7ef84858 / Sat, 27 Aug 2022 18:04:09 +0200 Norbert Schlia * Remove blank from line end a4b5d2a7 / Sat, 27 Aug 2022 17:18:46 +0200 Norbert Schlia * Fix typos 67ab18b6 / Sat, 27 Aug 2022 16:36:57 +0200 Norbert Schlia * Prepare 2.12 release 959ece11 / Fri, 26 Aug 2022 17:55:10 +0200 Norbert Schlia * Fix typo 77ff557b / Fri, 26 Aug 2022 17:42:24 +0200 Norbert Schlia * Mor detail on list of codecs 8003a4ae / Fri, 26 Aug 2022 17:33:52 +0200 Norbert Schlia * Fix link to INSTALL.md de0d8b03 / Thu, 25 Aug 2022 21:44:52 +0200 Norbert Schlia * Fix webm file size check 5d96444b / Thu, 25 Aug 2022 21:28:20 +0200 Norbert Schlia * Fix webm file size check 1a19bb0a / Thu, 25 Aug 2022 21:10:53 +0200 Norbert Schlia * Hint if docbook-xml is required b6fd0661 / Thu, 25 Aug 2022 21:10:09 +0200 Norbert Schlia * asciidoc-base is sufficient bed8e5c0 / Mon, 1 Aug 2022 09:31:37 +0200 Norbert Schlia * External build servers have finally been fixed 67fb9b68 / Mon, 1 Aug 2022 09:22:01 +0200 Norbert Schlia * xsltproc may also be missing d39ab967 / Mon, 1 Aug 2022 09:08:53 +0200 Norbert Schlia * docbook-xml also appears to be required 29be694b / Mon, 1 Aug 2022 08:32:28 +0200 Norbert Schlia * automake also required fe9ad9d4 / Wed, 20 Jul 2022 22:23:34 +0200 Norbert Schlia * Reenable ARM/32 build badge 914bdb5a / Wed, 20 Jul 2022 07:53:17 +0200 Norbert Schlia * Rephrase all INTERNAL ERROR messages to include function name 0a568a25 / Wed, 20 Jul 2022 07:52:23 +0200 Norbert Schlia * Fix potential NULL ptr access 096aad73 / Wed, 20 Jul 2022 07:51:21 +0200 Norbert Schlia * Replaced assert with an internal error message a074a284 / Wed, 20 Jul 2022 07:50:03 +0200 Norbert Schlia * Remove all possibly dangerous asserts 0517b7d5 / Wed, 20 Jul 2022 07:47:18 +0200 Norbert Schlia * Added explanation why missingIncludes is suppressed 3aa27053 / Wed, 20 Jul 2022 07:45:22 +0200 Norbert Schlia * Fix cppcheck unknown macro warning 19b1da75 / Wed, 20 Jul 2022 07:42:36 +0200 Norbert Schlia * Removed a condition that was always true bab6857b / Wed, 20 Jul 2022 07:40:31 +0200 Norbert Schlia * Add comments why certain warnings are disabled 97ddcc0d / Wed, 20 Jul 2022 07:36:46 +0200 Norbert Schlia * Seems some build servers still malfunction, removed from list fb9f3741 / Tue, 19 Jul 2022 08:29:00 +0200 Norbert Schlia * Build servers fixed now, hopefully... 7cedaa7a / Mon, 18 Jul 2022 22:41:28 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 0c28b13d / Mon, 18 Jul 2022 22:09:26 +0200 Norbert Schlia * Enable all CPUs for make 4629579d / Mon, 18 Jul 2022 08:06:44 +0200 Norbert Schlia * Temporarily removed status lines that fail due to problem with build system 1fd4245b / Mon, 18 Jul 2022 06:39:21 +0200 Norbert Schlia * Disable duplicated checks f48ca590 / Sun, 17 Jul 2022 21:59:13 +0200 Norbert Schlia * Extra logging for internal error 956d5534 / Sun, 17 Jul 2022 18:59:57 +0200 Norbert Schlia * Added extra logging for internal errors that should never happen, but still do... 9b9ea815 / Sun, 17 Jul 2022 18:59:07 +0200 Norbert Schlia * OK, bloody GIT: Fourth commit attempt: Fix estimated size of last HLS segement 55d14ef2 / Sun, 17 Jul 2022 18:54:37 +0200 Norbert Schlia * WILL GIT FINALLY COMMIT DAT TOOTIN' CHANGE?!?!? Third commit attempt: Fix estimated size of last HLS segement f97762da / Sun, 17 Jul 2022 18:38:58 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs daf2f083 / Sun, 17 Jul 2022 18:36:59 +0200 Norbert Schlia * Fix estimated size of last HLS segement df068448 / Sun, 17 Jul 2022 18:36:59 +0200 Norbert Schlia * Fix estimated size of last HLS segement 909faf78 / Sun, 17 Jul 2022 18:36:09 +0200 Norbert Schlia * Copy edited news from README.md ef79c553 / Sun, 17 Jul 2022 16:46:16 +0200 Norbert Schlia * Build server problems fixed (hopefully) 65c6ccc8 / Sun, 17 Jul 2022 09:34:51 +0200 Norbert Schlia * Temporarily removed status lines that fail due to problem with build system fbb6f6a0 / Sun, 17 Jul 2022 09:33:40 +0200 Norbert Schlia * under circumstances sounds better da5435f3 / Sun, 17 Jul 2022 09:30:58 +0200 Norbert Schlia * Fix typo ca5ac329 / Sun, 17 Jul 2022 09:26:35 +0200 Norbert Schlia * Edited history ecd6a8f8 / Sat, 16 Jul 2022 19:42:43 +0200 Norbert Schlia * Argh, stupid typo... 96527b81 / Sat, 16 Jul 2022 18:32:32 +0200 Norbert Schlia * Update man pages also with edited texts ac2703e8 / Sat, 16 Jul 2022 18:08:20 +0200 Norbert Schlia * Edit 7a5f7173 / Sat, 16 Jul 2022 18:07:36 +0200 Norbert Schlia * Remove trailing blanks c3cc6d37 / Sat, 16 Jul 2022 17:12:19 +0200 Norbert Schlia * Fix hyperlink: add anchor 1e8639b1 / Sat, 16 Jul 2022 17:09:55 +0200 Norbert Schlia * Fix hyperlink c7c25b87 / Sat, 16 Jul 2022 11:55:11 +0200 Norbert Schlia * Edited docs 95952b45 / Fri, 15 Jul 2022 06:49:41 +0200 Norbert Schlia * Problems and features moved to separate files ac54b155 / Thu, 14 Jul 2022 21:34:30 +0200 Norbert Schlia * Move list of linux distros to end 39ac0506 / Thu, 14 Jul 2022 19:42:23 +0200 Norbert Schlia * Update tested with list 8fe3ac7e / Thu, 14 Jul 2022 19:35:48 +0200 Norbert Schlia * Table format e5ced574 / Thu, 14 Jul 2022 19:30:15 +0200 Norbert Schlia * Fix 32 Bit ARM build 4c85b38d / Thu, 14 Jul 2022 19:29:58 +0200 Norbert Schlia * Fix build url 36020ba4 / Thu, 14 Jul 2022 19:12:44 +0200 Norbert Schlia * Add builds for ARM32 and with GCC 12 842894db / Tue, 12 Jul 2022 20:59:26 +0200 Norbert Schlia * Escape attributes, see https://docs.asciidoctor.org/asciidoc/latest/subs/prevent/ da8f4106 / Mon, 11 Jul 2022 20:19:08 +0200 Norbert Schlia * Update docs about clang-tidy 7545daff / Mon, 11 Jul 2022 20:18:02 +0200 Norbert Schlia * NOLINT code that cannot be changed 821167d1 / Mon, 11 Jul 2022 20:17:22 +0200 Norbert Schlia * Avoid auto declarations wherever possible f57c6713 / Mon, 11 Jul 2022 20:16:20 +0200 Norbert Schlia * Replace c-style arrays with std::vector where possible 69af9bd0 / Mon, 11 Jul 2022 20:09:33 +0200 Norbert Schlia * Replace c-style arrays with std::array where possible 1f0c7ea2 / Mon, 11 Jul 2022 19:44:21 +0200 Norbert Schlia * Replace snprintf with overrun-safe strsprintf b91a4ba8 / Mon, 11 Jul 2022 19:39:30 +0200 Norbert Schlia * Mark usused parameter with __attribute__((unused)) b524806b / Sun, 10 Jul 2022 21:01:06 +0200 Norbert Schlia * Disable annoying lint messages 9e066660 / Sun, 10 Jul 2022 20:31:43 +0200 Norbert Schlia * Fix deprecation in C++17 449e4d06 / Sat, 9 Jul 2022 22:08:29 +0200 Norbert Schlia * Remove stray debug out 17e4a1eb / Sat, 9 Jul 2022 21:08:49 +0200 Norbert Schlia * Use save delete function ee88cc2e / Sat, 9 Jul 2022 21:07:58 +0200 Norbert Schlia * Fix list update 0aad2e89 / Thu, 7 Jul 2022 22:29:42 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 86229f17 / Mon, 4 Jul 2022 13:41:07 +0200 Norbert Schlia * Avoid crash in get_prores_bitrate 6a8dc106 / Fri, 1 Jul 2022 20:22:36 +0200 Norbert Schlia * Modernise code: prefer a lambda to std::bind 473c0782 / Fri, 1 Jul 2022 20:07:18 +0200 Norbert Schlia * Modernise code: pass by value and use std::move a21a3982 / Fri, 1 Jul 2022 19:39:06 +0200 Norbert Schlia * Modernise code: use stod/stol etc. to operate on std::strings directly 757775d9 / Fri, 1 Jul 2022 19:25:21 +0200 Norbert Schlia * Modernise: use range-based for loop instead ac07ee04 / Fri, 1 Jul 2022 18:39:16 +0200 Norbert Schlia * modernize-use-nullptr cc7593aa / Fri, 1 Jul 2022 18:22:07 +0200 Norbert Schlia * Bug prone code: modify strsprintf function to match sprintf 612b8c29 / Fri, 1 Jul 2022 17:32:53 +0200 Norbert Schlia * Modernisation: use range-based for loop instead 445ce0db / Thu, 30 Jun 2022 21:50:21 +0200 Norbert Schlia * Modernise code: use '= default' to define a trivial con/destructor d7aa28ca / Thu, 30 Jun 2022 21:37:00 +0200 Norbert Schlia * Modernise: Replace C arrays 118e07a0 / Thu, 30 Jun 2022 20:36:55 +0200 Norbert Schlia * Modern C propagates (void) opportune while modern C++ considers it redundant. Big fun. 5bd35885 / Mon, 4 Jul 2022 13:41:07 +0200 Norbert Schlia * Avoid crash in get_prores_bitrate 93ed7323 / Fri, 1 Jul 2022 20:22:36 +0200 Norbert Schlia * Modernise code: prefer a lambda to std::bind c5d12926 / Fri, 1 Jul 2022 20:07:18 +0200 Norbert Schlia * Modernise code: pass by value and use std::move deb30d07 / Fri, 1 Jul 2022 19:39:06 +0200 Norbert Schlia * Modernise code: use stod/stol etc. to operate on std::strings directly 993a7f94 / Fri, 1 Jul 2022 19:25:21 +0200 Norbert Schlia * Modernise: use range-based for loop instead 025c93ae / Fri, 1 Jul 2022 18:39:16 +0200 Norbert Schlia * modernize-use-nullptr da6d35b9 / Fri, 1 Jul 2022 18:22:07 +0200 Norbert Schlia * Bug prone code: modify strsprintf function to match sprintf be909559 / Fri, 1 Jul 2022 17:32:53 +0200 Norbert Schlia * Modernisation: use range-based for loop instead f606bec1 / Thu, 30 Jun 2022 21:50:21 +0200 Norbert Schlia * Modernise code: use '= default' to define a trivial con/destructor 825f6aa5 / Thu, 30 Jun 2022 21:37:00 +0200 Norbert Schlia * Modernise: Replace C arrays 649f0b05 / Thu, 30 Jun 2022 20:36:55 +0200 Norbert Schlia * Modern C propagates (void) opportunity while modern C++ considers it redundant. Big fun. f5478a84 / Thu, 30 Jun 2022 20:28:39 +0200 Norbert Schlia * Modernise: Replace push_back with emplace_back 07293bd1 / Thu, 30 Jun 2022 20:18:29 +0200 Norbert Schlia * Modernise: Replace outdated headers 38bbbd4e / Thu, 30 Jun 2022 20:18:04 +0200 Norbert Schlia * Oh, how I abhore "auto" 01547d4b / Thu, 30 Jun 2022 19:52:46 +0200 Norbert Schlia * Performance: use for each loops ba99ce5a / Thu, 30 Jun 2022 19:52:12 +0200 Norbert Schlia * Performance: Remove unneccessary string copy 78a3f1b7 / Thu, 30 Jun 2022 19:11:11 +0200 Norbert Schlia * Replace c-style arrays with std::string 5a490832 / Thu, 30 Jun 2022 19:11:01 +0200 Norbert Schlia * Make strsprintf() inline to avoid unresolved externals 43ccb1cc / Thu, 30 Jun 2022 18:54:23 +0200 Norbert Schlia * Fix converting integer literal to bool 469631c9 / Thu, 30 Jun 2022 08:04:08 +0200 Norbert Schlia * Performance: use bool instead of int a6fb80c3 / Thu, 30 Jun 2022 08:00:20 +0200 Norbert Schlia * Change assert.h to modern cassert header 66ce6a8e / Thu, 30 Jun 2022 07:58:24 +0200 Norbert Schlia * Add make lint option with clang-tidy checks 8feabad1 / Wed, 29 Jun 2022 22:47:55 +0200 Norbert Schlia * Fix several performance and bug prone issues d0d66259 / Wed, 29 Jun 2022 22:37:19 +0200 Norbert Schlia * Fix some potentially error prone code constructs d16ee82d / Wed, 29 Jun 2022 19:08:42 +0200 Norbert Schlia * Fix possible NULL ptr access 4eae9f5b / Wed, 29 Jun 2022 19:07:59 +0200 Norbert Schlia * Add -D_FORTIFY_SOURCE=2 for buffer overflow detection ad564cc7 / Wed, 29 Jun 2022 19:06:52 +0200 Norbert Schlia * Can use starts_with() for better performance when switching to c++20 c987772d / Wed, 29 Jun 2022 19:06:13 +0200 Norbert Schlia * Add .su files to ignore d723de58 / Wed, 29 Jun 2022 19:05:37 +0200 Norbert Schlia * Add self assignment check to = operator e9a7ab28 / Wed, 29 Jun 2022 19:04:39 +0200 Norbert Schlia * Fix possible NULL ptr access f6f58ec1 / Wed, 29 Jun 2022 19:04:14 +0200 Norbert Schlia * Change potentially reserved variable names f6b05d54 / Wed, 29 Jun 2022 19:03:47 +0200 Norbert Schlia * Change assert to static_assert as possible 7191d6fc / Wed, 29 Jun 2022 19:03:03 +0200 Norbert Schlia * Fix uninitialised variable a34cde51 / Wed, 29 Jun 2022 12:36:54 +0200 Norbert Schlia * Remove some throws that were missing its catch 53dd6a5e / Fri, 24 Jun 2022 15:23:44 +0200 Norbert Schlia * Explicitly 'make check' 47b8e1ee / Fri, 24 Jun 2022 15:23:24 +0200 Norbert Schlia * Version 2.12 is now under development b7cfef96 / Fri, 24 Jun 2022 15:22:59 +0200 Norbert Schlia * Make log entries look similar 66d18a1d / Thu, 16 Jun 2022 17:56:03 +0200 Norbert Schlia * Debian control folder for 2.11-1 65e391e2 / Thu, 16 Jun 2022 16:22:10 +0200 Norbert Schlia * Prepare Version 2.11 release 01047795 / Thu, 16 Jun 2022 16:14:41 +0200 Norbert Schlia * Revisited fix list 5540a436 / Thu, 16 Jun 2022 16:12:53 +0200 Norbert Schlia * Revisited fix list 79bdef7f / Thu, 16 Jun 2022 15:42:27 +0200 Norbert Schlia * Mention fix that closes Debian bug #1012925. See 9a4ba638e38d030b7c5311cf527edafbd88bb537. 8a4df8a2 / Thu, 16 Jun 2022 12:32:21 +0200 Norbert Schlia * Update download URL and add GIT main and mirror address 007dbdbb / Thu, 16 Jun 2022 09:49:32 +0200 Norbert Schlia * Move planned features to TODO list 30362dc2 / Thu, 16 Jun 2022 08:56:15 +0200 Norbert Schlia * Add Debian control directory de9d370e / Thu, 16 Jun 2022 08:52:04 +0200 Norbert Schlia * Move Windows version to TODO list 5d4f23bf / Thu, 16 Jun 2022 08:50:34 +0200 Norbert Schlia * Remove empty columns from format list tables b8d2e508 / Thu, 16 Jun 2022 08:44:48 +0200 Norbert Schlia * Fix TODO link 19b0eac5 / Tue, 14 Jun 2022 18:29:43 +0200 Norbert Schlia * Split audio/video/stills formats into separate tables a86f637b / Sun, 12 Jun 2022 21:58:10 +0200 Norbert Schlia * Fix 32 bit build d463ab8a / Sun, 12 Jun 2022 21:57:49 +0200 Norbert Schlia * Refactoring 40b939a2 / Sun, 12 Jun 2022 16:54:07 +0200 Norbert Schlia * Log FFmpeg API log category cbf6e435 / Sat, 11 Jun 2022 21:38:02 +0200 Norbert Schlia * FFmpeg API log entries should be block if level too high 298088b0 / Sat, 11 Jun 2022 21:27:50 +0200 Norbert Schlia * Log virtual name for output files a9636502 / Sat, 11 Jun 2022 21:27:03 +0200 Norbert Schlia * Log correct filename for INTERNAL ERROR: check_cuesheet()! virtualfile is NULL. c837dff8 / Sat, 11 Jun 2022 21:26:36 +0200 Norbert Schlia * Fix Doxygen comments 23a9713c / Sat, 11 Jun 2022 18:11:40 +0200 Norbert Schlia * Revamped logging: shorten paths, improve readability, reduce file size 189d05e6 / Fri, 10 Jun 2022 23:02:14 +0200 Norbert Schlia * Correctly log virtual paths, not just file names 8623ed2d / Fri, 10 Jun 2022 22:53:07 +0200 Norbert Schlia * Safe CPU: Do not format log entries which will not be displayed anyway 517b7470 / Fri, 10 Jun 2022 19:15:46 +0200 Norbert Schlia * Reduce duplicated code by templates 9973aa7d / Fri, 10 Jun 2022 18:32:20 +0200 Norbert Schlia * Revisited log code ba9e2d02 / Fri, 10 Jun 2022 16:28:58 +0200 Norbert Schlia * Add virtname() accessor 5cf597e4 / Fri, 10 Jun 2022 16:28:26 +0200 Norbert Schlia * Move statics to the beginning of the file 2337c99f / Thu, 9 Jun 2022 17:05:35 +0200 Norbert Schlia * Refactoring b8427c53 / Thu, 9 Jun 2022 16:34:52 +0200 Norbert Schlia * Remove duplicated variable 97760195 / Wed, 8 Jun 2022 20:53:53 +0200 Norbert Schlia * Reserve enough space to avoid frequent memory reallocations d884c1e2 / Wed, 8 Jun 2022 20:52:24 +0200 Norbert Schlia * Do not log remaining bytes in cache misses, too inaccurate 3576dfc0 / Wed, 8 Jun 2022 20:43:28 +0200 Norbert Schlia * Revisited log entries eac3429c / Tue, 7 Jun 2022 12:46:41 +0200 Norbert Schlia * Revisited logging texts 559862f5 / Tue, 7 Jun 2022 12:36:35 +0200 Norbert Schlia * Made logging more comprehensible 734ddabc / Tue, 7 Jun 2022 12:35:24 +0200 Norbert Schlia * Log 'FFmpeg transcoder closed' only once b275b875 / Tue, 7 Jun 2022 07:27:13 +0200 Norbert Schlia * Add replace_start helper e84f8a7c / Tue, 7 Jun 2022 07:26:49 +0200 Norbert Schlia * HW acceleration logging enhanced c81626e2 / Tue, 7 Jun 2022 07:26:03 +0200 Norbert Schlia * Log 'Opening output file' rather than just 'Opening file' 7cb1fdf8 / Tue, 7 Jun 2022 07:24:05 +0200 Norbert Schlia * Log bit/samplerate, or dimensions change only if former value is known 1d02cdac / Tue, 7 Jun 2022 07:23:10 +0200 Norbert Schlia * Rephrase writing/reading cache to reading from/writing to, makes more sense 3b50edc4 / Mon, 6 Jun 2022 20:59:15 +0200 Norbert Schlia * FFmpeg API log output from DEBUG now, FFmpeg API INFO is to chatty 8014f44a / Mon, 6 Jun 2022 20:58:08 +0200 Norbert Schlia * Insert forced keyframes for HLS only 9185c333 / Mon, 6 Jun 2022 20:57:26 +0200 Norbert Schlia * Add comment for --debug option 77f3a669 / Sun, 5 Jun 2022 21:10:11 +0200 Norbert Schlia * Fixed build with GCC 8.3.0: added missing include a9c7fa2e / Sun, 5 Jun 2022 17:04:45 +0200 Norbert Schlia * Updated docs ffe6190c / Sun, 5 Jun 2022 16:59:21 +0200 Norbert Schlia * Revisited formatting 359561da / Sun, 5 Jun 2022 16:58:54 +0200 Norbert Schlia * Revisited grammar 06d9422b / Sun, 5 Jun 2022 13:07:49 +0200 Norbert Schlia * Revised grammer 276d0631 / Thu, 2 Jun 2022 18:15:03 +0200 Norbert Schlia * Fix typo in Doxygen 27a57bae / Thu, 2 Jun 2022 08:50:34 +0200 Norbert Schlia * Revised doxygen comments bfd0fa3f / Thu, 2 Jun 2022 08:37:20 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 35a70b21 / Wed, 1 Jun 2022 21:44:30 +0200 Norbert Schlia * Revised Doygen comments 29aaecda / Wed, 1 Jun 2022 21:43:18 +0200 Norbert Schlia * Revised Doygen comments 335ae2c5 / Wed, 1 Jun 2022 17:55:19 +0200 Norbert Schlia * Revised doxygen comments 943657a2 / Wed, 1 Jun 2022 12:13:25 +0200 Norbert Schlia * Revised Doxygen comments 20de1cf7 / Wed, 1 Jun 2022 07:02:52 +0200 Norbert Schlia * Fix grammar in comment 60c9ae1a / Tue, 31 May 2022 23:11:40 +0200 Norbert Schlia * Closes #138: Fix gcc-12 warning 9a4ba638 / Tue, 31 May 2022 23:01:09 +0200 root * Fix gcc 12 build 455ae72f / Tue, 31 May 2022 20:38:53 +0200 Norbert Schlia * Revised debug outputs 2936ecbc / Mon, 30 May 2022 10:37:36 +0200 Norbert Schlia * Fix typo in comment f12af7f9 / Mon, 30 May 2022 07:32:22 +0200 Norbert Schlia * Enhanced logging 6178bce6 / Mon, 30 May 2022 07:22:50 +0200 Norbert Schlia * Enhanced logging fad0c436 / Sun, 29 May 2022 21:57:37 +0200 Norbert Schlia * Enhanced logging 2de78b18 / Sun, 29 May 2022 21:38:04 +0200 Norbert Schlia * Enhanced logging ccd9e819 / Sun, 29 May 2022 21:05:47 +0200 Norbert Schlia * Bluray -> Blu-ray ea60fc74 / Sat, 28 May 2022 21:31:55 +0200 Norbert Schlia * Grammer enhancements 9221d548 / Sat, 28 May 2022 14:59:13 +0200 Norbert Schlia * Grammer enhancements 9b64c6a3 / Sat, 28 May 2022 11:17:10 +0200 Norbert Schlia * Fix flac size test of ARM 4f72bc46 / Sat, 28 May 2022 11:14:38 +0200 Norbert Schlia * Grammer enhancements 206ab4c6 / Sat, 28 May 2022 10:06:50 +0200 Norbert Schlia * Fix grammar aea4d041 / Sat, 28 May 2022 09:57:40 +0200 Norbert Schlia * Issue #119: Documentation b4c76b10 / Thu, 26 May 2022 17:37:54 +0200 Norbert Schlia * Fix typo df56dd86 / Thu, 26 May 2022 17:36:09 +0200 Norbert Schlia * Closes #137: Add --no_subtitles option 15d1ac57 / Fri, 20 May 2022 19:48:00 +0200 Norbert Schlia * Fix HLS/image frame set conversion for TS source 75ccf672 / Fri, 20 May 2022 19:25:09 +0200 Norbert Schlia * Typo on Doxygen comment fixed 87a9b64a / Fri, 20 May 2022 19:19:50 +0200 Norbert Schlia * Refactoring d1af07de / Tue, 17 May 2022 20:56:23 +0200 Norbert Schlia * Update comments 154ec063 / Tue, 17 May 2022 20:55:58 +0200 Norbert Schlia * Never shrink buffer, always grow 384923cb / Tue, 17 May 2022 20:55:27 +0200 Norbert Schlia * Actually report out of memory if buffer alloc fails, not bad file 894388c8 / Tue, 17 May 2022 12:27:18 +0200 Norbert Schlia * Fix Doxygen comments b3f3d122 / Tue, 17 May 2022 12:26:33 +0200 Norbert Schlia * Fixed check for wrong error condition, could cause the application to crash or return stupid error messages. 6817c576 / Sun, 15 May 2022 16:23:55 +0200 Norbert Schlia * Drop MULTIFRAME_NODE typedef in favour of auto to avoid build fails under arm/i386/mipsel 95f8be5e / Sat, 14 May 2022 20:31:06 +0200 Norbert Schlia * Log frame number in cache miss c71e9c24 / Sat, 14 May 2022 20:28:29 +0200 Norbert Schlia * Fix comment a572b262 / Sat, 14 May 2022 20:27:51 +0200 Norbert Schlia * Shorten logging 53e4a411 / Fri, 13 May 2022 22:42:12 +0200 Norbert Schlia * Add new cuesheet tests to CMake 8e53cd5c / Fri, 13 May 2022 22:41:37 +0200 Norbert Schlia * Fix test with latest FFmpeg API 13434490 / Fri, 13 May 2022 22:41:09 +0200 Norbert Schlia * Update codeql-action to v2 10d3ba1a / Thu, 12 May 2022 21:02:16 +0200 Norbert Schlia * Fix the rest of the cppchecks 05ea26a3 / Thu, 12 May 2022 07:19:00 +0200 Norbert Schlia * Fix syntax b23e10f2 / Thu, 12 May 2022 07:15:18 +0200 Norbert Schlia * Remove make check from Docker build, requires privileges which are missing during build func.sh returned 0 on error instead if 99 2c447648 / Wed, 11 May 2022 21:25:42 +0200 Norbert Schlia * Remove make check from Docker build, requires privileges which are missing during build 2aee645c / Wed, 11 May 2022 21:21:57 +0200 Norbert Schlia * func.sh returned 0 on error instead if 99 560e2ad8 / Wed, 11 May 2022 21:19:43 +0200 Norbert Schlia * Fix Doxgen comment d689a37e / Wed, 11 May 2022 19:30:18 +0200 Norbert Schlia * Fix even more cppcheck warnings 0627a24d / Wed, 11 May 2022 14:58:14 +0200 Norbert Schlia * Mostly Cosmetical: Fix several ccppcheck warnings, but also one possible crash aa688b99 / Wed, 11 May 2022 09:31:07 +0200 Norbert Schlia * Issue #86: Properly clean up after checks Write separate logs for both tests 6767ac5f / Tue, 10 May 2022 21:49:40 +0200 Norbert Schlia * Issue #86: Add checks 817b37e4 / Tue, 10 May 2022 14:28:44 +0200 Norbert Schlia * Bugfix: If track performer is empty, try album performer instead. 23be6127 / Tue, 10 May 2022 14:26:56 +0200 Norbert Schlia * Add 2.10 release to history 78d6a29a / Tue, 10 May 2022 14:26:26 +0200 Norbert Schlia * Fix crash when DVD/Bluray should be transcoded to audio only. 8ecc2cff / Mon, 9 May 2022 17:59:17 +0200 Norbert Schlia * Closes #86: Check if input file contains audio only, then smart encode to audio only 57bc37ec / Sun, 8 May 2022 09:08:11 +0200 Norbert Schlia * Added check_ext() function 0524bead / Sun, 8 May 2022 09:06:46 +0200 Norbert Schlia * Updated @todo entries 535bde41 / Sun, 8 May 2022 09:03:06 +0200 Norbert Schlia * Added more info into INTERNAL ERROR messages 9007781c / Sat, 7 May 2022 20:13:42 +0200 Norbert Schlia * Reformat dc335213 / Sat, 7 May 2022 16:37:31 +0200 Norbert Schlia * Refactoring 696c3c2e / Sat, 7 May 2022 16:33:31 +0200 Norbert Schlia * Remove assert that never will trigger anyway c2449fbd / Sat, 7 May 2022 16:33:04 +0200 Norbert Schlia * Fix misleading log entry d679f1dd / Sat, 7 May 2022 16:32:22 +0200 Norbert Schlia * Fix typo in comment 16ac09d7 / Sat, 7 May 2022 11:11:54 +0200 Norbert Schlia * Fix Doxygen comments dfdbdde3 / Sat, 7 May 2022 10:49:07 +0200 Norbert Schlia * Some Doxygen @parms where missing their in/out hint 429512db / Fri, 6 May 2022 09:17:32 +0200 Norbert Schlia * Refactoring 55b03c47 / Fri, 6 May 2022 07:45:13 +0200 Norbert Schlia * Optimisation ec903c29 / Fri, 6 May 2022 07:44:28 +0200 Norbert Schlia * Refactoring ce6aae7e / Fri, 6 May 2022 07:44:00 +0200 Norbert Schlia * Make FFmpegfs_Format* const where possible ad490200 / Fri, 6 May 2022 07:34:42 +0200 Norbert Schlia * Add. nullptr check to avoid GPF 415a221d / Fri, 6 May 2022 07:34:11 +0200 Norbert Schlia * Reformat 390f37db / Fri, 6 May 2022 07:33:10 +0200 Norbert Schlia * Change variable name: m_cuesheet to m_cuesheet_track fd4d7c45 / Wed, 4 May 2022 19:29:54 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 5e7b481a / Wed, 4 May 2022 19:29:05 +0200 Norbert Schlia * Better variable names in insert_file() 8cdfc98a / Wed, 4 May 2022 19:28:24 +0200 Norbert Schlia * Refactoring: virtual_name() 584eda8c / Wed, 4 May 2022 19:27:15 +0200 Norbert Schlia * Refactoring: ffmpegfs_getattr() c1cbf16b / Wed, 4 May 2022 19:26:15 +0200 Norbert Schlia * Rearranged functions, became a bit chaotic with time ea826aa4 / Wed, 4 May 2022 19:16:20 +0200 Norbert Schlia * Rename some functions with unclear names 903f7e58 / Tue, 3 May 2022 20:19:00 +0200 Norbert Schlia * Fix grammer/format 54a45d75 / Sun, 1 May 2022 08:49:21 +0200 Norbert Schlia * Optimised reverse search 9defe990 / Sun, 1 May 2022 08:48:36 +0200 Norbert Schlia * Clean up code f71dad22 / Sat, 30 Apr 2022 13:25:27 +0200 Norbert Schlia * current_format did not access the cache correctly 616b38e6 / Sat, 30 Apr 2022 13:19:52 +0200 Norbert Schlia * Corrected error reporting from ffmpegfs_readdir 48268cf1 / Sat, 30 Apr 2022 13:17:03 +0200 Norbert Schlia * Avoid GPF in transcoded_name() d3f55d52 / Sat, 30 Apr 2022 13:11:26 +0200 Norbert Schlia * Refactoring 1d62a748 / Sat, 30 Apr 2022 13:11:00 +0200 Norbert Schlia * Format b0552dcf / Sat, 30 Apr 2022 13:10:35 +0200 Norbert Schlia * Set version to 2.11 da902597 / Sat, 30 Apr 2022 10:43:54 +0200 Norbert Schlia * Version 2.11 under development e706367e / Sat, 30 Apr 2022 10:08:48 +0200 Norbert Schlia * Remove release 2.9 list a1ff2aca / Tue, 26 Apr 2022 19:31:37 +0200 Norbert Schlia * Make release 2.10 7d1e3949 / Tue, 26 Apr 2022 19:29:38 +0200 Norbert Schlia * Clean up 7f203aa1 / Tue, 26 Apr 2022 12:40:59 +0200 Norbert Schlia * C++17 hints 07066cd4 / Tue, 26 Apr 2022 09:07:14 +0200 Norbert Schlia * Going c++17 now 4464e830 / Tue, 26 Apr 2022 09:06:51 +0200 Norbert Schlia * Line too long 52095710 / Tue, 26 Apr 2022 08:48:36 +0200 Norbert Schlia * Removed forgotten debug output fc772341 / Tue, 26 Apr 2022 08:46:36 +0200 Norbert Schlia * Trim log messages left and right f8c0c293 / Mon, 25 Apr 2022 15:12:31 +0200 Norbert Schlia * Closes #135: Fix build error, add missing #include b6e828cc / Mon, 25 Apr 2022 13:16:42 +0200 Norbert Schlia * Refatcoring 8bc2f55a / Sun, 24 Apr 2022 20:56:31 +0200 Norbert Schlia * Feature #2749: Log subtitles as debug, not error c946d808 / Sun, 24 Apr 2022 20:56:06 +0200 Norbert Schlia * Set version to 2.10 7d6ffb3c / Sun, 24 Apr 2022 16:42:00 +0200 Norbert Schlia * Issue #123: Update online help 560078e5 / Sun, 24 Apr 2022 14:06:02 +0200 Norbert Schlia * Closes #123: add option to hide files c6eb4f16 / Sun, 24 Apr 2022 13:54:14 +0200 Norbert Schlia * Refactoring b6fc4a28 / Sat, 23 Apr 2022 22:33:00 +0200 Norbert Schlia * Fix typo in Doxygen comment b6acd063 / Sat, 23 Apr 2022 22:32:00 +0200 Norbert Schlia * Reformat code 52ad4f50 / Sat, 23 Apr 2022 22:30:51 +0200 Norbert Schlia * Replace C-style \n with std::endl f9d5be07 / Sat, 23 Apr 2022 20:30:58 +0200 Norbert Schlia * Issue #120: Block SRT/VTT files, confuses players 1bf2260d / Sat, 23 Apr 2022 19:22:14 +0200 Norbert Schlia * Fix doxygen 68927b32 / Sat, 23 Apr 2022 19:11:24 +0200 Norbert Schlia * Closes #134: properly check list of passthrough extensions 280cbdd7 / Sat, 23 Apr 2022 14:14:00 +0200 Norbert Schlia * Closes #120: Support for external subtitles 9cbae1fb / Sat, 23 Apr 2022 09:12:29 +0200 Norbert Schlia * Issue #120: Do not add subtitle streams when there is no video 5dce08e6 / Sat, 23 Apr 2022 09:06:55 +0200 Norbert Schlia * Fix garbled audio output with new channel API cecb3594 / Sat, 23 Apr 2022 09:06:13 +0200 Norbert Schlia * Refactoring b48d6df6 / Sat, 23 Apr 2022 09:02:34 +0200 Norbert Schlia * Enable some C++17 features for GCC 8.x 2ddd20e4 / Sat, 23 Apr 2022 09:01:57 +0200 Norbert Schlia * In place changing version of replace_all() 16bce4c6 / Fri, 22 Apr 2022 07:22:24 +0200 Norbert Schlia * Fix Doxygen comments f3105f59 / Fri, 22 Apr 2022 07:07:38 +0200 Norbert Schlia * Update comments b8565a11 / Fri, 22 Apr 2022 07:07:02 +0200 Norbert Schlia * Issue #120: Fix script info generation in add_subtitle_stream 98edc9da / Fri, 22 Apr 2022 07:05:48 +0200 Norbert Schlia * Both add_stream can now take the audio duration as hint as well 2fcc6446 / Fri, 22 Apr 2022 07:05:17 +0200 Norbert Schlia * Both add_subtitle_stream and add_stream now return the stream index b2122695 / Fri, 22 Apr 2022 07:02:56 +0200 Norbert Schlia * add_stream_map() must not add outputs with no input streams 29639003 / Fri, 22 Apr 2022 07:02:14 +0200 Norbert Schlia * Add AVFormatContext paramater to open*decoder functions b4668325 / Fri, 22 Apr 2022 06:50:38 +0200 Norbert Schlia * Update Doxygen comments a4337856 / Tue, 19 Apr 2022 07:12:08 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs cb43980d / Tue, 19 Apr 2022 07:09:33 +0200 Norbert Schlia * Version date a823329d / Tue, 19 Apr 2022 07:09:33 +0200 Norbert Schlia * Version date d32f3042 / Tue, 19 Apr 2022 07:08:55 +0200 Norbert Schlia * Fix syntax errors 6bc64177 / Mon, 18 Apr 2022 22:46:51 +0200 Norbert Schlia * Issue #120: Stupid merge missed out on this change ae33d622 / Mon, 18 Apr 2022 21:46:17 +0200 Norbert Schlia * Issue #120: Totally revamped frame buffer, a single buffer now holds audio/video frames and subtitles. a09c52ea / Mon, 18 Apr 2022 12:27:04 +0200 Norbert Schlia * Fix Doxgen comments e0e54b81 / Mon, 18 Apr 2022 12:22:38 +0200 Norbert Schlia * Should call throw, not return in try/catch 0143020d / Mon, 18 Apr 2022 12:21:53 +0200 Norbert Schlia * Cleanup b84bc30a / Mon, 18 Apr 2022 12:20:28 +0200 Norbert Schlia * Drop av_interleaved_writeframe(), not working properly in our case 4add0d9d / Mon, 18 Apr 2022 12:16:11 +0200 Norbert Schlia * Use larger analyse duration and prescan size 6c2d5027 / Mon, 18 Apr 2022 12:15:31 +0200 Norbert Schlia * Refactoring 092cc8ad / Sun, 17 Apr 2022 19:48:14 +0200 Norbert Schlia * Fix content error 3315b3c9 / Sun, 17 Apr 2022 15:27:38 +0200 Norbert Schlia * Wrong % formatter in logging e15e0bcf / Sat, 16 Apr 2022 20:59:08 +0200 Norbert Schlia * Fix 2 null pointer crashes 33810548 / Fri, 15 Apr 2022 23:34:11 +0200 Norbert Schlia * Fix memory leak: did not close output subtitle codecs 7058e601 / Fri, 15 Apr 2022 23:30:46 +0200 Norbert Schlia * Mention "audio FIFO" instead of just "FIFO" in logs The audio/video FIFO is actually a map now, changed FIFO to buffer in logs 276bda0a / Fri, 15 Apr 2022 23:16:34 +0200 Norbert Schlia * Fix grammer in comment eb49d276 / Fri, 15 Apr 2022 23:15:59 +0200 Norbert Schlia * Replace several asserts by error messages to avoid crashes 37e6d6c2 / Mon, 11 Apr 2022 10:02:56 +0200 Norbert Schlia * Subtitle codec table format 93480263 / Mon, 11 Apr 2022 10:02:27 +0200 Norbert Schlia * Format 9ae038c4 / Sat, 9 Apr 2022 22:07:49 +0200 Norbert Schlia * Some FIFOs are now maps, so we should rename some variables appropriately 80920e43 / Sat, 9 Apr 2022 11:37:12 +0200 Norbert Schlia * Closes #131: Add issue number 14860139 / Fri, 8 Apr 2022 20:17:56 +0200 Norbert Schlia * Remove duplicated entry fe864fa4 / Fri, 8 Apr 2022 20:17:00 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 06cdf2b1 / Fri, 8 Apr 2022 20:16:53 +0200 Norbert Schlia * Fix Bluray/DVD playback when video properties cannot be detected 5f4cfa61 / Fri, 8 Apr 2022 20:11:45 +0200 Norbert Schlia * Fix log entry 05c5ab1e / Fri, 8 Apr 2022 20:11:27 +0200 Norbert Schlia * Format 8a2b6a74 / Thu, 7 Apr 2022 20:39:48 +0200 Norbert Schlia * Issue #120: Set analyse duration to 15 seconds, misses out on some subtitle streams sometimes 258acfa7 / Thu, 7 Apr 2022 20:37:36 +0200 Norbert Schlia * MKV does not honour SAR, need to rescale 'manually' 880568f5 / Thu, 7 Apr 2022 20:37:02 +0200 Norbert Schlia * Remove debug code 52766cf6 / Wed, 6 Apr 2022 08:33:11 +0200 Norbert Schlia * Issue #120: increase analyzeduration to securely catch all subtitle streams cb8fe80b / Tue, 5 Apr 2022 23:15:09 +0200 Norbert Schlia * Fix read function if used with null buffer and smaller size 0b161e59 / Tue, 5 Apr 2022 23:14:32 +0200 Norbert Schlia * Typo in logging fixed 8806807c / Sun, 3 Apr 2022 22:25:01 +0200 Norbert Schlia * Log stream index with stream info cdec5b63 / Sun, 3 Apr 2022 22:24:08 +0200 Norbert Schlia * Refactoring bae6beaf / Sun, 3 Apr 2022 21:42:58 +0200 Norbert Schlia * Fix Doxygen comments d6cba85a / Sun, 3 Apr 2022 21:42:38 +0200 Norbert Schlia * Formatting f76236df / Sun, 3 Apr 2022 20:11:35 +0200 Norbert Schlia * Issue #120: Add Substation Alpha (SSA) header if missing 717f8639 / Sun, 3 Apr 2022 20:10:41 +0200 Norbert Schlia * Issue #120: Required refactoring 6ccb495a / Sun, 3 Apr 2022 20:00:47 +0200 Norbert Schlia * Extend logging a bit 230bdb86 / Sun, 3 Apr 2022 19:58:26 +0200 Norbert Schlia * Reformat f2fb2d8a / Sun, 3 Apr 2022 13:55:04 +0200 Norbert Schlia * Renamed string_format to strsprintf 31921c22 / Wed, 30 Mar 2022 20:29:27 +0200 Norbert Schlia * Fix subtitles from MPEGTS 9fe2a5e3 / Wed, 30 Mar 2022 20:28:58 +0200 Norbert Schlia * Clean up 2a002981 / Mon, 28 Mar 2022 20:12:42 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs d63f70ec / Mon, 28 Mar 2022 20:12:34 +0200 Norbert Schlia * AV_CODEC_ID_HDMV_PGS_SUBTITLE is also a bitmap codec 6a720357 / Mon, 28 Mar 2022 08:57:11 +0200 Norbert Schlia * Erase entries already processed from frame map, old entries caused crashes in subtitle engine b66a913b / Mon, 28 Mar 2022 08:55:48 +0200 Norbert Schlia * Clearer log entry if "is blocked from hardware decoding" 6a43256c / Sun, 27 Mar 2022 08:24:19 +0200 Norbert Schlia * Fix Doygen comments 1387b041 / Sat, 26 Mar 2022 21:43:00 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 1edb2a0d / Sat, 26 Mar 2022 21:41:48 +0100 Norbert Schlia * Closes #130: Report correct file sizes f64b39dc / Sat, 26 Mar 2022 21:38:13 +0100 Norbert Schlia * Comment: Number of HLS segments are not only for video c9ed0e49 / Sat, 26 Mar 2022 21:37:38 +0100 Norbert Schlia * Issue #129: Refactoring fc57eb02 / Sat, 26 Mar 2022 21:36:13 +0100 Norbert Schlia * Reformat code e53d60b7 / Sat, 26 Mar 2022 21:35:43 +0100 Norbert Schlia * Save duration in SQLite database db8d1705 / Sat, 26 Mar 2022 21:33:41 +0100 Norbert Schlia * Deprecated functions added to README.md a52b9455 / Sat, 26 Mar 2022 21:33:01 +0100 Norbert Schlia * Issue #129: Add fix to news list 15115f2a / Sat, 26 Mar 2022 21:31:39 +0100 Norbert Schlia * Removed irrelevant information from news list c3dd8ff4 / Fri, 25 Mar 2022 08:47:33 +0100 Norbert Schlia * Update changes list d2a927bd / Wed, 23 Mar 2022 21:31:26 +0100 Norbert Schlia * Closes #129: Calculate file sizes f7f4b456 / Wed, 23 Mar 2022 21:29:09 +0100 Norbert Schlia * Formatting d613ac31 / Tue, 22 Mar 2022 19:51:56 +0100 Norbert Schlia * Fix Doxygen comments 12ce2cfd / Tue, 22 Mar 2022 19:45:40 +0100 Norbert Schlia * Enhanced AVFrame handling using a C++ object Sending frames properly sorted to av_write_frame() 6cc0a432 / Mon, 21 Mar 2022 20:41:10 +0100 Norbert Schlia * 2022-03-15 - lavu 57.24.100 Deprecate previous channel layout API based on uint64 bitmasks. 2022-03-15 - swr 4.5.100 Deprecate swr_alloc_set_opts() and swr_build_matrix(). be5baf32 / Sun, 20 Mar 2022 15:31:05 +0100 Norbert Schlia * Fix Doxygen comments 4cfafe92 / Sun, 20 Mar 2022 07:51:05 +0100 Norbert Schlia * Ensure PTS/DTS are properly sorted 4cfb4d1c / Sat, 19 Mar 2022 20:23:55 +0100 Norbert Schlia * Merge pull request #128 from Martin2112/clarify_bitwise_ops 85aa535a / Sat, 19 Mar 2022 15:06:11 +0000 Martin Smith * Add brackets to some expressions with dubious operator precedence. e7632ef6 / Sat, 19 Mar 2022 19:35:39 +0100 Norbert Schlia * Avoid crash after video encoding error 55ef2a5f / Sat, 19 Mar 2022 19:35:13 +0100 Norbert Schlia * Remove forgotten debug outputs ad6c7272 / Sat, 19 Mar 2022 19:27:27 +0100 Norbert Schlia * Merge pull request #126 from Martin2112/fix_2112 10c268c6 / Sat, 19 Mar 2022 13:35:11 +0000 Martin Smith * In filenames created from cuesheet metadata replace '/' with '-' to avoid creating invalid names. d4558ba2 / Sat, 19 Mar 2022 12:28:23 +0000 Martin Smith * Add eclipse files to .gitignore. f51834ad / Thu, 17 Mar 2022 20:36:59 +0100 Norbert Schlia * Fix compiler warning d807e8ee / Thu, 17 Mar 2022 20:36:43 +0100 Norbert Schlia * Fix typo in comment 27fed7bb / Sun, 13 Mar 2022 08:33:19 +0100 Norbert Schlia * Fix clang warning 23bb745f / Sun, 13 Mar 2022 08:13:46 +0100 Norbert Schlia * Remove libav/pre FFmeg 4 tags e221952b / Sat, 12 Mar 2022 23:01:03 +0100 Norbert Schlia * Remove conditional code for FFmpeg API < 4 41132e16 / Sat, 12 Mar 2022 21:22:20 +0100 Norbert Schlia * Fix syntax error, very strange syntax. Need to repeat the IF clause in ENDIF. cmake is giving me the creeps 7a3bb018 / Sat, 12 Mar 2022 21:08:12 +0100 Norbert Schlia * Lowest supported FFmpeg API version raised to 4.1.8 "al-Khwarizmi". Dropped libavresample support, library was removed from FFmpeg API after 3.4.9. 62bbc7c4 / Sat, 12 Mar 2022 20:59:48 +0100 Norbert Schlia * Fix warning 69c92a39 / Sat, 12 Mar 2022 17:02:53 +0100 Norbert Schlia * Fix crash when video has subtitles, but no audio c4053771 / Sat, 12 Mar 2022 16:41:44 +0100 Norbert Schlia * Formatting 49972c05 / Sat, 12 Mar 2022 16:41:30 +0100 Norbert Schlia * Fix doxy comments fa7c96f7 / Mon, 7 Mar 2022 21:20:23 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 44d93dad / Mon, 7 Mar 2022 21:16:33 +0100 Norbert Schlia * Closes Issue #122: Last song was missing from cuesheet files. fe5c96dc / Mon, 7 Mar 2022 21:16:33 +0100 Norbert Schlia * Closes Issue #122: Last song was missing from cuesheet files. e68c133a / Mon, 7 Mar 2022 16:33:54 +0100 Norbert Schlia * Issue #120: Add subtitle support. 9327c5ea / Mon, 7 Mar 2022 16:33:07 +0100 Norbert Schlia * Enable C++17 standard 935b48d6 / Sun, 27 Feb 2022 19:42:10 +0100 Norbert Schlia * Refactoring 64af1a98 / Sun, 27 Feb 2022 19:41:46 +0100 Norbert Schlia * Reformat code 1bec52ad / Fri, 25 Feb 2022 19:30:28 +0100 Norbert Schlia * Fix memory leak in encode_audio_frame() 48f208c0 / Fri, 25 Feb 2022 19:29:49 +0100 Norbert Schlia * Move comments for format table to head 01f1e0ca / Fri, 25 Feb 2022 19:29:23 +0100 Norbert Schlia * Refactoring ddfff956 / Fri, 25 Feb 2022 19:27:23 +0100 Norbert Schlia * Format 2e101bb7 / Wed, 23 Feb 2022 17:43:40 +0100 Norbert Schlia * Fix typos 65b421ce / Wed, 16 Feb 2022 19:38:27 +0100 Norbert Schlia * Raise version to 2.10 26df65fa / Wed, 16 Feb 2022 19:31:42 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs f8c69933 / Wed, 16 Feb 2022 19:15:30 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 20caa0a2 / Wed, 16 Feb 2022 19:15:30 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 97fffd85 / Wed, 16 Feb 2022 18:49:57 +0100 Norbert Schlia * Update documentation ea8a05d8 / Wed, 16 Feb 2022 18:49:57 +0100 Norbert Schlia * Update documentation 18972832 / Wed, 16 Feb 2022 18:48:39 +0100 Norbert Schlia * Closes Issue #121: Add MKV support d1956937 / Wed, 16 Feb 2022 18:45:44 +0100 Norbert Schlia * Cleanup e4227f96 / Mon, 14 Feb 2022 21:49:55 +0100 Norbert Schlia * Remove restart code - did not work a4f0d4ff / Mon, 14 Feb 2022 20:38:08 +0100 Norbert Schlia * Fix file size check for daily build c1e61071 / Mon, 14 Feb 2022 20:36:07 +0100 Norbert Schlia * Reduce logging ca4fa319 / Sun, 13 Feb 2022 17:28:10 +0100 Norbert Schlia * Add missing file 85d7f157 / Sun, 13 Feb 2022 17:23:10 +0100 Norbert Schlia * Add cmake uninstall This is it, cmake is useless, will be removed ce136d75 / Sun, 13 Feb 2022 17:22:39 +0100 Norbert Schlia * Dokument cmake install 320c8fa1 / Sun, 13 Feb 2022 17:21:39 +0100 Norbert Schlia * Avoid infinite transcoding loop b06e6011 / Sun, 13 Feb 2022 17:20:25 +0100 Norbert Schlia * Log total HLS segments together with current segment 996edfb6 / Sun, 6 Feb 2022 17:00:50 +0100 Norbert Schlia * Cleanup 33749b3d / Sun, 6 Feb 2022 09:02:30 +0100 Norbert Schlia * Ignore some ninja files bde7a90e / Sun, 6 Feb 2022 09:01:43 +0100 Norbert Schlia * Fix syntax error 78270e94 / Sun, 6 Feb 2022 09:01:01 +0100 Norbert Schlia * Update with MKV support b88c28dc / Sat, 5 Feb 2022 16:33:30 +0100 Norbert Schlia * Issue #121: Mention expiremental MKV support 10171921 / Sat, 5 Feb 2022 16:32:38 +0100 Norbert Schlia * Fix some build warnings with clang e64e657c / Sat, 5 Feb 2022 16:31:53 +0100 Norbert Schlia * Update doxygen comments: @file filenames were missing b9cb48e9 / Sat, 5 Feb 2022 16:19:08 +0100 Norbert Schlia * Refactoring e7e6032b / Sat, 5 Feb 2022 16:18:09 +0100 Norbert Schlia * Fix some build warnings with clang bdb35cc7 / Sat, 5 Feb 2022 16:13:25 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 2b4d2394 / Sat, 5 Feb 2022 16:12:36 +0100 Norbert Schlia * Fix file size check failing sometimes c7d752d9 / Sat, 5 Feb 2022 16:11:42 +0100 Norbert Schlia * Log cp calls 528175fd / Sat, 5 Feb 2022 16:11:24 +0100 Norbert Schlia * cp files to /dev/null rather than using cat a8c95373 / Sat, 5 Feb 2022 16:09:52 +0100 Norbert Schlia * Fix syntax error aeb91d06 / Thu, 20 Jan 2022 11:04:11 +0100 Norbert Schlia * Fix cmake build 99824bb7 / Thu, 20 Jan 2022 11:01:05 +0100 Norbert Schlia * Issue #121: experimental MKV support 26541349 / Thu, 20 Jan 2022 10:55:17 +0100 Norbert Schlia * Create cache dir on install only fa54b430 / Thu, 20 Jan 2022 10:28:15 +0100 Norbert Schlia * make install/dist c3b1f529 / Thu, 20 Jan 2022 10:27:10 +0100 Norbert Schlia * Formatting 652102fa / Thu, 20 Jan 2022 10:24:03 +0100 Norbert Schlia * cp files to /dev/null rather than doing cat 38beb9bc / Tue, 18 Jan 2022 09:50:58 +0100 Norbert Schlia * Remove package code, did not work as expected. Will be updated later. 96e6f13f / Sun, 16 Jan 2022 20:30:48 +0100 Norbert Schlia * Fix opus/webm file size ae30c609 / Sun, 16 Jan 2022 20:29:36 +0100 Norbert Schlia * Doxygen is optional 4de0770f / Sun, 16 Jan 2022 16:37:04 +0100 Norbert Schlia * Avoid creating an HLS segment number which is out of bounds 5d4933fc / Sun, 16 Jan 2022 16:35:08 +0100 Norbert Schlia * Synchronise screen log fdfd9ed0 / Sun, 16 Jan 2022 16:33:48 +0100 Norbert Schlia * Rephrased log entry about cache hits/misses 41e8041d / Sun, 16 Jan 2022 16:31:40 +0100 Norbert Schlia * Rephrased log entry when starting a new HLS segment 5f3c63d7 / Sat, 15 Jan 2022 21:56:19 +0100 Norbert Schlia * Closes #67: Update documentation 1a807562 / Sat, 15 Jan 2022 20:07:57 +0100 Norbert Schlia * Even more confusion d1f2c68c / Sat, 15 Jan 2022 19:34:24 +0100 Norbert Schlia * CLean up d485f3ac / Sat, 15 Jan 2022 19:31:13 +0100 Norbert Schlia * Even more Clang/GCC chaos fixed 45a34e35 / Sat, 15 Jan 2022 19:29:32 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs afda770e / Sat, 15 Jan 2022 19:26:16 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 9982af51 / Sat, 15 Jan 2022 19:26:16 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 77a189d2 / Sat, 15 Jan 2022 19:22:54 +0100 Norbert Schlia * Oops, confused clang with gcc 9fb14e76 / Sat, 15 Jan 2022 19:22:54 +0100 Norbert Schlia * Oops, confused clang with gcc f85ddd9d / Sat, 15 Jan 2022 19:11:25 +0100 Norbert Schlia * Change name to match cmake/GCC 28e278fd / Sat, 15 Jan 2022 19:07:18 +0100 Norbert Schlia * Add Clang build d367a990 / Sat, 15 Jan 2022 18:53:23 +0100 Norbert Schlia * Add Clang build 894534c5 / Sat, 15 Jan 2022 18:45:37 +0100 Norbert Schlia * Add cmake badge b9474eb5 / Sat, 15 Jan 2022 18:26:54 +0100 Norbert Schlia * Enable Doxygen and cppcheck d0367d3f / Sat, 15 Jan 2022 12:10:20 +0100 Norbert Schlia * Corrected name ab9e640c / Sat, 15 Jan 2022 12:08:12 +0100 Norbert Schlia * Fix syntax error c3e63eee / Sat, 15 Jan 2022 12:05:21 +0100 Norbert Schlia * Create action with two jobs 0b5cf703 / Sat, 15 Jan 2022 11:10:51 +0100 Norbert Schlia * Break build on error at make step 828788bd / Sat, 15 Jan 2022 11:09:53 +0100 Norbert Schlia * Fix make distcheck 1b63844b / Sat, 15 Jan 2022 11:09:27 +0100 Norbert Schlia * Fix out of source build db0e88ed / Fri, 14 Jan 2022 14:52:27 +0100 Norbert Schlia * Put build badges into separate lines 6ae68767 / Fri, 14 Jan 2022 14:47:01 +0100 Norbert Schlia * C/CPP CI renamed 3bdffa74 / Thu, 13 Jan 2022 22:57:18 +0100 Norbert Schlia * Add missing source file Remove cppcheck dependency for main project a5433974 / Thu, 13 Jan 2022 22:48:08 +0100 Norbert Schlia * Forgot the config.h input file c71eb474 / Thu, 13 Jan 2022 22:43:34 +0100 Norbert Schlia * Add cppheck target d942bb12 / Thu, 13 Jan 2022 22:39:33 +0100 Norbert Schlia * Removed CMakeLists.txt from ignore and added file to GIT fa9a50ed / Thu, 13 Jan 2022 22:14:49 +0100 Norbert Schlia * Create build action with cmake b50656ea / Thu, 13 Jan 2022 22:00:47 +0100 Norbert Schlia * Build suddenly fails without change 6dedc6f0 / Thu, 13 Jan 2022 21:34:11 +0100 Norbert Schlia * Cmake build system files c370249b / Tue, 11 Jan 2022 21:08:33 +0100 Norbert Schlia * Reset DVD chapter name layout b8dcb995 / Mon, 10 Jan 2022 21:46:51 +0100 Norbert Schlia * Fix potential buffer overrun transcoding to AIFF 9b1354ab / Mon, 10 Jan 2022 21:46:22 +0100 Norbert Schlia * Copy to nulldevice rather than using cat 2860ca0f / Mon, 10 Jan 2022 16:22:21 +0100 Norbert Schlia * Clean up properly after test_filecount_hls, test_filenames_hls and test_filesize_hls 11d8e64d / Mon, 10 Jan 2022 16:21:42 +0100 Norbert Schlia * Remove forgotten debug output dd8d9453 / Mon, 10 Jan 2022 07:11:16 +0100 Norbert Schlia * Include cppcheck in build 828d9cee / Mon, 10 Jan 2022 06:45:29 +0100 Norbert Schlia * Issue #67: better file size prediction for video streams dfa3a664 / Mon, 10 Jan 2022 06:43:35 +0100 Norbert Schlia * Do not report missing includes a9fc0443 / Sun, 9 Jan 2022 23:28:55 +0100 Norbert Schlia * Log 'transcoder' rather than 'decoder' 6b017b76 / Sun, 9 Jan 2022 23:14:45 +0100 Norbert Schlia * Clean up some more files in squeaky clean f181022d / Sun, 9 Jan 2022 22:51:15 +0100 Norbert Schlia * make clean should also remove doxygen.log 52ab9125 / Sun, 9 Jan 2022 22:50:47 +0100 Norbert Schlia * Remove QtCreator helper file 105eaded / Sun, 9 Jan 2022 18:17:53 +0100 Norbert Schlia * Do not break make process when cppcheck returns error, not reliable 242156ba / Sun, 9 Jan 2022 17:59:38 +0100 Norbert Schlia * Resource leak detection not reliant, turn off 2a0cc298 / Sun, 9 Jan 2022 17:54:14 +0100 Norbert Schlia * But VC1 can be removed from encoding 582eeb61 / Sun, 9 Jan 2022 17:52:04 +0100 Norbert Schlia * Revert "Remove references to VC1/WVM3: WMV is not supported" 26e44420 / Sun, 9 Jan 2022 17:33:01 +0100 Norbert Schlia * Add cppcheck to Jenkins CI 9d60d952 / Sun, 9 Jan 2022 17:32:33 +0100 Norbert Schlia * Remove references to VC1/WVM3: WMV is not supported c87e4148 / Sun, 9 Jan 2022 17:29:36 +0100 Norbert Schlia * Format 3560e303 / Sun, 9 Jan 2022 17:29:03 +0100 Norbert Schlia * Make cppcheck break build make when it finds an error 5c617f2e / Sun, 9 Jan 2022 11:21:54 +0100 Norbert Schlia * For JPG framesets, change compliance to UNOFFICAL. Sometimes the pixel forat requires 'non-standard' JPGs. a19b2312 / Sun, 9 Jan 2022 11:15:24 +0100 Norbert Schlia * Refactoring f8030d36 / Sun, 9 Jan 2022 11:15:07 +0100 Norbert Schlia * Fix build with latest API 7378bcde / Sun, 9 Jan 2022 11:14:36 +0100 Norbert Schlia * Fix crash im metadata binary on machines with self-built ffmpeg cc43a785 / Sun, 9 Jan 2022 00:45:21 +0100 Norbert Schlia * improvements due to cppcheck hints af002153 / Sun, 9 Jan 2022 00:30:30 +0100 Norbert Schlia * improvements due to cppcheck hints 9f954f0a / Sat, 8 Jan 2022 23:46:30 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 58007b71 / Sat, 8 Jan 2022 23:17:34 +0100 Norbert Schlia * Activate cppcheck Lots of code improvements due to cppcheck hints e3613612 / Sat, 8 Jan 2022 23:17:34 +0100 Norbert Schlia * Activate cppcheck Lots of code improvements due to cppcheck hints 0e91b42d / Sat, 8 Jan 2022 22:52:56 +0100 Norbert Schlia * make cppcheck removed 68178dd0 / Sat, 8 Jan 2022 22:38:08 +0100 Norbert Schlia * Set path-ignore da7e5328 / Sat, 8 Jan 2022 22:35:35 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 195c54ef / Sat, 8 Jan 2022 22:35:23 +0100 Norbert Schlia * Also collect build logs 0b60e788 / Sat, 8 Jan 2022 08:24:57 +0100 Norbert Schlia * Fix ignores 0ae4c36f / Sat, 8 Jan 2022 06:57:14 +0100 Norbert Schlia * Move badges into one line 9f927927 / Sat, 8 Jan 2022 06:35:54 +0100 Norbert Schlia * Issue #67: better file size prediction for audio streams d9da3529 / Fri, 7 Jan 2022 21:45:20 +0100 Norbert Schlia * Documentation c3758b5f / Fri, 7 Jan 2022 21:42:16 +0100 Norbert Schlia * Fix crash when video has no audio c0ce263d / Fri, 7 Jan 2022 21:39:34 +0100 Norbert Schlia * Closes #119: Properly synchronise frame set access 78963dfe / Thu, 6 Jan 2022 14:20:48 +0100 Norbert Schlia * Type: We are in 2022, not 2020 034ed971 / Thu, 6 Jan 2022 08:39:53 +0100 Norbert Schlia * Comment cron settings c445961b / Thu, 6 Jan 2022 08:19:21 +0100 Norbert Schlia * Ignore files that do not go into the build dc270c60 / Wed, 5 Jan 2022 21:44:24 +0100 Norbert Schlia * Merge pull request #116 from nschlia/nschlia-patch-code-analysis d7e9abd5 / Wed, 5 Jan 2022 21:25:07 +0100 Norbert Schlia * Closes #117 / closes #118: added cast to avoid overflow 0a776d26 / Wed, 5 Jan 2022 20:47:56 +0100 Norbert Schlia * Enable build 3e448f8d / Wed, 5 Jan 2022 20:39:58 +0100 Norbert Schlia * Disable autobuild f17e2611 / Wed, 5 Jan 2022 20:25:51 +0100 Norbert Schlia * Set up code analysis 4dc3a37b / Wed, 5 Jan 2022 20:15:35 +0100 Norbert Schlia * Merge pull request #115 from nschlia/nschlia-patch-ci e4aa3766 / Wed, 5 Jan 2022 18:26:17 +0100 Norbert Schlia * Include c++ build badge 56921cac / Wed, 5 Jan 2022 18:13:24 +0100 Norbert Schlia * Log current gcc/FFmpeg version 3957a31b / Wed, 5 Jan 2022 18:05:53 +0100 Norbert Schlia * Include Docker image build badge 531ff217 / Wed, 5 Jan 2022 17:35:22 +0100 Norbert Schlia * Even more FLAC tags 399419da / Wed, 5 Jan 2022 17:23:27 +0100 Norbert Schlia * Fix some checks for FFmpeg 4.2 96211f07 / Wed, 5 Jan 2022 17:08:45 +0100 Norbert Schlia * Always collect test results 5e277c07 / Wed, 5 Jan 2022 16:53:11 +0100 Norbert Schlia * Correct workspace path??? a58d31c4 / Wed, 5 Jan 2022 16:44:51 +0100 Norbert Schlia * Remove already available stuff from prereq list 131d9e9c / Wed, 5 Jan 2022 16:30:47 +0100 Norbert Schlia * Collect artifacts e6a41aa6 / Wed, 5 Jan 2022 16:05:22 +0100 Norbert Schlia * Remove duplicates and alreaady available 8a6365ed / Wed, 5 Jan 2022 15:53:16 +0100 Norbert Schlia * Need sudo 3b5332d9 / Wed, 5 Jan 2022 15:48:42 +0100 Norbert Schlia * Prerequisites 227c2bef / Wed, 5 Jan 2022 15:43:11 +0100 Norbert Schlia * Install preqisites 1ff48179 / Wed, 5 Jan 2022 15:28:18 +0100 Norbert Schlia * Set up CI e6fb9e99 / Wed, 5 Jan 2022 14:21:20 +0100 Norbert Schlia * Include Dockerfile 6eee82e7 / Wed, 5 Jan 2022 14:20:37 +0100 Norbert Schlia * Implement get_filetype_text() as inverse for get_filetype() dc79b181 / Wed, 5 Jan 2022 14:17:18 +0100 Norbert Schlia * Refactoring 8f8f8765 / Wed, 5 Jan 2022 13:49:39 +0100 Norbert Schlia * Fix docker detection #113 - I think it*s a bit too early to use the logging facilty here. Using stderr instead. 269e1726 / Wed, 5 Jan 2022 13:42:11 +0100 Norbert Schlia * Merge pull request #113 from igor-epam/#113-Fix-docker-detection d46ddf2e / Wed, 5 Jan 2022 14:47:25 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Update ffmpeg_utils.cc 8bec1df7 / Wed, 5 Jan 2022 09:22:43 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Merge branch 'master' into #113-Fix-docker-detection fb61e5b0 / Tue, 4 Jan 2022 21:45:14 +0100 Norbert Schlia * test_frameset should actually not be called directly... b632db2b / Tue, 4 Jan 2022 22:07:41 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Update ffmpeg_utils.cc 719e718e / Tue, 4 Jan 2022 20:07:07 +0100 Norbert Schlia * Issue #110: Documentation 32f5e467 / Tue, 4 Jan 2022 19:55:24 +0100 Norbert Schlia * Issue #112: Documentation 11d1c744 / Tue, 4 Jan 2022 19:42:55 +0100 Norbert Schlia * Fix formatting 2b9c3aac / Tue, 4 Jan 2022 19:39:48 +0100 Norbert Schlia * Closes #112: add --cgroupns host to Docker run command 0156a83a / Tue, 4 Jan 2022 16:05:12 +0100 Norbert Schlia * docker build: Add missing --build-arg fd8b0e23 / Tue, 4 Jan 2022 17:29:18 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Create ffmpeg_utils.cc 6565590c / Tue, 4 Jan 2022 14:02:47 +0100 Norbert Schlia * Merge pull request #111 from igor-epam/master 82378511 / Tue, 4 Jan 2022 15:46:38 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Update Dockerfile 9299b120 / Tue, 4 Jan 2022 14:37:56 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Update Dockerfile fcbec670 / Tue, 4 Jan 2022 14:34:43 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Update Dockerfile f2b92673 / Tue, 4 Jan 2022 14:26:08 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Update Dockerfile 9ceb4f2e / Tue, 4 Jan 2022 14:24:28 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Update Dockerfile 9638d03c / Tue, 4 Jan 2022 14:17:05 +0300 igor-epam <38714065+igor-epam@users.noreply.github.com> * Create docker-image.yml 46dc4030 / Tue, 4 Jan 2022 09:32:50 +0100 Norbert Schlia * Closes Issue #110: use libdvdread4 or libdvdread8 whatever available 9e59c611 / Mon, 3 Jan 2022 16:04:11 +0100 Norbert Schlia * Cosmetical: Declare big bunch of variables const 81c8395f / Mon, 3 Jan 2022 15:32:37 +0100 Norbert Schlia * Make list_options static 342301c7 / Mon, 3 Jan 2022 15:32:15 +0100 Norbert Schlia * Fix Doxygen comments 591352b7 / Mon, 3 Jan 2022 15:32:00 +0100 Norbert Schlia * Formatting a5e1b198 / Mon, 3 Jan 2022 09:31:12 +0100 Norbert Schlia * Issue #67: FLAC file size prediction 160afa96 / Mon, 3 Jan 2022 09:29:57 +0100 Norbert Schlia * Ensure file size check uses the correct size a27fa073 / Mon, 3 Jan 2022 09:28:36 +0100 Norbert Schlia * Fix typo 5d397a36 / Mon, 3 Jan 2022 09:25:58 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 1b4c18f5 / Sat, 1 Jan 2022 15:17:56 +0100 Norbert Schlia * (c) until 2022 bb8045d4 / Sat, 1 Jan 2022 15:15:34 +0100 Norbert Schlia * Silence implicit-int-conversion in Fuse API code when built with clang 1727649c / Sat, 1 Jan 2022 15:14:46 +0100 Norbert Schlia * Make (c) header smaller deb9bb6a / Mon, 27 Dec 2021 08:31:36 +0100 Norbert Schlia * Move install section up 60070744 / Mon, 20 Dec 2021 14:01:14 +0100 Norbert Schlia * Fix Doxygen 87a6eb5e / Mon, 20 Dec 2021 13:48:21 +0100 Norbert Schlia * Closes #109: Documentation/help 66b6246c / Mon, 20 Dec 2021 13:47:01 +0100 Norbert Schlia * Convert 2.9 news to bullet list 80ad45d4 / Mon, 20 Dec 2021 13:46:09 +0100 Norbert Schlia * Fix audio/videocodec tables 5f30139b / Thu, 16 Dec 2021 21:21:41 +0100 Norbert Schlia * Revert file delition 56550492 / Thu, 16 Dec 2021 20:19:58 +0100 Norbert Schlia * Issue #109: extend to audio/video 23223734 / Thu, 16 Dec 2021 20:06:41 +0100 Norbert Schlia * Issue #109: Apply patch provideed by kimmot 9475d110 / Thu, 16 Dec 2021 19:54:24 +0100 Norbert Schlia * Log currently processed file 3344bf90 / Tue, 7 Dec 2021 20:00:27 +0100 Norbert Schlia * Add bullseye backports 614ba0d3 / Tue, 7 Dec 2021 19:47:17 +0100 Norbert Schlia * Closes #97: Update documention 38c55d3b / Tue, 7 Dec 2021 19:45:07 +0100 Norbert Schlia * Closes #97: Update documention 8b247261 / Tue, 7 Dec 2021 14:19:33 +0100 Norbert Schlia * Issue #97: Update codec list 1aea8c26 / Tue, 7 Dec 2021 14:19:11 +0100 Norbert Schlia * Issue #105: Add FLAC to help 3698e13f / Tue, 7 Dec 2021 14:18:12 +0100 Norbert Schlia * Forgot to mention TS/HLS in video formats ee6306df / Tue, 7 Dec 2021 13:47:03 +0100 Norbert Schlia * Issue #97: Complete error messages 0844166e / Tue, 7 Dec 2021 13:45:26 +0100 Norbert Schlia * Generalise variable and function names 5abb244b / Tue, 7 Dec 2021 13:31:57 +0100 Norbert Schlia * Enhanced logging 208da36c / Mon, 6 Dec 2021 17:59:34 +0100 Norbert Schlia * Update installation under Bullseye 903daa93 / Mon, 6 Dec 2021 11:35:46 +0100 Norbert Schlia * Fixed error messages 35091550 / Mon, 6 Dec 2021 11:33:34 +0100 Norbert Schlia * Issue #97: Fixed error message 8b342be2 / Mon, 6 Dec 2021 11:23:59 +0100 Norbert Schlia * Issue #97: added --audiocodec/--videocodec parameters ee9a5c77 / Thu, 2 Dec 2021 19:47:58 +0100 Norbert Schlia * Several test_video_hw tests created the same log file c97c5242 / Thu, 2 Dec 2021 19:47:11 +0100 Norbert Schlia * Add some missing files to make wipe-all ec2679c3 / Thu, 2 Dec 2021 19:46:22 +0100 Norbert Schlia * Add forgotten error check in docker check 6e98e831 / Thu, 2 Dec 2021 19:45:51 +0100 Norbert Schlia * Fix mistake in comment 8844710f / Mon, 29 Nov 2021 16:18:37 +0100 Norbert Schlia * Version to 2.9 8ccb6457 / Mon, 29 Nov 2021 16:04:49 +0100 Norbert Schlia * Release 2.8 4b5b90ae / Mon, 29 Nov 2021 10:21:27 +0100 Norbert Schlia * Fix doxygen 15ac5caa / Sun, 28 Nov 2021 22:09:58 +0100 Norbert Schlia * Fix big endian build e8e3be4c / Sun, 28 Nov 2021 22:09:34 +0100 Norbert Schlia * Fix variable name clash (_errno to orgerrno) 407bf6e8 / Sun, 28 Nov 2021 22:09:13 +0100 Norbert Schlia * Clean up a bit 724c0e69 / Fri, 26 Nov 2021 22:12:13 +0100 Norbert Schlia * Fix syntax errors 42394e60 / Fri, 26 Nov 2021 22:11:05 +0100 Norbert Schlia * Fix syntax errors 5f03521e / Fri, 26 Nov 2021 21:53:22 +0100 Norbert Schlia * Added several missing checks 6ac2d9d4 / Fri, 26 Nov 2021 21:52:57 +0100 Norbert Schlia * Fixed some file site and tag tests 428ef6df / Fri, 26 Nov 2021 20:01:08 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 42a58f4a / Fri, 26 Nov 2021 20:00:35 +0100 Norbert Schlia * Closes #107: Create required size entries in AIFF header 0c4ccb75 / Fri, 26 Nov 2021 19:58:32 +0100 Norbert Schlia * Fix problems with big endian CPUs ba6d475c / Fri, 26 Nov 2021 13:29:48 +0100 Norbert Schlia * Removed comment that was just a reminder for me 4846b195 / Fri, 26 Nov 2021 13:29:48 +0100 Norbert Schlia * Add pack(1) sfor safety 8e8bba3b / Thu, 25 Nov 2021 21:22:30 +0100 Norbert Schlia * Remove debug output 18b4843e / Thu, 25 Nov 2021 17:00:36 +0100 Norbert Schlia * Closes #101: Add --audiosamplefmt option fdf35b14 / Thu, 25 Nov 2021 16:55:09 +0100 Norbert Schlia * Version to 2.8 25aa9f10 / Thu, 25 Nov 2021 16:53:41 +0100 Norbert Schlia * Issue #105: Add FLAC to checks f4ef7d5e / Mon, 22 Nov 2021 17:52:18 +0100 Norbert Schlia * Formatted tables a3a15daf / Mon, 22 Nov 2021 11:31:30 +0100 Norbert Schlia * Sort format list in alphabetical order a196b815 / Mon, 22 Nov 2021 09:45:05 +0100 Norbert Schlia * Issue #105: Forgot FLAC in format list eb3ff019 / Sun, 21 Nov 2021 21:56:14 +0100 Norbert Schlia * Fix potential crash 2e7463e8 / Sun, 21 Nov 2021 21:46:18 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 246baa28 / Sun, 21 Nov 2021 20:06:51 +0100 Norbert Schlia * Closes #105: Add FLAC support 43ada565 / Sun, 21 Nov 2021 20:06:51 +0100 Norbert Schlia * Closes #105: Add FLAC support 6c4408ac / Sun, 21 Nov 2021 19:32:19 +0100 Norbert Schlia * Format 177009a7 / Sun, 21 Nov 2021 19:32:01 +0100 Norbert Schlia * Syntax of comment corrected 61b96e5f / Sat, 20 Nov 2021 17:42:39 +0100 Norbert Schlia * Code formatting 4ab670db / Sat, 20 Nov 2021 17:42:02 +0100 Norbert Schlia * Enhanced error reporting: List valid options d504308d / Sat, 20 Nov 2021 17:38:57 +0100 Norbert Schlia * Issue #99: Error message was confusing. Corrected syntax as well. e61cc725 / Sat, 20 Nov 2021 17:37:05 +0100 Norbert Schlia * Code formatting d7434f1e / Sat, 20 Nov 2021 17:36:07 +0100 Norbert Schlia * Comment formatting 96832028 / Fri, 19 Nov 2021 08:38:26 +0100 Norbert Schlia * Refactoring 1c0de836 / Wed, 17 Nov 2021 22:51:35 +0100 Norbert Schlia * Closes #100: Do no try to add album arts if not supported by destination format c7ca7718 / Wed, 17 Nov 2021 22:51:00 +0100 Norbert Schlia * Avoid crashes in rare cases fe40a9f6 / Wed, 17 Nov 2021 06:54:15 +0100 Norbert Schlia * Fix syntax error. Remove confusing information. 135efeac / Wed, 17 Nov 2021 06:50:48 +0100 Norbert Schlia * Issue #91: Applies to HLS only 52bb0f8b / Wed, 17 Nov 2021 06:47:48 +0100 Norbert Schlia * Add version to branch table e647345f / Wed, 17 Nov 2021 06:43:57 +0100 Norbert Schlia * Feature branch (FB) deleted 76eae261 / Mon, 15 Nov 2021 20:15:34 +0100 Norbert Schlia * Closes #103: Discard segment seek if distance too short 0853fa92 / Mon, 15 Nov 2021 20:14:33 +0100 Norbert Schlia * Fix Doxygen texts 19a4f443 / Mon, 15 Nov 2021 20:13:24 +0100 Norbert Schlia * Fix format 7d250c32 / Mon, 15 Nov 2021 20:13:11 +0100 Norbert Schlia * Issue #91: Documentation 82a6f76d / Mon, 15 Nov 2021 20:11:58 +0100 Norbert Schlia * Issue #102: Documentation 945038cc / Mon, 15 Nov 2021 09:35:42 +0100 Norbert Schlia * Closes #102: Do not append to cache files when writing. 360d63b8 / Mon, 15 Nov 2021 09:34:28 +0100 Norbert Schlia * Issue #102: Make sure that the cache is clean when transcoding starts. 7265f8b8 / Mon, 15 Nov 2021 09:31:05 +0100 Norbert Schlia * Issue #102: Make all SQL queries where case sensitive 3cc8f9de / Mon, 15 Nov 2021 09:29:42 +0100 Norbert Schlia * Cosmetical: Trace output of parameters of audio and video: codec/bitrate in same order b7d0e276 / Mon, 15 Nov 2021 09:28:29 +0100 Norbert Schlia * Change nocasecompare() to match Doygen documentation e71f05f8 / Thu, 11 Nov 2021 20:27:52 +0100 Norbert Schlia * Fix typo 1610abef / Thu, 11 Nov 2021 20:22:52 +0100 Norbert Schlia * Info about 2.7 0cbc69b0 / Tue, 9 Nov 2021 20:30:21 +0100 Norbert Schlia * Change to 4 columns 5f74d6bc / Tue, 9 Nov 2021 20:26:17 +0100 Norbert Schlia * Add packaging status 5d5097ea / Mon, 8 Nov 2021 15:14:41 +0100 Norbert Schlia * Prepare release 2.7 75bfb449 / Mon, 8 Nov 2021 06:47:58 +0100 Norbert Schlia * Fix Doxygen comments 13b2c137 / Sat, 6 Nov 2021 12:48:43 +0100 Norbert Schlia * Closes #99: Report command line error if --desttype specifies audio format first dd8da955 / Sat, 6 Nov 2021 12:47:50 +0100 Norbert Schlia * Closes #99: Report command line error if --desttype specifies audio format first a3330407 / Fri, 5 Nov 2021 11:26:24 +0100 Norbert Schlia * Closes #96: Fixed potential buffer overrun when reading corrupted input files d8ceb336 / Fri, 5 Nov 2021 11:26:24 +0100 Norbert Schlia * Closes #96: Fixed potential buffer overrun when reading corrupted input files 6229382d / Fri, 5 Nov 2021 11:16:44 +0100 Norbert Schlia * refactoring 8bf2856f / Sun, 31 Oct 2021 20:18:56 +0100 Norbert Schlia * Add 'General problems' paragraph 068f912d / Sun, 31 Oct 2021 20:18:24 +0100 Norbert Schlia * Set correct target duration in m3u8 b82c7543 / Sun, 24 Oct 2021 08:53:09 +0200 Norbert Schlia * Update FFmpeg versions in distros 5d2a08e9 / Sun, 24 Oct 2021 08:43:43 +0200 Norbert Schlia * Updated "Planned Features" 8ffe78fd / Sun, 24 Oct 2021 08:37:22 +0200 Norbert Schlia * Set correct GCC and Clang versions dc8ed905 / Thu, 21 Oct 2021 07:04:16 +0200 Norbert Schlia * Add manpages to Doxygen f8d43eba / Thu, 21 Oct 2021 07:03:53 +0200 Norbert Schlia * Move history to separate file, became quite lengthy 231b7925 / Thu, 21 Oct 2021 07:02:22 +0200 Norbert Schlia * Issue #92: Add command line option to block hardware decoding for selected codecs and profiles 5d79f21f / Thu, 21 Oct 2021 06:56:29 +0200 Norbert Schlia * Corrected doxy comment of get_hwaccel e2e33c6d / Thu, 21 Oct 2021 06:54:28 +0200 Norbert Schlia * Better error reporting for command line: also mention parameter name 6d86f8a2 / Thu, 21 Oct 2021 06:49:31 +0200 Norbert Schlia * Formatting f6021cea / Thu, 21 Oct 2021 06:45:57 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 43069eb1 / Thu, 21 Oct 2021 06:45:44 +0200 Norbert Schlia * Bullseye paragraph first, then Buster, since Bullseye is the current distro f468e9e4 / Tue, 19 Oct 2021 09:53:54 +0200 Norbert Schlia * Fix some debug output 4ea3332d / Tue, 19 Oct 2021 09:51:20 +0200 Norbert Schlia * Formatting fixed 85b06ed9 / Sat, 16 Oct 2021 12:21:55 +0200 Norbert Schlia * Fix typo in log 89414f8c / Sat, 16 Oct 2021 12:21:39 +0200 Norbert Schlia * Log that error comes from video frame cfdb1ad9 / Sat, 16 Oct 2021 12:19:26 +0200 Norbert Schlia * Issue #92: Handle unexpected EAGAIN as an error, abort transcoding. Fixes the crash. 7fe4d08d / Fri, 24 Sep 2021 20:10:59 +0200 Norbert Schlia * Fix opus audio checks for Raspbian Bullseye bf53b32f / Thu, 23 Sep 2021 22:41:22 +0200 Norbert Schlia * Even more typos 3521115b / Thu, 23 Sep 2021 22:36:09 +0200 Norbert Schlia * Another typo 4eea37e5 / Thu, 23 Sep 2021 22:33:15 +0200 Norbert Schlia * Fix typo eb144eac / Mon, 20 Sep 2021 08:00:17 +0200 Norbert Schlia * Fix Doxyfile warnings e498f454 / Mon, 20 Sep 2021 07:59:41 +0200 Norbert Schlia * Update Doxfile to 1.9.1 2391bd59 / Mon, 20 Sep 2021 07:58:01 +0200 Norbert Schlia * Corrected text formatting b476450d / Sun, 19 Sep 2021 11:51:14 +0200 Norbert Schlia * Update README.md 366e7bef / Sun, 19 Sep 2021 11:50:31 +0200 Norbert Schlia * Update README.md 9bdf843e / Sun, 19 Sep 2021 11:50:11 +0200 Norbert Schlia * Update news for 2.7 6c6d0a3c / Sat, 11 Sep 2021 21:40:51 +0200 Norbert Schlia * Set version to 2.7 f5e7e555 / Sat, 11 Sep 2021 21:40:12 +0200 Norbert Schlia * Fix three typos in log entries and docs 01788768 / Sat, 4 Sep 2021 16:53:02 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/FB' 304dff67 / Sat, 4 Sep 2021 16:37:35 +0200 Norbert Schlia * Prepare 2.4 release c3b5b0ad / Wed, 1 Sep 2021 18:57:37 +0200 Norbert Schlia * Fix compiler warning 3d247fbe / Wed, 1 Sep 2021 18:57:17 +0200 Norbert Schlia * Remove non working scan_all_pmts option e1a435bb / Mon, 30 Aug 2021 12:09:18 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB fd9d0519 / Mon, 30 Aug 2021 12:09:06 +0200 Norbert Schlia * Line too long, added line break bed82b2d / Mon, 30 Aug 2021 12:07:43 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB a2376c50 / Mon, 30 Aug 2021 12:07:25 +0200 Norbert Schlia * Update with issue #90 2f514c64 / Mon, 30 Aug 2021 12:02:40 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB b5830798 / Mon, 30 Aug 2021 12:01:16 +0200 Norbert Schlia * Closes issue #90: Make sure that one keyframe gets inserted only Reset GOP counter after key frame to make sure next key frame is inserted after gop_size frames Correctly handle start_time 673de298 / Mon, 30 Aug 2021 12:00:32 +0200 Norbert Schlia * Fix log entry using wrong format string 6422536e / Mon, 30 Aug 2021 11:58:40 +0200 Norbert Schlia * Fix build with N-102799-g49e3a8165c Suddenly libavutil/channel_layout.h rquired for av_get_channel_layout_string() affcbec0 / Mon, 30 Aug 2021 11:57:13 +0200 Norbert Schlia * Set potentially uninialised member to 0 9d391d62 / Mon, 30 Aug 2021 11:55:26 +0200 Norbert Schlia * Fix checks for N-102799-g49e3a8165c and newer c2ca7afb / Sun, 27 Jun 2021 21:27:18 +0200 Norbert Schlia * Formatting 1f26df7b / Sun, 27 Jun 2021 21:26:34 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB beeb3ba8 / Sun, 27 Jun 2021 21:24:47 +0200 Norbert Schlia * Add headers required for daily checkout (N-102799-g49e3a8165c) ab127aed / Sun, 27 Jun 2021 21:22:01 +0200 Norbert Schlia * Fix size check for daily checkout (N-102799-g49e3a8165c) 39f197c9 / Mon, 21 Jun 2021 22:20:54 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB f264b1a9 / Mon, 21 Jun 2021 22:18:30 +0200 Norbert Schlia * Fix typo in comment bc8967c0 / Mon, 21 Jun 2021 22:18:03 +0200 Norbert Schlia * Update to v2.4 6fef7063 / Mon, 21 Jun 2021 22:17:30 +0200 Norbert Schlia * Debian 11 now tested with 4.3.2-0+deb11u2 e34b3623 / Mon, 21 Jun 2021 22:13:51 +0200 Norbert Schlia * Debian 11 now tested with 4.3.2-0+deb11u2 3e30367b / Mon, 21 Jun 2021 22:12:20 +0200 Norbert Schlia * Update for upcoming V2.6 ad548609 / Mon, 21 Jun 2021 22:10:41 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 5901f883 / Mon, 21 Jun 2021 22:10:21 +0200 Norbert Schlia * Update info and fix syntax 31665c95 / Fri, 18 Jun 2021 12:54:44 +0200 Norbert Schlia * Prepare release 2.5 16a669bd / Fri, 18 Jun 2021 12:50:18 +0200 Norbert Schlia * Prepare Release 2-5 56655506 / Fri, 18 Jun 2021 12:41:07 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 78ca9c62 / Fri, 18 Jun 2021 12:40:47 +0200 Norbert Schlia * Fix typos/format, update information 71e83fb8 / Sat, 12 Jun 2021 14:42:58 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 16effd56 / Sat, 12 Jun 2021 14:41:54 +0200 Norbert Schlia * Update information about 2.4/2.5 releases a856454c / Fri, 11 Jun 2021 12:15:24 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 843b1aaf / Fri, 11 Jun 2021 12:14:22 +0200 Norbert Schlia * Release V2.3 f2898680 / Wed, 9 Jun 2021 21:02:29 +0200 Norbert Schlia * Change version date to Juli 2021 674834a4 / Wed, 9 Jun 2021 21:01:36 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 491ec8bb / Wed, 9 Jun 2021 21:01:08 +0200 Norbert Schlia * Change version date to Juli 2021 b65b470e / Wed, 9 Jun 2021 09:57:11 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 3e4bfa91 / Wed, 9 Jun 2021 09:56:35 +0200 Norbert Schlia * Fix warning a4a1465f / Wed, 9 Jun 2021 09:56:22 +0200 Norbert Schlia * Refactoring 1fc5f131 / Wed, 9 Jun 2021 09:55:38 +0200 Norbert Schlia * Formatting a983d9e3 / Mon, 7 Jun 2021 10:12:04 +0200 Norbert Schlia * Merge branch 'FB' of https://github.com/nschlia/ffmpegfs into FB 29d41e4b / Mon, 7 Jun 2021 07:09:26 +0200 Norbert Schlia * Fix video file size check 2668220e / Mon, 7 Jun 2021 07:09:11 +0200 Norbert Schlia * Fix doxy comments ec0823d1 / Mon, 7 Jun 2021 07:08:53 +0200 Norbert Schlia * Clean HW acceleration API list 09761ece / Mon, 7 Jun 2021 06:52:37 +0200 Norbert Schlia * Issue #87: Segments are now properly separated, making sure that e.g. segment 3 only goes from 30 seconds up to 40 (including 30, but not 40 seconds). Issue #88: HLS audio and video now stay in sync after longer playback (more than 30 minutes) or after seek operations. 51871ecd / Mon, 7 Jun 2021 06:51:53 +0200 Norbert Schlia * Use non-interleaved packet writing now 4cf5dd92 / Mon, 7 Jun 2021 06:49:13 +0200 Norbert Schlia * Refactoring cfc0cec2 / Mon, 7 Jun 2021 06:38:28 +0200 Norbert Schlia * Fix ffmpeg_rescale f4bba69d / Mon, 7 Jun 2021 06:36:52 +0200 Norbert Schlia * Fix Doxygen comments Fix comments Formatting 258ad850 / Thu, 20 May 2021 20:59:20 +0200 Norbert Schlia * Oops. Removed test code c925a0ef / Thu, 20 May 2021 18:58:52 +0200 Norbert Schlia * Fix hw accel check 085c0888 / Thu, 20 May 2021 18:58:31 +0200 Norbert Schlia * Update docs/source: remove unsupported APIs 6a7a55f7 / Wed, 19 May 2021 09:02:29 +0200 Norbert Schlia * Merge branch 'FB' of https://github.com/nschlia/ffmpegfs into FB d4bb85a4 / Tue, 18 May 2021 19:22:58 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 5096b1ed / Tue, 18 May 2021 19:22:18 +0200 Norbert Schlia * Fix typos/grammar\nFormatting\nUpdate hw accel list 086134d1 / Tue, 18 May 2021 14:03:56 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB db32ea7b / Tue, 18 May 2021 14:02:15 +0200 Norbert Schlia * Reporting "Created new format context and check for cue sheet" as debug level is sufficient c337aa27 / Tue, 18 May 2021 14:01:29 +0200 Norbert Schlia * Add several files that can be ignored 1fb3cf33 / Sun, 16 May 2021 22:32:19 +0200 Norbert Schlia * Reformat 84ba221e / Sun, 16 May 2021 22:31:12 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB ae4614ad / Sun, 16 May 2021 22:29:34 +0200 Norbert Schlia * Bring documentation up to date a5426191 / Sun, 16 May 2021 17:22:38 +0200 Norbert Schlia * Date to xx-05-21 c7de18a4 / Sun, 16 May 2021 17:22:28 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 20166cc8 / Sun, 16 May 2021 17:14:17 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 3fa26fd3 / Sun, 16 May 2021 16:52:59 +0200 Norbert Schlia * Issue #80: Open input video codec, but only if target supports 97b06d5e / Sun, 16 May 2021 16:52:59 +0200 Norbert Schlia * Issue #80: Open input video codec, but only if target supports 8774a99c / Sun, 16 May 2021 16:49:52 +0200 Norbert Schlia * Cleanup f2e9526e / Sun, 16 May 2021 16:49:31 +0200 Norbert Schlia * Report skipped files due to no audio stream at debug level 8b49759e / Sun, 16 May 2021 16:42:45 +0200 Norbert Schlia * Update comments 069db684 / Sun, 16 May 2021 13:50:54 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 6757f083 / Sun, 16 May 2021 13:50:43 +0200 Norbert Schlia * Remove forgotten debug output 06fae3ed / Sun, 16 May 2021 12:50:58 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 31bdb4a1 / Sun, 16 May 2021 12:50:33 +0200 Norbert Schlia * Issue #81: if target does not support audio, hide video only files bc638743 / Sun, 16 May 2021 12:49:18 +0200 Norbert Schlia * Added 440Hz sine tone to frame_test_pal.mp4 to have an audio stream in it 733a26ce / Thu, 13 May 2021 22:12:41 +0200 Norbert Schlia * Bring README up to date be3f55b6 / Thu, 13 May 2021 22:11:26 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB e7f4f331 / Thu, 13 May 2021 22:10:48 +0200 Norbert Schlia * Bring README up to date 41614a0c / Fri, 7 May 2021 21:28:20 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB d31473f3 / Fri, 7 May 2021 21:23:16 +0200 Norbert Schlia * find_original fallback method to correctly handle new filename format (extension added, not the original one replaced) 1596ca4d / Fri, 7 May 2021 21:18:24 +0200 Norbert Schlia * Update checks to correctly handle new filename format (extension added, not the original one replaced) 989b9047 / Wed, 5 May 2021 20:05:59 +0200 Norbert Schlia * Format comments d099f4a2 / Wed, 5 May 2021 20:04:36 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 39fd536f / Wed, 5 May 2021 20:01:57 +0200 Norbert Schlia * Feature: Issue #73: Cue sheet tracks now play "gapless" if played in order. Whenever a track is started, the next track will automatically be transcoded as well. Feature: Issue #66 and issue #82: Added cue sheet support. If a file with cue extension is found with the same name as a media file or if a cue sheet is embedded into it (a tag named CUESHEET), tracks defined in it will show up in a virtual directory. af5a55b2 / Wed, 5 May 2021 19:59:13 +0200 Norbert Schlia * Added --enable-debug configure option 37696117 / Wed, 5 May 2021 19:57:46 +0200 Norbert Schlia * Renamed log levels to avoid collisions with DEBUG/NDEBUG macros 950fba1b / Tue, 4 May 2021 06:47:50 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB e9d9432a / Tue, 4 May 2021 06:47:34 +0200 Norbert Schlia * Remove conversion for embedded cue sheet, already comes as UTF-8 f5e28761 / Mon, 3 May 2021 18:53:26 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 0e24b734 / Mon, 3 May 2021 18:52:00 +0200 Norbert Schlia * Issue #82: add support for embedded cue sheets 4c3b2acf / Mon, 3 May 2021 18:50:58 +0200 Norbert Schlia * Formatting fa9df5bf / Sun, 2 May 2021 17:32:59 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB a69dd408 / Sun, 2 May 2021 17:32:43 +0200 Norbert Schlia * make check: webm can even be larger... 47268225 / Sun, 2 May 2021 17:28:25 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 9f59abf3 / Sun, 2 May 2021 17:25:47 +0200 Norbert Schlia * make check: adopt file size variations with latest FFmpeg c42fbb57 / Sun, 2 May 2021 17:24:51 +0200 Norbert Schlia * make check: ignore suddenly appearing vender tag d8a99fd8 / Sun, 2 May 2021 17:24:25 +0200 Norbert Schlia * refactoring ea549104 / Sun, 2 May 2021 17:23:56 +0200 Norbert Schlia * Code formatting bfabb41f / Thu, 29 Apr 2021 21:39:14 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 6caec96d / Thu, 29 Apr 2021 21:38:54 +0200 Norbert Schlia * Fix audio checks with latest FFmpeg cc264e37 / Wed, 28 Apr 2021 22:35:45 +0200 Norbert Schlia * Version 2.5 date until 05/21 0c62ea80 / Wed, 28 Apr 2021 22:34:50 +0200 Norbert Schlia * New const functions are not compatible with the old API, need #if/#else blocks. LAVF_DEP_AV_INIT_PACKET should rather be LAVC_DEP_AV_INIT_PACKET Fix make checks 716eab50 / Wed, 28 Apr 2021 22:34:11 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 5ef63c26 / Wed, 28 Apr 2021 22:25:07 +0200 Norbert Schlia * Made links relative ad115346 / Wed, 28 Apr 2021 22:24:23 +0200 Norbert Schlia * Note that avresample had been removed. swresample is preferred anyway. c77050f2 / Wed, 28 Apr 2021 22:23:49 +0200 Norbert Schlia * Fixed deprecation: 2021-03-17 - f7db77bd87 - lavc 58.133.100 - codec.h Deprecated av_init_packet() Fixed API compatitbility: Many pointers made const as of 2021-04-27. Although reasonable, this breaks API compatibility with versions older than 59.0.100, 8a34f3ff / Tue, 13 Apr 2021 12:23:00 +0200 Norbert Schlia * Change "Much thanks" to "Many thanks", more appropiate in writing f487f03f / Mon, 8 Feb 2021 21:01:56 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 5c37dea7 / Mon, 8 Feb 2021 09:01:14 +0100 Norbert Schlia * Set 2.3 date to February f86b3317 / Sun, 7 Feb 2021 23:17:38 +0100 Norbert Schlia * Updated gcc version b71576d6 / Sun, 7 Feb 2021 23:17:38 +0100 Norbert Schlia * Updated gcc version 991c753f / Sun, 7 Feb 2021 22:16:44 +0100 Norbert Schlia * Revert "libiconv must be expicitly linked with Buster" a62f72ff / Sun, 7 Feb 2021 20:29:34 +0100 Norbert Schlia * libiconv must be expicitly linked with Buster da6cfdac / Sun, 7 Feb 2021 18:50:15 +0100 Norbert Schlia * Adopt new branch f7edb1a6 / Sun, 7 Feb 2021 18:31:48 +0100 Norbert Schlia * Issue #83: charset conversion for cue files 7a50f842 / Sun, 7 Feb 2021 16:36:52 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 4b48e741 / Sun, 7 Feb 2021 16:36:30 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 7160f78e / Sun, 7 Feb 2021 16:36:08 +0100 Norbert Schlia * Fix syntax error cbe607f4 / Sun, 7 Feb 2021 14:12:36 +0100 Norbert Schlia * Update doxygen comments 4d7bd99e / Sun, 7 Feb 2021 12:42:36 +0100 Norbert Schlia * Issue #83: charset conversion for cue files 406c1d73 / Sun, 7 Feb 2021 09:26:21 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB e79d200f / Sun, 7 Feb 2021 09:26:04 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 527f4ce2 / Sun, 7 Feb 2021 09:24:49 +0100 Norbert Schlia * Fix syntax e8cb8879 / Sat, 6 Feb 2021 11:47:59 +0100 Norbert Schlia * "Running inside Docker." was logged when actually *NOT* running under Docker... :) 7019fda6 / Sat, 6 Feb 2021 11:36:59 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 8263222d / Sat, 6 Feb 2021 11:34:33 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 188035ce / Sat, 6 Feb 2021 11:32:24 +0100 Norbert Schlia * Prepare 2.2 release 8212c270 / Mon, 1 Feb 2021 10:13:33 +0100 Norbert Schlia * Release date to 02/2021 827f7be7 / Mon, 1 Feb 2021 10:12:10 +0100 Norbert Schlia * Correct syntax 5a90ede0 / Mon, 1 Feb 2021 10:11:53 +0100 Norbert Schlia * Release date to 02/2021 95c54e26 / Mon, 1 Feb 2021 10:10:52 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 98400930 / Mon, 1 Feb 2021 10:09:57 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB cb56c989 / Mon, 1 Feb 2021 10:09:21 +0100 Norbert Schlia * Release date to 02/2021 e7e0dfcf / Mon, 1 Feb 2021 09:10:52 +0100 Norbert Schlia * Issue #79: Update Docker documentation 9a2b8fa8 / Sun, 31 Jan 2021 22:21:07 +0100 Norbert Schlia * Update README.md 8f6aecc8 / Sun, 31 Jan 2021 22:19:05 +0100 Norbert Schlia * Issue #79: Documenation Docker support ecb8b147 / Sun, 31 Jan 2021 22:16:00 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 ac603636 / Sun, 31 Jan 2021 22:15:45 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 3efbf840 / Sun, 31 Jan 2021 22:15:33 +0100 Norbert Schlia * Add hyperlinks 699fd7e5 / Sun, 31 Jan 2021 22:13:09 +0100 Norbert Schlia * Issue #79 Added Docker support a3c823d6 / Sun, 31 Jan 2021 22:12:32 +0100 Norbert Schlia * Add hyperlinks 8b185829 / Sun, 31 Jan 2021 22:10:45 +0100 Norbert Schlia * Issue #78: Add missing comment about ALBUM_ARTIST handling 652b46fc / Sun, 31 Jan 2021 22:08:27 +0100 Norbert Schlia * Reformat 3bebb24c / Sun, 31 Jan 2021 17:37:00 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 e27618a4 / Sun, 31 Jan 2021 17:36:54 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB a11f772c / Sun, 31 Jan 2021 17:36:17 +0100 Norbert Schlia * Update docs 552941b5 / Sun, 31 Jan 2021 14:45:22 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 e139eb65 / Sun, 31 Jan 2021 14:45:12 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 8c9c0a4b / Sun, 31 Jan 2021 14:40:20 +0100 Norbert Schlia * Issue #75: Fix crash when opening mp3 output with dolphin d5c9d86e / Sun, 31 Jan 2021 14:39:57 +0100 Norbert Schlia * Refactoring 23482449 / Sun, 31 Jan 2021 14:38:01 +0100 Norbert Schlia * Avoid possible crash in FFmpeg_Transcoder::encode_video_frame if output has no video e6ce008e / Thu, 28 Jan 2021 22:57:11 +0100 Norbert Schlia * Issue #78: update docs a1b1afe6 / Thu, 28 Jan 2021 22:42:44 +0100 Norbert Schlia * Issue #78: duplicate ARTIST tag 4971cfb4 / Thu, 28 Jan 2021 22:39:54 +0100 Norbert Schlia * Issue #78: duplicate ARTIST tag ca534cd7 / Wed, 27 Jan 2021 23:08:48 +0100 Norbert Schlia * Issue #79: Detect if running inside Docker, allow mounting over docker outside mount 22c3130b / Thu, 21 Jan 2021 09:36:08 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 48f8b451 / Thu, 21 Jan 2021 09:33:54 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB c552c73a / Thu, 21 Jan 2021 09:33:25 +0100 Norbert Schlia * Update V2.2 fix list a9fe893c / Tue, 19 Jan 2021 13:53:32 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 e4a48e22 / Tue, 19 Jan 2021 13:53:21 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB b3f3daed / Tue, 19 Jan 2021 12:27:12 +0100 Norbert Schlia * Issue #71: update NEWS 0270d354 / Tue, 19 Jan 2021 08:27:13 +0100 Norbert Schlia * Formatting 85869fe2 / Tue, 19 Jan 2021 08:26:11 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 48fb471e / Tue, 19 Jan 2021 08:24:42 +0100 Norbert Schlia * Remove debug output 1cf446fd / Tue, 19 Jan 2021 08:24:13 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 94dbf17a / Tue, 19 Jan 2021 08:21:54 +0100 Norbert Schlia * Issue #71: add missing ./.. 64e961e8 / Mon, 18 Jan 2021 20:39:20 +0100 Norbert Schlia * Refactoring 2324379c / Mon, 18 Jan 2021 08:10:24 +0100 Norbert Schlia * Issue #66: fix virtual directory generation 439b3231 / Mon, 18 Jan 2021 08:08:37 +0100 Norbert Schlia * Remove debug logging 4a102106 / Mon, 18 Jan 2021 08:06:21 +0100 Norbert Schlia * Issue #66: Update genre and date from cue sheet Don*t delete tags if no data provided by cue sheet 0e88b3db / Mon, 18 Jan 2021 08:02:45 +0100 Norbert Schlia * Issue #66 and issue #72: update TRACKTOTAL and DURATION d5699bc2 / Mon, 18 Jan 2021 08:01:12 +0100 Norbert Schlia * Refactoring f3024d30 / Sat, 16 Jan 2021 23:19:59 +0100 Norbert Schlia * Issue #66 and issue #72: update tags from cue sheet c764a2e8 / Sat, 16 Jan 2021 23:18:41 +0100 Norbert Schlia * Feature #2624: fix cache e3d278df / Sat, 16 Jan 2021 23:17:53 +0100 Norbert Schlia * Feature #2624: predict file sizes and update to actual size when finished c24ad85b / Sat, 16 Jan 2021 22:00:56 +0100 Norbert Schlia * Fix build 2973dee9 / Sat, 16 Jan 2021 21:45:28 +0100 Norbert Schlia * Formatting 52b26aa0 / Sat, 16 Jan 2021 21:42:58 +0100 Norbert Schlia * Need default parameter for copy_metadata 5cb5a9b2 / Sat, 16 Jan 2021 21:40:11 +0100 Norbert Schlia * Formatting ec1378b4 / Sat, 16 Jan 2021 21:39:45 +0100 Norbert Schlia * Should report destination name in transcoder_set_filesize 597e3274 / Sat, 16 Jan 2021 21:32:40 +0100 Norbert Schlia * Merge remote-tracking branch 'origin' into VERSION_2.3 e9c5c1ed / Sat, 16 Jan 2021 21:23:26 +0100 Norbert Schlia * Formatting a9f05845 / Sat, 16 Jan 2021 21:22:12 +0100 Norbert Schlia * Merge branch 'master' into FB d7c014ea / Sat, 16 Jan 2021 21:18:05 +0100 Norbert Schlia * Update todo list 18736f55 / Sat, 16 Jan 2021 21:17:20 +0100 Norbert Schlia * Cleanup 65016aac / Sat, 16 Jan 2021 21:17:07 +0100 Norbert Schlia * Formatting 82b4a022 / Sat, 16 Jan 2021 21:16:47 +0100 Norbert Schlia * Avoid possible crash in transcoder_predict_filesize 84b83b1a / Sat, 16 Jan 2021 21:16:06 +0100 Norbert Schlia * Refactoring 82378920 / Sat, 16 Jan 2021 21:14:12 +0100 Norbert Schlia * Formatting 487686dd / Sat, 16 Jan 2021 21:14:00 +0100 Norbert Schlia * Refactoring b07db725 / Sat, 16 Jan 2021 21:12:51 +0100 Norbert Schlia * User selected output bitrate must be used when input file bitrate is unknown ff5fcf8f / Sat, 16 Jan 2021 21:11:35 +0100 Norbert Schlia * Enable log entry when reusing cash 7931f604 / Fri, 15 Jan 2021 22:12:37 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 2ca58fe8 / Fri, 15 Jan 2021 22:08:40 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB cfaed3c7 / Fri, 15 Jan 2021 22:06:43 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 802923e1 / Fri, 15 Jan 2021 20:56:26 +0100 Norbert Schlia * Closes issue #74: copy album arts from any source eba202fe / Fri, 15 Jan 2021 20:57:45 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 e5132979 / Fri, 15 Jan 2021 20:57:08 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 7cf266bd / Fri, 15 Jan 2021 20:56:26 +0100 Norbert Schlia * Closes issue #74: copy album arts from any source 5b3e5140 / Fri, 15 Jan 2021 14:05:18 +0100 Norbert Schlia * Fix HLS size check 4af0052a / Fri, 15 Jan 2021 08:00:04 +0100 Norbert Schlia * Cleanup: remove source file work around 86ad51db / Fri, 15 Jan 2021 07:59:01 +0100 Norbert Schlia * Log destination file name, not original name which might be empty for DVD etc. e55cb02a / Thu, 14 Jan 2021 23:32:16 +0100 Norbert Schlia * Remove debug output 3d03bb49 / Thu, 14 Jan 2021 22:25:09 +0100 Norbert Schlia * Revamped virtual directory handling e10a74c7 / Thu, 14 Jan 2021 22:23:51 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 0915869d / Thu, 14 Jan 2021 22:19:10 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 8d1ec25f / Thu, 14 Jan 2021 22:18:16 +0100 Norbert Schlia * Just changed key to virtpath, better sounding variable name a5ccafce / Thu, 14 Jan 2021 22:17:43 +0100 Norbert Schlia * Avoid nullptr crash b5a10ce1 / Wed, 13 Jan 2021 21:03:14 +0100 Norbert Schlia * Update API lists 27a5d835 / Wed, 13 Jan 2021 20:59:30 +0100 Norbert Schlia * Merge branch 'VERSION_2.3' of https://github.com/nschlia/ffmpegfs into VERSION_2.3 04746136 / Wed, 13 Jan 2021 20:57:15 +0100 Norbert Schlia * Set version to 2.3 156f70b5 / Wed, 13 Jan 2021 20:54:00 +0100 Norbert Schlia * Merge branch 'master' into FB a1d3d1c4 / Wed, 13 Jan 2021 20:53:33 +0100 Norbert Schlia * Merge branch 'master' into VERSION_2.3 6428955a / Wed, 13 Jan 2021 20:53:07 +0100 Norbert Schlia * Syntax b98cd9fa / Wed, 13 Jan 2021 20:52:53 +0100 Norbert Schlia * Move FFmpeg build sections one down in directory structure b25de7e9 / Wed, 13 Jan 2021 20:44:25 +0100 Norbert Schlia * Cleanup bf7f615c / Wed, 13 Jan 2021 20:43:08 +0100 Norbert Schlia * Merge branch 'VERSION_2.3' of https://github.com/nschlia/ffmpegfs into VERSION_2.3 6b581275 / Wed, 13 Jan 2021 20:39:30 +0100 Norbert Schlia * No need to report unsupported hw accel APIs as internal warning 4698dc18 / Wed, 13 Jan 2021 20:36:01 +0100 Norbert Schlia * Merge branch 'master' into FB 350beebd / Wed, 13 Jan 2021 20:28:44 +0100 Norbert Schlia * Fix make check file sizes for Debian 11 (ffmpeg version 4.3.1-5) 34929589 / Wed, 13 Jan 2021 20:17:40 +0100 Norbert Schlia * Refactoring d9ef6607 / Wed, 13 Jan 2021 20:17:11 +0100 Norbert Schlia * Fix make check file sizes for Debian 11 (ffmpeg version 4.3.1-5) 611db567 / Mon, 11 Jan 2021 22:14:11 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 ea351ac2 / Mon, 11 Jan 2021 22:13:50 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 8e8f10b0 / Mon, 11 Jan 2021 22:13:15 +0100 Norbert Schlia * Corrected documentation, "make checks" should read "make check", funny this went unnoticed for over 3 years... a8e233d9 / Sat, 9 Jan 2021 23:07:19 +0100 Norbert Schlia * Print errors on screen in red 203331d6 / Sat, 9 Jan 2021 23:05:41 +0100 Norbert Schlia * Adopt changes in QtCreator project 362af5fd / Sat, 9 Jan 2021 23:01:49 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into VERSION_2.3 696bd9be / Sat, 9 Jan 2021 23:01:35 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 86229095 / Sat, 9 Jan 2021 23:01:01 +0100 Norbert Schlia * Issue #70: Fix crash when more than one HLS transcoder was started 3d98d317 / Fri, 8 Jan 2021 09:32:23 +0100 Norbert Schlia * Issue #66: Test code for cue sheet support b44e5eaa / Wed, 6 Jan 2021 10:21:33 +0100 Norbert Schlia * V2.5 will obviously be release somewhen 2021ish eda534f8 / Wed, 6 Jan 2021 10:10:23 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB dc034dbc / Wed, 6 Jan 2021 10:10:05 +0100 Norbert Schlia * Note that 2.2 is a maintenance release 395317f9 / Wed, 6 Jan 2021 10:02:13 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 4b05ff54 / Wed, 6 Jan 2021 10:01:50 +0100 Norbert Schlia * Some (out-commented) test code e2f6a98d / Wed, 6 Jan 2021 10:01:21 +0100 Norbert Schlia * Move declarations into smaller scope 266b5d98 / Wed, 6 Jan 2021 10:00:56 +0100 Norbert Schlia * Should OR flags in insert_dir, not overwrite 258269eb / Sun, 3 Jan 2021 11:28:23 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB d5d0c816 / Sun, 3 Jan 2021 11:27:02 +0100 Norbert Schlia * (c) update to 2021 65a70a28 / Sun, 3 Jan 2021 09:03:42 +0100 Norbert Schlia * Refactoring 394c380a / Sun, 3 Jan 2021 09:03:12 +0100 Norbert Schlia * Fix doxygen syntax 849d1bc0 / Fri, 1 Jan 2021 16:01:57 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 07cb60d7 / Fri, 1 Jan 2021 15:53:44 +0100 Norbert Schlia * Rearrange paragraphs/Better headline levels/Fix syntax 72c2034b / Fri, 1 Jan 2021 15:52:52 +0100 Norbert Schlia * Rearrange paragraphs/Better headline levels/Fix syntax 7d78ab81 / Fri, 1 Jan 2021 15:24:55 +0100 Norbert Schlia * [TOC] not supported f330d89a / Fri, 1 Jan 2021 15:24:31 +0100 Norbert Schlia * Reformat, change headline levels eb874a86 / Thu, 31 Dec 2020 20:30:41 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB d7ba1a18 / Thu, 31 Dec 2020 20:28:46 +0100 Norbert Schlia * Use nullptr, not NULL bc91405d / Thu, 31 Dec 2020 20:28:31 +0100 Norbert Schlia * Fix doxygen comment d32230ab / Thu, 31 Dec 2020 12:53:56 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 5ea51708 / Thu, 31 Dec 2020 12:51:00 +0100 Norbert Schlia * Fix 'Calling virtual functions inside constructors' warning e7f1b3d8 / Thu, 31 Dec 2020 12:50:07 +0100 Norbert Schlia * Log 'Detected SVCD' for SVCD 2ea82adb / Thu, 31 Dec 2020 12:49:34 +0100 Norbert Schlia * Remove percentage from overhead comments 0b3591e2 / Thu, 31 Dec 2020 12:48:30 +0100 Norbert Schlia * Fix doxygen comments/Missing parameters da347484 / Wed, 30 Dec 2020 17:14:20 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 1ec82574 / Wed, 30 Dec 2020 17:13:51 +0100 Norbert Schlia * Stupid blooper. WAV and AIFF size was always calculated for a mono file, thus for stereo files only half the correct size. 2a358c1b / Wed, 30 Dec 2020 17:13:14 +0100 Norbert Schlia * Fix syntax in comments db026990 / Wed, 30 Dec 2020 17:12:50 +0100 Norbert Schlia * Format 89535db5 / Wed, 30 Dec 2020 17:12:13 +0100 Norbert Schlia * av_register_all(9 is deprecated, disable for newer FFmpeg API 78d6d66d / Wed, 30 Dec 2020 17:11:02 +0100 Norbert Schlia * Remove unneccessary #includes Fix compiler warnings 612a6e97 / Wed, 30 Dec 2020 17:09:34 +0100 Norbert Schlia * Cleanup ac94d23f / Mon, 28 Dec 2020 23:03:13 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 383215b5 / Mon, 28 Dec 2020 23:02:47 +0100 Norbert Schlia * Remove version numbers from installation instructions a8352233 / Sun, 27 Dec 2020 18:30:10 +0100 Norbert Schlia * Bring hw accel part up to date 89bddf41 / Sun, 27 Dec 2020 18:29:21 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 9e8bfc8d / Sun, 27 Dec 2020 18:28:19 +0100 Norbert Schlia * Bring up to date and fix formatting d9d9a36d / Sun, 27 Dec 2020 12:28:17 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 6402e7aa / Sun, 27 Dec 2020 12:28:02 +0100 Norbert Schlia * Frame set codec should be in video column 8f1a1c5a / Sun, 27 Dec 2020 12:18:29 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 1b27114d / Sun, 27 Dec 2020 12:18:14 +0100 Norbert Schlia * ProRes video codec was wrong 54393e36 / Sun, 27 Dec 2020 12:14:04 +0100 Norbert Schlia * Add info about new hw accel unit tests 13878ef5 / Sun, 27 Dec 2020 12:02:48 +0100 Norbert Schlia * Remove explaining paragraphs about hw accel, no longer experimental 3958052c / Sun, 27 Dec 2020 11:46:28 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB c7be4de3 / Sun, 27 Dec 2020 11:46:10 +0100 Norbert Schlia * Fix markup table format 9d651acc / Sun, 27 Dec 2020 09:40:34 +0100 Norbert Schlia * If course, forgot to add these to GIT d920f014 / Sun, 27 Dec 2020 00:18:05 +0100 Norbert Schlia * Add unit tests for hardware acceleration 55c9eaab / Sun, 27 Dec 2020 00:16:54 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 2f300e5c / Sun, 27 Dec 2020 00:16:37 +0100 Norbert Schlia * Allow extra ffmpegfs options for tests f0c82a91 / Sun, 27 Dec 2020 00:15:13 +0100 Norbert Schlia * Disable unsupported HW accel APIs fd6b0e92 / Sat, 26 Dec 2020 16:24:22 +0100 Norbert Schlia * Reformat 1a35900c / Sat, 26 Dec 2020 16:23:24 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB ed7886ea / Sat, 26 Dec 2020 16:23:09 +0100 Norbert Schlia * Reformat a15e3fe9 / Sat, 26 Dec 2020 15:45:15 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 341b5d35 / Sat, 26 Dec 2020 15:44:50 +0100 Norbert Schlia * Update v2.2 news list fdf24fff / Sat, 26 Dec 2020 14:28:26 +0100 Norbert Schlia * Refactoring 4e92a14e / Sat, 26 Dec 2020 14:28:07 +0100 Norbert Schlia * Fix potential memory leaks b45d4768 / Sat, 26 Dec 2020 14:27:33 +0100 Norbert Schlia * Format 3aa1b3b9 / Sat, 26 Dec 2020 14:27:03 +0100 Norbert Schlia * Oops. merge desaster, reverted bad change 1cd33cc9 / Sat, 26 Dec 2020 14:16:04 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 7bc2cefd / Sat, 26 Dec 2020 14:10:36 +0100 Norbert Schlia * More elaborate error message e00fe319 / Sat, 26 Dec 2020 13:36:46 +0100 Norbert Schlia * Update @todo list c0cf4017 / Sat, 26 Dec 2020 13:36:06 +0100 Norbert Schlia * Avoid potential nullptr access/fix possible memory leak 4104039e / Sat, 26 Dec 2020 13:33:07 +0100 Norbert Schlia * Refactoring: cherry pick from FB 3fac7800 / Sat, 26 Dec 2020 13:32:27 +0100 Norbert Schlia * Refactoring 1489c26f / Sat, 26 Dec 2020 13:31:11 +0100 Norbert Schlia * Remove :: where not really required 2fcdae52 / Sat, 26 Dec 2020 13:29:49 +0100 Norbert Schlia * Determine destname a bit earlier 28fe6bfe / Sat, 26 Dec 2020 13:29:08 +0100 Norbert Schlia * Remove av_ prefix from our functions d54f03d3 / Sat, 26 Dec 2020 13:27:36 +0100 Norbert Schlia * From FB: demote open_bestmatch_decoder/open_decoder to non-const 5cb3b979 / Sat, 26 Dec 2020 13:25:36 +0100 Norbert Schlia * Avoid potential buffer overrun 3f605a85 / Sat, 26 Dec 2020 13:24:39 +0100 Norbert Schlia * Possible crash in transcoder_thread: Decoder object could have been used after being freed. 8117ee91 / Fri, 25 Dec 2020 21:31:25 +0100 Norbert Schlia * Remove debug output d625b3d3 / Fri, 25 Dec 2020 21:30:40 +0100 Norbert Schlia * Feature infos look better as headlines 67204f56 / Fri, 25 Dec 2020 21:28:34 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB d71d70fd / Fri, 25 Dec 2020 21:27:36 +0100 Norbert Schlia * Feature infos look better as headlines c959a151 / Fri, 25 Dec 2020 15:53:36 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 82c750cc / Fri, 25 Dec 2020 15:52:15 +0100 Norbert Schlia * V2.1 now under development f4583570 / Fri, 25 Dec 2020 15:42:00 +0100 Norbert Schlia * Fix typos/rephrase some parts 1dbd6e4e / Fri, 25 Dec 2020 15:41:17 +0100 Norbert Schlia * Remove unsupported (Windows) formats from device type map 25fe0345 / Fri, 25 Dec 2020 15:40:13 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 6c6a56bc / Fri, 25 Dec 2020 15:39:06 +0100 Norbert Schlia * Fix typos/rephrase some parts 1981e2a0 / Thu, 24 Dec 2020 13:01:07 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 261e41a6 / Thu, 24 Dec 2020 12:56:05 +0100 Norbert Schlia * Update bug/todo list 020de242 / Tue, 22 Dec 2020 11:53:07 +0100 Norbert Schlia * Remove mention of experimental state 09f28118 / Tue, 22 Dec 2020 09:48:17 +0100 Norbert Schlia * Enable fallback to software encoder if hardware fails 301aa1f2 / Tue, 22 Dec 2020 09:47:06 +0100 Norbert Schlia * Fix memory leak 57efeef8 / Tue, 22 Dec 2020 09:46:30 +0100 Norbert Schlia * Fix grammatics in log entry 37b2773b / Tue, 22 Dec 2020 09:44:49 +0100 Norbert Schlia * Hardware accelaration no longer partly implemented 413662b6 / Tue, 22 Dec 2020 09:43:13 +0100 Norbert Schlia * Move hardware acceleration paragraphs to main README 71014bf0 / Tue, 22 Dec 2020 09:40:44 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 8635ae84 / Tue, 22 Dec 2020 09:40:15 +0100 Norbert Schlia * Rephrase one paragraph, change source language to c++11 d7cb03fb / Sun, 20 Dec 2020 22:19:41 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 93f919ac / Sun, 20 Dec 2020 22:19:22 +0100 Norbert Schlia * Determine pixel formats for in/out codec only once fcbfb876 / Sun, 20 Dec 2020 22:18:25 +0100 Norbert Schlia * Reformat a0fa9039 / Sun, 20 Dec 2020 22:17:43 +0100 Norbert Schlia * More detailed log entry if output codec cannot be opened 09bd43fb / Sun, 20 Dec 2020 22:16:24 +0100 Norbert Schlia * Add comment about small memory leak 9ae5ad4e / Sun, 20 Dec 2020 22:15:52 +0100 Norbert Schlia * Fix typo ddec5f37 / Wed, 16 Dec 2020 22:21:43 +0100 Norbert Schlia * Merge branch 'FB' of https://github.com/nschlia/ffmpegfs into FB e522eee9 / Wed, 16 Dec 2020 10:30:49 +0100 Norbert Schlia * Rather log destination name when operating on output files ae627c9c / Wed, 16 Dec 2020 10:29:53 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB b4af0041 / Wed, 16 Dec 2020 10:26:15 +0100 Norbert Schlia * Version set to 2.2 17c040a4 / Mon, 14 Dec 2020 22:17:31 +0100 Norbert Schlia * Report destname for output files, filename for input 27879046 / Mon, 14 Dec 2020 22:16:59 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB a30369de / Mon, 14 Dec 2020 22:08:26 +0100 Norbert Schlia * Prepare release 2.1 b2930e02 / Mon, 14 Dec 2020 22:07:24 +0100 Norbert Schlia * Rather report destination name when logging operations with output files 185ea83b / Mon, 14 Dec 2020 22:06:35 +0100 Norbert Schlia * Wrong trace report for SMV lockup fix corrected 594ee09e / Mon, 14 Dec 2020 10:08:38 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 3e957f9b / Mon, 14 Dec 2020 10:07:05 +0100 Norbert Schlia * Remove duplicate headline 637264a9 / Sun, 13 Dec 2020 13:01:58 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 0d5b3ccc / Sun, 13 Dec 2020 13:01:42 +0100 Norbert Schlia * Include links to branches 016d5cff / Sun, 13 Dec 2020 12:56:56 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 19d4b05a / Sun, 13 Dec 2020 12:37:11 +0100 Norbert Schlia * Fix build table 9c823b6d / Sun, 13 Dec 2020 12:33:34 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 677f5eb4 / Sun, 13 Dec 2020 12:33:09 +0100 Norbert Schlia * Add experimental branch to build status list ef2105a5 / Sun, 13 Dec 2020 11:27:31 +0100 Norbert Schlia * Merge branch 'FB' of https://github.com/nschlia/ffmpegfs into FB 453b7992 / Sun, 13 Dec 2020 09:16:29 +0100 Norbert Schlia * Retry in software if decoder cannot use hardware Fix VC1/VP9 decoder 49cf73a3 / Sun, 13 Dec 2020 09:16:29 +0100 Norbert Schlia * Retry in software if decoder cannot use hardware Fix VC1/VP9 decoder b3d2945a / Sat, 12 Dec 2020 20:33:46 +0100 Norbert Schlia * Do not report 'Decoder 'xyz' does not support device type unknown.' a734ccfd / Sat, 12 Dec 2020 20:30:12 +0100 Norbert Schlia * Notes about MMAL VC1/MPEG1 38f75811 / Sat, 12 Dec 2020 13:37:56 +0100 Norbert Schlia * Open matching decoder if hw buffering not supported, e.g. mmal fc6515e4 / Sat, 12 Dec 2020 12:50:23 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 567de5de / Sat, 12 Dec 2020 12:46:28 +0100 Norbert Schlia * Update feature/bugfix list b73a0862 / Sat, 12 Dec 2020 12:45:50 +0100 Norbert Schlia * Update FFmpeg version 33724d64 / Sat, 12 Dec 2020 12:45:30 +0100 Norbert Schlia * Rephrase comment 1657ce1f / Sat, 12 Dec 2020 12:43:34 +0100 Norbert Schlia * Log decoder hardware accel types as INFO 87bf4875 / Sat, 12 Dec 2020 12:35:37 +0100 Norbert Schlia * HW pixel format can be different for de/encoder, detect separately 08cd956e / Sat, 12 Dec 2020 12:33:12 +0100 Norbert Schlia * Enhanced get_hw_de/encoder name cb2601a2 / Sat, 12 Dec 2020 12:31:07 +0100 Norbert Schlia * VC1 hardware en/decoding with VAAPI 5444eed0 / Sat, 12 Dec 2020 12:30:39 +0100 Norbert Schlia * Enhanced get_hw_de/encoder name 5933f2aa / Sat, 12 Dec 2020 10:46:08 +0100 Norbert Schlia * Doxygen @todo should not end with a colon a4b06f03 / Sat, 12 Dec 2020 10:44:55 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB ec81cb15 / Sat, 12 Dec 2020 10:31:08 +0100 Norbert Schlia * Doxygen @todo should not end with a colon 56049ea9 / Fri, 11 Dec 2020 23:38:38 +0100 Norbert Schlia * Use correct hw pix fmt for decoder and encoder d467cd62 / Fri, 11 Dec 2020 21:16:54 +0100 Norbert Schlia * Clearer error messages f69d3af6 / Fri, 11 Dec 2020 21:13:39 +0100 Norbert Schlia * Reformat 0b70d1ff / Fri, 11 Dec 2020 21:12:07 +0100 Norbert Schlia * Fix typo 1a386f7a / Fri, 11 Dec 2020 21:05:57 +0100 Norbert Schlia * Use std::map instead of switch to detrermine HW pixel format d51e77a6 / Fri, 11 Dec 2020 20:57:17 +0100 Norbert Schlia * Cleanup 3f4104ff / Wed, 9 Dec 2020 19:20:11 +0100 Norbert Schlia * Change get_format function to real member instead of static e6e47e89 / Wed, 9 Dec 2020 18:52:15 +0100 Norbert Schlia * Format 673dbf54 / Wed, 9 Dec 2020 18:50:47 +0100 Norbert Schlia * Add secure version of av_hwdevice_get_type_name 2fa7332b / Wed, 9 Dec 2020 18:47:00 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 2435421a / Wed, 9 Dec 2020 18:46:14 +0100 Norbert Schlia * Use pointer arithmetics instead of array 7483141c / Wed, 9 Dec 2020 18:45:35 +0100 Norbert Schlia * Fix typo/grammatics 0a8cfe30 / Tue, 8 Dec 2020 19:05:15 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 078a498d / Tue, 8 Dec 2020 19:04:55 +0100 Norbert Schlia * Remove unused parameter 1eda9757 / Tue, 8 Dec 2020 19:04:28 +0100 Norbert Schlia * Add missing Doxygen documentation d1accbc6 / Tue, 8 Dec 2020 19:03:24 +0100 Norbert Schlia * Also document private class members 2e1b4a80 / Sun, 6 Dec 2020 18:41:35 +0100 Norbert Schlia * Use same pixel format everywhere 34526a29 / Sun, 6 Dec 2020 18:38:52 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB a3d030e3 / Sun, 6 Dec 2020 18:38:20 +0100 Norbert Schlia * Enable --win_smb_fix by default 82462389 / Sun, 6 Dec 2020 18:34:44 +0100 Norbert Schlia * More detailed description cf18a35d / Sun, 6 Dec 2020 18:32:23 +0100 Norbert Schlia * Format c33976f8 / Sun, 6 Dec 2020 15:25:41 +0100 Norbert Schlia * Formatting 112c68d1 / Sun, 6 Dec 2020 15:24:11 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 9b1227b3 / Sun, 6 Dec 2020 15:23:33 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs ba21faba / Sun, 6 Dec 2020 15:19:48 +0100 Norbert Schlia * Must check if opening a new HLS segment fails (avoid GPF) 7ffa5a8c / Sun, 6 Dec 2020 15:19:48 +0100 Norbert Schlia * Must check if opening a new HLS segment fails (avoid GPF) b6665c5b / Sun, 6 Dec 2020 15:14:06 +0100 Norbert Schlia * Fix Doxygen f9f98719 / Fri, 4 Dec 2020 19:20:59 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 569b7e49 / Fri, 4 Dec 2020 18:47:24 +0100 Norbert Schlia * Better variable names 2442f796 / Fri, 4 Dec 2020 18:46:34 +0100 Norbert Schlia * Move debug build of FFmpeg to subfolder fff1ebfa / Fri, 4 Dec 2020 18:45:57 +0100 Norbert Schlia * Set date to 12/2020 e4afb9fe / Fri, 4 Dec 2020 18:45:14 +0100 Norbert Schlia * Removed experimental state from --win_smb_fix option 8709c759 / Mon, 9 Nov 2020 13:06:12 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 13fed34c / Mon, 9 Nov 2020 11:48:16 +0100 Norbert Schlia * Refactoring f271650d / Mon, 9 Nov 2020 11:47:25 +0100 Norbert Schlia * Rudimentary online help 684d821a / Sun, 8 Nov 2020 15:24:29 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB b12ad011 / Sun, 8 Nov 2020 15:23:54 +0100 Norbert Schlia * Set version to 2.1 f3d68068 / Sun, 8 Nov 2020 15:23:09 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 24529564 / Sun, 8 Nov 2020 15:22:52 +0100 Norbert Schlia * Clearer function names 17fd786a / Sun, 8 Nov 2020 15:22:18 +0100 Norbert Schlia * More toolkit options 6c502460 / Sat, 7 Nov 2020 21:55:25 +0100 Norbert Schlia * More precise log entry of codec search fails 4ca40902 / Sat, 7 Nov 2020 21:53:48 +0100 Norbert Schlia * Reformat 67b68345 / Sat, 7 Nov 2020 21:53:03 +0100 Norbert Schlia * Fix old-style cast 844c8c11 / Sat, 7 Nov 2020 21:52:43 +0100 Norbert Schlia * Properly check pointers for nullptr 9b5429a1 / Sat, 7 Nov 2020 21:51:32 +0100 Norbert Schlia * Refactoring a009c994 / Sat, 7 Nov 2020 21:51:03 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 6ac9faaf / Sat, 7 Nov 2020 21:46:09 +0100 Norbert Schlia * Refactoring bc07e3fc / Sat, 7 Nov 2020 21:45:34 +0100 Norbert Schlia * Better variable names 3a098e5f / Sat, 7 Nov 2020 21:44:38 +0100 Norbert Schlia * Always compare pointers with nullptr 1ff0af7e / Sat, 7 Nov 2020 19:27:23 +0100 Norbert Schlia * Even more cend()'s f5b1e8f6 / Sat, 7 Nov 2020 19:21:33 +0100 Norbert Schlia * Logging of correct hw accel API and buffering 97e15bb3 / Sat, 7 Nov 2020 17:13:37 +0100 Norbert Schlia * Fix clang build dc523dd9 / Sat, 7 Nov 2020 17:01:24 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 1fbef1f2 / Sat, 7 Nov 2020 16:34:07 +0100 Norbert Schlia * Redo cbegin/cend changes and add some missing c_str() reverts c1eddc76 / Sat, 7 Nov 2020 16:27:02 +0100 Norbert Schlia * Revert "Code revamping:" aca6ad28 / Sat, 7 Nov 2020 12:02:04 +0100 Norbert Schlia * Typo in comment... 2d8b3d58 / Sat, 7 Nov 2020 12:01:39 +0100 Norbert Schlia * Better variable names 492ea2ef / Sat, 7 Nov 2020 11:52:01 +0100 Norbert Schlia * Remove even more superfluous c_str() accessors f2eae759 / Sat, 7 Nov 2020 11:47:08 +0100 Norbert Schlia * move throw() into try block 491328de / Sat, 7 Nov 2020 11:46:42 +0100 Norbert Schlia * Remove superfluous c_str() accessors 58f41f73 / Sat, 7 Nov 2020 11:45:50 +0100 Norbert Schlia * Use cbegin/cend where appropriate 65705009 / Sat, 7 Nov 2020 11:42:54 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 3c6448d1 / Sat, 7 Nov 2020 11:29:18 +0100 Norbert Schlia * Move decoder opener functionality from base to subclass, fits better in that place. Do not recreate decoder, use hint from av_find_best_stream instead 9bbade20 / Sat, 7 Nov 2020 11:26:47 +0100 Norbert Schlia * Remove multi pixel formats from deinterlacer, we never convert pixel formats here 9e93017c / Sat, 7 Nov 2020 11:26:02 +0100 Norbert Schlia * Formatting/Update comments c9844c6e / Sat, 7 Nov 2020 11:23:49 +0100 Norbert Schlia * Code revamping: * Use cbegin/cend where appropriate * Remove .c_str() accessors where not neccessary ddbd6db9 / Sun, 1 Nov 2020 13:25:54 +0100 Norbert Schlia * HW acceleration is planned for V2.5 f7f1b3a5 / Sun, 1 Nov 2020 13:25:01 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 1093e611 / Sun, 1 Nov 2020 13:23:42 +0100 Norbert Schlia * Set last change date to November 25b33b0b / Sun, 1 Nov 2020 09:02:25 +0100 Norbert Schlia * Block avc1 FourCC files from decoding in hw, not supported d9c25dcc / Sun, 1 Nov 2020 09:00:31 +0100 Norbert Schlia * Format b0bd3088 / Sat, 31 Oct 2020 20:13:48 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 2afd624e / Sat, 31 Oct 2020 20:13:19 +0100 Norbert Schlia * Map FFmpeg INFO to INFO and VERBOSE/DEBUG to DEBUG 34f54559 / Sat, 31 Oct 2020 11:02:44 +0100 Norbert Schlia * Fix typo 7d74da53 / Sat, 31 Oct 2020 11:02:10 +0100 Norbert Schlia * Fix typo 0229dfb0 / Sat, 31 Oct 2020 11:00:44 +0100 Norbert Schlia * Merge branch 'FB' of https://github.com/nschlia/ffmpegfs into FB 8a3e5b30 / Sat, 31 Oct 2020 10:43:51 +0100 Norbert Schlia * Add V4L support 4a94706d / Sat, 31 Oct 2020 10:43:51 +0100 Norbert Schlia * Add V4L support 9773c831 / Fri, 30 Oct 2020 23:37:35 +0100 Norbert Schlia * Formatting f2689200 / Fri, 30 Oct 2020 23:35:39 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 37bfe3f2 / Fri, 30 Oct 2020 23:35:24 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs into master 4de2e442 / Fri, 30 Oct 2020 23:32:54 +0100 Norbert Schlia * Remove reference to outdated avresample d2d0b253 / Fri, 30 Oct 2020 23:33:25 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 4680b45f / Fri, 30 Oct 2020 23:32:54 +0100 Norbert Schlia * Remove reference to outdated avresample d6fd16a9 / Fri, 30 Oct 2020 09:10:13 +0100 Norbert Schlia * Two fprintf(stderr changed to Logging::error d5c445ca / Fri, 30 Oct 2020 09:09:25 +0100 Norbert Schlia * Doxygen docummntation updated e18f59a4 / Fri, 30 Oct 2020 09:07:27 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB d0418756 / Fri, 30 Oct 2020 08:57:38 +0100 Norbert Schlia * Doxygen docummntation updated 6613dc1f / Thu, 29 Oct 2020 21:01:47 +0100 Norbert Schlia * Check some pointers for nullptr to avoid crashes dd53430c / Thu, 29 Oct 2020 21:00:34 +0100 Norbert Schlia * Some reminders how to deinterlace in hardware 22f1319d / Thu, 29 Oct 2020 20:59:50 +0100 Norbert Schlia * Fix crash in deinterlace function with newer FFmpeg versions b04817ce / Thu, 29 Oct 2020 20:59:11 +0100 Norbert Schlia * Format 9ee06903 / Thu, 29 Oct 2020 13:10:35 +0100 Norbert Schlia * - Supported hardware: VAAPI (Intel) and MMAL/OMX (Raspberry). - VAAPI: H264, H265/HEVC, MPEG-2 and VC-8 decoding and H264 encoding is supported. - VAAPI: MJPEG and VC-9 do not work (yet). - MMAL: H264, MPEG-2, MPEG-4 and VC1 decoding is supported. - OMX: H264 encoding is supported. 6d176347 / Thu, 29 Oct 2020 13:06:26 +0100 Norbert Schlia * Make logging a bit less chatty 80166076 / Wed, 28 Oct 2020 20:06:52 +0100 Norbert Schlia * Replace 'auto' declaration with explicit one a8364057 / Wed, 28 Oct 2020 20:01:20 +0100 Norbert Schlia * Formatting 8164c973 / Wed, 28 Oct 2020 20:00:57 +0100 Norbert Schlia * Reduce standard logging ce6a8e87 / Wed, 28 Oct 2020 08:00:10 +0100 Norbert Schlia * Disable MJPEG hw decoding, does no yet work f2304a4d / Wed, 28 Oct 2020 07:57:34 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 8fcd8243 / Wed, 28 Oct 2020 07:52:17 +0100 Norbert Schlia * Moved #define nearer to use 038efe2c / Wed, 28 Oct 2020 07:51:40 +0100 Norbert Schlia * Moved 'Decoder thread running' log message to come when the thread really started e8361116 / Wed, 28 Oct 2020 07:50:18 +0100 Norbert Schlia * I personally abore 'auto' declarations... Replaced all of these with full declarations b44e14fa / Wed, 28 Oct 2020 07:48:10 +0100 Norbert Schlia * Report correct segment duration bed149fc / Wed, 28 Oct 2020 07:47:32 +0100 Norbert Schlia * Fix compiler warning when building on Raspberry 399936e0 / Mon, 26 Oct 2020 20:45:55 +0100 Norbert Schlia * Update comments: list possible formats de97b46c / Mon, 26 Oct 2020 20:42:52 +0100 Norbert Schlia * Fix FFmpeg_Transcoder::get_pix_formats, failed on some source files 1cd0069f / Mon, 26 Oct 2020 12:34:09 +0100 Norbert Schlia * Add MJPEG/MPEG-2/VP-8 hardware accelerated decoding d63829e2 / Mon, 26 Oct 2020 12:33:23 +0100 Norbert Schlia * Fix hardware accelerated decoding 37ec31ea / Mon, 26 Oct 2020 12:32:01 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 13777840 / Mon, 26 Oct 2020 12:26:35 +0100 Norbert Schlia * Use FFmpeg_Transcoder::get_pix_formats to have one spot to set the pixel_fmt 8e42b64f / Mon, 26 Oct 2020 12:25:55 +0100 Norbert Schlia * Refactoring fd822f4a / Tue, 20 Oct 2020 14:41:00 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 16adf387 / Tue, 20 Oct 2020 14:38:35 +0200 Norbert Schlia * Remove 1.99 info and add 2.1 e1a28db6 / Tue, 20 Oct 2020 14:27:05 +0200 Norbert Schlia * Updated latest news about HW accel 87035800 / Tue, 20 Oct 2020 14:23:19 +0200 Norbert Schlia * Update comments for hardware accelleration 74eb91b5 / Tue, 20 Oct 2020 10:39:29 +0200 Norbert Schlia * Refactoring 947d4c5e / Tue, 20 Oct 2020 10:31:07 +0200 Norbert Schlia * Fix typo in log entry 103fa230 / Tue, 20 Oct 2020 10:30:12 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB a44c84bf / Tue, 20 Oct 2020 10:29:38 +0200 Norbert Schlia * Add BLURAY_VIDEO_FORMAT_2160P (UHD) 3e26f4c5 / Tue, 20 Oct 2020 10:24:12 +0200 Norbert Schlia * Change order, 2.1 first, then 2.x a3b22477 / Tue, 20 Oct 2020 10:23:27 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 66391f1e / Tue, 20 Oct 2020 10:20:17 +0200 Norbert Schlia * Add change list for upcoming 2.1 7fbcef68 / Sun, 18 Oct 2020 16:28:37 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 4ba39736 / Sun, 18 Oct 2020 16:28:05 +0200 Norbert Schlia * Bug: did not transcode some source files with invalid DTS 7854ab65 / Sun, 18 Oct 2020 16:21:36 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB b422581f / Sun, 18 Oct 2020 16:21:03 +0200 Norbert Schlia * Refactoring and time/date was reported twice in syslog 41c8267e / Sun, 18 Oct 2020 16:20:24 +0200 Norbert Schlia * Make std::string upper/lower helpers 45127358 / Sun, 18 Oct 2020 16:19:54 +0200 Norbert Schlia * Reduce log verbosity: report cache file close at TRACE level 0b776d6f / Sun, 18 Oct 2020 16:19:09 +0200 Norbert Schlia * Shorter log entry when openig cache files 6d16c6d4 / Tue, 13 Oct 2020 12:52:39 +0200 Norbert Schlia * HW accelerated decoding c065bc3b / Mon, 12 Oct 2020 07:35:34 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB ef40fb82 / Mon, 12 Oct 2020 07:30:09 +0200 Norbert Schlia * Forgot to update README to new 2.0 version... 44a8528e / Sun, 11 Oct 2020 23:09:43 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 99a6b7e5 / Sun, 11 Oct 2020 23:08:55 +0200 Norbert Schlia * Remove outdated coment 17f1bd14 / Sun, 11 Oct 2020 23:08:16 +0200 Norbert Schlia * Make get_channel_layout_name/get_sample_fmt_name/get_pix_fmt_name static rather than const ebe733b2 / Sun, 13 Sep 2020 11:45:49 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB d6c787b8 / Sun, 13 Sep 2020 11:41:17 +0200 Norbert Schlia * Prepare 2.0 release bd7f48e2 / Sun, 13 Sep 2020 09:18:58 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB 7f2024da / Sun, 13 Sep 2020 09:18:28 +0200 Norbert Schlia * Format d979ce46 / Sun, 13 Sep 2020 09:18:07 +0200 Norbert Schlia * Fix issue #64: Do not report error, simply skip last segment if too short 7fddef5f / Sun, 13 Sep 2020 09:16:12 +0200 Norbert Schlia * Wrong error message: Should read 'video frame error', not 'audio' a3b05622 / Sun, 2 Aug 2020 19:56:46 +0200 Norbert Schlia * Bring README and TODO up-to-date 0239e208 / Sun, 2 Aug 2020 19:41:33 +0200 Norbert Schlia * Declare constructors explicit 255594d6 / Sun, 2 Aug 2020 19:41:05 +0200 Norbert Schlia * Fix doxygen warnings 452b243f / Sun, 2 Aug 2020 19:38:53 +0200 Norbert Schlia * Update for new HW acceleration version 67790506 / Sun, 2 Aug 2020 19:35:40 +0200 Norbert Schlia * Fix filesize under Debian 11 7d626ffd / Sun, 2 Aug 2020 19:27:09 +0200 Norbert Schlia * Doxygen documentation dcf1ec71 / Sun, 2 Aug 2020 17:14:10 +0200 Norbert Schlia * Add command line parameters to enable and control hardware acceleration 16dde4e2 / Sun, 2 Aug 2020 17:08:20 +0200 Norbert Schlia * List and explain new hardware acceleration features 2effb330 / Thu, 30 Jul 2020 22:51:57 +0200 Norbert Schlia * Remove extra line break 7c691503 / Thu, 30 Jul 2020 22:48:14 +0200 Norbert Schlia * Fix typos c2348061 / Thu, 30 Jul 2020 22:47:30 +0200 Norbert Schlia * Add info about hw acceleration in FB branch 10f7cac8 / Thu, 30 Jul 2020 22:27:16 +0200 Norbert Schlia * Issue #63: Experimental hardware accelarion support. fccafc5a / Thu, 30 Jul 2020 22:25:12 +0200 Norbert Schlia * Update list of todos and missing features fbc36e70 / Thu, 30 Jul 2020 22:18:58 +0200 Norbert Schlia * Add info about hw accel d4ed95fc / Thu, 30 Jul 2020 22:18:32 +0200 Norbert Schlia * Set version to 2.1 a5f129a0 / Thu, 30 Jul 2020 13:32:44 +0200 Norbert Schlia * Add extra description file for hardware acceleration 377f834c / Thu, 30 Jul 2020 13:31:04 +0200 Norbert Schlia * Declare constructors explicit 1b92a7f0 / Sun, 19 Jul 2020 21:02:15 +0200 Norbert Schlia * Fix checks for Debian Bullseye (4.3-2) cc2dadc0 / Sun, 19 Jul 2020 18:31:55 +0200 Norbert Schlia * Remove deprecated -Wno-psabi option 605301c9 / Sun, 19 Jul 2020 18:22:57 +0200 Norbert Schlia * "Planned features": add link e8b66976 / Sun, 19 Jul 2020 18:21:13 +0200 Norbert Schlia * Add "Planned features" 11f45403 / Sat, 18 Jul 2020 18:53:50 +0200 Norbert Schlia * Raspbian 10 is Buster 032800d0 / Sat, 18 Jul 2020 18:52:42 +0200 Norbert Schlia * Shorten text to "Daily build" 7097035a / Sat, 18 Jul 2020 18:51:03 +0200 Norbert Schlia * Removed redundant "FFmpeg" e68efc13 / Sat, 18 Jul 2020 18:49:42 +0200 Norbert Schlia * Tested Raspi version 1495df45 / Sat, 18 Jul 2020 18:48:18 +0200 Norbert Schlia * Test with Raspi OK 112ab7ae / Sat, 18 Jul 2020 18:44:42 +0200 Norbert Schlia * "daily build" instead of "current FFmpeg version" 9c24bcec / Sat, 18 Jul 2020 18:43:17 +0200 Norbert Schlia * Set latest tested FFmpeg daily build 5b3e834e / Sat, 18 Jul 2020 10:13:07 +0200 Norbert Schlia * Set version to 2.0 3faa3c15 / Sat, 18 Jul 2020 10:09:20 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs bc88ce2d / Sat, 18 Jul 2020 10:02:36 +0200 Norbert Schlia * Prepare V1.99 (2.0 pre-release) f31e6efd / Sat, 18 Jul 2020 10:02:36 +0200 Norbert Schlia * Prepare V1.99 (2.0 pre-release) 44bf2d33 / Sat, 11 Jul 2020 15:15:32 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 9f271191 / Sat, 11 Jul 2020 10:56:20 +0200 Norbert Schlia * Forgot to add these... 7fa5dd62 / Sat, 11 Jul 2020 10:39:31 +0200 Norbert Schlia * unit tests should nozt combine several tests into one a9aa0429 / Sat, 11 Jul 2020 10:37:38 +0200 Norbert Schlia * regexp now C++ compatible. Also allow icase/non icase e9d75c52 / Sat, 11 Jul 2020 10:31:16 +0200 Norbert Schlia * Re-add with up-to-date GPL-3 license text b0d2a829 / Sat, 11 Jul 2020 10:56:20 +0200 Norbert Schlia * Forgot to add these... 5b4601e1 / Sat, 11 Jul 2020 10:39:31 +0200 Norbert Schlia * unit tests should nozt combine several tests into one a8d820d3 / Sat, 11 Jul 2020 10:37:38 +0200 Norbert Schlia * regexp now C++ compatible. Also allow icase/non icase eb0550da / Sat, 11 Jul 2020 10:32:43 +0200 Norbert Schlia * Merge pull request #62 from nschlia/LICENSE 24dd7112 / Sat, 11 Jul 2020 10:31:16 +0200 Norbert Schlia * Create COPYING d27ffb09 / Sat, 11 Jul 2020 10:30:06 +0200 Norbert Schlia * Delete COPYING 71a2e9ea / Sun, 5 Jul 2020 23:10:19 +0200 Norbert Schlia * Move CC to new location da13eb14 / Thu, 21 May 2020 10:46:12 +0200 Norbert Schlia * strcasecmp could recurse into death on some gcc versions, don't know why not on all ca887ef3 / Thu, 21 May 2020 10:44:36 +0200 Norbert Schlia * Remove superfluous bd_tell call d693c9dd / Thu, 21 May 2020 10:43:48 +0200 Norbert Schlia * Rename compare to more suitable reg_compare as its actually is using patterns 9f36a194 / Sat, 16 May 2020 00:55:58 +0200 Norbert Schlia * Again: 1.98 is on Backports now d1ec5baf / Sat, 16 May 2020 00:55:17 +0200 Norbert Schlia * 1.98 is on backports now c25a3215 / Thu, 14 May 2020 22:19:05 +0200 Norbert Schlia * Add "Transcoding too slow" paragraph 5f8c6c4d / Thu, 14 May 2020 22:14:38 +0200 Norbert Schlia * How to build FFmpeg with optimisations e4713792 / Sat, 9 May 2020 21:57:36 +0200 Norbert Schlia * Fix checks 9f98b5f5 / Sat, 9 May 2020 21:44:53 +0200 Norbert Schlia * Fix checks abd1e3b0 / Sat, 9 May 2020 21:38:05 +0200 Norbert Schlia * bd_seek is guaranteed to return the correct position, no need to call bd_tell 3e8bf1c2 / Sat, 9 May 2020 21:36:28 +0200 Norbert Schlia * Better use av_interleaved_write_frame, some videos happen to be garbled with av__write_frame dfed1768 / Sat, 9 May 2020 21:35:03 +0200 Norbert Schlia * Bluray chapter length is actually diff between this and next chapter -1 627c493d / Sat, 9 May 2020 21:32:01 +0200 Norbert Schlia * Announce 1.98 ready 2b706ad2 / Tue, 5 May 2020 21:35:38 +0200 Norbert Schlia * Changed log message if opening frame images to report frame instead of video 5991cca6 / Tue, 5 May 2020 21:34:11 +0200 Norbert Schlia * Report skipped Bluray titles/chapters at trace level instead of debug, not so important 8a4a3f10 / Tue, 5 May 2020 21:33:25 +0200 Norbert Schlia * Report 'Predicted transcoded size' at trace level instead of debug, not so important 7326ed71 / Tue, 5 May 2020 19:39:22 +0200 Norbert Schlia * Add reasonable defaults bc02b479 / Tue, 5 May 2020 19:38:15 +0200 Norbert Schlia * Wrong comment, 2 channels is stereo, not multi channel 1865192c / Sat, 2 May 2020 22:01:25 +0200 Norbert Schlia * Issue #61: Enable fix for JPG only 36057f66 / Sat, 2 May 2020 20:32:55 +0200 Norbert Schlia * Fix checks for HLS with FFmpeg 4.1.4-1~deb10u1 (Debian 11) f2f20c30 / Sat, 2 May 2020 20:18:28 +0200 Norbert Schlia * Add HLS to 'make check': sizes of files with latest build acd78eb1 / Sat, 2 May 2020 20:13:22 +0200 Norbert Schlia * Issue #61: Fix JPG generation e7a21089 / Sat, 2 May 2020 20:12:47 +0200 Norbert Schlia * Add HLS to 'make check' a81e0cfb / Sat, 2 May 2020 18:25:52 +0200 Norbert Schlia * Formatting 1ab5961e / Sat, 2 May 2020 18:11:30 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 713b0daa / Sat, 2 May 2020 18:05:29 +0200 Norbert Schlia * Add frame sets to 'make check' 9b757051 / Sat, 2 May 2020 18:05:29 +0200 Norbert Schlia * Add frame sets to 'make check' ab1cf9fe / Sat, 2 May 2020 18:04:41 +0200 Norbert Schlia * Closes #61: Fix JPG generation 5e183b3f / Sat, 2 May 2020 18:00:57 +0200 Norbert Schlia * Add missing doyxgen comment to m_reset_pts variable b74cb7b8 / Sat, 2 May 2020 15:28:04 +0200 Norbert Schlia * Report "could not encode image frame" instead of video frame in frame set mode 93129217 / Fri, 1 May 2020 22:39:06 +0200 Norbert Schlia * Sort tests 51dcf10e / Fri, 1 May 2020 22:32:03 +0200 Norbert Schlia * Fix make clean for checks (lost log files) 5b63afe9 / Fri, 1 May 2020 06:19:33 +0200 Norbert Schlia * Update FFmpeg compile notes 3f6a8768 / Fri, 1 May 2020 06:11:52 +0200 Norbert Schlia * Remove RESTRICTIONS paragraph bd3eb7dc / Thu, 30 Apr 2020 21:28:18 +0200 Norbert Schlia * Remove forgotten test log entry 5886666a / Thu, 30 Apr 2020 21:13:15 +0200 Norbert Schlia * Closes #58: Build files list on first direct access Fox PNG/JPG/BMP frame export: ls path/to/flles/00001.png (without wildcard) did not work e24346ab / Thu, 30 Apr 2020 14:24:14 +0200 Norbert Schlia * Add --with-extra-version parameter to add extra version information to Linux distribution builds, e.g. append -1~deb10u1. 70233823 / Thu, 30 Apr 2020 14:22:00 +0200 Norbert Schlia * Moved FFmpeg capabilities (formats) from --version/-V command to new -caps/-c parameter to keep version information brief. 7e23ac4f / Thu, 30 Apr 2020 08:17:51 +0200 Norbert Schlia * Reduce retry speed for frame sets 4aba979d / Thu, 30 Apr 2020 08:17:05 +0200 Norbert Schlia * Closes #60 - Reopen cache file after it has been closed so that image frames can be accessed after the file has been fully decoded. cb2f3bff / Thu, 30 Apr 2020 08:15:11 +0200 Norbert Schlia * Add issue #57 to fix list 4df3290e / Thu, 30 Apr 2020 08:14:51 +0200 Norbert Schlia * Mention issue #59 in fix list b6076d88 / Tue, 28 Apr 2020 20:44:02 +0200 Norbert Schlia * Issue #57: expand log file path 869e0858 / Mon, 27 Apr 2020 21:10:23 +0200 Norbert Schlia * Clean-up a71f64e5 / Mon, 27 Apr 2020 20:55:06 +0200 Norbert Schlia * Clean-up 7c275e45 / Mon, 27 Apr 2020 20:48:58 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs cc00c184 / Mon, 27 Apr 2020 20:42:09 +0200 Norbert Schlia * FFmpegfs has been added to the Debian repository a8b44f74 / Mon, 27 Apr 2020 20:42:09 +0200 Norbert Schlia * FFmpegfs has been added to the Debian repository 4ab1205a / Mon, 27 Apr 2020 20:34:08 +0200 Norbert Schlia * Update "news" section a5230943 / Mon, 27 Apr 2020 17:46:33 +0200 Norbert Schlia * Add info about installing from backports f8e72412 / Mon, 27 Apr 2020 09:16:49 +0200 Norbert Schlia * Fixed issue #59 7f312713 / Mon, 27 Apr 2020 07:18:58 +0200 Norbert Schlia * Update HLS paragraph 84a7d3cd / Mon, 27 Apr 2020 07:17:13 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 9a047b5e / Mon, 27 Apr 2020 07:10:47 +0200 Norbert Schlia * Remove HLS experimental paragraph f5a86dbb / Mon, 27 Apr 2020 07:10:47 +0200 Norbert Schlia * Remove HLS experimental paragraph 370b1435 / Mon, 27 Apr 2020 06:50:32 +0200 Norbert Schlia * Add paragraph about switching between repository installs and source builds 962f99cb / Sun, 26 Apr 2020 23:58:26 +0200 Norbert Schlia * Fix size check under Debian 11 a5bf809d / Sun, 26 Apr 2020 23:51:49 +0200 Norbert Schlia * Fix m3u8 files not correctly detected\ncloses #59 f6b546b0 / Sun, 26 Apr 2020 23:16:45 +0200 Norbert Schlia * Fix Debian Bug#958928: ffmpegfs FTCBFS: uses AC_RUN_IFELSE b26f2ea5 / Sun, 26 Apr 2020 19:43:57 +0200 Norbert Schlia * Add HLS info/Reformat 31304d4f / Sun, 26 Apr 2020 14:30:40 +0200 Norbert Schlia * Fix typo 255e9efd / Sun, 26 Apr 2020 14:27:08 +0200 Norbert Schlia * Change format list to table c3464cb5 / Sun, 26 Apr 2020 12:04:25 +0200 Norbert Schlia * 2x "you may build it yourself" in one sentence 821790b2 / Sun, 26 Apr 2020 11:48:20 +0200 Norbert Schlia * Update how to install from repository 516beecd / Fri, 24 Apr 2020 06:42:21 +0200 Norbert Schlia * Refactoring 1c8caef2 / Fri, 24 Apr 2020 06:42:01 +0200 Norbert Schlia * Fix checks for FFmpeg 4.2+ (Debian 11 and latest build) e4172e7e / Fri, 24 Apr 2020 06:36:43 +0200 Norbert Schlia * Forget to update file list to new checks 828cc5c8 / Fri, 24 Apr 2020 06:34:57 +0200 Norbert Schlia * Remove --march=native, breaks build on powerpc ppc64 ppc64el fa74c299 / Tue, 21 Apr 2020 19:01:42 +0200 Norbert Schlia * Reformat compatibility list a1230474 / Tue, 21 Apr 2020 10:38:38 +0200 Norbert Schlia * Update checks to support Debian 11/Ubuntu 20.04 FFmpeg version and latest daily checkout 8911a4a7 / Tue, 21 Apr 2020 08:59:13 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs f3654936 / Tue, 21 Apr 2020 08:58:59 +0200 Norbert Schlia * Update checks to support Debian 11/Ubuntu 20.04 FFmpeg version and latest daily checkout 33ffcd77 / Tue, 21 Apr 2020 08:52:58 +0200 Norbert Schlia * Add Debian 11/Ubuntu 20.04 to list of supported OSs Mention latest Git version of FFmpeg in list f1487e0f / Tue, 21 Apr 2020 08:51:45 +0200 Norbert Schlia * curl seems to be required fpr Doxygen, add to description. 1830ed01 / Mon, 20 Apr 2020 17:50:37 +0200 Norbert Schlia * Add missing Doxgen comments 1cc5ac1e / Mon, 20 Apr 2020 09:08:11 +0200 Norbert Schlia * Update HLS demo code to latest version to date 388c5e5e / Mon, 20 Apr 2020 09:07:36 +0200 Norbert Schlia * Clean up 327caf69 / Mon, 20 Apr 2020 09:01:19 +0200 Norbert Schlia * Fix Clang build d6845b3c / Mon, 20 Apr 2020 07:47:21 +0200 Norbert Schlia * Move 2.x to master branch 70a12887 / Sun, 19 Apr 2020 16:26:22 +0200 Norbert Schlia * Refactoring 301475bb / Sun, 19 Apr 2020 16:25:56 +0200 Norbert Schlia * Issue #56: make DEUG level entry if file is treated passthrough 9f39f12f / Sun, 19 Apr 2020 16:24:21 +0200 Norbert Schlia * Syntax errors in comments c4c393a1 / Sun, 19 Apr 2020 16:22:15 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 460c0742 / Sun, 19 Apr 2020 16:21:48 +0200 Norbert Schlia * Spelling/character case ea376c00 / Wed, 15 Apr 2020 16:53:06 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 34c2d005 / Wed, 15 Apr 2020 16:52:49 +0200 Norbert Schlia * Enable experimental stuff, seems to be still required for Opus 63185b4a / Wed, 15 Apr 2020 07:59:09 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x fc0574f9 / Wed, 15 Apr 2020 07:58:07 +0200 Norbert Schlia * Reduce logging verbosity a bit a8d0dfdd / Wed, 15 Apr 2020 07:56:21 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 2146c1a9 / Wed, 15 Apr 2020 07:55:55 +0200 Norbert Schlia * Format 09ff7dcc / Wed, 15 Apr 2020 07:54:48 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 5759c2cc / Wed, 15 Apr 2020 07:53:24 +0200 Norbert Schlia * Formatting 8965bf42 / Wed, 15 Apr 2020 00:28:33 +0200 Norbert Schlia * Set version to 1.99 d3c7630f / Wed, 15 Apr 2020 00:26:11 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 4f81e015 / Wed, 15 Apr 2020 00:24:28 +0200 Norbert Schlia * Set version to 1.12 98c001dc / Wed, 15 Apr 2020 00:12:09 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 6ff79183 / Wed, 15 Apr 2020 00:04:27 +0200 Norbert Schlia * Version date add956dd / Tue, 14 Apr 2020 14:42:10 +0200 nschlia * Merge remote-tracking branch 'remotes/origin/master' into release2.x 402098c2 / Tue, 14 Apr 2020 14:36:28 +0200 Norbert Schlia * Issue #55: Add desttype=mp4 to all parameters 0976873d / Sun, 12 Apr 2020 12:54:06 +0200 Norbert Schlia * Fix Mistake in help: Default of --recodesame is NO, not NEVER 73a89880 / Sat, 11 Apr 2020 14:12:27 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 59f993a0 / Sat, 11 Apr 2020 14:12:00 +0200 Norbert Schlia * Fix checks 672c740e / Sat, 11 Apr 2020 13:56:50 +0200 Norbert Schlia * Update NEWS with last fixes c368a0a9 / Sat, 11 Apr 2020 13:55:24 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 42b92583 / Sat, 11 Apr 2020 13:55:06 +0200 Norbert Schlia * --autocopy=OFF should turn off the function (according to docs and help) dcd52d37 / Sat, 11 Apr 2020 13:54:09 +0200 Norbert Schlia * Fix Issue #54: create unique filenames 0c44bcd0 / Thu, 9 Apr 2020 18:34:31 +0200 Norbert Schlia * Seek to position is no longer experimental 0ac477d8 / Thu, 9 Apr 2020 18:32:55 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 6b46088a / Thu, 9 Apr 2020 18:32:19 +0200 Norbert Schlia * Typo fixed 499a35b5 / Thu, 9 Apr 2020 18:31:50 +0200 Norbert Schlia * Typo fixed 3a13d7f8 / Thu, 9 Apr 2020 18:27:03 +0200 Norbert Schlia * Reduce logging a bit 93767780 / Thu, 9 Apr 2020 18:25:59 +0200 Norbert Schlia * Reformat 23cf3e93 / Thu, 9 Apr 2020 18:25:33 +0200 Norbert Schlia * Remove whitespaces from line endings bc2927bd / Thu, 9 Apr 2020 18:24:50 +0200 Norbert Schlia * Removed Libav support 5c9bd8cf / Thu, 9 Apr 2020 18:20:57 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x c9a5d668 / Thu, 9 Apr 2020 18:04:39 +0200 Norbert Schlia * Removed Libav support ed1c4799 / Thu, 9 Apr 2020 18:04:15 +0200 Norbert Schlia * Remove whitespaces from line endings a426c227 / Thu, 9 Apr 2020 18:02:46 +0200 Norbert Schlia * Reduce logging entries a bit d1fb7af1 / Thu, 9 Apr 2020 06:44:17 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x c7e0490d / Thu, 9 Apr 2020 06:43:38 +0200 Norbert Schlia * Reduce logging 663007de / Thu, 9 Apr 2020 06:43:10 +0200 Norbert Schlia * Fixes #53: match exact directory to avoid mismatches to virtual subdirectories (1.97+ only) 1082b9df / Wed, 8 Apr 2020 21:43:13 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 02e5f767 / Wed, 8 Apr 2020 21:42:57 +0200 Norbert Schlia * Actually 1.10 has been added, not 1.11 5c42ea0f / Wed, 8 Apr 2020 21:29:28 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x c0f0f430 / Wed, 8 Apr 2020 21:28:50 +0200 Norbert Schlia * Forgot to mention Bullseye 71f8701b / Wed, 8 Apr 2020 20:59:05 +0200 Norbert Schlia * Mention Debian 11 607dcbd3 / Wed, 8 Apr 2020 20:57:16 +0200 Norbert Schlia * HLS direct access now ready. 1d664d3f / Wed, 8 Apr 2020 19:32:12 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 3c9e5c10 / Wed, 8 Apr 2020 19:31:32 +0200 Norbert Schlia * Invalid link 02715f48 / Wed, 8 Apr 2020 19:29:28 +0200 Norbert Schlia * Add information about news article and repository version. 2a1c71e3 / Wed, 8 Apr 2020 19:27:46 +0200 Norbert Schlia * Merge branch 'master' into release2.x f957071b / Wed, 8 Apr 2020 19:27:05 +0200 Norbert Schlia * Add information about news article and repository version. e76a94dd / Mon, 6 Apr 2020 22:16:54 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 64cd7a39 / Mon, 6 Apr 2020 22:16:23 +0200 Norbert Schlia * Revert change for #45: not a bug, problem with FFmpeg 3.2.12 (Debian 9 repo version) 692f8d83 / Sun, 5 Apr 2020 17:07:41 +0200 Norbert Schlia * Merge branch 'master' into release2.x 87de2109 / Sun, 5 Apr 2020 17:06:31 +0200 Norbert Schlia * Added useful comment 3df17f06 / Sat, 4 Apr 2020 23:44:36 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 0fd6832f / Sat, 4 Apr 2020 23:44:13 +0200 Norbert Schlia * Fix #45: need to properly interleave output bcd47db7 / Sat, 4 Apr 2020 13:48:50 +0200 Norbert Schlia * Fix direct access to HLS segments withou prior ls e963b4eb / Sat, 28 Mar 2020 14:29:43 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 12b37378 / Sat, 28 Mar 2020 14:16:14 +0100 Norbert Schlia * Issue #52: Add --audiochannels option f81dce40 / Sat, 28 Mar 2020 14:14:49 +0100 Norbert Schlia * Add mkdoxy script to ignore ffc595d5 / Sat, 28 Mar 2020 09:37:50 +0100 nschlia * Additional parameters add which were not in merge c656694f / Sat, 28 Mar 2020 09:37:06 +0100 nschlia * Merge remote-tracking branch 'remotes/origin/master' into release2.x 0443ed52 / Sat, 28 Mar 2020 09:04:29 +0100 nschlia * Redo parameter output to make adding new parameters easier to implement 7b8a7d12 / Sat, 28 Mar 2020 09:03:24 +0100 nschlia * Add some missing ignores, reformat ba6d7c8b / Wed, 26 Feb 2020 21:37:27 +0100 Norbert Schlia * Oops, pos = 0 is pretty well correct... Caused several audio files to not convert to HLS 5e2a7f6e / Wed, 26 Feb 2020 21:36:30 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 36865d86 / Wed, 26 Feb 2020 21:36:07 +0100 Norbert Schlia * Properly report system errors from ffmpeg_geterror aa351cb9 / Tue, 25 Feb 2020 23:40:13 +0100 Norbert Schlia * Fix crash in frame set generation 22b0327b / Tue, 25 Feb 2020 23:38:55 +0100 Norbert Schlia * Fix tests a1e0850e / Tue, 25 Feb 2020 23:26:27 +0100 Norbert Schlia * Issue #51: Fix HLS positioning for DVD/Bluray sources a1e3c37f / Tue, 25 Feb 2020 22:59:17 +0100 Norbert Schlia * Changed PTS generation to not start at 0 for each DVD/Bluray chapter 85d69c70 / Tue, 25 Feb 2020 22:55:36 +0100 Norbert Schlia * Enhanced error message if packet could not be sent to encoder b3d9d3c7 / Tue, 25 Feb 2020 22:53:30 +0100 Norbert Schlia * Refactoring c3454927 / Sat, 22 Feb 2020 18:43:18 +0100 Norbert Schlia * Avoid copying invalid PTS cda1bd6e / Sat, 22 Feb 2020 18:42:37 +0100 Norbert Schlia * Rephrased error message when requested HLS segment is out of range to make it clearer 4981912e / Sat, 22 Feb 2020 18:41:18 +0100 Norbert Schlia * Disable pre-buffering for frame sets only b2d6bb48 / Sat, 22 Feb 2020 18:37:56 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x ec1129e2 / Sat, 22 Feb 2020 18:37:18 +0100 Norbert Schlia * Mention shrunk demo files f7755fd0 / Tue, 18 Feb 2020 21:51:10 +0100 Norbert Schlia * Issue #50: fix ls size for HLS 27a2f433 / Tue, 18 Feb 2020 21:41:50 +0100 Norbert Schlia * Refactoring: calc HLS segment count in central function 026bcabe / Tue, 18 Feb 2020 21:34:51 +0100 Norbert Schlia * Added info about duration unit 29e768b6 / Sun, 16 Feb 2020 20:20:49 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x a830f8f9 / Sun, 16 Feb 2020 20:20:09 +0100 Norbert Schlia * Issue #4: NEWS entry fa9b4e43 / Sun, 16 Feb 2020 18:27:55 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 2b58ef7b / Sun, 16 Feb 2020 18:23:54 +0100 Norbert Schlia * Fix issue #48 13f42ccb / Sun, 16 Feb 2020 18:22:56 +0100 Norbert Schlia * Reformat d87ac67c / Sun, 16 Feb 2020 18:16:44 +0100 Norbert Schlia * Trace log entry for EOF aab94082 / Tue, 11 Feb 2020 08:56:42 +0100 Norbert Schlia * Fix typo 51e50ef7 / Tue, 11 Feb 2020 08:56:13 +0100 Norbert Schlia * Removed stray assert(false) which was there for debugging... 0e1061db / Tue, 11 Feb 2020 08:55:44 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x c0e312de / Mon, 10 Feb 2020 19:57:28 +0100 Norbert Schlia * Still use /var/cache/ffmpegfs if executed as root, i.e,, from /etc/fstab 8ad1d685 / Mon, 10 Feb 2020 19:10:05 +0100 Norbert Schlia * Fix grammatical error in comment 524c97ec / Mon, 10 Feb 2020 19:03:25 +0100 Norbert Schlia * Environment variable is XDG_CACHE_HOME, not XDG_CACHE_DIR e226c00b / Mon, 10 Feb 2020 18:57:13 +0100 Norbert Schlia * Merge pull request #47 from 14mRh4X0r/change-cache-directory 2acba64e / Mon, 3 Feb 2020 20:56:46 +0100 Willem Mulder * Move cache to $XDG_CACHE_HOME f223768a / Tue, 4 Feb 2020 07:22:09 +0100 Norbert Schlia * HLS: Fix out of sync audio/video after repositioning to new segment 272ebc9c / Mon, 3 Feb 2020 07:46:05 +0100 Norbert Schlia * Fix typos a4786c8f / Mon, 3 Feb 2020 07:44:42 +0100 Norbert Schlia * Add HLS seek bc61796e / Mon, 3 Feb 2020 07:40:27 +0100 Norbert Schlia * Issue #39: add direct access to HLS segments a91d3c6c / Mon, 3 Feb 2020 07:33:50 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 8de98186 / Mon, 3 Feb 2020 07:33:16 +0100 Norbert Schlia * Use av_write_frame instead of av_interleaved_write_frame to provide faster results. Sometimes unordered PTS does not seem to matter d0d37382 / Sat, 1 Feb 2020 13:23:40 +0100 Norbert Schlia * Formatting 1fcf51e1 / Sat, 1 Feb 2020 13:21:18 +0100 Norbert Schlia * Refactoring 00c19daf / Sat, 1 Feb 2020 13:15:55 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x ef37a7c0 / Sat, 1 Feb 2020 13:08:00 +0100 Norbert Schlia * Properly re-init encoder when re-opened 0e535f01 / Sat, 1 Feb 2020 13:07:15 +0100 Norbert Schlia * Update news e64b9710 / Tue, 28 Jan 2020 06:29:29 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x f4a0c7c8 / Tue, 28 Jan 2020 06:28:11 +0100 Norbert Schlia * Do not create user/group ffmpegfs during install. Not really required for operation. b311aa2a / Fri, 24 Jan 2020 07:48:55 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x ead5e0d2 / Fri, 24 Jan 2020 07:48:32 +0100 Norbert Schlia * Set real frame rate/leave codec context frame rate untouched 655494b1 / Fri, 24 Jan 2020 07:43:07 +0100 Norbert Schlia * Add file_exists utility function ee6da231 / Fri, 24 Jan 2020 07:42:31 +0100 Norbert Schlia * Add segment no. if defined to trace log entry 4cf90eb7 / Fri, 24 Jan 2020 07:41:25 +0100 Norbert Schlia * Set real framerate hint 9701cd98 / Fri, 24 Jan 2020 07:41:02 +0100 Norbert Schlia * Refactoring/Update comments 0f405626 / Fri, 24 Jan 2020 07:35:41 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 76004e25 / Fri, 24 Jan 2020 07:28:42 +0100 Norbert Schlia * Fix checks of new demo video fe33c478 / Fri, 24 Jan 2020 07:01:55 +0100 Norbert Schlia * Add bugfix: Ensure the selected bitrate is used. 15c65063 / Thu, 23 Jan 2020 21:16:35 +0100 Norbert Schlia * Fix issue #46: ensure correct bitrate 536082b7 / Thu, 23 Jan 2020 21:15:13 +0100 Norbert Schlia * Fix issue #46: ensure correct bitrate 1f41ecb4 / Thu, 23 Jan 2020 21:14:26 +0100 Norbert Schlia * Add missing Doxygen comment 292af0da / Thu, 23 Jan 2020 21:13:55 +0100 Norbert Schlia * Reduce bitrate of video to make distribution archive smaller b9557b83 / Thu, 23 Jan 2020 21:13:06 +0100 Norbert Schlia * Add new demo files license to Doxygen 8143b668 / Wed, 22 Jan 2020 14:40:49 +0100 Norbert Schlia * Update README.md dd5f7652 / Wed, 22 Jan 2020 11:31:31 +0100 Norbert Schlia * Fix checks bfe33efd / Wed, 22 Jan 2020 11:26:14 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 4028f5f0 / Wed, 22 Jan 2020 11:22:19 +0100 Norbert Schlia * Shrink demo video from 48MB to 3.8MB to make distribution smaller d068550d / Wed, 22 Jan 2020 07:02:18 +0100 Norbert Schlia * A note about forthcoming 2.0 5f872edf / Wed, 22 Jan 2020 06:56:10 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x d9344cb8 / Wed, 22 Jan 2020 06:55:44 +0100 Norbert Schlia * Fix checks 064a2243 / Wed, 22 Jan 2020 06:53:29 +0100 Norbert Schlia * Merge branch 'release2.x' of https://github.com/nschlia/ffmpegfs into release2.x 9abb674e / Wed, 22 Jan 2020 06:47:20 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 2b5f2f8a / Tue, 21 Jan 2020 21:39:34 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x bed1986d / Tue, 21 Jan 2020 21:39:03 +0100 Norbert Schlia * Accidentally added e7b88ec9 / Tue, 21 Jan 2020 21:38:13 +0100 Norbert Schlia * Bump version to 1.98 49975bd4 / Tue, 21 Jan 2020 21:34:41 +0100 Norbert Schlia * Bump version to 1.11 9de41f29 / Tue, 21 Jan 2020 21:20:18 +0100 Norbert Schlia * Accidentally added code package, removed 2cbd069a / Tue, 21 Jan 2020 21:18:32 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 4d84ae79 / Tue, 21 Jan 2020 21:12:05 +0100 Norbert Schlia * New video test was missing from dist archive 1adfd18d / Tue, 21 Jan 2020 20:36:01 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 1db1abf4 / Tue, 21 Jan 2020 18:08:22 +0100 Norbert Schlia * Set version date 5dd0bc2e / Tue, 21 Jan 2020 18:07:46 +0100 Norbert Schlia * Fix checks d0f953b7 / Tue, 21 Jan 2020 08:06:32 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x e46248c0 / Tue, 21 Jan 2020 08:02:09 +0100 Norbert Schlia * Fix checks 20d1c057 / Tue, 21 Jan 2020 07:50:31 +0100 Norbert Schlia * Remove public domain files: Replaced demo files with own works under Creative Commons 5b040160 / Sun, 19 Jan 2020 10:58:15 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 4f5886ae / Sun, 19 Jan 2020 10:57:46 +0100 Norbert Schlia * Update (c) notice 2dca62a8 / Sat, 18 Jan 2020 21:51:01 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 7c2d3300 / Sat, 18 Jan 2020 21:46:32 +0100 Norbert Schlia * Leave decision when to create an I frame to encoder 7f86c941 / Sat, 18 Jan 2020 21:44:43 +0100 Norbert Schlia * Clean up 20daaef3 / Sat, 18 Jan 2020 21:27:11 +0100 Norbert Schlia * Added separate H264 profile for HLS 4619b182 / Sat, 18 Jan 2020 21:26:03 +0100 Norbert Schlia * Leave decision when to create an I frame to encoder 4c48c390 / Sat, 18 Jan 2020 21:25:07 +0100 Norbert Schlia * Refactoring d46253cc / Sat, 18 Jan 2020 21:22:45 +0100 Norbert Schlia * Clean up b01ff87f / Sat, 18 Jan 2020 21:14:48 +0100 Norbert Schlia * Fix grammatical error 9222d68b / Thu, 16 Jan 2020 19:06:52 +0100 Norbert Schlia * Update and clean 89a37c07 / Thu, 16 Jan 2020 19:05:56 +0100 Norbert Schlia * Update and clean 9c8b9c0a / Thu, 16 Jan 2020 19:05:16 +0100 Norbert Schlia * Update and clean 530050cf / Thu, 16 Jan 2020 19:00:42 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x fa897b7e / Thu, 16 Jan 2020 17:58:55 +0100 Norbert Schlia * Cleanup\nExtended error handling when settings H264 profiles 34fdf91a / Thu, 16 Jan 2020 17:54:19 +0100 Norbert Schlia * Use seperate profiles for HLS and 'regular' MP4 dd634c00 / Thu, 16 Jan 2020 17:53:53 +0100 Norbert Schlia * Set internal buffer size to 5MB 9bba6310 / Thu, 16 Jan 2020 17:53:21 +0100 Norbert Schlia * Issue #45 - Fix garbled Bluray/DVD playback. Just a workaround, the actual problem is somewhere else. 391b2470 / Thu, 16 Jan 2020 17:51:15 +0100 Norbert Schlia * Clean up ad002154 / Thu, 16 Jan 2020 17:50:46 +0100 Norbert Schlia * Use seperate profiles for HLS and 'regular' MP4 e843db78 / Thu, 16 Jan 2020 17:46:18 +0100 Norbert Schlia * Issue #45 - Fix garbled Bluray/DVD playback. Just a workaround, the problem is somewhere else. dc999685 / Fri, 10 Jan 2020 18:24:51 +0100 Norbert Schlia * Clean-up efcb2cf5 / Fri, 10 Jan 2020 18:23:24 +0100 Norbert Schlia * Clean-up 1c07509e / Fri, 10 Jan 2020 18:22:20 +0100 Norbert Schlia * Do not throw exceptions on many times happening events c048b4cb / Fri, 10 Jan 2020 18:21:45 +0100 Norbert Schlia * Refactoring 500e784f / Fri, 10 Jan 2020 18:21:06 +0100 Norbert Schlia * Clean-up 7e1cc0a5 / Fri, 10 Jan 2020 18:19:43 +0100 Norbert Schlia * Issue #44: Make sure all files are closed 701a91d2 / Thu, 9 Jan 2020 17:41:02 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x e0ce7f80 / Thu, 9 Jan 2020 17:40:25 +0100 Norbert Schlia * Corrected mistake in online help: clear-cache should be clear_cache instead. ffd9bf0f / Tue, 7 Jan 2020 23:17:36 +0100 Norbert Schlia * Set version to 1.97 a7ade611 / Tue, 7 Jan 2020 23:07:10 +0100 Norbert Schlia * Properly handle case when start_time is AV_NOOPTS (frame sets only) 0eba2c31 / Tue, 7 Jan 2020 22:57:59 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 9739a1f0 / Tue, 7 Jan 2020 22:57:22 +0100 Norbert Schlia * EGAIN happens quite often, avoid exceptions in that case fc836e87 / Tue, 7 Jan 2020 22:31:43 +0100 Norbert Schlia * Reformat be538297 / Tue, 7 Jan 2020 22:30:55 +0100 Norbert Schlia * Reformat 2163b230 / Sat, 28 Dec 2019 20:41:35 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 1fbd3542 / Sat, 28 Dec 2019 20:13:30 +0100 Norbert Schlia * Skip corrupted and discarded video frames to avoid blurps. e0c393c3 / Sat, 28 Dec 2019 20:12:26 +0100 Norbert Schlia * Mention 'bluray' in bluray error messages a3bfb1a5 / Sat, 28 Dec 2019 20:11:08 +0100 Norbert Schlia * All documentation is now dual-licensed under both GFDL 1.3 and GPL 3. In addition, the copyright notices now explicitly state there are no invariant sections with the GFDL. 6032bbd0 / Thu, 12 Dec 2019 07:25:59 +0100 Norbert Schlia * Update comments and missing features list. cc7b612c / Thu, 12 Dec 2019 07:17:34 +0100 Norbert Schlia * Issue #39: add HLS live streaming 95c75076 / Thu, 12 Dec 2019 06:36:52 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x cb25da12 / Thu, 12 Dec 2019 06:33:22 +0100 Norbert Schlia * Maybe drop Libav support? e3ab1e96 / Thu, 12 Dec 2019 06:27:47 +0100 Norbert Schlia * Update virtual file list instead of adding over 7ef8515e / Tue, 10 Dec 2019 08:11:00 +0100 Norbert Schlia * Add TS checks aa5ba502 / Mon, 9 Dec 2019 23:28:06 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 060b62bf / Mon, 9 Dec 2019 23:24:46 +0100 Norbert Schlia * Reduce log level in demo command line to make output more readable d59e1c4d / Mon, 9 Dec 2019 23:24:09 +0100 Norbert Schlia * Reduce log level in demo command line to make output more readable 34b2c30c / Mon, 9 Dec 2019 14:55:32 +0100 Norbert Schlia * Update NEWS 474a43a1 / Mon, 9 Dec 2019 14:48:49 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 4ff6a8f8 / Mon, 9 Dec 2019 14:46:51 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x cde81724 / Mon, 9 Dec 2019 14:44:05 +0100 Norbert Schlia * Update readme a01dd2a1 / Mon, 9 Dec 2019 14:38:15 +0100 Norbert Schlia * Update eadme bdc809f5 / Mon, 9 Dec 2019 14:33:46 +0100 Norbert Schlia * Update NEWS badab8d8 / Mon, 9 Dec 2019 14:30:50 +0100 Norbert Schlia * Add check for video output (webm/mov/mp4) d9cfbd79 / Sat, 7 Dec 2019 12:16:16 +0100 Norbert Schlia * 'Unable to deduct frame no can be repprted as trace. Happens often, but is no error c6c02da8 / Sat, 7 Dec 2019 12:14:16 +0100 Norbert Schlia * Fix direct access (w/o previous ls of directory) to frame set. 6dc33541 / Thu, 5 Dec 2019 15:13:44 +0100 Norbert Schlia * Fix DVD/Bluray/BCD support for frame sets 8192cb54 / Thu, 5 Dec 2019 08:26:41 +0100 Norbert Schlia * Formatting 2e8b412e / Thu, 5 Dec 2019 08:23:54 +0100 Norbert Schlia * Refactoring e9c51b2d / Thu, 5 Dec 2019 08:18:04 +0100 Norbert Schlia * Formatting 5c403f80 / Thu, 5 Dec 2019 08:17:14 +0100 Norbert Schlia * Formatting d71584fb / Thu, 5 Dec 2019 08:13:52 +0100 Norbert Schlia * Update docs 6f1ee04e / Thu, 5 Dec 2019 08:13:08 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 9c9a0a21 / Thu, 5 Dec 2019 07:55:37 +0100 Norbert Schlia * Updated DOCS b735479d / Thu, 5 Dec 2019 07:45:35 +0100 Norbert Schlia * Handle buffer->copy fails as error, not just ignore it 0e2375a0 / Thu, 5 Dec 2019 07:44:47 +0100 Norbert Schlia * Report more elaborate error message from buffer->reserve, not just 'out of memory' 712dacde / Thu, 5 Dec 2019 07:43:20 +0100 Norbert Schlia * Added convenient find virtualfile child/parent helpers 073a4d37 / Thu, 5 Dec 2019 07:42:09 +0100 Norbert Schlia * Remove duplicated values for file size etc. Use just one central storage 3b672158 / Thu, 5 Dec 2019 07:31:26 +0100 Norbert Schlia * Cache structure was not properly initialised, causing invalid values in the database. 12193044 / Thu, 5 Dec 2019 07:29:36 +0100 Norbert Schlia * Changed some log levels from INFO top DEBUG to make logging less chatty be75b951 / Thu, 5 Dec 2019 07:28:08 +0100 Norbert Schlia * Rename flags: CLOSE_CACHE to CACHE_CLOSE etc. Better match for its purpose 1a0d8521 / Thu, 5 Dec 2019 07:23:46 +0100 Norbert Schlia * Avoid EINVAL errors in case the cache file ends up at zero size. Minor problem, but ugly. 6da838c1 / Wed, 27 Nov 2019 22:27:26 +0100 Norbert Schlia * Fixed deinterlace b8800579 / Wed, 27 Nov 2019 22:09:37 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 2554efca / Wed, 27 Nov 2019 21:56:11 +0100 Norbert Schlia * Fix Libav build 25853eae / Wed, 27 Nov 2019 21:31:47 +0100 Norbert Schlia * Issue #42: Moved video deinterlace filtering before rescaling. 61374032 / Wed, 27 Nov 2019 21:02:43 +0100 Norbert Schlia * Replace insecure sprintf with more secure snprintf fcfcb13a / Wed, 27 Nov 2019 11:18:49 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x ff39daad / Wed, 27 Nov 2019 11:13:23 +0100 Norbert Schlia * Fix warnings if build for 32 bit 273cabbe / Wed, 27 Nov 2019 11:13:06 +0100 Norbert Schlia * Fix typo in comment cad9a9e3 / Wed, 27 Nov 2019 11:10:59 +0100 Norbert Schlia * Make VIRTUALFILE struct non-constant 172ef245 / Wed, 27 Nov 2019 10:59:01 +0100 Norbert Schlia * Format 607909f1 / Sun, 24 Nov 2019 19:16:05 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 336dac56 / Sun, 24 Nov 2019 18:46:01 +0100 Norbert Schlia * Enhanced logging 09d3670d / Sun, 24 Nov 2019 18:45:40 +0100 Norbert Schlia * Update doxygen eca9af6c / Mon, 18 Nov 2019 22:56:52 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 4c6720a2 / Mon, 18 Nov 2019 22:22:06 +0100 Norbert Schlia * Set version to 1.10 dbc3fc4c / Mon, 18 Nov 2019 07:50:51 +0100 Norbert Schlia * Fix syntax error 7198ad05 / Mon, 18 Nov 2019 07:48:10 +0100 Norbert Schlia * Get release 1.9 ready 8108c03e / Mon, 18 Nov 2019 07:36:57 +0100 Norbert Schlia * Get release 1.9 ready c9739c17 / Sun, 17 Nov 2019 23:00:55 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x f00ec643 / Sun, 17 Nov 2019 23:00:18 +0100 Norbert Schlia * Reformat cbd919de / Sun, 17 Nov 2019 17:24:39 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x b38d28c6 / Sun, 17 Nov 2019 17:17:59 +0100 Norbert Schlia * Refactoring 8164690a / Sun, 17 Nov 2019 17:15:19 +0100 Norbert Schlia * Fix comment 083fe3ef / Sun, 17 Nov 2019 15:26:53 +0100 Norbert Schlia * Fix typo in comment babafc13 / Sun, 17 Nov 2019 15:24:11 +0100 Norbert Schlia * Fix format string of error message bc0c0986 / Sun, 17 Nov 2019 15:23:37 +0100 Norbert Schlia * Fix typo in comment 8146f911 / Sun, 17 Nov 2019 15:21:31 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x cce7a3b0 / Sun, 17 Nov 2019 14:30:04 +0100 Norbert Schlia * Refactoring b5a629f3 / Sun, 17 Nov 2019 14:24:00 +0100 Norbert Schlia * Double check if last muxed DTS is valid 132680f9 / Sun, 17 Nov 2019 14:23:45 +0100 Norbert Schlia * Double check if last muxed DTS is valid 6e7526b4 / Sun, 17 Nov 2019 14:22:57 +0100 Norbert Schlia * Reformat f6297f1d / Sun, 17 Nov 2019 14:19:54 +0100 Norbert Schlia * Refactoring\nDo file open directly on file descriptor instead of helper variable e1848146 / Sun, 17 Nov 2019 14:15:30 +0100 Norbert Schlia * Cache files were left at the predicted size if it was larger than the result size. Size is now correctly capped to the correct result size. 60da21f3 / Sun, 17 Nov 2019 14:12:32 +0100 Norbert Schlia * Remove copy of filename in m_filename variable, use original directly aa9b6c97 / Sun, 17 Nov 2019 14:00:16 +0100 Norbert Schlia * Use file extension instead of format as extension on cache files. Can be different in later versions. 1feca1cf / Wed, 13 Nov 2019 18:49:01 +0100 Norbert Schlia * Fix potential NULL pointer reference crash 6a819aae / Sat, 9 Nov 2019 21:14:00 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 541f0a37 / Sat, 9 Nov 2019 20:59:08 +0100 Norbert Schlia * Refactoring 92a38855 / Sat, 9 Nov 2019 20:38:43 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 92f8b9ec / Sat, 9 Nov 2019 20:36:40 +0100 Norbert Schlia * Restore packet duration if lost during encode e1c3f6da / Wed, 6 Nov 2019 22:16:50 +0100 Norbert Schlia * Fix TS transcode to H264/AAC 8a90ab11 / Wed, 6 Nov 2019 22:11:46 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 90214eea / Wed, 6 Nov 2019 22:11:26 +0100 Norbert Schlia * Refactoring daa0c2e3 / Fri, 25 Oct 2019 22:03:52 +0200 Norbert Schlia * Fix script file handling f561cdc4 / Fri, 25 Oct 2019 22:01:05 +0200 Norbert Schlia * Fix mini memory leak ca1325d1 / Fri, 25 Oct 2019 22:00:18 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 74c47142 / Fri, 25 Oct 2019 21:50:09 +0200 Norbert Schlia * Refactoring 7ba1f1a6 / Fri, 25 Oct 2019 21:48:54 +0200 Norbert Schlia * Fix warning 0d960637 / Fri, 25 Oct 2019 21:48:35 +0200 Norbert Schlia * Corrected comment da3eeaa2 / Fri, 25 Oct 2019 21:48:11 +0200 Norbert Schlia * Enhanced comments b67ff580 / Fri, 25 Oct 2019 21:47:17 +0200 Norbert Schlia * Enhanced comments dbc411ff / Fri, 25 Oct 2019 21:46:48 +0200 Norbert Schlia * Clean-up 5e23c01e / Mon, 21 Oct 2019 12:21:49 +0200 Norbert Schlia * Use correct file extension 4d712c4f / Mon, 21 Oct 2019 12:20:13 +0200 Norbert Schlia * Ooops, last push broke frame set exporting. Fixed! dc94a7cc / Mon, 21 Oct 2019 12:16:45 +0200 Norbert Schlia * Documentation 4ecc7a4c / Mon, 21 Oct 2019 12:16:14 +0200 Norbert Schlia * Documentation 44f391a7 / Mon, 21 Oct 2019 12:01:57 +0200 Norbert Schlia * Refactoring 0bee8a8d / Mon, 21 Oct 2019 11:24:15 +0200 Norbert Schlia * Split close function into separate 3e382b65 / Mon, 21 Oct 2019 11:21:09 +0200 Norbert Schlia * Updated NEWS Updated Doxygen comments and fixed typos Refactoring 09a5e695 / Mon, 21 Oct 2019 10:59:00 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x d942011d / Mon, 21 Oct 2019 10:47:17 +0200 Norbert Schlia * Reafctoring: Split close() function into close input and output separetly 3ec85e80 / Mon, 21 Oct 2019 10:43:22 +0200 Norbert Schlia * Update documentation 49188c1d / Sat, 19 Oct 2019 00:32:43 +0200 Norbert Schlia * Store script file contents in VIRTUALFILE struct 17a53126 / Sat, 19 Oct 2019 00:32:03 +0200 Norbert Schlia * Clean up 85391e93 / Sun, 13 Oct 2019 23:04:21 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x e2327dea / Sun, 13 Oct 2019 23:04:00 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 48185dc8 / Sun, 13 Oct 2019 23:03:45 +0200 Norbert Schlia * And, yes, guess what, another Libav fix 411bcc71 / Sun, 13 Oct 2019 22:06:58 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 9f21cd07 / Sun, 13 Oct 2019 22:06:11 +0200 Norbert Schlia * Upgraded Libav 13_dev0. 2cb314b5 / Sun, 13 Oct 2019 21:54:16 +0200 Norbert Schlia * Updated clang compiler to 7.0.1 7fa424ba / Sun, 13 Oct 2019 21:52:30 +0200 Norbert Schlia * Update used FFmpeg version 4a104c46 / Sun, 13 Oct 2019 21:13:51 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x f4472b61 / Sun, 13 Oct 2019 21:12:37 +0200 Norbert Schlia * Add native FFmpeg build option c6db8d6c / Sat, 12 Oct 2019 14:13:56 +0200 Norbert Schlia * Transcode videos to frame works transparently for any input now (DVD, Bluray and VideoCD). b578c054 / Sat, 12 Oct 2019 14:06:29 +0200 Norbert Schlia * Implement seek function for DVD 8291d63e / Sat, 12 Oct 2019 14:05:49 +0200 Norbert Schlia * Fix error messages showing wrong block numbers 9331eb54 / Sat, 12 Oct 2019 14:04:36 +0200 Norbert Schlia * Fix crash when Bluray video without audio was opened 650b7f28 / Sat, 12 Oct 2019 14:03:40 +0200 Norbert Schlia * Not a real change, make code look more like the stdlib 872cf69a / Thu, 10 Oct 2019 18:52:04 +0200 Norbert Schlia * Clean up fc12cec3 / Thu, 10 Oct 2019 18:51:45 +0200 Norbert Schlia * Do not shrink cache when reopening it aecfb293 / Thu, 10 Oct 2019 18:47:05 +0200 Norbert Schlia * Do not shrink cache when reopening it b8b19bb1 / Thu, 10 Oct 2019 17:34:28 +0200 Norbert Schlia * Fix incorrect error output 15e53a19 / Tue, 8 Oct 2019 19:09:36 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x bfdfed04 / Tue, 8 Oct 2019 06:18:47 +0200 Norbert Schlia * Helpful stringify macro e102fc79 / Tue, 8 Oct 2019 06:17:53 +0200 Norbert Schlia * Change VIRTUALTYPE_REGULAR to more appropriate VIRTUALTYPE_DISK Remove unused VIRTUALTYPE enums cb6ab39d / Tue, 8 Oct 2019 06:16:44 +0200 Norbert Schlia * Add trailing slash to path 588f45c6 / Tue, 8 Oct 2019 06:16:08 +0200 Norbert Schlia * Fix doxygen comment d792732a / Tue, 8 Oct 2019 06:15:34 +0200 Norbert Schlia * Reformat eb6fd0fb / Fri, 4 Oct 2019 06:57:37 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 50bd61dd / Fri, 4 Oct 2019 06:56:25 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 0150d463 / Fri, 4 Oct 2019 06:55:42 +0200 Norbert Schlia * Make variable name match to 2.x version 291a6360 / Fri, 4 Oct 2019 06:43:35 +0200 Norbert Schlia * Change stat struct variables to be consistent through the whole app de4c9598 / Fri, 4 Oct 2019 06:42:19 +0200 Norbert Schlia * Fix FFmpeg deprecation warning in fpcompare 4879e31a / Tue, 1 Oct 2019 21:24:07 +0200 Norbert Schlia * Change frame names to 6 digits e5fb9bed / Tue, 1 Oct 2019 20:55:27 +0200 Norbert Schlia * Add transport stream (TS) output format e08afb6c / Tue, 1 Oct 2019 20:50:50 +0200 Norbert Schlia * Fix "prores cant allocate memory #41" 4813d3a9 / Tue, 1 Oct 2019 20:48:10 +0200 Norbert Schlia * Reformat 68933298 / Tue, 1 Oct 2019 20:43:51 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 89e815cf / Tue, 1 Oct 2019 20:35:59 +0200 Norbert Schlia * Silence make output a bit 52d8461c / Tue, 1 Oct 2019 20:35:08 +0200 Norbert Schlia * Add some extra % to file size prediction 02e7a9e3 / Tue, 1 Oct 2019 20:34:11 +0200 Norbert Schlia * Reformat 4894f7da / Tue, 1 Oct 2019 20:32:38 +0200 Norbert Schlia * Change misleading "out of memory" error to "illegal seek" Refactoring f40fa97e / Sun, 8 Sep 2019 16:13:24 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x ffe2f2ad / Sun, 8 Sep 2019 16:04:27 +0200 Norbert Schlia * Refactoring 1aab2b63 / Sun, 8 Sep 2019 16:03:36 +0200 Norbert Schlia * Update docs 769ddddd / Sun, 8 Sep 2019 16:02:38 +0200 Norbert Schlia * Move cache directory from rather unusual /tmp/ffmpegfs to /var/cache/ffmpegfs 8cef170d / Fri, 6 Sep 2019 20:35:48 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 9013ee1d / Fri, 6 Sep 2019 20:35:08 +0200 Norbert Schlia * Fix stupid libav. Again. f63505db / Fri, 6 Sep 2019 20:19:40 +0200 Norbert Schlia * Merge from trunk b8fb8514 / Fri, 6 Sep 2019 20:11:11 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 79789302 / Fri, 6 Sep 2019 20:10:50 +0200 Norbert Schlia * Remove xmlint check again, part of ascii-doc anyway c4edf9cb / Fri, 6 Sep 2019 20:09:05 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 70ee794e / Fri, 6 Sep 2019 20:08:48 +0200 Norbert Schlia * Allow setting file extension separetly abfbadcd / Fri, 6 Sep 2019 20:07:47 +0200 Norbert Schlia * Issue #40: fix audio/video sync under Android 7431ee11 / Tue, 3 Sep 2019 09:07:06 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 5e6a495f / Tue, 3 Sep 2019 09:04:11 +0200 Norbert Schlia * Readd check for xmllint 1d856261 / Tue, 3 Sep 2019 08:53:20 +0200 Norbert Schlia * Disable profile guided optimisation, produces strange assembler code 872b701b / Tue, 3 Sep 2019 08:52:11 +0200 Norbert Schlia * Issue #36: revamped frame handling to better handle requests ee2a1882 / Wed, 28 Aug 2019 00:11:48 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 83f15746 / Wed, 28 Aug 2019 00:08:21 +0200 Norbert Schlia * Remove no longer required prerequisites/add graphviz b75df7b9 / Wed, 28 Aug 2019 00:07:00 +0200 Norbert Schlia * More detailed build documentation afd78221 / Wed, 28 Aug 2019 00:04:31 +0200 Norbert Schlia * Remove trailing white spaces 86486d96 / Sun, 11 Aug 2019 22:34:37 +0200 Norbert Schlia * Fix 32 bit warning 056ec538 / Sun, 11 Aug 2019 22:17:37 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 2ca6e410 / Sun, 11 Aug 2019 21:55:15 +0200 Norbert Schlia * Fix several warnings if compiled for 32 bit f0195176 / Sun, 11 Aug 2019 21:54:13 +0200 Norbert Schlia * Add hint to add all prequisites at once f777e377 / Sun, 11 Aug 2019 08:19:09 +0200 Norbert Schlia * Fix 32 bit build 10bded63 / Sat, 3 Aug 2019 11:40:28 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x a7ca755e / Sat, 3 Aug 2019 11:35:41 +0200 Norbert Schlia * Update (c) notices 5f88f23a / Sat, 3 Aug 2019 11:35:27 +0200 Norbert Schlia * Scripts were missing from dist a723dbf8 / Sat, 3 Aug 2019 11:34:52 +0200 Norbert Schlia * Update (c) notices 32f49b54 / Sat, 3 Aug 2019 11:33:35 +0200 Norbert Schlia * Fix checks for Debian Buster 54dd925d / Sun, 7 Jul 2019 16:25:53 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x f2d18be5 / Sun, 7 Jul 2019 16:18:46 +0200 Norbert Schlia * Issue #37: Fix tests for Libav 0e0a50cb / Sun, 7 Jul 2019 16:03:27 +0200 Norbert Schlia * Issue #37: add tests 9ff36d97 / Sun, 7 Jul 2019 15:26:26 +0200 Norbert Schlia * Fix small mistake 00c71948 / Sun, 7 Jul 2019 13:30:10 +0200 Norbert Schlia * Issue #37: use m4a instead of mov 4f679edf / Sun, 7 Jul 2019 13:29:08 +0200 Norbert Schlia * Fix typo 9bd86dea / Sun, 7 Jul 2019 01:07:56 +0200 Norbert Schlia * Seems the file size was yet too small. Test now OK. 008e098d / Sun, 7 Jul 2019 00:51:48 +0200 Norbert Schlia * Fix documentation e54eaeac / Sun, 7 Jul 2019 00:50:59 +0200 Norbert Schlia * Fix checks. flt samples are now not converted to signed int so the files may be larger d2b140c9 / Sat, 6 Jul 2019 14:47:51 +0200 Norbert Schlia * Issue #37: Documentation cd540c2c / Sat, 6 Jul 2019 14:36:42 +0200 Norbert Schlia * Ensure that the sample size does not change if switching from planar to non planar or vice versa 6a2acb08 / Sat, 6 Jul 2019 14:35:42 +0200 Norbert Schlia * Issue #37: Make estimate of ALAC size at 65% of WAV size b6d53a1b / Sat, 6 Jul 2019 00:02:56 +0200 Norbert Schlia * Issue #37: add ALAC support 74f1b6ff / Fri, 5 Jul 2019 23:59:41 +0200 Norbert Schlia * Formatting & typos 1c0cf33f / Tue, 25 Jun 2019 12:01:28 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x f868e14b / Tue, 25 Jun 2019 12:01:08 +0200 Norbert Schlia * "install fuse" seems explictly required 364089cb / Tue, 25 Jun 2019 11:59:50 +0200 Norbert Schlia * Added more trouble fixes 7f7131a2 / Tue, 25 Jun 2019 07:33:22 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 2e7b48bc / Tue, 25 Jun 2019 07:31:58 +0200 Norbert Schlia * Change aptitude to apt-get because aptitude is not installed by default on debian 10b86537 / Tue, 25 Jun 2019 07:31:09 +0200 Norbert Schlia * libavfilter was missing from install commands 758b8157 / Sat, 15 Jun 2019 16:44:11 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 35346bad / Tue, 11 Jun 2019 08:42:15 +0200 Norbert Schlia * Testing: enable extensive logging 60b93c37 / Tue, 11 Jun 2019 08:41:21 +0200 Norbert Schlia * Testing: more logging for frame sets 51065aca / Tue, 11 Jun 2019 08:18:21 +0200 Norbert Schlia * Testing: more logging for frame sets 3850358d / Mon, 10 Jun 2019 23:37:05 +0200 Norbert Schlia * Heavy refactoring 1583546b / Mon, 10 Jun 2019 22:50:00 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 39977271 / Mon, 10 Jun 2019 22:47:58 +0200 Norbert Schlia * Format 4e47b6cc / Mon, 3 Jun 2019 20:31:27 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 5131c1d5 / Mon, 3 Jun 2019 20:28:39 +0200 Norbert Schlia * Internal: allow disabling changelog when building distribution (--enable-changelog=no) bf5885d1 / Mon, 3 Jun 2019 20:26:52 +0200 Norbert Schlia * Fix typos 3e85638b / Mon, 3 Jun 2019 20:24:21 +0200 Norbert Schlia * Remove duplicate nullptr check 5e2c1641 / Wed, 29 May 2019 17:01:43 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x cda8bd11 / Wed, 29 May 2019 17:01:08 +0200 Norbert Schlia * Make prerequisites for building from git more prominent 5f1b0826 / Tue, 28 May 2019 22:24:16 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 9b21dc33 / Tue, 28 May 2019 22:23:35 +0200 Norbert Schlia * Doxygen update 077253cd / Tue, 28 May 2019 19:49:48 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into release2.x 997d86c9 / Tue, 28 May 2019 19:48:36 +0200 Norbert Schlia * Use std::atomic_bool object as lock guard f9f08dfd / Tue, 28 May 2019 19:48:04 +0200 Norbert Schlia * Update thread pool class f701f82c / Tue, 28 May 2019 19:46:58 +0200 Norbert Schlia * Report last shutdown messages as info 3fd5f406 / Tue, 28 May 2019 19:46:02 +0200 Norbert Schlia * Update doxygen docs c4f78665 / Mon, 27 May 2019 18:40:45 +0200 Norbert Schlia * Change WebM overhead to 15% 3799d013 / Mon, 27 May 2019 18:39:46 +0200 Norbert Schlia * Make reference parameter const bd753cab / Mon, 27 May 2019 18:39:13 +0200 Norbert Schlia * Doxygen update 75a1869e / Mon, 27 May 2019 18:38:44 +0200 Norbert Schlia * Issue #29: Add version check and auto update to cache database a239f66b / Mon, 27 May 2019 18:22:37 +0200 Norbert Schlia * Update docs ad0a3505 / Mon, 27 May 2019 18:22:13 +0200 Norbert Schlia * Issue #31: avoid spurious or missed unlocks c9046e85 / Mon, 27 May 2019 18:04:27 +0200 Norbert Schlia * Issue #31: avoid spurious or missed unlocks 514b572e / Mon, 27 May 2019 18:01:10 +0200 Norbert Schlia * Additional accessors 511a6f37 / Mon, 27 May 2019 17:58:05 +0200 Norbert Schlia * Format 683cd031 / Mon, 27 May 2019 17:57:45 +0200 Norbert Schlia * Allocate thread pool dynamically b59aad96 / Mon, 27 May 2019 17:49:38 +0200 Norbert Schlia * Enhanced SQL error logging 0c4ace5e / Mon, 27 May 2019 17:49:04 +0200 Norbert Schlia * Fix small memory leak eb4fbc33 / Mon, 27 May 2019 17:48:43 +0200 Norbert Schlia * Remove unused sqlite callback function 5f87488c / Mon, 27 May 2019 17:44:51 +0200 Norbert Schlia * Database version check added 38799f0a / Mon, 27 May 2019 07:54:11 +0200 Norbert Schlia * Update doxygen comments dfcb9c22 / Mon, 27 May 2019 07:46:33 +0200 Norbert Schlia * Info about rename of FB_issue_26 branch to release2.x 8f38a755 / Mon, 27 May 2019 07:45:19 +0200 Norbert Schlia * Info about rename of FB_issue_26 branch to release2.x 351e3611 / Mon, 27 May 2019 07:41:46 +0200 Norbert Schlia * Change version to 1.9 ccd88c48 / Sat, 25 May 2019 08:11:17 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 89b88276 / Sat, 25 May 2019 08:06:20 +0200 Norbert Schlia * Reduce warning levels a bit 969c69c5 / Sat, 25 May 2019 08:04:06 +0200 Norbert Schlia * Silence compiler warning c6492aeb / Sat, 25 May 2019 08:03:01 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 5c0dbb45 / Fri, 24 May 2019 20:16:41 +0200 Norbert Schlia * Replaced Posix thread base code with thread pool e2963400 / Thu, 23 May 2019 07:50:29 +0200 Norbert Schlia * Update for v1.96 5462aec0 / Thu, 23 May 2019 07:35:22 +0200 Norbert Schlia * Cleanup 58a91521 / Thu, 23 May 2019 07:21:59 +0200 Norbert Schlia * Prepare release 0f005c42 / Thu, 23 May 2019 07:13:57 +0200 Norbert Schlia * Prepare release 29182ec8 / Thu, 23 May 2019 06:57:51 +0200 Entwickler * Remove files that should not belong here 53def172 / Tue, 21 May 2019 17:15:28 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 9642e67a / Tue, 21 May 2019 17:12:51 +0200 Norbert Schlia * Report some rare internal errors f0213958 / Tue, 21 May 2019 17:10:07 +0200 Norbert Schlia * Fix Libav checks 2a44fb01 / Tue, 21 May 2019 05:54:26 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 b57a9451 / Tue, 21 May 2019 05:53:44 +0200 Norbert Schlia * Issue #28: Use fixed list of extensions to exclude images from transcoding 43764d4b / Sun, 19 May 2019 18:29:21 +0200 Norbert Schlia * Reduce log level for some chatty log entries 980515cf / Sun, 19 May 2019 18:27:30 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 b9105dc9 / Sun, 19 May 2019 18:26:54 +0200 Norbert Schlia * Issue #28: Video detection did not work as expected: images were treated like motion videos 8c279572 / Sun, 19 May 2019 14:10:17 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 2c086fa4 / Sun, 19 May 2019 14:03:31 +0200 Norbert Schlia * Updated NEWS 14466440 / Sun, 19 May 2019 14:02:14 +0200 Norbert Schlia * Updated NEWS 35cce9ee / Fri, 17 May 2019 21:03:42 +0200 Norbert Schlia * Fix handling of regular files bdaef56d / Fri, 17 May 2019 19:32:02 +0200 Norbert Schlia * Predict file size of image frames as max. possible (uncompressed) size b818dd40 / Fri, 17 May 2019 19:31:03 +0200 Norbert Schlia * Revert change to log level: should be debug d0b5b855 / Fri, 17 May 2019 19:30:28 +0200 Norbert Schlia * Format c96ebdfb / Fri, 17 May 2019 19:24:42 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 2f521ea7 / Fri, 17 May 2019 19:19:56 +0200 Norbert Schlia * Better logging 4a700d0c / Fri, 17 May 2019 19:18:46 +0200 Norbert Schlia * Use structured exceptions for error handling 49948101 / Thu, 16 May 2019 19:45:06 +0200 Norbert Schlia * Issue #26: enable direct access like cp /path/file.png . 363e6111 / Wed, 15 May 2019 22:11:10 +0200 Norbert Schlia * Suppress 'Pre-buffer limit reached' message if pre-buffering is off 10aba06d / Wed, 15 May 2019 22:09:01 +0200 Norbert Schlia * Issue #26: seek requests were sent to wrong decoder thread 95eb2d43 / Wed, 15 May 2019 22:03:21 +0200 Norbert Schlia * Report seek errors and some internal errors 32a1745f / Wed, 15 May 2019 22:02:23 +0200 Norbert Schlia * Reformat 85b95728 / Wed, 15 May 2019 18:36:42 +0200 Norbert Schlia * Fix crash when recoding to frames b031a928 / Wed, 15 May 2019 18:34:07 +0200 Norbert Schlia * Reformat ecbdfe7f / Wed, 15 May 2019 18:32:49 +0200 Norbert Schlia * Better variable name 3656463d / Wed, 15 May 2019 18:32:13 +0200 Norbert Schlia * Optimise frame seek: ignore seek if less than 25 frames ahead (keep decoding until the frame comes by itself) 1158f24d / Wed, 15 May 2019 18:30:13 +0200 Norbert Schlia * Should store last written frame when actually written 969ae920 / Wed, 15 May 2019 18:27:36 +0200 Norbert Schlia * Secure access to seek FIFO with mutex d25621cd / Wed, 15 May 2019 18:24:12 +0200 Norbert Schlia * m_current_pts is better name m_current_write_pts 9b306187 / Tue, 14 May 2019 19:49:16 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 21dc8d26 / Tue, 14 May 2019 19:45:00 +0200 Norbert Schlia * Revamped locking scheme beb83784 / Mon, 13 May 2019 21:07:10 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 ae3dcbd6 / Mon, 13 May 2019 21:04:42 +0200 Norbert Schlia * Issue #26: handle videos with b/p-frames/direct positioning to any frame b8fc9061 / Mon, 13 May 2019 20:29:32 +0200 Norbert Schlia * Also create mp4 test files 77e05450 / Mon, 13 May 2019 20:25:18 +0200 Norbert Schlia * Enable flush_frames tak use flush packets or null 4328b66b / Sun, 5 May 2019 18:28:58 +0200 Norbert Schlia * Remove debug printf 0a6fbb19 / Sun, 5 May 2019 18:11:28 +0200 Norbert Schlia * Merge branch 'FB_issue_#26' of https://github.com/nschlia/ffmpegfs into FB_issue_#26 050c89e5 / Sun, 5 May 2019 18:10:59 +0200 Norbert Schlia * Cleanup d0de5740 / Sun, 5 May 2019 13:44:00 +0200 Norbert Schlia * Update NEWS ec759eec / Sun, 5 May 2019 13:41:30 +0200 Norbert Schlia * Issue #25: enable recode to same format 4da7e769 / Sun, 5 May 2019 08:47:38 +0200 Norbert Schlia * Reduced prescan buffer to 3 frames. 95724492 / Sun, 5 May 2019 08:46:29 +0200 Norbert Schlia * Enable profile guided optimisation c87de86a / Sun, 5 May 2019 07:47:47 +0200 Norbert Schlia * Issue #26: Enhanced frame caching strategy, do not encode existing frames over 2071eb67 / Sun, 5 May 2019 07:45:18 +0200 Norbert Schlia * Fix function names 1241aae1 / Sat, 4 May 2019 17:25:43 +0200 Norbert Schlia * Track current PTS 96f994d0 / Sat, 4 May 2019 17:23:50 +0200 Norbert Schlia * Refactoring 298dca6b / Sat, 4 May 2019 17:19:45 +0200 Norbert Schlia * Also remove index file if present 1bff6c94 / Sat, 4 May 2019 17:19:09 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 aec2490f / Sat, 4 May 2019 17:14:15 +0200 Norbert Schlia * Update docs 7d948414 / Sat, 4 May 2019 17:13:36 +0200 Norbert Schlia * Change error handling to use structured exceptions cb71c6f5 / Fri, 3 May 2019 21:51:57 +0200 Norbert Schlia * Reformat 06714aa5 / Fri, 3 May 2019 21:49:35 +0200 Norbert Schlia * Also truncate index file when clear is called 47419c21 / Fri, 3 May 2019 21:47:27 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 17e4643d / Fri, 3 May 2019 21:46:32 +0200 Norbert Schlia * Documentation 2c199d0e / Fri, 3 May 2019 19:49:42 +0200 Norbert Schlia * Issue #26: Test file creator 999071c2 / Fri, 3 May 2019 19:48:34 +0200 Norbert Schlia * Issue #26: Add random access capability ff3e2dc5 / Fri, 3 May 2019 19:19:13 +0200 Norbert Schlia * Fix some variable names 49992219 / Fri, 3 May 2019 19:12:38 +0200 Norbert Schlia * Fix some variable names 3a5660dd / Fri, 3 May 2019 06:46:27 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 dec26e33 / Fri, 3 May 2019 06:45:25 +0200 Norbert Schlia * Just changed variable names to fit style guid 98677b8c / Fri, 3 May 2019 06:43:09 +0200 Norbert Schlia * Corrected variable type d9a199ed / Mon, 29 Apr 2019 20:33:31 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 1fd168b4 / Mon, 29 Apr 2019 20:32:22 +0200 Norbert Schlia * Update logging 8ff2f799 / Mon, 29 Apr 2019 20:32:06 +0200 Norbert Schlia * Fix documentation fc4ea728 / Sat, 27 Apr 2019 15:00:51 +0200 Norbert Schlia * Refactoring 5e55ae28 / Sat, 27 Apr 2019 14:55:29 +0200 Norbert Schlia * Refactoring 0ce9aa8e / Sat, 27 Apr 2019 14:45:40 +0200 Norbert Schlia * This will become release 2.0 in the future, so we start counting at V1.95 from now on dd86f429 / Sat, 27 Apr 2019 14:43:40 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 caf16678 / Sat, 27 Apr 2019 14:43:20 +0200 Norbert Schlia * Revert change to demuxer, did remove audio from DVDs 10d6ea7d / Sat, 27 Apr 2019 14:42:46 +0200 Norbert Schlia * Change error handling 13ce1575 / Sat, 27 Apr 2019 14:41:38 +0200 Norbert Schlia * Fix typos 580a3ff5 / Wed, 24 Apr 2019 16:31:30 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 d3c762a4 / Wed, 24 Apr 2019 16:30:15 +0200 Norbert Schlia * Code cleanup 43712fce / Wed, 24 Apr 2019 16:28:59 +0200 Norbert Schlia * Removed the check for invalid chapters - did not work as expected 3225408e / Wed, 24 Apr 2019 16:28:13 +0200 Norbert Schlia * Wrong bitrate for PAL (was 30 fps instead of 25 fps) and assume PAL if bits are invalid. 1d692944 / Wed, 24 Apr 2019 16:27:28 +0200 Norbert Schlia * Handle these PS IDs though one case 29d7fb5a / Wed, 24 Apr 2019 16:26:10 +0200 Norbert Schlia * Update NEWS with latest fixes e160b4fd / Mon, 22 Apr 2019 07:01:32 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 fe787605 / Mon, 22 Apr 2019 06:52:40 +0200 Norbert Schlia * Remove buffer class from allco function, should not be allocated here 7e601095 / Mon, 22 Apr 2019 06:51:35 +0200 Norbert Schlia * Error handling: Also print error number c51751ac / Thu, 18 Apr 2019 21:53:48 +0200 Norbert Schlia * oMerge remote-tracking branch 'origin/master' into FB_issue_#26 22a0af3c / Thu, 18 Apr 2019 21:53:31 +0200 Norbert Schlia * Refactoring 23dfe297 / Thu, 18 Apr 2019 16:40:40 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 f202338c / Thu, 18 Apr 2019 16:06:47 +0200 Norbert Schlia * Update documentation/comments Fix crashes d8ca0034 / Thu, 18 Apr 2019 14:47:16 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 f79033e0 / Thu, 18 Apr 2019 14:45:43 +0200 Norbert Schlia * Fix crashes b745a310 / Sun, 31 Mar 2019 17:50:59 +0200 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 2fd12121 / Sun, 31 Mar 2019 17:46:22 +0200 Norbert Schlia * Conversion did not work properly if input path was a symbolic link d33cb4e8 / Sun, 31 Mar 2019 17:45:35 +0200 Norbert Schlia * Error logging for scandir went to stderr instead of logging facility 4f97b174 / Wed, 27 Mar 2019 08:23:48 +0100 Norbert Schlia * Docs 42e58ddc / Tue, 26 Mar 2019 19:33:52 +0100 Norbert Schlia * Update frame image size fe68fde1 / Tue, 26 Mar 2019 18:43:30 +0100 Norbert Schlia * Change FFmpeg_Transcoder::encode_image_frame to new avcodec_send_frame interface 88f7e610 / Tue, 26 Mar 2019 18:42:00 +0100 Norbert Schlia * Change FFmpeg_Transcoder::encode_video_frame error handling to structured exceptions 4c2f2937 / Tue, 26 Mar 2019 18:34:53 +0100 Norbert Schlia * Refactoring + clean up 617971bd / Tue, 26 Mar 2019 18:22:36 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 c39db563 / Tue, 26 Mar 2019 18:17:17 +0100 Norbert Schlia * Update doxygen 4ce6ea73 / Mon, 25 Mar 2019 09:08:46 +0100 Norbert Schlia * pts time base conversion had vanished but is very necessary, Readded e888d0f0 / Mon, 25 Mar 2019 09:08:04 +0100 Norbert Schlia * get_is_vcd() is actually get_is_svcd() + Documentation update f8d97df1 / Mon, 25 Mar 2019 06:10:30 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 8619c856 / Mon, 25 Mar 2019 06:10:13 +0100 Norbert Schlia * Now finally really clean up everything wit make wipe-all 3112c355 / Sun, 24 Mar 2019 17:44:30 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 48d95beb / Sun, 24 Mar 2019 17:44:18 +0100 Norbert Schlia * Change thread data allocation to new operator 3e0bc5f8 / Sun, 24 Mar 2019 17:43:31 +0100 Norbert Schlia * Cache read log entry should have trace level 963c3c70 / Sun, 24 Mar 2019 17:36:46 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 730e3479 / Sun, 24 Mar 2019 17:36:31 +0100 Norbert Schlia * Added make wipe-all to really clean everything fe3535e1 / Sun, 24 Mar 2019 12:04:26 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 1f7148e8 / Sun, 24 Mar 2019 12:03:13 +0100 Norbert Schlia * Do not add libavresample if libswresample is present 9cfaab82 / Sun, 24 Mar 2019 08:40:02 +0100 Norbert Schlia * Remove dependency on unused libdvdnav edd1feaf / Sat, 23 Mar 2019 23:42:13 +0100 Norbert Schlia * Fix typo 32d30eff / Sat, 23 Mar 2019 23:35:18 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 2391b07f / Sat, 23 Mar 2019 23:34:59 +0100 Norbert Schlia * Oops, cleaned up a bit too much 47dd6a57 / Sat, 23 Mar 2019 23:23:38 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 9f7a129d / Sat, 23 Mar 2019 23:21:06 +0100 Norbert Schlia * Make distclean really clean up everything 430c2554 / Sat, 23 Mar 2019 13:52:53 +0100 Norbert Schlia * Add latest features and fixes 2455bf56 / Sat, 23 Mar 2019 13:51:41 +0100 Norbert Schlia * Add latest features and fixes 1cb32731 / Sat, 23 Mar 2019 13:46:02 +0100 Norbert Schlia * Docs should mention this versio - V1.9 7b833c10 / Sat, 23 Mar 2019 13:41:17 +0100 Norbert Schlia * calculated predicted size only once d65db17f / Sat, 23 Mar 2019 13:39:40 +0100 Norbert Schlia * Fix deinterlacer: worked on YUV videos only 97489ab5 / Sat, 23 Mar 2019 13:34:31 +0100 Norbert Schlia * Remove debug log entry abe317d4 / Sat, 23 Mar 2019 11:05:49 +0100 Norbert Schlia * Issue #25: added --recodesame option 112818fc / Sat, 23 Mar 2019 09:27:17 +0100 Norbert Schlia * Fix deinterlace filter 57e88ace / Fri, 22 Mar 2019 21:10:32 +0100 Norbert Schlia * Remove debug output 87e7fd3c / Fri, 22 Mar 2019 21:09:41 +0100 Norbert Schlia * Reformat 7fe661e2 / Fri, 22 Mar 2019 21:08:39 +0100 Norbert Schlia * Implement rescaling, deinterlacing and pixel format conversion e469d723 / Fri, 22 Mar 2019 21:06:39 +0100 Norbert Schlia * Change cache size to 20 MB per image 23d6347b / Wed, 20 Mar 2019 11:50:54 +0100 Norbert Schlia * Issue #26: Implement frame images export 55ae2cca / Wed, 20 Mar 2019 11:43:12 +0100 Norbert Schlia * Add list of current todos 562d7e67 / Wed, 20 Mar 2019 11:41:24 +0100 Norbert Schlia * Update news 683c9bc8 / Wed, 20 Mar 2019 11:34:41 +0100 Norbert Schlia * Revamped documentation 9df664cb / Wed, 20 Mar 2019 11:34:26 +0100 Norbert Schlia * Bring NEWS to latest 4335bd2a / Wed, 20 Mar 2019 11:34:06 +0100 Norbert Schlia * Remove superfluous includes e5186dce / Wed, 20 Mar 2019 11:30:07 +0100 Norbert Schlia * Fix memory checks cededc54 / Wed, 20 Mar 2019 11:21:44 +0100 Norbert Schlia * Fix make clean d3763558 / Mon, 18 Mar 2019 09:25:04 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 a1f72285 / Mon, 18 Mar 2019 09:24:20 +0100 Norbert Schlia * Doxygen documation update f0ac53df / Sun, 17 Mar 2019 11:44:39 +0100 Norbert Schlia * Merge remote-tracking branch 'origin/master' into FB_issue_#26 6ae37244 / Sun, 17 Mar 2019 11:39:05 +0100 Norbert Schlia * Properly sanitise file names 68751466 / Sun, 17 Mar 2019 08:50:03 +0100 Norbert Schlia * Fix duplicate text in log entry 7fca3d6e / Sun, 17 Mar 2019 08:49:06 +0100 Norbert Schlia * Coding style 9b2cf0ac / Sun, 17 Mar 2019 08:47:00 +0100 Norbert Schlia * Added remove_sep and remove_ext utils be2cf2b7 / Sun, 17 Mar 2019 08:40:50 +0100 Norbert Schlia * Updated Doxygen comments for typedefs ae8b62c3 / Tue, 12 Mar 2019 19:19:41 +0100 Norbert Schlia * This will be release 1.9 b9782f4b / Tue, 12 Mar 2019 19:14:17 +0100 Norbert Schlia * Refactoring fdfb1bfe / Tue, 12 Mar 2019 19:11:25 +0100 Norbert Schlia * Comments updated e64014f4 / Sat, 9 Mar 2019 23:30:04 +0100 Norbert Schlia * ffmpegfs_readdir() should use translated name 22f69b2a / Sat, 9 Mar 2019 20:02:02 +0100 Norbert Schlia * Wrong error check 25591ce2 / Sat, 9 Mar 2019 19:49:25 +0100 Norbert Schlia * Add static stuff to documentation. ffbce6ad / Sat, 9 Mar 2019 14:55:29 +0100 Norbert Schlia * Fix ffmpeg_rescale() 2c3a21d5 / Sat, 9 Mar 2019 14:54:45 +0100 Norbert Schlia * Refactoring bddb64bc / Sat, 9 Mar 2019 14:49:02 +0100 Norbert Schlia * Add get_disk_path() access helper e3a20801 / Fri, 8 Mar 2019 22:46:22 +0100 Norbert Schlia * Reformat code 67888b06 / Fri, 8 Mar 2019 22:25:29 +0100 Norbert Schlia * Reformat code 7bf07cb5 / Fri, 8 Mar 2019 22:21:45 +0100 Norbert Schlia * Close out non-libav code 27883f1b / Fri, 8 Mar 2019 22:19:08 +0100 Norbert Schlia * Add version to doxygen 509bd19f / Fri, 8 Mar 2019 22:18:28 +0100 Norbert Schlia * Fix make dist: checks did not work de109d03 / Fri, 8 Mar 2019 22:16:20 +0100 Norbert Schlia * Update ignore c98ff03f / Wed, 27 Feb 2019 06:51:51 +0100 Norbert Schlia * Readd helper script c5a5e202 / Wed, 27 Feb 2019 06:50:30 +0100 Norbert Schlia * Remove internal script 66446215 / Tue, 26 Feb 2019 19:11:57 +0100 Norbert Schlia * Add Doxygen documentation 842f2eb5 / Tue, 26 Feb 2019 18:37:21 +0100 Norbert Schlia * Prepare release 1.7 cd2a6cf5 / Tue, 26 Feb 2019 07:25:13 +0100 Norbert Schlia * Revert change for >DST generation which did not work... 0f3d8eb4 / Mon, 25 Feb 2019 22:10:56 +0100 Norbert Schlia * Fix image link 4f141fb5 / Mon, 25 Feb 2019 21:59:07 +0100 Norbert Schlia * Remove circular link bbd22683 / Mon, 25 Feb 2019 21:58:24 +0100 Norbert Schlia * Reformat dd7213a9 / Mon, 25 Feb 2019 21:57:49 +0100 Norbert Schlia * Completed win_smb_fix feature b58d5da5 / Mon, 25 Feb 2019 21:52:34 +0100 Norbert Schlia * Add min_dvd_chapter_duration parameter 03d1a490 / Mon, 25 Feb 2019 18:24:18 +0100 Norbert Schlia * Add 5% overhead to both WebM codecs (files were too small) c4894217 / Mon, 25 Feb 2019 18:23:14 +0100 Norbert Schlia * User real extension accessor to create target filename 310be52e / Mon, 25 Feb 2019 18:22:38 +0100 Norbert Schlia * Remove circular link d49cd807 / Mon, 25 Feb 2019 18:22:11 +0100 Norbert Schlia * Fix typo 0ae5d9bb / Mon, 25 Feb 2019 18:21:50 +0100 Norbert Schlia * Fix coding standards d7feb040 / Sun, 24 Feb 2019 16:56:10 +0100 Norbert Schlia * Fix numeric overflow in size calculation 519d53c0 / Sun, 24 Feb 2019 16:52:55 +0100 Norbert Schlia * More detailed logging of predicted transcoded size fbbf331d / Sun, 24 Feb 2019 16:51:34 +0100 Norbert Schlia * Declare parameters const as appropriate c3d15242 / Sun, 24 Feb 2019 16:47:39 +0100 Norbert Schlia * Coding conventions 684e4819 / Sun, 24 Feb 2019 16:47:07 +0100 Norbert Schlia * Formatting 8db22eb5 / Sun, 24 Feb 2019 16:37:32 +0100 Norbert Schlia * Remove unused member variable 9065213c / Sun, 24 Feb 2019 16:36:21 +0100 Norbert Schlia * Corrected variable name 2478d44c / Fri, 22 Feb 2019 17:22:21 +0100 Norbert Schlia * Change playtime calculations to int64 operations 92740793 / Fri, 22 Feb 2019 12:58:24 +0100 Norbert Schlia * Use AVRational for frame rates instead of double/refactoring 136bfe3d / Mon, 18 Feb 2019 22:34:04 +0100 Norbert Schlia * Fixed warnings e09b9c3d / Mon, 18 Feb 2019 20:20:14 +0100 Norbert Schlia * Enhanced warning level 2aa1c1f4 / Sun, 17 Feb 2019 18:50:56 +0100 Norbert Schlia * Revamped code to avoid as many casts as possible Enhanced win_smb_fix=1 functionality fc664669 / Wed, 13 Feb 2019 08:46:27 +0100 Norbert Schlia * Refactoring ba9b3c29 / Wed, 13 Feb 2019 08:18:29 +0100 Norbert Schlia * Generate full title for DVD/Bluray/VCD 1750a643 / Mon, 11 Feb 2019 08:28:30 +0100 Norbert Schlia * Refactoring 4d479d7c / Mon, 11 Feb 2019 08:20:58 +0100 Norbert Schlia * Fixed pts/dts generation 3e651767 / Mon, 11 Feb 2019 08:20:31 +0100 Norbert Schlia * Fixed pts/dts generation 6214b8df / Mon, 11 Feb 2019 08:14:00 +0100 Norbert Schlia * Fixed terrible miscalculation of DVD play time + conversion of DVD chapters consisting of more than one cell 95ee4dee / Mon, 11 Feb 2019 08:02:35 +0100 Norbert Schlia * Fix typo 55bf6512 / Mon, 11 Feb 2019 07:58:00 +0100 Norbert Schlia * Fix typos/format 1ccbdf58 / Sat, 9 Feb 2019 22:40:29 +0100 Norbert Schlia * Refactoring 809dccd6 / Sat, 9 Feb 2019 22:26:38 +0100 Norbert Schlia * Build checks now made with gcc 8.2.0 and FFmpeg 4.1 2bd5628b / Sat, 9 Feb 2019 22:26:01 +0100 Norbert Schlia * Add sanity checks c98003f0 / Sat, 9 Feb 2019 22:25:29 +0100 Norbert Schlia * Add start time accessor d2712412 / Sat, 9 Feb 2019 18:51:06 +0100 Norbert Schlia * Fix clang build 0e59e014 / Sat, 9 Feb 2019 15:40:22 +0100 Norbert Schlia * Fix checks for FFmpeg 4.x + 3cc691dc / Sat, 9 Feb 2019 15:39:58 +0100 Norbert Schlia * Jenkins build helper script f7cb5bc3 / Thu, 7 Feb 2019 22:44:41 +0100 Norbert Schlia * Fix error reporting 9aeed2c3 / Thu, 7 Feb 2019 22:44:16 +0100 Norbert Schlia * Cleanup bbfb53dd / Thu, 7 Feb 2019 07:54:18 +0100 Norbert Schlia * Fix naming convention 1154f245 / Wed, 6 Feb 2019 23:28:59 +0100 Norbert Schlia * Refactoring f814884d / Wed, 6 Feb 2019 23:12:42 +0100 Norbert Schlia * Refactoring dd2ee381 / Wed, 6 Feb 2019 23:00:54 +0100 Norbert Schlia * Refactoring a23361b6 / Wed, 6 Feb 2019 22:38:11 +0100 Norbert Schlia * Changed utility function name which was misleading 7c6b5720 / Wed, 6 Feb 2019 22:37:25 +0100 Norbert Schlia * Changed utility function name which was misleading d707e85b / Tue, 5 Feb 2019 16:19:22 +0100 Norbert Schlia * transcoder_cached_filesize() returns bool, not int 0ad8f600 / Tue, 5 Feb 2019 16:16:06 +0100 Norbert Schlia * Cleanup d4049431 / Tue, 5 Feb 2019 16:15:28 +0100 Norbert Schlia * Refactoring and restore private section d463f189 / Tue, 5 Feb 2019 16:14:38 +0100 Norbert Schlia * transcoder_cached_filesize() returns bool, not int 8eb85427 / Tue, 5 Feb 2019 16:13:43 +0100 Norbert Schlia * Reformat log entries c997ecdb / Tue, 5 Feb 2019 16:13:22 +0100 Norbert Schlia * Reformat log entry 4f897f58 / Tue, 5 Feb 2019 16:12:56 +0100 Norbert Schlia * Declare constructors explicit 14053756 / Fri, 1 Feb 2019 20:43:46 +0100 Norbert Schlia * Fix some minor glitches 6667161e / Fri, 1 Feb 2019 15:37:56 +0100 Norbert Schlia * Replace : in bluray title names with -, Windows does not like colons in file names... 43f6cf7a / Fri, 1 Feb 2019 15:37:04 +0100 Norbert Schlia * load_path() should return title count 0c9b63b0 / Fri, 1 Feb 2019 15:36:14 +0100 Norbert Schlia * Update to common coding style 849a08a0 / Tue, 29 Jan 2019 21:53:54 +0100 Norbert Schlia * git embezzled this change so I do not know when or why I made it so here it is now 00f21173 / Tue, 29 Jan 2019 21:50:30 +0100 Norbert Schlia * Change ffmpegfs to FFmpegfs 5e7ea901 / Tue, 29 Jan 2019 21:46:18 +0100 Norbert Schlia * Change ffmpeg to FFmpeg 92db1204 / Tue, 29 Jan 2019 17:48:22 +0100 Norbert Schlia * Mention new make help-pdf and make help-html commands a3617019 / Tue, 29 Jan 2019 17:34:11 +0100 Norbert Schlia * Fix typo 495a5fd9 / Tue, 29 Jan 2019 17:03:01 +0100 Norbert Schlia * Add files missing from ignore ff34ff70 / Tue, 29 Jan 2019 17:02:34 +0100 Norbert Schlia * And yet again fix Libav build 006205ed / Tue, 29 Jan 2019 17:01:45 +0100 Norbert Schlia * Git ignores .gitignore. Funny. 3aadaf62 / Tue, 29 Jan 2019 16:58:39 +0100 Norbert Schlia * git ignores .gitignore - should not been added. dfd215a4 / Tue, 29 Jan 2019 16:58:23 +0100 Norbert Schlia * git ignores .gitignore - should not been added. b6e81230 / Tue, 29 Jan 2019 15:13:54 +0100 Norbert Schlia * Issue #16: allow any codec to be copied if supported by target 6e4ae3c1 / Tue, 29 Jan 2019 15:08:51 +0100 Norbert Schlia * Reformat 747a958f / Mon, 28 Jan 2019 17:02:34 +0100 Norbert Schlia * Drastically improve DVD/Bluray access 94b422cd / Mon, 28 Jan 2019 16:56:07 +0100 Norbert Schlia * Declare some functions only used in one file static 4bc41d6c / Mon, 28 Jan 2019 16:46:49 +0100 Norbert Schlia * Move news entries accidentally added to last release 497117d2 / Mon, 28 Jan 2019 16:45:49 +0100 Norbert Schlia * Overhaul help/manpages 7f16bc04 / Mon, 28 Jan 2019 16:45:22 +0100 Norbert Schlia * Update ignores da125518 / Mon, 28 Jan 2019 16:44:28 +0100 Norbert Schlia * Update ignores 17c591b7 / Mon, 28 Jan 2019 16:40:34 +0100 Norbert Schlia * Enforce all prerequistites 53a9aa5a / Mon, 28 Jan 2019 16:38:58 +0100 Norbert Schlia * Use manoages as single source for help 45392b88 / Mon, 28 Jan 2019 16:34:26 +0100 Norbert Schlia * Musst use sqlite3_free to free memory allocated by sqlite! 046d1d42 / Sun, 27 Jan 2019 16:55:35 +0100 Norbert Schlia * Format 5b2c3620 / Sun, 27 Jan 2019 16:54:30 +0100 Norbert Schlia * Reformat 01248d80 / Fri, 25 Jan 2019 21:01:27 +0100 Norbert Schlia * Display fractional seconds in duration with 3 digits 361f9fdd / Fri, 25 Jan 2019 20:59:56 +0100 Norbert Schlia * Decimal seconds in duration was wrong. Fixed. cbb7809c / Wed, 23 Jan 2019 21:40:51 +0100 Norbert Schlia * Remove chatty log entries adb47ec1 / Wed, 23 Jan 2019 21:40:27 +0100 Norbert Schlia * Remove test log entry 988e0435 / Wed, 23 Jan 2019 21:39:50 +0100 Norbert Schlia * Fix crash when DVD nav packet is missing e2ae6ccc / Wed, 23 Jan 2019 21:38:11 +0100 Norbert Schlia * Fix crash with FFmpeg 2.x 77ef9c45 / Wed, 23 Jan 2019 21:37:53 +0100 Norbert Schlia * Set log level of transcoder close to trace 10b98d23 / Wed, 23 Jan 2019 21:37:11 +0100 Norbert Schlia * Fix crash with FFmpeg 2.x 1cf24684 / Wed, 23 Jan 2019 21:25:44 +0100 Norbert Schlia * Update NEWS e3a794c4 / Wed, 23 Jan 2019 21:21:54 +0100 Norbert Schlia * Update NEWS 6a51b360 / Wed, 23 Jan 2019 21:17:22 +0100 Norbert Schlia * GPF and core dump if not enough disk space to transcode #24 Add 2.5% for overhead to Opus streams 18269ecb / Wed, 23 Jan 2019 20:45:26 +0100 Norbert Schlia * Added comment 9e78161f / Mon, 21 Jan 2019 21:18:43 +0100 Norbert Schlia * Update docs f5786148 / Mon, 21 Jan 2019 21:18:17 +0100 Norbert Schlia * Prepare delete later mechanism for cache entries 4c319ced / Mon, 21 Jan 2019 21:13:22 +0100 Norbert Schlia * Enhance logging 009341b0 / Mon, 21 Jan 2019 21:10:35 +0100 Norbert Schlia * Fix log entry 33d6f19f / Mon, 21 Jan 2019 21:10:04 +0100 Norbert Schlia * Fix trace output of parameters b9553860 / Mon, 21 Jan 2019 21:09:17 +0100 Norbert Schlia * Reformat 512f7ee5 / Mon, 21 Jan 2019 21:07:51 +0100 Norbert Schlia * Reformat 2eb44c22 / Mon, 21 Jan 2019 20:53:21 +0100 Norbert Schlia * Do not report error 0 (success) as error 6576f803 / Mon, 21 Jan 2019 20:52:48 +0100 Norbert Schlia * Fix truncated numeric values in logs 128bce0a / Sat, 19 Jan 2019 23:14:51 +0100 Norbert Schlia * Fix Libav build c997c1fb / Sat, 19 Jan 2019 23:03:05 +0100 Norbert Schlia * Add ffmpeg_profiles.h 7ac6fed9 / Sat, 19 Jan 2019 23:02:17 +0100 Norbert Schlia * Refactoring, move profiles to helper class 23ee7a24 / Sat, 19 Jan 2019 23:01:49 +0100 Norbert Schlia * Reformat d5d18bc7 / Sat, 19 Jan 2019 22:48:23 +0100 Norbert Schlia * Refactoring: move profiles to separate class 74cb4cbd / Sat, 19 Jan 2019 19:06:46 +0100 Norbert Schlia * Remove inofficial Qt project 9554d788 / Fri, 18 Jan 2019 22:57:59 +0100 Norbert Schlia * Typo fixed fa5437e4 / Wed, 16 Jan 2019 20:59:29 +0100 Norbert Schlia * Fix table layout 579a5c51 / Wed, 16 Jan 2019 20:27:48 +0100 Norbert Schlia * Add auto stream copy feature d375b272 / Wed, 16 Jan 2019 20:17:56 +0100 Norbert Schlia * Refactor video/audio info functions b611520d / Wed, 16 Jan 2019 20:12:38 +0100 Norbert Schlia * Fix unit checks for FFmpeg nightly build ea515751 / Wed, 16 Jan 2019 20:10:17 +0100 Norbert Schlia * Enhanced logging e8866071 / Wed, 16 Jan 2019 20:06:58 +0100 Norbert Schlia * Reformat 8e5657fd / Tue, 15 Jan 2019 06:55:46 +0100 Norbert Schlia * Set version to 1.7 5f7f120b / Tue, 15 Jan 2019 06:16:41 +0100 Norbert Schlia * Added links to "see..." e4d0cf55 / Fri, 11 Jan 2019 13:05:51 +0100 Norbert Schlia * Prepare release 1.6 7ef8cde3 / Thu, 10 Jan 2019 21:27:52 +0100 Norbert Schlia * Fix ProRes filename handling 46ac58bd / Thu, 10 Jan 2019 21:26:12 +0100 Norbert Schlia * Fix ProRes filename handling ba292641 / Thu, 10 Jan 2019 21:25:09 +0100 Norbert Schlia * Experimental feature to work around a Windows bug ea03ac11 / Wed, 9 Jan 2019 17:40:30 +0100 Norbert Schlia * Fix build with older FFmpeg version w/o av_log_format_line2 support e588834f / Wed, 9 Jan 2019 17:38:57 +0100 Norbert Schlia * Fix direct access to DVD/VCD/Bluray titles eaf9ad01 / Tue, 8 Jan 2019 23:02:10 +0100 Norbert Schlia * Speed up VCD handling 0d9ab605 / Tue, 8 Jan 2019 19:14:27 +0100 Norbert Schlia * Remove FFmpeg error conversion to errno, did not work as desired on all targets 7dd3e82d / Tue, 8 Jan 2019 19:13:15 +0100 Norbert Schlia * Fix typo in log 8b349703 / Tue, 8 Jan 2019 19:12:53 +0100 Norbert Schlia * Fix Bluray file names 9f4f4638 / Mon, 7 Jan 2019 20:16:47 +0100 Norbert Schlia * Speed up Bluray conversion aaada92a / Mon, 7 Jan 2019 07:23:34 +0100 Norbert Schlia * Update (c) notice to 2019 4b8fce83 / Mon, 7 Jan 2019 05:53:14 +0100 Norbert Schlia * Change log level to info for reading file from cache 1901928f / Mon, 7 Jan 2019 05:51:24 +0100 Norbert Schlia * Add trailing slashes to paths where appropriate 397b85fc / Sun, 6 Jan 2019 20:39:11 +0100 Norbert Schlia * Enhanced logging c1051464 / Sun, 6 Jan 2019 17:15:38 +0100 Norbert Schlia * Add predicted file size to log d5896697 / Sun, 6 Jan 2019 15:05:30 +0100 Norbert Schlia * Refactoring c0296e92 / Sun, 6 Jan 2019 12:58:43 +0100 Norbert Schlia * Add hint for NEWS e6c6ea2c / Sun, 6 Jan 2019 12:57:34 +0100 Norbert Schlia * Fix build w/o DVD/Bluray 73e30233 / Sun, 6 Jan 2019 12:15:20 +0100 Norbert Schlia * Updated NEWS 6f681e9e / Sun, 6 Jan 2019 12:02:55 +0100 Norbert Schlia * Remove duplicated % in logs ba348f43 / Sun, 6 Jan 2019 12:02:05 +0100 Norbert Schlia * Fix EOF detection for Bluray chapters e941437e / Sat, 5 Jan 2019 23:37:05 +0100 Norbert Schlia * Format 564f6813 / Sat, 5 Jan 2019 23:21:23 +0100 Norbert Schlia * Force mpegts format for Bluray to avoid misdetections aca92122 / Sat, 5 Jan 2019 23:20:36 +0100 Norbert Schlia * Format 76f5a1a1 / Sat, 5 Jan 2019 11:48:33 +0100 Norbert Schlia * Provide correct playtime for DVD chapters a032c0d0 / Sat, 5 Jan 2019 11:42:43 +0100 Norbert Schlia * Fix variable name 9d006437 / Wed, 2 Jan 2019 20:19:35 +0100 Norbert Schlia * Fix typo 1ec7bce6 / Wed, 2 Jan 2019 19:59:14 +0100 Norbert Schlia * Added support for DVD angles fd24ddce / Wed, 2 Jan 2019 19:57:27 +0100 Norbert Schlia * Add support for DVD angles 82ea01c3 / Wed, 2 Jan 2019 19:55:06 +0100 Norbert Schlia * When oplocks = no must also set level2 oplocks = no 5be95435 / Wed, 2 Jan 2019 19:52:40 +0100 Norbert Schlia * Formatting 50910506 / Tue, 1 Jan 2019 13:01:27 +0100 Norbert Schlia * Update docs 1ca94286 / Tue, 1 Jan 2019 12:58:17 +0100 Norbert Schlia * Enhanced check for NAV packets. Code nicked from Handbrake (https://github.com/HandBrake/HandBrake/blob/master/libhb/dvd.c) 829a5b0f / Tue, 1 Jan 2019 12:56:00 +0100 Norbert Schlia * Missing file name in logging 88555231 / Tue, 1 Jan 2019 12:54:18 +0100 Norbert Schlia * Fix typo 920e09c6 / Tue, 1 Jan 2019 12:53:51 +0100 Norbert Schlia * Remove fake MOOV atom code, creates invalid files if they are small enough. Does not work as expected. a66d404e / Tue, 1 Jan 2019 12:53:16 +0100 Norbert Schlia * Reformat c057390d / Tue, 1 Jan 2019 12:44:33 +0100 Norbert Schlia * Enable additional optimisations for WebM (VP9) 013243a8 / Tue, 1 Jan 2019 12:43:06 +0100 Norbert Schlia * Force mpeg codec for DVDs to avoid misdetections like for Woodstock Director's Cut Disk 2 chapter 22 c40f5f68 / Tue, 1 Jan 2019 12:41:10 +0100 Norbert Schlia * Remove fake MOOV atom code, creates invalid files if they are small enough. Does not work as expected. ed37a38d / Mon, 31 Dec 2018 15:11:22 +0100 nschlia * Issue #22: add section to README.md 80d5e135 / Sat, 29 Dec 2018 18:46:55 +0100 Norbert Schlia * Update logging output 651ba564 / Sat, 29 Dec 2018 18:45:40 +0100 Norbert Schlia * Fix warnings 0076c17f / Sat, 29 Dec 2018 18:43:50 +0100 Norbert Schlia * Fix warnings/Fix unit checks b7c4bafb / Sat, 29 Dec 2018 18:41:20 +0100 Norbert Schlia * Reduced some log levels to reduce logging verbosity bfa98b01 / Sat, 29 Dec 2018 18:39:57 +0100 Norbert Schlia * Reformat 7ed89232 / Wed, 26 Dec 2018 09:17:12 +0100 Norbert Schlia * Issue #23: update trouble shooting paragraph and NEWS 1013a7e2 / Wed, 26 Dec 2018 09:06:32 +0100 Norbert Schlia * Issue #23: do not block open when read waits for data a8984f15 / Wed, 26 Dec 2018 09:02:41 +0100 Norbert Schlia * Properly honour client exit (end wait for data) 5c56cebe / Mon, 24 Dec 2018 14:45:34 +0100 Norbert Schlia * Add extra SIGINT handler to catch interrupts even if transcoder is busy fbf0926a / Mon, 24 Dec 2018 14:44:22 +0100 Norbert Schlia * Log format c71a69db / Mon, 24 Dec 2018 14:09:52 +0100 Norbert Schlia * Fix typo a89a24e3 / Sun, 23 Dec 2018 14:06:34 +0100 Norbert Schlia * Fix warning 5cfc9107 / Sun, 23 Dec 2018 14:05:18 +0100 Norbert Schlia * Add extra SIGINT handler to catch interrupts even if transcoder is busy 931d2e9b / Sun, 23 Dec 2018 14:03:37 +0100 Norbert Schlia * Fix warnings be42b335 / Fri, 21 Dec 2018 20:24:28 +0100 Norbert Schlia * Fix warnings 276ad1f3 / Fri, 21 Dec 2018 20:20:53 +0100 Norbert Schlia * Correct logging 39031254 / Fri, 21 Dec 2018 20:19:39 +0100 Norbert Schlia * Correct default values b88d5822 / Fri, 21 Dec 2018 20:19:20 +0100 Norbert Schlia * Fix unit tests 27795ca2 / Fri, 21 Dec 2018 20:18:50 +0100 Norbert Schlia * Correct default values 5fcf2e19 / Mon, 17 Dec 2018 10:47:23 +0100 Norbert Schlia * Speed up DVD handling ed9d0041 / Mon, 17 Dec 2018 10:32:36 +0100 Norbert Schlia * Update Mp4/MOV/ProRes profiles 46727409 / Mon, 17 Dec 2018 10:27:03 +0100 Norbert Schlia * Changed audio sample rate... should be info, not warning c57679cd / Mon, 17 Dec 2018 10:26:33 +0100 Norbert Schlia * Avoid strange 'Sample rate change drom 48K to 48K' messages a3ba82ff / Mon, 17 Dec 2018 10:26:01 +0100 Norbert Schlia * Update Mp4/MOV/ProRes profiles 4159c004 / Mon, 17 Dec 2018 10:24:19 +0100 Norbert Schlia * Add trace message about cache hits/misses b21b54db / Mon, 17 Dec 2018 10:23:38 +0100 Norbert Schlia * Update Qt Creator project 5e593ace / Mon, 17 Dec 2018 10:21:55 +0100 Norbert Schlia * Speed up MP4 scanning by sending bogus MOOV atom if client accesses file tail immediately d9410579 / Mon, 17 Dec 2018 10:20:49 +0100 Norbert Schlia * reduce warning levels of time out messages 5f532916 / Mon, 17 Dec 2018 10:20:02 +0100 Norbert Schlia * Update .gitignore fba47f80 / Mon, 17 Dec 2018 10:14:30 +0100 Norbert Schlia * Update last cache access time as long as at least one client holds the file open 95993f08 / Fri, 7 Dec 2018 09:14:09 +0100 Norbert Schlia * Refactoring 1989ac2d / Fri, 7 Dec 2018 08:32:38 +0100 Norbert Schlia * Allow open_input_file to be passsed existing virtsual file object 24b2401e / Fri, 7 Dec 2018 08:28:15 +0100 Norbert Schlia * DVD parser: open source file only if necessary ad3697f7 / Fri, 7 Dec 2018 08:27:41 +0100 Norbert Schlia * Code format 1a5450a5 / Fri, 7 Dec 2018 08:26:56 +0100 Norbert Schlia * Cosmetics b94de1a6 / Wed, 5 Dec 2018 15:41:43 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 81393480 / Wed, 5 Dec 2018 15:40:54 +0100 Norbert Schlia * Fix zero sized DVD chapters 5022f455 / Wed, 5 Dec 2018 15:35:59 +0100 Norbert Schlia * Fix warnings f89cfdee / Wed, 5 Dec 2018 15:34:40 +0100 Norbert Schlia * Change time reported by DVD/Bluray/VCD from second to microsecond precision 0ee3a672 / Tue, 4 Dec 2018 18:23:04 +0100 Norbert Schlia * Fix channel layout mismatch for PCM sources ce4324f3 / Tue, 4 Dec 2018 08:49:00 +0100 Norbert Schlia * Reformat variable names to fit into conventions 033dc8aa / Mon, 3 Dec 2018 22:50:58 +0100 Norbert Schlia * Fix some typos in online help also 13bae5da / Mon, 3 Dec 2018 22:20:39 +0100 Norbert Schlia * Merge pull request #21 from lenzj/master b0a498bb / Mon, 3 Dec 2018 21:05:28 +0100 Norbert Schlia * fix hang when getting decode error twice bc5b9800 / Mon, 3 Dec 2018 13:02:33 -0600 Jason Lenz * Fix minor typos in man page 1bb72a15 / Mon, 3 Dec 2018 07:52:09 +0100 Norbert Schlia * How to remove "libbluray-j2se-0.9.3.jar not found." 9d9a38b9 / Sat, 1 Dec 2018 22:11:48 +0100 Norbert Schlia * Reformat 7961be9d / Sat, 1 Dec 2018 22:11:31 +0100 Norbert Schlia * Update NEWS ad630922 / Sat, 1 Dec 2018 11:46:46 +0100 Norbert Schlia * mpeg-4: avoid mismatches between profiles and pixel formats ad17645c / Sat, 1 Dec 2018 11:45:04 +0100 Norbert Schlia * Enhanced logging: allow printf like formats 9283f1b5 / Sat, 1 Dec 2018 10:35:22 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 3acbcff8 / Thu, 29 Nov 2018 08:24:16 +0100 Norbert Schlia * Fix unit tests 1ba2b546 / Thu, 29 Nov 2018 08:23:20 +0100 Norbert Schlia * User codepar instead of deprecated codec for Libav b31c7734 / Thu, 29 Nov 2018 08:18:18 +0100 Norbert Schlia * Properly pass errors to caller process 483a0385 / Thu, 29 Nov 2018 08:17:37 +0100 Norbert Schlia * Properly pass errors to caller process d011f293 / Thu, 29 Nov 2018 08:16:38 +0100 Norbert Schlia * Fix size prediction for mono WAV/AIFF d51d42cb / Thu, 29 Nov 2018 08:16:14 +0100 Norbert Schlia * Reformat 4e918e66 / Thu, 29 Nov 2018 08:13:46 +0100 Norbert Schlia * Remove duplicated log entry f7d333eb / Thu, 29 Nov 2018 08:13:19 +0100 Norbert Schlia * Fix Libav Unit tests b0232ef2 / Wed, 28 Nov 2018 20:50:22 +0100 Norbert Schlia * Fix unit checks 6ff3bbf9 / Wed, 28 Nov 2018 19:50:44 +0100 Norbert Schlia * Fix typo b8bc018a / Wed, 28 Nov 2018 19:50:08 +0100 Norbert Schlia * Avoid creating zero width WebM files (fails to transcode) c85f14e7 / Wed, 28 Nov 2018 19:47:12 +0100 Norbert Schlia * Fix hang of client process because transcoding errors were not repprted correctly. a1ad4adb / Wed, 28 Nov 2018 19:44:34 +0100 Norbert Schlia * Do not uprade mono audio to stereo ff990965 / Wed, 28 Nov 2018 13:58:18 +0100 Norbert Schlia * Update docs f8602c6d / Wed, 28 Nov 2018 13:56:53 +0100 Norbert Schlia * Issue #5: fix synchronisation 96b820a0 / Wed, 28 Nov 2018 13:51:46 +0100 Norbert Schlia * Enhanced logging 9f4ef915 / Wed, 28 Nov 2018 13:50:51 +0100 Norbert Schlia * Changed locking code to c++ 70e7b884 / Tue, 27 Nov 2018 23:26:58 +0100 Norbert Schlia * Yet again fix that tooting Libav support a7bb762a / Tue, 27 Nov 2018 22:52:03 +0100 Norbert Schlia * Updated NEWS 506861a2 / Tue, 27 Nov 2018 22:28:59 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 44751e39 / Tue, 27 Nov 2018 22:26:08 +0100 Norbert Schlia * Refactoring 3247da87 / Tue, 27 Nov 2018 22:25:07 +0100 Norbert Schlia * #20 change audio format conversion when source changes db416be1 / Tue, 27 Nov 2018 22:21:20 +0100 Norbert Schlia * Refactoring 1b32ead3 / Tue, 27 Nov 2018 22:19:08 +0100 Norbert Schlia * Helper functions to get smaple format and channel layout as text ac07c1f1 / Tue, 27 Nov 2018 21:56:40 +0100 Norbert Schlia * Merge aus Main 4e3e33f2 / Tue, 27 Nov 2018 08:44:18 +0100 Norbert Schlia * And yet again trouble with Libav 5234ef54 / Tue, 27 Nov 2018 08:40:40 +0100 Norbert Schlia * Sanitise name 77e3850a / Tue, 27 Nov 2018 08:40:13 +0100 Norbert Schlia * Reformat/Refactoring 2b488290 / Tue, 27 Nov 2018 08:32:02 +0100 Norbert Schlia * ProRes level comamd line option was not used dbcc30cb / Sun, 25 Nov 2018 20:43:25 +0100 Norbert Schlia * Add Funtoo Linux to supported list Reformat variable names 5ddc6cc4 / Sun, 25 Nov 2018 17:08:04 +0000 Norbert Schlia * oMerge branch 'master' of https://github.com/nschlia/ffmpegfs 72fc194d / Sun, 25 Nov 2018 17:00:54 +0000 Norbert Schlia * Fallback to fixed pixel formats did not work c81046e4 / Sun, 25 Nov 2018 16:59:51 +0000 Norbert Schlia * Fix crash when pixel format was AV_PIX_FMT_NONE e415ae79 / Sun, 25 Nov 2018 16:57:01 +0000 Norbert Schlia * Fix crash when no pixel format list is available f0fbaf39 / Sun, 25 Nov 2018 17:44:17 +0100 Norbert Schlia * Update INSTALL.md b72a43dc / Mon, 19 Nov 2018 21:22:21 +0100 Norbert Schlia * Update TODO b1cef38f / Mon, 19 Nov 2018 21:21:10 +0100 Norbert Schlia * Update README.md 8b57adba / Mon, 19 Nov 2018 21:18:45 +0100 Norbert Schlia * Update README.md ec1d50c1 / Mon, 19 Nov 2018 21:16:36 +0100 Norbert Schlia * Docs 2b1699cd / Mon, 19 Nov 2018 20:40:35 +0100 Norbert Schlia * #17: file size prediction for prores 3c4e6f66 / Sun, 18 Nov 2018 21:34:56 +0100 Norbert Schlia * Fix typos 3c156bfc / Sun, 18 Nov 2018 21:33:50 +0100 Norbert Schlia * Fix size output (signed/unsigned int mismatch) 752ed12d / Sat, 17 Nov 2018 22:17:49 +0100 Norbert Schlia * Set Prores profile da19e134 / Sat, 17 Nov 2018 21:44:32 +0100 Norbert Schlia * #17: documentation bda296f6 / Sat, 17 Nov 2018 21:44:02 +0100 Norbert Schlia * #17: add level option for Prores c76b3bd4 / Sat, 17 Nov 2018 21:38:01 +0100 Norbert Schlia * Make all command line parameter values case insensitive 5d7f5635 / Sat, 17 Nov 2018 21:30:55 +0100 Norbert Schlia * Get rid of "using namespace std" commands f70162fa / Thu, 15 Nov 2018 21:42:11 +0100 Norbert Schlia * Fix Libac compa ca01cd69 / Thu, 15 Nov 2018 20:11:12 +0100 Norbert Schlia * Using best match pixel format to avoid conversion losses 7f5c642a / Thu, 15 Nov 2018 07:42:35 +0100 Norbert Schlia * src/vcd/.dirstamp in ignore aeee5bb2 / Thu, 15 Nov 2018 07:37:30 +0100 Norbert Schlia * Updated tests for new MOV/AIFF/Prores Formats afec292e / Thu, 15 Nov 2018 07:36:41 +0100 Norbert Schlia * Added Prores suppurt Added Smart Transcode 7f4fda69 / Thu, 15 Nov 2018 07:26:15 +0100 Norbert Schlia * Updated documetation for new MOV/PRORES/AIFF and Smart Transcode 9cb1b0ac / Tue, 13 Nov 2018 07:45:44 +0100 Norbert Schlia * Fix build 3df29f44 / Tue, 13 Nov 2018 07:38:28 +0100 Norbert Schlia * Format ea78626c / Tue, 13 Nov 2018 07:31:29 +0100 Norbert Schlia * Add support for nigthly builds a0b3f857 / Mon, 12 Nov 2018 14:02:15 +0100 Norbert Schlia * Include new ops/mov/aiff formats in unit tests 8b063bcf / Mon, 12 Nov 2018 13:59:11 +0100 Norbert Schlia * Do lazy unmount to avoid fails e2f738c3 / Fri, 9 Nov 2018 22:51:12 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs Fix several warnings Many C++ changes e3a76a00 / Fri, 9 Nov 2018 22:44:10 +0100 Norbert Schlia * Fix regexp to match tokens at end of line 49a60388 / Fri, 9 Nov 2018 22:40:24 +0100 Norbert Schlia * Change coding to c++ Fix many warnings 9a0c16c2 / Fri, 9 Nov 2018 08:58:33 +0100 Norbert Schlia * Fix several warnings 16bd1a11 / Fri, 9 Nov 2018 08:57:56 +0100 Norbert Schlia * Fix regexp to match at end of line ece8fd24 / Fri, 9 Nov 2018 08:57:04 +0100 Norbert Schlia * Convert even more to C++ 6ffd521a / Thu, 8 Nov 2018 22:02:13 +0100 Norbert Schlia * Converted whole project to C++ now e9716977 / Thu, 8 Nov 2018 21:50:32 +0100 Norbert Schlia * webm suddenly can be smaller bfa199cd / Thu, 8 Nov 2018 21:48:47 +0100 Norbert Schlia * Add MOV/AIFF as feature to documentation f58c911d / Sat, 3 Nov 2018 22:51:48 +0100 Norbert Schlia * Refactorimg f4f892e1 / Sat, 3 Nov 2018 22:49:06 +0100 Norbert Schlia * Issue #15: deinterlace WebM 45c13f90 / Sat, 3 Nov 2018 22:45:10 +0100 Norbert Schlia * Fix some warnings 822eb1bf / Sat, 3 Nov 2018 18:56:27 +0100 Norbert Schlia * Update deprecated fstab entry 4c4936f6 / Sat, 3 Nov 2018 18:50:23 +0100 Norbert Schlia * Issue #13: do not remount diretcory, show correct error message e8df4b26 / Sat, 3 Nov 2018 10:28:47 +0100 Norbert Schlia * Issue #14: Check if run from other process group like mount and if so, inhibit startup message 2afd901c / Sat, 3 Nov 2018 10:27:13 +0100 Norbert Schlia * Maintenanance call was accidentally turned off 47b1ee49 / Fri, 2 Nov 2018 08:42:57 +0100 Norbert Schlia * Fix tiny memory leak in pthread_create/fix some compiler warnings 517ee244 / Fri, 2 Nov 2018 08:41:55 +0100 Norbert Schlia * Include new config.h into QtCreator project bb7c77a1 / Tue, 30 Oct 2018 21:29:40 +0100 Norbert Schlia * Expand paths (~/ etc.) eb9655cf / Tue, 30 Oct 2018 21:08:10 +0100 Norbert Schlia * Separate parameters and runtime values fd1bf0df / Tue, 30 Oct 2018 20:24:37 +0100 Norbert Schlia * Fix warnings 6553cfae / Tue, 30 Oct 2018 17:30:14 +0100 Norbert Schlia * Use config.h for defines 0eb349bb / Tue, 30 Oct 2018 16:42:14 +0100 Norbert Schlia * Fix some compiler warnings 727b59fb / Tue, 30 Oct 2018 16:41:10 +0100 Norbert Schlia * Reformat 2d00cc70 / Tue, 30 Oct 2018 13:40:43 +0100 Norbert Schlia * Fix some compiler warnings 38fa9d24 / Tue, 30 Oct 2018 08:06:12 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 73829979 / Tue, 30 Oct 2018 08:04:18 +0100 Norbert Schlia * fix memory leaks #12 8059c8f2 / Tue, 30 Oct 2018 08:03:05 +0100 Norbert Schlia * fix warning 9875add0 / Tue, 30 Oct 2018 08:02:35 +0100 Norbert Schlia * coding conventions b9641700 / Tue, 30 Oct 2018 08:02:10 +0100 Norbert Schlia * fix 'designated initializers are a C99 feature' 23fe9e48 / Tue, 30 Oct 2018 08:01:18 +0100 Norbert Schlia * #pragma pack(1) needs to be reset da783855 / Tue, 30 Oct 2018 08:00:26 +0100 Norbert Schlia * Change NULL to nullptr where appropriate cfeccf3a / Mon, 29 Oct 2018 20:17:08 +0100 Norbert Schlia * Add Opus to output list bc45fcd1 / Mon, 29 Oct 2018 18:27:47 +0100 Norbert Schlia * Merge pull request #11 from HetareKaiser/overlap-requirement 04f4a3f2 / Mon, 29 Oct 2018 18:10:31 +0100 Norbert Schlia * Checked wrong library version b6ea8eea / Mon, 29 Oct 2018 18:05:03 +0100 Norbert Schlia * Merge pull request #10 from HetareKaiser/opus 7248fdee / Sun, 28 Oct 2018 18:10:20 +0100 Hakim Boukellif * Destination type codecs are now stored so that they don't need to be re-obtained multiple times per file. 0422eb29 / Sun, 28 Oct 2018 15:37:25 +0100 Hakim Boukellif * Only files that have overlapping media types with the destination type are now transcoded, preventing, for example, attempts at transcoding JPG files to MP3. a172e561 / Mon, 27 Aug 2018 15:30:37 +0200 Hakim Boukellif * Added OPUS support. 1db659cf / Mon, 10 Sep 2018 07:58:42 +0200 nschlia * Fix typos b3c513e7 / Mon, 10 Sep 2018 07:58:29 +0200 nschlia * Move FFmpeg version compatibility to separate file 77a975e2 / Fri, 13 Jul 2018 11:23:13 +0200 Norbert Schlia * Update docs f762da63 / Fri, 13 Jul 2018 11:12:39 +0200 Norbert Schlia * Update usage 06c8cf9f / Fri, 13 Jul 2018 11:00:57 +0200 Norbert Schlia * Update info 226bcd1e / Mon, 11 Jun 2018 21:28:45 +0200 Norbert Schlia * Issue #9: add MOV and AIFF targets 371c83a0 / Sun, 10 Jun 2018 22:46:19 +0200 Norbert Schlia * Wrong release date d0c0cbfe / Sun, 10 Jun 2018 22:42:46 +0200 Norbert Schlia * Fix suspend/decoding timeouts did not work 308119d0 / Fri, 8 Jun 2018 22:20:20 +0200 Norbert Schlia * Start release 1.6 71f96033 / Fri, 8 Jun 2018 21:55:02 +0200 Norbert Schlia * Prepare release 1.5 d552194c / Fri, 8 Jun 2018 20:37:03 +0200 Norbert Schlia * Remove avformat_init_output call 40497928 / Fri, 8 Jun 2018 18:31:38 +0200 nschlia * Input format check is now done by FFmpeg (transcode all input formats supported by FFmpeg) ee956ee2 / Thu, 7 Jun 2018 23:15:21 +0200 Norbert Schlia * Fix problems with SAR for WebM target 8caf2c75 / Thu, 7 Jun 2018 23:11:27 +0200 Norbert Schlia * Refactoring 6a2c8453 / Thu, 7 Jun 2018 23:03:42 +0200 Norbert Schlia * Update TODO with feature requests 8975ee0d / Tue, 5 Jun 2018 07:06:05 +0200 Norbert Schlia * Cleanup aedf7e10 / Tue, 5 Jun 2018 07:04:28 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 10231960 / Tue, 5 Jun 2018 07:04:21 +0200 Norbert Schlia * Compatibility to older FFmpeg API 0e7ff532 / Tue, 5 Jun 2018 07:02:24 +0200 Norbert Schlia * Also so aspect ratio in stream 926a1376 / Tue, 5 Jun 2018 07:02:00 +0200 Norbert Schlia * WebM size check can differ a lot 9c22d479 / Tue, 5 Jun 2018 07:01:14 +0200 Norbert Schlia * Cleanup 95ffb236 / Mon, 4 Jun 2018 12:07:42 +0200 Norbert Schlia * Compatibility to older FFmpeg versions da14c777 / Sun, 3 Jun 2018 19:59:50 +0200 Norbert Schlia * Completely redone tag tests 96ca29a9 / Sun, 3 Jun 2018 19:59:02 +0200 Norbert Schlia * Fix build with, who would have guessed? Libav. b4afc14c / Sun, 3 Jun 2018 19:20:54 +0200 Norbert Schlia * Fix file size in, yes, again, Libav b8ea26b2 / Sun, 3 Jun 2018 19:20:15 +0200 Norbert Schlia * Fix Libav compatibility. Again (yawn), but in Libav 12 aac is still expirimental... 3e4ec4eb / Sun, 3 Jun 2018 00:23:51 +0200 Norbert Schlia * A bit wider range of sizes 16879c14 / Sun, 3 Jun 2018 00:23:23 +0200 Norbert Schlia * Allow older gcc versions e73f22bc / Sun, 3 Jun 2018 00:12:23 +0200 Norbert Schlia * Feature #2345: WebM tags are different for 3.4 4a06a965 / Sat, 2 Jun 2018 21:44:21 +0200 Norbert Schlia * add WebM to checks drop mutagen-inspect 2a816840 / Sat, 2 Jun 2018 14:20:12 +0200 Norbert Schlia * Add WebM output format e87d2338 / Sat, 2 Jun 2018 09:02:51 +0200 Norbert Schlia * cleanup 82820d48 / Fri, 1 Jun 2018 21:34:38 +0200 Norbert Schlia * Remove test code 4bb4b6a7 / Fri, 1 Jun 2018 21:33:54 +0200 Norbert Schlia * Refactoring 0a7b51e4 / Fri, 1 Jun 2018 21:28:46 +0200 Norbert Schlia * Refactoring 63b97c11 / Fri, 1 Jun 2018 19:10:50 +0200 Norbert Schlia * Reformat fad643ef / Fri, 1 Jun 2018 19:09:48 +0200 Norbert Schlia * Need to set time base in codec context as well for some codecs 17bee26e / Thu, 31 May 2018 22:42:53 +0200 Norbert Schlia * Enhanced profiles to be usable for more than MP4 26b1cbd4 / Thu, 31 May 2018 22:39:10 +0200 Norbert Schlia * Log more information if bit/sample rate automatically changed 37dde7ad / Thu, 31 May 2018 22:35:33 +0200 Norbert Schlia * Fix info output of parameters a3e8807e / Thu, 31 May 2018 19:21:55 +0200 Norbert Schlia * Properly catch error formatting input 49b94864 / Thu, 31 May 2018 13:03:15 +0200 Norbert Schlia * heck if sample rate or sample format is supported by audio codec 8fcad96c / Thu, 31 May 2018 13:01:41 +0200 Norbert Schlia * Refactoring 43592f15 / Thu, 31 May 2018 12:59:34 +0200 Norbert Schlia * Fix crash when filename was not set 569e390c / Thu, 31 May 2018 12:58:40 +0200 Norbert Schlia * Add extra logging about in/out format 057021c6 / Thu, 31 May 2018 12:55:40 +0200 Norbert Schlia * Rename ffmpeg_optimisations.cc to ffmpeg_profiles.cc for more common use 2002517c / Wed, 30 May 2018 15:35:33 +0200 Norbert Schlia * Prepare work on V1.5 51be39f7 / Wed, 30 May 2018 14:52:12 +0200 Norbert Schlia * Update README.md c1cad533 / Wed, 30 May 2018 14:44:51 +0200 Norbert Schlia * Release 1.4 6e60e610 / Wed, 30 May 2018 14:36:38 +0200 Norbert Schlia * Release 1.4 9c66ec83 / Mon, 28 May 2018 22:41:22 +0200 Norbert Schlia * Reduce suspend/abort time outs aa7e8108 / Mon, 28 May 2018 18:56:35 +0200 Norbert Schlia * Fix memory leaks f9bf7186 / Mon, 28 May 2018 18:56:05 +0200 Norbert Schlia * Fix crash in newer FFmpeg libraries when input pixel format is not correctly detected 535dcd6b / Mon, 28 May 2018 18:55:00 +0200 Norbert Schlia * Fix Valgrind warning 8c1b597d / Mon, 28 May 2018 08:41:10 +0200 Norbert Schlia * Update info on usage with SAMBA/NFS 467a9002 / Sun, 27 May 2018 08:58:37 +0200 Norbert Schlia * Remove Bluray expiremental state d7a3b3d2 / Sun, 27 May 2018 08:19:53 +0200 Norbert Schlia * Updated the news ff125768 / Sat, 26 May 2018 22:29:10 +0200 Norbert Schlia * "FFmpeg transcode closed" message should have INFO level 213524fd / Sat, 26 May 2018 22:17:37 +0200 Norbert Schlia * Raise level of some log messages e5377dda / Sat, 26 May 2018 22:13:50 +0200 Norbert Schlia * Remove duplicated log entry 9accfe9b / Sat, 26 May 2018 21:52:41 +0200 Norbert Schlia * "Setting threads to auto" is not an error e1789610 / Sat, 26 May 2018 19:14:57 +0200 Norbert Schlia * Bluray now fixed and working! aaf653c9 / Sat, 26 May 2018 19:13:52 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 2b2988fd / Sat, 26 May 2018 19:13:37 +0200 Norbert Schlia * Raise log level of format hints to info bd834eef / Sat, 26 May 2018 19:12:32 +0200 Norbert Schlia * Reactivate scan_all_pmts 4ea64ace / Sat, 26 May 2018 19:12:02 +0200 Norbert Schlia * Allow format_ functions to process AV_NOOPTS 3c40760b / Sat, 26 May 2018 19:08:44 +0200 Norbert Schlia * Fix format of log entry 32a2afb2 / Sat, 26 May 2018 19:08:13 +0200 Norbert Schlia * Log short codec name in most cases to reduce log size 2ac78a31 / Sat, 26 May 2018 16:54:56 +0200 Norbert Schlia * Removed superfluous blanks c4382afa / Sat, 26 May 2018 16:54:04 +0200 Norbert Schlia * Added several missing log entries d4c25301 / Sat, 26 May 2018 16:52:51 +0200 Norbert Schlia * Use central code to store path of real/virtual file 906a004a / Sat, 26 May 2018 16:48:55 +0200 Norbert Schlia * Fix bluray chapter parsing 434360ce / Sat, 26 May 2018 14:35:08 +0200 Norbert Schlia * Notes on bluray 76f03c53 / Sat, 26 May 2018 12:20:34 +0200 Norbert Schlia * Enabling colours in screen log. Annother attempt to make logs readable... 44219308 / Fri, 25 May 2018 18:32:03 +0200 Norbert Schlia * Fix typos/add links 874d1018 / Fri, 25 May 2018 18:27:16 +0200 Norbert Schlia * Implement Bluray support b6ecd663 / Thu, 24 May 2018 20:59:49 +0200 Norbert Schlia * Show info about streams fdaeed19 / Thu, 24 May 2018 19:29:12 +0200 Norbert Schlia * Make logging more readable b0b3fa9d / Wed, 23 May 2018 22:36:34 +0200 Norbert Schlia * Reduce log file size 05f882ab / Wed, 23 May 2018 21:22:02 +0200 Norbert Schlia * Reduce log file size d1d653d6 / Wed, 23 May 2018 21:15:32 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 50f66d5d / Wed, 23 May 2018 20:58:53 +0200 Norbert Schlia * Reduce system calls in seek 0a051ebf / Wed, 23 May 2018 20:58:53 +0200 Norbert Schlia * Reduce system calls in seek f54b0107 / Wed, 23 May 2018 20:58:14 +0200 Norbert Schlia * Reduce log file size 4454d063 / Wed, 23 May 2018 20:52:12 +0200 Norbert Schlia * Make DVD/Video CD filenames shorter 8e121348 / Sun, 20 May 2018 21:18:23 +0200 Norbert Schlia * Reformat 2eae6c9b / Sun, 20 May 2018 20:55:54 +0200 Norbert Schlia * Typo fixed add912e3 / Sun, 20 May 2018 20:52:36 +0200 Norbert Schlia * S/VCD support 0f878b59 / Sun, 20 May 2018 20:39:27 +0200 Norbert Schlia * Format db9c5fd3 / Sun, 20 May 2018 20:36:04 +0200 Norbert Schlia * Add Video CD and Super Video CD support 30e80b5c / Sun, 20 May 2018 20:17:49 +0200 Norbert Schlia * Reformat b4bd68b5 / Sun, 20 May 2018 20:13:55 +0200 Norbert Schlia * Fix charset for back link e793c25c / Sat, 19 May 2018 19:25:24 +0200 Norbert Schlia * Fix typos/add development info 80b39e32 / Sat, 19 May 2018 15:55:30 +0200 Norbert Schlia * Add notice how to activate DVD support 6dc4befc / Sat, 19 May 2018 15:54:25 +0200 Norbert Schlia * Fix tag checks for Libav 12 f88205df / Sat, 19 May 2018 10:33:29 +0200 Norbert Schlia * Reformat code a bit to common style ed48c8e5 / Sat, 19 May 2018 10:27:42 +0200 Norbert Schlia * Virtual files should be writeable (causes problems when copied) 13da84e1 / Sat, 19 May 2018 10:26:59 +0200 Norbert Schlia * Move shareable code to base class cba779ac / Sat, 19 May 2018 10:23:22 +0200 Norbert Schlia * Clean-up f845dd1d / Sat, 19 May 2018 10:20:23 +0200 Norbert Schlia * Add rtrim/ltrim and move to utils 4434485e / Sat, 19 May 2018 10:17:48 +0200 Norbert Schlia * Use one define for both libdvdnav and libdvdread as they are both required 5e3058db / Thu, 17 May 2018 19:25:07 +0200 Norbert Schlia * Now added DVD support! 572f7ef7 / Wed, 16 May 2018 11:23:37 +0200 Norbert Schlia * Virtualise I/O classes 1b74fe60 / Wed, 16 May 2018 11:04:33 +0200 Norbert Schlia * Remove demo code 0f3f793a / Mon, 14 May 2018 20:19:49 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 6d4d7869 / Mon, 14 May 2018 16:46:00 +0200 Norbert Schlia * Make size/audio checks more precise/make tags mor forgiving if having trailing blanks d919aafd / Sun, 13 May 2018 19:36:28 +0200 Norbert Schlia * Fix checks ed3e33ad / Fri, 11 May 2018 18:24:31 +0200 Norbert Schlia * Update install docs ae8d0d5d / Fri, 11 May 2018 18:14:14 +0200 Norbert Schlia * Add hint for bc c038b73e / Fri, 11 May 2018 16:34:34 +0200 Norbert Schlia * Fix all checks 035f8810 / Fri, 11 May 2018 16:25:29 +0200 Norbert Schlia * Do not remove write perms, not one of my brightest ideas 030db480 / Fri, 11 May 2018 16:23:42 +0200 Norbert Schlia * Add missing blank 1ab0c931 / Fri, 11 May 2018 16:23:26 +0200 Norbert Schlia * Remove old comment 65f10246 / Fri, 11 May 2018 16:23:02 +0200 Norbert Schlia * Fix file error when directly accessed (no prior ls) 6404c239 / Fri, 11 May 2018 08:44:52 +0200 Norbert Schlia * Add note on PHP7 woes 85370bd1 / Fri, 11 May 2018 08:44:43 +0200 Norbert Schlia * Add note on PHP7 woes 3395a90b / Fri, 11 May 2018 08:44:19 +0200 Norbert Schlia * Reformat code 6ae111df / Fri, 11 May 2018 07:55:09 +0200 Norbert Schlia * Reformat 93fcbfe8 / Fri, 11 May 2018 07:52:43 +0200 Norbert Schlia * C++: Declare destructors virtual 27c1369b / Fri, 11 May 2018 07:50:26 +0200 Norbert Schlia * Fix PHP5 compatibility Allow non ASCII characters in filenames 56723593 / Tue, 8 May 2018 19:23:32 +0200 Norbert Schlia * Remove "default" sections from case 05149fe9 / Tue, 8 May 2018 19:20:25 +0200 Norbert Schlia * Added --enablescript option that will add virtual index.php to every directory. It reads scripts/videotag.php from the ffmpegs binary directory. This can be very handy to test video playback. Of course, feel free to replace videotag.php with your own script. 9ac6777a / Tue, 8 May 2018 19:05:26 +0200 Norbert Schlia * Update Qt helper 285a0e5b / Tue, 8 May 2018 08:39:32 +0200 Norbert Schlia * comments 433225f2 / Tue, 8 May 2018 08:34:53 +0200 Norbert Schlia * Changed code to C++/comments/format 4685d32b / Tue, 8 May 2018 08:21:04 +0200 Norbert Schlia * Fix formatting of help cd570f26 / Mon, 7 May 2018 19:24:48 +0200 Norbert Schlia * Remove write permission from all output files. Makes no sense. cecac794 / Mon, 7 May 2018 19:23:06 +0200 Norbert Schlia * Fix problems when file accessed directly (no prior ls) f9690027 / Mon, 7 May 2018 16:08:39 +0200 Norbert Schlia * Update documentaion 0c92184e / Mon, 7 May 2018 16:05:53 +0200 Norbert Schlia * Set mp4 profile to high/3.1 to enable plqayback under enable playback under Win 7 201c958b / Mon, 7 May 2018 16:05:02 +0200 Norbert Schlia * move scripts to source directory 1fd07f73 / Mon, 7 May 2018 08:22:47 +0200 Norbert Schlia * Bring installation instructions up tp date 8dc50169 / Sun, 6 May 2018 23:36:06 +0200 Norbert Schlia * Cleanup 34fa0859 / Sun, 6 May 2018 22:07:49 +0200 Norbert Schlia * Code format 503776df / Sun, 6 May 2018 22:06:27 +0200 Norbert Schlia * Change cache maintance to C++ f46d9ef5 / Sun, 6 May 2018 21:23:48 +0200 Norbert Schlia * Refactoring e24ff21f / Sun, 6 May 2018 19:45:30 +0200 Norbert Schlia * Get rid of most ugly gotos 0b7d9e80 / Sun, 6 May 2018 19:22:35 +0200 Norbert Schlia * Fix Libav compatibility 248b5742 / Sun, 6 May 2018 17:12:16 +0200 Norbert Schlia * Change fuse operations to C++ 66dc634e / Sun, 6 May 2018 12:53:00 +0200 Norbert Schlia * Change fuse operations to C++ 052cef4d / Sun, 6 May 2018 08:13:13 +0200 Norbert Schlia * Change fuseops.c to c++ 280e3215 / Sun, 6 May 2018 07:17:22 +0200 Norbert Schlia * Code format ecfb106e / Sun, 6 May 2018 07:16:27 +0200 Norbert Schlia * Refactoring 5c96bcc5 / Sun, 6 May 2018 07:13:50 +0200 Norbert Schlia * Show list of mime types browser can play 84d9a8b6 / Sun, 6 May 2018 07:12:33 +0200 Norbert Schlia * Make script work with Safari d9d0eca7 / Sun, 6 May 2018 07:11:50 +0200 Norbert Schlia * Make script work with IE 11 7e449a0b / Sat, 5 May 2018 16:23:48 +0200 Norbert Schlia * -V option: Print out FFmpeg caps cb24346b / Sat, 5 May 2018 16:11:20 +0200 Norbert Schlia * Report SQLite version f6c6b6a1 / Sat, 5 May 2018 16:10:40 +0200 Norbert Schlia * Deprecate use of av_iformat_next(), av_oformat_next() 16032439 / Sat, 5 May 2018 11:59:11 +0200 Norbert Schlia * Remove unused TYPE_FLAC 849af998 / Sat, 5 May 2018 11:58:44 +0200 Norbert Schlia * Add handling for MPEG-1/2 video e3a92714 / Sat, 5 May 2018 08:06:27 +0200 Norbert Schlia * Update documentation 09cd8829 / Fri, 4 May 2018 21:28:19 +0200 Norbert Schlia * Change version to 1.4 f54bbea1 / Fri, 4 May 2018 21:13:10 +0200 Norbert Schlia * Prepare release 1.3 711d2b50 / Fri, 4 May 2018 21:03:00 +0200 Norbert Schlia * Update documentation bdb31a53 / Fri, 4 May 2018 18:49:59 +0200 Norbert Schlia * Add Chrome + Mathon profiles 1f8a5b49 / Fri, 4 May 2018 13:03:15 +0200 Norbert Schlia * Add profile for Apple Safari bd688032 / Fri, 4 May 2018 08:51:15 +0200 Norbert Schlia * Fix format 82902426 / Fri, 4 May 2018 08:47:33 +0200 Norbert Schlia * Add Apple Safari profile d43385ca / Thu, 3 May 2018 20:31:22 +0200 Norbert Schlia * Cover arts are now supported! e49a120a / Thu, 3 May 2018 19:38:48 +0200 Norbert Schlia * Add MS Internet Explorer profile 1fc4ea3c / Thu, 3 May 2018 12:45:15 +0200 Norbert Schlia * Correct table format 91d1b3ef / Thu, 3 May 2018 12:22:25 +0200 Norbert Schlia * Documention cfb4df65 / Thu, 3 May 2018 09:40:41 +0200 Norbert Schlia * PHP test script 0312250a / Thu, 3 May 2018 09:30:52 +0200 Norbert Schlia * Enable threaded encode bc40b266 / Thu, 3 May 2018 09:30:26 +0200 Norbert Schlia * Make checks work- again f06acd94 / Thu, 3 May 2018 09:29:48 +0200 Norbert Schlia * Renamed --target option to --profile/add codec optimisations 502bd3be / Thu, 3 May 2018 09:00:41 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 1d7394e6 / Thu, 3 May 2018 08:54:11 +0200 Norbert Schlia * Refactoring/code format d87822d3 / Wed, 2 May 2018 20:22:52 +0200 Norbert Schlia * Documentation 305df8b8 / Wed, 2 May 2018 19:59:56 +0200 Norbert Schlia * Firefox and Edge optimisations 5697fd1c / Tue, 1 May 2018 23:07:44 +0200 Norbert Schlia * Documentation formatted e9d21ae3 / Tue, 1 May 2018 23:00:41 +0200 Norbert Schlia * Target browser optimisations for FF and Edge f34e7dd6 / Tue, 1 May 2018 23:00:11 +0200 Norbert Schlia * Target browser optimisations for FF and Edge b5fd1bbc / Tue, 1 May 2018 22:53:11 +0200 Norbert Schlia * Format comments 46974eb5 / Tue, 1 May 2018 22:52:39 +0200 Norbert Schlia * Speed up concurrent directory access 4ea71782 / Tue, 1 May 2018 11:18:06 +0200 Norbert Schlia * Update documention/help 5e8a642f / Tue, 1 May 2018 11:11:08 +0200 Norbert Schlia * Add info 3bc93fe9 / Tue, 1 May 2018 11:07:52 +0200 Norbert Schlia * Descramble obfuscated check suite code b42172df / Tue, 1 May 2018 11:07:00 +0200 Norbert Schlia * Refactor browser optimisations 76545ea7 / Tue, 1 May 2018 11:05:30 +0200 Norbert Schlia * Add mount paths to logging at start up 6d9eb2f2 / Tue, 1 May 2018 11:04:59 +0200 Norbert Schlia * Reformat d047efa0 / Mon, 30 Apr 2018 08:49:01 +0200 Norbert Schlia * Extend optimsations list e2737bce / Mon, 30 Apr 2018 08:47:57 +0200 Norbert Schlia * Fix older ffmpeg compatibility 2f609ea9 / Sun, 29 Apr 2018 21:51:29 +0200 Norbert Schlia * Fix checks for new album art support 968c2f3d / Sun, 29 Apr 2018 21:50:34 +0200 Norbert Schlia * Fix potential crash 8f7638d7 / Sun, 29 Apr 2018 20:54:47 +0200 Norbert Schlia * Forgot to replace test printf 4364ead1 / Sun, 29 Apr 2018 19:18:33 +0200 Norbert Schlia * Copy album arts from source if supported by target format (MP3/4). Use --noalbumarts parameter to disable, e.g., for streaming files. c7d93f23 / Sun, 29 Apr 2018 17:44:09 +0200 Norbert Schlia * Conditional compile rules for FFMpeg version support 41f10686 / Sun, 29 Apr 2018 17:14:50 +0200 Norbert Schlia * More detailed logging 1e6eb11d / Sun, 29 Apr 2018 17:12:58 +0200 Norbert Schlia * get_filetype() did not detect multi extension types ebc98a87 / Sat, 28 Apr 2018 16:01:37 +0200 Norbert Schlia * Qt project update 4ccb44e2 / Sat, 28 Apr 2018 15:59:58 +0200 Norbert Schlia * Error handling/reporting in decoding cd7da20f / Sat, 28 Apr 2018 15:59:08 +0200 Norbert Schlia * Clean-up/renamed functions to coding conventions bd6bd312 / Sat, 28 Apr 2018 15:56:01 +0200 Norbert Schlia * Changed ECANCEL to EIO errorno. Caused havock when accessed via NFS 151307bc / Sat, 28 Apr 2018 15:55:08 +0200 Norbert Schlia * Condensed error messages a bit (readability) 07130d7a / Sat, 28 Apr 2018 15:54:38 +0200 Norbert Schlia * Condensed error messages a bit (readability) 73f46b9e / Sat, 28 Apr 2018 15:52:22 +0200 Norbert Schlia * enhanced error output for SQLite (if supported by library version) fddd021b / Fri, 27 Apr 2018 08:54:56 +0200 Norbert Schlia * Enable target specific optimisations, MS Edge/Internet Explorer currently only. 0bdc55be / Thu, 26 Apr 2018 20:19:29 +0200 Norbert Schlia * Refactoring 1078a087 / Thu, 26 Apr 2018 20:06:37 +0200 Norbert Schlia * Reformat c2337e02 / Thu, 26 Apr 2018 08:14:46 +0200 Norbert Schlia * Update usage information 485026ca / Tue, 24 Apr 2018 07:16:36 +0200 Norbert Schlia * Deprecate avfilter_register_all fdab0ab4 / Tue, 24 Apr 2018 07:14:59 +0200 Norbert Schlia * Add dependency check so that files get re-transcoded when the source file or enconding parameters have changed 8ee3b938 / Tue, 24 Apr 2018 07:13:38 +0200 Norbert Schlia * Add dependency check so that files get re-transcoded when the source file or enconding parameters have changed 66d6979e / Tue, 24 Apr 2018 07:11:23 +0200 Norbert Schlia * Add deinterlacing option: must preserve dts/best effort time stamp 5e4f3929 / Mon, 23 Apr 2018 19:23:59 +0200 Norbert Schlia * Add deinterlacing option bd068fa8 / Mon, 23 Apr 2018 08:22:47 +0200 Norbert Schlia * educe number of includes Include ffmpeg stuff where required only a3aac091 / Sun, 22 Apr 2018 16:40:10 +0200 Norbert Schlia * Refactoring f7d45944 / Sun, 22 Apr 2018 16:14:06 +0200 Norbert Schlia * Reformat 33691d44 / Sun, 22 Apr 2018 16:12:37 +0200 Norbert Schlia * Make logging less chatty 614686bc / Sat, 21 Apr 2018 18:00:03 +0200 Norbert Schlia * Updated a few details c0a51f09 / Fri, 20 Apr 2018 12:18:43 +0200 Norbert Schlia * Update DOCs e88ac8a8 / Fri, 20 Apr 2018 12:17:16 +0200 Norbert Schlia * Reformat code b73bd6d7 / Fri, 20 Apr 2018 12:15:14 +0200 Norbert Schlia * Make logging less chatty f88cafba / Fri, 20 Apr 2018 09:45:26 +0200 Norbert Schlia * Ensure that transcoding errors get passed on to calling process, e.g. cp or rsync. 8b4abc5c / Fri, 20 Apr 2018 09:40:51 +0200 Norbert Schlia * Set busy timeout *BEFORE* changing to WAL mode ab85465b / Thu, 19 Apr 2018 22:24:53 +0200 Norbert Schlia * Refactoring a271cebc / Thu, 19 Apr 2018 22:23:11 +0200 Norbert Schlia * New utility function 28a33271 / Thu, 19 Apr 2018 22:22:08 +0200 Norbert Schlia * Clean up comments 611c8224 / Thu, 19 Apr 2018 22:19:03 +0200 Norbert Schlia * Add missing command line options 530fd2d0 / Thu, 19 Apr 2018 22:17:20 +0200 Norbert Schlia * Ensure a file gets recoded when the last attempt failed. 315d92a0 / Thu, 19 Apr 2018 22:16:38 +0200 Norbert Schlia * Fix logging e6d4e5cc / Wed, 18 Apr 2018 20:05:08 +0200 Norbert Schlia * Enable fpcompare to be compiled with libav 2f7e89c5 / Wed, 18 Apr 2018 19:00:48 +0200 Norbert Schlia * Enable fpcompare to be compiled with libav 11e68bcd / Wed, 18 Apr 2018 09:13:27 +0200 Norbert Schlia * Fix #8: create valid WAV header 9917d15d / Wed, 18 Apr 2018 09:10:40 +0200 Norbert Schlia * Fix #8: create valid WAV header b0c65680 / Tue, 17 Apr 2018 20:01:05 +0200 Norbert Schlia * Add pre-buffer option 54117f2b / Tue, 17 Apr 2018 19:55:44 +0200 Norbert Schlia * Deprecate the libavresample library 8e996ec0 / Tue, 17 Apr 2018 19:48:42 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 0aadeb23 / Tue, 17 Apr 2018 19:46:40 +0200 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 343e9aa5 / Tue, 17 Apr 2018 19:43:43 +0200 Norbert Schlia * Reformat 1e925ad4 / Tue, 17 Apr 2018 19:04:51 +0200 Norbert Schlia * Enhanced logging 92e5c6b0 / Tue, 17 Apr 2018 19:00:04 +0200 Norbert Schlia * Files were truncated (mostly mp3) when cp'ed directly while transcoding. Now files will have the final size as expected. b7c027e5 / Mon, 16 Apr 2018 20:23:44 +0200 Norbert Schlia * Fix deprecation: Enable new audio/video encoding and decoding API with decoupled input/output 96d631e9 / Mon, 16 Apr 2018 08:49:05 +0200 Norbert Schlia * Remove unused variable 760cf9bb / Sun, 15 Apr 2018 06:56:25 +0200 Norbert Schlia * Set stream duration as muxer hint in correct time_base ac658d0a / Sat, 14 Apr 2018 21:01:10 +0200 Norbert Schlia * Fix deprecation: use new audio/video encoding and decoding API (support experimental, please enable if you feel lucky) 6caf9812 / Sat, 14 Apr 2018 13:34:30 +0200 Norbert Schlia * Clean-up 0ecced1f / Fri, 13 Apr 2018 23:01:25 +0200 Norbert Schlia * Refactoring 660f394a / Fri, 13 Apr 2018 23:00:06 +0200 Norbert Schlia * Enhance logging f9f86d9a / Fri, 13 Apr 2018 22:59:09 +0200 Norbert Schlia * Enhance logging e026ae4a / Fri, 13 Apr 2018 22:57:17 +0200 Norbert Schlia * Make logging less chatty fd5bc5c3 / Fri, 13 Apr 2018 22:56:39 +0200 Norbert Schlia * Fix sharing problems with sqlite database when accessed by multiple instances. 27def45b / Thu, 12 Apr 2018 23:52:18 +0200 Norbert Schlia * Disable sqlite locking fix, caused more harm than it helped. Must find another solution. efe566ff / Thu, 12 Apr 2018 22:08:34 +0200 Norbert Schlia * Make WAV size prediction more accurate cd390b3f / Thu, 12 Apr 2018 22:06:17 +0200 Norbert Schlia * Fix mistake in log message 8862d900 / Thu, 12 Apr 2018 22:05:35 +0200 Norbert Schlia * Recode existing cache files if not found in database (handle database inconsistencies). 84e2b1ef / Thu, 12 Apr 2018 22:03:19 +0200 Norbert Schlia * Make WAV size prediction more accurate 3dec3871 / Thu, 12 Apr 2018 20:57:53 +0200 Norbert Schlia * Make WAV size prediction more accurate 15d29699 / Thu, 12 Apr 2018 09:46:47 +0200 Norbert Schlia * Declare local functions static 81b05140 / Thu, 12 Apr 2018 09:45:26 +0200 Norbert Schlia * Enhanced logging output for better readability. 1f0ed413 / Wed, 11 Apr 2018 12:11:42 +0200 Norbert Schlia * Nice debug code b1983752 / Wed, 11 Apr 2018 11:59:42 +0200 Norbert Schlia * Fix crash when video files were transcoded to audio only (e.g. mp3) 59bb3882 / Wed, 11 Apr 2018 11:59:08 +0200 Norbert Schlia * Set stream duration from source file as hint for encoder. 077d32c2 / Wed, 11 Apr 2018 11:56:55 +0200 Norbert Schlia * Fix sharing problems with sqlite database when accessed by multiple instances. f4158834 / Tue, 10 Apr 2018 20:51:46 +0200 Norbert Schlia * Set 25fps as default value if source is missing frame rate information 33b77735 / Tue, 10 Apr 2018 20:46:56 +0200 Norbert Schlia * Remove asserts that have never triggered 3766e10e / Mon, 9 Apr 2018 21:55:23 +0200 Norbert Schlia * Update NEWS/TODO fa9d34af / Mon, 9 Apr 2018 21:27:52 +0200 Norbert Schlia * Update TODO/NEWS 7e77c161 / Mon, 9 Apr 2018 21:24:40 +0200 Norbert Schlia * Fix lost frames at end of files (files where cut short) ff861129 / Mon, 9 Apr 2018 21:22:53 +0200 Norbert Schlia * Refactoring/formatting c021feba / Mon, 9 Apr 2018 21:20:52 +0200 Norbert Schlia * Refactoring 7c6aa2fa / Mon, 9 Apr 2018 12:42:05 +0200 nschlia * Fix many deprecations 366c6389 / Fri, 6 Apr 2018 23:26:07 +0100 Norbert Schlia * OK, seems that AVPackets actually DO need to be decoded in stripes... Reverted commit 784d28184c1facdde58905ff7281437501953cc3 81a3f51a / Fri, 6 Apr 2018 22:49:16 +0100 Norbert Schlia * Report lost frames when files are closed f86ea4ad / Fri, 6 Apr 2018 22:48:25 +0100 Norbert Schlia * Reformat ac006f55 / Fri, 6 Apr 2018 22:46:42 +0100 Norbert Schlia * Seems we need to flush last frames in any case, files got cut at the end... 784d2818 / Fri, 6 Apr 2018 22:46:03 +0100 Norbert Schlia * Packets are always fully decoded, no need to track the size eb81c46f / Fri, 6 Apr 2018 22:45:28 +0100 Norbert Schlia * Clean up bc5487dc / Fri, 6 Apr 2018 22:43:21 +0100 Norbert Schlia * Refactoring: move common functionality to a base class aa2403b7 / Fri, 6 Apr 2018 22:36:52 +0100 Norbert Schlia * Re-enable deprecation warnings so they can be pinpointed *AND FIXED* 389fbf1b / Fri, 6 Apr 2018 22:34:07 +0100 Norbert Schlia * Reformat 96df8bdb / Fri, 6 Apr 2018 22:32:31 +0100 Norbert Schlia * Turn on max. speed otimisation (-Ofast) and all warnings b08b8de3 / Fri, 6 Apr 2018 08:36:24 +0100 Norbert Schlia * Avoid compiler warning/round result ba55992d / Thu, 5 Apr 2018 19:46:18 +0100 Norbert Schlia * Fix deprecated warning for AVFormatContext 'filename' member af640911 / Thu, 5 Apr 2018 19:25:01 +0100 Norbert Schlia * Function should return proper FFmpeg error codes/remove duplicate close call 1ac71cd8 / Thu, 5 Apr 2018 19:23:33 +0100 Norbert Schlia * Function should return proper FFmpeg error codes e7d55636 / Thu, 5 Apr 2018 08:14:43 +0100 Norbert Schlia * Hide annoying warnings in FFmpeg headers 8eebed0c / Thu, 5 Apr 2018 08:04:48 +0100 Norbert Schlia * Renamed transcoder_cache_new/delete to transcoder_init/free, will do more jobs soon c4874df9 / Tue, 3 Apr 2018 20:49:28 +0100 Norbert Schlia * Prepare 1.2 release 1ee163bc / Mon, 2 Apr 2018 22:06:48 +0100 Norbert Schlia * Fix checks. Once more... 9147dd2f / Mon, 2 Apr 2018 22:04:01 +0100 Norbert Schlia * Update NEWS 4b65cab3 / Fri, 30 Mar 2018 22:41:56 +0100 Norbert Schlia * (c) notice 6972408a / Fri, 30 Mar 2018 22:40:56 +0100 Norbert Schlia * Update (c) notice 6496275a / Wed, 28 Mar 2018 20:32:36 +0100 Norbert Schlia * Fix grammatical mistake 97bcdc35 / Wed, 28 Mar 2018 20:31:54 +0100 Norbert Schlia * Corrected Debian 7 info f23b0384 / Wed, 21 Mar 2018 22:29:19 +0100 Norbert Schlia * Issue #5: fix crash in transcoder 4fbcb84b / Wed, 21 Mar 2018 22:21:18 +0100 Norbert Schlia * Issue #5: fix crash in transcoder 845cda14 / Wed, 21 Mar 2018 21:36:33 +0100 Norbert Schlia * Issue #4: create file of correct size 42ca4846 / Wed, 21 Mar 2018 21:34:19 +0100 Norbert Schlia * Change comment style e5ee0208 / Tue, 20 Mar 2018 07:31:31 +0100 Norbert Schlia * Corrected version numbers fa2df414 / Mon, 19 Mar 2018 22:32:10 +0100 Norbert Schlia * Prepare for V1.2 release 74e43ecb / Mon, 19 Mar 2018 22:08:28 +0100 Norbert Schlia * Fix stupid last minute bug (wrong number of arguments in prepared sql) e59b21e7 / Mon, 19 Mar 2018 22:06:14 +0100 Norbert Schlia * Fix stupid last minute bug (wrong number of arguments in prepared sql) 63d23511 / Mon, 19 Mar 2018 21:39:14 +0100 Norbert Schlia * Fix last minute bug (wrong number of arguments in bound sql) 550b1a3a / Mon, 19 Mar 2018 19:04:44 +0100 Norbert Schlia * Update readme 3858cff3 / Mon, 19 Mar 2018 19:02:42 +0100 Norbert Schlia * Update TODO d07ee13e / Mon, 19 Mar 2018 18:58:55 +0100 Norbert Schlia * Set date 46f7e083 / Sun, 18 Mar 2018 19:26:55 +0100 Norbert Schlia * Produce proper DTS aea0a1d0 / Sun, 18 Mar 2018 19:26:25 +0100 Norbert Schlia * Dropped ISMV option 3e2094f0 / Sat, 17 Mar 2018 10:36:51 +0100 Norbert Schlia * Fix typo d3f077bb / Fri, 9 Mar 2018 19:45:00 +0100 Norbert Schlia * Enable ISMV option 68b78c54 / Fri, 9 Mar 2018 11:12:55 +0100 Norbert Schlia * fix ISMV size e43c7b32 / Fri, 9 Mar 2018 11:11:14 +0100 Norbert Schlia * dts needs only to be fixed if AVFMT_TS_NONSTRICT is not set a6f345cb / Fri, 9 Mar 2018 11:10:33 +0100 Norbert Schlia * Clean-up 45a5a165 / Fri, 9 Mar 2018 11:10:12 +0100 Norbert Schlia * Audo/Video sync can be calculated in one line 6c35917f / Fri, 9 Mar 2018 11:09:10 +0100 Norbert Schlia * Clean-up/variable names 0eb14e19 / Fri, 9 Mar 2018 10:25:05 +0100 Norbert Schlia * Start value for last dts was wrong (must be NOPTS) a0ee0d22 / Fri, 9 Mar 2018 10:24:26 +0100 Norbert Schlia * Report PTD errors not only once 8ded601a / Fri, 9 Mar 2018 10:22:40 +0100 Norbert Schlia * Log percentage of resulting size compared to predicted size 893475a6 / Tue, 6 Mar 2018 16:25:52 +0100 Norbert Schlia * Clean up 01f2fb30 / Tue, 6 Mar 2018 16:24:37 +0100 Norbert Schlia * Update info 06130173 / Sun, 4 Mar 2018 10:04:55 +0100 Norbert Schlia * Restructure codec setup d728bfab / Sun, 4 Mar 2018 10:03:55 +0100 Norbert Schlia * Change misleading variable name 91263e93 / Sun, 4 Mar 2018 10:03:25 +0100 Norbert Schlia * Fix crash because memory was doubly freed c166a93a / Sun, 4 Mar 2018 10:02:50 +0100 Norbert Schlia * Reformat code ab7fa4c1 / Sun, 4 Mar 2018 10:01:33 +0100 Norbert Schlia * Change test code to production code 6ddc4c1f / Sun, 4 Mar 2018 10:00:15 +0100 Norbert Schlia * Change test code to production code b6cba3d3 / Sun, 4 Mar 2018 09:59:07 +0100 Norbert Schlia * Remove local paths from qmake file e3c6fde3 / Thu, 1 Mar 2018 11:15:15 +0100 Norbert Schlia * Add --clean_cache option 2e4e016e / Fri, 23 Feb 2018 10:53:40 +0100 Norbert Schlia * Add OGG to news list 7ef50705 / Fri, 23 Feb 2018 10:52:02 +0100 Norbert Schlia * (c) update to 2017-18 61f9941b / Fri, 23 Feb 2018 10:39:34 +0100 Norbert Schlia * Include OGG/WAV 588d5000 / Fri, 23 Feb 2018 10:36:43 +0100 Norbert Schlia * Add ogg/wav to description f96f1b0a / Fri, 23 Feb 2018 10:34:43 +0100 Norbert Schlia * Update to OGG/WAV support 7268531f / Thu, 22 Feb 2018 19:42:12 +0100 Norbert Schlia * Add ogg output format 2e7355ed / Thu, 22 Feb 2018 18:32:46 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs 616e2db0 / Mon, 12 Feb 2018 10:42:57 +0100 Norbert Schlia * Fix warnings in printf for Qt e788ddfc / Mon, 12 Feb 2018 10:42:19 +0100 Norbert Schlia * Fix crash when predicted size is 0 (although this should neve happen 4d54bbd2 / Mon, 12 Feb 2018 10:41:16 +0100 Norbert Schlia * Get rid of some warnings...:wq 449f8e52 / Sun, 11 Feb 2018 10:34:59 +0100 Norbert Schlia * Fix crash when predicted file size was zero (although this should never happen) 9b431e00 / Sun, 11 Feb 2018 09:52:37 +0100 Norbert Schlia * Include new WAV output in README 5e4fc65d / Sun, 11 Feb 2018 09:51:49 +0100 Norbert Schlia * Fix 32 bit build warning/fix some general warnings 3b38d28e / Sun, 11 Feb 2018 09:44:37 +0100 Norbert Schlia * Another Libav compatibility issue fixed 2a107b17 / Tue, 30 Jan 2018 22:08:50 +0100 Norbert Schlia * Add WAV checks 5d4ede51 / Tue, 30 Jan 2018 20:39:18 +0100 Norbert Schlia * Fix make clean for make check 719d2820 / Mon, 29 Jan 2018 10:38:00 +0100 Norbert Schlia * Add WAV output format bd0b58f6 / Sun, 28 Jan 2018 00:17:02 +0100 Norbert Schlia * Merge pull request #2 from sdrik/master 48e94458 / Sun, 14 Jan 2018 18:59:29 +0100 Cédric Schieli * Seeking is needed for writing proper ID3v2 tags. 93569b95 / Sun, 21 Jan 2018 08:49:20 +0100 Norbert Schlia * Updated for V1.1 preview af822559 / Sun, 21 Jan 2018 08:44:59 +0100 Norbert Schlia * Include configure command line arguments and host OS in "-V" option. 15e55bf0 / Sun, 21 Jan 2018 08:26:12 +0100 Norbert Schlia * Implement video rescaling b7bdcc5b / Sat, 20 Jan 2018 17:53:02 +0100 Norbert Schlia * Forgot to set the release date c76547f4 / Sat, 20 Jan 2018 01:21:58 +0100 nschlia * Updated to release 1.0! 3419bc51 / Tue, 2 Jan 2018 15:29:05 +0100 Norbert Schlia * Fix build with FFmpeg < 3.0 b1e8005e / Fri, 29 Dec 2017 23:58:10 +0100 Norbert Schlia * Oops. Should not have been pushed 0be9045c / Fri, 29 Dec 2017 23:53:43 +0100 Norbert Schlia * Add license to project 39204e40 / Fri, 29 Dec 2017 23:26:17 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/ffmpegfs cc248bc2 / Fri, 29 Dec 2017 23:25:45 +0100 Norbert Schlia * Limit max. number of threads 8dd6292c / Fri, 29 Dec 2017 23:25:16 +0100 Norbert Schlia * Format number helper b03e4389 / Fri, 29 Dec 2017 22:10:46 +0100 Norbert Schlia * checks: allow size ranges for mp4 because sizes may differ a bit 37729d21 / Fri, 29 Dec 2017 21:57:55 +0100 Norbert Schlia * Fix transcoding of mp3 (encode at least audio stream) d93e4731 / Fri, 29 Dec 2017 21:54:34 +0100 Norbert Schlia * Set version to 0.95 Change state from alpha to beta c64291e8 / Fri, 29 Dec 2017 17:37:05 +0100 Norbert Schlia * Put myself in .mailmap e07cfa81 / Fri, 29 Dec 2017 14:40:37 +0100 Norbert Schlia * Some nice helper functions 924bcf91 / Fri, 29 Dec 2017 14:40:05 +0100 Norbert Schlia * Make error messages less chatty bd3a5159 / Fri, 29 Dec 2017 14:38:47 +0100 Norbert Schlia * Fix cache not handling entries properly when using more than one target format 0c2f0793 / Fri, 29 Dec 2017 13:23:52 +0100 Norbert Schlia * Add TODO list 602ec460 / Fri, 29 Dec 2017 12:49:58 +0100 Norbert Schlia * Preserve FFmpeg result values in cache database 9acfb679 / Thu, 28 Dec 2017 21:09:27 +0100 Norbert Schlia * Update news for 0.95 22010848 / Thu, 28 Dec 2017 21:06:21 +0100 Norbert Schlia * Persist av transcoder result in cache 6a295ffa / Thu, 28 Dec 2017 21:03:33 +0100 Norbert Schlia * Correct typo 7787c164 / Thu, 28 Dec 2017 20:59:43 +0100 Norbert Schlia * Ensure only one process does cache maintenance 2cafafbc / Thu, 28 Dec 2017 20:57:58 +0100 Norbert Schlia * Report transcoding events as INFO edd430e9 / Thu, 28 Dec 2017 20:56:12 +0100 Norbert Schlia * Use PACKAGE define in all places 0b739113 / Thu, 28 Dec 2017 20:54:49 +0100 Norbert Schlia * Change default log level to INFO 444dad74 / Wed, 27 Dec 2017 23:27:09 +0100 Norbert Schlia * Rename --maintenance_timer parameter to --cache_maintenance 8ca37aab / Wed, 27 Dec 2017 23:15:09 +0100 Norbert Schlia * Remove c++ includes 6c822097 / Wed, 27 Dec 2017 23:07:08 +0100 Norbert Schlia * Clean-up: reduce #includes 69587273 / Wed, 27 Dec 2017 21:40:41 +0100 Norbert Schlia * Remove stray exit call 7eadfa27 / Sun, 24 Dec 2017 12:53:41 +0100 Norbert Schlia * Udpate for make dist command 62c0f07a / Sun, 24 Dec 2017 12:35:30 +0100 Norbert Schlia * Add new maintenance_timer parameter 806a280d / Sun, 24 Dec 2017 12:34:38 +0100 Norbert Schlia * Fix filesize check. Once again... 395bf6fa / Sun, 24 Dec 2017 12:29:26 +0100 Norbert Schlia * Implement periodic cache maintenance 65c87be9 / Sun, 24 Dec 2017 12:29:03 +0100 Norbert Schlia * Store errno result in database 526ca9b4 / Sun, 24 Dec 2017 12:28:19 +0100 Norbert Schlia * Report timers or sizes 'inactive' instead of displaying a zero 63c1a67d / Sun, 24 Dec 2017 08:59:42 +0100 Norbert Schlia * Implement periodic cache maintenance 925f428c / Sat, 23 Dec 2017 23:40:03 +0100 Norbert Schlia * Implement periodic cache maintenance b586c5e0 / Sat, 23 Dec 2017 23:39:38 +0100 Norbert Schlia * If decoder thread fails this must be passed on to caller 396a2294 / Sat, 23 Dec 2017 23:38:46 +0100 Norbert Schlia * Additonal database fields for selected bitrate etc 014901d8 / Sat, 23 Dec 2017 23:37:54 +0100 Norbert Schlia * -V parameter also shows compiler version a3d58692 / Sat, 23 Dec 2017 23:37:20 +0100 Norbert Schlia * Implement periodic cache maintenance ac978d41 / Sat, 23 Dec 2017 23:36:47 +0100 Norbert Schlia * Preserve stream tags for video/audio 29f7435d / Sat, 23 Dec 2017 23:35:57 +0100 Norbert Schlia * Implement periodic cache maintenance a32c4d35 / Sat, 23 Dec 2017 11:14:06 +0100 Norbert Schlia * Typo fixed/Format 0d6c6fb8 / Fri, 22 Dec 2017 15:57:18 +0100 nschlia * Update .gitignore to new project name d58030ce / Fri, 22 Dec 2017 15:47:30 +0100 Norbert Schlia * Added clang CI badges 6a81101e / Fri, 22 Dec 2017 15:38:32 +0100 nschlia * OK, one changed file got pushed to git, this did not. Oh how I hate git. f7853011 / Fri, 22 Dec 2017 15:34:19 +0100 Norbert Schlia * clang support 98f7a170 / Fri, 22 Dec 2017 00:52:29 +0100 Norbert Schlia * Upgraded build system to Debian 9 with gcc 6.3.0. b1be3372 / Thu, 21 Dec 2017 18:40:14 +0100 Norbert Schlia * Updated libav to 12.2 a2447da7 / Thu, 21 Dec 2017 11:34:54 +0100 Norbert Schlia * Documentation updated 784f17cb / Thu, 21 Dec 2017 00:22:17 +0100 Norbert Schlia * manpages update 201c0f3b / Wed, 20 Dec 2017 23:46:29 +0100 Norbert Schlia * Clean-up 3fa33f27 / Wed, 20 Dec 2017 23:46:06 +0100 Norbert Schlia * Fix sqlite was used too late when shutting down 8e79a407 / Wed, 20 Dec 2017 23:44:26 +0100 Norbert Schlia * Add --prune-cache parameter 104eee17 / Wed, 20 Dec 2017 00:57:26 +0100 Norbert Schlia * Fix mp3 format Fix lockup when init of encoder fails fd20316b / Wed, 20 Dec 2017 00:20:51 +0100 Norbert Schlia * Fix mp3 format / make checks work 22bc0f4d / Tue, 19 Dec 2017 23:52:03 +0100 Norbert Schlia * Update usage info Remove trailing newlines from log entries 48de9267 / Tue, 19 Dec 2017 23:09:13 +0100 Norbert Schlia * Updated NEWS 41bd295a / Tue, 19 Dec 2017 22:42:24 +0100 Norbert Schlia * Date update e726bf6d / Tue, 19 Dec 2017 22:40:21 +0100 Norbert Schlia * Enhanced parameter handling Fix compiler warning DOC update e5d44a70 / Tue, 19 Dec 2017 21:26:30 +0100 Norbert Schlia * Fix test suite Add mp3 tests 64003ca2 / Tue, 19 Dec 2017 21:25:35 +0100 Norbert Schlia * Add --disable_cache option e0451eda / Tue, 19 Dec 2017 21:23:33 +0100 Norbert Schlia * Enhance logging 87e124a5 / Tue, 19 Dec 2017 21:23:03 +0100 Norbert Schlia * Clean-up 3ccf8bf9 / Tue, 19 Dec 2017 21:21:53 +0100 Norbert Schlia * Add --disable_cache parameter a2e9b578 / Tue, 19 Dec 2017 21:19:27 +0100 Norbert Schlia * Enhance size parameters 13a941bf / Tue, 19 Dec 2017 21:17:40 +0100 Norbert Schlia * Fix log level parameter aa144c25 / Tue, 19 Dec 2017 21:04:24 +0100 Norbert Schlia * Enable -O3 optimisation d920a298 / Tue, 19 Dec 2017 21:03:37 +0100 Norbert Schlia * Enable sign compare warnings 3cc3238d / Mon, 18 Dec 2017 17:47:02 +0100 Norbert Schlia * Fix get_samplerate fdcd3b29 / Mon, 18 Dec 2017 16:22:44 +0100 Norbert Schlia * Remove stray return. Again. 323bf6bb / Mon, 18 Dec 2017 16:16:21 +0100 Norbert Schlia * Enhanced parameter reading from command line Beautified parameter output d9cc68ce / Mon, 18 Dec 2017 11:20:46 +0100 Norbert Schlia * Removed forgotten debug "return" 8b8af0bb / Mon, 18 Dec 2017 10:23:12 +0100 Norbert Schlia * Created home pages 3a8b4cc8 / Mon, 18 Dec 2017 10:22:14 +0100 Norbert Schlia * Project renamed to ffmpegfs 85e6d76c / Mon, 18 Dec 2017 10:14:09 +0100 Norbert Schlia * Added QtCreator project 26dfe204 / Mon, 18 Dec 2017 10:13:32 +0100 Norbert Schlia * Project renamed to ffmpegfs d 37b759e5 / Mon, 18 Dec 2017 10:12:02 +0100 Norbert Schlia * Project renamed to ffmpegfs Added cache management Fixed many memory leaks and crashes b935a3e7 / Sat, 16 Dec 2017 13:14:58 +0100 Norbert Schlia * Ooops, not supposed to be checked in 760656e3 / Sat, 16 Dec 2017 13:13:03 +0100 Norbert Schlia * Cache handling: remove expired entries/keep cache size within limits 5b4f0120 / Sat, 16 Dec 2017 13:08:39 +0100 Norbert Schlia * QtCreator project 2d3d2bd0 / Fri, 15 Dec 2017 07:28:34 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/mp3fs 2980f510 / Fri, 15 Dec 2017 07:28:03 +0100 Norbert Schlia * Remove bloating comments cbe92eeb / Thu, 14 Dec 2017 23:47:28 +0100 Norbert Schlia * Set theme jekyll-theme-tactile a5e1135c / Thu, 14 Dec 2017 23:44:17 +0100 Norbert Schlia * Set theme jekyll-theme-architect cce3c43c / Thu, 14 Dec 2017 23:08:13 +0100 Norbert Schlia * Enable FFmpeg base CI build 840fe42f / Thu, 14 Dec 2017 16:57:49 +0100 Norbert Schlia * Update NEWS ef2dd4b3 / Thu, 14 Dec 2017 16:51:08 +0100 Norbert Schlia * Can be removed, travis-ci won't do for an FFmpeg project dae82b4e / Thu, 14 Dec 2017 16:18:58 +0100 Norbert Schlia * Organise build states in table 7f535baa / Thu, 14 Dec 2017 16:13:48 +0100 Norbert Schlia * OK, incorrect syntax in markdown... 632ed5d4 / Thu, 14 Dec 2017 16:07:55 +0100 Norbert Schlia * travis-ci does uses Ubuntu 14.04 with some V0.8 Libav, does not work, so we use our own build system b697c410 / Wed, 13 Dec 2017 23:01:31 +0100 Norbert Schlia * Must use real FFmpeg, not stone old LIBAV cdf8cd0e / Wed, 13 Dec 2017 22:59:41 +0100 Norbert Schlia * Must use real FFmpeg, not stone old LIBAV/remove travis CI link for now 82efea67 / Wed, 13 Dec 2017 22:51:18 +0100 Norbert Schlia * Must use real FFmpeg, not stone old LIBAV + remove clang compiler for now d842a956 / Wed, 13 Dec 2017 22:04:40 +0100 Norbert Schlia * Allow lower library versions to make travis CI build succeed b23e2048 / Wed, 13 Dec 2017 21:38:55 +0100 Norbert Schlia * Added travis continous integration 4e36bb33 / Wed, 13 Dec 2017 21:29:24 +0100 Norbert Schlia * update .travis.yml for this project branch cf19870f / Wed, 13 Dec 2017 14:06:34 +0100 Norbert Schlia * Updated manpages e6220e7c / Wed, 13 Dec 2017 14:06:08 +0100 Norbert Schlia * Updated docs 1b2ebf51 / Sat, 9 Dec 2017 00:10:21 +0100 Norbert Schlia * Use sqlite3 database as central storage for cache entries Fix many crashes due to multithreading Correctly use FFmpeg libaries (flush decoders/encoders) Many small fixes Better error/warning messages 72dbc6bc / Sat, 9 Dec 2017 00:00:38 +0100 Norbert Schlia * Added Debian 7 Updated Suse description 9d221ae3 / Sat, 2 Dec 2017 21:30:46 +0100 Norbert Schlia * Update docs: Red Hat support def91a73 / Tue, 28 Nov 2017 22:38:47 +0100 Norbert Schlia * Cache control: max. number of threads/suspend thread after time out 120d5a74 / Tue, 28 Nov 2017 22:29:36 +0100 Norbert Schlia * Updated documentation 8cee60ba / Tue, 28 Nov 2017 22:27:47 +0100 Norbert Schlia * Update (c) texts 5cc74dbf / Tue, 28 Nov 2017 13:26:35 +0100 Norbert Schlia * Make cache path settable by command line option c1f16e66 / Tue, 28 Nov 2017 13:25:31 +0100 Norbert Schlia * Fix even another crash 174876b3 / Tue, 28 Nov 2017 13:24:41 +0100 Norbert Schlia * Add future plans 18d64db1 / Tue, 28 Nov 2017 13:23:44 +0100 Norbert Schlia * Fix typo in my own email address. Very emberassing... d784fe5f / Tue, 28 Nov 2017 07:12:49 +0100 Norbert Schlia * Remove now unused --statcachesize option/update NEWS f3cc554a / Mon, 27 Nov 2017 23:07:17 +0100 Norbert Schlia * Fix 2 crashes 436051e8 / Mon, 27 Nov 2017 22:42:00 +0100 Norbert Schlia * Close input file whenever it is not needed d4492721 / Mon, 27 Nov 2017 22:34:43 +0100 Norbert Schlia * rebuild output file if source file size/date changed remove old stats cache and replace with new disk cache fix crashes a338a12a / Sun, 26 Nov 2017 19:57:18 +0100 Norbert Schlia * Typos a846de92 / Sun, 26 Nov 2017 19:53:44 +0100 Norbert Schlia * Fix crash with older LIBAV/Implement mutexes to avoid problems when accessed concurrently c777b403 / Sun, 26 Nov 2017 19:51:36 +0100 Norbert Schlia * Raise some common log messages to trace db58d783 / Sun, 26 Nov 2017 19:50:53 +0100 Norbert Schlia * Implement mutexes to avoid problems when accessed concurrently c530fc0b / Tue, 21 Nov 2017 18:14:08 +0100 Norbert Schlia * Feature #2188: fix crash when not resampling 89de9fd7 / Tue, 21 Nov 2017 14:20:44 +0100 Norbert Schlia * Disable ISMV and AVFilter for oncoming release c6f5d0ca / Tue, 21 Nov 2017 13:00:50 +0100 Norbert Schlia * Enable audio sample rate setting/Update command line/Update help 1ce324e8 / Tue, 21 Nov 2017 12:56:46 +0100 Norbert Schlia * Update documentation c8deb75d / Mon, 20 Nov 2017 20:02:16 +0100 Norbert Schlia * Update documentation Fix DTS/PTS generation Fix problems with mixed gcc 4 and 6 builds 73f5aff8 / Sat, 18 Nov 2017 17:52:43 +0100 Norbert Schlia * Add mp4 video transcoding Add disk cache Fix LIBAV support 8c572e03 / Sat, 11 Nov 2017 20:42:44 +0100 Norbert Schlia * Remove memory cache 9db9d75e / Sat, 11 Nov 2017 20:34:10 +0100 Norbert Schlia * Implement disk cache 10d8d143 / Fri, 10 Nov 2017 06:30:17 +0100 nschlia * Removed debug output accidentally left in code b522f897 / Thu, 9 Nov 2017 22:50:59 +0100 Norbert Schlia * Add disk cache functionality 2c72cd1f / Thu, 9 Nov 2017 22:21:21 +0100 Norbert Schlia * Merge branch 'master' of https://github.com/nschlia/mp3fs c6b02459 / Thu, 9 Nov 2017 22:19:09 +0100 Norbert Schlia * Updated ignores c92a8c89 / Thu, 9 Nov 2017 22:15:57 +0100 Norbert Schlia * Update tests to new mp4 default Note that most of them still fail because the test suite was not completely update! 1a093fad / Thu, 9 Nov 2017 22:15:04 +0100 Norbert Schlia * Update documentation f38eb64f / Thu, 26 Oct 2017 21:33:22 +0200 nschlia * Rename misleading copy_into function 8e98c1e4 / Thu, 26 Oct 2017 21:22:36 +0200 nschlia * Fix memory leaks Properly set out bit rates (either selected value or lower if input stream has lower bit rate, do not cause output to be larger than input) Fix Libav compatiblity problem Properly predict MP4 sizes (MP3 still on todo list!) Properly handle files that become larger than predict (return full file instead of truncating) Fix crash Clean-up debug printfs 5abb3c93 / Tue, 24 Oct 2017 11:33:22 +0200 Norbert Schlia * Update checks to new version (note that only the first three tests will succeed). 301bf341 / Tue, 24 Oct 2017 11:29:48 +0200 Norbert Schlia * Update documentation bd973cfd / Mon, 23 Oct 2017 20:16:03 +0200 Norbert Schlia * Add video support Update documentation bfd3a2b7 / Tue, 10 Oct 2017 22:59:11 +0200 Norbert Schlia * Set mp4 parameters so that download starts before the whole file was recoded ca1ba204 / Tue, 10 Oct 2017 22:55:55 +0200 Norbert Schlia * Remove picture handling code (will be handle by FFMPEG API) Fix crash when not resampling because bitrate etc. is same Set MP4 parameters for fast start up before whole file was recoded 2c98c6ad / Tue, 10 Oct 2017 22:51:21 +0200 Norbert Schlia * Excempt mp3/mp4 from recoding 4bd3b2ba / Tue, 10 Oct 2017 22:48:09 +0200 Norbert Schlia * Remove picture handling code, will be done by FFMPEG API 5764a674 / Sun, 8 Oct 2017 20:29:06 +0200 Norbert Schlia * Update INSTALL.md b819374a / Sun, 8 Oct 2017 20:11:33 +0200 Norbert Schlia * Replace encoder/decoder with FFMPEG API. Add support for encoding to mp4 ca59d124 / Sun, 14 May 2017 00:03:36 -0700 K Henriksson * Update Travis environment to Trusty 797d3b48 / Sat, 13 May 2017 19:23:08 -0700 K Henriksson * Convert tabs to spaces in manpage source 4b48a086 / Sat, 6 May 2017 13:50:44 -0700 K Henriksson * Add define for POSIX standard 1f239bd1 / Sat, 6 May 2017 13:49:15 -0700 K Henriksson * Switch to using a map for logging initialization d8585bf0 / Sat, 6 May 2017 13:44:39 -0700 K Henriksson * Add function for C-style logging with Logger 71deb54a / Fri, 5 May 2017 21:44:41 -0700 K Henriksson * Move ReplayGain logic into base Encoder class c642e445 / Fri, 5 May 2017 21:09:59 -0700 K Henriksson * Update Vorbis decoder to use more standard C++ d238afd3 / Fri, 5 May 2017 21:07:01 -0700 K Henriksson * Update C and C++ versions to 11 f03d6178 / Fri, 5 May 2017 20:17:38 -0700 K Henriksson * Use C++11 initialization features to simplify map 13b73fa2 / Sun, 30 Apr 2017 12:23:08 -0700 K Henriksson * Add test cases for Vorbis audio 14a6284f / Sun, 30 Apr 2017 12:19:06 -0700 K Henriksson * Improve fpcompare error handling f2dd1324 / Sun, 30 Apr 2017 11:54:16 -0700 K Henriksson * Add back resampling support in fpcompare 423c114d / Sun, 30 Apr 2017 11:29:11 -0700 K Henriksson * Add test for picture-handling code f7cf0800 / Sat, 29 Apr 2017 18:06:58 -0700 K Henriksson * Use embedded base64 library for Vorbis pictures f1ea3187 / Mon, 24 Apr 2017 10:31:18 -0700 K Henriksson * Make added base64 code into a library c9995894 / Mon, 24 Apr 2017 10:26:19 -0700 K Henriksson * Move compilation flags to base Makefile 99fdadfb / Mon, 24 Apr 2017 09:14:16 -0700 K Henriksson * Add base64 handling functions from GNU coreutils 7e3d0a64 / Wed, 14 Oct 2015 14:56:18 +0200 quarterpounder * Fix the remultiplexing of the decoded audio c30d1323 / Mon, 24 Apr 2017 11:38:10 -0700 K Henriksson * Add attribute to enable checking log format syntax abfb66d7 / Fri, 5 May 2017 22:17:32 -0700 K Henriksson * Add generated log files to clean list a21b98c0 / Sat, 22 Apr 2017 13:40:56 -0700 K Henriksson * Enable logging to file in tests 8ac88072 / Sat, 22 Apr 2017 13:38:29 -0700 K Henriksson * Use new logging module for logging 5e9a419f / Sat, 22 Apr 2017 13:17:07 -0700 K Henriksson * Switch value parameter to 0 for consistency e4869362 / Fri, 21 Apr 2017 21:11:16 -0700 K Henriksson * Reorder includes in transcode.cc c274bdb1 / Fri, 21 Apr 2017 21:07:10 -0700 K Henriksson * Alphabetize mp3fs parameters c1b64d8c / Fri, 21 Apr 2017 20:02:47 -0700 K Henriksson * Add logging class for mp3fs d5b2b07e / Mon, 3 Apr 2017 22:23:40 -0700 K Henriksson * Update fpcompare to newest libav API f528c893 / Mon, 3 Apr 2017 22:16:44 -0700 K Henriksson * fpcompare: Convert tabs to spaces c3e485e9 / Mon, 3 Apr 2017 20:38:42 -0700 K Henriksson * Add missing header file c391496b / Sun, 13 Sep 2015 14:07:02 -0700 K Henriksson * Merge pull request #40 from quarterpounder/master 0307142d / Sun, 16 Aug 2015 17:24:32 +0200 quarterpounder * Add upper boundary checks for Ogg Vorbis pictures and add build scuffolding 4d8460b8 / Sun, 16 Aug 2015 13:52:09 +0200 quarterpounder * Add handling of pictures embedded in Ogg Vorbis comments 81c8bdff / Mon, 3 Aug 2015 19:01:24 +0200 Thomas Schwarzenberger * Merge https://github.com/khenriks/mp3fs and respond to comments on pull request 74f60266 / Sun, 2 Aug 2015 16:13:26 +0200 Thomas Schwarzenberger * Merge https://github.com/khenriks/mp3fs e10cbf10 / Sun, 17 May 2015 13:35:07 -0700 K Henriksson * Switch C++ standard flag to c++0x 05ca12b6 / Sun, 17 May 2015 13:25:11 -0700 K Henriksson * Suppress overloaded virtual warning from FLAC++ 4122337d / Sun, 17 May 2015 13:21:29 -0700 K Henriksson * Add missing include and fix warnings ecd9de3c / Sun, 17 May 2015 13:19:33 -0700 K Henriksson * Switch to C++11 as C++ standard 0f1cff9b / Sun, 17 May 2015 12:51:05 -0700 K Henriksson * Merge pull request #31 from robertyseward/master 58122777 / Fri, 17 Apr 2015 18:06:35 +0200 quarterpounder * Merge branch 'master' of https://github.com/khenriks/mp3fs a54cd8f4 / Sat, 28 Mar 2015 17:47:41 +0100 quarterpounder * cleaned superfluous include 13c09ca3 / Sat, 28 Mar 2015 17:36:43 +0100 quarterpounder * made string handling more robust d57a8737 / Fri, 27 Mar 2015 20:55:30 +0100 quarterpounder * clarified wordings, replaced dangling tabs af853b86 / Wed, 4 Mar 2015 20:35:47 -0800 K Henriksson * Merge pull request #39 from patch0/master 6303f9eb / Sun, 25 Jan 2015 14:25:45 +0100 quarterpounder * Folded Ogg Vorbis decoding into docs fc6c1ea9 / Sun, 25 Jan 2015 03:00:26 +0100 quarterpounder * Optimized buffer handling 38f4e2ce / Sun, 25 Jan 2015 01:18:36 +0100 quarterpounder * Add new decoder files b72d1b59 / Sun, 25 Jan 2015 01:08:14 +0100 Thomas Schwarzenberger * Added an Ogg Vorbis decoder 72ce912a / Sat, 24 Jan 2015 22:19:17 +0000 Patrick J Cherry * Invert test for null id3_tag before deletion, fixing memory leak. bd22012a / Tue, 2 Dec 2014 19:10:44 -0800 K Henriksson * Fix nonportable use of == with test e83daee3 / Sat, 15 Nov 2014 15:31:58 -0800 K Henriksson * Merge pull request #35 from robertyseward/adjust-len 43dff271 / Sat, 15 Nov 2014 14:19:25 -0700 Robert Seward * Reorganize logic to make code more clear ef8de732 / Sat, 15 Nov 2014 12:26:28 -0700 Robert Seward * Merge branch 'master' of https://github.com/robertyseward/mp3fs c4b1d682 / Sat, 15 Nov 2014 12:23:56 -0700 Robert Seward * Redo the cache pruning code so that it doesn't hold the lock while doing stat() calls. 68fea6f2 / Fri, 14 Nov 2014 22:19:39 -0700 Robert Seward * Remove a change that was put into another branch. 5aa40fe3 / Fri, 14 Nov 2014 22:19:39 -0700 Robert Seward * Remove a change that has been put into another branch. e5f9d1cf / Fri, 14 Nov 2014 09:27:35 -0700 Robert Seward * Move a static function to an unnamed namespace. db3417ac / Fri, 14 Nov 2014 09:23:29 -0700 Robert Seward * Merge branch 'master' of https://github.com/khenriks/mp3fs 79a5b5fe / Thu, 13 Nov 2014 21:32:18 -0700 Robert Seward * Move the stats cache code into its own file. 68393e7b / Thu, 13 Nov 2014 18:38:56 -0800 K Henriksson * Merge pull request #33 from robertyseward/tag-length 1db6b347 / Wed, 12 Nov 2014 17:28:59 -0700 Robert Seward * Replace 128 (the ID3v1 tag length) with a named constant for clarity. bf599b8f / Wed, 12 Nov 2014 16:42:30 -0700 Robert Seward * Change tabs to spaces. 56666df7 / Fri, 10 Oct 2014 12:47:43 -0600 Robert Seward * - Add a '--vbr' option that uses variable bitrate encoding. - Add a file stat cache that makes VBR encoding have both decent performance for stat() calls and accurate sizes. fea07208 / Wed, 27 Aug 2014 21:55:18 -0700 K Henriksson * Fix statfs operation e18e51d2 / Wed, 14 May 2014 15:42:36 -0400 K Henriksson * Release version 0.91 78adb8c4 / Wed, 14 May 2014 15:32:46 -0400 K Henriksson * Improve version information output 417c5f68 / Wed, 14 May 2014 15:16:48 -0400 K Henriksson * Fix buffer overflow reading decoder list 419146ed / Wed, 14 May 2014 01:57:21 -0400 K Henriksson * Add missing files to distribution e7b9cc2d / Wed, 14 May 2014 01:43:28 -0400 K Henriksson * Make tests more robust with out-of-tree builds 4a1b2691 / Wed, 14 May 2014 00:39:59 -0400 K Henriksson * Rename GFDL license file to follow convention 599988e3 / Wed, 14 May 2014 00:29:47 -0400 K Henriksson * Fix install instructions to include FLAC++ 565c3701 / Wed, 7 May 2014 14:02:40 -0400 K Henriksson * Add extra git-build dependencies in INSTALL.md 6946d1be / Sun, 6 Apr 2014 01:12:12 -0400 K Henriksson * Release version 0.9 2a0515c5 / Wed, 9 Apr 2014 00:23:40 -0400 K Henriksson * Add missing header files in sources list 31dc2a53 / Wed, 9 Apr 2014 00:14:36 -0400 K Henriksson * Update name for README in Makefile.am 5fd79b10 / Sun, 6 Apr 2014 00:38:24 -0400 K Henriksson * Update copyright notices d20ba840 / Sun, 6 Apr 2014 00:26:16 -0400 K Henriksson * Make INSTALL.md heading an actual heading dc6327df / Sun, 6 Apr 2014 00:25:07 -0400 K Henriksson * Turn INSTALL.md into link 2c4d3e1d / Sun, 6 Apr 2014 00:22:12 -0400 K Henriksson * Modify case for mp3fs 986548a8 / Sun, 6 Apr 2014 00:20:39 -0400 K Henriksson * Update README file 915dca10 / Sat, 5 Apr 2014 23:45:27 -0400 K Henriksson * Update installation instructions dc59a104 / Mon, 19 Aug 2013 15:06:05 -0700 Kristofer Henriksson * Add build file for Travis CI d08ea4d7 / Sun, 18 Aug 2013 17:34:57 -0700 Kristofer Henriksson * Add pkg-config check for plain FLAC package 9332aedf / Sun, 18 Aug 2013 17:07:32 -0700 Kristofer Henriksson * Specify standards version for compilation 689cf83a / Sun, 18 Aug 2013 16:08:35 -0700 Kristofer Henriksson * Use C++ idiom for string formatting 7a676310 / Tue, 28 May 2013 21:07:47 -0400 Kristofer Henriksson * Slightly simplify testing scripts e8fe0132 / Tue, 28 May 2013 20:47:08 -0400 Kristofer Henriksson * Add additional tags to test_tags de253f2b / Tue, 30 Jul 2013 16:33:32 -0700 Kristofer Henriksson * Merge pull request #13 from ss23/patch-1 0e01d800 / Wed, 31 Jul 2013 00:10:47 +1200 Stephen Shkardoon * Update README.rst 53030c01 / Tue, 28 May 2013 01:27:21 -0400 Kristofer Henriksson * Abstract out encoder and decoder creation d82ebecb / Tue, 28 May 2013 01:38:41 -0400 Kristofer Henriksson * Make optimization explicitly only for MP3 1241f8f8 / Tue, 28 May 2013 01:22:46 -0400 Kristofer Henriksson * Add configure error if no encoder or decoder b364544f / Mon, 6 May 2013 13:02:27 -0400 Kristofer Henriksson * Enable new compiler warnings and address them 6d3f8982 / Mon, 6 May 2013 00:10:41 -0400 Kristofer Henriksson * Merge branch 'restructure' cd1efe3c / Sun, 5 May 2013 23:34:51 -0400 Kristofer Henriksson * Ignore automake test results files 2899093d / Sun, 5 May 2013 23:22:29 -0400 Kristofer Henriksson * Signal to test system when mp3fs exits with error e1f24fa6 / Sun, 5 May 2013 14:31:35 -0400 Kristofer Henriksson * Handle errors more robustly in tests 5fe64e25 / Sun, 5 May 2013 14:30:09 -0400 Kristofer Henriksson * Check better for availability of mount 29bfe65c / Sun, 5 May 2013 14:27:53 -0400 Kristofer Henriksson * Update fpcompare.c from new fpcalc.c upstream aa12cb9a / Sun, 5 May 2013 14:19:37 -0400 Kristofer Henriksson * Use mktemp to generate temporary directory name 6007a6f2 / Sun, 5 May 2013 14:08:35 -0400 Kristofer Henriksson * Add missing includes in mp3fs.c fca15bfa / Sun, 5 May 2013 14:05:37 -0400 Kristofer Henriksson * Use new classes to replace transcoding code f09bcd49 / Sun, 5 May 2013 13:55:00 -0400 Kristofer Henriksson * Add additional useful debugging messages 65180da8 / Sun, 5 May 2013 13:50:48 -0400 Kristofer Henriksson * Add workaround for OS X bug in free() ca94b841 / Sun, 5 May 2013 13:48:24 -0400 Kristofer Henriksson * Normalize FLAC tag names to uppercase on input fde27080 / Sun, 5 May 2013 13:38:59 -0400 Kristofer Henriksson * Combine code to handle track and disc numbers 332548e6 / Sun, 5 May 2013 13:32:52 -0400 Kristofer Henriksson * Properly attach TRCK or TPOS frame after creation fbb740cf / Sun, 5 May 2013 02:44:37 -0400 Kristofer Henriksson * Add check to only free() memory when appropriate ad55d285 / Sun, 5 May 2013 02:40:09 -0400 Kristofer Henriksson * Always create frame if it does not exist eceb8807 / Sun, 28 Apr 2013 20:29:12 -0400 Kristofer Henriksson * Add virtual destructors for Encoder and Decoder e93c2618 / Sun, 28 Apr 2013 20:28:26 -0400 Kristofer Henriksson * Remove unnecessary argument from process_metadata 0d249579 / Sun, 28 Apr 2013 17:19:45 -0400 Kristofer Henriksson * Add method to get data out of a Buffer 38c6ad5a / Sun, 28 Apr 2013 17:16:55 -0400 Kristofer Henriksson * Clear memory after allocation in Buffer 6ac92ab8 / Sun, 28 Apr 2013 14:34:42 -0400 Kristofer Henriksson * Add Decoder interface and FLAC Decoder f384f254 / Sun, 28 Apr 2013 14:30:50 -0400 Kristofer Henriksson * Add const qualifier in encode_pcm_data signature 73507427 / Sun, 28 Apr 2013 14:25:39 -0400 Kristofer Henriksson * Add Encoder method to set gain in dB 6acbe514 / Sun, 28 Apr 2013 14:22:45 -0400 Kristofer Henriksson * Add handling for track or disc numbering in MP3 2ed5f78b / Sun, 28 Apr 2013 14:14:43 -0400 Kristofer Henriksson * Switch to standard values to identify tags ac43b6c1 / Wed, 24 Apr 2013 22:20:19 -0400 Kristofer Henriksson * Add tell() method to Buffer to get current position e2ca5c95 / Wed, 24 Apr 2013 17:20:55 -0400 Kristofer Henriksson * Add MP3 encoder class and Encoder class interface f7b89d3b / Wed, 24 Apr 2013 17:15:59 -0400 Kristofer Henriksson * Change Buffer integer type to long 5cfc95bb / Wed, 24 Apr 2013 17:14:08 -0400 Kristofer Henriksson * Ensure int size is >= 4 babbaf46 / Wed, 24 Apr 2013 00:21:10 -0400 Kristofer Henriksson * Add additional comments in Buffer class 5886ce79 / Tue, 23 Apr 2013 23:34:20 -0400 Kristofer Henriksson * Add Buffer class for use by *coders cbb159c9 / Tue, 23 Apr 2013 23:31:43 -0400 Kristofer Henriksson * Add extra warnings to makefile 1fd5016d / Sun, 28 Apr 2013 15:01:34 -0400 Kristofer Henriksson * Add configure options for using FLAC or MP3 Changes for version 0.32 (18 Jun 2012): 7b30a542 / Sun, 25 Mar 2012 19:41:23 -0400 Kristofer Henriksson * Fix error with zero-length read ef4a7d7c / Sun, 25 Mar 2012 18:00:16 -0400 Kristofer Henriksson * Clarify size message meaning cd384fa8 / Tue, 13 Mar 2012 15:07:55 -0400 Kristofer Henriksson * Revert "Add Mac note for autogen.sh" f01ce788 / Mon, 12 Mar 2012 23:02:16 -0400 Kristofer Henriksson * Fix file size calculation overflow f220ae1e / Mon, 12 Mar 2012 22:45:53 -0400 Kristofer Henriksson * Add Mac note for autogen.sh 55ea5180 / Mon, 12 Mar 2012 22:34:22 -0400 Kristofer Henriksson * Fix tests for POSIX shell compliance 032b698a / Tue, 31 Jan 2012 19:28:58 -0500 Kristofer Henriksson * Check for too much data being read 1b89c00f / Mon, 2 Jan 2012 18:19:15 -0800 Kristofer Henriksson * Remove FLAC code from set_picture_tag 49c611e9 / Mon, 2 Jan 2012 17:06:39 -0800 Kristofer Henriksson * Remove unused function df4184b1 / Mon, 2 Jan 2012 16:57:25 -0800 Kristofer Henriksson * Simplify album artist tag adding e684f4b4 / Sun, 1 Jan 2012 21:16:40 -0800 Kristofer Henriksson * Properly handle multiple strings for one tag 046a1f2a / Sun, 1 Jan 2012 20:52:12 -0800 Kristofer Henriksson * Separate ID3 tag setting from FLAC tag reading 400fb521 / Sun, 1 Jan 2012 19:45:36 -0800 Kristofer Henriksson * Remove incorrectly defined and unused tags 55adedb3 / Sun, 1 Jan 2012 19:39:03 -0800 Kristofer Henriksson * Use actual names for ID3 frames c502af2b / Sun, 1 Jan 2012 11:41:34 -0800 Kristofer Henriksson * Rename data buffer struct ad214554 / Sun, 1 Jan 2012 00:22:56 -0800 Kristofer Henriksson * Remove unused buffer from transcoder struct 3d9352a4 / Sun, 1 Jan 2012 00:21:41 -0800 Kristofer Henriksson * Remove FLAC StreamInfo from transcoder struct 593814f0 / Sun, 1 Jan 2012 00:10:43 -0800 Kristofer Henriksson * Correct file size calculation (fixes test) 354ec52b / Sat, 31 Dec 2011 23:26:21 -0800 Kristofer Henriksson * Produce debug log for each test 02c11bca / Sat, 31 Dec 2011 22:31:53 -0800 Kristofer Henriksson * Add file size test (currently fails) 16dfd6d2 / Sat, 31 Dec 2011 22:52:34 -0800 Kristofer Henriksson * Provide more useful debug message at end of encode 978b8323 / Fri, 30 Dec 2011 21:41:56 -0800 Kristofer Henriksson * Use assignment instead of memcpy 1a1cbce0 / Thu, 29 Dec 2011 22:07:39 -0800 Kristofer Henriksson * Use proper type for ID3v1 tag data f4fc0b92 / Thu, 29 Dec 2011 15:49:53 -0800 Kristofer Henriksson * Remove obsolete SourceForge references from README 8d705c20 / Thu, 29 Dec 2011 15:08:45 -0800 Kristofer Henriksson * Eliminate unnecessary casts 14dd802a / Wed, 21 Dec 2011 22:53:22 -0800 Kristofer Henriksson * Move filesystem operations to separate file 62797174 / Wed, 21 Dec 2011 20:50:01 -0800 Kristofer Henriksson * Remove webpage from .gitignore c07eec95 / Wed, 21 Dec 2011 19:52:50 -0800 Kristofer Henriksson * Merge branch 'tests' d704a0ac / Wed, 21 Dec 2011 19:50:21 -0800 Kristofer Henriksson * Remove test Makefile.in with squeaky-clean fccb9cce / Wed, 21 Dec 2011 19:46:58 -0800 Kristofer Henriksson * Rename tests e28d0776 / Wed, 21 Dec 2011 19:23:16 -0800 Kristofer Henriksson * Add test for audio output 4869b6a1 / Wed, 21 Dec 2011 15:32:02 -0800 Kristofer Henriksson * Add tags test 1608fcd1 / Tue, 20 Dec 2011 21:53:44 -0800 Kristofer Henriksson * Add filename test 28daf344 / Mon, 19 Dec 2011 22:25:33 -0800 Kristofer Henriksson * Fix off_t printf warning b3576c03 / Mon, 19 Dec 2011 14:27:54 -0800 Kristofer Henriksson * Remove web site files from master branch 842e739f / Sun, 4 Dec 2011 13:34:12 -0500 Kristofer Henriksson * Adjust name of rst2html.py Changes for version 0.31 (4 Dec 2011): 363635c2 / Sun, 27 Nov 2011 17:31:15 -0500 Kristofer Henriksson * Add options to control ReplayGain behavior d6d94ccd / Sun, 27 Nov 2011 15:07:05 -0500 Kristofer Henriksson * Fix tabs to spaces in manual 03b4e0e4 / Sun, 27 Nov 2011 15:02:19 -0500 Kristofer Henriksson * Don't say in debug whether the quality is default aa317d68 / Thu, 16 Jun 2011 21:18:33 -0700 Kristofer Henriksson * Fix filename translation for XFS and others 55a0302a / Sat, 7 May 2011 17:46:40 -0400 Kristofer Henriksson * Ensure ID3 tags have padding at the end Changes for version 0.30 (1 Dec 2010): 69000c7a / Wed, 1 Dec 2010 19:50:03 -0500 Kristofer Henriksson * Make bitrate and quality variables unsigned integers c14ba3db / Wed, 1 Dec 2010 18:32:10 -0500 Kristofer Henriksson * Correct usage of asprintf 205b7948 / Wed, 1 Dec 2010 18:31:13 -0500 Kristofer Henriksson * Use more appropriate type for buffer variables 3410820e / Wed, 1 Dec 2010 17:06:40 -0500 Kristofer Henriksson * Add man page and build rules for man page 9badf3cd / Wed, 1 Dec 2010 17:03:48 -0500 Kristofer Henriksson * Add README.rst to list of files to distribute 6f4055f8 / Sun, 28 Nov 2010 21:16:38 -0500 Kristofer Henriksson * Improve usage message shown with --help b8857eb9 / Sun, 28 Nov 2010 21:15:56 -0500 Kristofer Henriksson * Add mount option for quality setting c4812901 / Sun, 28 Nov 2010 13:46:52 -0500 Kristofer Henriksson * Use a command-line option (-b) for bitrate 3b53416f / Sun, 14 Nov 2010 13:23:34 -0500 Kristofer Henriksson * Work around undesirable realloc behavior 4bf42faf / Sat, 13 Nov 2010 18:43:11 -0500 Kristofer Henriksson * Fix crash caused by invalid FLAC files e109b8a3 / Sat, 13 Nov 2010 17:44:09 -0500 Kristofer Henriksson * Correct oversight in removing StringIO efcc8a1f / Fri, 12 Nov 2010 17:56:32 -0500 Kristofer Henriksson * Fix handling of pathnames for non-regular files 82636665 / Sat, 18 Sep 2010 01:31:08 -0400 Kristofer Henriksson * Add mailmap file for git-blame and friends babf8d75 / Sat, 18 Sep 2010 01:29:59 -0400 Kristofer Henriksson * Update copyright notice in source files 8f9129dc / Sat, 18 Sep 2010 01:27:38 -0400 Kristofer Henriksson * Update README to reflect class and talloc removal 65c7a264 / Sat, 18 Sep 2010 00:49:31 -0400 Kristofer Henriksson * Replace FileTranscoder pseudo-class with struct 77b3af74 / Fri, 17 Sep 2010 17:42:36 -0400 Kristofer Henriksson * Remove and replace StringIO code 6d7474f1 / Wed, 18 Aug 2010 00:41:19 +0200 Gregor Zurowski * Change order of path and command within debug messages. 5d5a4993 / Mon, 16 Aug 2010 12:09:43 -0400 Kristofer Henriksson * Make debug logging a runtime option d18a0ff9 / Thu, 12 Aug 2010 23:49:13 -0400 Kristofer Henriksson * Use proper type for readlink return value 7f4db0bc / Wed, 11 Aug 2010 16:48:51 -0400 Kristofer Henriksson * Improve path and error handling 7c196d09 / Sun, 8 Aug 2010 00:28:53 +0200 Gregor Zurowski * Improve command line argument checks 2747f3a0 / Sun, 8 Aug 2010 00:05:26 +0200 Gregor Zurowski * Add new command line option for mp3 encoding quality bca3fffb / Sat, 7 Aug 2010 23:23:11 +0200 Gregor Zurowski * Improve usage message 017d2254 / Sat, 7 Aug 2010 23:16:52 +0200 Gregor Zurowski * Add new structure for global parameters 95459a23 / Tue, 3 Aug 2010 00:27:21 +0200 Gregor W. Zurowski * Change printf format placeholders for size_t and off_t 3be73682 / Fri, 23 Jul 2010 00:36:53 +0200 Gregor W. Zurowski * Parse command lines with fuse_opt facility 5133aed1 / Wed, 21 Jul 2010 22:09:37 +0200 Gregor W. Zurowski * Add additional, less common but useful tag mappings Changes for version 0.21 (13 Jul 2010): a3c58446 / Sat, 10 Jul 2010 23:37:47 -0400 Kristofer Henriksson * Add install instructions for Ubuntu 94be71db / Mon, 5 Jul 2010 23:12:13 +0200 Gregor W. Zurowski * Increase allowed path length from 256 to PATH_MAX efd9b1c2 / Sun, 4 Jul 2010 16:19:50 -0400 Kristofer Henriksson * Fix track length specification ff7e7270 / Sun, 4 Jul 2010 14:42:58 -0400 Kristofer Henriksson * Require synchronous reads 552ba02d / Sun, 27 Jun 2010 12:50:03 -0400 Kristofer Henriksson * Refactor whitespace and long comments everywhere 9b9084b9 / Sun, 27 Jun 2010 00:48:39 -0400 Kristofer Henriksson * Add support for Replay Gain Changes for version 0.20 (19 Jun 2010): 90d22a25 / Sat, 19 Jun 2010 23:03:42 -0400 Kristofer Henriksson * Add define to fix implicit pread function warning 1c414d11 / Sat, 19 Jun 2010 20:34:11 -0400 Kristofer Henriksson * Add links for the libraries mentioned in the README 79ba3c39 / Sat, 19 Jun 2010 18:48:17 -0400 Kristofer Henriksson * Add description of main and legacy branches to the README da50f431 / Sat, 19 Jun 2010 01:02:38 -0400 Kristofer Henriksson * Change wording slightly in README bdd8b7d7 / Sat, 19 Jun 2010 00:53:32 -0400 Kristofer Henriksson * Update numbers of blocks in README 4dc6ae62 / Fri, 18 Jun 2010 11:02:10 -0400 Kristofer Henriksson * Add dist hook to automatically generate the ChangeLog 26c141da / Thu, 17 Jun 2010 20:26:46 -0400 Kristofer Henriksson * Switch to border-radius in style sheet 37174a84 / Mon, 14 Jun 2010 20:54:22 -0400 Kristofer Henriksson * Remove usage section from INSTALL file 046dd687 / Mon, 14 Jun 2010 20:45:08 -0400 Kristofer Henriksson * Add prerequisites section to INSTALL file 8dbf1f19 / Mon, 14 Jun 2010 00:00:52 -0400 Kristofer Henriksson * Make several improvements to README file 7f0c7760 / Sun, 13 Jun 2010 22:30:58 -0400 Kristofer Henriksson * Fix error in INSTALL file a50ae142 / Sun, 13 Jun 2010 16:49:14 -0400 Kristofer Henriksson * Add build rules for web page 39705880 / Sun, 13 Jun 2010 00:07:05 -0400 Kristofer Henriksson * Rename README to make GitHub happy b96516d3 / Sat, 5 Jun 2010 11:38:51 -0400 Kristofer Henriksson * Require libFLAC 1.1.4 or newer 6170923c / Sat, 5 Jun 2010 00:54:23 -0400 Kristofer Henriksson * Fix all warnings reported by new compiler flags 8c1d9109 / Fri, 4 Jun 2010 14:19:36 -0400 Kristofer Henriksson * Enable all compile warnings and quiet build commands 7b0d5dfe / Wed, 2 Jun 2010 18:40:51 -0400 Kristofer Henriksson * Remove obsolete Makefile (Makefile.basic) 3d0e5ab1 / Wed, 2 Jun 2010 18:19:44 -0400 Kristofer Henriksson * Add more build system optimizations c1a744a5 / Wed, 2 Jun 2010 01:14:47 -0400 Kristofer Henriksson * Update build files to follow newest conventions 065d7880 / Mon, 31 May 2010 16:14:49 -0400 Kristofer Henriksson * Update to FUSE API version 2.6 0d0697a8 / Sun, 30 May 2010 21:13:08 -0400 Kristofer Henriksson * Update repository info in README to current git repository e51387fa / Sun, 30 May 2010 21:04:56 -0400 Kristofer Henriksson * Add myself (Kristofer Henriksson) as maintainer in the README Changes for version 0.14 (30 May 2010): ee53f3de / Sun, 30 May 2010 12:47:01 -0400 Kristofer Henriksson * Add .gitignore file to ignore build output cb14016a / Tue, 22 Dec 2009 15:35:20 -0800 Kristofer Henriksson * Fix song truncation problem and calculated length 351f810a / Mon, 21 Dec 2009 17:47:25 -0800 Kristofer Henriksson * Fix number of blocks reported for files 4840fb1b / Sun, 19 Jul 2009 05:32:31 -0700 David Collett * allow mount directory with comma, fix by Thomas Klausner 41a4c8e9 / Sun, 19 Jul 2009 05:32:02 -0700 David Collett * NetBSD support thanks to Thomas Klausner 0174a776 / Sun, 19 Jul 2009 05:30:06 -0700 David Collett * add a new macro to shutup automake Changes for version 0.13 (13 Dec 2008): fa943b67 / Sat, 13 Dec 2008 21:31:04 -0800 David Collett * Return correct errors from failed fs operations 02e0e857 / Fri, 14 Nov 2008 22:11:53 -0800 Kristofer Henriksson * Add support for album art and improve string conversion 569ee0cb / Thu, 5 Jun 2008 23:05:36 -0700 Kristofer Henriksson * Add support for disc number tag Changes for version 0.12 (8 Mar 2008): 387eee2b / Fri, 7 Mar 2008 20:41:12 -0800 David Collett * cleanup of Transcoder constructor 8e158973 / Tue, 4 Mar 2008 00:40:13 -0800 David Collett * correctly handle mono files (fixes segfault) 5507e250 / Thu, 3 Jan 2008 02:46:35 -0800 David Collett * add note about mounting from /etc/fstab 2ad93804 / Fri, 21 Dec 2007 21:53:34 -0800 David Collett * Unicode tag support from Kristofer Henriksson Changes for version 0.11 (8 Sep 2007): fcf254c1 / Sat, 8 Sep 2007 01:49:08 -0700 David Collett * filename handling fixes from radek.czajka@gmail.com Changes for version 0.10 (26 Aug 2007): ddbd719b / Sun, 26 Aug 2007 01:13:42 -0700 David Collett * update license to gplv3 ddab3fa2 / Sat, 25 Aug 2007 02:02:01 -0700 David Collett * forgot to update INSTALL Changes for version 0.08 (25 Aug 2007): 6052fd00 / Sat, 25 Aug 2007 01:32:16 -0700 David Collett * update README for new cmdline args 53c9534a / Sat, 25 Aug 2007 01:15:03 -0700 David Collett * mount options patch from Daniel Burr 52d11bdf / Sat, 21 Apr 2007 23:27:54 -0700 David Collett * fix a further leak Changes for version 0.07 (7 Apr 2007): 85461c14 / Sat, 7 Apr 2007 23:55:54 -0700 David Collett * fix segfault when scanning some id3 tags d55357e3 / Sat, 7 Apr 2007 23:30:43 -0700 David Collett * fix two memory leaks Changes for version 0.06 (26 Nov 2006): d56a0da3 / Sun, 26 Nov 2006 22:53:08 -0800 David Collett * fix a segfault accessing non-flac files 1c9c1246 / Tue, 14 Nov 2006 01:54:21 -0800 David Collett * forgot a few things removing list.h c1ac3ee5 / Sun, 12 Nov 2006 04:34:17 -0800 David Collett * store transcoder in fuse_file_info, fix threading issue d098b603 / Sat, 11 Nov 2006 23:42:33 -0800 David Collett * small fix for reading last block Changes for version 0.05 (11 Nov 2006): 36f082b8 / Sat, 11 Nov 2006 16:22:18 -0800 David Collett * update README fdec23e1 / Sat, 11 Nov 2006 05:43:48 -0800 David Collett * switch to libid3tag for tagging Changes for version 0.04 (4 Nov 2006): 2f0a05a4 / Sat, 4 Nov 2006 18:29:39 -0800 David Collett * add year and genre id3tags c41d2f02 / Wed, 1 Nov 2006 02:59:02 -0800 David Collett * patch for flac-1.1.3 from Josh Coalson 75c4091b / Fri, 6 Oct 2006 17:57:38 -0700 David Collett * fix typo in README 7bd5fbb9 / Sat, 16 Sep 2006 16:31:31 -0700 David Collett * cleanup NEWS, remove TODO Changes for version 0.03 (16 Sep 2006): 7fa2980e / Sat, 16 Sep 2006 01:09:54 -0700 David Collett * fix bug in last patch be7c3e6b / Sat, 16 Sep 2006 00:48:07 -0700 David Collett * fix crash on closing real files Changes for version 0.02 (20 Aug 2006): 6aa4e0c1 / Sat, 19 Aug 2006 18:56:18 -0700 David Collett * add --enable-debug to configure, debug is now off by default 1334798a / Sat, 19 Aug 2006 18:43:47 -0700 David Collett * increase error checking b68537c0 / Sat, 19 Aug 2006 18:43:10 -0700 David Collett * small README update Changes for version 0.01 (11 Aug 2006): 1039e512 / Fri, 11 Aug 2006 06:28:02 -0700 David Collett * small doco updates 6bbc7f9c / Fri, 11 Aug 2006 06:18:51 -0700 David Collett * fix memory leak and update documentation 9b8387be / Fri, 11 Aug 2006 04:39:50 -0700 David Collett * cleanup debug code 08d3963d / Sun, 6 Aug 2006 01:33:05 -0700 David Collett * add basic usage info ea2db925 / Sun, 6 Aug 2006 01:14:59 -0700 David Collett * add licence to all files 113db0ee / Sun, 6 Aug 2006 00:39:56 -0700 David Collett * autoconf build system 75173763 / Sat, 5 Aug 2006 22:40:00 -0700 David Collett * rearrange some code edc1f6cb / Sat, 5 Aug 2006 22:17:23 -0700 David Collett * mount base dir rather than / 96df25e3 / Sat, 5 Aug 2006 21:47:41 -0700 David Collett * better support for passthrough of real files 45b4b56e / Sat, 5 Aug 2006 21:07:13 -0700 David Collett * small cleanups 3b9408b5 / Sat, 5 Aug 2006 20:13:17 -0700 David Collett * initial checkin ffmpegfs-2.18/test/0000755000000000000000000000000015166203631011172 500000000000000ffmpegfs-2.18/test/test_filesize_wav0000755000000000000000000000014115052412651014560 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filesize" wav ffmpegfs-2.18/test/test_audio_ts0000755000000000000000000000013515052412651013703 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_audio" ts ffmpegfs-2.18/test/test_filenames_ts0000755000000000000000000000014115052412651014542 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filenames" ts ffmpegfs-2.18/test/funcs.sh0000755000000000000000000000501615052412651012567 00000000000000PATH=$PWD/../src:$PATH export LC_ALL=C if [ ! -z "$2" ] then EXITCODE="$2" else EXITCODE=99 fi cleanup () { EXIT=$? echo "Return code: ${EXIT}" # Errors are no longer fatal set +e # Unmount all hash fusermount 2>&- && fusermount -u "${DIRNAME}" || umount -l "${DIRNAME}" # Remove temporary directories rmdir "${DIRNAME}" rm -Rf "${CACHEPATH}" rm -Rf "${TMPPATH}" # Arrividerci exit ${EXIT} } ffmpegfserr () { echo "***TEST FAILED***" echo "Return code: ${EXITCODE}" exit ${EXITCODE} } check_filesize() { MIN="$2" MAX="$3" SHORT="$5" if [ "${FILEEXT}" != "hls" ] then FILE="$1.${FILEEXT}" else FILE="$1" fi if [ -z ${MAX} ] then MAX=${MIN} fi if [ -z "$4" ] then SIZE=$(stat -c %s "${DIRNAME}/${FILE}") else SIZE=$(stat -c %s "${4}/${FILE}") fi if [ ${SIZE} -ge ${MIN} -a ${SIZE} -le ${MAX} ] then RESULT="Pass" RETURN=0 else RESULT="FAIL" RETURN=1 fi if [ -z "${SHORT}" ] then if [ ${MIN} -eq ${MAX} ] then printf "> %s -> File: %-20s Size: %8i (expected %8i)\n" ${RESULT} ${FILE} ${SIZE} ${MIN} else printf "> %s -> File: %-20s Size: %8i (expected %8i...%8i)\n" ${RESULT} ${FILE} ${SIZE} ${MIN} ${MAX} fi else if [ ${MIN} -eq ${MAX} ] then printf "%s -> Size: %8i (expected %8i)\n" ${RESULT} ${SIZE} ${MIN} else printf "%s -> Size: %8i (expected %8i...%8i)\n" ${RESULT} ${SIZE} ${MIN} ${MAX} fi fi if [ ${RETURN} != 0 ]; then exit ${RETURN} fi } set -e trap cleanup EXIT trap ffmpegfserr USR1 DESTTYPE=$1 EXTRANAME=$3 # Map filenames if [ "${DESTTYPE}" == "prores" ]; then # ProRes uses the MOV container FILEEXT="mov" elif [ "${DESTTYPE}" == "alac" ]; then # ALAC (Apple Lossless Coding) uses the mp4 container FILEEXT="m4a" else FILEEXT=${DESTTYPE} fi if [ -z "${EXTRANAME}" ]; then EXTRANAME=$DESTTYPE fi if [ "${EXTRANAME}" == "hls" ]; then EXTRANAME= fi if [ ! -z "${EXTRANAME}" ]; then EXTRANAME=_$EXTRANAME fi SRCDIR="$( cd "${BASH_SOURCE%/*}/srcdir" && pwd )" DIRNAME="$(mktemp -d)" CACHEPATH="$(mktemp -d)" TMPPATH="$(mktemp -d)" #--disable_cache ( ffmpegfs -f "${SRCDIR}" "${DIRNAME}" --logfile=${0##*/}${EXTRANAME}_builtin.log --log_maxlevel=TRACE --cachepath="${CACHEPATH}" --desttype=${DESTTYPE} ${ADDOPT} > /dev/null || kill -USR1 $$ ) & while ! mount | grep -q "${DIRNAME}" ; do sleep 0.1 done ffmpegfs-2.18/test/test_audio_opus0000755000000000000000000000013615052412651014244 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_audio" opus ffmpegfs-2.18/test/test_filenames_flac0000755000000000000000000000014315052412651015023 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filenames" flac ffmpegfs-2.18/test/test_tags_flac0000755000000000000000000000013615052412651014020 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_tags" flac ffmpegfs-2.18/test/test_filenames_prores0000755000000000000000000000015015052412651015426 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filenames" prores mov ffmpegfs-2.18/test/test_cuesheet0000755000000000000000000000135015052412651013701 00000000000000#!/bin/bash ADDOPT="" if [ "$2" == "file" ]; then echo "Checking external cuesheet file" TESTDIR=raven_e_cuesheet.flac.tracks elif [ "$2" == "embedded" ]; then echo "Checking embedded cuesheet" TESTDIR=raven_e.flac.tracks else echo "ERROR! Missing parameter" echo echo "Usage:" echo echo "$(basename -- "$0") DESTTYPE file Check external cue sheet file" echo "$(basename -- "$0") DESTTYPE embedded Check embedded cue sheet file" exit 1 fi . "${BASH_SOURCE%/*}/funcs.sh" "$1" 99 "$2" XDIRNAME="${DIRNAME}/cuesheet/${TESTDIR}" TRACKS=10 ls -1 "${XDIRNAME}" echo "Checking number of tracks is ${TRACKS}" [ $(ls "${XDIRNAME}"/*.${FILEEXT} -1 | wc -l) = ${TRACKS} ] echo "Pass" echo "OK" ffmpegfs-2.18/test/test_tags_alac0000755000000000000000000000013515052412651014012 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_tags" alac ffmpegfs-2.18/test/test_frameset0000755000000000000000000000261515052412651013707 00000000000000#!/bin/bash ADDOPT="" . "${BASH_SOURCE%/*}/funcs.sh" "$1" check_filesize_frameset() { if [ "${FILEEXT}" == "png" ]; then check_filesize "${1}" 38625 139606 "${TMPPATH}" 1 elif [ "${FILEEXT}" == "jpg" ]; then check_filesize "${1}" 26286 70679 "${TMPPATH}" 1 elif [ "${FILEEXT}" == "bmp" ]; then check_filesize "${1}" 7372854 7372854 "${TMPPATH}" 1 fi } # Should be 250 files for 250 frames in source FILES=250 echo "Checking number of files is ${FILES}" [ $(ls "${DIRNAME}"/frame_test_pal.mp4/ -1 | wc -l) = ${FILES} ] echo "Number of files OK" echo "Checking access with full name" for i in 000204 000004 000104 000207 000007 000107 do FILE="${DIRNAME}"/frame_test_pal.mp4/${i}.${FILEEXT} printf "> %s -> " ${FILE##*/} cp -vpf "${FILE}" "${TMPPATH}" > /dev/null #cp -vpf "${FILE}" "${TMPPATH}" > /dev/null check_filesize_frameset "${i}" done echo "Checking access with regular expression" for i in 00024[4-79] 00008[4-79] 00018[4-79] do echo ">> Expression ${i}.*" for FILE in "${DIRNAME}"/frame_test_pal.mp4/${i}.* do FILENAME="${FILE##*/}" printf "> %s -> " ${FILE##*/} cp -vpf "${FILE}" "${TMPPATH}" > /dev/null #cp -vpf "${FILE}" "${TMPPATH}" > /dev/null check_filesize_frameset "${FILENAME%.*}" done 2>/dev/null done echo "Access OK" echo "Pass" echo "OK" ffmpegfs-2.18/test/test_filesize_webm0000755000000000000000000000014215052412651014716 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filesize" webm ffmpegfs-2.18/test/test_video_hw0000755000000000000000000000065015052412651013702 00000000000000#!/bin/bash if [ "$1" == "ENC" ] then ADDOPT="--hwaccel_enc=$2" elif [ "$1" == "DEC" ] then ADDOPT="--hwaccel_dec=$2" else echo "Parameter missing" echo echo "Usage: $0 ENC api" echo "Usage: $0 DEC api" echo echo "Example: $0 ENC VAAPI" exit 1 fi . "${BASH_SOURCE%/*}/funcs.sh" ts 77 "${1,,}_$2" cp -vpf "${DIRNAME}/snowboard.mp4.${FILEEXT}" "${TMPPATH}" || exit 77 # Make test suite report "SKIP" ffmpegfs-2.18/test/test_tags_mp30000755000000000000000000000013515052412651013611 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_tags" mp3 ffmpegfs-2.18/test/test_tags_ogg0000755000000000000000000000013515052412651013666 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_tags" ogg ffmpegfs-2.18/test/test_audio_mp30000755000000000000000000000013615052412651013755 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_audio" mp3 ffmpegfs-2.18/test/test_frameset_png0000755000000000000000000000014015052412651014542 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_frameset" png ffmpegfs-2.18/test/test_filenames_ogg0000755000000000000000000000014215052412651014671 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filenames" ogg ffmpegfs-2.18/test/test_audio_ogg0000755000000000000000000000013615052412651014032 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_audio" ogg ffmpegfs-2.18/test/test_filenames0000755000000000000000000000166015052412651014043 00000000000000#!/bin/bash ADDOPT="" . "${BASH_SOURCE%/*}/funcs.sh" "$1" # Use -w 1000 to ensure all in one line if [ "${FILEEXT}" == "mp4" ] then [ "$(ls -w 1000 -m "${DIRNAME}")" = "copyright, cuesheet, dir.flac, frame_test_pal.${FILEEXT}, raven_d.ogg.${FILEEXT}, raven_e.flac.${FILEEXT}, snowboard.${FILEEXT}" ] elif [ "${FILEEXT}" == "ogg" ] then [ "$(ls -w 1000 -m "${DIRNAME}")" = "copyright, cuesheet, dir.flac, frame_test_pal.mp4.${FILEEXT}, raven_d.${FILEEXT}, raven_e.flac.${FILEEXT}, snowboard.mp4.${FILEEXT}" ] elif [ "${FILEEXT}" == "flac" ] then [ "$(ls -w 1000 -m "${DIRNAME}")" = "copyright, cuesheet, dir.flac, frame_test_pal.mp4.${FILEEXT}, raven_d.ogg.${FILEEXT}, raven_e.${FILEEXT}, snowboard.mp4.${FILEEXT}" ] else [ "$(ls -w 1000 -m "${DIRNAME}")" = "copyright, cuesheet, dir.flac, frame_test_pal.mp4.${FILEEXT}, raven_d.ogg.${FILEEXT}, raven_e.flac.${FILEEXT}, snowboard.mp4.${FILEEXT}" ] fi echo "Pass" echo "OK" ffmpegfs-2.18/test/test_audio_alac0000755000000000000000000000013615052412651014156 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_audio" alac ffmpegfs-2.18/test/test_frameset_bmp0000755000000000000000000000014015052412651014534 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_frameset" bmp ffmpegfs-2.18/test/test_tags_mp40000755000000000000000000000013615052412651013613 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_tags" mp4 1 ffmpegfs-2.18/test/test_filesize_mov0000755000000000000000000000014015052412651014563 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filesize" mov ffmpegfs-2.18/test/test_filesize_aiff0000755000000000000000000000014115052412651014670 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filesize" aiff ffmpegfs-2.18/test/test_audio0000755000000000000000000000442515052412651013203 00000000000000#!/bin/bash ADDOPT="" . "${BASH_SOURCE%/*}/funcs.sh" "$1" check_audio() { if [ "$2" != "${FILEEXT}" ] then TGTFILE="$1.$2.${FILEEXT}" else TGTFILE="$1.${FILEEXT}" fi SRCFILE="$1.$2" EXPECTED="$3" printf "> TRANSCODING %s\n" ${DIRNAME}/${TGTFILE##*/} cp -vpf "${DIRNAME}/${TGTFILE}" "${TMPPATH}" > /dev/null #cp -vpf "${DIRNAME}/${TGTFILE}" "${TMPPATH}" > /dev/null CMPRESULT="$(./fpcompare "${SRCDIR}/${SRCFILE}" "${DIRNAME}/${TGTFILE}")" if [ $(echo "${CMPRESULT} <= ${EXPECTED}" | bc) -eq 1 ] then RESULT="Pass" RETURN=0 else RESULT="FAIL" RETURN=1 fi printf "> %s -> File: %-20s %f (expected %f)\n" ${RESULT} ${TGTFILE} ${CMPRESULT} ${EXPECTED} if [ ${RETURN} != 0 ]; then exit ${RETURN} fi } if [ "${DESTTYPE}" == "mp4" ]; then # mp4 check_audio "raven_e" "flac" 0.04 check_audio "raven_d" "ogg" 0.05 elif [ "${DESTTYPE}" == "mp3" ]; then # mp3 check_audio "raven_e" "flac" 0.04 check_audio "raven_d" "ogg" 0.08 elif [ "${DESTTYPE}" == "wav" ]; then # wav check_audio "raven_e" "flac" 0.0 check_audio "raven_d" "ogg" 0.0 elif [ "${DESTTYPE}" == "ogg" ]; then # ogg check_audio "raven_e" "flac" 0.2 check_audio "raven_d" "ogg" 0.0 elif [ "${DESTTYPE}" == "webm" ]; then # webm check_audio "raven_e" "flac" 0.03 check_audio "raven_d" "ogg" 0.03 elif [ "${DESTTYPE}" == "opus" ]; then # opus check_audio "raven_e" "flac" 0.4 check_audio "raven_d" "ogg" 0.03 elif [ "${DESTTYPE}" == "mov" ]; then # mov check_audio "raven_e" "flac" 0.04 check_audio "raven_d" "ogg" 0.05 elif [ "${DESTTYPE}" == "aiff" ]; then # aiff check_audio "raven_e" "flac" 0.0 check_audio "raven_d" "ogg" 0.0 elif [ "${DESTTYPE}" == "prores" ]; then # prores check_audio "raven_e" "flac" 0.0 check_audio "raven_d" "ogg" 0.0 elif [ "${DESTTYPE}" == "alac" ]; then # alac check_audio "raven_e" "flac" 0.0 check_audio "raven_d" "ogg" 0.0 elif [ "${DESTTYPE}" == "ts" ]; then # ts check_audio "raven_e" "flac" 0.039136 check_audio "raven_d" "ogg" 0.050 elif [ "${DESTTYPE}" == "flac" ]; then # flac check_audio "raven_e" "flac" 0.0 check_audio "raven_d" "ogg" 0.0 else echo "Internal error, unknown type ${DESTTYPE}. Fix script!" exit 99 fi echo "OK" ffmpegfs-2.18/test/test_filenames_aiff0000755000000000000000000000014215052412651015022 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filenames" aiff ffmpegfs-2.18/test/test_video_hw_dec_mmal0000755000000000000000000000014515052412651015522 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_video_hw" DEC mmal ffmpegfs-2.18/test/test_frameset_jpg0000755000000000000000000000014015052412651014536 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_frameset" jpg ffmpegfs-2.18/test/test_filenames_mov0000755000000000000000000000014115052412651014715 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filenames" mov ffmpegfs-2.18/test/test_filesize_ts0000755000000000000000000000014015052412651014410 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filesize" ts ffmpegfs-2.18/test/test_filenames_webm0000755000000000000000000000014315052412651015050 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filenames" webm ffmpegfs-2.18/test/test_filesize_hls0000755000000000000000000000104115052412651014551 00000000000000#!/bin/bash ADDOPT="" . "${BASH_SOURCE%/*}/funcs.sh" "hls" XDIRNAME="${DIRNAME}"/snowboard.mp4 #cp -vpf "${XDIRNAME}"/*.ts "${TMPPATH}" for FILE in "${XDIRNAME}"/*.ts do printf "> TRANSCODING %s\n" ${FILE##*/} cp -vpf ${FILE} "${TMPPATH}" > /dev/null cp -vpf ${FILE} "${TMPPATH}" > /dev/null done 2>/dev/null echo "File sizes" check_filesize "000001.ts" 1478620 1566416 "${XDIRNAME}" check_filesize "000002.ts" 1513964 1570552 "${XDIRNAME}" check_filesize "000003.ts" 1193612 1278024 "${XDIRNAME}" echo "File sizes OK" echo "OK" ffmpegfs-2.18/test/test_filesize0000755000000000000000000000441715052412651013715 00000000000000#!/bin/bash ADDOPT="" . "${BASH_SOURCE%/*}/funcs.sh" "$1" # Ensure log contains file sizes, predicted and actual echo "TRANSCODING ${DIRNAME}/raven_e.flac.${FILEEXT}" cp -vpf "${DIRNAME}/raven_e.flac.${FILEEXT}" "${TMPPATH}" > /dev/null cp -vpf "${DIRNAME}/raven_e.flac.${FILEEXT}" "${TMPPATH}" > /dev/null echo "TRANSCODING ${DIRNAME}/raven_d.ogg.${FILEEXT}" cp -vpf "${DIRNAME}/raven_d.ogg.${FILEEXT}" "${TMPPATH}" > /dev/null cp -vpf "${DIRNAME}/raven_d.ogg.${FILEEXT}" "${TMPPATH}" > /dev/null if [ "${DESTTYPE}" == "mp4" ]; then # mp4 check_filesize "raven_e.flac" 485372 494238 check_filesize "raven_d.ogg" 349440 355298 elif [ "${DESTTYPE}" == "mp3" ]; then # mp3 check_filesize "raven_e.flac" 466980 490440 check_filesize "raven_d.ogg" 342690 343527 elif [ "${DESTTYPE}" == "wav" ]; then # wav check_filesize "raven_e.flac" 5137707 5137772 check_filesize "raven_d.ogg" 4316344 4316536 elif [ "${DESTTYPE}" == "ogg" ]; then # ogg check_filesize "raven_e.flac" 356662 489113 check_filesize "raven_d" 264179 elif [ "${DESTTYPE}" == "webm" ]; then # webm check_filesize "raven_e.flac" 429341 548761 check_filesize "raven_d.ogg" 262842 393946 elif [ "${DESTTYPE}" == "opus" ]; then # opus check_filesize "raven_e.flac" 421673 548761 check_filesize "raven_d.ogg" 255740 393946 elif [ "${DESTTYPE}" == "mov" ]; then # mov check_filesize "raven_e.flac" 486559 495447 check_filesize "raven_d.ogg" 342690 356142 elif [ "${DESTTYPE}" == "aiff" ]; then # aiff check_filesize "raven_e.flac" 5137707 5140125 check_filesize "raven_d.ogg" 4316344 4316488 elif [ "${DESTTYPE}" == "prores" ]; then # prores check_filesize "raven_e.flac" 5137707 5140129 check_filesize "raven_d.ogg" 4316344 4318666 elif [ "${DESTTYPE}" == "alac" ]; then # alac check_filesize "raven_e.flac" 3952038 3986427 check_filesize "raven_d.ogg" 3276205 3320221 elif [ "${DESTTYPE}" == "ts" ]; then # ts check_filesize "raven_e.flac" 489113 811408 check_filesize "raven_d.ogg" 351126 545388 elif [ "${DESTTYPE}" == "flac" ]; then # flac check_filesize "raven_e.flac" 3037626 3596355 check_filesize "raven_d.ogg" 1132018 1132062 else echo "Internal error, unknown type ${DESTTYPE}. Fix script!" exit 99 fi ffmpegfs-2.18/test/test_filesize_opus0000755000000000000000000000014115052412651014751 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filesize" opus ffmpegfs-2.18/test/test_filenames_mp30000755000000000000000000000014215052412651014614 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filenames" mp3 ffmpegfs-2.18/test/test_filenames_hls0000755000000000000000000000035115052412651014705 00000000000000#!/bin/bash ADDOPT="" . "${BASH_SOURCE%/*}/funcs.sh" "hls" XDIRNAME="${DIRNAME}"/snowboard.mp4 echo "Checking file names" [ "$(ls --ignore='*.ts' -w 1000 -m "${XDIRNAME}")" = "hls.html, index_0_av.m3u8, master.m3u8" ] echo "OK" ffmpegfs-2.18/test/test_filenames_mp40000755000000000000000000000014215052412651014615 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filenames" mp4 ffmpegfs-2.18/test/test_audio_mp40000755000000000000000000000013615052412651013756 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_audio" mp4 ffmpegfs-2.18/test/test_video_hw_enc_omx0000755000000000000000000000014415052412651015410 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_video_hw" ENC omx ffmpegfs-2.18/test/test_tags_opus0000755000000000000000000000013515052412651014100 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_tags" opus ffmpegfs-2.18/test/Makefile.am0000644000000000000000000000355515052412651013154 00000000000000TESTS=\ test_audio_aiff \ test_audio_alac \ test_audio_flac \ test_audio_mov \ test_audio_mp3 \ test_audio_mp4 \ test_audio_ogg \ test_audio_opus \ test_audio_prores \ test_audio_ts \ test_audio_wav \ test_audio_webm \ test_cuesheet_file \ test_cuesheet_embedded \ test_filecount_hls \ test_filenames_aiff \ test_filenames_alac \ test_filenames_flac \ test_filenames_hls \ test_filenames_mov \ test_filenames_mp3 \ test_filenames_mp4 \ test_filenames_ogg \ test_filenames_opus \ test_filenames_prores \ test_filenames_ts \ test_filenames_wav \ test_filenames_webm \ test_filesize_aiff \ test_filesize_alac \ test_filesize_flac \ test_filesize_hls \ test_filesize_mov \ test_filesize_mp3 \ test_filesize_mp4 \ test_filesize_ogg \ test_filesize_opus \ test_filesize_prores \ test_filesize_ts \ test_filesize_video_mov \ test_filesize_video_mp4 \ test_filesize_video_prores \ test_filesize_video_ts \ test_filesize_video_webm \ test_filesize_wav \ test_filesize_webm \ test_frameset_bmp \ test_frameset_jpg \ test_frameset_png \ test_tags_aiff \ test_tags_alac \ test_tags_flac \ test_tags_mov \ test_tags_mp3 \ test_tags_mp4 \ test_tags_ogg \ test_tags_opus \ test_tags_prores \ test_tags_ts \ test_tags_wav \ test_tags_webm \ test_video_hw_dec_mmal \ test_video_hw_dec_vaapi \ test_video_hw_enc_omx \ test_video_hw_enc_vaapi EXTRA_DIST = $(TESTS) funcs.sh srcdir test_filenames test_tags test_audio test_filesize test_frameset test_filesize_video test_video_hw test_cuesheet EXTRA_DIST += $(wildcard tags/*) # NOT IN RELEASE 1.0! Add later: test_picture CLEANFILES = $(patsubst %,%_builtin.log,$(TESTS)) AM_CPPFLAGS=-Ofast $(libswresample_CFLAGS) check_PROGRAMS = fpcompare metadata fpcompare_SOURCES = fpcompare.c fpcompare_LDADD = -lchromaprint -lavcodec -lavformat -lavutil $(libswresample_LIBS) metadata_SOURCES = metadata.c metadata_LDADD = -lavcodec -lavformat -lavutil $(libswresample_LIBS) ffmpegfs-2.18/test/test_tags_aiff0000755000000000000000000000013515052412651014017 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_tags" aiff ffmpegfs-2.18/test/test_tags0000755000000000000000000000426115052412651013036 00000000000000#!/bin/bash ADDOPT="" __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" . "${BASH_SOURCE%/*}/funcs.sh" "$1" VIDEO=$2 # Fixes to make these checks work with Libav 12 # # Change... # ^TXXX=DESCRIPTION -> TXXX=comment # ^TDRL -> TDRC # ^desc -> ?cmt (but keep ^description=) # get_metadata() { local -n outvar=$2 # -n makes it a nameref. echo Checking $1 cp -vpf "$1" "${TMPPATH}" > /dev/null #cp -vpf "$1" "${TMPPATH}" > /dev/null outvar=`./metadata "$1" | fgrep = | sort -u | sed -r 's/^encoder=.*//I' | sed -r '/^vendor_id=.*$/Id'` } # Detect FFmpeg version # FFmpeg versions prior to 3.2.x store a title in the file and the encoder version, nothing else... FFMPEGVERSION=`./metadata -v | sed -n 's/^FFmpeg[^0-9]\([0-9]*\.[0-9]*\).*$/\1/p' | head -n 1` if [ -z "${FFMPEGVERSION}" ] && [ -z "${LIBAVVERSION}" ]; then FFMPEGVERSION=`./metadata -v | sed -n 's/^FFmpeg \(.*\)$/\1/p' | head -n 1` fi if [ ! -z "${FFMPEGVERSION}" ]; then echo "FFmpeg version is ${FFMPEGVERSION}" LIBRARY=ffmpeg if [[ "${FFMPEGVERSION}" == N* ]]; then echo "FFmpeg Nightly Build" VERSION=N elif (( $(echo "${FFMPEGVERSION} >= 4.3" | bc -l) )); then echo "FFmpeg > 4.3" VERSION=4.3 elif (( $(echo "${FFMPEGVERSION} >= 4.2" | bc -l) )); then echo "FFmpeg > 4.2" VERSION=4.2 elif (( $(echo "${FFMPEGVERSION} >= 4.0" | bc -l) )); then echo "FFmpeg > 4.0" VERSION=4.0 fi else echo "Internal error: FFmpeg/Libav version unknown." exit 99 fi if [ "${VIDEO}" == "1" ]; then FILELIST="raven_e.flac raven_d.ogg snowboard.mp4" else FILELIST="raven_e.flac raven_d.ogg" fi for FILE in ${FILELIST} do TAGFILENAME=${FILE%.*}.${DESTTYPE}.tag TAGFILEPATH=${__dir}/tags/${LIBRARY}${VERSION}/${TAGFILENAME} TAGFILEPATH=${__dir}/tags/${LIBRARY}${VERSION}/${TAGFILENAME} get_metadata "${DIRNAME}/${FILE}.${FILEEXT}" TAGS echo "${TAGS}" > "${TAGFILENAME}" echo "Compare file: ${TAGFILEPATH}" echo "Tags found:" echo "${TAGS}" cmp -c "${TAGFILEPATH}" "${TAGFILENAME}" printf "*** PASS ***\n\n" rm -f "${TAGFILENAME}" done echo "OK" ffmpegfs-2.18/test/tags/0000755000000000000000000000000015166203631012130 500000000000000ffmpegfs-2.18/test/tags/ffmpeg4.0/0000755000000000000000000000000015052412651013614 500000000000000ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.flac.tag0000644000000000000000000000007115052412651016552 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.mp4.tag0000644000000000000000000000022515052412651016346 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso2iso6mp41 handler_name=SoundHandler language=und major_brand=isom minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.wav.tag0000644000000000000000000000005015052412651016437 00000000000000artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.opus.tag0000644000000000000000000000007215052412651016633 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/snowboard.prores.tag0000644000000000000000000000044715052412651017545 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=qt iso6 date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng major_brand=qt minor_version=512 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.alac.tag0000644000000000000000000000022115052412651016541 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso2iso6 handler_name=SoundHandler language=und major_brand=M4A minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.opus.tag0000644000000000000000000000007215052412651016634 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.prores.tag0000644000000000000000000000021515052412651017157 00000000000000artist=Edgar Allan Poe compatible_brands=qt iso6 handler_name=SoundHandler language=eng major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/snowboard.mov.tag0000644000000000000000000000044715052412651017034 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=qt iso6 date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng major_brand=qt minor_version=512 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.aiff.tag0000644000000000000000000000002015052412651016543 00000000000000title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.alac.tag0000644000000000000000000000022115052412651016542 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso2iso6 handler_name=SoundHandler language=und major_brand=M4A minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.aiff.tag0000644000000000000000000000002015052412651016544 00000000000000title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.ogg.tag0000644000000000000000000000007215052412651016421 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.ts.tag0000644000000000000000000000000115052412651016264 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.mov.tag0000644000000000000000000000021515052412651016445 00000000000000artist=Edgar Allan Poe compatible_brands=qt iso6 handler_name=SoundHandler language=eng major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.prores.tag0000644000000000000000000000021515052412651017156 00000000000000artist=Edgar Allan Poe compatible_brands=qt iso6 handler_name=SoundHandler language=eng major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/obama.ts.tag0000644000000000000000000000000115052412651015724 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.ogg.tag0000644000000000000000000000007215052412651016422 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.webm.tag0000644000000000000000000000005115052412651016574 00000000000000ARTIST=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.webm.tag0000644000000000000000000000005015052412651016574 00000000000000ARTIST=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.ts.tag0000644000000000000000000000000115052412651016263 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.mp4.tag0000644000000000000000000000022515052412651016345 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso2iso6mp41 handler_name=SoundHandler language=und major_brand=isom minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven.ts.tag0000644000000000000000000000000115052412651015760 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.wav.tag0000644000000000000000000000005015052412651016436 00000000000000artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/snowboard.webm.tag0000644000000000000000000000047715052412651017170 00000000000000ALBUM=Snowboard ARTIST=Norbert Schlia COMMENT=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria COMPATIBLE_BRANDS=isomiso2avc1mp41 DATE=2018 GENRE=Demo HANDLER_NAME=SoundHandler HANDLER_NAME=VideoHandler MAJOR_BRAND=isom MINOR_VERSION=512 SEASON_NUMBER=0 language=eng title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.flac.tag0000644000000000000000000000007115052412651016551 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_d.mp3.tag0000644000000000000000000000007315052412651016345 00000000000000DURATION=24468753 artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.mov.tag0000644000000000000000000000021515052412651016446 00000000000000artist=Edgar Allan Poe compatible_brands=qt iso6 handler_name=SoundHandler language=eng major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/raven_e.mp3.tag0000644000000000000000000000007315052412651016346 00000000000000DURATION=29125011 artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.0/snowboard.mp4.tag0000644000000000000000000000052015052412651016723 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=isomiso2avc1iso6mp41 date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng language=und major_brand=isom minor_version=512 season_number=0 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.0/snowboard.ts.tag0000644000000000000000000000001515052412651016650 00000000000000language=eng ffmpegfs-2.18/test/tags/ffmpeg4.3/0000755000000000000000000000000015052412651013617 500000000000000ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.flac.tag0000644000000000000000000000007115052412651016555 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.mp4.tag0000644000000000000000000000022515052412651016351 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso6iso2mp41 handler_name=SoundHandler language=und major_brand=isom minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.wav.tag0000644000000000000000000000005015052412651016442 00000000000000artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.opus.tag0000644000000000000000000000007115052412651016635 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/snowboard.prores.tag0000644000000000000000000000044315052412651017544 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=qt date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng major_brand=qt minor_version=512 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.alac.tag0000644000000000000000000000022515052412651016550 00000000000000artist=Edgar Allan Poe compatible_brands=M4A iso6isomiso2 handler_name=SoundHandler language=und major_brand=M4A minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.opus.tag0000644000000000000000000000007115052412651016636 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.prores.tag0000644000000000000000000000017415052412651017166 00000000000000artist=Edgar Allan Poe compatible_brands=qt handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/snowboard.mov.tag0000644000000000000000000000044315052412651017033 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=qt date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng major_brand=qt minor_version=512 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.aiff.tag0000644000000000000000000000002015052412651016546 00000000000000title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.alac.tag0000644000000000000000000000022515052412651016551 00000000000000artist=Edgar Allan Poe compatible_brands=M4A iso6isomiso2 handler_name=SoundHandler language=und major_brand=M4A minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.aiff.tag0000644000000000000000000000002015052412651016547 00000000000000title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.ogg.tag0000644000000000000000000000007115052412651016423 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.ts.tag0000644000000000000000000000000115052412651016267 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.mov.tag0000644000000000000000000000017415052412651016454 00000000000000artist=Edgar Allan Poe compatible_brands=qt handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.prores.tag0000644000000000000000000000017415052412651017165 00000000000000artist=Edgar Allan Poe compatible_brands=qt handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/obama.ts.tag0000644000000000000000000000000115052412651015727 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.ogg.tag0000644000000000000000000000007115052412651016424 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.webm.tag0000644000000000000000000000005115052412651016577 00000000000000ARTIST=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.webm.tag0000644000000000000000000000005015052412651016577 00000000000000ARTIST=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.ts.tag0000644000000000000000000000000115052412651016266 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.mp4.tag0000644000000000000000000000022515052412651016350 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso6iso2mp41 handler_name=SoundHandler language=und major_brand=isom minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven.ts.tag0000644000000000000000000000000115052412651015763 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.wav.tag0000644000000000000000000000005015052412651016441 00000000000000artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/snowboard.webm.tag0000644000000000000000000000047715052412651017173 00000000000000ALBUM=Snowboard ARTIST=Norbert Schlia COMMENT=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria COMPATIBLE_BRANDS=isomiso2avc1mp41 DATE=2018 GENRE=Demo HANDLER_NAME=SoundHandler HANDLER_NAME=VideoHandler MAJOR_BRAND=isom MINOR_VERSION=512 SEASON_NUMBER=0 language=eng title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.flac.tag0000644000000000000000000000007115052412651016554 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_d.mp3.tag0000644000000000000000000000007315052412651016350 00000000000000DURATION=24468753 artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.mov.tag0000644000000000000000000000017415052412651016455 00000000000000artist=Edgar Allan Poe compatible_brands=qt handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/raven_e.mp3.tag0000644000000000000000000000007315052412651016351 00000000000000DURATION=29125011 artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.3/snowboard.mp4.tag0000644000000000000000000000052015052412651016726 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=isomiso6iso2avc1mp41 date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng language=und major_brand=isom minor_version=512 season_number=0 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.3/snowboard.ts.tag0000644000000000000000000000001515052412651016653 00000000000000language=eng ffmpegfs-2.18/test/tags/ffmpegN/0000755000000000000000000000000015052412651013510 500000000000000ffmpegfs-2.18/test/tags/ffmpegN/raven_e.flac.tag0000644000000000000000000000007115052412651016446 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.mp4.tag0000644000000000000000000000022515052412651016242 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso6iso2mp41 handler_name=SoundHandler language=und major_brand=isom minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.wav.tag0000644000000000000000000000005015052412651016333 00000000000000artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_d.opus.tag0000644000000000000000000000007115052412651016526 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpegN/snowboard.prores.tag0000644000000000000000000000044315052412651017435 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=qt date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng major_brand=qt minor_version=512 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpegN/raven_d.alac.tag0000644000000000000000000000022515052412651016441 00000000000000artist=Edgar Allan Poe compatible_brands=M4A iso6isomiso2 handler_name=SoundHandler language=und major_brand=M4A minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.opus.tag0000644000000000000000000000007115052412651016527 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.prores.tag0000644000000000000000000000017415052412651017057 00000000000000artist=Edgar Allan Poe compatible_brands=qt handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/snowboard.mov.tag0000644000000000000000000000044315052412651016724 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=qt date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng major_brand=qt minor_version=512 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpegN/raven_d.aiff.tag0000644000000000000000000000002015052412651016437 00000000000000title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.alac.tag0000644000000000000000000000022515052412651016442 00000000000000artist=Edgar Allan Poe compatible_brands=M4A iso6isomiso2 handler_name=SoundHandler language=und major_brand=M4A minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.aiff.tag0000644000000000000000000000002015052412651016440 00000000000000title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_d.ogg.tag0000644000000000000000000000007115052412651016314 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.ts.tag0000644000000000000000000000000115052412651016160 00000000000000 ffmpegfs-2.18/test/tags/ffmpegN/raven_d.mov.tag0000644000000000000000000000017415052412651016345 00000000000000artist=Edgar Allan Poe compatible_brands=qt handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_d.prores.tag0000644000000000000000000000017415052412651017056 00000000000000artist=Edgar Allan Poe compatible_brands=qt handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/obama.ts.tag0000644000000000000000000000000115052412651015620 00000000000000 ffmpegfs-2.18/test/tags/ffmpegN/raven_e.ogg.tag0000644000000000000000000000007115052412651016315 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_d.webm.tag0000644000000000000000000000005115052412651016470 00000000000000ARTIST=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.webm.tag0000644000000000000000000000005015052412651016470 00000000000000ARTIST=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_d.ts.tag0000644000000000000000000000000115052412651016157 00000000000000 ffmpegfs-2.18/test/tags/ffmpegN/raven_d.mp4.tag0000644000000000000000000000022515052412651016241 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso6iso2mp41 handler_name=SoundHandler language=und major_brand=isom minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven.ts.tag0000644000000000000000000000000115052412651015654 00000000000000 ffmpegfs-2.18/test/tags/ffmpegN/raven_d.wav.tag0000644000000000000000000000005015052412651016332 00000000000000artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/snowboard.webm.tag0000644000000000000000000000047715052412651017064 00000000000000ALBUM=Snowboard ARTIST=Norbert Schlia COMMENT=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria COMPATIBLE_BRANDS=isomiso2avc1mp41 DATE=2018 GENRE=Demo HANDLER_NAME=SoundHandler HANDLER_NAME=VideoHandler MAJOR_BRAND=isom MINOR_VERSION=512 SEASON_NUMBER=0 language=eng title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpegN/raven_d.flac.tag0000644000000000000000000000007115052412651016445 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_d.mp3.tag0000644000000000000000000000007315052412651016241 00000000000000DURATION=24468753 artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.mov.tag0000644000000000000000000000017415052412651016346 00000000000000artist=Edgar Allan Poe compatible_brands=qt handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/raven_e.mp3.tag0000644000000000000000000000007315052412651016242 00000000000000DURATION=29125011 artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpegN/snowboard.mp4.tag0000644000000000000000000000052015052412651016617 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=isomiso6iso2avc1mp41 date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng language=und major_brand=isom minor_version=512 season_number=0 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpegN/snowboard.ts.tag0000644000000000000000000000001515052412651016544 00000000000000language=eng ffmpegfs-2.18/test/tags/ffmpeg4.2/0000755000000000000000000000000015052412651013616 500000000000000ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.flac.tag0000644000000000000000000000007115052412651016554 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.mp4.tag0000644000000000000000000000022515052412651016350 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso2iso6mp41 handler_name=SoundHandler language=und major_brand=isom minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.wav.tag0000644000000000000000000000005015052412651016441 00000000000000artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.opus.tag0000644000000000000000000000007115052412651016634 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/snowboard.prores.tag0000644000000000000000000000044715052412651017547 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=qt iso6 date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng major_brand=qt minor_version=512 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.alac.tag0000644000000000000000000000022115052412651016543 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso2iso6 handler_name=SoundHandler language=und major_brand=M4A minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.opus.tag0000644000000000000000000000007115052412651016635 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.prores.tag0000644000000000000000000000020015052412651017153 00000000000000artist=Edgar Allan Poe compatible_brands=qt iso6 handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/snowboard.mov.tag0000644000000000000000000000044715052412651017036 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=qt iso6 date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng major_brand=qt minor_version=512 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.aiff.tag0000644000000000000000000000002015052412651016545 00000000000000title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.alac.tag0000644000000000000000000000022115052412651016544 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso2iso6 handler_name=SoundHandler language=und major_brand=M4A minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.aiff.tag0000644000000000000000000000002015052412651016546 00000000000000title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.ogg.tag0000644000000000000000000000007115052412651016422 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.ts.tag0000644000000000000000000000000115052412651016266 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.mov.tag0000644000000000000000000000020015052412651016441 00000000000000artist=Edgar Allan Poe compatible_brands=qt iso6 handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.prores.tag0000644000000000000000000000020015052412651017152 00000000000000artist=Edgar Allan Poe compatible_brands=qt iso6 handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/obama.ts.tag0000644000000000000000000000000115052412651015726 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.ogg.tag0000644000000000000000000000007115052412651016423 00000000000000ARTIST=Edgar Allan Poe DURATION=29125011 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.webm.tag0000644000000000000000000000005115052412651016576 00000000000000ARTIST=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.webm.tag0000644000000000000000000000005015052412651016576 00000000000000ARTIST=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.ts.tag0000644000000000000000000000000115052412651016265 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.mp4.tag0000644000000000000000000000022515052412651016347 00000000000000artist=Edgar Allan Poe compatible_brands=isomiso2iso6mp41 handler_name=SoundHandler language=und major_brand=isom minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven.ts.tag0000644000000000000000000000000115052412651015762 00000000000000 ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.wav.tag0000644000000000000000000000005015052412651016440 00000000000000artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/snowboard.webm.tag0000644000000000000000000000047715052412651017172 00000000000000ALBUM=Snowboard ARTIST=Norbert Schlia COMMENT=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria COMPATIBLE_BRANDS=isomiso2avc1mp41 DATE=2018 GENRE=Demo HANDLER_NAME=SoundHandler HANDLER_NAME=VideoHandler MAJOR_BRAND=isom MINOR_VERSION=512 SEASON_NUMBER=0 language=eng title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.flac.tag0000644000000000000000000000007115052412651016553 00000000000000ARTIST=Edgar Allan Poe DURATION=24468753 TITLE=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_d.mp3.tag0000644000000000000000000000007315052412651016347 00000000000000DURATION=24468753 artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.mov.tag0000644000000000000000000000020015052412651016442 00000000000000artist=Edgar Allan Poe compatible_brands=qt iso6 handler_name=SoundHandler major_brand=qt minor_version=512 title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/raven_e.mp3.tag0000644000000000000000000000007315052412651016350 00000000000000DURATION=29125011 artist=Edgar Allan Poe title=The Raven ffmpegfs-2.18/test/tags/ffmpeg4.2/snowboard.mp4.tag0000644000000000000000000000052015052412651016725 00000000000000album=Snowboard artist=Norbert Schlia comment=Snowboard ride footage taken with action cam 2018-01-13 Saalbach/Austria compatible_brands=isomiso2avc1iso6mp41 date=2018 genre=Demo handler_name=SoundHandler handler_name=VideoHandler language=eng language=und major_brand=isom minor_version=512 season_number=0 title=Video Transcode Demo ffmpegfs-2.18/test/tags/ffmpeg4.2/snowboard.ts.tag0000644000000000000000000000001515052412651016652 00000000000000language=eng ffmpegfs-2.18/test/test_audio_flac0000755000000000000000000000013715052412651014164 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_audio" flac ffmpegfs-2.18/test/test_filesize_alac0000755000000000000000000000014115052412651014663 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filesize" alac ffmpegfs-2.18/test/test_tags_mov0000755000000000000000000000013615052412651013714 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_tags" mov 1 ffmpegfs-2.18/test/test_cuesheet_embedded0000755000000000000000000000015215052412651015511 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_cuesheet" flac embedded ffmpegfs-2.18/test/test_audio_webm0000755000000000000000000000013715052412651014211 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_audio" webm ffmpegfs-2.18/test/test_video_hw_enc_vaapi0000755000000000000000000000014615052412651015707 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_video_hw" ENC vaapi ffmpegfs-2.18/test/test_filesize_prores0000755000000000000000000000014315052412651015277 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_filesize" prores ffmpegfs-2.18/test/test_video_hw_dec_vaapi0000755000000000000000000000014615052412651015675 00000000000000#!/bin/bash __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" "${__dir}/test_video_hw" DEC vaapi ffmpegfs-2.18/test/srcdir/0000755000000000000000000000000015052412651012456 500000000000000ffmpegfs-2.18/test/srcdir/snowboard.mp40000644000000000000000001646330315052412651015036 00000000000000 ftypisomisomiso2avc1mp41free:8mdatEH, #x264 - core 148 r2748 97eaef2 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=1000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00- eW< X~ {핥S+BKB.% g/f:62J =Gl(b{l8vD\&OmjL#@EIpϵ' ᄴmS57)eLe 888(ָoωJ )HR AuY\qf# :^(=@fH~ǡ;jAof ^Dlo\DZ&!&臂$P8ja")HP4-k3!lawR  wbEHunjGA1:pr$gXTG]£-JV6O ;D&Ze/;++`2{ $yxTxQs Ԭ;C]p%@I/qNJRėP'@y(-cQCXaTvI<[tgr4ęUQ4Jm-EKp@eĆpG.ڏOpg%&_h#jIChΓ P˟tA;ϗn/6ER|-pGkЦbWXR[%5ބB _\J> .> fUi>?{:?'\k7\=l0S6t8F{ Yc]D[1 M bo+FzTvD₴.Vml0+wZᶓ>fL9w}'>3y.'z #GM aac81w%)h[es#-gRyܡr9t:?Lβ01'+9B[ߪ[N,avVKQDlZȔ8@NeLHCejbX[*@ܺ >7_.ժ^gǦS܃ЉAUD ηtGfҳd yo=ۦhRtb.wU BƴEqsl`mQyǡew:[{u]50^Zl,\nd;*))*IF=0_]1"JA?[а{K:FGV%ʟ@9ŴFW&iLn _;q֧TTiU>OeBFxyN{`!+U)=R+mY~}Ecs;l5%JsyK =(5fF fe|d^ (J| Wapc<0w J oyy #6s1Clv-=hG;ge*WӤq(4炼ӠmG {t/qkL~MrΙL=G X'H=x5;a+Ӿŀw%Jau֌hF֬6|_պ(qN1;olR⭍|y,g=,mdI/y^z`3Efk#D-$i$ *g2oa/+2ny!+GHޡC{xoPbFsMn+KxZ7 Z2i|5z@ߓʓ!wjp1FavNf,]*8 Zy2/ <hIP9ȏ{u _+NLxH^pMFi8"^_!Ut\hBc` [Iiw4+n>Ype$Pa#Wq~t,U||B%DGE2#RϴTlFQU=ܚx`_@ f`' -ӧժY Z)EVHPpV%VOk^)Im>gpMMj 3H5 7 y}i~kPHJ#@>`/` el_ȑR;d{f8Jl>q8XrУ6I]V|rm\Q̢(VxJhp#^P28$+?=&a)J 0OCT`(/xrn%,jR+ 1pOCZ) E:s뻂LLwh$ĎCZYc5uϽ<ۃ5-.">L h)id\"hH,.G~"g Dā6G~ٵ0 [ mV2)\fAxz%qSK/aR;: Ǧrm. J&A([ddSцbէ\BBnaDk.zw4 E92JfBne_=0]X3wƫWo$,314 (#=,yauSLDJ3-f&AJ#RW[ j Hъ8?I%1]59MELby1D"st1 8+,UVCqU\żf,?j^K%rymR!-.b /_u"\sOHl\>|ęRb W~e?FWl:-sO!Nê1wBqsz2"uSřFzon"켪0f cô۔g+U~P5W5r,nm wzB5<Q8I7T:Q-iLD2}:*p:m6c5 J@Bza?sUeoaxE~ocM c[y਴ .rA 4x<=w2I@;ݣZŷv_g甼TsAC/WbnHa-=psGMWOETƴ; pj?A+/b]Ykʺ@b kZ! y^ K V$tvac,!KY$Q77L5k5ǽLAGZ<qI XgZi5lk޼qoI: 5w{ 3E+wJ)X+*j $;uϟm$@_o5tdrox虿BAfd$%UG&FWay8 HK: L&"W>33>g=!%|YpWftgжKLB$6PJzTy|A]e Im`tk\@im%3KoJԄ}g;A.jB"Dt2sb4MXڏ_(gt{Η֟'"፰NA\0t@IW`h͒ byՆinXᬏCKy=.;*.h +- /S3 I@3O)B(\Rvkx"_Ug ~ő9"{BMb z0G}BlwπÅ8f CZ53l><\%޽ElY4g]m'8۰9~LRͥJKt=/JFqȯj5`=!39pY,}MxY{ʒ o*˞+ Bv/Aeε,_/Ml8J4k 7"~Fy{[0TLdz[5ڙnxӏfw츋q 934sWfZZ|Tf4(8]a@~IKA3Z&@́3=vz[Ή]{Ǐ͓c#hXҞ]L t=-gkl* N3XB@ ;rnK ?^s P $UwQa_&0/@#֒MhvqDS)^_'P3{=u^݋9Ib4k*`Msܴ,pUq3dwr#kSgYBGHTM0bY^TF)+fDoӱ-:UJ#Fr,{߽FY;*(9#FGFpvyûH #Q~,&U%=uo^֨\|O;9K@o隼ޅ ӯ'Xe+X rq\0cxؽւhy$=C\~FZHbuF3Z1 ՆwT;T C_j)\?W۔n<A"wE]4u[61pT'sGP6HOT9#,79S!V5o!Tsco}Yai`fJn8w]WiOHT5N8}J@V>7҈5ٯ\</HC} 70UϾtJӳv1|>W/d5drok7^B|q`ׯv9W Ӭh u)l%!HB{SwmCZT՚JBiMsv4/:S͸:`}uIAveQ9p4WB\ c~nsB}mU,HKj_EPa*Etó#pd#ǪL?y.F~itBI: Gz :avIz*ƲY3OZۣkj-ӷ-NJ$=DcIXB綦t ڨ(OsR(Ol=ˀ歖YKidXRpڥ_&HS>\sjLJKMİX, C,+ #o|(?0](U% .c2bhjaӑ<)@nK5&3^+v~6$WO"SFLiIX"n7ȵClq܉MVK˻t 0^r>E&kXsl*[d|aNb{3D,kfkGwL }x F6w1oKW|ˤρ}WCy(-lg~錋 d!+$V NkBt)Yk".K V86q͕ׅK9 iz0#WC O zw'IRcćYsBD.#'RQ9F ҡ =%|?B⯟B2C{59)/lRGB2nt$hTDd&1;MTeZ\ aǐ}-m ( @jM%Ou3ͻp07,,GD_d?di] rg_e-%{nnv== P‰eHy/&{l1|p*#RO+2;6U5jLUjPt#<5w[| y{NP(aH^մE\5E~ z8 0Jz xŷKJ80mPx>Wa 1fJҷsN!''*F+kM1FL!` 0Sd*w<҂? ܦ$57vM)T)-E:Aq "p B2yk"ƅXg@p͏0ڰY!-qYMH;v/cFBΐpl`ˡJ,6KևT՗5;..ze݈'0Ԡl]N\~\St[utHtw2ۋ ^Ho8>^˨?uj`;* ?J 06D+"z ,e%exMLe^ &G-?⳻@c;LLԍ$XH~,:xrDIHQnםr }Ԍ>P| sq>djlWs1+ݾRAwb sp] ,nH^b\_69X⁆/`{a`q+'WBD6`ט%J<dQ}`WT'^`>r6E94Ju|3ػ6GUWU/{E@ߕvgu⨏dƄ2W+pabU@0`l0FqGTrL`KNHIS%e2k=g`_p΀"y4cj$V!]GF!æO@Fx FCNX04?IGWO0:XFDs8xy?FP7 A`@[n1$=Y:(Qo9p Vd2}\z}gxDyW}æ!U]ǟQbA2xOJ ")W|O \[cPI}gcQWCk75^}F o X4ܜuVfR?] ~P js)fQ,vxЩ||:j~\D|RQsJ.$YSM9o~z$ | i]GiTMA0ngͫP(_B ~ę3<31ؒFlHl_]"Ы6q{/X}9Tr"@T<1Gw@Oeo{q'lUH66Mʚu.r ;PoRSnr5l%mt/AFfbB^m<'u]W17o)ʈ#?&tYnOWY h!dN-J9̲m< M@-@mD7ېUܨeܣ &ȩsLQºHHu:+fo-[n]sTϸt+7A;&&g0@iU ~?^r.!uB&v@4NWXȏ+4mO)|GRwU8rd~\/UM.ZYbBx~D77H4`].8.<6vS6Fq5ɚ՘'\aa"g s[ÍkF-=#vIy#IA1 *ޘFt1Nb DM8] C4Scۍ' Zϼ~2yx!̓E󴐲M O- ZW13f51W0ͫW [>GI;):bA[Z#eJ]sRQG) yLJ؊N$NjøHE3L%;Vn'hҕ]ax3a4 '5/B^z.Q?ț$& ,  bk  rl9}85GkOg,m]̜*K/ 3d ~̠m_WlK{Jv?23xͧ˦q!Y@@  RtcGb#(9 ޕ#ӟX/ 殯CgΦe&Q˃Љ]3?@Ќ'g$)h{GcD`1%a~x8D\m4Sxu i$ ]ٛG0mpE0SeRG䕳A3jz}!:RB۝.z 5AoE˸l{R7^Q^Ty,f#Vݔlϸ>Qˬe֏ Y@OPjc2 QnRl%.n$6v^xOuF܈&zJ( ԤAI$emZC&ЇE(Z &s5>=6*pf,aoꗾ-I0/A$c!HKFԤE5}fm^(2+P8_aFy&ŸqQWcYl&"2{vLjM q.Az#ߓRG4@j?Hf|m4;h(?ȩ2p3ߚ^cO( JO_Jr^Nbp˟FsI,FZٞkN]"\4T$b! cS3#6//-1N G^Le|5MAahߝܣXQ,&5u`I:TJ@AX9] yȻqbjȭr?] i 8ɕ¿Ջv;O~ٴ#D- 䏦Q0~d&Co }DU<~¶a\=8BeOLYL@NLXXn=ɲgܫsxxC{?/ 65*̦^mgbm3啔VRDR.`FZŨNQn1>?`" <.KH1SQj>ֹJpV~_9l.n*aIqb"' [ s)jk*5u11 : :=θX"σRHzQ!w+MTE\Q5%''NI3V܊) DԺ cr) pL2m.R黈25jv:[֕MvyxOJ>xؽ$xwlkZk(Ҍ=@п04I=2~Ũr;t)  /)Rwv@j l#V;nmϸq*5,ћށy[ s3>.̣pkr-6GJ7;-'413nݨtk:'VG\C1a%#iGdm^?)ƽ% ]5:+NJ(:yKzM 79!$~O˦kp!:TH|ٵꯒ @GizY @5pla\{v 27OlVCշ+0.a; -ګ2]*ujRO@mN\Q{oP,S* ,ᨻ4 <`o*s56WAz2u7 9\GM1r`'XpN]oThxB)#&ȑq.ҙ/yꩦ_br/L!([)R')sszU~K* v1 uWۖ·RF"** D`cgU5r]f<)cks ߓȇĆDH]n/$vԖ&p)@ϔc (bK;{ݕՉx@,jij51"2882~ӕ$5J&Y>^U'3T#c܇ 4T4RU2{t9NiZ*lfХmEM"H󹡑:2UqW.ő3.uEB`P/,?6{< tu_vX2SSU+|(`fl6{R#p>E5o<`)~h@n1ᶂavl[u4-Jٌ}i˯R6tزjcX^9)Hc;=5{k{hBͩf/PONGq=Y9Ԇ%/W],*5r UXH̜*f}=8Ck ,ChjZnAFʏ,s $SEPI9f{lM["[.ٮ40%J 9d$6Jɥ])Orc#YmOv^K=1hI3vyW~?(A*M g GUHJ\K& ^DOcJ(po/}vS Q[Q3XTexR% vB2VyV+CH%ӽq@E TdǗ$}=.t"E8/U+7VorhSxA$GL3\0WSZ*ɎזJA#b.c~ĸP(k^ȠcM3hش6+ua1ҝP h{ǭɯYH7-|{a4IO|{Bͱio52(RBO߇.i2M(7/Sgys?ً^%Nqkإt`Vcn3LÐ@}ijj1e%<"~|syr*_UpGvlufJpklCkX›3: `ٟ [9he/ p~gy:lXJ1ؾEȧ& ~)Fn=Ae\Z) Ҧ|b!J}\(%X빯 Ta-͹𖥝;7lsoVZ2mkiW ~o ƣ0XT'94!KXRePcvsJ8oo:; &G\_Vb`GEw *Q }u|fyIyI(u"Dx' Q4ЄlBX_KS8''RC_'#&84OUPy:~3/Jy 4cUD4c Ag;:uz2Pw̛PKEB|.7 J`@{jwroѝ2Rfs]'iN\|໾goSdG>;$zd#{Xb݈{ s\ؕIE,u?BsŠi% a{:s|fQ|D0X:d)i 0N"Q 2-S|;C89ctݛ0xg:E7X)%` [F揢Au⭭K7sݝQinmLI7z#&}L׼I=x?he'o ^NJץw~]2s ²ޏ:3_tG\1ե&l=]Gs| @'D`gZP}HJ21-w|~w ii?z<Ԑ};#evۭgʋgٛA0HAY_Hf—ňL{DΉRVC-N+D1>;K*TT{+OBVa0r}']QWpE "yG2Ҥդf-YrDqdYRbU@oEՕTm"y~PaGFm-vu_kEoLhE Zq@lj6'/wy̧2r=nkj`3'ILUmNFi|;LJ+oY PW<\+~Br.ՄU-NU(c\> I$[z(+ܡ*Ij~*1j.?2&Fl̯\Xٮx;*!dLy[ ИY`ƣFKg}W/qUtneG1dO:?DtFvEUXIaܗ1 b|CPwi1qȾne[ CAf=8h"0W&jTpn=XG$T!XձUӼSa/S٢(?[C)l<qh3ohi"gCٝ§)W{Q.!eJ.kL#!~$Zn=FQbGʹRfrd**";x&-O騖n.Qe[`:t9 ZIi<%wJ_:i>bʃSi[}/IGFMGgC$ܴur a b[ ҘEP\h sX:=XsVR!^ZWRGl4tRqΧpuD١kS#UAS5!?%@7<)qә:2|*+&H`JyDZfxiE=f_4mNDhE&uݲ0 ^4eGby jj[.tQ "ޤv)C"5n2!n 'RLsf0)B&6t- I/䶛`s6He HCIQ[5GrA4tO5`t@v}-;B6nWk|m7urLڸ4r$9)':Ii $-w\{k!=sԢ6 ppa)VAC*bc.= h(8dž'gEmS 80#K |ń,#_oe![LQӾT-SR5KB;cyVbAGV[=Q\JQR8t(ތk˚.!uf<+[N/` M4 0/XH],\ Dh c^=T>=B֬T^\];̹Oخv n,Vx ~~b.Esn<P >ғ]!jo]"نrsz&cCCjxA68] }zTc8,J4^I, g[#6\i%vM}Rc(=SfB164TZ;@ә?~_zj}yD"~Ytjπ/V*a#܀~n@Fqՙr)f5Q&M (fq{#dK*┵oL:;mKV[$L8$݌K ab73Fp1-]\"ox&*G{qr`j#mR" SE=9Ngs8hU$e کz=ܶS6;wg]-kGn!8.鵜rKaR2{akd8;M&QVGFpn;ef˂P7&=qvM̢M nv~`^Ӛ{58 h#9HgEDuّ"ޡBG زWAvӯPVtۇD"8^/PQIpYwl/e@pGi6vͥ v%b|WW=gz..≓|+zoDx b&xQ3Iրlc!i/O/}{cV(|&kS0[UYK1u#-URnp\7 HiȉXjNj;u?s i UKM6"`1U\ìkiy]f G h+';d8<{v:<7YWQPgy˞z7}W-!"{wjtv&΁ u^IK -} ec:z{1J/s 7IXxD lvLSt-7UOm+*18RܤЧbgtElzʋ-L"D("R|/bhhqOe,8*w@w Ki3^H* AJH * y;%?!t1!@}3b%EABG)q+^MZ3hmd5`lշdP셒4A9 wip4)FFq' \Drҋy@>zzXi9/^hLY&F60XyamgHk~g˟tbMҪʳnڳ[i,`{D>B?p"ţ0ɇ1@1NMUNX-tqS12'@ gJFx@"P|[("4t98\#.Z /( . T:ⶣXroS${%̀4{?[PآDZNo\Wz.1&=goeѤR"?Ԇ#@dB@"l7s2:d4 cSCb=jZizomE>ɡ_ \ӺhY|=Ӗ+^5ɢ{q?R햊ĢP{)v6 uaRu<~(WSڀSibpWNzP'eœPgo>w7GE1p6E'_N_| ARf$lΦށ 0-VWc"yU4tlP#y [aNWBSVh¯6gbN7cZ r3k6tYTq LaʏZŖaD 4!³'<`aNE.o$@6Vuh! Ak7Ӥ0BkEz3ѵWxXAS{qA_J%͎9vSiyz>xt4bwL<ݬCRw*إ>t!&wxuP\z.TJxiF){hV%A4 ܯQ y&Ϩ _4̢b|ѿ~:fE!28G k ?/ޓB@dvKL4}+@z=!JH6 6ui S+>Y3is%3g n !%pHAR#SeVDli`5l^B]V`2eCչhx}@Zg3 a9 CQDոcn.1޸?'&:U8nDXHEoԳ,cl'ѫj*atd(ɻӯSyY;by5ԌNᔥkrYx'F{9WQ,6JsW%on`bmud Yg%8Sz8_~^[}fĨ*`&6f-TSeDX&kO$P)N:-c2+D܍ j=pOAkL5m9r-!bDmԠ9Fa|GjޖAdH6iTR8R)R+.1c7@~nYӞRF4or&y[2 mGKsehCTB`!J3(i4Nڝ/2rb.OOn`A:ҁ.dS-G}@D)|UdL7E{*fuJ-`*&_"9-i5`_yJ^囟Ѭ8AC pȡ2kFz{1 R_O.\߭+fq:uj"אeU(j&|0IpCC^+nNKqFOmQkVvoT&EHUms3]bT \G^k&V':t0..A@W7LJ[)D2ߴ?v mWZ/VW#|Jx8p#w18Eg$N`6QCałR.~"q<ƶl9z?'=w.o''2qQ?{*{K&FkpRIօ;bʣrtTʋ.gf2S]`'''ւ #}^B<}FKBۭ6SbN9H`R;9Mxj~?dȵE"y[n*9v+6A/XީAdSJq,8F^qq}A9R~(h #z^b8NSΕR7tMM9sƽizYʧ\2:7 QXj;\$Ǥ-3Rl & |Z 2&8usL"FyQaGWx Q|.! l@ytFf E0*rU!|7 JqZSF@?ь"t#‰yƬ͙Dp&sf 8+1"3F?nThl%?{_zN%xuY&r$^wd;En:s@˄J#8͒'ü 7TՔێ&Z3\LC Dy4!'?#H!MVf߳鼫S FĞ5ޞta@XczEj۹O+ʄ~5S] |eH L*̿e a%'{~:wO:tk6}y]sll^“M3Wuic;T_%*38;ՍF?\TBOI}d.:ܘ{Rң.wϥz[iPĪ$:|TFPKY$nJ`DEҧȀ6!VL׌GSVKq@ƽ.0l+N=62`ӹƺ槅 O`[T!eV<em8fh8 *Ɣ|eIP~nָF̶S dcۊB̢=0~')w;@ &IM0;~g ‰:1;Xg.S%c{Ģ)0h*GxD'u="+ɣ]zI}#^hї8/xAVO/&Q dcg(ʑQ!x+:lJbe" Έu_(ІEIYqT  CgNfxg˛1Gf_]Oz7KAK67xycnY,YD|Y&&s帯ܹpy fQП4v0SQ‡disL 2IOFj͸7y= I7uP+p3cc;N u"%U"D yk{ȷح0mHw -ޮ׶zzwSf l2U1sun#`:c*)`v 4֭4$2bO{Uり`?V4mV5aq?'}uLOZ*TfsE ^Lb'ݼL^n3s̗;H8:J?,7bH I z9Ks]Vi &s3{o_4F*8V4EzMJW!ğL˿T ^h=B_6k;q#Y<7<TsZPո[^D43$T0C村G /zC)JA\ f~IBXԐFYc0%Xd N{9̙W7==uQ3$ƏaKj-h% :)B8cHUuqh;ҽ6ؾEkqsx4`v`ﯨ+3\r hzT]>ukP8!{e=XokT* ro +^&^a&D 3omMqiblB!VWHd6 TJyI&t[7@\ܸ'S{{LǬn\0e7CL u_ V-k,`?p2l5$q:Z[Guyv5[>v53? %Sbne_ LL L I'k`,׷K?bX&_-]1D uJaQ#.yZdhhqmw:t5|cٜSQ Ɍnq@h4eR -AjY&Z QUM\r)ʇ+iW'q9H.aY׌YuV$R_%m?Rzo7  k6&_ɁaŸ;? :!A ĐrQN\Rlt>qrm6j OX3=x~V_rMMh)h5g.%rf^.k ӸWX*W=X3ĕVxi;# Q4(dzw: _,Ţ5zL E+C3(DDCt< !SNL'u8q$ #IY /$9hF`; [\wI%JsԙYuQ5rV3iđ4zOɛjvFRwچHhss7L7+Pd$(9CS,¬䔎+%bZ;($#:ˀ"#Կ+7B7>pӘKu`,W(ƲXtt{g-ɥH2on}B %jߴ5M΄Z"Lp,2Gr3b)QlyaP^~C|b!"E Qpُ37|F+8uF7]AAp2o#B %U%$6[8]|`VFh# յYZ1/2u;FccՁ0GE`'"CvZіȰ%¾+3HDŽeDybDdg?\[Nl.dgN!o:5T#Tm3dhe}p?V4D}Itd 0 Ln}mrₒ©4GOS-; rn_,<5y ML} eUB*#Ig(L'ZC>TڡI8m1EW ?*!T coMEZHWaQY7lS=EpoJy(3 h=4vו1~r}=Os,H&ڗt[i0dގ~,jW(aP!Pį/[,g]e:K'5*_Ӫ=.jZb{EZa,E:8;X!"yx;z2Dݥ٧S ëV<;# A3[p!S:VijFo|O^c7z2V0#!'TL@B}'{0"J RBbsȤ_'_#e+h<4 PI 4%5 tK͕1z|o]Ě`cS˝ֻO zR:\K=v>f\]{MՅ̄ 웝\0SuRfFώcw-#}*0I)Tm$\$0ۇ%GoOߣRXzp]}9`#{ Lt+~UmT,+Gמ66q?J;>JG/ zM7[GS^>DQ'>Q"n49 ε".8dAU憿F&=uno\R2-,[1<|9T,sFȭD3+1w'op[}HyUvޚηQD:tJvLS-4Af)!?nV+; w{rOeRNHq;@!"1hsJt !{&)l6e `#bE9YDӚF8K!k{DE!`FlJagPEk!=5*,IfY y0bSt|UTC'R7  bтi{u;/͛&hB?81THXa#H@e=^T'|HuJY3~83$ X]⒭J3Fictz?;aG:'8^80tA+W4VDG:TXFUGm o4:?Iٳ;nQԣo=WG^hRBFk2kxZjuqj-CdHQ#m16%Z ״.(]@?r8œ\a~|hY:{(Pwغ #>Re988prED4 v3~S=.K0V _`iJPla[Fld> )sv[h`&?pIe͌ig \ !bHTQA}Imـ95 cao=KKU#$)*EV`O=œi'5MħiGoԓz:օB<ԭQWyG o~O& 0t5'CxR \#&i j?^͜ŮS)n E+Tl':1lZp3sSt\BZhwhsl#z#`W"CNc%@ߐ`VgQr+d0A5؈i+ vcjM/ gSLv :}<$uăv~*ۊ6).wg (i>,=o㳉`* `0%0?2kۍ% QVBdtȠFPlQ+,' ϳ`HQ聯,CSkt ޘ)|Dz Q ?oj F(_?l!ZwԋnjɢP@A(iraDmN_7͗N%Miҙ(ږ]+br hj=>"23aOR֍[8ldu zȢYvǡTqK%iZ;<.Q'>a&rCm֊ 4"j'haQ6q .! mqCˮ괰u ?6Ȝ<)^f"yѫCW\2:Df1Aq** 'M:(D*˞F;8tSVN%$1I4oMflΣf-P\ע4n, AED"P\9i*g@Cݓ"RRC~Ưřo)hĿ~F|&w 0Q?6 %ǥIjL@+ZI]Cbhiۭ"wsH5 Ojv̥CγBYϡU-MwcHȿ7oZ=G|jaWFw VS,LF H?$q5`W5H1~rcy=oR,Kge=imؙ'coTpPJZkÒ I禕EvrL_G^lgˉdv ݈ K&LJ{ƶi1E * 3d {ކ61K@SM Ь2 )Q^?a+0Hqk۷Y' N3]p.Q}i^Aʦ䖁 )C랱%VOT e:;30) '=jk>`Kqv$p-jcH=>ui&Ʒ`srStgBbsbٶg&R6lX^D$hfAb{u24M/ Ċz 1,I%&TʾL4J,'1ZA숡7^gG (#˫X׊7fW:iIItJ-f.zYd WfՁUab>I9k\"ܼk+--]s.vϳY1|k)dap3{ڲ|cZ,xMaĆņh BO |9F <4_+&r<{4eIBJݦ"b ) (fA$3@%huNTeň m\y 68HOKPo[Rl?~ߦ0Հ!Kza߼}WiiO6 ^,3Z)@xȳ kI#P/R(+H @ "ƶ^nkMIvf Bވnš-F6Bq`8a2NIZEłsGX2:Jf)d3o*cAAW|~CAē(@)bQV{à&0>.quEz!WX)Y^v?*Mr5Nrfț= ђ j7DF [ J SR^c$\Mj>`U>&Q<\⎮`/~ 4 tXkY$WSYv?TcgDՏh'!gPNΜ\_CRa.gķF;/ VrEr@ӄjTu {A@e 稅AFQ*ںf_D/'hPf~ 4;!iԡ7WowPK.ik%&\ziK.k I#rl@ߏTݽ3-|ZO;hA‘o(GAN*P͞w}/@.,5'4%BBaֹSq!r G yD-K35]ad1s!T$kf{Dc6e,Fe;&g. l86|$iv}pVj_Q?*E̋eSc$(IcPQɓ ,J;( ]sFf{fTMg` k n9.AhKBZ!! BӖ[mq@b4*\gN}^d g¢xrDx -jƒQB߄uN^0RqKsEd搋&H7 Iacp'UE 朊-qa䂗*v<@ڙV<+xElU, lcp)FhgCGqz!W]wd+=s2^8 (Ny5ҟWIJfԴ??1FW'fb}TsD^A, 4LFJRӛa,l{!D\LlfzsJTmПGxm˳Ihw&7]idnD 杩,g7~(|5Ƈk3⧂ח7ۨOFsfTPayn?G.S)wXDLB~pUVi]㩣 )/HFɪs c;p\c]MQsTsX\Y}>¡x=Dz}5~ǡHhZ$;6j"7j@(Z_dt/GT.ZdQ6™ayDDɝ~2ŝfؐN8r:i bH|PAYu#d5t#mX3Ptb ԯ ڌʞ$d2I=^r׹Sl9Ĝ:4y?1YI˼ ˤT ~G*Tb֪](},)<1#E(:ϞƁq@|ȿ-g9mD%X1{dr$\-8 tHNR0Hl~ڃ Ad2.dKZ7?%"nt">gI9@# 9j=:_ 1ݏY #ՒHlAti:NbG;:eX<ϓ.P C_b:jJ; }3 )gcPu1U9=`7B/}zo7$xOD^toj0VXhV׷f,^udz]C?(x2fLN(),^\܏07%x ulr~yl 6h ﱖ%ma,U)3Ef?b`J3<*-뜪$&rZwEo~`.AvfSZi֘JK ָb1[jGn%5 Mef4ӡ !LeL(uU2-amMEgB4!L*բm..lWkF FJqܖ++?Iߗ'kϣ)WW+lgUف4i|+<7_IBF-E[3Z\h[%D Z{ /%,ΎQhXF]I[0f#žGN/2YFC[fXID5jFP7(bLrV.fa7% 知{/n3z{]FAMbW)[n}z5UE"-7UM򳟤5 処ogb{;G&eZX.ێ<*4hQ~ZH3>Lj2Heqs&X}$:4QTvsݐvpʮ=5?ULchO&fy@ɺ n7σ4ݗ'&<-h>c~J3DoT}m@N {ҽdx#Is-N8kg V⽬MxW֣s~Qgg@n*$H(B,vdӊZ-`Jfe֓hv*gI4" mO-ccCymնתEXTćZQ) N+*wJ#R1Lwknp8p6wFc)ĿvΎªNz3ikfd[@cd7Z oV=fxSeBcL( kF@3e4bv?7՛5ﻨM&/+? UQד ϑCfP)MDp\GiPa@:@'WpE$|?I&pɞlhL4r('#aYqD31֐A ەJKr-mǣ6R.t%G.w@LN+`C% 3Ƞ[ =>݀Xu~ά8C%^l+geM}2~aY|+Zoe.KP'ϋ&#eWf8r:X)6}̖GVM@ u֢GF,o㖴|/ٺ=?PDQLWC {q!αShyTF\$ѕ9RcGD5a94? o]Rq7txQ%O)uhZ:5CzΎ'C?ZYaM*v4䓺AW'ĻR?YINq|K*;cVNncN37PhrurF;]; +YixmKԟ.ٹy1l w_6*rmAU ;+J0 Q 2uz']O#e[Y.c eL>kS j'-kRX{1uT"4᭛f{ܪ|y9~JRMn3C]Ӫg_i HE~2}/+,[}hi7cQ\mn)l֋l lg<Eq?pE?Z>G 3XRLPᘉ/Q)! x5198Y(S`[xUՂ(3M] rvؚ[x YGT3,Fq"usu.$|Äz\ y<h/ jJ *|5/5Bj,,e?[ cڐx^; \`TR$sh 9WF3\U5@1'XhƂzyM=;M)GXqt~!w*L{@1C-%HN4ny# JX'ib=Brym9RF|oY/o?-!?dJ M]\A].*9zҧ=95~:_^>s$Нy}4_*i'8eRާoz73<0a]U0D!1ϮG J9hg*$\` }ٰz"d"ALAUMJdV,җwStAaԖc_Pu{@z&&>{f0^3gJytʀP+B70pl6|\dz1,r BjVliB=zG j#VÎe宲$u%#mpOCjoU!PrUBsa5i-lۨs~c^xwpڒꁹ1>XOEa𶳴IFIk'9X2ƌI)=RT_AQ13N|%85׶T?@#W^T`W)3~J]ơf9 kљ${[/e#{kdo *qr2O{D_.r_6`X Awh{ZzX=z.&>R@d᳓ԣ $Lpj4%QŸ"8*2}IT88WM1{ۉ!#Ѣ`*Lƍ&߅e=rZ,σUgG-)*cL^Y 7'3e眐~^72HCRyoʇPA֞+.䪓P>w>_uhFoZ~D셪'&^// EJΖ&&&L#-ϣf*%ͧ&GA Z4'0#Lz7X-"vP^b.55B@Yy 5U` j )=F67>c&}>/+jSD?r!}(֛ dWJ74 i/q)GzaQ0SfBVy264Av CۢQ\Vzi1\x6iO,t@18w ^'E6c D'NУFX/C_z!pV41/|xWfQ쾵O?6p>Vݔښ'83;#P}r?G`suҫR8,TE 'T8OsU󬴵Q?ǃ4jU‰fMQRވpfV, 1y~;ߑҐ{-w"b;qS ^(IԦcܘX:+^bgtcyn+Tbm]ic,E&tr#ǽhx/D#Pu[KH6<<}i* }?_sEht''A$VUhL&s,؂KV~qy[-O~l0*:`W&ŹeaUGgaYC z[cBHг gl#nB$ߵOE&T*9%?2wm[Fe$nΠ"f^׌vUݏEw @5&\<X&uz{ 9aW ɨ~eravs^vE>1ρxxv! ct6ߚ O_τ~"MB&;hf'~Е5˘.ELaQ<lhT&LfxubBҝ4niF׆er3fxgMbHMҸ4M7@p'kwt|o_}viyҥ|ts.J2*1eoJw{U~U:KqoZ .ߕχ] 0#,݌HժfX0^\U6H;;8'9i4C;dUWY v\^EK5%El/cVbo0~QZZ&:c\~.n>"oGѕLVn+RVdE^MYmOV)4֤ ݀6r?#MI5,!k+xv ?%j-ˠoG+u?+S` ;rB7w4n) J>FC)Rh <6 4D޳P@$lmfp H"}_*%kau'[Q7IcWMd0P~"~{<-L0;m55p\L1`>";aI[ LS!_=t5A0df #֎gBvX- אiy&/3[j$L@~mlIQ;)"v,r*-b$:kSBcA_h'Lzte1 Y,R<=,8VEK 1% ׉ `ɝϱ.oh$ִv0`?z ^=9_%Xcaj`e/i\Y^n&s4;CxӔ# ) LW܌xP}:\i60ą9TEz*Tȧ$[ vsӌ1-t4Zͫ;i.ZMQAV{ᆗ' 3I=(=ZjLdqYN 7ESʾD4?!PQ0p4ԖyXf]!*+olߧ "$Om#8AFA<^Sh, ՑuZ"%%?K2}qi5CtTn* Nqm;5Cݍve80+.^ S33ȣjmKIk*;=!Sv\^˭礭yt'1,lTE5M0=qal?oXŗ!yx+#m&iȵ?B6`U \#&uOA+'FWY4^1B"jPayH|=coSft3׾JEߪe==V$wXR~uAɁy%D{aQA3!4bR#|tjO}2xӦ%!zG6%lhѥY Ұm[1S*Hf|*c'Y`&Q wzg IhAL( ,D]޾a]/|hAyXPo*m!foO-KG8ѥ_"(t5h x1~|B,egi2–w,pN)8м.{-،CسX-}hnm 1 f5B@pZinG؏ys\8!M aԍtPSeZd 1{_JuCB.J\Z:Jqv)V/wBLVDfh7:W ;"ΌI.CǙ"::XjȲr)@pm%zwPǮ ܙ!ׇ_cRdV^<1Ӥdoੂg X mx4_\K\[ٗMF+~{T(<S NPaZY}jMr" %VIYިXb:R ݻExX *J'*oxxެa2T;X_Z,PwwlAF2镏[<.zR(;9 '꿯Pmu`e~m6RƢ@5/{f>ع<*3TOo@fTאķ&{.n ]҇ .Sn@,7BT81k^hojO/'GZp!痩1S%#AN1~k3]@ʹ ic7r!gUbѼtOꍋ5.-Dsn5Cw 8)Ad|1>36bZkճ!s %t8"}]C7Vrlѽ]kg>s Ƅih[%V/k';ک=E=a^ڦ #hgX`W2袖vTQVY=x{)^ P>\G.{9}^Fl~c-?:GD+EY؀%&1Z7^,EF^觼[nyeLѦUas;>ߛc z&zoTMy{!~,Xtb|6>^$.خ{-e<{l,uHa6k!Wc, l^bUaER߹Qsyɿm}^1i'H#1#lZ5pN!g"/cjj۫Un,J!@~<&\9PK /w4ӛ\i8rICh(cvĦg3,lt-WjFg4jU[jЄ˙5fzF :%/U[|s~gzhlT W3o֭Οs+ ,=31\ fт[ڶuy[5+8C&>Wk;,wӘ񡣦ЊL DŽ߸; PW;FLD݈-Ķi (+ۍLfDpU׍z[h+ߠE{4M ./p# >~쒀9@MӤ/5~AC#:ÛITlO(7v׌zg_Zf 0:mu+6 A0n}~<oH%/CcB9Zξmd$ ѐ%cDU^[rk;*0`UCs}^s)~H#ڽ Faӕ.~7i.5cYW5[vj&p|t2`"mz4>M&Ԃ،n:z/[2t;ZؗL \ f]%́H$ɦ\ƇVL4jJ1n$ :#`O8(% vNwh/C;o j%k Cw$3haG!Ț.R"ȴmh6,2Ⱦd9Cʽ5j>t\Ʌ{d40ٔ80w*If ӞQ3Iw5Jw Uq@K =/q7{ >u=vQ3ϭw & vJ#ăbH:| T6($>k?? ޑtl |FzdbqP(jc.tyMbw" (G1wm[!gI;7'{?wjkV؂p42bI' l.Exox;ߜp`~ `0f^>a~V-zYeԊqīY;g)H9rjmIfPC*ⱃ4, uHŪw{să-/4gSI UU uA$9J\"?%m[ps}[3kTE>DRJVe6TN]_L̫-eBJYޱ$#?Щ (btl@MCݒ*gu7~|>;Lz]]a7r&ťBIB *Wc#) ̬&Ӊۣ&p(LXpgBPzn^Mgx?l\/Q- K!@L,eer9xAFq Ev,YX5c^ȕ΍ W $JXXqh:r]UK0" '%G{GˣĨ̖f4EJ|[ MɚOSKPD+ԔD1JL@xSKWܒzd&OwN4g7s-TċF(?&o ort E DF`2*b_7v?MD!xadӷ sy@/\Sqɮ.yG*i[݃xGBJ H w7Q״nEH !/ 6-Ja j`y ]mH^W)u NnDߢ;$JqP]L??Al+U FDsQ捻1YVG c=&ȐI`R=. Qa!S\bcNFM|N011iU-@yjbF{ddrM5Tu]2֑ؽۧ`*Ԫ^)XSGy-[\<M6u8+nh&po17D ,a5RFH$vQgT3#Fk'#'>M e8_9BQjHܪ5#؝=a]I&19 u02\y#KMbwzS=i~ נ&ʻBpXu ߭ 7jK['ES~9%1pFebV2EkE0 8YFS(.E84M_Ps5ҚDF[MVi[JYgA <-]cH^D)t&ǾpJAE,G䞒%a3Pz}zޘt6 !%Fˏ~]"*iFj[OO$*fQ[0ߚ$e:e9b$T|eV~bP7;Ja;qr6@&olYM|_-M>ŋCsZ=| 08JLs{|WnL3}I/7ep (M 7+/6Z8|]f9cZk6Tˠ^9WNOYya&,G?{-^<,B.uAP?cOTq& kьY*&h{Ɯ(;eo}?ZL1fẕ|Scf y#sDXcI} \8w0UnKNJ4d:rG3vCz(ժFlʩ9_Ya J܎%eC1CV B:~ϛi_rH܎%.AXfdYj@.dC.-+.L j$GJTq'Mȭ3Ҵ]eXKXfJs㎫f,j$O=rHJ`J3jl|mB c.쩊+QJePJb~{U5͆vL DӮ3@fy\_)ЃhC:0C4Uumʥ6 k 3Xl'XbJa.>}-G'7od@;lj1*-7%_µ{5%FqMnHBPˢ$aȀTQX[<& H3 @IQu:_ |.Ga`?* K! ؒ~4ƒl+m"81 "K&SUR/ϽOr+ BF;Sj ;Ҕ'1&e>C eA%IEgs#w,xH:HL!Y :5{ÁDGXT,Kt?A_&>/KwAK1᪛yCMrdGR'K8vEl[e DEt,g`l$C6 BehߧǐX*rzDTVHYP_K&suTmA.Dm7M ϯ+3h!2OY&+1mY: n$r;TDzT6q;'tt*,:ݳ)|H Bq7)7U]nd r&)vM'/)}tBg ^crYV-`PCo$cSY˧R&>xZv!gaaTX1yMpu Q;Wl,5<^k&zo" -G4h%hh|ek*"Yib-A/Ź/2ʚ$gYwBL|!W1dv6cMzxX%Ā5cêW\>ke"KQX@nҽ7Nl+F ytyhkeIݚN.XXO]F(7!8fG:!Kqԓ{(տ5ZMHX]ZbTכDyvrt4Oqtt ϟYHSx\9$`|)5r: 쐌NIͪ Ϩ**ܴSf8 3ُBE\ģ|< Ope/ڙjkР`e859{xH p6'baE}m5{A{n%of1!kt[m<h+(;(ZVRk`-!8~I738UxЧ,VqL{Ukm(T0SzBxwMXgAZ@U1wR9H, gLYfv !*8wr|WϿ)PU9!yK)H-WMbA UOQdK(w(zD@D_z_?hx G) B9D?\LKg*~dC=\>"ZJ‚̤GHHoH׈ U\w3,9cN$8^^3gX':΢c&e=vs %Lt| (IۓB욻YC)Qqy7p\X{#TŬ/B\,W7l*zUwbޟq 7q֟Ӣ{ 'H-/9!}z7YRG'V5a*4ӏhpcgAmꮭ 4G7roCˍ4;i7wz:€BL? -_Oo$cbEiӳpmm8bP gՃLmVYTA3Jm2- Ck ՛(T8K]rz6g_ES=E=G:g˺.&QZ@?HsS*IV͓ WTXs ˿qs/<\ҩ<"\+?ˏa6Tw"yp_bO>".dԧ㟺՛s?Z7pk/uܚm+xӵASU,P̵>dHnI@TM)ChY!K̃C_Clz'e^0GͰJ]xU3Co;Ci^&zԣ54cr)ĎQˌ:p޸C J" |+~V࿪H,#A /y꼤X~"\oLKr;QnZ*$\G@gO$l4akX WC44Vr>9JMlx=NY]-C '~TAsO\RӜ" (TcA٫ͣSz0uAuɠaX1Q["*#Er6sYԒ`#I׼4N/8b'ɲ-a5',0/&GESͨbۋM0,WY>M F3=Qlu)9-$9vl98^ReP:d`8d˩Ug\+N;SsiNjژ>-t!59w=69ѭHlm,n|~oXxDIҍصH%15z]ȗ!آn0;uSUDJYRqEbꨘI{cgd@<ӝwD=4Fc_UcBqT4vRr1vbFƏph+) 6s _L,dd%Mra ?'pʖ b[r4_=Me}%+*}U[ko(bF]'B%,$;`W1^á~keeUL'‘IXZǟX-y[E^,SLn}lxϽ|>ξm6.gS>fiI&eVlL Ha3m#)'SZXCM,2+f}n4zTԕh#ɥR_7-:ɶz?>1n%!* 7fe 9yO=Iv k"M%QP̹HΦ$HM݌uI/K WЏ?*ϋ&Ɠ@AHETT8Jvke/}USG;-Cޅ- tVO@ޙ]G~y3F ko.y)%ȴ`"0b`p&#Zo:0蜽w)M]ex{BfsuRbVx 9+_j+~\9r5W( JaUo)# D}ven6PUqUA,ެ]!\vg9_]טt3W2bQiIbdLyˤPÒ|U2o>R߆, I.#axi 9\1O;M-bߖ:ҪVoUP6/lWRBDdƒGۿ7[vzj\+Hי01}be5>f \DZMA Hx tEtZ$0 ]HR^I1G \gy Otz%Z4CԵ=Oђ9ysy4330t#ymg~ 7 ijM_)L'5Md6Иt>N?V ! ZyWaWt34x_-٘"8xy9^v %*Bq !+ u-u tR,o<)sMw!_ eQkb u2h7Y._hJ+/Ч'!g#k ONSR8y(ctKx4,4}j,\0̥70ЪP?y^⫬QE'Mc x̗4{E9c4`>V$^b(lCx}$Dȼe ;N͏jLՈEB#q)ѩ ś}5D\۪CTqךDjnwaVQ:0~V*f[YG^%1>RDYZ0 j+}BDFmߑ'NCJAӂnDVxΓwL a 拨,dv>sOT 3B-WLIGyD>YEk' Elk娎$}P|ݨYf=&U">2OY^V2OvSs{?aHL$g5++FU ȱ{VD!J6@Ȳ aqIƐ]zF$VqKRir%Sj݄ `']nrA_)߄:]|gc/w AkP&1dV-~%UI=޻r75H'-|;DZ͉(k.5@(6L O2Q(.A%eb|`.U4L\@|)1'df cfbʩjpPy`oT0 1q:9sJC#Õr,IuÛO%.t93 9{OL#q`KD^K?q,Hgdc*8.]'d:JavEgHt- NUa\o 1 I5U@<] i = #_:oaNCWez߭2P->#09#hײp*ΡbnЖ1^k>q`6Y^|i?ЙU\Hτ4Q]+u`m( ؃>d]ywxgCꎆ1㺽ua+?ʙ";wWa=Olq=50:C1 k_|5[s!j+>@t EWf/QuĨo(.,Z%XINf_&/9`b?(pvJW{JE3^xF!x2zU)8B4x_ߖBZ`rAPi| B(6YR-U2XIaMwp|[$ ѵUp7H*I  M%h"GS/j+TM`( M$Аɕ9%<^Hޯ9;x3JgdfmčPzDS3rzgZώ|~h6䐷gw] ܖb]K" ],8f 1>yϚ{sF_bv}.Ԭ*m=``-0">OSw/yu]@ޮꤘR*ݿKN $6,,&Ʒᔗ 4r62I3"g '9̏~RQ|r~(%CG$dz -k9ZRTxk-,7F`7.TupU)ҩ`H*6 {8 pNI9s/&46QI>+;2QƳLs+ ŦG܄ca|䵏h̛Jv۾P?wi)9]nҋ-n-)9gZM(1g)คS08&$!IhM.=ʳ۷! (YwP)v ?#q;u0/7N J>&bp.`Ŀrr?:zM, &A#`!An[2+їRxg.;kJ|k_Ĵ|Reɵ=%gCܷdϩ\WuY&۟ޛj6Ly aӎ9FںNǑGy 8KJJ?}KGOFND}]?9MS*ro![eHlR_F-=->@O4|t s+^dži}%noټ{"ƎIˑT j@:jd`4.Bl*aɌ"5rz9"iF\O[ 'Br{ $>y.O`~NF+Wp UjEF޺䈐//Yc|VKV%1Ys-X2"MhCd4#9| =fVH|N.ꊛjugMIS.,%HY~$i%>(Bbk!' hXN[W,!*Erdj s|PK/)SAzK;ݻ3ͺ7qs.L"DKm #qӜS⠇C]3`ԟ-oD'XGTqdm7J@ .=XTJ_?ЕaIIX5٘ȱ c\= {C!]lQ-l616XNwSp F÷pLN), {nu?wtWK-4)g)Hd#:@:p˰%طTW;/ܛq/xvv1@~e jbA*ЩҬ 1-1#:C<6{tUC(m2-F㉶D3Rd2tX[Y6Sd5PN_ E3>4A2:ez6Mq2c{ 3b?*4T<)DE>RX/Zri䗞z@PR; iwY\o2LBMOnr 'Ҟmn}wrOXJM/7 l8TTpom A{.N+kE7Q[=[ސ* c't3iR_A[oCI2/S nٌ=4*w Go#LGɍ7q̆6RLb@qJSWO؍a 5~rZ? Ϙ[h減πyxhe "t軛MUúg/o9}i:_Zi/*T:pH7wY^H3蜻}mٗ =>@ pSe _BLUJO4*5{Q5ͩMFy ޑ "%YK~WKc 2#wv3,?R)'TTLs/t0.7vXa(G'jMLX^Ѣ{"tpkAđ*?1rp_S'fUI)DU3~>;H* .ttmZaXO« qLT:0DnXyՅj$+H~dAs0e=La</3;s8!6qF" GAs8n.yk6P'9JeaJKMr'OQaR9Cd^u%D{~FAa1*gbwJ H"_Y~$] ;}n"zς)5b)X(@@w]j(K&jY l= ;Dz6J: eC-) ¿ǟzpϘ2V6:LfM KoQ5T:xa_|ĥۻ/Abw@{\R^[j{|)J 4,~M0meWS $p0і1\QN8ohJiq}47{~, TčʘZ)C0ƼOֱ/7r n_ N4wm{4!wiy̳а!B\ 5C~.ET Y./_yȟɐà ^JpuXlx*.8ˏQ_č%~6/egL㏆bþ OŽn;a=?kRmK}zR MLj ?f{/WGT:QEUOS}p{/{a4 |k&kMW줌+${< nzEh\$s}x& 4f~-|bJFl3άN BipM1ŷDvcL|'zN<)6xÊaOgƧDM<ܲCP YJ#ZU#Cnœ'ʿ28ut]s*,tEՋ!9H ˒$mVzYEzSG'T٦a@ӑT^5 7בR3v>wPRݬ|ն_9^뢀)c[͵ѽQl=$}Sp8n;ad 3?|<AxE|1 )Z)L2O]iy߂X 3Uӎ ?J26k2^C Dg3^am RB̮.{UVm,]\%eVa}jC3f7):06!kE `?_^̫iosmv==="WbHU@ w)aOji8Fci>B^p/m53ۋ)v dq ]LB@90]cazN&ZUH.k.n;W c#IVGL'7$Kݤ18Vtn};NYbWl}y*uTVxIIGYƒy= j)SZhf}k50Zgh,җm°<:vuuHo1e$- 8Z>.SFawQ ('4,," &`RY5hFxI|.AIAlLL)EhX)Qes礄#S~2cY!Bz"mJftn2ߐތW+ΪḭKpd ,)h [] Lj2;*d#b{ Qҁbֶ6V<]-umCMe.L.nyn ( T!2G)5C& %5_5&) ;]luwinrcUe{bx 6EmGvHtÅY6lb\VNVXn-mpn^SHŢOi"ut4Rr%Օ T5eS1G!%x?$O$3-C̕{1Gn76HB, D+u|~/MFv)nSؚr2 ` 8+߰1_Dq+M/ƟV#_.~`;8cD# :[`91MfH}{b R=m TEx<^kdrܘ"ᤥD q, ~Vk^G,!'wa7+'gx u9/RQRVB+wmm-hDMAY86PMOkё "M J˿r߂@ÝzB`uQSϱu K6ԶAI ^!1>+:ZnQd#ʰ'镫fDޡmFjp.YF5s! %hW<&QܜM wǼRGcceӧNJmW*r}'.9FfP\^,@kt=€ qYVG˲`Qkq*l fI cf:mU>[ȉA؊S5KYIK1Dg>6/DE(U`LD_ چal`]2p FXqujp|66Dw%vFkq#&T~SB7cOJ\0UGBtJgpAEÍFUsͧ&圍g0FAJf3""ӽ}/%Վ#Qx&zOEW牢zZM/# gDrk\uz"?V* 5@Qi,I/*(@JI/{TT> _v:6oib43J 9;8#W TqL!~hb7x83F{~C~ Q׍oIOal01hV 9NO$*unrdoIq`Y R*VH,Y0o-m\/vM*F> %j" ! )jx@ڼOYgG~'I"}8 h$s]8?B ÃpLj -V[ Vn>6dR1 b(F ٬ 'Hؤ'ܺUFrEӵ buݛOù xύsuDYK*<\ܒy0"9l$5!ÏTƀ0Y\ԏLĹp:e8߱Sl?R n.CQso"H*߇@2Η, (I]vb)Z1="zSM X; _QkV$ĆBzRo1mk2wIQ2j9Ǿ-Zv`߁?Zs%ݬ̼PUD(:w^&+Ҡz~L,:;(% :eDcΫ*2# ӍđvL>B#YB]{: @^^N.C]P*e ZE Yt糬{t( / )!\? C=ծW0Y%-'@f6R`Z{@f@z.X Je9aPOuL@tP->EY0#S|lYgA ~RbC] ]kS@_IXL!r }<#g$P)dtvDBA2˳j{-Y~ˇ\ 6N"G"K*"zOOBaT&NeA 6 Iڂ}ewѯ!Cz]OWqN1n>#w/8\ߣ黊!ǔdP ~9WL9=e?"D{$o9t-NKfYwG^̡d881 UtB3; v:jp˅p%,4Kk>`T%vECpuSf[5ʃN)<->rÝ}*~U7F8C\6iރ5~"17O($5]ހVp#܁ߚSj,Ʒmt=2)<fK24]-b?v<_g_V͌p2< 6,UO_-!*bVfjBD}j+r)N`fm2/y x(P8f)kSx?`itY{/iq*a oF'7YP,5!63UG㦝ٯ(F^#N>H2kM<}e|y1&~cbU(Ӯ_NB,[kގ #)R &vWEtg\AVA(b ܅k͔zEEx3WF-s%pc[i  )ZR;F]2u!Zрpbz$n ;PVpSrb5,ܥm tTxKVMLQ)zX˱AK=~% tLz4W.N+Htwr[*:=P-ױxg+܄ qꏲKKev< 9zhuoy@\ Xw2£^ +&!vS ,HPrHI.R=ZBt0=kbp @9`G |gOүKŽ.i`Y4;ŒSlcOGUSGRHTCWIXim蠧J6o?D-HzY-wnłTN56n%e |2PgH )%F+0Rַ)ᐣkڕ\N f4Er%\jGsN EԻG, P?K_ze"BIqm6&hsj~Xt;dVn*'ׄM^4O_H(cqzƣqpMVʕdL ?\ÉGW  A6eaKyp@z55.oBוZf_=TkRoc< 'ֈ%;knue\v!kPĖ }O#C3]!σ( D$n 8LY8Ez, 1}nNIr!^RDޠVS_rnPQWKpȼl-GCz|J{jU>+-KJp%|(<1dz,˴]y7RK"^W&;L.f-6.Z6OPJH \^Vv[ىɀgp'@+"xV, b5wiM)5R~hCD} JtՖ,W_!X#kk)sf}E{/HQ _'8mJn*sK[KYZBd 7&gZ:^50ʙQԚOq0كѕB9vp{.^[x.ɼt 7}ϻ+&msyY+S୺Y66??طe!6dtqUx 6?Wն(pJ:GUiPd{W;8(tBhd.7 e0$sMuŠJρ%Lk3FB>>4k ҧd8ue?oJBCN +xhwG3s)hXjg4rZV4'&SSog<[urVg;YŻt_ݵoEv`.$HCD.HLN,y{ +GxY^3ui3nR?ΥGģNNA@ xЧ^s!eN0[mcv[rRGҏ h"~|(dT:lR:qrA#\~nH㠴`m$%KArk~FO3zBìB6Ԛ܅c%(K( OxLKLVu+%7ٕad_XLVE yxvIC3IHеYE61 xh-jK#@}!ͯ^!}՚F5 `E"s}h|+xWq2ѴEV1b ,B$:s{P(I~fgw4`uCk;=NkeCAt^|;Lbi T"{x# ɆQ,&gRgfoO%Y:`48dCxخBUjV z_]/N;jds44l_`Pɒ`O&.~OdJǻ&4S/oihn.(ո0RłsqCnJjN+7/ʹpR3xjm*ȭ/(|gk4{\<`TxYq!NYۺbF= dpvܛUGd޹;ZXzX{Ϩ;_Stm#1?<}eٲ֙ЊSZ!8tl(/:& -$UK*ݗfmåzyۀ|"3hYJ[Y+zڄ),M@-Jmh qF$ŒY;C[d='&IfIbÆ↵5YHƷLXGp ޜ4L {hU[Zx*z7d֣CT6[ ~ng7a-NpX5c5HM`;}(}y@W3 Xw#lH{#$L_$Emsj[sWVq>kDB~^uʟ Q0\nP͟ԘO\=2'~Y~M6$ Iªl#7w,zO]كJG1 P-@ #W 64D%xVD'SE'ꭧt_kb*yv!HD) &P&آ|[-*Q=_/  yAʿF;rWGPGuntf{-M1dcCKXN@$9T ñjuyMJ4OVuT:j*62[aܳN|&[̦hԌxD"s|~B<8PjD*hf^GE+>{}(aW$}Qk-@g[z?bz`#Dh_QQ'`?]A&9xAZ޲2kzfզ>KX )v21СdKEfl|H l{ޮk|ڵi^3,4{DD"CNJECwf~;"Ѥ iְc8(:M4pg+5ѰHd]cHNu:ch<&3 PJ~uzG7>ocG%+:Pa\8ú´ (fָK{bmD)[ uR?:%2r'AI Re0&Pk5!RY?"C,Th윆2p v8p|۟ sf^-T\6[בԢ1?IJ#V7+/. ;S-Qd <9k+} ]52bQ^spbj+C LWPẎ%:5%U?6Gpn1DJ q׊s+qO>peH; ]v]19Rk\ UR#SSlbbuL"LxYjho= B!`Y@']Љ+^0bD'QiZIzr}m=ZOBՒ斥3.HPT1c\" |gV!ux|-CO6@g}:[Rfbȼ6̊xvfa."g1ݷ02zU/>(l0-bAK <۩D? 4*J/*nzys7ʍ UQKMؐ2GQj(J1NŸؚM,-9fvnMms39{Ds#b76nQYJKrvֲp)cZWr; Iuۧ$ aXl.ZU9˦51.G;q6%⎺L@*|8*e&8sXpi3mJ:7@np-8&\zm}T?md^TQ wF.#ӭF{S2}R*h\)==qQ}b d&ncV-O5Z-!C(6ϞJ4g`kLmC^dW]PkEx(Š ~<\*6JNTf(&'9Ւ0ފE9֨Y&[ro Fl>UCY/֛15jg4(Moc_,> lYd @@3m5FF-U˷Mcr+ x னz㤐㩅i FZ7hjnC'͕<R(1O!< ,* <0$ibg|L ]ފA !.7-cLS@N ^X3R  [t@|<,166pAR`'(0^B~.TKᑇr\w,\.w"edNji+E7rU#PQ=̀6rk1mx%$Mh{!z{損D-Q" .ڜ:zюp_z"zvdo!O^wA0 "oP1Ieٞ#џ{ [kj&{qBS>`;-c*pZC/ ܭ>]>QG'0B}Fɝdjlx⠡&h#X[$vY4fsyPOՕ^Eb, 1 9'oI6MS2^"53RO7xV?RZ c8M}I?M V{9;6jz-h³d'e~nFΠA{}Zl-^%3ܶ9붼mz!nClXn`m] [\II(jc"5D,jǥOq>@yM3G|KI@DcHCZB@]w)maQ5&a6 Kn@Cm'k -$2삡 ύY:S ~l9gJ'M:Љ#%rwbjvBsQu!Y潩T1N]{'' zKnϽӉwq9}WM!6w26^_I(P.$"xZ ͕ӧHCbVU67+Dd":{mOiTI-坒}T=p:XFfma,м>ش[j1v| n(Cǁ[iϋj5dCx&ݞ`y|za[Z^nJOA^VҤLh TO<gcܑ?QMςDU@oӡef?Dܧ_ik.MmcF"/(P#:~8Xh]S;pKϜZ%vpao8ظ7-UPP[-5zf{rÌ}JQ"m=:5eږ}00U,n) F-6d?uWZӀSPy y 1@q8 Ս.b?ɦ0:*TQ|VHD#K׋(~KKU|"nka 2YVYTX00`obĆsH/RQ\ô 3.Rg@G^KeW> CPbe]MX6Ώֺad]Sf50Uf-I 6/Cqy~V w(`<&#K X{y~ xQTBJߣݘpGN=~ʩ?!NP' fx&h0!BMuz$fZcPa̿|JQc&d>hef#E0BW cQWr>w C=_΋GzUjGAa+U(~XX{5[00^QZeOk@aAxSTD mw"A\sB nL:B<6&L2oFXiMG6$$Ll򃢖$<Ǝ/8slWK$FJ>n2-BVԙqkǓ(XQsO^嫿.YwLNr7hp6o3pI~ŎH†ua-;Q kbgeX]^uTxF CHnd8l@$0 ʶ .dݷ B4 m5lH[!M>b &@` @BD*$HU6fI1qXm9L[ypMDPC8fS_}ޖL==Ej5o:AwVvhuDӆh$8HR+!0ǻ@M'q.Wk~߳|Fǐq8 ʎEL^+e*k a6R6?)Jli἗jxy8Xz:Z = vHhq@EH]"!2o8~fGE ++Uo/yt8c$*|4GRGj*nG4WHFFk)-ƻ Xy{/ 4,kuio ,I=& 5wD* ׇNꐢ׃+8F_ 1&fgƣX$UTLIxcB )?ͭ)\DL0@dHy`e3ow5XF,Y.e\x*C'Tf~=7ѣA,cdzF0 k)!܈ipO&)[#2[rشqAbs70fmo[H5갨/bK2zJ좐zBUB`z"LmDTwYf![i& 8'ʼn &f; np Gn>G”mlư0,3\ƵݒS19kJ=bwn|{Z 6G!]Úi9ya,lD2m[  j~͵KĊ{zAt@pL4zY6ؚjn!Rru -p'=bdҟQ2:|գʚXGHNSaryb*M2Jwzp30x2Yƙ DJ3yuRyBbx4d[N~ $r?HgZ4Pé|>5uFq{O;ĵ"u֯ {ȷ3(myE0>&x-p4hUFVZ`ضwk|!g :w0wTr[/0Y' %[4e} 9ߊr@$g|{05`h" `16NQ.(b(p:w6u<59ӂ6z(~t4g8z+ ~jpu;CT'ZٖNp3>CG+%0=U4>S:aU ,a4]># $:}D= 4 ~FO^U;U $ ) $PC$ez1~OQ7V2c(\;a)`K ʢX,Y Lr?5iEl})~> bҡ6bLÅOY6g̲s}si -Ƀ#KC']H2n t[ڒ4\fՆowyv2C,he V5 dn.w*wJupn`Rt1;E7"9iX̛7b)j{ߴ[G~@a`欪IsSJ8n,*/G"x]<5(ik yU7)WxY[wW"~b9>u'wu]zI ̀rHEE{&1+,8cpC~wq)Ϊ[|m;;jSG'E T^'Dƹ׸`?;YΏjH^Ÿ1咊9͢ 'e}cdvC@e@K[& -z`5eߏSIG=̭Ki*ϯ6pG$9zuEYUZs2⤨T˿FݳNK ߯qzB>5WQߝ-b1pI3Iq7+hL_ dQ_}V"p3J=nahM!W.+n-7 HmyJlޱ +FO,:F>dY̊Kv[,'Jlp7q>VuNOgҹ6.Ŧ02Ї@)i$pgeqJn~c ĜiRQ8xAI%Ȫ5 8?8&FQH,?X !Էk]$yS%X {d3!vU {Mu.47SjA>QY!*ƌ * QQS8.V8:q #{0~_P{@uJ`@¯S*kd5ˈ${̵!u=9m,0H}Qvʀ.&YC-U0 ȃLH:O-'f3>V wO~ )+dL2<$ؗEUwH}D G;?Q@eOrF4gxB+:'T:|o%V%L qi7Rr=XٟJ WGs2k{p+/.ZԭKO`l4)7e ~RۙPXj-Ѽ/;MiB_I"/T6<[V%>x9 B7s< kkk:i2W{o-3pZDĬPl>_rK)+t uNhiPSnRd^.͉WERX4Vod?90+aW9яk]qf_kUZnՆv"<5@EbMHFd5} r(5p@{iO= ޮx<5 F#a뎸rwjЂRp^cP;#ڕMBX_!O.ێ%[XZ^&+~?:oX]Q (L9$%B\22$B`΁%5}x,iҫ疼3p>$;6Je30UYN.IJ`/"!Bmm0 Zw11P?s]fpqMٕO\ޡam 5P9Z?j o_N,W\QQ560"9J;¬oj4bi Q}'6Gۚ̾ Lr^ }ssܥB`U4GtoGݵ63PEQ+I/xK?bFZ Ն+z( ?gMC4F_!`YFvvy*.qOT} F>b_OKXq.SMu'"{v! Ps@i@Dyӫ$"sI9+%i gdw) `ּIt߷Nh~g.n{V-^>]rm#Tvvbgw)H, ԫCiCO6eſڴeB?;{~Vcr;ФiSEZ)N.J~@uN$Hϗk~`{ -Τ('$AwPK9,h>^>ISտ0WܳNuc57@3 &3C~cen߳RYUBCuH}%M J.y-\f.,ƀD޵ I%[=56/6ܷn0j6/-sj$&XWoZbN-J~aT^:rm)7`=kt)-vp@cQH G6W0EŃ\U!y|Ɨũ;sç@^ c2˨g@4RKT#2dK:%dw1 Ѳr]?U]>!qiî3?xl)9]n %rsw.IEP)VW "-I'"AC4=QN4Ep퇒/bq,rmbVh1 4Y꿄>vHF>֧}| ;WډksP)wWs (afcFs qAN4wRE*juԤN9Gq>)rɛpZܤHW-ûGgO+ 7۬Y*,p02 3J.OA\ eO*/n}-2/P4fP& #]#? c&YbOQ(Uo|Zԝ μz{(R' iA/s'I4kOXGrgO02T%ǸQ`֌Ysڇ]k=EEWZtxO,5+zO>#GLx7:Rx]BzJ*8 k #؅ƔηLӹ[z#=5c‚T}1Ik\oM+WtrX *{]8D< d_$sBҋ",+Xx%]|AFHNIoZE@$ ?dEzZ>, q== oSGfeӳp H#L7,k iuHRjh }F2Y*:Z K/ dw_.+!9>5msD1 /PQ G+[1r"eė6BF?: ẽ;1~RqR|T~QUO9Sk[-P5 zc{^DR>X0G+o;y>*-.T2fbH- xa!ݗ29<[f </n!<DAxޫP!ܩMuӑnKx^Zw[nFq):QZCrvk,zZɳ<1щPQY$Ƿþ#JP(%h %S6CݎLSO 0% Ԣ+O쿾 QAa'.gq]E1o=VL̓e ߵp/Fv^Z(v{ZoJW36UXȶO!MX؂XJL!knCY'o _b D- D:LFwA=ӵMTqsFK$@ր 2a?HY͙L} !DwYJIaMxhG$&`-h t\[!(=sFfL`>p35j~Ԇ[*E>iI^;uLUbƜOY'.Jp6ºmVbǑU~fviw@Mۑp~F8ESƖk,NG~[B=.ħڳ0U|g/Ԟ.W bӭc#y*\ O1֊7I%9!|?T3}J ?czvPzа@oƉくHdyLVoѧ\9@R0z{D珘0ܯUAV(eiǩi3韎x^úŋ (*WAf&=A'&tk  :GGg5 ZE\gɍ<$yuq(S@_̳;%[k7Sst28eRn ^lt; G#F1_$9JVA[_d_%\Dc3(y~;)O G w^AeWLEATz Îb҇K,|)I`pnUseqfzm ! /]zL%A[CL0j7 &jYқЎC>,"L}dI&_5ƞ9׌D=So"hH|5ESg@'6cl%95[Qȷ3)s_b_h|N-TqXG 7^Ū{#2( c$'ЛrG$T泱PM)®X$\sZsԽ3"H/5oR?*0~#kqt_8h_6Y H>* \Ffؕ? OnxLI2ܒ9 vmML^T N 1W $$^3\àBP=1R䭳mEukJ6Fe&:dDR{qv2 %+ZD1y2uPP0JOگ}*&x}0ВI'%#$+l@f:e  ;8"W=YN]7LG-代]Ҳ%|`E}!7TSLYXM [ݸwK4,s3 QB4qYa~r}FsR )#,jaU%+컣NfKXEh.:gb6@0}ue"!ue'ʶ@ζCNU-#Ͼ jZ=ʟ'CeF8޸C+ڃ5`_I:".d4U0P !$*}ھ0M'h^6o5wZ+Ogk=bf}3]@D{rÉZI vR^Y]NHVސN\^K^jZ@41&xc:/9 iu^- A*Ot3H 5DV8sB̮TTqQAq-Dޱ#\r>=MyXJUqig'6Ji,N688MmNJV ٰ6"jq~g.oN<ygœ>-آck BtEGa.zCowVl1ʺ-8T4H_!B?cRBWm/͠G\yEϳ!FȢ({\t{A=F%"?ʯz?{GHuE!&u:H)gc.֥zZ.n* K3yhH.كƨ\JNF兄9+Ǚ;x64YZ+s$XKU0oQZBF2*H5M'HZֆwwpAERe8*q,Ȁ^ת]&YboۄR_N;@gE&^c:mU@7g]eQ OI6 z#7vFD. "a+ x棰}>GВγ%J&Su".Hv3KUuK)0 A—A-Hj \d֠,A[-w MR -TuŘ{Z:tgJH|μ",(c+4A[дQ Ŵ {剞o‘D #/U}_ u9L-?ȸ5mMG4Y?!Sׯ1c5(YsxfF &5Y8LѧEQJ?ږeX&`Օ˲TCVSb@(· 6c C&#tEJr? ƯI2kf.08Hb ȘOP]8W%]sx$1 z\c#L|7*8`vM.MYlގ `ow?O;0[Wz)L'ßDޫɶ\ vMȼ*039fQmefw!4w`7#Epnח} LߧߎX䵷ygsve]8AP5.x "q&yGp\ޔ&lײ;pztdh  ;RFJ&c!O}Plxn߷gOh-J^B9SZ\PP-'YE>JdY0NIM< 1Jw%T~#R|(lil~JWTit Nu:_^¶/yNjnk y~wv`Ae`nS1@2yVf*jr[j]K+Y ^/2qklJAT&wy{/+aA7dļ~5pU_l"3iE2hEi;)sCzٟ]GkhQCkzhtPTR+:9OÒL&3 'szq#!|,ܷ[5d/\ju[:v58x>ޞ {;!o5py+BsݴHYɯb3䓳M0]$NA#/ϭ`Wᇌ)Zci-&9&7izwfTUsҀ.OE< ]5 ۼ]^ &q9r XNoHedͩ;I44ۄ0"!d#-+V ¼o6!}Y#3zΓw-}Rv (>禹ZMd`r9045P)\?v k]{sѽ (Þny|kD..[`*W6r<+ K8uՎbvuD(D>E5G0Ξ]l|0uB:LjB(zp4Hwq^@5|#űwҙK7 I%:%8٢lI˥^jE0zHN ֬*\urLY0nd;ŕ›'r6Jhl 5Q&t\ u!CU%5( OG/f d̛COU?2mlڡ:řO98A}Vμz&osje)GI* 7 Uܐu=qb9ivNo,ʁ'nȯi|t[A}`~H)Q$C1e ܜAԴphI$!}L˘d} v& ? shKV[KnL}5#{")p!}}I@Ѳ7\ޝ4Y$?xS3-^k-Fݥo}S}tx@'T"C"Bsa.8'ƕ [J3!Gv/9&:"mq1zD(g0I =5fJ =>}$2?A{ K"QNκM=)}-B(:I-?,EN|98 $; okF ԒNS >.Sze_ z3=u*wlt>]Y] W\,5T Ʀ&F/a2xwLN IȲ KqؑԪŬV}ȋ-'YΉ%:Ӻ:d5 t$3=djmfYRba?'Zc[)4FF+A*rXTi1i?Sc&ULUQqw۱-yN+~n]D"(~$ + )"U KN[D!IQ帺@o Q> `A?un@%ðDw[[3\YZ+p&jTl3QO͚}RM-[}~$%Fߞ͌ߑej$V1wEvs g䅬M2~w$͖Zdղ? 2ALz^#a&*\pل]ՈP$;h ]Λ9t{ CaY޾Įků*GZiA'8`Z2e bz] 帤`$є ߹ Cmu5Yx1F?֓3B382/;;z(=w=˅;&;a]WHk.qͿGL&(WLn&V׏GmB7O4$"M,.վ 0 j@&eZDDT4ऊ)PRZÙAOE<\[m)a(  e[ 1i4=T`\,yhE a HK[!(^Lw #Pܪȍ6POvҤt~j2|UE+fCSx:X 3Hx>?W+ʼ ¼x O)s00_c Έ瞩*~ϒW@ԓ4{.r P`ba6~ ¦ P %; }۞2z%8<ӳ' 㝏}5 (>MT}OA|fJթ)' <0U:C:BDQ_g]JE-۵I"nJbd4:+!vSX[zLPHު0Q[Gu+ՎPթWRu֗r_*me? vִ0 |-2PmM`@`[N#uMqW^V@=7+A|Sϯ ,fqJkرyTV&' 3W>PI(o UziQDqۅi!wd>M:6Ě4npeoIJZ} K(fʗ4ͺ*'[vR B7QWDaX)G*qaa>^% lf:HV߉$!mr<^YcmDE~pe|>m<-jI"Wĕ, k@[s %JNȫݝC \o-|'q}v 8pz_{=Ү᛫k+Jx;k>1X.*JBFC@ZsCf`KJPn44uˑiw;g4W S>y'>0 Ra<<~%g1^.u|j+5>E :m.Y8w| cP,8褎8.]>0Ð(艎x0$:B2\s^1h M|EFSJ:h6uiwCtAm\!Rkmw t-c B2-E3PsF[|!? qɳ?Ȳx?NQ]8eweիdv[Oy7T)"kKWF٩nw{F5k6CvMx(16cB h݅#݇{T[)<#x;T+0Ǡ̢F+ӧ<kr[(C@4Siy )-9 Akˡ1HݲM0Ӭ$wu CV䶁.T}gQ _ԏ~AuHb5Kl|ˆ߄|<:-#@8+gi ضߊr)3Zec03P]x y0@1^h":Sޘ,9Rz'B+x BkKnZĞWr`&mbv͢2R(R0 +cn jeF(\VyӞjRXK$< FU1$j'6T/_k|41(/@Я&/}7I$dEKd}[&L3vkV̮zOgj]d=0rA4pS[8L?F,;!%?ï(9} GWYk&E>e˫Imgb+ǐC|TmNqy S^7|G^f Q.Xk]кjF]Ci0lŹ\zn+6;ܝt\h# ma`rǻ#ǡxaQjuUxoNήeAj>;4[z97KWn;7tJi ٛ)h&ӌ1' g Xضg|[&?9e#;X)X| hGde'cH x;J k}u#Jr>6wUuU >Fa?jJTCCS^"=}'Ґ@5Y%<wEBۺ]R&y+ p'SOTLNZ>26_'̢=DlsMGҳpu:CiCB@74za6zbQiQ¥<$2+i[6.=usJ%!^"޶1>ܳBX#G,Vn~+1Vj}EF 3o ӏ“Å)U/$,!^^sx~ Jgi Ei "S=¯TAZ-y*VxD%z76(0W}] A_s$a^58hz+qiovtrz,gd~yO/Rz#.34%{jz⇀ؠ>(H;X,1S1FײN(^Gِn#ZqH8'|J)QlUw봣Za>T=M[rC,Ŷf ܟ]"#vH(p7_*co YVZܮ/׿Z)Dc*omlR3T\.%XqamQCЭ3STGфN둄.j/u*ߝlKpXMB84 ['4yҷ7 #ᕒ S1즙b)saJ[$%/ I<gu M1L\$A[' J;~Zz2y&G\Ȕ1nav/> AbMoVz^ hGU0nbV 0=Il dC^>Bnަ lT7;f??'&tlU,}vuzVuFg+jJIK)BfcqN)q6 +6$VNtE hYw`D(e8-V$X]Gd7`ZNmZ0-:^a6Ao&qpjC_+ F: N'~Ԋ <BQ;p޷C y$yHsxԈ`EK~LSNN+(9[mF`N@ &4PCDXn5}NSudij[e4#^ᤒ?CK`H*-`YނҞ*y4#w.=3_!^ 팕6|^2V[F\5@h#OfQgp5 Ũ"w]8E'xw I@psbt—9[ jcDT=6ٔKVrto<ÃF1UXj`H=X،I͕]8GA<ӤNȿQp*DKn-d VHKd hC%V-CF'<ؕ.T`s 0ԗ ;rKt^&hRLδִT1aW@\9\>=3Oo}T)'$^I'P|5\i 0?O14vǔz.Gm(G9*9u XS:}^J)-˗U *_:clf[$qTO[Ϫ>[@pbyt1erH\]R<|M2ނ٥t~ȑF~G>[Lw;&oeaM9IvG-fG"qº0\bYap@Z{ųM|O (㬟A]0iw/yRU%lECUxqbgh>FeQd.6OtN>5՝d=Qdm8]Nمud}_qXNƳ¨Bl~BSx A M!["OS+&DJ_+fZf_73:}{N}s%ūU+_TJw剴 N,,ғ\ Y?"GZmS~fۢm3dz3G_w΀N.mЀ˭6_)]Foi4AԁC`e*i a EXGy5ʼs}an;s#UP/ >ۃG98v=ek氡=g?vSxΞw$b<>6G DC8k?#0䓜d?~JcRɯ=mt$*˫U;$n3dӄ /G->OլN-h濑mKPlxO^BA39F1FJ'5l y--6kMJ]>ΐd FT4}DAFRJ_iTXT"|K8)t3Q(I5i=J h*A@7WĖ1k:IHˉ:yw~D&ĊYbE2`{H;9J4[6Яc'דDAx`%Hԑi=Zk!mDnٜrB h.yR(otƹ2”NIkY!p`2 ak%q ,*b^c {: QyWM?T-:Nh24bI[R; ZFr$ʖm$K ښ!OJ#G5PNi.pEyÉO2ؽFoAT[1Q`4-aLTW!7Jh>s}U٨{PŅgPjKcrBaadfk4IWP>H"9G# %7(I.rֱ h]mIo>g:sp))&p-S|ר'Vp4X{2L|HM\1%.AŶ8adC:Y/ꁈohH$Hĩ]H`5SﱃSpe2i hPE~93=?q)bq[$j>-~*8CI/à}!>7_&9x~npA97Hxi(W{"XG O\IiuNaZ5]dlw7YooYxd令;aZ0<{ !?j9pى@4=xWW>aE@fow.Ecw#oeuȏx/5^٥?\l$D:P,-H9Lie99ߺeWAF=`+)K \Qӑ q*Ӯ4 ʗh:(PKԿrO?jwI3duC7x_[XX`FZ[H֩q,oCZ1_f{xilE]"?H YaG1a|eAvON73sˡ?~N0WZ> M@얗QV֢);ùnRqsȆqo&NAHA:(a`e;Ě0ѓTA@f,B+ͪWP9~/Br4פ5=ods1| R&we7L7!g_}|]woug1T]¡촛95^-cn7׿.~~#<=Ģb*Xoʼ:Wv3\)k]p6_V<sĊfiFlA6;+Һ`c En}E,E UTEsb3bז \uC %aHGd eWR7lOfK>1 ֽR~;@خ_CL)! 6cAH%жDZT#cvK1'qW\n+Y\ŚN;nN8xaYg4B7! hx7i{52f ]U-JC?~uO}{Y"e,ol gRF.4MQa^UUq<($ayGL-V:I^Kd5#Ox-=Nϸ6lNeFg̀9 Jitˈ9q3SYid[BkQ:hk|#dXc mf`/;ݠ]7w2 n?:^ۨPOOv/8pD/F*8ތM"VM?ݒtr ]M r<ы/&2_P|II[a"Lһ-Z %z\Yu"95 T6ڗY\o|.FjESzַl]LsߐQ*n h)2BASgkdʄz)*IZͿ0:;{ba* D6`c`2]J ]#MHIWJdj笘=T/*0*%bRs-ǘαLɄȬM0BK*Υd~T鉂5@d:&Re`pux($Pby3hBZ|M[VxRB@]( AE,Vnc ,mp<֣{ҵ]RgVC6vA4?eFhZgLM5qa*91$MA&J{1GH8lrK-'&˦x/fQQȯy!-ݰ!m;{>4f!hli=ۜ8lǚ!_ `Vt"SNG*n$[ Ĕ~ƏCJcjBuxWޤP_W~cx?+H |礐Y>3{Δo*2T^OBt`nR$))3V6ZTTu=*##1,1>$0TU%ոU=] CmJ#Eu:-1RDNe aƟ3ꋓo HpA!Ss/ V/D6&7H\PvQe)ϧ'K`vK_<$s' c]PJwJ{kؚ\l!. 6Ys!_\+_MsC|<%rhXg1͋j4KLnP[]ZEVT:'A@ Sz C="vT\/CCrZjv&z= pLs~GZ Q] 0xu0"Z;ȝ\]헵`JUcNݬ?L9u3+y yymwDž= 8vzؗ9T:f*!v _YRiGC+ŀT4Ig:N_P遞^*JOYLF{&,:o/9%q`?]vLLl'3;Q2}tA'gV̈́|_nhaG_k,{S=Q7~A<tztB9sv-tSUXyܔesF('r\8uy$J Ü"f~95 `: L5EqJ]"$2kkid45Sl5iU5.s4z SKn0] N͸y*7O6(tX_,JEbnC9_P7Lx5C{JTSJ`3ItoSaB] q@YN()YVp#?sBk G<'Z lUVy[M $qsETH4icE(!KKY~u{ƶA#15L_y$TQ@o;jA;;]W.RnII/ˋXF`Ey -[_O-UFtQʺh0k2dU}/ILZ+Z]"CL86zCj_1]pxL;%]Of?kӃ,b1Z2)C oPtghPڪ4N?GPW]/sw鍳K 5@#"Ǻb] No ޹͛{{U),M>nIM3#y2 JCb -k4h~ª(n;E"I>pɩ*aSEl3LM#JtU(L Aru#-LV kbG{ 'ZZĈHj,Ԏ!H<&1B$jg Ə~ wf vj=輄a0 :l`Zq9mO,Ihc : 3M;*+%qQې*+ ɗSap BaBa8\9tzs`*.E&EV$ z'A(hRJH-OJސT(" =I/KE֖āu,6JNH`_ +>˩g`LΊFYRҏDiGH[Jp}iu>!ϟw9ދ9Cr_8aDG=լ|XBCVF6M'OzpM8d\%0ڝh}qA6( "w@zx%8E, [URNpТj_3Q2$m|!p RfQV PtHJjfWoat-D6oT8sS Yd[8!m;2R2#nf'ĽT#&34%AoJo*krӂ3< ti Kj(0k*mwX?rD1iKsτ(Zb諑l̮5vj$ MWv(H@A,ź_'wNfiH䉽ȅ_鞜*oR8.-͕2# 3tG!ASnDJGK1+]uqYza91l,W9jUdKcEoR/-?G{{#y/p_a{!Xr;{o 6x^O=ic(ZG>;A7yi|Q'/t eh.[i+6f !F/5W|_j# E4WQVEA-cى" Mu'|g<[jyHp9Ǐ(h8-yJɄ$ E$U)r@VH0<ʥAx *52M88W8#[ {QBǭZï;^ZMɉޟ@@ {/Wkwf XMŶ~\\g ΩXyS>݀v~ݝHqnez4c"l9gOȴ&^Ha 1{I1.CpkbIHTThw&d}%r<d`ePw>,Ř/$'f_ v2h?qWa9 C?T ffڟrи!/~0TMXzgW@oKWV-/=iH3n9NeU.0*/"*~!9Q'uq-Cm<3F'3wRJf FIԏ08'Z\u*M#(@%k<ϤxyY*>@u'5ݽ8_EЄ^<FHYPO< *La{)FaV#οcj@PaMgU@n@j$P>c7Huhqf]&KQ}B45@iVF pA`fy#fmw HCmlJ¡ĻÍ\4+mő_n67JŸ5/cPɃ VqU_Οgj O[0E;oY| Sa+:vE Z}\.fL1Bܡ,t5Z,Pt}JeArOzߞљr&uX#?{ /}q¨LpݼCE@=~Wѹogi3tLͦf7Զ~KxA'ޮkO@ O@L`=gT1=+(mqg9RoYHO}XzMF[#Ps M/GbIpԂƈF'xXl}ϧXE|2)!'1G0 w=/|{O{Φ_809! 1M ;$=/29Puߞ= egjw& '6SMaG,gC+H{Ù,잦kl%̘5JK>":Њ "fV{Sh u\eETs͜Tv[~Mkv q :`&h$_:9)59i<ֹ}T~`LRMDߑ|3 M$#Փ6[JAf^PlO#?>ۯQ)B>w@y69{Є1U7>یī4# m1=mg֯}̇DbRb~z)!\}zE#Y@Oꩰ5D+C8n ?\0~@Eiddul:ihLV07(&NDAIFN͵=aZ9lTz2СJEaйxqqwpKY]ХAud4hq>T#U-K!–?U՞diUȟ3! lw[ɰU1sc})gM@dl 'ԊNdz;l.>`B"B|,+нvqCDG[Z+gUj /?X_=$ޡnǭs G+칅kS!?8ʿw ;73t=ye)JH<5YEԾI3RPh&Xc~(e^f 9o%qm9doA\hK~uF[ uyPp-o|`esP.sfatPln KQi B^0O7S;K?ebHed'\* \ü/3sDqM6:qk]BFa/g?'"'D@]EW&L}rbYI3O3MDע$.]i/Mz֦:gM=.P?c3K!/Y芷DQU{C ?6]!Xk@FƬXYe7%Ua4FNJ~9̊ﲚ>y${.Ȅ z%J'1tdk4Ĺ>4#;R-Vt#3[a[2hĔc}= E$c$͒V.Ã^zh8( B6g+Y0 +'m{rFq*}$-sp~2稨}`p3UEb87XXGs`)Kʵ:C6=+&xh^*U?lπ~#HS>ӡ!)%epԩ.!zWx{eĠ5Ge;1t0εIe[5w#!Hbi%+]ҿfqd4 dHFWPm4v{uȳo'fEWgDPhCaig@hXӰH8D'k%^Ta E$oX]KUM ^bWU^;4\!b]{6OE;2]Z÷s R~|kiK(Ped=$ 7) jjgJhuI ѯA 0GulGMH*V}6j"WvvTse.`Nu@p" qs<ԀrDs&+GGhțV) !iVBs '6)\E&XJFpͰ?^8hhG~q, %9 9hyM^c=H#L93qpܽFOcP<ϖr%T|Xa6 c)٥à%O4F?t|JNO>fvHV 5]܅ )s6t999]I񤛛+N'md#B~+]L"TތqMz$.+gPCz=:Y5TV9H~h/< Vo"ec:#_%  K^O }mE]Xwlx (ol1Oȭ<,I0kR~[!ɡWz[l߉j>N~9 `&hrt&@*}V~ LftEaFA]ܰMªwdAF2wOT)ÌeG *!qw5[X@eOĎԕc^Jouʠ2j%Kp6 iA|ܟοm{> ̮nZ-u8Hpl_ψF*)skE0JtU{^o<&NѝI>.5iEe,_ւ;zy|iMXT{B<~C 3(.]Ku"tdwژ=  `dDWi==y.#gG2m3XKTvU@PI˘f)ֿ5 $,r z91aBI2VucI۶D:J2+US 43syp`ئZ!o/Zz53e`%Ow߇Xs2Np^o"} ٹ YnҮH~r¼rNcp`eb3弪69  S|͝YW'πQS_mHf}DW-)Yj@$6'i /<@x nŜjcl#^ƛTqNj8ҊvP5b6?&jX'`9:45gk`?i~zJW퀞$XtdЇj5ͩ+-[}p1$D*.?K`׽kl?2qjw, aLc!aRޛ*!$gVˑׇyË2~|$yեE@1[SD%!K8)gߔ,zA-HDŽdO+Y<[ĹKPwƘ 10m[#7]2J9yhzȴ-{R2(Odp|ܲIrey1 )5I]5;8,PƑ=2^^dW =mi&t&szf"-R;wsxsFT%Qb$hwPBQazF:m厜JRoycOz =տhG c5ǭ}CJh4IrFAX(UJ"7f~43v,+|#@˴;*."%+ޟhEQϥԙC0ֆꈦvi,•."H0Bv=Z'sG|RB~k %.FZ g]R:TzJ;e`!>:NyQD䆺kHx(O C\#} ÊmSAsR^&LްOh[:M#}C<: q"ovAo@@6H@~A.slmmP2i &{¹ZЁ L27/~`ʱ(Z:3 s:?噖*xlЪHkܥ~ĺ&b5O8?nß^ljumE1`hK cW}2mϓ7oZ"o+H4)o"}bR/rĜjX}nP(5VBF+$H-"l2lM6誙T%u”q$Otӫu_սd+U?X<_ʓѶXUR5wqLD0S^\qUXWip Eqv7Q$@k X:2Ela{e\?Ix'XZW BAx%F)(}r5=П[UkcՎ:O@8`>,g¿tgoUpgϡz[*_Ȇ09Oywg(ݒW53T)%N/$T)}S W/" ‹ƻ`*r1!JL/}%c%!G#} 8A*?db1CvU=L|Wg z(43CJ󌻬6'D%tDj-L~gF_B鋀bfH%.,/Gb?ȑTo6{{c_*$RUiZV/ ?$yYB;ՠ'/ vU=%/ %1h1Ye+> : 3@, ǘtj8 xl9nՠKmH-^Wڍv;=~{'Hз3a.N,:Ѻe,Ufqw \ IT%X.XP&qm Y4'߁[v$if\(b_@h]@F7m)d6nO.`a'뉅&h[f@&!bC9`W"%P'>҄(B܂À11yH&:3`j'}E JNjj-ZQVV 1 BM-[nu^&Aۼ4x>#9 T;Z`B?YW)@8HsZ _:+!&nj:I;eY {v=uxopXZߑ' ћ|H&EKԑ?6mxYLM9!i۵!@2sMy1 IF%(` '.U_e43lB[D**C7u sǹc*Yz,C#zO͜r@ ROMTYkwgJF )-%zj7Fwv3(0d)&T25$͆6JᥛؤУ*A&wzUjmiw H)Z)pWTir..2*4ѳx5*NT.-;Lk'}֥/UFٵK[D)d^0vuG=(܎ gN·:&%qa<񳒡a䓰f HZE@Ɵ<N1=zGXۮ2z|I/w{=&Oq"1JwW^<#xTMfyC1E;F 9qZ¨ɜNSuz}Jrqd㥂lDhq:WyMF I]՗L)7HIcVmA4N5"$CFWv&.>9)^6F *7cvRe2g_bG DV.ȥu˨"h,ҁ7$=$HMK<AYNBGi 9B<{8d?6ǀ"|tCV-;cۑe$n˘Vu.3&t y3]Ȁ7Hb jރ:VBp ѥL7T_،?O ?;P5/TݒCurmڭ[!&d IbXWq"]v_Cg@=)LEˬ@3516ZK7Zw<0mǥBP{B)E()$R~CQ]Rg:Zعě17j݆~VsJE3#3{BS&X*(MI"2}>eL7CAmlh8Zז5)  ,8VѴBKo}g=_͈ipr.Z81"@ &Uhv? j#ɞ0N(DtpB'z˕:1@Z h[=zLNp#>bv0E)-0XݒK2UQ]'؟P/Ȋؔo؄CԷf4xۭx?̜֤I;h3Ysy›!ئt6eQ 7y "<{JeŹ79 K9֣YawB~ފ7Dh L]SH[ ű~~N"DxvqkYz"J'E`B+߶d!z( +-|FDq.Uΰf"K}?etUm^*r! X0DN? uq%6x40 9bH; ԝP 9F޾ce5jA; ek%q]E)4ïd ;Nbi\՗S < #s! F4oƈ[8&kL )uX)^]t%|C(iZ5aʴV>#igP3b @1;ӳnE~W[:bއ`EѰ?=H)#S z)D埗}J 61σ4ޖ[F'$qBE؎ Sgn55{nUJ]yγay߀S!A~MИ#~jj c {WBn *w"JrbA?Pe@ٌ&-*-_b?uZ0~MXl3Zaw|X{ 9 %?Ui09H[Eve~t~3 z%0f~6ļM_qLA8`1xd-FPtdm ,U17aǽh#ؚ;[~AtH:kSevzz8j5CꅌwWT$+f*Kkt2H-g@JbE) M|g h?aT;'>OL& lfCі~ݔy9  (6eLۡ x̹8lߎJ @B񲢯jS($cp.*<c~ nkPo8ҞO'PheUcaO<}nGn/{BNL<[uez&:d-@[ ه_ލޡmw=PPτ;|P _:1[.|,CUcw52k*?L"Yn=>;4H \qoבJvWgȘ$f-o,:(eMl ;J.wEf GXBMȥV.&RpوzkqpDst1j4YM_!t!9M *0 hgܱM[IG|IسK}({kd N="&1c9#f/f2d|s3Nߞ#+/`\z)jJ v $ Ʊ5HCd5p8vZ}V]Y ?"tpUٞ 'JQف?V:xwxΩFs2~GuzK-OGh%Oz}[+sCMb2lN&y2-i*ґ׭5@^w8Yศ)5p.Q d:%&`M8z͗i5[lmGiMNy 77{JANAn)nAXWpt.l#^N m5RK6Is4o ۿ/M{v.d6"IoyH@#ȿSy#p|Y['/ >0:ΠL8٧;t8֕Qu@ck;E˥C7s\-L]~X^QY%3OB9hFTƦI%K#R n{)}3ĤF:L,ëN>[Ɇy)jehכi_1#21| ظQqUѨ/Ug7ԓG[>?B;J2E~ʽ$h!˘zqY !uG s/faM)9PY>pUAz|\iƪpYf[Xx;4gq.g߳Q3eң[]id@sHEDl~RDz- Us" !:N?AIAlLKs t3ubcposh %eJ?[1D<R&NXM[ErU z&̩CӦ &>^(( p;K;Z2;|׊A3eI @E;A#u]K˓L $9ٷA^g") ,w~"m\df॥wLT$t+VD Xd'WDLS"BPCSvLS>\LjrMqjE-TZ%Wd/2&x ,Qgg^h< y&KdGA(XZU@cIo2pqR(J`@?qiIJ{?-Q &ʲ@ )(#?_P3s؜Am} q<;B.BǷkjc3@+~9ܒtsQs(Sg`H9ښ#{0xh@]SDc&с[S V/+^-((Gi[PzC6J%%=ZM mp|ZKaNĄ >rL͐[279/ɀ6p )b (_H,#4EXkK4I ֎]łTŮ> ١95h9CAlhT"u$%A:#zO-ZJ0_HrY4~G.ƛuiΟ҇wXA$Kg7Rv$9W@l}(DGzрB)sTy9v~P~H%1b;F>(Մ%d\`ÍgfU \>H7P7xڐ97G ]Ne@ehx,xRA%_/~(MZ[ޥ% jC)4~1EB((=R0{yqiGGmo~=Dl..-CWL32F@J*U|,򍸘x LE rUIN9#d#z"˙U7]ۊ8^gAA׭3&fuZ/{t$)JQڃק2-tW3?>9Aū\p:}\+LQKKq(:4&oZ.O 8TۉBsgja~~.y_OR̈́%bl]7Eg(ÙX×7OC1y(3~F߈ofߤpN ]M+eyV{3(QBf#4uNo]eVi enNyiV%S/\P"萏m&}=*U; e&V=$8cmjEr2N5԰s Sy~rbLPo*R.lnݮj'I|nL&5`5Օ;NBЄ. =Ǔp6O<OZ<6ؐyCaN Js7|Я6Xr5I,Gk ч LƖT A>EA}.7$$['vy0r,G TL9=sDdNQ&2a#EusAĶ{ۺٗqfCSgnbjQ'mj NeƲv?;T͇r0Iɰ|oUL+Xà A4l'nGC@˶ZNL#" KDC^@Ke2zģ/~{f~T.}O)IrhV j1D5?෧>@E.+ː!XNT]qtEbHDZj'{RCYlKGh&7uVݏN|1ifBz+LϏM%- ¨MK*ň4`^tsN##d%z@ |Д4ny<53E-\BuUJ fqBb.9"ɓA-}gBc+0-yDƵd _AڝuE!A4"&R)uX.Q.hpG팘< ; {oYue;3Y;" @S\(; rX&G!K1cfR O eCr<Sך.C:`eNCPI߀q&VEY}%]$h|pmE:zya^X)ii4gvj3Ƌq.%zmiāNpވ M/5f~E @GeLt:Lהfe59Qv4^V5ש^#T)mo]nzݴ?""9߼)$f 5jIi861esEQW)ڥ`׃8`vL_17 C\FS֏'~㥂0'3FiIYf~-cϷHgACKl#EtÁ)m5sj GB*cM"cGV':L~{mf)x:iTI2S|=U96^Ūͥ`Q 2#=uL2rFO'wLpH; 9F3҅JtӍc6ҺjO5PAa( Ymw [Wyq[o=k{HY<*5S^ge lg[nZ,Tnweh'M:b:YYe>FڞO^**C2ހt10ɟ/(ِ$bNLXY+ӪW \J ೮}%&茱uԡqfb㭍<=Ӌ1^R; 3l)~@~mg՘&@cEpE@4Y^< y"u]y9!q>ܶȹ O90q]Uwe]a԰I2VBl'˙I$:Qg uqwJ8LnG~%?Ϸ;9U$j/h1j&"OC"`ъerGRo ѾZPv/Jb}\:h%6C WZ/ 'am '4}$y€\xkP*C|a&Q.WQ3! ]yD!=NLڪ 7HOp쉇pް^uA_Qf Ɖ`ϒQ9+s=[|_J('gƷ&{RVF^*z~P&qiIL ]:Ӿach75IQi+CFmk,7N{؉Θ&KN<ǰV3bB6z& a/"f!=HbN2YlY ; m;\;1N_ղ`ąU6+29YS?#|wQT.K$9m ZҫSnԤp@œkre_Umw^,OLIme~DǾ8+)Wq}aq &3#YBEz [|?^^[lCH-||S-IӯM}!v}w}9E6F!N{|W)Gxhao{x)ajmq5CQk`geOlQ#5sctCd-IJzlZ3HoVyddJ1fR&X"9H3 .qMhni|ݩP9/1oݝǪ+Rw+3INvČ*뎓+@\}?C^lﯶt/5L^8͓~ [[61 ~S K+Q.0]ޘb 4kی|rʧKf68] Qf<`lK.,Rڿs1ktܕ2*Q$# =@8CGkSr}v%.d[U"AI Re0?WYsIFiX%.+^dF@]cSO"}4pr\:,[w ~\fl'[X-fܛìzOVmm]GLl`荊Nx DW@$R$˓>T+~$mf7|QsPS#x+Ԙ]HtNjV`YfVE1N3zqF΂[K\ЈP9 I\ܖK0-X܇2#Y8V `kd5̡9xt5N0XxZ۷^W7T?VoڏT]ty_QSZYPXIOnm95ȗFBTWK?!}3r'y</w*yU|6I>WDpԸBV;<`R^kיCƝb,[w/P!uѠQ됒ёr 4rp<=o&a2#]46%5Tg.]T*tJ_Zd&1T)Uy:a' ?w'\";="5_M`'bdں|[5I4Tݖ-pnM q;gj+`>gn].rxi]n| fͩLBt\ j J!2w#(Rc M4[xc|Ou^rڳ_% `MOdzmJ :ߚY5!)@~uI`b~NKVψΣ,XKx#oAf~tvoE0A\fyhQ2GŝQJϺ6i69`=B4m˝a;^M5FXm[G 1~'v;rik⅓&xDz\ֻ+ȸ7MҜ+/F{>Da{jo v]}H}9^os2M ?0#8n7czY-iAQu7MRR<.l_|uCp4^ْ8ktG#??Ǜ{*> } JU蚢QTi(BJ-R+&m|z?1̬v1!!գ>epl9KLgdWaضP*rqqjE_}yz$*?Έ}xgu!AB%l+$,ГPo 0JTEBD.ѱĂ̬g&g|?uQ VzR7`oҪ8g >?4lL!'fH&!D4n_'WI`Hͺ⻏3Lp Y¥P`qcMW3H6mE0s 0eM)RnRW@'_?)OϪR4Qo=U|)ӛ->n-OI5[W L|=]!t(gص5|<&?c!kP(J*H ##%ta|˸[Z@#kS冒r4{ǭKG\ d2%^C>*`P5j;> m}H<Pd}ۀhC|B =+$LJ䡡רvj\&+N8^Xܩ +AFrliQ&Y 3=2Rf.2AfZ_ma3{s[=" Ǵ5DY=A+S7Ieo4QqL(%1a=oעB'$_;V8,kzȥ$(hDK G'?ʝVYQ_,Rvfnoo'(M(fy)hP/Ɔ@Aaijd&zKZs͖'ݯ }VKFsEݷ:~L wKoݕf,}!cePۖا@8M[W-_V:Z;k)jƐTmp0/Ǩ VOfVihQQ㧲+eZM+0~P?wR& d+D|-`̈F?]6|%CD~`τYF:wb) 7aXq]N^t 34QzT 6NQ''4(ggj`}y%}%gԳwh"o_ҁJA:ݚ]X£0<pv% iÞّն4׍ao}.`ԈEؠo)vKKn&9`>n+n{m*F}W8Ey8GPcLI]B+"bsFB,K Z4JneO o{NJsuVtZ^CK?2ؗC:>_Y[]{Ղy*:5lxb48!0:JbqHp+?OlY_][ƸmD8,UrfQ* EL-ؕƠEU8[Ymg*t..XQҠ wn zn,9Q[.rx^rYh"{taT?@nsw@EаrsX̶B1j|mXԥODb +ZڙuAM_QE3,X7b˧?;=~}QoMNėVD6 H D2Gl+O2YMjOKUC ÷D{(_XkD9׳k'%0+50P=min:I^+'gff楁cy%UCBGh*FuVarz^Wsvhs!|dE_T9jx% 0 UW >J56f )8F%`F}*vC7ϑ?u!2 rQć,<1D2?QLjb0~yJjg;\.1Vʹj+A|<t=|טլGonٲ7(|jB|`wԳe" ,Yy̖1jAo}M.W.@a#ӧX ^Gcz`#p]tRk)`ul*7c g68,WrlgӳF{e}g^Gvov~'h:Mn1LYV~hk7Ò1 6oHaMT dԽ}6uC\eFʢ|/܏>VX=@)g[Sm&L`s?Pn#*sυhěkq?ԺŨ]ގ/8Y8Up˂浛ZOU+l*כ3F/òl1E_WSdBB$8E̘QĔWwu}}^}gҸ w0И SJ[Tn :01FL菜TkYa5iW~WPod˾מOknuw˹Zsh]CE" 5O|H47< f'%r: Y~Ÿ3`e35hb\:R+Πéγ΅= zʏ-V&d,SӾopg䴻j yWhb{ԞVu\GKzY1ڿTI[+ğ7-r,Sej`do\F-)04P:%[HM+ Z&$+p#Gjd:({ aRbduYeexdxVF253_f3R뺼 X0ITW=nf+Tmxs(.ⶋEXVX>,楥hXFJn#@8t~V} }B[)D>nżCxU/W~d2|>zpMv =CA#h!Vc|iM?E=Yfzxq0wpg8I.'6]gVN>vT 1T8ѽ3{]EX. pf:xG軀gϴ?y!JdT}Ypzwv 6Q,~h4˩۷qs@w_*>l1 k43;[>T'1 7}+P6}#:Ѵ+N?!kmAy/gg[m)-)70⨟ƽx*۫M Q9sn|1t#!<7C{@' $}!ԊS1N5KԈݩ[x: XToR ;qAe99""΁Tlh6@+S\.|+Ѫ`( d9!l},Z?vk2b=`7Cvtu=ΝT^C?jAJI]xx?< R :ZQow2-ȒU3 {\h&~QFt <,O~-h JP(wfO(Y7'&MK&UGF' !RhM/PNȥ^'R+;nIԇgI̮+-S\0R8x%[;#4pRcm˲ 0sP"62z!~>;yyQ 8r1%w].R==9uz$΍P[HKց)+@$FP6hnk)6xKR.yr8?8 aeT^J*WcߴlaVVMeEijF}!P= d':lo^7~v,E^-\{QA#j [8 KѲ-cd2Bںš^3̆V^8WK܁qA"8 9$qt+Ȩ\2pc`Iu(ph$Z(A:iD"ndALFf;/Z H.WhgGP!qEhDK6*v[WVZVkt/;F"(4̳P ;p V0UCA 7g=t{=`Ÿ@z⧘D d&g!1y9=˰9y[RȰr8sie! {h!g'Z+I}L^ qC/|.45]l|t)S튘1֤DR~"(|'=λ /;6{ kHnٵdڹ~~G 7wߦ[HMt ):Cgw{I2̭sSYR9| A@c}B++iNѣDI>oR޼*Us4Ԗ&Jmi}&$.`|Ȥ?8 g?':QW:ߗ!/맛6&&Ֆ]1NPg,&vS>?%ٿ?ud h"=KPST+Aݭݘ?Lj ט(_QKR9*iiH~ )~;\3aUOuxEeyVg2OF_&FʏU >N YhnU ×r֭n/wjzM='xwT~PR /ay*5?ڏɭd*R*"N-W0z8A- nQZo%r%; <0@D[m!j} e$!15Mi݅/x,fa ~ )qíwnLHZp]Aq\ӠQ8ٓFl0y.섋;h!EV岎` D8i'ϻ~dT{`MÑŃb}qF9өe9Q.N"~׽Z*, cq" aN:;ۦ(dMLN 0hOXN2DHG|z(*-Dl2%H_`M )Mՙ$Z1ށ9FwQ(vcC@JBk'B؛`,0M"KBr(9wvcU 4*X)Cm~jGIbpsB#hkߐ?4BEӣPPL6ݱ.E2y5N bzMv,FkcL`Za+7+W OI̽b\jW< q B̩fv3ۯ+)b!m\9-D'&.ɒĜa_é{4j l&Ϣxd'!)"4CٕypLrZeCzUqLLC~Y^iW?`ϼw}A65E#b&ceK <YGl3" #+6y4 x]e:4߇2}`R n\:u )Wǽlp-s|LgQHFxV1RKAy٭y`+Q_f7mX¹zd2r>xl#.&kLߨVhKY#$t֌ b(ʛ+(P, }?BۣA7i[dqMnӐìshps8"U7Gɂ^h!\A6d+&hʣHCDZ;\p_&;h54(wJCR{S}y9}dg92މj#G_-gݰʶ-ȍ[kF\4GQ{ZpbN;'KVД"N49ǢքR1,ݨ (:Tr1F@ּه;Wan[TٛIl8VD>"P@yMl ȖY)'1VX|CYځ9 )n-( I?/-adJh y!r,yR0"KȮ< [5.>!L7l v}|%1^Z1C!p6,Uӽ1hsDɯq}ߓEv y|1^xhL`6+2@67FvEps6["kͧY,}c`̗PxƖTȬ~W;4^CV4"TS> Re6=c^΀ѭ~GY`W-3ܧn5@чFdLqĉ4#_i.;(!f2A ^QHg`X@m,!R(a8ўl7@qz@ua^+tw.1Z9h0AmtPOt[y]tݘkɳB-aEE 9 O4=aƛS{e_ޒo4CmiL]om\xބ+%7 'ޛi|tqw7Z v !hxyL,юM\G33C64WA PbaS7)CJI+f=m׵ ($7o95,Țrj>+. 8d-7|JU +)g-MhM5mmDB 歙PaE= 07/?:]S`EAx9$tN&?o޺4O^ "ʏ `|kvWێzsRUmokn[BA91r[UM50@j(ENJMt_u D@g.2!t{mkK#E.T Xg:snt]0xcP s/2kUN5+v`\>2؈XT%مzk+47uiDY;r!|p,TgA۟_2"8~%d^2AoՆEt͝-(RE$r8r①C%~w-_DL1{Wܼz{[8rJq!+B\g<X@ꀦS81ʍ3s9 *ho:-wbV+W<Ӄ.Xo6p[J\[1MGĽ|r&O&p 1boQbZ :xY RWN3L%9լʓ9odَ*sLL%Wm:(i\a0iT.rg[:⫭H<,Q;αO!+V#jq9L4Q_-$y0-mrǹ]+*,$jv_3@-5~AA8[9+ aaf^޻覲&[UH/G9usdܞWg:L6s77q2]Tf8WYD+|yi+{*6MYm %QQ ,=dfulϊRlXC2,ZiM=g(D&Bv{/<'|eyYP.:aCfJs3b1$9=^%GOSڂbXjPnٔqײO(SJ A :ɾf;6t|3I :Y-43 Kb[tC+L3Pb.:ά|'''|&FT[Rp]g'Q DTkk Ʈ?Lm-tfFSm 9Q FLӝQd~T%]oU۫m;Ž46 :~J_7C%H*v.?jG-`9:jRHۼ)OyW21)Y}JH^ST:e45]}~6Cӭ:*ȚUl!9U9wƀs4ۖEimtMeńxiˁ T:y䚘SJp "V2cb'𲒦9|'ڼPHc2+&A/+"gQɁ ]jBn,iԇb!V!I,m(2bW(G9;0gr>=P}-);x/ w#_ D@3V)kdb&Jx+ G?h)z0}>{'/.NV1JꮄF~W]i"ɋɶD3e&n *;Rwo#l%G4@cy[P.߫W{Ke.Q̔_}.;qr# >рpoi# Ƙ2j*p1ps3vcO++[˒v[ QunݵiuQH-y8uY*Ej0'NŞeP:LKF(2tPH"DWVeI,&ȅ;CYs 1C `v?hI|b#c"٠Ўا֯W]ETDhtbȑ_Hȇoa?ֶWҫ4||L9" Qr ZVXƊk%m˴O U~}Rٲ&mtpқ JZʜW4",#3ZRT3)X͢M,d57A=,ua<؃ڕL6gHeݸ%-qtߖDLD3~Fֵk]lX&Vǂ;}f+gPIx8 *4W5J?zN6zWj.m A!Yh_9]ЖA[v8m 9k ތ$jm{t uP&yFp!)DO{:!pBn9u ɳ-^_k8ݒNMg85Pwjjna`syۦ Z:UM%Je~U5dvP&aGE{JNU%;eT<3ا?UFSv'Kϣn0>k6͂KB8Xf5 lxu^u hk%\< K"9߷)P44U6Z\_Pb' eNjɛpV ғFwǒww>y+؈x(:ȷZ!  8J4WhV 2ڪ,[x!wJ۸\2}T;,ګ*6vS4Sq[uVc*TfzTۿYOϒur < xx~+G?Ҝ뫇/)|tVplĢq<lE.[寨pb .9W*&}G=Ԫg:R}E\ Ûrr['a/?4SSBgr BSy_uP3"8*bN4{V,@*![Vqȃ^ rj@I5:ƻ<-aE z(y0o:Œ꾗84dNA"Cx5fgZb-;n6_&޸fZz?]NJg^Vb5UXJ,8 ɓy/+-"QAY+j Ψ'42#U޲w)+Y@s?x,:~k2CTGİ6ԢPz*enQ5{>D;7Vu@hzCu# z,]<%$zFgl_M=`a9Dx5]C(ӫ'D^Wuwijn#s?9T"N\\_ԟ(dGŏw=pvz"N1%u\P~Eie>]>2 x)ـFF6ܒ$>жCEoD `\9늣qGNy*lC9]2A!*8o<`\sͷQ /Vy SDB eE F6L`Gv`-S]|Iq0^Pc2tJHb>Zi7-@hĘ,L veAܿf!ř6sZ LiHC( cn쪌G}~{C:t;O,"fC8>HіΤ7g4 *B5dEpwmOtUʳʄ<|ӦߦӵݻyX^E_>117NAxHҘφ,A CSϖܲ2H'߉-אoiC.KNr3MJ}5HbV-wB+}K&A:]?la5LY]vfCAO+E41#W<alU1ѫ__tSW7i&MoNf@ȧojLCXNn3yas{ 8L;rQɢ,a@|ϮZF5R2u d|'? AK.t:Rpغ]2 7x/Kq[1G&v8\>҆] 1 2_tF)QoQEDkk/4Z#4 jT[wd[~/}RF涌 (JP[ɋqhr[4swA=fx}R[:O$B XFh{U )qŵr-EYw2dm uL2OpϫB~QCOH)c˘nN]θ\s|W[G \GĶǻ>QaV:YM-3d<--H`*s7eERmKpq"R24IiT6m8_sU*p>y$p(>b%މxI2<sFѴ&J1+qYg{;|n*;~" ?κOw#dѢ ႞͘jF.i+cgbN6e#OW>jձ^-C<r@u>Bm7}`?6Ql]u=)]qp%hy4uo祤KOp`efoX!ǥJ!\r-~~9޷ߺ`c"ǃ8Dmc08.QO2{Vٰ ,?ۚƻ 9۵@(e8,F)ߙ(1jGݛ͐;1@]7BkM[(GD,e!3F[ $|ݽ8 }) aҏOy=e&'_w{T8~ v):|@Y UШ5?kϱ)PvX1u1*ĆY]n}vzȎZL;[ oo?fv\Zz^*Pوe;u0gBy{'l|1 K4, [/i iŊNlY[~bgM]F4Ge:jp>#$];Ei>6Ǚ+\L$iY)b絿IJȜԼ )S.2TL1`n"8a.^>xvoeN&Q%B2ӏ q9ds| t4B0{LU3>P!Ygxj*Xq7D(SFB! 4kVav`:[ÿGb,dtD]u;hm۷ƅj<_<{m$ n)I}+&A( !C +%| [%LJ1ٝHh6nj2>NeZENo-@M} #!*H`^;uߩd,bp.ƀCJ`r@մh AɮNOᯌ^cЧp!1x /& hyJy%MkoW}Ω&\I!BԞ>8)^.=0,+85~ a.Pܿ 'N,_b;y55XG'B|BZ}bpݻFg.ؚB2`Dg;UQ|e˭A ܉a.!<U򟯇5 ߷lb=Ec^1A3Aw)g Șc}d'Ұxaыge['u!M7qm\AN5ݲ~/l1)QgUپzv.W@ s0CܟH >B|Als~5 TgNc7DwHP!)jNj^ir#7+ʳeUpu#5QMYVByjdP9c8Y{\M[5ݣeb53y:]B}\5 _]“vEÅO˓S@]/-k' ͳ=MkvX]q9su@NpPϛ΃{!AD [Ƅ>7N`+2F7,ۙ U/}쉆~<)D.P ѷ]CDa 4>ܩ6WI ~Xcq7=7#TF=;}r:L(mfw= 篩|Ծ(ŘNk LWgoQwGeQ>e !McBSk1qA:j%eMqO b?͇`YdP2dKuųbufUCzxsy#ԎlLj6s8Y ÞƘv2vR& hF;ZgA;Ǻ'9S{Glzenj\+[OuOG+fv |loMGd]Kꐥʗ"ke҅-ic"1ՒNaSjYٰFpX+6!"lm%ɔ q=y7!%z:(,0аxBsꆫUm[}5%& >6m=ȧnI[c6 ul|" !dq5gFy7veܑӔgi͖ +k@4I49VeyqR=uUGZM74$kWwKL ߲jTfii`x5x<يVW\&C|G,t~EW=/ ]b~ibxAڻea*}ґ=ձ:vy컪 ZU"OUU?M+nqimlBqġSeNAl|s뜁$zjޏG T0 =grg࿔D:TSHmMlGhJ"P 2@iq2s #%7)nL=R,oo;nILЀBb=i9z%Pg!oEY')f-,XhZȾ4afIBZ|`n,$B6>u}drIS9[Qz;xx V7\SB Hu|B̩؛XI_"^^ŝFMG korxzIQw|o0/]^Bk>$9gf T֋.j^Ffn-wevcDX {w w3f[v"GcFt\=*qkٰYћ)7T5ϲ7D9B 56kXKMB4~tLIefZGh(j N.L[%A$;'P[ F! 2dKth4 U8s"rWtma۠AĽRt_*810K~Csh E P´N h5LL{hwyNn\pGs{X[¸r|OHXfwD;z3Uڵ'W'ɽK)Kw}n䩩h|X<'o,"1$=J0!iPɊ$ώ`Y[zq > \/:ĻU-:V{ZdzK ,ֆi>k"U\./ꧦ_]s# P(j 9@hCo]]\F'R)c\cmEIV%2YKJ eK5}7c5x><_λb>WF?djtpGDCɓ(9ퟵ- d1uC"ɓS>/wk_eO$L2E~jÔOD菻pB<9;22Gr<\&X,݋{:NRbT2Eی7=w,d`1H ۼKcUtx|UύV#FK/0m|_p/av~H١qՒb>U&JCaon!d*]R 98HX"o$r@]6H2fl8ܣ]k H(jepLsJgeK6_GFl~QB\Q/\Y_!; sSdĮqh@ɕ}`u_*?014cUJe ((^iAtsh{gf_N4aeanlȇe{ڟ k< Q)",?BxeM$$s]Tr+v"GQfȏg>)mLzo`zu"O=mb"RbR5+& w.B跰PDDB9^GѨZXe}PCſYq= ꒩4C#o5UH%uPTЦi+*8FPGUٴA09Ї Ww)*mM"P*D!I}H0 ( & I V`rXp߆- ;Egᱵ)Q} WFn9(Egܮ5K#eCU(-[F7ON) eBU.0e#q[IzڹDX/XtI}ߩLoMP1z#«DkeO\=E2 H:ˋ:Q%x$bo§ m1F5D`ym|K__m@UTbY*ʬf笓tKؠ;̓^)v6qT3?bbw.W WRˆ(iOT;ͺ'4W$Psp3hڶ)5YG-kzSk~!<O|\q$zt 'y{]W+?D?A(oJ\ "F /@M*޻8bM#0nCyk e!Y"& BY~""{U4'}ͼV2^?7F{rYڅgH9 3(V#=.XQ#=iQ[81haq1WyLl O~"ݚ[BGx;zת11.U(“:xL_ ~0mdh=\lctkfu_T~:H ' Y1-mMlL0o.nEΪr#,n(\Z*Nj- bwoбmoYbpQ)iĠeGG\>F. 1 V +J$]%,wz.9alO\c1?w{ֿ==LpdMy^]5QIYZbznZt?ؚi9sX1 X-|Kk <z,_ܿ=_`Qv0-{tNѕ|8\  RMzJP|r ʧ\k"j>;SVWಗzEq)3كQ*OŲCV ƼC$rs9gFk5=*V "ôan Ȑ@g\IYqu.d7/Vu,ʉ!+ 8#gv`0j- gQGIa%#|)WfnAB 5Sxg94< Aa (- Dt$ e|*1WjSk).?U0):\83gn;zH9`4;LҰڻ@Ava܎q_wڳ~oID!%Dy=}G"${ɾk\R!I-&Wzi.UZuC#!j-D"j5܀AVʻJ_1 @p$ P4NU=Fx;>cMnw2R~ ,XD:xx!''HLI9ɓ'-[ A`E,->ذ*`DnZZƎSV۵ǒT9$Sam3qG(H Z+ 4mtw?.\"~wi,^EтqsxrXzpC&5.B ĸ$H}Hí"$X -)}5tF!܁G_5ee2H|ӊgcOW8& &9ReVeJ ~__Aod(w7UcUPX fl$lfMHvC ̺ S5Á631fC8&4pS}nXAqbkf!@߇q%k-=S| ^Xt"݃jE-TV$(·Iv?wcq/`]s|( g0Gd&*u{ gIqLէ:`>8PשXKWITc"&v֢^z(HcGDb`S]5?BCTFI{ɂ4FV$No~jš.vIۤb32<ߠ 6aOF_mmJzW6 :=j@6~h:G:+| ,NTؘ&n2" E@>AqiQi|z8 <5eÉ1e]&CK{\t rnrhdnUIf\#sa!vkU89hQ^ܞe1#n~ UM%E"݁n1zWuc~]$)9/\AT=鲴 N =Eb!1-TB}*H~c>*Mw5ڬ76(j1XNٴt`]΍>5DI :Higj%LQ"nJY~{x.i? 8jmaH|h;U<(3{&k #5,/\fo5Ve~#cL^:;H3t.}ŒOT.=]bs_jsWǬcY$^[rf+n+/|ywe׎qHAۀIAv v'㗮#gæ 8ZKVMlD] Ѵ1 0YʌQ M'C80bu,(=)(vPz!ޗ0_=B#κa,~*⫩#0r=>F#J%{qI{^Aч*0\Aup85C1z+oFD&{[RQ#?sPRb,?@Uĸ\.ձFmCh<%V҄o:㧭P+rᥭQDl^IѴ: , Hm$ר$C{65.tgj\!ڥ gqQRF}P-܊5מX6J]|DA-FA/͡5tiJ.+Dn'EdT,-'y{G+C*0߄X;R [S}f?M9ޗztfvV;%p-0"`Q:b]4%WX-u^U܉!D lj}_FPx{E mNZh79E5h-I#;yzpReÆ>x'{~`O)9t{5MEЫVO'eN EJ)t}rJC\ۼ=sJ]Dtߧdq\*:R®ƞ:4щ@ έv u94j90fplxN ]RXK1*Xvf(P !USi'%|O˥_t5C<ȼWZqLBob9u0SūFERe脘(<6 凘]LuZ1r-i#، !M+^9R1 Ad+] 2918kr9_ Gcm \'M& VE aq@t'OںX{?zx|,j/sJR 5zEW_AY?l׽/IQDHQ} ~f^O[+]>|eqe2]C$ ,aK.×0؎=pnXáFYnv*-ď7!Yx!44m/͟d0rIHO,#ǩ6 7dd;Wݙc u6(q5>;U=^`ݠ&!-Az2A^gX`,U Cx*#a_i=C4iن`/XMb,ҩmc4s=b[β0߼?JDrꃭy`]<NO=[CV2sU0 BXloIndG6DNZ>`hn*VbBmӴWGz x D+I|C&)XG={7ܾv)*-0yG9I(ՕnWM_6TE1"|d e]5LhBp39{ JoH OrUWRM]XNbiVy7ZޥAĬ+YojztPʊ;q?^^y8v@Oi29/ sitq Yk"=-)(҉od2[ܭxP?Sk.o)#)eE&t`MYhRV{H.R|sW-K8O:cKԺ;ƞP [8llzҷM,)H2H$zkw+,8=hLFq ni)(^xb McmFC7A~: X7G%19HKñVGTIR5S*R&_tC4#99'jG`XP凼fi)͹ WEs@r9z)D^n{[vVtSBP(1'.-X? r.IъFqyD6TnĝL7ڨ)j9AIh =V0?33P$aXY}M-*WhpDF!qs%DD6H3Ov׳Fv҃i`Cxgf.o:Lt_v4uQY\sTb  D\i0ݫiRpqܹiU[{?D2=p4Nh{*r :-^&=#;m@sٙ<6%l;hrnzq7`^1~gh' ÿV~(뎹.#҃GЊ?k3_'Q 4C=e#)?Hǁ7TE*., {5nA "~& 2˱K)0ƕ~|̇$09lŽ !<WK0膾U M(C{L5p3M0 ֏+ j6Zsr5UN>5ɧXb|!S#R=&` Eo12{=74I!'.7&Ѡ)"Oj6gnEM R Kdkk0]a"%o%o,$~l^@.fJ/~aǓs@_Ht*yH5`VWGƱɫ߉oG'xߥ L^4ѹ)}gUWJ*b&Iۀv9_^㗼ݔ;'KƐp[.^ C!T(Hiܓ<FW?TcWD Ra!1zfb-vC#{NYvt^ieeIBkC m2ǜ<0(FKZ!ʔ׸!a6pugUR8bjm4b%(R)fGF Aq(0dEAIAlL׌+b`R/I`A jYVկ24OQ:rm]mQ FoxJVg,eIē)$Ӓ;yHڜ@.%nSf@nn;Qᣝ7\w`*LD/2m]9B$MbT5^|ܝ*sb,^S&#PbWKYAR7o>uYW4h2Jgv @OMbheLtJOKW؛>IBO8pW9-dtJGf'ic_SXTV;'ܢ;4R7줴Y9u/=U?Z`ϥu yk߹Elm[!nNBN]iOznu$Z`8E<чն>F H7*AR ـ<9yELŸS~ 3-֡ˌ6}ɧ7ϳP0TCהsY }&H:;[L}=BRK1P4A=VGa~v>'NfVKkxX|u)SI=vs=MOD'oM0mT6~+2|om&KƶHM;4{|{3E"~ xHgAnlr-voh O!\$KL)5h((;7ɧ)& ً_;,MR{~)ܵvdCT3u*M.GA%p&BFk]MeKrZ-]V { (׾${n(&mP0vWe5+քo'H+kIŃ X{cV{C~OG~0݃]o>e> )W Zյɲ,5*"77y7La FsG~i*.뺧.mSdU6&pNם8Fdk]'tMTknL(QZ9ԉ2sMEJMCgĻEn#٣<0 w +W̹]szOӒ?9!џdw^ga '(k V@ސ#b X[f|F8K34$Q5 е:sꌬ (a$sNڇYo20i@&gk(6=qՈQK,4|dĨ[M0N};ik 4ON5/O X t|O|Zz'&ܺfY]1RGV<=yޚ4"jj;",ݯ`ؘPhљ!}_|F/bTpa 5nxʺpIem~ɬ(=cReبeSB,}X{mцI|CM}}.%}f{EB#\c]Nv+ t%BeJM:f@eЊً*_jtB7VւXP4R6's$"?? L,|e/pvLv,g-Nn_y]X?V4#cwTOܩᇶ>y=aܚp*x\ʔ.ؿeK:͌З:9^=U=m/0X$8,v"N|[vKkJP'8!ֶ ~* Nl<0ZʞdA2뼝@Twg).àq-baN/kEGt2g܍Y˟ɻ#,rŨ&HO!WUt8aMq(Hx6]%QOZ5j3W|C(BZA_#>-N'_djUKGo!DcdV4,`' X)8 6 Qg$Tehz)eV@]W\S۪QG'8§nrXls £>R }ͺfzi#,'yqa`v+~>Ӫǵ]F,Ę&}2QZ3i[|Yz(SdFߏ]=_#V)!4ln;07\ڴC4U< ߦSl%-lj$o/]eO zRVAgB}i}Hk^O d. dUw['4ІLBĒk{ O`3û{ _2FLxG<=Wt ~a$iwdV~w LvKzPK=QV KUWZ?x ѪPe{77:/gcHܷW"G~M j%6  S@Xg%Κnid+'̛?PFj*Ps;i?f<"^شŵoveó[{Xr5A#G|`6,tvjo,|nF⸮L"1_N]n&䴠iw5ٲC! ?ze*4Qn3f%Câ :&LvxK\ |ecvlc䷱YQ#Zg[Hե߿|ȁvh$f%£;ݠ'/xw$f.'b+r=nf+4Mꄦ\d Bvt|V-y!e:1C*@3GU9>}Ӳ8J.Aa zAvڏvHܻqӝcDdGjYlѽ< D[ =,Fo= -/ٓʋP&%_"i!l[- 36wġ(i&XT歋E kOF{\=>(FFJ52@F"\cd&=" Z쎾#?XNrv[ 6i ':jm3GdJ_]IpQri3C#Cghٻ9}ˌQv}0N9pj@/ry-wW2sM$mI +P,e~£L1doq!ANm?\3/~@;Vʸ )̑dPQ%aY½mkU<F!8P`Au Af㘻[Tҷ+~2R?CUpqf[Z^a cVF246( E86jOQ)NOҖ}V(A0s-v^|Q*O?Gr~t{5,Ƕ-qrаg7A"uÅHwYa}6}ląA57ԞaGQb> sD$V1IlҭKV{OWecZ]v{HX[Q_2,ϲD[6 iAҢl7)qCHa"3`P`F]vT)<= ȖWf.7!39 Q9y*Q~tuUdYwb0xZg뢋~|I]%x,S :̫>H7xI&F=OYiXkφF%^.8U\ԇ6yiwfmI>iM-*5&` %Y~41B-EWGztjuI9 U4];ƖR~R[uN RxK_g2yKFKVۉԾ:<'hY9y} *;4YݫHx]Gd `O?swZNKmԹL>?7űљm=}3vMg082ō q\Pm.[20D|U:[J?(' v Kbfїta.ݝOqֲeA3h[;9d:p݋_Zu$G}NQ44R7\'O:BD7Jp22fU h' : h c"YYSݸa/ǭ E~p4at~KjդSJ^z_<յSU|FXy9HdJT|-E~hv'Ͱ0sHC@[R7 "2jo)z˄=^S7B(v.5ɍk2>GZNX|)Lg {HYu69ۃ`G@*Ƀ𔓎앭¬@@H+d*xG^0U䓬ˠN8`APU# #.vB=cq=XPHyZg7 +Gf;؛oθ\O,dT%Gՙ"]$AZ|ӷn/,4]P=/#,Z54@i%+(Iᥘ¤( LSp~xǸ\ҸR7c2W#fi}w@ o&2Vk xpՠY"?5=PQ|NI2F#3H۴j5iqifAUK\#tOf5TcW,ᥗye f.Q֘rh915=<@PMЦpz#id<0.vMk|VW~D!z$ڄ+ZGP1J+4+,02SC}qc=䡤ةN"]zuaxJ.= EMdG~x=9e^jguɎ2qIĻ>$/8 :,CS6iYvPsŔi|@XWpU"$E5$IWY1K Z*5\`=Jq`2pMq>4x 4WmpL.\{ԩ]:,m<q(pG!| ؇%WT\U1nv}U(cX-L3.OusS,H!yx] %²y@nd+]8 9!~0GcIPA ń F'zdl?Z٘e\)f&Y7%4S{B@>/8c9㽁 s( s;c9%&=[&_8=Ǐ bF$ ]%F"7KKԿO{=XXX(%'OJm54-21x\N~L ^!Q_I^,? y6ԽQM Mdk >D`-O~Rm1%rO9 }>)֠^*mǛJ$aUN05=Q-9?\Ɇ]O4*b) R{$$ݒoR ]W3wa&$DME~u!!CASʁ^QրW=рgV~5Z \UȷT0C @K68G[s`{ׯ10VvzpHӜ554"&_S[|ݭՈPn@ ;=Hy&"@X_͆bُC՜g_^܈2 "Io"95fFâAk6KÌ\f"L|eMUH$K}=^g!#"c4 DҦP 픖ͮQLSIȖa񝶪LMA/vP#PU^wtBs(vG]b^U\sBpA\V-. ڹ olr)VXU1g1tP}mW}G FBkH !rsJJ-b#L4&dX AE,-ߒkOeYqЦ0;<+]+ Xi Jy!tzwT[o&wEF M*I$@:6oX# Wrhg6OqڠvVks{>)4pGvUM}pccC~Ep&Hrl⷗0ڈ>p@iQ/n*t\P7nr~ѬyuԳeI:?y| L\) eUQ{}7YS%T_%mlxeR^Z=|W ˋmr,mջr"7.&ن {$'sµlWbŀ) NՆ}$Ξm[`5ɀ"I#+)@sSM9#:ɕ辂;!#k0lm) rSY5")a9:Ձf:Åy$udQu+X#Ύ,CӟrkW /4H > e76c+6Sy0ق$,u9]'i|Y nDG |ŅD2eray*8j">%X6ӺŒeRY\Q1rިGwӷfbL#Oq# Cðe!{L @d / 1 TiH8V%8C5Yw>IO@?<*,H^;m(*W9Dq-'@}_t1\9F;F9wE7F!!-?*lȣȆqRC܋fܛDvr &x71ZJeRAX !)?[SL!fҸQZG1 Tud[ 2.+gf~ MAD>ER1wdŌ<$21#,nKnc4O=]6 EB`TCC˳aQ3i <'szbZciA v *> .؀6Ez=o7'@*?tn3KLߋ29,IS6)"{{|L{bJ/$ӓ홚=R+-"oy=̗:UFiA*8^^ۅmgozӤ\س6.{]cݲffKspt ~sܚtgurZp,^pWMLlO &lQ}_%rVa,eTTcNbF?\C([ٲ\vC Ǩ o=ǝ%>9r!Va4Cl $^qcڵu-C2#b!q4cȡ4*8r9uprl q? J=K/nƌhF2} SgIVz=) $+Ya 3}VݖCxF`L 9DᚆR9&$ȗ#ZwF5їNNUEfmh#)ƕ{w2mZJ?$ 6ZWp:+{.HA~!Z+aT֐Ŕ{oϤĐ"Jkgg$ z!!/yu`ZG&~q>;Мq;c% 2~0b \D9irTX ̞LVR+@8aCMG}8U_)bT8rqyq)>`vޘՖ2=_V*-rh89TԹ tT!.₩qW?Z,8x)A?S+ʬ$v=Z̲<$r  o@  xK)-tޛ[z[\E7 \)'01wb^W-LSgx>C@v t.РRh}LݖtmhB3\s-rԐpqZ^ߨ`11•XΟqSI33'"FQ Gw%r?[9 gc̿ 'J0 $N!̷Nd-!Cn?v:b&#XzI?lxKvy1H8kr\ǫ#V0oJ;J;a$i:Pk` Pœ$h2eY|Ҍmta=q]tC_32raX?G5zKbw7 w6W$pdV5-Ć!EŪbCG3MJKvITB$Iv0m|Q.*mnhܷϨiZ3n5lfeDh3&NS>o5W%4G+t337dG/JWpwnjT4Gefq~(:XBA[ †Em ۲)p/jC_'cyA$DXAO?ߚQ%:C1DnQϣV@?&AI\߯}8 =DCW٘~.G yTG0t=\ңNqTh^CX ~2R1b9QJYF%\?G:R}lT#̔#2eȅ]m `hX;DSd!ue(.:a^7y` 5VWg/}wR@ڧDci Yup1\!XSչ -3)R ͻ BDpL[RJFt z2‰N:Ƶ z6h 6Fؼ.zHܬ"Ⱥ\˾T1WefUtdG@{n_aS,ê@RbЕSPc^etC끞l5aZv-HH=`ש4=~َ.W jQKh{u r)Mr'"֎Gu:XJ(|l8+ۗe]hRIƷϘS p5-6egs>M}΋-9 d9Vv:~^=<6qzS@=u*wdI%EA1W#͡pĽ4ؗD\'ǔ=H)=nsC]JC#f-lx\q'92,zX4ʦӨèΗPjإc&Fz3uؗ+KUD^w t)4|Rfp_e_KgN7r R86bɬ8>n|pՒP`)E}\U~AF"'"g byGx1h%:8AKblJj՝F!/v!+𹽢^لc,mSå@D96s>bwqQwD_8>8G2%+g:h0<1L6]h#|N$2g *W[nͭ|U>Լ+qՓ=󀧰E;f52I זz wlh 3uwoJ}R|/sCjmF Xr-+kZY$%%'`,VEpQFh e06A"dk1OP(2si 9 , S6 oΔSO\yΖ: % "$TXW<̮>m?ma{B$Qn 8E$VEJgytl,71 F5WbtAmE3(_m}Pp@t,v[ܝOgFRHԲB,CqbX>tQѺzۂݽ_ \1NƼ凨Rw95KҠtfsu{HH_bgjiiX0UpK?`)5.SV\r^R1fyd?l 鰔k!Iƭ PZ4aEVD7| `Ӑ<QrҪXߍ"Rc,:>E{<'dLԤɠ;ȱ0a Y'LT8c|;Yw7]Ek1yŗj{LC[*wt)vAIAlLS2'0Xԩ.1QEg HG1'O׿HJ[k$u+SNml?@LDL/}ȢKT0^=ug@W9չlGW+wt-%?S's4z3DK*y XkM5wv2b7VʩOQ2)@EsG~kER'Fd~67{_۳^4y9]tC2^t'0S`}eso3Y$'R~U wIq bi *c9>p6C+/+C.υڗQs}߳+8 uҔ0x@=fqwO st3'UCR05Wo[C?ȧ7IjcM\ Q)& 'ۣ S!U^,UõB o3Ko[i*^S0W-__McR}IY)_K ImcW29E!d)RPyȫ/FUg꒶ $J.r| gR^䨞bKP +-,~LRg_%SL0r1_ΙN:>X)W.ֿcZ?&E$@ocy—Żu,HMgNm۬AtS"]*~s<+H懑cx}DݠwkI0ұУLQ >G;BEj1-xyRQ!g .6èJY9eme>c2JZ3(b>5aBssʳB>X d{1*`3;Yck#ѿ[Ѡ%"-L1' g 뛎2u]zWɀ^n$| lq҅/EpV5mCGJ[-n̜zT Dڱ4=yuga¾#g&p3?&p_YOfˏ2-띔TqzSMF@Ȃi';)K@)PZZJNyR2aj7OfБg}s{vAɞ柵'̂Vrݪe(n?E{BQq0irԱA9Z}hTVFgʏSFƟ+<`rDFT!,d>8|^fiBwqǑ:9kC?&ys4ϒL~y1ݪ~Q^F;}G3(\7V.A!#QRbd݄ hJm@"-b5]%V~4**ќ蜺 Wνm6ŷ"e}E?b%e"RO}?pLZ K6-.X j 'մSQxYK&ޑ*!ZQ=W aWIcռV(FzheÁ8->)|-,e3c/@{WaE?%7kyo$_>׊*{<8rcHzPZ 1Y} >JlDr\<7_zO R9l7] FB޳Ag]$|suD^nelUV?/=cAӅz k!DKSF%6zV[DRp{~L~cZpRJ2,U$|CL'YLQ*yt(l\Fmy<r;0> o1?'ԞCw?pZ(AXvW/+|wp~.|_A؂q(lZPurGsr~PSز㫖d?M@(ep4/+ʈ1W\VlL7PRg!MKmڲȧ7\| \u% 5"Lۀڗj&y%jJ s3T=[\NnZ>j_+O@êe~2& d9a `+ $ g=s[?&O/EP[р G;V=pr,B; ϛC>=4nfv]iv76 ׽YG#x =%z 1Ͼ|jaޟ;(GR'?qԇo֨M--RdPtP.1e@!3]qѤp̴ڪJW4iy%~ʻ'(ښS)}hUAza4|׷6 P5}e+ֿop,ޏQlxl+Fv@jc~C3?Qcw)>4Y0Bm=ΎyI̞%VRuՅ*=W["^3D007jx;%^䋱^`R䧬q7<7[ۿ8tK{D; Ysi~d`}2h2Qx$CB`L<ӷ׶, eb %" G]n*P9Aea\bav2[듙Cmy .R9P.,Tk{MQ\=%6]3 ʧH`!J;=VA>؝cddt;)lm@%#\]%Ti1|j hJFk4LflfFHYJt 5\Ja<0dʃKaa\oK+ɉ*}ۛgipRϗ$Ȓ8w¼qࡊ56Óa^)73;+ 5,Its͗X^$'ppP\&* !=і Ar6LRE-;Z=}UB%B-RV3"ٖvz&p|B ^תMYhYWmTVڗlGi +DExd,È,F~N2>Lhٌ'[Sb1ثlc<[l5C` 2~d]} zUdՂ%K~MRS=?0k@C5G .j,ev G"t '",ʰoJsPP"[nѫ]Q"&W ^s*块QxmO~}` PIJ"Y@Ij'3ه uZ`>RS|ZAeCw#{RV=ka:L}BԽ~z vwȀi>TA<>KcJզ'R񲿬Cf]=Ip(<\cRBp?aF}H_݌8&La_,ynl̓\ջn*eI/Wr?Jl\hc2mG i@lU)βDNR1O@|ۚ?]F!%ߥqW$}hbI>ȄƑ j,aW"y3Rdl."*gk ?G2rO; Uli*0A3=6vrFcPŗ*S3x)WӡLkgrvUG}J_tf8&=Frj'KznB_ lb+&[ ۄ˱Mbh {C#0BZOd}?ï> wSQW YX#FHWN5io(qrZIVu"٫D [^5K{ ~9ޓLJ٣ qp@tkR_n>Oq0pZ-~ PB \N5&ZFU ֍1@-(ͬ/#qecxeMf}vPa [U8+dm&?v,VX0L'{pGY'Z'ܾH^m^?pNsѸV CD6TLhBժ۵8-[AJlS/H/Jkº} p_UPTQ `j6-7+vq3uy%*Poc16ȱE.t g˴#\u;d|.X?-ۣ`n傝{~2ԝWNlRgl|w/0tVw72pY`Z,f'P.JhS$GCV*1$fSGE?d{@h3[WT1ySŸI m?ҿ†xr[kλ0H<'&@i{@Y R$] 0_-LPKyY4#-5a|j/8 qaӺγdfxǵɓB W3*Jnu"uli_k댅̨pkU)K 82Y"9-ca&늛ˠfE {?M.FH&L&SO51~aZx? J=k^|T.WPT|qj1Q/e{8+Q|/ řS@m9:xE[`Kh4kˆ ǴW*5ugpd<&hNfTwi[9;/*>BZ=+]]̚$U0 NHROHr\$"$B+2D/ AE,1M"WA'9OcI${7H$VlQ Nd88/-M\ qa_F]bUW\Oe<$K(yȉL7qyNf/̞:E1f*o:HSJלA4ՉHPX-jG]v'Sȳ| #gGk̷BXgl@/26QC[ywQ FqK@%(_&݄1t\uiG/^RyrG8ZFciST) &M d-&[wwMzh s n ? s!ޞ%Da#3C?j~qiɚݙ-Ni8Xr&𪇸 'oɐ Gq5{+EDyM^K-:Im' P/ߓY #[o%@&̉>BC͉[x#([B;To/LzY&"X$I-hn"EYb i8 )ԞR6ISaEbU\&3h2,7> wNU_ZGUO0\E[1L/GӬz.+4'|"=VP% >$<"$5:B%P R76CcQʌڿX}TE3$12V!ޭ^Q2  [;9r 4ZhXywi!{oYhղfhޢhע+Itӫ́aI k?jZf$c{M2ޗ̵ʁ>~v u~I)L)ŋK}q:@T^OFL۸2]M_x!TB ]>+ ;q׋@չjn Lp5\02TwK ~HcDtb=P\) ]yִ=q )Z*0 tq1?շEf5PJ^rUFS|{4cK/V]+ ucE?Xi.A1'ݛ!avM4p]8 ئ9sγja=,ˋk2u+\qcZix^FAα ; % %-Ǎj^5%+^'d$+˂&Ӆf%CRHĔpk9p3B0px26}=ä{z$]uiwv@y9%]OLKxRK@Jsd 4{fc(S.jÉ*B#<.{׊sK:/"(5/?9LO]QL$w MbȈ:7Iv:.FhiL#3|"{鈵~!QZJ/,#G3}s2n:װj3@c{![>ǧ}O$3rD_HdV'LXnQ_FXq"BG娨Ib8tX/.j?ᦿݘ SN󧅛 ߮sI 0zKB-A.ҭUM(ìi[\P*I,z_B K߻>b94~ PâR ؍pپnUm0I*QZ~]3w`MWܼGz3 SgjcK/8ɖ9@Ě=ˬ]n6n ߩ׬"uڸش>^h ;@8.ێ ,5:,v E)z6kT'3zņPͪpǖ3&J9x]qWƼ\EYQs{oPF 6S]s&dԪoHlMk|gSæƹGpn7(s'w " )1NQA"6mr>aOkzG) yՕK[͋ 2Vģ^[i.(`Cx@5ǭom"ه[EXJ:M9uq㷖EW`,&vhO2w1Lj:R] p,>"VI%r|P}H#2-@FjC_'\9_t߻`(JHxp &j13" 9YiAhw>m/#ׂɽIC>G ٿp^Y6|BJ*P0m,0?N3€Ѝ 7bMhIhxD6|Eмt̾a- CdS-q[<6q{&+W gWĈ?,mbOm+* ou``e^+pY+ LF(eu0QK6PIlH}HQVUM&e͹:gկ-s߷d%wdh|'/GN- rM׸HO7mCˠ ʱ{G:Q%+1'(UI`m}8lOʽ) $RI"}'y >;T5 t Q&EڔWZJ$qUJY{lAF֒Aо&1Bҭ$} q+bii\Y^K+AdXF̈́<ߟh?s Q 0)T SI %r3rcΙs2l 9^?|2F< $M6&ZTH^u 2,4]1JueTHzA'Ѫ7#ГTɐ"xD2o牖+{n"ږ*nbv̗k [%x0uV.o{IT}_|3agO@kwO?yԬv8K*.@}Ȉqm T=yޒ9'y&"$5p«w$iJ}3M%aV%$d|fg23D͛JSƂ*DF|\/tu fV۬}`"ցܟ ]!4KEJsX~٭/*'d8Nگ 吳;aOJbz"9 0L- FO[IܵT}]^B*dZ/ta褗aԄ HSs8imsY"ͦNh bSeehKǙH@*ޫr(욳K(ğW93" Kn¼lkNp vhCOe .>2A KB[!?$S/:Z"Mdb RVV\*?jAywJ#HB67 s%dV_%19ؽOjZ@+aQW&y.Tëf LjVrPx/A%YPè>I4)0dGo\A؋:0jq/Aᅖ&?) ZRɓ 0FXǑ#\$M@FkIf+D-%@}aF. L/ \eUcx-:THNqm¦ff;iH-GҺKWϸD$D@o)X4z%_{L3EѤGnR m: 7 U6Wp ;^MNz@"HKgb׻SUQ|hgĸ^)m}<>{"z7 g2r,s+b]ptq2b1:|4;¤DlNaL KR>qQs%>x/:N FgNJ?vB.^3W~@%[X7Df}Dh3`iڬ~t€B o4`{ +`Hoj O{jBB> c bd+ZQyɔE.lGi#![GʠG'Gwrn&11iuw SºmcVF7ShǃR '+M6l`H@LxWwSni݄Ȼ8z}a9 8]+|[0舑3[Aj01;wY|ٜR 3EOV8 L=>?8W3ԊSxiJF~yBh ..Cg!:iR(F- өeBN!w+zcߙ y҉@)iaTӦ3ŸM*bʿ .Mwd1s`dk? ;d6.&*w#P(QWB"}|x)\׃JsG3؁:# l0bq9[ n=4M1aRPB5hN-2 rѤ9i_$OĻRb?S"CvX؋DfCB*hWdm9. \-l5 <]A1a=`_(?}:Ip AFO'߀y/Q 4>Dעcu%%A03E0A3fj66]:ѮnfTӌQjMi+v-ɺ1kckl|wvT; vQ:)v&uǒ*ź1~h/8rݒ9hca"w¸!JKtF]'eN3A` xtt]QT{`Sa+W kf.[Eo(jvM: S1ʹMB;ވMxm vOA߫WȾk[ (XS) 6c Uuov!\˔g`k;$j8(vAPx)$UNgTL!–| j3АZQilj$9EXnrW(Q.^W>4%M:JܑT;$g:VVyƒaN-?r]*l\-OA6ڃwK1偏%EטMCOx$p3%2;],s̱][ayC tm.Op.cҐX-̇qsd`*ym{Piʌ@![Iɡ2tm)tpSXhƋCP߁AtF%@/E\h~CI {L.p4l}Tw5`'ܬQ =5$ʩJm-,k:T_OÁ ]<8Y;m#d!0QLG0R06Qt \CIϞClOw\D^tp *,Bb U#`ԃ(SF9¦+!3oc߳37=K0K~F^!ѦwE;w}HܾY^1'ud~],?4pH^Cp-CDk+_$pu/1͙e+3SdOPBu"O`c q7P"W3خA[x'Siڊ3JvމV8ղH qC5F\OoY UT_C;6h "ߩ_EI& qΝL-QӦF+̟ Km!X4eF,EM{d}*ՏBuظk.b Lj@.)=)P`aSĺB~d#@ܛ^iMae|p%9ߒֺBMU ^:D4gs91uB h- Eax˿s[շ,wD*%?2ZM;v);߬M\i32^T;,)(ѪeAČ6v9ڵtcH6=ɫD߈,%gm}fSY-"Y欀xo8;IB d!rHW@)aq_N1&R3@sL'!Z3Nr7(^QY=^:t+pp#A+I Re0!O !< ?gv(f2ȓQ.$W^AG]nL̈́-y7`619bVjqp!l0mD7E*1yGwAvk*lKQHm9D`n ֓)?gSMxq3e8X{ #Z r8 ,xTdd! GR74'ю醧aN$=Ġb ]ݍ% _=uKàqyh[ Ǐ:FHr{iO)ĺ U!=h%xS, ~KSoz2&b`8WN>rcȋ3ݽp] Ԟcl"jٲQؾFo"I㻶68):qVi?z5ixᩯ 6Y3ڊ S9I3q10!жl@-`kiN+;Wdӥ<ᗢQ\}; pQɂ}8O{y{ѥrk E e߸04=Ym -EP:oDg`hx~Y徭 ]ӱSE|?..Nxi;XrXwB4Y;u.a_\#]wT&6$ˮ,*ԱfQ+/F/~J[xYCVO[Y(Y\W!=,!?$Wp )Oc~2$9% Ah-kFh'2{@{p;tLBhPO{ =*j[{|':JUe(5S1=&S-nd>%u̫щQ`)gf8E Sm>tY.pH Ll[Zf]9T9Hi-,HLD kŜ^T u-KgDĈ,3a}%{8WV 2HkOq?z(@Gӭ *ن T`렝㹽-Q`vH.T0tcؖ)\n qI'K^?F (**sn3ځ+ sX1!qJ o.1phPd:Rd2ћIQu o5jYe@8)؞?{b5FYI,4#]-\bΩXvk"9G$qoCo Úl6'c&~=YG< O9R/_j.*l!6BN0ps̓xGnY5S F"0GW-.u24NSa]-oiKF$ | )(FfE+fyQW>E7x2Ai"#^n^2b`#ji1 *4KдOeu[Fk1P@4?Tٵ{4ݭ X>MC4ɌEeLX~J=,^R+|h3 B=΍rh-(Ac١ªJbBtQ# mWߍ,zaFl._a|G"Rsig,; `ť#pZ41X)szd x.+0,چ K̦I^&(1nSβ掇rh ZcGCeFsYnvl oa Z5Q®Ϫ EC]Xzy_9*Cw0A톡7SIiNR;}dNAn5u;0O}AN0=vߒXBs@kSq*y;H:$qO΅v1.}H #?N<j'Id ¦a8<~.=z Vw@OuaClh1l$\xJh0`{H JlZvaa4l*M_6wJ6C?MF@f(1B7Zd}]dGg %U~B_GBgʕ*^S\XA|M, >AcÊ zlLG;bb2bxlzb434m۠ic|&݂Iqe eH̯RȻv^UAJo0 vg)Lm+s|@gRvʺFxb;j =>7n71eSgLX^c=UzV,ltbz1Y?~((|9קYg Eq\~R kTW D1ɥ7Dsڻ*Kg^{(C7 󍤢Z_mlVDҠ@oy&^*Jw=v={:mCA1nf.HMĤ ^pȂ2Gk9NXs3j]O+=jw"3'eD_jغE&GT,؍{0$EK5`ۯJ#gȋEz#^\aR}(OсvU[4/VŠi˜9`qodgpQv?#'\I|ĆdXVCTHCP%T'~ښ@!j+mBcjղroo^;&l|tJ`)PcVp9cE{NnOxw;iiY %]rNy2?庵3Hx2 !/qoSH4GDr)bb4RncǮ^׷\ 1/XhSRlcSF5(El6fq'9EnߝO d,B;(Y}LJŊLI _B=|z׳euhr  5?bh.%lWgS z˰9=8 %`A $U]i9e`~gd,0yދ_PnZc!dz Y">4QQD 2:Nd/qg9C!೉Gq ݃?< QV=\ 1zw j{žHr(Jm?9hG(Q߸ZFLf60u8`4Q֠P݈Fxv.4Zkﶖh] 㸆g[Rm[%yQ^NB:>Wz;35EWa{#fM}ߥ.zLWga߳3j;V{}aү MMU""M@9N})쳰 BSˑ)FŽrSEp٩qb%y?XY33 o@+B\O赈3,N d!6T-([\SV18r܋yim}}#V ?&GUiexIP:lk4LI,z  7Vχ%+bIv&B iXO8,r$LCU8X}h2 mש}j ߒËNDwȺURfA1S, ̬S튓m1DQz Jfw]aVQ75VZElb@g@<0K&WWh#P]#T@ "B*0 ټGi12V/1yۅ~Yh5Q\|W.6| ʪ 0t0w-L-7V`3i"(Ӽ.xD Xm2a؅du$eYmTPip2 ƍѳFv\,R`o)K;S2й @O=iuK۾3d fBL} _\oO|J\5[<׏3CN6@VOEݰBoq4KW,,MRV޴<hRSQB]#vv}R Y?(G%&K&a\>vWu^d8M#㛌אOeB+]QB9 KBxƜ}|vs<ͬ]kY5)-հd.)q]t!웧7nB,!^QNs3Ebـ@3(CpU5EAALX +Bˋ=G{ OK3NQ/=_6g;F*oZJ)B>!7k%F1.vZ*P-$S\P jxtt.4!h KWƕ 0ĄX$x`""T&ز| 7mD;2@+kC>5//c$If0߅<Xޢ~܋}+, @eFA$e!~-PD;ZC&x[;JX㑧,0*AJ <5QX0d;`(j d:|a~YZ$y7/EL/nhɖʱ8 ԫՒ,j[|pH(vlP{0xQ!`/Z嬉dx6*&3DM,Pxu.vJÄ)ϢW&L U+D1Cv |ryYgY|̪  @L;`=i2OUkWۄ/Ҝ z,o4/cnH5.DP&5]է sՉHYr^p=NxW#I6TĄ)eT+#'^H՜p|!IMf:ͣRm}ez}8 vޓ/fXXӑQ48lzh  'n2 Il/{Qݞ,($tz&G#{T7U>RD̀ɜшmCL5k/!2+\chC:8s!Q`rfx(㎯%ʣu~hVpm,1~L"R{bz >dj'FL͏9,.?u3a.YS1PapD*C,TKkbH0 (Do&}3 Tqdg63;`,vܻhSjgۦq5Oa/;-,FᓼyA-.SE.]\(mflΞ1ql0:hؕ]W 0bb.Nm']G Aݝ% a\d[>Rjca{xU=+şv$)pݧ 5F͍k_(P_UP"r%AywN.aW I!G-CChcmfًȢ˟ y\r fv4OdandY~Үa pZspZZK&Q0"[se _:8[w}˸?K]KTQ˗ Fz²(O!0ȧPS"˻b^&l쳇磉I+@gj9k[!4@Mo1i)-G(*D 1w+Pޑ4 ǐ"R 9 zgYC L/;ztHcXNz xpLƴ\:ai.Sɷ,ؼ=ϲR,Dѽįl;]iWtVv菼 ׈3|=Vs &۹6@bSmV̆z o&H9d`wQ(F|[}%c we۹ ze4#9bBI9<\֌$\(M| %U.$O)~wW̗J%V7Ӯ@a"z>H OLAE[+(&F2'A=Q18:j,J=+d~qvFdyHeaNUq\ȏUDx"Zu.)p(_njxUnjZ8}+yi^. fBJq2 G|&;Eh;P-#E\w~DySG0 GJPtP^uO.TvyRYb:Gu$MA}1֖sL~ ZW]aAQRdȔ^$ *^I׫<RyL -vSH;ӝMGV4DN8Ř`&4jqgPzUY7:YqA`wc )e:DO'!oR[ٺF,if1Z7iQd7XP>r/Ro@UG/_\( B=:) Y4 ٱݠ6QCf+B'lد\ a|"O3/nJAp2ipo+;/+-B )xٽhǛvǜbt ';%1xzJThb {+Xc#b6?W{ NTCNܻ-|^;[~`Q[9޸]b"[di〔n@E !tlѺK![ȉ b.ƿדKi7sA3ћ$$ ڀV-P`ԾolW[VGIkg݋x+|[CcI_6-Eh%[ gwi|P9^ߠjNb&9 +`GnP|{%9:XՎeF[JCe8zȓuh^sf,y n<Owi+S)}o6dhu x>b};&?mi>x"w'5T jKz$ԟP/X5u{B!Df'kHN{'Py AE WЊֽqP!Wa`7^v\f zϨJfW16-s| m7W?R|j>JE~ݸ6U-kr%9L ^iIl.q6{?uuD'}1~[iIˡi&haƋae_,$WFMNZ$A"V"Y)} Vɥ2Z9jyUW^ߕ}T=@cyĂ3Ώ$xjq6uy=8E ԃv7PMY8q%ܴ$ħdHj$1A{:&^n%#J?(<..ixo   e3)4 AY#S"Q6@Ω$4cvcv 2zG-_,Q"D6%w= O?.Ms` wS]Ksp6秲D׃wyϞN6X0,*֧ޢ pw̥N#+ܕ Rݧ{1>ȳY6A/N$(M\REǁ_D :C:|;F!:%%quGݼQa4HyIfd+D]YNT35:6m@׭vTW/!tŕ`λ'֗ ˏ%kK`qv!Z+Jgޒ[c9wy\e ?Iո]Q睅 &9 } ,@l|Q{x[F5~-JS[f"FDXDuq&}BI, OQGXlv:.c/@6oC=j.B7?MY t2<92-9~yAfpPCښAH ĢvG2cY7+`qqJA1oW3@*_ zΔ*$c!h`:ʕ]ek:*/-{o7 \٠"dًqpP6o| !U\UVjlWZFy$[Zh(QcZ,Qt-3i36VnphC.ѷp ±̾|ͥ檁ClЍdgSiςL@ku)-K: "ZWT!a cB¶ebpx~c=c[ף r>$F8(U(6 BFsYw}0l ۫ٹ~v#>9ڑ\@~^͋j:ƃq_DFT '<(}}+P2X}55FbϞzGY2L֍/S Km-zm$ʼnØ5,y=-S9B_؁i8u0{FD:Zx- };j=B_@]]I˴ @bklp]aa;(~W7D-=ewa/Ts;\H - 9̻Uzעw @d #g8bG߆'Ccf\NBMILAGȈokM徦YoK\PAk@-<w&vY )Å#s3!N0lRB&m-VK0W{VP.$ρǴT>|Q#vWbH;ףotk1`v/lFI3E1r2~햬C{[to=@nB:qbz!hJH3d<*\emLGA\\Բ|ۏ-gZCzJV\WU0aBf)hA0O[Jy_Dm){H2Uka^^&0:}J4v=sr!恒hH[~Qed "uu.yc%P [ga[[KؚYxjVJ&ш(܂ufpjzip04kL## n/|]C;ZنZTo)30NVTڱ ϒoy5L  }<{IWv|éE9F6bR2fuϤ8 ANùd OӔEb $Q1!kPK䇎Bt1@Gj&/ ЄWj 1&Gd;X{$ʦԐln'ͼ>02rqGDqkB~`e) ڎ;5Mb\Ve 4C[QU쫐X1r}:=[6sbgIjAb`e`ќL=zߗ&t8q[LU@ٶ!Mqذ oFchѥW.KV.1W,a}, C 0ԯܥq՛ +@bR$4/iH# 2=ijam]&%^y~is*(_a:S=ms'duH*LJ bD!,Yg vi4f 1r]blF+jC_ ?y?g Y+J#׻#'m(U-2H*}PE:Gh܃dU{ ٫Îj>De|e9VgܼpG$3b^3V=>#!S 9]0ԥ'(͢:eΑZ/*N*GJ!Xg׾u~J=>WppaId3\ ړc{CQFc'T.WYrj09P Dt0uiT\@%e bV[nrlo8A$hh_i/QE!gk!ְ8# 71,CYDAA%v8CTY>KR襳tj#թUbSt:Պ^&M\[c D8*_ 8lCk]a0Sruo=֞ UV vg!J->h^)WYMPO'朦g/,샫7+.",V GurOfk$KZ3nC9\X(I2"~Jt9;v zJVC/#BV粠( C-;] ոLWW et@ǿ,`?IJ=_gTr&v'5cƲ4=->N ѹb{*_-uw[M.-1MmzRAS.4Kw[Լ%0^ۊ"CQtL ;obEmbϘ wɠQa2ͷN.ZPh+1aK/GFta{ n['PIA'jC3F;aqVMR k@b5dv)eY}51GPլޙ#uoIpj-ab0F?Ig,eu{B@奂޷aWYέ֯3& 2W%s,;:@naXCx2ؔ 5_g~lQ˼㰟qd-mA_4 TKd٩v0:;~G䩭hg#5Kk '0=6H|,ݹg[X ]:t?&3i!PXDԗ=HnbT@4Dv:@шrad3SZ)'= el#/Mq:mi5MQذR&;T&z/2Lg:UÐ=2 j^e\Yy[S p<;ZA>h%L'o#g^[ZK_=r\yQȂ `wSn)0wtY.a V(#S\ge4yzf05ֹe7ŋ׏ hg~0\F\9j{t/-02Ƚ|XN#VBqޫr=d\/^jy,cJO^JH em3_J>NB☩;)WF{~jTu7`9=a)# 濊 07}mWj"rp_\X -tEΣ?`JgHWb/ՌK7N t1'V_& TXmoQ ˌ"=Ez~EĴ`I΄""]`1uDH].86i{SI ,WK0|7bafaub`y˂ׄ-`9J}`}ܞ8Ψu7w7UE4;_VJ΄~m9tT2•8T2/Sf YqW|Œ5N[k(x]`58kMzjAu Y"3l6_;.q QwI8Wȱ-)uNJ"L頦҆dǬ}QKl=%+›FCjExRdö5/%4Hv0*k] ,.KSBGcbjg9 ]cc}{+ ];MaY vv>5D *ᡂ1{OQl}S"ԹA>꓄m4UACpb+fbL7#E^H9E>Rnl'RLL&#mWHwk E*ƶ&EN:6 vX_ Tq١r0K|\UƞItv[t+ɞP?nh= Xȝ55li7/`9Upu)ߘxqU[0^pQ^kdeмĂ_M}$2 oT-FR^N>n5Z;5:.q04-8K:†P5f}+t=W~4+'#5Dgm'ӣ[g1W\vYijÇgO;yzYRӥs Z1Bjo# z @6=9KT"x T% s*l0{^i 8*%giCAJ2D6.gO 84$+o(=|uC*cy Avn'))'?, #ɍq|^`zQlhs7)uvMkPaDbFϩ KLm).o:wR$3C ;bs֗8LJB[l{e@%~YdaXҋ[)q㚊#V*ě>LjMB-?tʂS =b:ϝّB~\" "LwNG;#G;8(etJY2/= Ã6[K*-]eK$4bL7QW%a鱼 S1ʹ#8>U:t oA#C7C\pI `  <)a;Ts-Ng&n|(՟ӟ.v@^_@BZK' "(yChr-az> '8 esm\IJI%pY7=^L] @8)2q(ѽ ?Ĩ0>EEoqOT6몊a(T]A𦚚84 ~܆E!C []c[!o#7xggʋ5$0[OUhy*- 'Vu1V8!^a% n6UZ30[q Y12oT{"Rq"f8lE)9b_%2<_ja`rTT[K΀&0GwbUﱐx7h.KZNP;BQ/u.ٮA^-{l}"񍰙3PQ @lP\ä>Q4ܮBClHQk!ɮw!/uOY9ݤC"\ ʩZԄTi<׾{Cαt)dc`糯~Q#r(VG#.JW_1%QS?,HGm]g1ћ3/ͼ&|E_@Lo8x:uf=JE'8?H&` MQQљ)(cKe0bVCruA>ʆ? w82ׄInB#+ H_Ext{75 ~ 6CC Hk-rر>&Oc"[շ}YZTN?Ѯ5-j۫'|]K 5JEDHvuJSf:vH`ŜAQX빅|žǘہڙFJ,"V暧=?4XebO/0c*^W6XecWR#t, ϛjeU5Olͽ@"%V]QE/@۵׃0Q$-C4չWC>c*ǮtHŸC"4>8^sVM7G~wd"P?:Q"5zE[dnԍnй\ʘ8], 4P[B/>A\O=c7ekq 8lVp$3 ך tpA#k͒H?KH:yas$զ G 0#$)ȠP` ɺdM el%=Ĭ(԰G>03_EI'(? cԁ 0O3wmQr|u!S7qI=VbU*,ֶ 9t/D@pm-kfD^OhٶhQDLԤB0QM\x!I@=Öe$MxŻX tU(؉gJu%u 8%gx Ԯ`8'/f$;JD dGO_&ǎn]iXX>:<F^p{v j?P,#*ZRdwz_w xR8 ?u1;ֆL PyuU5:뢷9Oفa4壒-8 en[$̓u-<;(LyR>^w'4Mء *RqwD N1:sh'sAȱg#S7fb5yJd{E26gF:\XqQ6eex D,X# 7sl:I>g t+Q79Yab|]j}WѿN8&i5%V-PӹPe4lխצmڴJ Gex!@eEf e;Ι?1m+[ |- 7(G3' $XҌZ//Ef푲Ғ{N~2IN֨3 Q8231 v GK3 ]< '6"ڈ @%*)⣆giʧ8ܳ P~t;vߓZS _`ȵdfi}C\ ;_FjJ +8t8qT]-L;"k$o8j %U |)Oc#Jƒ! @1`cvE)? sA"ݓ؟A{P)X$ɋXMYFH ;\Cwy6ӳ;ǜBnpd_8e o$x?Q&S'޿&1{. V_~ţ֒| l踏 <} AT|OD0ƪ`ۀV3xgJU& ȩ@]-FbK_J=r؞!\cSVVCXǠpbC5aeXy KA}=t ,fmo(?Ph`ݴ5j=`orǼs ,VdAQ`Xoq ;8sEe$~ij- i!8X}7cCA ;GHlez}lv*1pT5#p#CQ}60c"Z;t$<䍀Zغ:&q;崪Qe ˆ߇,Me U0٨q\#c.t)SN6K*-4\pkVιM6h$>~4~w].%#eֆ.Bv!IJ/FHv,^B'i5؁LE .hȝ⎮SP ;K5#4W+䞳4p46&9ةԄ[hF|o}cf*U,NQe!V PɻLFM#Ŗ&-h~Mc8-rt B߃ѯG1Ky}EQʒJ˹[ֽ'ؿ{hW?i r Ǿ %39+3Giъh*@lV(Vj)?f<1U*Fm@(:~I·7hӾ-Bp>{BQGXM!JLͬ<ތ0-jS`pdBDh4Cmb/Q&Sޅf]6hpN9Q BޣxV=W#ES1~=1m֭?IP,P7uv JUzlPXPɡ7\T|Yd‹5ϸ-XŷHzo  eaYchjJn(?.,g1{6e+-- s=v`v?|_7}[( TW'0 %JF(st^7zA2LJwT āq+E<ƏK'rV`wd9AkD4z?%Nwl1K~u=B/UEa1cJ>&Zh;[!_N]L1<<#i9ZEܾ$X9w^9?rhA'3v5k1YZ-yP0[3Q4ѥG=8 G{8 Q15UzYkBJUb>4gM SO4OjFv/~?YsQ!]r^QTk ?5n ,XwWyrn: .;>z5}EQ<œVPR4tEMt|T@)n /h>F L?Yy-l ZFh=͊J&14D 5~blo9D+mY鞓VQ_FB/?Xrj60O7W?aݘ! %I51`H؏Fo*eKJ)\m菉1]#^QP2E[#^R::-~29q<]n 7Z\G_?VIƱLaJ w"[TЅrmH eMgmiۖ)%}h:#䫗 Y66sI (p]`QF*AVXߒDͿrH1JBj`>7,IfԹ({DZqH$jRrQ*)|uc;#n~a7irz#>i Vœ`"k8^o6p3 K|YGKAuɐ"AC8.qY)nkӪk+.j.qZQAmA١;x>$˙G`.`Q@ޕNgf hO:1 2/yg%ge&j[UTT~Ϸ45_wNNEI!u)ff4DAZ6j@@Udb$YeWVM\= c.w34x Ϲ]տ4G*ƶ+,i C h]ءULv9`mDͥ+ֵSͨm?[pAܯ7CZg6(jaZ)yZ떞5p} ,&9t*Kxˏ]^]^$0*9gfZDp(}[T郡kKiHyr;&a屲C1'%y@淝h4"nU AIG~ Aw[IKT齾?k9/ 8Be(&EK9"qW"4,\@/8>AcC :1 (R(&ܢQJ$l+qF?QWAhX.RrR!te3Rq0m+ţ^9^<4s@#\gsHJqҍ]{?>:ܢ)eٗlzh(,Qβ*(wFOjY_Jl\'`|2AZIeJUZ9-+|ۇW^Ʀ L/]@in:(UR-%R>PȥU@Ɏww.:ݑ29zA;0tH%%ʯl ?)Zw l+`!,frA ոl2iWOzH{W6߂2R y*q)OfU*]/gb1qh&ƝmnNjkYe^Ud3INi{5D{[^b1Yc9LBU;$XCM–B'.\x)"c3=A pޜڥCDcH2v>x-vthJtH/3V=Fy6Bs]ؚGu)XA>6?Msk ׈O.X0(hOQ֮WN5{(Ed~3Z#5䴯@ӕwdh~"qJ׷zES \Q͋t\ XG+@#tQ2xbVi'Vg7xKYs̑b0V洠#"D8"r7?f8fq!\-b9&VBx6%b&Nכ\v_>Űhm1eA8b-YS}`TxJ{ +!#,_#7 g+Pn ӱG Xwl GVRaazE5g"X(1W(>1?sMLm #&3*0#B%evO]>}i[v֕T/ٷ3֍(J[44z0c]t TdQ#VZtdo` eJP͙#٪[`ow 1vV)aB^Z83j^Q'q5v1s` r_iq}aQc BHƧSqp EJv @  .l\S]AȤXwc6Y,]L#"qR'J}TX̺ю%*BͿ?Bt#G^ nZybjMp-S`,zmJ4fY])M s!^exg^c|*6'mPnMD:3= !7Px/(:bi1Yc *}c.EZ;> ^x$'<VWQX̐7=>}j)ӻ<V!I&[]=6טSr/3(^u/ZDyxy KYY9)D:pޫ%Nӹo :cw e,ULݘV[.ZΔ|D.eK:Lc/gȤE5?]:B{{Bf2W\ywF~]/P8G]wIK6穕`˞\h̨ "5'k=}JT2b60Pia(nrv? |d(XT7FLAr_c D;YPR`)) '^9 FUPՕlWUB!G(TzN{=Fdl@]5/wJ Y*۴- ? 5e=GYNy@܀Fyիt:‡|ua?6\Ay1&Chjb> w;¦1]d\9ouąt$o#fķGm:ځ8N9tC8l~'cZ3 䗴Tq䘼/%']k>&6au wh<'[yb3TKhO(fF1ȘX +Őڸ>2`n YIUNƗ=G#??x|! TpwqHKbk4](;9(&Uiɜ-)+x+<ߘFUW<-ty(0|Î5L`|5TkFr^fwگ[ӣ*Jk $IlΪVB\ zEF,@B/Qgq6iuKMiԍg= w,}#~ϣ9'x.yDl.a^zۘ||3g?Q=~Bh5"q\@'ow\virAA 3T B=nN/' _jB!>NnUR<ܮռz|sUz<24oNp%9!vՐF VF?ߓ[MS5t! RƷf`-gJ U^T<>Lz?3$)kY:Aʔ`;##CALUUә)e'ؑCf~tCr^*$[VmF]M+$*Uڔ,>N,$ӂٛsMNZo=|:!tNCvy樗 Im/1L8K9pٰ %̍3dmA}b^1rƉ%cݷFYP;֤ʽOB(pA &7vz _YmՏ£y, -yퟨٷGQ|EPz| [ q8fC"mkcSMK="E!)ȃQ’2ph)V+ ִ#ah7仕O"fv& lnl\eChz2D .(\*DFIL+uhZ灢<5vW(TVdYd̕l/V DY)? L5p7\NYPJ-_c qS@fSt#W|ni0Ct>^t/lōP u,X ?$+%璫h Ė0OضƜѽWRuhco-Lh{xO3^6/pݑ,?,%x$'m^Lvp P~тQ(8N.?sz~E)jL_>\=_ځ{ iy%z[9LnMpxa.P"F;ٴ$hc@SL8oh{kw Q΄coGx׷)J&VxMCTv(J!Xj"A$7GeI]X\Rv10bP6=wW#|\h 7 U V@r00w敚*zQ>t'bAS*d zi̮@ /@́ n*L#mT g`A.o#iVd0cYW x mT UTBD$%- CNjq 7ΨSsB,@i&9$6'wg;3Ь";]p~YoEq",z[I :Pkr0'J3aIH穧).`i~n+:hى\S{1S6kZ{7KH" >i˩SO۷,e+e.Qa/#݃KfhNmKZLX=:EW_ټV"`f>*B6|R)oXUcʴad+z)쑍hM%H$~+m$'poW$J56?: M^LIY{yk,K G>oĬ- AD!W6y.kyQ7XhJ։zX6XS }U 'AL}̡OMZe0Ͼ%O`oMSRԕmh~nd%˘1]ck[vMgiY'-_7{% ܱ-_ YAF+llH awDascn/b5ؽ̯#y2ș'|E|$2"(vy˫x9- @l/K.h*VIRJ9g~ݹ\uR^3x˔1=ana^"\a%sp +V]sȥL-~,lƒ@hA9084glp=Fr*窼a^R;d|ȁ9[~({ JᑍTq#t^w15:Q+!I_I#Q$AIAhL ?(ZzC@30:8_6%BGCpQS<+Te0.:ORQ`D|0Q.E ݌*^}mHrAv3CpkAv`-ao|oF QN2\cRRwYItOשwylvYGklMES˔S.2WqYiH2s#=P~\-B SۢhG/RTm f\٥;kMe'Cpg130S5FAaeOJr#bJg0n:3)Q_*Ȗg"pb%qN5bYZ@ڙa,:дǿ-@\z D7Z^q IvPlS'5\ VaI eЦl;k_7~:pH46zkyswdj.1onİm\6z^d @8ܷl/eS^rSQ->yEk^J!inYʥ N&u<0ݰSoֻ8PW,Tw[e (XwS\'\Ik@`Fx]#H(Z|i)f 40gn$T3-}[;I5 oBEl4m]EGr cH%ii Q4 ͊+U胒_ x.uU,NjD< cƪ;j]!y1.n,e~/ʼnOVy2!-H3Qx5p `iYgֶ|Y>"'Sʓdz^yx]~aGP5**f4(QR+NVMUUyA.B}[2=`-̊Үʓ;^i[MWmsM}^+ q&he{6P!Y&.L2*8Us{NJ&Y k, nG =m` @kȽVg<R5oSl a\H~9K*)adz$%~_r,HN5]ۡ14eQJ0D97`AoC:!ܢ;ڸpUXJZ{/%]u&lCGQ3ff_XXaQ{/23O׃{PeYjaԬ eM%*he^HE@We^&կP,k4ug[/2tu !DEp9Rx (eTjlꖴ|A 3q;v7p:Cj<;M<=췄 %@ GUD,oHݿ`L_aĄbv4za1nX{1&3iT^2{5D$K%#!r<޷3(gvfn>(5bϐn1Hf+-۞@pFèJE*&y.]1ea;"=[` Wp$dES՝PHE&^e4<@З^FvU7stOBgZ-<Ic-p:Cmj I4);T@sqx=S`9H5 {[,K`1mUhc;<ּgJ;E3Ɍ*F1R `ďgoS=g<7 ʌC'I⟪YL$ٰVV.(PCVܯiZ74LmC9G({g>-Ɯujlxݫ&;2H`|eaO}(ow1fvI=U%IIZg#gWʘB#ynٶ@Do1D-Ȣ!Ӈ+t@l)eLjБ*BSeM 4c_>dWJow2f1{#I]Y&e.; Rqq4\D?Ns5Eߓ.^Kl)KfR4?7-3YyT&__&A3#H2W9kA+r KU4Ƿ~]4cI h+bTtיZ99}F+H`1 fma 7vA;92נqd8솢cGH/r 7iFAb5U%ȟJ#>.O E-H#xF#<{mwU"(&v]J;UKyM6,D`P j 0@|/wPH8hss>W3.W>iӈB]˝? ḑrĭ>h Uˍk*Dܰ1Su(gkQQhbn )Gl\$\ObpnCN/x6Sza4[$5ŗ> ,$l_nx[#!YcΜ.& ǎ$LlL:^BA$_ʅ ۋǧ `W~3\)J/&AJOroN]w?`W3j杊FtNαWJ栵Bā#9ݽ`]6Q9Gy 㞗J|ޮ]Ԍ@vcU}í矠dɝgKUw\ IimEen%DSX%&.|!Ұa:#OD~<%ɀw$@7c#9•YvYaς.+Bnxfii(m.|E"j,`>FY*_{Zԛnߵ1,t(ny6ɲ9t~]$)¬HG\ԣAlIqӅU2.)kx*pFTZ4CT໳"t hʁ&6CYl8o1[s[)'1t~O3еg^]%nf`/C꜓YdZᖶ$f[ҧț-Fg&9p]7.Q H⇒= ͪa'ZnUfڴbW12Z;IeuHl$|hv"u0;Ua4HdD2YUM}j DlE)2]ZKaq}PcRKE.NKFgCBz5V+TD!q‡~i :EA6}~TV־ blRpyE[ 1 _mv޾FdKTZ:XMPn`V^38kxr'boVCB] !>w/Edw:bs2@/=y!EDCg=y 3 J~4Bβ)UP,`ކh\`.G+=)8Q\l`v_?N@|ԃo,M(pm~/Ifo ܍x"w $S@eIyVoj?A]Q2鼾 RJ#sUa@)a'R!ʍ#-{]E!zGڜQƯ_?6tƼf? .ڵ̨{r<cHa'p]FqI5ōI|LVb ||;"h,;gQUB "__Wэ,ltA1UI[)AD;k[0d#+p* D붕2q:՝b{GRH&P4'M=@iӇ}X=rCHG<#7Je/zOKeOwa,)?|kPoXp:ld'\-4t%f}g\n]shJm$`$)6o>TN)Xי]j!fh$^JMi) gU _ʦMaTZ7;+ x)ެ'F52 ~F5ApM>Y."K)Jj$i 2UiSr@LNyR4Xtj~p_' k7^+YO]'c*豤  #ę\_ 2s8FEs8DTa`Hve lͶӳc"xkbNU.w2K#c^sv_c}4,8}"o'cf.o`WGR!`:YSoH v~@N5E(t'.\ȊӘ᪽1ć4##iև^@*a&ypy._GCx""ޫ>G7ݥ[{RlrU*A[*򙄵1F&%&c7 p:~=u}G7q};p^:UUAx/+Ln wAʊwŐIxKsS(^8Txwi!>x)v* 8kOmYYSLrKҜnY~gzdU9yԆ"9ތ n2u9hY1m1կf^[ [#\XC3I^ bφ 0)ۅ/`u΋dvf4(!C0:]Mz(99Q`sl,/=ܖXBsf򗘔_4jT3uԤՌmS< M*|D4: d)Qè2a? ֩Uhj Ȧbvfŀ1TTp~o9cl߆ h+H ػu5!sפEXoI2k鲾k+( d*nf$9r~>]7>hKl#QfۗjN~ ~&7C*95'O(Bs-@ Ӹ~+R9r9exEmX^Is$>W<3ae\=ꗪ =a$'[1:|MLMֿʘ1؁;1g*j H4&UB^.@%qEsCy<7/8bIi07i|Vɒ0LiBfMB,A½"]s9+p%-f a`@4HM+*Ϳ٪pR[qmF_;/6`lPqPKW>XXs~7V4Uِp ybɻ}*gJO-5y.3v⑄ B¨\0= {<%qa-gc˵/mHh'Ŭ8З]BL_{+ÎVnkҎ5O)Sq,ceHv$A a_tp/d_#O[eDb,A{ ;0$AH;:$JZr=X&DL /\MNg*#ҷ#nS)bC$+6Ǖ7 a`c;)R!%;%e HoqwtS,{)D 涾rD^) rxe\=K҃F5n%"&^癦䒌/3rAZQ1{娦—SOR-/h\g_ \"❁4%f̴=̪CƱxcPxwi2UeYWy6>NO\@fPn?8Lofð|Ku)J/t<+#HD튖4׋.I?|>q Yríͮ7\P}1bºo)&jC&OJcoQ-iDfGńxB#'oD0B1?B=ͻsR1&Omiơ18 }1 EyIrT27U; MLϟ$6U_pFHRqqj0/Jf#4h5%:tEA 38*=b7)4QbTkH0|hd T7F mFmyw7`.as]h8 h7j#O6p6sHySb\z!w9nt<$AyH(ă ] JƎ+j<ѻIڴ;^{9fS€3 VȞ \WG - ǂp`kF z`ۃ|9ctpOj6߃P妷" nOxfxrE C2zIj4f:jeWaBpL>ת"u8t绱k|H{){>Hω:3rLy+g׻@?}'cvJ,3qZhziB.D޸>׺4!mw-Q ' cKYMqLHMV@w&hͩ't,.?[W)ܣp[_n=ސmcS܆>gfm᎓_'4C񾺚Li VWYR$&{5Cj9dlrc?"{R/ 9QM|SmRI7)qguQ,jvw߯Vg9mKȝȌB*prco&IOqĪ!R2t$mj[Yf̃EoX†`:r^1!2uMzLpyWBN#[SoIc:0 p&3%t3yw"K?}{Wp6@ol8M=`mA3*뛔O&<iݨi%q[䔅`B$=:hg/it߿_a[ɲr[YmK-V1v WSeVo]W`3d+aVYq06/\Z[W%OT!h|1cdm ^b㹖t(LTKz+/ 5_%S",zݼU9Ko;ԙ2 ؝M,5*_]`BqF3Tn!rD3iFvy?˻jE.FbrW}*YdX<ai0 ޅ?hs/+KsZ)$ia}[82j>_Kt'{V9q)'gw뢣-$MџUn.w$wPTt*HcL.n x~GN7rp6kT,8tC+4U6cCU[6`?-b,ݥ)G͈ luY&EhmTraM_ɭ&ӲW+f&Ӻ@ 0I0≈a-(y"Ԕ{آ!C/Ҕ~x*¡.}~߁t+<Ņčs9L9mi@d ٪^q%%L*k?sy Q=x1~T^,IEUBkrK +5QFηV'#2U$Ghx/5)w3QP蠅$Xi$F^kl*48gݪ]-BN™ann^wfhJ'*.rz6,S6x_xX P 9 а3 ϠHXP+C+58@߄E5lŪV &:KԏEA4`y\Dy\DlT 蕑XA6IM^$dhk\N݄d? C闡w ϓC f.=Sð ip%߶LN}&7' Sl (1>6 a@NWdjovߒ>ºɿ{u&_,6c"t^ۋ6GΤ۫y G\ad?]mUj|+-渻ox>H Iq0@SH`4%6>|쪽+<>(:)aJ=yJA8Uk+qVrezF?;O[/GPjvCE /Q_JrAF@ssAHEj^;]z+SP{u~=F) g,ʫ߫#NȮ*ԓx9fZv;u&2lħū WX炌ENbpq,SQaOڜaeGQCZh$Iiv%ަ˓mȺIl[bEh 웒rv+ ̓ٿ+#+LMsfU?zb9JqŧRq̿_[)^|]!HIgFfoW e=S`W@isCPTr"C* JȠ.w$ *nrEyɴkt@ս>5556D꣚{qbQ]iO?Zjg%U[>XU{Iw*lqM ~G ޼y(So`) jt ~)'5(9T*u=L.}_ pYL{5- ^%$?Qþ:ܧY6'sUO'W=GV}2 7Wzt#[)'H6dg)WOlqBkcΰG΋(hU7dp T|PTOM7`GCFaXt5gz.bYA(Э5^5n\@;^M§gPU^Y>R.@ dg!O0{ C&7K KIGsv$~Xx37-¡ y6syS#Wh"{S Wk68`SafRq e,ZR2K;\(L';X2Q}!sJ.v%q0O!sl[HvE"VӰrX iU|6)ʒ }փ=r'#SY;IqV|:&2C!s5 1~7(CD~F [yEEu*}^>ܼ˴-W67i ={Uc<-mqq+DHi8⤇FK߿-0񉾏l8DecH A|)^㷷[i/K5>6*}!`c~J_ԪPvRp36Te؋j-%>Cp+ 5b60Jm̲H|r7{K05~OkdV6֣Kȅ! '~O|ezDq+֥wg~P PKEj61lVriIu8U8pX{#oi}GJ>Ң~da-8Jc4M%*Y>1t1\9*p{`qh"$OS\MN{B< RE;ds0–OoDQ c;]7ִ";6͙ŏzŢAUnqSx^Zskk#)a&yo "Ur7yi\˶9v88JSx"2(ӈĪQ$'&şv1Ϩk{*UU$==9Ӯ~۝c>%RxIm9\XA&gŬ=K`v-)Z;v.}{pv\Wp)Ė@¹}4K)fI2]lc9AXeUn]cg[ |-+c%,2abnDHuly~wXgp&`X&z5nZ鑏 [;Fc`_z_Pb6JO?e>ːy7Y unz$SCOᱮL)e}9n"ON_h>O] qlXw.*Wͯ]]Vh͵^8+rfMm{H>WJr=wCyQm͝1`\`>}T\*?'QAx7%@Ѵi{J cI`fh1L~.B#NPUnrڰ,ܡ=KDZz=Wnv0<,Lx܍9Mf/n [t(%N:HgУ#0ohD)u`bnbXUVoȍOT;3I$κZW$ֹ\-X'84j*HC{'R 6?L˶:.¸ArtH VvuQKA☨^q6k>Dl}zxo_ n`Y]bun^ )Ss*dB%;<+LC,D`:OK(e1s7i3Eo0wvey@BȿiAհiɵ-c}ɴ ;Z`zjP볠 sϬ\&g V׽2S,||=fOV1T۷H2нU 0e{h)8x=F$w987YMsF O=PA:]{pd#[ ^A9_Ӥl { l!P< 5ͧG~uZ)i2;WRŠ1o@aj` .$lUD"a-xH.,GH]_ǶŭjzdVu+IN df7~"7q1DVx:jkO6hvh&gen$_\"`$ kT+U[/ƽ{o[67T|- jmU2ۉs:#v wଔ8qjBu0.X{oHdt9H5{fE Pm~pܬ%Ig <:0#lgd?ĆW7-.O}rǿIw^ DikIw\t_8UrsDo=ՎOv ey$wh~iD AWKC D0@o- ACs]fw3sicY p: ˑPf$ٰ$jv)SN3DeGXۘU!'GbV$/~B$91ϳ ԗn zYƏt@Z6{ûl(Ki;ҏf/bSiyؐVsp9b3bvMFf L-CCv~)KԾ.5e h^J/'Yq)dEɹX] U︰V.5@cZ]d&vg \*K'rNH#ΣS)슈Z|J![]M'GLDԺ;0nO P/*LW #Ơō܀ˮ~|ވ\L֕;8W?) Acs̏' \΁ y+~t/]4|O+>9Lw?{KwG浡)GKCg_ Slb+VP>x"^kJ˸h<}˴ ٺ3{Cчѩ}{BdvlLN)3=N܍;rʓ..'SP\ QB|s-b^4oSf-άӲP׫XwW)sG}I&jFb{_Iġ`)v貏޲{hM4S75E4v\@p5SW[$* +9B0tjiEWrDm(Yb@ϪK!#F$nyx7c,y2!MW\w:&u >A)y7]u+f v}7cb Wq/ivVA"yjψIᣒ+υ5kt-cLDx*H#v:,pKpChI~Le oL t1W`]zaBkV3h)W .ͷ\nd\$02ͥmOD _ȳdU'@.+Ogt㚸X'@vh`l]B?40l>D *Qj&~gph1-' _s!#(#5WaɂOMƊaVHPֶqlѮ܏ X Jg9|fXzy&b\nĝ+NWZnrZxDyLA[3Py bЌH$ F\؟8J"&Fu*<6'\U՜%aCrk޽\Mt i Jh$c!…4 rR?fu  gg;a^3^Nr::"Hv(a ݽfYk=$}3~]Gu8_Hܞ8l50AR3ZxZ Prfd; 亶kFjkBF?ǎKyB\cYf\4Un޴+~'fF־t&{*rC\;,5uk8O-12񡸗_hm,!R'B?uh~$2XoPuOlX*ν}b-o]G~ IQ&D*}TڽF51( vǕP*ü(x% EګoKmgo0U}Mc Տa^Q [-u(|ǀ} }?3/;#_=xf)qqDW8{=;_c"7᥋oțG,>&I%Of `f8OM +K)uup!շ<wbiȀrv=C!Tu/C`PS۬x%ruAd^S`b;aO9,ƭ;AK *Tp5 4X.O:F.od#aJseXkH[d9 BBѸg/E!n/)eQpnfsOS$kM11w{Op+.Vöb4;]-3\ k +"rbYBS4 !B3.;ɘ[`r4{1_V!F$1ʆoA9m B@TZD9 ֕I^/q{5U!x))?77rO+ U6 :?QO<ϋgN1_ڛ&#"h"n.V|uڲwO oϱhbmhRBɁfI3Y1mH?+ׯ@HA"8=F=fjeΰ/M՘r>ʥT8<:nĻ.V55V{ѫ-ЌԲŏNvӜwX NxQk6Z *EnMot-pt'B:BӬ(YrL]{}v2ɵLuFL}3 (D8k4l f_WyW؄G*9'Aڷ?D:SzȆdZPf4aG!D1v",5U{mmNJ #QBw?ҘΟC(V(7ܐ|o>L v֠gVXJPC%$x++', O6\ .TPܗY!";A::A2>AysR_`iW/JΟ'n :y!@ QІOb2%ZbU喹Сm8IhJF9e ;s|:'O1QIfpj~k.Β5Iv>C%m5axPp9.\:U@pd>G(2DK>8wD昮׿Xke2_$KFg[W@0;] !jD'wINLT y,E]:^7%l;6S+7e$2T$z|A*ռ%V9 utɯ::D8Š(ey52&PTq^)c~i㎎F,Sr qu 0A{n{e[]Uk11T\݋BO%udt 4wٮɯާpafy :]uC`dBvrL3~cdI 'Tq;paba3W eV񉤔mrN*$,Ef_|Q4({w@xPG3uy, S_S6X*Զ@ah*ہ$ /5%׊_uykSE7q9#<+++v:r#'ep_L I4nM3[* !Dg/8dsRKū_iZDqmzȽ Io a%̟pԄD.0# )Yv[>zzM/,(l%`&+ۀ0O!n# F0v^9l$/mP4^"W[8DLktDfh/L `mP\ #Ӵ!Z9,``~Y氹>eޙ䆪kvgy0B)-q]먛-1r)VOMA*$i`_rY@KB?\Ji%1n=K/M |#6Sdm+E =7^C7xK :;G j}j"!E Z=[H5nxpj }/U;P|qڷȐؔ$g,3/d!`ĸ~5>˴u"9 Md*OpIQEfR#T@^EMP gJL^yGQF^|ad 張 .|1STPy*PC>!{MW0F',t#ph~\ZQ_,2EC2 T Fn)Mxʲd>E>%M:;Fm ,ǯZ"r[1\CW1f#MƕR2}H,ΜuTKIJN7\ %Q23 >5#jD9 ^|[I;)Q]p'L.1;Wc.)?1-?BU޼SB?2 W%LEy88LJ!4'Y~`ڡ^)t^5sJTBʾ25 _I Z{+i3u52R|oGdҝA}X'y`'vkҫ/ZAi~.:_sHvw[`scy蒨(my7xAxPeֺgFv"S.z0YK2b=_9,QEz2f 7=27Qy?o@w,'bX;x/׫X# n/»ymac#쐼LQJ:?I9k, IJ$N?˖>>^YJ( yvO--𫥵< uxnWƧ5MaqfKH>b|e}q£ej.#ZxR(?wq67،h!Te, I!m q!znʶsDo8lI{52. cu/Y&Lko]JJ!S Pg27~'/mv=drJ,O:kn Ŋb`= RQ.4tȥ8s,5!56榞x8^ WD:Cz/A7dѯ1C7ڄz) +\@@㘦v6]XCz+CbtGL׻[2 05`UG;H6F(a^V[#.G?0H i(A0}RkKwp~^xO37%a8kgZl\@%$(Z&x߮{R(ڑ1Cʝi `ˬ2|JX2-Qf che%Dϧ"3ÚC?ݥGTvXsdCBsd`17EHu?Ј"Qotn,7_Xgp[0m9RNǖg(,$hQE*vd[ کgiM5_u L8愢C ~vR(vZq{r{xI(~3N̲''k3[La)JU*qMս!GqӄʞG]b2; U5-Vtq:6;;_)?egQ7f hh Q1&gDߎv#\)|:/lĜu/.ׂ/m$E(~,ޑ6~F\+U '|z8gHOEl?{.TPL7 \B]2B1hX J8//e$8r* I0)m-Ȇ/ ;ad&ѪjDh%"J3JBG5OPos$z9Gi֝,W$c $"d''HO;PL.Ucy$čGn3 SCfB QTvL0^0hUKK3ޮ^#FT0h֒.Ok~ށB5ގq8Be|}6vR| V pr痯(d I!nrwUfܬDq>Rj9xۣz=K6mt6F2B}\LkUB3pm>r-e'*McuT1,oOwKִea*F{b5~;Z6!ҼoH,e-FC;z5<ÿ~/\k(FEŌ&^GP9ٯґ $G: h󜐼g'M*s}#YNb9,F/g#WǓj+6J~KsȷlIɢK꽯Kn-e)" 0hwK-d54=͊͞i7i!єM469]ًti kk--gx!u3R4=N:/| cDGP%g[>-S-E)l%ry5l 2)3 cVOi%w-nD;b?%^egc?9R![%kpot^6 rP5yyN7&!i D+;b| J]U-~cB|\;&Gװ'D|MI9Dz Pevﯚq,A(&NzY2NƚQ\~0wKL]&,v '@[$1_ٌ;7ܪT;QWߋ~&K5ζqxpNp"S 0z'ѽ'LQ6#uκ]/ ?;tNu6?w9# YWч}:]K5Dh5UMF:#W'ZV(w"~:C mRy̟H8 ɯh5o@˫ka8 pKХ/a `"n)(_6@ZrL$TL߭hEMbBi\1G9 2\ _ט ~3CJ &oB-92~Й˗s!MB*֔fF0 7{ QʛQbr@vB_C/~=%rd9=Wkdu ]"uΨ%RT8L8\W @w9ܕX>ݰ!8QNa:ArpԈ{<)A U9Mx1[j~Y`rin9dˆ_79oy*y!&ɂZdm4O6>/KtWFa=<4vm!ɳotG":C0i쪷$7vNo闶󂊯7{gmמ ͆a7U̩ 6$[ וignEj1eRR-`B.\+{hc8R˻cjd ˨ekIEq5հSRąoQ"YCDU 4K#ɭ~AI&S+˶h*Sc9evhprjpU=;5<Oicgz! ‰ OQ*UV^YY2xeJfZRȋ"$PiM $>ۭM )4ԏ6@ ;ڳ,aEA %YIR0's~S"i] &>y-)l[fHD>ܾd!~]^Tq9#dZ{?)ظlv9ǩ(uxK-:6941n&D":bbM緫 ˼7~mSi䵪M?wd]KuV/(.?gڧKoNZQ8PBTp_'Dt[_,>F_QK}_ K?o7;d!N|N!Bᖭ['o"|D [ ZZ*L|C/Ӆz줹V4=5v*q=o ᠞bsDz@:'Ez9u+o=` (έPQjv!ڜ4<ԔBI z= xk8Z#jO-<+w\eb1 Xn Ü$ 9Jߟ'O, $<A_UcMl=CϠX%ARg'wI;Xv(bV;l Slgŀ'!ԳIm BG.^) 2ߝЬ܆8˜NR?_g$1XTB"6hU&G&$HYm׮.olrTS1!"8.GYʿALV, 2dk8Ո?=DݽW2zYC[L6#3zX'He`A(hTྈܿYL$kcK"wQd̂1 "h8hs},OwŐBkuTf+Gχ39H6 1aeT{qz[F &Zcۜ՜:^VӲ}u]EF.YΈMqٓ+-B9)P8bԣ51GBg۱ksMBPj?*PEtو#~ޮ4^X.R>j)"~!?(;@,]HeP")э\8sd'c@;Bm1&R3δ ֥IXׁ6ԿY.`%]EnR#hF&vĺb0O Q_l 1}}-pK.{ R¼YvpPäeCnO֖"Ylnf̍5Q+=<`430acSH]bI0Ět&Ef|C+Oz`>#wYR|&P̏"D޼2g^:4ϋ`XKR*ɐu?V1W5Q|^t- "YBl,m O8 ݆Yr"}2Ls_ 8;+ݧY2 ҇SU%DwjVbbd-қvbARe[f`\8g1gdA\-ݿR#RS!0ð_+1ŴS'NVdrfw HK%i?jRLʼnM^qJR}QiJP&ٵ 7h}É>os c Gk Q9å᧤$ j%Y."`'>?⿠{X] V(ٴQcv@ !,oP1Rye<X_GCyn!2 b>Lಟ-.W;G᦬#F16U;z1;I4(cC[N36~iQlX7R[qf }K jW[J( XKOR+Y};6X~ռ3E$]3\  ww('{-u !o(9?UӛDxKHʮ&"ǖ*4Swċ)̟[H|7؝ 굀"K熵s-ĺ+NrO&8f~uJI J]5' ۚrPL:vNZ1[,,~@₽b<@OlM4š GsW8D&,3*^2Tf*Oo1M I|!98]]TRvi? e3 Ղ-Os<`"w_SL gd~6}D(+*+,D 䃫8%o5ȶNlRx8,Hl9S]EԻ0ag kjy{fMFnCT>.o8Ғ!@)5ʧyQFe~QkTB7$rm`v"Dk~>YdSy;e&fD Ӡ)(o-Do,tezT̢:)ɅOi @JF1Kbt׏ҦCzX8pt: sl9l+#B@thBN7"UjP KTR9LCێ9v(M|&g;l+Bк4)t3DQ97 ,t)Vdv>0Z@{wu 詉 Ab6GT\'H&^gO~ M!jY7 X^jvy†5zr9L]f^ob`[JaJҺ[:[QzbKd4\+=A`\׉\)$w$ϓeh?:BKo- ks2>AKCq?>&t nG r-R=l8%F [uZ^F "s oq,wGj7kN--KYG&*l&5ӲppKm} e;H@O*-$7aCHl35GP~S6r/;K3K9fx)Cm{/Q#j~83!$0wZ޴} էS@fJKeoZhmsbg.gnف"8x3Km 2wǮfi@]ENy@+ADlXru?k+COwkEmjCy ssm߾Aqx OB#h0PtJ.nZDðņHMCn6O=G]XH7RF"L QHOkGQH5"\gi-O; "rB5q0 `ѻ VH)F6ݴ}+*`EYFp1ČX Z' ;5!7t̥ ]ER8k"Kc0X?6഍_'*wjn/ Um ``j2k{U8m!{vIB*(?'i݀.-C :qѓ`[b:Zx|H/ʏ ZF?N:Owjo at?_i' {Bj`N &"w|a8l"7:cHA۬c4 4,5$,+Nt8(p$:sܔ<餕J #TP'K?)8\OM\\ C?K>mf>~3JH#$YX[BEȂc?\XbylCL9iO"؊'ː)Dw&Yig>|=1--E܉P0<] ; eX{i@O4)6cvTYANZW~`G9^V̔2nڣHudNÄCZ(-Rt])9A՚n$furh#zmsϡMhUCd:6f+"Rna^6|GԓQxE,Iw~g| gB1pLܩ]E]7XIxȵzvI=cJ([&uMlGxdڇ{>h|FfQ;N eОbTkMrqdS374 PTfOa"+L+4ߚ. q0"2dQ9єGʣ ػSMsɂo3 f= =?B.0E^o#OMY=~۝e@9AVjcXS"I >Y{jpj!x@W3 [l-{-cc8 EI~BO1 ̋Y dH!cM/'#;{0),>[G'-IUP59,´eyG\5Fq+]2[AyotD3iAa`)#2Wl T61ې=hZ5Z㎛+Q.NB҉[>Zu>̂/=X >yXӧѹ~n@&z kGt>m$up3ʻ*tϗ" jM}Ezۋѵ"H>,Hm7hh`IuBXT]T_VΛ6@qqK8z<8qg{Sx7YTo5 4=k7%FLd䣟婪*37. ȩvWf_晆6b,ƒLJZs2zՁ2h85`ba Pu\VF yVtޯ"d}T0Y_e255GYL*u<@pe&"phrj*=!iP k 40=gd] UNBژXĢrvH\ 0\}VȏJKYt{yܟj>B"[".Hcv0 KU\߁; V@ {9_R̈́q-C şPIbɤmsë:Uv_9;L0yl!1ƶ[=* ;*ꀬCNh4.#\y1$_mjjCOZɭť'Hdo`ZYK}~d14|;Bmb]7`Vi )k?RzҩAg? 𽝱p:rLvkSM{*!.}̺9??_^O`1$sBrFyZ-*q !epo!Ĕ_42 eO;jf&8j ߻EF` csDyۚNIwSu o"`"CX:d"COwQ5zl9}+7P;e=S9]z comTh!x#{WCeC>mN#ӓ3|<E>"FQ'6,vZ4H/4CFPibӴ 0?󫩬CK{q#46ðr=%E_ԧfL΢W#ϨLz: ?`2یBSej zm82$~_t5c8afOf<)$a=)UP;%VQc;7\tOoJy[X2Кی1D1rW'66<|^ɻl5y}3@ٿ|Ս YZv+O\6x(̄fkGX TBMVbIBp:W+=jX{ψ?~ULT5Ow6%4s0oD M.s7`Hw}H[lƸ#b!D!Qwv H`?b=@" 5tB/QJ=z"\v8XSG>iA@zJE|wxI#ۓ'`"/D'2YE'=op鄿eSMZoچY 4{KW_)A:.fU 4G#vEv5Q:y%'24Um;p.ݿG`; 4o3>GT x j.([=G h cN6c'یU176#˽NX*Y1,ⅼdHq-lJsnέS&4uO==w*e-' J/щ8EG(#]?y3%"ZVbÏI ՖԦƪ7\q{}g_tDWLK:ǘh@_R! >uff`0 9_N3yu%}F"xrM$5E翕NGzW?ӣ2EoG{ec(c8+ `$1 Uv~ڙ2Zy E~cpĦXc/b x&Hβ2K yYۓ@&f&wZ~%}6Eci:t\;4F! l{r-6 D @ wj!Y`2~n'*OspI [ZܞI8'ݔSoTS!g~H_7D^9u!H th:沧\[*ֲ*G]TyBYy 2jMۖ`p,vlXy<]=²2\@I0+3\ѽS&;g c+N?cf6EHTb0>ߝ}MUdJcv qU8܌;䊩NhXc#pЩ/UGY"KgroC,C~Oxg/J'O+zC_?0K q@*ws/OGx8FcɯT6Kەn(w.}eBkljՋ2R u&-x4f/lee2ў?J Ƈ48qyKJX^Wldrp|f,X"z>-hS..Af\"IN}CB>Q#v[D==kKG(F\48qr2݁*u'F%چf/Y4!]?}񷟊wl|2"eOui |puT~;MլGC퓏*e NAwƱv%x]e>z 1%5?<=)묁882/So`i~oa8pJG(q8V"[S;d,Y&.{7Z7cT&%*Fjs@쒋9XAJh ځ4@HH55ox4ˣmY@o$ur 8]^b6?R,KUog(36=KՀѦ1 VCn[y5'{nk.i/^Kr<`aW*Fsw2/kcQItѢY=&If5PF&Dтg!髓4MtءK`xqxqJ" / " BY0 ҧU>rwf#v886OlҴ/D'GOx 7|diLx$L:#9r`@ -/^1H>Yh%:jO(";@r[R_vlZBG+zR$WcxxMAij2 {5V86}/UN;CkGV" Y4Bph]3MbF=)#s_e@ga>"hm8Rs԰ѦkZ= ;ڢEtDŽ뜮OK ,eKw2bD|"\W@&Mb+uK@Udo8.%TE7^g0lM0[Tq,`]]c^a`0rQC9'"H!u^z2R1ՏrIѕ}Ƞj1)Ky\$~#t =s8yF:P(\Dh5/3ta6f[bs)M‰dUH#azȄ]uLpt*~Soóz:ɐbx:W9O ~]uFғvfyog nlH \ tV]j4%%+BMk.{ݷ89ԋ>~. Tj_!;X_:NѼmeYi' 41 Z80>e̟ݙG} b&h!Q O0je{L2zkeT0֢}|2UE7+ /BXY&3 iji4 Myd%T#`bh,lT|^ef,ӆ"l?v&Թj@wa]t=2>vZWv |e>2cIr9m}Z*J~W5M9}ڭ|7[7 Lړ02 pWnngzf@ECОx?_ȼ4zk˖@%[Փ_d8"eSv\̺MqRodS_'ƹ 2#8gpAI&SNOH"sw0 rm=Pui9m>ԾP#g,j`nH6ލeX 9&2Ա WƮ<?NMϰWj &ͳǩ4x?H{Iųov×|* H`a?tZau%1ufŻT`"NfTNzquV0->V$pwVrq@W7Mm/ Y.`>kԣ0+gHoIw"ZFw&*iy5N-di^3vL D[Z|̼Ψx2j$I^+k8E7U h,*Mjfh-/)l[:%KOoˏ~)/+T+ŭ*m?<Ȣs!2$}0%NP?r>zls2WM2nN?1b;TvvQPs d2y2:4JS(0ʶ{`6 w[F6Η<) Xl-$CAzLg1_s$\FPOs̀oAȜ٥TyuȚi8dAƴvz>b#!h $Y_U n b @Ekȭ/'LImAGy[Ƕ6?E )Sw3RQGHn +}Fl5qoቨ2OW,.8=,߾*N "z[pq_ـT' ;gmНn-Z|2XX}Zf;o^ؓ`+_!oڃ;ӰGS({ Mus$u#@ˊ&\`YA=X4ŴM(.Ҧ &ZJm(F9'Y jDIAK). c.0kdzhyq-IZnΙP^;ll'#tq8yY3"ʕ7k?k >v7f![O${BpzH}j\"7ܪa~a|'JBq!~a k~.tckgOK".0 pKa;7y&1: 'n`ToVpݒ3Xv,F}wb2M8хd5D7žLTF~i> /ZlBdHZa, HS_Qe:ة3!V|gըeC;g`6X̯Dc'3IRLcՖN[P }F(U)޶H 1Y2|1޼֦]$ZJEܕw^ ^oGi-X9 ؈ .=<[ʹ'|k*EfP܀Mwz`y%@Ʃ]YP.A5bnquV]a2 $! :;f?nu,y'#I~ފjѵD>&Oy>9@RYv yUSoC ;پC_Hb񺕧Ie낹(UEsu 3f+93EE2xKg `7&y]V qB %7@~)BynW8|@4>9*&*G!K&snj8(+^NȮe"zkbOr S |h&5o dKH ieVFMAqh~ljԬ~g+ #%&h"upT6r6FvIvM˟EJ)-J l*sέ\hv_,B;PLe1t ;r+Sn"kVӥC"زY^G[zdv{Udi J1>^y$&TjFT,Ӡxv8E:5p i.K-Nmfd@sim.z3y@# J4ћۦ^`ԻɷAcse1%aqWA|MaPt{LbRzEtA x~Ȗ 3|D3͹u,狆CG&mhi/,{nF+[`'5,YPsFk81w:ͭq,uV'̉on[$e7Ƒe;.cN؝I >HWfL F*X'3eI.n$N LX֘j59DĴeL8xk̰L?+4`U {}`xu9kg(!IH뛛n͘u RvaQ,#ze,zYj҉u[p#)HzyI/K+L}D0q0˔ԿRɗ )Vn7b[DxM[l{q0AX``(HXI(Fv _rجԷ>ҧgZPQ[.Ús yQy/DȅMf"gbQrJi '9ѹ8S..bVȿΦ/OV n93 h 6c,gdݱ0fL〈EiX i_KI/:ƒtޱ ߋ> 3hC_39N@.csDfCrC[J]g.vs u }@"(&ikҟE4O@BKuڤol%1Ǻ!&UIC[ڸ˾PׂKjGJp))IJp (_mIN[+: N['( W r:`<4 ZѐZGp41.̒g/ޔ]QD'.z1d >$YwnE?*nmT  \Oޜk% $%l Q -A@먡b?QvsaP@_ o! 0ӎ{(ߴ&x:ワ^QUVt"hQ]ۮ{oK Lr鿶H4x\F}‡(kK$Ԃ}3K%8P%n,C؈^FTĤK/yݟuc5|q.. d έ>o71W<~XC:aG0$(l6yb&C1c /)S߇9|&Z-8A=ZjaBn216"kIJK}nO0'`qAgQjΆC[a ?̼i!YGy-O1TK8( Ib;P/V徜A&#&JwNY&KÙ!qX=~8VNV1hjdkf/?|\'};%}mV9_eS$x&'m+eJFN%B >z"Ń7}UKG)rO7Z4U`Zj/+z~W,eR?]CvTCg3!R:Ec`A$Kwъj{գJ}3NIGn?D=BڌU3`.K-oy֙NJNȳO7o>f^9fo gW1GH FZ qL=BOad!(Q l}f0BV: Lq(\@@jhC7 P ;^9^ y gȯs- w>iYL†؟V%k9m&ä :]w\"]z%Km'yƒU` {L@8kj+\ig.)E*$hceGPF}+ߖ{krd;0C`(NbxZπgo=f^wE8Z&Gű:nk=h$) +3D-s&a6;Ϡw͏>2һg/!kgN7[0JN˵-_F-ϟu#)ĝ< >>GuI&VŪ9 7& 4ŠTZPH(Z9lªaC ZJ$ s)L졸&S&n(aIOS{iwҒ̥FF8}R1d;'\P6̤AP%d-BHh̯ꝋDf[$1\:4eovuyyhaa^jj5pb8ku/EFfm 9+<6 馌$L]z#u'y5>(CUr@T9cFjA3^* X#Tm33NǺ׺q/; ϛ34w}m8: 'dF4(g'ܠz}_FejBeQ_K#;!*Y6ڜ),_SE8,wA7ӞScN`Mד~hc;сG`>C{b]$ |WqCa)vػKzD"\i-сidױƪh[R(訜0}Fvrcǣ~34ѐ}`>F+Q1MV' %o6j 1Tpl9U[ N2TXSBחvg,U^s)PTB <򰋶 ] *)L5:\gg1U6R#u8T9md=6 WB Yz, vۣ#Avk>i&U)=OṤ5&:;huH0̩~+H7|W+RśXSŀoӞǷ`1PhO|ޙ GgȰ~SM2]'(5 W`Do|z( iҸS/+ *+-u]<)9`WnO- 1uqJWg><+w:Tf4E.ֲ>FT}wwS#i4eIv@&s7v<װUGZAp0I(i NlsKs7A'-:' S/ޢ_!|B9=MeF($ $6HL3l|J3ڵG3cXT&d@'Pc6kt ݴ^Ŕi,QhQY WzNmECd@:ޏ@WkܞV|ns'M;9T-'7PF4 |0qOk<6ҺsG?n8\JlBvBa1?:% `4R@iJ<:#Ȫ W) A3'9>s"ô#+Ct?VNG57;oKL .B3%˪ pβu\3q.#!~" 5M,,pn=AlԞ !tȞ@$+ dGh,O:W.l@lBd O0sͲ x7<"IsZ$)ͧЗ*˶Gbj{gPc JKRI l|]{gB&3Q9Ic+ F"q1"_k  gyDtj ;pńЗ؊E$9&1+t>y&j_!j:X7ib\0Wv_ŭG '8)x0&[)%N(_ T7eۊ|~Dɇ(Rл ψH3g5Y0u]d;C?εf3*ǐ^럥]I{0j) @(#!G3@s)u҃[69[L7EGNq6ݺ/!(u%XVf5*8 =Î4x>nYMe4PZ\9*CՔ0#5aIwJ_02W@ԵkxE%2~j6FƠ5R5vV*ث*z)Q@@MW#k=պ 3,'pp@42(N HoJ$UY^jC_sGg5f @\i]2hS9s?"Go ;)U*Ka0Nr\mLIxKtz?W};R2%a' v%_t#ut*t1*ٌ`rs91JШtM5ʺ)w"R?!P}xV [it Zf1Fj1.e\t)LmF@=c?z/N=OIp^ڂ%T!hN !IVu HV}hy ]F.P%I]Ϲfnuo- dr@!͆|^ Vp̣0* VyD] BP<=DkA@I&S$T"3pQ?EL6P'WqOrj} g HhH8X9qaƭYXE*J*oܧS,81l[hÙ!]X<\by:be^AOpb(X5Nn+X4\IKS*FgX ̡Ȏ6K^n=z%'7o\ࡔجm&s`zQ@%~TUV"̲Yw0ڪGO v'xbڏfeSn#rk_$'Q)koWwQ3r5d*if؇/ w0. _繚{b ]QdڳȁC ]7!UM> tLbgMR7h F_rQzLNuɧ袈b`Q+| uLL1@kĬ!.~[QKb uuwPYg@oG7;E" %.M#T-HQF,g K;5)BCS]DF aDUJ^*Gq,X~Z2 :CN{hdGh¶v\ Hd2xjT͊כ, ^)8}3gf>LX"/iQZC@r#5.g^Lnm:Hld XeY(Fuw?XK(3kW^G~*s*J3R<G7%ԷVQӔ|@b'Zo4<)(~Y;Q~ijӻBFP}vC936_C[NSOT?e'2dծ"j RV)#nQXpQhJp=O&,I|:-4gJ˛4I,k7uzgAH Ê}=G۲jJ%XB(v.@ʣ&y+HqYEwIRPy=/!dد^KnozQ=D̀ml_$c+h$i $w+(Bf֥SqhEsCkPB1w>!)  ! e8Js. "gM[!re'&x8e`XZ F} i,X8"Puo4m4b1 +}clyn4Nfς9441k+(/)epg̃H ǘQ^ G$hsͬ ,$n6ZoTHjaxsCq9$Zvw{ `SZ8-K(xOľ$b.f#g[1=ΟM?<4x[}zPudYQ>%O:OND1V%k~d2Fi Jّ͖Y,/}`~&:q CT'SD ÃZt+ :ʽ\ł\x.mhd "7I(y01 mqG8ӄ و;q>&'' ^܅6ℴab>"#ʄ -]S"¿?WS5@BAClH} 3+a.iF{4}07Lֻ(AyUa|ux |% r{BFjd5Ͽd2^c1je9DǜEip0)n=]YEKKN6Q $mrL` mZ5,4,wve탗!'h,EG8 Us|@T%kлLA75}nf{f~;/LknZxzٟ&m TK5GKMH&Ǽ#^ a70TJ)lm@֯4<5'O};Uz+GL&6|L9"8nD '"~~'䡙={&A$c `٫f0F&xU CT' ߟ6d&a [ +MHm̮蓡 *fhUF;b)i[|2*ȨN(0ia%{ Wt62,FJAHIX熏y<[^-ywcD++ռ`3aRхmЕ';Ý20:6;^WX5;yv QP:'Ѵ 3F oT%VE/5s~~_Ƈ4>";8oF!}[P5œK"[} -.[RxX_rb$ ,ѣ1lMuLNQ1!K5MQA^Y=rrMi`K}^ou:a,-%J3ƔnX>_{ZP~5NeeY zGKa1b,![jxVZnsEнhP7+s5Bj6:]c]38%/OJl5QRyyYx|KQR蓆E"4fHiG&s MDP6~"xԞ}6& 9orU4$Dl<٧ ˭cH/S4Ƀ̤)O o1wzŚ;JGa34RMO DGzD8"|mZ\^}g{'g%ʫO׸&1#ؽqlt1<_TiO8FPo%")7Rղ DJSHRf WhFr>?4F2:dd:}9Ԗ v+6G,+z~TrgՀta95f"BѠt(-Ias^<}U[*?**,*SVXptQ]ҥG1TYSK2t¦6el?;[~-4v6)Ƞ45XQTj,puMAHp:$9AZВSĺN  K,ѹvmǶ 0tJ9s3{SQqPD,l9oWLqS߱;LUsv͝cɄJuCArnJ&LhAaI&SQC^7g|)7-[%7I%}"L>~36Xz[~2 )-<ֻ[X//|6;0YAc@QHfj.VN rZ%|%W% o\"BEYHďm=MJ{-|J;|’ដ~yA&drw1+b2Us7EH5Qל4~1եqE^vh#VlIGg\o FzIxD< i5xvi~QL>^w@O$K_\+RXfk"ߍQyF ߾ݱ0y)#`;:dr8YV}#MɍfY!%hDV.p}M=8K;*@gB1| ٫ot}RD[:;Of+Zmj'sZrX6a",n#-u_37wDo#kQEB6_.Mm9xn* 'kF$^NQГP60|#}ax. $S&w5L~ ]% %\x] K@*/VyWh>eh1e#7%@aBz3}szeRSvĚ8P6 W[7?/)DMvKЖ”1~CyzywF~@[kfWdoZޤH_V{sWIqxQ M[cj SKC{.ٹ~Ȉ'98J~&{;BJsn3)l-~w42q㗗;\72 u[L݋2GX4bbiU :A5~Zc-sC't/]=Q$#̟ftN*0]Ïί7c($XY9~9-cΈs-oRb 3́s44=K)(P !fUuBҋ>:DR@8]NC9cCP^b z==jKG3`F[JZtu 1ޥN8:NOpM|1 O kܭ.}Sɽ5;|GojdeyLƵx?.'yX(m(uhtU+,,3E49H,Hv;|?s ?! p/ϯ.VApL6yn2[,$Kiw;)cբ4x;hO~Rht-[yJf,y">lF)(bd3u79WI.31l%A2>t-g\憱X,.@#' fcM#b$9A6ףv¯=prSJ:I-[Y1.N})AHr$ldtͿ{WK*?0`%a^GŒ'yp+3ɉ4>hKf965j/o142 +hZZ}< ijT4iqk\PU m-‰;G"n7"o*tl5N |T{úb߂7gUdWNnҚ!asƾ`4wMluΩR8)}Ёu5uErLц%g8l51m#*b9ӯ^jF<;VV&1R %?F`Uk͟kw1],WM*2xlmѹ=cEM\4 LxUރZ5'tʞ!_=*}/z!Jb?@X'Fޔ|sw8(/\7 |(hJFw|hS9ASZs#}P#mH^J˲/wM8/L3\E .$Uab;n Yf@+L?s?>hGVa*%2fyC*lTP֫7^(,f 2*cCy+6lxmU^;"RK:H, m-fa$Uk G`>\[\Z:13]Ztugň eMVP6Zĵ#l2Rnw =98Mֽ!?:%S SO]Q>؏;<,Ć9ke{Yַy Bd8Bu{oDuq-3H!5x"mV:z4{qsAxTzx3 9 ]/WǪ5Idvrםn rek:~ݢl[Gmz5-aw^80tyJ?7IC"JwuDFwD.HJڇN=BTuJ kEf5w}8ONJU˚6s+! X<^/M}jwSX=|kRίT4!E葩% 2& ?1KU}gTZxc@H-:##?rKUNԅB-CplP?R:W˵lw\ٰhe #?җk6<Ok4\ Ks2[7x3 ,?|lY#.R5(&akD9lRuOE)k3*5I{ -zR-4*jSrف̉wGW*"V{A-_'E>|fB圩 _H &c:ZXT=ЭNdyWgZ琦ĊF{(zA>ݜHE H#)!#a ; _) گ fo L}{ lB6Xx2-LJHE*TOdcMS^$} ΀F+-Kc#}Y$F ωa/49%nxFͮˠnN: Yд/xFp\xf˦Ӑ`\q$wdzɨ 8phB.lmx;Y1Љ-z7<ݲ;`eF4z - yW|%(*Q$8' 􃬊'Cs~=Q~wZ[/a"{@4]yyͯu5 ^P./mD||jĜݶ.>+9a2F_&6`KrpӜ7R4Q>2pᄉ4B2Q>½F)2 p0XDHpԬN0Z&׸Og]㖁I/1IY#_?hzNpVT6Oöh`.tMAYH?N&I YaPw/[׸}! 1 z0yרI8G-:DvRt}(g:W`?wT!L~kU)w< ZӅfLt5ʽ]ćGJź7EHM`l9 ^TA8`;1WZz nM na~X6xnf;fN"Ǜe4wUК+3WI} ci4'ȩ5p?ZML(NvȤRjI?>w\=|r=zA]t0z/+,3x*^5(RMd'YiR |rgHgXn{x)8?#Șacsme|E^%9xG.L/" KW< {~jNMFw9<ۆ$>@W45Xo׍A۟ۆ ؊~cZV((n>#< ! 4T*V&٠[F>EhLuL^$ oqFv*ќKaGN?Ɇa>̯{,ԛw*֓;+,$3zLu NbGt|!lYHbކ؍?1'kSM!yݫ &hKj}jew"N[t\ԉEa%>w@&!^np__A|H=g0+ˁrxYS]R( sEH(n|;e⒒)S&c~qo#~u֎ ]_ܿ>, .Jk~mLPmNHB^RM9׼r #:%#C4;b ݻZYTdJ<\{7tD[Qx-|%dX3GÓhZ+"E% # ;*<:4p:ϦA J;t-@B S ?7d 2kע(?j6ހ&%$c^{s;nXEJ<4ࡘ#LUsfyrf7=`4iE(uIp+im#5(˺S8N| ,uA #uGؕ_8Wk|u6ۺkWbrU_ːnZudW nK )ܸ$_#^D:2T*0& ^iz^ej mjT|G,}G윭cŞj]/8_VwF>IΖ1r\ bH w]STCzk Ǎܭ3| ~7ϿCRW)qHQSNf\6qn2ӧomIM('W*(,`rYO,* 4%R}Ly/M~f;nT:c.×sRPZC(RCJ:H#" Mgۂ?WR#2jQ|L;'jŮ'1T.6Zm& pu߷Qfah?)Q֬HtáõbJI4B who :hh?ӁǤ2I6Ef\[9$=ҟxNty?mjoU70|p}:_,Q]oѐw./^pFF01I:+4-j@UJċ M~e'x.3Mmb ưa9Y #)'O]~OR;زi k,&/.Yǫ1[VLј18Ԩ`vU_vNL#7MYk OE`M[bI$}f炘Ô1 }ʕJ* ^Q"I4\!+eJ+YÂp-~iaD.)\AD]Xr?W|C\sBd麡`/m'bf34?ޑ!)=w80 ɠU-$ P)g\6&SR;{S kJ0 <3X֚HV2Z LI{$Ġ+#Z{=l[{S0 +Zrh )i \q/6v ^rsAVm>&L s9Aw":er t 6V8Q8-LERAu.r VERO6ˀw*ꓳhE B//{e7;Fަp=HB;s&8G *.v"OZ'DNDQ[(y`'Bs޷1zwҍHϬY*f˿A!'+I/{L.ol[Mu`j̼_/TU]pؐ=Ҿ#_/Cp*JEQFC6{/(P)R8-S$@sۅ (˽[2 P_N๧Ez)#+cEv|>6,{Cq9pA8thFX_VZR@(BT'|ŭ2 zև1[ga8޼dcju+ohǼ^/}y\˧n+Q {gw웙GkpCUI'[,ۈ#A͓ΌN2zBO~˴_16T:1aW=fP?|jNؿzSءI=vK UjPFmILr" mrNUwOae8,O EH9NWAI&S+GM0_Qk<4 lp(U2ޓs] o<h}ZL_W<.:#N]4[ehJP 5cjj:ν?Ɛ"ya3r] ϭ|Ѱt?mҤTg}.{@kޚ<_a M2-p #ˌ&}vy-|ݩuΥH,S'mP?cvҦJ%j`#)I{ \%T[w W4O,beXEV 9W{Nu*&녌'^wGg V2+ JP\5ͱbF4j#-K; 4ʺ;p*13]c0Đx#i,r# doUZG/ҋG쮲[tńҏ}*]S,{ٙ{պk"X+ۨ/[k9-ZabVeu E9tCvрWea|{ì&Hh-hPO>Vͤ*=r. fo4U|@ V"r FH~0V\{30z}9'(-s1=X "?ɟ|&ES5j0Bn#؃8k}>ZWgHlb.k1 hZǝf/(ʙ͌g<:Ո(A-k.# 2bcnȾ8`VyGU%Xaub40٧;V$0X.|&g*1ˣZ2 OnbqjU*;c V36TD[@+;!uQ ƍ@֔7Cn+[FXce\؍$9-*΃ffon&@=av=bW)HYlsT,rdfiMK˃/ 1 W BVj3np} X&+ϡ^(>U$ 鋗rq.*II{QPn_֙D9(^XR"= ,$EPthvXnȴE j&'K*J|:߫LeڍXk ks+6"eF62VaR%(Š䗝MDa58eV c5+p37oFg`dx+4ڥw w:Pu)vPtAa^*nIy{m/f ~b/V$A U !nO_%ǢZ`}?W2[p~<[رIW~*6 _<] 2l*xAyH^̤)^g@VXKTUc<"a"/ϞGWʨ,18N45(ޕLC9AruԆsyfCG۽TlHU|R)͢nd@$q g_.[DKÿ8i)"f7)\4!/)I˾ICvfu8)aZ{ًGyp%2lZBGZzBPr$eS)~2C/]ơҔYG&h'C=]w ($#Mk`cK'w!ZGBuA_}53%31Zl Pğ̒QPZ-c)8@/}M55K [ tL}T,Һh%; }0﹪ ]vnd>Ɉ\b.,br#h6.kfiv IEӫƧNG5Up2:OH=8m\&KSG-Fۨ W cfb>lHIAWEe--1!sg_z^[hڦTLl c'nVվ#I 붏n !]q`yI&Б>.|Rrhd8gٟOI1YCn^n^ O4{ô-RS,iɪdT}_/ $)87}gT0rTZ#ÓOƕX:^;OD'[dk!fx $FefnxK6:G!Tf f;1L?ho0* s>u- % >L:#FtӺ$.Q%b8+ rӌj\TA`3ֽ"+" B=1&tfgcR)?R-Y" J-HV[lg# ;Qm %~.AV/~ͅ$ita>lZQG`}2 cf[m7[Lνz<2-b \eg )aA4@Ltt&Hl1lwC|4 yV!M"ZEN=EFôpWa8L6ަ'گPJ5op>#*z%Hڲ=kأ+=a;2(sVf $ׄ)r:ҝ׋`ZTɥ:yj=Jg5blecVVmdr%16Q:91n(("oj.sʧKU)5^CjL<'˕*7`.@l\K[cb@rkY)0x"ARucU@ n9 Z+=G"^ "ǻѿ$@'q۸ '7L%ho|o/yV  : J;[JX]Z>SKiUdI}i',@yZDth6I&-  n_n &L*|k9WҎaI.ePaks}*(szÜ%ºw+vnE;֡:D~WH߀o8-cK-<1{"4ɪ„Zg@ piξ"$.v?1vHϛE+ kF̚h="\9*<muT91FB CAhH:@/d*.{e&!XK}XPSZ^!R8bJ-A*{axIԳ6&lRK=U6:x뭄+g]k$LwQSm9D8=Mp8X~*=(Q-p^&_E-wVkց3Țz=#e^ 2l뒍Qa+"gyU#TĐex$FeԹ0xM֮ɺ!Z)^QE͜1]umVtF~7eɇ|G[*j=0u"ǐu6zOڂDLoxAI$:BU@AHKcQJNSY(cOcD@`%HU( eLjxbb@TъVŃ'u.vSo'q^ 2/xH''gnQl1wLWGT2!B8AzWBiΎ~bE3V!+h鵃yѣD)=bk a㦌{Ta[)jhbԞqzIA <5N@MxV\!n\2Oz~Jzsz4SKC._*~oTzׁ5JO"h:R 5&We͵:ܖfT( nTͬk蠭a6I~A&9ݦzfE\E8 n0gˀ~&H}=r`. F1h!t`= ֲYF[,aηpqcBO [o[\ T ,Z}ěM/wx7yN}0+6BD<&KFj-1;/g@~0.} #حۇU[%_A2զ .=g]/r:TQU S SGN@|.h0-re\5ۀIJ1QmF(kq|>G<?wDa9^M_>z`MZ`F{>}7;f{AgrYA@n-hhLk`{;GUkWJg- 7ʐgrZT5U Mt7 s{}ɚXd{C?iTaWY_9fch-#Bk(-kw%%!azfK̊r=Q w75uU1Bնi3l? k U(ݒ]eFeh Üj]AkROxg ^f xև [gD!mj ّ8Pw Is^ըc%~J bMX <%ߘNڳ(7/g]rp2t< }lt0 l>JgZ_3VS̥ENѧĔ~_|D^m3KhLW/ЕU5ȉ`mUbPq , x@ hqW+t?<Ujr)P' 7iC7,H450&ζwQ$OPm;YrE#׶L5[8ٽ; v1,+s!=8l3ׄXރ[:!x_p;X34'۟?4íjÜL…Ԫ0= q{զF+#_ESuZ܃C4:, ԵBxryuu5/u|)>\+`^Mk6+ml ј8n~8s:? ՝E5:Svq[hޛϺ* /!#_Mٷ D9GrHzhJ57Qu 1ڂ׿c UjAIpv"$$fu#+E Gb_gVyDNKhO6o'Кy$C/x X xeCbeDOf# n6ؤV)tfV>0&Y'}W :+X>H!#N6\e;Qua` loxI=kqPcx6V^c~) nɩdrNh{T7"C-;?mVuhgjB?! G: %xK%^e[{3 ˉak 3Xa,x>h@GD,l4΂qFK`F3W}O}]Y/J .:*EnY{[b l31VRE.Nj͈y3bc0R@7>]NMux+BWh?+y.h+| 'nzr0%s>UphnB2~*40ͪv; AT|MV@5P˸(H5iZlH8TŠHދ B%l ťg9Hjhk ʠg[4~qqJGd1 >[J9zHUO`SmWF0q#. ~'ˢ \p#`(PZx`.R lh /.WZV3B=.ct.mE轼k.poJf]ҊnMDu`2)T'A#5nukHL5[S>G-D؏J:bl@V?>fxO6}ߝfJgT0IHK (i/!G6"ys(5/4z+},>װ/oL߾XKktAྶa#@HX'Jg,PHmVLdVl~x"*vהG0z@rD;!}ҭ/0]yor,_ζ5CMaKKOjҟD2)2DHjKp{p{64CClCd/ !y@$7B]RY2c+X~)F4_bE[KrOxpj*few*p!7͹,m.v[YjDc1,I<dW#j2 J{-dBT%f?r*Fq֠f΢HQ8a+3>m󗉚)ﵿI9Oon]ewWɤ:fsgpn!Buiwɾ*1Q, -%y@P%]0- 'gv^li,ʻKT&[ښ(o@פDA#s\1PQđ H?MzECr<zH1[CJDRݶD=RYM4kdVsA'2OxFFdZ$ٛϫp^0<<{{>-vB-+'uqo=d>yk\HEn=D2dC(XF}b4v s{LtF4ݨi`vy:$~:ը)X ]yLo~M36K${hi?# BOg,;嶢Q9ML2Pl ]JdbI{EȪiwjQIͼ,a&UVarٷcd,q[~!tl(<V"( V+QND~zc9U)1mj,ݐ$ȥI Sg7جzM:Ep_i"܍r i6bJ+W1c:2s ,*ԄƼp$L.;lXA["Q^ ]W_ʢS(lt]Yȡ^CUFpVuT e{<` l%|cXdo2,[kcx^޼zZaKX]?ψi(ZW2=Q38ԒI@EXbTQH8""?owJE+mkSr]{GE񀹧7S=[g4+8sl2+E_J^މ$a❆WBBn^3tµ.e CT@t{=(hjYB4K}YFD<[' Mi10v2G/3dZq*Hp88K{cc{~7F88nVFɅ 7fcw))hm0Z!@a6k.r8@ܪ%Iq" "ş15$MjqR.<\>G''fv4*KI[]hNg)S[+ _7b{Ǟ)uSFy*LQ{`+hD8`2A 916dX_IuU/5UidoVJɄ'̬zՂiފpIn\2 YMq"e hR4Xc:x* b7hCD5R> ¢ɀT_v_ĕݵeǁl<[p!.oM1#լ|fjJbFR!!lXc&~Sg[n|[W)2Yc)7(2Z:sZ V }vM̶i:NAFN$ ADL]\@%\AKCs@@@DO_}'by-nyĎ|/O(d4}|Փj) 7 S!^!b݅)ʁD9:-&*YD:*9/N3D:>.y G,TݮbZiT{ f*0Јm}&K) “b}lLdxp]_geS U]`zYJpU\5|[}`ʁ\jω6$ nr&ߟ-v?i{*g=/|XCB5P}3X=r!@FA}e" 2񶷈j? 6ٓBpzW5R "uFf1P W昿69"]UyPL_A(ob_R⛿).Ϋ!@dF7 dHow|YoY-v.5sS'[( y.U<ll|XͣdEUyFgS`"LO:a;6Seg9ܲ,]Atָ;ab{yI.vlrW yyyGIR·I' !`f`orEW9jsC1s?ªzфB(@L=ccdw2n9m]E%h8q //jx!KUر5ﭵVcmfڙX]bhmr1 ~ATKFS:׸G-t O) !&Bl>(7%,,vUr Mrn{p]-1D*mX0>^[vQfI'NQ%W*Ccd簷jgQxvz?Djܐ"Æ,2!&q8;WK64fXAW*{n8p+ϷuGWY`[l؜.bb2]+6bIbP2!uݱ7ի 5H HK+bȍx@oצПWz FO'[2RF{5=;k?ꬃoɾ 9Q0H2}ۋc^$d#\N>.2:w5]`a!`w>XSx;u[ϛiRw/AL+ W*6Ԧ~1@ꮫI&RfH_a{Î|w`2p͹qZhO5b=1!w>70h;8~CiMifPoegߊUH*;t+|H5w?^[|k;udx׳~L&2exD,KJsDङGB}LDAڟllrNZ G>m4#geU`fCZq-x.7){"DAyaoqN4"EtD k \¼5g2C 3D<]J|\gdO̒1#o "H6iLYD!mO T>[׹jN r -FCEą4 ])|ޑ<\z;S2m.ɱ~j W]c nR~۪Z(b;U*ϲƻ{GKC7Ï~-~4U.ᣊyUMy8S4-~@҇~J?r'@|-_pr3I(4Z`MҩA[0P?,B޴S$Mb}m '}PZk^O*[?:ǽEAW#VM幝otJ:VÙڿ24hyxN2-@8iѓ*RZa| [ݠk>h>^x*>nPM6)3Ʈsɗ·5!{ Yp3D'oifl ݷžuTnz WapMvwļm>Za;\ 8 vm踋M0NЁ]ҹ*+4̏KJjˉɭJ: Pp 8:QvWLkCUG[5lA[+5l*y~vE hx9SEdn9\eIR LPv@nEuwwycu  ^;0 E3uߎĸUP.7٢)5Jil#zi>nUp-A? D7p2~,o{|h#,T) E& RCKQ"p^Uۃ. 2B_^18=Yl渁̒ƈ RpṼ2W>~_)n)R \{]^$9gI=\:fӝ0 f2fId s>\{b?`&Da׮‹Njޢ7HF[8PXnR6|߄/ RbM1ldk<#k ΁zR})սkAmƽ(Y E@Tb[5 =:IozW<'aEDh DmuPNƥO>F߿[}U~o\)LQ%4ezA"_1 65'>}#yGg^KX?jk|Z* 7 숮n&B~!UαYĻ}dh ,k ڞ/.ۦ{Y'`"Ӽ4ru|"pohxCqcX1PkM@U_Ibf<8sSK, CP)րlۮ0Q- T8mY Rf=7आ"S*܎YfcQ}81sݨ{x1[d^WhwCd&eZg?Ō%aƤ$]٣HYVg4sHu<) R4xаLdL1IE3MqyFn6+311Akɛ}qm_679k&(g}լͧd&y* .e8Kfg,Ȼ,ݨwkxf!&Ƞ8GkoqfY^xG.ogEd Qs[z"$$̔=RI(twz ɔ0&u=qb4^KˤT@I2!άoB 9җ6t\Uvգ^޾ P|s.t6]N2e}rH]8L} R'E]_:F_.T~4Qd\@ _VhS3h]7-BrgPʅ]egHOkU(56`/Kʚ_ _1ޚhFh(E $on K4:|I'!{ʳl4if_EyVsNUp0g}kt #uEծPk&Hog]Y٦v/(v rR]ka]ȋR!{Oi~k\%Ri gJ< !7S.4ބθz ;QaA }߻0xFȃ[-2t.4hUל/` @Vw #SJ97ŒJ-ͩxǠ09Vkyƀ%m ;_\ S@U؞|ۥLbNgF) Ps!z䐝ufnjLgLoLdo[zD?I@?6g¡ ]viXQG;Iz~M\$jR~X7O\!wIuD*p WdY>ױsv?T08eOӄ"J7K+ @E6;8k--֑͐} qT;% j@)A'r'g iݽB謦kڭ>vg|ЙhB6k BEoSVaX4ː<ΏU/hS4z!POle8pIЭRl;kzxV% 1qd؛pMs7VE7bX^X*PCo7X\2L¦qƪ Fq \s76H:Ց&${ ~ w"IRF p%u]=K=C;#|dY><mnb&ɍtYNJ߳ɟ< #gfZmA&|0W`nQ1ZwLe<M;ߖuNLaO֮:@j]pG :;XIUɵH𓏹Lq?C?۟1x:,!LW ~WF %ͳp=Bct7$CK#|Ō!7we~G3 헀\3l8}U:0$&DC,`cן)#;ߔ!<<\gTG!&fB+73`J7k,]˹Gd6Oʿ/ 7pIn|Lm5 >d &ni<`%kf60#(@1KM#YL(SU=DrKW񵩸 x)7:"[X3ZPk#Mީ_a;pMɪds(7^m `'[Fi$Rt/3w(!{PP`9ub$V \bp-bq蟲e[(M{PЗ_7з|J [jG2ש! ngGHma,bTZ-.W,-09NCPB ˕UX1MؿdAh1OH9Γc! CQrf8z hz# BP<陁`mamHzZ/Mc ըvT%BjkS/>A1BLE9&UcZIR{7w0MERU1cg.rSoB%BRс#ʜqi!m&* rKm?q>_&dtώLho>S: ؙ| 8m?;㾐ރ3wƒqTJ47f/W]u,Nf_ %GBÛ&:5/" pp"@_4*cEAuIOG/g|ܩ]W6&O;;*@xWK9 } ]ֵ(1C|)d拃UEKqyR:cw)ժk/V`gbnP<~;:JG-cHɛpvNF)&ϙpC"foj(PԪ0`XDOW#pG>f3N'~U^q?wv7SO-48yLo`tU)L=f3$xg3a g)j[~Ot j;>v⸠a^8ۋqKa3 k&+%wm S Bsi|GyOuk=k !L'_J isʂ8cB@F ϱ91vCD_f#eDjTT]HS<`f"ވe-' )gd>$6;)BZvwoN?Jd,̯ ׄ$ j!3KmF& O MߔFgR𥻗~ ˆ¨o2QFM\MU{iŢ&5J֐5◔УQZ-,JTe)h[=oE?Sw{fzw3 d~}'x@(yڟncrnIEP`g8R0',>AI&SRutp]|ʼp0ۘO)/m1ܑq2[$ݶŢaDa۵H<9{=IayHэ,#σsh3Ksbb9scR6L@9Vu]-XBttS[##-7?X}x 7|y*ZS q׹x 5f/E}!oIy?G3M{ByCs%KgQ N R{R_ȋS>;Ho"쏱Gd킙x`O8=8Lo&Y1G®ՑkL_2ھuʓM{Y% m7[ ujKX^ Ã5xͪG^o=$зwD6F)a0jU+?4w!71IZϡc'Ÿgخ0uvgp𸑮RQ>nՅ['z:8找Cc1!l50wKM3rY :BwQ#pJVmȘH;x %^GVnJOgTCnr'O)M_Qß,q`\ACE`Kߟȍ!U.S(Q_Qq\V>K9VK5s#{)LMNE.a&DǓn\H)گo pÓ0vjt Y;FnQ`$1}F\gs0S;4:,\.mD 3)33+ҩ 5I Q=MaDar\]z(^|I s`5*^lhX@v]SډAS#6?݆q,@k V`p{-Hl /j ȧ.'(CBWG& ($NbKmӢX~[H'kaB@wpr> BzٔFgȐL4r5QT:F^v@BA^Ȥf0T8"_>n{/v}K-VIҍn΃uZ(~ˬa}0o[@.`sB:_mGX\bԮgòo&T`hY"̉9ME2*&3|[lv[•b`;澙ѓ ɱ z.}ѩ.d.xsQYb DD\6Ob3-@ᯞs&{ȗ!XX' pRzۻzUfJ '{tZ˂vE@aFN Ԓ!79_yXV-QnSH t<mӬb*7؈ACmu8sDqL"HB62m)08Y\#;>/k؁9_fzR`6ꫡDF=r-{\|VEepqlhBMLSzbťSI &uf;܄lj22nR[g8(b9i1?ñ1 Ep3ME!pOo>R9^#24V h)kÃN>Xo=c6ma߁JN R˲T1o4#gSW="#󠽦q,kڪvv0\Ё3-!݇DϚM0ẃiĸOr>^e`E=[""_`3F@c8׹#̕-)},ⴙc;<L5=}tʦcU&/걑eeS>jvPESm,YIz>!8 F~"kmFNR;[8d^NfSNjg U}H9e䅚SvDS6HmK.ri'L`G5]kP4$)2H(!XNӏl xM$uU&h$H^Ѿd@[~gCb}6P]E`SZGݒU$@QǹboGiA"!8Y#۞MOFuΈ4!-!F#ylȣ.2)/  j7P]sWg *v]fj\ofleA#ڳU$$=:Mn=lowșm~ة u _jޒ.obo^MJbߠC mMz]q,t) gPPN!E=ZE}0ϹGۊQPf$SС 1^-sIGkW?X8hэ-y4 ` R$Ox+!91V]|y54r$k_];>sT+K:[i~t] U]U)y2u+ h1P>EaVydBy6")꒪\eykT{ \;C9x,Tmv?A|BpAXʴr_AѮߊп-Ӹ?է}@F6 ZA0LD7tsJU$liҦ7u5-5'> AelzdmEEkAۅUbaơ r@{ 3rHYqyg~4p4Jϒ,9*gB[h"4= (Dztm_ŎًƜleC9;X3R%8^c3.Û!t 7kgť,0 F (`É _0p^ bj$kG8t0&:FSKw]1r[ d>B"Vpj/ApC.ӟ^=";Pi9 5/" v\}( ل8DoCnEG,?GT͋$ɇ#$pvӢ3Bne Bo򲉙(lPvq {K4 %Sf|#TE7LGvNp +WHD53si^8|Ɖs>v/+7bf9fUvq`'nMw=>h_ۤEV}^L炘芹ځ[jO9dt(= Ma57*ӏMdE!y4RT/ ?OnjxuŒ+1tZ4a$K'O,g6V9C=M9Uv& aAd\R#~ ZCX׵鱔݋Mʓ+Az|YZ'rj~>w;f%){Q.zEZl4 D<2RھwlIW2UTYxʘ7'!lj"_P6]}@ga'Ye-<8~6CyTl&96B'J$ZQ%M[Mz96b4 zt^e`E.}fJ~l`޲WjHѪ"+N,p H 9OfnSaŧG*=,Xe_CTLg&H!*YOXhH I6_ulm)/fl?ǤnTGѳ-xK,^1q p#hʥoR[R O@ʧXŵsɒ[GԯmuQ,]AOgj;뜗cנSEQgޯeRUꋸ:j@f/r J*~lg&qĔ!8![p0χ^}׺͘*7QI&(J %JcĽ9,MYЏ G yf#T <ͦu:R;9ϻ$TN&KA)ETVVsNtѓ/gF?57=",yf|n`s{d:KNl?''AЖ12p7nsJ=z'޷nUmN\/rX*:OTOm mk''zb0wc"JfmW,λRmӻdX~mKC vV#Yh,Ͱ04S{ܴ)&C}ʻc#5**8AkxF&'gBH=(U^/3wm{݌Ȝ~11S?4G[e1j"s4ss>_ $z;A~(Ec(N P\/ qo)#2Mr*1Ƌ~_gyL" H{ ϊ9Ou~Q[|gβH糘RZPgDo=]NLXz]nAg EM*%?@eY97] Uq>P1de{׌K01Wdƒ$I?a|YDWuP&[iybu>)<*@E-P kV+M0:ŀD,nC 8 %K)`uIJĬ;%ҙ ,8nu`qej]p|ǹ0TAs2,1"Q9 K.Cvwb蹹 ~l- roB'Kb4S4.5VqZg\Gg$s{eUĭn>3[jYO,œ᫆Ju\^/?>  [r`QTȀ&g/GE N?JSy%*t< ks1`im9\anc/׹K,uYhY;C(tZjQ]dž0- ГUNUX/uvy&5&E# gwO#5;.7D(ٿ7&p xFF`}0Xu_^=3u!-מzGq8 YCgHIp6OԪlK,Y:P0AH@Ne1 Dc5cmo5>/JJ3W";gpT֩)X0'tJVqYHE~ כֿV"kㆣ+<ʷ.3Pd/r=x}(\%7tcBxJ  {i^ ? S} 9uqfJ69E Tѕye} $j[|M%w}vxCz ؃[ux'^KKVfe" Г<'U5_7i]#m`bf3L\ ?󥺸Nz£ yLU2J'0ny3%\}ȋ7cTxmn؝6sNtz[ђuqj([3uD;N{cҍ.̀TX 3'Uڳj6 ז*(z>Vcb3Xq)v) iHZ""Ioa5`ǡO )ni6+'Lݎ͇ 6/o?r"\D5fW\'ӚpmfUZ8BX Ny (#L`|L!Ub:%վmbAT.VLz VA/m:|G?(x-z{Wʜml)tƌeBjm返"? H G9َ"eU2$7YEIqo6WIGhs@eO{jhM:IUy+:6Rxg~U9C\ﺬ{95l5;Dgj}\@()1^y?<OG~" 2(ʸr@\J$"@'b VDž(0_W&{&CIGHE~||Jewsbs;4/G叽jKАṕj}8%6ٲ=/cF0 Ϭមe(iQJ'JJhЋfpvUj?$@͊~P"۵0]Q :h\2UJPV)7x!WϓXN%/=[k6qFxt/.Y+1E죣2C&LPA]Zz]2UH~cG3wr1.չz5>=eN@&(]`ɪ &=;Cڃg4`Лh[{@{S?hUY/ȉWiܻl9$j6_uegu 2=L#m܎,!B]0'_.E„2^cb/I0GH:jWBHo魳OؔΠ5pfc=BԁGka;qCG2.ekfkGLgUފ[wZBA*f %YF9#;LgŊ] \-~kNHAkzĨ$,-\.mܦ o./О)A%r Gt@%:JDtv~6^٪hPS{Rmw1]SKÄ!l4m:M6S9Y/k@97 5:YGhcx>lW5!:"BõsM.)rRTy\f[h>~w%GDTf[G=v eN}T EN> VFߑ]5Ҟ%Jnf+ZIZ(|I9jt.suꢴ$}M=xWJ7761b{8:gRS.kɆJnJv=`T{W  916:B(h} Ia~'w/.7^Z* pMܫu?xҿay:ʒ)a LGP`EPABIt+iQ&P3&} L{M%4X)Opo[dSRK^*)cK@)CxhE81*J$*ܝq<#: _46ۢ7:櫭= 8UHV ]Ry!2dFXXO9'K6AJI&S+Ybvٚr@(+a[dL1Vӎ=Hӯ^2 ͗V n]NJgwqmS k:Q0Bj0'LpR&[50yp0z61RygbiPytۖth*Gt %^E1RҖ/OS}MEdJ;%hHܕ" ]ܑZ2)_ؚ8u0Xpu|yzj?ao :^h%efE$nɍ[V:L?]/F1'(djn9_CB嫬1ι[%8%=?ԊCvՁZ+կ]@gX܄u:װtvh ` T(nV(ÖMF;B=65!-wz4kr/d,%?'R?"Y7 c9*Kh}6*;V#=]|s ,xNI7 ֮of{u Z> $eYUս穱P9 [Vy߲G>WRI&o54U n=N %ؿGa'm[wdU̩P>,}NJwhzŸP^ܹؖH(L x6o[}0ծ^J/T3Dlݔl!}ˣd'ᥙPgpi`י$n-:\;4%ߧYuevܥ9XgFf9sF0[_ɵ:uO0bcwIj!65\..qf 5kaSDw50]Z k.ت)䕀1]tёSy*LOmS5%`_BKV]Z"=<3FH'Mw@<)"KP5>iVn% -xb%beL R2TRD) wo@Г#}J;UqӦȌh1-5>ji}iy :@Zۺw 7BA"1 &{koUApQo rA/!p4F'w)y`µ6y!{#$P) *mkaV$^ O %1e&z3aj~&v9?_hw9-YGFD :cxdc ` &̯:*vގN#ۦw mgĀ? Tؾ:Pp a`pW^ wL @KGS6 IHiWv(#pҲkV.|D.mԺ5@Si#,[҅Ft.6p"58oTom۰w9{!6S o?/gc_"EBYntQjCkqQ(:iÅIE;ֺ"$ݜ .c [I!:󤌪qjo}h7xBW$=3 -,(`4[#`MBimd"vWͫs_i 5jC7 ^93Mg(Ve_憯CIb Y!PQKRY87h\zϳcp}-P\HOZG46l\ he(^"vuB~Q,R8nALluVE+.άu;,t`Źu;C9eEPʥjL$^H*#BP #tΝe8=NkXŪmPå vH X*i n "M8}`&^'a컆!M*t 57 [Ng_RKv xVnmנ7dP8ĕCIKK\{! ^G\|aV] 'zR4S ͂ ގ8gyXV8Ix1c:h0Z>gǛaH sҺyE:x,T{BϤ-,H^QGHf/R ,:r#(w" x\~^lǂ*Y08ROz8uغokH<N,fC$dً?!Gs2/ZhN[v:Xm 19{d6$^;@3.K l I@wgN`h%C:. ujaQ8pouW`9xK_.ݍ#cWS̆ww.+rsC~|(Siw_ݤ:9 }tI_g@S!ͺ]3i* MU8CoKQ>٠O,z$sVrCm1pAȣپFd*tUzR=w'p:I/#[ƹo܀pt&Nճ28=NYy v8 ƫ*MSFSE0YM/V5[n}p3/F;?,LyIdl"A% *71c1nzxԾ1w4 V̕-,/U2w2=uԮS'=;aiS& Y'pQ kI>GXɵ*N׵YnPt[ \+pfk '',ewpv6_3M3_C l&vfč7GwI9r.߬jY?"츼&3KjmS]P_ &SM0c) scn!yN,S]ǁ3bDv5Aɳ}=dq*Xz?#iZ`p,}RY'vGN^{H=(.ty+`xcH' 7E WnvD^AW̐j"j 'S.7f%o`A>aK1s;bĝݛǰw$GԷkJ&B7a!YQTPvhW3(e n@NIFH0p$8hO_gF[2|&<0vR}.Cv'uIXDZ-P6w:JrB1 iE4J貉Mo&uxpukQ ![۪1Jv膕8.R N8نu="؛ĒpG6մ1}ry: [es[ /&^2)7TSs6hlZii1P^ev!cWBoOJmLUQ0B0U`)SN]3Rp{uwTچ[(PGLrwf#?@4Kz]wC5__p/RS\`Y%ߔ=5׽m@Gy潿.@k]O y""{r',A_˺^{f׊J̊$6ZM􄃗uز[ТXjx+%+BX+{@'4/g1o崈JY%}c`ڍ^a%+szS4k8#91:ƒt$ BBKN}9y&h&1+Л'L`N}zgD cA,U]J@rZ4jj+;FYI6{kBhojO^47˒,'.<$xސ뺚c8C5L},D.a,.**b®Ye,\?#J_94pa{p2H`Cߑr\;>"%d'>%>N90BBѨD BA tc.+}a9*J%EE98ncej@RM:mY-Y3۲MӖiD+5 dL[ڭ-]-~&ƕ+t*<))j  b?},Z> e>`*jnd{Ȩf(G+d"!9G2_+*f[.v81^/|`TnQpCFQ`h$2f=@ܨ [ٓ xdM㛒b_6)+]o",cR PGUuе ϐfL5۞(}?b~\_yIK]w8e>^SC<0jztT^/^OZb3"tu2*S z܎:yĜ4H[5'e1k̝UC1 f*fKmk:Om8-(\~Lh-(_RH0(tDa8:.dC9=sY6x6eҷ<]E|v:JGcD'޸憺'p2T0!~YY 2ku]^kS[L/LD8GufOGY2f "*qfY fg`WufFD+hN קH pX*>~?Jk אۿ;/@G5fXq2f+힔cs =aE?(ʪPQѼ0ojG-jR.:3\2x]I8g_+1hi{ۖ "/4%X XN\c4B;8`؟u\Y>MAlGAT̉A[1CЫXœ#.˘&D)ewiݣ`Fs;*T]UAk$7A+oeeݷ)"vkGz#6;KBpq^u%NYe]n.3 }Ň9Ikhjj?)cڹ|01$~O>jTg#2x)dIXa.6SԘ)7;1;|?zoS-T/fLTsI(honRT z#?`Dhy}d?!?wQSz%sdJq5LX>=bO܃);es6&yw9)=0':T1__9ܡL+kbq+7 % ))7nbI?<bkӺR"n\Eҝw%܊ 6:^z[79=oo:|^ɿyQn)0D6gIU&NFx uǖibh29UxwzZ&vFGJpE S s(uuJ @8&|CzlD#[jr6t%Km>c 8g;r"b ڏ㄄qQ7 hsl)~2U.;u1h2ˮٛW~`oI%C尜<;K":E1Rs ]R5"g7_⇾f6#,YUp}_ußMy/VZT}&]~u âryaNA`38{eM9i&M}Tz7Lղ7R[sfW{Cw jFAqIp]-cYc~ح]> &7=s^.{:;QnpF? (" ouR~>X=>;WޭZu0*gs"{_@ֵL3D}G .K.Zq(0"eU 0Y"2BgPG~`6OgڪҲV>@kM !T؀*SbTj@7. ;u| rKtVHg2JAGvՌYl|LZM X9R!/=@>YC<̣vJX2mdD _T@*FGo3Ca~: jw{Dy]"P1Pk o UKX³xr7vǨ@ uAq9҄n<'dE65Dw(g (Mx >hu0b" i} zs}!hT'!`PDꪉIOS!VT x|t ^ck @#`-bL҈Ke񞱺 $3F7ꋹM3Rj'MhEg?S+e:DFtP-f@4m8ܮO_9 a)s-"JЀNWh뉞!PFƒ:h9?Q7iAK/}G8IYz>Mz ļe|YE>:k<11uѢ40|] Bkd\sRbݔqyܟ,FMkJVaV\_h1ȅԾz d\Yxsi"ZoaqC& R[+ X#Րe#NÜeȁ5Ld TJ{:Cr Qmp10wק?Zɖ If}YVq fƷn2(g+ӄ2%DZ2~%5Ο`X5\Q:^4K4"nPL"+ ᘁk_ej'Ak|U'Q7 !U3gGx(_M-uXTJ*x2bT(%Q*9@tP'ż]κ!6%%bY /hQ"w|gmQӢ+L~oY\Ov+Uͷi3&w&ߌu8pU$+c2L5߰wr?5EjX}>ǕHb\C+kӵm0Y^2d<[z=@(?gPḮW<.bjs+zVZ<Y䤢ԣprQy$bMpbxb=Je==')ݯ/{^Qkԡ| +:'*ϹeM/jθ_E;t!9aI[z$ՅJk xw ^,K~ܟF'÷p󲼜Lo;\YtejLP8e~~8)4a$cT=DUjv$i6/ & Uo~ϴÿsĒ!ZVdB93nNHcTNve^R4ȓ[k@Y1Ò2= Ji@3pyVt3pd(Ӵ"<]SՏ/&}HJ'p,X22):5ěժ?;v`> hUӫ[]|\dnQ*snYC:V}{{F=7 8aUVpɎى?]^i&/&>_ w[ٸNh2ąKj0-AnL0 fs]qC>ݤ, jM;o 8:34 K%$DG}1=t٬y|xFu>Jk'5.%~ilD۽E< [MI\ɮhV^o +ƵaOZoN$򞀼wiݞ%`0CP7#dqh^;ʡjYO`"+< кdz!X xb9?*R96V ŧ6~5!;W՗GDnYbSN143SɊ$B{ۆqk dP@z[8s.(jWv196O4ER|w?lq=lSHwRߘE߬K8y50ښӈn,f 5Mo^F+ {Cm#5@0tL Ҷn6>yV+?VKR8p;]DNE)BψL-@`[0 @^h)n쒐9rLԁBh3/F%tR^^2 w)y$@,V*9ҏL0y!冷?%vM]c ltdۙmۚGWna_E[`KcּݺSp\c?!9ߕhf=oIk)MٝirrƳO3պᅔhI?ɪJ:Cl{.׏.ZVMe-VNl 8>EUo~+rq; 9>+`kY~jZzk_ۖt%5S_~a** @e40EwCTo2^|S9].%giw |  }RsGH} $ dАkd@)DϋPd3!RFd跸mFG fwҬ{*,|`p)>E bgk?>/9:HK_FrȾ"Smj$dngCg2mwͱ35W: D4xϕƩ8mʛɊ+j9ƭ(W(Õ:yE7熎sx"LB(LF x:?@d= kFB9"cSv8^jЌza0=)?#j؃ocSmFhF+ һ3'$Vp# |SDw2볉ooM Ǒ8]ӵUZvu䄻!EМDyŶeLy,V y Gbh&H\y߁Bl2PCz&e"nGW8 Fxգd-RozPV^U]*' oeEYp)F\m괈g^2qi^E}gٰؑ s"1ح0 C\0pNL; )i 9t=^9xo`9_Q&\NhFV@q-72,!Hs&~7_EȚĊۀ3svߏfHK:6Ah,~J+Z᷵PGs7g~aJ_OkBc, ׂ,rԲpj弦r|[e6bë]ڌOġ6A/??Y"u43Y8*33&MV .Zz^&Ğ Ag))l(*XwI-t`~A jb˔5Yn;8.͕ɋ%hH}w$5A{W|Y:HG9Y *4aW3K-L9lhpe$lUПD?;hwE~(K`>O}yy -8_ba@W26tn3u#Jɶ&gCλŎLQsj4;*JM㨝 rt1Gfe[@ ]5 hM4࣢YwqDEKZE{|k0 +ǂ[b}ij;qʆ'>K5rG&9}1HRCT`v~zdW+3mTeٹFH׭6`>߱Iۦ$$}L{CWbEIE `LB {q hrgVЈrͷ8~9Sz(dF p¨Yٓ)47 Ql-S>Li9-:>Yq3Y'qfOfF7z_H-~cҪ[藴?@2⥝x3e8_#@Ha5*o5>޷Sv"!#=e,re>x mѾ&NY BIb =_۫Kv  a9h\JvAQYF|Fqh~GZƭFy h>.ԆbF0iSVTrK]Ό3ih<}w_d} qwcPfӡ`ElhuHt#Izɮ[3k-Sd^h44*?w8qg:*N41uGQ23qTkb!rp>s|8|^xD0f}=h3Amfd L/"晥9)Vp( ۀM bVRpKu^BYP2eBNņ84-;ohs)85FM6"fu֗s,|C$aKWJ93y,`pCv=o=lrV8:czwZqQ m*oƈ2 Ma*a$2R Bp؏;+ ox)4FKENV!V)S(Mk'Vɶ|tp9o \E G'cQ)#}A)/nb>=7 n+  9Mpt(] OaK8eUH#$L~ŁK51u pEj{ې[!1u˄zѽaJelƏe^ī4ڤfHdFǸdZwFKɝR:MmM+AI&S+GA,ԏTd#Q[o4/S;wb%? p%csn7\f ߭mn Q_d@nY/KI%Q.J{)iĀnt ,XYR@hRͬN:2]d-xҰ5ajo-§{4$D3C$9X !A=EƿZJ)Pk/UJX=c@b/4(MΈ㊍_9:Ri/ @,;VaeS0i"1;!*лs4RzM_vTvV W4 vץ 1Ǧhkyp^fl1qS$~4->10r܍/QdAAR~mZGdN*4V` oķ|?&E G8Ϛc+7#tE~E?TfƘ/jCvG6uԜXvPH$(3bLphsTD& 7.EmO\a,*۽W†Kˡ Ft15S|C\3uДT,?%ݢ횆22>X~0qiw@Q!Ļ; nh0+)z!5Y<ZvkMM4VU][|͕IE=}[nlKExI%=ˬſ߈l₌gې tj㩷f70v/dSt2K( Y3 5-2. (o>–O Ec0)?`VKU WyG%*DIfŒ^B_xh>1zml &ḧ3ͳ7(ok2eJo+Q)rl됭!ԾҰh7CysϫROS>1(= ˱rgŊa~Vbi֕E:3ʓvt[&FiphҸ\Afdg] hju`4=Pbm'Umw@RJ9Vv85cKfk}@];]Uf&&^ X<cp~ncm{7:X!(+n=l+I2o^bѢ9T玽# : Lɒ4c.F}z&}3kXi8tp8Y Bɝ 2[x\?+\r?or"-5Yi%gtcY)~\?.b7RF.QdeΪuƵf]pH@GM1>ti'z">坟NLoxn y#;;Kߓ^]W&i<I/{)3k5o w}#܂U@5GI\%j7Jd%BApŹ?[L-q}Zc/կ14.&Bwh̵y SK ?pxgWxOa$8R($ڝ|Ǜ"3x"dSEJQ½0`x菠W5s3*aSjLp}M̮.`f l`N t1-<[X?-lInh¢p"fy~ U ZP-ydG` b>[A`6)#{]%ހ-t%?5$/H|/J s.\i` {oqh`+M_Mf1ZQ=pM4dZkux>8;Jb{8BscVZXoYT.rLڧ9 :1քU6k캍nS1'Dhrc̆c3#Za#ׅ;y$w6];WLtdITY `9W:Sh2yLirAS߀ǙF55fH^(_@Ც4| އ0q|Nd4U#__zN }T4ܭ(Kʞvg >ZrM#m)rJa)؇OӜ'陏<%}, g?$٠H'2и\"R3^ٴk̏7\ T + #m fQ喇C;y,+s6 *2Ӊ̀WG#Z#e@v0{\;D~R\԰]/.g,&Ms-$UUwaXB+ՙaѝ`0FKxyri sLcҴE;a>A:^\AE w9wl,Qj`"mh+s-̯惮꬙r;]KZBjPoQ#MLPTQ`Mmn'44`. )HSu;T7~JK&ߐSlEl RyV̰G M2^xD7mNxFhF7 o "4Si7O:ʙ3p(-ʟ͉A$~6S~(B?ѰIT=H,/8]T{δBgs42\}9 L.M-qcR$C M*`Dy]$F3*!n9bV1aYH$c'v.iNK,?u{y{)zNMqAO\hZVq7giʭ8ϪBrm}8JOgMh8 j8;<=&\>rM5Sup11>%!̱ЬI#]=joxXoJ0|q4gf/@`[(s΋*xW/_wla#9U&Į-i,"Fhve< z _b>Tk@qZzEOZ f8ya̷xXDb 卬k_&q͍$~ 0M%|߼"c` _db-fz4q bAGqDp"^5ߞ$aOogI4{0 @\ nW3%!9}:<I`U$ 8zB> >-nW(.'Ү_0(X+IA*K{;_)8timDw@=P2䎒1O&"-P#QFR\"IԈ92rfRn 2$נoe6ihTJՏU~U+0׍uPLq {NtT;-x V[ҳ͕HPS@%K{[^+@/fma~Ʌ>zI˼ ֳW&>FVQ;ݢC-̆;icVFRzDpAI&S+,#6vr癞\zn?iaI?PSO%ҽ:RQkp̳tJ>seW=8fδQ%2(pR_ X]8AZÏeEVfڳ%鞇0=;t׈t +hXҽ@4resi8Y/!qR8E(:g$R˂SF@:9ww6{j: x':,g,'hBj{[D.͛]\d2&S 0.O!W=\ >bm~u/yߕ 憎]qx.[)) {"?(0'`UN5d2A-1^6"Rx.Xt\fxV6B$yq2X7Q  s$f瀷|nT$>R~12Oa[T0+wW3\`V}Le7uժwQGZ`u8 ϩ;\Z衕|Y##Ć ܗpKt^k*wvDod+V0x`8Aaf`C䇰sb)_ nccuR9>~$ ezd|ڑtN2n~M.,V/~-y K6Pѭ`-QڐXoA4H{3Q)SH5qj.n^_ayFDCVg@)B\@NbiD2,n\'D;Y'CV8 D@AeA\^kda%7ʀۇM"eo&bNq"ţWvݯU*_w>p汰-j&̘Pk> dz8>{' &~zcoO.?ǽ)mߘ3yn׃#+ _w| ;ۂ=hSrŶ&׭d<5sE' N$7&~ *36=zȏA3M7j_>09'nI5^so[Wp~pb= iyuJ_*`ί3eݻSi' m`~Ll/6 azR\!6pݏ+`?qb2!K~?UGUV*)t OT7V7@Di@pQ #(Ӏ5eK՚;oܟ9$AyȵO#[X5 B$rW,l[.WBӥ S?e!]v&>[`4W&Aƴ#/I>M\ˊ4њg2@83R+0B);?S{ &ulAWq4NYV(02CD[,6߶  W?x]/s?8 |ؕyK#Ѯ-قyI)-5ԺTVѦ<`*`im>E 연0z%V˲䶹v r&zOTC&YXm$W +đO9CLѝb7(ZȏCw[=aPDzͭA̟)w2܅2b LhUVF󌠠_8{qSO69O#}%|vE0G";?)dV$~D G$TU:l`8N_|<?Xs@$xyg|c(@A7&҄i]dU E\yKIu8acwvWM}8~e])?ӳ_.]e" - (ڊpp$r{:Kf;*\nX->,~|= ل~OpLJX-$!ކDőM7&}bp \T>hE<#.G֓'tX&hOTq@fHLr,dCWүCeYJv4SY|[̂~q@O×}Z$Ҏx#<=wf` $֜SkLI+N^-f[*9!9S/ÿ4uFA͔$fQZxk LHx!A(zmȩ#G²XgC׷sZdi]Ų۵NY$߿ Y7B]v5vN_>(|T]o]s~2k^gN* xC*A3,c Bf{gwai>D;iWwa`Q5CCMeUo6{^7j-" Rv}^]Z!YBUGO16Q{4i=mBR`SC`,V~|beI;ϗn)UH2As`?B󥀪vb8*tR/:JrtzC)ôma5&?Cdt/!DA}˲ lRlD:U-k13!P^\~ORp_S+J" ezx{mi|0?R ~'Eh@(,T>+8+DG2ή|7ԭΣVw|Trmnā_t~j:9mbB)w!87G )c]aZ )z{ $Hk,Up.| <+Xf/Hߏ-lq{C(D)x}E耐\L/'m O~P3$D 5Pf]#E:Jn. s%`*5f`%$]TYٖnwB2Ue(G)t)PR Tznot !ta%*x{%F3284d O(#Ve_VSCk- pE"QZW@QgD=(gcB 8c]M?"5`R.@_I'A':{@HLk9)r Ţr,]b(#εkƈ'&_F (ny{riWb~x4?̖9]-aoho뱩Q{^:4 rd}n_ϳ̛ _[{:}Xzn޶ m (z>͓Y~X,E8,90q D{j")iRKȥԑ-ʧja7؍#/.R TʱK[l&껡 ?/> :Dá_ٓ|p^ZgRZ!Tŏ/ZKX+x`1XгpeF:T/r0N[9;Xi1P`nKH8.y̩}KlrOX3>-HlW_DF.KDI[%7J ;S|.Xf[}oR=A{o7NQZ>/WT~%,ftR{K*B5lf}HV58QF!,c>y)._Q Z*)*ۋ-S#k࿖!L) (Az&*C_C 2p+K?:є~6Юx.6 \ϑʅa^Xt"}U>2zh Ǖ:U^gbMD8J;Ǔt SCk *::YٓZZr+c-<_7bFj [u(܆o(RɦCSFWU\܀^)~A߼M]p.괘Sdu:oAX89#l!t*j.QaY83A(d&`>$fi DE)e ;!Vcbdۮ?ᷗ @~8˙6 I F Ϧ9{I㩼_G.& 0\OFJ)rYχeEgb΋1Kb:H$y614>; eg,}tŷW4&RhEG~RjUڜsAzQh=νST~\!{1yH—"+'HǬ_FjVWL P^ɱw[aUM; S|ϧ SݎqשBvu 9d{NsKok mk`sjxU(Ke2)Cg6M{ID)q,8-7Q89شiݴ5R#S^c{{V@.}=-:rxOgdDm&[cy`kqQkYOCb^+4gW',gf,!;FZQhԭzA;$v"AdiR8:Z)r08:ΤTxi׉yB]RcXђ#xH;5 YS\݌I`7n2Ǔ;l cS ByU!NȊp,bc1\Y  Dϕԋk.-&>b` ԭ7u} Iz ̧4(6YcbԔ HJx|kz@>xHgX4WZ 1=}TIEv[F{XUYԖW:Z'xS=4HOPbA_Kqb]`m;= P]Svg=3h>HC99yѷ38؍-ecmDU|1qN=|a=QK~@#^] yQDl}G,_a{E<6#yMJyg -Ѱ;D('vi4?.E~~]z|3wΓuqXgq_?K?XP ,́V{-С Z'X[-89α=U[Ac4at&z⏤*0U1yV;DCp}C(Y~ xP ˴r'x]ѮeJoR;_E6kU^w҇CZ?Ŷދ_Er \੫xۓ+*s$4_[x"Hʸ?./d' &Rp? $3]T;B5knhfMYP܌Yjv|ii#Zk$|Du];_ġIt] 4yOk,&s NV;'!e ӵS͝yюŞޫ3灿ʈԃAnƬQ~pnCƣ4RO/ =,_y $-h60%M)+jk ,$ޫWIiF9.YAْ=V*,3)q,1mIk 0WKNbN xR9tG4[ a|ų'JSo˚ 38#> ɩ.$`wT#8ϭIu_)yYgg` /H@& /t)$+y>-qgX|7c;w`#\ZaAeED P}!ZV mw=QSR+mMVA`+Nӧ?Y@(?ΒiQvn*Qyh{s@DӵTB5~rmȘ&[D2X}Cee2[Qxh=d"0-8;zw!yٖ8}p% #% );A=-W bg$łyaې9b QcVBjA(xo3OӡXF:8U`9  F44"zMff:uv/9zG|yp" tcR@G}d~bnQ wez1l⓮@=Bɉ{=]BÍ#8.7 ܵ6a,zq;"5]r |,#%Ȃdhg]t"BӟI;BX *G bsM AslxTǝbɹ$CSVgv2G2!(h5X.m?×UUC)i>HcךO3k?XXXf"q'Rj^j_\9rh@YjD$^) 4.m[ #8w=(]?tVMc 1 ^X{UAqCX5r澞]l3v@} 068%,Oh`vBP4ÔUÑWW6N~' *J+Fyt`iu((KȄ!"Abcga`̡t`u19U CNPɼ N\_tv9m A0H-EL(j* 1%UԩR(Ovl]Qe:w*.M.9+{{MJN;TDqڊy B1„DԲ WB >NЃy9cArvM(tWo!HTJ>KO߰{ܼ XhJA*Qi h'=|@@UB4O\qlsvل9DNDReU3F}ؚ;gAI&SA_I}WO>!uyLkԴ衩hM#ω%DNmSAfn|hTUfMG%X9 :*('ɰ-nw"j ta*6u|#I{u`g($W+L!~曢O`:M4)Yt ZmZ_ȁP}}(u΀*㰦bF[J8՚vWZKGx aTZLWtѤf؃z$Ww(h605N5R)i5 D3e!]9Obs,\MJwpR ٞ%>^90)E%Jvtƽ(|8Άګ_*OsЪ$4;YAfR|!m_mנMg ̲O\4lОNeh=oȧئBRxT6λ/ r#hIIq+`+ 1FyvqPJxcQJ>F.|r4*,12D薙w[GZ  yfc7h$ f$.f~]Ц9Am \يX#hbC$}nl-6i⤽'[+,ynaԪ,$lf"vg4дk95qBT%C~X3ґnNPҝ\5*:UEV|* oLG  hpΜ#:ϣY/T.qGd^6\s]&+vPB;;痘 Py%􆦗qM,X*Kg(9'0uu5:\~XgzJ<y?ݽCcWީ{M{_{2DG@&ѯCU݅=fOq!%mIAQR:)>Jۆܻvg̪g-o59HoCi{Fe΂45//R4K~}G"s۫S4'2ReDR32OJJ4U5W)mIi7;~x9GK;"|3[Jib,( _3aIl9l,).T7UICbIxvQŭ655b*>`o,6-6 x>'fJD~pW" G=T\}~C6#́7+)-}y38Wyn+c}PeQ62W?`4^;&g#pR*;ao~C*qnm .qD1T cizYRhr.X=CB aůW,H 2{(nbJ6 tQS -=5O%5PA jWwƹp؉@Hg9M|zLqQ)\.)VوJ:t]b=o2劊7Q5ϧV;&zsgpNҒr"pvxX>Vڜټ ccpJᇓs\o YD-[+2\Xwȫ]7(<6_kA. tI&o⛆SEJiFqC4:Qqw.9zƜ ?'LtzRw E:+]= =8ХgNͼE ?(Fǖ]t0$^!* i ^M8L]ZeLy 0t։>8h۴B ~\дO=$VguנlmQŁ8|r夘xr %Ez,A#i Xg `f% 0h&;=+$kwvyօt(o"zb2 ?soqV!ߕ%7Jnm~c.v#ѵd]_]_+5{+n("TL4SF"kv}9/;<67\Ȧk/ENnsF,I,1d yBY#__RXo$pH3Ć ckC8%kQlniĶۄdc14!~ɾ3pp# t*r ?T[tIiYY&nڼj8x6ES"37S.O)5Sÿw܄4PTY/A\dg-hOηOJ6h`lHƶ7\WyLn~Ƅ5"l0|pnޖe}.)TĜ4XuICuT@6ju{XVZI6mB6nxB%z?V4R)RnTh3o7`t-gKN:`Vµ%a.qȉm?#ff h1@GݠL䖢*^$"fKU (_\enyID1*Gm6b&OT_ +HIFMmOz.SD9 u}XrhXZOnDA-kq y#Ia;X ī.(*h{"dH+Tc-!a^H5pxZ9Qk!SULVT̑PJ~US×]mVY[ɢ!2DR\~LRzDSG i*I1R^+9wyYO=ƪR5ы. +*g)t?,=.D܁f! ,I]SҲLCIHvi *ssq:08(Lt% pdN$eP¢V08BH"v^}3-N*wox=,߇@Ywl=BRyuα!S9Y '_ vsjL83GB$*sH}i;u>:935AEp檀@JJB5۱ QFjQ'EvB]'=; L&.|"lCc,bzIđ](:bp.;#q thG͆::6d|А[ eg[! uJ;{7fȚMQ :BR >%-SWL<L&.ȏϹ*OJ#ևٺ8rRK@T^A nEt͹|fٳrTy9c(ek(=e&F3%X5+;ޖr+Ӫc̻܁D 6"S]i gb'kJL蠊H RH׈\EȚq'zlYa}EVV1ϴm|mX"ECB/jߖ~݊(:μ/G艪G{ԙm S$,~G6SWTp=szR<5Sqf\ءyӀ,% cx fd0}vAgi;nӑ,YH I }{@|mdIмaFO{+d136áHX3U+msMjr"͡{jl"quXRmFe-y/tXI6>?mz䂺HsS-D7zٟ Brz 1~x7 jalz2*SrMpylˇJ RS- b#-8*)ƫ .EZg*9)097I\,\S<3B[dҎ3p{ʺ|hT@c3R2w9# .lϊ|8_KU(?SjȾ\}Y*IZT s*&Y,J^2nF0(LгPv#U8: 5;l6gL zcH{o[AAit"<8(K/M-R(hP|\Mb\{ /wX~ޙ%mt=J08µE%=L |5}/0۪+6tim;#1.;VZKqi0柣mZ< /LL61 -ȻP8b1JF?2 9s(wo Mnʨ-^R[M+֙bȎFƋEE=UCadZu3ʻ\ji MYnv¢>ϧ ]y\qReܘތ/‹ST3}YF:k^s7%ԤHNwRvL5' <PH δY<^YAިeTr9Dޛ'jK e_ԇzpHVkS/N--,XhP/ }>2|T/C7]) fl)Ov,#ǓXEpXcߛLMqYjG3&f&_MP_X 7o+Q$PSWTUFŽ̰G Mz|v$b;q)41Bo-&ޙ)K2m:P}[6(Y ,͈a*oҋE2{Qv nSu-yRRwz +5.)negWC.}ۯ.[dpDm\,%Vљ0B]%0X$bgNkakwa-"\h`:EJd+3z$v38-lXWKRfnЪ> ?TcJmfnڪu6 j$]yTD"hjU-*84)_aHⶁ))B~+ew"8fAZqkKR,Pg=(ElKl~MP =ܡ2+o0~Dh̴%7SV؛y̰ N1x9 hL^QcP'͆c|]"VӥcFyd ᎊo$ Ñf ׆ Vq͞=-$T0 deFȮ G߅spsGK!HET8 65fc| =eLA,=QM Am-MUR2'l XEИ״e9ib*c[]SC_H [P9ts)puWz1@ӌȱwA3-=#Ǟ݀Cݠܐk.ÈdAVڹE:)@sf%| nh0\`c^OCmϖو&2MͽܣX QpHP.PwRǥ N$>Bt _>Q" S7;P6.(S6y\ 4Wˁ tXiE&_De&A )fggNx@{LI:U H Tr?ʄFc+riW뾢#@yQZ"IGRS#G,à9)2nϊO`Cb4㋇N 0p|=NojOt$ {UґEΦxPOW&D:t߫)AE^4Øwq6 "ЛJ+J>~_+F"&.@$/%r]*dҸ|11=(lU&\M(7$ezy߽)Rd[` -ϖJKw(iDu,>)LƏ[ү?C:_ߠSj$ 8],ch2VfI6/;DƬ6aJ!}A {utl4ƇZ$eK5*lQrJ° ^^R岲I[NzZ!d*>C2wc^?%KxRfU21Yx9epqZ߳szKO&Mtc 싡0/?юI#lH)2yv7O#n*| |[&>2L]}/ʋ&< ~2ғvy@R1IL7HFVXh|˄{G| P$$>mCuXlq;w!݋gxpcjm.}Q~,l23>I^1iNB3Krjyul>u|Y:^rC(΅oLz]HDYb͹,}Nu/:S:\ zc&Ĥ@q*X<:-4,ɱ916"AXZɬO=%.nRbxJkq᜚Sp5@ PPdTs12F:%w@)\9=Z [mtGsASI&S3"8˷huѨ3\59D2 oUbMp&r] PF4=bG)\?{E| uwF[CcwNIyc.I doH=Hsd$Z8O8 Qx]PeN#YR;g@T'!٨De]5mCfGv3Dͻ֍@Nf1P:-AѠИ>Q$to!-nAU4y7v~[4^KTa%gJGc\|7B?M@K:q /M5LJ*qb;fh(lnǂ$ C#$/vΖ-{SdgAb5Ɲ#abU.6[<O&GOUĝ2:/ 6p9B.F SPH/"\E4FKQ7{5RbZe\e?&N!'&# }J2i=9끉ַlU{u~󑌮ɬPl"1Jef#R~vOy&"huJr$9kTN3~j[.pvh*D'xP EIɶTixGxK6ЙB{wW<-ulJ\ZGۃ Eu$}H=eð BٞSg[Fz-'Yޑsn\6ǎBe|`sdn]HwD3W7AN@6q}{`lS"?M~洗O$i̥BD)Oq}Çோ:'IA4?4. xmuA p {*= G8i=^ihdKtUޢV<%kfoF)(f)n x *X\Y[GY+r1 @Ɯ=l߰X~ndxӂ'}r]jǵu! &t7J/V'9/ Ka#B\l`S>}*pBuS$ʡfaEZu͏;"ɚū@)QUem<=@ /KFDb{M ᪡/4WgSتj$,Zj7 M,#k1H8Uq#};GgGM|Tv #c-(kw KoڛɢYSOo Q+Q큼cAȔ2Oo2$aoA&N.rΤ5 }5@s2#9x$d1ށ,;@Nsg׷'lF_|C!}Wn3g`/FD#{U[v#I5mdT9EN_r%Y ~p!;:)rV~ncy]~"IdVɷT]WusvԅU— 2:56DnDjl0Z&KAW ?g,YtyMxA֐w8&5b~(iH>]@Rg4o|>M W#Vո'],?AU/O 67LC̬_Frg_ f\:(śTzW$oQD%|Gj/8JjC2IX项VR{ iza%:1J}8&K>nYh^0!ekaE*GFoBOk_T`MW֕Ag;;3q``'M@s3u}plؒl$E6Y@2)#}D(y?;Coc.i*f(sSbeFb[|Mx3+ŧ< +yat„+%ËGJe<:|Rx=KvDXiX~/(͛NAb _3-Tͱӏ.ߥLhA͐D H#TYJOdhӺf0*y-b:ZFTɹ!oR. 0gT7LF/ݚ̶:?}*pT."}lёpBGXUHl>7Mܚ%Vę=2 NJ4kהWїrlܱ!?|v#h"Ql=_sEE[^S='@gG<>[KmMz8kIChSdR@=Ra5Bc:ѶҚP bfi,Qa|x@rZ~Hb S|~ )V*9=^ZO)g UV_'SVkϰ:w4)TyځXqVMHO{1&DV/nXe~Va#;җCQ蹠j A!X LTIߗN+}ܰ#6BъyZ@OnnS>n@^ ӝπ @VNyz'N/^[a v@,!>죺ߐ^AjgenLdf(¤n #-S>le?Egu\r[r,C(t)|ft8Ƨʼnar!Ǜ2H*MF[x@L&kXr,|tq DDK?3Qm[ N)+ꭃR2F<[](Gs1u~#LB&t2iw*΂=="v Lb%] Fr ;E'ZEG*ԙPI MB D蜫?vK)9@kgEyz#Ag٬'i*C6, 3@J^N& "&`;e5[pΓIeyLTMCݐYxPj٘}]Av[ϻ!-G*οOlNr:65 i,hkTgQ$$К|aФ52Bbtd} IH㸽|! t?駰ekˤ4i;G: Ȅ2g:>ݵ?՝2Y#.WBuDs(Ȅbi&Wq>N!cwݾSKx+25Gjye)}?E&91b/dURb8D2E,&LX!ݡqJ:>-O?m<7"Or4 z@tG~MGuόya}?YpE6nb% mDSSΰP#\{$#fa3P0A6 F3x"x@Yp"~x !-E ≢[%  `nIX2L5ـc\$̷ׄTvx|C~[̱hkB{ߺBO U_3bOʴ_aE߳bt2<6?%0 pd_߆!%Қo)Ť8l.~x'ӈ늭C ӭn@ ۲wt94- AhXN>ι]JZ% Qx曔ՖOkUa3Sˣ*Ω $8WI&<$("]CVĻsAi1#pÒ-o0 XnD <"arYCHTQc!Y mn$EU5ȳ>h. 90IϮ/`muěDb\.q_']Y^@jvwt- 2+F&jPjVSv'q#6OYE eH> ZFgkfzwSL>a1~6P> LJVu1XsΉE(6'ؒ)Z>b"*4ٌFTz}U};x*--rl:[[,YTu΍U?gsܵmEcc?%qzhCO ciUliHn~T$VI D6dL N/b{ƌucqn*7+?clT^\-NYkiNCP=_+ 9LB-J>m߳ED¾v0CuГHzMN=avn~A#]; )3>ѕ\e١LXR5%!dDP#8]KE;,**ef+X_S[SJ=UGI:F2pςM1^T څBe5R,Mg#pl a&@!?{Go  6hx3z/\YROLJe<,$Fdc+3-T}6K,QcK/̬eTjkKLAʄo2kJbh\6{Uʁi̊\v6تvj|E; 鐲w䒍^V͑uX'.8&i@/?W4NaNK.V[l"$ɜH%H `vKB`R"Qlz*4u+w'xpp@)rŵo3d Iȹ_yq"E)KϚټ4c^ C@"t:8%[. f"s}Fs+A[kleOf%US9&] 3g<OE:3pOÏFBJ7XŔ;E:Gϥ|qFH}eonЋZ|oҭmP"RK(T)=cr*քW횝:ΞxV D/hyQ:K8=Rt~>ՋVcI&"=Od[RC/$`t~a)[ytc"zS ]x^Np}&TMYHee55Zѻ҂&w~Q ͭ1-񏛲tѧ?/{Zn!io(̍FQ2K~E,Ʉd@6HNRRC5*]MeيOl-2\zR oq]s{nè0.ڻ8'gi=A`JGW⬐1TdeDž3EKWMQ瞥( %.j̩ 'H1p cQ8\^wct,j28b;]$mfhXžUDdϴ.KNGxBiD}R#5NFugKl/\*.|gXKq#t JۯGe>!s12⽂,y$>`,V-.mhSX6g=2anMjYQ>@1?4FL`!o{ЊwNKo.,ݟ箺֨a cGjkoD1M_[ #6sjW/bjQiTvObN_s1u.0>)(!<%*PHe0+ARm*nyjL 11R#^{n5'iupM- .'X-Na;+n򽔖AKEا^J"x־ ԡ{lF1c1*X扴Mp_uY,?3;jg/hr_"֮[|%d%F E­:&c?(U^b(PSg ڶv[sig6_ JOsݥ8S7dw5×h,#XbyCReQ-+kTx[|"|$xkJxG>`ux=As܅lݛDuޢmAe}vi$ϪAHR8gRyR;BSQb{{| Yc(S!y; dO%;D5ڈ!,=.k^ă^2bC=K!2@h_f+%?}'K>Xl˒K]Ek7vm-X;;^8*jq|?L|Ȣ{|"IoP:,8AQdW)k؄,epÐڝ=G[A=m l@>ZМ)rQ ibyhc:AH75(۷מ3eaOT[\5~tP0@ַvnenb>Sɂ8Imo8x$v$&A"?fhE+u[ B®Zً?^u\s4jgNyuHȚ /:% .tן@]YU:Fd0Ҽ_K}0r+,h}_M~#57!0kHceNBOG&ţ&hu*ơ$X瀲;5o_ey\,zʑ?x!sbe(˘yi'tkH{5}9_2Kbc :}il^AhT$2Ϊ:=J=Ɵ c} 7j 2ԷEU]p{xByDnm."[OSw_42|3xwdeU#DE"F#'C /svE",^Kd7d5qEJ ܫ۳i1ݶVMt G\ZW Aׅ8Ex*ܡ +Y{sR@-(-dG(rR9,OCBZa걄EM\x'#d$& -9ژeek2-w+ dQZVClOErj@+mU6+xIC1DRvf[Z[ʹ=KZ !QarXU$kՅ)3!wIqҨt4~' b}|$LCr5m,fBy^cj c,`^=:V]IX:!9BYaUsa)~Aٹ`y94rE;е-N)Tׯ\ AϠќqw'ؐpgaa\91&Z !hP Q%]5I 1TT m ;6Q:+f/fM.)1Z4aKlW(m{[ǯz4g5nsK)_yWp[kF||9Ӈ0攄utԍKupNiOL;T69he+EadğӿװI4f2=b0L=V*D[`dVuӠګKsvǴÙD`-Ngq]#9+Ax{{AI&S#GK!όQ2c/QC%bȹ|X85k>+#%DL9Z|o9JK5=M>@ A2#πv tp1K@9S|'OPS7ƞ LwT 1r^b0zJz 6$ WvO۸"f3pfzYxrq#iԙrpPԊA3 XR_BCյbX91 ^*j9|0oay ~#16-qI,]Ky~kUe;h|Y CAO<{t͈`aQS6cpb&3d 첺oߊ'ާQXz[Z$깓5 [owF-($`kLdܜSve82W+u-(A>[G@QSCp# W\eRy PUP%=n|ȳvW}R۸4&uuqudv&x4*hb‡klVRms[yeC1&;mʥ.ӟ{deXm[: )XSw1bZ/Web=}Wu)nqC"Jl:BYgh e|7ۇ-aigDUoJE师EVv;| ]/I"lC>sz͆(HH{Q۸jN-ˮ))3;Fl& hY2F􇞕^ IfJl"cīa kޖPvZGP-^a|w^Il>j L`:a$9tcffsV#$]{F=zkh4+ u-mP[$ t !gНԽA﯃%a3}dпV B "\ mT`џ{+eO ZaOx23HQ? <Ş3d!Xw~p96aZMF%>YXKZ4)UiAYcxiP\\bx|*&s(U)=V )y:vЧ lr_HQg c#4.8 g ۸L 6urzUgK*\-%*?rCb$ Tݦ٪{ Gqv#gȃ`@gk +FooEo ʲj eξyk681AQ-#vv_F`sK}m' ijaK4lbXsAA(Ӈk3ӹ-"6<|aX4./zU,~1ڷL\:Tdç5Q@cLҺEtӕ\x_rTF$s)>ɎF|A24eM ^-@UŷB5\ߕUAF:.,Z%fzDuǹov=]Z(/ p/eMT\U2> (F1[g9A!d~v Y9SuPSRRR5Sr7ʩwgyv+p3CU">ee*xpm[ePn밇љW}X]tIBL5 Dvě0^ _@+ûڧnR#[EQ.a#/^\y*@h:?=<~X.5?AV_S~YUyHZx~L5ZU97;w]ek̥y7D@P6D3迗(߽ kYۃb-vB$8Hz! G-ի0CTf( j mzExr1DbFTJ|24v]b_}\^:..3G>N@V4݊1;Ff'U3NTÜlQ@1z6bpps|a3[IZW.!#3Sȡvz`􅇏Ϭn~/ нYSl;ԧhN];V;(/&<6ԮG0x=rsEzwkEZVe\]۾Tvۓl-lkmfzi XןWQa;&yJm;n#ٰX_>ܔ#uS%8#û_pvR?(m K L>Z#_h8=Zx[cЦfv7'wmu5d:K~o[k"އw+)*x(H(my%<ƟR29u~taGf^ߣIs~V%J@y 3"b )i 毉 nBY֧Ngcg1I7Om0x>{.E`Sha_v H~^ FS M [-y)i?kW23@z1N=nT{UA96\aeEU`64Oͺn- 9d2 ]k^UG0/>nj[NqrIŭtH 4bx5cF:;4R{ dvuQ9VgԢ6#qc?ނCۧi,OFt_2M8-M{Rh3s ee/1^jO162:ȪutUȇu٘h7=0<_l 3&v8xc֥cH%} } U@ +r5'@5ީ K&[҂g^-I.q@Q z3,7$FIzX3P!Dc^i]?Y>h N˭Ž{~fMIF3e2)vM }Nm(M/~T`0ѓq sMYjw!xL[B ֬M/.P..)QsYD/S3+ʦZ9reGzDnw:/L*@'8I϶=6ưyp԰%jI@\ߞq؛0uv,2CDLOYZ-O'v &}'EgM g,:ȣ鬉_tQ9 +y,tD%5HeZZO잲2qd%حJ&Z.yot.!i$u6VѲuR^5H>qgֹ٧4Tf#cSF 30I-В hO`QD kr.plvN~aGևHW–HZ>dYGsA8gX`4|t qM]-|fiD&?ĺɥ&pۋVɩs'J+&rO*z17Jޘ{ Jh [P͎@ z90$ApVZ*M%R%Pt{\scY6ިV ҤRr[B8ʍێPzsDtjK lDH#>bz{ׇs^U@T]ZPd൛,D [XAY)q8DsH\$gw;mg4כyZ++&(#e6NO~ :fCB2bD2GIyV|I~]!7AI&SUǀ* p!2R{xu#} HR- X8ݷ؞3[C&V9 PjpҐ>`pu>.I,ʈw͊u=twHrUgQnui,$mGoYo _UXm7]t#"E{zV0ի"Kg8?$ۘh.ؕ%#b%zrJjR<j,]PuJ:3%,t}^(G}Z?>xNl6t 8MY爄8>9{Slǁa4-8cR[+KO@^y\ QM7.rA&,9G+,R^(@B\:7"K-FwsQWοR];''gxD[% qk6&Eoݦ q"y= Ƥ#P 0uIwh+tEw>jzW E=:ky&~˛ Qӯ}/#"A# 5Xȯ`߄h6PȖOq7=h.d cao_ *ֈ;U KTLe &ǣr`m:W?'0y#UˌML)]#Z_myFFc1F}RZ+In7m Jh< khcX%Lx[ugj4>9>tq99"U<o2JM[ןb - -V#ܓjn ܄QzbؕIj^([/Xk!r & R'Y3DFE<!_HӈX)w&Ȝ;t9G '#X]+wkrk~TNnS:hWrOc(cp ޒ: ojD|9dq9UHmsPurԣ~\ڿ~'Rɿ|MyDc @>5._ZT0GPi`1ke726O[> G/J,VUֺlld +6[ڂ)1~ .W3&qTζ".dwf w[pk5ʌFV>ǜ]O?{ߒC3ߡWp~f|FV]!B~U)՝nV(q\yd#9T=}Kim8\"K?'X`jsE;8':M+S;y}i,70qbs~)>80ЭӢ7PȬco6ZRI9kJOO ']vrU gT#vQuAV.5tk;Km1vI":Чܫ2a_O7W$#gMj8aJ#5jMR8 yT`kP/j w+6w S5pR~U{yCZQ0M#+6P]V_ORTdE.2V&w +>9^  cmP,hZ'a B(e=s^-tE Ջ)M,^sDic;T/I@XN:a >RVY^jxX` `н?R Bn"k[tU $oш 8c~Uk\rA%T362FNY6k19ٷ.Z s&$V9ﱯt(>TxF;qR D?boVx-rF|n 'u@A!ve}@j#zF;¯MȾ "M5 IiK_"CQw"dl.B&64Y2 lӊĩ~5? {* `lG}} ; J ]{uEW1JouG,cI);kz>Tt<*0뱿 I_n2ήxTSl |w].>,\-(?1Ix/t "uVa7BA.9&@+H4Ru1U %P ֜3P° t%sF5 uٯd&t{ЋIՏ)ie=t?HZ);֕JfNj!Pg[/9$aC8.m,ƒ!BVZӦA˺ufs^rLq J}-\Ԏ7֥`L:d!{J0* ֽ*KB@<{"}?2ʒFVu=bٜ{WSHƩDƓg>L݅Z𸵽>GkZXtcs,#3lɘcxv/C PۛYfNݿ~cFo4/Lt:J6. #L/ەѿMZZ $> g~%FO) h.Zd3ӜM\3o!f;e$Pc}5ޤX(f#hҶMVqDh l ]fۓ:L?;^90C7Kⶍu1"j^VMoD>TYrpWy"iI&Os0 V8}+D0cVwc Z?z)Ӏw*`#`0s*.=,aE9aŐlgV j#2sǮuzmәS_SUgY].q~$v,yB)!<-/)@@_]v*f=G,m@w@O r7Ԏu)rQwmDjpXj?NV@bམZ_=a+B! T}HC8bπWg=> k3V׭PB;躑1 PH,׊gvU[-Cp(ȒQu>O^Ԗq;-fw^D[mBs[f3eU\w5jHq:emrRUQ1@pč9 ܍ys$.wq<3OTWq_3 fIlë搜&5qqQ3QoXү1ĕ\_s c\9.#b>G˛iBGIj L-H΀_ܥHɢN7)QLps"@Umz*dD}?/{ɺ{.359ϻK{'kT/gi+:[,C{u?#rsmT[U?^r.ݵ'p]W.$T,PIqb )Ch3 + V6Xwˠ 5_w?!z][ߵO63Xx4to&'ڀ{{_BBp F\ׯ'{P ̝| h|Xe*-NPbVH`H#X Wt d+85/g f*EeA(ʶsf R{SbxO8l Q/ B,{SS:Ft]1B7OxsRC_wc^ɀzȖyK]!~윳zIO$Q8dHOբ,qO9CYl&ߝR13x]DUW=FMk(!jX%SۿW غ)ĉ[3+{u+z=@#|7:N<."9S,ދ)j㎏ë@?)7GE?~h)3&=hOx*3TbN U9Hb3Fq*\>яΧeqo²y`}ɏAlUZ#Jူ <<rj\NG_' !0=!w^R/w kخO uaWkA57)^\Rb8a 1r gļ(՟"d-W x%slb iK,#i<=`uMSVExReIc24`[O/d\.C \OBX4E=M_%?ZTa9%*bXUZgcͶgZ.Cf%[@=A#,I-&!:ck&ACDZ<&Ɔ?l☊dBB_@`9(e4s^9DfG~Pa ()Cn~YO Wl'~!ѡCp<(X5M&\%r}'!xׁs`Pk!45htJR[#>W\ZN;c%v]؏M?C t8|f>45}c0b/[>=N!IQ qX=€"[f7VQШ35Z$)X,)|@̞RŒ^W"L6-{՛Z^3=Tx+r9.nm[tr#30·!1G8ʆ>P ŎtW/}ՉNdRaI UשLT񊗌_y&} QI"^&B$R^E&i~ulߺa>OM-31 \yu\@:[8k8|JO^euJÃ5rޘW4VZA%Icy(Aq/Krjy6$1GM `mvρK2Fp[>$۞U9ȭ+Bm?IVh j1KbEkoePy{ I+RBYMVw5r>*-ݠڤh8r1]rJdj]Ip¹a{u![U p953 Cj/WYn"@)2*jj Bĥl@klԷd( H(bn'$r˻c(Wd-3*}CiY7B܌6,BwFpL8jvf!R؀MSWU\\P#o`f7nW*c᠍ /?&PARގ^֢%.o:V4 QJ2vc6A_55zq1:$VU &# `m$L8W9k x?#@쬪LUk<A4NEHQO7]M\To 'Ԫqw0w $z+mfYhV5Y"dR^1[iB^V#!wd1l zš"ٹNN{/ UppS v1M\nŧY|iI ڢm M,B/I\ d}?Dw@} jgUΩJ ZUWן`5DGmՏդ"|n%^Ab3,f+Q}πһ6} r/Ō躨 @3>q$#0Qh%+`g< [Zk D>7yAh6ӆ`Ѫ!)v]Ljsu- i`uVm'.$0\5EġT`P* ?0S̏hq!6,V79T WFM.: 䮌jG &7;@\L_ry%GgzECX@ApwC'w.gSbYAvZhōcKo~,8N)-*3z{W MK&B[ĽXT4$Psʮ:})cU @+1X~vAB!4N dI9rz|1qʣ$-JƘCneL\M$6iP'7tT8妜 MnXI:]ҩ ~JN8Eц\~7٨}q%NJLVxziݯjS>)?.Pf(sjae7/%m!ٴ۩;=('lݮ፭y۠i01/M yԘ(rCyJ QQep9i@UCu31,qFO)H+<@<6G fGe6Dvz(]omRyrrO:\ YJuP<33FD  /X(}x wpqZ_d$HC&@x #bbg!,8d z*lY#1ž}*F4iSQ+<\ր^!IʑhNoksmXFJad?FO8@s~/X,~*?ev5`i1>VE`Vʲ')S4 =u&ʕK25ZWt ؅#FM 91F[Bj/]&k.erSrTR?:j.Z3賏U%t٩1QhֿBDK'7SoU 00A\(F!PUskweݴ% f_#?Ny?$C%{AI&S#̰yv+ ex"~yK;T) /*Re pbB R4HIb1P(ҌѰ{d^} ygNP *J;E W 4qAJEc@f)_$ݿ:P"Ba{ܺPR8DC&Qk7@ &yԢM.m>R~:)oQY{*"9fm0 Aq:B *އ?myj- A\kڃ 6Ԏ"< $䳎ٔs:DP?U1-;DwnTJ5,C/]7V hD[*Q1t``ʉ )4=^vcc9{l.z(~=*>LFM!#|xK27U.eZJ*QS>c 4,EyZLV k{qUuWga7W0I"{PGZ-FQW_N^@Ӟz9s'MS._$.$\-6nAz{2P?B).(ԣ-F10Kg_ sUC"θcȢr((?_RQ2,y76a-!V$ c?ub:u.nHw= nt"MXlvb3F=!c#w-/o$(R/n_A1!YCAg)Til-E sذ8T|@91؇p.XߟӈCtR4 >|z.<=Q\<7 ]Ѳu+W9q-t F<eԅLإFr36B_:z&GUJ{q6,D6PqN|Jg)ɱ"hqZPN uޔ!9EN?^#&d 8.# Qe'40$[(]HL`?̌]#[͆w9* ]XX/f:n#=6:rҌL=ep%*3ml3s؊/^!=/uVJ֯3dO*r0"?qpf;%'5\wr@)ZMOЁ8xBYØl1蔩V~j~X &-&o>_fO?0͢`qdU0,Qik_IiG-*{y3>U Ύt-oF, xUJ 5/Wk+Uc¬W~h!􉕧`K<6s\k?h?ahp@)졖&,kɋb]'*rb)`G^pxUJYAk@T .?[>hLӦz`5lہg{MR!? ͖wG6pZ"^\Œ,>h0繃ARℵ8&8/ɑwM4SvϠ_yX{J1g ȜŎb1ZO_n/5$NEO}`5v>#D9)-_OS;TN 9ӼTqя:߬lb,dBh1Vy)Ma%~r*!9 #_As?^V [33I mxfZ6dNO&P0,&64i 9ǩBMSՏjYֶi1E٩b}{ۙ[<"bkiPhO}?t o{T2O1^j{2F;*bpEQhd*P"$oQCV )},áuuullKd=\z'8 Q졧D| d"h^%m?>.͉wp'uYEy luc5Ӭ㲟n13B`p8)Z|G(R^#H,d2>,S٭/#El)qrwSsJÕ,g/-ua[`xǿ$-'@}OvDԚF)ϝ/H<Փ-a!MڄoT邇3,EcJq݂s/)s+e di~89϶=.A'"s"(+c9&H~MK̔_ iA*fϘ/'_4,Gb#^19ݔLX†qr4>|3|:o M"@: }ĖuxR_"k/\H畝&n;W'RPlֆ,Ak@9z.{2I"{G.$xr}ڲ }9HKӤ\[͡UCJE4fqxV/jSSڊa 4V>(rse>pg|9X:(LYnF&Iؚjݽyq^oMA65d;nQAX~El?țK?!L\1z8ܛfVۚ7&b|nj>_f00QUN9Ƀi'; knؾ2EjOw뜒/U8$~w^&P~#IgiqeI:y`mݨ_hflN'`ņc]RJ]NnrXy]|?ȨWrV}ה[|77[ zW&3lQ'f.{IU{^g'(/9)c 鼌(0 ZK ܝZgy_V07W)Hk#d:ڱoXK>j;|6.'rVo1 AHC *X->g*/'I1;iBѡH BzLyT^!YgX%ݭ7Q[>DcӯfIce<@dwO (&rtD?Ə#BtIRhFpGXx@3*1]y3np>_J#Uhat)I(X<Ϲ4\*4B5gr k8t? >zn6%rF!(i B,(Th&;b㐚YxSV}CY(}#ci |<Ṹ}B_CCbikDk};}տBjndVlPZYTu1l@T,&'P(fRҕ4j/2i,9OdHE591v:_7q3+I*bUTp9qHr8XS>|4(,Dܺ/}gFUDSPʧNi$Lh! 0$$Icq.=@ QüK&hvxL]5L(|qlb*E&r)+ jPgd ٴXq 8`)قR1C:gVuT*^ kYFBBzfuMf= k3JAKC|J\iTa]y]:MX$$8&ΉI\L5?vJ햑X01c^Y}l8EIInztHeڍ8;,[M{z#cmfF/Қ%*$>= }A< /G-V5i9<ΐk>i\eel R`ߛA6(3S5T40CHkE<{@p\S]|N뷋3Uw7_OmQ(O.(Vcri(FwOB5NvŏD9Lu ]E֡厦GB}2x%9ߋh6*d-U'3wWE[Om]J݁c:.٤ߥavLj՗ SS6ޝ{`>kcjK2Z9]ī:Dk(Rpm.Ly0 ={UPKaLzƌl]᧵reKfB}s9赢@Nn)^)8OXm^b ])#ŝ?b` U.dfxY?鉫:Z!.(hm] %%A49a s6Ù͆Dkcxs[P q@Ŧx)n*<ťB]gF΃OA3SR%8IFvr{(QKi3Xu H%/5.=U3^lqY E^d@Ő[RFY9|$9B]_REf鈁F$nX%_h L=o^g$/Q%7hFb#ReCUu5fUEO튮O{J es*>@M8LVEȦ.Ō+w|evzU06MUڏZ9=M2̾B κa t;j < ? 7v?V^0 `CEQ~re8Nfk HKskBs`|p33?6=iOw0gUK0 e P"\W`el>8%AAo"Q`}\d8/"3q /_~%_^gk&My9ZW>uga'#:ɶrlcLf|YJqaĕ,A6&L?'@(9՞WQjVLuDVN('½4mn SA)tMMÈ:< 4i`p a60jnFߜd:5ƺV(4^zopA/.2oX?h1%FXORbmiV&Q:ޜH+NpȪp\?y͎JD1ȕ$+eCjʚ`n1 KM$v_5QKfa?q$e2/L/mIXqݲ][^͍fR|N||:6zݚ?'0V{!pGWVxQorֵ>=ހWn?ӏW;Vi{'}G]2R^Cw|kHqfN3&m;$tԕAğI"osWn`=>7'C5K]D+;S;z+km˹y;=ùoy,dIǯ[0N~F~5 ֛X9޼-OM]cI,|E9 lɣ&m9'*%j:G)Ͷ.:RVkl`vWE;oC@DSX,%T llԯ'%JP3ca/=1 f3&QGƆrYREIXZGxk4wd !K=-xNyLU7ƀ?cЛ =j qAS^(|rX"-}  9~"gvx3ȳPc%DMuM)f)Y0ǵ58Vs;Yd=ypdf M'B- *cv!$ Hɑm5<}_.fQ6:}2VJ>&)u]и'*R B"b$7}-5Ur-.ogCƧu VkO_h5YGrv"Ug3b%a]4ǂ3;t\ )/tp&ئJg] dXˉKmZ Qـ0ʺCu&ù `-L:#z p}'LbWόҺ&YF[J$n=;$ FifGO")"l+qxiًArxu ڗk C;Uoy>N4vIOrKu 1-+$ B}0ێO\%.ʈ7~PD{x*J䓪OUQς=!]+o嚌Z{j s|S9pI>eᬥy[ZBqފ-zolJ4SXB2 yGz\`b9,Z<~ fBOӎM(Is7\lO@!E+ҠgN.T) hG^\rTLȝظ'#?,fx - vNV,,!o3ȆK}3ku"sN+ˈ?Oq3(Z9LPOL1H/$T//[ ?O"$v$";V*{ѕPo$u8ҹOvSo*ӥܟx.n%dhA\}auWG;L@<&ܧ#^P;sG=#}HHp'uBlq(B+eQoAIowBI ɾT`f]$#Xe8$ c*-By &`ج[\j(P%mvwroy0Cu^.#&V{BV&9'5j*&z^xf Mw'nEAJ^hڌqaRVϿN'W\ZRXߏm/AB5n6 g 5WUh5h'V}>8v,0_47wN+6osmKZ66ks }C4Z}2l]r%p ?HxfnJ /\dDl4gsHXup@ (v?,⠉ :BAU ^"dt_|*256Kc":ߨcwLhktUM;n % R0y!C+1'{*D&_ uZNᨎ0$/Bq>èy6N1gpii-B ׶l G{X /68?hgpFsg Vy$B %*ujH5ܐgA[!D~!kꚩ '2xȾa)[l&SaoVhqoGl*,9t_FF[Mq6=|fV7 ܱGwi[CA4GH-gr2kG;*_lܚf'٥K}Tp g[fXٱMWe":5X/p~M$nni%$3V`cWׄ nWh:xs<̯mZo|({* o\ f*ׂ"̻V?9Vʏc X`T;8)K0.5bjR2c "ڽ/55e7mEle yRjߚOYMj3yT@BuOPǹ(TqK1y#'\$kΕUKJ\Ac'{ RRHf%3Z*cd0`wٜM`M2g+6E@Kpvua|BݶW7tT{/32 WINl /+뉑J{2j:);LPa}fxS=䃁: -ouF&ײ#hXF'Aujvj+ cآ ,"п>W7>Q7 IK` 91vCC_kU^I*J+Pox"2_keEmpw]8=": ͺHfUU:+WxR:dC&dA6k;PcIPuyIiP) y; eR{*.{]lH_=;\n*EUTڃ+@y*[a)KR)PcfHjãGBt@+T0H}p$ Z"kB'L@$p,jG"8>-Rg l+x+-pBɚ7H_F9]1fŃP$i\Ko|Xc@t7 Pu7}3ps={޻:U9#*yQ,1 $fCa{! u/iT52l.ܬ&OEG]̝I)Tpk+1#jatJ:c&JՈzHb8 4J _kBCӮ֘f69%Ho]F'FMg291v"‚`vYS֓r&*t^Z !gS(Ҡ52X~4^EB[7VEbDlҩ.p782ѡթe doى M+\KܴheInS !D[[8;RGDOBQh.kl9Culϓ6 ZaD:jha.9f4a`'E),.L|O#(Ir\ HO(C%!䳧x5%%s#pAI&S+ЏrQ},_9T-@0_͚ ?[e^$'*x.t:L/& P>wR3#R0 bWU6r-$T%`By}BtV*~NΑfDR vǛG1!Bެ Z:doiwd.Pgre3ܐɱn&cR  џYnڋQY+J=#D»_2V9RbބFөPߵ~9Г띐r; =?gW5 6o1&jp&= P*!`gFhXuvl0ԁ1&b,(gs_[yw@-z![ nq+,tqSFx#bM(fc6;n&UP) /ՅT341z>5=՘%* aܬU^b$L2 +:o:H: ovjJTxVOCꐔL2]a;i<9,fԪ[ T ( Ra#TVE`a^J Ax!]F3_vv^@GP<~($x村T;]qd} Y-Ҍ]#6I `[&'͛MlS}(`jT_m%kpe3&~vᗯ'71Q $T3ER/ǻ rO:'j.X~čy? 7XJC@L}Yy5ݶ2rӝI5|U8n2,Dw:2 i~~F/#vc!M6~h LLd|N1!7LKWk? +I"J'>E-*Л-+JCX*>=E|ahɰ~m9*DV5CO+'wQ.JU9V#0{l;%`5ިVG,8vA2)|<:3 P%WC2fK$5 8Vb`h؞j8}v"eʸ4; DNJju-OyocEI\q \ھڪca.3u Hk[U^;{#.$G$Js蹜^|r3Th8 sꡙ?@q}FrhZO0:٪wCr9 #Đޜ:#J}xNEe9cq7|;_O+8KDimA?7X~ \? HT2$q'B+{h3"aM/tx?iD>n-WSeTգPs̫^YUlutɭ7n.RSabo 3ّJBԺ4r {d)9[6YZ)Y՞ܘdtRNXz2#b[8d m3G?@_5Ca*"R"d0;!xMK[0(W`H8Y눔 bEY 7?d1Ycܚ84*d22WsR_s_EţF Rh׏m>u\mH]͖ Ȃkh =V[^-a%'׼CS፯uGѡ0}CxMԩ*:I'iG>^-j%IwVuQ2VhdAz=R8KSnX˼{_e`("7ܥNҖFGb?Ѫ\s&}HC3drYdΫlR(@-4ki+g1YKө7 Q3@):G|O)nZOS)0PKN%|a1 ~]C_09et,aw.5u9ĘGiz\!ORT' ]FF/ Hb[}:TYС!~f{1hTDL Ɠ6~쬔~c ^5<(՛;y[ѹPf+q>c> טvmeqt01`~]Ԭn6^!3yZcC厼вq_BޣT7hs 8ZWcA!nfΟ$W.:\!mm: kbp!pDW ӂpIyN|~m=yҴx7Qt#lDHHYkjǬe7ݣݳ*'sS:xHALFNk t*P }X홈 yXP |RS!Jy:]^|Srͤ9wF?I ycסg& \-3 f'^7? ?*b^D)}/,ܗ.Fb' j_^5-:kP2 Au>qвX z gξL0u;YjVT'Jy~_ V+ꮺozgq\Y Cu+d%nIlQRqzt)&>cpW)+EȊ+QA5f{ -,`292Gy+gS2Y̓;_;E!uG4Q>nǘUa4<kqfeFd{)Q؁:~Z]E6-?DA5NCoj:Ǣ(_.:zs,I܌x{آݕB@'0E@e]yt=tT{rĨj8mKVߩ"7TbPt`!f#n (UQNvnr,"ltuuh =9ϐV1p#b"?X[(%AJХH˳඙=6{fCt2ML|dDT?s|+^FSw,L+>f(l]VYf_;KԚ XIFja"fΥGatQ(;qf+qf n5kwkcӽ%`lK.guyz}ۮ䰾/*t7:L6`T7||b" MIO]ĺ;|mvؼ'bӭ<14;B^=ηMf3&aoOR:kԘPJgp.r%{nuL6U!iQc6! 'n ]-x7 ZooCUW̠ơK$NTvȚT}fDtb-E,SJ¢g(?E `u:U~2'G5r rp߽4 u3Fήҥ ^cW~I^݈yKL})>jWL)0/3{=)a$3bzy xo}l[n$an 90+5†_zN7U4IJ dʧZpO K &, DbQ4 U1k& &4νlF *2J5\ JPMuP4]}UBX4ӸU?}( ]:7\L1k˓6ygTZ4fRALXz]D|wU6A|C0zY`!J!m<9F]ePFVC E?DL <:A3E|:‰fW :i+\'/4=e(ޢ@_~%&uAy>T,yu,p֜U<]Z}"AxRdwfϦ"!,7U?ؖ2EX}&'l+vQؖVE\ Vu?%5xK/pMvZ" x1<6'ESޔ0{Ǩ_4J^z :vPvڽ+t1k[|jdӫTyR`<ӂgfа& Pb<6QOT1&mz okS,SP$.}dpЋd8xq_B[|,ªe07b#"u%̻6~ n3=xlD>([?Bg%JQwD3܇e(VT",zDTQks|[麩7$e}&!^]Q d8 4FLH)13ei@8+GQk1;]6V !<%>4K( \@*o%2 YɘVg%XtD v96‰fG9"H  >%wd٬2~Vi0P-IN ,.VA)^_oJ<[j2ΥC4׼-ë_Ht>7G>e+i$PT=}4aАɌ1y"umjD{F^Q[J[ %B"r'>~x:=ԥ*ṿ2b,dЀ:t3ؔvfSy,$]~ځo XO5/MweD7'97* [luB&/ڡ@="NzYrJ1rXNZmktu4 -qӎOۯz]̤"v֙B qrrGIPf$8fᆏ󥕖xM6x,><wD g?Ȩbh,<:QKJ/x$X>2A DC(Et̲}ndZq lLc,ي@ 7Qʮ<~xlI]hT<,. z  .8!g`k*01;Ԑ("Q[`Rv EbRϣ8`m2iI:ŽPU01,VwΩo֞9k&q6r\?闈3)ȣiSY)eQ2{:;.>^˰2jż?c)ZnF` Ep)º#%3YJ^ !\+uvd~! hUSh0Z=iʰoR ?-]jNLկPmJo&mz p:T)S=Z?RVXspTP ӏlaprbQ~X68Z[a-)doWvA}?<79D% \&q 8w]0=<`qe7*9bpf]qFJ XyTNupErʼ <K'Uw1`+жIN+opm֛2/H:#wIkb[ cckRM$_v$-[n.|ʃ?Tei3QV|KM$+} 儻ӒGjľ#z,c;![!Ah|DOg緖x2 /$߃iU$dUGe5؝ % 5D'BN+ F[_rӝ@$aV*$þ5/F 6L6p'0@J+F_&jZ9 ͿCuĦ뎋K1/At!Eh>,H"ƭX+BM_*_Fsu6M!e520cFZ~ZMMN_ҺCznGdQیBG(;GZtl*4 uo[操%mgy`xr#`/1%eNQ3ŀږ}_cąbZޟN!< vxb WPx./1tUH 6HĪƌ̫EGӝ[I7:H, cIEv TmXRPMA=Zԡ9Z1+!ZpT26G7T =&HB~Y~ V=}GݡP·eY» [LYuup}HЍkDhh:I3`$%BR|kV5%NN^9:q502 u|G!o>kC#dI*YK+?t]*{۝ @AV aE%Sߙ]<(rԸ⾀Lӛ#ىRB9rNaά oDft/e"1 QF 9#^Yxer^B)Kg^pgަw=Ei4򵟠@t6^̟/=FG0;C21q+KyxOctp!ڑsxOUBFih|C7SDƒ;_-+ gzodh K,g /H}'z{2Cϝ[CcR2umiaGWֿvrn #Ct&O@'~@TWیp?}Q pL X[?[>xA 6́ ^Rh )Iڦ^H\rFOͩ2]%s@K_(s<^Ʋ23w+9颳sɜ ,e&%K{z<4qUKFgy; A擥'a| V%nШb>/V8쾫Ee8/`)uVY.Ш`8+vo{9@ªbb {<2Z5p±ߏ*s ;z ѣGaFlC_2_߾L t/:\2$Yx%]Ur*5XlۉJ]sa{/4"/UUњ>>5/Suڵ?-?δ6Wʱ˨ҷ"ncw!<6p##%OEN~V t U ny),aHHJZS!"֎a`6% ήҮU\$C1}2 <2^7< ȷV@ (|q w(~YVBEc ;1JS+B#bm$7ﶍ"p)sRbዷ\p?3քQe ;h1T,ǁ<U 3݅ ZuYϕ^SxJ rKBa\*6PH˞75 P/[$p+E@>I&Qae5· t=q.Hj/6gbޔ%`/;;~\ u_s?Hh6̤c?d2YqJixRF3!cռE_4Ր{#dBOΟדj &&06' +d:眗EOeU~2q[מ]&4H\H%.6Ah`'*ā ꋮ!$6o dN5^q*|:5sFggʮ#$i0uBS]3\_XvtwoإGْR_EsS#[I`jJ^/0jh MfM<^MkU 7˒'ǐ젛)5K A v!9˝0]a#ҁ{ftKɽ]u[ѷyi@hh<'5) 5km1%+bZju0R@jB|~ҏN:阬M,Py=w?eB&]Bjd}@jRe`nkW;x@ut'i4D'5 5 ,X+5E?GHqrD(K|gm Gykȿ[:W2d/Kʵǫ6مrE ^)<09 \q<7bm25&s(u8~XJGz*7~6#[5G9s=bQN)SX!FUm>Qص J?\R}H:эW櫝 XP~ xÁ'3&[i&r؛LwXwĘ;~MBqO!h8}Hk&VU$ݟ:`)G﬿GbI6m9591O|߇S]v>th&dq![Aun QFHJkfp::o4Ftq m,O\Nڬ-pnZ~נ^6c Āf@* $Qw P^ DNHihK:Or66'_qZr()ogY4X;Cˋ(䝥vs!Kz'FU MP4:q8wrÇCi#+wO*{&wƠS?4R7ov]'dַ~>9H'jv?9NGDC%㬋k/-&MXD^yø'0;f^(IrR_d48 ߺ1NȎ/KmC)ѹaExufރKU5 tj@X4}yVazviC}M^=G~"V8: x{ʷ1FrI?գ$ `wpQkv: ^qPa {H#/ RV]%Oۙ}Qٸ_EGHzffp!A_ǁ0 b5tNC\fpB;ݖcK@ifaA*QMGXPtY2ӶpbM0$V,6~eϘ;$hr#F[M XmRrOϛ{vN줚"='LԴ͗ QaMU^ї^~fn٥ i쵻i*{W?]\>wU>'n|Qa/9ZbR;2>C6ibveN3]yz] (+ݠ;k]o'LMS+B{13j+ێ߁3Iu o;c#[)h;+&pH We:\j ^utXw`,5i;yv1N`S+p yBx^ V i1cW{d9<0mwT:ĹB/7%8{݌{x_.FJBX.!@4\n'^-O'Ĺ)Lh%'>t̻SI8-Ù\0Fa9I V&9MjvnmR7]}0_l3lv$GY0H)dr.RN{tglP;C*L}L67׾NA2j6>W R1e:3Ȥ$tnkUO< u]tz4tB౴rmMi0[w_9/D&@3T{ƛ}2$.y~n~HDwe!q qkRM-_xWuiT4?5PEgdh#Cֺّm9 BVVFBHc+xF䜓-FmN{PM5l3Wr)C2W gu8MjN#^_-H?/(4@[)9O.EcRv5by1z‰6s~]g1~oIx6ONʲ2)gY\g9z_A.B{polFb;5JV.,@5Fmż4V)OSI}%<2[`6'Qn*'ڊ b^LuJH\=X4'I&;ju dP3W%r6sE^F湍R?ηj5AXno Jl?|-5dNthW^S BMdAL7EX+5ܛdE)s$)1DϯF1`~X\hk0a=VRFe3ۦy| Y%Y2r5FfWA Ս%GxB9e)@aFeU$$ $ɂp;mt}x$er#X 1&g | ՒN j<h#>:0D9 w*qHI#f&ELk*zCoFz%6=`PZ^Qx_ |3gob{Ki~$s2pa4MQoj3R3`F£7W0 0z[\ -M>X@e)y—eK~xfj슻^6=#SY֍kF:=XpGjmFjŒHܤwDo Ċ •B­WbGBr54]_)\%ҧM&+;JtH)Q$4۶gLzλAQlEV,w+RI@*+m8|fisR`iǿ0u7#!\y͞06GJ VwGmX6 gcB\WϢ||)#2p;xa^?(bB5?/\/m~Xq wŜ]wY̍TA;cr1C|[, K].ťՙȽ޳I G/çDT[YNfɉF֩hT<7w ^t kLb6g%Oqw}ґ]F?\,ي ⌶W˪p+NM ͻ\3#N>Ժ^omaf?2vHj +ᖨ ~_&^wf^V +t- u\-9vtmob0fԈAE[jM12vfVwWJnz+-ؙ&P?oiC܀]eW[g@Myu05' [&g{"¿e-w]Ӻ+r%p#%`Ѓ*+Gr {ˍk[<ȟi~ᒚK'ls#S P%xdYfq~'DqisLEUYl~hRvb/Y{>^SFnwrtۢt3 {O~1,0V/!%/%mi2 T)-sX44E'_JzY(8z"?T\Px00K #6\&~+50jPrpFO2_m]< ooy~h;ZUɾ6fbDb7ʵЕ4l\{^DgYAZ }?2k..ƋxKq`<5xTio})oZ֦&5)p#q\'v[g8еbNd7*9|"N޺:5 j x!+9u}-=p+,qC{s)fR eZ#t~cvK?iOM?*I8Ғlrm$%p}ٝ,V!6FM [fOm#11AkkdG+9[5uxGZ$ C+a@yO$塰1ƻV~)\Zn׃Ě8vaõ1{%-#[.̊%R^(Vd?m^nOP qN!b=smyY0]1h$uv 3&8 !}&^ [jU$33։L|ßP _,f_mr_7}>\Y.: T.32U_,[K;3GmN6A~Qĥ f͏xD$^cFcdB8Gۮ/`\ Z+[+*||O2Τ=<:&h|jeLX9;,"Q0"3b%_:_ڙXCG?pZ0<Nk=#'켁VT((xsOp I'9zVuՐDYCmmV)gyɱ?'š W S{-@UJSz)ҫ.F1Bu}ۨ,(}J&vs:7蓗Pը4^K_@i-(B{1PFjL:B0jh %)nFUcGVE{X{'j:6Z*ᷨT&FDҒg',BH 63ϖ(V+OECCW`Xnߢ^'3PmF/ӵf#΀3\]Ǧ3AޑA")8Ce91QB0t "exַ.\^Z䢥It* t!F&\3 $[\LtXjGÉGaWyQAW!P̚&SVe 0p3x7ha*ƏDžoo*yBxkj;vk?dk7Y (3ՑkXOg%^]K*ƐBI x}jGXZ.u.x ttbXwsv XiH-fGCJGOP e"TX7C(z~/΃H:MQ\Tم"c8TM-|n&HL#$$r'F|y¹X8 Фm-4wSz%D,QgjV VaҟRdVM6?]~z l?"3h:i@kӻwWW1e.fbu1(nRZAhp|QMY8slqt;A)%>5Fב?!tz}/('fs*xtƭ}Y0e~S2G p8窂cgg[!8!`K)A.┧>4,XTxs O ټEɔzD,R4e"X@0ak>"}Vwk Q4JGuɍd< Q6E3 yЕEjV%_5Ϯ%2kr^@TNYMQ&`QJ08 #5I U,ԡRnYdg˼մ}l3֣b4?-9U|iCJyxP9i;0=Z| 2kߛ,6m2dSQlI7_\,ݶ0ִMМf/ HD+vx.Dus;K;!HTz~ P)^vƒY}k0A^ 1CbJ D+ 3Fg%i˙-xgq!/(#Ր$mn(7 lO^mFϏZ9FSSa**M#0JfF)S\ny$V!lg^E&09Q>jrf\n].P|rX8AS rM5.zo*M*$5Cmok[%V+ż?9ٍ2a%q@T>6B'i_2ݥb;@qsFA ɍW̔ɞ!=*iBv>> |* } Oio{G-SEJ?8OKc;硟. n:u)LPewޝgEM92UjJ O6&+ !W!CZҜ2eP.}&N&bDSF$hx_Χ#nZM'D!0j\rQu ^ ɜԔ #B-peٜ⿰ʩ, Wod'*p0(# ·.~7~&>&# hX;l@gC5uaV<$qF;X$l%KcBp63ƃ6d"%Q[6-|S3 y$-,TxM3ҚUX8f3hlJ˖oosUn˿[}@W5RF,Ŭ3kwI!{Є/Z?0̍ P;p[N QReqhڤOP%F?+گN05,Sr7'uԔFCu*E&}@a;$=w9a&߷WP'k-BP]y=DOc9})Gvݤu鹿 AΟ"̿%M/AI&S+Ni-UU'VC*k uc*2 d̙t&gq$755RI1 ƳP!q gG)^\bid\ l]y+2$yE bE0gW9;dEru^ӿ5#=yR/v-o@iT[bxжmN㊐wA9ufjze Ip }]AܞRvy3}d5HQdIEl*:RsP`yh9[: w=d< 's̱NT|N? y_DJF`i=_t|[k!D nwXlh fXY tYC+d)kӞp b;K%/d\8@IfqQB}G´6Ex c\['EiMlCKa5-(ⲆҬ`vwca=f'ԞJQHÆhV}?P:bg۶ƟܮנܒOqYQTSR Rhr]kaEԀu3[G[L̗1;3~1?ƒXs!AwM 1w@d80pL32OmJJVs"5dyM+. DO56 Ѥ -CؑQHļjC4A`BӭN/:͛;ف*f*?[X,WD沦Jwj:>>Md&ztz`'$v޵.{ /Zm mE>&i/L9 cQg:/97Ea0Z}gG_C~F0EY%Ь5;AVB$W*XpTh9'_Seb>dq;^yqin?Mem{hW=9HQ- /)GO:/G2l"Kfy?v]ՍAw+B~p!aS](ҟ )9jhԑ6>a9U-*mN'~0,Lz]K,!e6=CPqW4vaⲇL&jP1KoXɒ)-Vj":,5 {;MQ#E#CַX@45>22Y߂; u>nGuSIL#wdnT2@Kj577ߨ$(LͶXhi(ڒfe4h/{sTN?X3Z\rT&Y*Ty.D`}m;w_Ehdx I۞ΉdBㆽ[ŲjQåYVr?ZZF4ӡ%Sû\@ dB`OVVOК X x(@$Oy IGʭ˰1kXߋ d.o\ IAǟy Q?:5\Ew{l"th$DOYDgLEpN!A1| lơ2/ƺ $CTIcqv,2u J}cL13U+ 46?{`#@iqY Qsxլ)Tj `)`7cm`ia宕!kع!ɋW'$]Tޙa%7lcjQ?\S^H.G¿G6$1b ~K3款|PG/mg,Xg ll6pVx.8A(̗M/2ltIoH9C,;/ e0|K!NOj~J3Fd\?axMR݋ "vHOJz%9)xlOq2s\s6F/DnF !$,P_k1M8@Lɢȅ};4s_lcfKI|4-% Aj,jA* |>u)&"U8[lG,<7Poo,a{Ǿ}MH U'Z&.2 ԟ- DaCL95!~ܿi,Z -}8H0W:``*P&Ty vx"ÿ<"2ޭ=1p5E~>7)+r)Zy***sxcl$OI,D$쮃6oL4n9`IiҴ0w^@Eή5l(vyb#{?[q (ɷ2y5Way/?^?Ὕ㎘RRX1]xamן (v,nm0e[\;ce4oDeBJ]n\=#5NH]p!h8e:PeFx֘&p7 q HTd 7y=*;8EWaoeof016GW9 ;ݫ¹?(($]J äh2En5**柵!uG̈ܡҷYz"-5cƷDe T@eF۫u278iXOٞ903 @Z; Rs/Z}M~L^̭ ED>hl l{eM`1j/^lq*A~JGfc{'DǢKE \춴 y?j :nXK}*S7L>N|r+4K`ZUzm ũJ^e+'a4InGwA%](+34 mY\sy W9Ig"^=͔c;Dpb 0fZzEv}Bc cZem8^GcDNT2!i%yoW.)": z>`')L$ʻp#o@"vAObce6]li Qˬ Ly -Q5 o6^s!j>n"3sP #YO+zloX8D!qO*\'XXoDz]brn#R>$udžpڳ0Wq ^Q) oRnN#!Y} uKB %;~ټÝ/B.hpsB9HIY!2{a%”ѡ!r!TaV߰ڱtXc K"g`;[#| K= TA*(x֙0 "Sȥ/C ˵UVL"=9+)P95=7Mi,cp &Jȱ)`꼕<wL11.!((87on7#X`?#sm#YJ*ȧ:Qk=s0z$m?)9[=8g6ٙ;x,l6ȋא4uO堨j,iIUs{vv(l[Bfݡ$wJ%#gߴ… 04H e夊zmXu(hY_t\K^)J0<&qB'- :5N!2K2 A,CF#Rgxas:]@'(l!=w1IvtRɭub1n/W'zi.IK z/vHZ*mH;5&]ǫۂuk\Eo̟aw)ijB}"-4HESƀ‰kytX«0n{PXW"3sOGZ;tޣ[. Ugjk zN"WׁDM^0w1N&ۮBdVv*kq=AQF#7 \恳^MWsv# 3ۏ0OlzJ0u[NQ7h?TC2|\Ջ8W,{82 JHS# .HgAQ9ۑD$){NQp'L L4O)|&9)kXre­ܠw۬"<<-24Cĺ*Mj=TnBN1)~ ތf.Tʟj]sϕOES@CLc "OF,sSRz%=SLVգj݁H:OW Ni1 W? M*]=3c=Ѿdl>M~PO)= *R'}< &UBB%" µND) .0 ]m(,c,,S+ɓ3%cqj&A5A۴zŘ00yb"<.GObb>BZ|' GTſֲ= :W!HN0{^fFZ&BZX? ~3#,z>}6[d`B4{n MҪI$!l<,j00wg;=(/.y<y(&%h^۟Q~&8W߬JGf˩DJ@taVHs@Mgo{_,=Yz܄$RHPe2'VndSD$&<%KdTŗua5@ZD,JGB|L(n6l6 lKkIO_AɟD(l.g]•ŴFFS~RNݽ;EQmI;^z P`+ گ+Gvx,$|=,cKI#gN޸5X{~|XcHT_wĉ{{iREgSDO63..v1w÷ =xcKS, ARzLV K^5LqBg'[E|٤4@L^ XT(BtdrV9%doZCźw"׏^x 4=·c9\Q9Y$d4sܞ'֋%#gR._zd(&~I95_6(GL5^!&I=eȈ0ծ 5^ҡqnU'" zCjqɫI$LEs2G[jCTzZwc0jYYoU[~T+;}YЂKUoNOTV<,#ǤF2+,Ԫ4:eog#؉nٴ 7&pdfQQ3OB2[^G^\JbԴQcԠFDf[gKź,aw mf *FA7'4n jWEqf"e;oɈKb3piN3;hH1ywOedW{"8[WPG 6вVR ˈr"T0O_9`Ox# oAZ m }hU{Q\}KQ =uO^g?6+g3Aײ^#Q 66/Lio$qjhA;7#8Uۇxny*̾k @{x~/qd+ BqޥOK)QBہp]xP橎#lph7Eqæ?ib*gRmXzBZ&tYf-P2HN MNB2SD~#9q!uUkBHh5&_]٘UC P: aMeԼT]d UZJ~9誛:yY"G\iLv$޵0h:vvY4aKeJ5Ŷ(w#o_pw~׈iL7=k 39B'.2^ӻ3&ʱ0C5M e4nA1,^UɃydX ]S!W?78NGoG?C?rk~?.7~ Z>}<'AI&SQ<)Y l%0cLo~%#C5ƴ焜2۳$eY`iD IUt*zZ*ƶW\I7_IFsscuQ5Mڌ ^p Oː Ma`M3 G0noPb2sS^O4 Dpr uK_k %F6a{,R앤?ktYX M"f>wPn-EWnLxű RXh7&/ tJ?nڏ?D/9p%*i1~=/n4-$VP4h}=}Ѯh|4 n^HmGLbe} l(A]y;paw &:02%JzVQl0'}zdt+AgYT_О1Ӆ9w CAWiRI,,sO)&`"8bhNYUGGuWc10%rbXg ֶz;*DXisYSӤN b\)"4!INJ{͖Ѳ+%wR" 40J Wc .Or} CEw}%}^=t1pb vE%_mg-#-g9s%筽H[Z { ׊xCJ\s7#\ bRf;l"+R8@޳%ڍ%3i\;vAk"\s?&j{ )?zvĿ\YNz)`nUZ(#u[FW,Z~t.3 /n`N D8ЮA"c٩t |¶Ŗb:*klB]OeL'/AwSflô.4 /b`Gq7AϐP?iK`/8-3ַ>)HML76-}]=j,͇j/㔦dҤBSgYsaL/V)lbζCأ4pz>N\wA(?c!A*k`_b{˞&2z! *#\Cy`!rIz3"x!bZh:RH_kK=EjUѦ$3^^4 _EP1aW1흷?b^,,1 `;1謕y37㔷PL>PG|+j} 9GVۻrrńֈg>9&s*BWqi%]vO[k_X2Fo#.3l vύubDR) ](fO˼=PE1$ܻ 5u8 ZBR4mGX-~3ϣ潟_9 bD{NwWӗXdQ˯3҉%qC7:PMGc呑b#SIr涒cֻ}u'xU`ēmi,9łW!a1;=秹;[tSmwg"(EM64&LgQ~*Vcs:eaABZ ͙9OɳAc̱? ud78gv!ۤlK10T j] 8ÀfHh̓0!=W&G)z>),) ]zQ%n8*4~J%Yʉ ׹q#f@Ɇ+"Foy!;O܇~ԝBѳbW7|'Sͮ3{"r٥(E©ǼΞd=ydžߎ}aPJw48ߜkH^8 ĭ)jǤlO. V.HLJ}-Ak$ߵ+#;y|oRJ=4{/61-e36Vpi}xu'Du 4|ČJIQ9gk$y譚B}%s7C6k¤k](fl_pC iͶ+;]ըƶ2C<&焓a\V8x'N%;o텙a0W]lbTx}@umc@_ њi>ߣ2lk>F_ i} &DؑAbh&OiJ6R-> pNP XN(}TUA~0H^as"|0+L}O#U6V́ 10:T~IY`YMdzU[*@d~ kyMw/}`lW6TH1P L`IQ>b0Dh(5@r65X+nrf,i!i HXdƓZclPo~E!6.E!!^i 0mtm] BDQJy&7+IQmB/0gv9I@7 ?bǜ1 P*ǏpH#djv b"Dy=C养ElFj+Ila7wo$z"UY&zEpe[L8 wEt]8QEJCV)iӘr筿e,l:h f'Ylrˬ` St4NYIEQl:i7fU۔v2Cmݎ”Z,Y4\<>ye>+bG>fÒ`4Lg 3&K4_X TRN&vbL\*&4{km^yd/gyϴٰ$lc* }s;|$z 5aѽ,7!ĒxmmѨشT>X!X~QјÏcd黑Ԇ%o;uBJr-7l,d j}SU x]WEgӶq\7Ohm7U(f٤L.W_=Vm q& "6Y .+RAn]o {ʎyy=SUrWeZeޝ<1zX{.>i{^z87Ī\c`ծ/>pBO%|Ti+ qd@Š Em_H$pُ_IKV|s5RaId%`f ʑm}nSppbyֺȕC"W(YeK0iۼRZ w"thF^|~ Z>[}W@U<ƅ乫@8L[w4j ϸ:F3(|x;.if&`+u{+vl7<Ҵ@Ѡ;oHS+OxҸ l\;pus /`FpXs1x4o67q*DmsXl1#ZΤ- Q+I[e9I4&ٗ*Y!95!F,@[rgSďekeDUO:pds@HƸPr-8'vѫ$4YHZEҬ(+y| ̨ie=3T!a =d.\ۻ ~erdm%cm,Y)˓hkO@U`|-<#bdYcޚ7{*(h6N."ky-*m~C7$pYOոǧ|_4KUc>ߺ12{Ϻmu sB?*,d(qc4v)Dki)&;őKryh5%M}\}[º*;7SFӳYIX}m(n OIERrXJ |F/="/\u G4"F{R6Sj [:US{F)_Ni%?dJY'?-z YV<,NO XGFtZ)!} yk Y8*Q.ǒ ~%?VzBEI+_:_8rڛwԳ]f' D6&˂=,z9F+j✒E)͑@*'۳@)9+5Z/GW.ù-Hj;+E* 8FPB"5!LN%,bcX-]xNeoyL]&p- 3S9q6Z$Cyur^6-(60v뒠ᠱȬD{/5Ħ+U95~9Q)A]D-F) $H`CEZ5{LAfEǿ5a im/0]!j@Һ5;5kJ}t-qQ|ڍV: ;ظ9NoV[Qߕ?nԋnٱQ_20,u=B5giΉD/b{2˧p1uZٝi.o1EfP'gyzm*fm#[0\޶9xu.+k~8\xC0^ Džf3GcM7Ӵ]yߙUd2DAê?Ll0.~^ic%u8zB[& rMjbʅ<E\ %ݓdRv>npOrl"P8B>S J@ؓ  ^ >^V %ASZG]ƒ ΑDbLa2cjxOjx#ٮ?By6U춑+nEt @B{k?i(tVlM!+OAs :OY:Тek,Z -lPJ\#9 %gg xΒ9fJfqS F=j8&WO0H+#@3K^sV 6!$Ǿdz$&5"\.)6?hC- xQ9ݚ-ǒՃi@Pn߽y>xjV%=HYI1\駵HS602 @)0:QO 0*wEw^%zaI ״Ig5(/-(|i3|N:vI 1͕R~';}KGn5xjk'ZLͧ[˶AZ}(0 :$j(E YkJ@o'fsK?ǀKb=<hv!R?7dN6Rjk^0r,0_%{7*'nqYLF(9iL3}BY&ߦRrltnnZm3RUaXRϷHAWon^#/{NܣP'Al"x FqǖwGw㦾,buGsxXnx 1IN &媏!n#QVw8B_EtE eC jٙc~>+;fm1]6Gy"Yɘ6(u0C >rosc;u^̐5n:-zYtݖݔ?o,DsreM( bGΣ(Jq',q7ܯ˓T_?٩uzT` b~"JcԺM?YlcuMqg"zs%E뱫,[,yniu?痨m)ұ1]VǤUW&.ATShx9-DA @PZ%a}_zL8k$UHQ8d(HRN U;o7(pʫpUQZ‹y I6Wt]pe}{ Mq'"+|1;YL: WK# cB |x!@¼)"֩#ƶ*wߥ[60rj7YǫИ"~tӤp^'.H?^z@:|Hb?7!O) nx jGZHL 9W-9y*׫8(o1ֽAn11iן2y|Dy@1G. E2l6qj jm&y,w?Tu T;9751c̣nl_7=b 9i$:m;\qB~ D p 4r=R &nK|l`ӖdB3(Ũ̕J&-`^ -pbiv? ln F1 pV)Eq1u*.޺M*Y=M;J l'JFhȆ$$ī%eyI l>o 8DHInޕeD׍ ?yy;x]ޱ:v<#UtssLi2*nLOfN g aѭ<ձ-|PUiyq–e]mYuWJ-V%\,X% {{R[L;nB;#}#Ɂ9󺞿z WDp;[bG7jR3[)GtwcwYKxRΞpGӿXU|pr* w h9Pΐ=h(e٧xWs'_0cUm'/%!Sb83w jP$n!k'-u{ ƺ~5r+`OM(\[?0HyA%k9m+@!TnQ,~ȫ̷ei-<0wyTm &}y*9Pei)Vݩ:Lxɔilo7ckBJeyj wIQfoqr6+\1,+B݊vm0$j^b d@+)$KNi苫SgX R|s%K&`KiRecTXKhZ>da~ֆÇz/DgXĊrnjf|sn$`NټM+ Tf'Ĝ UcݏZktFaBuǥϱZ֜Q0+

Ei+.#=aۃQ]OUnH+=c*qI:JD;L tz6ѿOK(m>QEDD %-c*jڽ,Ch JjJ_Oa )[|M\Z*=O~`3b*>^:|dIQ~!"l㑴uE ?Oc Ƣu\wU1d]1'bصsE MBā98 Vw+?? y5(:6*.Bq'mv*XiUO\I-EΥ%{tt'L,ZTa4؁쉧FȚ3]|jMo 3OTrË3jE K<!Z\kF<{C;6[A^M^KēC NSy jw@FI?. x[u8QZW+$^?8n\ 8|ҙP2嶡]q1uzO lL}79!Qؔ4chVXh@{U?5;QP  6?xp*1|ʚᡂiw[=E)C!4}@ 0gpKτ@$xɉr@TeNlDOT%?&@aO Ve1 2)hҨ%8Hdp%/gBR|}h柌IcG6 @u _:̲ktsfZ&9pX8j .=g -9YG!8phnѡ 9Má z2"2z'e\.*U/~1=a-=ތ )#;y|D6͹_cE=u+R?]ӖwRpEL ҹ!+)0n*,F53d!\iI "z3?M/'I?K~*uD?#>OПI%+܄!s>AI&S;σKa1_yyF5[j ս/"I%)nC{ @؆\)6U9f}};X>GveUy \bC-c F֓z$xe.9F:67p Vs~DQ^cXqD>K^2f61%w7q!+H^M:pҾ_LE "Fve0F9c D5% A.#\uW۪ar#[>M VIv,PVo}M a̟k ]ɗ3YV;~jUt<;& ,{r%}I3>%=Qq}Ndlw!OY(?4rU=MjS&~EB3uo[82HܱKm}X2xO $]>x7>kT9"}{m#$|ma7rY7zc "h'f/H}C];u%mKUi<"  DP,_5,pfе tD,_h]o#b. <%cAmE# :aY+=A5X2dy*o1(-%6ğzϤ!2kk$dubeĸ!#@Yg7%^@:,]OR>i ,ߗSެe .܊ʦFQyikCWb"nIfR 7wESX"!ѓaDT'TC$3ud\2rx?$YܮѰI}8e#s3-*ܾ&S.&c}!_\[/el܁UvLw&)9֒CFRG$˗p;I'$ OːmYJ`a.jxg *eIۑ[-kMK129 -z{[6Ǘ ;`)*);%W߸'WR[*;NeJF|laRZyT6oUPh|njۍ95HBzA'{/GHـU](BݑHB.vOt jƝvCJS[&3\h^>Z˕ݵXGe&sc|\;:LحVEdʏeKUJC ˷AF1-e A br6'e R7>"gOVmSѺ՚rZđ`u7jA^ X_G|VoV\<7zs7%ʕZo\X>C$U56R'Ŧ+ڨRyr ,R9H~z2s–\!2e&I{揙Y͐\&N`N9YeUC-1PgeRGSl| $`\6}Ua(޹/64s Uf"'0 Uumiի5]P^^<MW(>4tpc=Q5D_b(2"~Cα&"L^o5ejS~RHcX+9ESC[~8`0Z!ś+x^A(2IԂoKT~pH$ExbJEDiA4<;;Fٷ]jAu|9(^`masXŘαklM*EfP2I0ܨ( !6gKDwo":GMW)"3%,]=+>_(J)tcU38x?a7E@awWnr-%Tw-YO!Fݡ&'3m^j}j6]ْZ,5a߬fi@y4*}[ampt:PcOƎUʔdGb)\2de7Ez2߰W/ѧ/n?%7 RtEwՐn ,ɞm]t> z m%.T]idYASW!}pCjB "$_ʳ I\p K*1ZE)8]/_a昦s['pwH捽MHzO}ȴiC5s%x9yq~?d!e1#UΚ_ȆxA"}:ؖ(rPhrO^!;HФa6?$bYA <-[Mdq7W|Ѝ09ؐ16PPO_A/]nNpr|Zp7"FߚX K} !`~ܾ&;Q?B^+J\a4R. ٯ=o>LŸf&Tt}vK`RJ)8%M3,Z우k wwTwlo3fdDeo|܆Q7ZOʢ2s4~r~cZsR(DQzfPOqH-aj8ۮLhE3 E|kP&LW4gF(%|o&Gp> <^Q^v2jku^ QƓ!?H<;B3.RF["n5W2QGҚP2-)&-^SrhXm$|홖e.N926mg\uyGPAwZNZ'x7fT|k"chKp=-WB@3h#60R/迀SjA.]Y$כ-.JeX`3m;'MBI/u/ p}N(8źlΡ&`Œ%Yz4n g2^l_k" I;C&yG Љ)cݗ[*n\, ,-\vL@7:y9@I_V"+V?EפXU aWs:IEBxv 927$/4]AQkRb7 `RdWk ~rAxJ4l7_Rt[lb.L D|J^-ґU!ի`6xv^m"~RK ,os~ /[gZ9&rkDt#I4aĚHaBt5! f%Ngm7"|c{T%) EQ(.r{cIuN$.*)O@w$X9c:滀݌7 ;$2u'K9u3iZ]5/eJК "f6Jk=^O5ԪRiz=>C c2y5_/}S TyL(ɚv0c9Pme hxnx< qHvKghA ZwKoeofQ"FO/xmKy`/倞H?AdbnH<>PROkqfR<"_U(qIlqWP} GwSؘ4svoib:$H$ ,7S؇= J50->I&8 *;`ߨݲdM 0m|`G^G&cg %dĽstGT(8zJ=.Y;lAB@wfa9-dFC P:$@PV~yoZɉ*MIH?":}^j W,9ĂO&"՘:2P! \kvO]h<N7=#eӉ?jAI&S;䆫,bv5x"2Ծ3@Q Hђ39Gwh''jtP'>S=0Zn{z̈c@߁A+t+҂b"A4~^ՔѼ(~`>Uu:~#*C&XA̮8aTQ9i1E:qDPAf^4RrEmRs 3pۗu1J%v);?8cX 4p㼏QPD'Dێj`rO ?7C@3C *?9? `(3zb,`+FXEPOs9ؿCOa?1ՔzX|tnT܅Z>Q,-21?ހP Px@\=.%G_pv""Ѣnf7`p>|8Z`H }h拵&{~C0 p-L/:Ød 5{k f|FlY}!@_8~#4?_u C`Eqa"%j!6ITUMg^vo. ,._[R.\Eʋo(iIhx=.̪g;4q CY<{a vsFyUg?%2XrA6?pZLSIX&tObpfx-;M!ӞkLk %;O|t3u]{6Do0J?Y$;Z̲ $(NͥPG ?]2OW]\]xZ0ѱ5 Fv.@N/_l@P{Gʱ`:kgAit_bq"X4biO¹FF+8;C[fݨtoELea9nwCҝLɍ?ۯ/hAža"{Jot_#%d.B=>\yaT 2Gkw ;->M,.ԒFC! 0|rJk\b{v˽\ <at>r)x𒭇-E2P;HCՏ皸c,/ f `:Wxi[mɔE5%=VepWPv75Ӱ)Y`FM~Gǚw7]x(ϴDŕ?˛)4U\Nw)Өk+ иuΉ۹ST/e鍩AF&0{R+O"^(7Y['rhjocC3/8`UJXd2jX*\-(`;jm,v5!]@F6ۛ0 ͐8cdzeƈ~+–i _ZiWOԞf!YOoh,N٥i(;E]qq+&=o z9uŌ^dDUq(E/9 A1}wVڔ[ݎf)DA[m?f7K,t"gɚSvij3JhD琁qW]r;Rj7Dh0o|lO'נ3@'^Q1t}jG~g)-zñ&Փ|Tlw<љTԐz3$~uG{nnPb r #vLյԻ)1xUIbqpݹ7>&K$ǔݹ)clFNU*xjvn ~+oޮBq)҃eExM3yצ7B$hEjR GIej2Y< Fnq׊tBTT^JE씠 /&eRLVBP/nAs5uCr#yu w|nm'0CrqiS6nZm lʏYH,b嗥?zZ :ȇ#am:Z}G_pǮmH?Nl ٧O,Do-8H}3& ;j;N5>gĕD1CEuš{u Y$B 鰷-[t(=0N"IG="glkًNSbA<4]a*?1od>;P/ZvQ,esQB]:Ǖ*4˖YU*GֿTG%ɲ2ClJ.!l19dNˉFp=٦^V+-?G{j 3iU‰R=tSq5gt*yk 1\~Ŏ>YN} i'kW-9Ie<sF=v1baԂY }8U!j1`~쐿BQj´Ⱥ⊿{b r<'ASL+0˝kݗ^WeNYa",yPxbL2|z@7 CM_kǮO:%Kq*־ӺaC1mBЁa4^uHl%iSa;v+M!+7tK Z%m4a"*+p.Y}eB>,J&E1c JC% yȹYQ D; U.퓶e Q3 Y. %PFo_uP'k2Jq%99I {X`/"40(rk=Ŀ *'UGXL>? * .%yͥ R&V7,Dt]ɉďT5 EC ùgr˻!v7;G%C=Ūv q7pҳ8tizAL{HDy@0Mܵ"AΗtHA9v5bbϭ4*^5Y(cM\j'7$ܶv$F2H8Nh=NClݗ:÷~+>krߕuK"_A.t] ԗRA^Arod I)CީgEĜ28YA@iWJC嗦 dOD -dP!^%[|ݮ~L*Ċ$WkI=zѫ0HS.}Ş F^@רO Rlqܤiwms4J ť/_#1Z)пhw^5EV&R!A9V=a 6cym⥍brto׃mD !~& Vt9A3q1["}I-?FϙbKI h-QVDֶև'>P~YڞX%X>bQ}a 2Kհ+[q蕄kmN^3tU(γ5>#+IէD-AtnwZboS}!40 Q.$"qvͯ1YioX~3bTyLS _|GwPyF<͹Rg.8.%&xbTSIR+d)WҘDHEcc7d#Ļ%so%ɳ#,D>O,؋E 9H@X 1L4:2x|bm·Ҿz}B{VzX k))%fƺf*S`܋Dk-4ǻ1(Z53i)@S[Axnl΂YMcd6k_@2֯Њp('f _Ӊ ?3c/D a~5Jp[٩ۥ9-t6CAiS[c[ђ $K?AgY')jɤdi2`vY2KgjE{қzj 9%r[A0%.tAs)IȀzEUS+qX ?nj_vA@<qbr xtx8L2پ<3<DS=Sy#[%|LClxdnDN $y Co^%߼2KaH.Gv A&I&S+Cc| mߜ̞m?:s+L}V8bR$ EV! ml̎cK\Ӡ\`Ń;J5V{uDInm޳03_6~]g!gOSJiD) ٓΨq#]L_ -',0eGEeH`dB^/)fU"DȵkNQ?k]:7ixIbQNJ|-vZ;؝z1"A6Lj|SzK+QZyqc//9N=koY9L"tDݏ4ޯC!`I./42Qt='c I6iZyMQiU.Xj?{OG.~j?{Ae35y͠Š\C6>z~OR4=Lm5F?a% D|boUnCħۿ.C;Y`~2* bw]4c4fHœ zaaKVBnUlh.dWGi E OihnC|ogJWuoj C ۤ6Fx[+(Z/9êl亨 &Q )2"kM#a5Mz?d֯/U9Ž629.:u|O?1Ou)7w08 DyP#" ]~^%.JX[ ^(RchRҞRy Jڧx/+/ ~/h'[cWѼFOEt.ap+1>95#~ .=Yg/ߓZPSA>}dЈb n+nPw5 ;D֛BpȋgsD{ꒇY*YQ[-yzRA !27T2Hו8ڰuOؖFbƆ9̐Hɷ5&LUYS%ѧ'cNƍ6~"KBPmZk_0wvp]Q'4pTr7~)Xq|q.yJ宻SG"yڲ?| {=.5XbL<b @I&ULiTwVsX(6 ,^Cj}$WT?]^Xh|n!$?@&s fōY*'/xA(hi+1ݠ:u3RhZOV!L5Du;ii(xʌ-{&mn7Q /^/ ڭ(O9?G\>>J VhԘ_kb<-r-o !ݬ*kMePhWEDV/?9u׈>76y`'9CN=z71jkƒlyF!Di{jҗJIο=f?V Uj}3=&LO/jxnFP?F.dPz:&08ox6:U(D/Qݻ/wP{N꺵j (7(䳙`ZB -B!h}TX}ܛ~U /p^.mۆW oYpFQy$ ά_,}BH1BUan^S) YG٢]t}`)eyn@c5nR<n!+˻H $~xGfYθ 7݊0b"HND3lޚP宋ڙꗴ?=a)dp΁dw^-9!%tl[Bz4gP-ğLXɆO5R6a30돶TF 4Zx|^9'Ieed}S)r/x%2O[ ꄣ A_s 轊LʍVt~*q v3z߉3`"1,x?q#RWvX|v@mQ,rŏ3meZ+;w+G2٢p$ݑ˓IJBݱ 2ٿ# K] ]X{SywY *±zϮF{f]EowLs WJ?8Y9RxQ#2-̭P{A(1.)s˰}a6[T3gC(/+!zSHd>oLc5O͢DC>|WV?Q#_@ Yɬ,Hg l}T*~nxz DMTiQvrZ@seԜjGx;̘R-ˮ>\aw INS\V_J i(705$pQcL?^nI 6ɉ*$18W7 :玿K8N1ոѹ[o|Bv(sؗE\(^uħ=/7{L7|Y!B|9k(AjG`p/Ɂ(s}{vJJY4"recg$P,PBRv7pi |hZ.P4Ug鑴W9èҢ;gU* slCYViXJub62ItL{qOh0ѣp\LQP̚PE \;ᙹHTuTBNx=.GITlͫ&`DWoqwf8ϱ M);QwY?U)]"9?lVplu.rh>-"SICŴ }=f~:dJIڇNH60ד5Je.-I`)Ct^<+yY,߾. "? "*xJ䲞@to͗ r3YO{HL%wV#K,a djʦV8̞*ق]m&,:6;=~y#1}7  )4US7 ٗ%nRotC䐢Cd X.hbl 3Y*H?6d#v՞aۡ%ʏ+a*WZ$15t}3À*̹*Uܾ'yĬd.Pր[貚g8@I@xw;Җ7A\؟y5a x/ [aR 9T)cUQT!W˹U8VR ZH9{(p6>Qȼ.~(eS,R6Ȟ%m6WQ2QchIq8q#Z'0 [T[=RؘSW5ᓦ;?K9GwfX CE+l7\Ow۫W>OPBqD飔 )˩$" N Ec~𘸨 p<V?N]gaHm%%aE ի4l^ZXW>OͲŢ"7 =~qO'~7ocϽsUJy;'ug[>1hB9ُe /fpt$H/>SS$wPORU*ࣺ:UKrG^ȕ&56m^ED #wzF_𢾠},X=6[(\Dz$Υ K)F~NP%|!6U [QC''9V -0m}iXѭ5ŧx3K#-&ϒQbjl qEVª1`3Bqu 76F#.H,k|H[mv0D# !+1t . .u,3(.iSVec5>0ޠsu,p*  (?-#'j@*e7݈7ߝs|ᒂR}%\Yz`u$GZ$Y'BRHt'D(@7]m`1-&uצҌ-Eyhgn u7 )þs>T%#6}y=\sI)=x9!Q2o9ӁcqLf4x*r9'΍k;$Ӛ/*F܀3-Yz~ܿt,dp_b u.$6<J=tck!Iz[)JfX00a}lHCIH&.6+ي%CbXgR}e.f⠇IEYysH ûI~_Y8 9tv`rhY[9- â :$@_dVrRxH2lx'o`wuDoYw #; %_wMNu̓ɧ$Tv_ ] @6 烁)ZH.u{HPq+A+`+n"cQ ջ@֘jr.g)qʔg>dYĞkQh)R*'?>zK+߅`6#aG dTd:O%=dbC⤸ >AGI&S+t^綽ls #z\ [ZPcObXRW6 כ.C=5oh^qLH9h#r/|Xϩ0 qU.*1gw)xI廽cR{MkHݗeXdJ#iz6TП~Oɺ//Dae؏ k,dX[d1J%i^ [@(ƯOp$ IV午 )"HeՈҚ9js; Qg|> W&c?_Mp _Qiqm v*1&WiwnTHIDMx[;vDv\Va{OZY~qFLfz^ˌЧU eR nM߈tJpZ" 0J@Lc&m@Ÿ$Vn+)֢9kO-:zxSK;y}nԌs'^gBԫ`A#)bm@>9/f Cs#lszˢC_b,L_$/&QkU3Mx,f)ѨJ }u?_y.RaNB8ϸe@Fmq< y|]%#-UP[vzaۄ_s >}0)}JP*I_|WU i!G[$ C"4v"YG/~}V|Ke&4B)Q{a>2W3Ty܇W_@H qӀdn]Pպ(XlUc= )%d]b4i)nf^u`2!4ޅ= <O{jue2ڋɘm?øv_'ȴ r!L{\|.qwy5`'U{kX櫗fXtAͻ_ܳj O@QHTVJ@SCkhca5G|^WGZ7$`Lu"\R-WRlQa|7P`CmZ;e`T[wT2?E zP dKP&}0ZVFFsbQx ʙi[C}*yQg_ X>oS6 XG?v0)L[~M)m ^i8 ^QP#aB%F{[|V1D@]RbscZb6ϔ8#+7,c07p2H"&IƳڵjˠxfOwFEgeyd/[[\+LPحFӁUqY JU-GYz^2XֳX #h,ɰ\>;5p;05k2 stt&towm L]uK[Z.ȬYV Jjޙ REL9 .i 8H]5";e4MUa&cѐ쮝z4daH.`B[ \b:jnK^" ) pV-7*EѲbutͯ+]{ jUxw0,?۽82 Vsm(.w$X 4֢zYcHؼ* is[ S>cb|Jd()\kӀow淌<41c{soW=MI]P%7=6X'`:܈ }~q`d,Eb7׆ 6Yٹm$b0/.7HΩKs fa$}i~i/`3$7O_z=|IZ"q eⰶ'us4OLҌ"ry̵e ;a+Rq+& v #{,`~ xw2:.Ķ7\"ut̹g]R>|1Vtj%'(83M m(?*Day\= )}|`C 6  #`bD4G5jO+è,؄<_z 0ך9^>YTfވW'hԌM7JL\%̧h#:K,ȭC';oZ#Py+&M,Iy"F1Ztj7ʏZ%-+o6Zw4>*R^!o,YCyabhzWF{6ދ{Sָ-e/PPxG8S1Kz$,JVMt|XK58L>GT9 ZO #OhTGHF_VTQl]^ݶ2ԕ'#=gE"vH:@8p~ɵL|Twhps J_j`!+Z,j%7T_b.Q$WQHɹ8M&mGKJX$ڪQ=l6g=m.2baw2(qDcY2vu2ڵJo0s.fp,z'erؗvl:Q ve98`t+= xىĸ&,-߫MT ppT`V!(Q46YG>cf7LľuhgWG2քfHf-4-z &,矹fbGrs븍K3op G,x==asߤQOpLc+Kř5UDܺ ]m Ϯ@}m3Xr,g!V]Ui?l[byXw㷛&o~,Maj!:FX|w6nGQ# P_S<2IAn*oD`,;m`&x;jQ4E*n?En7^[)ly8'9aזß@_Avd]Βan2UBSk5ר}*Ƞ] `*홯nf|_"8C+*9~;vKi-dOa+6-ئ(Ř]?p>gmOEMd4OTW]˃.ZI%-2ӺטZԩ'^~\~vgn4eZѮ4q/νBiԘzb3#kkRnb8}u%9A ReA,u{jbf[a9C+pK̻ ֵ,+mqɇh4I%$+'r,زvUeS(:!YǹPj!eHT9RF%ѯPGn5qYF{Sƙ^kuּΞkhpp]RJ }{ο["I>xݵ =qZ{AjqdJ:Ahu7o&?3pd 2\4!>TwK EwCp:5b^ όj|v!l$ESm@!1"ZZwW#g*{Zg]2yTauofUp ֬ Q$nF [@vWOK ) v{PA6N 5jtJśvYuT,'X,U[|ÍeH6-_X@νPy.6"0-:l r-XΰC+DO@P\e81: ߇畮#swg#+8q?Be#?Mwf Ae(@\_,;vi{Ɠ 95H=,OiY 18[ %,yPK@b'B, `رO4fN?d#11 dywT-f K[]VEוbL#ef8Gta`x==H 22 }71U}>a.VapŖ :7ʰT!Һ#FrgRWiBf$LUtq;[X3 S{߮n5ʧ{JSp` jlA K,彎l0M.,-2'j=ܦ$!7pnz#<v&JMZD|_lF(go65MyoU(kMB|k#Ha`F:E5 z?he)* yX'8q'cX3{&'>uˑdEF\kun"&,}?CC1莊C jfM*ި>In@]4_?CAс}庙coMy{GuMgvSG0fNs8KpP(Sr?鹎+Xf٢I pg/r:@ͅ; .$AuJ\Fw®Oxn$,יtIsd!ʥ{WGЁCsqsͻ1HZg+Tf UPܝzjHNAxLBct9'O^Tb<w-h}ZDɂv DʫxQ2+u9 WjFbH:)QV(bp /أ /lXT 3/1VqJ#홶,.)n3a4- )?ƥ n"- Լ89 >\)B2_ི1@RhI^˵ T Ew6]\{qU_HM$'V.[V ѕbW6P͉#3OWt4mGƓ30='eʫ8Ш_WBa4MR"5)ۅgsgʃ_p[Vo p$+<7YsXSvHCɵTP̓EM1ol"d\{$tVC44#]LOHA)*2IӉ& Hj A+ܓx~l͇wU9doF,emuNuVf2l㋅&g?s #%VrW@jhYE('(ːLlz-@`,X_{I;WL6wTeZ{ucԚRU@0:Yes%eN:.UGн0܌2OɬuR5P :Em(k=чSL S5t5#2|v2RX)^Yd& ў8U* ;w"yYsƌ= m -z@"qlܜ/*-BC$fy=@?4r2 C4_!Z8"1OԪ7YɣVAKyشZfe t(o,iThxvO Khr|Xz)uOCrZ e3RKG2yI0'kRiճ,(7 `#]g DK6;$OSY+ CgDemϲ€z-R`>;Nq潛6aPd Q 8sz5p /Q>go'vGM#bŝުϴqusk뉟b}acDH ZCrR^6nqB4[NIӾyJ!4i&2u)mzqAˏA !DABtM e]uڸ[Sg* x+3[\Gw?QuM6F.̮֘~BE^FHgƇ59<i@nNJP?aR4Yx `hY3(0d ߽;ݟR(pQP[9ɥZ[#A~xkM{% }b^ Z`\y76 G|ŰI;x<Ƞ3VeREB~ƪJnYSOhr]RfO 0$kΑ8 ȭ}UW@Ϛ+KIPj<$ JLP_l GL7fڪh̪vEm'Ak.}k2;tuKf\_Z8xyUw K5ΐxH?49vo-3vשpQ!T&?I'f~f-mF*ޤ}'/->[=&C-F 5":l~Rzq79!肄&o } *\vQVRkI`wI 2bS}dz7̩=r"uy. L9I?t6R؈1*Рd29|J!*fd]( di} [ 2Cŗ4rs~'q/ 5?Z]7qsζ0?6 fK(p1W{[Ց6)phdM1KmCߩLg!rGU\ֻ&U u_CG` W13`($A5$4nd+"L%_Gmc MMefCWសwwyd ǃg^=8 VNp z4rsC^VzG*E–bp:)I:cqby95]|b"}Mr-KR:[־vhUm#ٽh=kʹ:&]a: COP;JP1`H^c|tLpECCտi5ۊ.#̪g]vJXC6Q|eA[4u]G@AgA6 Ww2m%4@&}(A.S=\[JʈY_c}_*\V{Nѻv@[?"&F?(u#TKaׄڌHXVG1yȤyyߢ5{XN9%C\nܨ dK5XxX$BqN< ZwOY 9DѠt(- B_ׅVu*^k kʕr=_Ddc3T9ȩBX@038sb% |鮍#F.|=dY 7[b5bB9SEMT1 ERY&g5u~.vS*qersvߌ0}+g (вfpQl_#Z`,<};؟Cf1Ƌns8Ol;'FsUHzQW5SqŅT*^R-b)7r&p$/iAw2"0CLA/')xS dJي׏ܪ`|^YPb/Qv}3DC`'/nBN/X ft#N e{caryrF ~>nlpQ +RGXɲ|dRw}17ZJprR0YǕZyR5ĕ;e!K&~ b/8 XƬ,}eFv[ wbΒw;a!@b)^$ܪ[Q],LKR2滰<?:R=rפ+LJR!-` s\Y]%gIziZ ӧ[Cd34xͅ;1籄zȎRwAy *;8m phC}""zߢ@R:"3Z0B jݛ\֗{Ҭx#`]]BʏB:iRbݓ.nnF v@yu#3tJλ"\F&Ka#ZOjpK_9}3Yv[0=kNf/Oyx,2_qq>xq<Ƿ?םpD' CrqX:$8ʣސ!&tVp̍PO$plpXL{+ َP7/:"Y|Ve=o(qQޅ#ʘѻW"ŀF;$G) *MlhC)%kˇQa~5%6AR:#渽ЍSC9}~!;ү-K~^IZ4+Bt EgH&w DJ=+frjT/I-h#аc»L ~uIV6H참A/{ O|%Zf\aBx5Pm tP(" c X3= ̾3, !LkvSt?`DCTX;'/%qJ&ߧ,n@:K[e1W1~(jgg=E $?33U^\v*EqH1QI&"aIDЬdc|fw1f pН[QûOol>ɬLYG^ŗqO. 8i8grBigᜁiӯI尼E qmn~,Ͼl%nR昖drnXyOP N$y.g`7=QwP$Қ--swLf*ɇQ/ߒ)YO[dueRv%j48Z3GV,7Z IFC5WZ??9;E$a;k}Y3?bn*rG,dž3w#rc!nL6)H=:0і{ږ'>>۾}7@8NeMS^϶J/p5W1Sv +ݺ0]]L1.9MN' C?xs"ҷY<7cUoQ04Il&DgKMW6r pBa0-_JS'Ԁ)1t1~VN)OS+)P A$RuDnqUc_Q)2D`!M%*Mm:voXؾ f*kd~=C 6hX\[,0}M %rv+L,0) t|Weī 7?@R?kBUlG욦 Iؕ-Ҙfn.>"chD[ rvSR[̇gBĞ^h;u!;B3:L bjJ}+6D .HTMϢU+ެ%אI'W]**S%:,`7 ZB=ŰYz@ ؽL2(gރsF<)kA'}9CO.Tuw|2Z6 #`@LêB֢j% S)-_],(n@wU 1+"qH#[ntDvὟ`^A-[[B9̱Ɩ@vM#G>W )vsOl:/6\qD<+8en !^:b9ӵ"6S%7ۼ&HWFP(_jnim2u|/DA/Cg.hpO>3T=̅qaIql#4SAq PI,Bmysrwh)Y"2͆jcJ;"jKfX5[)œE ?םu%0n@Ak %L^?(58<ָoK%vZ=w9;Ӳ,2/͠UqTu%_ ,>_my1%+Tu aڒͳ>n]w糹P(̒ .r`\rw[pj8{ ^& ґ: (Ǩ:0?ɽE!^hgLu7"Y^*zPt?Yt-Kn* 2Epw8-1:w6z(k͠}ryOLXD!'@_҂ #7GB~6ʒ*Dߋ WcBS[ q|d[?^Zּ(nq @@ ?3] W):aBF3!U nlչSXѓ8΍lt5n-OƒHȅ7cD;@ Hk-vo,59zQBE[v  k Ȏ.2:"&Tfj Kd`2an\Hff{N Sufܽș;ޅ*.pz]r!=/|KB^݁4SM (ϭJRS{!(1o?OLC*S[säSBXmfi#ޯan`_9J M#@h)990H;O=IYU/+(mO2UGzN |9>s&K/ ޝWsm;),KB%߮' pyNJ)Ӂ_Q/^Zj ?JF a)0kmǻGܸ1z6Ô󊊮ޱ@šIjK?Ie[ QV!k&%A-S~*}Hǭ^kk3GLFJ5t 94Ba&+3wb[5;H_`th`_Uvڀ9N74nqt *Xzr?m&{6Q+{M]h7$o"Ɩ?:x#5!_(! Cd6-7| v0rUPj< Q]0צ}ǸGJ۵܉_]g¹*$/pCz].#z60H M\5jH0@s)J(:=Mbtb,$aը{e/#IO[8{t+8n* gV dkuD>dt%DꜲ jb-++(2Y0uj~ 1K":dnN3ʰCf89Ak߼6GYK<zII1z5TkO;cnr{mߥnguh C d,*أq4̿r_oGĠxxCrRV[Nl/8碇ل&\V^]'7? 0 $Iu)i!`#Yj{jə_d3Fw z]e 5S\Dx.;4SK;Be &DE@xHV4-"0l1.czxM~`^ffvϜ"79[-exƖP2zx'Vv8 ^l'j2:{ȈiWr֓w^w3vc:&=}Wt-|aր)h@{gS[S DQEOŤ;YbvHge,jlRPEWeLVqa { ~f%LG3*CI_;ۖc!䈓N`uY%cw6:nY[ب4298㖔]]5xe#螨ןǹ-Xd]!+?d\'%1+nۛWدˑF/CСyyȃD#pmbzuN?BVw,1v_q/>㫱]1#M@L9[B 3m~//DFk!:z{[/I";K,<ꁛ6+R`Un<WM1j IZ/#v5ZѰVx׾ 91D s2$>XPtꩍOʊ[c[0$KR{U;OkoBp NsPyðFI!aC] :Xi$LUymsy)*ht}u9s,X1hfER:FD"jqތ* B-rtMyhCXٚL&lDW_dLh@;ۜj.lL50ThDiGJAj1 ivQ W SӢ{oR6I47o8>>x|?3{f7VX晠 B it$0SBHݰR߱ @ roA cXEf>oRabɝq~UCeZ)DqA4zFϭc4OcE x0_ѱ4bK~`Xu;r3ꓸ7u9lUnr l~<?Ѝq].(2[b`1pF8"e[Dž3Õ|M2&!6 "P:?@S*}HOc.i>xp8O`/&hlZO~]J2\E'%;Kv,%4[\~Bb?i &Cyp{9?-M\)J;IGR Nw˂>0!9lEMO.j ]ڎs0/ /DGmB ]v_t5U]ȦyB~R3mjc$-iE5d ^)Xtbzuz<¥,95kZ(UٜDcPl)t8MP?}S4Vp]5 cӉ9/Mʗ&E:="]tЀQ!m b,R~i8`[ݐ_4kte7 ͪq1l_4H f%OõA SbwnOL6+<"{h_3O-qrIb"w)^(t*PIWFZ }:oŃa'BpP/8 rUUk5kiq**yQ TOtj\bd[c1{ WFY $؟B(',D3lc Vi!I| 3ގC-m;eʭV&Pڥ.V&L^,;3H9tBeYồk6j¿ @*Ϟ$jOrsFByy3(ńX'}%3:zjrxI֫ P$XVv(0I{Xh{anKƺ0*~th#P+8k8w73X&qǐGq&=t tVW OrkM8jWε2U_J:T1Ւ:ד7xKedyy֫ZqbG%85ᓿofbn5vTJβ݀Qv0^j&:TY8 =K}øHRI ^S J4ēΓ1ޏ0T4LV&ПHqujg.{ة/QPrǡݴݙdX _w>Ž6aqzȔ2su4H!"`<{#Y0wQ j1̍H(˵S/3OJC%^`Wr;\qrϚބb,]:ѳx{txFlj2ld:H6dXI'<R螋8;hep6j0ޯ ls拠Mg[:!t,Ywkc2LS{3hK|w /!לCQ b@KmHI&L?u~ꆯ+-(mBq bt'l85̱mvp 9-&AhPZ$&&"2jULKEV?;<7|x~7[`#ϻ8 /\_.۳;굻~ˏ5 :c*HAmT`p,Mvpz|f. 8'еhVvtV P5(Q)02 !!hrdGgf 2QD[0oe3 +*\*RPIKUʂĢD|j[$#~"KX!#)IQGu,AE<1bRw2_v*euƩΖw1 M)Z,$1C@(X#,=x0x<ՃEW{6nGB C/)zzS;nKFM$r{yI5_bmecU `ADD`GGzoHXPU2YEEOj} _P*tk5EKD$=d]M.fW}1$X7dM%}<$]p!zFXYjZ:^%= 5##Y VpƗ޸7hpΠ{fT0Ni@! ez#7_O|{O$-Rqqs֑W?֕=3 wnU(?_5庫:9%(l[sa(gs'<%Kt~CI bT<ᄚ $ATy̗7 'e_Qsݫ8)csAGHǗqeдnQ֕}ZƣB 1AΑC0h` [R)rۖDCQ ~ Nz.;Cg@=" Y D'I.ZI J9/y<%NjjDB1Ԃʹ׆y-蚌8G 4dVR;*"a.lL̙UO%"؎sMۈ9J4O¼4ZOJA]p<͆dLt+|㿀-VUscl߫LFn4 8Dg|VulhA7]j6!߿,*9hʷŢuM]d:2M #Bp^s}(ۑԌ{Gp%yu,KC,͌ռ#8_V}[- Ȳ7OA*pb*ګ{\ʺ.~$]4ӓ f &s)&N,0 -^FUWOc™et8%-M?\08VI}D~6XIXj NcEj2C-+jJT\yhi P3b`hߠە?X^)Q^%Jb0g?com-eUo")_[zGx?/ʆt\]6=p|Yb("yd_$CQhJ }D֛4-{r; *yc/<IomzA|VxV|{$)%8UZz3[ϣ@. {MMJ*'32PkA0G^;ëK!cџ̘{#gq7jTZ@~M$h A8҅rȘa:]EoֳB5Iۨw¬k;h>[2y`2ѻC1Nj !gY`ŵ< 6nn)(ʞ -cc.Qy&L|$8wV }FFU@|: lŏ 0P-*j^|2d{Q%'֓,Q.[Ԑ1aR=}BȮL!JeVir\hiw/, qEQ !+6uܨg7 2ΉȟVR0>4n zmn |q{!ZXSݶɱ$X<(7b' = &HFk=z4T[b{wqCU {MU̮'t$T SE0ri'7B/Gnqh|94\ }/x`aW!g:Ǎ 8yѣ˹|hʻx P&u!ݜl pϻK8: PuLHZNH]sk:/=eJUp3YD,"p;ysöx=t\ 3rHր-:>4lu ki5۰G^K>3Eνyδyy>?ݭpȓ+r!2w/݀ 7 <2()KX/Gǖъz$r!Z}o.|Ru,l3% #ބ) I&^mRw0>SCXW\c(N*G/ƢВd ^b8ѝ,M19v\)v#o.h`dEON@~PU\ř~zܳxw'"Z!<[ս3Zz%&KdH!1=V([ [md`ц)aHB%Hyݯl8|yv܏PäR@4zKi[Fr O#<\"XZ~{9|SC]AIG#=|zE5Gz 'G=Pܢ¤m|ΘJW{z ^|Kd)݇n-SƥHH1j+?E*r߻r|>6#|,ŹiQQ]06GT76Xp!Kjر$/Fc(;u9g}.灶A 筘4Xθx[i')>|ʹU苑$RS;e.}3ߏ\ XBۑwJ*h^ibU8hB[*.VMq1\ivksؿ({ί1b~ «ӢSv|A Z ̍۟E;ۀCIWWl#5zel64m3¦+|a?{e볣]|bﻤTEV _D4]/KJdsVAXT55'yt`༆26)l#-P,X4Bp[v* {~k4ҽN4)8)Qp"  OCI9;J;Snn^a>͂Cos>D|T“e!U,D񲶎xdzuh'LC/Z*SIE`;'z 3 3ݗG C3sBŋ=|:dc6}Qqm507Z|fcJ=A8n]9-B"4(uwx]xjTT>sW?HBonӶGӤk+M))m:Z"Ut4լ(}՜IS|RzzI@iHy2k])gpyehngO&TQ-"*65-հĀZK[D% zd؈uK i}[vO<Hydpy. NtC0g "d1+qvڹkX՝xȖ{ rP[7/Z!&EQQ jpJop55bէP(_O|kUV! f繽`P&sF3QIED8Ո^nXϨ#s8K,fQ+&ar#Ϳz$1ʊ!9fԨߴQP,!Џ͚~#} ^A8"*C܍1[. 4fɘLHٕ+K4Nlܩ8[_ 2 1TOPt uRѡ.-酔G&l܎q8mmr9䮊¹_QEޠ@0A_.<9Xm|(e/lxi 4X/g~ Yr4+iA KDUyO%]5Z FR2vq%R [$G) [{'L{zuͱ¦^p?YBUW3ЅeK՞Oȗ#(yu͕!M~~X&HSGWi zChH*9q5p}-W9"Ů{*45.VpU:LVt]zh+ w=GlXaX@~ԙMmŁ8xAhx2?i%=8sjw='t nDp51%ݡ aYm8I'J`6&*F\iF97x/QC uj5,>VKGkz5yKC4OlGcTV@DP'bڞ R$=oW=BdyUaLR=JyTN0_. `$)_ʟVB?5 2ɚ)]Vs6`TaLˢvpD 0<%$xbrGThڋ(zp+P"[W8=^eL\Z>#P\t;kW _G|^Qo3F!r٥!^w=R&d-ĊiWڐm`A[.I=^t^B]a6.ʌXE#\NqVRXG&%1\[[o5+7dJb {(/u>ۖH# UG|H'߫gh\1kjƎҧMn7 BU )d9{$Pd,Je`zx3`NJzC B.mJ2ӝ|Q`¢Z: i;;_7U-^<1K-79 e; Pq&PG>Z.E y>RىUSSb, jDs!t7("Ej5khL:'*JC$Cϼ\)E\-WɽlD ō/͒,ӗΎ掹*@-+1oؙ!Vw}l,=Bj`* hY68}ѧ/q<)` Ex M&P+Pjֺk:R;|@dd+O˵(iJϱ/)=bhG/B(&"Ȣŋ=5;{~o<} ^0wIe)}729ĭV&m% Ժ&wKYG n{lX:ֈg,M]OQƠfΧָcϿO{R!F+KW ֜J(]hķ RRmppQq?VeM 7>mw(wȺm?XY/Rn J ,TPJf+ď_:a%΍G +r:UDSMz>?cɀ9FEBP:"[$qe檗[jUJ&abC| x˕ҏ32UTj:t׃ΕZ&LL&/ăws"VuN`7U؁$,'a!ƣ!5\f1MB\@f ϕӷQ]%b!kf.}TW򃑐l?!Y'5U'ww/O~2SI_r9?ǿ# G*r?_O%HjCDԽO(sIJE緿ЎGuLDYVQ,r9Q&΢䑰Ȃ![=8cWB7i {&$]>Cy`8& Z^& P=ϖ%;Tgks~ ๘,[i[UKq@H916" t(M gǿ渪j2? Q\*e~cd AAͣIa0{"S.Ing:dL% |D%~'@ Djlvܩ+xs-t* &R?[6D[LUH9U](28o( ?U)/TCRA ZP8Fȃk:b֒] LQ1޽vt>Olwt(j&D# ²{Mǎ&E(m[!X[e5 ο q{'CG_+xx7`wU-%`Ik̿;^X5{5BYo h&_zoi;o}V. "Aq mOcBls'(ϔ`r aq%$р1K:j-b| cwn!>jɊs @ ՃUR l?5"BUd}sP=ŽBX/wKqGdUSUN#Ò;%~]_J7[_Q؆JpRd #J W,+[REN 55jFS 5&<5bl;.Œ&mnlciFI_huoS <Ax^_Oza!6q* ؐl $t[txFթ7-YG M]w>r.<3E,qQKd=oA+yZzO:fi'mK$5zxxۀx5uOن_|c{l3!ħ&=%%|xV'NFdPMt_0F-RIK_̱t]n/(;ryjDpR7J\-ckؚa# PtaǓo 982޹hp󯈫.F"K#'/2P!A mJ2H@DL&cg~L^"xUљ?vMai4O|8Ur5=nC~>l~篨s:m Jpk*\Мj)-r]k/oI3qmmcp/HH7Ә'3qLkK1LukUJ]i!Ftf:(7XM`2cev9,⭎YWMQh"ymMVk%oITT?^‹ vLc~J5~?|b͛X) Y*զ@~)TB|8|T}bt}^R;P2"Rqs]УH-pS}Mv 35^A- ^YE8>/kѴU>GEܹRqo8hŧCL 0S=On]j|+_̽7ZqٌdƜ+}12jd*?-m<(HR6v Kr= ulU"e>lRa=wTjՊIcX "Bܻ}eSqF45euH]=ჟRe*gͰx KͿNpIT9hmI4ON(eK2!~ TP9,":ڙzexe麹]! TY&ဃs' rK&7)AP$6/0\v)d%J꾤]MwK* N&VR7 Tr+W>(o/݄Mk%{!!5(l0l\FD\. f)g0v13G~c64JW#18y &ş/~Z%o2,2?VK3I~)K?yH|\C/͢-2> C1}AI Re0!OL@O}ꁓVf @U0H_*TvgaPZ6SZ^@Psývum81|Ѡ@m$tF鴳 sڸ"$ܯ_Ϯh18ؗnB+BkVQzq2<)VEXqɸvw#:ƸP0}psC2 |1 3⾸!8K0|[{bU;ڽ݃8c!uZOHG%ΌdjåVHn{ǡ;h&qvW}0Ztlmd.r6{,O1ՃxШa, W~8m,0|b`2;'1ZoJU`* uI̊#7-\[>G ;=_if/b (yE<k࿕!g]@-nj{eH` ;h45? PY(:;ЇR:

a섹(XBq񞍈"ͫ6ң(_}nXTSH ]-v1~toݏxie͂FN]6QKe KܻYV:'ZfoR.__iV *>ƅ΍NzF]gl Ȉ)tJ(oOQ-s{SDu&)73cPO <.^?+ t-%sINk^c,/lO6d$PBڊ8 ȩu^-AIϩF\1R]8 Ѻ`4 kC) kKg ͯVzQPmq F'Ыr~q珑wU:Ӽ*p͒{,ōmZj0qXV)@_ me|?{?Y`\POԋYGƀ=bގ65yH bS*[t͉B2i 16bY(.]H0_9^9KfR% _$Z3E=TQ-W. k'q2qxxٖFM:r vo[F^Q&n5[ :{ȂӹPiGCkV[HH9m,LBT_ MG!T G<7|3l&ø(0~'5Ⴌ,-|oʙ.ObHrE,c5S~hKCw^,L[%Kɯ{'E$FΓ01,xjݕGkjO NdY|wpҨ}16Μ! \=G׽j"[y%"6C mB. g\[Q21}TxD}S"Bg5GIҟb'$rPzܓMnXPŅZGianP<.fİz>%$ε@0#U$ cѸ^!ϚK|O"gΆa^lN`9tׂ(ɋ1t;18FS:7qkGx~硣'폞qvc_džpp`Tj[r|iʈ {uނ h-̓ۊ}p*L&Ї3nXᬿ"Q鑇%hիCD' -;?LiqZϷܦo@fN)<vSa*lj8Bakr1L**L[-,E >ܭE"3z"w4pP9 ̹SSatH*$]8* םWNtX8HCN})z&x+^1vc!0ΘFilV4ƹ2y|~O0F~8IU•Ȩ(: +J(xY l,S"놪{vL][Ivۥ{5R_# ­&sH8a*Rj%> ^`3u6V,'wUKZ^w#h1BLA>ŌMuzdz*ۈހ1kf'ebОu]>Q ^8sa+EJt[igF' #@kz=҅55^^ <]!MJ@r)$/[.PLSV(|Np)h$^yH}o* \u8I2p.)t ZUM{\RYr\ pMVpF:?`T)fଐ&ԇ! `"0*p޷46z~ O,b!V\;-2loɛtmW5]ߵ6X+: ̎RtB'M1 O<؀*T[PRʤFژWA,MZȕvw|c ]QJKȆG]ҦΒщJrԭrݏg,@W=fy݉)%j?xyZM:qn`ЀǟXdBLwwyvlS 㲅6k[e5 ߭T2Hςo6MN@w=C:kFBVYf Qk$7pgj:kߕ`_pQZkF"7 ٢ | n2m[Q -HR.gv`NjF {ܽG9IȄB'^;ÅS<3%gs8R/oJrz?Ϧ+Ӡ"`*2y7nccfۧ>C$nGVms H5LYQ]c5oK(ʡm@,1ZOH@=+nۏ_yMضnS7xEh!y#Uf7X!,m]U?\},/@?A\;Ct<𷗝/64iв ]SqE0?>FvPJPe#۞# D/G<'XՓVb T7v˸/ ƐѤ`JQLnlWN#cofsͷKMqЪrgm;w>/b\Ѣ:N|Wee̳:4[um C,gV`9W 9#&1:gHpN8(i4ZJg,X%!mu\܃MϴFL4>w/H TI }Kbzw,4LUI|C1m(eS: {$YƎw+YA ˥'2wxg5,DMz.L҄/lɀ*׫okH_@'8'C&Zlwr6 eV抑,̇y2xJf+~30bo_OYɬs2pn.oU+N-}Mi,[Ⱥ5 ySoe,XD54ɭ!:̋nQd ~/9PVM{]jO8G8հ+Zԥk ?y)ⱗvحʻJ]yzCc%߻:|fΞv.? Z,t{TЖy0!i/ױCI"2˃j~ݫP?.6%VQSEp Nm'a<43pm}O{J8>q]2K: Y3i h`W!9-dLҠt*-nqZzv["T%i*h!jEL@,2s,ZhI=,F/R!D:*>a]У4bζ"/b&Kbl$inSELث/ 12Jj)*r7b5 3L(kimax[߉QG6|+\iT9oI##)/"7DGݬ3ǫ^O?/IcyQ>EpAIJ.M8 w,-L|Ib-͟泄Μ00uQ[U洐LMըm;<5OnGod4BƘA1CKjME8^2CDO,.>/c:z{u9ɰMXnꭱG prYv󿻥C6a?ÚE53Q~Gj"ྴʁqK[mv|@78i {v|̋F]LDM8#?cH|o5 w@w ؍a%5f= ڍ ~6l~gDW'wdc:ß@K'_I@e֥D L:qܰiL`BW-Bof 6[ƫz>XAR#_XUlrKs.@:OPG&2`l%e}! Ѫ0;5_d0=1O؝-Aw89cXц\m ,_őioK|Syﬧűv۲[:e\T|)ޯP$:(4 *On(rIv:}NJμG׏&hD1*N+k_Q pOUkb7Tɹ2ODD ޯaۍҗ\ w2+R9wG{SZ.PsWXԓW!)wpů5`u/ /Ye⁀N=&e3Z ?Y@?'34 N.pز>M# 8uou^Md8׻i\uX>lIcsWl$ѽ MB>6KVoFwۧߴχ!Yxxl?|r)r3/ *?/.(A;Bڣ0TchZ}0tn+"]wf-[XD 9&]hT$yYOYYfC?0}EWw2O8AO_,!D#S5[83lx=6/g< r!=iuwF4(m!ȩgMweѠf@y\v(t+chnxn=yFН0PN_5(\Ld%(B)TTc=e86D~%T{$>6mF m]Qw˷JyXkSa=˵898z0:;H@Fi.,!r.9!N`n2Iw(tL;0\/9$4e@ɂL(KR}{WV I6M1+!j^a MVx*`6\948f('QM"bbnҼUfIaWzcnP=w#gZ]W4{I誂_0Wa8M?ҦZ㺢lqj.'랎(#ACu뿷M砥`8cQV—`0i!w'II?ׂ4N dp[r)p[ˡ)++Y }yz xC@^[eWO?nAJzwNTFH)Vz>hfs/R8l,*@jȵͭ+˴v󺤦Jb.2w"K{IƂmkM&oϪ1˓GGgRZVG/al|J($pKO(2Sh1dJS`f(\h{X2 $qS#pKڦ19tJHz_sBO5 ,))CJfh\sa8lF. &azUe!FnskΫY3 r'_B-( SfD m^ՇZe0QqըsrHy(cS гv%wyAR@0lØWP}KCyͿ"r%)Nw=K)6zꉙťkՐ9 z  =PuK^E~Uw\$.V j  eajU( 4Gp C.o{ߐ"B)ށ~Gͱ؆a=ob0,emȆV"m6tNJ=:wD?-+Z\w:9D[[쳵 u+Ob<ރ8U("PCnصiDtYBx&i%,EɌ~넵I^P6Cr[͓*\&[Iq2q@34U@EEeuZ+=ōW(HVNRɔSN BD|ѓJ$t.*纘lrӧ#$Ŝ%zǁ{2QL2qqzr~KtH恓x(xRI"庸0am*rVw>P}2N)SD a MsL.#5E1Z\")Q .yHRWaqboRQ>{I58aCJ:*as `sne ]I&)Hb: >P| ϣ=!ɒRkgvT.Do;\ vVf;g%Y#_vtu֨8Fs\h?0Q9 h*[FTp2ʜ_cTz(#V^TJB x{P)ej'Ƃݛ a2?9Bƞ0 ,;*1Ʌk*hEnY|/!r9G VJnDz+++#.gPB]rf!o5NBZ`/H⎭(h{QEnbM\4Tp9wA;/ F}KsCq$)ter,-T羓q42lUt2: X7aO ڸs :Eͯ!-~/Sn?' ޿͢@t&ԸQ%F8O ḟ.$GS& lCpD\x5^D,2^TןLM&2/3LR!l -1^ a '9j 湫HD֗!,k3D+ (z1f>X9]PiYH*6^~l:KD{N%U"ϋW/M]k|$ok3eZl?J;:A̼U:QLz aHrkRPri˹3@9Fdv]UJ$A. (Uk]&ᇌ:y$>I.{¶o/e!KS娟Xua md9l0IOgy\聦i@NkzN V.O=rB];Kݠ315W-ÿ͜"WsPi.O7oO`FX@{SA& T.$QZ DZesR_X[Q"I@c$Dw (GecLU'䘃h6|!RLܚkR@+|_Xˉި{r3\n ش>NRy:iD0JP:Bs>p_Gjm06Q1$= zb@8޵BsO:;L68DKnqQ~EgNS 2)0hYWm" H~&Ҫ%aȟKCʀJ ]5C<0稠#+Q$Ij\#5\y%@=]]QZZmI2+C@h+ ’ T_2B˛Nn 1e@oim^Eۛ#f[): jιu!(pⴺC{Jn6MQt|^?|Y/Sda{?mԾq [<\Ff$Ziw?t都SXEA9M4+ CiP:[ 풦i\O ŲDʊ?`jMoREtsK~Xp )$XhLͯV/<_-!ç7xEmhKΣsEą0hG'fV 'Q\BvfI lTL3-5:pĈO9c( ΋ wvr]W@P7LmC* j r q HW0BKe~sx[mAD8M'A0I&Sz^~nC Z>@屻 ۠cAYϧ60e3x{sO04dNk| g4'[F-@C$Qy*Z2RyO_و/'= X.I%SW6vpb:g{Z_DYA=A|rv}"n{.G>w'RGw +J7We| ]Dn%xTe-{J5}+(T2т )ROTݏGg4\lfǶ}M:@SgP畏AU^iI T*@v'&`=urDp8~#%{frqƱ8c~DK|99{5]m m, q?gqC8`wzGYak''JKNmȁFb ^/ :\$z6nvoD3BEnc0-b$Yru}Eϲ1I}bog\3ZGHQ+%64!ޕ=dD yToOy1k΃8D`B]LfT2vf\1/24q%.mR7jq*_d海|5%ӜJ7>^cecqEg0 9.x*o*)r8&b-F=pv86N[qeFe#3 ť)YP[MK]Hchd3"~XVD5@Af> \*/;6.$lWv1Tk> A)/"Z _/*y 3|VI%+*:|h$DBLa-#˞OPYa)\WN*4ؒɵf3E*e=`"gs9Q.6vDOP#tÏ Oe3IF*YoV8mi֓1tO}ߥv7 wDg n"D=t2͏. 3^I4Y{}K/c6%Z/{Գ#_OJ©z찯ʇWJQ9<,'.-`1b3zdT}03.oSIrLxB5(cE*YwCGӷa"5;DiM8]Eg凡?.3a@D?++8/eFZ\DYs3h˻qvCGnLuHP3z!m "ĄB)Ԏn;SNN8oc+) 2'F\v}6{OKKc BW?\!X8pzhBmr@8feBp{╜\X{&wܵC Ë*ˊtw,~2Ox%f'kuIATL$ZϭtA#~:ci? Z3i'0\WG5A[m-Lߓ[|WW9B4_vPtк]5zN/brgB\ i}lz8_=+BIvq|LɆ<'tkb:~gh |9i_weh"h2X;ís-Fv@=\< >l;17N3 t! ࠂrxL?vqnt{1K![ Āʥhs X:,o, {$8Cmojmxd=5+G@1ШxRI?ȫO+ /HA9~[a`59"Y ;'g;zxZ.gϋ$v2}4'#1qe=28 (?()8왶3(ZV3KW.%&A0;?蛼0Ĩ]+q[تNw摟{9e\iwL2@mWr/2epAUh (H7楻el*^&u GO ݝ?R&.ffBH!j>fbسm_zϪUOej0W]׸jW3BT2jYcX̖Ҏx~=_2ݑN09 c% goN MQǔQۺp-bX&jf[6[ ޑ*yO(W!hy9/ghҲ_{YqH#۩+EX$g%wgDbS͐v4 b@́bs0Γ G8f 8 V}B*lvw˓\y0}f#ſQJ3?z ُb˓9>;roj-۵1i7G/>sEpI"{;6_8[0;n\ĺR!(lKx 5p\Tqbd-upڋT$a'.Sb`6\H.X?.N?okfKdN\[Birb} uCϴ_hZۿ $XAsSICw*8OopDk Iift~QqM ]KN Xa5|]"&s6:r.Z@ }˶25lj 35~6E<}"ʺ`nÚc.F|R y*H8VR C69p%ЍTYٽj VxOYNRzka,Aq!9@x0 @0{vX]=VEqwgU} L(g~0|u-rX7!/ 2ݳeN[q _>IƧ뭌L{Zsr9xB;7 i^v!<|ٮ , ,l]nTBO{+%V0nDi67I o|c wOGlnC>}'p8L >ߕI@<^2d"˭G8{uGcF ?$`C̒:w\ ~?TR*eW.vϱHFF88dorJ2(z9-t< @PZ$-uq+YH$ H218S_0sQɤ\Ky6۲'ݩnh"H(zv䡔OvoRRZwmW0^SwL;f/uGdcDk=NIVTe &gyX }h%YtqU^=]5*2 D`gnE qIBa·࣢`20qpxAQI&S:z! EekW>,y3!'ACͶ8+,U rB8ZiYP^rJ0K ҍg$"+Oa??mJO%R?ѡq;epleTdkt55 #I b5>䌥B©l4ٷihڽ&Os05w4PڥQ=Ǝ,!\}$obrI16<)*, y1wEEXimʘؾ|M͎󘂽:i:26~JDTmD1ZT+<}RXl$Ssz qT۟wL{*$|Pnޡd6U7E4d/)YZ gdfV s]eC>s G\~b hv ]FER͒;X 9[ݮl;A-C) eTW+,R(+HD܊N&UKgx3HpsE<1@2KkxcԘ<3u zn A% 4`',ZYA/i|4- j׆FI^H'+hP oD0D*3VtOx[F yqV,1?AQ:4ՙN6崿-[ӁSL)V5"i<琖|J-KL&u.g}4h9[Eѿ 67Bo68Ab? W`q}uh@ś%8++M5&hĦvfH%&tK>VGH{O}tOǪj\#wZ6S\}"Wb6*c0m(3GOL>5,|(ۤ E5-gO92 ۓCN@ "Ҵw,ܙ9׊=9C]2*@*bJe;( 9X։NnBsq#m]%4%W D` l{5  lO]XnGW/Qu+/m\Lw }9]&hKk2dް_)V̸q )|v|hq׍qG$ / |@]߫ ξvbn*vbN89fdr&9ag 7 (p4 +mU DxcDlj?Twګjk_3OEkl0'+9o6ckȚ3>S\2k4Z( h@}xJOߍ7;zKOQlNDZݻ.pɩؒHF)Z4 i Ǟ9D6;pMCĪT@-Xrҧ_h!L󄏲io"X,gtXaOaTy ʱO]ZWR lWԭԼ.fiu'G,@ ߍ150j08]u$:9NNmV*OYGxij,.CQ;o?fXHA ya4phsYqcֶqsjuDMy+N3B+mcNu!~v~wyHccYP/.qք 994ZځiCd&4ϬQDR\ޑ[Ż2>}P\H9"ῇJ('6AyA_$ܼ1kA>LbRgU#{ H1'iymHjY#*X=">21X["%1pү2A~.S !SMv4EY8ciYJs\&CU8l X f*y' aJթ7tes5ڄO?lb8ŗ cEA0d͎QEPٲ2{5J>Y=05{agd(gyL':{p@Y${X>P h SxeN󆐦bzlԦ"GmQ .뢡{|k"F0}4||5"xv 4[:4腯]>R8{ zH)@(qm'0j74fڻI+u>oD!@r_}xܖD%$a9 s$QFHʛg1Wɾ-%zb}#$Yj-U,N4--!,:)lQp!]Ղ. HSm}NX(F+kRwU&WN_&(_]ErvB_>BAB Ck] )L=جMY\8 D.؎/ZK]~!8(`SAjC`gU8ױ6'нRooy敦cDzWYF %kJ`r^e .X2غ~T́?oy͚aHcOcBS_yul.W36o[9@cӅ|#-\e͡7["hwA˗ P +67J&#ӷs{RѨ7oK|4^KC'\-0[Pc8C1):wV;nVJ+$x_bU&ziao튆N\l駃K6jRxdK|?J_"D0#ҝQD%WA-knsLnt b,K10}~9]w Z@ɭY>=lK?Wð")ֽm ۶ьzƗ3g)Oz'{xcK5mLE 7:59`mV7V߭ǐP  !, lSXMaٓv8lY'Br6X_4ZOZ42ml{Y1H"cf0Wpl0.*x9pVa8X:$6WTϏE!De}D/9"pR0S ]<;߬/E,\!| wQrTZa cpîm/Q}9 WLF |LC`o ^z>/_@, c$.8hC*; ME&80޺Ler6YM%ܧS: A2Obݝb4Tp|Zdvƹ!NgTqM::^y,j;]}';'6s!ӵ(Fd'V\jvkQ3#x[q|tCR#?+ȔQTf9^dA¾GE]6ӯuv1,G6ND~Q\0A)e }C/=& umzi{c _'+`Zz&BN//AjXzr ?.o=D Rr3[&}TP` p3DUs5\ RV% B5zH߬S6o/zN`Du;/a*SjHsi+ڜ:*&zzƚ­ua3l"kŰsiTKY ^Bc Ψ2F4z.q=1fܛׅ0 Ј~#ݢs2\1j;CZ)t(seNoScCb]:dJ%c9zA櫋>:v)>xBٙaC(WcYz'F!Yhxݏ5cw[VpiVhdcQ|6nXNk2-ߺ,,t 眂ѣ,,‚I߄nud=cG7~zŖwhؓ۞ |nB޿ouR\"]o梏w>6b+K.Ds\dݝhPWN熕Fxi\=ga,+Vk;-i2O0ej; bgP"mT5CIu\:.@h%ƪ:[ Y0{Co Ǘr^U^N&SF_wЦ]$ B;=2IJK*Ios{7BRӈ$z  oi҇Vm|-PXq2O8*7Ylu,ڋXP4T6fΖ;4 "@?H8kj16мq`ɯ]5CQ,/vXvq_~AjAtRAp6gn;~#m8vl{A@*ʜh;7qa5ӖL9"l"l'MF:M: vi@Mf JA!EOṍS[.8hî!sSYIi)\xH|'{2ʛ$4(`$o)2-+bI },eWHtFbg3QT]9}D02]FE1QdDLBmJ*lFXHYhsV㜪3015nn:OOQƴ&0J57> AwxFF;$z{U ff|ۄӨNA#wj;vL:w)^1!Ŏclo2L !A :@$k?H`p4b22NJ^FL9+垜y#(dܓRQ2\6;{̻mmo7G|e͉΀jg4gz2y(B)[wEw<53:(ЫHzGh];w~6scPq~{B1 lny@7%{O_- 6`|!x/) bQ.Xr3:xߤ-%DAO^9ŧ֥dog^_yu(j'a#l2:74xR .b-RIM Mgqls=vbwL_5BV OQ3RipR8%^>T]04lОh9Eo]=FKԬ'C}ԤÆYwXtd ^"(HeC| w`"78TH)j"7P*Pa1Jd (]Š_EII㧲6tܩR?)Џ*n9ՈM/8|?ļ1YF15nc*6xԅRaSr ʅtDkSV-݇C&jЈ7r9Mb-x|SVnEЅ}5r0u7`k+f nrㅣ ko9r(4#JqH4kƺG#'ql۹ވȯny{M]k'Jׅ#@eYMz-hN=Ù0?.@%3#S#>CGZk!LRvڪ^+QK~ 8*</z6$4;kR^5`$8hQgfOZm6Z8adW [-u~bd4iD[c.@ G:lVHr?|ԮDM*eY\&Hf!< C|ܷfne]3'Kת+ϯd@RM:SP壊4^ OScD߀A&+AS =˙&%"gSP<&QW/G ݑ3w;gj)nڴoj9%̆1%LT:N? RU gGyw2+s3\_HX΄ 7VgFn eLop !SMRsߗ;b˜+Ո[#2Qc & Vj(ŴmLZC1йV繿5l%SIH2~ZK4 'coG{'GFmʗ R>o]F}-ges۔:65ZE Ij&{z9pt{\ )+"HA]M]%0 7MW>Aր&V'c69+/`!F/j\mK1}N9.vf%K<WL%C˼fy~%^"*A zĶ^]NGdoG<ٱ䥿FBN@ëj`ՓM=XJGn/}(XZYn)N׻5"fQ k3Jв}?/xUȣ—qVEr Kv y-T6)ednW]TloDEmLUB RnҫsD=p Zkgb#uA9mi&(;"p_ĤDgI/7P!dz Yⵓ,zHchyg:T'r,[?7 { CJ3W.㌠>&.@Kn !c{š7шR#ZR4\>SjZzC(}R"EL՜TYEϗk 0Љ;n'#f8hw fƉiS!I9cqD:orfM)ޞSIv6~3w& ĉon} F )IS-tmnFhl-@Fq!Ab/6EKA/#&:RaC:xW|ouj:nwc畏ڣtliU#{G?VbC>uMD}8?p}&NnlI T'k.s|+ LYwhpC6pdz#b8}ia;9u^H^1]hdk8Q9%{9DhLhxU)$c97IThῂOxzZUoB0GM%_o-vTD+"JaF@jgeݖvgsSI"",lgP=[ 'uu}q^ԶI#j`.Ϝd, 偀j`> hPb0 eW<>qNqz>ngFskmrN(c$}CCpQ[o.TVV_dzm']? %M0)4˚0SPQ OitG &/%[Vظ('f" \¨hm7X'G:Q#٩?B_8tהȪHsql-۱]]/u<ʼa3[g$JϐIPİP哹Gw 6JB.ڨM߿xץKo@YWPfĹinv[JMe*+df9n[F8ZaN݇*A,>XxQ3'vFXL}ֽW M5YHaS%gLLm{_M(ԜfU}1O@7v ފa-Lf0&7@5=*?Q98Hش~$t' ՜l" eho^<驊8ҖijR IʶL`4 tpY4?ZL*lId3/?7nA tv,Ⴢ[;Uq pVZ(>O6GR_|}AX*SRFl-7t6 |2E Qa@?bhe$E[6fpQo~+3ղyYyźr=D3U-}@ߛLJw"VlW,x˅U2o_%X*l0^2;v|yEU(BԘ$%gR+_,4F]ϏOWBT6[r&.*4a oelr!a<=l<Ω/j H"2<9C3:AK,0^rgԓnHxx>?Mz5m& 74-UfzfS \ņ-S+^rR6U]L3K{( bSL 1q*ͳGmΫJSf ʓ? @;[vU;8`1OBY9 Qk=:P-Ytc3%ƣ X32ԧ͜&;ZT${BjJx'!3 O u;Ƣ nT_8 o}&plnى~\v˾ !F&Ņ`/d&k{ã6'υF6*!#_KJ6{&]kw։ƻmDF"6t@,Y1[#?*>8DA%]E2v6Tb5lD >vR?q锼؛:tlϋAÝ)74Ci'{X^x̊RjQYs[մ빦vG̥k=Uݒ/JDV)ܓo:Ic:*_-hϿS˯GVY_V|/C1ϕo.EYQ*w-X?B<֚;p42< E'sgLt5@8c 7,w2 b0vRn(L4t׸bО\ iׯ_4{x .$7g1P}dV_ah* {'8^]/gkG8C>8ζ#A簾9_{e}=>|] o~[Kvװ&u6G#yY9 .BzuרM4p XdK-5bx!#L<ƉZFGsx,2۶eA?Z)UsJ_ʜȰ8KG 2jifw A2B!cȞHaǐ+37"JY-77o@5qV"KJk6P prbuKT1^ojni9 dڑ4([Q}PԚ`T@8B\?,*yKJgoW^_~yhjvB|(!XB`B1U:-JO;GN-ۅxMzȝ>2/35:XV4Y|"#wlOmL'2![P +nGkirǨnH EB8m:$]& qVb?@nq(b Uh 6WVX5@nؠ#.da][ŤTCh z:Rq#*s0+ lK DLI޻eHC6Jy~+zA ^/?suQ֭-#cf}C8ʢVqA ("+frCV&+B",0ơ0za%z^P\b(EهKZ}0#] 5%4alw4tHBzv·7Oo}NԻp΋O2+&H5b~DAhqUR0XypHR_n;' ӧ LA-`O>@3?}kpGLVJlтXrYwA9hoWK K YxsRTO^}jtu)׽MAF~E#{lě5q4ep|2aR 8\%Oz=t[RG_I%EșR R\myCJYސ|;Qt KUN67>Qx[JteZH!P6~.>ïJ@a ܼ@`--[k 3?dp.biږJ )G=H&2g5m/ju 2[3zhZU;iVU{]"BR>n^|ˤυ\i;Rݝ)!/ xKj%X}nPCwϼ ʥ{ LBR0?ksS*/űV':Q=M۽tx I?uXpQú`Bخ[@IꗣOH"MoWpʮ(4a(z &Yqsy[ jȹFRI~%qrwޯToF ҽ\$HPy-/w 酷ry>AN$#rM5E{3YZ0:kr1ǁ{XMױ/jw1ݲ(z]{uUf8A!GPaU~'N4S5I _ou儘]%#]槣 _hgl) +BpK^-+܀V&HEe\Y^4PxI_Əe ~4aK't˵_ln`4x duX:O|6*>ҥa=*,n][)u(UhMY.l"nUs9̓l.ʢzt1rk&ۛʦ~628ܼ-EO8NZ>h4}`/S"057F|EU17'Y+x]qЩwߕVfA![_ 'ͣ"o9'Ԛ'ǕIk(/K3RL=,qvVgWᰏM7eI. -D vibco1x2k}8\r ;N(N""##i]ʬh7b "EЙ;%>tq?%KŪm]T'[2b aItg'A7&E, bVD9/1W&w$yonV&gȃ/GC޿eδr ]ֱ!.a6o,uym+g2vʼn".ˬFMho`WOKƻ/=>TnQ$  _8if-Ѩ[x1mҷ3DD |ΙK5FۈkEexD&NBH jTh{R>7G/nmH̑l9(hrvnG``ݡ ET21lf@@w~ȭ";WXE1ڰ/0Jz)y-w?MK0[d#s▎8J2 %^ BW]9Z^kC=ξʷ;VXkYz{:v!?](j#&]2JJEZNvl[xAӋ^,K9^/s)aH;e$'̩7"tB:HE]oaawݗy=@¿r_Mx/ad-TO)&|؀H D]EOl wh'Ajt3 b>Aa F0 ?(+z.FF[tYrNv[z}lt}T<{=A`_9>>Qnˣ/bslf1!u*p  -KPDǛ,Jy5%:NYw'ηkiFŚW?roKc6qL".0dA*UY%/ٕ5Tf+r"i}v_% &"ZyENDbyJ.o'!5)o m8OByo.ۙ;ز=y ok3/<M%d'W3Uc%) 6ePʎ?2C@t(2<feHxD7o_1NTXhslJh͠󗨓|v[8oZU+ 78½DH<5'?H퓙 @!_J̿r~L65}w;|ΞR?~<+\THr;pӄAZRXKoW{G!cwԢjջp}c[I!Wd>ăM,XɝڥaLҒs&|# uwrq~Г2àT23R@9 wog^Ԑ̭|aC\ @{!x{1lw~3a;;Tλl6 s{} 0I8)_DNQg:o!WizP NS>7KKfZ4**S1gW] yۥzԋ mUҌ֧i393k\XdZ|QyBF+*DH t iLv\C@s{2:DJ aD[ `1kXs5%s{KUbox!fCֹDs(LwrjN"dTyϴ,pCאk3[ùt ~Ŕ;~|6@/T#_CDhI$;:l|F J҆u̾ 6!Z1p\+z/%xurjrmؼ=zP)&:=y;NK!\,e7qH>qvNp]wc{%)4r~7ja_|a7ՌS2 gټO;=/J^C/g}bN,1~'\!cn\A7ۑ/ E%c/_m{[0{w Kh.JzpKUKCwMGkupw̋[ ׏9a)q:s"슞<;X_6EœĮIS ١^d%91&lҠtβNtʭoTT]G.uRb_$IM-?ITMgRU/dbV:gaݫk-?,6w`[ 얁 ܔb\9m 60f?+Rj3JH9-]b+fgo(&Y*Otk!+d85P8!F Qג8efntt=Om TCa Ä0T< H"2s E tBoMm_eBFR0QRR0lH˶>a7ؑS?-"&h.i"2+'\"XNd mda:JA )B#oRum-;/;A:%cz=]-46󫂫 q['6g/ay }Kv)9$ݜ qU])c(5ַ)?$gOGT>ʖE.M:7!b%lxH9%>\nC!a6N¯dYH( GD.P6-wlx qJNs efm _h{f&I%?d^>YD Pa<] dh4GJجX!d``,sbs]dIZ'ܧf7D)M3}Z2kI]Ia|YdUyhBH:ɡhՀ2M|rZ;"*b_=g$ZڜƭϹ9(- -;V_`Ԏp#“|^fVCPE9̿ln[咽O9̗LtG&" jy cg{x4d6_w]ۦN!Nˎ!߸(gwL:L 6g֨8\6k~ 8r6wzf=nMru^IA3UV3jmZ`qgزúZmR )11eD;][R_+'JvX i|!ċ 3 篤H׉Y )CRzWf9;4%ʛN_iaS=N?o\;G>K3i_r@i395=2"4T?V7M 0vtf5qc[Vmbro.#yTO[!gy5YvN$C>>j+-O<'cB^E3A:WF?QevSVeOvɞ7WW?Y@m_akП>-3@0)S R6LE7N)~E HNMY_H/ڟ)L+V샫to uR( cӚpa:S4mij?8Xxr eyvX>X?,\^ LD츢[VY"f؎4q9F&l }g߆cҏ: 7^3]C6)aTI&SHcѵ_3׾xwJ1NknL$%@õw ϐ" m/+g(ӈ̀<#"ZG$mYX{`(أ&/ Pɕ0m-lZu*+C@)L ao@ڄZC^vO][0,Q:DbA[0,]23Pn6s5cT2#>YU]M=s a2:v5풂&]w E:*{<.ن?}5D4{dd57h$ K4AeM͌{)+e,Ue!UKтF%RD}N"EgFoy2>[M^ R(g \QfTO.†`տmHWи)UIr${ =u^S)[(ln@"B"-O/ v!.fM w't߭ D$πOM+\=F Y!1&9Tizy}b˔=XD/;;ARS]!8҉c67}W"}k!80U`tKA0{#6d]`T}mwR E264Rs`qcՌj(f{o_.7k#K옾"Y:ϱ*3 2w \G QI|Go{clh,%8jUe JpBHPz^]ni,@ypʵQ1=wL҈exe@ W|Kڑca&dlY]s/=`zx͎y{{-cՂƛא{Cmx鮀.p#9@/Zc{C >wm W;X$KK̊KbBY3AuՖqp9/rgLYpf6xž +AY."6@yPS1h1*Lsi?1E)5m*CCsu To|FOEzw*Ar|#-KamR2+pv3! oX#WO}F`}w.h%o-' Tƹ 5u⿂LM9qBDzw eJULZ& eIgF&CJ鼔pFZ_u훕&M.ݺ Ԑ2[TcQJ)^QLvE{K{7ԳC0 :K|yfJvT^ SjeNPz#"$TTr7B2#ZuĜˎ#68 :ٺmh(a7iMmg*Bm*-̣bΥy3^uN:VPmW%O3aHz#< C|LČ"C@7D%‰}JH@q"~14jB ; 6?O'Vu WNF6/Bbx-p(Ao=[EB)kO{h84AM)sH ' ۧ=  <9P$D^uPVfƔ[& .kR.NiykΗl}uH?duIFN/Y9~foT!LBGZ`\E[o ,Ef*c5a4c/C  -5YSb knǠ zAzbw~.'#Xa 9- BBӠh; ےyoZ攫QQ&]pRo+J;e-d ִ&Ů-MFEМ?KYz:w}ѦDlnLozC-(\d ߼veT{Ay /ÖF8~>@{FUfbL%/F[=zmnTXcv|v1-*1wDQ13S`kˑsG7k KO,$qڵCF3$ xzm_D~vęa\` yVXm L clIW} 2dqC=6 &$1խF2X:/B/bOl|'USӟ\h-l_bX]ĵ›W;[^ z}i3q~dOe9E_j2^"݊ł;nGXO4{%ݙ41nhBKϔi8QWRb@Ⱦ'lϴi4J.Tj^X*%'i4V"*h*+sW! ?m<{(LC'Crމ>JП}3~Ȳ:ΤfZ~1; yL>ӫ7MBS$ؒ7³ mBUռ&`qUQs rn3"cCǀvZsX`v^z^zX3x[Nq0cjPI71+=$H=b72:rq/fo;k.s0q2\0b[",e2p-xZ@ApGjA $6eGg'@|s;6GtQ#z TMé)]ĹӢ"`Y0[ڊ1o6{M߶980ϴIf7`;sf9 Q3_|$N֥;3`J:KEgRw T c9z]. &1'n7S!AN0Cbwkl㷦>~wZ7^)*xG.ݰeyb+b~m%vvN:)rZ5%QF|xQ%M(͙27fFT- U zzIC1]nUf!Q׋ 5ꪰj'c 8,厏x# ZSGf gGQTaEwv.ܽ՟#iOq=>ESŎAMߐ3X5g~JlL"Rkް%E7oO"s?%cH36>K[6-2Ghtطw@*=M;-+Kp0? .I@r fmN[wt-+(xBas>Ϊ^L19 n yY+nK­t#B~8;qf2bX, a!(eV[W]O7/tʔ A$&w_,7D9K_Y-30j[kwE.gZÞʴV,mF) :q\IF⏺ Ž3bw*8a}m3>9@ւ`3\Bx.d`4^b~ugD|:îI^*C4b KGvvz0jX 5@D4 #*=]&kXxJwآ?B3"?>{NŻd˗/Ty]a;CL43v[XΨgKU;!^%a 3(ّNMs ]v ٧.RVw{B#[ K TiM]"POzM&`~G oshao2o܇;dr\2|#2:ՔN4lϰ$ve'ĉ&lXF4C-#+N#|ti/|4^M"x zD٩b 1\^W[4$hǞ5ľr#y9?& (Oȥ̜O61 fMQ#_ݑl'ЋҀ1f8gd%5qtAnġe;m8ib\{ֵ ()ޭB!ECQAiNb17ъ3A'M7^fƖr?Ժ ]NHFHьP$aS0Fs!̩YMR}Rn_GV  UƒW*"FPPH6IcbTg x 4@"/lf޷df&-gQVc&x{ ]l;PBtTn r*7rI"R`XZ{ PJ$\ڸ$ĝqa}o7d:*=ΰ˙ 3g0گ37}oV`Le C;8Nk+㫝FAt]{H<馫${#@"::Œ~7SZm@!k'АE]U-[ ipߐjUhy7, Ju|3 C }['Rm-?n`+F*`N n?+2]k_7 T!+Awg(;d+ZIn˒ԾI?\lamzH:gΠC8:|A-&icB@%]cth& ζψ{uwjsDٖPjDJ=XyzzcMeM18^9[{FZ 0K^87x{ȪJQk-oj \eCl'퓸Xi| n_^dH\5mN3UHp+ kP#1Vpy):h)DP'0N3 I}n I[Ph!Y~/]cB+$MVJas.{P֏bˁ2!W!;V*w=WxaJbh5\9\L.0;q?6L\oNY.k - _鶽ZiJH l2uJ䛥3|(T%|i&D\;9{&#Yn 0d(zF򫽷fZi1$L`D|A7Z,uȎ);j_ιK,>va3Z|'581o 0̳[$J>S*͙ɫ[ЌA6$pQ6 Zzi T:=Xh< ay@9) s""1[ȉzɓO*)X?M \)lJj= S !~+Wda*]lYg&ocpkh_Zq-чP$}߭J*P{̉;U-d;E@-:%ē Dg{vdi6G$xPzAG.zOJVIj/IB2"(ZuWE 2}_bHݴ^ :-:G=Ǚʘ'OzG-MoVq7{zP6Ц֏S:t&@'(vxj ڊwNM+Md],?Ћe8uFlcX`-0s Snǝ+p=>.XU>ގ&jŚ0.hR{S;46P>z|<ϱCG"Y684.^V ܞyPqR\58iXwJ٭4@4R~ڳSg\a2`gSʢL~R .,PNKLON{ rabCG3qPSO1KnB.a$yL_A'" (,)N+[c?zHj %g,tSJu1XGxɱS9J]~-< uݴs|"p1?8Z(N2 u{~շ:Ç3ޖ\ppyT\5j̼ EAsNr/YQ*31%7֗qU%enJ`cE2:2J||Htm@l a,61 }>bjKB[`"l>3W|xD8eygXڣcz":@^DwR+L}|<TA\SgeYU4K/ =O!(}E=bυ-;_r$!ஓf/JCCr,::`$qjG;; '#1}~zOHYx7 m (9Z y\]*VS|\cE wzpfrlT |SUϐqE"6Q})Y#aJ^4y.ϴ~Vsk"ts>$}WB\$r8ML۔`Qp @<cณqz*&Ӥ^dI~z U#n@(R"=\qEzo͋ u]:IH7Z=ӽ. a?pyY\ T;Ab߶&N/sW ?zhЬSLJ]R?%Lѝ(  Gp#J& O7kU,;(T-JJNDԴU.&4w`5X w(Adr]&|@``R 9cZ6ͶHҐf3%lN$#0XĮ,#كV~wL`(6*xoͷ'DIӃ/.\2i+Ѩ*҉E!ˎbxcy7jZ$)@'vp=G./F0e&#>13U )\%]y/~e urR0̣j'f;Qݢ]*H". 9=bI9B'JFN_2E=L os~m,3\˃m%ٛ96x,Nkh:UiȰb@>%}4¹&sx5J{3r *6]Y% #bT!^PBG۔~Fa>~j<ĄܖFўy08 _JLlCD9Sk{6^`w 3$z+=j&\Z'zPkFN|[T %~:ޯ3LRpf( ߉z"m9.́bFG_&ȐBhFCͩcb90A%9w7Dn+з=W@l{-m^f+p)CJ5`kе$p{U0\-\V<K/ {P[o\֙8t8RX"G%XfΎdCr6J'(5OD2HKlSFGGVr An90=Jҏ.2 Z]AH2}6F5=j } dd4bwxM@bwAܸ&z++50R1{ ByTlaVuf<ik7xyaqW"AC8 -iɅ~Y"mD#8M KgCI+nm}bru4,D1n|F8<6D݈J4$"S-a=JRzRSபzMpD46~U#,r9/?D~TĻ\tЍcY2u_O!ȼGAE,wVt#)0}ET7ӔC9,r<`<&*].Д8z8}A:|e N !cߍtwCP)"T \XU  hiwbjȔ `q! ][,Az\ -\DFM)ߏ`_{Ҝo4Bl2t: /RBYSCdGF@JJ ,棷*XSAFFxXR{j׫[@L{nhg/_mᵊ\tAZa%{*Yp(RM r Z|}tֺEIT zx)mW}$R Z 6#P<ԛs5Hg!XxH?W8 2xF䣡eg7=>ikbSfRxUuzZZMd1\T綜 ୼]m$v1jst9QC4r5&>o [Cņ'3틛6w> |U!u/A?AR!TJe F^L>Q6Fr ܪ}sOPc?^c1SX|c_\ &6Xm@<,`T0,GY6tJ,hOug; =*lt;avG5Ҝı)ͣVR].<%(z;NUsy~r+\8 o+Y-u+\} ļ!Q88 Ε4ާǘ U&j.uNGFNDBP"̊5ҷK swlnY ] R|~PxBaPXn}t L:5{/mμ*:R# oᵒJ]7ǑLgU vBxA'X@IXR]`i*-]x?v3W'!Ԥ& x,k >#kM/ҽ6Iaҁ2bFȳ nb|فήAmRR2$kOL(i2,$hŘT]] TMN r ӈĂ0%5\RvR^U 0в g~^Eenp%Pr_3~*䑥g}b g)x`$g Un`l Z9{dQU43 40Ug8eTe -w#rl,P׃92qu7|]ϏnsX܄Ic@,fC|h@05Uu]퉾RRǨWқAzpwS/3D<70}]fPW{ULV=qokQ}}CϡN\p$\۽8CMc$7$&erdMpZz_c4~-a_:x-:c|?઴ 5 uфjESc>H_3ް}# *ExVKXٳtei`.b'{8lЎ$y&p޶ *k\25oF6W۠6WVDk̔e5KV6tv0/ڻyPI:2ati}Z(N S5%}2ʯaW%]77"_,O/r$ gЈ'x:8(^iu&kBsC.thqB4v3Ì0Pp)QQLen2_ |7u$`AZ̅<j2O(+j:`.ſch K y>Ň(js}Q/SV؛Ud;R՛)o55'3~_Wģc '(;Ԇ]/!gG ,0 &)SL(Npf%8"k03aU̓|y0Mk@RHDom;G98ME#Ywմ@&<{_`'G̍A[V۩ߣWJIPYc^,L^16XX 4(e0){3^!rG8lF̼fbeW ]MGm2TdwU:v!lX"WEx[CVg]g\B3 #d VL8[ ]_3G} rR6=;TL5etCj0j'm%H¼Q~{h\cRAYO##܄D)ck6:,fq8[4:ɋ-VsIߏݥtUfo59eeH(߆Wֻ;7  |S.oNL~w٨t{W JI8QL7 tRPmd9FT]%+"๤g_#[omhTb|:4r}~2' kk^e$X9k\=@/- 7CjݵAp=ĆNeM㭨bWOt PNXQYI3߁No僒`Kvg D%=/ Ia8'Qy4GS~t Ȫ*eN?PkP!扐KK̦>f޵}mɲ%yA,ģ2hV,T{/1",H_A㝳BIegr6ÀI f+$cy'6`/["8a:A`uT H|Bfa_)j9}_ؕFuwn,.6O3 l6ŹObI_l‘% C Dy_S)zPUW$*d+B+!=r!";.,\_j?}ǁ`zC~&'|„7SpϘ%0&w40Yw܌^ Jd6dͲDR:wD{;U.]mJ#1<3U{Z+v/bg /sH5̻KL°U(wW[lCԻϪ'TY֠ XyoԠ{!J8DCNnX$̓ьW,q7%K*`c ucQaV b- nbW]("LͿDs? IT] nZǺv \ôfqnRƣ\gScaÝ̱Ի'^>::in/UUj u{vB1*-V\L)~51>ʸX:^}"cxEgn9|s$25N3(dZ2\s??Y.7b Wm=+W.38~'.lnX.aor^ ]oGRݫ]~d95ZE9ݔUJf]Q nu:BX21q9̪I/MZ5}p +bZ<-_-mi1) $5;)7*b>O=o{&̆w|{lt'ΌB 4  ^iSdM:e7_Ļ)I6TM.%jc~[}#Ղ/sŏYTGqnal,a>S%:ߔ6:kߣAb 3.OA=og8xM%M}%| ߟ'S[ }B#Vjm~$Kis*^[&.;+tCPoV ͵,.XTKa@:Л| R&"V [(XEڪ,BRw˦#+Jh[bq]Y;`*I 5]^J胕19-CAhPaxZ[Tzʂ/ K.E2l%7_eyOt#IzM3z7~-+VrN a D֞GPD*3[d!JϡR* J.Mm#x[4{Jk9v8t䵄/Bp;^-N^YKkYGwIIē L ؾcXm J/jMTa!l 'ǬRC%$ j\2\.>j]}^ǿziϞº#pʇD#Qr+ɛS(/1n09\Yƥ{3zDLV2 JQ#!i~!vj0^*.p_c(ö̭\ @DuHD#L.6Gݖ)B/TW{4,,>R:#<߈wnAQ"2 ]|Aݗ2ԜhXF>@1*| $u^J1U86X# FƷOUK[;ͭ Xy(}i}ۇ;:,ʭPc+L%>$9>ɪSDq'$ ? i9* =d,׽Qp9̓)zzYVeQ Aנ0xB_ɐ͔9zALm]+N/}qY/}6FCfK%w|Dy*&a4V 2 Uta3={ ۳IenC^[J"mxhvvRXBصӨT-rFMw˔W)ݓJ2=}jv^n׶:m6*Pq{ǏWJjw?FL gk \jWK } Ǜ@NEP̮Hw%H:*h:(^(V'(Lkz,7B´w+i\?éNP;.H5Odoה"Ē2322 ^,w15ʚՑ_NS59Vf =rj 9RYEV[Q+h_B>K3ԟ ͏Ce %RILJ 荽L9; ^W~Daʪ/xSb .hTY)j:/V1#BpɶGb _q\v%*31O4_eD qjxxω' (6fwPWY}P QҚ Ӣ&-JTi ٝ[jKvE)M]ayv+|F~,s6mP-O;8{!nK2KQ]/2ڱ]/:|,T2sDǚi7E3L`ʳ8- VUmۧI LK֧ wa' R>hQmZG07j6*MQJ_GPg׺=^|ԧ.7)&ox} {&e7Qc*jjjc]7-V9 #N~@^Ŏe Cv# Agk_AjN|Fwni$@74.QNWɉ@݂ Ïf\$ l֚R3he܏XwW ;zdn2GH';gx2$['ȃ'eL/WN<{:hq]vE?mOBˆ59OSZdQT6/>&̢.\j9 w+ﮱ]79n+w'-D \r2=^ c^NH15ANAM#[HXmw:*]QF1<^,{e4{|LI`ÁYV((_an7egViޟNھT'M{_ksE<܁HJTr^%L Nx]S,R͚Ur}m1w**Vxj&&ls!MZD2oR9Nh_7I*p?/2e)m3gʊlҳ{): o=Fbdyn''9-t: @P: q|Nj:YUiU]UR35c'Gft{+b[]=g׋=2>w:"Rj]+٠Y)Ykbҕs,!2*ˁkҥ+V7Q|& !wW(K:)2Ϟ (37zPBK X靖ج ~v伝o=VC_T\KˎG\ nA>B^~"}B#?3-: mjB~!LչtYY*k}N҂zr*SoS+t9)g:56M+ldNLTfKO*d2E&uea$ĕ`[z%0n LQ;ٹGpsc2p ۿ@b*#@M~}/14siI;':7ߢW)jDϢ\H_ 0A,7 A//͒z" ) 8 Y.Ǟg~Nǩ=!L=^2ŧOkVXʌ!)e5"y4[>ڃ逇N_ 6DxY4J2y=b5y.J!:q]zvgone{;(]ޯGC%zhZtP ІlS~o⌌9/!/JX_`?mAs\gn?~XlMb i|z.] uKhr#B/ /c}]רc3uHaoB pNӴmRS!h`565G'>q[÷X2[3<U櫰Zِ YQD4kn%R&#_riZ1O:"@{ ʼnp8B3 JlQ]$5iNUZV-9ARj϶yvNil7G -szξ3e6; WvՂ'q_/0rс' g~T!!>u"tȇ:lë sdh3DХ/RAVR(&|7IגD"fq,JRf]ƭk^8ӝ}Z"akwֶ|!m٦HXm'/A nYdbQ!G.m"լ0ygN+$|ۂ.ـ$ja?-^_fz t~~h6te&۔kXC;$"CƂL8~;:0qXe| >ϊ-!, ՎU"^E[ ϩ3? 7SxzhsK;'Hny0ɗD590WY_;eqRG*E`ήҩ)Z,h83^Xz_f9'Q!W]3D]M~X(ڜG`͓z?f#yr6,rri[nnyqc`nv h_LL e+|>U le/Or%GlLL%JUMW3\Q4) :9p<'W ՒE~*/U Vq@xjFg{?$27S'Mr_s0<^FAyGC|adMb"~ [)ͦ߄֊XV*S ͋ۓ0$pRUR1x#6G|v?;GtbSl^V3ӟ (:ej>x൹9f $w_8xE D%*|XaU5!Nƅ@~S)jDΣ_Z3 g2 d(:{r.)@&X3_1/,SCrG,5? F!ڰŹ[/hVǘ ,\`k,p%թB#(kHƵbK==)J'E"ibj-u1.X5a>SqҺibk_>q{WN)VD.'۫fgL)ؕ^1Mb; UMԇ9R iu&50XҠfg~.)BojN|ՇPr~3K[7bkLG!ŵYܪxKr/azja`%TLwi8k 09gea9Q̱zA|uYWmbϤBsJ ϖq` #QF뗹$D*@G2DHcBqKC &tLT2pxG.8ݏʀC?So׎!)jJ`6Htx%.J5 u%kkSJ-^7Se3%J{E@20kN.qxwLnƊyhZl͹A> 9fȥvzvѵ)cجHzFһ=`qLማSU] }Ϭzd#qWq5 "Ee]ګ,qhxIރת!ٙHPN*G![EVblG{E i,Fx!"!~oum00 qUv%kmSC:6XQR_%hɓlxtpa3 ?6BGBbDVOÙE$vMVխK4ObӍdaC-=| 3.L`k:Utu7b\{Fdr@k%I<A·8M6Ylw#j)}!Tqy+ ׏GTf(lF@Pj\T}8uOùFO Q *m]ܥ')**]S*R2(=8{%?#@ N MҩFC߂Dz|-}S5V3lY?e`(jgYt>>Ntf]#Bɒ/[,hJӘȭ5b{Y1Wc[G3@AIAlLb":J i (YAi67XbuÅ[mQ]gI:9{] l에kZ0nH2cTT=hY5#y|yP =>]bĂn"H)-_G3BL4X6 bұ=M.rϪ lgmt^Bb} >y2^;OJ&(ˏG%@2A jTch BS,ƓgǕ,^?hZ8Hn&!-f\IБ]m~Ĵ"<"?O{o2~e !4'<c<+S){UlXW5%TR2$0Z~9yФ1)d<-cxߚ@n`J܁;uѴ>q_,tYQ`:aZ|w:t<i*=!r;qx i=N<{cy6Bg#О@|{ P~ZmwBhH.igIkXOr>{Vehrw6^գ BzzuFu a=lዟ|Y EɿBuWboepv.x#WbP5ɝ M*@Ck#iC(0_2)# 5vSeOowm ,Cن[sz^ k [>,NUk J0i&OͿɯSb7Wޅێ%O3{ήtשJkK8Xq|lJ츗@5۽U{oǔZ,T^*2 "ʛ:\ZR =ԡqLhؒbpZ҅ ĺbIN&LmmXEP,ZZCu~LxHE:j]61 ۲%V;*j8r%~E;Bj,1*h1,dlg9̞sѵi5Srz&^dNYi}t$_5;t&Q@VEVShcUHYUv+ߓb]!8i3eW%[,I{|k|N}3 Gvۓkm<$8r-ݯI1Zg;Gv0 U'c9*iϢ4>s交lbd2SEEj'rAS2ƙ HgoY]< aIϠ(t.`AMO#lvڑω+cMl˥(|c B-A9l&IDʢDCL-=NjZ> !EcC6}&.?ɥ:PasYj8{9@}+eɬ)B^[aҽ{2 sPehOod3;|(&꼫~ۭ+Rv}U Fg)sJKpv[!oѡ.e˧QmvPs.\i.rI%Ry'8ݥ Oz^)>.sv~:G2GG\4K[U3yY!Ğ2p\it1JW.5`jtBgD&'IsAʻQeۣVXfSvSM%&ܨx m񩄿O:=;` *"Oevh/@0c$1ݡ!<߇|ZIJ-^!!DU?<iIqZRy:؃xUT5kHrՠ [ k;yRZ..}t56TZ4uGں[7zծݥWȶsP䍾]o_ԝ|.pM farW1n!{0{ĭ yX/ aWPh%i/dC2(;/ѫg"lm)YKE侨%I#B8%= *4PS;ТiwFjDwGDc{0!I1S&O҂HJWy-d:Ti!Yi6P}t|b̪zN[7^Yi2<ϰ:?lgbž;/:AFHV\H?/([=pI?uq\gWzAb*'E2`Iio Qm

*-Oqkyýq}49~c\)%lh,GLn}$D$3$}ұ`Μ / #9|wNIYpoeKt9 A-4=8*UwAۚ%%3XC d \UI*<3j+z5k.m!22؛Splz;TLk"+v ~E$A,D?yn >I=LH/%䷤`HN*}ʅcU\߃,I. '&|+K*1jw0"`ZA`$ާH-D56lJ=vNjm)M&oCzۢqU~숂]LNo.i\Y.AX7_I>q;JS;IjXĥ!Y`?4w"2A5攌{A?f zs^t ̓ Dr)j3qjsFEE8 ZsǿgvͰGrڅ"5ig#6{D+*8&q{|ft6d0]|@0F5,s "qZP0CxzG0"` L˩Ⱦǔ*͡K>EA#Mg'<\d†:%mdh2y U7F%ԒP>6I€H|HSazJC}jA'*d3?3^uoɜQ]L|pRdxS9+S\W\ [k,aDt BO0QO^ g܉Y s5wav:Ҕ6yF1T(@/Gb|d# yt R&!w/|˕A I's*xb,@z}C%e{Pe hRemx$'2B0d6PC1h0e9jņĮ.Ykk;UQVBNUAÐL7UU!g 91Y \TC[pB (Qv~Vo3y'.Tk>ʣ!y$$r"e#VU?yl|&y9Eqtk}e?PKG%xѝ[AI^X=Qү!{zgPxG.˄zt`M2lz{o&vxzuѫ FUOBiy_$] ! ds`&,:nZ;Q`R6ݸۏP4CCyp޾!@ Kxzu,+/c-j%S-+:6rnhsFt=b)>8N[Vqk#V{esHzo)ňwv'ݥ"ApQɤT` )+9¨G=N+c~a$9|'p-@u0z7k`E/]蠒BxW6*J[]N}րR"3 }{Qo6QdRodV!;<-~6!E-n:n۪yYU>diضQVRtIdMv m.#km DMTWh"ckN'tt/&EQ>ԍQFv {LKeoL.6/P;S|3,:Ӏ~G]kF nbcPhXʾza (|3gQ)e)1F 0v4SlӸCGEr+pZ-}KB?y=[碐dqc9^BT;˶xq}F I@e ; %qw,rSc2|Bty)0B!0C<F#f'X.bw%ge|d 1u2?8`8B?ݰZl B2:_hxcm=Hw^ߦFNN tnVf3ۜ_wZε3@!ճd|r>٫@t$ M2ܙ 0aҖC0!SA| l1/e7A;1~k%jywџ4 L=_Xq8VaJ:@d΋NnD=n>9s=ϣq c]`dFJJ .l]2WuwEs0+Y<]M;_eH- nU8bs?.hE~u $td{P8~g 3K*w.UFBoZ\5J3fB4=:J "ɱԼ;K*FPZjheMc8eBYӴ^) U'OEM*ɿe,? N:86B+oTnR3,5f=wg4}3[~y[|c 4|qtIP+ueG㻬n7Y J]<$ OJC:_3i0h*)pT$)dSm&eSj)X_0Wf.kk4SQiqjHCaM?u!ٳ"[êA%w6hvѶ!E']'oK:0oO |y$çȟ1H+4l0zsW"=}֮jgK^D;-i#Ntg7iъH䏎5LT􅤬=IڶIUԪTsL/1F65__Bu;.#!v>ZlL੨fV]IDۈђ>|)ֻ F/*% vOXy eV^ln})5JwKjk}h q X#Tj滱kiզK=x*dUUx+NBYlÔU AJ-':ScܩW"mMu${Sdam:ET N|>n0@csaYWCZdZo =xDNB(dW.oXl6|9N$,($F*8uʣ-*3EK髶R`&6ѣ0N]Β}:[UWNERBoCQN@.PdCWk`=MгPe+L97"JGi'p/ /πx%|AsL鄯<gBnpb2ƌGN3W˱"ON\J|}. \.x:t]p nԠ8񻭡cpnRbAoQE-H%>Oi?Umr3/< 0Jm !KKe& kᇩH ИFc )_$z+)P>sIW.3xSĮ@?6 oʨ:6$ş'K`"t7z&*n5IӖ=be}qHVIIqg NUq+y{XOu %~EX,9(OXѐ0Z/tb^2B_!Vy`Q.tZ ̵{]& 9)*Z'n7Xvf/`0NOcB%n>A\#tr6[:\j,ͩ k]y@[{&S`?YwU#'HA#`Э2}]rugʕLCd|nJx#N'(HVwk琚MtGޝd?1f:nы+ݟ]" ;]DgZU&O="ף5Jxn4WĜZd@/f(]4x G,C訧)OR*J4B) k+ѫ%Ս̸c:`ԓ2eY|@Hl!7{^xXNLB ZV- !ܞߓ毪O;Y)F@[ꜬK6nJw՟nxSg+/o֗Սh3(Fv@F\z;3df-5eCw{ږ}HV ӿҐRބė-;* :u%3@h nNY9"" =,4%)'#)jpihOYlaR3@eVb)w.E<|+%G(A8d }/igG'Æ ˂UL]F:P4 G0F#d:2w D&߉+٨RM xІ0A&&* S"(1>%= g+nH=>c.+]~OcVH nQNL^QsF3KMo7-lR^'0pcD`7/k#tK9 fUs7bvgAP뱊)F!j&GWSJ芟O&: Q dyy,Pց`t,:}kzJAqLTYPAdd*EA(4}{- =,􂴈R4> ^XyN89ث=Krx\Q!"=VCʥZe W/OQ⯱p;KSL6-S' uz] DM?3Ot+! ;L!V.(#|zfLN^8Idl&YPr2Gɛ 7]UpFP5Rk(Y-h2s_ lT{놕K,2RyIILT}9:o6PNNJMmDZ38检vr=A .sa "{* Q!=3#;ڼ ~kzڡ52B^7%$ix1|=!{Kp34Pr+vj꜃@-EYxtȗc8ň'V9!ܬ%”л "`b`sUtsd1+~O:tS"8̿~Uj^DobÏB.c#JEރ}O۽|fWPLس<@*ScD^ %itr| <l0YVFس7Moϋm@hl;7R5*ƆA{ >?I&CP֤G{?uEMO'?ۄ`~~f=NG0-LS.i2>"uy֍uoK&K(%(uMxF8^a" $gp`ٯvzcz{~݉}' {Gm 5b"Ve\UV ɇ{/.pX,**)j+&9E)g^z]v!羅GQ_}y#TUWHE#75̔u+]w]8OؼsUwI#V\N=|y}~˂/Rʪ!i>?3>9\N]ހB)k$'K>2N~K<꬇-&SG#{\j'h4zSIf``"K|`l43u*ާ){"R26pf)ޒ~"DZ.Q!ɤ2NP [&xvB1Ns{UfWypf8H8PrT6z{'|lyYu&9FKF5Awx6F3o$>tm1C%"MXd[ uZ bdi@WӘLW%2yPͅ/QPEβC4yr<=ڬѝN 1wH\5zcZ }͊.î!ihٕmx{i[όUζ6#Ҧ{O{:yAZ\@JF|=~X751 ؅ҒB[(_]6Oi5>(yYm7ʤy?y1%3fJ` 4 t)@1&u=Չv%n@K J=h+>[a _}8,IMfV?|H7  l hr̬=K'|̱7|P1KS-5,|,v%bl`.akCM+=յHY8EKB;fjw ^D!.kFaW Nbb6dQNT3>y#-}z,2e'BLWO80t # W 'dIDZA ((T#pXއ|b jPc$8P _H>M|vRqU+ s`Fp+ Л/U1wk"CMҚuKXxzwkmZ!-mVz*ަA%v0ULXyXs7LNIQ%WT}!@WaѤ㥘6oHd?%!YKtH*W9YGaFl;>8{n1tSst;7o,zRETBQH<"ZjyɌlP[`jƟUMφNs R6pd7fi@'X5aHgjtb/A"w ;e[EyoL\jhRp`bim0% R%xoH$o~_b,$eEf%ks""Z: Z& D`C;"~;(PDK1wm2. PGph?wӃ.|pRɧoa ߷ENVgkwT|< rWhWMȵ%92z@ԑy?vr=ʜ" F")*ƈ6EC޹~î-7hͅ>\O$((bJQ;k qus2չM$QIo8!UHR:P\g,^0Lp0А?]C:%\G}>"OR/`; lp Jԙ#oW,@.8;bU֒5uЇHҤ`+:Q9%oJj6\M7~ᬁ"?zLOdQYeRӐe"hqJٹz<5q~_* :KeT U>zpD|:E+̘H90no(g'\y\䕴m+ԝ\q^L25ŽܑT) Sq!>vPp{^1o{8T`S}E>*3*MJET|2`iwk@ &"H=e}yqJ,g8=c^rQ"ͳmR@1=q".J [Tӥ'a|x"]>SY<# *HtdHYr,dB䇅uz?cFx;[*N˃-75TcwЦԓ* (o @,: Bqӈkz,[^ z+B(D+|ݸ N(5=[.1u!7W,AN诏 m7%bG,ۃ`ETHAK,; B6 Ԏ[2%1ÙNuZ)NkT E⢏lgɆ;T *euO@wP*3̼n|/rCшT>oDy;5wP-A?8\mgQEbo]7){A}ljn.3i(Wwj)|$LŧYr=+ΰ- ?tp8GqTN/%g"~c(SQ Kjn\Y`L9HaKs'SlJҗfՇ3dY8~|@֭^B YYkz2 R\m wburglq*)13Ɩ:NPm, ~xgR6tҫ7`xm_mtQ$&p"}ecxXF,TEչ5VK|~r*RX!HƐ-;8RSzS_5F|!J)G.FD0{_8k6Mq .,4VyJ?r%:DqKX;_Uv/'c@}cVOWWQSb9@W@^ d`"݂sTjA{舙4U8<ױTȢ[ ѡ=i05./FDI8GT!)J+<"DOB(YRA{D!dgDdmD'􃜨=z@}CY>p-Hի% E4ZW(W<Iu[]1Ҙ.M#bмD^90B!L誤/Bda%,6Y-%Ozx$V|Ecm`WAvS.[Z)7 #QS8`9ਓ|ͮ}f(؛fϱnN>ęI]aJN\Z ml69Z^\[TLc[wF2f5+$9[nl!ZkPKR8LS׼גF",5RidV;HUs{$ͺGL 18[%Kmy4[M sL ٸ{X,"d w} 2&enϳ$s''|PYmL5Su [MWg}4 5.Ua0G?܍ncgxMQo%֓J[=B[pA14o0{zG+s D(y2  q^< t5&9nmzЉECEl>83$,t/N{TԵ,#pE @L;+BuxٴcT/k;O$#}8jyP%$i{ A32&!#ΎCvgT@ PkQ;W::Db.e]f0=$l,* A%q}E `2_Rg$ L+!ׄ?g8\j|z4Ege*1#Ei\N#*ѮEa$Jp2ki?4zP4%c*)!\våq3"hW6݈+_R2Yx7PZ4(]b,eWU|Ƕ#8y~ۈF+NҎ<_6 z`@瘟NMDpe*sHt;.!6 X/a˵$ qКDl1%@+w >l6. XQ ?ZME1Q iӪV&V"b3ZP-H }< ʸ ^9*u[@C c0=j>sI%CL+zCeh9cbW&9!8ǰ1]-}o(}L$g/Y;#pWIO#2R ͋؂OMԜ=8ivFb|9C#';Ìq@a՝ٯgYhrjx\x9q1_0Nzvnsv-`8886x |ߛ `p"F.a;BpB^b<Ә_[Ih՚'{&d1pKgDQi,JwAaFqrs~ܝ=>dF2 :S@=DfdtIVZ$2mq^d!SJH 1Л"hUcl OEigq0AB"kᗤU?cQiz *o/C;vM[=ٗ]5ހ̈́h&n,%(V@lSf7[. |o$^L'"4QaPt^}=rBh&{b1&@`>(?(CZ ZL`|D0BǼS5ʔ*_1ƧZ_ƹkgd?nATЊgϬۥ5w,`\ M|Q]}䮅W0Ogeo KX}Q<jbxi*rhWx`bǜRmɒW%.wrmh1Ir= _o41^ x1roGd©Q5& R'᫝]4i4-&bQK޲YuwI=Uܽ@g&I_W!W;?;)E`\~hy uV=>Ǒ'dkCv/ }?Y&a' ffy=F!=v GAԲÇd`58p縰!OYβnȝ7GZ!t@"Ʈz@XxdU)RI]h tWF0A nSWGӣDȲ/{ _U*W? tfh|ofHQ͹;u+b1M ZWL5TF~i]%J)fu]q-!!~ayoJTvjqGo(Q va}v[` fđ6=IBӫ4r9G*+%>vhu$79fj'tW @zY\y~1QEM̼YV~^ 5_5:Q*gI]w\x91F2EG蟞3N]Rdb …CR(z!(oؖ+@ 1e7Dax1e?u Qp5$^{Z#IQTt(9U*F|XbTN_v]COe%"+}ሃovLķxvV$Qx a}" 0ApJA۳EżU )}ʰM"`a !w7G͠뀎 +`sY#Єp?i?+geN#'Hxpk ܿz_|m'fdNT{6X>n;U֏l QCqnn*g.)cR uKDž<YKF %k%VB `Α3$]>3lqj7嵷D=}qga$vRf1sxʿRӝQ^Pz~g*ʜ%Hp L ]2ŃN?ZA_+q/T@": x%<t9 k=lRlisDNRN( T7U+CD|a`F*=DqZFb+h`Gu o9  NUDCGTd[L!sxٙ*[y/w[4@f-w[o\&4Dh&B%`!<CACvL+!쏳G~dV*ukt uoPbԕV1]ҳ.P3/>9. {]O-A@l0,ɖ2o/S f?/؀S C/@-6Id,jH9&+ 7|wo/y3$8o=ڶ.pwN,T!$P+$5VBcsE˘%3JI_xwg?^ػOLLD2H5z#ߧ)j(7 ylOEZ _@sr()?-&M wq AabD`pwȚF҉0ףj[eYk7?={p訔6zsCO[uWCAYaK7:tls=\'i&-v|dqz'rb,`Y].Qy71sApHpTo=WqÄWga䝘y. 2CVږe@kYĩyk;rC)6GFpIԙHrB"GBRV^I' R=⩙J6,mQ9}1uEbut={4_jJu@KqI.h3ڋ; ycNտVSbG޺-b}VK*7t@=|AI 7ݍ:kߊh?Z+5 jJI諎X6g2rrUǗY#SKy `XTU2*]l\ B3ǡؔpYy2CE"25BġҹV:Hex<;8ђ*TEUA N$ eiSEWY$/y6{?[FzL:QoǗ%?/UͶl{ZKCy*=w_aÓ yJ^e^ĮS8v삚bӦ - Wޞd>IƎXw퇬g*AuKO,Sdɂc+F GŧMe_e$ 7N6|k[Eb:yE8=VjH~SπGj!8B;acA:7Icx>yKÜDFTY; ly fS*c^h&ׂّnwckM>9&2j` K̶P-" {2j/HYmzR͓_97~D^aJtgba>^J zw_T':`׏4iURʿ!˺McQ&c#-Un+J˛Լb%|4x]fG0* &?`cK'Fv𞵥yR91:BHh\f{vU\rrU:;ҀΗa$M,2H hFz9' .RM41rң4oK_NL#of5XRf(BƯ-^#R4 c&ƺnsC2L&%>ݤ8Z;Cw=XN vג%H+S[7 8Dсz<?wDi}~ >y"=yEʒ(tMd-ݝ1i4!0'q1 6 Ĺ%OLo1 ) _oԬBZbd-DLKmyBHV&Fj6k~##]*L,[rXr9$_ZL?\B&)090G@Qi=Z uϢc~̩v7mSBWVl+sX)Ք^'Xc_l rw9:07{7'Z h2Ҧ ْ]u2\F3TꇿXuϋg-3>E;B7#!0f['T@/3(1)>l\QUÛLũI1\Rg?LgkNFJdSԭ%)~abJUi\YXG- A{CRԒ1gȶNoUnh* Jzs{pЈPwnq'/xNN[1_J'klͤɼS;(PW 豋) #]9u6geooT`Qd:Ϲ%if|:n#+Ǔe#[o̊ m9`nf#gcalcHqv2Jh憻;$m37O L{&j8u?ܿh$6TE<:PClpژMlvpn*oS~t>#u+gFwv.Hk`ÈW6(?G1N)Z[9fȉo t4{2<8.OiXرGW݌O'~vv2o~Aӎ*;|(1؍=≈鉝k pևy[yV<./~/pP>{p*B',! ť w9]!I(=N%NjCѩu("<&y/ o&tQ@ciA#xċmx9rn=k/|HKRmf _ݼ Pr!T/NAQ1TM9.ȗ l߮|MpYSoQ69>㞹=H{U㲳J}טDK?y/99UsDhL$jt/@I4OPlͿs 4AѬED=Wd3EʞeDO =3SBkBC ԣ(]_d(ZL`5׶KNiCX'zIY^M]|;^(D+~˻+N@4:)0]0 v j:g*+Z_lZ]hW^Dc(+~*EJ2WF%,_|DXpC1y/ H0IO u氮-˙ w5ٯa@KM(EC/Nr'Wv ĆF`05WFO@ʜRJ}i$B3PCuȘ~2pWUӖȆߞo Eݿ_Zt5SEL( 23VGa.n>£.!1/D㵙C4}IUpVTY@m,FYV׏}c6K3zr:{L v] “7HA*~Mv?o覷рFzK 1 g]tlY*[l0t0!#-bMr-OP|(Rfe˯[>;1Q<3"߶g4 b3E"§,3vFYU T̆Av ΃h~Oj* H;X?KknN9-=Sn8F^^\fyĭPբ;ztS9I\~pv̵Wmy}sxv馿gJl&^ũV[ _u6gEMtyRzgg vPl^On)Yxr' U_ O-Y @;_ICDtQ wI{3Z0Tv9-X'ŷ\Ϛόc1-ƅ.HưbU%uo!p G"[A IAlLףe!G,`Ds VQn?TXl|y4ЩK4zVLk~D28ewW:c=aPJ4A0Ly'qlg8.;}ڰdž&dYo f᧌ ሰ?Ĥ;CYAsX0Y2V`X.x%* |pu( |@Q)KgZ=P|uʖԚqr(f,r[غe\*=篭lHNc[?_cz3sG6JLܱ{Z7v}%Jپ*m``Uѱ낲_4o)- : L^ XId=za8e>Cxbۧ36'y5JO[,?_fq=6fȍ7|p|u/˘;յ/E\@ 8b4k MyX֟6mͥ|:G{Ǡ*/%s?xA0иaK-oG6T}$P 6sTwB o두)6x`y$5GcCC`:Կ<83ab>}D)^0U=JX۲ԫDu0&y蘵-aGcɢ@ErF2Q% fb~@l4udwDtz|Iq\a3l$M6 lظ[oIsXlN'  I3=!"x8CB/*{M1QB}&}4{?yqugk{~isvʏ_}O^CR*!qf)< 2!ѩD*P j-(hYXebǺ=F7;-OU NEcǯ$H'RZsFApd$Ai '+h 5J&)0cuO_/$P1֭^}zzH>.N竚nJO #u#Cfpd`ER*,[ZT4@@@P`:xiu߅ c (:p^Io139#lGy:s=3/XjCd"-Vnh?MD)q`ێ֍N_@HR# s2ӮA]av,eI庤{_ɧǴri2;G{:䎃 PU^ZC(#F @mY?TmѺI[jS}=!{~!Qb|Kzn%Łq2r?0lg0Z_C˾]x!~A8*'8t'|K}9G :I~UKu6i=.sV}m Q. tf9L%6]IWz^`M!-b^¯vl9t/K3% `#H \TT5ж -s@<ߣZ E CBs~ܲka*ILuS5O-&4Ŵ=RR"Z_P\(a=P;ѪHmh(IascDp!נ=*̷P[a s+a4+^a gNZ^_/J\+.d=1x2.|q"9\>|  4湧Izpbe_}7S/hX- q'qQTU^{JA&YI4#,(XsG(uUAN8vNKۑ1 ݭK:?\!=!kC:zZ)jx{Hl"īk8,86IafƝѯ| Ä6Hq;_:-\s3>Z=NO(ٻhdJ\$F7 gR kA YQu;$ xw#kWxr:dvwɆnϘXpQ`a' ׳M\ڗe\oF|6 QToIE&H 36%DRf5EQ lEݗ+SK+ #DX@``7(le=եyFRS"W\5,=,ԩS{9}MkD*NεOdǢO*]w[Fb1eyJs*EOmD ɑɾ|/-W u^0+&8*mϹz}S pr66ɰ-EJ{՝בU4Dľw3'nJpT}c?WD͹O}>FO\]O_&W( k %G*8A6X_7zo9힑wc~)l<)_=8գo}y" hq(wY?/)!ئ',|.-HD6.*"㢝wS[7eb0znI~XCz|uq+|xgF eUv1@2 MM:b,[f4 r '%ۯura2w:Qf5|z&Rk̏IPHk[Ֆ5$,e#r:V끔hiRV~ud8%${lNG+ VUNȁj:az(2I=sOSA׼ ރRI,梂/S,G8BcKc$.0{ߺB-^Ъ\ȗ`=;vF1|?NPj쒼`a5%JM›>_vP\b )EPz6糘a895߽TE]0}ۦٝ"B.8?Ʌb@ԍ`^UE)5!-nΟMWHU+`L[fl5m{F4绨'68=W$p ~ y-oOmſ$ov 9'4vp/ VI6;c Z "R04eօ4" S< ]lg%0ЙD:Ġre (Lƻod1n\e~ A)O JxN*;:hj]5\1=9 v#@N5xg b Cr,C瞱HHgPgTMhCwRadBGVu#/n91vP4OnFUqdkUWElt8OP%eQZ#b+pZ<#Dhg<5BUD[ G~ܼ>_l^l ԦL.t-*QH14vd§|b޷|Y %x fwrϞ`[tZ[ʮ~ApCr5JImDz-=!)؇j8b\C,/$E96 ,9`i1<|Z) jQ FJl-*]I.n #2 H4ڤoZGȫj/+T; xGULgsk kpJ N-lwU1.=Ih.҂ +y)bNRJ#- ǺdVI0PHh2 @J jB_%׆RtE%M<~[d#'J MVR?O\o_~넞!}=_Fm(x{sAm ɩwQ =Ջu@7ZY;U9rd0}%Sov+1bgu=hwPs/KkwfgIPvEV6O_rH=dskW@u, $ NѕaF3=4V@ %/.U: px۾+#$FQn}Dhy}p%e[lG E_<6:q`y׳c:n%o5!Q` he-8[dPP._؟MQrg 0/f?+{FNiEo^ʨ8"_]х"P/b>w Jwf:HBrK.iHfbDt-/[@:4̭r +q)T%<d7 ؑoī0{!6a{>q ͡!|KS{63+;%5;CFzHBj?U.΂TgRg>h6]ջ|\6 ncF=*)yV5# \m>q3pF8_ \)~TﺷՖg0h۽(kLfJե\p;hoFx%NdFxI]qćJ-ÿ ƔEάTWޓk ݑ]5'VfLO 0e7ж]'bk!, 6@ I!y@ ^?Gcq6Nã= $QxiU%Y$o:+">+ј N3$ ͤxZMA.n HD얔]_4(#P17P3u_ୢc"HccsqB~^,ySނ`E`T%G.؅L[[OǻB,;Tf9"Z[[9l~(x f{ֺ1I׈*k*uAo0V 3]@@>J(DC{W lwA6$4أ Y߽K9 Vdbx4AM׆t>LK}-/0AnW~wlH\$3R2а A|'n&②!T>&Eӏp`qRw67%JWXq: ;Y84@bnU`'Qiw5V>t_x Qřh!#Xpy]Ƿ~;nοXEp^wOWId`_k~}^X3TO#pu d+~ugڳ=` ۝ UFes1ܸ_Soȱ YpTrE%n쌠 ʌ.zZUo ^&>M%9/ pK~WF02$5`1"M>R7`Vb~EZP׽;q.)'!uL3Nh⯞ U0=]VJ *Ac@FZ={ # (kvˑr$ɘ)[فsŢ}25D/D4Ѷ)!Tv)T-?'6ͷտs{Skh;)C13 ͋D\zjs E{?2hk* ͨ zXe+M+jg6#VL8-NU"S(*&m;iUwjxQ_2zOR{g ?-tNJn` HjݷvlRԌ#7JjO)l@i|>mf?j1Ʒ{U|m|k?pu/>:P@5Gd}%ZCʽ2Ak+E2;?Dž/>#Fg*w݀ [@_82VrbRƉS5 Q9:x݋%ۥ-"Fl',`F\Ys_0S#ˑq7_(5+L? _1 <2zkg+E /O&ÚM (Rh"y.tS/`BD Fr.fبBLJCBsLg\UךJI霼ef`YSߖ+:y7<|F%=!6o9ƌq'L.W#1R:#\oDjA!z^Zܕގv0KbC\2! ŷ|[4)ks! xx\)amE]c8#7Ah1{~d}jrD,>< \Kf\,4#κL^U>{G /s[9- FH_1(qLJYUVUOVwkdZWGy,>B쿪M;qè^['n,2K-0 h>ߦ߆˝WݒWz d{e@B`I?@ũ) MRTX;"qw:'O0EQ($roCq09cаc>Sc怇 h3# J!ZIQQU`[M /xW:Fcbu$s[l @pIly:8V$a,CSkjWby =}OL a<#Kؖ2JT!lge:h8V[ -ԓKxdbnO02h(*^?uA]~޽ z$v|ಖM<%_qHɃdbJ#286 %wYČt͉\(;6{&a JM*z"0;p]_X$CAIAQAaJ' zgc6QDgn Tj!4O>Qန-Opu?)-\fOb_ GxU|+iBP[mER?im̺֋>7F1ciSFF|; [)MblR\,U,w6)&OX3pl}te{zDt3N%'rq?Q\e]p.ͨaU^Kxr Ž5]Zvn'ڿ_&5@- !IYJuxYx[ ԬT7\.EI$rEˋv;Mrlyv5y3>o q_Mсy)0[93핗t<8;4+[e|ܧ6'_}vb |aqqQ92Pz675}2Zj[|`].W/c>J(նaY#T Ot MZ3%%GЯK@2@GsS5Oӓ.a3 ^{j'5%Vy# b1K` 9Cfwo\W nX2@r1I t~Xwap4L +Y*X JCt,bN]|[1r?p"X:QQC,Q-9:Z@*Oh$ T3YqE컌\8ffʎbs] !㻼bVQi3_ȥHy)Lv̎Ąc{k둟}5ޟ$B@7w[hӧNG4Gm*Z5>CΨkꭒnNtQD.=(^3ɶQbZ6bF_kt{P$r(v*uc:EGYWU$j&ؾO/%rJoŻ chc (n [ +F:,LvFj\VmeQ漹SYWMCg9?Y %_ydYp1#_u^g&q@ #[ 5Jl#>cYœA (~2N}T N\8Ru|uq5Yp>#uBeUBxs,\s# PL~U쟿'4#׸(8DnrV>Ka',8U* n⾡?|`jHG}Ы$(<u eOɱ7:,,]J$:po Hyըkݞ  ;\:\`yʏ("I: *at/5]@: $ĥQ`x5/T# I3.$sW rqEG\w18LDB-ZCElk}0c,ÒкfsJD젞HEBՓs{7L~x/:NBQn,9U ߤ zߨȕF|q} ZBeU-v0>ED^ %ђ4MMryp~Yuik*`уfWWK724O[}-o]@,S. KKd z8*z(CpKqҵ_ZfbܛJ(>6ka."+J(0,Is4Q̮CYqI#lar G?4' y"Qev Tm=pib=0Tue'dSM8zc@_S`Na6[C6/pd@P*ul~(ITrf-XǰkLӑ5S]q() &LDr1ے?X %~Rdo&g쬥T;{XhB*6ѻ^esr$A6%i%Ȉ?9} {LA(%Uh!&7zIJ.&V8ȣEsn"nǓAo([ 4},?JڦѰ\1*N7bs-=gvy#>UCSeH[ۃ dU䅼Lֈ94z,۟4p8@?HhhI0Ĺť`*g-ա^6b?v@]%ǛuJj>By#Nry(ߵՕbPunՇK#mҝũݍDT zWvNsq Db9⳾RQ(>M*uYznLW%[\m& 'VDW< GdՕe3m$qoI:tf&>hi~fCOp::\o6ϖHH0HKdⴋ+L:d}0 $A$/3 _.`ɜZ'w7nw:,Z[`"oJZ{3"U2')qT4yvh4D>IɗBHg:ԇ"~1In7z E犕 (;LZT_0q,R7|30 Q3U>bt8n ]I WR(il&N \RB6JQJ4$^"M,aaxi)GH.6--ۘmڏfpNF+ۯƸe]ɹ"۽(I1{(q+;a >I<%E5ѩt-WyOcJ;K P=i`5Ep~_ONA.6H` {6q Zq7R. ]d  jH(}xI~ܛ45b4{[#CSJGEѠK_h'qӿ=c4_Qhz}rP1`tB,^-A4=ﱩG/tpȴL 1j;RgYfns=+$p[}=]s{\fdN=9NLh!esx(QJ{3銤tZnq z#p}yb"8tihSD҈9 Z`E ]v2qY,#( ieu5'{4HYf `^Ň~@/[84׵(t32 vtD C;6u#KPt1#BbʷzDT֕L~Q]d#aiA%8-Pd^.x+~iR<Wm:Ua-spT~YG &  /ʳ|`1!8q)؁X\/ y!5~"9ST{O~wR]HB gqi1Pgn1r4D %yjͥnF(~w:)`x_AܡR$DK]ՆN9dEк#- ~ȒIUw)$X1MT!c9!㚖H4zy%o30/>@Nk.!*E}Kb@2zp[4@zg~1CmHT-G>ᆛ|_sN*V#QWٖTJN;nakbJ4S?UX6j#|jKFGVvSYk)tMfl>msnr[0[;<]|{lX%J[|.%ݠV&o݂ud\l\֢A``"jg0axH>ŀ83En(i6;E+L5PO] wJMiTpoDX<ͷ.%ciPBf0/0{S*a'2Fiz6 [muy6|CegOw3WpG8:Vnkw<UZA$x븢1wg K|}Zz53q u#DS:@xF-5Nue a]'~4Mm%tas%¡PX0=CJfu~PfK\B;Vt!r皲HÞ)Y6!TÍrVyrMMt)̒i{Wipws5SX9$jOAFm%"IjkJ N$ܾ\\ލr=frWrGLsaVBFcQ-nB 1A:_4UHkL@Hꔁml_d uQl2ePS4Scl+BGr p!`1eX|BΧ!LH uQV`HB]A"DvASϫXY5wuK܈O &{!f-^:0NQS|B4Nsڌ 25 9Ohbеbk#bw?ɺ$U, Xt8GW,5kOˋg9~ ]&88@6xp6_L;DIÏ_$y- qlDseN.@}*JˊkצjXaXZ%3r]q GȆBT6qNU7!P{)K ؑ xsphh.SNe_3Xݟ;h:&B.I;k<9 o^{NN;FxB0"Vv3"5WƳt${2ׂǿ,du`AE@',|*4;F1l) bёlz(:r}b|/[KFZ IVz7ߗ+ccBckM~1rҬjmS!^yNꔕ34ć+䵣M~Lex)"Q"-p"Խπw@]f?*?0V 'eYɜ^A^>apeB lL%څjL jiǟ`6L|hW,gbhScKiRjcڒ\5-a VIAF&o(74N{KNnexJrتy~!A6ԞBXc罺 ;<2Q6w칎Z{i QhZ ,%//. ?Tt*.&P>+2$v(SF(BY%8<6w`o?Y˶6v@7->}v~^]nfoh LպX%nϤ\^pd7l V},A]fѕBuK8AI) S{\D UD.wd )k9>ϵMh 5tZ!u;~}9i3Ŝ1* 7)Q~; xP /\52kubHK#𗿈Wq-) P[plϠ}Nn5XzT(6C4jz ymء;"ԷM\1JG>ysLzwyH]Qѭ[ ~в!tDA.7Kف峩|#nP_ b غ#呂T #ԉE*w} b2)'x4/9oba[e* M'zz~n9H.N?_dʳ΀ ۗs_y5,1.9JZT\.2&N#As:xLN$a~őall!r5d`"-,H0yokA܁ p & ߧ|:H߾7 ,/=v9ǯ*UFXC!zhkRg}I O` f/} I$(t[EKYg Z[ѭZeG|?;}f2/ &u`m*="4#s04_[||*L5Fނڠ;Q"Uih-bv(O%Ed y񑶹Jj81$=ܭ-(Nh,2/WYΚJߙW:ʮ ns<5 RG_*.pǀjHk" .f*J1P ikARi $ \2Y^kd@p G:nՃ O2$H9`/j崉ri5ÌLK-e ܄~aK=(HD|))iJ˔-s$͸$39zIxiJC6O*(4ἠOD mgݲK&U!fP75}mB0,7"h~bbT^/Qq,fQjiPDԦaM26QxV;gK>oE PvEJuotx3B`?'1:}ֺxlM)v#l;P_0q!n$/ rY~Y{V3%# )F=clӘ#=!Q;V#!M^D.ҟNcN{42>~S#@ oaj|8SCM'y6}/14Cbe{Wn1yJ).# ;Bd3Vz~mgAh<7ԁy/NGX]9$lW#x!c'/9cUtQ]wOKAkOVXty}CnBj/ %c;=y֟ga#t9PFOksi8k^Ig]+)’8G="{` ԧGOϑu,7/rd`Ԫ3Өǰי M§nSIoςG5l#zS.[Cߑ\@3~V"-HrVTdG<\/MΡ&Zpt8$L{S#[_C;n$^ Hq#5r'"!)IXi٨bοS"ŒEۏcjKjZbB>MYg~לPM"FzD9}wʵ@o I!XH9&),fI? t }{bT+Y> Ht낋wɶВ3-oIέ%4kǖvb_|WvZl;|ms'-G<$?Q[ ]PuK.įOP'3%P:]aK^F՟S#Px()P ϫ WLjw#ʸ_uj,UރA8#>3z1~vBT O#EnOtS[?A v Cv(y._W@dK~TIC'pt'IPwٍA_f}&G AI{֨0҆ cpEH9z?\wlMTr5m>鑤QgzӉCkn{!="8zcʁ nސE X!~Msc̯e0?璹fc귍 fQSI0{T1?À,rhWUP $\dy!ZՅ5ݫMW9+x%T?ę8n׵a8uC0$9VzlLr*..Cau&~CρLK^\PXvmj MM:1> k o$oh9PйM=e2m暬/ѬX|ڃ` yvGm~Zu%s%Upkolb~9!i~,{3IZHe7ŵ9Nɢ Si Mk7^aҸI}#LW\H)Yx##2 ˲K6omig- ބ[ϧ!h\.-:}$qecs/*6CFJDhps+U7(`L6U"qE-ՆNIFvtކ߆9TLlrjD"餩i8>cfr$3ٳwP <]޻x!ecXw2}H6R*tT(vLѰ )k1/b({N[lԈ"yp?cǚA*Q.ͺ@_mYNRɩ 9g+0R3HKD=(2x1B0@DRqHEW =Ԇ @EtR>}P\zw(/~wBl1:w>E(&v\0wAQE dNԋ]Y3ur_\Fz5rQ U&%LQM~tzB!cRibfTuyPgZEmTnsC ܹV4v"#(ѱ֎|`;CZ脄/tNifPI]4,ۿSI( U% cqEչWpz-~/SD;̘pٗoa"!w(&|':Z \:q)W_zbiENw̙Kd#FU8Y{linM~(1i\K12v@=ٯ s={m'}-L4 B->1AvGm& +'EQtƹV\-mBսs<»s LZ漾$xg' SC`oΠ_Ɛ /9H+9M߄=\{Z7kuȉ0 BHld_Be8bRQcr[>g;jIB6^zTYϽ91F2B6]/kˠDJk;,\|Me/x ,w0YJ'&,"7:cJZft={)H>(!\F!ف (FBPaY$ඇ: s7$&/m19Maך`S`Z|FMp9Q>Al?!P{0/+ilD.w}ExUcl8-nVgtOo3"R/o54GQܛ4 be'T(Q wnUPg`bdžHm"Ome_И7Vh8`]8mtE^"@Ṻ2ɫ&I49ο,[[&S5Zi"!KJ^, ;H>2aQ)vTK6{ԐRσ+0:H#9ĄmZŒoN_*$pP3ߕ+tOcs3T@ZZc791$K1 Cy;!ao(_PkS5Ȭ%o l mv$,*8v}h,3[tY={}l:" E1+ۓ0yXɿ޺p.RsHfg+RV S4uYAWV'$00 ] S׎RS:gs> c-3+^14$Ruà(P\oJR̹$wQ䊗ܼYrl׸M}G]1xTZ ^ԓyicwe@ߥ}'t!#ԽIΰ {&B#渼NfWl*(!2S@1>: 6t ̓UUbȕlSX2PkGagy=rhTҕ RwPEuN:![QZυ^2|FP8Ļh(!E5 ] 7!+1Ó\iQY5Z4lBW S*9XcTm!`GqVoIgAE1Qmt 1b%gos;:;N#,M;TgPT?#W!+,>GjեIEH:»9s#]5:&ӠysMsЊsLA[%K.tF[b&_gwYGʠEŬo6Q5Rk+w vN8yI}ig@o5cJrSZS2@*#(j1|ihӌi_RcGMR)hLf-l&;*~$o{CҠOt"ѹE̞b-ڬh)lO[%e"N'ہ4ke}FNshCgvWl0wql԰E;\,N h0V&c,PFJ~|슾O)b8Wq!O-oTYQ.eEhjkΜZ?tB/?,lH՘_][.zdԗ%mVr7R)gu<~ X^ ?1j3^MOlH"ûp \Qdē8waȞod0nRjY#ƿ`d-xS; SDaOF1.0J#ǸHf~jfi׼MKBH@ ^F(W 3JW6+W!ߌ+(։rf b\?WШ`nkw={gM۠Y M8 @HI{=> RWыgpec̑m2Ul1#jll4~Vӗ:>Ϝ-4cU6y;jʠ6푟Ǟ'|Kƶvɜӊws؝{rpe(Ϗܺk4X3ލ?p[5mZMlfcA48" r_&h:^=$oA,,6Ox`J] xDM,T#z_ VHEf n"Y bCCJB|6'ި䆪GJ5N9[~0#ේ#Peɳ?UNĹ{@ari\e=gBK4>"4ZX"7!3׮o'vY2g_pd@ȃz#Jn"3caC(66Ë6],-?ʁ\Vf #{5+Hdck[/Ɋ#!ɚ(c{Lr<SO=!"B&@զ=8;#)7Ȟ֘V. 퓏j(o" 4A4[N?29&,{u/_{cD8Eu,faǟ$a~=Dtcೳkϰ b4Ut7smށ1ǚM7:,x,;u|.> o9a9g%WfTG}qyl\'I;5d Tvޜ'K["X,k1ޙ?O3~PԹuf,3{HZ>7y h'^K_ oDB?+3&XY?{"bȧGU]}%H;ΛIU?W,}pl݅5'wdy>k>T7mcu`˙,&]7XON"{`Tu<ԁ l(ԛVpDsJMouB?3Hm ԪSc>!9+xʂXX' J424c"[5{4Uz*ۆY/ "ҷ(avЏ] @́{lW?x8?k`j~/oJ:?w~񯌁 3U3Gׂx)q(wdJֽ[d;\INM w16@;v<~ct(JsVcR>Hꮛy&_#u b?bٞ^ rmiJp@MN瘮/7vQc!ǔٝB7 WҔꃮI&|/,CR*]ka(߶ # o91vB!#Nⴤ8Rr2Ity$|F~f0@5DY/1 Q4P]vĹ,zR1ĕ1 A20 f% U*ٺ|L(Ou29UϺ7<몭 5%k\Eh !xUjΆ>J_o0Y+VY?knz^ĕ(VC?ֲ*}QYd;];Klf&s4XQNg[<,f~hsd8Wqvi_c!]AKC|2Dn>wԜtiAwik= C%|&z N3[*O-b*ӊRʶ&6mCǏD~99*F!T(v MvP曖#%AiXtJ\,G@s/7wɒ :p6SXʔ>,u׽M,!2 aoU_h2k6ō䎣[O,`K(u!L:>5K+  跋FT K/p {~xۈiXQl,t~)]g ^M@p,T,:ܳ:q!b(-AƂ͘h$Dr&Tyg*tpa-2QBF By1BO+hE:KF0uZLn)T |κHj拪{)}# *T7FX9/hȉh/IͰnpQJ5_s&3`;Ae4}Y$+3x.Dʹ qAh| WFΙYs[Btѕ7{_Cu% {IQ->ozf2(>ʺ7-D}bH΂b~vfƛ uݾLM)pA1RBׄN aqzW:PQcʿ2u4]#Sc `.']M}B{hM29>.:HۭϘV]@ڍP~ (CNz5,S⺑LE)~)IC?FL#.uo¤cWIYZC0]Sk,Ur^ѰRM; <̙BU+:`)+%^k9bs7U^2 z3l0~AkBSFKq v&drŎ|mNy !W^ژ/4uh}zעeGS5H2|5b˛gY";5eXl&3I|: SEm1zR@tj&RSA6yz)=RLH!fi|}RӢ}¸ƽU&-fLG5템e쎚$6x>BuUt2gh^[_],C690S G Ԛ;1p~^EXI!^$w*p+و*iZm H%˳)6 ?y(hu5G+djU_`|i"ِ_Pxj#)l0z 4XKG6a/!}Vbkw'+$~CUiOzes--moC}Ja_|6 :%41,.rՍ{mLuE4#*C1+kmnbZԶ|Eԟ >p.aF< δFs\x引xܫm n/ h*L14LYpsHk9oiMAX\iF/KJQ_Ks:X{T@4f^ܜHB ` L ;0A"[OOC+}M&v+\ 9ɟ^ ]ͰEF`]|Rb:zj- iB ~Y9iuA+A5V~DC〲 K(1ƠԊ(kq%N㴐Z-[kjcSƇ`ρ#i>]ڥ")hki$ Hl]*bL gV#BB[ӔE.{%J$so# [gt,7nh_GФvK^|w}#BRki'0ݰju6+a:~F}BFLt]6L@bʟɧ6BK,..aQg\A:*Jvc=Q^w( #ODʚێK,lKD`@PEjX)w~rs|=0{WUr/G/dy?HSkOtL- dhoY9+/ eVԏֽh+iŭH6yMеqVbVD#4ZVdp'nCY{t!O tƀF9/a/mHX#)yrL_ESi~F8%v<4ѥAp,@˚ CU,̆&[1pgPjk_3ŘB# &9,1eX717lo&4.'P%[FrH VKV6_N$~)QFܾTQ8)::$lJzǃ0:.>+z9^cL DͫB"{jMʓU)*s]5rG$E(m.  5d4te$7nlj=$[WVk0^wÛ5L׆bhm4ܵE wa8lCZle3Β3cqC ~eV]n k n ,SI?r̀K>ًqqdjN$g:"@Yo )cy%XD ) DF0tf-X'6/n֯#Wnd Mo{ 9{baQ@}R]|=/&T&#z_Σ<Պ >!:- !>9S1]w6Qj}ͫQI @v D' +!^@KXYo/I Lݩ'=Z YA*C=>̕rCqjP{* pn@E-!kbdM'./.)9&sd6^BVr5Y@Ƽ;x#0k ͅv  :4/7ٲی;_qf*Jh |ļc_I,b?)Ofp_Тv\gC>j vhKgIo;qQtجswt_oX[|T2Ycl`" Rg04$r5TfnXo(-o\A7kLQ=ˌӑbdbU0a#VPEKLОoݥ WL$Rzl%J^>ڂqC;5Ub%F(q xiF󡭇S3RdY~O Zz > A9ͷ&FYWsMn=}^ahaInQS$!I^Fu^)N=Y[G̙W/ow;a3 AL:-;Ă oG<⟝͕"j=OڬR f%$g7vmc4La8bzσL7I"VT)%UIt-x}J:AamݜrFۦ vp*z+:JԌ#k8쉡y^_u?o0w"hfRI{6@Ƶ`veC>d٩>!J,bȖk,{4k0Y3K(hPр9ΒļegL}26th]gn ܽR; ;WJJӈ9o|D``{0j& ?blg[*_:l]}2?Ivo/NلASۻca—s[(u濘a?h$ ղvgnj\m1A7Νu"Yg뉈 D2؈Zи 8n'DC#IJ<7Vi>ro+0Ƨ*e<1x~_1'\jNݥ}V^6S8#2kWk(5B#Э<((+Ma F]8:jJ$yB{@ ǜDg.xvTu`zH7OX{ AoRl|c`\kSҰRl[kzOA\[y}ƱoAmM9R_:j8_l6 q ``112Ucr9;P2s+" *RF'sUB%)&SX )&g HuW_/E0?޼2m27K؍^M/ fp7ڱ1#>Sc"8d [KyRk7v|R/\1UC#QzJܚO=Hrgt{Ǒ9;o PNg^%U"|1M0eE G控tM+3dU0$W>nhA-T?SYzb[G6PH:O!Hh8nH7Nq;Dٿ(|*6 T{=@MY^9(+tqa ~̳BӾLꊼ*Gi4l n(7&^fԲTCz}5oϋ_Ut>a=뙊+ڎ G/ m-/=r8pӦ]C~{`[X5woO!tmbg4E$B4[Ƞr0^LoFCitиx*X8r]-Ĩ+?!+DK2VAM^" i#AykZTx@io#G5N22WFA'"޵bbC &|` ?E ̙%:@1 !z= .E:;jUx8Cy=8T5f۵#0DBOĝ!^Mb`1oQKt-ǐ=IXGLnZcuƣ<ɪf8OTj-S pY?:7Ei/grP 3r=uHjwL2Tp hIs@xgQWT-0bD;HԆ~{Ɯzo:b"&4gCs! <69y ]%< xՖK.*8?C{mN*@ߞrV0u[/9AZő䴱̓u܌iytnk۾fjX>k$.I恘֨/P,Gkw|j?(j XE82&al]"Y4`FaA 4VK@{e;>t.^)xw]RƟrT/|PϯJ۟y)ObHxIŨO-I\"KE:H!ׯq`"̔Expί؞G/@z"s)xΌlTiP8 @%;xV5p0"NF5^݆ tjtS T"P~@j`h :WUxxt=<<)FEelVgnI v{t)SN8T`JZ*7v!zq>zs'7* *K`^>z eӯQ,A=*ݻ_S(]s@Փ4a#J8-b [2n{(r1{w!4"$G;p;1%$KVMyX~9fI3lͲ_Zߎ:.T Cv_^-H.85TjMWԬmeʜX*7c|fp8e`= pU#C.<%₆غذ|Lj3o41 ?J`AE2(kw>ZD9>U7I̺;igUuDkdO؈D4pyHw/K`6;^:l ?x ʉ,|7{FФhۗo3RIm%KN QKJ8JGuU@*$4˴d&WomS !R (hM̋pVTB9&EjwOmh9@I3_CRW,qAk4YU|M6(^ThKӱmRp!9#F Lۆ.i㠺e:M߻ T:4\2פ0Ssף9qW(W5O,+c/{(Cw+P |z]Ш~x'3)Y 9q&2DУOsw8-2J%UWԩMWC՝m.!~C94%u%фU:GSSQc*Kl ' ͉nn̷SH>1bЯJ9b lPtnms } g>*+dP,QQ1Ҵ hi+WkY@VHMGZZ͂KD ) q62]&8(_m2[ $jBaj[ AgOjf6dc 6Y[`PmvKw%e6m&z`.^+C:+-|]UOveD4t̃!0 s΀eB+*tstwP_P5{[ ܓ.T+!:YЩNBtu,8!jqȱ^7mm%5S EzHml9nuy.DWEaGlL5+5s353\Oq BxVߩ)bK?l&{Z;y~+ !wK yn_ kO7uy˨:Y\}nKP qR7_) W* ٣(C_ ٿ@|:[@bUYpN*'x(.U;?1 gNS’`l/Xx5s5%[NکÎB=XV8?)ɑVRJ {\ZwCtf\ ExyyO8^MZ%,UuڪZ%ɦ7crxqg#6pAF&fJ8<,?ݢV%1[AT5ݷ{:N~׺۪-!U徫C/La͡ =d'(K C{ts4ޑ5ХU"q~ 4tF2hG5 8يyV˂wX4~h4tfӦrq~! /aT>|i3KNӭЕ>iTrI3XZO&RKITira&Hzӽo+w /ڳYpM(Q j ȭy+| voT*f?C|oK-ބf"J[ TY?sЋgdp5qoB$~HB{h>{:g6 l:ebńa+VM;4 8I*kX+kl[]/{y}L4׬V&E@6&z3r&?mκZq"d,G|3$oR`W>yc 7d2L#ˉ% RY v/tkʜXE8q7-8ܫЇGC>hB8&Vb g`J>{[l# lh`NfS9m:O>ބsteok\\/{NA+opDm-{IZ@7XDyLL/'C!;>e$IE :g8 `M8Kw8jG2-Nɗb:GZ/;_D{Ee~zUϟ䢺B<`TTuLwj'n92c:;^*(/K.?N= E3?o@ `Wҏ_լl'yw]us]0PB M#o#B w}ګ L /Ͳ{DQxc%aB˃5Ͽ.F2jT)\򿷞 F9,}7ᷖixڄQȧW eA:ˆP ZЎ>dξ@޺?K~VD_81bjY5KG]A,ʝk+|cHa*Z7ԪFnR~j$a/nœO{% <7 $v#2x u: @(Q1||L U,Jh;N5chp0wIp me8=5Pm~ '/Gڽ91vBРt$-Ia{W]w$ۉJOӉTZ}YL,2/ 98 "6i3)" ΅U3SdlZmӅ,3X;i CW:!-74oj8G9f9 "9~z5;00=7 ˝5*ʌ7V2rA{g$@Pf_ljrB%h%WI^U5h;DR-@U/ ip*di̝mĶˌhT=%u vJ+m?Ӗu@ |VZ[1E\} ͽ5-qViՃ +&srL؁!NKk|sx晉ٷ8fRMy*@6ryյ j+ caxq"/Mʝ E0EPa5UƊ~Yx i=U3+2ZxDQNt;ϗ.oK|7)8TUQhsR#pw| 0 yOB~d-E@ @oI3V {FguOrkz-%L !pbBMX)6kr [cIp5nPh5&Ȩc~l~$U+#[kZeg̹cÉ6J u%#uHTnE{0uDEq.ҥX^X~H@u堞Ũu6k+A]{^LLفI 2fzt#y1 oh$>cqڽ~iwhf\.ҹ \k3 ļ-FuǾQ G=m3PS)TZ'67kh-Q9?[_pwsUbvkE}"^*K;ܿ5e]E;/ܩ7M b;+xa7MxM2|pͲ,WJPDa9L3{8hU4(:0Mft7Je.)b9h3,Nga7[a %(I$2%bF!7P=zYWDk;$k; /=M}%_ LnGnA[k^.3.&}"NN^MW-es<ᣄS朙V$-Q59;xjGErڳ=^nk07YNX,S1_7_8N8Dnw տ|2R;d-+⺺jRwp `=dBraHONFL4aOeͶ 7]Un0cPiW({/caoZԖJ8$qKR)GTTgco/H4J_Ѐu"Qܒ\kq6' !BJλM ޸a+!Z5ʺ BA,Gr7~:܈m~;q1@eU(I0#k߉/+!$# 3~L˻!`@rd4it&PZrkjI%m+"s'=h8'I3ï輤"-ĬFY\Ih7[^(9>HPy}%O%Ohp #C &<n h\6n԰9ăLJW"?~wcbHP9GlQQ9]R gqH7[?K}AT֚t@ Ϯ%9*jԋN#] 7O0X+Xc$<:۬GvzQI^}_tJ IL~ U+npE ]pJ2سLn򖔛ʟ`m8hSHi rcU-h̍7C!r68ڱcqź>ߊu&m^P<ӣk %ZwSɬTѨ~UK;Cj1SqЩ,nz~%.j̞: 3ݡ7sA.5Xm,Dgb&N#(4=?bRLFH( ]pבDȹ>jz/f)_o @,ZNg7c˔ܨCWWm'~izP˄$0-AA^[G(sXvwWiS6F%wElx$-_l)ȩ:0i2[c96!]@rW4`OyɍSInjψy`zC!+'*o3oi.fQ.’I{$2T@FZPIz@1h Saƈ>Zx$0ŒKXOa X]JAYiҸs?]?ql:&#AAߥ*[T0<{po&S>JT ST VGVߚ'){, FdJ~:&C\i.PTh|P2g|Ivś8פXLWp={y(ϼ7V-6Bce s߈] PHT>&ŵUɀH /. 67%fq<%1io/]14vz^,N8>qў4.Z(0!$> #OVίiOkxp=i||tبW'vu+%/osQʾ:m<VӪnJ|cSqWXu*kڱ G]E 뭭ԗٽPI)+'W|}g ۘ'fd,?PƛO"nXHn83Q|\ 8i;)I0[ҟDW ?1U[;5Km0Q> @%0xXA%0 7x '8kTkʰ$?zMAn gni W ˦WʔmcJ4\nj>_ Ǝ$rݎe,̅9TćjM%fw5=g@}Lשw1 һ@o8$}=4Hfά[5|?,.]$ /RT`\ F *pKw}CY hPMK D5Q>4sQ ՚D@/Dclg *ֶ~_.DwU7]`-I,w  j~V>rM]g|~6hl^\k*#37,}y[46zZbZ(EhfA֚/ c@4%}a wG-$SUoD3 :J"7k:IMg$ú4"FGlN*wָ )tk!,Dwg2Uۖ+h@]L.5Dm~īܿ:k< V^ ➻x ݕojJ76SМ&TΑƗ3rPax ÈY1I.4$5 A &0=h<WqWʂA{6+xG'ܮA[U;LH%vmR91xRNS7 eZ;LF0C3@tH>©&nΥ֊lr6H!|/lrGğ6\W. FNƿ3b¦WN-Stͺ,{HA18 5zsIζ8MvPR!č8Hd ayS'0'n:Ojװ gFTje*F b7Z2]U17o|zy2SMzO O6q16įXMIɯ` vH ); D^3ZA!{Ʃ.48dj#*t$qo+sěp2(Ź^R͕7g~W^j pd1^V%19 H҈3 :|} tg|85@sAGxMu`Ls!6">$)A@t4t[R) q%DK. @ůY4N .X-=DZ @P++Aq@Σ$#^^ȍ/շoRŽj@ej=Wntyeؒ?T|*<&)\}­H #V>@lhFԞURxW*Y'Ao݃PE[l vbԧUVA3#'m!zt4ө!#.?U3KBJnj)(8D-tBGz)0F\rH|ôQ_`Zw 㩹Oǖ%EfA`V9QKRw{T K+ cmdK<Cu6rjl^*qOTknhm 3߬6OM\ QR0h9muVĪNq..ܥ4YĪƿ;7;p3ic:BBp'.鱵SpR>]a 6yHC儢޻ |gb -F'uSHKQ96FVM@ҵqrJJ'yg};_d[gԠ8IEFG[v"͑p(m ЄzvX@q;p@Lل a%Y㣸43DҪd7T5t`5Vw)nDV071XALIS}")F>dY]B`UjqR{@ #e'mv6j +!)ȴJ 4jl6`5q$h+C]SR A1 m8D-ä쇏u(s}c">W #_!2#q{2=cgjحsJ `sY"}(7t@%/]y훊_+{{#gP{qygZAk^Xa4=̓]ܨ$+TX0njz',OԨ=ѭ*{&+ =B9rB`QmX `闥B\+P$f0Q eQDkU32ta w7ϻrԛ"MSU+MMM22z‘ 916: F""(= .ZttM5׭kǦoz[ep9ؼ'*4NKy8sEAGE̹ڕj !KlG+پw.@hdpս\|齋: T@)53KUص^g*W?UÑ}4ֺ)mGk;R ;@x[9-l5Q 텴hⰛ__,G*?b3g=I'x!9\d=4-*xE\?s@W(+H=a ^A(Edefb> Hk`3..Cm;X>\O1w ?_Lҧi>[^Vo\Walɉ'k)=ړotB.dM:9Ej"ԌMzZI1 V5RRe5Gd(5E[v*B9 })l+cT`YYW_ Qr"?-?%j'ٰr,SN)RzԘq_ #* =߉Ar<+,(zPEHW$3CDu8(y6S|!Il_236[#@H-1n>A\6ŒGO>u? =oƪ7FS?f b"6}Cm<ƏcmˡS#9_2GY?G/|WOrH}* N]G= 6%Ihu:ޟtYd+Z),s:^YZqЪݟߕ-Vs.i(ҮPT,ĤiJ2S6jg$3p~.z'7N4ZJ;} b6Ӽ+reexb@`谑Z9+u)`M"…:A),"PJF64<'"R5w3aʵ I'"6CW3AQaS]M dcϻu$V(UZeW`|XŎ⃝ `SD&Zs hhӰ*5+I=S7YAD0>:1G6R'TQ5]bvWJlN/)hcޙMi@e_gC#QJ{)FK{*+SW"Ɓtz~h\&<#jb;F݈cw@B48|8lY5߂s@d0hh\n9gK4b7 dx2FUqTF,N?zh}cT -˼V$wڛiOj?[2B5/*>m? ڼ+X[wu; N?RH4cOs(L ezT7JE`'D(c/ЄMA*Eߵ6]5Ola~v6@:峬Am= uE2W?!RVNR]f(/J~<^l/B< p᧡t^NHmTuUŋ]Zk Fs6̏!_6fSXNT9FP5$/]3F"=tFN8Us{7NtNJ`6hٞuJnt9Mnh!"Tؠ&I N\vyhFWO{5 [y\alObA@ֈ̲S÷]CRҨC39}5MX(x{'9pǀ@ir*v}]+uz`/hQ+ErԄk&h4h!0$Nw/ğC:MHv0ǓPNXG!aɎ?p_z,f ëf@,Őـ?GP>R5ǧSj\ڙ'D`i?;vätdMF @$WkDH7((!^0#OU3-z2sG%:C.'@|zz1fw7^BZ^Y@oܲLi!UOJK:: KsR׶%{L=ÔfzT9 h7W2-w÷8 .gB *ûp3_xx^SϽ@Y4Ad3ͻ$U0̖ P3rՔC:B쀇G{D澷MOBF)Tf+Fû\sO2N@/Fݱ[neN=*iRMB@l^FK2y G,`:% <s!][@j#^K^?`bsomŵdR\3\^rm@vO ?0:Y5)#N 91+F^RKeB s ?R&Qbƛ]\(<4WZT%*?yIל@]6nŝ[rQ`A-,(0MULdp'g7@NDHǦ@tEx#&jz'*|(Ў\m\_sTa`8`ZCq󇰦1t)@ho:gC K'[wr϶賲@ ׉1mgB RjH KőtiJʂ/*CɔP,~|@JMcZXU*YvgʒJGd_7ȎpeÐg"9,COAh:qYOlRJDKʹdT4bj HlQSS_mĞy"@H x<`T2&)tYp)2~aM1ǰR0iIӶyZ4L7VwuNFa6pJj*W-NXm]sV~zj#:#o1ED!)ﶖ[`$'J: V<>ƞB钙:QcI< p IjBԙuP>Lp8c䔬|13O';}4k> V00f;gђ}bP!K*_bWvoƏS}x.#7(s4NWǭI.WamTq92yp/ȫUPE1o!PRfY Fi8]N-l*C03? &" Y랠XeA_#judΖjUȟuO' ZnM$ȅ_Tv5FlR-l6ŭ26>t~ٗgہTjKk|c.1$dՑD;{hNyzr/p8 2r+$mI ^)f+}o_F+b3zjI&4_;pEmq DwJ>Ui.1%кxx{!*2"$&ݼ9J=MrY\8ڧ{kMKh7IrkF!';ތ_5$ ̾c`#4s]6~(ոo^+ 3V*ש272z OjH^AuOkap{#[axҾOѫ ,)ni&𘌅.ѳ'RQ!Z3xJ&< #?>⤸v8@K^dR< ux1~⾄Zuldؔ_q" +`{N .x e #3,:^K!3äޟB3aDlOgscV*$Iɜ#慀̳cPb``T mL\&]39=YtxK`4l9Trl!8;R#c2>u%nMgҾ5݇ 9Cϩ$"xL%BkeO"T Xl#>e8Gjt[fhyjBV=A бlC-X3!EA9E|sᘫ$G:xBzAˋ*&bl|#镞#˚F R8o-ēfhT~E^ [y6bch2H`Q~$U1HE*}ʅ-:[k=;.8O:7L]@`ɈKL1aZt""L<9#9L2O3N0A0 )hc ~" /k|[/s;t*$Z zk30n^{PSm [Qj&~[8#dd0mwq4s BN;Yj%oh f/ٍ{/Ķw>{}UqHbNU ~)M9mE/5l Ļ$촷T X( 4!W"*ThIȷ7xUkeUxr8T1LgmoƢu_y-Ze :qNt-Wj9 =jTo:b1F SpR֚V ތ`Y3ol#N1-Ȉ=|=Z^1e} V.>ʞ¿خ20U_{)GAx}-E+i]0K@UQIH?qQN./A&@CAxbI+Sְ]Ba`$z_r%shu_AހFp YMV<T~ҲtCv#V&w^?'t`K)Ζ+@ǁtWѽ'Oݠ>9?q!g=8 z,EI;\)u;'f;gxl} -. l R<~ g "_>WRSPj4(9,CBAјt(F !xԽoU4jTK{gz*eD96)H0ݼyNFKvmh+>V{upVʚ{OvG9_P(`t[cBwNC] չEG{U&  z\hj쬚I*k,-­Z\cX?[v~ }7fTaK%ځs;Gc:-ֻ vF()4c̦J 2)" ANIAhL[#£ۑWc\тY{iѱ[k l׫æS71-R6c-3Ӌ:Iv,#Q@Ydi'aK{(BPuJ]+s|Ci9B_)̧/^'{azJjR⸠B]4~En#N)C53~8J%kr'AHh>MsRJv|{蔁u80*'`iF& iEYl>b<#%-aH\Š`k!;mq]++I9FOq>X#בcpBO&B$"{ЩoLb[I PiK"oCd 7$o%zvl;EDU=X$#6}"{3i'賏{<.Xc'F(E+&w= spŧfjoxnj'fy9RtBIH]V C, |J05˼$mc>y,aԵ1Ƅ+w;w /2+iN耀!ȍe4&*|Ǻ׍9&4Ds LݪXSM{H@P+̱5&&lPETio\'aB6ؕrJV89~\ᒜa!לQ7! !ʭWe?.p\䄟2XCokSj:-EZ_y A"Tr$pHYS>@>*I,{Bp6r$[u΅y(j 4&L @j p T4=_Hjz 8VLxڹOBId]\mQˆ&M1 #{4 7kX1(P҈va۲14JG^ mE42m}r{$n"p t^\o]$jDTs۲j/`4wiiz~geCG z5-θS6p 1>GdZ@N&M, e1[5ۇڐ_i0_#5Z="4[Ghb_4& gLCU#i-Չ]4%xPğfC4-("`ٱ{K e0ChE^3*)9\5%Ql_y1u^*%3@N:q4ZK y7Jύ/IFjl-Z3>/W.z-4E.*|Q6o"Ux,Ԉs1K1U,DDy87-6ȑ4gKFiylAQc ˛xXSf#Z)Cm% 6tKkM9f9s )lil&Ø;GX+*͟JbjU59OiՒLr 5~Kzt y>nduj֎&jm֠ s|bMt7Z7*_t+ gG}B򗔿5ܑ ,w6ʃIH]dFMv˦M3Z@!+7^{A[߲He G5QISBd><>![˼#iD\P|~D"m 9diSGEPek:=P``+ХEI+23ނ48DR^t#f:>9N"ENKI\BqcB*O'E~Z|I-p*K E@Hg7;O:!tj&a5Rن<`,m<;鏡x3T! He=t cJm2.HW5iu/t ߖ aI@n;Ծ*Oaq6xuxyU䑬Y}P}%['C  d)^|\AqCk+a,2yFޔ~|C {ءq!GH4dpgs۷KRQGA! ɇW 5RLkor~SmE LgκLwT~5IxqtA=+k^=l Tj'Zɴ4'e ` 3A"Jr&Lyx%D80БkUxN9nTSobŻɝ8r1PB2COs.@Db +ZBu'(懁P7a qj{X̝H;^wX*3'Լ`AGhCt~3+(a L[ɗdLL:THD5Ae2 <kq`򻨙[.+8 GTj"@򋅄x|cVQwmO##bKJ;DDS9D)D&Yv/65fwlޛ]/F#u~Nbai8T¾N2Ik'V3bҳ@ "`E.7iI;̣e_)gрcZ=X[R)!{sZ'K+HȲ6s?lO6ű |ӣ-2~.`&m M3)&ROAe-鯭2Kԫp3q?Nd%n>3U#b00C0'̍WvPE|hl9yE?=i1))C}-+j*6i 1zJʌ?VU~ɺl,-Z~)K当/k 0.;ƟP@ CpC& :9gw՜~[AP[S>{k*iOu ש1^@ṛz@>Urݞ1|֞KxnDgf! ֐Wv.& r{?~ud`e+B 9t2fqָm6J296'<?t} J3~Hl0ݲYshdqŨMG~. KڭSqA ƈ~Or9WnZm&s\eI8mKsi=N>rQh,6cygnY\ȍDM:j_C#`Ð^nBӠ%l>%Wx* J'D^5^8vE!b&#m+j&$Ɖω/ zBYД|z{`R:> $nwy nR 9.\$ Qh7(2@ԥkxS.&v~|Ao !J%/Bjkjz_s}򒩫T*#yٽ&+ 5Ű;Ryʫ^&N 2/gp\^8VGqk'dGPFԉڏI&g`^$VčY$cq~q%SW-xJYDn4Ezy8"@KK-ar_xi:rK5s ه'OUmF4ไ]e!IlQIɟӒ|sb1c4m6d52cF sbܺ5K'XgaM)SLH[]<74}gs ƬWCosJI SWinz6gʦYBUCF>Swڋ]im!# 6k&+JV)|Mw3wӬzʚӖJJOu={@zJF7vaKW5];l] B1u" P"Zp -d4xS: ^:dd Ч1X` G%:o礫a }jpg)B]Ju~Dă.?oywǘ>jfB2ewJK6,EL؟Hm E?lVcasY8|S^ (Lf4ů 6i`?y&3i {,J8E.I- 1B((*ũ.CH sDQ["qW8%naZ#+$p lW ',yp4-kd_`+>asJ*Ja3q)3*Kq}d0L8U^bk42A\ TPIW@?wCyK9"OSحZ!w%PMߢ`y}hۡIxFUM)"ϲî y/}]?j;"U9ZW4s5u/>"yC]L#4h;ٯJ/ӾsJhC7LJ`5Flb+} 5lAXe, gܓ |r)m#@wf$<,"qp'IҴ~s2$*OZMzFaJUahPvvnTdEmZBM^'b~pp!<>X'T,_v?8-All91d}//NSVSͭ D|c|)C"bB-a+s}sV>ld37.54PaIJui{[|i56*$o ܷxA `sl\(dTZva8\I6N6uد!O̐]&lqӸ-HGJnW{C:JP"֤b@Cftf]F%N7╋=)gƳ7w>i)>ލ.դgʗh >.C*/ -;kCӓ*T:H[CA1'pbGz͐{<R'עc*u.Fm Uwxy~. -ý!۲`Y}O^UFE޺RSEi~poLҶ %mqdkA'DMw862 cjė MeSFcqY>1|RTroSV˷ Gu,+o/_HrJ.&ʏ? 8d$bm,ӊw'H91F2 FaHhH/Ϟek74 CU~u2U8)< Hhpl0ViI=R(%6:<_1yQE,,vʻ{^l]ߵN0F2J},:&ȱBqZQgO. L0=Ί ~LPf,Rڸb7p3̹5/׶d{GM1ç E1eyW}nc^vzLe Q|-%y|6WU%G8%yf՜[+myd6AlE,wPD&}Hk PFwuR޵R4Liۄ/ͪRc}i!9A SC'|-4x@puj 8 CŒR4ɩJf~KB8nL3 {jO}`K89㪟mD>T͢PDN.vv *}Go]CWFJ@ElUSnDԑVMb8Ìq (B W@WI5t=gpI6s/*/D&4ՠFƩJ$Goǰ}ԑ/AZLG/#eGϩ<啋 tb _g*wI7b M,2y#T͗}vm ,|; ܄5iL$d5DO◔êB/(؂tos`Fi1n<1-֓69m }J\/IV 6NADX*C)XLko԰m>"o>jfM0>Ը4d|]a~6pX,aбP^Sv\w8TB9ɨze~7G|ZiwKCO^~߿&ԉ 0o:];N=,TM/=ڬoJ!S۶%ظPʒ jWT2s)Ѳ]ynSqI(J;aya emsG-2O8Pg"bQ -_FoP~ Z Wu:m" )R‹nXiVL,#ك{mB{IFw }(kGj=$9^ A|E!H^1CߙdOi)jS rCFAdnj(@9)*BV~C1a0 .mE&`mw7!S3O0w ڠ̿`'۳3;;'e#&Ӌ'ْeSMItK9 KpϞ33},DBip ѯɨ@1Ɲ%2^ջy@@NC$)>ALg1Q?٬1Ux[;8ӻn BCS@ >Reo~m@IIёh`߃ 2 P 8nHW*xT!*Θvꖒ=:'ii;ND|/rwFs( Gl7sbq& ~uşY9 "3pmFnMcI@YRdI,@NEKl]OL~9[$|v*k0c8}k;* YlA/2!z2s}s4f7_[DXNWlYjу~X&OaPDZ Yژuޱbbqs6" ܦBL?~!?H׺ڗY:+ƌ;O!}"O1"|\fCzLxWt /}K::T'X-*.r-9]KpD2nK'WY7< U)t*Uʣ^u g'RySU/ӭOp#kh #²@)JK>2h\^e8) l2~PB<^  -rxhd8gc$e^Sg@F?:8ޚh{Tlt?aQ2vifA-߃5$r hNV+sp9~zsMrn.fnBO cdU8rd'`y(=*B' H0Eiw:4Ƌ7L_ l? u;>h.+?NGTӼݡ.m;7flIEV&wrjcÓʙn0 :)Ow>j_}ms3=b @zY6 uExlsӭ jL6N u}t:xWg$pzd1fs@ ݺWE^TT#4c׃W]Iqٖ]7Q\rC4!B4^_Cz- 6o4Z(Oe{ $)bu:w% }U;Krpֆƚ* #ĎaA"\(FJšq#qC(DM PPVGvCk(rY<9<7.7;2*Ć#([S1?6 'ѯM'Јz~.t֘D(`0ޤ Aڅ!+8MJ+|],JOl+ eAջAO~3Bj^CxT#^6*8HGwÖ"6<ֈkE(Xn^̭]j\hqK8a:[dz3Z&vSTxa{t.Gs0k1BZS>d56!DYsMf%ZΪ̦] 3" ~LVBR$U9?^P p.BHNE]\/^ \+x{Z8V- lˑI$`m(5EĖ7c֓bl6~weչ/[4ڲ ?^\aP\I'0^3gx#:'82r#ͶiD$df֊g'fYfjfչ%5)z2iY?}(չϵ}ںK"ciЪRy-{Q0Үj._SDiZ1CL}:`#ڧ'4Z7X9A4 T=e ƾK53uQo9BMRJ)/{1ĻF^F[ߤKB2M:8{)s,G͵_%ʪ& '1>,נ(Qy@r 9i%$EX{_+rI0'#DhvFM{ >۶p/Ą#| ")S.qhM,cK:*I`_f ;ƴ(|f(NLv &H?.bT .%ψ`_w+ƕ߉qQSH}Ԁ^;9s+|[w9A{ vh<)+ |̓mɇ{$ҋ%m-(M4@%Y-- 0'H4`Rn{ԤFZfnIcQx'ۊ\SCZS;&"eZus?'׏bi{Is{꜉,J7p=oJ; DGTAHy$7c[9^9cLЕLāA}1,-<[dw@09169 F`.c.E/q"N*n򦫯փ-K1A( H;G% :T˙P\T][oIx9g<|D^W-RB֏T= ipK4 @dʉ=V+-cKώ=R'YxUna*I2\ ~ Aܲ^"џ,+c~~k{զ.2Ktk"` m"P0{sav-*(٩kCkTX)p }tBEKVŒk.H+ELw)#%:~Ya˟QBZcVR915r%N,X$U$>Dmv┒ڭĞ eSf:(nWQ2w.$$(R ^IS)>ό-e2x_A3XOjo-H=pJRgM4ǚ]_xBA =Dz%JXyamL;Cr,0Dw|YE^*c"JSO櫤Μ"@6Ѓ1Ll̟xof==_W88-Q]IX-gBA(=\Cb_hjs"6 ==3" Npn$X2~& 5ܡz䭣9--y4u:JU9B~HG"Hd,%[WIK SEdúSy$͏~#' 7C$OdBT&^b4.])}uS[O}Ll#DPjG=~-G #=K $%:T7_j޾ 7WGXx'"n46o/r˙cISz܆noq^M+|TFkt*O=E祑OAǁȂ䑋śK]XX0 3 -o4O$G,⣾1MKo)J!E^6fmdCam{*ɡu_=0l4D:0JQCa*ޑq`y&>R2yԶ (oFۖl9!܇k#cL՟}QĬX]FKr0[D\#TT'Eex#U6{\7-?B{{2)J2S|rDX#(%=5cf(Z9˩S=nQp߿dɯ\^0g pS"5M]kTK+Q%%+߽1gct,V/.Za?MZ]˱q !0G› s%ᨳ̪ ^h7% #H6}T΢ݻlZrS.EL ̌Y7)4V/NhKFQ0~a?-';/dۧ7FQ['G}f rc3G 𮅭I<({7XU3feErdσ)Q/+C~>7 ^]L[)6v7D/h&4(ΟբE /R('l[N grE 4K_IElzT"W{t>نa6g^&@ԽYj^H"ʪoT PocM7.Z곀;k" xRSr&Nd3/VNvnhI8 > ݽ5ʜĎsE^apo9B\1&$Wů(E}?qkoz Tָ(rgw~T&;ƺ bq639\vl\PFQi;EFÎM 59,# T(#\5*,msD| ׎묗W|h˫]r3#F{V$f찳:hCuA1d#Z[M }@95I2SZ=.! xG08;K@|ʃ4npŽ]sYLa'OLҲ6`5|\L80>D4wW}h'+0s#**{5P3{([,ݺX3VwlȨi jC67^ !cԃ>؄9r2[֖MBj o51zbk&bm߉|Bk-mեYPdO_7Ï;8`GUժv f\Fפ:3Ad@>6wQa(I’`w.jkllirrj&º^k F[jI%7iITR"k/~$|]+?j6~.$%To j uY ^T i09Oc@IxhgyrJjzʠnt2SrQ[zL">bޟM2VI^&cis[|61m @?qc W,#ԋ` cf9KC6ouc3.rSMU@*pP< 3"qr#l{uK$l3#nsA d'GxQ86٩ทsSوTmx`:y6qLv s9%\8Q 2p|Z]m_ﱳX=@oA$)r.Tth9]~߼tP33H4Gg{ Y` 6;Q|DqP{4glr$igBD{1 ;`حشX ГDOw(Uzș nts(6 zT:.oX1`jj6ۑnX'Ս|Hr JL#ޕaD-L$c!31q+a Cdf0ta,XIry`Nl#\TNPC@c- 'cԷTP}+\.!]8a{Ag4Vr(t|]..X5KfA\i!w Uk|-m8ɹ"3قVyݜ2 =e͐(L5!ќk)$qe+>B d 梣 LȊ&v"dERQ4$^ Nm+ =qPg<}L0"?TNVvkS?wa2{2_?2$-x}˪)*aN_/\y] 4BSv`S$Z|-!b!1ˣ&y.q\.SE_WT#Xfq{cfJ52}Y!6<$cl6Nɉ +$W,)?j":u_uDq7,ʞ`pTnO'',KBQs=>.)06xT?)y5~n{:@s=Z <5CMLy4oDi (&43{Q9OK-p dR(_sy5=_"%/=p~QFyQQFhkޗ!dA̛,c)fF 7YHٴ/IP՝A(I{}g9iL-}<=c!a 7<.΄|Q %*VQV09^$GObp%q 27'G912BAШt( {n7eaeE_}f+AgLHIћ .p\$5ͫVWG|4;.aN\ zS$~w%PݎsxyI藊OlȸBvY~ErZ@BR~[ɩ4Nոѷ钃QП9$LҠcx/PUfdG 巄7FYOY(,έ0@FՌtKXSQ4fAIAlL[gmq*F%%n1_YfljCl׫]XLナӘ2 Grch)cTn҇RvL.yfnkլ:z_%"mQҎ;۸T*ɴ8 'z>~Pq:aHo Fح?&kdI+F33r4KpX-~z'n=Vw띆5q0!Ėf z|Y'/>7;8 .;h+k9 쪼oXubX>: \4^+uOA[^ .MɂT7ؙ0d+ΙW-Vmo ymsK7ፖ۫^q1`TJf@-ćO( 7C)~J~xDqCX@pH.34 JmꭑsPic~:)E!4@u6o洞_$TdVEV+ګqi\#l[ܹ[6֒1ؔ +iQpk@>ؤ8UfC` p/~k065DwE>؊fK\$QR"]E A\NHȼ.g$֖s˱ ߭[ș VLrfnCga<zorA%nFb$@:vɔq9U :a>֡B{Vϐ@鋻!N,$?`1 5*Ίb2aeg40\><= aIiZ.&jB]jӠ _|&ϫh=n {fKiL_ ˒&5:xݾO\9>ڙt(㯄|#N֭^k 6S0^*;cxt1_Ûs'J@?E&rŀs_.0OCHu3\sIa:+r)~BZX720)Dvn(]am|Ǭ@QH\eAYmŒB26#鑄 9xܑfZѴeduZJ49D\mT>ȃ 87**6@J{UjT(r&_oxo/d̓/|%h%_T8|'&sS oȵLpvf00_@~-?G%֞ujR;?UtmBLI*m}O4dμJҕ%Zi$j;`px(+q>mN0`목,>)i6cvS$s"yX/dS1KY(-l6Pƣ#Nld|Z#Rv<1T}T$;au4ebbQ tHXfg [PYnT1U.`[Μ+`2lJGm )X0{'QUB{&S*ҽxׄ =|pa/ET\ׄsEçWgj(*'?t( ;@zn6p^#2BFe~ p$ra /Zb3T3~3cQ1S*[A7{1i6M(˴ 0 ^1Jf2'8ma4ceÚ/0ZG3.$FN,F¼Տ+ w8Eje4ǧd"̕iּ~35G>G% pq.' I-\"c>*lCuZ#mm@ϵ01nb{+?T- tjlx;z\=) )\ Cuq-5w&QZ>ݐ;N\>c0>~Z^@% } a=/\(`@Lvj>OޞaSƦۦuB.rJi&I"o"(dnA틊,9c12fb  VvU]3ZET Py:V 2Uy؄W5kJoƸDUT$D!\NK`UqV[i9Vʂq J\[/% ӬVsѧ+< %5`˝2޴ܕT 49[\%h}A@N[#m֚*g'pwԀmt^q7E1AM_ܣ'>]}痻]7W'RƧF~ c+D3 Ax]SVB'' y-=@b $#eBE .Dػ>;+~=SK1)iA-F:9>LP~,L7]y&EtU++յ.54ndXZ1=ŨV s#J$X[8@{ƕfRMjbc'?&~&:x36ҍ TO!y87n\pL+[+Ax{}߆89IBaNSah&Bmi t.4yDE*y1-p~8WdLDe%ί[sKRtU,uN|0CVxՂ:Qxqhk\ Kk0ݼƕ81ĬZXcۡOq'ӳK)\f 60AbcTJ'}vS\ލ0p;Uc4.%3p Wy9_;}ne +}̺nH[ IɊrkk=J CF+%9 `hj< Ubnf`d M4Maffw10 ?s\u@~U PB+.$[ |ؾCHbii.Zc:r>! ɰG !bm6Nna;h@ ꒆ}g{s mgCQ>hToN)᷵0KA -?SLw"%湛+zbBI>ڨJe_#< +6պK,ȬX*D=6"z@$[o56Q 〖Ui35U!b(·O2õ쒦E -VN>r7cdžxt?Efsw}u0)R$o5;fPJB?>Nio<\*ԸmΎc w@8=kv1 m4@1@ܾJDN掱V-2Ϙ~.Oۘw+O N3 @MhEj"gEWe@ e9,lB0acH:iQs' Y(uR㔟+G F*(+72>]SY&,!XRwIωj96]CH@&> DNCo_S+|?2u_bIijq.7!Tsce6iWDɜHRNM@U 1uMA3"s B_fD}nGVF'Z9L_Wc'7o<!%^v<_u,z1r= ^a9MCAhQZ'sX׼uy%u Æ]iK]nQ[ǏhDGi:ьEM3o#)iK zC߈u1(HV~-"wz$+Zs ֜}lǝ -Ū!VuD?H?{<j4TTX;q[ ޗ^hh64lWXR9q(Zd\ACLw[7$҉]X}<_Mo_/] OlpzC>iW qtx{{ ȗKF9Ҋ(>iyOvF\M-;gqgl1V)(c=7cs:-2MG΃{nH)I&F$y.J)¦tlwe{.,9χ i鱧R^QnB &Nn[Kݞ hf9!lqNEDk-օ^0"H}+mV$0dOPUD&,k$h΂(5l$jE܇Iexz:+z/P{YsQ q!]ڭ5'"zɷ R\'ř45 2L\F12 ##×'il8 5]ZC'Fۛhxv4!yG3?2PXk!uccn!b! GׇK3|X2*Dyٱ̐cy3 tn2w9lkrgk{@NH+ZjX*A^*qsl2ƥ Q,` X+9bw6}&4AmYe}ɭ^-ebOfi..OɐWQͥJq-CǗ&2*ȧث7$U[~9/fٌUd~䌣LW15-LmEMw`e|* dU5p&Nlz;1cZEGy?V&F5s!VӒs!ƌxewhh: bCN=@h,dۥs|UD#im(a xy^܇#2"p 䃟E/X? [LY$*E'QW\s)c{4 &IyFoO -aV;YVPzG!z#uMd F48M.?o<3P=a 4d+-0ze$՘t]*ZI(yk~5+,B/iACI6Гwd,}/KTo.O(EQ>0(|^aKEXy(e< eo3>v̴dE7D9jLe>a$CZk_7.=0KTG Zڄ%HuM\*j-VCsqSKU6!-֐D(atY2*[#Yӗ -q9yR[{Z%@ɷ'-6rAc FAtY6/sckyE@WRQFJgop,!{sƩ ]ed[ޖ6W-s}Џn U;aЕjƮP&i"WhGfYiBÙ?)-5#VL0|xnk-R7#m`:xj?:G֖~^v? sj]2>r$ώ<2Oa`WL(S[媷3ŘҴdIf.fPޤfCY0~g$&8$9s2OuZM8F`|jjd1Vk|QѸ zESyAd"*3ut9Q;qds]{-?PQZ|հ2; )0Fj Eäp"WZw2O2FGcc YPV-`8mq1'[5+\Q'TR9ѐ=iZZzXHN’%5l|E^AB9te=.T޸<ЛጺY 0((F?8=^~bU0->.g:xi;?sڧDkct>~Drҁr Hpq,\ &OrZ' # Ne v\U0 ւis7e34@5]P t/ *db {QG8vJ8ĴyzPHP*(;wFN 2?ML=?s%'G^ eW^шWV{XQG6 x=H~X简`mٵ 'p=>ysA&fTѠ~\jQ&?wX5( A} y嘋LbyE2뀝txnǓ͙ qU,2zr''I{#<뙊u߳`)1x l>k|xa9})tϔi>zFwV8]=Z̷LSQEMPͿ`Ԑ|Nw m'T~l<`C@1~ߋ.=)i='; Q{4KV'˙6v&iCT9Ʀsrc*쏮Shi5F5Nl>[:˚dԚf#A\z*3[JD3( (ގZnJ6 |y+ þ nrXCoɩ,XpnM{oF S8:`vU{7;^\md:S^/0,:܊#J4@]}a"E.#zUs0׳s/|Y#q/ rtezMR_Eef2qBhO8x6祃o[FLB}tZZ,|åPߜP{V:s 셳rq~ ˹B4=l2bݎZk,3Aĕg>Qʩ)O;YTe@/QKʋ¬;N| 9j~sr*@(u EId.Hm{]EkL:DQ94)w7ȥ s CnXr^& 1*3zdT0ӎN0S!IVU/uw$GClxnLlVMaNwς\޹])$mlLo) JcU]u( 1*gU'fj?i!Mm!y_AV/*wӚ̏g xa-һz'pUB^7&/r=ϕ[|+?nL+4Aا=fxu I*@0.[yFi(Ⱦ\kp. '8tz L/@!1k]XL'u^/uM}근-d msVVRD~>bVŘY#\(k4"Kus1yN(&' .yժ(N0ZX!ע\AE<9 }0qs^N2{ǂg3v- Q]vNi[z-F&Po6U qeXnRx6I{CFnͺ,2пLGd+cXwD-Ua 86%\TTXNT$ݴz?6[)|bH0s2Hq s'e 72pY%ewu1,41AkX_, 8ˌ86dVF*Tqk[Q''7)c|7nrӶ6WE{{+0)Y#<6iR`w% CdJ3C>B vqcI.q3!Ebd=onbFqg hL!y|Ydf|װ4emGěӜzs+,0^|B?bM}iՁ/%KĿtԼqeK{9^iVg$Bo?3 d$u^գ@gO0O v=앂2 G;=Zwl1S vw 0՟2R%εP37]O+ l/īi4QɪrsbgO EmAAj5-2}O1Hq|/cdZi^^13o6q9-nfwt$#Sq ୏ ÝWJf9J #now (~f4wS >W>Gof,.^gcMb Y`5쉾MP⤣($!E-t3YBɳv"R&zcl]o(<`&v 0I "hU+͵_m{0 ud̙W "3mf$序9ŧy`RÝꇅbS8`OY{@}xP#(fVd. OTX;2|IvŧjEKWo<k73OB6iLr@ j 5BAai47r>3;0}Sa:7W Nz$&tԳ$bw=?dyAWW5g:%G`WeLQ`,S2XyQ-3ca:n^C<I%wy@ݬLc/Su׾\!?m0M̈qyXohlP2^r Mdxjئ/%J.C@:-ڔJa Zײ=1JBX:{aK^MY?/ȥ.*.w" ~/;:[@'^|ԭ% DS]6&N~R0-$}H4s:>Uг4.2K!NN^x 4zngg6ET<՝;ZH'ld`Ƥ$Qg;vsG{W7f_["FiQafhf֚d854;fn:Lk`Hʋ^1~>{e>e/B3 +bþe[@j=^\/1Ւ<hTOr2k*lNoLGKBtwDZ}iDVDYRʸmHw`>Y.UkW-04g H1;ABGxfLa~]Sf$?sIA?W8goQ;?عU%; К4w|XvGj80He2-+$ٺT'/`lb ݇z:`^x];ED/*X*iI9յ-֕`ɯ6ƒ¸!U1#,ebE aXdvmQHb(CaZu0vcQTwD~^|"-6m;pw ,5*</եS>H4`"Wr{G՟}`x8@0zMzί]|3 4mG_nOiYh v֏ONh1%eu'C(}L|R$P 4RAi VP=|_Oiج`aņgu%Ggwmr"tײ&_Vzgo>)a--3GM< 醓udf#zMGŸ,/$C$T%^a{LyY @FU`%vCCG^n͙lө҄sN_0.YS͖ՄO_@gG'a|X3i_e8C${P.5;7Zfrc\h'@hpO(!?#R#p0^<>W|6[Ce G nzeZ?WcR X6 `Øjf%xjӱ^,'p%T rt1\ A;}3ˌvy H))&`nfj[]1TAFvUb̘([IT;Òݥn AK*hX|ַo=*4gU=pW:h48o; ]0aTy_Kڐ9%D?3$NHcw݉@z9u.A*%CNf&cF1gʝmqT2΄dmMk"MB6|NSkL;dOkbB;vi⨂3y AdQxO N.K<+`os<`Ѧ7wH2.D@rygіevA`ϟPkvvi`cW=YpLz9@ZkުJdaIbu!o{YȘ8)$oY%G‡kĈ3J`1l($JJMܓ%{87؟Y<qieP?A/_tOF ^صc!E,znnĚ%s_79h4OB;dv[/Q 5k:;@h Z2qAYۡxC?z088#Bd]6f5Ѕc_yq; lHV~hbiؕ{s{2˻p|ٹy/".e7ZB9ל0σ{4In% 7A^6ݙO,y^4MNeճ .HVc<pK##Prj]2toggY{(f+v]4l놭w;WQ6Mc Dt58t=SP_H n3@9Nztp$%]u,meSkNvfz-ON5Z./+vc5#q浆;/!@+MocwUkʖ VzG}* #ɖѱxL*9ͯ H-ay%Hƥ癆.w $Pcۗkx] ,]RJV (1`'oXWUV1 /12绣sWozQ*tq.)Zoу/D9X$gFݗBƿ,3sg8SM̡EF i`? Zi8ib\RYPbW)A"9-#R#X: ԫ8TZ>uFR*RΦƆ3#EOw,֚%<$_k`_ +-(!y^Td!<-1,"\,abҀ ~@ք[d.v)+]I/?>LOi;/ͣKA3~$&#MK}hJ穴yq KRr K7dD~Goȍ *[UxU#yV`yKz(eVp bzl+ˬ#}ȡor &nnc ; n6։SƢE/Ydmc q]] 8Sk'w׵Fh5 L~3V(|gՈ9:p?IUDJ鲭ο\)UHd |֋&U/R%ӿ#+c5 E舽*dAc$4s/drڧd~ Z coJn_T%] ]c`>Ÿp>0|؇H$C9A#4gO$[G]I}.U-Dv~YE`7p:{^1|_qaj{ 2 nXZN2pJ`GVp;} >XI\ ;[dMw{ :hXX(]QCo!r chHLRT0'˟=LE Xdx)YQ׈7F8P`'ǫۖ~%I&՘U_@gV-Z.e2#/ \@h4tYC j9[2Oqyg]6pGEL3SR+)J|?lTft^ ֞@.=Kb"m [I M5lvL5D4|@2VlkٴڌP|F~1q>ÆRQX!1p/m y3ޖ;< Ahɧ+q@U )[%0?2B- y>4g.o~2qzTN5tvi.xP; \rHJO!ئ=<V#c~C2;@I_]Lq*(P#U*3<^+MHYfTf]NXV)Ç@l*g^``;;yL!6U1tRsejzyQ;[~;sm!z韱Ey -scLŢ]R:~h`V ĜGD׳$$/I99M+IE?'r3/L)9pI˝Ziڌ3u[ -x,"k, 5)vĵk<+RvTn]Ur%,9&M/;>Mhբ7ƣW+^K5YYZէ>t!{&m|{%rm1VU^n- n?hU[78b4C*]H@A5+t3z?/ j^Jn]vR@XeYګv,4wkdgJ 9u"LPLGaq5f_\o3L0Ln"!9g@>>y &e9& ӂ'glm AIlORiVsszJRSOܦF]=mpoKsA~_kWR! UT h ݴ1ůY ݽۇV9+o+Ѭy9-B~nS\ߞr^Yt*C.8_Tn۫&$\<31Ÿtz{mr':bkyQl~k@h' fGBlu݋;P6Mڝ2ݲ, z1ċsXC_"]a[\ K1 Tt߃6Fa 49&87s5D˞괈3=N[e}9<8U!]~&hDk񹢤S`+*LA jCT'5Ʊd?8JG=@= Z .D$Hr-Fn ^{>f6Q2Uwvf挣%W̷ވ{`eEmFP?bm*wɬj?0P7"$Ldryy{n-5\[,~o(eU}l,+?LIg-807۹謊jB6Oa@y#OѢ=5>1b7R׌Q<մMջ#6k>-vJe#ksI?チt][J@͓(\{ 8Sї1M-A4(,B*3s55Rؠ@|E\3Z^R;~֛/퍕"tM?&c'q.x뭾@@: xXLθT!˯Z̕nra TX/ؖ)pS1 oPNDx*up=9{Nʼ}b,9*Ō5=^I.4Xr\Bys} i7qM#H݂t4孧J\U\(%DFŘ.1fhygډ)aqKuXݒ7zq{ dye{\Vbl۵LmdL(t z yg[013bL=vN!HÚHt7aO B THIm.Kl[GD/.Pe*̕,ه2n<2TG/FFPd*m` A"K}14#< @IxIBBۭ>׀NvD73%ĎWsIĀc&][J3e>~N ilAuO3\S4Nek ylA+%3&[@\,{ ʆC]:hl<+2V>8 £BT^EZg,$ ۯG0C"؏mC冭 FI/Tc ~ӿǩW_xwxtl3c &9<筩2󶧹 WK兠s9DZ벑֬\neh}U,ܪa'QxE_m;~sN\7֠FgqzmU4Hq.?1rﱀ y.$[g{Qh˼Ia\hea_v?W8W]CRo|R2OlÜdd%\Ɏ6R 8q?VZջZpۄ@I4gaq/lnrWbJJ?1,oe5-~i ˜H_Ul2 vI抩CTӰa \Ae$k,IC*+qmzsunP*jP<5X[DT9h{bpV︇O6m=hXai0ed " 4ID$a(~y ɋ6}GD: m|狜3,ONZ=(fñ{@uAABKvăd%X.ZU-#PT.W]-*Ho C VJ?VeR[+I|_eu~pnZ! BX|^NɰfnzQ5r5f,}L|t(jZ #R^.̀ܙka 76n)l{t$Xk-&ò,;2"G 石pqTIJ58}VMVU0c5IvFt`Kn6kx 2Л;oCJ/R#ƅ^Ky* V'EĠ7KYnW{Rn>GD҃9NdWDz i -WإEC4Go;JPLmɏ k}CLm=_>}B#ǩ:]ec(`y|_ʙc6A`) .Z;8w73|5(`O?}eWи<r~}ˤJ0[L25En֌: &ۣE{ٽe#.@ЪIK_L(|hޤ.l$Hd^#؉|J&h}5'tѩ;Ö5b`/G0Nd>`ffs5 ً>4U  9,+BBHHf %UW[K~H.F6Ifʒ΃ϳte.m$SD}elwg]Xգ0#q"'˸A4ub1 n|GRv薙i)lf*i.Ċ*tcWPe_%qkHL-A/B2w b"(gx9. $ݒ '"m{U#!2=/D\)LF~(o]e]HBC@-q)@ɿk~=#tQ\DMyѐRf˕F 3ogUՠR?(Pp!Mv⡉7t٦Ơ G9]mFrlipU lfOtWv1w7ov2llJ)f< qyvSqyNJ)BKNWVr6cnsq e?J#lnMtV5db I *bףUfAnǸ[Dj/'"G,L8%0NYĎ2ę"fFCcN(b\;&0[̩Tlm ,8Ո !t[TAΩ5v Ei"qeCx!;0@'`҅EI2823pBIӊѠ%onn>`pӿQAz-<=dydYB1P*04|e3-N<fb G1XgᨏXnh>P-14 64}4w=;U:AƏ8lcw,g:5IּLJ"0s6w 3ͶOTxANk7Lk"˞{~LKru$}m9>ypK@%GIA1j:nKi`SKYEaws T .ԥ(j=ip]jTRRe8 DtQ1yjqut] |:RO;#B2cы+x܁R'#OTB!Acu;| pRKE=6mBQn7:7ԋE1T Dg6]wD.V{ȍ&7C]_ղ(h'&x{^ʹvxntcjSoRhNgtWp_Թ-0~($=$,=>Zlt(CY>nzF MڋUN^"NAN<,ǿPFg_lm|;8Q5ͮqTO\*Q~)Ixinܠ2l421XrRo)Їt6p<5 ܨ2M{UV 8a#z^95!5PQS /+]d>wP>wĪ_FF/d'5oaȚs4Rz6LX7'DJԤ<"eI{h*IݘUbbȵʝZPr%bpUX0qƫaJ:6"br}`-b}$v>AK's+kCLp`>%exvǣod 5/"?\F",m4ԣ^B :|ۮnmh^( RD.,Ei7@ Ww^׆? .H,1k{"h`_Sgh` 1T`ts5 o̵8̖vH8 nfGl ܕdDmP[D:21P6C@O:d)v͛?;ɇ<8$n` p)-{Wкac(! EB hφkKG%yt_)-zzbVp\z: 1eB/g:,d=yVWĔGƒB>3>pp 4( 67*M> xѶhﱇ[ G^}`EYUYVZrһ|,2/Q~Dwl/e?ڥTMh5>7(,GIYs#t1eQj r|J/:B&7eb!Su0̥KY`.qܶ^` ݰڱDŵ^ vOPRHoCLM1g6!R$b?oGu䉶(/:9|ʏpV-@M5]hؒ&ւ}lRC2Îc+ rFc 7&٭GE;b~`}o֭~~Շ/$Gs:-@ܚ4Y_7phL}ܑLCs*| eu[ϮvสUхiMt`p z :AE*7țjk,gRkvPޏg;R~VlתS[;A6I Re0!硱go@oa3Zi 0UaAyAb}mp^+b 4lbEwߙ;;j: ٝn[q;2őNaW fPLLTU9p H5a <[n,y ߈l*^c)n9 Dpİ2YE|@`Gm_Wb,>stq#* l|C+e- ͖';<`4eflei Yф L#t-tK8+T.==[* - Em GGuPvZZI8]}%փK{xǭ4pMT!}XbE-3rg'RRd/B&9hxRIZa7Y Ndn[z˱ؐK2uøNSK:o9u&jLT&6:nFkm zyJR"i>E H]T 8Xr7WZڥJ%sA?/k_< c{fLZW) !Fbgf Zra^W"}PtzP~ԟlBd4j$N_(|^L=:FQG<Õg<\P.}!:WnΊnQcB$H} rؚzqQs>e'0}+%{ #۞Wc7P/$k^U84:dNcgw7rG>Š1m:AmsڦGU?8PÞaw k@fS7HC8@d/ *n U}<ծMx>n&:Q\.Ml0y"%dLyj70G1;n*7(kp~e I֡#WUi./Q}b( NٲJ4bGqbyuaNēQwYF.Y_/Q/o.#04% ],Ӎ.`^y˾w{*D]$GAE>pD.Xpsa*O=u&^ ,l4-DĔ <nhͧX9nQ[KR(0縭>Ptt* qk0 yk5WoktV`{n kfì @k\}Sn*"{픊2yyEu=ҎQt5ӊvC~DwHcs~w#91܆8'DK&Ip. 1T3)RlG/IѤNVg?Nxsc[WHjq=&e0,y=\pga(&~uIķ(ʮkSN|(+enrO 9ei뢇G,sb7w 䨂9HMUmrm::Onk>fs%7:ŖKt檢#=| )%/?gF2(UWH-cc> 22ZGl;x0ػ5rrK23"Ot xk49P9G$1JGoHƽ6~G;刮*'2cPy#ܖSP&SBh ^3}`Ht> šyj+@VߤQį;)d+tg-њS8"Y=㹅Ed?A09$"1v7th!a fzi'+ /]°( "C& !ܰoKtة{=y!6I&0X бW Hk:~nhq1@?̘ MN կ*dWg8^]pK:~L㴖E Y_̪n8u$MK "+$26LFYi@?'<*i!&_Iz_rw5UX=% Z:q2$pmoYL2 f"s771$b}\ *EPrK'V +qu{ и8YGhw'V ٻmӳٳZcXN+¸sX6ͷ\Jn>{&;Fr h6U@rܩ)d-u:g'b3U XK.ht~A|w3H,k超.{9gE6HS)J#?u݃j BF{Wvd $nler "+kb!$ڦrgfdKJkd~#S.oW lӱQ?Q֥R-kXBgMPWQ 8_MQ3!j!='V *l&5qэ _hReB(N;- CdfS^'G3Vه r|Z|}"a69ܹ v pkfF{~n D׈ě:Q˰ʇ>%Xpaw۳C@:_ޡX2HÎY!IꧽM,#ֲ}gm$,~Q7('}8gOpD?bfa_CSNd4hNQ!+/,VIAŭ˷Z EsEA>@j#26{d%ր"r7s9S`'~ɚ9P\ܽ屑b'2NU:W>܆o0O3oTØ%iKS]v|P5A~ > `s B+n^نЌFNvSDMPz߉B8deD9476.?ѴTwܳ>}'$r?lR-h\%.& ԓ6] Y ;5s  n > \zJ)^K^-tGDN[oaNSN `Y)֍2Vёe7}<ɄfwPRs= o|GjhdTfh-nl3?~ XWY~p%s qn{8/q\jӟMMH|@ZKH_ivAy$4 {Vwl 7}6My$$AYStPn֎B{: gYtJv+"r7/JGJ崻`|ѠrbIjFFhJѪ.Q]bwux]8:i)ʾCF KԸ6#9F2n<HAx3~JS>Vt9GAO˙ -t/%U*ro|uN9PsکkoKMy$cؔCxzs!imjl=MΈSZ=4<!q?o9Ƈf(r8yd~U՗ËK,Zo:4b k5t'bw*:~-p:Vd ʫ:#vD- ow8 pf)Q6YM%,`Z4,1phE o>U):L(<҂#{g"Fo]T)GqpʇS9uHXؽ^x7 -15‚Ӥ:zᗥeL4┆-+ٝn M|*WkOh:J91&BD 6UzIWB̐N6"H7.M ÀeHx9O 0O$$%E'$aN!jxgշY[9 ,[=ɖ^XؚHJMߌPU蒨q(m;7kV4,Kc qp1p (/;cYW& ރvoX #!.56czg<]JJKD 0ZϨM۔)ʴ6^AWI? i5,',υ6-mMdd(6A?O&tvjF:&w8lxO\[q? hXsjO3/)+.XZXoR#?^)Fh2хN*@~Kr[ Ab!Oq>y`¯Enu6/ !TtM L^Ԩϑ5oԢGz#xpd_M=0xOdOgߏnn5&F'*ZP]?#o"*{Qw < $]ϋ<g11YJ4U#iYr"F'!.P y Q/JVy "eaôY <D,/0 aل wK0IrLA:=7@l?8>Ɓ9WՏr}7:rctχ]eChnt2ĸ("ذ fs j%0;?kc䔏;sv qc@;v~{Ǐ/n:Cf4 X3F\Z)Jr$:;K +307]|מhlp%=Q'X92)Hy _^^b.$[>)Bǝ5 .Kιz.ـ @JQ5/[Vj4R~Wʙ 7`~&6DRID0ɻфfJ>.odv|Ik"kj IݓHI[m[*sqaiN+3'mC nyQgU_LztLr>Yˆ-C{f< +;W❘wd!S >& zZU,x߰7崎}~yi+G,o~/(;c䥵:iK촼T`oi1S=j;<ë-tݯ:GτlLfy`B7NLӀg`Az~dYW&[bV?},"zI~RVI|p(-P;I6r `03 !ödܭM9"EdǛngKzlYSţ ;.[aD-ͺ+]G^lx0*}}J^IWk~WXm~tE " pJ},HH ԟpw$LIݪEyaIWتn4/2[TTH tS\/:͔v/F7n2Zg_{dB':$bGgL:Uf3D%6z$z a8&W'#! es).Eo4o[5q bSb̸A{Ȣq׸j|Á05oS`Xj=mx1 0Nh>oY+yQ7P^xyK@!Rk 4b EY f:C&s;u;7t1dQwrܧ'/jJ6;슽t!/h6']mx¶%weZ8U~9Y)TY't;/”cfX'͹ZHxhfeuaG>s10Ssy:ck^)ə!1Sz_j$iE$x:_fu0CuV\ӗԡLyo%zmjhקUSiI+<#nƑVK1ڀNSX7'C W8x5I8;(myeȷw$3Nz*yqmI Y h˂EZoiWAɠj!.:p w'Xڴ[gd;E۲]455ج>cR;苯hK/gc!k P3!݊k ztaHwŝf+ƾ^( z\h- 9UCy+ ߖRDh0j8k?Аd<>4`W5? G+w6'¯}m#aύ)lyt"8->]@$y_iy6 dy k±.@K c(PC\Љ6>S\baNʬ74A#e`uCGg^+'=9!dP&P9 :JvL/q#1[JLi0Aov j` m%Zz" *Q-#RRczsX[ k3 JZ.>Ū\_?CUe @ U%^] )Um-+kVZ @ #}`(4in궺Kw󟡏uQctH!W'ۇi9V銞9$;Zl7#|w}tpvaLuGE$fXp&%.8!m^i /1oVG6Ԕ5 #ɯUƏ^i=3;kc:N#ɓߊ sEN M L)EV;ܢſ.ĿU7>2Vz\2GFÀ;iȧSz\Jo?lh?a?fN@{jv#$U0h5o=c}|X! 7䕚aZ:^є8{7Dn!.cݘRvz\4PĐ@80oȽ瑋~Q:C mh[>Ԋzm0ulV>li>:biSDߞ>!5y"TbSqU2o70wT<ܔR`DjbF\&m52@0 xL>S1a|bڔl@qMxiz6^4|#PFѦgFo20w-6a[Si& 0ΞKʙ[> 5x8r|ޝK\T{E~9U&n@-*㧈|! p;4ف/5./c(}?EMte͈F7\Efiχm?8i-q{ k,JKi>t(R_;**gIamQ]PM@ؖB$EEQPO9U2 g#3xI|=f7?sMJ-5Q@91&A BиR'w<^伺FnlL@T8U!lWULB2(.Bß:dٗ- >`r5>7)1cN.+ʔd|i]4K'qF5vcHT6˔ G|c5 Q7bPC0k*/W>S$XVvG# v(G^Zwc]uoR R9ZszcZu_o8 Cg7hh 4+.[Xe,SQ#<$E w( meE`RKjm[yޡJ"_K?J@AuYh hϼ|J0񥫗% L WF'xu,=*ϴ pҹR9SlWh KYOTvb{-`/ U *UUtTחwx-@DJ6Ļ>Rt6|+곬ad"'u f u^;0uW1V⏐m>"u:_i _pϗ}`ynKZ/~m1_YzvQu'J%aun8 <a_WDSw 6o漩/ V5W̿oS$]:}Dz}#MUĤ}cہ?NYeZYz6a#Q@Kyl|LܞF~-C@S!C!C0( :ߓ:?ɛ4xxa̜z) tE,XR3>Y*rvjkd+J 2ȭuL a3-z#WLGK8sQm? _C%f OfܶKlo&UV>7%v"4 ^u@IMw^i.ZB@iۘy &e !#[5Fs En85](h;P˅.$SLoVWT wlIDa5bYG!.L ؼ^,#ľ=|ly@}V-wu[-HAttAK3ٖd8!+sH lͩ z`3[4 .;0AXIYw#g/6>Ka8=pJ_hN>}0j (EZZ& i} ,ζL,BJ4^"{x}qs-R.rHԯYNl\t4%I (3NPvGk{XGF]Ѡȕ':å:3ZY2#`5%SaB@lGVKfAQTj@36[q2 FLD#aK*xz,VA0@c J%~&,j2S2BhҶb'^)2ݪJ;W0FjRƪOqCʋi,B+mn0~2Ǜ{բ2uVYrzIpN㓰sk 6bU,\ni5ZlI]W ™} [{ ,2t|f|ZHRIm:_h[׌.K@l@'ao ~]AQL‰+'o'TjWS-}"0績u~1DU,`Vhξfju8aҀ DF|kMրi{ ~ِ0"KY]iE6B/ >6^[dr!͛Ϊ:?}GZWd ~Ek50lc9 c2ڄJ>~} 8/Zh*l>0l̿Z D)YEVO[jӲڤwN-n-γV$H hZaF:Ynk~`}7`y1渇Ϡ6ŽGttOlֶ- ^WX:zI=[K GeQHn:rd<&i~tF ċXĩbyzŒn (,.lAetJTZ8 e׼㼉 e”aԢ3"l`QPݍKm`Nvъk{HdP8lۥ2ճ껁r_^1Bt^;e;_R=~5,m.}^:e-쇤jD/'3yDڎs8)?!kg ,ŦS7x"t2ĆO8Fo`Zb iʒƦYzr+uZjtm$J)T6 -sn5${A]>I5o+"ʉ٬HSg~TD6떠z&* Vkux;\KqcK $7TF=2Bck[zODJwa ӕqfRV.b}q>NpwWX9D Es,+kU}(Вb;w0D+0̪DZYJ}FRchB`Th6C_qA#)VhU>7\(BZZr(E̖K^{jxCtrT 91F2BEPL"ZNιȔEN7*;˘S: N-2hEpb$,I5UKlKM㥈] UHJw$wYi4-3L>٩[)S.8jh CǤ YERŴMEaS$bŝc BC( E\nOTnٹ 5U dxyէRm^ tpD,wlh/ggwUD a+s S@ k57tW_jCa"h 'Uxx "́?V3cq.T/q3P08YW_k]í~K_ԋ|dژ֪賾jJa DW]V@#<}EHJ>oO? ).dҎ.T%wF@^Kn*4}r,${c4[NRQ޵wIR.`JL Io"FFtHbmF"9,+#Ja": n%Ѿ&DkzTS] }W HD$wwQpq*&*x[6hCV: $ӎ;8߰Dܭ*œcp! S&̨II`ͮ~Oz|%z^t%vey W4DD $l7~wE8gvB#J\ ӷ)d,զ"GA[:}X#i6 <0C<!/AI&S 3pޅyPa@3+9ޭ }J~ ~^Q~_\b8|TӈNs,*i <no!0{ۙN4?#^q\ 1xVdd@Z$gkM$btz[2|ք 7_8%f{2'X4+dWcBCL#XY[F‘|uXc6UD׎u;.bId_B@s{;z*({g"wCꊊXu}HJڬԴEga?[|IhFqĽX0]P)wSx|RI` |)E즦NgL!gS9ɨزO#mN5zeX&Dϓ@bYǽ0#:]^Xxo4h_.An-DY\w: B}gt22`n|%BMÔn+?Hv@S`MGPxvFe!^>ym(!WPA<#|btUcG g.vΡfE&д  }{E,MSҹ:hkəyy =HԅWXV`wUY_,'UyYxLWHdԏ9f4,z, չY/4Ǖvr뀨Ijʨ1TIvcp[H Cy7+OlEW+ZSw٭,ȟN685\G.uWm[{jHKqɱefS9*?|wgw"wPo?^i%AE>(-$T xLwVKMb\4D-](+vKX螞e {J7`:x @}J+`>pv-PIxD,963ruán 1,S H++h<*qi 3Pcѳ"Ay'vkA.?{)i@a^}=va,zqv*w=Yۮ*Vϴ~v7@b*E?"e4ⅿh0| 4 ؑ0X_L{J/b0bi`R KI0PToqw{sNU< - zR+iqPH|!FaTF¼)Vb-u%bҹk7rj 9·G8߭>H 'UA: ff90=`1^lBW6~h MƠY2xklq^}ԃ*3r_3˧{!צSiA4?;G"x8 aGU\$n)dQէ*VK8{z',ɔ-SeZYULʸ mȸZ1iu$L74Z|9?\h{ EEd~zȭ} #| yC)fOyo皫WfH!\sSH Aɖ_̝`% #rX 64tTRl?Bi x*y# u * $QETa5BMJeep4八 nCpО nĈ]JM3L [n6RMj1 vm︡]k5EZ1{y8w>5i#Uq=/9x'Љu 3asu09B7Dj2!ke1NyBT#ߢu%^)8'K{QA2EQdF<'#"J5Hz-~XK6m7]Dl('x;НhѮB|м<`4H2ԆC;䋋}r;\Fۨǹ3yx?ލYTD.gu¤(B_ `N-- ?$D:u\Xt "HGLn+f-_>ܩ~M 43]\YTP H  rz1څNE49 Α\:)f`[G͈gLR{)4̶NLyoI?-/&m Lj_D3*$=@,tKȽy:(:\BsjM@ԻC,{˼ όB2n(RqgU\r A_;4tmj(ȵPʥ}ϷxE UϴZSf7tzb;:iKj?xAtTu;yKjvtc(<9wz'q"}45g[48uqDLIS q "ST>Rc7= ߲C5'a4c,ML? /[i67W(a[T)3$>)>,b "3\Tk_B7x=y5D$ik x-u&>T7`s‹OA i2;I ^_G"5,yh [,v82y]wst=)!Buz &-&ENY3a|Bfdq.-adw ë5RP L.;Zxps7+}Q44Ƞs4:&@uIHgqd^62qrb s[3R IN(+Lr` N$1[;"n54#h3Dv0O62aw0L۷Mge+@ h.lTI<\q %j9f딸oX<ú]f$ϩ:ꗆ/ э`x2Ά"2)ν参?n!03Ň+9v<ʊc!JGjXޙפKb`Zb$GQ6{jOuw󋗌oSQKT k-&ߢOA. %[:m~lْЫIǰA?]s OnQ9lT\(Ͽ /jO\[69'A^:Y6p[a"]BY5;Jd;tYl,o1_,>EDN:)Qq]$h 4z=c2 \h:XmO)^0^%En媀;hyܷ-R# ݂O}(ܳ{f!=u[m+F??3̖?ޅ[h&:j7j ɤU4CEв5@Th(yӽTF™ğ='xCUݿ4֟XR؍;(0z0 V/`m]eY}eE&&ȶ ,%a~Ԩc?Jð@Ao)4S6ii>OU7Κ78Q"R'GT0aİ 5{hGKt*܍磊$3JRrVZIBJ6z_wԾf޺{!n<~۔[#X rhe\uA6w+ܭ+gM? kT=鞺Na-LEVzip2~ ߴpN} Ruȵ`3EFO$2CAvŧ"sR e&bZ{-(zސAmTgK#O!3aQ de@iɪzKKHNJs0S "f t!W9ɉw1Z^_o4Gv`WW>#APig1db_I/ x //a1#?-d~+T{lBf5Q4bO@qQ AB.{B\|U- 'Ώ[۸ ?z[Ҭ;eh܄fc$PH^u.=<;|pO \b_x1Mz{Rx;LOAWyzT|+nb3,TU}[\&XPJދfƚ IQNcot#F;H'q]|_9: [1A2Dlׂ|8A$[茊;!,*DIl&`y%6PvJ٥.jp&}iuŁ\=(f*OvTm1=zü;IjpѓMوd#EC*1g /Nnr %In7c6P-+"ri+ #Td5~= "/m{c5z;BU|9&]ԭU^w7#F9?uEU-FNc蛇`!AɮLv+Tjyn$S3;%_>Ebҋ߲!͍WFQDȽ gSK; 9*!nH#bL_oVW-Y$4zE/z8 djGb ~ZV+0j[47a #])˭lՖy7,9{^JI`9s h@Ns1d4Dny&cɾtYkە?l/eTk_[CG8: aq_a.kc#JA)onOw;V Wp'( &Ng=|9 oV W~';}S#N'=@OkYJ=/Ji@E<[mp*|z\ Aiܘ(aZp(r23! ƭfܸ^׵P aETu $%p$$w˰zG8\Mb`0 BU Pr_-(Nֽ*58,ܝDr4׼k\2Ϲ6D bE\1C.F )8XC=+Q;e&ts4wup_>A4ؙArĻFř뮗/0aFBt*}cS lr"}k0=1T9ԍ致I/Nٱ}*0*~()6ygk URq{~@uM3 T!0y1EQL&z$) JWm+&q%av2PưAM8YvjYem;Mjoxe=7ݿgX[xFJ/v/8(_tmS9Pc*^'V} j[jG~Pe2t8]ǥ,DM("ϼr+\f YD$])!wmV;$ڎkWJGJEZ=9)7 mK8 h@*fl?JVį;=Ӹ.5bĝqYSQq mX\ѴH'i;Oէ5:Yq˜BؿhOȧBVyoI]v){U 2̊O^Ѡ$'+ҏlXb,a@xE,N](qp4w,,؈Y VNې%AG1lʣA+/p8ʎs$)VJ,Z;hzvP3zm7iZ蒤){YHh&'lXիlqc骑S=~0W6S!WmGgzem3qnמK=1=)7:Ǖ"ua~*7Z,4ؗXȏBJH6A@c}kboZ_şWw|+ɴu脍!.*6@ȼR%rUSe ;3c:_"1&~}h`:(s? !Ţ{UW0qV8fUr0&}(֣c91Pl- A88U8˿;gM:Ea-i{75P>ֽ_%ZwuϢkw=5:=0N%BR >=[Wºśs]xr7zNx_U@L&ŋ*ߚtLcFvz[vjp)[]T'7h3I6ʏ|c+V! .7?Y'[f,BIBfblo#yt\EZh'q/t%HBaU1e(9=Kj"#\vs ^ ԬP[Pe&9L<nv5 ]xy*jQPbeNl 7jxgLת ѐjhz.*-"ELZY~>w}v.'O.Hl8 ADfWD|!9PU!IO*)ѠHUSĬj^ɸړ ǃ D=pqĕkn: t#"#4H^mD1ugYR _K -jbJNh2.R>J}q󳻛Ӄ;@7!8n.'Ԋ@?t?:A/h܋۪寂k4Ǭ9ѱb9Zb?27{Ŷػ0|.^pi[1'pGYVZxZn2| : sL޷g._ Eҹߎ0Eɮ9G ATׇ y22z rѓ}er{juBTJ1fSٹ)֭fߌwP9Z5 od%K}KKv\guߡ.027嚆{G+zXn:oLsD]S&|*|bq^ 7q`ja=&ޑdRj)3_(lk_(ټm1ҌŞN_ޭf98лfdu0ym۔^;SR34[8#$ֶ/LN`CNlB$.aF3Gx}dZ;R)tz["R)AZ>\Pm:0x!jr)XOͳPbDO̓U%PKGHXyfuæW^n~ 7\j)'|OyUm#UD]8O/ٯb ۨMaP4PTl*-0x ] mF/+G7'0_ w Ni ^nL^؃䔺9> ݧyzJ0JMЭ *8L}hR*:8HiI$)|)=_@ܢwcqp0SjP|wm$d|-?5g:Jz<;K?5:ӻRcL[Λ* 7|{$ I8jFS,IǮ I'o#j4\m'`\nZ,6j#ctvM:cM$ϥO+܏Y~\' ͼ] nLwJ?|/liFbvIQ@x@p[8mo?mےPWwAB wv@@c'X8)HMm"~hԮ !/h~c#h:tGk30;蓆;a Ӫ JR~*e 3/deGӫ3N͎FS[xtʋ~NJ?YVC:M.1:wuȶ'1\`fS?5z[!;2Au3|Vg6Pup#bPCQ79:C{|#P*a/Eu9vg.LX tDIJ.ǏI1ecѹ[P&![ҭ!"^m┏uoN5LOҷ! |{>M gnSJю3v!1k1KOOׁMԪ\F.=~Uڃ~L(+btC-؞NJ&.wPL+cc"*4El, ٽOUQꬌ,0t MnjӐ.= &{迾H eNe3ryBΪ@J~MwVaxZUF$l>Խ~@K`ѷ֙a@ W ]Q V(*$P=BiHuL=Ӊ~LwфVĤɵ0qrrE<6A!N,"\33[Vzu"&L#ݲ)lQCp0\M-FJ祎5"d&۠iF~ARUBX2B<, :єR.B@uxebCG{boQPUۨ3R.@vj@O^{a ċal\2\jf D5y1֝KSE?ً (l]#*c( n h6 j6%?{n~N,=4\O$ )Xvk8crG{9fҰr;;YQt9l?nA q/;U\N_۾ibv%^+MK~#VpŲZ/]g,Sj!ֲ`cBrJ^PbMWL\_K* R#㿊Q8GhG?^RS7^d!j^KPmIJmJv⦯7N=En"Y dP՟Zc2dѧe*~JHc?_w{#0ҲŶ!o(hD*anƀ)Z*/Lv^`GT )cI$SF:V ^8Uq+e ! eykl2Eņ+*}}hC/6v"klK]FKW퓰J/Adi"}<!\z K_9iCJfZ%c% ~lz]A%ȖV5wRTO$ =K\4c&O+5:MTr,^Gx9<5j60]ϗ3TVIe[Lisb%c!ৈǝwrhBB=L´+xsHF*IQx*D El w)+<@3v;1&O[_SکxqNPiik P91DNBa(yqp 4ΗoC|eCK([tXEH5. '}ݨOX/Q+(UDH$]lY|a̹,_=[7Nnz|6ڠñ( r Y_$HMlSX7vw>bkCҽ!zX'2-/bX( 3i@N`ʩ=2JJx'> KO r+Zߴ$-DQ" L[V6nf tC_?Q:QS$EHT=`!Yb]NW6d#HB-0rCP d:}ihoHZԷ1;^ޮc7|6.@jm{YA.3p3 U 5Riγ\EoD =Hi@ްS{ πlVV%{.fh_UW_3e{S㤡 DDNL+Vd2kUso@ocbw8A|NRhYT.E1R*e +XD\ǒHz{y*橂}jH\ XN3cK FcF-$ fctXQF8e^Ls饔癙&4f>ÃPL  zH}Rrvms/Zxjz壄M z{9YRNH}CG_'tK !ѧsQN\{W R2"*,f}YZ !4Q?rK27;|g_T~QB_۠NN비;EPTsH0bx/66E1,s;)Ȭkd*d= -M-WTD *cA=FW󹙙Ocn,BC{H-ĥSH\3%AM/3Cak'H.>#TI x< <{MI4cI~Yr樟ԝ8Y~E0 RO0 SwH!;Z?j] S8q]Vl|RTG>Ͼ|B%31Qt6GF'+Í>}HkNo$;)K)v2ݽ ,(C%^-#h@M*59zazo-s^up%C,ƈy*[zȟ^ Pu&)I; =oN!{n/J./R8eǡyӆ,>T7Weo.}QMf-3w Mf^I]%s V-\riw@#Z{- LtM${q]Y !&,WG ynna^#v(4pu?vqvZ: 26>$r$7iYYY>;DRNN.X^݊ B6/nB\z0,_fo킱@IhwjMQEd7윳F+VsJOኄ,aX%(\[Zx֤5ڽzP=,/(:4ZHINA-,y5kĻ`" q;neI&~AQfbBmsECc2z=p< AY9oI!1WH=K0^r' ႬόGWJNuM$lIytS1, YB'>zDW.Y3ҫ"!s5-xQ:h1`C@ ;#|0aM* _ޱ0aLy<#Y} u?:XeRPFk~xkcΞNR{IM t,6\R+Z형e^;t~HVg) @Oل;5mY1T 7xK P;ȍQ7*q]k㔢 Qfi&iH}ɍۆVN-{祀} N},x/T'"9Eww.M =E[HME*.棶VmsoPy#*C:礆FB=/%C Nd@#"Ex?YXKDB+YTAR%! >s)p «Ҽ_qHր$f&gK].&@qp1~H1^4\#3WXˤ֓?F`}n@HE@uZs SBSmV̺x=k )9VG>_?UFkuls]~4婨d@#5M?W17P܄`߳\lfk bN׽#=%L;F~IA%2S94icxs]-OxW@Gw%bLMm::lvx{ߪK; =xNn9[bvjȵq%{^bڄܦAr ?YG Rr;SH%Sh7gWꋦzIj%VB QYɗ0O68֍U'֧!e$%Z5JQFC6Y&R܃B?̏әX6-5 a*<ħon/g}=aB?_J<Q}H͡_-!\/g|kHykcIrAvN05o+C}0RQCTb*L0n\O!ZBqa'vBTmH Uo8hm˃ҕ SŶ-<,{T Xf UK0D +MVa"U*2V.2Mʖvk.$Z|Lǃ6^)\=&l[V Hm~]2y࢞zXY&5Õ|y1~MЎwrB"8[ģ1I=2 r,G/g gإꪢ=ggyUEьw(lHԌi/ f(/APʚon1<'--Z%qKlGIeep37~xVQ yA&N;+ @Za?dnX!daBtW$3oB,q)i-:uT̩*jI_wuLZnXl9Re3yIb-7w`0g^f/4 /bogujAT gL@Aއx^cŢSw_EZqga0:B4STDB|`_b]%@pY)AIAhL$\r\FU}V4qOڹkaӱ[ƒ$.i&0utM좸*w]pPsd_L^(EEw{Qٙ0{\+ Wȥ0ih#ւ ֏LC~^nFۑ,}vGr7Dž/7EAXPu<{ټ̏*E+OŸ#(qrQx*dۚp%CeXx&7w_|US S)RoZ)K-l͋CES- X{0NQ>dCd5Xfضo 0d ?HMJ&qeX꺹{0)$D13Eγ&PE1:,6}ǯGu]xTwA)+xŒO[&=ra~R= {5),94D9QAiY70P(ػiD]Emw.ԭg8n> ,Qݍ`7<Qt26=lTGgD,"G~Y(nxgA,lk)NTj:㤻x$6$7O&^@}ܡ"Fu^QϯY f毭Hʦ #߲*M$D{};BɘJ2ҭS 08&E>끜KNh2Fg%:V 2fcf*;&J!Z 7S;on# Z2`zٍ n -Cjx:F].Q!:F %3 aqSRI=5{$4QH;,X2K$$B(yN8z\z+ގ|/w'7҉OZ8jò/:Α|H2BQyɧB<|Vאx$"^;HWbrwcE8}zSn^b|8mTae\ zԜbXAˍQ\x]Zg [4.X'oǬE[H 5'dYX̵Ep\T Q՝qsa218CmsKx޶pƤX9(Q|mcK읶v'ai9F&OoU&b3> (iF-t 0FЙ$$\4ByKԋXalq;'R.ljTo}3Mz ,?)iXY8cqLir{΄ewrBf"MgU4.QL]߱@~ LѠ ꔧ%} "T퍩U$nRhjztsk|腚:d7[4e1ʇ~Y9\\%T7wvppӳpU*7rGT:⁙X$Rxtu_P m}Yzfٖ ,_%ňyixL^ń8WYDrFJuSOùh/ܮS S0ڏ35O:N9:gT?ηUl=c*n1'04(~P`R 4|\j~F'|58/G +Jqӯ1fOp2ΉzhJ0abkS:K _('!ᚈƖ@2Mܣ sӤ:E; 47׬Mfߵ#PSnShV^.;fh s4v-׆((~7sV enZ72˩8tXP#:﹈U^p3o!nŶY]UFЗv9fddž詏_UKÿa3T7)erXBx[+;\o\K ,OO<s#.{2J*A2f  1Q[[qVi _Y3J :壙Q7irW/ZJ64]Ƒ@3W uSP}Ǥ$!w@H!R[عPi hbKK)WZf6SIԖnšI]2uPtak/Ry=kq2k`K20lwuBek7/_CFnk垖m>@(U<4qF+TfW*Yܺ r/CԶk$|rpa} fu%^]Rt|aEQv t>+eNKӫ!fcfcw"B;1+TB,$(G2H|nl_Ww/d[aRϓ, *t(-RErqLIBODnD,LJ7${w<8z^|.'z:q($4atp5 {K$ u/fa r!Sv/9 )#=*qǰP`7yBdE֬ei0'(4َ#\!õ( h?LĿyh6q| `8i>ylVZ50*y-ĞOKK't |Rml 0 v^)>g,+K-} ÷?8 B}D wx,~1R g4f- t՗L!B {Ԡƴq4lipxf"S[GmW^_ШJΘT 6pq} 0#Cq퍏PJ;OXܔQ1M]6o?! '#(5T)[+].=PX8P9\O޸J aCb /r@7n.`ͺ`_?;hcWEDvO,>a\+ q 1NJZǭ CrGaNN?K';xLAmfp^CHG)U}J)`W3+l?V~f 6"La,ŷ/]ΚwEV`p Id,SA 2drD0\̆LpBr(l+[ٱ,F@J?,`'k% +,X ZLʼ"e]*U9#ĭ,Z{T6% QmS>4ד5#x%ηU/L2`74zw˟,W_q*Z0yq$Lt hlWȵHє2s"뜊h,mYGj p JhK%Cjȩ+'Śs'`Wjs+A0Xq*,hƖ$ IZͨ;W^jYz{I `G3@Icz5Vƕp  />agtTFeC`g-pK䒁.Ek\>,z@#?-|%CֳzkY'ќk#̑E 5OMA #1|r "&g pA- lER$՟"|h)BYV{ܾ$ Vъɞ+xTG4ir2Xt |HJf~ 7/tYFd4>#YXx: O1eQXiae-B#'E:UJMKM9$*>[+ g6eC Kc6ev0qE@Sito^jv̹́},2#k)uGu/`a7M^㈚|N"kC46f~Foi[Jex e2%!`J-YF^(족!%m#ab.|4 =EDGfH'>ү)%wD/Ha Um* no#P\wKyL® &sTqHQT]+ QWO#D3TuK$ :aA2miC)er!響i{kGG'D(J'(&: Lҧ'|`/䆴 r*}SgMx q d5B)R tA-H+5%uvI! 5:8 {6y="z"rUOQ~¶ӓ6# U9Ta1WbǶ-m|F`8҈u1]5!bedIԗ"Ӄx'(Ș cՙY,2J0W!ymMf*ꛇX%~Q5Befͺ&, H(*ۆ%M`7mNV oӁ.N eہAg@B:+MU3Fp*5@]^:J|2- OYqCR#VVfX~0o5 %m3Bu-~-BX(u^K{وfl;ɂrۨ9 Zf>D\)%O&M5I2kJ.:VO]TkB|ǭJyXXǟ _(ru#puLUEU!qm?MrFG0 lB.P~8nd^:]|6@2l: FdO|#\zL݈K[w& ع~Y&Ĝ*i9]47MSWV¢R^Ϗ:n*pt0 j[+d6l|aY:wnc.\hE/!)>xRf0΄yfվLi>00\5?n["q v1{Tn셽s4G~J5nyۓ71j?r_r.)6o[)-,ߔ,agE9</:Ora8/ ޖbc+By1$?/DEDa|^偏D^] `\V0h]j5ל 7ZpbC ;-[8ƀ8cV̓ x"o^I;/bBNqNƣ_ȅjPEeI H>yhMmL/-!q_ऱ3P6oC/`'#jqSBA*K ,M}h<7ƣfbMe`% ˽86i}?;A8)r/Q o_%+ ±Aɔn_+O"?c0W\l~cg(6nwkm.DBH`{Đ#e(P: Y؎/h|7qDxDg'9du"7lS;t7NDZEbisέ/\"We=Ŵ\]UR Tn.۶xPQ9{Ќ*itiLui\KBѨk@|}UPxrj$J՝"ֹpvuLz[*b"'/罫wXN6I%ӵ+q5JX Q_~Vz}3~G*v] ~(?kqˡu]~"_T1E3&I! Tɬ<=xO_]X7eI4>p.$̜RBut)fjD^Sd F > IPjLrGrL0b/KbV#y"\rYvv43 ̜ UňUYHH<G\#'B~i#2ܜo-N$KntCUN&AR$n{:-jd؂cq8"aɞCX7VyeKZ#t̲|]C^SBFâɼ1\=tٓ9`~ "ۄ&7k~Pc^(2A?˱|Tiڴ`H#e**/9!b̜K<{4V#6B6ta`#w>P$%BOӮ ,BV>睽鰬5׎4 URȁ= ^@i~C /xH;P:xVRۄ)fD*n1-,Ro9NFRk:D쪑&:d9;SBg"F[\:Az V'>;dc{i F.2qp}D}~`gk5w#_yc(_l]b Ql$-iUk{B,gpӀ@D.+EIK_@m$+ȯ??W74`GiWP-JW0$Nkmk5|j6eh>ҫ-i&1~bC0u3keޑ⧣xr۲ Ik @#SekV? -&wm[299-K9M6P7j1xRϺ{⡎s"e["([i\0Kn2.-*/5Y.  BSuD>$![B7gSmd|IUL{$Gee%ܱsiv|r*^8պ '12k:-} z]^/KLִ)˽x|vBY,2L,z>Xb$,|<3"6(([2f p=[B?EAw'FŻ4b־\SzN^9YћSܼ3R FNHځ%Ry{\{va^X8mԞO4x)9ő ~ǕJ҈ {&;esP]D?K65ilFͮaT0ba^'Ӛ^׼ > C$޸ DL(7b׀8 ))㽩B( ?Ӟ$Ӂa26}s\%&5ٙ%]~ ߓmd-zvP&=mlL#YZIbY,uy}fZZ)ZG:{j'ʭJڨKxGl 8ݕ a E:rx\U4b mxRIQ~`ihK>* .1T Q/FuvpæB4!!xˤr ㅯc姘A'>ee(w{)E2#D*(2-{isV1Tǭj{usû3E!OQ6VHvnrgnP4Y1EO"?TA|;$Q30!xgxYc~=ƖۍLTK*܆+z̒Ӯ'*e63o' Bh>1e[XS\LL-PbNm1a,?$?h H-' AO]p XX3_Q.1 u# NmrpBJypҮ@a)GcGn봨7/5<uD(oGCFɲߞ (=C!B6E/Z)n)##]! /jԚp|,Igl j%I53:~%}R|P1hO"S |f9"INI!57}<A\IaT Q|67Ϙ542r\i~[ct jT{eW ,wTTZ; ,kK$ =^RH񜼽紊Օ=URZAV5MrD2:X/w<7}ai/8Fy,Xo?(gkoRFnL:dS'_D*DMh `OY7nH鿽Z1O[rO_MS΂ Ms! 98%ddYPжDQ 'u(oC^􄣲 }2+jb{ufΘPu*U+:z$yIEl`w:[_8jugoi/R/С^d*gSF5O-g⛪gɌ,s`efW|ݓTէ0>w,*qxhԿb6בЖ#ڸ]}y>YA6Z"XG6C3&WzPN+R#H^%i&`O@w.[Շ1ngF\G[C4(44[1xqyF‡0j]6}ib{;Y> AQpksQ"e4rHlfoG-?@[>C];MzR8Ā^(%U>eVDO?l| +0;3wx1T2: HVDȏ )sNM`A AҽƇ3T縜Z =w D`lrewC|MPs; i򓂂G RV*Zgu<&L`Z-n4KSs8Ft(Sl?^!Y6+}o?TG׌ ڳB!+Sy_Hx"IWFLy GوٕZ) %aatȤY**CMxBS, y[(첸73&fv96*HSԂ 0Kgb\>dq5/50$xف`^~MQkZC u,U5ٞ⡑CY&'90Qa׈}at^[1-cq(-ԄזkE`гL 5p."mcЫ{I2&-5Yè&qG+f N18?ј}AXgߖO`(B7W15 7Gz\ѧ]{ze 1qzMez [q,We@#f&^W턟IkAx?̬YM;iN>Wd6!oơҡu>6GQN:7?Vwm!H. ǰat|Wh[,QV5~V~dsĝCjXex☀O-/MKʳ{# Lߧ1,Н\l[ mi1F޲e]8}F;ff)./x"#GMb qLJsC)k *BV ؿ-:*7p[UڤzHKOZf]^;QɜJ}/5yU'׃(⑩d+Su9ע4i(;?gCd`+, a$y{j#tZ;X#;fic:XzEEƟPN1C  3^n NV4:P{HO}>pʍ,x5 8K'T^i9͠j([RlٵX.Y 6Fe!d{lj@z'Ciƒ~tV_N0wZfՋt^,v qf$%$89gwGޙ*Q^$iv 6)#b`|N?JcΧM9R(2g1Yj˃j@O2VA T:;Nw}}V@GBIXGHfaUY;_fI/߱BOUKyѵt.S<>Sn!5!V+]gҕI4Q (U?RFچ;-`nҕ˕.~sNZkw6kKOxXQM*#zQPN뢗F:jȕF>?ri0D/$BRJ*$s-4G22X}[/Lmk C๠_ 7_ӆK_fFq;)[< m%L;'uʧNxSIy)*(aݰn*q=93L.7@V"wxͬ<:np^+ [T+QSL&}UiSft‡ڲ͒0ؚ8GKIJ' lO]s|›歙s5ϗ ?fcb:yOrQm֖ U\pqmqL 6un$2{j|!h6;@bqƏш"dkLIeG82ѦCڻj[=ȊL$iWlM|$ękT>ؘ>z=k'ЬU_/z0W1&iw~.%L,EfTTĺ. 9+ 7/'0Jliz{ad1ܨA'o]:#UIkHPDr NpPRQe916>H0POӛ.ola jܺ3ҲP INy3]X[`J [ RBAް1eDNDvJ,X(wviq03U> A_,^|֢0}0 SwtrAs@o@][y&"\ ";>"\Vۯk{W7~ [`&0R''_ c~E3c7BKal|u[l tBY$nS_D_/Pn3`8lKʚc$$2_vyanNj*ඤ*Y*Ǖ;=lH5L)l||"D`҈y9`\ &VKj͡00 C61=Wvzaܺu٨y,bߦ׭1(,d>vPgϸ-H ( \U%fIW̊BW/=(/HJp/ɥ5H9zxuѤq)EFnހTqc1};cxhqOG#UٯF5\ARu~`3rUN(ч#gɪc>' B de5K?D K AFE=ǦFi0ηxFDeA,O ݤJkE9Pc)hu'>@ّ|?,enuiar,O!'ƽa>]'o[ 6%R)?]-&ꇞi$2k<9m1p]3N ZL zU~G;P :Xn[aY~.wKBΑ7uD(}lM(oE~)FS&* I2`&k΍y˟m.zê֛8s:8e{X7+3ыVFu|jj.kOmGQAX{WGl`@ox?w_oA/{rz-ONЃ;`GCuś`BgMWŒ[K8I΄7RO}@_9+ŧa,\Y o]bz\3EV <2nDS,UC2z(+8(^4=3*O>=7:NK=i %CQ42a\}a>ˋI)1Wu{d@Qir`B0]Y?\"kq96X_$PqMUYgOj=?fKgFUjʇ`m+UrcDuyZ;d_Gڱ~`cT['oӂs*E!ɔ oP^|$a-.}h:h97q@ WjhPӊ"i(ZAկ}+kJgDq=:Bms gxS^= &GOz[ja {1٘)8 A3r⹹zv nurr cg&vlEҔvE& 3e3x@Ҽ(Bdi7q*h bYP>Bc\L|  G]lyR,PmcpB<.kU m|7F]㽻5j:@ [}mڌC@ftwޑ~*|FB)PEF뮓ed컣~E*pi}LJkKB>[J> e/@7uXI]nH'™Gkc1y%R o8gBa1-,4 u,߅xM/1H޼$plyAk㫔kwbԱG5E4R&tЮ^ A6_kvot[;q3W|nYn#6*VzhbȒFϠ Ay"C`%n.{KNy7H{ltm/4,BxV,ğLiއu{YԏNxc>12| $h_d`6%r208-_[U|ȨO$0U֝JOR.&C{-4¬'h:aFM OšQA!+n7PwGCcxKX_OJmhIH* +*T"?ӽ$fjFktz:ldNtY!yύōӕ j? 9,;1"HWG-UiJj]?kmt1H;Jd8$g)- Q&EԂa(%'>9Ε<"S,8Vߍ20*UWb/ydO 5 n6iV9=7 f*Sf`^r8UJ[vIY[Zh7;qY+/ۙ%b3=/q포ܠň 2EYfFa%WQe}WÄ0JTĄ]Zn 9 'jB_cOlٺ3ipDCH2P4] w!ķJa2ޡ)>R9џYTPzuSĦXa΢v#Rԝw]+/~ ((%5桞ƺ'1w+E6o =."V}Tmxb1:N1N+T튊 HsUPuRN҇*l3p@;ٕ|K;\`"9[FEJ3̽т@sJ#U:uhՁK"mέ I[[M$A8-n=ȕ9i&*4ROQ6ic@9.4⺥4~s1TFZ@j=̮UwwehN=l+3Ոn i:P1qC L"L)Rt.óWobzIj` cx_- MَK|M jT=C(2(^;Gt44ZD/\fEu{iN_{q$߃.1 n (՜ kߠd5&2 IV ֖g' 괤6OҎALPNM-7-NhXx=B̄!cW%/&Q:(F|G=OHe%rwlގeDJWk Kj=2҈h&2! vaE%2#Ȉ/0HYѸNStY[#h7H0aIyH `2oeA?9cKO.&ގ)'bb_ɐ,kJ(tccTjj.S ' 1_t_`AIwB4"9ݹ~yY1}p,,W؍/ !bjwlM+A5pϷfl7FzR6_"V<ƠfֿL?=AŨ'hfvDZ?ye1@$+lv  6^aGsW& OzHcrMMںbۚrGz+U_tN&Ss<.-/V4pwνpH WpXOh V(v8e`yF#Rj3oRĔu.6}]zz?R.bb\28aFD;z!|&7Jn?.pPY쌴8AcWJ)+F(Y+ʿ#꼵 =3 }ou&P%"sDs$ß[O"[F@ -*/d ArL VԢ/KhjTX-ǜw. G48ܬ(!^+h|G@Nv2"ZwR3^NjW<qs}rrTnjk;lpQ07SYSK#ԻiRN -һ>uq|3Qw:3>L/ҷ#O} M)** ӝE7:ZFW1 (fQ2nE@*e"|SfNg떹(FGLީPW5Ჱeԁ7O؍+^v$2ApL߂<씧#ğGg֘M@&lñttEs2U {6XB[ =r0pT|M-"l ޢ9u.8w;4Te^[wer0`@hY(G:\Nַ *?]9XTdy~/6L,u9c<,=j!b5 >'nOlWp-wRӫȨ$pwО ‘a!09- BАF_?xˢTޥ{]pEMyPPW2zd:0C9i:ZOl~(-`xl\&x3!o v7̧y"Ϝ~҄}zӇ}@1*q.) O3=,t76ϺdeWTX'WhZr~0kGx_X9}$y6{ӚLn{x71"z(z7cX0ZgAIAlLI6FgO}8AS "{NGs xbIʭ)\:nL{7˳5]WGumO1*hps`991&FáGD/3}Mˋj\ m1% ݵ]-]S[{ =ty4E0$hҕ9)@}M o٫3qyIF-@E@r;8%(.FLWosT-sU9'ȭԂ5qt hca* s0LR\$A&I Re0#?ԛ,'fڐ_M-x:谗e@xxJK^ h=({qK=?:\M) B5Rtz ?&hz-AYnk%ij@y\:JB+$6Md=Lur*kHAW1:B>zQsɦBnxǪZdTowR|6q_saC\>q$J*Bˆ?\>E.x+ OMn$ցry13tIˡlE{|kYbPq`zUY92ix23[Ŧ 8a_$) }U3ޤiOx<В]s2ސ[n}^=[21 S&XXL:ChV03Qlt 1^3iw}oۤ2]=DF=,xGԱ*?&u*V} ԥWB5u#xyb<R5qZSSu(ϓtf?_?tSUHipo?ȰkDKV~b=K5 ;GdC{avӐ~)j GM_ bXaX.Aȅ0Q\vBz%=>k#.iZ;Z"_z0^m H-ښDM2ةĺIQ4vHB]^_+G=.I`ArpW?>p",Q{A8J=qj(nL&gu<@~런 A|I 8dpd ]J,UA7F~<<eZ=xB?Pp.tQ|p4 (c/=\JE&3gٻ 9"{1Go)/Mgbŵpa۸C!Cu޷j1o Z8Y]##+rU֕xRSI.v%Y|}Sʓ~"YFE-Y2[!%(B=!{H^\D_rլt=Pne0ҿ)஧^w"ItOBQ BΧN{xt-?hn4=W꿧iR oDqC4̴>Wy=#*3dJ-L՝uSX;[@tj8:upj%%Lo->7o/qt0L~mW$󸱙rJb-w~I 2Kijf52P۟C/ʫ9ụ !B)\- % ȢH!sdϹmv20=4bXYGD=߅ĠwY'RƋ?b9"Õ.`nw!Mf$3`+9<06Xr'}ce˻@⹻Qɦ{Z8/OHUiM#~Zib 23*ʄ XZۄCmIun<0vHCjTu-G}x$X .] dnmOx1oL9L5 j 5߶^ 杛 1QJ#X"z.YWoh&G2F5.N' ӿ`4zoB+57_/<!@Z6߿M'@L+7hXzTj`p35@J 9z3F@?+BB?UJ(an-GjuAZ(z !f Ǧ2W! XVrǸ}"2J|-1ʅpƐZ'N%ӟw0|n( GDqG3o 6tw (O6FښR* A#D}u~ϧhp JNSDa;iD `AQrWQglSWly]J*+w L͡oL% S)b, dNd$WEN_z#]]pPO%$:Zk'uǛ ixxW|x?zzրܵ%ރ? v6 %͝ţg&= .UțrA_!rf E%QNd"h "|1G_'Ln~rWgb&2%D E31yFo|> tB $ᙍB.1t{փ`K=(Y>(x'~(KGOxFր~"C+mzٛ"vmnB\ɇώ$e Dzz黳W?.EUt2[َvf8 Sw]HW (LtD+;3;·KPpN w8/N$4ClBrA9Ѫ]q,ݵ69zMAov7d.'y߾e="!@X#GM#}h*T_ЇXܳ+ ̟YsH+g;R:/4tfvP(3[bOBH;8-x(bbW-"R~N߸hk&&='SH[׺;؃:6!7DWP?تc6g^Z΃޺`M;ʒḏt0-:x{>aDOO3薬_-Du,G;y r nZLLUb=zhovW"AJGtpY Dw{YbEؔ` c3ORqr9E(pt4Unג8Ҫ^!AcO qIy"u~FTS7aS1kx>~ݖ ƶ 0پYS\ϡDcg_&1, U/R=߃nn(Fd*mC:b^I?)%>jRAc6†.nIi8u5iX+_b dHŹZMvJ)2sjgK8!`K…3a㤯LFŅe N2j)gEv&SFBH6Ex$fm>P1JFi>czҘ< txF4:SߓX bJf $5 Y߿g6ssɢ#0l~T3?}tĝqൽ`."2׉͒pk aTW (DܨO}ብT_93AaN@bOϺ z6m+ еΫ, yW;ۊvRfڼ9諚y"fxpz׃c2=~r O'!9~ѿC# nnilhUV۶X Km<߼Ρ vIL:ږT^K-!͓$[2_Ji2n3szn=t~U#f/Y%IBf&k#{rLT-m ?Ȑ[p񮵿}Zs&3| ZbN :;/o>2pEǂGZUvGX5:=܌:]4϶ZXlS0kqˌzҼS%4`E⡄7|8'mywvmU[1jͬH~Wzlsg"G0j 7:EHH iw;A3uH8Txx(>sHKIW j/D9D$bٶKm, JtL5q194nl hW"^QJ)wqb@nЕ& *Zht4_;JgoX *b~:ʍ9k$c l}nRzQLoB%Ae1BFrR@xAa& #,?̋}6X6NhϦ`4+AaJL?UE@3P'R(->y\D9>^K0Nm@BYVd%|9U&SgVռ> txΗD;8s2<F;1?!>u:(cֶe$qYi&/`1(.xq[7" j&(Ū $14b)Ζ9aB7R0~K>V|o~_bRM2+̄Nlh~l##wl(:MEȽud]%T&yVh>L1\)"喠ﴚHoҦud/m&f`"4 ծaO,329_;8Um NUI9éA-| 1SO*N.W{Ȩ֤Z0˳[W6ȩJv1Q|~0s5"v'B5GGb{IPtV<5Z,Ȳ&Clq;_Ûޮy6КHO+u&ZgG{x06y.>Eb3> Q>Wm? UmӼ H70#0I FL t\\6x695&343?~t-s8EjvgL'}JWI9 !k;[\5RtV Q5޶oJtVԀ6IYwFw dOi璜 {F_Pi^D{*>8 $8 nQ9W ?cx;U'I[ϊB g٩rY  ?]a$`֦d?7)F^:Y蒔$&n;ȴW?=zeORkϱ=Ҩ!!&28^#}- J jRv'nJs=[?O` hӑ[0ҋu7m*xK"P%C;u~J`E[s{H=pKg`x/Ed9AP-ɡ3f sb~&a[c@8%dTbqqv4WOpDyӧE _3#:Z0E,0#B ĺN9yБ2 & 'X6;c*2 Ϛ7r ,gfo[RҞݮzٖt_Z,9 [pR)Ǎ ;"lʍ'ijc؁Jh|g,k&}YM",'bI_Wc& 1baO4Rz^믦f]v w8VgҧKn[?xgRl󫕰u9f)YO]>_eYd:d!LrDi-{ XzaQ봮q"~L-xu6ngSdݨ,$ǃ6 \j[Y{EcX8yy-Co۶j9CU 66 j4+^MJU0eBۆ]uM/1޷;qלsKۗa@(Iy2X̲po2; ,˼ympq;ր-;eR-2ke2ϵR{%P-mZPɩa̴6I\ѿ}TU17)XGnIIpSP~}Db{mD`6D#)}_8\H3UBPKMp!HƾpԯN1yzczOT#!bAdg=!z7N$zobKrj]'UԞ3=Li [$W@f^;CNA/Jtk+KE̊m@Uu4Y@j2!LqO)1 30ooR# Щb[O5Dewa!^ey0 ]uP-ݛOϻ=912BE4(!*J^Yzמ̊?l" 0N"ǹgMfz0c[FsK5G6acg篺*oLcc* 2o:{m+>- Hɨ811mR ҈@xTi#?OR:_+]"5t^C7Yb )x_%wó:$oߪ ߢVyd^n!s 0&PhϏ5Yk?h@Ibg3ڙgݻ4V=҄X5.ޙu$G)iO|?Qm,֩u|ʷC=gwk Tw 7De)u[ݐSx?5S<:,9vc O䱹Π]D/ 6n qY&hbKΎ&0yujCs%b'H΋i1Fm+AWnCh ęfՐkI5 `IjLd&= 쭟A&680`y^`uw ]=s@$j]O. k y'ݹ/a\$ד?p@aT dXk\ Y>xD8SH. OQƛs{s?#Y$oAQo~VD Y,b/8f?tj i7u%#4nw ̮E -AI5< Lw~l./P%DD:0uUy" @%iaNCkEf h- zBI &*?/*$S2PtK^9Ygz(K泘ki]T0J;hp?/Mª\FP-4|%bχU~fcjo'pH;;zGۼ_߅2W OUX)RѷG,]7]Ƃ ,N$r w ă%tNw(yؒ޻V4^ZF!cME T;rneI諊tm)UF\[_ { c`=idpO甫 +7jQ⾣#GP~j99,pa8MŽ6dξ|^hT^7αqt.`t|iie䲭0lғP;M&HXW-cHmsNN?A0s|D\˷Ct<G!۩َQj-+rb?)7>X. 6,=?Ym+VJȠq K`aqf0 4|~WS%4 I 䐈f ObGo.,@VpVgEqd%Wf|g k\vKkPʉiv_w{8"M7ɄMmpnVQ%[Ұ VMݱ舫pKRd>2u~)Mُ d'))/Ş5ZDˁq/rzalcf<\4 iX~!%"jAO4QYvfȧ+}Rjz<%$iE#!R_ Xz?*ћ sq-,U[" qL7~I h`zx7a$ka}4q&| }ʃw?YƳt%e^mpݫ28fմi\OtǗ&kU Jh7 \$-PQ51 $,VU~qLGemQC?oy5s{XA]!OE#Hr mz/:Pr%)o4oPE2CI[3ɉy!Y-At=uTTYla|\F{I6O-JcOs\ы{G9ܭy6eAXH$語Sl[Oһ@ӷ"U[vcȎ7j/z :LVfQ1ϻ E\#2̄gD: FW2A.Ȳ5ԑrb;vjq`32DxtNl!f?=uv6/yS4sO]򧓞=v i@޼/N7^SQD4u7C!C{&I a!EGϰ%I*y$Jyh^OΛevKԻBŮQ$QOX B1 SX 1xDkxw޴eVurPo@ w i© .3'{Rm['GH OR)ϐ4&:{ aï7~B,ZW~dox9QUYdil)Wϵ}qR';gDXk5㴿t0?~/aU- a{=+vJQN-Uxv|P!n&R1gz!{ ؒ@c.MqNiya% .5@|mTbû]H͆l !/w*=u0٬@ )Z ud喤zBfd)3 "U=܍T(3V38d񳩺і>2̱?eRvPaGlWj?MjJ"^EΦ=dqiXvj'tSASX.Ƃމ]ȐtT5ëa N3r#'mv"M5k]N+e&unf ie B(gi|xi>j*3,gZ,C7x`{pv-{{Ʉ{`M ϖлayu*Yת1Vq88fZjar ,x p炴3gJޗTLKuְXkCHM]<W${ON!PX{h6♌n?/00)0,:oL1b2j+Gk3ZGVqwDG@oDxRf;CնJ Y23v߫5 O -| Vs;8칋wR>)G59پ)x >:2' uNe|1wD``,Ob< &<.xt]+BjӦH(<Xt|(.:rYvbV@$fK՘O}deB&:HT{څc]j<f7xB@{޽2>Lv%E/1hN?I - ְa~)ȯm 3v4V(!4Y06\P8QU^L!=IKfȨg$r.⩹tA-KDǖ׶|ōS,XXI#S6a6 U9Z`4¦ǫ+_NHl=jٗv 87>h~|̗ 'ItF8{,գ/IC)*5\914>PR/Ԭ:βPҺ7t( 9@N{-3"eP"#ׂ<2'bdG%nM܋}U7d?K:h Ժ+ [O?}k>ވ\ avā\L^g"Zs6r'WҜ/=cPuMIz}B% ߱U4}0\F8aB鯿~X}?¼=N(U[7t ctB_}$iߞ˓9#IsLuFQnA-k: o+-uZqs17t3Vnqo?UMOb(x.#> 1*'7$aEYӣwT )UW]=wLNxTQPVxI(` 0Gl-))zq>&"Qw O2n5$[r5΁7F#uovo޹lBŮӱKү\\$ S+}鞇wEa%0dH+?Jt 17K W}7Ӳ{%Kl<+GȻ&gRC3L(BSuZ@Oxp= jכGQTD,x wT5(8]Y39:xfHv_4=sAdڱKHFE$4_Ey>3KOMOMNx Mq6p0λ~Sv-<Ԟ8;_C63SJJ{3+ /P/tp>"ßzi`]h̢:Pʷy'Pg ÖVd3Gܿok?r6N"m9kvpPh͊cQrC,&:'ث giT :(=PaeKx/U1!₡ ^6q.&PmDZyc Y<%W C53&=0r OWO.r-KU8D0ClW[)tM;)vYhB28l~S6Xy0x ̼gy2 Ky%ܯ&C睶oUd68tA,}c!гwA͊Ψdnv)j v"lF!/f5ݗ% )_ Y™8Pje|h\R4=U=ȑ/Y݋ftl3/7q욂KXO1+wg?.-ϩbo BL )&+{.ShBiȓoYWPDQST -뉐Eq/AàE'.&;0M[ߏׅ3!y`ě7`=zIp*J")c,yꖭh}p,Sk[1Vlq([$ "ѵ.[gL:%7\5& ΡYe tTQLwD[BY9[y{!(зGMf|w2|:8 sgEZzNn{ĎoB=^<,{q5imzv7@V^%/݋[;;|]BkCc[k,/Z+x:7}"2ܣ4_߸K]v_nII!A!j@VX\ug,ZuY `A?/ ڎI۷%cZ 6] U & ;|OB,3|{+szx5MRZ"2 _94ZBAѨQ,#I2%qI PEWR[-Z ;Dy\'B&"0Ɯ#Gc5 pejB_%!fnƐ*2?#U!9;RSQzq.1o-Jjued^'{ lrj2jx/}* @s˲^ʠ&z^7YcoϸA&)U1QZ,(8"y i:OU]U{]·/-wL׍5R!$BpV8HR$[Ƈ%˪z =pCqz ƺA6_g1Hס7# n$'E:~UZnN>m2햁t7?e>t*^(q;Mz p`+cGyaZg4$/bρWܜ8&G l)  EoF%S´KzDOc X'pcprkUϓ Ϻmw~8o8®^;w, m1F(HRCҵiy~ w;epJp(^a/ᰛ噘 v5_ό#n0Wr3D]J{:{=Ð͋wOT3p}/O-%+ۑP+oX' y(yp^3 3ifX+jWM\z$ZKVLD`εqT\ڀ x|tc󐇃"Z=Ah媘. fqEHA=}sDm\mƟ <fVVW??~hfNaym=-H5BnMFfPXDМ"o΍rC+*H/Q譟zƋ>sjB ݃0YQDY/B %xxQ8YK9R&B5InJA̒BS* w <]̒t"5l1L4k[9HbП5ff}qv . t)d~`dc9e[y&WYu8 NKyprw?ΤA#,#7F1Sq^H0jO+TҨ#UA%lSN{q*['WOcn-GCk0UB7%7D4۲3NȻQ@AˍR.bkn5->#33ēp5Y]@jʉ\ܗqkҒd"7[tbȗX-';Kk.b%fww_UXX#Av9C/R_vw%`u<.Yz2n>J!b劻[CۙGzQY+'Y *R%I\0LޖtN`b^,>XrGbgh7̘xT,q=AQ{R8*lejl 6xU}mJ~-k RT7qag-w.aՏXK0"(b<r`h RW VZ!EޑR8cyBNXM+n ̯c[IqD rN}Elj|8jcv7 D0dő˄U,L"6*hGR0D#\ÇQAgK$}F^`Ifa0寪2B01ZV| ̆Խ_L ^\M85 5(`Gg> AtDcO}{J#3mʎ$\#t+9 6ę tR OT)rI(aҎU Hc"[1'>#[v2(YrW4%߿tVN$" c۴fMlU9 %5ؚaV*xOrXTx uU;q<0ɪmx vN W,_òģrzgߺ9g9ЖeQZԥIaM)|`a|က\8{ #io};qcp;=Ɗ@n?H] U=orS̡c[B-Eo#D$]8T #[vcܪ?;YMPh6\s[fMrRvV|N, B7M>c>Gd tu.!-q>XT".PyQQVjo dP#~c࢙Y`b׎L,0q!ܝ}t$)[!lVDWZ`qOoon͝yhS)Yr|-0o\N R+q2Ks,ʵA j-a 9-ta[ɻB+EqmsfuIKsTwg&M>9M̾Lruw׫wM[y~?RRŖ TҜBPnu׀[Rޓ};siʜk/"82PybBc IUBh@{8N:^?g58[7GՏ+hAQu!RT, Rd@H#.ᐅhU5k#x@Sy%~Gb8.AjIAhLϮSx1.fM @~_RW>L U$/Czt 웺JHHt=B1ʼngA~ $eN*YD,O#9̤#<'JOK!ʡѸL(]`nq_1:z0Q2ӧI_̜`n*Ʋwq.X~w$,WKN'f?.ڦV2# c8NzY"2JpJ(uv:)]̣RFhMrI&>(U}k~&ѕvUjxب,WGΣډz9+Z,0s%iX'3xn`=9Cy^Z*ώ}y\s,));om~r( 1qRAO)_ iB6۝F2/0dV = h8l(Sn8?p꘯JDH܅oa'LFn9E*H8_Zj96^ VZu[1mcݑ'] oǡlr'ڵ,J2pr#=|n m %H|^0+y6ab,< !ԈRt fuvRjvd NZ<4n 6*':[tE'oѽtҍp)B +$T:N~-42nmBdrđɋ)CTu%,p@ziG>B,op#}~zBmgd9X˟IPo<[r S^˃ޟVKU MWAFF 1`c(›O :֮n%L!;R%Kg\epliCȓEGk+ $YmU בcx>sOAdKN:iq]3\psA_N}?{"H ^.6_o9$>fky\یun!73 v%bgtS5٣]mIrsh;"bahpsOɷ#o$X:_.ʪfNkFj!4Q@G /-5b&^w vZ:/W: yux8}S{a ״E Y֍U?8R+9#Eڝ@ս u<a֢*"]y̟D>AM-ڍ]  К5r|_#K2h!԰Qo.Ww Y-&a gU̼zؐ ݜMmGķb5=4Uϕ.YcR># eop :a}MwfwPxr[*k[cRT$VHNᚅݻ߶C^pÈ ]qbiq3fyOj"b3{|+ұ0*!/Hl99Ŭw S~^,z_&Ubc׷Ϙ:gRi= o<Uc ,F_t/*LMLEZǙRdW@h`vո 85_HijseO4/8߮#P[Nh&**Mu5;7/ΡaQy/ztHX@tzH mz\ZբO%mUlٕC.$"q4i*zt g?;R&L;ݥckI^ d@LhWc~~NO/RwX&J; 3,tRBgfwX3\ѨA60ȋ)0Ib1,?hBzC.b7y˳THl(c@f,ݙ8MNHd {!đY0u(sQ,29K_@ CPe˖`9nv3A7?ry6 ps 8K.nG)~۞&p=FBQ Dqs89#AE#8DU#=ML_hUڝrT$-FJFB lժ>d xz?Ova(ar_^&t  I~/Cuڶqm+Qoj#gO߆b%l߀@/_!@nt_O\04Ƀ**)CH Ǣ-o7uKcI4E鷸\™dy B I7R8IۓaKMnu*O_MEsߊ0&o(tCjYC[S-HN2jfUDA.50Kq.ơ1s^}'+A[1O%/K[Jm"]yƠ7 dE&c>_NۚQZg*}aOveZ5Bw*qdkhCjz|q~X!]IO-kt㹺DUhk*!n.n<gt}o\CJ1\?u60[(=@=cGm NJx_1J^ ]ɼipf,|@ϕ^XSZWT ө,EQgVC[vyr=r/=^!cw|C0li 1AeΕ#vlȖ4U̲g\x-֡lfVF'xGȑ#DVJ+unAa?D̴X=;,7ʾz(уppd!}Y3Kg":lq"K.Q29^xPPyz GZ7#y䗴(5 X׽YK4 g%w\,&F ISd g~Sj0_A\& @bmُu=&J|p\!٩M뒸Inϋ L" lz2ևx=tp3B˿a Q#K`e\[>[N{kiFA+hq6hL+7#$7˘ḅW#8K" L =~ʬoBoheUB9 bi ],4@-x2j<‹x6N4Y‰= ͫiu$qFyqb*+>馿sk 8ID”&wpo̐W A;(~uZtֺ~n\/pf&dcnȦU  qbƫEd[9k&9$5-HjΊ@J{PV[4xODlL^>A$߈ANa^ dk}lOdf`)R-k!T%ځ)`@5Kn"15"sRk Xˣrݮtg3?I@5x*j_ g4zcALτhwBQ'Ɵ#|" Qwh~W?h}J=$}f)#¶3 Y0N4c}NtFh#0i0d >'!᩟ +4MT#ܢe|PE^vX6_` 鞷%CӈڢU$t|(;D +|hLx * ||RO0vO1Ÿ.g;Kۘ,?,pVpn!3vI!w^ͷ[@` !5wZ ZYN}C(.905[pz%Pű T嘅탂>|,Pb4z!|Q<04"oW#@Kf{=!֐pk&?n1[KǜMq{z FoSUUQK)6m[uxhVd7IP~cmi gdh509\tf淦Ch;s Qs7W*4#i7=hXhbƱM~:zއؤzeuYZ Z$QsY !:ҦbyZ3Ls'a^q dףHr/=EmfM'^Ne!'EgܙoE ^Ra ri~l qrBg12Ё}R3SLCcq>Bh>F/F1mI=1"U_BǷ, ̴CP] C-"L-ܚfi˒kT?A; FEͼPrulڣ*Xu 7XxMWV44Y<~v ZBH^KHqpT2w=OuyEOat7I,AyjSz_jyZIe*UD7d*k/Zs Π , ǐG:s;J88C?[rOE<2(6wGsp2q`η zD^UHO7@YrtwþbG~oo4 v^G`ߔp7c I)ݼl "Zp'~d7UೄzV)YDGǓFA\yc'A&xhரKﹷwH{/w-aVfL}Jl%HҾX\QlcJl>o i OP@+%#!iAf3?$wP~uU)E(ErBkj=m Us 5Mms9 9S?";:E;>nX/AFmGCr7"]%xA(<]ĈO?BYqq= Q2{]h?λNРGցrf B@R#$)KԹ3+g%pN_~*H[Bou9s!|^7_=eK&*G8$1n#̗0g$,DU0kRɆ[*}XڛbWݒO'IUP,VVA?7]G͗$^ 9Pd&—ݗe3dMjՈᒾzL,"P ̱l0h6A yؗ59 OQ4T8Jlz\ظ YT Mv99ru뷡Ss 4@m냯έTCȒbw*Pz g8|6kv=l- ckK+tqm~'rs 3x~kRc-}I&ud:u;l"O`%+˔ 'l&v|߮eL)&7 RqÇPْgx z)w#ϹVoOh6SaO'PMFMvy=oNKn"TG4-]v?jvĢ kTd;)s3M[BĢğN/U!0%)A 6ބ2Scc oJ[VU~H&>}3l9zHZU6qprcϾЄLF`|X>~}|-»KM.vZDb;aC*Uu*ܾ;"<",7D_6v$T^| u&64ku֫ap  y9_ CG i&pqnqk4R볅C2>:)4<*'YW+tf4pfIFm3k+wOtW n2EMEX L_&Q\DU 7aZ!{;5(TǓ?4Euk"9괎jD#yqș [ϯ >yf }E:n{~d\* Z6!qC+1a^,KDSCqp"z{x)Pˁ;29߮GB"S,C-`] TQ@*ݍ_-995@C׿gT"77~;EpI‘i8$(;Oxwv@ /Ab'S0KLp Os  Ml~`M+eGthw3W0؊/q"~SMTl}VN'Sfg"D%*EQGjP>ˍ>UU(ZI&1ĶP?3[~!C[;OIPl`LnvxmA .4quȷ 0ػ_E1s]Ue Zlx fjp3g'謏;!I7ҺsaPs1"1Fl5d:a(RbRR!ub9,*A]'܆;D0o\:\3UiE :r{^9BqS'_t# &;./^߹ZIIJѝ"4Ґ#AE =>^Y@m\.a&_ey1\<|X7 [%Wu9\^ޘ#״AԨ-9/mࣸMҪxZa2az%[r24UURuF{]-yT@.ԓhyP =B00 T7g ) D7dyZ)*jK zlٶpA&b;bP^GJA*rrmZAydy:還G3C͈^8k1ı㾯@#`ve+Rvl:l8A~K;*L6+Ҝi2YeҮ]1>hD)"q"eГ !w6oq>nO1J:-η;#KӳhVTZ\i(]/{}%.oDU=tKԞ{u!60mKzXyk'2삢BnB.Q0l7Mi191D6BА_ҺɻK?8S~wyje9r%&r)Y"L "AcbRiRU ^6=m<:|}s+*O `]ޘ3z{wΫ ;>A(J!{3-0{p*9j N.trY:gG\˔ogîp%A(?hIl64t,w!}}bbËuw[AE,wU/`Gķk:_o=)RX5>F,}t<[~;зVơ a}s#ogUNݓx~= ;!2 <ІN>",v >6Eu\(9cmWy9io3_[tb\Dr>]6;1VD2tԖBFTwD+2S !gbMjtd ]G :_6֦CAɗ{E+ؑlc\a}* 6j) '= ù1NOTE@2Ud!K2 \Z{Z0rCjJۭzu9vǖ<-Gw~::2 5Xc#jِ&e=ely_O̬ mt[ SGu$V 2M16u8cju)N#)F\*^"`]O s3^(mWujv~Ͱn]A1N$PLU+& v9 j|[w5ԯVDuF.vu.MAXK+S5R>VN30 yz޹7Lɵ>1j#oaB% i!G=4`:rLէ5Pe:oS2o#HD`c~T{ .c4v$z0eVu݅!O=:~T>ёX҂ :N(^:wZ!C >1YCC1H~$a%$>^r8y o~CAvˤɾ~=^`ia)I.!eJb۩yeKy$ɥ'ӠLzMvL'D۬"4Ht@ \9a҂Cə,g'sVTj,̟(ҌJrWrAEۼJ˿o-BU24ٱ%Ιcr=+VR3XBJZw8Չ Ӿ[=BGG A)`̔ѭॶT<P+R1ȼ2/]km7< WD?*+=?y~kFs! sZPAsQ/@ P~ w{,R#ø(]SE 0L 6?WNOw0'|v%}e=j `W0zKu$ejT(uA09 ALmWf9x-;ŌJ,=9aQ}L2}c!E*cwTKzZb2x32RÌOp-,+ `mx"tPiGS&yP>+⛔)2~{`c*gE~cEz$ DxrА}  /R"h=W+yɧC}b-!zSHX,f3gJr]xDEl^yq3vDI"FA%n݃c|Ђcd(`#0^BJD>.WSLτHzZ3ϸרRnéB3v˾cpk[6H-|"]3ZU'Q @mR:[dB'c5[/ve8G_2ig}U֔)Lp(Խ/ĽcjEgtZsWR:GhYSUmzƔNA0_>w>mP-e!W]*INWtƄn!Cmn27 Rˇ9TZN9N_ 6eX`UNw-d[m3g*񭍊 Ql*H*šfSt1s3.?d@`(@;5B4)YGFݛur2tq3XunOBiS2?6&晥GjT+@e y sr$ !2QڻY`V׭N'(cn[Q2(꧘ Y \bV8DQxUF,Yuyvx2p FyСKqGBsa&[\DQ׀;!y [=6%XܯrvKB4ŕ~}R% Mfa~k!KZ-<ܶ5rz BPALux-E//?!E aSo쐄 @P,ԗdMwv{qwjQiPzPfDyG7q&hY/d||r~KUW7u9.R!zX\) s3Fe}˨$8@wWm|ʕqo84(^ʻ#ڨsi~-%D&PTb%FǙ~)44W 18,ؚ$! ⢚sN=,=ƧK[fS?T̡{ =>J_Qo$'KB?Ǔ1bY#M?h+X m$r8CȘ nZ'ޛz43X8[fs2T)+uDJ_CG3ڕ\]x~XB*\PsP+ cbtkSM.Y~K&`"g[y 4<'2ԤʃE7cΉ<"ǓE;9W⾓ s$Lբ*wa(yJO/! |MBhܔ`//QV\poM#%LHW]'3Hvփm?9ms}zJJW==]^`NV,rc0zr5#k9ROօL@WAjLdۘy0߲SbԂҽ 2a.@ۙfeX99ۊjW颦"H7C~۞@0r*+H, j.4M~"0kMk琻!%ѣ9nUw-(-)rճz Vǰ'e!$&seMՁm(<'>/b}ON@Io2st{"ܫ)\ڼe/02q iwzp=@y iaVeJRlZ=bȱTH֡ oUv3+ fT0:}gS#t8]IBv;IcdzX =mM\owO+,H^3̺շH,?TʃҔxԘz2I‚ip#&B-KњB )d7W5 %V$p}Icv?pwz?QFuF*i҄?ntĆNuV.P<{v> i^Ƒ'vSSRkts^8~K&at s+%ѣF [*bIE1Cm\YhrI1i}{9hk!=9rL2ೋ6ڽZP7?ژ{2#]=fTkQE]X&8σ.m'[Ze11Gd!-PiVG y|LŹ9SҨJp[9el GAk]5rH~DE̺)i2D?E.' 23Q$O(-Aơ㡉ūQҠeZE"x`[LKeXzxlX"P>Fman%l#u}xR>f V%4, 1y?3\$=WqzI x=k%8%#5?[D(?5r1x ߡd`"_g4jEzϙlgV 0D7u$ Pخa]2%2g³;,"_σB4.}-̞ȿ- -YW4ʨBT ԛw>s:+YyegHHn`9[E7 Utxₜt<P1gj@ZDۣ1kb VZ\BF FNA_$p%!.3|A\֕p4j~O(!!+R-*p .MՁ98K7A\0E: 垡RW$5YL(AADTcUr)ė6-}+sz񓢏 l)4#%(q=MZ.ţr2E 9pADG0$ۮz^kiS@$'~ծƶۗtU Qg )ݟs6fɠVt֍$EqC`LMh=zu坵Cc D:!64C$Åh43{{] Qb&bOƒ9JW؇7`z:o2:/#iEA~"O ?dI^?h^gu|,inD#JRUp1QUzl]S# ]tB_loPRMQK"S-w7>w%Uo\3)[ "r8`JsC1oJg"pkWf{:\#Iun>RMS;1쵄c6dh=߭ B^hYzZ[ nHy%{ifX] z_XAA9") X"^3Ql+^5ٻZ.ETEx@ dLaMPy3 $pdFVs*ZDl#J51t,Y`|MF;ㅡsH2/>pgX~M-<׾/±(_F#MW[YM}US *~T Tb:S"uz[UW[q.e-dx%Xw~P_k Zɩ hUӌЀu%/|΃g{B!/D`u6!Rǰe+n+ȶzl hr0Gr/oL+K{טK~ 3~LPCAΆN]O{?1;cikLfVxt\BRm" )_O}TXSTcj{A ZWGI?+e~\l*O+ sSZ+ c: OIzuN:"6$PL~hbo@d nk*KŠ5 3Z ;I4ZZBp~vu!Ƿd{ )e4O#GZ~߆JH*$3q&E-07B1mڒ Kم\@5YI,Ny/7/Jcx2m_kBcX7$h +1ĭ Dc{iB0 ʒ4[aD8T"QKgӷ[g˪E2'>_HlL^Lߙ{/Y]_>jV3<.2j 8/^Z˼17mއrA夂nFWUV MS!&]H :&Ш0LMÒ?=\x:\J-[ IGb 4_7\wR;uSU!s4C/ۆ<.V@ #R|2NZ-CC$-?2]($iFԉ_tg&prѹ7㯲??Ą\0ɖ.|PY]]B{"~j <\ͿSy/fC8K#k-B:B@ ]UErK4~Ʊe&_$۩O;#;Lt!Ϥ"͉`RK$@Y6}*{BBБm9f6:kC|hAރ]]|o=;GgIؙ: MU__r >`e31{ބx;s:blnԊJ UhCFR__,w`gL |BlAJ}nfN?{ ajhx40d)78Mbd4~_TfI9X [|w^v})_ݿKM>l iǞNu96#@ـ*ێ_Ŧ(xT|UQ󋵽N_gJ%J3:<#O5u9o.K9,ޛ "=)Jqr g&'k3\頳޷kXaTkzn!Ѧ_0/m֫嫘޷[P@R jjB_:~~3֦ax>ֲa+qxRIm 9f&/# l9+ +Tv?匡`W#3#\kup}_4D1dÍ*Çra:4#24L!jHwmN(?̇]:ȮLATm^'П8^wWvciAz"e"f;iCQTؕx*Pӏnnl[2s(D;>Xh\P<ՁKby_ Qׯhe]f}yl.dƬ +ݵGcCkh6\{֧t?yjV~FS-ɇ`m2R!0۱s\^'!ak L<ҲLSŀ9dIʖH?Vcbk RvZʅ.ga~^`?*v"?cqu%.ضq,ѶToB?wS<2c;)N<U niIw^H9ElBلC"hToⲻ*#vQܚkLe Z>~jF5S~1ȬTuF<={lZBۍ.Y\8oo!9XN9o nkծZՃ%K]N|R##pWш x`oF9L.){] o (Af \WX~n-d_!a y3mQsCBO4V6 uv,GU`W;q0= zԌƾPH|)lגl\=;FWutS!XK1|J{ύQZꀔJF >z9\5o d0{OpNQR1 '|wٕL+V`N.VǓc+OM HFڣx5@Lg  _pBol]Q&9R#.#8pyX@1LvٲH}#-%pV-ȳk`UvBx~.%rhnh;=qWǘAHM߷kj fm\qTPzfSٻ|ok~} WZ2o혵}|wI*O[skṬROt~DS Hjo!x~֌z1&] xQ2|Yh=Fkz]l_J>Ps#3WCDD^tOεjI@j0AUAh$v u ^ `$U0NJk0I̐sf q'8$ŗďLM^t,ycrcnbi&b@04/X3jR9;r] h,\ !3 ꅏHT;Ώ#C˺c(͌+z 6Zrԃљp\@Ke2]rӯGl=IP*H=:7яoڦC`Ҕg_HFe4 "3 v<4(fUo9o[Re݇ j}Y⓰)؍HBHRӱn4U[N5vv"N"=3B624op1+>lF`rho^ʶm( \Y?n/˳`.w?=va1gmEyz?\ =R3_a+OСdeBV\~p$9Q&>‹a (i]dT'VJ}L$sr F6P}_ [[|\Rg' 论mI2^qg 5Vߍ4Sq1`.\]R϶%]F }Ontڲ^o*$5'HyoOJ߆ҕ e-m`싚 e36,\,U cp]/oLJb~hp&_WUXXH8ld48 :t>(y0G|AIAlLC+??K!`n+H\[H0?}m(9: vrҼµw>(9h^H͛[+}8?P릆R @hͬN>]Bćrw@fPȤdIo~G ׀kCZ ?1; ѝOD`VuߺWJ<0cq~6Q{ǿ8cS8 Qkߕbh6E zLRrSԨD7m9T=^!,ޛ~d`brF#-m]+\ai!e&Zj//tFIWDCƶRʤ/'3=:n[T 98%Z)`- M%ho@|4Q`KqÍhXV(a> c?n'MG8 IU롐rN|ĮC< V A?E]7|z+7<*ov(SK| &VΘ#Hj@k~vqBe2Ot邊?EUk!Mc9qU4jCwRxw)KĺVJķٶ<0mR ¬Q'`fdi ? ͨƒxA+yvN@Gv.^2F_wBEdo:Si#AXS>!t͈$| '?Ob[}#VthM3X劽P>;r'(ct]T DsȆ4tL&-0|S%:ApIMB+{WW/|%7~7 H <#z[2pá%%* v ™o6dJ8Bc͂=g.lyF}k,/rC:Sd t L 6IUatCAY퉥K5x>{ qh/vbcsQQsӈ-q;$w[Yiu7ZHAhS,4d'*6n F]*xdt' Ԗkxvl⏫ث 8m*̯gIAq&+zp B6+F n1JUCދAqqo&+GVtE(ĕ|]wQP ;]8HnucV0=,®Z '\)~{thRαP(wD& Z^k:"n"oZ੉j\o0a%Su՚YmS@oSզ%G)\:H{TN/|"H v|y ~Gв|Dݩ،.nZDApupgTJ5&Oh>]T( cð#"Żjt ]0ӕ+uS/dNsO;LBݒ"[[2ۏL<Ǽlmӝ o?=V}+P"l]K6̝Тװ FBϽMYKtsSA^pE BNRm(/8y`)A3] p@0mj輁-3ќ}QV-Ibrþ*rf H KK/w7?WPY(|AUU댾xĝ@WW\[uW8A+yρ`0Xz nnadǪi ק˵rݏǼwU wn6vwzūFɕ̡qqb62\otYr&{Y֯Lr%w{GunI)r'`c9'YD;b[MU "NE?5✐'j`jfT% CLpba%0~A=@nSƢ v Wl W0!aht$hl2@CK")Zϗ _~ =#Q]uhh)JAɆ5]xev<,`$w'8 +Be">VWPbU^3-dx$i5,δy,5ŋ7;{w ^ ,1+ؓM%@>>2O]@FBoBBUn=q}|ClϫȖ<ҔHhS5I'T*3R\^=\ Vn+Ť OZ"}B mξR a{#FU0!؃%+DpAS 1DWLؙFutC|Tw3j|kOST!%P'$:#pK*U߬)EaaB㛩@JA>yٿI42T@-rwr5dOCf}=L sqG;0!Gm`~МK4:7TtI9y2:8%*fXfuP,RR;rV9¨|$'w6C<Ǡ̘~xeq !].dIo IؽWo&;ټUWshlۄ\kq+3CkT 'j*/4Ea{&K[h@* :㣒Q(XVȽ*Y y5~? {6W(Ɣ˜d(me/'9iQKVTGŮ'c8j?/,q"Tߘ U'ECr%ײ3V{?k$/AY=ul/NPQw5uO2qz>XdlY6 62SX E<ͩ-o%$-77(.` YJj`63B"0PceLi-e30[X}\i,h9DIh1ZpPה)X= ٶ2U7Y1bm_ 5q]T{Ԥoɇ-FK[D.R'dq:xW TbĻKW{Bv,k8 <8RtJh~PTwֆ`0&{{sRg9 r/Ta +R a59b /H]@iG2bU>9ö0v5g_oW2%/)wg+.ws,b[(ңu'0y ڒLW|6vQܶE )DQ'#Ul2 ɍD _nEt@ї3qIdL?5;ymؐT- sͩMB!m% g YO8x8mmD!C/.8eAJVt K|Jd 0- '8ܝ 4ϠaJ<+i>,KS~DtASa*P_] Vs]*]͒bh]лۊSa-U6!RFKM E cZ)Q nWPǩhSٛ:"M 9:^#(I-f ׎cRqYB+O7RVA}_aX$h>ٮc/hG.(T$ v҅W.]9ep^)O) Tӫu)VqLSǜI/y$}.4.+}J롉Y[;bX]sM#vT\֭e"+Rd~=)a%Ho&E_qs ];բ9 :0;`zq'[䢟Lp m.O2uRޤ`b(Z_otU9+bzw"fwӭfgF!1IHKMeϮ^>Ö́.MH] QUpk$]1\ gp">-V/#"OTyʭBaghaix יraY_r sA OZU"U].E w^@gwY}E VZt2Z$NfRETiU࣊~?w 91&*FDP wxηuS3\s;ֻOecaj4$*npPTvy*9}-Ԏ)ע۴Ė:G쿽5w`s%= 4b#,z"ٺ2SH;V v E+ZYQ +%}Z_YNWPiΌl]ĵ^oTST!〗ϭRlI@xu<Kh=eGjj#WKb_j]@4hY@! AE,!+oCzP#Εj eHs U\?n^BtݞO3e &+=kXuF50+h(p)B`dݻR"G`,GbUS&ԿarԚC~_{CԄ_5R@x D-x~~ NW8g}s9hfX@}PHQG:>LpLJP4R b=j^|O/}A|FU|/Z[Xj4Ĺl2jي(eZ>7s} ={#G/b| V0u;!:}͋-irDaCZ'C[J~E>o`KP%{HFI"2 W}a`zCx:;c=WU^cjZ:|9Ѭ*bMIԥNE{]hs2Ҝvp+G`um.< n]rE,@,hA":?rL}qy?hG%Γ^w3% F|@>gZE3vO@/-!R6_[BN &58x~Lppł{k0m#dw֩OM{^1m;_SoCbZIۘ8+P rJNO-]X LЁn:[#A`B.k1TgD!7 vN@_='qxD"$#ihiYu{3 W[tP8XDJh"hReo_-pshjlFi+^&rpʙ'SǘbETBnv-/_X ,KǢгJtXЖdz"?8xyh *}K̓lHNoVLxh$ R~z7Eيo'-J'30s+` `vౄj&lW!m ӑ"=sp &z#?*ꗖ]ӻcɒ[N@<_=;}-ҁ[e͝F~/S%$qqXm-N9" V\)&)A׍'N=" Gsb'_ӏD™ 4g!1{Or,OϢ\e EyIϧ`"_{t$W=h}-Ѕ-{j&S;Z~Œ2o8 6iN8^B {Da6 =w[)ЄnªAEӖԧbX(U;pi#DMhXP.u(!qȰIXK8lOf?w:\Y>MAS܎q8Jvma%VwVXfc(4t;dQv.QQX'+}8Sr/Zl"ؐ:̉lf?6rRQ9CX/*0q`ʍ6l }Up0[ XE"Z iFu( e3 In ʈր3,w NhDY~)k Ú);Ԛ@ЖˋAaTOfd ҭt9R1BRߦW8NȻ?ТKaiwO3gݷ9qsygCX-~2p*^<|K?"&2gM_i`ճYK2՚1`z%9GQ 9HbMղ<)k^H%Dh?yF8oq'A*Ћ{Zvr8knoEen=[65;%5b(DFɋRk,Ď`l_׿Vn2^qoPH'+K\1]TQdϹ 泴#7Dj9{LDhoE[K8\d_iwv3Lc}r- "n(`R3"DQT*>6Ζ [֒IN ^s@Y:9fa_h6rB=qw\bD/D*"Y"qO wP n<v#qK27x"Z(.gz-  912H`4(UɚɦDg\^]WU\P꾙5EFlP $֩_uoB]9үrMx0Ξ®=z꺹^ၔ֖ kqW>9-ߎr,!ص;cܤfhWiUriJ1Decp*N)  ;e?v޼B O F@ǧR`_(,]FXjHA0%ёH_G91D6CF0: u^=ySFZUtŅv Ps(aav&NSZJ2:fqeYc佶l#,Lh6X=H.Fߧ>ނ$M ^p_ jP;yQ{t:hUTnަکa.9Wv,ymҾZ-i}:fER:`_m{OwUҁFCaI<,䝈:3E~3vN jB`|oN.T&D4}PZG6h].$::ŋ(I G%htct t3/ 'J#P%Yݤ vEH |( fy~+c@IK2D,fd0 5"pExc_8G͵&ц@Oofo2U'*Bc?swiSOT g10JKH\$~Xa/W6fs%eQH߻5.5xW-ˤk3NVѧV"!h:Ehw$4kǬRCJO=ElR`mzbsaݖ_2%rruv|Xa.C͹!KqwDC\E`+UO-':,]ZmNwΐo?~9jՎ/q.g1OK96]^3a{"TU}6Bڿ{Tj7(?-$L^& To2{m+@# ņmvSJ~HQuě+ykzE^*$0:[6Uj2 =xOQ^d7N} էF㶛RV)"{-{|Qj)wai!CEtIjs!΃ hIωdQMOGI"CEK;f,ÿRj sqo$ i..V lrDR j  NHfة.39S lgǾ A/,/I~b`=\lN_M mXb#)N$?7FBe#W tzcU=wM~eAؘ6.bn:{Orqqx=RǣZ6jk0D)[{;L1GQ0EB<>*t y7o2`_UH=PMuK|Sm1z)2_Я<0! ǵ \]۞%>}R$20?{@Zjk9`}%xUxGBq~-˥i D[UCcN 8?@Re rt#f{P#?0}S +p BˮqĮ0@$W3R0R 1Xؕe.pUP,+^R.*d_9 \7BDED![KIJ&cl r$4I TZ\%OL|TUðA3t%M}]:eL}'.vȯ`tpZ+fHC[SFgCrjlUr @JgM2q^:p{6mP1[mow8!tp'D{~ʺ;ٝttu"sGDC;W&<YUٜgI; ~a'iM'm)ctzGȳlh+ECٳa'ɀ]NbS+]:+NhxBʴ#^5v:9`E%[uLA ךQj}0Ar)f5!rRQYw+t3CyWgً.UyV]0Ua do϶(x<mTjaIQ^oT1qd7A8 | " x7ؐVi#vvNZh_)d}m<|bK;0Q|+^0ZaT5C{ \F*Mjñ|P@K n!YqE{̺{ÆC|UūbJe޷Yq- gέ${ar^i1=9ϐ*1XbBEj\}H3y'D2$3>uR$T8?U^fz=UcgL<{g!"8/EcMZ[dLWs3Lc?R%yt@tdAWl)ރX| Ֆ8Lxo,ehgf=?z Nj~i'2,p|Trqhh"a9l3BAѨt(v B}o*W7DgU} u#rN5ܸʽjsgUdm j_p@{ՆtBIMr͸yO`b!VKeK 25 DtCC IXrܶj,bN^WyWogV`lkՁM@웠Z*阺࠹GrLC[0ߚiZc!6(sNjDgL}5R̈́_5nG#PO2!+AIAlLCK6`=ܭm|?4mۤgso2\F`ݒW%~Hr2@e*\vԷ6C 3]E^6$ G)(v];`vUt'WM h Noƣ^+%]0`mIUijppͪW*ahP_6`|bL&T6CEAO,PZr4h q@ܶ8p$G_![@nE>L_,h](C_]^k;~fSb*aE' a\k;x p No|"rUhҼc˜&SR%^ydHpuMC'GaFQ%ڭןoڶ4T3ҘÆ0پ4^ZAC_57$uߛ1/I{`#vC'迷l:^u Ac;; mq֓k ndo "+'; >9`^}(50_ ƾMQ5 ذbpb.zO'!=jV ~|Ǩ?~jvf3E¶hZSԵQѭ ϞT2B2E#|2 ?ܓ])̗'"ޜ=¯ɧ$q؝ýp`/Pel1Eo6~d$j.F]P޹ /~:gg{ Ҧ (i6V?-'.GM0+-剁/E x\rՔː3Dt*_DשaG` k_&fk c6 LúXӕ/=YW;#_zJ0Z}9`ʓ+%+zчdyU#W{=>;Ό#jEtZq9P*+ܩGh0aeȘ%G>;=rN}h"TmKͤBVh(^pgJ. @X_iX+R; 2I<ߙ~M|Ȧ-OtM]ne8;hDb l g 3[qA%!cni-m(Ua{1!q_˲6"B2OZeLS]Κk QH߯m_ XrY\9r rj޻Cl^nj'@9Be Z>XLuH*B.ÏVʞ=HumWfϷxªpzmq}ap2Y+ XWš觏tA]d/s>_xE OgП(/W*4n=MPwM~uD]|Bt+RkӔzXKLvwԝmzYyh%]Wyd ]OXQ}mؠ, 9?JqgAsR\t DPjǣvEXJ $; mL .gX;ά >T+fNjPƳzQiJL1"ŎXB,viFsU dUmbahԠ/A>0ȟ/cuOK% {TpcmlѷR{`ѩA`tPeerE G8 j떓Zu){3Pï Wʺ(u&Z0?-zm۔0D+rqwj3t=x Beq uԺdXuZ0=I?E>1'*BQ"z`;(NqSB'F1"5[µqv:ue)So,)xe@S̷ȪƂU8+&쌨RJ|&itNw0KG=¹o8["_=Azrb(#˶IAdSprKN<`YGy ewb-~gtٻُfQ"U%6d 7ܑ9=pMBw=LyJ =Ϗqc R4GCH(ɑHdW3;Z)Ҳ!UQ<69i 2 3?ȆkLZ{?hgit<hr-޶^Llt =PY޿8kxAETA6x &9VU1ssC+l<%:~a|bQ< [rwXX灸Vtoy'! aQtAfa p,CdTxLofdKkncqZ tbtځ%bWKqew7+  !hgA/IlTVhs2櫼aqGUp;k&vϛ4XS^h>pe2QV6mQr̄.˻+8֧\Q[&OYQܻ&^u7^5++7UM lZ1" 㚕CCwU?DŤ YfQro;+u6~} -YKZ8or~XM!C ,\oMMD1vIePF\`ɼg'DoH>|{[;!2q~f` ݵ?~s%ڑOo|8 ^"$?sYk-l$}H̷Y͙I#_bX"X67%zHrX&N|Gbt#LQp D.`Ga IhXxv\Bf["3+\Ο ;O<ߏl-r+p= B@2;:3SV?_l)H,Mq@:VPP[$Q'),fUb+t?4祀 G|bBz&N*HkeLh(tמ' n K> R*`6m@"·j'5$@YH ktwPߒ'g_1= 4b]45I;FUd@}i7!O}}zalx( KjJաԐl]9 jG8z lMg6Zgc65K<"P/йxpG/y5L.g@==S#xC릊W{ $uA{XDkkiHEIZ);*"8/ʉq~^C{e8VԤ Fi;`%ȫdy[:5KDKIW)}84e'9^mBXD$Knu*c>|k/&tu91D6EAhPB]/ȫ^]52@=ִRSF ]2ʶ[M2Q<]fĠ4~Uv4misJ ށU$8„cGlZ1"c{ʺ)/ #f+~}/Cф@TwIُ]Ji9ZZ L:XRACQ׼&?=t#Cgڄq릲B9Ѐi@^ AI Re0!b2 Yj/ f`¼򙄫M򔿼F@2vKO\vAt3 6FzmTr6s02qC]fpvQ2H JM/ Co`K>s2CN ~3'\EœerB`'B=U‡jS T|Wgsb<>mnsB&'v̗xBd%=Ff?Wx7xZt3>i/]bxXѯ~l||^wkx.!UCXz0HSGQ賤VZMQ| #_Kc9 ͖tEɘ9gA>BZS@oy;c.@&S@2j'AViB!|R]LuKhQlClR!G:Iwu$oTIo#{<9eC ΐ!1hhs|ߔ'l$Ʋ2BV}b R[R6Dz=끈ɓAA%xY*]$wm}8?Grs+Go"DRZ.'!GIB~"K-@i.#=!"t)2ع&Ҕ1]qVxo±/Ǖ>tݦL#4qN0-3murj9Xq45^Jz _tIC-խ;)>jWab[V HęfQ2} mξ2ؖ PVN:%襍U`:qPdv7縋طeJOpE0λ JF"N ή7%IGݘ]ה@v_ dZ+SDkdN)$Cz|+>gh-(`ݦκ0]:2 ihgY*mft4k{_uz%dW<H2 㗥$%K4 { z@ŰRȊxt,g,]?k7Wr3 K SRGF 9ңѠP>6NNaYb C麁khsE sa=l%E2HaVUW]uLwqM.wͤ)I!l̚.ts7g]d 6l+y8/V$*\̚^U?77ܶAf8-35Dyݐ$Lw ?J(Wki<:DU˄}{:SG̡^>~7eG|$eHFx7KhfWub.#2D  i90^ܸ r&*tP9Sm 4o;6_sy>̻Bݩd ڬqQ N5q8c$im(]Hr3U6_XWk8vye`D~s@FnF:&Qǝ6w^=UTmQbNl#I ׈Bep2KJ% )1ikSh}ҋ#|fWˉq5(LLwڴk5Y}HsCډ3R)n dA#=q!;SFx:Ŕ|=gP4NA'O E010mFkC@&BҘnKfnMlSJ6`JEndwMGw?~siC;(7XvO?4m!s& stE0p+qpCG6oG<LtosН2Q),\ .MIp%))aL]ku  _&8v.}+Dbkt|ё@+8GqRl*db!lm3& (N\lScyp>TUu zeh aD>LAo ? \X[LeQ*vǡO633ND _Q7~W=A* Rȯ7*Jz?Bv4 ٠"箏Gz,=c>j?b*e+ZTWٔq,+AW+)&?#-HxpJ݀J W_f7ԙYq?,VJdB B R Xd^)!fc0 :9'ӵkn$1(6*ICG5 k]SA/Q{%0=^?g0Yme𭭩t-qG/ظO\@ 2a2::ChnXof!ܸ^؏-R0wRKĵ|F%?*Rr5d vhʘW$CV+1I#ø2 @ /׆6^R{Mw"ɖbNqgEB]zl߉O+BJZH\ әyc)`F ttr*6RE5d>5O/[~C%$)!1R2,d)XʮP|"A봽C~B҉)Ӎq?5ސ*PTk# KCR㪂uuD T[0cg(刖(\J߭93sr@0"3fHL`A@[ifs"gS}\ug XS٧ho\!ЈMpaYx=Nj fœy% Eqߜ.} ] %>M&`.BKgO vz)ޕW복E AK,$0aN1mO8h-`5An=Q|R ۳ap;y&g "w~"LFE VYXN˷4ZzD^ZIGū~m N |f:,׌a|_歊X@Ҧ7KpK1]G3"IQˬͧQH 0(N?;SL2R( / kCj4^cbL^.ש}99 p lyD+ML-xO^D=]5}3tF x"ړ\+b0^mT _gWKo,;87 ʩlB15\YF Cx PY3͓? %~Uܒ>Yd0Dp N gՇbAoiQK4"v9p;đˢk)/CQ&I6G}zn wMc#JK$N.]&%L;0"ō‡ VS0H[〄d }'Trs%Q1<9 񖢊TA/U݃G"N@f/ "#Ғ1~GVEhmw

]3A}oa󝤴KB*xds7&0kq ci,\ rWB #dʚSp@]񻥞t.;{P{CIoʕE7C]VLtWPJr .y*"# dsؖLu6&vSǷN|+⃖c9tҺQ9bLŃ+'9uR]yɿz!<CZb:!<ՠ1, $f {n}S9MO ʖ"ٳM10I6VRMemI\MHj tl&ZaHq( JF3ވ~Ϋ0$mXLx#IFaHBu{q)@c vR[]Ǡ,:U#3CE^.5zb1&\oi9UG1"cfS-q5IsL BR ,]DZFĐ(v@2 k>þ,تP>@t|<Ő>u&m?t$Q Վ~^o +J6 e-gA͖y{*}9sjOI3,P_!xh9:#|$F=-'[t39zڃEK@& c3<  z1xzNtUȬQA)]WovNq};E qs];MtOxfy^(W w?Ofed7S~kUUa"#TV":iXzm wMY"#c>WhHkR~Tj2~p§~KA~/OOݏ? 6H!{En"pQ췣X/[k#!}+7Hk+V+\g"y}\eGį])Q2U'~>o# `S/'lM ]sHg$Vߍ꽓{^msq;ʬf! N&'@nT%f ;  =gK2 EgtN\ `oq d1E*(,&")̺ `p/ثoQ_mבQv$_ {$O.݅j rY5=+{~Kk>7?0p dOl.4&PJ lFSut1 )LCJ?JHq&QM;^|FNዳaAq㯗JI P{߭sX=T[7!$d$RD2 74рG;j1AO^ěT` kF)z5g$d=iҜT ToI& LM'̦ンakYil*#c,$df>cQ; ؕ:BR!a:?m{{OJ1h GT5Z @Q5Glb5V,PHWGn_?giRMO9I QsqV~N܈|S ©=W%x/Sۡޯb"5|R̫qf71D>4ʤ Q-nVu<,U\lڷH~lj &fU`xLVamuO3k-\_i4YH+M|uk9!ԶKC5ݬԌ*Wr,Eo2~n?MVZœ Mb7&J h]AyNy1Ajr4kuNuJ GiM=I|'Kdto^7o=]~ZN߁!U.R Q]_r^NaOiΜ:H} |8 64N/2.y;6EiǕD&KK]- "Br>d*6\hvlj -,m1MC4T  u/WqޥY!M43Fd2N'6'lf,Ӊ3sO Ұ>Dj<ա>KY IIƛl?uz5;=0Ǻ? w^JO2y-!wReA n,UgsރUd5m%:r%L[[y D܎_DQCJXFjQm)1\ffDZKO7`guf 6_r4|/1p8ي1bS:¹x̊;ɡ[mUu:U4Ru!`of荬jv:ؖRu!WqY8$9p!^8~.>vUDT _lF{LiYyPy//%GHfP\wD́?f\*i.Mi7 (cCGxQKruOH$e;o|ClpqpE)0FP)ts; 21"$%n\uXStd0MX#J.`@ r`Ys&Vm9 N݁qQhxwf0ՂH|1Ut9:9&0DwKc6cʷcq[qqdJfLYj79V_XBLƮiu}R dCΤb4b/JZQ8~#ՙI շ{!X^%bR%clP,L8bJ{!'a@On!,<.+L*H!nzP3pF,|65 Ǯ'ǻ[5 ^n|u-Pxp@?a& 5ZeB[HR 1KjofRl2'IgS`$KCñn N POuQ1HZ>Ǯ{l76|.P/nwU 8銟/>D|ɺE(AoW\Y Er+⢱?Iq%w#!˦h\`2&V Gdd4_{ݡ !B$ikqaki x7ҊދjJ SV;qi`8I&9c2{-if֒ * ]NPW/t"8b[&ίP!Ed Z8XIvo`3D;'!ֲɸ0#r_ Jga҇&`p⪨ߩψV#iR麂ӓ`ɿ6@R)Z?Ueǹ HۗROYB9] A/ wEaYhq@Wh|_ӭT TvlWwWNVV&,*Zȃnj, i_×hfϦrsτvwc#WtJV#h#E'$ݐNjiJsL,f/ IunVTh&D[XQnVGeoQ?Z⎠V ]?ِ_5'yMf ?BP- (-Te} Bj7Ai73YvҦk=NI>$a7]B "&q*5J4VmJ%I Y6W z8E8$9 n68숞IC9162DG0O+ܪ^P^^5RmJb1 -mUE)XD6:C6Q-1&B,L/ !eRGm>dKB=Avy9useph [@e8؇A?i^R?<ݻ=떓Y/({'530_vA~9VA1E4Lw]Sˈ=) okq',C~{X8{ @p}m ٟ`#yqk]bfL`FGt*6@'y˄yȵm6A3<&:Wj"$Lfa9RrͫHz^HZX⪶Ε/hvg2N>;z^m[U:1 B|hSV_|lb|n rNE`/EvF#~Bl>5N}u)ꨌ% Oja# -r}Q@v2ʑe}L)lQ_h2'59a~I'vǺLL5fEn4 Î@wܗ3{ύſnP+w?ӖGc 5W[G)np"$ PmISrȴ hc1be9ŎO5.kyТ1TgNM Ł밚nO8 %5$1444(xS]LM 7Trf'\Ke$K(`oQvf0yckEIl3p!=Ab;_( 'z,>Fto甇! eOOL3LuePAu1& #F41 Fk 0c+Q%4TZ0"7L>zctJhv/B.,gPc1uy`="P_` ]6;ӅHOt/95bd"年N"2;KNc3#xw}ղXnI;TˢF>$_])u qVW+Dֵ4u=JcAHX8RJUXW/L.U6Q!jel X1P0}HǴU]VG7F%goѱd ?P˝ uo\HTnߧ7" ) % WR OKjvKf}(;M^Ĝ;t"z2ƪEB+f[r~3aTUp^fz0Ay Xep̓)_t\%lQNe>~9[SYsNF kܱQ^{<}IIL兵i>9 Cejz&710Id!E:Y_a|+JhCݍh"`Y Ug]x$z{eC{3:l%.{A<L0_/ t/% t]kJJegeM.`/pWIa^2~uT܆T@7vUosV<)jjGJxߌH 5=jQj~u\rc<ӧND̄,K([MWL& d~r 5J֛ z+YN5%?S;sn̈CzVGPϨ^دn&ӝʪ8upHW__-uhM7p3oZ.RvK=ی:wFj-o4o(4q!Q`-;&:ѭNLA D!9ǷwE;ʢ?uϋs:44!΂OWҽ"]J~Ga3ܵyu'er:!jYyG¤ 9,]faѠ 7^y/}Xu^.D<Ȯ8l-vf?C"zʪ)_\-}a<Q)e\'ɶkkR|tUEa1Q}T I3§# HBijBز=Mj8> p+B mdu1oa nvJ+n'\f&2V34xT#f(> ILC`-` +lE Zp?]dI>nKC9/ d8gdށ*n1(hO-ZKrw]SЋeh +y4J1PQBdEC j^HZQyَgY/70j lWV Yk|Iqdz4BAZU&%imsr'`Qb5w%LtJΤZ䖿Fj }+˝mPǃHރ_6x=4 q.Q~z y@/ݔ)@ Z+QxXx۷gn )狟N[/[R$(7q|͉0#6}Jrgd7taOG ؅شSfP'ea [~L:֯cƻFepWO޲8ArfMpzwn lh=B$iU)4W+az7v Nv:Un*! ߌ ?k _த QO|\}a!8-tGK#eCܴO+[p0xR=h. %3MF5V*ŧL-.(/9?GFjo$*1p,-[[* >o?_UDPXd1Jn9Ş+WarN4s/$jS_DJz$&R~D?e0OiF!ˣiuvZÐ,D)52'3> "(@`șYU4d= [%Hng{B 8CD'J:i !;@nz<*AU?̱\q~_Y~8\5,37ce4="᠃ 2 4n;1`w:cmaWӶNE]rv)Gq@b<PdCC_1y <%mMSV wZ3櫒qI6,Ge'G !W6T-OUPq˧0}nR,9m7rQ={S@ 91*HI?Ϋ|I 7 (Ǣ# 55!1t{kJO|Sj}'T,xWl! M J=߽v~ݘ7\e-D]-e`j:}Ltz8 ~BuNp%~|BUuDqJT87p@Q^+{J__Pr6б ݋5Z83C$ PtB\re\cxgg1\x0W^fRuR]ù-Hǝ)].  ](yyNm ><0jʽw*C>-݌RZ UA &~66EHiYߡ"3^0.ANUC\_I"K=G!γkܿ!f #Sn@Ѐ 7LM+Mp6`vI=gL# I@D W~Q6͑}TiƄv;$>%"oַ` QP 8I͘ny>unQ"w1ٌ0+ӹ_O+qXgtu!ϤϾz{K _b{wP5OdJ+kya}2W5$i e%kSA-g*%ci/IݓIOZh{^2֓Fp2~٦D{7ٖ|^hfd[<ڏ%bA@[zCELb0 g>2Z$[8Suip`lVV?$_r Ԉ[C|\ Ex1],`n w|^֝"uTڼ y1*]#T3WhvzV-*5 zg:WΗM')IeJr`T1N}ӡfyKRfN`Ph*.)nޫ(ExLmG<!-w]f4c> H|(sZ[U3(\#LlXjtUfю߭BDg@:)q= ɭ`T2.rKF7'q?HzxrLcz:8{ sQWE˶_{y#لrLw?y3/c%R5EW;H)uрG w)(P--)ljxѤW0m틕 0~.@`"|*s4oH'qZR_>u܌S +~QZ Azn`FaFOQpE0  M(@oSVsb@C|uڐ z3|RCE[@`_VU*E/10:x jYz[@Ճ oKӢ;1Aex~L /H/f;$7 `ƙ9`A?r~Laz8H"X",OcG.ZMdiRk z0l{-՜Ӆlm(s i 6@^=Ќ *.Fյ)RjRW[x6t!FmA\]T$8Tq)f˧?SQם5UJn0<>5b#dtK0,OJ1ܺUcX,B*.7ʸ!+`~ |%q`f٩ F+hū11%ZQ%X_ױ͛)e.$.úO @?P?cکa}^QkVz@87z- 2ZibӑďaوfAzq -uGh8YYL)qюm 6 Y",!^hz70zȄCjYՐmҷ1Q8a_P_~'!{SG)x` :w$. iI'W~ 9 i՟vX"9q2FA\%L*zWIWS* p8V2}@u# .BEYM%(í"c eg[r"6͸RPM2底RJ|T(./9޻O@,Sf#Vq4sq%u!Ewsi3KXgDw/!9|G=3x3Mt F#| $_U8.6bZXp`$wUF۟a2^ ׼o ?SE(pŊ_J(h,X#a4m=zU1Ko-QN6 Q#>BCÕxx{{Yw7P$A|}7~ ZGLt=ѝxGb$c䶲3d :*W`s2'.4 4da]_8Tݏ ɸ^1պ^c\,w_Hq+%ⵙ ..+qN6"=Ybl\! f NAW.|.wBD a~|8:53R|˺ܠkpv"{_#| Y92%C|C\ڻg:3𼄏m]6O&k|QaP#ǎGQ6;CBwaN@2L7"l.Zɷ`5Լ\awqQ : >Z„md s459p)΁zo."b-+NN^L!:FZ\l >۠qn$2[g+LUɉ`ܺNQB"yռV+WV.wzy\YZ6\gG)kVjO)iIMch0*ϲ b!&ɒw(ܬ$zM1؊$33,'LvP~x+C(܈6?<%Lg13+,0ę?1xrqluT hacVϦjrLV79EDzS S"y&l6AkNH`aX[t;kmߪe.#+{?7l7H 6g+gmC_ծ4'Z,. ߤIG{_kY]q&֕AJ2Ǽ\sKE#W$`6D>]~TB'3O"2$zn.I|Hp?5O%wB: *В^E^]#wFcne;"F Q!jFxb9L&wKb@Ml>(ĩ6 {L9ryZ]r--vVq09u";fx\>G<˒NJԋ4o|fN觫 wN9g@J+~vʺ=X/ZOy6ևj\#BbNԳ^[)7-,BHμn{~GqnT4v&:t Ur91V*DБ(7wEd˘:3P *(]Ҳob%&&F3Wz{P`E[.e;Yz v 2өbe/O寃>sœWoYDP7KEPgGvX!Ҫ7JmykIR4JHX8R.zcnɮ,'3 e/ɀL%sm91C#L.;d[[=;1 k7\mF\IΰnB y*=֬E&FX8ElATIAhLk3~+E\:f~S('9;g:~&ܤlVpWIo)g =mB  5Z҆,9`?k^^2չ~e/Y]{Dy(#Ňn&L\H2=ӆ.lkKV,5㼫KϚ']ݟPK0WrELIb9f3=}ZYh6; 4;lS.n RmMDzNQ+6B?hj42t,m+T/heվ[EbS=r7ZDȅ/*GyJ^+-Ot{v6Ic]7SsÒ,F\x8mićvIP*yVqvDNw$6/HWI, h_hK~ܒ:5[O[ 1U]ȹCB),Neo9P%F S@$iEGލ]+%מ >~hN[YZ"d=r$X5KxOI9(PJ:>y 0Qt'Dwݾ>xKAr{mOLFuabo|Y_RupgEW%z2bo=,hg2ӑ!=_O AuI Re0"Z*)DN,ibw GDe}$ǔ!]U䞜1`lYML\O^'MP"DAQmDrs6 L{ i2q̬ԜUts]B:9SDk뗀FA:KR`epA{ac+?KZ ^HojB=p@j*\43 /B,g \m(fzSm͵ph'X6u8ieN$"@6o`KYڻV/Xu!y嵪Ħh;)u٘. &}J8lYx9tyPF);s R+rbbo-+j;ʔ~ +P?bto.9>[3i8zsqHLQ୸~1n9Df?n!;_S-.ŀ0XP!,RƶyS T+)5̺1Nzo"*ќ 12VI*]*O/=XewXǖqM]%ᅚJЋۻs '!Y+yc}M'yDI 94["h'(|/IÎKڑaNl:s%{sr=>M[]aɿe=s-Z dU yRKqH\ɕJjFcʩQ֨LAt&cXZŸ*q?9ZAiDܘjuCWELYfh _ߝG'5qaˎ󝡯7 m&&q@com&ig9 VwMkjcL$ݭ1^GxLx=,7VGp HZSܿ`Wc!Q| x#!~~#k  )R;@W^dNгGDT9,t(f,SW KI?b@_>Ԁ' f YOR& -x|>ТqҘb$7ɿfx[U͋S {g}xwH\B5GU2\E+!Nc[Bߙ"Jfw_ aA i8e"ȜPx5+\΃T) L .t2 ;8?N$hDLC'$T+A5V N/0|\T5!QL:^ -p-OM?9ULkފ|Վ\cP(A3}nO gHHW6$J 4p]B -},SaqVS+ {V3K( -UE*69W%0թ0? <هý)Exqf#/-d/oFVq:8Δ?q/PZ 5t>9)' -nBhk*kz`+Nלӳp|twx2IgC#ŸK_N\W[a9=K@+j~Ӄ=MO8O]_?'I8+{o5^377없+~lƈ,c`/}4-o{~ϖagfOHUH ֔2 $N\'Bb%}?&^uQ1PvhB菾VELj iA郦*}u>7^eMO-/S\$/DԆUd(>J?5z;JE8Lυc탖_㩄&?~'"%(Sg!NQcY)-tJr0Քko42`o9"Wi u,fዖM:]'aKʈĹYFnv_K7>O},n3-*m!bC_v2DwHGEbC_-_܊Ub3#5Mv?oИuH4'Y*YЩH5=I3!9"yE6X;_M2ir,bsuC{ ƹ;Γ :aQ^m̼r{i碞\gW}o 9162BBP4$ B}k/.O˕s5W$YBBt~-IY-Oѓbi|77--/~rZw[i^W qgy]brS^#M[,/ B(gFDB_,"|HDkfbǷu! G#Bzf곰ȘZ}'F˧PA4jX@٩U} ,[ <*dd%S C7AVX} AI[pdS&UϮܷLOu>][T%,OW0YnEWZ  QH!i Dms[.7Y) DںZt%:rL\ ӵZs]AwpXU?rЈg]~L)(ݠCCmm5 x;s'WD߲ 83W"MDVƪ2Tq r~Pe@ABηT`ᩞ-th(ۙ ԟ^ܲ,>o/nR+OV<;,"@v tFa EHˡ>QsWg'C8';`F&,|7Co5+0ohU Z{ܑ d>U:ЖtqOf,X\܈)S^WK%J5L4 p$Zƿ[hN0nOc?W[`Q02m_so?Yn0gu% sڻrSL:x)Ë*+ q nilCRaӡ[}wJs䰭pހ>K˕0!](K+iB5nvZN$K_|0K6Wluϵձ #]ƛFvkPm˔^kf B=?$Ċ6#Ķ& PdJNhi;6r\4t!xTIǂģ&8CZ>Тx1IOkErxa%אk\lL^>VJTxmJAGd-8,Fo(㕵r!Y}{r%3et!$cm,Y2DP4~t+EI;b\6sVmdƎD\%khˑ(H"%F}D3:QWɓ } |,>'U9r ._DBv}.@]PG Qb7殥Qt`=JnEVZBK#{?O>g,0Qjo@Mt}@o6#9)> Y.q >+G8?!p2#0Ĺ »ްqd$osMP8$=-qDZ!`@0Do7=PWa_c[y^YgW-0n;jᔝA0I0 ɩw~8D~VB&ғpAX-A&ujJn8z.1swc)?a_~U,7'׭VHGבlNgۅ4e\*@u<"o0$9'f%dso׻-h]{O4-P 0Ruy!k.Z[Wnڝɕϡt4݂> aXY{*U :WOFn olcr^#@纪X$Ʈʂt ]t\/sțYa9:xAW+AO]I"\%_*dXwiOU=h# <Ф`%7:/C G\~E}J҈ulu9E!;ş^/(.p`&oي C܄M#K"g*;4 kpKʨ\<.knt#ij䎨*41‘2as=d3#kc9?>6{3nW32qV[ sA7 dvI[(W$֐|ΛޒC&KSvj{/3^D5pkN(+R/pr9<u;KYU)&LbBPRY, I9wNl8E6x8)V~xo ~PXHRa] @Z,u69m5hK=L6]j |+"i6WPop|a(voyM) U/Xd|;vT]S]̂URa?5WD@⑾FqR'֟҉3ttGBV)X_p@KM~C u<2G  0!|;<%L[+>pYAx;Wiq0xN*{VZt%]e߆nY-=>|ɒb|mܩ`5Xճl]ͫ|Lx_kvA,mzVSzo,0씢x~۾d/ t_&s]@6Ux1ri6ѴDUBoo$zY/ҵ{PkyA \Ch 0=_߹:Hwr̢!@#"I(jJPئLoW~ @?S7mȾj_ c+mG?X7EVA,|{xki.-z^1pͣUψlL,H[{Ǔ,Рa;3qIJ%HOn)нKxZ"Վa{k0(S'~;H3Gc{3<dxe ɻ=Ę+#9}/uG ? nG(0zfC9xȋfirJ||2-aJB6 ⢥0Ge6+ 4\PR6$f-&22)' !ՔDG l;}'Rs38!5VErQU59$+p2T+d#˼CM+IsH%˧3VFp_c|@z)2^8g`V~z򪕤B[k2N,l'GY91I !0zB\_k/i*$Kojuzj@0sqGhkSޫQoQQ}JB윢qHu]Eل~u*da]aC%rf?U[#OM0g!+?n v:eS22ԑca\LJ6,*('Y /,{eØCVvb_yV# pS ^g@~HSY!ڴksFʤշ5AI&S9(# -*SfXAS'8bn2O'D22Uy+nqa+o+CՐmZɅT^<+ݪ)/*B [?G dL{gjQ}Eo}5sofWwz.ۅk(=)\}lM_RwT(Vj(/Qa\hs ,q$1lQ{#Ѽq I'pv CWdR[3XFAJX6AE@TI2-ɟj7nmCebXЃOejR> t8a@2aTB ,eU'{Z@,ۺ*H0t$*ǖ`x@9$^79 + x1Aoq8J~XWOgy>_%NMfCq5"T4SMW+Ssfjv<¶V1w q+XR&t]ZȄ3J-G%䵻g~[믕c ~%+}@P{ D1c.|҉R3`ie~p_q\"VƱ{7)+pa~c%,KHwcsک 4Kiԝ %k(-C&4Oׁ,(\&K;  ^* b"tt04SSmFBXkc88OkYMC ahLls61C$CZb=LvXPyZX(C;Тih|PEbr#'%}VǺڲ&A5$}ŜToQ{\#.5^Mȯ' 'N'NA!ov%~GFݯvh` ox,Fgܙ/ҋsa?pEL)ui(G BK ۞W eyDq8[<# P糠j <﵀^iI7Hw&vsy3GP.mUꨁjIvwDbZ$31 &oY҇RNB=P]p=p(֩v_Ot+ 6ẹi|Sl=?4p Ѣ W U߽'"IF$qGyhmk.9:E}85Ϊ\eWJ]:QNcj_q@#m0ܽɺڤ;ߩg]Pt͞=6/.,΀ EKۘKAتP~ڐy u #O2TG? M?l2 9ߙuc3&kѳ6XHsnk'p`&`oOʼٿys "6U**?İÂɁ}6AChVOFW`=H` 0iAHS ́v3k.E1*} b]x6qY L6=9yJ@M뭮]>ٛo)SHf:mG0b[16!v2` G֯?} ׇ$W1_A ^em;/Ϸ0TKL:ϳ0C'C3:o{%kw<=79a-`^jс0<[s+,_T޿Av c-t Ci8ZfW6 i4mmנXδXPݑ𛪪:YQR07:(gtۘl5,#[IVlN/w1F uZ"yFElw 8^hjD&'\9|BN21fu vI 7T ;Or3?B1 ۃYF߸Ci.~y.*RK=hR,Zlϫ5 FhPY5#) _h"ceSt ns韤hvjK9*OV(8BŊ[AzF)$OqYs]ϛ,rdv|d #]_zVt@ in> .֙䏡cv !o_f H"W>-`DmH[z(ϗO*,:È%!pN\|.Ff(u c^׏!]x;}ӺU@kpvѳƨGa))@m1` ʻpf#l1mchQ9Y`me?K\-T9b1[riѮ#nEUK*SLSBAwڶu{W r 6a{ <9O2~œ9-,9P,ڦ9(5u^(Զ Јm*솮S>ةWp]t0dQK!?JIh?wrKTBj_xbWb5)/ @(d>,ͼU$!=Ν{](5 n*NGS9gbbE HV>:?U$_Qmdg 1+(fd~D77Zt/ZcIwc2Jzfs?&XS{͞w^a?cs:>0jOenFȉ6ihkA>$n&lTcȩMTb?y[1'ܝvLKHO# [iP=^JLY5iy&IF(^8^sQqzϬ̥5>G⌆.N[D̜a.Ϻ奯pWjy N^'h2Q6zXifaY ǒ\8CTH 1ngG6J7(~~r*Wc:v''^ZFMu#I۽Jw%(.(J%/E`=Ux+1@AX-a|! !'0㮱C߲:fyUmk~; ~8i zh(GD[azytuĕf`:#$j]OɕTǐ.>UTYmNJVPjMХ{m~fuQɗ:X~ٲ`ܙ6Xze-Xc%Iy8t\=O`:Io90dB 0-{!گ{w sV _v:[>9Eo 6#eG=䃼oJfI2̀5~c]17?W\ 91S "P:2dRM8˺i%]JI_l|3 HY2>ܛXHjtr#X~Z>Oo)'VZFc(\('&~qy:%qJdpܨf}mV"i*,5K!9( ˝S2VcR<ir>lMp}R utj0V%FKH. iD2s`˜xD_jB_N CVB !xf!g|{ @K>'."rK8d%n~.IE2Eohl#F;Pi :h)}y*i툑;\^Z,+vicM24+٧r 'ƣ  +#Q X[ TN/Yzc)=cuHhBI !4nJl_vHHЕkž5mh@'O& ARLQB L+!u[oc-iDϫTlp*k,@=AuHы4p5)Q6V݁?EV]_g"F*#nS cY'{Cb'8 [@2 L:/O\.Km'<:t<^W֮a"@X?,uL<үf(&SPE %"8KXOn[a<,keKDcrTAWiձb'[@gFId}8, LLӮ}L)4!"qY7F#^Yp6b.M9lw/Ip[jScȘ(lW(z 1(I1zR}L ش~VaݚL"'c[~≑.,s\|YÛrb_b_=wκ /L}mkdc >>"2>Vo<{3`0"3(cWmkNwĥX~e, F˿8^V" ETM|IJQ!ʣ|UkO6k D|TKZXB"98b!}@1>$HK@98LJ؛z5:u_%fTa>.7$p+DdA$v奝:gJQ$#<* #?ʢ&lXs꫅4:.FHiQݵڢSsO@%Q{5ɫX"3o1Mu5;-c9OW/5(2U5\2*yiq;dxYZV~P]JzH7s~񇽐ax' е'е(˕N;Xi$}0vcYjWQ`nX \W7  AV%OJ&GOˉ_Y)/+dH k*ē\xQ)]xĿN V5F,ry/ w^]xQt٪u&)*pv괒pR@9'#qFmVf;RxΒ2+GbIH]J 3c9w&m!'c^sml) 6mh%-N#I^mnLٓDk{Р*>BBI|/(}.g"uq[U.1lؒ|f=`s"OF%{Ʀ=.@CKR4bt' ޽v0;w`wkn90;C/r.%@Ҫ.(˪굑[ GxtLDrM׬]Ὰ48Fջl T2vf`mglZi {u IB\RcrFYݏopל^࠵t_Jdi]W!Vy3Xzb7\$@St2%2`|WA[^*^M28LaghrA/tٗjePһa^%h`[.[ʍ]a!ƍ‘Wk{P<<ܟLYr RS3#4^)ҒC; OI5d}-Z!H>!|c}L~:9P`BVVJ{`jvl͕Н%#osQ,"c)SY3)J'q*1 KQjlJ_+564efUWA,܌҂(~Vp+F*Y ֲG fNBpR/E=( Sp{O1{ us`K"0pɏG='.]icj#gKJHn ^SFzC61mh Wֲwf7i.;^5,I_@m*Gj铅E4ڙwOMIބ咔9h[/zD8 ٥ NB%j͖E=2܏smyAn ؠmB_qyvPjmT~=l4r],gcwu!-J CnIRdi;>k6J4DҩJb. ,B^.NQR ه.pu9KBo KIoaS{bcx<5QdHfDVUڧ+Z)D`s`<4r R®ElLQȂ$/EߜJ)Z/J`! ӥ GAr Z0juW r89 <]H=!E PKۥɳ ד4<3i^I&XϦ/%Yz^M;PzZ[nMt t`cg4O Ty/_+ӣ9癫 𝵒Z4,ņvj.ST t3D(*Uo/|8(&+*jgohҒږ/D_«T*S Ϛ$SV=S^>5%JoپXBƞLu4p4+Rq)N"zmMKGDbT>ibcY:m!W@q_bѻX?3%EO5[!/HVK> 18i> rk&~J;"^0\Õf>kxQs>nν-%q"9jlB^o+x9 PCxTyi~ZH{Ѹ5rE}gW}~NV@HhU9bm'ݴ ;QX(ZDUnN!Ɔ6?,ZeNɱ綱 #0 :$9lXŁykg@@4>RlyQR-9P2v3,ZY%9F7y H{a=TaI|C ~{ CJ;teˏ~ p$?m?PУwF  (Փ h 2 O|_1kl1A*F)摣Z ?ū# ^`0f^: /'\KPF ޺```\hHaґ8E8ʽX+Iل%NhsA#IJՎCtY oH@b {`$4Xd.BWҵޒ܊E׆MT2GųdokvfelwuApx!MztP>LO㜿Ay$'oV<> 4Q9VruC\G+Xo[FѯcvxL;Ԓ۬/(ZctMI/9"&y>ioӚJr&""zLX%o̱tƷZrp:pؼ[HTxUy/[\GoM:#weL޿ c*أ7^({+fDx Lk7a7h~ S1{wλ~D $ϋI \7M]^<@%zO׊'д4RO'^ ;{E: ̈:@ʌz=p;Gw67qϰ|Y.48D%V9Dp $w_ i؜e;SjtaA. 7Oj9%i1PGw+lYp|KP%Wb?stXnІFAE^κѭMq=^rjp7OW..o˒?6Nh#ImO`!t'?YgP(1d0(+I9Ls& Wba6n8!v\uCXDzG&J0!ZzWzỸCtkbTz&$QDlf8\C^j\)N8g}Fۇ~GW=]^s1eh5RI/p"^,h]»*i5~zsmI(LksnٞW̝f6}M+; USedKjNAyw M)»_A)hjh8iLVS_ OMS!˔AR{O=i#K#"sWڕqYV0ܶ¼N`2 q_o7(PЯ1VCf*tw1z -uUHڶ1+b>fx5Z`zz99gO7w&(sgA1A98<O u+V+_G諭)Xp1N\ w^K+7wnqycSHWB(KjSA|@5#ʮ벸ɡ.й'Z6geZQq]h6%~tA#󤴈2yH%ҸLz'RO Fe, 8n;UrUtM4cIc?mHa i% b C 0hZj5Y0hV/%sӴ"]tCA #*L \~UmQ >{A<׎QY&mId&=Ҿ͌wU~Wjo`鰢%+ONdG&\8Dy'˔Lׯ일Pf|~n:ض ٵl4)$c޻RBۢ_3$&T9\CsWUVkҎYԄ^I2RHաTTYg)vj#zvdQq艡U;oszQGӽ'\ ķO2&Xy"}a7IҨ3/mRݾȁ^;V]8fdj>*`ay5s F4$:0r9f5r*~{61sJKK >[0VW7c,R4R,,O`H^ReL0}3M|B#8K%vqŘoet8MMHm[cnWB&s*N[ywX }"a1Za\6ՏrW2o+-N@W#ĵG*UH=ŚR5J%'*n$_˅$r *<(9?&Wxxy ~Z,bΒ\gdLȶۺQ"co!9e}ʟhUOxc$*CL6:H ѻOXyW\O2ad挙+X. Bv dx YJ~'NۙwH[ F3rGOW PxLj3f,X#*5CgHsEpN.!{kvmɩvp l_).9搴]A"4S}9MO4Ն=uCMK:.7sytq~XfִYšch47|Q+-奒pd*+g`y`y{3:R R쒶I>] 䩌^بH(}'A f4 x=Dv:[G}aw5͂3K-F1n; E}wjtcE۟:ysE3Z\ae> {'MkQ q|eׅQ8|vZŻ%4,"x ;B?WǑ,#*N)$VxCѓtJG .C A6MVnPii -$gM?n`XОPv~5^7;+:/5ƒHCt~T}ڪ۹wZT9kOuONrC3<63:д,d'A)|G/eg'&fPtw.sxRnM%uZVfch73.̔cG3& e2O^ ex{UwS7^wиw%/'6h*U,OL2YzOVȶnH:>n<^H>c;whǴRm-k͏ 6&?oj ڵTX\rA޽ے_ /Y6=uKRp -X2WVnOwy]JؾC5T ϶ 7yRVF&U  }Vb(=|^O_TZ, =E2jo0i<\(fgp(T1 κ8dnϖȓd!29)ۆ 9CAEGHBW5hƷ0C'F˓0d^zO.T^G9cKl"qI69U\R[f)jIJ16Ds;ֿމޜ A=2*q{<<3:m @Tik7,ig&g̠&͵.^"/>X+M{h ;H{E/.ޛr%SΛϖEu_Iቇ[#t q☉3 -m:Xhd!rIoUn\RXaLZMsl%MJtC(5OlKaby`~cI-IPԇىDp ;Sy샒;朷}ɬ9DO!dH1?n(&QW}S]6q@V7 I }Em-ݬ)K$Aw%N\k#Nw]Eh*. Y1o_m\ЕckLe`HRˁU{:-3ýzs MU"tB^H*$,84ԌQx>t=t=}^vL&+5%ΛrC)po/ޏ+c7[21x>XLM)VgNDN[rYNc #kbi]SQʪ95S. !_YpƊ <2+MAk䛏+j#8; ##kSlλF5| A6D8>vsC*B/:yKyZ2iXe5ߏ 5T*nbvQƭ5mL Nl&9Y(А!/}HZYcBSox^SG!s>3@1=t |Lŷw[p,ۧaGpɅ3Gk5= ^91D"иQ]ek.f+EKdl],Ä1*15s1É4*Hggj&=L0;s^ζIos²*Ҙ_k=kܼL͘^q+V{ڼF+OH;KbqCk@J7UR?]ѕ)26]5@p_@4aʻ]R'Rz@eqϸO87"0JPebiA5v|.TNj`)[>`pA^LM-PIDeL)@J@oV>Cc+\WY::u' A *܋)>%CZˆmRh,$V{hH/u*&;z퀿kCl6/=&aVhvkp? ;s8:EϓTDCkv:}a}ON:w yb0O˞NdrcTqKF[U.RnreXo+X~cٜj$ ߂^!ᒷ fTbwC}67=pt\{@^g%1T$gޮ_{ 𡓅fh}}<B1俏΃F@2Q&/w;UUܫy>M ׻P 6&8Ȟ4]?Jb.!6%v G'rۨ4s U،GX}>B4?1%r< ք)(BD,ݠW ]0*5L1:|B(dFN-}?eXhԅhMZ8 ,mnˡ_|6]e$No};bzh9dؽȡ0 ;Enc^,~v6 #q0fDd}ȓomʙևjLwl?Yy{/Vj<,A ɭݽp1u[ur+U4cu~h@`,},Iц!.i>tW*B\e#kD)(ͪB":d 4DԆݣP\*:i_m%E|!"tYc\!-/]?P_؂~7fj5aei&CLn!:NO=})7v=8S!l( SqS-hb?Pf}+/Ny> hu[i+5@fML}|^BIm2 6A lZXBIQ.Qj;E`_Eb0~3ZI. DrW ZDl K+niW jWd `_;xLYt&a:.kT`{7úOrߩp Z.'\3&e'H㩣Hh`;hӵy?}v3 ])w\,"z`1R l3T{U_,0mrY.NcK5},rZ ⥂vQe-JCdRBa7NKl#s :I<y : ?oFIw}o {JA /#_@Szv[SuՍl'v5[`gۮF2 ,IJFý2) h2 ,j2W֝UVZ8Ad)5HqXI{E$To=\SC V/O.ȂL+Q0kӺ$!#R$޸!w#'xc;jb|Wu[)'uA& yQ5>Ip+On'SX) OOl3>}qZ $NJ9ln F$EA9fis/?,<)Ą AA. lUA| UaH_x\[ <@6eaC̪5wE =&(9儗:n~"Ex`1US { VrNDİcРd &VsT!E h>#f"X5.HaDouFbGe2F@fϒB[ {BWFg(O -6Lc|x`pp @.#*FXEdq*Y)B̦kFU KO{-hXpZo?pB?VGʚç1%{C[- {~UIjgD,U]+zV݅YywE72 "LPy)h]7ǽkv,ǁ+ɘp7\vBQv큄w_i;Jsz\rIhb2R(s^ [6PccZN Zdm2 \UϹiM9ZU,{f32;BIQ,8-19J6V^sfuҞ FӦRѻrczt"X+8I+R({/Ȱg_6"bmmi%Mxu[hNpRl\g3:ۥy~]\ܚէlWos$ROt6z.S>.h5!Ĵg˶N H,hgN)$H :*X6T=z{hU D1FO.+B5W)2$/* ?Q9Lͨ\ ;hgv9r3p){6U TDrsb<,"|$ Ƣcg?HIgs,07wg  m; #(9s+y5w}cTa Cn5Î,lkm4p#$ayW-a4_BT"WZm/t=seiaݷE8 pZg<f^Q;ϟ 7BG)syv:EU \29B1nZW)%NV~^760@5Q&w[ņWN{j5ڟ܁q熻xI %Gͣ*J@Q6{l%qqQ~Y! 9NbЧ-= 7a~<ŭ|Ujfy+Y<ަV,hyr&@S:RԞz]U0+zM^ex4 tʫ<:)yϪŕxAѭp&ξ, k9ٓ'Us,g2٭Ve桘Ҝ?۞g{k ɼzUn.g-&Q5l0_ ZY(`4Nb7┚'B=Q-۵}bp,p1"MQڈ49=:Σ;cl4Ps)S[Ѯj |.ayS 3%!Lj6V%u@hM `vbiG ` E>EVPTb9 $|]F7s(ԄGW&P!L)R9ɃAN:%&/44PDBזW 8 E 4`}8&u[INBJ9 靀\L[F8<2udB>9%}Z,fh!;9< (p 9lD/T\ܺkYRX?5\2Ja{LǦcoe3кpv~JO~-xcWU{<~@ծ[msA&B+0 [YS| H7} S)G5#CSH h ĠcX&+NRu? ;0$έSӎ K ;1L=+qw9i=O\h#qYyeA@KC|+χx$T98hwnh 7 o( y+L왎 #r_رAғi!&9|GO8R2/ykL4bת@+ͮz%U1PwsК0/În-cpͳ%`  m yqs.~,`b:-4zWR㳚`ِO_v-I\5lZ뢩'Kj֧+5zm^a޴^eoxaqlZed4BzM*ջa]L>P eCHCL`J rոʼ(#VOE: D(0VmVN5'Ƃ3YhikoStXZيG^c#^{K =N23EEz GV.p݂U Kk "  jyc^?PM^i ҃iI i).`} %͟)j$B](V35u0+%piv%ǸW20a^GObGCo=:i/R~s$e,*'Uy ZMQ3'>b~9ew[v]SQo K?Ʉ!@߬sy4,nNf5{pSϡ~ӂ#ih:gOZQuyPqA4a Q|w)Mw}=\>$ MRL!TDH}ºBAZx͚/8ha!#>C7yM6 c,Ί3Oηɧ2Lz4p$6?Z`~n7&b-@{4MȶiI~U."QD U4Ir)q I¥X hkSD'J){<\Esߓp%Uy,/DӡcbJ:9Z9:maE }MGQ,|ͬki$ }7]}jSaIƄTYY<溔]n\ȕ} g6~dx[ E|Jǂ/*S`JvzPk[BH%)-XZFǙ,?Qc23w{O ;7UR9 =oM:%I$m4H}HM=&/ ?EbBrU5Qr2 6A@ Sd"*,y8_?j \;!KWSVO< BoHtSQh|z11k /rX-?!#i^AzM($j8|QljC^{ͮKr$[ ++sv65,uE*9|*}heƍBIVG]}'#Q&醱Gy(;[gzHf5t[v'0#ѤW-Ygy2Mr&ћ@5EѹS TɾxgݺKewZLr#/df-$AdF۸V@4 x7ٝMQ!'JA)ҖLfDuڢ.Ԫֿ-d8 ,Uxƌ'%`Pfy+5X*z'%ӑҘ*b-;e,+;fhY1.!A|Sm%&K+2'6M?i(I?"~x.3~IuFtQjqF>IЃQ Z~knn,L] EMi@ pqZOH1=Beߘte|y0n*F- YH9]"tPdphqb/*۾Dԃ*wK6>v:a[`a* dIt2 0M꾠_D&:GݓwIA|po2 V.xrX=xdB:<]\0m΢$OE:3o"eM [trZݲVEpa:cwjc 6=R W^TY8.WNZ@P~HZH~UGiS}4LiCyUIC.6S,p @\U.=Z_+ ͓Jg) l NR: qH"$NԑiKaЭb)sJSϛ/ZQ3Һ窂 ?J7 ʀ I Ѱ!< ua/N(V¡.J_PTj C,,o/3`7D)Gl;l]RP+ynVc'oʯȝޖ?\xNfoipRa&e\j/9r5׳YlCԼԗk׶Ђd%gޏpZxXI5?ӱly ^Wq¥ȲxG:5ixte0a,Ӗ*4V G󼉽gR )sžq cFF㬟7&5#鞟\|$/B/[{ Ym[z-=h&T\߯zl UbU BPz76j"?4c03mxʨ./F}R}=rtunm+J`#dlz*3{IcK2APJҧ&:[͋(ce!_pʊl65Xڐ9wX**/7 ,a?J-ȍ1.brg`YtCl^NGm*o,'cF\ Qx04,꤈@Q`7rl3<'hD~كO?U;ÀHDwЯDoC*s}3fטy5˧Ezwsk*w8'tSkU$8EKsqzx6FPnMIŖqMMm̌2KZn֪A7LaӀ!1\ϸtH,Oo nJK| /-_>V܆%IY8R~J><9yםT( Ur~S-6^_(Y- |_OtYj t}Y, kⱢ,rЃ{|&ݹc/5q%#:%D9]n8<iޭ2T+;cIن*88 l!y>m_"Hݹ#) WrP5B۞wa*V=2ptT30츘ɯAIT1cih;$D@R*kP̅ly!_xphΖVdt !qzY1&/6 iyGD&6>Cґuytk&|z\-&$q]øg+W\5NpOPϤrZ괭DtTg-=pm؍w}ԌF?,mE c(Mk=4<{vEҟ pj`ڭ+[>(0߼]+' aiM[cU [($% x$R~ m[ç.VN68w Eh-\?#rk ӌ,@7mP蓍׿h&.DfuO6`MCF5!_xp3+* p79TE.\xʻb \"]IMvHON[IuոkHbD,"r5*q\1sLx6 Plpa5p90ԩ)wop #gPe9C\b~{e$Ō8c89H>*x 1i)@.yTfָ OA~E9N͞ MDQ%{> eHs-pS (zX{b)ށ},,FAq)rcLΦlJv?'O bB7 [=UnoQZY |˪)b1. m 9*V_} 0I̭"S΅QE R>ַwj"{)١ZϑI S\-Chޔ5Ċ%=0J9~g-CCZ.'IadUU($c"(OY|m*\r^sS-V}g'v u]TEi/N8{P,HݕrJPvz>u3S44ڕY:-= Xh+O gFa'Ke,)ٝ_|&MYic vB{W8Z)GI@xz2I﯋{ F/yT^'%X (6+Mc|,."zj#SQ21Bf]$Y߻ ݕ㑐02vaŪW#\P̼:L<}k_]ZYf[ksCl|X~.gV&S a(б{\j5$~Y`r+e%ѨM^.APsy.T b!&ڃD^^GU_?9Z(\>E⾨KN?7>V5[va.J)o~%ǃK%1JOG=-|lV?LbjL[QX>̘џd<e _Z"jYe*h$$^8ѓ|)|?>ÃW>@PƔ3>ZH]@O.,Lҽ >󚜋~͡ҴK=s2^j+j_ n#S'/޸ܹ>MT7v%S|qģca~zϹi>/K|$ [R&;bvN/.I >8Hҍz/̋Cf]ǖPS/}e 8Bfoa Qu_c/Vu7M0Z'[*C3=]_jjy,~^ϊ!$UG纵s 5h˼O43 5-'Q[^%H̔S*"K*rʨVN&$!%gC <l$y7̓1 :(y!YF?+ t=%T&:I7{B ~rZA c*mR 6hXE >T $#;)9&W=YQ+Xn`fz j<"91F2B`D i5V7*T'\׺@ j&e':\32<)S&;dPz|}IsA3PP^AsEgdh&:xA1Mzh' T~(XBCf &)_f"nyX)ZY*{U>S'}"x:~7ftYN Wİp/ysul/FIe}U+5⚈I(9:o$1XLMtB&BsFFr}Ėq;!zcésI³\+sE<]jc 6G 56 Qۃ013%>_inT @$|0z֦YQ@+;mH3&/ϏP=vB?W{O3wW|PNF?JFM5.]s8:vj$Б@ 916:BC興Ww%51#TZ8srqASè !>С(Ip !_W.4JszMJ JDIJDU k;DU構sL1B,4U٭=j]5х,_M"s1{7h1齘J2SD|ѥrx>QFMHARjVKWJi)IUְ|`!< vK**hУkxʗ73,82aݳ,,_I5PdK'25]EJ|>+GϢ W7߱_"!~m$)گot áг>A|WP`Y/ͪR.73_=|TB";ل!]ژ,ȒKgJʑ&?x3zHF=,wL;_4ҁۥPR[9%0=ž~qQc;0{ȱ1tǼێuɐr^DVlYžar# WG2 jAS)Pf ;nn>Af-O՗F<v&c2>Ö:qw6C]4K!n{`8υFd@ *ǰZiRZ T\,} iZJ-d'uXs`|Zk$ / ~ʛ:tE|'@W{5 D{Q@ъj)u~ fmwP S{Vu"DvB_!")PaDI<y yva 0儕5"ڔNQVL$߾3|R&PWڏ $W`Ml\W54Pef!+i;$Dy7>2>,e ^Gd +4[0ma1oE Vd0h!cՎ$#LX> xͻYE,-|%A15B4NHx0o!P-EGGb QH}]ݖm= /)'km5.k%M[k9MxnL$M^xGA{TltE`٢(h}5&1݇|͢_ BZ f0h[iNUr930 6iF)ڃs7HҬI$~"J%>$yv餚~V滩'x3O鏖.ٲe{_,uOQ- rRfLK>vۨ aC]ʧR4~ak89LQXp;e6r`| B}>2 @bo' i.V ya(ђ<Kj$|xƵA`Z䲩 O&,?sW^$Ɩ2$F$Ts bĈɂfdFWL]Kwa+5WWe!vLg=]DN}e$*) ,+C&++0JG˷=6ȡԊ$t8w14rI;_v*ݴ3̈<B0ilоML;sDÒ1V[t'mBGshuɢ tY`H'5ЛWKӠC^8%bmږ> *L_]OU!mLN-We \'ak~`.v†@`mZtrϮu*]ӄOZpFE~$ޚ: ~X?3%`p}+o"_,W"!J mTΉ-$(9|*׻G^9-Cҥ%oMfJBS[t$n;cm3qqϴR3ck?>7 |2 j|j;}T4㇗>~vU3ADADEKww eRP؈$чe0~s£%ac M`khl&gDe)IWO,l$'G#V$E_SM[Z5QKGTv46)5)>5gG7 Ʉ6*t;[~7]oɌǗn--=Ɠ^W `j]db}* 5_Pq2*OC7%RS+CNMg7uGPGH2d%Kuz9ᵢFSlw/P=9|aR"$8Sޣ%RW1:)(}y f1gY rSiK*z \ZyӏQId1wqݒ>Fs7+ f) U$J]5LQy"ԊKU yY{i=}*ڜ]EFkpzKɸ6nEDZ.8[@T `  Hτ_\t 薑9޵+PQbɧ(s?w>T==sw q/W^iV S7eQ3*,G`$W ߱r+H(^&+w-\)}W^q츶=7:syBL A%v#/E˄."}+K^!}H=f2c| aښZī߳ٙQǫ}'DQfͭOR2.`GxCO9qvx}S뢯CL#կvG 망 jjB`G]`fi8^U_U>-mWBz5 Z4k>ۭ/ W: |D]IeGTIBb&)%w3W#u4@sZ  ?@r`+PG߈Y"UYzKqb=>KXU5tB`a7WRJR䰖LEpMPn2yւ7G':&oޑZ]qwc+|@/*Q@@bfjolgdf{ P5eeء& K] Pj Pv&3muK$¯-vŪK{>HT~D{2ÉPqYT1$7Jo2й^jfIV(f_RbpWsZsY)uQȫ1ϥt槆 U &juB'w|"LzFGox9[@̈́Ϝ3m /-$6^U$9=-uJs͎*1Vk">3;k׃,>k؍rOT8Ӗ%g;h{>ؐ,m޵a5JNgGk&fQ0pzS~h+[5mB^a\o0;$`P.P.kYkUM[c(?Ռ QK^V5B&BF/)s' E,0bj4'{;r-t=JɁG\Ijo ^:7\3sO,s[l9e.NH=YKkX<s,5p2="Pw>GЕexCS?Ij;mroHqSd`sx0/B2odDΰ0Y{VaPPXs$O`!:`٫MMZ[H>/#0߶'h+}}5pĒX/z?D[f+2= {hcȥΆ\ ]P-Ǟݘ:}H#V*$YeU|RHEo%VS б4b2Wz=hOJU^,w\YJY˗)-@hDZ=s&)\$mQ5Ak%!|{ ouJql ]/)<X/ZqԅA􁸖@>rr!d|τY 3d,h& {[ ww`KYtm$ܢYNX\{$*K_R9_ۥw:ilyt~jM!;A:a"YJ0MI_nZMW/Ayz=g Շi}RZ*8A5KxI2 +0G[kv@^~eZ',ZI =@,ٺL41ZsmJEF9#'LjiJ|EG^4i0&z~Ƴ>*)t ꮚ.՜Gdgr?:t‡,dߜn|ǻ:m|](O݄~Y-AN%&!,|59r3 B :"qn ^"lpBׯE.o3HDDDs 2QcVR^L~Rgf"o\ҭUHWB?_ u%7 [ʂe鿲ͪ }͖w5@], 87r?MpwE1Pm& .X b L i&ǠDzjf% ^cVječWC?])IEF #r'Vodl2uB3R8L~j:aZ?+i5Y4uO J 8f4.(axgkC} k*uG'%3v| +,zp_jQawWHѮxAdoݰ|RKD$6M )%xa2Uc ED7b2~{~,at7|'ox[\W$憫^s.(y&4 8C2}Z rxw_ RL N)#mYm7P9*_ęS@ͩxw-\Tw>Y0s٠U(C =79L\^CH+X:zB苓?6mS&딸6\+[/<ؚm[ݸ됂Ќ! kFQdtäɄEm9) m[kmEd6Q9ݡO2,=_Fg ixs\=O IӑSS6>s! DjjKi _Ɓ>B*[XSHNI>茪 %ʿ ~s<zHK" pAxPV'x8腦e2d7&^Rl|s.l CL2_;erXBlyo}[=wC6>vm2}Xft+?!P5#ċ`PTF/x:M @Fg&ÎQ^Gu2NzMi|kS041'´]<(1yVKCDyILC}j9&"޴|>&T=JRvBSk,it42:YH ]jWzԙL$5.f;hIn@;&乳q@Gj\ [gSvoWMKB3CV &cدJ}3Eݘ 똡h-G|t'dfwԈ y%ōl}8"e^#ngcT/9lDqn%{tk8ǩCIga"{in(?~-ll^1 aUh1ʇ k xC'Ak}|.X<(HOHR%"bYp67޶r&ŕBzRz~9hevŐ$p?։LA=vCY٥8kj`y,_R s5w.3~ C݊vtH>c'Q==ș5,-ѯB@J1>;Өb..ÝZP9lrv}($ 3GU]'eO靟6p^k gXW5/ PSӛ17Ŧj]^a^ѷjp̻b"<*Ԛآ =0ʂP)wN6 !k`aoffl <4u[|Uкva3PWlL\-['lbª֫Z;Y[jP#-SmVQ5G*@<(-gFL7e3+kPlW9 +R~C4n!Euu'tCF2)j %&fe89@ k$|t~v,[(qF?ւ '!X %›91xF#.N_µf~"t.;MuГnl1d LɰyYL9Bdd‰dPwWU4>|[9N>%G9w\@Ѻ&`O(JE$1(9Bynw̍q!~ _ 8^mZ"bpZ߳{. U87~+WmU3`U *hqʺ)gM~V;'Zg уaydYs5ӯh9+ Έ~RUZB.ԝD~3]rEP/MIԼ{c+ cQ^Ut QK͠IV˥a.fYϋ.Ƚ7Ž46MНo%/y-b Ň>+ X*21jv8W HKɦ?Tv2X@m^z+i{L|@#?0 Ote)Jp!m[Ǎ~"?_P``gɼ]üh ]Y+])[$-#v'˱jfm7 d3֬ќwg :|~=sJ܌2~*'^>q|1v 'TSŊp ߠU$ds96z"1E`\YM k&)jf-\CыI OeJRMa;K]s{ 42!@Z$A y\=6ʮ0Y!QdߡFFyJPʰt;'t&JL@@n#3U/ `?JxzTqHq\UA &= D( -8koQݷKas1r^l AP׃-G;K1s'S8C&U,aX4mE%K"P{ot<$^80,:q1PJ+KlutGfvCefaYH@~q q6Q e+`6N]\0ܲEE!  r&\T_MDgn})!J'ԭ nDߝ$}͎LQ,@`zwwܐը%._4l.D&"mLhnKhҊpQ?q$Md+&}D+re [+f&YoxE S 3<>Dwűyk㥱Zkz2av+Q-lcU7m|T|hq#-x8kV 4XdXa kW'_eyg;fEC*S2*$$M AUYVGNC.dgwk{3DKJƗn:w{')e5A890(?.-bi.A>dRk8R~$B-`(_2(:^@GI*Т R/3p?^U$[c`ZN)bv]3 Ȗ=Fhxk;!ٖ w/Ck+ꈒ[-/r/ ew8M&J:SA@T4]#&8DԐX̵h*cD_3D7h'A6a?Y{ȓߩ&\8;FK>Q7 kBC$(5KoD͵Œ*4raڜ{8yZYSBxyh&F帧RBI d/3*a$q[j[t]ì}:T\z`* ;]͂n>E`r;/n]R a#G3Fvs=ݘr$->AwzfĚh -91­M?Π9+8ěc!tYX4CTpg6S6‘V"(BxU{陊MpGMV+/|<H\{OxR_':)D$ 8KB 8l{׈XH $`["[[Yl5Hb8d2fX7/] /&LԶs4{<.J @Eذ ,ρ.691D!hT(}!EjsVzW9fOJl`kQ DL~hgDj)ĬE8{8(%'Nb0=%[TDTk.Sxj`$CP&DzJت+o?rEKZ CmjbyTp=L1m֤vn/UʶNV$.mwqٮlA}oԦ<ӐV֠W63IGS [!j-C'˪h UrLޫ;—E= 4ߦ^%F:AG'\YNJxeFŰo; qbsA$HңTض2eϐ_5ߓ&- s'.x:ћ&qmrd7ȪYbAskX *ކzĵ`}KƐM?QSR  x_-ߙ3ֽldgzrbB\׬ud|X0@%#Q'w0M@,>AQe>`U`_;Jh&[5w鰟Ѧtk^rr/4bLTjg^:I p]qo*ΉI X h^qw0Ya WUoזz`|L-2^NU@ö!,LwP捊H5GSaג< I"ilf x6f@7d^M+/;Qq㟯prq s-%q^/SΈ fȠ>DK=]CTȂZj#ҏZ 9V:0~ҭC=-<2(rt@Ob'>@^9YŃ /aMaK_k)k;ML[~zw5"KT )VKG>~iq6ǹ0NT< -,,/@dOl5fPm>K;q_[K .uxD^!bK:7d&0Nb:1kFD3}rq mFwVQfm^v- v0%SĝFz?Mˍ0@]+Iv-!TV\m:pq(63V>%2} :,diL۫TIZY˸EЙlګp,YlGht~}چӂDS*]AݽcNX^Ձb-p zhvW3 ^RM3=ɚo %? DqB|Hnc9K]ng"VvCe85e|3)Pێi޴9p`)_vUX_b=Ad7mαr{T!^ !IA ''ԯ7i-(i5&kX:,˸#x?!91vB`h- UsUu\VKXTqߜ܁Y{Щ tM|`ߖvt( to h(HUIO~vkt/>bqGq$DՂN ReHR1NcϜJrRQ%-h1SrS GURDߓel}T9Q9@iy2تJI`R%D*h^(+s(K,K׻s#,u:jpگۢVzȯyrkPP(916:7H|񗓍YM޹r[ SC̔'0KSP|TCO CYo,҂{(w64z\j!|]]kd[b\eֻRז--F^u*f a3>kE\ UR ,p90°IPXKmw7HfpuW9%y۰O), fҨ(qig1 \-֤l4HT&,o^b.1Z5t"+bhXZuB ߑ`?JX3#9,*^QV BZ`gNc|l>U^6_sEZ2P2;(~d5ݶIC;HIN>wV4&`%k!nD{E»Gq"N1M&K-oN&1{A~[CQR. kI ax<zTQu3&"yB8 Qra_=y8+p8 Š"T[?>[VU(t 3Bh6uaCb aǥ(.e磡jPK}Ѩ̶p:C| U`X"7°GYuvM=^|pjx=0q ̿G%N 1m8F-.A0 _wkPjP+,g9REZJ]imȪ/Aws'M(h?0Aq,(1(V/EҷQt]J9m%;XE:M N|n{Ld~jEPAS-z;c"J܂.1lp4c/%K|5: +t$!l~t|.)!^c($x=EM[)~6H!cJ{խX/45>JZ  /sH(.@IM-)=t\H_Ajm.] XMPcb^)wёe٧ 4" m\bh^:㷘C)-Bxouh'dIJN, IBÅ;ff{Ӽ44_~9@t;aWS; CU|/#I1r3~EvsqדDf4|+!KS[_)ږEdF<;پ39dR&EgEyجBdSf~l̫fRN> 7Ccރ܆BvjO%@Ty7ٻ#-37XT-$R5e^q{G;3~rOqA}78 ޷"c"(y#4ӭiO }cv5|9;vKw%øn"UmPV'Se؏qQ9v0muQ>(4ooE܅Xi%J_ ^8-wyz P l ћ_иCVlӺ?k,[=ds( #•k-Y HIx[^3ԋ0 ݷ~屯p+p&+5Gøh\|X[n ?Ho/-!r2|f/[m_OѸ0 {A 6I~$.O3p!N²J5$p[?]9RiLQش ?U/^Z@z{Ъ{3ۆe ϚG //."t03OzX'T2LkF?G9`|-Ds+_BԦO(jڷ{P#Z=0CZ='rOJgG~L sɳ uHcຐce).*+5nTǫvDֈM'?S-Tps/ޫ}=5Ə4 K\}*=#ɛI%􄥋['OtpmX?':} 0:Q-K"@1nq8i]p@@&P,1ʪ)<EE͇y?Rs 9 u:&/jOtW[رpqem:geqH㷳^rծu.\cu .;=cF\3(vqx­zxB/vӨkjwU>+1QtA7ڵe~/\qb0a >w : q4k"VE7Y# eM^Yyޣg n0Qx!KvHm6m>!~aH SF:Lqꭕ΋!\F'^Pƺ ds[kDh4{;(%`36!'UVI)fC9- DbCPd7쩅*ҚTLA'^ިUZ 4wTN%]uc.U^sx,޼;s_6NzXߤvk?nE3-xaicwvmIP6HN3]Nm^폯@?ĩ?m]Sc#P-fC"l$d [!!NL:ݳaK]6vH HE7\0A> yfz?VXW4bAdI&Su|?aHzN^zӗOz+M͸` \3ՄiY8gggYbJwͮgֲfAN0ڠWME7z歅J^jP=-$rCƕ|?4=!h.jXU|YbXߤr*2&C\,v`OB.hL l2g5nc@aqN+9(@4P\|WRlXG D-/$/1aITNoeI-4)UwzL7osn+/h̋pUoXWXӀ+-"тlxF tU0cQ3UY2ポ1otfTn^ m?e8ii ~J04ęNoXi!Y|=Cy_PNs(swxS6[a!**+#"pNy<ߣJL! P[ϫGQPߩhǑKO%>Hfz+ kGO.}X&9"k<5zٰVMY\d)ݽw1E-6~,Q\S,KH@9Lc!81ZJlgYTה{K[iMSs>zg-. 肙YPo%(T`$-@.vAK;7`1e53b+ܢKrs 3uƱH 4?DU=<4l/VF T+: (kǥ_D9gN:ke U@ x΅IA{q|>OW(Yp gU'}3<{d܍b< Y֒ɣEрN'177ya,NECLL"!ڻLy-J1 qn{F~٤pك;'>q m s:VGk~jtxTɌňâp  kr eӖN?'>Ր'U>KxPUajJ&$Xd-TLW'GMFF :ַoR:E >y)3[TH3ڜ:ygs"|(۪~)eN3EZqgR wU^~o P%^LC*}CN6X k lQ_ Ӫv,:2HF(Tfͥm'JKu=eWv@$:ܻL'_ UQ=Ģb6(ЋpX Lx.:58{I4bL݇pa%RCݿ7, Ԇt^YK75ES=|Ѵ\Cz}T9DV]GjL"@Gs{!גyU Y]9>+ 7F׭dUŧ[쵵fƁi) ZKvgkz4i 5'"x?@t#S G2`# h=PuϓqHfn([d ׌KՋJ]Y6Dh MK J} nnH&arFo>Iτ}uͷ̼xbEPR+ y@)tTθa( .=빼g2VepL!`@ؒ5|ם* aueeܥiCZΉRe)MiV^|ZmEsWg蒖>\ )}@l 9w0ݠ_3`xrrAEbrfWCE* m= `rz!5Jf9CMF7C+ۜH=ȿ*%-LB=1":Wqla>YaSx1xB=}X7NAhyfIsii#wr=7 VX6D>F(at*okNJ 0t ~(//dƆ< *A?xg\Y0{R`eQ~A*#&vbb Е7EdnY'7-N 4hͶeIy$< yL&-ΐvn 9XW5FZ0tW@G3lї 9曗FF n')fW{7 & ]8$).ZZ^B@HʝaV5>fX2_弹;tGT6k\/KkV,z*^e'x y߾[x6 V^}L {#9JI~T:gdg#>X&P-ʡ JFVcAbr\<3O>#e86)[Z>࢐imQŦ?[,hcy" /6ʷ7⋋+_27sT{M4_gw riGaVbY8;NtM"DvhaY@olh%Ðh69^]j6"/W~ƿ?uimQ3>)C21)8gO953tяTBPz>R!nF+[* *(Qа!%Q]K3{=dlNڝeLޚ>ˮ5Ƕ k #-Hv\2ᡝmz'TWJ-qżA6-4c60 v o-v!"Mϧ=_c`E>N6#kDf@chpD'^hhb_ &m`/Z1 JE "8rs.S+/. <{8-Ӂ\^m?CRd,zC}m9_XOjS$#kUZeҊ xᮌ÷cG WhҍcA4U&RW)/+3P&M%A4bGOcHw%f^0ܨÂhRḛ:Vdq=TĿr.͖eiXcVWّPxs: ~#3tG.O>RnE)?Q#K7WѸr'nhdxZfj%I-ȃ1k79[DЄeߞ7,*HZVfU!z{ ni3E og@bE*-RTK!Lk3ܔ*1MӓJVz|Y^_Lװh,u{h_$"G_#4^aD=m:팺6-\Iiۓf^ 1=] ?d=GߕI3skd&*c)̗E9A%,#Xa|NiTwh q]n v~y%j*j [)مlI?JBTV+OrPM0ׇ{׽\B9'.3^K3@|635Mfb`26z(yE^.,"Qڢ-#2 g+q`&%؞3/a3NE>lwVzH 5Jcd]M\f2|[0(2sWeQ*"jT71Й$V^_nv 9[QV9+Lh/_I.lb_.bhᳺ<Y Ks$|j)pS`)ް"wt$E lPE~;pUg?a|ڲ@8Jl)m-P F/ Dmqjc03K}媞nA*dzfh!WKV( +O'%S%@5]50-ؿ˖[w9o2LI>]E3#SmO ^YAAafhLSSt̊cۨ WKk [ {;\Y;;t6`YNEG "ͤB<+\ә nDf7Q&J*֟tߠctM&BJ-6k-9%9(J3\y!ֵlqA|vo硄0Ћ,-kao|F` Oe~o4 סOR&.HB#2 n% 'gGzid.M0i:E.te^kBՎd3ڟ2:u3\V <7 l4;XaRJ3s[R ly1r(zE` 5p{#gx`7Rah:<,I/Xww>i=dܡv^aBFllXFQnʮHJV2%֮ՒK<#b7O Gvð셹ൈ{fAR{Ā~8ӛ{ G޲~zo (oy׼9T(6@Wʷ%Z:ޘ9#炵_Zנhz /0*EAQII rO1<Ë0gt@M[MG>$.f1VVwC =lOJ~|1eaTn~~g;<:U┺uB^LCDR{6BQҠ G*R} rUNuӻm]uaPY$STď۽ľ~arNUH/0KBFao/wLw b)+EZUMvT\**bY]$֗#<#Y`ڒR3Mthtc~D(u)' WVh T֠Db*m~):co,M\8UYAF"\eyt9>Ma^҉-Ϥ ;d{禧!x+8qoXaoIx-_OJS~뚶=PL0p"5m{eNb +>9o/إ53 @`HnqJm*}5-S__7 p2) &[ -)<#aեmkW5 ; WVJKTu7ԦqՊA=LdAP5 j---\rL gbn\&~;QMNC\ +Ҏ,VoI5įM+Q;.WڷGEt7O њ;lA҄1&?$pg/K x0q("aQx֍?,U9M=sx)펍G&IZsgP{l`*]r ~F,)^Ώ ,"9\%niL*2F?ˢ+77$NҀl{} zs!b.^kc+-k<\TfkZ;iO9UjcJ¨ӆ3UXвfuZi\"AtӽA,z?!(%+g byIDSfXԜH[fRwHB5F|/OU1aV4a:$ =e6[4i/8e0h&ܙn?JUgÛb\OoOg 90# !"ks>L"wQP׮8YU]J]HlJ%h8)xTl6W=Ɋt.ޭmvRB{1ߐ˥ŧT$UH\kf᯶r 6Ou˵V3l9@LJhyl,;:ZdzBvđ 5M:.^ BchToT=q7f3GdC57aY)yiJ_uvEfqWٗez AI&S*dէA#Ŕ#h/镅)4G2SVR\v}w>]px7g4`'h>.hPC[Ɔ}0N[Wwc{'oSC@\yJg#=t 82I5ɠTд'C2 i:45cw̑>0(V^zAH_oysMVϜj{kY|#?k'"?_{["}\"E,.n'8% aU2Zq{h+ )';\1N [2}g3UdhdԢZ~Ј <<>^Jm'¤Ĭy+!^۾Nv(tqoMc{-R;QNcMqd0c<j%c#IHExa qI7Ue <cdB,sD~ێ*]y1\OK\wA{]<י@9[֖A/l{-`*U~Zn"g=d.?=@,q,oj8*fH)4/+곟ߒT"hg7B/iƧ\vXYqƀ=:bq9W"ZjV|5 `Y+5uRIzdnzQb%J2c[M/w %==H~YA޷?P^"2HDg#V~:( l\Ղ]$E m k LSg)!oSGD*&sK-`5r.M$:-f13 ?KW<&V'.#>tWkT8T2Ҧit0dyAKtyEŧC2+LT͊vp-\+z;TP@B֌0q"6u}xD(hSUK c-c'oƑ!l^4ΏO4X0D٨%.P`pdvy! ST^e&$%N@YwNH"(?/ЄBo-̓dU0F o.<ޏt獃"M*6lTc Y.ؔjj3F|JCLbj$X@.{ȶCKˋ],잨Ee@Z@d;k֫m'<&jB^o4wےvr+˘0<"(]Zy?2~9'X"/jp-{bk}'eܧz]A S@̊ɒ ΩᐤKjU+g;j8q5 W㉂b*R~+y{Úܚr21vg ʪ.`G\.U x&S6,hiX]k!:\Qy0!@'ݹ:׳\27gc (@S5=q h2gՖe ! ~DZ "2a`_0Pv/8b@ZGRL@1^ةȄ,?o(f}\ )іݺj_l"Gb)}oO/*E#e;#3gƻ )yvh钽Z=E5evg]fԱS޴עjP" 3/*A)xJw̫t+ G>KFn#-&;tr/26uT_%8 gJ2̱d eS} V<2dG1C?+.Ϝ4a?ScD.eyUJ<3:ږ!z58bIJK( 2PٯAKS/3B6G_\{+,@d2i"3Ҟ$쓰܄_3hH]#20wA9=;Y,J7 @&V ga>#\p1Ry%$R<>h[#1r.&'7EIs(NH@ ]qJ0+g\E {g)1GdX)ïO(_?L{`."^[/'i)OJCVcHHXaş!6)0gCOSTNᕞ狹_ڿu$'4jyMtb 7?<uJ!O\ "0nF} '}3L=sM)*r*5w4ا%9SՁaqYRSlcH-?;M'c] ͩ" Oa#}NTإ{}ↂɸH%V8Nb 0ۡ M[D3ޑ o!KK-qu/W#M$KOa2S1؃1xdv&{Ew~OӫS:#cG\pKUxj, Զr pKBfr%c*3Gu,K濇nQaCT8me4;ے)cʾk&cEnYoh&5;B`ohy(~btLd@,LLm 8ׂ}56LgS 0_e 1*^Jl>btٳR+e_XgpӐUbƘvgc0Pz?cQİ4jF5SHu0LaUېlQ~0pt/@'E.Z9w2NeRJŰ˚P^PĕC׶O )LG;vb`N>$ C__*% sRσǵt&G iEwnIy."WDL U#ۆ/})Qq\%ScES~źPT!6{ڬ c02;2KdhECL.1 (SB;[KPiXdbH5L><&ÁRhR:- lK#ԙ;1;,_yyykp+ ď!_ke]320k, O|Ly `S UXhp5&4gTK\=72̗(GkwR:2eʙ~횹`jJ]q3T>h0&^?[S__I>6O[)%ֿ],k1ym-9lַI;+wKh!jτ<ʠ%ܰH{.W #NE}ᶷHX/-\p/wcQp%w,IqIZU<|3EOGr慌 r0j׽Et;;1Cҕg  iYj?)7 |'PRUmwޔ';֞uD 2j 8Շ֗Zuw=|nל76kklg1 {ʚ^&ѷ'EWMDUlyqJ*m;IocE( _I}Taoj1nYiғ|! 47IKй].>=;sA@}&1[] U'+,ҁ'_+?X`L≓E'S4Jw[uUŶKq W?ӢI4HbG9pe$MC7u,PĢK0Xcģ/sŹ;|>e:s݄cal+5 !bJWr{-B1P^HvO]Z(Ya`Gwv>~2-\ZוG̮E.tA>s͓SW4$|`0;ן |HSgGe\*iD?L>LVZmko=G.܏Nb0rn'CGQv)0[:S'$W>X& 4]ls'Vݩ)R_-ɽ{jd \M67y~yAݙ{eD}+h`9HSH[_aTB ٨Zb}Vt>QZh:ex$_:! SU?\/`d9`$ڞjk>G /1mVDcʦ|_=&#{ P׫ÔN.s7>VA A4M빲DqtW91F1 DCCh//|IU5y S{7C%m=4Bn,Mz6tB:fGi^V=/Tګ^G|AXOFTgc;i tگlCy qXmԏInj x# ;qeϣI 1=ķȆ4;,-nA%+sW>^莆r;k1Q'^ Re+ ,mszv}snm  AE i1,x\mg,;9\Μw՚)?{R"H9?_ v@?86(ђ@5PXtȅ`5EWjh"ʋ-]/ÆaSmHfsV)I]#P\N;S\}V-dNh@ S6eӭǥC|Ѽ eT%QAZv LESOALXFNkmbjSrta.[}ؠLEӌV(8XkXwF27"Ƚ+`@`;ȤlVe@'ň.KD9YOG!71JGTONfaUar}7Nm柑ʹ/%{$n|Jф2C''wҬ]ŧ`(8&b G@ӍhJ$=:77s;ny0=|Oɬ 3@!B4jY<(EHdՒeBP I]Ġ_[*ϕ螞U,G-cjbQ_.kqDZL.G~r|l`w<Sw_ P2EQU}I:vKְd4~ Eu]^8$@lsX+h 0  F`zxopd3I)T@Y!K%U$h%xxyuPO ^Y |f֘6 8~%$W+Һ6w܁LsBf*{# 'N ÇYp'1>aX}̔R='mRo',EE ps Ჲ.ʮ7ӛm\QX Re(R,{Lpo"ѐrԠA~}i (t0S^r&*V}CBWIَ||EA5W=}*8OU< *}RŖ?Cݢ:7ai\>~4 Z?i=2E Ԥ 8OTf+<7ۖP {& *v/R'>tʂLT S"l`].g1rl#zN:#͹9L*KC#RӇ􎋒bw鲋k =X30p1Y pdžwu}EdRưn™[!g|CBZclzgоsA@W\Q*~U`ڎ  vU ^_5-dAЙ:#*/XOH!S*Rn#.0c.hGl6LkzQTx0Es2Pa% oJrqGן:kS Dʒh{*[ Yr4j]/Ҽl#$ |WTq_!g)4:Ȕe 6_.Vx٨]؟PG,4eҙI۱mQ;%uZ^TS٪Qנ-bnհ`1 IdlL,/{(tjgyqELogswtYa,(Y. A߷s%]G0HǼO=&ng 9^?LC7G&=mtƕX|||\i:d_>7t]zWJ+ٳ}Cu26 T]]g3ҜqL7aU2%g3[MEt(m1o0X[81s@Q)Sz@ oA=] [ jM'Ȣ[t #ؿm"91v DCﲯ=Nzejә*UL\ Q@w7l1^㏏̊A1&c%DUzUm# +RȂ$4%m)T RƑ+kvc]t  Јj-i bgLf&ѲňDN` RY?,GC֐Q!v9 ]?̮;V7 ü*ӆ4>DAXXΈ+ߵOJx.Q\tB_^퐫8~C>$Z|׈Rl 847L^ӜY6,lT\sRD4fPBWS>i6ܴ4W .>)\-"MBF8tr-a-6 0M` 0Xm2jˍ7_&=e0$`E,R: 91F,Eh]7ZefrLB&%qMIt ^8 En4с2:$/ٜ$#n4׷8)+c1Cv 7[o\&[uhR$7A޿)2ީrRc&1g7Da"1D}|aENG9$!Hj6_؄.]3gV[A6Uu{H['<ױF :Q!UR]e4RW#:b1 o 1BE5-q4-DH6CB@Y7e71Xy"Zx6/SE:q6ѳ}c\ٖT _ F@O}^}S;'tsmU_χ o xP[M,呅AJ/GTax< qEt >NkAg786ī3d@{lQART1 vMq>.慳#-{EDn8#!&X1u}2%X|2b &ke7F5z.o6aE4"a;H D烢߾8M@[ / Rt$Ŗ-B'ew;gu("onE9+z2b<.>;rNF\>0{nAjgw`5Iqg+a_7oQ}Nw:T#UXyLf)mg_,̱˪k<:a!F+返A -"ɔ1C4E|ivxBD/O|;:8藺ƂR*ҋ.s{c^<7iGd'LN:Ѯ J8Bm](aZA0*DKg8zaqT2aɷpon47)*3jy:ɻӳBNiD (@?Iij2v}_Ö$S8Q@s0Gr{yIL C) (ÿrÎp@h4 ;΄<]lX5|7w4_/%X>ƯsJI,I@–/Zjq'"iEd9j1w%3BJs;u3[W-H38CFև!|/=4LKDO&a}JRfQ0=Z$91F2 DbC:;ZMo|]dUj.cY皽P`D"̔ jӴch-"aY Qb]=lm.ulY'p2Ur?.j߇f+ņbWPk)VS=Z1MBZ"lڋE/iCZPT8(|)g^uu2: uo&ZrUO8RT*k1ѷӡUkҾ(qs 0^l8tAIAhL>zJhvDثN"*j}E3yeH:WO [<$}m?p+uh۹ky VZLtBMh:9ڸхC䯔f=f뺁[gsG 3&[Ζ #`yժSۅR%#[Q\H$q{w#ܸ[ MUVs"SrgG/jvB&e);+F&3G<;UkKMԙLC5g;v$bm0ꈅ:}2*ښ)5`1I[+6F")45=O* OKcF\7nTsb=&s!fr \[3sqBjC^JZ$Z72&CJ& `hsh@έ vǒ1o*0u2gǐH+&{t#^9h^lzC;*V+D:6LN H68"°\3芎w xgm `|Nl9Q%~$~ԵRr"֑P0K?Gː'4w{q'r*Ţ5E1v qB0"v^(qKfZ2!vQW= :vZpbbyrk1%UV^9{(8l-sUa:Ԏ6wȻi'O=8=!^$&l6u|EL|58nmyb#ƷiyN-]$*TȰ׳+ɻ zl4t r7u8tNXoZ?F ~7o#9ٝ2sQ%7LK W!LfOEt#u4 c\}1Ow|q{,l]oJVMfךm~7%c0Q >7#PӠu:=fv4M۽f{hFTj%ZsWQ| ߡ?Cg`g* }V聄 ,8& l0MlnA Yo`hB*W{~r ThI/{q{ W2g.LFmMHFf*D:_e~ R³9~˾Ȋ'̼`V 7 IjczT%HD }PGqv27 ?&!B S@ɵFA=d/^Ӟ+gqp ҫ:SS"6MIe6`Bce"\DwoYˢm!ڝrg]UbJ+Ɋ:Q|# {VJ:*57Vʩ<%n19b lov-0\ t=OrtwR9=6A`;OV?̾0V%, V)f-w`n\`C'{ t 5@XU Z&+ؕ`֬rA9n~~}r8OXhɧeDAr%/HRvA (K/>kufgx?3 &SPy윜$;N-ʥ o)}'#/Gy~D_H99B_ f'KR*C0h1(HWcP N1A`$EF㛷 =NK8~a*w gY*f͞ 4.T_NuR ;f4ktCL[ȍ9[N:EOR eǃ2 #M8@<Jnwej1:2{.>=jc [5NPֳߤU-%m>xF^ϥkյ4Hx*;03FeƄEuiߟO5lc4~]]c˕MvNuأC=.X%ߤt*dU+ s)Qćt,U/'JrN=,}iwm9@OU-짰ζDT9…! վl7Wa$l5ֹ`(6sXU,U@?)[BC-.fRoI1|hBDߞi؍("bA8 ;ږ,lrb:X-Wz[ةOQɝs(RPk޺qsP1Sd~m6>rr?UP1*ExG^]#*Q<2(.^PCylf =ZqaxAJ> s窔u Xh. vk;Y;-[ +eHǕW_,ދ*T`Tg%Y˫p~<zÆ̧|)arF1\m44,$:2@I#BY6\ WbVڂ_ʆZV>랄(orF!s*A@Vs bZߗC 2CHm#$?&9/sCB9?p&e)R2ȣ;$э+SOs韰BzfPEr(ʂƟllsJlN*437 FlwbTL'"~$JiⱃwFM):xCZ4k^VuYV =|2&72> XPoؿvB/_^;foA| &~sC+͌]XkU#1]ICIJ9cjWΤIOEQ raNbNHRW1nxzR\p +`Te&nIWGs] Froz8`Ar\NKs+iϒuB}iZ ,OB]k;Aӻ6 -!&31!GNd9= 2scsc; 8PC.OWN҆ l68lg>f _;S♍ ߑn:`;J}SJ zw>"vߖ*$T'50iK{Qav5(lF1$91v D"CU׷R\ˬ[=49Ш cqi΄ T@)Qhb#QU-6Y咂tOz"^ :W.` 㺯v}*FVuVC\8ru.X!\i>h4Ns_y_?{7l&3'Lstc;XbG$߂xTa>i1d/&"I Jb)Q|) An!ɝ%6uw z]UY_R?RD2H P b|+6o#F&H2M`.ݏ?{jNߩ+19IaUQ]r#\-eY؂N+W{ex #?ɦa+l{,a5ufjzբ;6[=QB)JxSJ\})+UwLFA YG R=NBP2vJ=2 a-ۨ[MkxuB2/5u(l $ :;LK ##wP4e H>;s}Xv j%ܵgg2MiiuDs@ܧy$چeɨB Hg_\R﹐ryS&JC]`DvA%(!qCbFJNwC T{ uFhR9pZt4s0@i!ʼnƄb&ſ1Q(;\74Q6Bt4  JGo3o .y3m_}%4Iu)f|]:{-鷳'܂,r 1W g.B'᭏+g }FGJ<$PtS F_)=ΎH]HL:cWs2im{O`:;f>_(Y`@0"wPwJv/8F2ȇ3TxB4IC_<B 4 ^=f˵jxrub?xa8QӴd%4~ ׾8P}n8F@Bo7`{f#N{d}M$Ө` 7?P#y l =^ C5pF@zd-ϴst!w7]ѣ_<3 `2`Q}nuo$lb{σ!\ >}*l85As$VSt؅Kvd)NT(֦jAY,to^D\:i4d$7Ш>f5 ~T?&}#K NC@|qu2A|@S/4zSuYTx?&%r-]Ilτb zԙ_"σd"?FQPmڏP('f佭u~#f/}Ŧ`LŇ ɕRKG>Cv-\!֡ 8&Y^I_:mL $̼"_D,X";˒X%Ąx;hvq :CMgWmA0S1]R$uoEq6P`$}(8ͰG[~K'XR1D4nR]OM2#6>z-DcɊ=eH nhpQaA-:y-Ouec` zgU9zO jn$&M2F_`˲-`2^6WW#&<d"JLy=)]ў&G؟_ ݇Q*3-8uzAynSHITa3]'J,X[Yk%ɛ Uz مݒXQѷ+ k^zYj'BL"yBӠV [0־T%Rz \IVNlS䏚 ^=LO[`/N?_:`-/nameq#b#U+47lFX'xѰr qЧ7| *Yi,&kH{;)S[i _dd=wTfl: Jݨ1HOą*ư"%w` < (#ku꘶J }:vAn%C?Hc&i <&NYlPo1}nIMrҎE?+¬uܪ(OxW[8Sљ S*&ֿIJ 5RFla$t"~+YCh 3t\VOL+I޶jhk4Kp6C#uHgRi-.+W@vU`(e7LUOmgXu:X;5i9ɶ05jVX[Zqv~';[!Ucp_SB+&01znԺ$]0[ S ?T% ]4  {&Zn\3#Qf>Ԁ4Jm?_P۟Z3u\ZڈCgT ~ HˬAZF1I0{Mdb?bߢ;u# ,CXGg< YlG|:{CN1?C0+MJAKyg3RQmesBI*`{AI Fz;iN-h޹hP^IO5u/EGFIF$ (GlJ8@'N@Kʷ ዥұhtW6Z[\fZX=)ɍTf1e \-wwO@HηdR9mbKk:Dݯȳ>'BhJ*O}}lWۭ:P2S1ūo.n1|>[8qDrwjEB'/R$PA{$RB*S^ƙں&_7#Q#8 7jg*@5lb8Ë+3{v< ѿC_TͧJςغWM$d:5 "HxqS7vhn]K2E&vWM 9r|EW$e)Ued%9se'uiT cPL.u)Hi7 m]> DX/&H/ybniONLpec&UM,&5#'.\b 4ю8daJƛ~"xWy8@u^"cLn 6j ONl)߫{ۯRUSUt꼔%8)╨:(:?IՀ6B'8+ Vm/1ᖅI`Ј0e"pUo`γRqL*lk,1jgt&%o/쭨:YiSKSa*3ƮzK3OLG⟲B&Q$CMW'ylyѸp`3lw>0૵5zQ0tB];۟Rv bl9>5cBJ]xfe-gGc1D fsr@o+y™|sNo+kS!AdD :#Ɠ~A{I)rxc/XyEw\)X|Dِnd 7x꒳v9nGEh>S` 5 A^z0,ʻ2[gxޒ/ܔY/.$꘦Jhv ᪦sD1*$zäRWÿ<C{_#Q2Z}fvLg4uFɾؓz8ȯN>[mɚW%^~V 8noW`=9ۻ(R~֪@n#ʼ4>} |:l?UåS6 2G-{ p*y `v]?YdlpeH<$3sH /ިXTk;rsOٓ=sPV,t`2цGsct Fx/cI=%8g{Z_ !-`a&jC/{ه%e%5ѣap!dZ{.1^6?ȣj7=nHt@p^uYZ-ۏޚ~nG!D @Noir$x"M:%M"֮26HpC)`Ѣ0܇~Np8\^{|X2q,x8d/wKİ$e3Y |{u;IDE.Z 9wLֈ:P?9\ Ӌ=ܜ7ݡo7:Tji-j,kr \c Q06֙y@!+N2Hɦ.xv&_xp k/,3QT8xq̃,WL%`gY$6YXԳvpy9mIQt`s|VbfYbeX0&0Q !Ki{!@Ŏ/\B͹~[ nNXQcf;&S3xΉLnϫ`wYUg yI߁ 2x˼y#m"Ojyyk`KTˋΛ/"#%\3X)7r6<}%) |~ES&_C#J. Ž#I]yD ?\6y%YSX?{N%cjcÿz$Daő󻁠(}^BN~D{_F _S49z~ذqgls˯ k}>rplʖF`F [)eDG؉U-&R^}(2!/f/!͞,O.*C: w+^Ru5T[\] ,@}zb# -VNÔ"}B";6Q񷐋Rul4J屜^#٫z=cv]*mާŶGd@xBZ5\'0NqSK|&.C(#moiW[~'e+ޢπS]pYBSC/^~r~jz"X 3K0|ܕ(Kt`/cpx,"ykH?W.@rpܑ fDt̒f@bօ&-3{ $0DU xr>7gʁSYH vniClyĐJR(:<,KZ>Nl3mM[(&OGWВ8*fMYW|w eO-O" )GkZ r֎ 6fjU_XcϛFV0NBǧG9t];@Y#y/DVQEtSt1U5WaHGn 7:sxH$6\O.m!tMٲͧ]1rOkW(?i,ؾ$ϖ dgŃ$*D3w$_gI#\ yJiYk4xm3hMLNHa qQ`3L\;R# iH6=8( dB"l|EbmߟavjuT(6qepj%y4E<,yؗ[RUx!PY_nj t$dža t H@{ZXG*\=ƒYXwrkDNhn-s"u NMOwHեLw6=O<~w29=2lG?˚*ѵ)=wԑVmD@>alr~tJڐ:1 A+uP~E O-;[\~7b.i?䪕j-Zj`As$"˴6DМ ʢh,K `"-1Mq5{ўc$^v*[FĨ+sn-vpArk3U$zfH`#P4!*("jץܡ`y lּTV0=u_cS:T2HFN~f5݆ZIN5->=lP>E8dTK!?W3hb)M,;0w71rzy /+ ^@ʒ']h; #xwtod;`PTt{k09]GB:d`@z{ ~ ZNm#sz 4IF21e4Msw` ]yM +jB_\ݽ 3tZQt VocVZeG W\ɍ-[0]Y] \TK9н+!Q>x%RdyqڄveWz(vq `lAUTDn.$kiجC!S=5Q$c(p=tJYisZMU~YH-erڝ|_sn*0+fqxn觴y)s6z-8Qz/W&.\/Izuq\ iL?yvc6ߋK3l) 1~+␚)򯳕d ]>ħ?*HF!rO,oL0$/ژ6V:fv+ _^g4FAֆV(tX;كυ{n1+M[Kz}3"UqXD,%7@0- o-/0 vh8nSˁ;[nEFlU7U`Ty}c<%'oADߋ1@Klj%4VWř;цG F4"LᲰa C# w&]abܨ;!?E:VH&g)P,r'iY0V6s@TF &gށ`r^+f=&6C DP֗j^x@>GH_aVj![TqNRj1 K]a6,LxUčsS{λb4H_@|31rz<ߛ ۇiH%: (igAbD~Gyj $b0?_Hmn$YS[JWR%Upe6-vNl ~޵tLp*s(bayo1J«34/6:ߤ@ I&yE?Z<+ȃ+/OWL{kKmc=oAZ;L7Se+*l=[,4F(><!ħK'L 721 V_p}9'\`H'v6an& 2#5+3?}`hI&m)󑅲_@MMǍ $|qa(/񊙛KZeIuJ5ۿHfqOBxn/ _VmegZrYҸ8r4ƃٹ!#yh`??k,V &$" gՈZXM;1ca4g9kҤ}J;N0b{zzJw_`QS.hvt7_[[-X{5m r;y0t (adcĠ؀˅O E ZOڲ3XWL.L:AF&cOաZ[Sylvё&y5?cKf%'WNF ?R}$1ӰxXaN}>ʇCg`3} ^ЗAp>n$'իIYׇ+SM:R^U+'10?▸ꯐ{n%1FlUaW۟镸],To 6S<h|l)04v8/Yjz!}Psy*1xp7{aEhx%XWRbZ#wCP &<|Kahg8t/L;NN5W,)O3=}zlGf0BA=_8(,,#.![fsFC(RSu̗1_uݠ:RŃYL4Lgx$NYӧ.d%Bl 1"}"?,GK(- :$TXXZ(^@S(31܌βRO9X\{l íl59kwC [ҭOW{?oL J1Lv׍˞S9z.ƋmJ"W˨Bt1Iti]mAF8r#}P e&&"+~ÓS]yk">JChLߜ_fHߣ,ڴgeq|R;̍.rNȖ$NJH Jw><5ŝ8 aT:dj[/=c-T>ݛ (~Kc~ɻ;\{/&Op{*}~DnCcYYz\Q|ht‚X2SÃ1ߞt(+5A*{KMtg696y\$~eIUp w]ZQG9E/hix#%@e(1"Ux>KOqZ91 DPos抹9%ki.o:u݉jPK%fcԪЯy6;mΐCBTDWNU&x`PmI : 3=uIe l1nic҇emwO Ynb>U umZkۅ摺:Zr?~f"i[sy5(e# ;š ߜ3t}r:XƝdG4[A-IAhL2?] ]罏Iw [dFKDx{Rb#'oݥb样o^ڷw1Lg#հY>YNSl;_E\/9D+覾b=`!!6 xÓAT ^|Q.4*UEqD]N쪐'̴*.zbD$AXھ96aip^*TݼhajKOKu2Ǥhտ ;\%#H A@8iԌv#;[0 wpCVC$C cveݕ>\5+6惘ay 0BcG( t!OvSfb-J-Sbܟ%4(Cy6Fb+WMz{%v 0STM)N6œAG!WfI9v o[F"%rGv5:A0-,1/MmM+x8ޔ*bȚr@7h#> JFR+e3DtVrG}h'ttD[d َB ,PvH߃q'Um]0mmꙀƅdږJvEea 9M `Q ,az2N#sue!{:NlϞv"\>(QِĔ:a.~mQDCݪk#ۖQs\!u?BCJ-$n]JMKJ OUU~_zswŚŻ{?>0.0aiLs' `ük_u+(B1mXD!Y|xvÕ9)tHHhߠҩLbv*c7N^H"JNٸ]AX?;#X :& .9 |XS?o.wY+ .RY)' ~SFD8R٤w x o̚,9$Nʬ_"aC$XfF/|ۢpyQ*~2ˍ)_*4;vDSQ2ۂi&SZ(8kh;t=>-8aq/el`x[Cq!jڮ}<|hbKP83ҝ/BI/o㖅 6rJABo[;h{V o)w43RGkڦs!Ι3^kB/7ځQd&e:suZ{sS#m|J1 a=fu.+'؆ԫ'd)_Ntx/4\@ss2Hap36ŕ4:k욹m_֐A tέD<؎~F;C;k_h.bdqP؈t0Q_ׁv"BtELO\h5gw@snKՐ5["8јa@%qyaV– [z[.[afY0nۍL7yl$oQ^O/n LxI!G80bC¢޳#7jq"G"b$j`8#jq(i7g wXu$; ,UugZt2{5/ Jl~--.0QddDF\) *G2)X ݳ" iH[\ԙJ7Lu!=YrW[ߝC*%E Yv=YQm-~O řN' q X!ކM)m)mPk콴Rc)*o_DQxM)1ZL 9%ӭޥS&O+avҨA`{ 6u#H`Cۅ"_*IdT[ކY 6NݍW3 )3xJ'vt4*6xQjQ4$b&0T~[29UDi33Yg*/RDž#E/XQu{ĵr"6~%Fu)VZr*UtT|: *k&T.ŐE%1ŽQٛ[9E)ϖޏQ%g/=x 3cKp2bQe7fv ߐƐ<>G^]"ސL=VFI骬:b!5Qӣچoq|2g G𯾯eCWǔ)f>g"`!'ld'*V&/g iԗwV|GC=Oq#K6Q>蝿JI^eW1\(@.kY/z@A" q {xhl#M1X6w$p[:u)zhhL`p&c}x x"s$7 8oD?K-zCdy#B&I ~k]V;28$!9n D4Hp%N3TsMly^^ӏK#Nȿ30_?SwIke>1y9@a5|aj,,ڶyPwJ!:MaD >ߘvFiL*tȁL'$D;G8&tO7 AJE;,#CvoǢ1Th GΑ(χxo^1˨&\qNIȒzVCޚǩE, KԲ57Md@ \?X*L0Rhh0xm|4w8b.IYЮ0 )h5NͿy)0Ə䗵\!6S\i&6bqJUKs"7Id%]L(M(WbOuĩ15a@.vGAxހsegiq鬊Q>0AI`KxCChӜQЁoD S/K8uKw<G_l?=-; -j8夿84PTDKWְnZey 63Rmw2gD_Z*58&ǘlqWÝ-eyM: n`/nʑArDұYcT򈮰W U1 FXc+X.57"',yܓTIگq4wIl~(`.+O$x&b[5ı );tbm/S\́vH[VF[ohF3A `3чȎ;K:耩mAGpV YTQ:8Ꞽb̙xF%:G@oRu?f&| `Ψ0|"aq42]iq;)6.u8ŕĨ(u! mTdN]uL5: O|Z!-%"vA%;.(]*ygNE+qr1ln ocbF4CC)iEyI~5ļl_%߾ 4R0.#kaàIgyO'jey.A ^&|lY(KB {~?GdR?'g:f{N1Dԟ]z#|&X U{7m"[nWÌ2Hj8VIHX%`XzIYWM|hKC /QgHuZ_ݰ a#GuOuBlE"+VxNJ)'/fp2@u(qib05[>N+05G4gd+is@2/^oU}@ۙNJ>yP)ZfuNu_8\-jTCa}$OuYD`H| ǡ#IF 'v q(C87r[[ 'o0"J7@|hAK*Z }6L<7{{M1*O~TIxd5u,^ OCs?ݶJVF8[+B:Ou!L >gm"2&y.%ن;"l,)3|c%>5rXe`й[qPP|? 圉a eruhuSk *1<뫓&3zы vӔA8Y> CI9υ,ud(8; siLv/kǚw3ȍ kV'S+n{ k*.dzB9Vj6@| \G4X8(86,<2)4]7#a)xMa"&%GxY(f +ƿ:~䜈>ԐɤƔNMM8?, W9-I6zY (տW$'6$7 ;qs=xavMel:i]*OҪs3BQ-YyH~xNXi!n^jl(ىH+Zvnmr(w@Bx: tz ~c;\~{H62…xc|$8D?hMBsGjTMSG՘)CWa&fTc4[Wʭn1⚒m+< P'FgwnerPNÚ?zg,7?W8u<ߥZExe~CĴBOO_eӅTktkTQߏɓYߞ0[ ==w/2#+ꍫ?xs(ZZArtϧvi\nۻĹ+0_3r:t^kwdYqB~=i.!䶝ʩ :kɖ7ANI Re0#? vߤ5)[,c;`(fhROt/N AgUXX}оN OƔەoO ~X<b9作ehבzp }Wg,CW.'-\j~ϱʷ[׌d1KN39,z BdCh/U\V3e\rMUq[YcS 1g'() i%2N#=\uXEԠabs =M>!` C 76{XtկޙQW.XBA~jPɔsD9,ޣ$E R::"cI{^{s\g}ɇ* jHi|$ƪ~#8:?T=c\L][LCQk7өZ;7 A%<jr^M';\z! vArI< dqٰAx]U/ci7gU⮢Qh(1$;-ZNeRiU J(YTV x<Cj3QX |y;OQOQ~S0Jylc A/  ~T !Ci?5 %4keTdhg~&33<=}.^Ŋ$7ƹKU KsZLʤ9.z9S u喝hwCEU%J9ר'/o`~g zQD1 L' 䨯k5@,J@'<8<'lhps2!.D=BԿ€pT&\`n-EZcRW0Fy\_@!TtRIŦ#.o;(6&۷Xm I6ېȜBsF#UE_}{qbAa@ժK֟н+pLw{}~e#?V&H\DOy+rpNSpPc:xS3pT[vYn_t l̼Z׶ f.mCw CSG<>Y6G`eè5SStDJXOmIM?$</ H"8f8eөrk!_bD5x 'b~/h~3łeH~-cK?\*xHBL&ݱ^TFsDddM u+ˌIgd2,߿f*3(Z9YHqF9o9pkTUkdg.YXs$j 7[YLƽŵP= c_.˝%0S#1`?~G>'[Y<9;i}#W-V~R_4(jGtۡc ln񂾺@jcZD I읕7IFɯكeM8IMydX( jlԇʕæJ,oGnR:2mm&Jjx.!93pUGw.uMzvz+ ۰7(tn^_JaG nCfў, qѺ?^QbJ"6%أ/:]VAP~|0N=DU[vw6# -tv I_?apZ\+Ҙ}gg#^^w* Jb`yP#V&j :z W`#P윘+ />8yA^&B0B ?*{jٷ ]{͚" ={֓-E%mQ1wXS_l㇄DM.RhZ,KXhx-gE;׃f:[q( Vf?N|Oq!ڮ]Mhu0<:Qǻ:l\eW}GeT`'eJ'}쨊=uU&DaM`ڀyb7LZZ4i$z5ȋ 4 wΑ_%hUMbaQ:NIJi׏;f?=[_ۑ<|V{-_,}y> \QU7!)4]%)xPDym rc晾xO_wgt@S??o' ȝفF\lD I bYB-P\]QWݼKQȌersZQ{n؎Dkn&&Gp"qJ,dVj[_&PoqɟјHǚیIɠbQ<,Mޓu raK{qgmqqvkPS6ͤ  p'EbHo9U>j譎 Á;Cmg Paݗ<^^D-hR!4o"U*t~~q]&8#Vxa{MkkM䐳c+diBD#qbERf*q +Ȩ%b=!<1?ϣ{b 9ASrkGu/GxQ8`vA1}pmGt*297k-j@O1;l0k2$qq|Z)\mq?I'X=*' n pGbVWe&?12`g 訜6(I-ȟ6yO?%P=M.Kt˜ eP7 #*u?S*eҿ yH mk> 7_8<,rfkx> ܙDH=i??sm;J\ko:B#_Ұ;br loPhqA=lF@Ľ74EEЏz9r3GÅc#LOli#j;MvYljY?ِS =U6 OTu!1F46y!R/H'R$*LO`/i3. Msts{>Q邺mwP@'FqGu 6۬?{&k)dR$zD_h`fsY*PM ^mpIS1΃S]+]xw;^Ob0n~(QPuƈybpxA8P]tHݗMZkV;oL}jXCpV);_7)6ydI(GJE8ǵ9KXw8t$u``$R+ yT*D~c/1F{bA t%}dbm69ŧd#HPw3~]o Md4~ \Yef_>ʱgU 釻5q\U$z>waG@Ifvog-3$]}ܳ94c7gy3NVcPPCAK03D}Of0ZR4gLH'HOw!ٻF xyEt?o?d-b~e~0Fq䰶_:xi@J6M@F:Ӟ7ik lzUF]o3%MGf{n|6/H=|$4`fmI߸ Xx%̘,rG:E: 4-i|0K$*&1<72Buk|Br8 1s˞}S kFfp=ΰܳ*.EN9lU3gKPasSY" A2\ &b y/;݈s2+;M "͐w6tM^ِcM#%[Ӥ-`+ ^l^םWza.*9tO"^mǷk@cؼz؎IM%j|wS#4V%7D3lY4oI ;0usj[p͆jI"X!7PgUgmB9=k-Kt]+;dJ7:hFP@54&}gVAºQs-5`T~6~TO&Z3%k%(NINLkxwzJnF) pg!|0x2t4Cbgbf9[.sYԾOIOki*Cf̏6@\[Ol xu͖F0;~.'2Ӟ^ (F\JBo7ġ#8G`2/ɹ9<높T-8qjl*QfRY*GWQ zBKaA$V]ZA1/-)Q ]u L-Ȩ\KR:?.b "$U\gJh~*%Xhi}Q D=Hz; "xa1e$Dîbʝ6: Y!yH6oy) FiŲDnXSv4P`*~6]U\‡V]{k 2Q/Z(H_eE.ꅍXYωy4f3Ÿ#C8M8dE0Uft~ޚ-&LtiPN>ay[B&|KD/x⧗<ca++ĨFPԗJjk"SXy t+\sVՋ\wb#[FN_T?Bc7-Mmm4˥7 ":X~=T#Ca#ܴ*Bna ҄_3J.[ 'lr[Ȋ^򞏭ţ(3Ѿ[I۫ZNIr4.,4v UvBϵOci.1DڳO#-J7 W벤|#$XYN^jJFpKLW'ưla<$0cj4*ozpnΘ}P(D/ję(Cy675i3rpXB{/g^(яtS"C{4kiAAnr\fY)GF)Q9qEW)GYgÁ*_]}?+PsЄDp=jkdw?h>'0˂.4^>k|mC@Al )Mm&lxѢ˻_wp5\\B. ܃VJJ{嬪}r"s#P9R^{H 3 aNS 8麗xUkhdPGGkKr$Hi5ojѳ  yޙ*U\xe4E?6A= |)E۟C^ܫ1U!Y7}p.Bm u·6ѽxXKК> <ʞtwYsOp~lĀ x:EXy!m/ߍ(+XZwL1IuT ,919ajy+ކ{6gdNbf "/fJOr AqByTl\6gзvx#WX'*{Dc({#hLpFs+D)AVWIB`hVvEv:B=HSңG^r cchw#,ÕĖ\`Z<%i#NʞS7.c3\5 Imj-!9G;Àu2ے3oDNrW>` ? 0te5fk@_]K3Ntmoa`3Ki5P_ ]Lpx}t m C+iJXaςoZayhS!UlZnwuLu]ÇSNrW']1^Edτ?ly-2|l∠yx1sI|LXfu5a$Q&ё u#d4<&@ÉBȓx<׿rYWUxYXV61Dnt^jnD3Woɴ WCV$& ?Ål&x@m!#vlXL?>V=/F]&qBjo֒ni?TIӸRG$x+"{H(G<qO`fVR#utJ-i+oΗ,,_vP F&kh_@Mϊĵk q qo䁴zdFKaנ7 tdqƆPS3dLϯ}ҁ(K)Š@{ N1Wzl$fb4ТhF>12!ZD)/_}bB:??g#1p0PeW~xJn#IڎN-88pE%哽Z=WIaK L0 \NFh 8F 5yIG^A_#ըQ΀1p_9fs^0RLf j؁敉42(Nlv5W H9oQ`Ae4cݩLYN۷!w&O{aϿwaHRE T TŐ8M>oOYW Iu.PNE~gw Z /wN uY^͠Cʷ yC r[J[R~Ox O} p)̵P}kP u/9$ߝDE ƭ~U5l5DY:+jXV\#9 k3/W*`VC kɥ[2F3+Kr[Ҳ)8hMMw^Ԝ T+O6)X]s>TV}GFQ4B"TX9|v@fƮ̘wHlfoHv5{B+/`2?un5de=N_ ~.F3"fq }dm_UP)>TÊܚ'V>A1v]}}n(d491V.C!Hm ۍ\Zd|[:ާj490A*D ZTZ@B#% #TWh2,ʚ2^EF% ܮ2%$>Euc6R衅^J9 \܂V^(ץL\M ui:L3MW-NB\ahs_4$r:ŧe)HT>. L)65qW-)ݽ)/^qq,.@0z/aGp܌XneUJ])-HE" ]z'!>oH X"GU 8ȍ;=UPhF񸯐kӷcL-`@!VGfE2(mvmT>_ISQkR8|YR+:"^"fx=\"y^s \vV݀>wP9Щ wcТNoBL&vb؎hKXji ԍ[/;TW%AnlpŁr(J1T֌ݤk˰Sdl%/?I(c祣X7(:fIhp7;L.j_H[`[L`֊!9v{U6Hnä0nT]:zNboKlc+VH? X{GmuLB]jpTp2_#PD;сp9#cBEcnIꬭT5/VTN,6i_I/a>*,aKeoH&1bҢ[q:uT=2:Gʼn (Y#;NLpbToAMK\Q?TkxCZ8(&r8Ι;-El'jç8;Nጐma_VV՘gIa7w,w*#74H 9㉰ %;Uߧ! 'O~tʅ*d-ᵸς܎ȓeWfҺw})0zT&sc˓ hEc ({EE57{j'0|Q{JgutQ¶0^LswI~4^*˖Z] E2ʙT,?c!zPYG-B7&}h[Mj[9v貜< AuykMAyE8 _N?RlhV\k@yYGfmw<1 6@'=i,US H4} JHuMƑ I2Z '8VX8J)؏l1Ѯm41ZYmaZʇ 6~JZ3V/>P-:=n BTB)s'dbl?ܣQą(js+>T3]%šʄ鏃,9I2!nHa# q}FU$4~~aN-XbMI9A9&4HJφ0Ch|Es}C.A,~hgu+ǔ:D@T?$\ocgP6réAүAr>6 UlA9@kS}S&O x3i;[c8$UyGw|k3.^ACʒz';DM|u5 wj60U%a 1LH ,HaKoM:(xr'k1A Dr >d@>P7Py@#&eK/)"<8X1Væ?Nk4JgPEwtcȀůGC[(^UoYpڈkǎL-o=|`)(pC2y?{ݖ}^G:O3fSw3|cT5}'OC ^(C?*gXVGQu}Ho]YZKe"Q`[ <q&y0"R̐dQ8=``+!|RR9&֝<QiEʍAc2lnbUՇCc1Mӆ;aI: $"2J*ίHdrǏ}m7e r+BLqonΰGh{.f8h5G6/JmUg~ .2/ΞynSZ50X]38 [5Oر=K8nޭT]kG`LLo˫1^Sn@Q'~XK-qe[?3酤4H؇=C'su׉QmZIc(GZߡvn/ʮ4A]wKIWfO%T'ɧD(L\Јs1_114w<7.eobqP4ǭ#A9XK?v {bѰk,ZS]s-Uאo!>jL̀z[L  K qiU-` xu:=(h3?pPB02Z.҄sA6]] ¨xm2i6n VrEm|xᯁ&F8ؿ߀?Z4U.5Hqy;H#0rNѽRMp.phhË_:%J{S>gGY:k<6-^ ځSkvKG2E_}47h+_HpKdɲgU+RK}Y\/zG6oњ2ve)}M8˪tR a1iĚs~qJ!NdAGxi(Tm9f/>ӊ*#H .91F1B!4$- /mF#nkU&r{{T.\5Tgz[ E=> {) m;^},2˞g8;BS6xANG}JЩScMi̎ԘN͔*? ;gqWE Pƃd-99ZRkVˀ tB_\"h0ĕ\&kT1pF45 ^4@҆?\:G_؀ƝzjW;C ŗ+lCu*H;\u~ %|i@'@pcqlB6v|d"S<jDoІ|NZed%N{ 6T_vrn_k', =Ś0dq3#d2~ [Jܩ , 2j:/yKlt'':̾'Qǒ{5~[íGɾ#҅FObVG$d~=agӖ)gM m( LT#[RDHs(WTi eI I|8mj q&Ijz%I(swɮd=@'Q $m5_6.GO\l;v[pvv"@d  j-]֑MTV: 7\% 5%Ku Ud`4̥-",G: GIcSh#KOlE.߰;)^T(~ví=\sOc.=U;' S 'Y`|}hIC}-CH:6"XR*bg)١Yd<9S]1*sLG$LiVCQ}6}YlPіeXO@a0sfb*9?.cK@UTC9|wїY U !tZ1NTYU18QaŤs9u>Nd-`m!کeAQCq0O4]EA֬nŝ>tMmP8DZuKsGsHJ 5D|'7<f/y,27~)g/ǔc@*jsK,bjktVۜH]ivRGaޜ+㓄Njl ˼[:0|t1x7\]F%_,?vk1]o"ݙ9 7?H1'kA Dž˂+T%FtVtD`J6@o7cʋZVTh Gw#4MgdOu= [Mހ9{iVVY6W4k@ơo1t@y{T ˾4t|?8ʙK";:,c2[eje(D.wX<)$EʱwÊ޴}/|&KO\c 1Q$OG+l}-uir9qޤ./ Rp|ր"@,B!{ LJM {Hk柵r`7[_sJͷS&xL87`5ͽ7)M d,I291F"DB$ „sxe8u4E&ًbq ӪL Oh\0T:Sb15tMsv%|2|'3(y5h9 +",Ĵ "S9MEbiAP:R{ds8`0@d˭R>{ T(0iptH״R .ȴ=7X ]ʒgf O%XxH; ljC_w\+_SƓ' xP+7?4\]nB8$볃C;]9ac" _ s^KK@De;oJ90.}SBާbm"~,I|[6?  ,HlCcQ;dH\1g6=S`| LnڏO+ZW2GA&3U[I'E/U9lY@ƀJk]GeIyW VF[8&kSBw9k4Mj8#}IkNOmcke11F gN1i2 +O떘 mv7e)&eҶhQΝ V>1 rV)F/̖h!4lÞPd-sv +R/0UlJS|>|RP`Ӥ3eei{#oKZE~me@ +g_/X"mo'Fanfȁw㷩$MI.sA}\ 'GX^ '&Hl Rg }QFB{J۹`j͇n sJi)Z. .ڇcfy4HyZ=:bUޘ!dŊOedMqX¾ ]7hT.MQb_VD&7 뉴A@fmf{; -AA'❧`yMl ~?V^ q\N@WP?)i-@#ф>%70&񱞋ܨ޳{tUh{<>UP@p|b:7H$P8] v]p,YG8y#H4wOrm +!G[఼qHda\ l*k:CnC1(eL;Yk_s_ ^{,kʞrx ~q:ZT Yg1>^_mޢ#0&R{5}y;9z NIH.%8Y pP\Ow8[4TvicȦu%|0?P'ߐ?;\!yM&/ zq̹TQ%B֛["6]IkGDt]*˶[bA ,?pEGoK%af_-}s/)Uo*~6*%*Pb0aPqDڎ ]o뫋Y riAJҟ!8 p00`o&h4Be9g}_0|cbٍBXVT͝؟!yM3Pɭ+f߭c۵KH|Հ 'MPr ) G.<9ɑcxm=RͯsH wtFg/t':[Y1n9<w˧oFh~#ȜλPF>ɨbB Ej kV#O.L&xH˳S|gjDQ0~p?&^*ht}Bh͔zIzMv1xm6sJ9;ljJPxa7!aPqn⍵=|)bR*| .>ٶ*C 8 ޱOvGĸj+*V0aת+}DlW֐'yZd=ª\3W7!RMs2- &G&b@>ľl y8[F5̰Mcf(yľJuqe,FYYVe;6j\e3~)4Zkڹ q W &َe/Ȋ_$;If~0 Ry<.V!f_sڴDEUu_@3.* mF8z`<,)e~VH)49GVLdDq-8Z $_/*9ljT#BѢ4D Bz+k=^FmVJKv|\4lTF[QȨT5qd7 =3Dx(cRM65a-zn q4B|% Ҧ䓭m;OmV1>(W @ @oswޟV+h?\ꥩa`Io\ƀb=/ c86#0մ,V,Nz|#TQ@*iAIAhLMrs-$!1_.m7A009 s;G[Lߩ^X#P>!0&!FJm4!v'||#>p1襰,1;b =:jmē쩌[kC%f]b-HJXߙWv5E>`YmIhʲd:;V&&r3hۢ <}Wf1辶9_-u}ܚ0o(IwY8j-Ⱥr= % lHO'bN̳d#5B^=ʌNi Էq/ 8de s,5t{ZuQ.~6Cʣ!na08RbE9v/H n?W˰evDMК6GMWƃd1$i4,m 9-{1(edUZQ;_C澩{ AV0M?ݕQ'ӅXm }.Mg t7Cht6 weOQ(,&1/fΦ B30ang>40eW^0 "OJ!rx_3vyh 5נLu%mww, ɝJdBaUv$|oHE?Q3neǤ:l B ) thdMYw2=S@dBE|Ťʃ_$`O{u3A te.E ^u>[UKV'Or*L[ /}.cjIsB( D>.W#ayoNA$[Da25^sհB-G mo^Fխ:MRߑX(`J@зE!h* D]aƀO܆De6~ S.mQ2ORbO/롷b'{ś">P-um RGVהm f?IOXw6VNգ7LRvu$vq^1O$6}w-XohJzZPg' DpU$W<(KXN#zF}oCc#]Q~PST*ֳ Nۦn?}A~0jNz+y%' i׉߃^; j|Mw| =v6m ahjnPr81b+-l[+@n, ElQ^}('`68 Y%EB+aj\$F?\krt귆qh&PT d6ϊ{uڛ Rrز(QZ?YIDF۞@GDWJfLHNi٣^Ч$K0_« 6(MLHCɂxТe;ѝ (Jl8@c7Y[Qʩ/%~_nǠEb/P热zGPjXxRLZ޴HhNƫG8~6rbc,XJ4z/o0R@of%(Q0ޚ Uw1 844ƶfL"/$Wq7N/n~A=mE0y$̕Pew>k |-˵?>bLөqϋO{Q';,7x{r%`4cBK2dN:R^m uݯK[#uDue.+`=xls4=8lb@=n ˏr1[@U;M#O̒)9}7.Vp6HYwV j/m5oRn 2aU:x1PNͦa:~0VifWT@|MmI*H"j+\r׉:xF([C`अVX g=a{LӉ{1jiIK*>B~O5bi4ZM tc~XSupwi/ك0HIQo>Tߧ.Xt/s>%kvM< 12BR&8A'Ƚ=Fm\_a{(,e~ <&!$Wd >Y)'ͽLI-Kr]g6=~sar4'/j`S5.+F\Rd (.y< :lep=t]\Nd;;$KݳLwQI(IME!6-^D 7kOA!V”PHOד=oL$Dcq?DXtNoPS_gP V\2^=@% f& s7C, %K}S{7=4O/)CxIc1# asWkg(aeՓB`nQ>\4kJ fL HR4cw9un^CLGX2֩nt Զ11IFdxݸy[@RCB-.zt=@|. b d3?Џn b6܎`C_XJ³{qDE9ܑ@G-H{E+$F Tn +eiY@s|^fd^;^|TFoLi*Ny-}ԧ7dїhb0{${J4|/RnrBa+@q>\Fg)\"s.bExZE]Đl%-#dLyغXT_'QZܤ`[;!4o5N]Ɔ4"ǤsG<%wGwkY'4B;|lXLۛ#F~MqJq-shR,gn M#ڢH۽LT|uf!J6!c3;A jMUy Ժtutף3`!BMB*GNARMAm NǼp\27DrIY6 J ÕNXs9U4}]i]ä8%ԶCf{:aMX(g}:?]JD;Jsf|GJ6d7(4qW/Lb]!J6D]#㝎%߉Cs%'k\!RmMr @ 8*)i[T'QjX tXCD6^ɂO]DK/|᤮ #8t~J2&cqE`٥ű L52fUFl/p#2& ߙ<:{D~4}#DRκ[r>uc.c4IBا2M/_FTO;vM|d-׳᧤NrRXS L*zR{62JR)kOD[tѝ|qm}\ Ƞ8*@ޕZLX]zw,p,zAe=kb hdSC}g~]m0f7M!km9ZK+}2U ]94{ycheCxt1a piK/MQĸdӵ ݚr7GRE }1uJ.c=B/1 (oWxG^xׇ JbL3IaHy5SiMFO_{hE}h h {4j©wA Tŷ.~R4O@# /P8&;kX 4m˪(o61l%E=[)"^o&!] ߶ϰ e `78: mz Ya m3^ k:+[u&Ҟ5*O]u1;#z܆7e7@dP(P\BCфɦTk2 \'{oPªc;:ى2j~it )3mɒ ᐬǕtr{k2 wWvz2h2C8trJ$H˟%,p}<&Xj~j>ӂaQICThvQlQ+զܾ A@@nӞA_smg}vT(@ý&*am 'J%[Q.߬ AqS:W3 olR .͟2<9O yxj`9?#J$HcWBs+>NK3psI|W0u-M?11ޏObak 5W@eL-&7gԦC˛,# rּ4kda0FLlNG Tcůjm <dNߴ\|)wvNW) R )@0l;E3t0ŧ/;G%eMCz`;.#?mOfN{y WGo7McE\J0"h7*#HIx*ROCϠ\ʓ)wEg,,Kւ$=!qLN F쪫َ?'+}8DkveTʹvf3&bѝ Kc?[( ("%z< ms&e{]#3>7@E}4c {8qMW'[S5ʲysmە>5[7Eg a)SMeMdT/ތҭMv.1⁖R(( jØ[~K9. ξ:$v_ܛk|+| X\8嵡'76掤լYk΄T="e7dv5!̘YS1}a&w8M8EܤDw54 !I}=J6Ak@gb5,|c /άrw6jTg2t^JYIZ&FE?MW;ЋR0hH wWW~_SUrӌ@li`z&\_K}jm;)'*҅X%koîkW]ɕ;,!Q?w9!5Kzۤ{dP2U_`$wlgvt.ֲ+LŘre=NڦXy]_Gjw67j0-Y 7/ybqC쯕טjJLb% p?qǯ/(i_إ07'g;:ܧkZE9DHi/1GbڎӝS9X%zMZỆ]5v\eZPV]Eo 'җd ]{Ŵ[|lz0+X"=)m ~ g7p$bY=I5 Ѽ(pfk4OsAn+ |kK$[kTY -mq;WČsΜפ ==SuXW$Zg%9γ'bS.,E( t[ZjFqYee<>c2 ,ͥukÜ)Aqx‰iXR.xw×뀮u4k.bogy/ts(^P1bAoٲrm$X ?b}8QDPR;'uC-Qk 7=Ä.gv ^V뙫`zTO>i {d/$0z|<уfYľJD!NL,T<+pN,<Y'*bhʀW~%Y=eEXf,=cC#+W:wp^9FUУ.3?, h`Y~(Hp^ePELoA|+~$jǥ{ hrǮR& +Qژ4cc#~|ͮYa@Em2K^vu(1:@?ſ^pl s70wUz!**w };ZW.h nZ*a8YG)YWeS)ydA?SJYTƀ+g< D$[9!&sw4{TTL@kP0aPG`bEs^:|qh^M r>{_Opވ[BxMqN"^wW,~Ln] -2i Z:<&C6 uAgA\z(+9N-I29 xfHh^ݧᑫo,tvU*.~-֢&cumTvJ)ybPvAF)]LRҳE-B b aMaҡ[8O\yp7\UwiP >a0+їY* 8yę=4t r$1J?`NˌOTLp^/.<xS]j0fM2BJ&{"ֺCUK*Vߩ,9U0z$|ìеϻ %BhG薄!3DR6V@y#&QMX DV Fvd&@eϼMv hW6r:XB.!*@+_~.W1coR5TKk&w% ?Ԭ#nVe/G5rD*:6ڹ= 9ABR(P/mꃤŢe>iּJy/2/F+w9H䰩d , ydaqb[ 9@9Q66Eh:;3oʥ]THJmdtRY9 E(AxNXi<pEdѷηF<ު(WLMr sJG`W! /k!}+E踁g#XY/޶;"Xh`dJ+Կ$ l쎿&,Mt* AO4]?}+*N?kPёpro?zut0C> ŕb錪 ]څ#]>e.'Hz{i_sjM7(ie(S4=L"\ېq2JRPs(bT-{:e%˗K稥5!&7M$v@}([ >kYO!(}e8!m+b ۝?l#’U9EPdT3"zs zH8TNLK/yf>Fz(vl_Wi`S aͼ4u|+ afkOXFuH뢡d(ʕ33@#^md:<vURT!'HKqG. BK_\W[X(d;򪨠!_QIױu&gGHi+ڐL6+ 80|.n$KO)0VoEYu \O(!"q4( '6riSǽugB zGW?gg>j@Pӕ$"*\X:4*N@9=Xo.TGE;`RC2K°U Hb;qu%rDW%DyC}Hz`&Hs%.E8,9TxuHst w:qSd]enIXL6ZF?-gxwyh5l+%ߞJ֨=*"iQ[B< dLƽWSM`c$OCnYfBvF6D0}1/­paf'v)C/m{PX;f0P9$77] -hN}>+EkT`?qܩ8ah6Հoǃ(Y=($ޖ(9K 0EҴ1M$XHjez6TjM>,1rZf;P;uv`J 2D3|$1Fl\?.ap^C(4cUz{*vGCӓ~'Km5Hc6DeF&3L]vi;)df_}VMU=?XlBoxXp;S~1GfzD+5UEK-f(ӷ¿|{gu}]ߐpjR4B _@A9*`ք-=P#_ E/ȰhO9A9m蔀PJK)GTfJeilWl͜ F92" L#͓$xs#GRHCir-tPyh׵]i膹Da_h{dعsȾn9l.-!0Xo\['^a)#fY`ǩs'ooȳЉBM֛101ۅu?2$/D]}DħĤ\~ .sD5< 6y2u@al٪Y{BT bFc2قo9JJ,m)aot)r4; %N r)}֒,}R<Eeq`8GOobtKt]d({s8b(OAFղ ֻ%%{=5)/m'R[OiYS+j;:,d+o,n S tܪk[:(T%\~5h3֠8ft#ԾO),jṃj-K.#b`# !_lp$JY)g:e놌+]0k:,/>g^ P]iiNі\`@|y:_9'C<"yZ<&J(܋7_{M~[ëC=+"H 0XԚH̥۽i i@1P"1ư:sE(BJ.Z5g\E.D0 6."ϥr L\Y$eDYUgi5A~ާ?q;ARMmoKDr$GOߗY+YWfAL@9HA~1w ehsc }[?oTΟY,⾈`gwMp7>=*"#ǤU Ň|ʟTa[e *=H6+KMM@#jskmkiE4,QjLk Yr3~jW۪ck+ F,͵N{ f?;%S6bPS董Dۣ! cX"w!bWgsxօE]٩ s Alp:}cZ;e6uv)HFr\DT==\Q)`v&ͽhE4+Fc,m$%pCGe~< $ =2#-` r($9uEUàXT7kTLxzCy72'.JZWqZiO8DF;JiQu pzTޔ/[8.9#z%z:'+3l;)JJvbLDp=5`vFa"6~_ tɔ>_ g,zRƗ UU<.: [Lb&Wi_ηA>$: pn+c\qdh)$y@J!78x)m +a'h ,eY8YwWtwKK=f N ߵ5>PʑIR%QnU2]ThߌZìzk(h dp!DmR76ed#!HP#m˧UOUQ4Ȗ[p\&DS쿹5*9L4 "wkuǍ]j5lt_ *i[淙5/N˄[Ҥ gKxuS4A.bp yJ'%}MSUٞIdi@r n89B*HuW< {z>`ZԺfdLA a`N1 E*?4dרUWZw3jmw?|W 0gOi6/VZ&{.Ѣ#K ^`{ r:H 1K2 xtB_ej&rn,u86Vgy)OtH+9U׏Om\`IΧ#qϧo4)y^n::s[q}|e|.v$]7FO0{G*g(HK k$!G"U3?q-+ 0Cq}O_D\AV06$:=uTw%HISS?Ǎ'Åvp>*M-T4"^.B!.Ts5{8 &{qm݄^yKYhۑ?e|ԅ˾+Fh>DJ}yDKu4G9,1_ȎMaEZo?J 38Ry(=7cdJ<{ j_݆Z=]ĕTY*d! 4c_gg=p.?kQ>g9jzJ\ ~ɰ"a{te=f+8n)mgSo LHsc 8G;AGȋ6YX_>⭮OO4fbq;79#6z]ojh ],)D_Y$@\q0XTI@N tͩƯ(?тCI&6K7'V8WE`+eF-WqA B˄,Dj;jxDM*RiiaߏoAf?0LEpq`YJj))l8ԙp3Z { (;,9msb_~nIxLބȕ`7Og*ƯB@~'uD"#*PZ.;…sCeO?X2&B[~%:% =h.85>Պ$~X};#YS7 W&Y4\Ŏ ,[;ƭ;V!)V i"|اwG$?BÍ?;+x)6ArWNuX !-.ibܭVS.#-^U.-&GO\-j#o=6h,mu`yt~&2Σ?r//O|j4t+x i,bh^0?^,,3*:2O'J4OKwF> h'&S 6D}5be@2!Kjl佱y8ߦNK35qCcM o? 1w%R6m31-Qr]Q%Te:Lswz^.VVlPA/#zbhID&KSWr=;?.; 蝔6j.E"ctA4%+<]Җxx*ow_p#ތ4pF#%K6|8ߐMt8=*74>V9OtW___JI 6)Zdg1pXL3ٙTf$L%0(3kPn%ڃV>Г(sXKY8퇔r]&WR[7j 6dqc} zO>L/KZꄞKv7\" z*MLj61YL Q.N%]"rjfEn# @9Fbx`&KR 0uH*N%[5+?\tޭhZ@ Ȍ{qgR~Jֹ֔PKOݾ,qEp ~/QON0'K_$=T~ gZ="t^~|u/Mj@H%HSzǴ-~Ag4#ܒKN6yotLo}v"^4uʎ.4@&I<1GJ%v9&mt4c%f~;szF ,)ohZك(U^&.̡,N~AYra~y{zSsӯ^XKTTiEkOHo}='91F1BoU+Y.sUn3-$.4or#fȐqvcLiTBF! ! ^z~w0Sg3>j[` 'DNRr[I,qcm%ZYC3R6 =I~P{q{r&27wE 3:L3dhUtu"oiW]Yi`|Ͳƨ+GloZ_Cftհ796ZQ0s50c8I8ZXGzS-+T!h ujB_vo5;*ޓhJ\n{O k%o1d<.i%̆#\:p/RΖqL?#e-k MQ4u>n(\U7c'9` w } ty'3m-}K2 3p^ΏB|3ua#ޢY|'^)! )r9;/ߴmU=?opr Z;@(^(\%x%~q¥$gY2HLmk<M#txU7߃9Vb;:@0 Z>#~/xΎG4TTNwiU}aʐy6",/ 3>=T"yHvm SW<3$74pob" >W Fewyy=jb)KH&"31L,u=гGwU p_3J@N@zV9&G{fȘzwm1~+'OFJd`m h;*.Q6ͣ~qeh>M%.(Rp |31tVƅYٵ=(0_X,=!AEq`%+CyfZE %P"BA(⡣phGf>0\6"fY0{d >'#.HWeR{ qiNrII8;_$w',ArWAQuGh3QEi;-I84fB-u?311#ECύ(4M0Dx`i`vi /a09=1S+Q97`dQ:]-E¨1꿎MVr+2=:XcbZ "_;ECeX)7N~;ZZP`M/ᚔQ7l;:̤v^gjw|b,KҌvYM]ToW* 1"D1V  >dN!g ,Ty_&.Qr4 15fZ3N03#%XL5^x4v&%vqeg.>Qݞp8WX @Bk_BϮ$s͟ӕ)|؉C` `f+8I k!G rU[DWwo^j E0*9^Z5EY!zae]VZ*N%(qN%|?No- lt /3@ZGįCi,c ia]~Zm8yҭW(d6L٘LGe/cweT;؇jl #!<h ^_Sڸ*È}FgmKrf,S`D_@=& blZt]8)g)1W53n~e%gG5r)ctrzAu%οn]kI/6w:˸JxY ΡÅ0ܩdM!Zl$}nOL7F]g0t7->ҕ)} SoD #,dl.ZsJ)":#A_zzRVb2౐•%UWW }zP@ a 4;&[ң]!8E1VBOsZl/Hv7IjfT<[^6oH |XoLqCB WOKxA-vf }p},sԎ:fZdVTԽAxc'*sc4pnJh2[ jAI_/ۇ -PަeXAϺM6/%?&-mxvsJi8 ']Z4- =4*Ƚ}f-};s`p[։c *.?xlO Pl49? x+Y3IQϟf $\da.qt_kCU1}1.1)&JsR`fe]@L-#tf_SC'-^s,~)h@f>EdaEs/`NNߗ"KR&$gF@fhZb 1GD`%5%yIrU ;?K+t|,#;j\5s@k/Ȩjpph$O]`p0xb.9-Z%~CڣFZ2_5H!cnҚm9EhT!yw!Z;mnjxwciWyz.ٱI5;a:gSM1;,΁g%&`o(OA`4?BmPoւޏJs,W[`#j/avuvYgϽv;lSBDnnD+Œ}wt4_,.2bɬELJR56 ()լ12ʛF/qDuf)DE^t1tzјolg{+GdT89e*}+=_/0|> ,6+ddRr7kníJ>;-Cx)kk?Z<{_#Yy?AҦwyPGwJ~M&91&BCHZxU"-j\|.kJhi쾣)8OE ^IZ; }VVli|e"H7MLoڜXqW&iJvYV[c]ӥY=7pTҠi^B!7xlrfms + ٓ)oxV{2!(ԭr/9 .P2~m/u@׃ҹg > )"@VX' AIAlLlkE!K^i$\>hOuf,5*KnWee{7lDz' Ӗq di6zj=/!$ ,N,8"۠Ywl" Z'm]{ŽF)SB#@Iwd gP.9@7odu?{;I}O/d&N(`<7|a`,`S uiWv`/g $Qr{|rKDKE>;ooxjYVW&0Ш6BEW#KZmʕx )l`cKgL NnWNqTv4̍ۑ%} c)Y3ckwDi!M j|W2) 5S <qx2H?f=ePݝ3P,8k~ߋCo87tn+SJGgre=R9&&u66(zGg *X{iLH;LM_[xPIJ{N7+6z(X j{v(=XNg5#lzȹ=ceU ^-뿎YLN͓>*k#@}t!4}9ޚ֟]1Mq@Y"͞OH f I\5 'sYm)UmU[r'CV= odYƩ.;_SBCg,>-U 5'.$}ޥSZHH/Q=MUA.o'q3& 킯dd,'/xI: .Wb&~Cˏ*bѳܐFa oG~l_ 3@U' H7{w:xRnR>*ڿqkyE74F.ۈ|IwڐpHڬ]Ff4䱏`]{L5f:jeWiX71| C!c llߊ' ' o#14V0: k#lUPJ+ϋ`3bjVX-jo."JMFGHhw5JځUCܸwr.^l/-x񨡭U(;Oӭ.$/hG59'HOmbm22×_!`B"9 7v]&=;c֪goipq:@Aׅ! (?`+ֶECz;M$99˕oзn[T{,'E3Q?|80fB@)U<4ޑLfwU2l]X3  0_\8 1UJ2y v聠&&y@G4#:qOZB(XdF*%6.'^7+# PK1>|JEmV)|Ipr#WlJ4Z% LeExiƢwDg`=S}#9@F6@Oap:(5T?`0<᠊$!kSN*V2wfK{xx*q5EK=/c.cjwt6M(mr1InфI* Q#Ңgv9~ X- )d0'+̮VFyɺc)` BcsCdI"/47?f9c@wHN࿂*-x㋚j_]LR0-`#+&[V>F:_nktKh`pmaMۯQ pl]"B4H'-沢vaM!f_qiD| \;oM̉Z>N |)t&:)kM5pN(\?E ՚K=9\W7p  4Zς c" -eg~htGZΩߗpLL&onն&[&tIq-mjKq}zb1uTo?j9S8pY@󊻑$]&2} +f\2=iAXB|Pt? 5{uR n&N>ayrX(T%c_x8/qSh.75GS*=$ %VYZ, 1X%uOl0b2ɰĈ}Q:ް8Ky{LlA[k`P:1{GV)!p.Ky #Fn &B`pN| v!u` ;gj^pBg3;@_MyۂQA(-Aͣ䵌ٮ #[hqFje% YmdU.1:;a(I[՝S` ©2 GRuQD"ZƒZDZ}]Y!ش")k"kc`SO3{^(U`smxqÛݦӸƥV>O.WP/;MgR"Ϡ.ЁE//G?^'dF"1^yS7J]%I-T^mAim>I4|R<TBkupŝ "d{ xA潌?VDn$_zփ@|˂$| o;tk(RciE%"0..sfWݒn?k^_\ @cZRAn!@c7WdWQ _sZr|BиbBJ eDtg:YGŽ?B&//6 {nb=u>SH[-xe:IV/q'|I\Dւ"Ns_DvIP%|rWP}h];1mЂC{@Qb;,6*ke{  F jbR2\gF4:3o\%Nya5=?t szx>d8_B=0#N@7T35 hu{oq?.xu(HNoHtnH .>$~ʶ 2`$p0㫢D uza ^HgX.2+Je4mӍ*#nhȼn%$ihx7qM~POE"Ԛ3e !7~ 1B+=Nh[ٱ`238vb9ۭ1yzfGI";˜-{M"0HQu9 D i3xr)fT΂ ĨjԠ_v—xzUޒSqO FC񵬬Xj1Qm=`wfyPP&*_N\(q&|^ke=.O]ƥ<]Cgd/sʸvZL+)8д&Z "7 >;[X#e1wj51zHq6/T5n,SbjL'%ݏH^Ja!G)p_!쥶mIFmss`Ƌ^&f`I^w'.C-+X%!{rVlTxVUKYM$wFc}Hx8שs+]ï̀t߄G#<. y4uW[7(QC| VX[Z}VEO:D/0e<؄nC`gHm~ݯgֹs#9Q"܌Jk)Aw/AtPR VxNУ,[AF^Jҕa>^Vx՗vtgr_O(v%Om&qʳ<>&Ur ѪZmxj6>wi(x[l]}qv@^[c}Y2(Eŋ v#(m|V(4ggzf")%Wpz^0nS@嶜=e?5odGzfQv bF!0gՕI`-A*PN9ߞ٫BD:ɕĹQg'a+Yo7;<62LV꛷Ul@ϡ%Pf׭wYN#d^ i%9; oGuvPo ZL;YwN2@Bރ@ݿKmntMg@|Tiklxόdt:*QǠTA>:.sF^唦q&KfcxG] -B]JQ|Y ɟp\KTR^ k ʆp'h P4u0'lof:nASH127(BE񶈼_hĖ;(q{"Gؽ2|]\n^k3?&WS,ըF$S7H+M]Ix[hp>W^neU yt5Ÿ_BG\r]~$Q/pW1d\/b9? ?}/"'`|w/(et"AZ4ľ%n 6C BDz0-q2dkHy-R̖u{ kC7LHؤ@V Q&gZ\d2 "ZF*sp9QŎSEm3Z}~ kW-ܩhԢ;ſWvC7u-a~!t19 }HR޶?ٞv'+~p}4e c=eA{.V03uiͫ%~('3 Y={(Ob!@f_$%|GrI|i!5 _tx+q,Wib3 c9ؓIwy%xqblXWv c5A{_#|E> t^DMۀۂhbr)}jֳEւ-v d$(lTo?-(k_̡`HTD^>eڼYy*SyyRJ)s0/P1fe-( mSUwZhd'^Z(n] )qnF 0ī6r|8X $߰jxDILlG81֗^hbհtk_W5I(օQ[[޸q4E֊!)l8b_h۲sGY{Qsj‡BAh[JC ԍ[P7! |e`]kR5B[0mckYtqJq:r?6j K3.tvQD %,JlbP]>psctQgG0V׊qႉDxڑX* {E=}9(+MЕ|Z=路]2Wy_q/?~S_[f=R9o 4EcX[w Q֮9;yY4 )3:nJ˯߅5N*, ӿtk-3axJӂšv5PU/Ch4㊁;V>871[[[4궬5laCn~BTݹwhu[=m'C{SYTRvMƿ| 6{Ṅ>#t\Uxa*!KkWd8(+l)PrK'F_!PѢff: # R#O&0t)8 7rMĸˌ\K&bMsq69 UܞSiӢ)% ؠ\(d.<ʟ\E&]62 &'vd="yg;|?I܍ .VMTƣ'ֱ]abW+de8"M&P9W ..[|aBۇ:vUȳf"-0;oku^/_r;m2Aoƺi$ J)nJH%trG͜@3YCpXC'=r⃓L8O'YE?܊6T|pA ؑ9IazKͮؤw#7K oNېnQˋnʲ7A[[Ϯ{o]}ze?XE,Y 9 pixYlPJSj"[Nǔ&0޾K~pvfAMķ76h"'NM/ç5<xBnG 4LC]p^xqNJ(SY )}D,%cm$h$T,eP/a&rm(%=7ܐNYt؅DcRB2[Wi\@B[/B͹ e''l; XL䁟9-݇sxh+ '㞊0{h!5#WϊS"9ɝas zK6A0\i!'TE+NɄ{5r F,ZLCz%כ$rM4[HwQ U+K|T+T̺^b7PN򪄦v%&NFGwJ|oTX$h2L/qJHCq#έYmFubMV\"uⷃ7! or1|p['#\6~92:vpᕘpS0VD]*8XX=+8NEX6ò zv襔 G6pcQwF!J`N!n?kT˼f7 bhڂuT+,3i,8}N7}DZ:h%vQ- +?"Ϸ)uzm5\]))9(1b|D;t#Q&0u.lˢ` +\:)B5k>I Z]f_ŹB}+MXݰYi - U+bUW2ͺfthλJ.K\&uZ[Yc| n04 ٜnPzpm%CGuJ[kVPLa#L1e7@ފYQh]wF,R3D֪X J0 [Se=нng [h Pq:J%v2@;譪nY=m9#!X=u~LѻZT=!`{74 8ľ>㖽Nză¢N$:->;&AI핿qcɁ7SKa `Y.[n]` &p.;[? N"4!Ul3LS'|&ј916:ˆZeEi {^qU~UsT?IP([E%412QY1OgXW ]}ZԒabĩe-xKfx+a"BU {z֦@R=s!I:LVL_ x^*μ+I jt4˺J:CsP;-)Zv׷*Fn^36Vs?0e?o Ub̗ugۛ̋Ry H~W˹ҦN =Jˀz7tBbgɭ{q¬!gzACW FG\w}c)B˨xn+8ӌu_@u?yJ#Y_2i{#&tG|'*0P91&2BЈtD- BMkU\)W{TU':%AqHG'tq h#e97E3' @O>ck_a"I5VRS%^ qJI m4-\սԢgGXA홪ᶯ2ՙqq_kÇ8BC"JhFxR$Ӊ2}X&dRLڛ\wxmc=lqxAktZ.l=w۸ ؇y$ԧmҾ* / d^Fʼ]wU,P+92AjH6Ytc7- (MJĔj~1AP30!r)|\h6j6`[®} '*&E[Ӌ!A3\|cԃ,5 VfI i6 ?td0~ltal5!À?qK7WjC "/2sY̻XP7lU._8L)6V{/aCOP:9SK#6`A@xRIӰt{JO@}̷7/4p#rp*r;Y_SeO84l 9\꟱AK= XIuu:si7huf"mMJ*ZOg!vZ-/3#k8)8}݆}Ըx [E|qVC%H}k^y;Js!'y @^? ^Hns8͓Dɮ"H2>٪H֍'siu#eago& ~7 &V%!p i QTOZy!Rǰ :*ݿꄴ%a*wBVt=A&]u9XRrNqRBڼqvMogl9OC-)OJcFڰcл R';~eGˉzkyٮ>S~Daˋl;_THܪPc׮1?XFwUFC6D lfT?i T6خG9;t^ xqɌyW`⁷_[庲ct2BfLqafU9枧WCHz?yy:=qklVY*-f\ݲ[nn<[f3TtG!avN|!vUUTeX9%O';71r#_΃ڵ[rv8dWx۾ֵ4TL,%PF)d98O=I+!l9v ݍAf,; KI0H4:Kq4B/ yQwKmSO^ׯn`u4!|R P*$T(?u?;] [Ah>n8GA쩭kJUoH"5lj;0sR)іM&_rk$OY 7ly+HufEy|4l%%™l5hXP"'^<}:ZeAE-dAI 6 ## +~m0zvHnRriqucMq4bx;Gg-q;l8.Ttj_G$K^0\ 5LR)V T X9`?z/l:޾.}մ׉I1O5 l@ ᅋh }g+HRG Hbu au8ZVqo5#"Y? 0XEjUĊ:941 sVv Ʀ]9{nJif~՚2 ieՌK7j.{хrU~\a܃blIF?ċ(~`#ECHDЄn:FoVRϹ/x_f&Ԝ /Pe<'{)oقjE:'Ky|j5%pq3+wOx_\ʅ!~KgdpRBfjC";忙~VNlp6R5߳6WJGFME{D, {0f=()\Ax0_m_j`dmc9, RBwj$OIx2PHx*WgU0WΈ{HzVeV?c]w#.Wp$㤃$pp_fџ`TA #J28=9yo2Fڲؾ˓6*A`шӆE*l}P\-'SL Nm@ta|,= hѧ*.- u9r *c.#ڙ {&-x49|"ITM0m܏r!aϩ9&h7P0WDuCzQRnu sn Ww_ۖ7oFMZtc <>$~P|U>mt!Ew`CK&8AL:MU_y(~Qr 4; ́1~Vηlqr)n L$v- Up,mkZlw_ؤTOݣG,<%\^vlf[َ Br$%ؑJkbyO_zCrJrp;Qr[0G r f'm?~Hm9-W2#Ugzg8RŅy;Uΰ * ,wlF7_!PQ&۩KQ (VbTbyٗ91F:B"⮼qRF"UjmT ëBhO;iC, ߰{3<-L5WT-ȌM\/+4[<@v{ed왚 sM'<'Ƽʵ4\vR37d iY"7YY6g+C m2NI =GC;vf,.eV;¢By{ fB o,UMsrq,醙d)[Z"ΉWSzTbʂ#A>IAlLԵRa^y&ֱ:.[q?+2O/ŧ/DϵR *f6( ۋpE%E7;+ӟ )MgY- ,V<>'R4ĴoC:)bT'mmK@tJB ̪5,ͬm!2[ ȇw 72#icc_4 .Vyz\ŢO2ەMOos%H5*n~1rA)T«9uNNY r̰䗇*R$E]f˳;߱T.u‰@?6%T%JZX٭ lK1ĭt?9&s|-uydtUS^0bȞWf ;;~W8l,=JO2?"^#+G'8}U8Z \{D: 3 V < "$ \@|E(r5*tC ePH_3@aPƼ%XՖ^z70R< DqR^3Rtm֌Z4IdK~WEte$rkptE\DTQ`w12h|rVC/ TN?;7\/ɭԸz1ȺV:~ |Ns[XquM{SD`|Rip-sŞQ&_Εm_&mп eZT^P@lܴ"9`+Q^%|, {;*6gi6UD.#tϢY)Y6Sabӿ{|[eݕۃ[DCp3T.,x90W}9g14_ Bw/pH} /)~Y Lޥ\4 j@. *z}{qŁ q<71@ņWO*ݦeŁ$c0&kdX#R !Vnr<ČL< yp.|5`RԠT%r09>̱~ v7E<[/TaSTqJl 8Z{ߗ*o5Ifwg{d'4 VOT8\"o񥔓qo| !\!u7wŮZ,0Ys-ɹ wNBclvd?:ʬ]toxX.7CNXp܍gAW׎vRCZmboiWck`3(. -`;E:\P] 6#)™)ro*EꀲdQHʖyȜJM,tt@R֦!V@{\]<@cO>Ϸ:zW}VҡNj.R-JIj3$>< GV5/ׇMs݄쐧jB:, ]J*[Ƽ|aR9Ց#pIQ uF1el~z…[ε'MV,@+ bXH [k8w AEWf0,J} %jᅥʃ/OmTo9l)4fB@p[{YӐ34Ě}4ZH)ě$7Xr;!}%3(La0Ry(ryFa)t׽ݐhrA?>6[DfPWuF=ۮV<לI&{4qTDS+֢ 4:$ZxnU6⃔1R{ƺFARt;1 _GЍƳ̐3lRcA63["mT 8BX TrXG6|v[q]70<+RR؉M_^J'[k5,y+ ]ljGrlj3g i0@a.[㌸BkoU\z+f0b4ozdc['+_ԒgY~<8`%l/'**C5OwXdY&J&6 네0mŎE]"Sv;1Pю\os W<4k7gʎyP1יHğ-XeG s W '*NOWǙ &08~v8L)dUEM:n}jc-ǀPrI|:ShVt7Y.(ǙI WǭB$3jZ^G X`mCxüh[qYr"grjDolL u›ˎxYV=&΂ʾL{Ú?d\qWm41LկzJxvd,X$ܽ$Q-(oiSDϓ⇮ɭWQA>8A7%{{0 %'ܮli$I|>@L $ :vwi b`PLaFM v%jxuH]nՂdкR_Q,>H+-|QUɑ:C{-HR=%xXtK5ɳ3=0zy>_F/v,G>w\ۮEn&q*tCΒ((/W(IZ7g@~&&]x u z1E gq˝JU${\B5O8d^2GP38URGZh,Κ3.utqmH)'}L9 V=(6{/K*",>*O{DTp``75͂("P{@iOjJU_' &17ގQh iKZ;യPU\*^Z ƽCN@BI*vVEC0-LWa~ >w_'ss^ص\5r3_,4Ԯ"C[ kP ++)YڐVS)@$tyKli:MEmL#1pqYyMΝtR~*D(+zGqخkT/> vrL]`WۖU(Tz D2m!αe&$[rv?'QV7]~mo?98c6dvJyBCCvWJecJyln,ExVvL V? AsUTx?Xmߟ3~LYEFgrgB/N}j1SJg鲚`r3 u+9%.)c1w.Xu w dpH!NK|6y]4w.wf#.>O"±g%辷j(^#9P/N~,9R,NvȜr BkG i^+#Ë&">.)lbٜ%޹kVaK"Zz|:|5R;#J5ݔ8kw;Qw$2gnP3Tfdl 3 _ĊTr)!u v<>]*$][}K0n۞':vgPTp3CrwtZ+G @02gŌ5$bϒ9"иf=dk[_!PEZ55JۯwKҜ@nl.,x!9h ;; BR3n'b"^ssLZ6UR 0:UcG25橵4-{@?r dQpѴdʶ=Lg眿&ѩ\9LPSVQfQ|&=Q*[ TPnD*ԤRh!Mg"%&ޝMtY{F zY>pvA3^1T&2=wI܌X4eN#_hArbO8@b`BӛN儵)b{4;w-jn [aDW\R$XR{o;ĝHKv$d\AFZFOe*Y7Rmv&XP7\s{^&|j^ ;P޵.^J[vVx Ygz_L&On|Tft=}$xƏ+c?8A<|\P]02vH>mCeNuۭ"sH ?Zvfu`.$h{"5fX T)0GdXrA-jY[fSb`T`:BH[djbb0l4{AfpmU!>S8^Ц%tүjΣ_#U|$;M+60>ܡnPo9Z.'y7X&>,,Hp X@ؾG* E-bv;'̮ܦAXzd֦\EVQLH'2L@ tfK7Ʌ(697{ >U,ـr5SƶX|C15xk>1 }΄0*猏1'mkB bwՌb ]ACn|Kí:A\2)66mB9C=0F|1\$]7oMЪFۥvc=A1 d1oɺF-4E6҆ިD"{Џ7,%&/ c{\ųzjl]}W)ahL@GLJ3wzP.gbא?n,вOf-wN<#o4bveTrYu2 v"v<;)AO. ~́_m}$p4h(g̗dĉ8A6/᛬;(CU1 d;0aBssWwhg̚O4#c_V2bc̓ ,) .NAh>I)eyNyte_H> *AkD kdh>|F1ӿlw>])8iB#n/ xa1_L' 5~{ Vq>=\8M;տp9 0AD4\Rj"q-bzJ+TNQ47Q1UF[>:z`o~1WA^ꊳk,+<g?rAuQ2I#mVӋF3uNl7LHGA-U йe';XN΀ @|F">1kYGk}Zr]u5`*$զKϫ U.rwUO&ehPRLcSnvO*$EBQTomFqW@ m~k9xE C+1˽)&CֈuRrV(㎈|=N]&gj`|V^sEP}pyybu{IUDkؔ>x~ty,SxbIyNV J3p{`DԑMn¨DFbȔq\C+(n` 5CB!FuZ/Kta|dςHgL2NP|seA$s +/-dz|"Y"^a4N d^[3CJ̢X`'ʔuTFOXԀĪ +Yè`O){NF8ݖb'z@HC|z,< ='}RI!PA%ywU^^xr5/,ꈑaF/1|py3aQD49Bx{luԻnuj2XepD}I O>a`VUS=E0e\#@w|iz".9. pŞ[VFq X!{Oݠc\f VG"Q3{}[JCHp9mh@~8a .٥9 xAbꀯjY$zS͈-ȗ ~WJ^"Jv&t@MLa.^BI<@c3뺯kŋYUK}w+}։$pE@1ڻi|J\ |,=91&BI@VjMbI#5$ɏKb ņ-‚-Ktt-2R4f(-nkјk 5/:5}xVYlrycW[ŁZcGIpf=@\IKj`epɝgʷINVUJV0MLT6GqePAFoF-V|\i0:vJ+DDNg>*fsYkYnYl>~d?QkPr`=;2 ג3|s m0mΡ;5c ęgl2ӭl7LQ f:T1zۢ0FN'45EyY}v8,g*دL0к7>JB/tp^ο9rQMSM0Z :Fa&Ufihmgr-HjO]1/`]p*c]bV}*}+\1rK%dB%UvH~@> V@kJV v#袡 R 0-ZYi|D͒}Se6 ^(v\U>3A Dy&!%7a>Ҙ\!S [1 `oS\,uQ/}n5['[ܾrP 򼃬s So^dI#F"< ă1qfsv+lǟ-~JJ̹I^zUcڋ/N5'q͸dq|O/ϡV%KP~4f&x&#s nFM>AYX+vN `FG)p@H l7<_&FރxO%Bg  XkIGDzecn1MC*B'JΜlux~kgTGU ]f $ʰbBi6W[x>X϶Urضui'Pأ{eYoqD%*%2gY(qP9XonQ|#VG"|kP Eg1NSmW&GFkBXݑ(?VJ1^P)KL4.GTD9o]747SF\Axzڨ|+8}-- Yl,9ƪHb.T:a 6./ gq:V=i 3='\3W8 i;v6{T7R}?8#q7}ZlvX E?gb!kQՎc[-&XٗWm3HjAGUK|%`BLZ~֍OG]ZtW:P/=6UyvuS ̯C'iòour&&u/]= .mwzm"ٛTxGP kP* [%mRqy}I= .2j$if:ucfױ4^Yzg t6Dd$ExcT91̻4;R3) k>3r\uƱwAN;T6KMEehq"EC((د70/I+C.fR%r@wvbRѶ@#|ҠC==#OV#$0S̉}ЀE]!bD!g(Ahl;UqC`qHLHp?n&4sDwOR>XǡWuqJБ;ެ,2R3nRAl S$Uo>q MCX]Ӳ(aۂ|+% t s Wk}MF([Vյ=7&r:a孳ugJ0ʦSJȊz?3kx*cG >؂1Q9I|ٵ* ]fj\}@3OY]V#"|̀'r-%!tZu7Nu_+|ۅZiӠE=r٘DDkK>P 8QsJZ-E[թNG"V<1RRd^m@r![*Ѱ#lCgS~^ qW3GFNa{: Ylt.IYAuvl)!{Pp.8ߵhpxd^d6t@ JnNJ$OTIG@<楑 d ߛfc$3/XLk}=|:"(=#lYu\x~K'939șD"&tQ[ȩm7壘^'KO{3{Fef]3y34֢puUFD梄%Z%Òɋ,_$m& %1NG>kQ&P> Y4KWi/VXBC3O}Qޯtš.pOm1Z xQ݆,7zgUT?[O@HNQ>h0=ALW1G%(-l֠4s&aT]xP\_x(2.D 1@T?'иMFv;Aǩ4!lw;Kw}hsq)Q+3*BIƎkWGJ9!\ ÒSmJdRxq}}%ž0 NA6L2ڪ!Wn"DJ"!%s۷ZU{\q+77Tw?0~8lxi7UaҶ7/%a7*hI~E}M8C.!3qb`h햻&~7'agwH r/k(W& 8Vעc@%@(Q̄GW1Oɦ$pz 쿳D!B4N9FQn&Sw$=xW߯=M0lOU }qX؝k(YЮo ٕ;gVqIqlWdo-p^xM(!T-LۜbY\iAe(Aai|ɐSju8Qǹğ[IלY_7V1. n+\:urCT**xHVٙ✇alJ3MMSdPy#|lQnF]?ghC.j#gf(Ֆv0#OE͔U=}XYò< ismjw֨\4\qa޻bc')ne.^j51o}CgJ6{h/陹v<\:;kgdLRMy#?tn{e[YQuäS+M^N]iU.9h{T9wQ̙Bv.'x{$7T#ćE@j٣ Xf o5n4?~`RqDti*@U?X_@7d ؙ>A-B:ȍXf ͕ҌJa~0?%/k "ˣ|S?&Vcbd`z}9I̔5Lm}MjDGpm(}=^7,5NݑlJkAs1@]`ZCr0{M4Nʾx)~Կ+ ,ۙV :Sc$趦p. _Ea(GLpy1NF 㟏D֎Rr*rq} 41˘p@ 'X 𢤅%6F^^a+*5q Á|i!Ex%W &V%]oWn']X4"$nbxwa'Cf0mԍ)Pii"Cu G&r{9`SI'Ǜkp+KILDiF/}n?(c>v?(E)I^*Z.O.>3Ɯj\o#J(ҕ[( ۢ`UQ,w4-Lx^H~_҆hhSج(yIn򾊹~:Gzu.C91+HAwrɾ68ܨ2e) /P}ϥ‰<$ilޫk(o$)5zP Knd1oU҂ĹG@a3m8C5Zpl)H!L)6AOBԟj#˼O/ ۟ C0]AH\aPg9_jKO:VNjXBx2kEeU]:-> sLMz K/̚ehLT >fOWMB(FS43Ot W2iR9[#1k!P!B A% Ur!z…ؖʓ|rdVrNf/veI|#8m ;GpF"*Z[%kh[, 벺ѬhO(H:3o|Z2^C3Yzq%QL${#4Z@O|w+^}FC 4l _dSۊߑn>v+u8~@F= <D 4wm1.^tgs3|sWAjJ{iW|bӺvW,\gK[S䳜Mk7J0Y\"t՝R-S/83e>AJo_C4 XA䥔/D40698|Ǩko<.u`f화 5\7>bmx'hUhқ2zQ#m>5l |:dCof3D6m'HVxr܆_R߂:n:$*F.%}ZhJaÙĂ釮Ndc;|l5sNUFTN&?iժ(LThӐsrćTf6^w>k seK8il20Q=!5"Y^(yCۮ[?pڿuq?!bp b JxK.͛Ė]0,J+fv2~ ֱC'JQ~҈ 3š Cs='Q YG` 6#0k r̙6 Km4W> eSQ p]m>T0( K:p󱌚es.TVfjxI^m76hb;[АЅ;wuCӖyJ%%hOkǍ>K:v7'd&)Yn34-J[MܐrIi4a)vjiiA+ Xy} "gίS콝sA˸4v:Sǝ;{Hr, O<2>{$pQz{Պr>=/^蕞Fe-QKҷ ,J0&v sjjr& n/N@FR[FG.+T6^Q)^&B/|Bs3%]& ^Hz]*Y0Ĺ}bȃm4^ af0g\ء:Pp]Pw~w0>VCrʽkG{Ka& RrGbhf}^˵&mfc˄e5YoU|Aa]!ź+=@8^"CZfmӺ|$c KE^ dg~r6g&(l#[ƾ!@'KX1CmE`7n)TU/_)Osy%51nlbYx^Oɹ:|E՜뗡Nٞgs܁y ,s4 lOOf sEk>:#:_;]'Yԟ.>p/iaC>[|CSLs"2Uǵ[ l:cua۩5.Kת9,Z?E*xW6-GzS92`\MM^O i0e>8TG8d/K86sGI1Emg497 򀼐n܅ 5>!lr%<֋Zbiށ9mXv߹f -NLXaZ;}F8΂Ǧ|< Fjm)մo[Vӿ] 3ͨŕ͟*Oʩk1,|`RJQ- [}&I I|_*KI+$S# ;KyIׯ2ث+]w L1,r2T?iꁃ]NF˘/+H Jr?PDyL]ޖ5J/5@fT*oMpinh-=3 Ш\Oʊ/$fvTȡW@Փ -nU*;J2"! 9I=8"Ӡp|RN5>fF[0X?" 5ZNm(_5Wh^~69=:3Gv>\N;5+e07{t ,"U_g86[PF8r=O 12lgE+ e+YЙ+B/ai?t˹ u}jBﺞeeQVFA4 çIx"ZC"vP^C uo彅x.uw省ԕm ۤAS(CP_G1LJꬹw9X 3]K$#w0k0L,*ϠdT-ݧp $^{͑lUXt7O\ؙ[o:u7o]_zjk,b6̰~i. B{@r4vvZNz:IH)*R @5GbPRg)1W0>{XF!8*QkHτ`hn2Dim~K7/5||;hiڬB N"/ʎ$YIid+u-wxxD #PIJ <ۑ:˰9\]f2e񕯠|Pv[B1==d-gwiSzd'&27ZI=ZRU/@de|4U{\U!, KZj+i$,2p}!I*yD?I9,t]cA#잵amadUᓙNq\| OGOy^Լ_{ _@.9_$gr- bX'՚ Dh1lMF|iSv6c?~t #6zZ*{9|#Ў P$m \ҏ^HO'9ZIԹ҂%H$IύuBO9Lon!n21]sP1]u•. Jب4{[i=“DW$u׏#eY+馝˦ak4 _LRiwm}\5$)-؅] Y5il3MEKV_Ʋ/%:V! 㒥'\P5ɀmuiLJ-

9Mu-̑InFÒ$z?Cc%lhYH n)?GD\҆8ψxIyQbZ_i&^ '&y MP 8hKS1}/@;M/# S_~p[aYHla`N-&6Φ)>ǖ$|DYp%}U6Gϕ"̝C9gLs(1`&3uYߣ@$hwרp eBφRfßy2$1 c>h`VTOꗡVtvqAL~e,y¬~2e:q}weď|/SwdДny.ܰG^͚Q]2a2O$×m=;wbKec'D3GY6*Yb%3ќ#nltf7NVg~mȶ9Ej7e~#_Dp!|"FkGnľI9J*}و8{KR& o8;_ qnЖ9UR(-c?Z{=Ir#Gr3yW`~hY8Bz| `ѱ<{3NzaQ?Y#` :n_xs˃0P$DީiG_`>Nb@_gR`mgi~z& ig\0:Z~=M!V I@c5t/PeykVHE z[6(r&\OSi<[V~,.@é„qX"xׁJ"( Cظr(0ͭ+-s&ATm1y'r$C9)O.Jc& 3~vQA_<+t=ċDX~LuVlJlzFPic<8ЂaLd]3naQsCܾ0p ^tۍ+W?1~-x욀LR#btmsviYdAcwRbr٫k9G~틻WM=r3oO vΗ\Ⱥ^)Ddh41xRQkW\Ubl&PUfev ށ}D.s෨gzFMy01dDAlpnG朅P#m/N47@Dϭ.$RH$FBzGP5%]EbMAOM;z,-V& mۗ{Ѓͯ|:8Y/_.l9VV̱;vH*kLyX67zF82({՜`,Ph{:Z}x .?n- %BBT= f/ԇ;PzA`KB[!?P?0LWgG@z$zi{Y~pĊHnӁca yq–EHqXMcT/ tTbVXJTTJ6,PZE^!?^Ch28't EnsާE%;rR@G|'kEcmѨ 8'||Q=hy9U I?E4f08&Tu&^d;ܢdQI~fS7 ilh w$PxPB&\> 18 9JV5N5Rɼ ԥ$_n  Lce)= FC߻V4|tk,;q%bt: f29P@ٰu)5`ůQ꩟zFlbZh㙷#5?[_ AӸo +ojyg$!uuuF-ioYQIk vQ2V-O,Kr_< OW'{2 _ƅuH1I H͙n _*`3āmSzhKu-o)xd=aw{*!-dt}㠇[%G\O&VCs;4qEu?xAMxX2Sh5i:| /[swR7˹T`VaPmDr"_n*R O7ûcQiyE]kR䫜8MV6G+PбPD[wY @m_;ۯ"/uIbapV>k㹫3d W-0Vz0+^ޞ{'\k[CA[D.o<rK!]z;&vdچv)*5QB]y08Zaа$m{\b4{mC&*JX74"pK!{yp+6>0R[d3$2Kd-loIu^4Rũ+\+O $QX Hq{9|.MSk, 6#vC'`\]8\B7>K^'TH |&D<6 NEK,\-?vy)]ǐQ-.HźJ$11̄\Թ ؚ?/To Gur7h)Rn7}I''QzG6Y Պ>;F'•y]Y7ET `Sw,6b@||ɀ xїho c_7y?JD^v۬IfK0-W"e#Urp:k t,m;!cS6*KԮBB;\- ".+g;eနQm E4!N}Y[W7ޕWfDC_ǑEfHmַ7 cٌ!!g,&bcz}yTod;HT6OLU'q"эVLdXS=z"w7DEk̙#g9'o"n ^,.zgtN_/IE%fSZLґl%jǛñ3EqO`_nt觍Ch^Bȫ|Vf|Ǻ ?fQ_s`VR^xc{2!3:RW#ZOVJ߭ /R]!m+vMnp"1f5c+Q pbvdڅL5>%}ؽ0qLuٝ 6)h4f9Q, aC蟄58/+Tk֍^яzSpCaq vS̉_ Ww 9('| FrX:4z|ߴi7Z wTڭԇX &'^f_ #OV]+u.P%r 8٭cjUZ\b|0{2Lp L,<*y] +=H4_%1r@ȌNkP6tQg ]OiMAM?[ `Y`}I2w:Ƚ蕻d3uekSYLAU6=-}]$5 ~g$9bqܛcL(/%ShwkDSṁȀ=;O<|^3qf~˭A.'RR&0v˜萯:_/#hCQ@F6J#FCF y1m,cogrB!6>L&xBw] \$şe}/)-sos J" R+1'4:'ZEs Xdt1<uØ}n)z#91 j1lJcg368 N+fLZpmΕV{eO,p1{;%i/˸`:IcR_mf@c3˗3/&\@UruS;۸T?jI#<W +0R.dݟVR2kW'ځC:sԚ`;@%|A-\ہlh pd;+ ̇`8բybҼvx up[,rvP~>T26y0eWTh.\^=$ (1סۅFuk{0esYnSfOrcMIcYQ,P|qr\4AM=^WnۆQ_T(Qx%zⱬl|?!MYbݫOwַ-,ݧH7p#4~ZJ]_I]?o`5pNɑ)2n '_upַNM܃-эO4h!@ˆ>>Vz) "z]k 62Rzm)(qP}ᅂmjQTx7s̝7=d0` *+?k\ux0±Sn̜?ï9(hDD%BK*rijG3zsF)ȆbQ ޺hP2(.u'//hмP7:-_c(}6VWIb[ h0՘ԃ"i%yizfBVڢc"5˫'M(+!@46*+/F&QaC|y}ଈԈ{~91&2BёOu1y8&%Bc[+W= D'Dw)S .^jzGV~*4Lf27:)c|4'RO5 EfE1nxHg;pɃ睻ӪHfQd_@, =9VXJc|>u#z'B HnIM=:Y^JYFouD^ޡ95{}~P%F(F}LBk,ez( vu:8!jB_DՈgdkɞc5>~HXCOpS\`3V(njV,pv,= ,h 艇KS3c*o~4l-)VMougmEe-[f˸ۓ)r`9Mt! B tw5J/$L8Sęy+tڛgn0[%g/qEUX'/0LܻOu+7 }PҔ\-0} .Xw8xOJ"[k;;RDϺ_$& *ؼ=:xR9fˆf3MˑJV)NM3ө*DVT velx)VPGL&,AI Re0#?0umql/\&bHgU<jOfAȟ׫X;}'Qܝ[ߐZw*ꛈ<SE59)09h_MgTiۋoDoac1kSZR2yw%XM"黙UI1Y]Z$+)JxƐ׶9Ü=u8C!:$OQM=7'ӥhPQ^izL Zr6a}Nky/UZѷ{H7c fXòAscPţ!p>/CU:}ibDe7[w'ヮ;) !VA.E¢seR&o&Vjgu,m NoLJ N%eytU>Z^4yiG%Adz=7<JӖ K햔\2;2YkHD5wSq|29rz {?jiqe3E4P'2 5,sĀ:&y|, ^Eyvb8 w-T<ɽbIwhhȀ6U Aʯpr}bZёXWCjX_ IX5]r}vznpniaL1oT FUrW&J?/on" Y(]$Zxj^$;ڇؾAPn a,Y)΀6lCwȥ젃8z7Sh .*O+`S%r%Zfsi2]z4M3Cݫ }]Q)IC* ƂY>uƠ+fΝK%Դu K獵ayĥ!_/lp]d0 NnCŮq6)}@嘒p%O'2}$yn11 .α"2ۻ $ͷ#!ƄB2P:v #2g .Ze$s\ ͩCW~è/b%O'"p#hDR7k"<;ze sZn1T  :XJFLyf;Œ 1P0_עvEzـ#7~S2U`Ap#WA?T_7+W Qjm-.!~:fk~XOÄkc튕% N@.t9)/ JK#{?E9cyjBrfEԯgT_Nj_UE7moFwXjCi4f}VZmXpz -T H[9ۋJ_w-;7a-%*Y@c/oT-@U*\{1f{*> ۸OmtE\4W4+$,D?^.]= s yV=sF-:ہa:dг !6xxgZi'lS>I^{$әK2lcM|F+ޕPxvsL#>f4pbO!ʲCkniU:m=nyKh3og _YuݽJAOĂ_>jM>YF$iwz$+QbS![spGv|x [9/ ,<Ą#[h#ڪSm @0r-2aөҨEJF|Ħo^v gicOpeQ[q`14"dV^'<-'zhSJno5O|=W߉ 0G5<(墁F`ybLgme( T4(XřUФ-;bAsOj#xl4kW ZzXD54 \&&wĽ8jC.ԗzU) InAw2'~Ԧ<bA \[/Zgv 6GZG7+)mgU2zb|&k;UC C"_ځgb@&N{kci}p yO`0`(Ȯ+Kw\-lP١7*&V6&*WO":q*8M uC HG-alQNkH=c.kr}\k16H%1[ul\/ Us<ٷ ѥ ޶ (;%ɮ{羡~芞3)&jP|F_`^8cơ 0ݛxp=0-<4Z4U__ݧReB gSKbb `¹.TէpF:~ 3hu"/!Ѩiwhv?).d|311ezhu Kbh|' :2n~)h i8e?7pGX+ Zњ')~ 3NZϡ:D8җKfL棃+̝ʝSKr5I.y.ƧQ(${#M O6u{T?<ﰙ@[)x{3!$=t)OY6t돏8*SP\-դvRBʏFCgaL?gdqc%KRppk€|P dHG86 KaV$xwx+#IÔF=R2ފ螡%w`~J危Mt8"C_KP2;!?qIǰ&DN2CxYQa)#7ޔIuM+9EJj|y13ɫ:9oIuxnbn28lS~gN.zrzida蕋0 y:ՓLAy,W9yc}v;=Q_SX-X ߆<%l wa 9yщ6/"2Fny|=UE{fz7 .z`% HXW+/xoW~C$TwB<9$!'w-:Ä Usvrږ"iHsG\돂D6r}XU7X[WRf0FZ°cs7"Sxlڸn+xVC} ͵(]cG16Z{x/<ѩi5Qttno3wZ#-V.&Na5IZ/ DkD?Lo73 x'MBׇxUM.HJ ̠S ӤB;#fL4?oBuA㕠r2)j'lV>0R3\4,nwXw1f*',_(WAPF?k-ՃRd`"rb ǿ lG,{a.-A0^4ke2&3R._>(]ЯYΊ<ې]K,jӱN.G6#=QFLw7LrʭJF #K?"hUw }^PB(["췯30wB<6 o[ zI;fU_B;餎LtTigc~߂q; gh" ?٠a`B io.F ყb0Hhs5퉩(ci0^>P^4P(vY* 06Zo._V-Upۺƫf6mh@`Y(h^*ڕg)U‡φY8==}iwB >?ٻ =i>LX| s!eݘ_>?}65ğH̻B ~>2e~'j%eQ(/{Xe?ج/ʬX@@'D )<+Brcj-sgj67u)EG'Ĩn]6 DP c€h_A .=5XRԋuN\o„\0B"VZ$b!s*S8bx٥woy#Y֕ ?gTf8ޠAvZ+ЋucAX{Yy,FW;עgJUU)u20‚w}e__ۂp2sx<] =EQ op8QQi?=`P6LRr^"e'`%D>v.(Ɂ=Ĭ*/2: W?ۛ az v-q7/ J/JmioޢybuN J얙yJ֟濉O9![i\?m"3ӱy"@D3!'̪R-4k ihm?qum`UVVZuxвK[79si3tA!$1w['DOTwYÐaIM#rg;۟mxOP^ni Upprx M@,Pjoꄶ:x"M‹Hw/pVH $w̆eu:1vY55~OAwL{Sל9 7 @ץiu/},~X"A)NZrZ#; glY:cD#(h,NkI`^1r괱yH݁I4.x`.礫~+,*z%"ڤ| 0GIUYrE=_D!-"u%Nw6@`*ܾBL׈{?XY+ֆKHh;RJp1^ o< 91V*EBh:Bz_7]ToԜƱVh%֩FE(#uM~p<ؐ+Aa&:VϩH2w)߂Y 4ސNK"x Ts-\H`!$qyJOC>ߴ<#(ǸxH1pQev]CTJ*۵ CAf嚑[f "sؿ<ƌ+.AIK0:\NӷM"'}lQ]'/AI&S;k<'-[t3HqJ'ΡA?H2YHaB @>(zݭ@1%/U+ 1Խ\ wSWnuG"ﮒO FGUJ+\؎m'_ RƂ*>u#13O#A=rw%%h.Ũɥ]*ust~oo@&x1e*U\Rp#t'Qd [S}>Ѽ޻ӕ"X hf(Eyr/Q*׆¾]%2Q)Mh:.'~Y R@DY~&<)ß0o8G5nnNY7LLMv7Vy?nV8mT,hAk{~{;ŞwT[k_7TeJw-v^@:tfXZ8+/ӦJP,V bbmL o(΢mSM]^Luc ?+0ڦ#2UpG#ȝٹƆPNJ{sW}iy u0}6 Nv?Z!3> T}ֶ'ݯL:h-x.l= 1i*Ԑi#/BU~™G7S2.̠wQk I$I .>T Y[HL>T5li!=Q2=-kNN{1BU6QOoj/!sñjAtSdWnccyRc$YprΉa27吥Ob25TWp(^4'=~BpY[ܾ#\&)>rD!35Z#YDqʻel}[xg=xy?2SBscG5#E7" S!S1U}3a@X̗'8U&H`dG?QBfn $]/~;7^ҿ[p\;ٷnU}*_nBLH':HIFMq6т$+Ok!(mn7yq7b+c:վ5b\ۇji ģ;NӠ}&[sV0ɍ=Xb|q@bbD/K/o\5̚MHdQ)Qlb^6t!Isk00oUGUmZ̮#R|LQe/>P&IBԛ%޷V] Lz\7TQlMMd޵èh){ۏ3pJYeH̨5^0щnni6-wׂًaw [3IM(!IC65#M5?ݼ_N+#Eܭ%*-0qJxd !|9DEO+۝N!(7Rwa'- m_\ Ju ^{Cfn6cwZ0!]*MHnd6&=h}/˫G1ڂIq =3Z x*"Daay-J i';)_< 2kN%[ $MEZZ]lj}\L෽nwoW ArhQOBqw<$KѨ !ҡzV~ql}2Rx[^˃[BYQa`[ߪ˟It b'N`J$u¤UvFc*@4uisuj@!rm+˃+TO+EiD:1*%+[UN;Xs`2_L KO{B3:ERϰvRӶa;zj)꬏ՙr1&y-?U@]k /Q,],ْSCcUu7e9 +|Y^ Xe8 ߱Ō ͼƚVоW2MNsb4A .uEcYW[|CFwNGh߯2l8gue[`n؆w5'ock??Ą(wNC~ kq F9o##)sOlԀ4lRxUrݤc~/ o,CʟIs_ jZW֢neMc`/S Ptѥ«lPKO/7 sy'صCɷ0Qr\2lr`aniNvtu'UbWS'u?|ӯN8ة.UFr|WJ*H&][C3AD gκj~LWaʯGdzĊqsθ {T5Tt I(,sfzi 蚚2 OX$1\㕞tln1ތ.HٹRڢJNFz {r=F(7Y,)9uYMP~ gj >1/2&ג ɜIpm:l5mw i,]oҪGz{ICSTe'Kg#pŻΞ Nxl)(wڼ6C혮#aSY=„ ElKwv7agg* o:۵5E][9A/@;-T`tK m]8lwR sEGdęά _ij:M3]V XתȯṔ%8!hLSU$E7* h}Fq=ooHtLw*F!-@޻)dPjĨ} Y0LMޛJga~?_K *P sYg_{3.^nFǯ <s˾ڞlI|  i{vgtL>i\`[5i`Ā u G f/5JmYܙYJ?}kT!L1LoG.,ij„T'ܓnֹ)ݓJ%aTK*ɶN!ۉw U΋SkX?qsfYa`pG*cіMSg=P[_\l6}-<g_f4b/>@Jri>/J?;f*}1XFTc߉5v4Ծ,<#?>#~# Hw @%IQ_SE@Jt D _}J< 4_w E:,rIDMvJ(NQ9yrOD ๒OOGH:֘ H[Xt?R8 "Q0uc!ƻM#;9oT Xs1ԗ[wƖK'fEcX EXHLEq,V!dV%?(m%"v]'")=2 Tp@\>EmRʵACy8;R dY׬^{f xM[/>%!utC+lҦxh #8Vn(-^Vc#&=K{N.;MB꧸3\cG7J3ӊ(˓Ì]2P%Ɍ+cƪ,]zS'{d'㜳P˱{5{leO0_+:oᛯsloJRz"éLeq 3CdނOkJb)P/v7udNka "ڄ'̵$daӅ bLX@h1ĐD HHQ7N"CM<6JP튅,Q`eB1b o*P-c)}E(8`jZFَZtoH>)Eo%ay>Эđ*8ωG&IKmÂhO|۶ E)vn |k/6ħd .ɻΊGbXs^[<]=sevd+ko2ӣݵ 7|Q"( 8/\)RW A 8fǡ/5AFqP+r!V1kZD^H6H`:кc"bNa [-=?+OnB(74}Q!ߚ{5jݠ[3Tm3qZofX{{Z r͌RqOS#j5*kg??9Yu_G+:/.>h\;w !2Nf6 _<|PcOiR~ ::Bԧ9++5^\KF?u%9B<_)KC!QpPT^IvƴO<2nݲȁCr&XĂ\q^4<ߜXM<M 9FܩbĠ+T m,m ; eQt:fOa}ID2D?{&b 1zӚ⮺6[AU'C_@2;IyCu(x Q~eĮإې| gwᐛjMH*X*[Kz2S ݳ ExM<:Vmx􋋊/RjIxZ}>C&8Kr.zB;Nsj{[|ժur]Ρ EB3zTp{ma'U d9mjqq!Rf'\#9*7BQ4ވhbفc_|V<>0흚)UWIc ,PxLzs`-칮1|vC\3!( ֎!Υf.!%r:-E}. sݝ}&"2!FQoN>K'^ަRm[ y; Åb.`V+jF:;8?#> or/m{ki|JMͿjaqSWJlRG;Vn(]G׶G:qozL5F<߶v^W5hLdpghA?zt+#G<;Fa`fO~$-^Ŵ!BXЏ08B,#ڰF΅ls'`%i$d-ҴPCIhx|MкbU"|QJ=4dû *'cgތ?QX"ePJLRDǍ.0E0ørH2'C ( {}_MFG޵اQH5?)?诸1◵%!Fz7LMD&2 ,C$zlXJ"(*}i#ɛ ].tt;cۍ[%ӕ8˸[yHUjLfm Te6~riOM %?>/u-5y4=^"^2 +cp@%Kߺ]FK'3ZGʪ*R(u?1z :78!Zb`+(yhL;6 [כ yɠ܏&5T3Ym1atڼ6i OA8WS?4u~db͇ۡMd~*'op JE/v[\|넕O>$Z:&\|`wu@o}1Gzho^{UgBQx#r!!&ư52 *0hw{x2 R2JO"O#_u* =[UU𵓝qZDPlqȿ#YZFL%nX~=@-Wmlp iȷscbn[ o'qo@j9|*]duSrRtswzh\aŸa "w1pKĠL:**VL%'<7XgӞXb梱v>θqT^ku6hYǡFZ(d,.}$\_0s$q=6m}g=qHl yx:epe}yܻ:}k{y.hTQ X:]y ˴R_O- uEK<(d*&#{a6-yE_lL"1_-sY'"+W0,y`mnBPJup04Dp>Px\- a3qȦ/kM~Z{NtS8b*Თ8*~I0:PƜpu""S`dCa|L{w!\ ̇Y_1^٤saF藇L0v@o r(K~㹄(+-j+oD2lĨ Wڧ oII0ȹxs?TDI3u `& [|_BT^- 8Ia(yn]3QkoRpMó N7PHg=t=F%r L1 e궎_jEJ8Fuc(r|+u5MʱcR8|Ww7ArӽU-i@z+~9k̻ פ!o:U},Z*;YL$r:u{Q.  m봲;cY; WU`b8݀f3vqt~but$ؑU4zm&5sxdze FTx? 1S'dX۳!3;Ŀ3 Ӭs%f䅿J>Moa?g*y8yBʫs5-Ű:Uj KMo[E?#Mvk'KaFߟuؕ dLl *C8a h?4Q@-3^c~7ލCvF_5F .W# K76}%)iy*/V&_T.؇BФJثl*oIt2S@Ά".{G n3Ҙ0k.N@tHA$J'+iGK)w$lhֺZ)ϧ 3 MUH]#]. W$f;x-P٭v8h|+)x캋_ qt2pA^IkUd E|p DԱN]0yqMѫӱ> Q9t({~*ȋ ]|#@N3,x4i Z_ZX+1-84?d 0{͓##<43I|—"956:D!P&ReT%e&"F)!, l JW5,cbtyL5g9(]ci WHJԯzLkAURzyOPW}~5˘ /r"-5$-P&k (iPXm.P̮e8\)i+,m}Ǒ],":>C[#PQ mԌ%GPo7)EB ޞe'l 9n('旀1AE!E|n.,q^=?!o`1J,tb1jF뙺ʞhb۵&FƾM+=M.ó`&j<3FB-=~s6q!L mbe;ɟ|LrtBTzoYQ]40Xxk>ӕmxr^V6}+hQb){n#W^-~>qdJF1ށ`=3k|Pn{v(STs^]+ũh?=RxT3\*VɖJo+9+bZr٪}EkH1 ;\`>N~Ud?[@,ĔO\Jd6ud…胭 mw,Zf8%E“l 5TfQ5:6Fp bl5ITF`pؒ6OI#-E: mݐoa2 R'r`bb70=F=ɂb.EVmV\N)d ѹDmcfu1*(5JG_4,TXziUI omz_$=yM/hlEO#.o^CGҦǑ鱬6]%F/?S*بSp'yȓ\zz4lW-~ &z8bbCR44J*8b!ڀ񩵓ݜ{pq#֒M%QwKFSk!=KA5'y{5['Gb=qnM]GE&̀t;8Nvb1) p"~sP,!mP[B6ȴ`n)=M 3EÔKUwVӦKdA .PQW)1D`KX[3-m`zͪweR&NsR O&5tL!)-)W쀤b*$DrI~4p@{V?7@sN۩F&}<}j#nf9[9"i?̴<۾u83nЭ+\^8KXP 9jHn;B1&c(8$w ]V j$DᑮhSF_^/BzmAF?ym|>zMjS^ѩ/%=p#Z`g;Eܳ$bt肣bT縈*=)b~U}7PŒ!Y`|nLF,:w•loBCsyYi9ʌ{pMX!ɥUu~3uN۱KfeEJ+OWUr1?;r ʌ?9]IlCٰAu @}aNЛvZ 3MSVv;2X_fH922rbf˅@ˋMUShmzحc:O.%&AZMdVEj`㽤xhtO΀}8 z(kƶ\,VO,hDDXF9ZE~U<zAᢛ Rӄjy-VHl<\lX<to Sd9@˫i tD=VK@EN-E2ÏIDGflCOtfZy?ծX,=h6&Hr!me h>|@- ' ^{O"\3w=RMKCB馨hAPⅣݫqoDQIY΍8^7L2~k0=w`$\!2Y cfttYI5<G2$ y0yWEcrl̶Sx/fF!fo2֪IxOx FeHwv/$1ޗ.*g.GXnϲu BFȴl@M!iK<֫ Z)/!äDR0K6<k /z}fK?4w_?FX (Nġ*~i4A>'cIDc"cWpX4K[df,6ddoW;An Hy um[ZW4}2[?bPEiƙjLw-~HJ<~hǚMN.o>V w[lVU0VB%9!(Rs&ߑ–1ݯ^\Nn@US B\_ t+)߽pkvo;\_Jh@%3Kk5xP?Wi bwBˠW\]W5"@+ePoI$?)2"lCsj9lO-^2;>Ž,d?}A׳^qPJZ"TsFY%1[Y_@~y1D՚'q?W{sÆqHx|4}dWijQrށTLEE2"AQIV.<9 0kV.. pd7ߥ?B!wJ/SGԌעѐ5lu^eAFTvuO&ߨ||<x~Ջn#3\<#Ph1)}Q-dAA*iL{:7,e!#E[} :R\lU |\XwG]ÿf>F5ˬc.Kg!ZPAnageTd>B] $峼!Y%U7bB\-(ּY&w:JT-m3ny2MqIJ>aNo}&Q7z* [uܠW4p1l:k(13&Uxp HmPx%'F#:̟A^>ڭ/#aCQѫL/ qU:~T}_z؏KIeѥ ^4"-Ɗ͍1jHe}e]u<#EM H+^Ml.~~rd ]IAL0bsC%w>8ԯI'= [KS 91v! DБ/T仫ޱj^EV7&OY ~#F)X=6*n3C5#L9czW(g&ƪ|4^[AAbp(6fo(0 sV*2V" L0ؔSOo|Nz`yȥqLf&cpt O. )?A0grTX4]Z V0dNkR&`"B ?c6-uPr16įԂ<Λ 2΋;K2<΁ ұڨY;5ah RtBi8@:+ *BtxF:Ս'ώ+n6x^;j;&@ } B$[h -rkl=\e՚yᓥ`ltkݣH~<Ғx{ЌeѽJ{ "OC"p#O@dbAnU+dS註4n ,DbfjG)$zWD!}l`p̤lr?E8$lw" /Fa9gRDdF4_kz6nr{)NJ$y]G}x=zd6ŢipRZCvv1Hy)485Tn]ݻu"^:LW1 "[`sXaMI 3V<<);oXvA,AG#M?&ٍNBeN<}@. `HiKiA,;DJ+_T@a46ʡʑ&gXدd{ٛi#N^nOνՀ:cGh_j6(.P7Vx% c% :)7<>+lԥ7(%Xuh{7mۊXW Mv,Ku~}\reFЍeF[2FK8@'/ qVw4hVBhȾ?%>0M |AtvvnV651VAs?EX,:F.|za/f?JVd ;=i7@)/FL"x8bbdmi:"8ƈ'_{;v4BaL^Fƒ5) uƥO%+ gD*S?:KհXX]AӪc6L\I()5#|{_V`).q]HoS gY NhA5&s.h7/.|>P llgž :տ)Զ9a[ IՂ$Fr|RAŪK@~w|s=Ja6_2ө of~1 L[r>%D_EZZUԫxIyFZPC/8r Wb+ƺy?"AxME,L$>ka8A%!bz]7}Hb;\]NzW䈆4C^.|ON9Tx7:hcLn~$F >g9홼JusM 6r faGkD_X@r$|D \馇+ "pPUǺ[r;wKM80?t/Ц{RIe^d&i0v;n@.[<Ж5"̼u@#dR=eo⡬ KhK3!Xp78h~qV<^M#hru;lnl\տ[wO]Q#9jm#e7sAj_GhKy M4ݗY3 X{mFsR|wlٿѺJ`]@:P%Jo$RTa.`$& W:ЬNZip*.!H֒ao*IG0' VnC 2%7vh=Ѳ IUD|Z|!1%wpF PSv|B':5ADW@j{ @*NIX!V^!.tu?ʾ[m" 3,i7w6Qw’m{f0ȅ<^ܛE}QG\ރ2>\XP߷pڻV"ނ<#[8Sl|`)R\KD!zuiLp1]Lk׈ U`^rR^82 Ӟ3H.@k'6biN %1mcK0Y0Z ~T2TZ⫗b퉍Pnfq&SDyi*DW(҇/zAS:N%{pB$39IBO~>=Yh _eR<2>N7%%8=|l&ҏ5FefU"P3k+dqJ=>NJ?u!E| y"1ՁQ6z(3:{*!nS(uڦr*E@46'3.f.]1+N:? _b7ۋ`[8c?]$}nS!YBTA0ZޘZ?Z7UDÏR;46mTIf~>D}Q[['95< 7ЬcvEixSoy jB_C>h @ NF˰|X=dٗ\YV=#*uF^&ؐi2FA~;Lh޸# 'CGna@ʀqлؾKZm]1ng'Y>3)R%S pd ^J: 8JI\lKa]:ݹM;e 2c1L/rβ8R"=g%Rq&>2%拾*#uoxvh ةzM51ֈeid|E.ܒM9wv)9ǻwO;'c,y]zIm U~fsX@#ܫd;ڟ`)O )³3י4[kӍ55iÙ D8>9iᏌ}{1Ov::rGbK&43 Cڷ1C'"Mng ўN88dDyg$}1t8+r:V<҂%zEA*: Gą1vsD<&J 5؁@eX0(?T voVe G!A~=5S8hΓQĽϷJ6kjr)b` 5ѲCPk mnh}i.a7VZ m \-k) d E?-Bz~HDV7f`]%3hqUi/yjw}=¿Kma?k|۲Vr1xD#wçh%uo,b\bx]S+ѿ9\d`䓛:ɠHd`\Z?UxPm8Et{;ՖTrdϏt^I1rTS*gl*80j8/[LچWáD{Pg| 154[12(|XS8 XG/X +mKw.gGfďx^%;Q,NY8k˛ZI6UemAx"c93 6\4d kL vt}Sd">Z<DGөVeuthk~$iK`ZnH6 @ O+-@_7'ؑnTD %uBJlSj4"OIH W)JHۀ4:}#Ѹ1^%7v('JpAN]~kh?K#s E~ACL\6Gvm Di!-%A,lz= aU=RA9l\-INhc("G%0\@!7_)N?@K 1^ P(g+|#OgQvPe,fօ_PV-1bÒ? !> ,-Է:qUP:ne 9fvqwgoYJ!(%h/w 'PIx V(\N~qؓpޘpDÇ"M^zr/Hn vMy6pd̄Ѽ!`$'І̑?s^{*84Vs/Rm~<=نv[F97tFzF>kRc7BXQY\*2\y=#U *o_=Sk5cǤ8<%YNҕ>w +_!b&nr9isc*( =diA,cXi|?=uH| !DD qjܫ ud[+bvCe~rH=mmYمlKå"] ٙl(~͘3q>d#Fd H:C7ܡ=\Dd_7)yuIIr'е a6x>U48>z)uC?}l0t|QTȯe{QݖՖOrqI[ b$ȿHZD;5ߌu8wıoI! )M6ƽƩ51u'q[LzJg|v&A4Y[DB#^(d묷)Lod'ͰIZ@xgM)#%iZvC˜pq&Z7,=ƸF[ f}y)19w?bo'B]Abn\:tBUF7+%gzP+A K`+)I (.Od% MY( ǥ^&;F NZWgGҾ;#&L#G~=esr~"!//,s#2iNvb8) Rv3qTFHFoFŒbv`Z5$rz9KL6 50AM N!d7ZY" KQHqڄkC@T^U{WTefG@PrP߻3nr u:ߝvD-ˉ݃'2 v(7\2v 5f-MijN3M+w>5QJ.I=yy*{|rgV&?iYDLNHUhåHJ:59fjy? Ej4\yT`^U0$ 3u009lΑF7Sw1f}VuQWf+F 3:[.NO@?krXWCl:Ruy APτ35c 4d֋3 /4¨H-8XiLXx>* Tji=- ,>2Y¿QLX7"d 91JBАtD4:٬.AP &n ʄ*7( roHzE⭐ OWRK 'ۂS7WťFQӆQ6-Zd+?Rk[-a\KU,އ8#>v˧Pt\c5F_w* ٓsCc/㦝}1̟/WnT?2F pp#r`~*c${~HڔnnX:5- bo/6.`kQ1|@]P'AIAhL}g3k@K.7on,T lQNQBț g>vu`O ZZYDxpfQ=j;$R5s70cyؗ1SP2=)V(xh9uY]_It5D甲EAj/'yVl:Roۯ@p Pߞ tʆAJwFLlu!W gF0j +l Y l/Tu#zJ!Zqv׀%C r ޡ8H𿦩llHK/(fK^'O`H<12&T<ҧvjP~"S=XHy/k@0@@~wk0mskatVS0>1c޼V;a!!9aq{S#kkG።unM2!-)oeYBf5dZiLATy1Vfת`s"||SRra⨘N&ϩ]|C/%pKgJf" n 􀛏G#9nB.o'[-%?ʸ:2X#C$ڤ^(De8h(//XqAy/6DhZr /`U%[RP]{5oLV'mEpͅqhzpmwA6VXL{ .OkRw,ŰJ[Hj/2lըOf88em+yAow\-VWڡIlRt~>Z913uF<]hbV`-,@rO0x,7-sv"%q|X%rw83\`:M,wZ7u!J`? },)Sp{Y>]'̜4`3 8i/[wT!)BT|`2 ~HeW<ӎzIQBR,x`x裈R1.gr-e{ =뿨^Y=oe < ֖aN~g2 }crK/~c!V!Ņotbe4:_>@&ŅvdWg^=p-X~ZE3о'>g|DM|bIJ3ynɃq}ll:N ~ʄ18ɂZ搬A US7ZK&BčˆeY[x$*n V^( ]D9:&ًxO(vV>џAN$hMభ8'([(ן/"cm‘Ugr(:a)=m|ak,V/BT?F[y>CiLmQz~Wp fTˡb-yvKw⏅? I&,+0h+)5 јЦqDhVrx[\ yc,$U\krps&Zap"q"7$W|}R]8Nae׫&UVKU- zߴOʗd\%P #^K *lmӪ E&`-Mܘò|Ħ.$0xěyOQ]5ЊwpoZ?e"hJbI9 jc$ڗtC>n u4Mbݫ?{DXG?IN̈́eNHWPi0qQV* =4 hѓ3=c6Ry(HL.yn(aheG R3 6Sf; 83֞33NoпƞyE9q|9Gvc>YbB,Ͷ C|p qK0Bce YNnfvGƷnUgJbtW:!:6~Jk>gBxn\=3iU .8UHZJJ qC޾(y?<i\B]z%͘ Is(#z0X6@,%; .ՒC]0x ᗸ)F\*mpRtψx+n>2z|5 노}}b):]j^ITkȮMi#{b!m0.Mz`]J l)hgM:Q|ꬥ-js\\$M׽2#Rʳd C!ω >5J{0GSiP , VwNǀDYҲhC]~y)e!gyǘ]e{R{LILFZd8Sn4irx;ܝD͈W#!ӕ5/t{c_3F+,%AȂ>lv]&@ }l%mʒ]Vػvw#kM6HP/}i4ISJŴDR,hGW+]< 𑡆?Ǝ!E} ʬ^N9$kPXFE;3|`v-u[NHbN}C%&ֿlw+xu;{4f䩠qx!y{޴IWG]A@BՀ%__4w M<3uNO(vzF7 Bx60K,?Vi2wÙݙߌZ"4Z% YQOQt)h;4E؝ PmARyUM`ò4H"; Nbs~V~2 x@S9iU򓞄@ >j1d+a LϗvЄne⛵ ;+.;?rzy;ڛS =[d`5~ Alis,Qʼn9Ȩ]-PBgd%Ȩrnx]iY󻍠r}Bݣ0]j=ĈYuOl.9_6okrɎ]a,!}-r\ׅkwTzZ {Paz:T[}G5E~Z (;mĐ$yC+qlvmih6 eKЌVJ-s ]T+,(0PF9%q^&'bo>XDP鎱+9y=g~ lk\ UuC_`_X"tw`'h9i~@0;hHAHc#9K> AŭӤU"/ PۯfQ.d/ޛmBZY^/)pFsΚtM7gIVXJHYL~2քmF"yѳ;̂ƠCJO*g)U^)$"ڎT Cs8ldܻSPm35t9k:omF {~ jj^W gGO'Du Q*x ܣɋn]}Y2MI:Q6 ʔ]י2r^GI$6uF@|T0Ч IJq!ĤF{gCwym)d+nc" Y d '>Ԭ, ["A)uS-WUqn[pbYכnlXl^2)葶'=$ C tMb7K]Xe=_h]jC5^w`"j%y0gLr1bo!炋CYxM˻CùLL.!Oy۞E)M!r#']J"ZF@.k4o^,N&uz![4U}ՊJ|R{WSii1Qv[nPSLlъR45PkC;((zJ.[Ao &fj]k<<ϒ1n!K`}lyEG]x#ux( x, sPOvϦrt^W"J"-}ܝYޥ o/iu~O5j[xGd:7z1J-OoȩC c%?\-8$,HCk p /6%&St TG$}m@U3BFm~'Ky_3%ountqq4^ⓙL&FOu%$#jZқM7#;$_4O r|\yu-g 7<˫qj7!o{g*B6SQޜYx+nOTDHl;{nɨX> $orMCT7FFHNф5GpūFj-&R(^œٿk_|/(ueKWֵtC&I'AҢiT."RXm2&_Qݸ ? Obug wT%csܥ0uWd4gec!Lw&򽜨8 yf_b+ld㨴 [m$*3 /Z*B&X9 J!K%)g.L,!d3.\suY! 6{ }jNJ͍s\$k*0,y]-q_fD{% ҷs eA!WlW/&0i9?{Ʃ\X&Ѷ(,x^cօ6r 瓨\QqBGGpRh䥥(|Ew5TC`ɉQz:`>v ]ţ* bʩ\A>u6³rF"&_?f9.z;νV:I0nKy?o6et%y:a+ާj?CP(ꕚNdPR2uim2ː@H @%hNt0bQApJX: (nѠn?Gir9Ƭ^ZUOBDMT.e|_>D~8{y~U2hupU&rV /'.ix3|^y&q ;ʺZ^ytZK1LW ɡA+GvܴujoAk16h,c_L ƯNѼ^`;l+ mA=͛At$qMTh=p٦t޲-KHwW|hx~PӑJxgckgW>h`d1.ÖD ?ʊ:JmH:ҥy 铮|Rf*ĶT8ϵzA;Ɖŷ-+H,TpdžIxLN, S]bMSݍ%ale2Q/wNy&>DY*T- ï(2 "2pk;R\2pbS\މrފ zj_ӸbfE;}50Q,N8-yb&|4Wso͢s!&̖]*2CBK٘@ܟ;26c̩m7¿)0SB~ȯga8fOgN]meJPFЗo;dz{ZNK/RhߗILH7V"妬gr7x!|.xF}6|Ajf]4O\ SM,"J Rmhont5;;Lbneqky}Zh_t 6DTu0]c9ٺ0eESmۘ"qtѸu$MisH~+y.KZ=6̬SRC QgQڵ=gap1:Ʌ 82lB3H2GӯYY&Q u!<6l|bpLijKsʌԩ97Pxk Gqmj[ w#3ZPVîFxR$6"r>6`YGo|+ ڪyDSu,pYC&l`f=I"\ i@| 6{o O}I7D&:v u/slܙp:zJyr`>Ŋ{$ZaHNTݺYL:`Pb-2./عNw%\zA]^TmaFcBkERSE'M'GeK&/ZU;Bbg0` 9b4-pYڗ:-~FH`q.FK}"Cݤ*`(aX2o%.ƣ5}XwD.uG`o3G`9~uN,l:,Tt\o_2,6/ZƮڦk aQF _ܽS>4:GLT 3,lc3ط ccw-ׅC\]KoJ tIbGTVlxvpX~7dJ foiT7J*97a T[r*Y#t.5f;a+K::.VbBsblLn2 Ao W'Dc#أ狨f`lK7dS M<} z 6YSF}v%] :M_](vEi.xa6v4 Uz?`WP]XJU. 㵳f*xkHam_r^}:uKz`ɧr^!鉶r)-Lr<fi|/p<* w^^)rqfmۭ?4E` Rn>YsFm~/r5ѧpOI&8tOٻo ضS*֖>pWn{u#L9wg0 :j1&ЋRo/\ R9 qv( `ϕ:?\^n+,5xDS]D\%,]! KM#=}(X@]ԂY$s\xT ꧺ-4{)l)l#Sxc 9A)TUDJ%)Vw fd]27j^Ne4i?oӥqStr(; [X(#sR k۲&?:BY#6`3MG3{풢NC Qڿ}TʣR!;X+̚W^ /5JO1OuiJGqdUW)[1.|xVd]k3='7Wo+h8V:]sa) HlQzh&G ݊-OBXD;}pLiOٔYֽ[-`TOAXړh"x`8L`p6m3 # ň-rBPu2MU.Y؊Q}깻mУe|Mq KoO=C~x[|U )ȯ}i/lw?^Yv6OLB:jf>.&I[YT CVs՗sʿ/p !YD}KsF*B@W8wVrњl =>DVI`]5[U椽AK)hOpR&ݹRp?F}O:9ϭuGV6ۺӱxR9TOXhdم߭n(:2/N6d Üйmޫx]; / "|F=&|,MoyjzH9+P*a§BƘAaWJ_X֙p[a;`h9:mG*n~78 =*ń>' :9^fU4h& x (EȪz^,zp't =t*fX",)0Y7_ڪ')nL2KMfUQ54w6@0 ȣn H6[I 8O "L`i`&Om>HkKݞ?p]ɯ~&ȫ^ Ǎ*(ߋ[VpG|ֹ\=PD jb6%7%u{Ag WT}uj\vݧ 6#+SM)LTmlxX'5`⤆^+B ÷[vj֫>&Uz81p(f-l W ȑY{a1.kì16@ op.fwqEMI6lB045y!b>^cԭT*ӥ'nP{ CIwNZp3K?F@ "^Q ەMˀM!)t2r״)fmiS-Ľki70%s5FC![jݻYa^%' 8f@\.(Ov췩vBoq0Ǖp:+: }T!|1gPr M0*p1Q<5sS[~>`.D #%ɴuyc%R9ltlzjX/ƜbOK}tqIM[AW,/jn}{_ 8Q8|WB>K7dcr?uc7>AV@x̾s/~?q?sk(Əfojv֓ "I*/Zt#@[-xЧx 3>;,^z(易::z10p\ I҄L/FTe]2Ke^u= X.D+-btͭ6c(G7h-?sxrCh ;yzoׄzD:e==NFsXtl z<[ Wh,=2i=O>cMSU˩ּjVLCURTo4l{Z\f j7N8Y ËɎJ5,t4"P'MQ=LW5<&d5QS5aXr*&Xyqr;<"`V/Zw\s؏vp S bb|\,>pQUG2G衲#e$ᔐMA>9164 CHZA>2uQYWxDQ7ES2 y~ƔzDz9$16tG'a3>9KFS$ jPXjqXړ痾Tjn\@HDJuPB)Z7`qʒOTqJ:[Q^>f4/rþu|;]LtvCۄ$@o#wC\ Zl}$%Vw/fbEpO [8QA*KB?@R'')vx;[^I:G 6{&)~LG Ij +Ӷ_9m4Gu̔dZL~XU7 ~,٘ݩ ٠dصG4A YD)v\{Z.bj^SpA:ػv-k X J$Yᶰ5Dug=а2/ nJLOǮW,<ߩc1ZuLLElbA,K+ٳz߂ u>- Tlcn ? iU=F EIWؾ1G{p_"Ԓ-2{ ~&7oE:0xA52w葀S.*Y(ZxmךReLp9)ue4!q`WbN܂jċ} HdY̿k|7Vw*$uE᭹'ӹi `]MJ Kt`F[ B=I*}X۹2bAx (һ&覑_.7t fUVf|LGDG 8jIf7y!`>m2@j5k ŠVӬ;EUs뾗.6Eip`+z;bblWD#6z xy$Zye*dC4#顉hϽ\aCAMbdI`M r{qӄns]ͫY*w.ã@?pn{ġ 3qՕh=jbBbˆy\M0| `Ao^Cm] ۂ K^[\> !u qf\XI13U9,oUC`M\3}D,97ê"ܾuXs&kxq=h]$;{kٍo2˫|"W~PJ!Y=c{G5],F\I-weB;$ 4]6(6/{D!LNz}>#&X%;tB.qEmXt~?R؊2;zssΖ"G.'1%b^hE틛y7B{C,{aa6;Ô5H۠H Ieg-m' ھzL>H"2ڰ3jO]?+)0W%4d~yyo:wXV`BuWڢoU7I~j|zPe|Y oVe:.xR [멓ͬɰ1JjhxRI*ߩznu\ .5S:OR15+Y(;߫d"OH}#*kUD,^0Gc饿p1V+ʎ vSB9k5i8D>c󩶇Ga?*p$56Gn&W Z*vZeԤ|.HyF hg{'>e8NMUyYݷZ J6_[S|6ڶCy~0 ^xH2|lm uaed)Lˉp]ȲHU&CW7Vcя;N7q\DvsR tâLm cVO#AzmHFevڰ{Slо:Pe$rbxGHVJBrX6:>N=aUQn"%;T=H:&p 6Nj[$k:]Ou{_m/*$jԏGBc|REye62Nm.oٞ3 [%]hc|Wz1_jq982yRUFܳmC=4oX~-$O{nr~6MJ:/jx00$ٌ6%^Tm4Hõay 3 )*ꢲK Ů 4LÁ*[>Q?g4#&p }Lx Qfu}heJeFdJZ?\C]Zwny G@q8* 31ن?4EFq:cq˂>jڼ? QU̇cWP*0}/(W,wxLFΫa.8"H` T꣖Wg%? Ok1] 씷1d74 a`Noe֚ ݜ;.S5_dd QVF'|1X1Hbox{t,:`e#m &P|u "NG)+}C(eqw'~jK*O5_1Dtۇ3ssbzuy8M5G`6 Q2ez7S["SC<ך&C׹3b: EJbwŕi5=ӯANuF?m'e[\ESbgD9Տ؋u^[%q1,%3SꡦUvATN٢Akf`@tvu*Y\)m4zd6^d*<㗑׵sjREdG׀{@ؒ;"+1xAg8:1Y@_2'z{[F!XaCQd;kiB *TX:fvEXN8IT+h!P;څ-5b+ShӘ&fq7Y^VqhI #P< >m q)R) ٠ɾt6x{5$+mǙ%WPJx: х1,k,~bo@Kl B?ՁUMjͮ!zʜ9٨vtujz!k#Ȱ&; F9} }_6c @b-X$+ .6s3?WݖQ{Q|䠵&i7wG\{dc; '8%D eK;GMy[Mc*?ˀQCXDON4'5yIW:[b c)2).!,h<}&uwwGskj׮YNAJ&9֎acۣp (&`jdI,*4#wlâ#ru NM bg} Sr V.Պ×bDW9a?Y%tPIiKzQ%)P˃R)~y-Qc`>?DG5lfe{vAeP y|z#Y !a*Rz,x'ο 3=<ĄQn$NL* 8տ]t*kŽvGӱ񩼻[XeE»IH#W˩[:ꃯ&%-!=қAQ[0Lƿ0nv UcAsc虉R/!yۘ3xyڗ(Wؘuk_g"!"-If?G6"ZڞVbH]\>oT58F"F1}Ļ>hiܳ ߏə!Mn @un/C? ̢ OR9]L};<ĬO@or:!F@BdI+aXDI"QR#yrX 9ȹ[Cf0׵)c;7ff?zq(+[ϋp,>a _k qN}rx(p\:mE_S 5GvXn22Ƥ {ucPhZd#ŧCBDPZm5b6gA/K[-X4r-[wK]>cL^im>$s"<Ԍ/-]+Ҵ\VoNZ|Fupˮcq.|1aۏ%@vvuV8P T}*!#pc})d[FJ1(G>]M$)yzĢ@k4'z L@:H;h:;KL=+ D~+舱'9M^&Դ2!0#+BuEpEၤ)U1`A wjوRɛĀ Cs,z޾! n-UfL~.S̠zZ~ش՟cP)-t.q7tG/O~],4VY)taZBܯ^Mc3u2-lUP'Iكg }=['2ӧ:Y'y:pwf^oJT7P3ѺZ*%5nQӔ ؽ,8`]gSoՎ8K69889XP vs31ʉC]3XkQՑIk gz~PnzׁF {*cE~R.zv>T+FD},]7N6D/[C#I5d1(s7׷4]̯@'~;ݭ-pfӉ U$):c_.4mmBh6i<'go}YBZg#e Y>知#|FQ!D/ntexwe+p FAna6kcYcנR us.uIJ䝬ziXBb=G>2#]\7%UriUCLvC%6X~L#qo~K r=/m?gТ7WYTnH dpiD&.0Bz^ed q ٿ΄2/2_ŝ3us !I;aJg^%g)HE8"ezo'(e;: er`dAFXՋgAʉF|تd'6,* cQD:fs`785G5;EzAjK#i}XHx nG3^>t!1'I. %̹;T֣(J=Ɲ Q.g },mR|69˩u8}$/=OY/_KXi 95g*z'NܲM@#[FEdYFv/΄&nДk  6bŇ?xn%ҍ3Z++łLBWϔ~I嬉:I~ȀVnCLdK*sStކ( Q1F#fDRdm)"D.71 :a|O/NlzhhJCZ\ 7ܝNͥi54Q{S*F>Ɗ]9?5lK8ZLf4 !GTSp iz!W2hzxc|9=ATJ[7wH.?en3ŲuetR~nĉIQdP~~۝Ya/ш^vE:!;($}~JжUZߐ -wFł*TDcM]X%]aQo |-@^f Do> ~|)[F_ݴr?>v^&AJu3vgkGj>~h|VMA*JИm*6G(h:n+ȿEnScg1>}]v2y} ~y$^#;]wih8+)3Fq>Om Q|bz^_c| U'›"VWE.@ [%P:w$&&r„U_mPMkFl Ag'k6Ose Sk\gq?qJ򪻏csF3%qYWmkoٮw( k,S1x$+ۦIdy)m#U@4HS oΏ)T1|jkK5nP 08t\nK I*6V̝a,* ~&{F ^s$z6:Iɡ{0vk5";]VU8h~!*f$+-Y&XJiA((Wףg5Gzr4=FGO+3itޢ!s^ ]C}{RiZg0RdGտњ9-ksG:JK57@ qGP;/ls=1`;SUwH 꿐-d5@=DMisO6ϝ M<AIɵ82]{Ie5oS zˁ6&A+rm@DO3?l ^qAuYs'ۤ8׸^ v|b|L#%mDo55v+HX|N((P~ދ dfJMfꙟ$+%;Ywq}L }ēH[1Ag%E D2ٸXƖڱ&݀^ ˾Qگz9yطhYTԢ,-0#lo5=Zq'# ;Y: KFcnZf0 WOR2lx1 +z" YRL{_QLv+SeMB+a5e _3cJ'uu0ogeCUR^oh]@mjoiDd 9j.эZ1h !8~IqcR='BC1\m &Z<{ X}BiHh*Xq`vo# ^0(ݎ2_UrtxVs-TSQTf%r_0PT=u-42Ƅ8[mƼqGH~ &` %mp9 3д v B3ޏK @Jx%Q >uۉ]J:Nמ`vn@ ,c+-L5C=^9h7d(-:X )[  F~ι8pȚ+!C TF){xe V *{@q[&3V8RU^ܬQoxyUE7d @>b]=]gN;UpY;vփ6tWyiv {h<`;j Țr5-*?*Mf6Dp/ Wdx h \/KvX' +-x&~mnɵD:ybi[䎞(YNr+ͷ,3jdL_><|@iοA鿝-F|Ӳ>;ҺVjw?g&7}ðUXZԈqS{f=g{3R<5 #tcqyoaZNC8NY,t*3+sq=w7\tBJ,W3[C^!ٹ\9^t;i_v4G;4pi9Fyebnt,\,·1(+1%;W-г-S \# K*ǃ >~?q 8< i ΐL (RggPg+b-xY^cEM.%*NCmsWuF:_|- eŢI1As(*,W-\.Xg=ɠ)3.&Hz^d%\73k[ ~0Xk3BR(5) WTNB8͍pSwiT164afJxzjsN)"_z j:_,#C1ÝXoɓ?+@3sY,a:Q+]X (Ka7 U5ȴi[}r y[]a%řU"z4N?y}L T 'ACo#!0(>73spfp%T2n,+ mKao7aa 1TjT\}v(x/r:sKy֦S]D>E9vvL%#ֲՑ.[3 &ekfi)j#J,̋H"f~P{;}]tz칸FA?H3gx34$mTMUUsmyz`Ry&!s'; Ajalz6*"LRV S(fYsv0WrP2^a~BYDJO@? RQibSe *nՈ3-f JdH5TnKydPhD+Iᤋ# VbVR_xX촍|^@2kMpEӬ(Y%FJ$f+?+q1T{^Y1 ={htg<0c#D<gY8#dnn1 W[ AMYT+6! Ъ-'ʆ.r"y11s)Dv'b¤ЀJ(FJ,?*sJ a87:A1I2=E8ZE/a <$WPt94u;vYdTIMlt#x4fw wG -l)^S1l>T~e#1޿Qi*/^#O),/vEuhě7G=T >љp2!T"6v7!Jc$z^x?!8"Y/\wA;5RήA]Ek࣍G}rL?Ib6>2&鱿{CF m JTYukb4JaϐkWp7 a,7_vR;-6 1jo nqރg.nȜ5x\ax˻:MfyԴr:dm8n߱\wiyV3ߎd(ؐ߹ L%YrTF˃: ߨRcs ko=9n-H؂%A;cBYYs0F3M*Pٶ,L9?o#~,gxۮt4Q9igVhW"j/l?I\xK)@+BwgaC3On>rz.WT|-_b?,FI|ӘQ1#eP#gE߆9DQN@p`ZΣS|}VU|;=a-"1"t"W9bdBNCH5MGٳ:+.^)#_=Ʌ쿬2,O CW]CNP$Fv^QQ#H[n* 77֊Ax,o~&Fn & \!Z8 [ R͆Qz?,pW>T<좫bb!!P"+kKx jx-1GQ9&4 0$j,HcȖ FOnKU?SdsırlKBCVZ 10PY;~s#u/c kVY]C2\vi+(neFe+ӫk a u8G HFeܭh5Xe9s$BʱvI. 6fa5}KhJ2̷DH`xqy撔sD=Ix.%~xfKu*`rB1k!o٥>NyxOEvJ7*s-WmG's>>-_+Q/avdGbN`%Coux%Jz}kwU6J1 L"/ IppP2t#t_828E䓍^._6l>I"%'$Xsn#6fƶ5+>̢9x+8ۅl4ث};iA|e!xb ghaA#_{ 襌:?+g| I J)q!ɶ2g|Z ЄK?)cCC<(A&`M 7g-o`90Y BИP$ B~ҫu7%MTET5nŊX*R, ڍ?eRl&\>5mmdė-1B`)+>0n: P0S1Iib뛯:ʣ,]5 0~)ee?uI"klBG\&p+6Z)v#%MGyk[64dPRƈ$ Qn%QEn`gj#jQ1qzcT`͒ZOb7^NAlEoo$oX7wsLG}Ȑ)_t%HHz%c͢MF ˡ{Elo8pOmusU^PʸY.cQހT%lT)"*:]%69`>45/.UFdD䏜? P^}] "ѪCSמ^`Vaw6'>v{, r5HNP];LbEXDeڰ{1Rp^)gN{>KIsЅW=*J =[)&;оW % G?^t{tZO\t[FTqFP)#IUK7owAƤŐBx.C%m0مᨦ%̿0#1dܣ-cQ 5< 3 j: =}# $`w_T{_E"P$WbI+7;+p EIg~6=>U*jh!e {rI3Q=R#SX<*[WF0)@޵ɡ$f_8p)*`>sk 0?v ¹,)?>4!/HV 7TD U諹d ,*׍Ӝ֨6HPVm/8o(,SlĞ"yQ;d ԮKKZOfW"I&t߯yƎvʻ:A#:?V apk@Ց Ȗ7Vp ș{YR-Rč*&-ܼ,9{;k+O~Y@o$ca& i Ċ4ݲ'B[ > MoiC|e!b=U?\JDC%nǧrygqb` c Ȱj69e]gZRvڄG"MluElœφ5bnϛlTh@new]A@zaXOb$`"_TA3KsoP&iƤ Ƈ@Ehn4\2N߲}9eU˱ߍUl)3x'?z´&ӕ)wn yvf ފhx3XpF>sMULs3|q5̵xq]l`6rVJo;0 8KqyB&gU;:muX6]@@ W|= +uӞc%H (!jڧ6岶5B'0<9S^Pn;-.l#'3!Sc_={2Ԣ3|=[v/W^P ȞJQtlWPnlƣ&UR&CM/kYslnx$NT‹+CP.)EnAAeN/:^dc\ȑ:aeVV tJΊNJT )}nbi;Mq?#ѳK%CxQ'kb4dLr=>`D$>pwfAi`;xQQE3VIWb*ǘ kyf\dxK +?YZ_LbefUVsY6'0},P+.FSu/蟠WNkr'Sn1q 8B㶸_%8L .ZdJԵv17c4zV; RJc@Uq+z.2~Rpc/}~,% ;wlӊ;)KؾBcglLiv&E (ʮYA1߽ݨQߣBP5V:[H2 ~'&-x);́ECdy\zd44X Y֓z*AHbܵ_w!gFŴDRx(DklcinoǙpBDnR445( h`5^@aQ2:%9)ſ-dQ]0x̯m"w/?o 7O^fVFIJȚ7vB~)Om{*ΏH@"ȡC)D+ nlgu}%Tws]KAu4HqB @)J.Y {uooÁy$xW2qnaUO2V]"ٽ0,rd؂Sw?K>oe!$ns &&3I./..I n]Hhy #0-ߴy?"g\' Re˘5u_x܈{iboYd@S $$h04;'BXh˝2㍹X2_"RQ4g0_7v03é嘍KnCt,&C~U՛,Fy&Lh|WU 4 $]'}hi(\[8.2xBMg-znw'&qYYoZ:苤]8,01tsc?Gޕm.8Df儰¡0# 7)jk^1^£F!=Redgh%L kρ./.3Y`/әhF*o̅G;qm pbu5u!xO(lsN*vҿ9CjVO`(lqB,{!=d"||WH :׵|7IqH>ECE`lC#md)QC1Tx58+tYv&ڒo%8CAKt+oh<2L|N^xGSNc5:/ EE)bVj䊀޾$ŊϗҌ[Zjϋҳ]/Jbp\OqFGmWn%H8Z:z[/?+CGYŵ3ڪUjƌcDh[sm5 &Z6=yҢ85Y, rr]t_宙e#<[.ׅI\^L9WV^VvQrmQ1km椪Ĉd{W"NZ,-Jn4yߢoҀq> qF]<]'TX·! ڦF 1xGaO;1W2%SK9wDAc~݁Bn`1UZF̲JP3=^ 7]ԘaY]g0zg,CҮ7χ]EJq؄$u([Ē;۔/$} Mqy]5GB`}l }@wwU6{WŠwHղ@ d1Agx=֛~!7X>1VQb^ jS"j|Ɛ^Ԙt)6#POKAz-UK5 & 180|71d=!XX&x5@#μFSTtL]iG/(QBxsA!]$KVrwId'mGgD;l; G+Df!^3BҶ;Sh'r,)eu쭲`#J4ؗ!'h>jb/dZEC;)DT)FxY+gWjkL]aghI2;e3~T"Fh_yaeJ 5WpOfa'mڸ*6=j'z|^=~DʥG^2SȣjJǿkag`of%p,buB VAy#ٺHu\lpKwbpۇm0]tZ߀oPOToNh) 89+?,TKU!{˪*mYd) L*IIKK36f?AUuPFpe!co:W D2۲e9fob 8(3B}%X~CQ`yRH輗yX Aj\.B^z6(gA29BgZ`6LrGfT="<&E$n&#cw8Gb,{a5G 3 6qyqt`=%qM6 qmn.[HEA7Ɖ H*BqEy 3^܇kvڊOlfR*œ8`6Y[~@+}yW&JP)2\%֊CP!+4%izbiМN[0ïp{8pnzi/Κ i[TkmSuopC1)/ uA`Bw?8!2mWs5,җ欌s /louJkh9v~3ŐOmQ-$UC"ؠXH3 5H1t]`h4Jؾ܊@2^M%z҅"x夻ccTl]B J+ɉ? CH6ὧA|[\q,e $9- BA tH1 BALrVq.y̻tO9y~4BW{4cT8Wqߢ.B;{SU/]=vtDJ}߶2ML6;ry HѰ8Ł+5EnF[VHŇfapF==[Ms9v 7nK>xKxҍOhH;˪4%(d#&(3UH_,N\fq*dI EU_Nn^ 3oQx= $.MѺ?JK-fOABjhJ`%szqZK┳v6!^pm,| =% sz'QyGHX5RT1Kt|7@_\}6¢.Xlc jim[R{O>1 (jmp ľnb43DP}9ܭV`ks_yB#v*}U48p.]v>:>-\[K~ gЎ̙dQz* ?`ڬ}tDBFBovP1 #խq(\n_ƪmLn5U)]9Bf2/I[;:=j.zK Nf! ,_~9m.|dV-O8؅r7DzVJ1:\/Acuj73t= Q2wt?Yxt&ِ 6ǻћ!ِ.oeQ)R҂S@d&.΢Mu`5:ei YZ,7jG(GTtCe @?! C٣yDŽKf\撁1SEx{K{Mm*f(O#4ms)8d˩|_8@'\HZ\U%RCVHѥŠ>5.Py3y&2{[ ,e!h <#ˢ'F ".-W\KrCÂ+zdq]|YD7S;x8+ݯr1ϸ{ KG9&yE:VٙտW0tw_wtv $FrE14BDΌccBUfzv5%a?C5/*޽1Z}w-7ql8^daI]; t*,%k}"ke22x'%n)Hڜ(0Ih r<0uy]_f҅6}G,:U;+9A,OQ6rXuŽ)2hx8dTqQs 10 ~|?=l~V)ri켨J#m~+SY^IM$M&r 3 4c;-|| ~{Kk+p4L} Ql&DorT߶ɠu X;l1g;sP *4<2;\3wes$FvieZR@.~EX|28bLԩ@8Em%l42E6#nxݸ8lyLƁ<Slw_[+Em#䶗JJH'#![] O9 R֐VL,Se8j?$MQyZI̾}aB C$j,X[J+7Q~\u篂m=IyVV7;J"x ċT} W窾ʆQn񲱘," N)U vtF+ v7M1#62^ϐ K|h -xSGi.3c ASbEc_Q=铵*,I=藨 W ]zAo|o0{ LٮW01~eŰcq'A*+Vqb1}_~[Nivt?r QLiSoԖ7{)ujz'hܟ,T_@hf`ƭ$|Q5wZJuh@JR&1ǷB_caKʪ/FxBĔ+l1Z7T5jrҼ32Y ƕ}`$UT(sMX riGM{T hrpj$q!&:d_&1hM Z]a>_?gɪG(I׍b|O=Nzo RF6,ɽ>B?g`A;}:?"0ͨ*F.~Z_?Uh4|ܕ蝐Bzi^ӻ|s7 &,j`*q2gpN_vj=X"rY?]R7x4$S#R.tiq}+L y-ѭSVqa K|ŀB1,s ;st3Ivmht7Bl97ҳbǰSI_2.d034gRˤ Bvlѹ?}x3 R Px? XE#*٫߼Y# =@G5sO;>X~/7.}gⳞݙ>;GAxj})n@^AE-ϩZ!6.MXuX+zp_4!$MwZ2niIe 5:~3bmyQl B)B7%-+!ƫc1ſKAĥ C'pNa'?M ڐFDX6!ۿˆ,-1_d]:8JVoSCisr@@-$/E@k,|3p$I`R΢ Ł )Ss&'dg5]>b a96503WWǫ[-"}Eu-Q-YSVFb3 8J(Vw\@WDvdUi ~z4>kKq'1 `"QNVKJEeKwWR[ / }_SptIʯTCymg_GWpggGc+xbR@kP<oGm՟I3bEɹZpI1Q7 \%l  /F, 2 sUTU}b5m%K78/YdM%1G,k* 8i3!l55|FQ[91 BahHZS}TU^^jeܔp+#0]*iUp%E[HP$ġYa3i&TF!KݩLdJCtgDfuISZj%@N>ZiHbuqbLA0y"l'XJ1LfZU%P^Icȑ3}}RY{mk4~ }TT,./9H)BC-b ;oQboBMaȢV;އW;N% -)_d\%=!rgD̐lI9+R"a|W u{]B~,mK? jBkǔP_ ] Qj2V/(=z#Ȑ9ux$%AqVQ&Jzj&=O]dIFo*ToMGjlt#ޫTa3R3mY[{S3$. g$Aۮ4);?5^OT(IJKI/E`/'͔%?XxHt97Zld*S!/Բ5~/U޸W׏EK&y 9"So]/iE~Rp*iLuerS&#u)-%{Ȅ!JnREp] nd4Gen-xcyR&0<}^_J;0e}N@3rtu>M;S HsJF DEָA a*rΌ%taXlg08Ҙ6r՞٪/g-0j`$v@FܙN=dWR=_bcf,n((s{Gu /r'2U374t *bRV/<E]0'E{(ް=p\J`L0 3;rJ$(9`A~vyA%3@c㮢A50s/,^5y7͒c%G|J/N05"yP]1Rޡ 6dǢ  Ex$+m kV$1OJx+)X m({VkVu5/ESψa%~ȣ;)NyBp&Zܵ=R ө@ЋBق>x“N C'0VV=S,XpP |Gad1* TªwU-Q9sICTrXPU۶ŊUI[6.<>~(aSȩoT?,o ev΂W@eJ [RK rrL;0>E/kG<9>x*sA%̈ 0widy&+'FVjIѸw: *^71paoM?}K;JL\tZo&n<$Atc|)mo{u;& ` 7z Em$pVzB PA8|8bl`+'ȴH|Ht#qν = hRX^m5[pFt`_~siI;G)NDfGLIA[?x+ !d(vquqQظu' >.s1= +nVWF4NB8נ?og|FWd4q#U=h!8ݻZms!ɉ:jF?9X&R*?ͧ;K3] DHuO5Gi9Pc(M;%aRq͖Xo~su6zn H 3x`OY-e!k,ߐs(ެeDMQ֚No}Ad8fyYXwTʃ4+9u*''YB{?}T.өS¤D-U9~h;5c q8kڋ QS86. =bd|_=bql=O[ z$FC9ԶW)#u,lcNvSғ_5# ;w<>.pZqo&qKJz8YOujjo7vw7 _ N+m`"g exk6ca&i|~LT5\HҺ9wW}Xg0%)nRwzR[-ŘkCM]iHWF 0V|ec CW5k<tCs_ 0$Mlv`׷4YUkLq6֜/xb?/|ᘎI觟ŷĹ\ǔ"xDv1L]$݁t]\ʀ#Pي$nD-~m dX)UԖ&@ȴx;` -Ɏ@'|nY1d`Y6'K J ƦqBxAS U ̲v?n]aL0#qeϋREsX@QrD0PzapeE\sLӫU_bDOh#pP+qBW}gw`vXgSV~{nCIݫ"zB>-"* `̋)ZX4'Vk=}U (zrE% a#c-A\%|t'z#w{!q c?orf۾K:0佄sMȟ}C^>tOjNF"mEx,5*ӲiZ'ǚ2:It!XeNB6&)J ^q|aj22y~E6u,A/+_^~1oQ5e91F2 C0H 8A&YdȽK׫˷W@dYW8 ,I$KY pJ鰅i@-%J~Ji1պ(C [M7۲XRz!+V&7Ǧ*Ҽ{_Sg02U2 #]B{Mޡ=zY8\2 w͝2mifpFXQΚp<5 N%xJNBY){+Z6;e-7vKVjfο"[E 韤(OAIAhLzF}β4<ߙNj$ ݳYCknwl ( vFPqPz`hIv4|;_Zm=ip+i˔'bEֈ;q~7w!`l'S>ZjHD3\9$&츷.G _2xJo~CJE,[h+3vJ5Vʳk ["_kE K`AYsc]u伥pI7$f Gj4s9М[!A$Lc43Yk>R Hb|*/d0/J@`ĞJr-Rh%l/pA6hP/3벰GxbޗPH[:$A_L`+͙`I +]Inh@Aީ7u>G6j,| y+0KكK6Ԓ gnξ]]+^N4єwnRMf7I1jY Qg7|ᘩ~=Eiiq0ėO3!I۲y j;6駀B a^xLg=ܪ6Rٝ8}tj-]AUp&&.d'?͂W6 DPt$Z/aVK Ry/9% u}Aٗ֨ߏ~p1wT 'a64#ǵ75;>D: bH"mrgc6T\ʫo5Ys/;.;:$I`Yj&xC" #O i9j)*: {Q-kiC2&mPiNxV^Q[{w Цe[J|#kS?~\gyB3]#&(enR^|i+Y8 t Ep?^l9R0ǻտ ˜Q W6h4NbL)FV6.50 |wgw(Ye.SԛÄ6'~q%);@heɆX(qy4YیsH?jj1E9l2Z-i覱4 im~|,NHi2ѢU>Zh6%=$ro^J )N=} A[`7RFו~%ΛzTN\]'9v\CƥׁÉ/+ϬMUj38fǺDv WDF_1ZH-qߐNҮ SֹJǠ>4?>6 guqX % &K9QנdIe=xXt;*p&-oKJb֥+-P?^|QQ௝2cY:{օəW(U`GRp-XhgroɛJЗϡyoN W32*Kiٷ mxmL8_GՍ2ވ1pAZf#q0pʟh,\jbPI^5OIJ;wHॸШ<".H<)B(SUi;oLT=d/Q0馳O)dʺދOV"PBJנ.0fzX\<`FM]Ŗ\-o{h3@^i@p"L{02 V7b9@$kS )\Yh_eZ2+g ax i̇).T"fs q5攍[ eDifU”@gsz>?.GzI!_?'>|W/ް-2D.b_LRK/~L(>4iEn,b>cYщ*7`fi֊jrϝ>?ŨUCU(U޹:9}<=JTla^2K(P/o;~ܠ?S{5FؚU툫d2"xKݡGC>~A6 1g2w;;ûŔ`Fghs%b1G6g~X̓eʈG/?,q0tC ufͽEw)$8 j'ڡs|#5pA< <E\{ Y/5N?|Iܐ>{NǯY" Nɋ/D ~KcnfHUd_\p\Մ}m0!1Fn Z$儫T&P:_>S%S~则P\ᬌ -G=D +l+#qo 4ѓ+ ,{}4 (dDk8Ż=Ģf2XoT8*cxU4GzR8I83YJI (oz?};eoDtnA'WݵөZw|0 ݬ݂qwЏztq{Jߍ~`!n }P. _ܽ@L;,م@V>8yRyXt$C<ƼƇln3F˖xZk;%,M:Ft wOdLssw{(xSF(hqc/ma4!vT3n;ۘaX5B7wH v %tF~æI҇ )(L wK"I_pRdP4K8TeRX@wTF Q{"7DT: *g#w#IѺzTKއ%A[N<&gXouE6RiJbQj"#F4/ Cs0kGaa;w΀13TƸ t ϔ`8rw[Ur_xXk.Y zr cکlΕDžɺ;f<#,;uDH(!9AUT4k`Ŵ]`<&(V{PdJENs?6F?l,> >4&R]k=؛J:+$΍ OOP͙nݑ\+u]^멻[etg9Ik:TY6ihVOo Y궼_$%Oǚ^q Z361 ȳjWV^s/vgh58])ޚ3")S?[ATeoC=KA8gCl`Ժj$lO%4[]ԛ> 7ԠF8+S2b" ܎{a>%.v;UþqaQ\t>UYrr:Vz5YuG@`Y8~HO7L|CsknfB!GHA0*"{+0^c=tp F21w[Y;BdQ;H1l_)uzU`T[~RT\]0 /،3/"5bNs0 ( . T!-lֲ|r3/YWgUBlDVf9 YETlRZ[!P?YGr5G%f}9z6U^gFٓ6m8!I5`g.$owLsS|ۂUU"}O(5"-ز}l&~_GH% fQDyCWg;KZIڄ[mF(!J*U HfB%d*֧&LLMl\V)o*<};Bٚ0pڒX-Sq J!x a\+4"^{`ܝFtCVb}7/V#, 6LT 44ڟGAc: P$o*U̫-^7w7pl'[Nv<,Dǫ0DibnO+/~AQ⇗V ֊rc~G[=xBYXKۀ kz0Յ٠9M\4<"'ֻfBiWvA^ipL^T]>(,/}כ.+Ax.XKFQYsرa Qzj5AISn^kkQ[ dQ 1ײfkN@=)/SqG %vZ]ݺ%xqb]~`=ӭ1 ymitM 0{lEKu1cc#.E01SW-gX!5<0^\y%9)3c[ ,֑&Uk鄜}ɟΤ@:ɀT{,/IiS^3^&D vR1xׅR t.zL{jfʅx.csH$UJuQs ;kl NBS'ΔV3{8$EآMAI-ϊY?P+v^#srBW{8+"`);Cw*ۨ1} |/KF`/𿦇%n,7=i&;ȹ4JT 'qMxɼ䟸q9>#ԗXF'yݪk5W;U= [b  M1j V=|̍5: Vؠn \ F?3ܯQÇE_g(,&F#h$h)U J-:_BLۺ(!8[SlD yitq.z07mLNHK /mN᫑AlTcrCTo3"dX"cU/ZJàJWNB鴗DX7+"(-haSVLpф*ޓH CsyO0"mW:e{LoyW%VVs\b?,Rc@yd0;x@*QϖT.?E.e]^Hqpz?50. JqXqm(x aj:e;˚Ղ^אO;~kc>F%,Q ~X8i2S QdQ;WGX7~>kp\tq[ }|OJqwf\B4̋o `djQyAB=yBP65VA|XZV6Gb5}rS?ޣx{m',E=1g w%~Gd7b;)Lg 4b{e ]!5y\:A&t"[(Mq 'y{9i.)gг1Tvl[ô,pI0 Jo.fP}:h !įD>4fI"cܓ" 㙓{I' M4X5ےIKb>?'^9{M1l:V彫D*'TϗJD%m#\vlgR%B1)`UprT$Kj0OJkCc KY*?T/ϯ*E,|q8{/`\ D-Eva<^3hND` 7`6lEI+'0[hap=o0^%ԹK񠷵&u嘿TN!-cRԘC6bf\ .2x?5.1q ;fiG3e-k0O{ #OEWnf52\MPIJ*"p~ = E;Dq*ɶ9CKC6զ`TLs1IXY̳R;hGop+H4X%6K iqJKr1>1(y)ʧ]N.zHGv~gV6[¨@^ZT|@tJб952w21+Mfd|?Nƨ}Wx5) \[mɁʛiv= ${EVLߡ䟴ITXeT_ǦR"J8G\5*@QH'Lb!MȆW AMX:>h-3!-Td50\uDWDGB\0!\Ev:&2yq'DTyCmۡbkm^(F="[$|ZQ"h߅ӯͳkuٻ$h "x& ۀD(zjuCUq˞kPq{į'J$M=)sq7P 8[1L^ŒxlxnoL<[ ).W>:m|A f:0 ܲ8{/'8Gå++zB&'1&b܍m|ˮ8e.z)rH{i)z?4≔߿X9}#l9?S}x`D#͗%wv,q,L3zނ#4ܹ=)yXZ=vk_MEDʭ8jgR'p]}x;_=+U+b ÷gY} !8B㉞mqĎ/qBEy5;T(RIAO]`.V=/+*_h9φRj*'ǍjuϿu9 _^j Oq(qdjꎬq1=c}(l 7l?iH$=}M=>h̒YL(LIؖ8~wŧ t fO QD{Hw|Ym `د5 Eޮų:YBuzK f`^*Lu8[ "91F1BbCZ3X˔ Mr]iZ^^k(wV(0Ûm)1>o5 8SL;"\MQF 8Qx$XFA`# d $2A+]6~3G ++'ZekM0"?XEkKjgFN孍6p¹z<˃X4"`EES[6swͥjk*oZ(aq<[TgRj=o9R+R 0wY^N0r{kzIXGk|Z/̢nz/g\@lF!#oZrA"tMw0tlQ飛5iq lI<Žg:vp/# -)9)]B}A͎um:mfUҀ<`kYz'3g?zdjl%z>>QMqol)Sު* eM(j84^V6kOr?1{;LZ:Ƴ:c(A)V/fQ~ˀO8 W[89czHqLŨbu@IlLYl@T|ubRLjtmۡ_~_$,Msw5sj i4<%Đy8/ _nz]B^=ppY(,!}1_%Eۮub0q&oЃXL2`29 S=eH5<ȳQ A }܃viŗR mc&Sv-hTh:I3Cu-?QtW A ҏ1 /V×kR[џ3 DDfdh,V"#MM`싺~53z"E_nua'{XC]2:t؅^0%^} &ۜa~z317+w.y UD2@d9ϮޕLY-4 Og#'$xյvuVxs7ἨI 7Ha/ 8,/$8Fcꩂg0W 1J\Ml2n*%ќ9wq0A戋@Ąw@ ߱@҉PU8Fiʋ %5 LpP >^.RU~"'׻Y,R h$!voCeT0Tq5WMfp qO_fXą|-@]+רGIUJmњ7<0AMEQQܩOTOXK˃݅RWi]C-?mp!/U郜 ݲN[%F o1ڗ`RNޯ-3DT8iʏ17V:i=Ψ/;g HW%\hQ%U6`|h[9U?]N甫ή@8gH+&LFiG=nq34b=c#-x 8W=auRԌt?$>P;Ozd^H*x,mB c.J*kҚfYH= abB2de@UMYx_Y"pk^Wl{on񸕒aؒz cqN{)QQr Wm8oC&\|<[Ĥ`Ӝ210o[P'[c&y{2So>g Ӓ4X0.-R-&&TTxĪ4''2U@צdJI#;QFf_Z+T;5F4)H[*yPׄpΌoү<2mrcIeP=6L"5vwqy6qcQ#׻ c1q;lx/NVށr[%. /sO0xUȐQU<*B+-+Agt&cX7Ža$]:}%{4X#b  n6/襤ˤv+صMoI;oi}:\>}o-2rcEmf>$igY?2䵕gkHP$1 Y=gT?AlQWY:Ўo jSFs2rIק<鱰oXT5rT9q<<6Q x竲sJg=hO#Mh}NR$rs.<X17N?4H<^j1F紸fnDh|ܪ`y3E8 ɎHqM1h>k>ǚE'XKw cYQj}r6c|o/v%\xcwj {'eQa7%$/'+%"OGQj]*Oo@ =k/GUFY-lJ,Tk{B[J/7曆CZeY@V}27d9MkE?mG%G-hHcʇM*jj1cǥ `V̽w\2h%C.҇\^aFZ~rDQ%@jG|*kGCxPei$X[jMr"~4w'E wgi\%Oa[&8,M:f(\$3LuNW?*oV=%8qaUH[mUyf#םl׫`OfR#}j?GM.#{Kk#[)Q\PǏ"^xƩ]d^].'#i8H&˽AHn7)pb 8VH0Sߨ.[;Š!x_n~6x $F;9 ,+ԊnػKŒ:VƆ2*\-s:!l0iˮ j?y nJ\q1.(us闒_}VjY*+P?QM\e)%P=r {˩ (׀ujMq\ R2 A:ZT]%m]<xl-$kEػ.he U"9x5{D8-YFmށlv|HXM=b)_SH3SEIo%#/q =&ZTQpevҺ6Zi)pn>5M팬½9_3Ġy,U^ }H–!e=hܝ Lg |R:^J?`k6Ӹ7tXҮ`L+]#Ө߸/4EM${(UJ.D wD=-rF;ևSWDYX3OR_4zE2;Z3d-:mNYO[]кZ;,E Dބ70J 頡Wn_7jZtSI'yu-|"<>(Ȁ90 %7}!w{JZY_MX!|Y* l#߽M",,ƕlM}㶬;1e*Z@^jeZ2ɕ@CA9PąF=69y 37|yq\KHJp:sdNIп|Ng`,Lȴ ~Z*F˭pLymӊM3Plf8 tB αoMK4u"k5c}+`16%_ꊋLX̕ӾEpνPy*;䠬L.`U#GCwJz nXu"BTS9R.:-f\JGF!Hm=`[(~c'6p}:W#Ejud@ nznzp'U\ݨx@ s76n~,.H>G) XgGe%lmU?Wm @y63F N4UKtcpj̷k-\YϲsgoҫWT L_RM-pn2v |+*ە=d82!,5h|UFt)t>Y<ʋL3z`b]Rs `skM!O! DZpA2gAl`.g5N J<3B0TbJx ("d1 x \@}lVwPܧҠ`Џ #,0z,zT3zA%.2>u[\]5jZMl;ŲS#` m*eI^Fh]+`ὔ!65 \%?7(M' 02c$ ,Jh>y^i*DC,ҙ'ܰx8xzܩP%z=s9D[iz˷,,\ݓZFT0HOsR'6ܴe, )]s .p> R]V}7k7R$X }rփA{^ī`Cő;gj;W,'4.`uae%׽TG-vtA״Yn;eJ^Etnjd~>5 }4 œhd) źIqm٭c`3;C}.^zfN޳V@ ]U2h8jlJ$^T$-fx`ҝr!KAsm|_}ds<nXK5d&݅YD>Үp9c]NzGuy3fzFii#t\&eHqg:PK8C. ˧{ /=jDa/( <;!r jg t^ww-6r'7j"ׄ+4uBJc ΓUm&M3rp%(*>/ XcD,D|R|2b1ޮ>E3(]4J8׋Ż: [),lO4|D&$v55osSIjc=$ ޙ2hT 4:iMb&y*6ƪ쟽:KrM\,< d ɦާ4Oӥܝ /~DMۜQ:[Wf`H.cQ5o.0y&q&>Z8]ƶ"=s5m}?$ *%zom4:䏱< ua@ T?mWg)f?T.?#(?z3v5tJbqpS]xxL5vNnwNc'\o0P~ a+gf5zbC.^IѦ%I>\^^;kŰh,\=NAx|(jM܀AEqvP=ax ew3z-(Ҕ'GL8W7ɣ迟Db'0{f0XcNu|p"̶v5:VBrdӱ'PuOp84vYp^Q1ϊNcؼmCVhl kf`m4IwlJx۔dc ߀E/uXj/ d2$u&\W?[nN=c~>UdŵYiR6ʒ.~+w!?e[YaS0JΥ03혞fڲbS=ĚO `,Co L9 jQG3I/إs{V Ș_ Q.2}p- g4mKT]Q+L?>~͆Żfu᧠,5Qx4e 8tNqB lo'/y:Ҍq\Rf!6xCѨ;+K/TDmQ?Zt RY;ZdV5e[KTw%]e[J`>/UMc: Q#|*R$̴2nY'$Фq'OʁRcP%_nT@J\pjIZY5zPwX*m7WRl.2kDυe=x#i=s.D_O!5D(㜂iPMvdRm =N95H2 $UHTu*7wZyR+Xt*MZnTX5J mܔ{!mʐ)PlJ"U29hz=AbmN_(!d}'VPb"pmHرW:wITq뤰!OiUC&w~5ZfGox;Z5ir9AfV.ۋmi4n]&rrj6LLE:(ܫXvm<(1{lqfk<΀E_P߿@*0I|@x1E@Ầujj+h< JȻ{nQ]4fнV 4NM(!ef0ࣃ}w'V,Ѡ$dM ݏL%^Q'/âcj;J_eĨVw c;491&C"hPZ*5Uu*qR S Mjne_1L%[N ̤1B>Ic{~|9w3͋3F[zO:GEthm+j%-*e8WwSsdg,* Ultȣ%FlYz*465}l%K`!GHö=a-A/ơpȔ&@v HeƊ.%{&GZtN@Oe5'5 +|%Wwa <V-Kc3&:v-9H:I> AyI#Պco> p4XsrEbDM#krBCtq/Yj"uq2xC 9XyL[&_G(ZhY)û-}>s %3.7)I#itv8Cqiz'4rԹkcU8V%I:7&hn> O r,;/k#k' 0³AX)mS_Oʫ DB̥ɇJa؅w$ =:}Ξ>$ VbZB^rk=>x.BZ3pf * ?.6ًpoGW䂭)QCAdi A;}ȿsPIQ9j*]#dYƣF4y%٬;uKi2gZہ켹LjL1/Xt8vAV0 ML#4Opdle>97<@ g$0Yզ&16φ㛻4J.z?V״^ [ Ec}wT;EQ+KSGy:z4oIN: WD9+pmvd0Π77-Iȅ=nz[ Պ c%cr9 c)ޒk$l 7i_ϛR˗yZ0g_4Ew,s+!fA&;4jAzL@g֤{iI2z 뙆J'B*ʂ2""rmO9V r៺8ls*2Y} %"]+!0rsޣ(fN9?I1K#yXt$5|=XJk`` &>ޯb37HgzQMj왹Tn.=7X`Epe5 ^wAgT-#'.d6k8C|GV-?P0ۤ~;ôhLwHf* fbf<,NQ^5t m5q3tD{ dݸDd5'^L|Rh07UmL3j߈ =ʊU<[!Zan8p_ oym»O{q04NF6qr=ep!LW}LXޡ,6L;1;kkRmX `r c ShH[@|ץ٤j,orv`s7\D JABT1e-șdL盁<;E{@)CS>KFk\k!  { sVX[Y)2̉ݍg,ȬyMā ;cJ]Y6x/p0X4}$ekU׏(k6&9RQr7Psv|Os\?3fDT\؈!8, "A8yMɟtw27O_(dv k&"){f}Ұ6ϞLr3H`Zd~^J^ņʔ\+Lm3 Wjqg6O?k ˸:9IJIⓦ%bd7a? 8EeO7;9MkKFS0;m]O &_K88|a㵂ⲓYF$otnF"8ZVQomxEQU[^L} S%`Fu9GtNj،1ïo0,Ōu,sn;Ⱦ/ 6؍Y\瓷BIAKBtɚ!IAX.ԲKP\O ta,*ҕEpXRֹ<IW򨪉4)@e`'{nXLJf!qmeb&Z\r^G]Q-",uF0x q4hQZUdz3jF8uGݝmxU y98q2P]E! z!H褸 k`kCl=jZEpQZq3SacܺI>57x̍*R @=Sco wNbA\_ol4;xl,*G&@o@1# ISfPEڻF]ڵYI rsajPE) Hi<%V&ҙFv@:S9`N2[#%?*$x5e@I,dZF_fo=5eaWYrT'ultc an%b(^5_V4IVЧٚNg߀1^Fft60RTK*avOhm/^kQ8}Q<FaҲBc _)#ZXn#S{זYywӍV" p~8S;]l&u:> I\80 #d,v~q" I ȵ /.mL6EJJ^&NQ"-uvh%A@ EҬ=g6SpGJ! 3? \s!MKcoOJ)NӧM6K\)J26*R˨oX@DO/|aWli(ОE_`~6}[>3nps6,mc{g\~v} Ku! 'v]ڜtL S!U࿛YX-͙!ZDڗ@= e{H/fIa1˫T4BZ.x# 0/Devpw@PlAE;bО}U5ns·~,Y81fO\e}<p'9yGam>[I V#ѫ?V"!I2/382UBeیi)!mVm &$WmlO(k%ٰ9H"6T.fኳkrC9qسG U/ZL~|@[nM^9@ok,uɽ+Ы&9d:2G90`uZqtu*}ug=_kt<ϖ8s6ˎƽbHw8iQPϻ<íJ[ۛN Q-y%!o  x3aWY;Ǔ맭{Hnt<U M3- Hrhf"K]]?ۚ2\T p̋&Lטw$˼YM$P Gp(H!L \h=.~"hYf_ "/z.ԴzqVWJf^x fw.^QTA3\$042+ˑ8FoQE91epC87%MK}GhxZ*r2V{GgAeB\0 -Bߵ<{8)gϭ.M[̂VW͎m6!d? in}ܬ^Xx>N@.+i tXhND[ƻRLK]x9}*7% Jvo%uTMkLh E\NmE7Ўk3.!PՇ٘GPafi•)~p:6+j kYV% PfqFF+$W\q3:(uXL }4c(`qǧ'%$;lNP {N0vz&v'2e=ΪcvǸG~ Qv CJCa'`}Gh\tXv2Gln{b z幩3x;oPo5ObϷѾ7ƫVzeco9e5 ޜԒu!iDs $ T~Jm[_j$Þ7go@-8TW6q{V$BZyYwuu)qŅ uظ *c]bdA:Mٱ_' G_[AB ߈1rv׻0;dĨ2ϑ301tR$wg3~?17(|+9isH_{@ΔO=A^B`c[la(ųQ8`w{*qgZάY{xrW(ne-͎2Qf{=O!qCb ]_J.+r%W$(8JΩ !);YLl+p|(4zjHFj i6Xg>6 X2e_z_k3x ( ux>"] $Z@Py辂X<,H΃IX\˞ujY&X?adɂ4)h9%}{6KЬL=0!*_Ga7DjL LkpY:m!$Alx\rtdO#'#D߂> I(7OM3rI͚WU)?5t>T}99j b$Q\DY7˙"o*~؊w՘[ߘ ;`OԶ+ ;11<y ZK>2rgn&{׿#U58zl3zM Eg2̶Z3qѼӤ}#ԃ(pvwl;m_#y5+R]r5F6$D~/c2&\ 1Q {GE =zLP bP8*w]~(>sDRԄcP$ 6')Εb;%2qcH:ݣǚ1%=}c?5^_}"݁), ̖UWldSvGsM.5Ʌo鰨IOHUO"FXZβGˆXNH(Ƕ}N홫.!:s(& ^ >.)'gS!t&Ќ'.Z¸$QSMk]EYNwZt RoNYk;.xe.fs-2O~)=Z? dzZ0J:{a(0c3KSE1Zv:WxE?HkDDpsq6tUYdxnrRm۠pxwip,1fi=Y0(g_dD&P!#ЈX'8%䜀L:Bl!:IO4+ ڀz5"7 ? ɸ+wDqB9 ĩzY t/׶D2u4Rr6uVg,˘@sϞ"} n0+L2䨎W|ZӞvS煈[t41'R(zWbXec؆,m}PnݽʰWa^7q/J䴣 ~ 8r@(=6u꣦\Y֋10JZd2b 1VLd>w[*I+}棸~$eIJYu,t1( \Sŭ6B'g,\lK>LspG qdF%!> tO&q|ec_x♱N ݗ\hdn<%N̡1B m:N#}36ZّΓyo#:~OoUV޽k uג9@O/١: d]&;bEO+h_6n>i\Ѩ&w;|Whؑf*\igZ\5RE3M{I@NQs9kb9n" жdBLsJd:%[Bq8,= %= EH CB5iu金r5KPLH__&K,+dK5xtR^7Vlƅ#%M%xi,>DJMԉHwӌAMFCB~̗n0 }2WӐ o;*(-cP_Iֹ2##t~;6r܅y 7/m?q?7eSZ0w4<" ӦT63Bs"ͥ\i2ygC::-0&9Q"!PJ(MU:暡Qs6@1&i-qX.Mq"O/Q`oFEHZ1&!Z le Eyj/13$Q򫡭G)ǎKP r%$īf)y%0%N<}^˕*d,-Q۹Zh5_]5 1Ťj}$Bq7+5]=lsrO=JזvQ#^1YEeG8qgub;S>!9, AE,)DB zsaT@d gcd(,냇(Nj85!jP|ӄtn|ֽ۵m(ؔC^R6f&8wg_<^6bx!/s\lmCbE7ӿXO1z^2%Σ D=d}}5e)[ szU<fR쀫#gꡑ1A@BY:TP\Gzg)P P~%L$L3\3z^v4^ %a7Q...5#oQt<> #j24]SZ(*G՜R=ʿ[͛R;Qq慿N'UѰȡnLj@dQil  HA:Og87ju/ZC@̑̕ZTY,Z=z/ALNtUfZ{="IvSJ`?[y':s[%cW\r{Wr]47H?lЖ4!P}!V]N'.,bd9ۼ7& 5$_7EݩVMٶ;%^cE l'exIY8 eQ쉖 itJІbEYfedHyj!cG-۷4_P–!Kk,yN9ݵy(4-wg%wTά].w67Og 9}~w-DjU8d45jm.'#_9pI1-P'dO%lqv3X^8E<*QUv#a~H|v$4*Z2L6Ƥڏع-C^9Zl校$%$406GuG/ pnX̃m70HsF?'&Fǂ/og ."ۂx]X84( 7&{>Ɣ iKZq_7^)+f ۥmG}\ 6,h '54sM@(NµVI}ˊiӪcL^rDb3(h1Rq/K3bNKIOZK;)zqIJd?.PT\zvN7%)xvG*'H(m>L #3QaT=NWgeDg/t'0N(kA*΃@X= G4X|s}R]&=1‪z򛃜缺=l30q|F"9'〠>!dӰfp.@DvZj}"7˖/Fi}N0T</JũPtK4% +DMynw)N1)=,fjYI5'RP \x<.zDfۜ<TGс̕獵Ѡ_0M7)ps4lW9y k\~GU& x4P]6}B $mFUmlޫ+_`ҳ1kx9f3$L ߲Lj{19O &F*^C8(AJc8:o/?-H-r3x~Q9?ps:X&rz7,|K?;i{vYld {=& چⲷd䈱G`ppʅ/2 0oـՃk*5|x.N0gG?ya..?&63Աs') jpr#RZX ?zuY9Kj6 ;Rd\rB:ϳ-8v.L)¹q=Y٫=aΙPID[јRA=ٹ0X "N9 b9x2 YbىۮС&*IS }z-mt] hۋ !XCҮiI (oP2\45xIguK.>P$fy/?6%p<܂'8!:qjIvk> Jz0n33.eB|M1\,afZkQ ITQZS`ۮS <^Im2U]6~#S(Sܟ_"Vj$4XX{,X[3Y]V`E)eODŻF2X+) 9E$׺nOj} J`(q$0Y=o\~cOk `zaZXljh' r3dkٶrhȥuYz=8=Xm#Kq1A-QO͸$o_!pOR,b TC[2,b}ۇݵ컗,R:WFLc'\)}6}p8qDyuZ;A9b#~_o>]ivڍ8 ?q5J2==pA KUF̋0Vbe}>EFl^J)CcO(;MǷ&WRk,}=/Dbe'Ǥq҃23)+_R+q.)3>O-|=LRLE.}縉;u8aauľ7t/5I!%`FRhk;}>A#feyTVq]*yg1nV=H?(oX wք?(vp.DZBz5fL.3_=aZaۍ?R`;"ͣ\z Zy3<}S=1/`E!\:y٬&DqYp|%@‰K@6M$q \AbH![5j[FCy 4iTg]Mۼ&;ȍ^ ?YW ;2,u%ո:Uò X/-04f^B&bU]u!Jׅ3o; a%ną#pVZ(h F5 V@}xym &n ("l F6Ipe6YEzUb"nLW++(Z8`flG>sG řUi^Bj %p<[ur>8M(Qg1`#G㹖4l!|>̖: Kf)IuLD [ڋفM) ROKc?PzT䩽rR|d"Ehj58<gBqS,i/0bHߥ_DB-EgZ`rf AHb"z2a0[/1t9{ ~ E/Rڴu.yA,}[5p5 x`@(5~ys{|ҒUBBr:J)-c(am{a"9Q61 CQh ^q&zJ^]K>y,k^[fBte1TR& eObh& UMlw$I脸VEd.;)m%ۿ)ҚfCZX!MjunŌZ`7jM*p z2Բ.Q:ML6Ty>_P,vVcB݇H6}E_>]`?Gz `:OgDzv~S5Z;CG鱂jB CBH@1 5RFk[(nWHg@1ٛ3hw2?RcX!]#% J&xidRo]9!Y[˨ 3 jO a1*jm/=fo߂{/v9 ݯ߉@f˸lP'ҕ B":V]Ԓ -@OۃNO*OfouIc_6nY`{[+]!XLG_,S$ɏ|4L\8cY^?˳.86ܵm8 ͪ'#*2FOXN3K"T7LϨ3bY7w:[HӃ)3RGD} ݋1ef_!7§0\>Bxa@0B$A zgix8 3f;?KCw.i )3cdOZX Hj]~\~W~ J>c  5;fI.b~ w(L೪6QP9gd8`Պ:Ή~]ogdZQ;-}5/Z  w@y'F F̏q.\xKcip7#Zժa ,r^6kWQ|6-1@]9 'U3/Dm*`ٚ2|nfFu:f| TἮl:8 AKٷzֲzTFB4 V\X:keF$:>z{뒩KUўږǃ{a-XRD1A&Ma{Sj: WC$_^ Tr?;4s -&p(̾e;0Sis[Lb|WE6Eo| wn tRQWZ]}L$'DEm@&;a92kMq|HU t, PTU 4|#JZ_fqeԁfR ~^n2NLվηn958N wٖd2SsIؙ&݃@e(G5T8Ƕ\B3/Ol=[؏Dy,J@Myu={Z-U-O$ÃTh%#$ZrX\҆q;L(T Rɪ(j!'QPKLB H/W'1^) ~7CӜ,'"_>]M|9 hIeeS .͞ ]N-z(<#6\bHWwLH $¾$R_ 0x:&P'0 ʚ?ˢ7<^)sJ$-ZUCkssaP u۬qQP\[h@",`ɽ8DtUӧP3o2+q)7}+v.hL@/-O* ]Ͳ4dSޟ=fݤq(\%o7OyPmܗ6:giqSG/;]gE73>nP<1z(G0ix~d:XZF 3i] @ C9.0.6QA)ߥ 7z™iԄ6ؐV=#/6+nKWK"2q h_;86r5P4eE. ‡9G:#q8HR/*5K3?ז~'tPFAw}aa{_5[39<̋FCq@X_li-!C+I~q;ci|;)dZ=gM .F   <3i7c] M?Qoy*ԼCZ2djipчYާ8(FAWLP,AI57H2S)T`&Za,LʨlL61jc#MͳQh3f$xs?0R<6ˉm+$>תmxXiQ9r]p]/cJ&Ap'l X"); Ãcm^YɭsJGǫ|Y@pĬ[M2>CEEWqphѷ+>'ձa``)er{ l4|h|I%|Gx`R3tDk)'=qmIX-Y3giSK*6[u%NpKa^u{Z+p ܝ jf.i^Q+?nm ųz؃Y7l9sd5=W% 6Óz頻Lavc57.64.1018sXb,C$"_9]V9ZdS!MT^TaXr+K ukƪc @8^c-vĮ/l\>TڽoRֶ f{ƮVOTO\Յ54oY;@]͊J PA޸'5V_¦/H$ro Ep'WI-"Ri ew6(b.%׃zo@+QKs ݶYUZ[!ݙ9u! rP|Qݷ%AKB['ME?As6Opmkļ)Xg\D4I}ujru z|&+#t 1Ƞ?XT˳ܜe%]wʰV{%bNue{ΧKx`ۯqWmC!I<yl KPt K(:d<|{8rh@֐eIϦL;AmlLOG K /L@yEcݧ%ޕde| eԉs{M(&0byZ/##l.a<=F[׳Hj]x/L=:c]pmӥX]Cbg9^Yk6Uu<^@.K TOBČd1پLQXU'@ C"v;KydEH8Ge!S( OӮ䬗 M>68;nQv{l6D ) ?o?Hij[RN l%hr4x+G#c6+ɏ4a !m>TWpNHvvvʋ4aQE!9zeAIS? na(ZKbܠ0|_ 4w8 pQ@TհM'eMK1%_d/wOyОԧOݸs ԑ`E:I9UL[%!b xFO9 y$A>F ?Ox"Ye'j"Q:W?4@τ [\i:Wh 35͙fRRȧX>YEyW iN ԾjdyI%#K]NpzO%\(KK12] 7C_볛*xZ=&.E49^ \ 3V.EֿǼZsiG5#COq.156?ۛLd!ݺL{?V񅰕v1pfZxyOfR?GQ>}p*?+DE1Vw:'߱ȟ*IH6w5v%cu)q4w4c*6)6ꞣX9C%߱X}KY@s˾{f/ðSZK!` -@KI,a2Tn(" 828pnn$ھv[`//!p("ɑH' 㫋mǠc):eTԨ^|G' Γ2R⁚@0n'?iQ ڕՎ$f:كl+P(Vl,.3'bY^k3!l>yCuw5;c2G$4Uenx[Wc >Sw>ޏ+~WY ǒpyzSLJ(ZZ[B69s͌Iߔ"Di(f8-0o(+7;K4R_FVp]IBK j=۵kӕMC[`o uj"Ie5WQ6S**kC>8{,D._ ]k>pb~e+S2xKCTPɰK?S[-Ό2ݦnl[?n2UH^::Z<¬CBY|ТЯSv[ /A} Nȡ UdIxW$ {| \[}Dy8Sn­ruB`#bn8ۨ$&2;q2Hc*eJe3}">nPv7?O3mO$ h҇05K d  X֩N[ :s%4u#Y|vqj®_NWJ.7r.7es@̫-L0?T4/q7X??Hn`.@tF[6LEӽ:nNЅNDN ,ɏ.0_=$l9C<a&&݄1oFN2>Zi:>^mot}MpaMeL"9s ~.^4KQ""eQPy_)}f{JrNT](t՚R[up$S lѰС`'XmLB"LƂn`jQݾ.': ?t̄Қ?]iL_=\B + _Qc]B$ c`2h}426t,%e c56uJg ]` 0i2y\w./V9H:T-4.^ ot*ѹ;Np(X~[@`EBםϫѡo3<3,h% 4sJP6 ֨Gs:k8B0D*t~|t3Ăqճtޅ>FBj3Wٳ:0^ԄWjUSd/t!t7L-A=XIZ⯤YwI*ػ)y\30|سۺ}KuAOĒM~0[6qsCADpN1 CL+ڑ0rIY_L{R8YR#zQ j[6[o t5PqD q5)T'h}FPm P8sI:ة'_ s<+// yGuP ݛ~^i@W{)yA Oh!KcQ?`0ܠ4{82o}$9PDtj# VdƅIS&b38\IMRc PTI3lIc- +6pR'cPc=ov=:,P8>g %e}q+^6|І2# p(;em**Ic~~[)*z!*9Q&9BАt$=  ^s‰jT(f//+۞*]Rp, 1nTPtX)&ƔqT]SoeujRӃ'U&XazAb2_R|j\/OĶ lJ͐+ʆAnA n|uT2~&g{#6fDeb}j&fdԻj"u*#Mfo O#bYR$s_5P-ItkݍFd~ ReHm&v*A9I Re0# 68$S;Q:4T[7ᮎXF.CazIT6ؚd娈qrNpGg[k#0^5z&+ࣇG'(HIbxzxY%O1k*ϕƀhѵ,.1EV)'Ժe3w%>m#,] ֑z.YFȣ47ᖎSͩetڵRM!w9gSξ\1]zVGmMB#ȴ')bC/6ө[F n`0FNr\c|f Xv|7a}h3'jP: iUk 2l#E4cksyԵANI=JgH ͽbdRc\O:LfTTrb-Yw:z/~JFQh:fkJ)!#v8lA9̼v%Tpn+ D_ek>'GDJ2n۠JMe b*̤K ASÏJ/ۧ98TB~h I;eȭn;O抴d'tV*Fk#Mv{wDY!AȔfƝfYצKb9BZR~u],"dvL\z68p#l.t5P/s @maE1GL Dg04@~Az ؆It?ek X+zJ.qy23'U? BAG97 V<*Hn[]Q:: oj$`\ V)|_΀M G#R!rn2è=ŸcmkƼ=*Q;A92%X2x?ʻni'8\!f,iq ė"=1zI95^w0L ?YDík&cp>+ wXv誸Vszg3hYL&PIkYl.8~o5駝/ ^O#9gʩ?(g[K[c> G.LWN71041 )'A;mpYf@aGL17O0kH+8ه $%y NM'(뫦!MhDw$ErY䥀͕ͱ/A *a•M=U*hΦl,l B^fMkgӷ4r=G= Zǹ&JNEqi(3Qn<>X; G5pj#.Vok e!_'U wN 0n~r271ʙL/-OMu ^ۃ jv:亓2,B , /#Z^ÅU(u.FYy{|LaQf8+~pL ɦt.rϴ&˕mm*8 WoJ<>.¦ 9̥z)?<O9`GdhCՆ"[=$~YarzS!N`mKv׈b]I2x{t.]khd v Z}'c?L46cW$2'6ΰ_1< zJXЍ t3s`ӥ56b*p TE5 R,X_{*]EVZm9wnb{ U1>쑋jۛnm\dqqya ?MDhvVoӉj6@zNŠ6{Br1df?7tZL<^>^*6x/m_)zs[AhoB3\{T.HG3 .A`Ϡ/zc*%E:A 4 q#ю*j*n}1RvllfX{j KX/eC%Vve{o8ԙ:{ع[l@B?Qztn{*4D`gZC\;i21ZxY$ta.ß^a!/(AoCS<$bzy*(9lXG^k}[2USŹy!uiJsElUY??؆`%-G6˕`ì.DT@ J2QeҰbf[禧Y{h孋Xwzܛܳ׫5ɕ 2?[ߕύ=h,9d@#'.>ZnLaf ) t#K7E5ͶQ:ʥd @0[uKk^}r(;@."Y6 ?sUQ4+ mR" /PZlU}9T!6S0.YL!*uȴ(Z'nE@<\H%B贑D#g46ÎTJNΫ KFąF!9$~, ]Tjg!F'4pSEuG3dP%#31lYC^lwUhǪ<(d"2gJBPc:yb(.ڽ.v%%:xK` 8MÇp@Tf|ğ4\.qngf9!gReh:6}!`mʋHC\Ev7R3-!6FU\e%/[ϯָy3SKƮ) "Ν XtJ{!JHX}:^ȣܖmܛĬ6Av2]T'[)Ѳ4Ϛ^d1a7U=ym0_W O%ޱFV$1$Y-ʯ\QmI}9fל2/Se &kgk*5Ko{ZX^s !?UNPesCgG~'aKOeVϏb U7GZS!S T!c[d/7o/|^!pma aw罳{'עm겨Vl[@,n%PVuB%JיA,NbyЖ _ts??Zl)xd$S{ԽhUsMz& V)!- k0xz(CHMao6kVnr!5tZޫߨ1De1ľNWӿm9;8F+H;=72kG4F,p_:W%8 /Ge׽5䋊s4 :d긭DyVzy8?\ݾؤS6= ??):ԏn1m[ ppc(+Ex)E%h #g;Ƙ~3`d3lZUJxݵkD¤uiOO7 Ŏ; ،YeI-VOAz: j5k؊F15Sm+˜g㝿(=9/vIODёR",:Pv$a \]"Pcr{TF nY"j G{0bgʂ$n;mi~`q4TCTs:e8y=PPˈjtԽΩٌtSX R+ږLn^l$ZUw>Ulk#2}ZwobวI>Yc^<#AG&$uEJ5BBs~Jo [ W3y̴J {܄OkB͠P@C4OT {@$wNi)Pn[Ps[oӹNqn$Ql^ eoxAIh|eDuP Z0I3_-2 )%ףM5Ң sVOup U:fOjg}LE}s< Ŭq\jYh+ȿXc3z y,C0c1ݨeZ%g-+|;CFL!UO0wwkKitA/^c5J@ gm(lQ$WZт :@6Wj0r~UzTKh:AYjX],j뙀;'|N4lXҵ[Q@D ~ҩb"Ԇ3:UToYoyE<-׃gL`ēR͈% ?sJh YacL4ž#GCL,Np_GtkLR5 b局]؁ e'x<3_#/˓5B>D,q\ﱐ;@zXaĢ+7 xIn 'i@-5QrDu?Tᐲ>[-FCd2EkZUET أkDJ8av7ٺM* bĞw UPtO{ƏZYॴiN- dAw=OĀ(Q)_zЊFT]qlN9H-j0e8ET[WXVSxVTuCK.s" $kDlؓ/h?QRk=+8azk%YZxrҕ/=Z1 T\~cmmɖ_2 }]vU~|=uohb]$4O5G v ޸+0C"CSEI<1̃SYX(hzo{-#r߀֓㡹76FۓJ;-ςm0Qps)ڋ n1ӷߐ\W%Z&!|@lRh# &pߥB㵺LkZ&!n$hFv9Jh@5Ya!'&MLC|BtkxL Nb! >&b0 _ܙ1.\珃`\X g4)ߜs2<&kt4Ґ41m>a ! ɨOx6M`G񏢬 >)gg ؛n*H-Ti)8 dױhsHVm&(%kv-2^|eRq5~'zhvߡ/Qt >t߃`iz*vT52=uw\1)&,|xIѻ>}UskTXgYP(lIU2kQɂuTP+mUxUf.y@Q> JML +a{.c*;pEUbIckcb~8s̪ǏX$Kp$$V.a1m<`׏z<~E£}dODh|N; 6ؒ Mx۰6ZUEq 5q[؂P!nrgU[njV"_۶Q" To]-X(IςQ/hˀULtq'jR?Zfދ&Hʭy{Y J`xuۯy. P|W(皟МO9Ĥ v;76'yW ׻5`!fR96㝸϶„"wo־dRdv|EGq9lp\7[2k֮T/ͫ-~*gnPۨ 3atA蜌'}[t[F _8&׭.jR& k=5o`mR+nl*q$H?$ocIELQ @ο:PQ݈E*ˡ{예"̀)2E=h2gAN<"f;:BpA$6Y+BcE H.Ǚfc?XdSG< :{oz)hXrvd]OaBܬd\+SӪ AB&ITuj,#W+bA[tsW\ddkDlbj2>O8Gxur׎m/Vp9~bLk԰W59v`@Nu5%w胭#B27Wo)(㨆{m7/U&γD <-y?V"qFɟ;IC C Zuع`Nu{) ہ.!KbvKڮF͠֎(",8s4gdث0Ig*URPapgVMGV=~^^\^H!K< qS ^$Zv].3yƜUab"ljʺ.Ɍ{ 1~Nunds$0[xf1`a3yOH֣|I |K"?`w )m7^K7K4,;b)},wo}]ͮKkߤܛEo_}Wnޭve{[dTz+Q/)- p$ܨ q w7¢.7=>46gFJ o3yMpya7 ^8QVlo3"I'J>MQեJP~M9Z~OmHEGN_}.8N6 03<(xsv`?"ݕuo_puI(BbҀB2z*vj¾x-S)j` Y#z5p$8P sEԿe  .?+Qt)EIeU'_^ȶ ^WD6* 0h*V)X=Kg;4bOJ$(iɅZ(KO~%AWE4L)bfG$n+U ח{/^ pr1LOmp[Gvv°iIʥ'iM_Uϯh]ht[}b@lj`%1iP%0]6@(.m{#|bȣ8\V&N>̂u%1j׵"i!i ' "7{;8aGs}*EM0Xoӭfr O I ʎXBU ?"0]vfci;.v_[46Tl6+-*{5'X٠z۞.x OT?51Ttw9ώqpŕFWy)FlвAR!WF=5Aơ~]i$܀^,#RJRըMHaUβoODsQ B+i B, Ze6m 2{kvJRLn/ 3o({>c25RzrQKє|}<^95 僶zئ;$MY ͹5:D&\DF^s8{gNeD#"pj*'Cjݍm ^ g]IrA`K0y \] pR𧤎%PYs~&a?~w@T5$tGiZZcM㡕ნ2z{';̂kv4Yqk`IOg}}~o aX5U\q\F?LH16gd̎ԚhЗ#EIј!\e|FMa : \_rȤ*14Ztʞ=DBBʹ-GWwL˜SR@vZrvpxp:*KKf3:Ք:|I':b}'/i' wBZS{*ȄnϏVR{dtorxRVgLz_niHBY?PG=Ork܃'&s~:2K&H@:U㫲 Cu3K!/{ /uta;S}gK4 ,BgRƠEw6#zq/b$#dSuGMନPK|zvs 8VK/s5 I z ǣ+ *v% ԉf<*T$ ݔQ~C[$8)քb|)IB\eR/S*cX\ϒE9f % %>#\5&ab-n#5kv2k{LRڬ z~+=zNgpSdI;4Q{_RoʆE+1vZR]1Zї(>]S&f[!P,׉+SD3Ř*U11֠tˋ u H(t` YɄwᘷegfZߏ*5%/|oyr ?ƕ^ņaƓa(#+8fykyke6n *IXRVfSRB;qbY/`n~ꍟ6ҙEHgcǽz4%2 @ͅOAۿ,71N;Y,lt\GcJ:dxC!I=wa a~%{0k*FjQZS|xݵ0"YwxaKe3J06an(hpE.*N2ȲJf7H׳gF6y+>╀E>UF+R@V$DOk( Oa1'/VtDPf @"v&s? ɞ4 U K=$VmU ii[p* x ϵ7{ WLJǠ & UA3GFÕE#r1R酖OR)3ŧ%%ɕ#K=_>l<^#筆QY'%g0JQ#l ?E}c2YZ:i.0mU~3\U 6y9dFzM!΅lMxeYtʿ<˿LSۨ[tќd*(ZNS,<Dij'(rϷOx`]%^&n2 иo-H2vܒG< V )4[Ai5#EomGD8":]01Bk㹵` \8sKHǔ{La$ %hgίZT|uN:GE;h_3`+JCR눤hpp@aP e"%8[vK ][Ć ViP]WкKefLiX7ߴtCL@z;5%J/ 1c!G7@葡==߳!hnJHpellf_15?-Dޚ|7iYxͼunzd zGpQ2qTU:S@y t%m Gt}UM ?D׫4'TC>˪]mȾ+W y㵔UKϚT&zIwE1[nwuM#èp3LJ+u]`.y7\[eҤ6ɽEce GSZ/h.ч O,O`Z\jO]س<#`⤫7"TYz} *'tü*ה\׫IF|X773'}3~MPR dzv݃U^*5PQ?)5t8@R^Ã̯# rxjBDDү+ 0uS ~O3:ގKi2@,O2X"!XpEA\V|K!IɩV_ܫ!O˜O.ಌ t8sI[Z-mmkRhR*[.TП(}buNq' 8*Tw c*zuFɳg? P7AqiUPeLGXnr"svܨPӽ4!%o|Dv9uҹ8JθـqܬŸ VBK*,ZZat4`O3lW[Ċ~6O73\ެAp@oEόh(nܙdE3;lEꆗ7>hEm{' <[1EoOZ]6`ywziqa5wb{ u]-:k^^'_l Kq5hB\`L'M*VB0C12aJgomrmnHd":2,6_,p4P>n.d!pFkju7zSh1]Q@hIzVC%‡٥9_3&XNJzHQV1N%9b v1t˳bay6{AQgPH3`~B?`n߽\ab;P2@d(D]XLQȥslvX.tp?znrA #o#IF>:4W<n\3R)-73m.(IHS~o^tNӊY,oY% OֶW9V"1|Ib7RXJ`}g0DIC jG+"j~%w|90)|3[ńG1Y׀΃sHHN(+~3Y8|yA/Vū0_[oY ["lkO 8C見]\ғ01e_!+PMi8N(1 #~0UkRr]O~ئ7~OG:rMxˈ>֙  e/&B>AYy{KC' ZgE$ZA7Τhms2^f+z_ "0UFpX.`|T61 "t{d I7)T'J%QRHZH5X p-T}^kyXNN٨؄ڼZ`PPnG(c{t [^pŵ;k@ 65ߎ,HU5SW{gYmz9jǬak.k^XQ84fRr_fSw9BCpLFyA^S[g?W8ϞM4}k: f)IyAV?2'E qZz)\wpdalb-ZSٍQQ^% _gz%I>b{skF5iI٦3g =vD0\^sĭ5y^ ܬ=8l߇RtO>W2<ͻZukGЅl鏳ҶO+Ž!p .Ǹkq Ҙ.paQO:oi&BլY%PR&i/قZoKvOZߤF{R!̏ aWMxaA-]4qr6b7J.܎,I]f8*@N _+I#lY/DVq5M&Ip`JUقK`KAIlzo 9Zt(Z?>rPb Je;SHD+w& =Sh OE>=m-}iE&6ַPxFW0Pt~J>HO~@Xo%35|@MPs vb"_2x'q7x\Jvnb5ʎܗ?P%[Q$T;P>h%jkRQy9-Z ͓/>meI8~N?C]+Q0^yv:}suG'~ хouv'bwE\D׫/^u#T3~6O^a<^m3)9rziť{Uçܫ?Px[ *IbLb)=pȰfyqUap'aVeN]Ei4{2UHt[?ܩ|[,:ʲSOΝMsKiI DZR='82։ M̾1ȽB8*>ꝑrrAon $J񁔇,MC$֥6d2G8q TPh 5杽Q))hT$sP|3laD蘽 KIl{ZT!Ke 90; Pȧ%Ҡ2B!&%Y{[U͐pdщ|5Bߟhc@)$K٦&d2rXL9TeB.R%hxqQNο[wT'\;gWnUD&:Êy[SqWDŽ\ʙ,OxH=wז ijx~n<2;@v=2bdY^3ڒԏtA{IAhLD(p Q|t8NQ-r ;OPW`1>&9pY+5{V.Al:/OĻ_ɃeR i%++k uź"^lsԡT[a;jnuny9Ʃ Ϸn.SoƩuSc(>2pϓAM@exD{xE69bkgm3q/2d9 z`i?$l=v;;d1z3*n726ZpF3Tv؂⇺NJg)rv.6a!Z'_ UJg[I0/;~+?5 gb^JXmތR٫V5\!?M3+Hivd\@-\l]KD6[pWWڄpUTwk^߮xljRUUԓϲ҅)xٿkFC)x DK6j"|~S/3x9ʹ,G59 TtkYQzq#vNJBt -t> 2fx7 %X̢/['VDIU 5Mغ =GA62AKs|BfGq uRjO‚TEx>Q^u@8@m٥r6!/>)`ӌ}'ſ^0ZB;ޕ= @HaKeZ[ֻRV Gη}LT@/NR7oY`H*oFZ#cy$'ѕBd:߰4ׁ BQ6%-9hThPҕfi%xRpb8QͰ-9%۬k~F{$H>;LT=TK@ ݢ)4'QؘSw5 {*.5R>MVN; |&%ꖌ_Euri!5AX7H8,Bб@ܷ':*^P|n"`%};v.?r]8טI\qޱXZصDfby G8ͳ=/`?$L Ϊ<$`XS kΤflЛ4j, xgwZ5ѫs3 2Im~4o8 {Q߭tR[6MBE@E;X*q-3ˣ.ݬ!.%50q^.#.}Ҙa|t'ngsGP5fX?'϶UYDd%<_^<~X7e@xH(92Zw^[K˳."<ҔYy SwJ!R1$;˭Tz1r\\(˯5oLq* ȜGMKCUFwю%,⠓_sS-S拜$g]+YgB~]}Pf~ssY@037dl awo^< Ŝ{hxWj/c!}ܤу{pQ>̆4Fa| RqA5*f$nBkKx;No0WDZ{׀D.' VB?Z%_GG+?S#b }aRHa S)t_=%4,vyTW`v0-2Z%bF;82*(ⶰ7 ^adaסD T*+.}E%]s8H:|᫜hZE} 281FBuGyWn6 X7RљwØ~tX\Cm{i?0o͘r"3aZkRI8q&f|G M5r [$!s\t㩃κ+=I57=&3|J=d`X,Ʌ%}KPpiO7R^M/h ݰu4ngɸ$+r؄^2-i-h< D| 㺮VRh'ScaT喻^Rhʢy:h3`M>Ch5O޿3URDQ?$iC=&mu*>Xj/,k/@g&m |x DiߢNC/N@iVвșg*x XEP}llG* cm™V9*mE2`k\/-(~.3J *}bLR|tsڹ`:{Tkq٢26`дqpHNZf]ʋ <) NCu $6q[%Zȭ6(Ndj> ;e֦u{^ȱnxxݸEk,fl[%`M[0j:/!BW!s .sj;t{d5 2H{ TW=c M2rXXcIi|tF_|4M` Ȥ$:+%k8A[D:FO b_߾6,Q?PN%^3:fٴwc:8S7GUKISAYucˀt'MZ,"@eRc lFSꪫ=Y 0<`i3}* 2}R 5CX:l#֚zn"iݥz%}$j*} a%5Up1 Z|mnnRԂ_峰;3bC .Om߾.n1_ O«:hG\,p̏[$AC de)'MV)C2}ݬVZ$Tr3Ll9Oۏ4Deƍ$nDO(F۽%3fC!U-*6s-]ͬipVhxr2 Àhr uC]cHߜ%Ut*kf CZi[`unO;j%KnNayu6RBPU&EGUjQB*^W' !&Pr!.z#.г]K﷩컦GjBՒL"Q,Oc!zf% ÖZJ9~ֹ{4M* -XգI8c#sNHL\G*`>EZ5v8iޭ"+?G{U`8ѱ8)qc77~on2\^4AKFsPa91vBА/d7t/&jJ&@oWr·mP6J0aҁrM'A&si}{WEBi,xperPfV~hY#ֳBB!k/[.*Wf"ʖd)%&uG4( K 2$e3.ɍa,Ŧ?⦝klNZ*d1pZ:bUъS|)<6"Pv]H-Ɲ,=!|9\gxu\ fip'oAKB H Dl=Nbv R&"w=sܖadMrʽ~V1sZ=|Ն"ɥ*D&=leD7ͷ%#1|^e*HP.}ŝ&ChgtAB֡NH`'\qy°O4^"h qPnq1Gi?2y  x'pD0G|{&r{-fy*ZpRI=n󻋙XP΄TюGFa\}7!E.uDӨC_pc`kduO!{Ϛ\`c6:V6U9Ϡ•1`P̄MCbÛ.mT60s&zKaIObv h6<{?h;,I(WIi?َv6PH;Eݼ\(sQ,ir4 G~" wsl;]qnRSЧ"[/A+-"PW%Gt~_ vY˲$ W$<>} dqLeXb?@ Q`0+bzìEwxgv .Qy3-cHxhpjRS&z)^t`͐vaT4N:{ _.E4IԠHC ou`KHm|S_R:CIF+qS> x"nf]T{4[#_Df˲O s$y>a$iugD~%dr$?hry LCؒ!xؤ& `B5j.OoD-ts3}T)㜸.бGWչo`Re.c _31I%UrĊ;vg.1[zop@+Y3$ΨRjA}Yg )9ʞ0JS/˱,#v *m 'ioc*Z-34mCV&LX!*cI=D*熢k<%xAk}ؤ~\@LUfg3['I:KqxT DI{5ս'ބ w,–6mH]=741li)̗FZ!t׹Yt/~Z]+r]g#/ i*{Iv•JGX€y}PORd J}v(-6˼>ѫIT=[OU"і:laS%{>E=GEKw#˟V4K$IcI6 ,,C;FHK x+.dmB ʺ|M~,6 /R9s jȕ``9Ku)j@5 j6sv:KDhUr2#!d0}8dԁ\YëE3 HsAr3ᾩ ߨڂ)KΦZlWĩCԱmUѝlîspãCmwζ8?7#(n4.!r j<`M zx_E)HX]Kmh}ޖPPX&,6VF\ ۫ijlpVw{";x27 PspԲտA _nYk~]0ٳiG\p[FPiOStqhTʊL ]fx_2)ԅA*! >VAiaRFqcj]0kL]jN>/~{Jz9VxPD:UP#~*!L*^ucI2<G?Ӝ/ "]k0ǣ͑žV8@dN%_M rFf.*H5WΩFnGп5 CsJ %">ȩ^\wXDZS@cT@h7jz3 1AˊVҩ==WpG11?d edu#`0ȀA*d.&k/d(D C(n05`ELĩMXVkd[2 G ID VXC1O汓t{<xA~*Stc`Zא'6M)#1:7QS}!_d,/1mr`$hE(nsMC$>vƹ R U87a{HD13\e$=Ŏ< C~p:gҰ ${w/dQw2dkMHx/ӹl= JgB#4 hOfEjW;=wņ:$B, \ [7Rsf:ٛ|+v ~$9YyKƬDxvz2R=fT&r?$9pQ>@]؋`>iMoW䤳 їS1AO*tY ˩p1hdj>xNs镢Ivjtu-qԠk;✎%4t<ƋcC`t͈3<քQ8=9_\uw|.I@"kuݒ_gU').V;WonȞ9_G$K8R b"Y:`Z.oD B!;{inW>۶-18́ݏDؑHcpה)O,RjPUjOF:߬!lc:] |5V$kԛ$Ua@vQ1鑗z˓]59"Oܾn S,I|UIYƦ.{%0|茵}Q |tGxgL=IT-V,/ H#Z@X2kp>~Xm}27n&KƬ^{{?kiM4q*|TH@j΀2Fl5_gb2B<1 9(͒WCP o8C=4 _SҕQ_n;);b;p BێhQHK1Pv8~N`Pne i }_!_k·~3UIh пO"E 4өvvehS' ̌L6H3q$֣f#1["fAHAըטYLy>O𖥄  6|k 񏼊LKhRku&͝yAw"@ IPO{{Bޫ208J.YHP\(-‹,͵*T Ґd=X(iAۛL^:sl.7 CZw 䆢g:O01 ;_.;/+G/C~>A&SW6tsqܘp2C{1k#Qg؞Y!W)a `q@@A'uQc voo0"ƾ%OD:܎c낤Q@S!T4rUS Z8n@m$v>&&4fb^,^[1> h.P,T$u=s̰9ҕ7o*9,YMk^mԜUy+[2gyZZ{&Z XcCXkҥHUA94sX1Gܧa[M-{?nG,S**KpLp$\P0xχCͼgSժ݄ͨPu`-!r$HK1UG>'b:OwIgk)K.rxxf/i$bhybԍJe| jܫTZU?2@zߪ lvI \K';GOXK(= @s }JмJz.RQWhpIzdmj bw1d"qT r\F;svcQJw.u fN&&fͦ@(&#'Beۘ$^3N_JbjIԼP[/E|b)|IPd g+? z :e^Pn+xOFKjA5$4Fй*EL9z% Jޅr(<Cך;[MX yEōdGk Y$PԟSIh8gңg̉t(ʹU`5b;juCdH5+W4I0ݪ/l_ml>۝WsmeH^xv7Cnk1k%3  t^0NawZ*(̢dV2ϕ0SpzWZ\n IbsR #c~[VзBPJwRF~#%uR) \ÅGc _7BaV?{sYd醴}5A)`%fqLi#T{i3phI}fTW\X6!RQzX^sԠ% a@0u^gA(`nH +lw-d{9 ?W@HEҨk11Ŀ r9ݺ|g|Jb6-<"Qj? />.EurNpvn$ m񘨶"T::@`V#/J#KE.-&QMn|fT"ZDmN+w()rAhxwDkzz4:1IG`tkhxO @p5l[9fy`*V@@-bsDj^YK02RX? xsc3}>w.(=f Iu έ mL賱D|֌EX J[An9w:Vk[.npj d[YFE$Ce}E,U}4aʽRN%m I6:'{;[|~f pug PD1b]}1"SAƔ7,ncv!|[IKFbf6Coi,O`ʼjFZ= eZ33^:YXYg;@J~]97ʙm[b(' _T2[ڒ%@ηia;cEc>rSpfdžn&xoa =XMr7?a~$0>#%_sQ`F s1u ̶<KI,&Vz#نe"犙iXͲd'`AjTfғ4\qXdeTRG&Mn.NcM&D6Eq^~9^u37-rlggDp`kb@&~>i'丧i~@ pKqHB!KFJ$F;a_{a^1jDqZT>dll:X$ƯݝԽQXe>|ҒD&³'Lg!4 65 DɁ͐k{<<}i$e^pSuBQ_ ˿aޒLC늀qPQGߤ$$?cg:agvG '*e"IY5-! uD-tB <ݨ*TilVKs"6|7*&9B=KxTd6b^>*#dXaT5֖۴YFfzw y7kBn_ TSðjȠC"l7XA]F BȮ3M"6PӾd8Ivѧɨ%1LL,⍠̠VO&o%c'y8 9ek4ܕzԳt>-턾V1*Z!Z}7}R&μ|"kZȱ:oYO6m'IRb*,NׯQDGLD.9O׉YOBo=Wu}ڂmTp CIL2@ #hexOc=EVJDZ jebO tDL^¤.ˋkΫo2| tpJq합c% rK,'_޾ P`-qF.J~iU20 (Q{EۺGaE ~w7яgZRIf}-8HfkO95Ϭ!8 Z[&\iHWBתm ٴ d\#ORʇ!zC},є[ŀj/q)zkDov8}zf0xy)4wrOXز$IͪF mӡ7xw1kJӱ܈;)[=H<7<%⌃`=$BdDSa ff,TBh{8CxX+>DCۯj. I=g^…T')LI|chD&(==Q @d{l@ڀ'МѴ/B/r8Dî80XUg6Cb$ ^OP66Vn8Lw {EWO.)S}Խ Τs0pe;<@y2;.m-AFMkIso#SPs'Lk1oǣ{;L53\.. Ѳ3eFG]XW=Xe̢RT-2sPW4BZ;,vI2WaWAqេ)-| ʟEt `KLDR.+ROHd21fbFo\ >ԛC9Yì [c.ʳE~MdtobѮ0Nh $9"V0wU0Qڅ-W{W~Mdo1Ph10Rqfщ1/0\q4/Ea:c/N"~Z!$`8I-Cnp-e'G6O(T+U3Cn_={sڃbPE d܎m +gҙQ;c O~:>!ˢֳ jp 8Kw'c4sT*Y)g‡kkepX .X({rrDTLt:9jZ#c1SSܬ}:jxĢ{iN&TK3.J{'zVW^-T]fS@Y'O\ZG^Z.:Xwka3q\S!_ {zz|~w_e gG9W; `یӣ$X9NEvb7@ⓘ*G~l+\f]Ge*F0xCɾjO,2z9DHt",+oybKZ^z;}33 &D7nn&mT6p~iwQ=)$xVRE eR *lGV=9S3 P~=;󤼘2n^Gݩ4(fQzT3 9- Bt$= D`ܪ̾^YGUMx.yM틫mKS(v}~ϏLrx2NO#(^r_hSZB x6J+:f958vN>T9!HW,Y;ao{K*T-Z6񫰄\lCOU4+55?+>K#p_dw]ZQH]F5Ge}s$Jz`|.r5Z`ZW?GQX2– Xy@yPS*/$,bKPJ Xd^xpH.(w7%53b!Mņ۷7|' SJ20sĬD80ӄ\@=(Q3-:!~,'DWU|Vn*质 帒1Oa8ڥJicIKbRfSd+ jYE[W]#]xNyehaW׾5%Eq=VO#/n_3+C=!lL]! [d 8|pךuy mh gL]f <+j\$n$r4u~}#H][1䀙j}Q WiZnlXۮv\Ke>6OdӃJ^-iМ ʡ &v΋&vL{1lP ~^]2P9禗X+[xs m̼zcۯ=SX i$.qu˝8Li|e٘ITǂ1X6 L!iy; ?ja/rlwJ{ttrxjfѕxOGsC>` EC}1E*!lNl6ubA&Z8h^ȓXu'%bY+GY+2=>l\M-" *Ô]DZ.nh n]AC㟐@s&r=H=ڪ'jdyq5-!"V;ATXt48(I|R/5.[Ze&L4s}֪\?dc>Xmhv\Dޝjd]ܿIU8FSCaTJ ib*Ū:TW,{/H{s1#WBO~ vŌUb +\b\ZX@^藔Z(0.[{^N_}j$$HU/,'~g: }tёLz2(\w@7ytLY'h჌G qvGt!D ?HIӲɴF%!g0 K.BYs.*Iv!D7} n:h IgUݮlc;=Rwa/!$}˱Wb#n*{߲&\;o@~4>Mjr6l͚'0g"k0´@XJ\cFjJ{-Z_V P lghVplGNP$' Snbϝ;?E$$ā5|6sZD#x M~VEs]VgNxPǽ-YTw>DŽj<:P2Qh E9"dco@FFO+oCǧiz=ĜOv$f ;FYu9$u~1Cq1 @_!,;Z` V#zO%q%c Y5]՚^nYECTe$ux;OSSqWKz4zlc3yP]~FܙWN ^%@mD#,j!y5}ɅXJOY3wV'̆6`;Gr|: 3J Y@: qG 6Tvi8E?`rCcqsh㿃p&׻lg+)0g|7Dp\0#OrܬF**tȡ= BGyQИ"߿>Cr ƫ8)*k!=E~)]ܿ_DAB 2T?pH?W5GDvr2]W&pNh5y!='t=i3IvaGȧ+m/1\>'A3WK~7kyzqvUB/QL,'PcQOe|c10>q;*:_lX6S2s7Qr #[XHkMk/RM/ >E@Ua,8 /tJgTCWgv]Qo:B@R?3ŨI&}KESI+!mޕτ6pg^6`ϝ g"1Ȕ[-lRY2D4Trv5.f eፔG~hdRlZ>бY|!4KG%o\m`L]:F}vp.Mw߸J yLЌdNZ UX"bEe$E$,p5` uNi2`f*>i=R8XsCcهN㿬H|z/\:j=!t ^ꖻRaQds6Vl'9[$ѝXnA\w_:>ׅ6v]4[rA"? C(YPH \&C_+kS(*bljbOm3DKgܶ٘ɳ+曡_-Di݀[TTxD;("#$kOx:PƈFNwJ1@ £O:W8xI(hze2\g6Q. ,pD( H;Ts ޙ9DsbaD8̶ f3d%焦KK;hJ))wD%oMar#ةO9| )WD2)!<"%v2QyP ]( S4sfQ$R N=߂{`H*Ku=CU/Uڼ,g̐[-iM@]ȵ{Z`e&S"ӝd Uq Mqj@)%c#~1:g#[Mgi 9lԋb.VjK3hlA…hqpRuuv5oH[.'u5d딶$ش΅7VV[$t7yxy#R+Z4__%{0@D[xl)yo l' }77+^Ȅ䲳&Hc߷ePD;󊶿@|^V09[:O+ehs QUÎ_Pe͋ĝJO ? X^y%Ȱ*w1r k$\jیrG"'{.U^yÏ*ߵ 9Vy2r ÏVWط?2? ״zW25w*)bBt'ounm@u25ip8ga,{\n186FE6n6/ -.ؿyi1Qkyn/\%rߊJ=K>'t:M0ڗp 4ᅂ1Y3 ewH줝x wt-Е=1E7X w2: ;z^&I'@88xQ"נ8\PFk`.Q0Uq$"g)f̦Pz6*$2 _Zܘ>bp&΂1 ;'.S |myr3&>g1V_tt{kM(^m"xH & M{ Z" 5Ԯݳ_S3`sG- *2ΆKUF[vMe9Boo{>?)g2zfm[ފ Ue0୊Hø8ۃ~1o2%)> ō#gą\_aKj}um{*`~ zHn՜G!mq8[)=YHH7 /TYm5.vPI٭"0HLM v30䇻VSGjbqDߚmXd"?_.! V9 A4l9GrC %БR 8phgl$@inD-͵=0Q+/!Q?[nz"4YĘgRئ9]ѥsRP7 {K9[REdǯ9G+7!<%e Y1Rf:$EQ2ʹO@KH9?=RwY|Py@U꧿Z|Ѐa[)YaPW} Qe7y1.0eR|ځkruKif,wQqK 2KuaUC4)IfĢ%}ղsNΉw|kCEyf^ o)"}F!kQAA^L"etRf#$)C@\4>F]&/4VJATuG5&94V˫rRwjReb5g=`~ZՆ =w^M UEPGjk(u+goF[lmԌC!j\Mg;Չܑ91&B E@D:ZK.eV+WUouu?pεya9Mbi΅(OԮҖI9r4#xu gq jm-ɤ*%&hWp|D$ŹpP<_ ΉTQ^wƸp&ĕm0`vA* ) !3 T._PhV 77iڹ1n6hk*|R/tq)` nroL?uyUwS|pЯ},s!v v֊:岭 tBެGX?rgMW{2~ih2k>˱AɾkQ6*XGR;WBVURsln@պx,3ϼ#F?d,7/ wc8ERm[]`"K]80 Y^*E()JmvoX={,wS . fervrާF㑭R"\U[zVS;JQp0mTzd@Pl&[R/})dU*LJ!Rwuj׆Eiʥ)À;jcJR)EZ Am#yIu3tY]x6]oϋda-F؋_:4RM<o(c[d)=?_}XQ}rlo"ɈH t 1C'Ѕ Oc,YSRq?ngS%YدohBbc N:R.GpϮ-b _j8{&{(QāAY q!Y {"|_/PUe[$I-+7J,%|މ>%BS$TuKly[u E-e>Tv4 #z ƆB( f"}#5'1'J|I\: +ʈ8{[;m"Ʉ%K&(Jٽp0fvpju6QQ1͆>G}AL.Mbb<-Q>RIӈyd ۷߀  '5v;/iaM2U7uNJxʯ"\wl[l"\%;I8 e9uMY\` \XTAe9;CXUAN-8"p|#<п't!hH#ƌd /̦Z,`vݢtTGpJwʲ'.zPZ+ȮkjHxnN}}6f$zoK NL^Хdyd +xyORgxgi&tyZ|֯JÆT9bYvP/ߝ 4<$DZ- g}n~W x`e|fԺDg.Vq!ޞYL07]!wz$3E|m~$K[Kw2\C&HH_D1}B^_IOMfv+C&d[ B#Cb |uqBѯ;@NL*i3WқPܠm2,Vji=ReTf\.Z;UX oJ.z ~byAk>w:F~'3et8`닖_mV=ZC/2'|N{lʞuij#FxH[ۡUC![hO聍*X U C]=,7>a'O67B-PCHݕ?-i ppZVYfVW檘E):'I30cI$:yyàfIɕisvYwN2ĹQ9=[YΛ$3qm`+ c}o`y&X1ӳ5m5-z`V!2$Lؒ sb {eEĵnj;Ǻ@o|y#r/\n•Ҝ `҂(H7$*ozs>DT13daEHd:l#ߕW0)W{\u,i YU.;_-›eHkqPu~R9=G9XuE$t֬ۋ 3\tX:awGU9ɾSBP*ѕ펙WD6UWwv7<1$=p;d_!b̳_קCrSgOr~BK(g8FoUqu=r2V-`SOE:Jx>Xa} -x[(l;'qU%G"foO \ǻ"0&,?墩間]ǓR1G8#a3aG:q$ZQ#C>OI)fK/ ^\R`sHJ`gϐ荑 PS%xjCL<>WIԱۦ4uOx%'2U6IwjlUMߙʒOL܋aR)䢾WԹ@Gl֌)Ww>m3<,Y %=iKX[X[ i5R[YW6vij|Bܧ6t2=eb œd!̞v.NHm58WԒJe#p\'0h@F*-0n)uXS7D { 5,_ CCͶ,q`_ʳ4Q)anϖ_>sI !z%1]"f+=v.mJ ;j|G'G&,*e>5>4wŖ(P' 5|'hiUCt_Oie(-_ pI-%W31@-xd[KxEvݲGn{$s BxSʼn,3P1+PO!v'3ӈʰ+)mH"}2 E,mU!sC+S"\r-&A7@{ DUeaqI\@ f9ORzN&m鱨H$cgjW>(91&B BAШ(.lczwgZ@%I/&ȈFYBMc,RdXg.Ƒ{גD\%aYu~a|U=.謫 WDOv!-bXkQ2mi}v$nF*y`g١ٕfVԻ"1?:h#ha'c DEbd"Y6SJ$T_:ܴ [*BSЀo7Vp jBtYsu=jf[ S4'ekXٿS VǔBV mu#.@~GBpw>PG`@d΢*@J9,72=ތ1tLc F`хūM|)UϗRRƲ4l7f\Y;:G!qj7>zn%6n% n,WǤ%;8ZQqMji1 DIbpGMl\-+G*G̖hR, DphcPXoqDUPم"~Dz*uf!E|x;w (|fVM[s91 :GLOIQksJcnjIVfLx/ PU M#"<]TES < oQ%1MbJSe%+ŪO[#g@ +VW PfYWȣ 7s\r6L0f/B{RKGd^Eq؛s-|>W:cɋ,49ct++8,[6 Y_DG3f vڐo7J/UЄ(`kj٧{ѼX XD${|Iҩ̔(Ozeг: Uhjhhz⎊T^8l.iޢf4/!y* =+qamhw[ΒTw?ƾ^译T$\C1lIѝR|aC}'vyyv`Had՜~>@2@1qbl`1R1]3&;l) a0Ә9AhC--):r&cH1F^pS=#|,sQg ōxϼnMGC=F)Z㳾lf:B$ ش*Mcڳ:Fag[찜+y;$-gcrɴHuJ#n"elYɝ LfW8h{`05Q#$r3KX}wN'N,Iq`ϖ \YÀlwpR􎎆sJccW$iOY[F>wD|C\9ஞy"; l5\a?%fMZRi6%^-D]s8]CU2,ל䓘QXoHh% Jt?{AHhiE09ih=*nWBA'rl g ۀ(Kt:]Q)b*Ox.DݚҖMD4%4wLUĭɼz癘tnQ[ XeknEIAuT%*鄼.`JAZ6Ge*hdކp 튘g)=U|'VDiIWޱcHt7ĖȬ^ֈӏ)?MIup:IGxb$k[c5I`4 `2ȌXJʵ5Iĉ։}IHId_ኪoZ<x˚"_{c#F*3[_զ!N\vw#'[U'%D nl<zv+]$ih^oD_|a<+|#&/@Sjp}IU[ $ uo!z9Mcb& 9;:'vHcJZmIoa&#g#ba܄$bԾc\\ZU ?s,5vnUsFx;RƀCW$%FN cr;qYsZ/PI(4366uy{Ŕ͍De%uuCxmi5)qmØ,g'o-!MCaqUxlPߦ͉˧7+ŸX2'yH.UO.{I3%he+{lzo8L @oWzG$ N+dzsOҙ#)%Kt S¢ 0m\ wŷmLa Α52;=Tj[s Y&Nc u9d=5ih媡3KT+m`et;\i^_CLɺvDc:(vvV]9;Re|ĵ1`nZfrL&jgraIQqy\w."+$<Ube(1BW#HYv.{ Jd^*\|r׳ڴhuKFx+Wh 7?${e١D]惊YI҇雸OAIAhLCG>.k2q͢y+XxL~>K[ꡙX?Q$ʉO/'24Vk0Q7XYhꖜsk {3c!?8` j+`A߄}weFntUscz _<ΉJӣҷcc\a~pBbYNra\v%>8|/˕U#[.Zcx+D%X`eE 7Y[L$t|YHrТHz_^|~?f- J4 UBurߦ{Y4˴hn载% C^^Qd09Enw[(X+Cv(oȕ,hg]a!ntB,Jk!en<3G<>_0b6"f[gAj:)vJVx-&Emw`U`e@tE/\L^0Ǒ*߿&S2rJ„[4%S\7m~axϭ*qD͎##ypgdvb>9*jMf+ KqΧ>*6::t7=3ÅBgUC fN$i/ʁ ZFg5ofʴ8*ONX/T. rZqN̐(vִiG:8T3:Bu9)nCrPe"r̟{MQc_ hYK*S7黲'>BF:z>.MNêHp`:K{Z?͗˫SprJz?/`Gj|h.t5';,ZZ2JC&c`="yؙҋgʱBTx48 5 Q8I/"g>0Eq7;Ծ刎:]Sy<_)˸ ǭM!N]_P-}nC DYuPq:dW3{ KGE,4E%/mD*s̉19T 1<A |[(1}q\4%:h5f}^ U=-E96EZ՝XEJbFh!նe`G2xs:ܷ̀]J5mBzF-2{Cvl¹|8jp:ԣCf#բU=TBj6gme p;L TGO{lu/QvO "m:4jU~? }h6*~G:p|؟`V! ҲH&+ccRb䟆'{6Ez(Z#R˄=6* ;R( KaJg[tLQYo :Zh%@Q5h>#o&!JO;)lESQ"zN5c`Vt`0Vlt^n]Q$r:v}1t#ՏZ Kdo j3krg2!j_4vfd NM|Id^/7Òf}T4B# 8GL׾ 㸍g!"'NG3^(%+ tqb/H[ײhBɔ+43\;ԥo~' FuoMh$~~FCRS\ e[ߺd@vCSA$.^< ֞*wcOc -؆%/WIt곅6D?d*2Qaŗ@GCR53f6lSfk`ca,L|+\:>T^JMݡcW3"9 㙍JW,~ʫNه:eN"Pq2ۤѡMGUBq$:U9`\]w)*J!Ie9j$6!`ۓ9 $|8A'f %lL};ޖB%k?<[ZF&$;E{Ԇ"M5p^{PQX|;Ij i2?a b`*7Bb,ܱv%r(TMqu[)ŏz.S3cԍT?/f>m#-$L&y?Y2rP >?wK;( ;~[7w `.4ƤTwCi ]]8,(P"(<ȑE yFQﺐ6 ǫp I vR4CeKv:iMHMXh a:Xg8frt%}O{,eCWۖ@ IV΃%f^/uZt=J{q|cE1ÌL.-x`Ƹ:(EVFS. >^DhCyH2ގG8}Ofa!ؚJ*쇿yH\_ ˨ OٌN4^a;x;v5jm8ɷ}sR(uayGa 1 z{Eϕl$}f\XЋ(atN*aA,5;QҟjJRCg#~@X/ j>Z]ܖ+S!9~aaP{@--뙊\\pgXi 4ݢ"`&&Xeʁ΢pL",,H8Ûķw'hMdfY|Sm&ȝ3yB7ޯlx;1X[Ó_'/Pz>ӓFD]C T̻^8L k(MufwU3htx d ;Pzjmx!1:%O\9(vM@ϩy2:V?xk!%M>ǵe>Kco "U4pN_IP$NHk|vרRp-'<?8%Do~ՁC@bn·?ji4/ Wd6ď,߉mӲ Y!<~j\luQEGD[|^ȖQ~M7n/cvheZY2KAr/*hxKPtZ[Q"u; LN q7ڔ4@׵.5fzn_\1 ? H~@ 9|s5싉ᄠಿJ"-j LZuώvMAf4/ բ\}(b^&@>R#i(; R2N  %2G̀xe;3Έ#:r1.HEnzfϥ/ ƳL֬?rUy0١OqolzSw|du;Q0 91F2 # HHVjDE]JwS'73U8A"}igb$ۙk4|$4Rc| <y 8 nݖvxʩƗ**g#WwK3{|/:unDۄYkmHR<w#$Wb$ .`a0$"U@j&L'2v(RtѠG(謾)lŔt,yr ~{b_ոSd]& Ў_cL=3cEC'Rn"AI Re0!/g*w|iJŵS)reY?dikkK4k6܉`U oE'W]{Nz DvAocݪ9r;/>#>T=TbJMK%+ ?r/OtMx7zfEɇ6J-<5w*c^r_oRĕzS[[-a+ERbwYO2؜r"ib]PX0ߕvmѬ ݜoQ}p#$ <=a#W]#- [ܿl9=-O `<~PV2e nD"UD@6A~,XSq 갈߃MOi-* Z s8411g/([,:o~ k;C\O!tZr(EqOM}kz$4O62RqXJYx0G0֓Ez۫xMWs9 iQ Rmh7'Z9H-{QƇ)wQ>lDh Le6>Xz`h`% ݹzQ[5K} ˌ EeV-k"}aN3Samj2PwN0/zB`MV<]ktD}/Yw-Oǚj%,IE}z1sVyT߽m'D=(uYypN1lNވX6Ҩd0~R6 h<6E[#ة t3lAcMó.4Khu܃ȯ?@<&e摏<jn%'{;T97gٖ4yk}4x9LMX^/: Cn3x Sj/ a`DNeK:*S9ݍ\`M [Q97cKgMԪ~Nr7ԑvzS:QU]_]y3ϫΆ|1|fy#2/Fu˭h[xKmɩ$;{*D 9vdQ9q)1"{V|LpĽ ̡yf'iTOjN.ިW[b]ڰ=~9ԉHg+KPWיŏM=g%+?KM%!t ߶ݩklI쳏_K8R lՎོB9A,N#wP~i.&~>Ư-3.AlLi@ķ@G( ؒ0_ȱ:mf0ٟwD; aiItJw[f0L-/ ]#;3|R=IS0Lkiq,J]m۠`s3 \ۖ>;l |B'LHbXP>)ۭ'I]2zv|vZYƪnhhl%= $zIUT\aāDz -`"M0L|æKBl 6Lm^!~3H(` >ę{uΛ; a-X'pٳGYt;j|4-.q_?ԧ(QV>~4=9xODʭ7>d.b#lLPm6Fؗ&Dɾ+OQ'';E8 >%N1@"6<&GK'.C;o:0蝗qMe`ZO` n`UF?vu_IqQʭIXq@l# g CP@51GYQ X=VovIIHe4  *¸qĮ%tWc%XŃ:UdHubR>y8~``pgZ>VN^3Xk/IeαKZW' gVna*\2oƱ08# Qgr:`RD.!XK.o!vVSG6|b6xڿ|ǃӰppfXjj6ʷί6w#&8@PG~IVAy4,5&,pg9^g?0%ZRk?FڪLK|o-Qvz_ ZvqhK; [VDd|DakG  ]-Ԋ<07pXULdxއ R2t!U5RCo": Щ{MR _H_!8pm׽S +ٞ;p,K\8LAJ 1Xzg79[>ry5ﳽl&^-$۽6O$..L [/A4`K|RhSSؿ"m \w:TYOI$6+ 3-ݤӦrWy%؞[Mˤ骁/ozbx"C%\ʫy)JτJ4TuW )1-]@nF ՉNdg"H=C$A usIS)\{x6>3 {;0qN!~me'Q]eWX8 QB+ G2,ߦP /x[e>~71:Q<ݐ4/;(ؔL?nj<R) &pG|ІIO$4Yae ?dB?mV(hg3pex\4&i,ow?W;N]nP&.jķ *>IrB-pHP!_BDcו ϐI؊#¢Q̻Ώ .%_bRw&ĞT*2 e7!eJӭ-%NGkG̀zq;r4l'n4,$Ѷ/̦}H1"WcN$81T.C 3BGi^,_ܨkMzٮC0g8unf CKˀ ~6sp*Ĝ&i꟠M=)P2_2hnmDzT\5#kE8zA^/?[ߞ\9'0y1NGY ]GY5D2O炢t72YG]qUc3VTIH!|mC—DͳKp΃C/L-Bf<^H8X.Ínr1Psȏ;)/BV=e8MY$_Ӥ $G{h wD 1h7/pZ$&!6 TxP0ˆ8.tN; i7F: _{UTՒZx ߿.Lw&r,?[rH`Q#tLN<\F/{ &\+MECŬnȐ sK72ƞ{,!U+p Xٌ=DSRf(}a0ViqU |q>@X<L%&$DičjCMY݊X q\[ q1 <@ |/;4@$tJH'7{,\a_Z$8Z ݧ*5f~UR,~){q(l'okǺ'G_~}uX4KQO/qrUDB?3g'{xAwމʢme=+J$재OTxЦ hu ߒ O.IƤ&e?8XdSmiMO4s =R$t~hӭؿt5c,A˂>˩{#84=Y6c)*Rz+GFЮΎK-7&;O_˞wL^~65k!,cѬ CX T6V.w>r>Hk$aQj},U4S iþk՛2::[Z`$ 6I)"7|6K}b_ KxJ:ZI)PӆfHZW }BVH[?׬U; ,w""p2eJkA.l()^]E*WB"öM@"h ?'Gf$;Kj9{p ;X8c5"+Ēyھw;)?+^l%RǃRE3ZF!l>Qo]N֙|8#&^ତ$qj4$;|L %{셅FP첩7߅ u H낯-#̀<jޛv'GJLƅ'WJM^Ow4=Nu+mj<5]/>1sgQC1=sz&&A7CV[#~eP p /hAhw8nglCp##Qzn_jj(QU{EGݠäbMR?5ww/-Pu>/ƈ}2zNhsͿ 32?\W);P7"Y5Z1"ssl%Pv5,0j9 4t,Tkvaw! _)4w}1KDRlh*Îd&VgX-Ū%&8Cv@~ɹaJY < aȟH5w,e,?k*p:}MjS~U+dd}`3^[{ }c9":3VOraxzc<*k@1 = D\~I2/Ow<*v[OݕSJgiZ`s*jC =%5|d؟:&ȇ]ݥ j1ュŰ=/DqJS8jw 3zM>eu%|6XZqfY鿊,27#u`jb΢7GP~zS܂=ڦQ_f;^!aDe/a+ҥJ]V*VBu$ؗ!dS)!:JP1c~,mz >fGSE<r >g8^0O$:h&`JEK̇S7)ֶ΢Ycrg،jUm+˟&8\!k^r՛)zq^?3Pc*ԦŊM\̞9HHža_>4yLFޞ+FO4>H`06z[cJA`//k2TJFPV'R q:ZNuutHٸa$Q GO,mvB$1SDP).\[dӰ.I866uxY(TGl\CFBZ&VcQ n4W(`מjnخz[n&AEN"Bv ͽ[F+~gKh2h&O\\87[XO!:e&Bed䌇"skKὐat䈺Vx>O_Vz@+d2ək[bh5UJcٴ.Z4 Юk35F#u^yٞ:6Rpgܨ.ʆaAUYͽOn>Jg<GHA_u"O%T&U:lS~w&NnQ8Y7ktN͙xeB _%[Szω?F:Ud+^?NS ViffV"[^pͦXz,:7yhǰFeggg m4y%6eqw>B:jgʤSJ|0MwL>'f|YV'eRHZC6My-EŊj@AH""X <hZ'Di w"Wن=4q*Niᵎ:|IҦe@0@rQ{0ƪo"*n*YH2ܸ4CLaqWAjPZ:`I'xWNGIOK=z"߱ bܹ9i55M<ǖ=%eNY",;j̕as=< OAԏ=.!JnW,_CY `B&}0Zz(Wf rBax#}6`~;`X,FuJm}<x+7,/ 1I njFTP N+8`4s(zRgX$f^9Ο ALY#GdEuϳөW[xl*U$urdŝ6I#i}R6 wi"I텣;K~Q]ȑBF_X"}sͳ1?[Q Ǡz0s Ӕ '߻GH׷~;3bïUyLkj۽E90coB>홉sHa=SbW!3PWa tNô&rL K#gD~X@tfȕxyES7Ҁ"wb'ƀx4Co}t ] ApS*]x^3vNd6K=-|ajufq[S%A4,%gߩ;Xn;@V=-}m_`K(b!ܽGݭ_DKʲP9i?9 r=S LR 8meX $f*2\ٮ"f{'JT]xw>]Z?΀f&-Q:8u{XzO/_Bmd:=ٔ1ymͶ@ϩGɎSz,=3>5 /BCL 8a1'BoZo"~GyT?+84$d|h wqE3ww MrZ7ٱC*$6}ʯ,l"#i~<Z5A/;k)d/ *b{$5MUɄXď(MϋI4z9N@N*ӌ 8BavcHǀA;+,ԲGn?oՐGCu'M+5c)Fm$V5D&2(Y1m/?[aH iz־ȬwԆ$YW=yQ~~:5? *BWtҷ.ae1\yN]1rύSތOhK %0sRnyǼ,Z[(BMc˟Hf\L F.)F2Ԙ=9-}ù%Sͯ% QX0=9:.PuM]eX7U, <s2cض`3zkΙ/~/nZ.J{;qG9,[ "DT#ZUʌRUqE#E85!:1 K3p̹u۲jKgƯC*+Y;*!2bQSB$JSby |q VƈNlVIק7{xw@3xd,oRH,KϘ"W1!{*ķ]!: ef|ପ77*r!icAiffd( Q=Ym{+omF2&mp{e&Xx$}\AE4L)˕v Z4e6WU"AN迴!(t~B:>|g{\1S}>k.߀~x,^Hg2{ 踠_d}XFvlUqvJ/qʣ9D\xOMV_}=ϭ R_h5| _>1Qsxf0 7 "Cqf5!d+mhsdbM-ڔ& DQj'N*qvzlmݽ{&6{6|0#,ڵ;\XCtZK!d5rdv޵mRw8INUyʝ!SyMw$Dc h!7ͻ  B>h`@ kbqS~>S\I&HinrsVqq#Ja5ь[+))+ʕ o_#0cUK y02`^GvJ [z͑oޕV9á=hO竉n\5"]x=A:ަo`vG%Zt?)c (ކ? J_KF3YcRX-Ռfy@Bزk n{#P8Zҽ2^(TTMEH](`1D yv".<^ DS3$M=(0ǰb OqC}:}mg$8"o [(${( cd)ivˣ5s|}h evvL fu+]7mRx_vLP?n AnY<AۚǡeuQK8,岃Ϛ@0'I^`;{AX#>5o<ul% 72tI ݤ5+ CO ekÀh`j@mWBN,.kbS櫋{7gϘ;lBNƇf:">o'Q(0CN4 噢YƘrW,1oH|U6neU>.Z&j5Ҋ]Á,GZ0;[R[- 8n.;=f *\ׅqNRd =\\pflҢ̄m"j"&ZNR60ͻCqkM9O!š uW?Zדz N`q)Ѓo\Xz{ #xMA^$|E:(EM?PسI-X( B՝}zhD*}UcUMRv+Iue ۆ\ilScsrTn<(*~*ĔUo>CE0#ӭM8Ve`"7w|{Ua{"ϒbKNfI2=:6Y?b(޿04Cj"w5I^\P% YGt'T7pvE:Wݶ·ogܿ$/\?J-s~ CB6+'Q#Ib0 fle?ԹJRO]D:D2w88X {4ۦ/%X f+a \ l(pC}6UNG 4-dS+UXA++[YϣC!W[ j m/ZSf]ZVNt&"ɯOTكBE#C}>3%8=x?[ۿ*5da˩G_9:wH>Uފ]#.hF&tsrљ_\sn]}2QKqqBgyڨsoC4)Y_NŠ+ܝa6+k-\տP!%70&?!?κ=ث; /d>iྤph?s~ + ( %)/8HC"~1,R:{a5.,t\a:lY ĐsOIJ&k͇of8LQ>叾BgEb=t|"EufI0)KH(@~:{6f D_zR^|a +Zz '\Ul\b{0 0Tsȋ-E]Xo~8'WE/A~=ߣ%W=L wy!lF `yjRI6Qs[jw)&s2T>r ,]ΙlS4٬T⤦ HD^Cs8i+0.^_6o4<u 0lgeCP鉾Q)XcC1!VWD}c4Io"]"iBKqkK='<7"~y*׃6bc ЍV!4>("daHg. ~'cnuG ngSd{K'µFX ?.3gKֳUJozmW↫S:qsF!5%>",}a|5+0JTrջqZ`#5e&,ȳS9,}?MH<(xI'_BZ)A괻a6f=]YkRmɵqmz# /ێ2u!tz1(`镮]=i\Ugs%Z+ G;7E0tݽPOܯS&skS%YVm` 5fG׊;R+.!g T'ưx:yOwSr@~0,rshY/_ le$QWX\oB͒DOQ9>;sbwu؍LNOfeUKU*^i)T.lCQB}@ D9Zmkz, \f/ 2,h2O?vo5,#a CHs~%6@91&B!LZ* u$.r*+Rʫ*- &aA$q oZKx/N{Sv,1 ua8DhXڭcJ 4̽5,|E} [LSAu TC9_ io\ 3T>5+"qըY::CG i>vˮ?)ɷـw,HtRVj~'k,Bsp, uaEk)e" [8+nh͔o͙$Q? 7;&la(.FBN > cѓs[Y LJ ;pdXAvi%bQ;2Fw6'ҤTeâK$KK 8Z0Ka(R(`PB!ML,.鴉+mleÏmG./e#>&pU" R&Xf\F7n;nT0IQ̈@'vse=zxBߨ2~lomof-B+J47I K% ҩ4.LID<a#;vOmglJ'P-(,D-V/l~l(!2Xd6 u@Ȅm> ؚc]Q 2D?)벍V6@ӴͱFj-],䘯 2, $x;T戧Q+JJB51ikz6rt԰-*q{ŞiG$fGo7at &voQ m~z&mndd& i_0MX 6Z9&-pFZ9Ayk-Spy?}3@),+$@eu-3el*YOE|A6}Rţd8&TfaFR(RY<O0.^66!D<Ƣ_+XZvnv65u[\*Ƥ]'8s)x >Z\k*tU1# ƽvG.\K(;4%_QF)[>O &p| HQ]73Y"kޖ?fHV'Lt"W ("uV(Obcc>Vۮ@=s|j0M.€"}*r%k@aYuZuI*LG !oEkk}Hխi[:` FG C'!'1Kh)լͽ {"gyDFĎ@ۻr']5: l.ܳ"H(Hᘰ]n e7ާi]NՐ3"%RGǖ Ҩl'5Ӟ4~ ܁ X-8AŝaVh9ܴ8_.We7':^7Ay/Nn^EO?\zȦLGxllRxU?}"S&*Ǖ'@ Q\ҒvD $s*#k{5aV{@$iu6.G;KCpRDIPqPL!y5NׂDaU墤 Fi9ddk{i*[^Ў7=tI˛->qA܇[{Kh ہ:߈ּ@I[`7"/r {lvZ~ZWZHm 44a]XY]W`(_:_tМ& BյB騻@2yNn#\ILpOON@4k-MA1tM) : cNt`8 a5YSmV3#Zs"NJ92*WbF* WCPqڿW̠t"NKR?j,(L rO^32+Xo=W WyG[N;70ދScj%;!(E$٪o&!'$^Uљ-91F2 JDѢ_Jc%j\P{Z硕Yn!JAc JE6i⇦hK搜RU׵Rkt%F +}W0R?@VZ/J3wJ)F/-& !s-+G"h`Oc#'Wtj邈sfqITTP'ijUATlּG91~?:(v!s1:T qG#jBL˺}_3Od  AK eնv Zæ5,O6ޙ^I,J4kr9T\{eݬNC{o F QcFZJ)Q0ָڽ ]cKdޱL BZ]N'IHeoٝT,'RaOɀju@=Q ͛55E<IA%IAhLKdZp]/nuEv= Z-uq@-l֗¾lr쬫fך"" drݜ9&F!orچF8Ϯ )\UW Z,:,] ˷^\#ܖo?2lR&/nfƜѕ4>b^/RVc/jWŋDOsLXl n 0n*aUݬ> $sJZ Iq= ud0Q?[>283Uz{ϏlD;-hE/Up .pw'G6'UATn%:=ψt ]#ћ 6HcCvWkd+tl(N'BxkqaЙgx:Fme/Il,ĎFW[Y"D 77z_ݳRvX%O08Gdh`߉;]Y;=ľ[%h 7v/AМ DHcG-KJA>T#f(ӽ+ej2#AKUr70CpLPѕJ~%jGoSu(~&#>bq^\"=۠Q=wOaN$A!#uqԷ'F\q]nl_۫.rX8Ŏ&p3HpMO(2}dC?z?%?%Ri!v#E ߸d`5uK1C ]F;+`լ%(Owv/٫ lѧQl#F_Z IDi$)QH_x"[G'b_ )2-9 ɒDqnSlJ3 3yt[k5CA(ء؅/h 8f*JG[ESlnWܷQB>;mT#58~4``}+5*u'5ڛ;81f]H mҫk[cWЇ7hfϤmΌ7hg,T>0*اiz(Ä%b܆{ho`mʸBsE]Hߤd=[DrvWbslc 7NP1R [7pǞV4TO БD¦L7>=сٟH#Vi|tK(rT [>eK*}z̽%4ζn`e6N%R #xoQJpR+od[jVjN?K>@nJoN$/soRbk?ԍ;r_Rz_$;~ƿ ]K?+43f6w4/.1#QPzU4!OhCxI%IvrU4v~tyi4Mu P ׾Vs% [8 I4NG>%{{ nvLBs֍|GA>[H*%@M@$n(ѪJazމ+|_Xw7fI%,v>IVPx@6Db6F-iI(FuN\ڭQ+3v ~/@O6em8AKq=f $2YM|Rw?9uš !ӛ\1ӊx(J*©zʼ<~E!'8xՇ~ˌEh=dxxIץ}(]Ұ9IxԹػ`֓ˊir{ {R(w`=0;/mQ"gd!geQ`J5sA$gi xFB]WɞΣf6>& Z_ȵ A&_5,Hu~vYIEh򴐾㋐AIuxI=}&aY\=!ČƳ >3Q-Dėqp׏-II;YqTAkLr i(]*0B@쑵ez^D׿YۿBY'my6M]cubq:fRLxZ b >8] `rktr*cr{R#C5lH6' Y弟 ʷeBgڏ_8lL"gƎCqSJ>$2DwW5uO5 a*th{.R80Ș.srJ -51 Hd*g6VP7/Fgvƌ+PX)$Aho!j4iv6=m2p.[A4٣r:d+ nY9 2 OGk"" y;mq] -%ƂKW{S;Ey *oV*# YO2 B̑vzq(煯7dzKkB{и3]F_sQ !tV$Y#aR-V"W{$+2r (uwŻClP&O9<*aS](;2Om b'=3uBIWV! k9Яef8j},nỲc߆_<T(QI$o*s8yg 1\FFYH;*臉GK\*I[*? #9j/Py8 /AzHѳ6e PKikd4>>f:+wiE(>Ml0P᣼Pr;+kc#Au}ƥFCh$49YUi{݇Y+$r}\z~,]1s\&aeyRw#2J`\ߊ(f!BT%TNŌO[&,:?/cwbB\PU`%+U͚Yfكsv T:2@ONY; _>Q$sdc>fY1!cwXG9S%1RnYTC,XJhqIt 6xd w@;5xIlZ91"BGТ_ڍfKI*UIP&qdP}ꦦM! ˘&b~ (k')jXߊsN9SYڜ&3C5Ck1LOā Vf궗<"%2A 7Dr{d}reTb*(]GIܚU- n7:&ȵؕQU ! hڻ_%&&0}\%b^%O^6%]Qi%zī[pAFKB?@!IO?}:' \k4 PIHBt;#-0=Q] !œF8Ә&7mV}E*\; E>tf.JdTMӔ4E^H_цP_RFW_A ƬWK -6g\U7UN;- QCh8_*Դo؉Y֛a 6 4HEx4FB\K3,{uoF_$rL@][mNЈA1*.TCvmڴ  +#׮ZhRߗ16`./Xu%;G!ְ ymt$5(&=E3E) 7N=i:dD͈XdF0}Q<0t#[Yx_nk>#ѫ4p1Duj@5ruAWɧ+RʡS}l%bX7b!Gc7`]Gt3' f/Guܗ&(`TB? h v XǤjwL9"tiYS ?@qd)#xmK BAY)b]SJsXa:^+91Eo;2ͭ spm+@/TBKm2H} GljTr@A7%Y_\O Y 7A| Y)6lҪ5^bke^}|<־=lPSd*L0}:wǐ&Z] V#Ov(j=P/$pchm̟vŹ.}7ƯznPpmQ "J.s+H*ΟHR/aE=CWmbnڧu(NzK!Lhr֪ͧB%+.{_4 Tٕa%_3V;Q!K)X3&` fg4YP^<ެ"ȣqȲ|lP7X|ظ2(]'p4+Ke+f}Y6H4Zn%!׿gJ$%R*~okNϤ#q$VvUZvH7W:i"&ߝp3ATPsjOXAgDg5n{ڇyk ODxn,J~!;U dMsĎ郢H@ jQLd]EqSḧ́H5PpEd +cRUYHgaz,5?Y#pMez{hΈA۬?@@ Nd?;C'j\gPG9:0!5[W'.^-ܑ/\ڨ JW,l::]zm;kGff%.bNG);T7wǍA& 6,Ec p3;PڏVu>џM4z(&RelP,1sFjqT*O5;[GRړ.@}:*w+ >H[dE~QرKXmڨ=8'Q0(駑Y[mVi_^āT9S;%gJJ{ߚ%]#hݨK?2r!*~&ww\96ws8=l&dOD1{F[yF7v֩+~R6dJ636$CFǦozHzX@kӞ#-P|l?*~l wZO?lR>XDASgm9?6E%bgO{RUty8M"ÐٴAkT_:h-sͩW/lE^M.-gdrZ}|n}5$&]0"r_ YUќ9hSVǚ_.:/jNA+m~4 [TzXIZّmܿMiyq XEWN3` M(p:3vl7jڦj@i\Ìey-6 =QlA<QF= ];|W"7e5ї'^E5\tT0 $!'Y);GqI=VfQk:Q7JlFu" ޽H#EHJ?YnXkKP% y0F8G'1> Qb(j2=SaJQ_ p/kR9skYDc`S8ς t8X=e;H~b!O(]d;1\1ra2Оѹ\b䂣!.5cw0m'-& FKtFq% HPPVkTh-1B{[W?zf"q9(Zuքo!P}5Wxi1@bW_!5b_ݲL K 烻>MRM`ثV{.*|#4* :rm7S" 91&C!HWW^'sREd'.WF@xʦ )a|%bؑKA )Lu:w+'_6ĤMrE@SNsd8DVeYQXKN0O̘Sf7y7WA2l;ufC~0ɛ+-jhJ&QnEip- >;]ُp$t lZ$BГ,Eb gDN1높 ^eN:ȄʧuoKPGFr9W~Gi<=^(lMA%-aj>s . W;6¹fh c:ͩ=*8( V&ܹp8C:*eإߖ T7֬L Χ^=yZf;i0辟i"v->wPti)SpK]y=TVyGc7Zy\>'8"%\yD( qt@ј?;<!_?9Uk;bX;綉gȵx,KebP+5݌[Qӊ.Fy0 '/@!U̕s.p)ۄDUՈ`+8&ƛb"T{oKx K7ϝq1:%P5&ۤpx*\Lw,Џ=P.,C?}'ZӪΤ ,(yJaKζT]OwZO,8ń||4,4X$]nX^n:!$fV] 6OY*Ѱ6|peLo,0b$$.pmFwHy~÷C@uVTTnks=x'8H#6OI4rUz+!\V@ !HࢦcE/sɭ [(PP==q$aV@iV`a%/NR+tΡF{B??{-Hl; & `9⼂yV-6i*X'KY+RQPT]j=tƳ( _9j{k ӻH2 "MV%%oY,-d(G =Q$"H] @/A/.&xNjZJr~ =QԑlϿ v8]+Lj?5_?s A9 LU cH#B%N_Oܤ2\VwM 0ymZF\ޒlL-/Kr@s9Pӝ~u.*<λlvU,o g[XiB:Q:}..=퀟( a)M;- !A-DGŵ쥇ɽ,#7Y&` fEL0$$1G4م]c9N& <5PuYs[bX;nl+MUȳT :n =F#l5 $,MgWD[teqFT%m"zd;XR\-+ [dy;\;X<̈ތiU ̥Z`;L4[ 2>Q- qpK6# $L%"a>=>с#[3_vqtj3:)| 'kˍѺSg I.Ei^SOoG1Y'0:/=ѯV|fd=3n%h&gۈ9䬕S 6q) İbLrVRZ~6Ŋ𕈁ve-`9$1œcEMB : PcE)up5a.}I03~vIfW4"E XQ?3 x~ RqSK#n3ݓZwTvq/c-mƮPcR, Yui r+BhD.3i̠^mȐ FȾȉ.W Fkߘ02l />Z_~3.S?hkG|Ժ7WѬiTz1)`LzX? /[^hш[Æ{f6^`}?C&KIתN6mԖO!p+w$0$jsC*}b_1v+ SJ#<epf"R:sMiZ/ LYͻ m_H0 c;Zm53wol@Ź{,nP%`kU@j"/TvfOzt%zMWu׺U9};F.'5q..U u+Rt ;l~6MÉ0F@Pr䦳'&H|Om6@E)jZ Ϋ M>xe 14@dT:^W%"te%"s,D'GŴTeA kPۜ@{~oQN4Jvj6D6F4;ſ"Y[C:MtTcJ@Fw @^{DlfY6 6KUibR \8ߞu1M+o}6x_zOvaI)8(x{!$mb vIM- +Bg{?bp%6&Y{~08 b~pn-ѩ @4dLN[/#%0WUm%^.ݚr}L{000㎡(bd/B]>0N% )w9}8!&_JS7? ZfZu RN^6 ̯Xzr+K =4r6Z޺ξV^#<;i]o=%nj')Z[ 2o=V`J,-Yٿp tkxR%ՊByK2 fxĉ`'oˆcr4\g7hocWjƲLN\ZА̋UFv@Y!T6G.V^:8ގr'r4gnD1(jiI|n |6{³m G9bmS;!R, s"#Q~VinlS@\LԲ֎] tE'|ʱ@k0UHg9_ᖃ"(Y`Uj]~6 V8[ྰh4R팩)ӰTu Tzݓn5ԋY "B36${@$ZBg2A13T^GzHk/K-EdK"™za5W<"Ӭy(<z@K1o G mV{Ұfk @n 6Vif 9+hLn $ۥzZ]O}[| lC&y^8JHN{Xjm >ICpr?aC4&NTq3n9CڢҌmZz BshڰhUkhkt0sMVOQn 8<#<ϓ.,^btL9|iB}_O\ 9Kd4(M'^g֊F9>m"i o氎^=EV2v.&V8$zlꊋ- -.@G#]-_S9|SoD|ۙڲt`X f-IrVlbSZ 7tt3ʪqGwē,V=lR?Ac2ҝp/3vo*7KC]ɡ~ ϧf|ô-Ѻ R=>{3=}t0"bu ozR3qf1%h֝iR`K@ooc 6EbgUrUJ$2۰pAHC7b>cGs<%"~d0< !2i^ šxʵ 5q`|ٝw-OrᮀB}1_!eD~ xVH~&x)@91&C"hH:g!*]]\Ldܪa2B oB-fYIZ;r& !$-fDQ9cV_}\7)Y rҊE&k L4-\z[i^a-QMJ"ư:^r+0=ܡY1JrdſN8rJU5m]+)h/%XƆ6c-J>LPQq 尽3*ʭ|'1CH1Q^yj]:qVHWc2im5>єhK92v K;@4n"3CRL^,B"pgktJco*~ڎ8_Cy.>]~ff'%<'rfC2Wp 2>nx\&["}'/Ĩ].MmbaynC0{tL=-:τ>⓻ f֒[it}{SW?>j@42'!mBQQ̶^y$7vNqz'I /~%#Z+JVW|p<=,2䷧qzf..x)&ɯAU.ˋ>yٓ?f": ;fv^WKRH0 %rM^ѽNC<1UlmkmQj 6PF{iA7($ՐAkSS"2-/Ǻ/|v!ν>}x^ts"$ۼ=!D_ٜh6ˌY3QR:(é/))(P|X1;9ҫ(0XNy|N;|qcfr%3@%f>xL顜`/ 5&[dMOۀi~%'qofrJ?X>2'}u@<*h@o#$PjNf AfuQR@ЂԌXږ³rܘJ+ƀ#+%lR\[o'i4eVv5&cv9\Nl5b?ķ|dme3v| 6&gSXP)$p?CʌT;Go9>X1)UƊij7-:]x^tR5$+ YzTD&:CyR)wh0)9P#N_5M Jʨ ÿbkQ0 9r?D"P?"JJQ d/DPg?B~ ¹ǛT Y*#kd>~\KL(n Zc} k=fIMm9g)(}|NG7N) UjCk;jr֤߀ZHEa\H޵'3.t<4 R.Ə4}B-Έ Kgճ )/a[2\H)ICL--&'@xDmA%+iL+ʠ}{txalRmA"I W'T3*,R%T:TB\7o(^&ϑ QIgZ4FO'M4KʱژM1X΢-OZ"dta|DG^:sJ-IK}%}'3y#K,2>e,߁0VNt 3e,>Վ{b9nB}-P^ތ./`\.+tg(\#-X$"ۏP&d'AJ8 6ID\xmxIQx~WTzQu!,rAAc>S~{<`*Ţ]T}ߖ7#IHTV1gn[aQ5Fs@+ĝ!>l/CYTu6'k0X5[μBtRvgmjo$Uxq[H|x/Y0?duZ=!ϧ%1DA#c +A2!YE:\FTJ2Abc]Q=fJc gjڂ:0xUkd.׻Qo TGݾnG%#Xb TF>}/]!bttLV?pq\2t Լ}"VlZW)vm3]%[aDW-S# 3kX }yRq|)bjM!k[87tR4 2B9 `vw.*GL󡧾j\!C3αڿc blxf^OM ֐a[ G2O5$fѐQEͩka/uf*~- [d+XĀw05 sÜNRZ&M$p4%LeciB:nz iXNlp:o?^1?1i_ wnQ%rR ]+`!yy-f n$02JYK`M Dʈ(7qIJ r: 'W_|؞zxK_\=3snUPDKE>JII1[L*;%EhdR i6F1$L n9ם 1v. \6tחzGڤ-0&no1Ō^}t]NA^j hz`mg\ ok?V(N̩5uYW/wPQKȷ|Xk E첦) iA3 jWY"Hly p̯Iy-D,ON,*x0w)'c: Pf:>ҵTЍ6l0 C @'An2ҢF$\1p0ZoXZ<7@c* .[#ZQ@YţC Ht+pZfIƦW =v\ WtH9YC٫ UDli2$SOοynHMNǥJiBDZ+wzTO:gZN; 9_`Yvq#*Ƈ^}u|WRj$͘L'(%o0V PI 'uJڱ$X4(9P=PSl3K2\|jk8<UH[Vbz>ṫ5}{0q=g xAw]b 7-BS,3ڜm6yGRc~kL0$)7딫!1 6nݗ7⾔PǔG/u `Sms\|jɟu3 -9=Eׁ.=K7P M=c)IlqĞ 6{i~BE1WCߑVnuֱJu*NcY{(n'VCB!=s7wbSb~sV?w+7'Z_>y+ a y6n:*Ov~Uy+~h w|ek)IG7T `|C}~S~pJPEX5*9Y3Vg4=Z?>HS՝qO!b"ANLoL~^%Y8:Pȥt|P@+ߡNPJ5C ӬLSps޹kfѨK638 3-3-( )h, kT|Czk,a5-I_ q7h CHN̯d.y1&i|~ft{1o NTlp͜ U'C9* :K7AI&S"@4-:YwB;&E Nnڲ|y=O6Zѵ?faoHF7QZfņG4zm xْQ~Y|}v¤WJ}(O,ri aOB}}+UyҡVD@s0WpD~2,o(4Js%?\ /tɵ4HnU(VXJX^YF?ǜ}d,FuZzى4;N~"nCz[0m3WB=誶vGai?ݼ't$7T(Ho % жJՆ>:$ֹtRқ%)oB lX(Re %n-\fԀ';#a`2N|zZ՞[۪Q/#6?q{cV򏌼M_"?`C6\C!+0BH,US!JuaG]$GV7$ ([o:w ÝA3R7"RI :v 9:Ͻk[ O ()w |X"6Kchlcy9ȃd=*Yn)ͨzQY# GPO;R6رh? s@-(xN#_I] >?%Zq ޷R>T|(<(n_  _f7}kcsBufk<^*r_Q 0[JrqRFSE$~c좓. n"/47v)HΤz Y ! x+Y1;dUv\{MNʙ1HRnPP-g8y&a2)hΡ!9q!k[TS8;b>)sli:1OCwl6(>֦,rmz o2z:|T3DªGUN8v񆃰x!Ctk,򪗖?KцX{[nt֩6t,,]~?yF虿!&r0 SXgO?8σ+|On)tԩa(U+xkR!Fyy|Is2(=LNٙi)'P '.@6KQ\ox}!-/@J@lFa00IK ?,z! b{GObO,陸U9{(?QSbw2-k|;jl?HJyk[ U*96iN@ .{8GF=rֺ&5 #'0. 40bʴ2eav0)ATL!0rE7g9:i;pOFS[t(wWX~-_:bZv}#Nmݹa]򯥎Gݽyb{o- zu"z0; ՎXP4$k$^Vi f"MKA7bo13Lfcֿ[뮰#(,gKlwqق;у,gA(-ݔ tYe-e; ߏ2;P^`t.r$5a7z<IH"(7թyI-^8`8_ fS0j_"g.]!=Bnak^R/ Df+-aQ 3V/X1o'vH#ݵ qupCx5edQX0͊SIXpd"f}P4桐5 d\͂,(:Z[45ÀV$ғȖH:$ZVpFxCZWu]-?5n5{!x$X- YU4l\ p!03[us]<w1PBLHꂽu<Du&58xfϩWV^dH6[`Y,>qv|J:mcXbNZx-͓/YM p& Y}e2 c#^㽩RX_\q!#K 2@?;Sz8dA5e29foU14֓+Rj1Y3w\[Fa  FGkUuyڵ= 432cub# )dI.Z~:`/ `ʃvzt\'u_uiͭ/H!BeH71ǜ˾}[ х*+w.Nm.q<<п{2C%WvrNmr+dn?@͑xg ;pf#>oDY\YLj;zӤk=O${ŷ-Q#0*v35t,۪'\$/ҹɈOB"'!#ݸȹ9Msc#q(܇S^i)Jsc( KJrd67A>K1}m+vy6)..׵-MZrЋ49,54zak4϶7E ~2 @,7q-tEz,3>Yn}ڸm#& c\5`Ma9,4CИt(2)sYWB5J3nqE"i,KS҃jYa;ܶ8EяU%AXiQ8E T:cJUaR H7rM_>S]OV` ,^z2me蠀-~}ޅy S"\bD#t/dж&ё[WfqvyGz_q}^;T5dLzcm[-^G8ήYm"HΕ g0;_jPY!muK9-h !Шt$ &=5^홒DNTz$>k*䱹﷜֝bq-W-Iv9PF1d)N#âqT0H8q󑡚헠'== + Wu,TI Chݡ gnen=C >}ϟUOtZa\Bn \x'2emd)ꌜO~3s'\@۽\'%Uސ&7{xoH\ Ϡ2 "%Ą ,T78 jL6HʁTa2|$0h LǩO6/.I,7rzgV՜)_ mr,,2piS1# RH͚]Nh)v:(Z$TwzrzkcZ2]eq!E~ G% vs;VYA2 ޲NuqJmhxDηa Ωaz3~qSsњleLE(2UݫgN;k e`y2dD(ٖ}vE\f=[YnU KF%MO=,suqTt%M[,xrb1Y=k`%@4]yZ2lPHac5*Z~ QdHg_AK(0ol`dIф{W=Ѥ P^<2$QU)d3Jl}ub"gW}#l "(zLf2pA?ly,V7Yt$2{nW2r:jT+q"L C8C:F3q_DVQ\׌ۊ/QCvr"F@Bd ݊sQ.rhuWw1UU5|-N0i䗊hOI}=#b((;ɡ[ݐ4X7t௒1Xs#]%wHNP$SG@h ?5lPb {YUϤ)YZ,)R.0o`_10Ƭ,fŎa(WkƫZ>r%@VJ*L[P2tz_E.Sq_-d]SnC^:#Ԅ 0{Cή ^Uf Y (Ĵk`;e=KG:4u4-7f6jOA!H>gGF_7kvXÈ{EzUPn7Tt%؝KE8PX;̟v:~JBa[[bso~n=* ^nW ?  017 衩T~V HX'C[vd:Grg_Q?2aeVd=g:C#4e`Ng!uC*džh^!Go:TK=>/?{w|*3l/%X TF^6?`p@37lm0صA ^@ Os> wJa|3TRQ@\wLn$@Pm9>x@6ьQj̈^~ubFzRybq݂XQ5a+`(zLj;{_}qaԋei3ؘt L;v&-S\d z1lkBjt@Ro5{8R`Ug ٮK̟B$U(W< '̥b 'u,td, o7 gZeZ[;`NJLE$Oh[SpŐhLtܥqȿ<_`wl_RAfV.9:z3p3gTn_o`t9F+v6"w[헅y0w&B^m* Pq0# ]\9qQnSNpד:̔8ҡƖhG W" k_W'[W ݥYQc}Uh !OI\=B0 ͢kE}ּݝ g#aZb%5pPWk ďPa[S&]ba={*ŵGQg$7doݛI|z'X۫ xͰG7*g-aε#:d0TV Q1^>y--g毹Wޗ0'phfXx.%֮( ",C'wjGA;dB_2|vLpH6:<_>m5#`ۤ'֞3MI4>"Mfi$q|v%+0Ԑ\9^>ߎx^\i=Ebߤr0gќ[r í/Uח~Q`WyK=seWɉUI?"~ow;}~}8nIsIB7~VO²=Щy"I\$> rl1'DݳϾh1Rݡ%EHMCoZFXÛ~ʟͽ )C|U!lh%KLz 2GДX,%'<]`ߝ 9,raВQ[<^jIT^B.]JY7$ret- ~D'9hHW:-텥 ;wD>"b,8 -Pt4Bl,69ш)2w.*-].뺥zc9JELbjͤPX @2O_Q˝,Y3I K;J6[*'_ ʯ5s;q;>q?xn(ZN#•KbK_b֍]bG zFGLj-H| uOFu2lp@Pqg R6к9Kbo!9j >u~Pd})6Ԉq)O\,q!Ԣ?PQ6 ŠLdB-9KWb2YX@_%H0:(,aRzP5ӆ1TMHC=y`9klJ7Atdx m K~t.Epm_"Qi|>!T[3:4#TZ[o"K 'khYx,PF̳vuȊ2MmcŞS-B Ɗm,Jl`IlmO7a#n49'!k6EuK"(TLzCxTmn GJu?`3BeipgR^k-6vylA:Y+ԘW&WEmq_Y7s)iƎ%^z`yC86:K4ahUVxΆbAOD4OAtũ@Om `JKTuչ|@-_$%)M+ݨPtM?&"yBLng\"t~SLҋQ!mIkU#`V)1+ h}Vw@#"6$R>)P:e̝jnkY~SLYV=)n$t=RB5WaZ̟1`,=3Nq9tZ8ؕF: iVw:/>y>qBgBQ(TK8J bsdj=]}ލ!ggz]@ ކBT*=WK%M$UxZF_ϷK ] +9't y%qԔYv@ѳj{vKo$q_q0fQ z&20Y^9/V&P'J P}Gu_d,csN1WF/Nd6=QЂkDE!4[-3"dʻy+H!;K r"7LOFhn2:{#q.rDXH"U– wRӔ4+ ^a_ /%@p5Ntjȷ){%y^TqN~ofT<( *夯n5ڔr Yɜyh"Auayꄫa>X"7V8Q};!P@߽OZ:❉:А% /JaJV Rj삮bb]żBD Z}̻\H@TvL|P<9DT9u'?D 3湠RwHS~ɏg mvfzе)v<\}>_/I0y()#C R)wN`xjBs7pb̧N'I,w6h~RM .xcR< T73)KgVѰ,i|eӭ*˽)UmC*-~%Wh~Ae(F62X%#`''t!X ~ow @kvo[C"lE@,| `4qr - "W :8uk+ mУ" lA' *ဓ5iK[dP/YMwvm7G~)"=eՏx~O횬L"WK xM8! ~zH %0imǞZ]&_(܁ɵv8Oϡ FN_IDfݛx!c{O'M08Gx.|Ჹ7 3|@dJM:/38r=a T1K&y30c2?U(OҼͲE7G|pVs$IC21qr[1 pQ;oOm]|OXR~G*qףY?v9Ph&#[5ke[f6`.h W%^XNˠ!@3*qbY2_\ Uh@EJ$&DK 7-1އZϡj2VpiU5-{;/l+s`Tua q*.@]<-{s?,j/:C cWfIyZ3%)^bCZreq@><-MD~V3!s6;s 1'vt%Л U#4eJDӄsQZpK-%djHqAS"3 (ݓ?)o`` m1('ONz D"a?,e_p`ã7]<*Ϡ/im6ղD$X#x/Hn`1G /R+L>s}AdbƆ@P^I!x:B6_ 5 :ї.idI"bՒ)irTXA֕uOQPU^%;?#| s%$':NzWӿ 7&)P:W4H}E}"a:C!67enjE]_}K?OJ_p lj!cJ;yz͎ DIxw*1 !!s%H||+7=Vnf".BUX,<0UF&+^^Ah@D ds'SleOO '0az^WsmΙc-7jXm0_q4]|6:w/0v,i] nJ̨N;ŧMWG1{OE>&w1+:pNoݔ쪎n:dj2Ր/Կ]5a޵ۋFSߘ{:O!PTDANF By@YN T eМOdy q/z*/YmP@`\܂tk,N$.\^*,`Hgɑ9,zB%l{;q$5 T*uUW7\'BY$n2n~}u D&YDj$`Qfy`( kTA{d-8w( HY̸N+7RI4)f(KН*MՂm틘 Z<^KnL!s|c16s )ítY"-DJBA=Q|܅cJ()6p^,!oSY.CPtx$uyaA KCs@B Dd!*᳽a.G0FNRRoC;T7ym֒͋y&v(:3&/-갧u^)Vgtaƀ'ׁܴQ~$Ϻ_}wy& ;`/ 1YN*!oW;`&gMyޔ+l)ZQ"ȼ!tWtOBaS@ [x)4*O3~q %ð?<[OimB(+Gͧacdԋ'(k{_xzMIe>8U6k>s-_b>^]ӹ&-_|lJOREFD u|U=݂vlngj;DIT|ЮƏx# -zW<'q dJO(Y HO1mUu-lM먠qE\h7`w*/[CT K/` ;@!}a@* /ʭ8nQ'OMR`$4!d_\YZ xߊju͹=KG옍@"< Yљe#\J}_y`/#F[A#~F)e[>}@dbM[U{Bt "A&zHo-)hPq9PMP*Oo[^Rrf4!ogᜍ}] 9V$:y^& lK{"ѼA6O \5(#V_J6+!⩽xad*ltDU [pOh顐6IG^+6˧p{[Xg=qKK݇;֥,8^ԺHOu1hQk(%CiV0v7ObP$^˜Hm5 R׃H "5DȰZߓK.wTĕpܨ}3]Yzm$`Xsu⠸Ű"ϋf 91 0RU-.anvw Iv~vkx*G #M>CKiix_׻U5̲m¯t9Z}jH }p;%k٨spYCg |Քw`DӢ1#o56,!̝"]Y0OZj㳆 ߍ/mW!`vh`[nqn3dzDgЙk'hzX3;x YjsQ:iR|"*@e䬔ݽ ̾yy?G :Hx]waMmĿ%"`Qb`"Ӹ>E{YWk\97ʎȨeC>%עPOXW4uWGMQ/r!'! =3=b%NYZiV ` Z>q􁰛M `qs/qߤWW^Qe7 2=Jc e֩Y<&&bf ?DqTth97B?VKqյ(*2bO͈RG%dqXq6(:-&+Xfgȁ kx+]>ozD[ 5B(I.qSeB]TZD7 31Ⱥ=`tۢrLf(OY",$gg['9IKi[Kw\?T{ݏi^_ N 56㾒 X}RGU (B/-ZA}$0r^>ܟ 6Ô( o{g.Bx%`<^wc^ְ4:[FNNȍł":UjiBM٪C_(@߮0‚\yJv3per5n'hJ}bqmYsDD )֞U\js{G^@u~nvXUݯfӹNfӳ 3ުЭCGO 'n*R}Ir3k/| y>IJdݠ:q_ I6rh=l:j b8:օnaxp-@@?1- +jvsnj>vSb[ vۿS~ԝMmUbhZf_Ȩ}]o2n+hQk 99c \"wp]άU@_ [괯жa9B҅N3̙e\FNc.!+SyJRϾTb,nK7L*[c*a($Ok1,bY9^J1?u0&;^ζXX#(R6(=5ᬇ 9a|YLpքOch]\ū@ʛ̠oDZEL.7SB+#N;Fjb5 ް Ҩۖn]a(G1af=2p1lbXG _WWe\mvTሺb߷p>֏$v/}猧l R&w}jb$1g> 9Wi.>K o)Lvx#G:_<>W)lNtm\MsH| ,>bкU8 mgZweNɭz ܙlnmƽ_XE <>R'qcq1vw 9-!v'FY)Z]jCfbe`DB+jq9za [1h_Z! ~eo$;Lr܇ dA,R[t<1GhjLHgi"tTJm+"u4G07,À[uZ gl 5 , ~u+*6S] cBf\;Y[Uu+8S%PnJ fIQj}(ʫfd <*f YPv(~1BG0Mx5 pǐԜ$ %hc7 z*cDwȌ64FbYw5eIE(_W8=$b#s&܌3 /SJ;[nPu h(e.V_Ri\Im7ث&_ͷ>ܧ#|'IwAbⶐ]Y} {rfGsOJG;cvEg(6VyF]bupx(Z1i}X% Z8}iT;Jp$IYٜ$Knx r+JUaJ. F  $x;+"K@"cΕ$Ƽ-AjFulS.k`G4X:Щ2pb6@x\B2/PH${{C˻Hݠ~f(u[}/h`q1O%?Vyj :݃(Rbm+>DlE _]ڎ_a 'TgItVgP[#(J\ 2gwY  9,z 8)?k"8*RJ/Zڽ 5T hFSܬԔ/`kI_úwzx^wa¿6/ۄB(e9δn p0n^BwS1ho#kĜ蜓>bO/{ #rI(0H`IՂ a+ `ubCj_ IXtR.a1k4 A,`,jB{Pa Pl.iDq;AuPeo|Y-\Xsv2)=U3zǾ;PpoUxΪw?:tAq26m91&E#"_fJ>UT:qȼ aR`p\"NKŕir |=Brͣp^χ Ddcm+3-٧3 NlZ/H+:Y0BN6cޱxb@mD ?'g&jbHb*)Vn+vm"5(+IU}-mO"3s9=9|U~']E4ln&;.dY|k{Yl+J/$bd-ѡ;B^Gz;A.I&SO2iRuc&v93M˫.b&$"$S_Ql+?#҉½%H|ȵ8sRrOGLZ'O+ TXVMxNsݏГtYނbpHp;HRxP` f+UB֭F&ϒ=̍ljlکe?̥I)cfc#T7(ϨwI(I31848،'#;'9"Yc9%q(8ru=JF5sԓipzt홼/(LݼY{}C ? 4[uͅs3#8 K=[JNy Y7OJʟYʫDleGqO&<"@Sf%aw-h9rT(Gf IxD]+}P3 IBJ:IJM7{`v0yx,"HLJȮXJ䖢< _(YaPs^M*5J!+51$߈cq˥_yKUL~z7ogF1݁dPAiDy _/{yڡw&wUD)f0?!8a*yp$`ݺ=>Ce&^6q K3޶]Pd?M~ r参{JճCdO#ଦ0+B 偖(d7>=)9kXD6_?j]I6Ϊ%Y-R[ >av7b6-$ɯmc|R #.9Uo) @L8d/Hdc"xO%Bz⻹32^VVQ5Vg Xړ7Yfa!WIp#vn!"9$ M]!+zIG lʝAo9FVN zXoTӰEat Y9Am̀(**bׇ/h8QDe. J;9Փ`$ٝa}aw٤$p l)@uzqwb@{b;?jhdʴ."5(J\=}晾v׍=bSG s5u2'1epf |jbux?<,'؛ݶ(KqHۘF zmoݩ)Q|,X"yGs~n:ސa yW1ꛤk;NlfUwKbPv C3džof;n< ,?G6-]-q6J?D|\"}MR;z'S 5>ҜL#JdפcA~z7 ]fnO'ާL#%;ƴbV`>+zx_ B6+ylpI]](˹@tn3K?ԨA.ʏW"L$ݿq =L5"d.ǖUZ?OYYI-8g:#t ǽ3˥LbF3RlXHސ'(s`@3'4@G=`>K'ڄe~e^_JzPyh ??Q㏷! {"rjk7a9+V]VnR7kuΙgR ro'Yg9-x I"QO{D7/&J@uS8)ꉫMvtgrYѮF9ՈfnRmWVGi݅% ӸB- ZaI43QOf)żF0kF*7\uDVGUO 1rۖAt3H\`byچZYQRα^B``YKŋV34/A*n}2Jonp"]7^tTSE8Ԟ=Ͱ"aNcvsZ-H罗+MJcYZ=v杪Y`2g1(AE슁-\ށvtx4c~k.UEld_6k4 XZ?^t4EXfvT{! i@(?~E/0⛮o&%W̰72!!S'd?ڲI:f[tOG&3C9MU_PvބN_ Y1sХA f䨱Ҧ~3+L'gizWIB2YF:-Zm&@oXX C;mM! oӃs-ag;֟J#~%DBpKtRE88  @ֱeq[{/nFQRT1T N除w@E$M{2CR~Ȇ5ua:mU94{CZ}YHX ZߚeHX. *0O.)G@R+c커*/90ku{R~Y{=csZ'7o#QYU- YlM8pM$J~c˒B+ ͳSZ@)B /lԊXcM4,o@mTg} fnDڦra?d{B nT!w$%gzF5`5*yU-{#tJ˗n ee{m-GU`G|PmHz(yx+]]}'\hR3ŤϚ9agpyVh9[qR[W o Q׼F="_+fuIwË5,-fSoa- ai+ap? WDzo?h~;6f my\_snLƇt a&!yI]u@8)%XՈ|Ҹn@1_D6IO-^oh5=qOuV ح9^$!̙r{rIM]oO15()GxCZ{M:']K%U8VKQ*|e⁖P޲/Ŭh9NTo[.h2m c68EX!\J޹Eî6u@wH;ai%45iuXs0ܦMu{]鵺ol@ܴOD?)hڿ-0> 8n +7,a8ܖɑX~#Mҹ}]iOQhGDHaZ@Y;b%Zϥ YT>[&^nʡVX,mEGgN8p/}ֿ煈ErsCjlB(ܨd?GT}5WBZY02obPW/KD\TMA>(/ui6_A\n^粮rEozJ4qp/1VYXf/2+pd)2Gk<Zr=I Y8SrAp5_nDB[ dTzG]sn*(lzH:G C]:rKّ=}_DPq|a#hLO Tb#R-9%%|@: %E=+-"r_ZS^};w-aIfK08*keU1lL!߈{u wr(ULMrzB"mNb o,Q3꿊1L2d k"ك'sv^^9b~W8XVk<OhZ!CFQuZqމFߏ hOFUZQt)ùᬵJ`/}.@]v74@6xkdTaɲ[kb6~!>M :QhgM׉q`/Ije 0Dk 2$U:%Jq[}0VCFFOC)k71\LX.t}Z58x{B=uA,@}NQ͗C~w\t*wu;v[Fцw&P~dv*Vb`ti딎G(a)NB_V3Ժ ?ʔ= G.-]"ydB׶T%o&[wlkɴ'qjJ$Yuk̲bk5V=zp_M:*l~w27C!cX_r@CܒJ70ę z"CPq&qDF0XzrR/dMeRizK̙: N2 e6 :P?yM#xZR%,&+) wC|[ed6kܠgIz?6ǒ+GB4dhvƥqMX.U=,R(fkO`OFQҔ91&FDP7t׷xJ#G+s8بNEP,2ABm\oiM˔u3F\\2Ңz>+!v B*T*TܷtLejP&bCe.Fe=24TL(VhFqCR$[=@hk%fN moMlqv]#-dn!޻ʕԒ[1íb`~Ei8` <ÝնǁuPY~zΞ,azGyxApKC|,=4BW{Ix.rmO*<F*膃>x:#EAt$NPP:E,ַ:,6rO/eZXN7M3N>]8Y'')ϒOlFҐp 7Г2.UwUbbtç)űwm]w^ ]nHrڅeYs~-0!I<$M>K* ՘fd٨P~e e~AkI5kEa]sbQD]qt Y*+>,jqsPȤnbBir|'u8NK2^IM4,n<@uҒV&d42ox>PSLͦf^h0Js+#4НKڅr1u|]suKmmRpLM_ O VxF1è+v9kS)t\KLia)7G7tV\-*fk.HKZ;/ w=]xuIjaHsL(*E\|{y\zy5gIzG/P~ Ŝ HŝLÐ&^HUJHݣ]^[Ypz  $%͒ bw7gZ}CAV~Ӏ+LFma"3ru\ :Jp]AyUd2ףNPex8Sv-BOa1+X*C&Tm4cQzz(H^ų3/y3律_BtAϨemtqY3kl;.NT B XG^߀DWkl]pw|ès^qxɴ_~R,̓.Ctf']=֟ WMkTv2{Nx1qb&sѳw]PYy AU*o6y*+I%-f (SK^ͯlsl=p/$88E=N 5:⯆w rswu_̓:l ~VP|W|-4/C.K.c4< L;~N`GMWliZm/p|&,R5E\$&й=ǝ68QH\rׅl68 a 0xukp\8ܲxTvſ>:ajK!c^꾈u^upȹsDiY}p_X A.oYQ_72L[xS :gfm@~ɖg(O 7\Q A;e]%,G+7DV,ӎ/vfFkQ,KܔA^G.~gv嶷1+$aJϴ)3j}iؼ"C$mF'WGΓ1 `-weKݹN 5\;ԊC+.O-з47pW`uWYɏ'u7Ƞa|8Li;cd|I#{);R"GyHdS"\4AFm\?VKzHJOg Gz ؃}L: VLODgu,XVa4e_CCEUԧ>bAW#aRg9H>Lh_b9n JmiٷSmf n/73AC6]D;R86 ĬrWGR0 DPh0؛OԖiIMP-J c2%ﵟ6+d=W)7`6$&T%NZv\k~mt ||PJQ҂9"C^"7#3L k|P5= q̉,ǧ1kҗ!BbT N $uREiC3$8~B|cV2wg!TGҐln^}%S s3[gZM6o*8Lo/' p%6+;a=c:or XŜ VQ-,TdyLga%Y,U;+Fya^ K-m-+}+.4OCt)z@eLO/=YrA)l44r~MPjyeEkqk| 3vT{Y`Idu8xtvo6 Jgl|NU;n"<7wu^b2P <`) ^&+іe=ܺ/'؟ڝIa t$ 27_1{ nĊO%Ֆb)6tPBwzJ'wgؤV;kFhBTCW)#COXX)7ZlGJEx)2!`6[n%͋) %J(Š1*S֞je׳eQ`8)aZLlxQ AU\vwo6iRdHP 'lo6K6/QK’у4om`nHH0gρGD()JT9*ZKuP`Y)PQ &u2z1~ lc&lX$q1KHvt\pFA~Paܔ^oMCޯPfԪZ$p&@*| w LQ4*y5%O׼ӵxϔ+e>IU\̙"S*%WB=^W唤oK߿G{=?4u pQ rtܮBrO폃 5\`EK~nw/,~Vr&,1WB1(\`L+, 2|HήvAf2ꂐ$A bϲ !dQJ-9)C{}y1 i`3-}KzOsX2vCO=<oy]ݾi7iĽh5uX]@D/ynlx.`)Z,i IFLfUvvh Vr W>g.Prp֕2I:^ݵHϷۧÆ@ŢV.]@Do?IDur'E]b?lR|v988؁ܽ:?ڠ ɾZ}-+2,. ub'lDB/&Òz *–נlCIX#Xm!;|ʏFf5jyܹzQB7܉@@3أ1YIlSfuȂ+d 'Ofvsn:wu@zQ'rhM9 R̫35/"Faō-sM95Aς/*lmV TS?Vv(AhEߞ 揔h6VBi &vP)&{}q]N =N}9L0bo?pWC?\2!塍K0Ej]xKπ;69p<yp1y7};:B2Bi`4-5F$`X3J㺄_c[ d?A}9xp lOßLzkC:5Ah'r|: Ie;ZY |dmsҊs^YIHOAc__p"xXlws9ą@0#&:gZT.3ӶIY<^|ʌ~P卌{f<@~J~9p(;+q+xeZ!aF"ȨIeM( U!h3Z4@~>Ì&yxՒ Ruw72)4!akYՀ50&NQ2QQ/ni 0&( jNO L)I,(vvLjxtJ'>cQ qdǺYKJlDZWn\$G360XB:0Ɠ5ާR9kmPT]Dtq2d3 rGok*rB)\v hk(CvkUXnmw|:Oglyjj^`jo+uM-;ZBXzqQ =܁rڪBc&?L[!o -nJK:Z gN2zjW0iecBb[A&<o@̃2%n|DFKTmCECL_/FC$ppO34rbVOTZĦ:CH+Yte"a I'%q!c þ[c{7Bcfa,-Eˆy#'Jld7r6G"B{<%2\ UI}^Kf 5PK;U2Gy/yN({!RXE7aU&6疁mYPQݨQ.2(S CrUi^ԢXo1Yg$QYQ?}{K+ބ t3z4tZ\MjUCu@9LSlMdGx[tlz@VpprE!#*P7YxlC=CKG@32=ǀЕo |teXz2K>>ƅ.m5Jk!sTK0j {47'PGcB½qフWX[vP\b^;?1[ӤƜO6aN;g}# -wcXK0Ii#B%mxp}m'}7X_(ޘ( 6.d#Aj0LDKǯnY)]dU?6PuOdrF.EX/܇Mx  %HW{R`^2pzµjIF_AZb{A ,g:ƈAGh=0R-/['5xJ&\8uM,Kxb!"9mH FUMm% U-ULI_Vq9цT?,*3KRI/l(K ]+ZH k%Iߖ㉥E u-yfd)',gMa~ƈbN)=Tl¼sOUlŸzqF $ݜ2|-BR {2`'Fu:&! ,7;H0Bė!#DЉAI)AKC|Xt{Q hjIAއQ=tYϝpmP`䊐I" kedL-Vlpd{s%Sn1yY(pEuiy7r,jGYH.A iw+)so`]\MJѥnkWi4qK3&ԬC$q4ORk@GN-a dxO/w? m.2H.G e;EIDӿzxx@ OBO-/C᱊X~!rìJfQ6Z[" vlkRP?rkGxb+jݼ0%7T2(0Y ep9)_UpZBC PRk>'*h_Io/>|xW4koy0T i >XǷimYʦ6F7oiC$,B n'1<\6謹Li'//i6RVC!\G(/@ 43K!x<|29I:c{#i:+ͥ*̉JFn #nr &٭}"noF'9%;EudʡZ7$Η6, +^\7z~F%S4N0&oF9P\jȋaG}P`cek./E2".)F#eVVaȡ8ӜRt!҃x_q [w'݈2GކO|#潶Li bs,Oug(?^I>x{;\ EMsjM:0% >CX?uͧO=M\[өqK%'\nCD5Qֱ= :Y*n ӷϬkxF[譍.v-yERNqd~LT(Nh^y2Õ%i,r]x: k7pIaF ̘x\7bulTg*N`+p@@T_3H}T~^Yl~y"s ޺] O tT=!dld*h)%8` We-E8.N~@ pMK xm"r/JKjǏH\Ⱦ`)x{@w޹<{D8INmTf"#BΦ#ar>> E4ݠ1#^Sd$6ӬSƞf2Yf r%KfJasʼ̆uD4ߥ o 0)Z!hsy:J|5B/ιZAqĺTFMU6c˯bٮz}B9G>k/-OnL3S Cɬ+& Tϙ Vԓ@I2 = ٝHw!*"UP}16n{2XlZ)=07w0=>6PpϏLlaؘ .0fOE@f.ުS:W9OşI#6ߤAK i [l*PyADE'û%|6.B^?(gupv eMý(tK|hݽyX U }{e ǁ /QzRj`#[br0#W͈iIߘVϿm?_Udw0{ocaW%txFSPz4C~m^[ROZrTt\ >M V)[q\Hfvno2&/f^g֬JeU$J`ż13BqzɁP =bN0OiVWk7bVE w SlUc6$TWӧ<{wcDG^ V+A0۔8A+YQ=OhSM㬖$1Ą6QGSfcL٬f5lV]JI׌6MM#, 6$n?0m+bFGDU3<|]M@tt^YZcy5KYsZ\rlkO0ȣGtIԒ@bueuw36w"Hx'mAӢm~+=h(3ZŴǹ82J$,BsM_b({'=+ҭwA@9PL_[3U]mrsjio/Ȣe&@Lq&X TkR|*bd0hj,FĝoҬ*T c*+54wPGZ0C4Ҫ`kc5{/ ̷׮IևE2l (s#E]V] FfyS6ey#$q2~RVsLoZ5ͅeGzvJV$vp3jt赈VFItZSyc>`̅(/LXb/O)ˉqA%D/y+3ed~c3%$ef 0FPJٔYJg{;ŏq:K.h`Fpl4֭LD|!XO-Gp!vR"y)[>XpRw@pgNcl__EgoBuI0 ͷYEFkiNZҷ!pB^'_vgoeTr뻨]o}UT | Oz"{6>#'YZy$齃hA101I0ak@  @vYi+$f_9] \zL#sqoҳMr[ttrLNY2fH6v7 "]`TxرBgi?5IZ9Ӣ5IOT>=LdiciXxNvD6VQ"GR70j(Śdbdq_D QZ"Cd|}u[yg p)GkxR&#<. zK qI?#erW5{౅3؇-[tjDwn2˹0d-ҡw=>ܶ$g#ڮEUEF; bޣto+ 1EJSS-Қ8-֑e=QyEFU:{yJ3՞a) ~wT_2`] ~k9G|+[̈́m/Uf®w|U&fȲD@-O'mrCfOqn墝Gj}jE'oj105 _~ǧi-#rsD:n*m.S ̹x>:=D ؅z[:_pEwD9 N*" V z8H&B=LR+E}{ZfuU4m;rMa!FyD8#t: ] 5NRo\C _Ȫ*$,p2qOO} $-i,mʒܗ7i1K:Uc9Eg; V/ČQ5a+ gA?M4_8s:9Z"fPP6oBsSSSY4kU|JiCt$HG3Z)!ݫJkd+ufHڀ#w Π+#} vJ9|9~.oMp}dR } 6S@PJ_oGhA$(um3XqGlo+wF'.j{nHj)ZHs6loLq&a3ZU2Ut EQI&-!B߼Chf:zZ`ɘBМ<-Zi^8amRA7@l?{ /sK, bPUDzƣTNF L^&(\i8lu_7X@*K6y$hyUmmu>$_ԑ!|=Lů<+ B:~-D=Y$v'}jפ`e=6Üt+]尣xD(q՚IPMVs rG}[<ԇЮRC+8۪#I+*(4R(ɚ<)TeOQZr4ډNMo^Z"^pn e,'fD c$~T}|b1#]_ӑ/[w}"֥D]ӨbuCh8MkG # 3N0B9c )(p$WMeT 4vFrItdyJ sB<7) li6!Q8$Ahj؝$y`z]w蠿dcN%".ճm8!7j\ls=oMdyJS xcQ&J[vGc&2.ƶ3.i]86tߋѝUov7J$Iq=tyTpRozFg,JͿ÷LDCO +╔+:8Lf$4yzx!ӁN5 ճ O)u;xybSX"#nZ}YZ#(e*k:G.8&Y^"1xk՞7g+ڲĒ~'l|M=m9U;ʘY|7^Rc71,ZGGi %w7EUA_H~E^bqLM%/ ZqWvt;rHiI R3lZsOx I@VX"G .,<bӗݮ0/֠[i_$ⴖ5$/cht +}(}<}$FX5}31݄F'Rb]\\{k;}׍&z-- gVL3Y5= Yj#eHO#_(#г~&f6x{Zb]IϹrgl* ;b)wɢKʾtkZo)#з~ (^Pʊ,XEEÁ+䖚?FJ\YE4fY/^Gno4q' / ۉAQ2DtUG( UeJ |y8#68I%VQ@Y"]=Q e" 뢆O5 tBY2s.*{,[V_ɢEK4GW޵qgTՊ]s1am=!N# Q&c}3*H?Ttł;=;A"$΋qlިzl:0)!WpfBK^Qڜ(|mGhvo3kzYBswH+;z}Gh%ޢ-"JUԷž?4Y{b^E%Ø{т[eq2mþўYq\BpPczy׻A+9-Av*8%|Jvȑ{~l5 rٌ<.4ɦ؋^kׅ$uX4ްK[sŶB˧EBPz0mNR9jh iiZ9X!85cctmaVY1ӊaW"t.O8L P'’Bd$iuhU$`HP@YlT:>~}֩<1?LC:TIsRϕ{($#yT9јvg)*o  }~F-" Y_JtLjdFw` ~L&}%6b~ۿ-|U 1Wqɐ^GӄNQPh|/_`O-4E!&=NWX_ #NPzdD\n:yn`WA/i. dIR W{f^86V!.{9 )FO(jbolY,Ӂ%#YAhYneniiDk#]Prr|i{:+:uQIWݤ7ɘ{8~͘O]} F[́7yww99S_ɏ2n}5@T즠}0o"=n XSou)+i.󺀌*+\2sC޴kz1v1 _T>B B-:U "XG|-El:CJ-6Mw:9?tA-&n`:H4'ܽ{TiYkV5Ɓ ɷR CGV;wx0sd)@V3Z݃+$6|Ŕ ߟTqyKɘs#qd/8_!06B G(V+3.+\#<;CUӆ+x?5({EG9~4?>Y|e/-/ڊOh'vokzyhwzLPCLna'k<Y=Sbgu:aMAKP@tw|\? ͭ6&jݳʚa$CMi)5G{ټ4Z b#`y^ g1A_ /@̮-SuA(SrЂ`{hҹAǬf/WŴnӶce(^q)%m O'3Am$وٳ@`JZu:σw0D{_'T!ثo|aR)"8\0`ַ@k?1j h"'wvUJה@)C7g,vP%8+ G7b<@x٢reF ԧ,< TFw[ nM@cf6L5BN :2@˟USYCDArzښᔟiq2ykk{rth kV"qqF3rlo-y&x`gIٳC21 zH6 ?s$&| mV %,^E*R<\^S\9€]M=R G,EB@Yeȍ CJ`<+@`tF,u%K* eQ7rEc Rٿ1qZ5$fMgk6RӅ6'[ ʪ^V^ j*>0#6"i.V5/T~Y_"QyD ƕrDCS#|Lu}ԧm;DiXTCuʟ=>M1.L:)ohQ&.e_2B7ѥUt8vP_$ٺ-+BCG~oL޳ iR1+uU>rmb׳ lNOÐVٙOCl]ge_l#i蘗y>Պr9&Ct+z[IbR09xwK88c9*Pʤ.Ij [5dw8R6KҴ&cJ9fp kIh_=Łͳ!&к^O]ۺ" p+MrfEbůj;l:b{]z\$ŊbjݢCZv$ŕr r ֨j$WEK9R-F 9qPh촐#R Ŧ9~n^ Vcrqo~3w\@Y7薬8{8ueY~IeNtٶϤ7 tF^Hshs1 }WWn'_~]vC]iJCb F^HkO`tGBjcdCQ-& GKge+"\ kI$@3qNXx#ereKck(w P8pXDV 3~_ y:/%X1iOD~p=ΛlsG} ΃ܞtәq:@ ogMq<2B]4*m q} *j@b)Ul<#}8B^sr&}<q $9CB\LgR 'A S8GNYzLXLKEa^w/a~)5I$FC= }W@OC6O%!&_rہ4 ABD~UciO_0·^9P)'ֽ=NN-y 3|؛(酳2kqx'u-9O>;7$54(B2#xM|+r(T+꟟a*h YũΫmEӜ#+;W}Y 0""ՍDoi5@8&sM \Tux~yϴxLA|L+(v*-B \}GQx<ZtR5m=ۺ5ts_gsc10ފTB}YFkZ$j<$Iּ>"Ri%@)[0ū Ej)1@p~5z;;=HVoESdp1;4p=ݪ9Ճ;w澰i -u$fPCbT bRvJeY 3T@R1X:r\ݷ'֨ft,}_ߚú JU}0@JȺLW-KxuR >cR%vϼ/A=?[KRFj^dcY{J : ROŸZ9}74/Ӛd' yIXÓ91 †#O"wlS7zdA9{!+HY,Q*N\Dri^4KPgC2+%ҙng^O߆a0c38 KKjn߸rFARRe>A=vp>5w{kWoCXc4cu;.A`!J# KOgVy)CuauMầ%nu")eUL"nYS1 YsJ'rE(k:=K+qĨ1r:aN>\AI&Sr5E( -.ChE⊞%jVq43R u hl l*Ihp-^h4ށrʭ<2hTܐ[_|=hfB(?&އXTvUGϹ(8" قynaoԟ }cg, +:heɸ(qB ڂpo,^EtFH4 x8ʥa1ʕ KBuw Ze@Y}?OS;u/H\- LeԂOC=ncFH碔|V[mL_}Sn' 0n^an2ù(J趇e`87tY7>gDΣiN_>L(e-%ۻsB[$ !>Ӌ9 \FYz`akIb-an+vIBϽ+}AMT8NrRp>  b,~קZXUpmǁK w~Kl5*!+;K߸lQot*$ -j=]4)k*e9m9!b&S!Ҡ>㖈 p>9w)7O(¿SZ%(ٛG,Eك,.BEb$H$?lRO"[A]lfӵϖKή axz,V3fyVߘW|V".i P2%D咝,oF2DŽT`-p6JEtVJI'+2)Gr͠lM#Wi>,sя9)'S-Lh~vfS)o1 pwp;~Uv[F)IWb $sd8Qt`.`C1MT+lS(=~e}TktBx㗐=dFO'WDy(WN*_V8Yxp.i9g%vWaJxn3S2A2#,hc0u"G͛FٗQ/D < |RCcb%%[DYK歾ZaB>f4"' #䵼M*~?́c6v%M< UQGcKUO+ oNBd! =tE @ 2x# a GV'm~q}6dV)e+mxw'9F^sZuj ,R} ] p0ĄkL_mj16`? mo˹4,mP^Th|1 JʲV8vf\mInJbNad\߶GeG;G'-޶?Z޳Y"[{U^K%up6-7)F 񷭮^dC W>"y],G''dXNj@6 ^Hԩduqs /԰l| "qȃpč@#6􉵧 P爛EQZ@ƾ'FhpbDW.LK_UZb: ucچT eѡQ Vb&sJr _)ҵpg.ކ>ViкT`Y"'H3h̚mR/ݑo@nYV_c\dpUG X17ɻ̥9b总b3 ^=Nz 헦U"i !qYZ&MD `Tɐ.l+0xZ`Xs8RLO'\Ct{[>K{['&פ ך-i+pF%}SPVN$5@AO*F(w4K\*`[fQmMoc^v+ ~cu.+>^&[yrqF JZӨPe6~%32t%ff1UW 4oj4Iq$ćJ!᛻0ˆLA/Sڪvw"4%T7T6xmslu߽EL!nYҞ<,zR& Qwj 5kApI+@g֡鑵\t؝F_?/8<ąx%T2ߕe] ?@=pճԋ lI}G["a@1$Af2MC_ͦ;66{ KG\b^k 1UsSݜDAր@WH pZ&qӄ+bpLVS0jrJ 9jz9G ix5E;>~g(!iDj[:|8hNCTtڃBR"hFV:V}ḺtO"$vvhoqvWq 8vҶr[x:y- >jTEhpLӒ:%=z.qrvO;(՜>EdjddXadRb\$:B.N|gau ' VStGNl%~r wzT ̬<׽nbfu qb ,zN͹産~$>! Lwz kON!mS̀!' G:Rw^ c,q)9,rB((- c[꺮IaWŜ)vܜsŤ*` )Ex}u]z,{9 '(9)0ӘbtLqjQhb@UCƚ(,cl _m! 篵 '5O=a5ɸ+mGYlrA'fWNmʽn֤(s<>kDW)־!3uhmܑ̍mjjƭ0(.9؇y2yxKӛ mS LS4+;dSǻ_o $m/ZE ¡|$! 6i`+?~q?g_ AWMN̾(i|FQY*Ϳ`zOhl@Zo[;ANI1%I lb 0I\4֍@3[`&m!k X!l[e @Jj;:yʹcW/ >*WTVߥ aIiQBqT(U/{cN3+@u(0qKjESqzـ4q.* E`l5jupVq,|L)'2RvQ5Պ)hg 3q$,ĪA1\ß%ܹD9ÏنuBľzNFt 8 Īpi|X!-jzG+C|&j|63LAFl{U TbB]IxqDc\flY'HTqЁiqٻ$, IwN ODU+!:1qL[5E0X2qAZe2ugsgp=]!xWf\b M|ˎ6//!<ر&BHȌV yj@-w7We'm _s5q:3p~`H'~dz좐.V EEQ:ƾK*&//+%޹LEJ[/[^H/ 8&ک5|T'V1!ti0j<6PTN/4JtIɍ=lmR̍A#A]wX8p4lJNU4﹖-mO8?G@dluNK}) {uuSo(wi<&o] pք`)f761)HDgj^8V*;+i7Y6ӝmA9xP IaNMz5^_L u^. :[%J}bjĒ$S{y+INp}Ԓ,nIdmϜxP97=s􌏺s*]Ƭ$DB-/}1k -o2|K^I-rMV? %-~f51b́55\ͦWKzF4% +G65B=ӯٮ=8BYyδmiikU:1;yTC6t45'+d_P&j"58<09 ]g>hEr4'| Mvރ۠lTE.lP6@.B-x.A INHEv%:!uEAj6WFrFۉ>`dmjW2\i#v7++?swVlq&3;W"J]8uk|ʱc3Y: 󳡦B6O:.CɌ)':ޯK#Ar7 'Lx֠b=2/k]рVZzQqAS8awp&*/Rr $vF`:@$#k+29v6kTo;/@Y~x&=hFJn oxcґt ̔^pABą H^VX'.W!?ﯩckws˸X#bJ;h *6½g nu ܆L%R,F,vd-[OCoǘw,}K菐MQ+f'ޞ\-˼g=yC`]]hlV8#Gh"S&WS(-9$0%(57Wog${%f>WފTKCH!ڭDbt'זInMgזk+/YWb Bp$X kЀa!p8S58Ch(-3k1$ IX $ӻY G7KO}˵E krq@b T  Gn\+CɊ=7Q!8+R`*"Ox3z M7h @fj2LVMT*l|=Fǹ*zv߷c7v3lU[ j"21; 2̇txj&PAĨ }B%NE߄<| kLFj poA:dFZCixe}v\j #E]ʖ+ɜ4Iu)Yr=/kt\~7=qk<6X%fZZ?i)eJ1YWk,0F«-M蘊뀢fv^”"{~1Ŕ y̍F[0 #w!! /O S9̗KS܃'囓Al' .$0p W),5.6@htaDKkȏDsۙPUS/8g]8fbCXZd}dheK3$(VN'}:Q籕M86A)C@,-CqzK+E|".gz)J_69zz\DeUbCE1+-R %';8nfQQ\o/mAb䱝Q5_nc$z CA} ڭC5"KJTʪWhAo7$W?r'} 8!\t`bN1 ?՜6Zb J{+ ?f;*.RwVX=}_8'tG^~m91""!2Nk[KԨRζܚ".AT8mͰUv̐K!qhSx#{w/hYl `9G%t(9ʌYg7w2: UkK'+ŲyźY.ʓWTzM\.̠46?VZQ1n'elw{С6ڜS+H`NL M3:L ӝj~kxYd^ qۏtI#QLvfmg\=A8I&S(!WI:@Rl@a\#֟|&*W ALf3-0p@>; bu2G}2*u"08_>#HԻ_h _ nMX΃JY25x*c_<)k!:6^L=]ˇ:Y2ۣ>p~LMlT ΄(v2AIx;rE˚&=\_pM?MkD1iN7A?y41PW(%ʉ:k\FM_-W4V1ͥc17 e(%M)˿4O:zVqm8KV$}ikyܷ\` ⨡A߻;=MsW'ܿ{**Fm((eoGT&O 1C72j{\Ex4EnA_%pti /^FNPNi_30ޅ%46bQ ݢhjE > -2<p跡_2(9U<ʫ5F~LZ"IvuPZ߮ѓou3N7}7֏hHύS$wFcJ D#mԴ~7~! V7 ߎp]0g.ηYo?^htMr80;/EYw"%M(/ZgCL5sqʍGksc!Plcߔ\A ŴbfBq&m2H1=iU623R1)ucuU?{ؑ0 n::_;Dy@,^ "Ms'k%E0ײ&H3O~"lfn4#Gi; 5{b"EPȑ ݸ(a8G .IܦF}`H'\2 r'6]qNHw",ko\EWT*:dl_!^|jyx0ռ]^VM IB1}Ije۾&<Q.>Xf$`+y,KBSWB 'Uy׆%w)L^t >Pg {&Y!-gC#KpxtX@7*SJ:HR|@Oylc#wJ>8}~t{\h,Dtpt7[ <u[<בgz^_~7]8[kvAF ¾Wm!()ƹ'^ -СHcE fJkl~dmR<dq2b2Ð;yCXZMNsV' sZ z[ _N>t†e4#ֲba#QpO޸GJ;hCz*s07Ɓy77WYE+Q7?66 ( e9r扵]&xb)U849=:ebg/fgঁ5-0zD4V1Q*cwրq*wa+m*աD­ ˩3~<ﰽQw*0Z,L+ dR5'$Ol쵅WHY>V.ܞ+@oUFDͪCH?f2< (o-)5 А s3HۖUtk08B~P ^9ih*go%i)nj|?,PYxp_Vs@Ζ {\u{k(Ю\0=$] 7goZ̑@jZuFxy~_ SaDM5a>{s$V5ʽ>/"nՉ͞G&: FQ3KWGj:qqRygs:PoC0o$ z<[]7+2q[=(w2&cII]7y=%q 8Rxt6\3 zTn*(Hކ=e[r?CA AY=Yov.@ oR[U$I*5ӆlp^"1@r$U~)(=鳋>XrQAs4ٹ0e)3hɩ EB@-K_Un:L"1ݰ uVC؀¿j4ihY??8.yLj_7 Uzb|xh@uW{ ,+Q|Tc|M*U}Ro0:SU4_C[2pIFU"$EggHԟ?M2xǎ<&5uFNT(Wث*0[Q ]_'O~%e>cZo ~] ks wU>n򹩋  8Ƃn8K=]+&>0pV%"s $R* m'c\Feo[ 5ݛ3QS~͸]vRV,2 ̴V\\egy‰o߼E$>d)yn9Srcs[OB%c DUmJ =:/C\hG:اt*Scr*/t_9U־[g?0hr6.Z1EfXa6;@yiP@&ym %vӞTdžU߯q~ J` _˸9OlvהQ'"5 QxC)K{RQcg6ʞ&urh%n!ݱʗ[ulhm6vNՖD*\h*J! E7dցCL!l\\3{Q!H} iI;F(ZGv`N$91F2BРz Co]wUV pWNxRN}k|ƣؠ1 N/@T)U~-Ic)f?nkR" Asѱaon]-ۇ:ĥϘCKK^UMfI6:~^bJV3 ̰$!6".<ўHcBF,J >s۽͂^*l?Vvؚuŀmy)|͋Q,'`O$W.K&A\KC Da@<@yׯE(Phϰ5pr"jkn$RoV8蛖XҾI CLs jA{du\nf?Σ j ȻX36*jn`_7'eAhb{.'7t싔gzA#rV.{-M^y\}ȃ-3q 0HwJ1A7r͏7ZJd QȰ#ڥrH#):ZiiI 2!uL8щ+յT,Y@PpbŲeWYgO&yùVZe@tk -RWu>#5௿+535d"N^Qj$zf6XfzpػHϊGbi&Kbaޔ' EAUTr/O3XU1R% c;diZeɄoltJ Jb_SNJjϤ^y2>UIl=r OP\F=grIi?p>JPc{}])H*]ڛ$>/)炜zӈVB $n#Ȱ+Ag*P)1Es,yN) *@Omly ڹT;@d,:mzҴC\6vg†8ہ8ߌJâ_XBrQfgS[zHc]"_vJ Hx3磭gpgH|ٙk24+^:#T/S'*lgTr#"-sw$}iD-*(:Y$2fRuiff͚*[?k@@Ek6)]%J*?܅ā85ˊҰ8sG%© Sn}+C= p j#L>%0q^r.(z|^gscjpN,;×=t^##E f8AaD]Ս3jek4]U` Ydqd~nRp4ʻ . (]xJ[}jPІƁC??g4S?7]O$|9&"K︳;nbS@Y`V*!_-0w׫0;s;T^4i C`G#>qf:^XQ68 IA'^ r.NVJ\xToQCʬ,8uvOy[k})ʯFf&).)h~zhygE(QX9aͨr4u~ 5u =(hqZ !FnG|_e[%#z*$?ZsaLp9E"}6G4S,K]Ea,yީPX\ά+TZ!\tLBin{$^#&6(KW7T帼9M[$zX /6rDEU!@ ?B bK2%QB3I[ cΑ?ǎ4{~5_qVy5,%Ncn+o3tBP*>|6_ɥQCtd]B.?9njuxm"?UxT:˂o>>'r9s 3qRw)*?$Ӧ|gkOœȷͦ`Z] 8$/K)"=[lg pa,%XKfTS(tL‰ r9㴜ٷ@~Rx娵2⭛ (=6T!Wu{EpA㍀jiK7uͶ9oIøUEzf'ln/&W_Zqv2?{& L!U׹!YCB;u1۬%[lKQ+keזnN4T߄<o>\ziAHgcm=ǃ?Hij]!ydBY RHk^s*;{vSF!8aqVя'fad\&!b|}ç̞BR;/r} "H<-[ 4&敨;mD)mzqXK.ӋYy HpX~'te;>P~ij&wݨBMV/1ZH -}LphL3H9i>Z]퟇R;ϑKў5y_зP Y%%t{()6Ϳٵԭb?cɈՅ61ycĉb7\ HYGYQڛ IJb&bvAaRWLKft9EPdM>npwyS C#ʙ @.hblesxՇBaQVYEFLoāN0o=!U<ژ3IЂ#܊/X%33]Q:/ZauFz:(lk nW4jKW%0M[9 [LoYUkܡ~gDdX |t#c= l@x_rsVDn8S+#r~=ȳ[;fd(Mx(7\оLy})tn#Snp"rذ>W'AjN"F2?p7&,G0An{Đ22AK!^H%^gTG;as@j@=Ҿ~ /f '%CIX1Ƥ"ע,jC͟ϏTNk'w21ndAFuU6N*%uzU'}<8B%k <_ۈj8|@1(:s@UBCt}}#jD,ɈKȡcNЩ@!i#-8y ܒ{gSb:rM2ƈ)+.!# (-G40KM%TQGHu` ]L. N ΘV(Vuɯ-49 )ʺn1Rʵ2ΉhE+Al]T o(TH,,[RYwxwUu 2ހvK[+!:MnAj a>yfҬ+fLվIη]i5sʅ*@`GNK"Lir!ߤWe@BJ$̞Q0MR/ΈjJ6[Ӳ.NA ʙ')D>(Dn""_^; [&b&tΡ*jjl w\Ӆ4ib6\%VAE)EʐF&*9v$I@%Rr tomT4$}n7y̐bN/rTnD='Ǚ?wXpH=`X% QQwyO܊!*gP E*\'PGj's-ͺnt(1ˏ} 0c.d+85=Lpwj- j~S>33<( 0/*a|yav_ {`P ~ft\-gr.öY-NK'5V@qpl5/γ\\x/9ސ'f~z! $~d @p9/.@{1@aU2Hn z,,+@/ԏ̍ G_iN#C|nV1L,6Ĵt$sϺTWdpB|TƔ?M#8AI 5hĕT!Ka\)E5Ƕ٢JV=Fh)HM88ۂ8 u`0UxA+7tFVms pCًq8$Z{AnѲD KCC-Wc:!ߒ{rR6ګv#aZQSv~g* ɑ{a7y_Yx_.ĈR|TgáHÉsGŸC\Ic4go?ZTVnf{\>evL&ntR Xȓ:0 kBz烚Їԩd"(v[hrVgy_!prږ;-_@BWs>լ|S[4tg&@-9@B3P֋9,EqoE `^ .]}*td= h(H {qx4`fhS|?cFgo|--YđʂӲ4:HUH_KcsDJ`T 7.Z.f>7]`' I_GAyQ`ܶ꫊gm4g{qLGTƸKơ(;ɲnw-rE|È䂭'KU"3۬y5RKLBIe} @@ΔFgל4i>bg*&SbDuA~<-.%Pm"0`#GAyB O#c_ x_ty f4O"ڒ.²+T+^}udDL#G1,?:Llׂ{YDZ͸ :QMG*^,~s"#,x)mG.hkruЄ^ ^Zt*8a_^=a@EA8O>b^Kڦ`쌭@wCOOR,~a_EZ&Eۙ{g+nG_ME[Ф1: 3#ח@8a@mGd.-h$|/&)[ ?ٜ !GLX?#gd"`HlElj(F^E0XuVUؒخӚ$,ͣO_IF;rt,}ħV1lTnܜA[d(i: tnwց9-h #j//=u%JIt^Qr J-jqB-f;ЇTNY]v[yg)GGBy6b:g]eJ-m C:͇lz)E?}#9-uia_NjJNGA[vEƵjb}9. w\m@sR};(PZ_*R(t A%b,a6sHiD$>ƖMHzAzE)<> 3jF^]jԎzh%7JhBS=R DLdv}G,B5t8m|luJ}(ٱ@B\{LvRdDzsL4`1O^MIiޝPnM@1 3&aۯUⴿbyviNY_ƻߩOn[X! NRM-@NhO*2s=}4M"ī^ U&+@nm n2Q:-$M,֎a3!;mDpPL,aYj%KtleLhN}o(E4P9,ѤR}gZOg >R1Cil1;1iu@SV9֫gKpEM ""78Mq`?BƩpfXnčEX<Dؿip,GFEb35-' Vo6 5҇d\_'-xe4W-5]غ4C>wMiڮF!Q>?s^0w}ZIy?ϯ!Y>@d#T;_L{/*wuqǿWꎆD V:4UKSYGg!Ƴ 859GńW{cE-ę>l AިHޙD 6NB&&wЍ8c#[x }-ґߗQ/a&c~F 4/ry"%lHɐCoL L((k# DR^$Nw [¼_7:SeKvcN w W%mVsx)Ø,z|.%KHA2Iv ` vaǟG?WM)m- Ǐ#@ ~ ̓R=Rd; Wxi`1A:Yi%pCmi"yUM $9yR$P{zi>n oWX5׌T+HP_Q[;AB(Dz']책,J/kS*@;t/ܹa^\\7 yuP٥.O"iElY=gceI*c"?e[ʼb 9ێRe4.7;&_ o "Ii@o&)VD-Ln=љ7?kdR ^T!GC3 Y 5!'S}i. 7P }4#/ї\8sa ήoBc$ߴu/}_ix=uv_;C FoY{DeϡۜBBɋ0a[n-2{J ],S/`,hy;X~J&95:-_Os'F_T)`&#i~'֊siYٵ$4$* %rY0 %d|#3{h: R!oǸ㢀S27# $D6vGet/KLO^{%^ܠf ]6M)mY>3N,Ť0]95%U3Hd_s |q"%g*gg+FBQ1[f'RMz< Ot'T8~"Pjѯ5(c~?pٴ=zP\Ƭ 49Z8驛 t%|'- Ta(SM 7 !VF?nڼ]Ld1yS2IɈwNbOI],~ _=a5r{coB2aptn `GUZ[^ݽ`aÎ>Mk5EY$j6g 31P%d*7Y{HF4d\vsY@3x!Rw֬4/>D-0"BQLM mϴfC_(4w\65rljvkF50rF1 sw)c5V摚C`E2gChiE6?8H5výd`/~ ik}o~XӏOi#ޑ0(T^~,n {Z$!qCK"d϶BDЮȿLYJǘsɊ`T~ys {X\sK<_QVZ0ԏ@ _"ͦٞڞ:b!M3D5$o8( DWl} 2eqv}>FQbgmᑹe >|"-nYҶ zD^4'숔H 7):z+?>xQ2NU0 }rgoV1VǟӾ7=?z1 ]o, ? iޗt4zh|ttoB}Lkc@>.b!@<Q hE\%LmMW_,A'٣A3u0q`3β6R/IsO$"_)#&Pa~TM"行c2cqƒ + C876JK_sQ/phKAv9D-9L 1K }\=X̰ 1ѹφaCGД/?Ox*J7 bIqwJTJ[MY ݌XI?6g!Wlqc.ipk7 4Z?m'8QZ6&[ ` j63B X+H2By:ޤQ1Lwq?A="۷լyOyY}5%J]ʹ*B>h0 3N)`fQWNx) Llvp}_..7}S?-N-&r|pܖ-ɛX`;Aptb5cᜲfPרCI*&v zuhҫC@3t+qdEkV͠,,P՛NRR14;%krI!a$3Cou&0o BHUu%AFD.Ed!} *n#E׆H,M`3lU cW]Ybz|Q|c(3ȝ.v|gFhߡqU~%3rUUM0ɢlΞ̣A'+R#?`g5U7OOt4 pÉl|-@5Lay 91"!ej]*&^50T)e6HN iGҴ24/ĵ1[$RߊGh9ˍח!4}yjAF%)(n&},Vpۚ"[܃5-̒qZti3Q| cM2RU>ǿ[ʲLd+ /]e6J<;u{KMfjTu[W۪ IDB; T-fZ1. M)>]|¥ԅo1k&ۜ8FP2:,7SgV-_;GػY]=U.Qm)3Z3"87bIYu3%g(E;ry5LI)1,6zil3 lGaTP c},VHV.ǎT3 5^JQSTN,Lv `iiąv ޫ;<2$@躕>͍GK.+SFYO=~}/<J\uw*a8)cr<,s qVҊKO:laH4GpUXv2UD70"NO6Z1`1zToSJ.2ůt0K(!j'Z~*vD6iޱQbb s1!M#jm6~, w}[ ^$shZɻ{CyN_[)OkRjLͤ#Dd X0ܒ?-SeSb07KyBHQNq?]3 | A#YJƊًj?QӧKKioURs 3G $zsone(NOK$w+SVGxa$P9m\ uV+2IQ,fȹ 2y;K,e0 T=V+i9٩~ ʛF,R$ }fPTNon<&ɈO%_-3ʞ#-ӊE<UC^ڽvcgʓd7sjŁMg1,jVyaH?Jp%u.C5o{ݿS qQjƍ0Vԟ3BN&6 ]m"󒃴OiQ.Ur3z~rD˂>\x.;Lw z lg)j5fTaNWǷ*W&i}oEMP[0f~]0n91&CAoR8U]wqWZĢrW̵p,DGIӈSI)D*bw:d G"w~mPbK4hPr¤V ^WM첻؃&:d\t)-H}qk%Ƙ'9oBjY+/ _|Xnr5!_.~q1:HSX{!naqӐz\O;ZW4|>@Og:?F-pg0ʁMPј޲y,wijE[ jB_7b3i{P"Mfn'd矯ߊ9 N'Mw(;խc /s Fd=:E%*ωnHny2 _lr;JLKW"JW ]'1@46[;eM{uDC|lCn^k3_#Lk=z~υЧ3Y=*ޮ34o"eBjKԆ IdRmħ;u| 2_r$.˭"c띃IFsvQ]?zo;"[q6=42hy;2ДV>jב5J`#Z7:K) C8(kze cχ`χsdY.D > j|vȇ.mXP!'E02&L6,~)䑒~4Wά<W<|a qjP7$ .Ġ.˝=2)&P {EΎKkwG䀞 mlJð_WW9ĵVk_ ί|7?֠?pQIRPk./^n, 6^kA[ OoXt?}3/]kD/ >$A_CM}ì!mb:?Ȟ|V-޻mwIά$q4 ׀gCs4zJ|J{V뻴5,=1$?ZW~|P{QةZte9*ش`_pp+K UEX8l~:ܬ" Ƽ'ﲯ=4d9{%J9\x$R.76DQo f?#`_2.KүGgt|nV>5.0耼{nCTOꚯWV qae!37@UܘbLB@%IWx_m?ϼ;ʟ&n}"D[6>8g>F @"c`0DY-NYNqoκ9F}1ׄ/zƤ("]׹6R\=SDN }$*0gB=8g{Xo8 ʞ1sCsac"txw."ZňH<uRUI2dIRI2T0IU[f/,ЀXK2ĂɶKQgȱDI~;DKB;)U;f]}r=&Tf|sI]49MӦ2FCMjSvtj@;vE6-&ggvKobABUOjq1)Ւn[KmfZt®H%Qnbs1F^ pv+CAIAhLtc[̆b;0.E##$Z bRm.^57/πHwH/~^aP| =՘_9eH"S43BgY5bV6l.Dx%GR2}Xe,RCn*,1ʵ)G8Mϒ[ޏ{5ӵ29᳽ݥIϸ7& V))Z ЊBxN؇톞ѿx\z5| [g5Gx_k洌?ǪEs(Ҭ%6('SRLqD^1!2Q/r:UI5!:lEihM50M o%\d5=Bl{żK@ԵGh_NZ 4WMlnV9ET\)81)dxKF w䇞׈^As9{44zYhi륰b2^z~G/=M'N亣Ȅpc?0\Tw]dmz[?D͎9;|.$Q((+'R­Zz2C u!pa_WmR&D;ęyZEuRpmoB( Q,=/^`=sQYuFV1cWr0^3n,io WD}t~JvADi4ܐCy,M·xH$8?]pfqEEu(2Sm,))$AQ$VY@roo( %qj\ZWT|_ڔI[ȕpkCEhutiCj\@yV#&yELZ =qؓe&e2JD.jgj.V/{%Yvݕ:uL٤`')rcw~UJKAs"E`KP%U<sʀm.h![8'۾!&f_b,s0uz!c;pHR"P0 [6PM >BeZ[C\MRntO)K6"_,!YIi{>)4{1͘:'WG楱 ~͕!0Jy&É"zVE=Gm3ײ?\Dyy<nHo7kYԵ#*ҥ]+8n`\r@\n͘|)|R?sȔ6^FN1T^RL٧J)󩘅>+V QR^JՕUIζ'g/2<6o v_[w^b^B`:C*ucd 1L>2vM\ZcB:Kp2'1Nٖ]{ϓ{MhLw=:_{'K/[{Lo hl}Pe_b.^LRdc2jt)J/EQp?ʿ++fĚ[Y ]@{V Qv/e?~5au%`O(V>5~[Nu{H֙mt4˶?cz;W.C 3ZxDpIkraSY,ţ2(F/'b_ NÁÁ+D- `k^;]es/9@7c9C`Qͨ!zEldIp3R온s -)lU_QH {ky 7XN-: x Dvp7:~}敎Cȣn3ൂ`e!~f-51ݛ<#[w9~[ج w"fArvF_8° Ⱥ~ b1v}L$%x&ν:4i,fbtxYz(ua'6?:7%V'  0jwy" i}_\ڸmPOV&'Ij'0A9ͨ?]3 4oHP]W(|?~#]NqOG2G- Lj/+a-zj5v .l@RLg|Wxh}(Ɋ4x,_l+x&o(zxs]4{Lkz(+ƌI  q\^;|8~~kby4UoI3ST as?h>BG5Yz% | eNx\Ȅ`Ni?Hܒ ?ѱ"2e6 @7NLM\YtOe|?*f:&Nt؏؁Z̄K$6!.kCuf-+TO8 0vtdH{| MQS҃x#ꮘ$rrRUtoN1GU;ˁb!Yv, TFr.YDeVV2ܰ2DX !vV9F}cu*熤Z,?XIHt?=! r.f!x:q7Fʳso;=..?~ Ywºjh#R1XU=@({VU̓L\>2;"Pˤ]aFNq6dM=j #h}lgShA[fIRuuIbqcg,@ݶ EWOQw \#߶$Ŧ*j3@O*oO/^J :O<>>rc: m3pԳ`*a&wy˛[ΡYz”H>my9;b{[v}T^`*Z2QMjܽn!wę@l mE K}7b}\b̭&76U{(X.I uDB,]0TC)hH_Y7r}Tƨr{b bc<A"S YPpbc"OOTd0p;$63͖/> 5ZW`CƎ8X a=dKPe#6&0݊*@'x'w&gSQk^_~C!q hIw/;U=:&ɟ8^/ei.MfzEh*q<9jeCh%N;S@W;\B񑘰sYv:b4_Kz9LZZY7wC1Q|^y|[RFx&qh=vNCONCVI;؋H Jan߼,Q8.ih>0uVD/"'q-o:Ę"y;AY_0SJrJ* Cth<6t>^sVU?@YHRU$Ysr0wHPEsfbF4YG7<ר\P竷vmd` s_^HoJv5` #omѾ Za7Ē1$)7{Bzʶ'{EKGd78XF3d1F8gtl buippœ4/% jl_CUfٚ/QCBrGs 1iޫm~Rx i^ΜXPJ(fE%'!͗}n/#VWm'  ;I׭®#=~?|l:91 BВP{}񌿯pEJ WmB/4g>! LDz ZN>eKFk)dgPP]q bwd7Q`c@8"x{=+1ܦXœXrxMH(^2Bw⍃Bjg14 Ҡ ħ,#3r} (ԡ2fH FlUYˢRo,] E㔳FtVoS/,@U(MPL%Xڟ\AKB?@QBxhweD;Y Zhhf8QM5<^ш-ur[1(I6>n.6١ ͏N뇴 \|.ؗS-lA߻9Xj>qRGb/ys}!JUY/*['_6=2 rR'gEO:~ͤhb:]wfYwG)4 d|q hCl0unY$2tBK4?Gɵp\^}vl(ytK4aOs%ȳ|#"+ )$!kD>:s͖iT4W9+T\b|uOX7L,GH{)o[ +O`ȷA&s'kcf)?PJq朐%ͮ;}Vɺey<3l>oW}#|kKGO_$kh|_EFtrה̭e4{%|ڴƲVQ l KH7N$} y gڼftxT7>j꯺m ':{nȆd'{IXHJOxEl>oMW<ʂaviz }CwҸ&}+y ^L({:4bcs3-bt4;wf`] /1^k xGķ[[P9+םޝXD4K s7/`N"TUW7obV"B 5M!pvrʵEB6D8GÝJ I>ʙ(ӔviY3Hz_2 *]Hl蒞"q=d}>;t9eJΏ5>/Aj,h, ɩnU1IGYtêmi`'cgq C-HʩX]G!t$e/<~cM5İ$ɁjhЁD=u;jcck 3kD%t#1'j19sI՛*!1$uvypRhIs(;PsX2"ae;ňO_kjNswl& G~3 VPO|E.sǓk%Zd=H |Mb4k{}:̟NpM wqJԧbsɿ~c)#P5hKߐw@jFE*:!UcqjEþz x uC<XUB5">]_W柂m" 4onn_1bBc*-bqϦWPą .۹>xߤ.bKS>fV*<_7@-*6C6/P Y%gZk9gGsa| 2sLI4?hHABx5qi#Z5Ƹrۗ$ĪaX6z%ss:MC-r7_tQ6 [sIL7_2U=s.Е2FXvBKωZlV6"% >؏_(e앿W)ޠ&y)u1u x&?D:.i~W3pȗ4:A3c`d ,rKfÙ { <_;)Onyr?^~;Ĕa`ta"M-٣_-4u[E% = v/{Ia[M=kW=cX(VnZnd VUBAbp}%NaeSBY@rO@,NDJ 8*װ%uWY0; !~xwP74Fĭ]`"d8ٙg'c֋/Ј#~Ŵ #}mKd4 vB?gCgU]hCՎHۜL ~tu@j)f#&37$7t'6.&1mȖc>o2/hknUڎ?-qǑ(} 5}l|#s+ɰh{G\W[P-Ryߕ+I⭼+I !C@F!sdލ SO,"GHXvpdOf>=L?a)aR%#T?ѕA\ U vӦQ dwĈ+DtN%<&Rkr;ߑd?15z%שXHB@8,fM_AxvQM7Mݗ[G0oQN?AirԦ5h?+b[m9wOQ'Q;⿚*᠝y؁Ci iU.aXm2Lk9vIUfQ|[<`1ٸ&H]q>m~9?+\Ƒ:`iq5y_uPFj vK}dFj#5qv8m^ 'ҫǪW!2^)(Ȑ[QXǬD6y4t $3(􀍅 Q?m]?!;S|pb{r]EϜdW)hF>NdC9m.>EKk޳~"Og0\7Mx6>_D66sn@Zb>aٓr(??jwK`Xj,JAF` ގC^; WWhQ3, tCxd1D >}vٗ wFHЏ!wL"z}·XlWZ3] Z%sL=ijvCES\?e~ &7:e+F#:٢̈́e):Y.ta0\]ϯV?pLԀ܏Dz_NVٕ9Q@7f9̥;QƢ^ղ5I7!朁Ei69>v-ω%.k@R:9X$|tb2.$%fr_GJ ]r.ފ!/w~'>t~iA2Z2?8:*oV;'g[{|}|#LfiG5ju:&ƚ "鯮tM y20}x0!33LkXyagGlј|LPY~ vVk3Lc1)9,+Шth B`L休 ڬd#C8U15K>Đ_jvӔ52^+&gfQhfZ.WMR;?-J0^"c&ݷVYh;5TRY $Fi2冴IζQQcNP x9͛g0bͦX*+?/)Ug5[Ze=|,f)єt a<^} c 3"; Hl[zY۞᥈y7jBh9  83'{Oڨu?K6^l6VwOiv-Y{ )>aY^>z   ~m{+V\ݙf dFBF>jܞu\Sဴeqm\w9{0916^GA:;LΝw_YpuEH~Mi-J2Vg҄Nd+*F`4PLQOlrNu~źVV,wst8%.-ViwvaVXP슫cqYNF @ AoS sT߻PwFܡ[Tgkж\p͓6,g=ya@$n?sN~: ږXIK/|)?0$ߧ)AKC@?n(oN~~RIԭ6LjJV]ݿ̢?{`eEioZ{]UCsnP[^WğI g3DZY'MK&` yQz.oXjqQA3*yJȕ8.ZdZ5]4,"T_6[&Y(AX)ŏI--C۹8,_8>Bd&fT18$LH$3QnBEbyu,#ZNj GRDl%pɤ1Th2bí@PY}˚~Wfg \湟2c,/WJ3PC&`(E+DPWQ$7ntWU:Q$A !;UPQE$\䔤LEk!k d&-!jYzp$ӥ 43׻NF^T8,wkE:NRH#S;ʃrDDki=?2(?*ږ[ѯO=@4.YT,[[-`*C R@[M)$J?)|EsvxbJPoûфXTQSu':lf:a{"}X'{ev}TQq :#75f0͓`,s *b#|",G)7LЮ.yNS8vd-H&d|B6Ϙ <`\7ܤf):6aiwA=5ݳ %f~x j}?jޠd0*st]]i%!k-n@ň΋O!%-~rՀ|}VKGޔcMۢ/~5d@G|51mej&ک-蚔E[ XU`j_wyF ,=Ez$; ^Ͼ $?ZČk ُM͢-6{Β58ίh`SQXr3)`wnSu3 K9̘y4zqpsI1ga꾪_)q줚)k1[s˫01maZjV?5#הÔ4獫%ĺ9gKsK+'cbi"ALC;̌dC 6Ukr"NXe_/}|Z+.Y />tSĖ9njpq$4Ao%mό&ܗG՗; ONSɣL4D;oT @km8ȑhHfق| (ds*cJ /$ wƩEs'10|Rlfj[~Fw]m-o9r"^,B]|_*8OEiꥪ~6əѫf "dlD;tc>YYE3eY؝~cQЂhf q,,mUU4U-!w>!X7E46`h)-wDx _=ijUf h6(4RI2;qN+HRvVFt~y|z؃{+e{;d.`23Cc!+푙4 +q¾W9ֺ+P^ּ?&;',N-d$~P,\1AV-MvFJ^bcrF94)cIx0 7-U4A;H^=d}\J-Z :˸f$:y(֓bܞYٍV,+X<1v 4:{%yźr񓷅MHY spE'lCo qy7>!Iۊj;|1(!P\rҕ\Q^UF3eWYx]!R6BoĬ ϑ&R/dGL0W>,g=צ3AftqUAzC:e ڝǼC uQPz@-/{Ys RPA2XɬPP4?4=O|5T-{kڨ!2ף}@w.\ӣT{$J\(mݍpn fP%D 6V,)"wk"} tI =-y>*dv߶`oӵZ0B7dvC ~9* ܬǮ|b*49Ń,Cy< UVG Gbrwz2/$F}0LN4 6R`EwDX5-l8qtm_=1?hr+ŐlNwk). |s{moO!\&f]oSy*Q59e i\NTG>y7`d ([͏]LE0tRUw1 2牉I *"19 #PWfp*V{?5л]J|֕#I?7" $UrM©u=~Zqk =>dҭp8MMEo1=.O0=P5`ML#߸ikiv,8~mߢoaʋa|힌ŀI)wFJXA2(˱CjDrMayƞ%?ddd N [$%( -D7$%Bxվ-0~"K*_uE&asCöC9)h# )?Wo=RXV /jfV 7\rokT)?S!odv3 9!$ [(CQ5a/gs q LceL54yy\>6[zPs,]o(h84( l\i0VdA.8BPsk.LNUkc 2"9 PUXqkAQi_J8$5AI&S25͢6q(ZK;c:ZFUq(T5j}9+!Υ1~0}bqu4 ڔ slW7fc#p{' -O6$P%'_wwրm r kJ^>8)::DP'W`SsIߌGiA n.].4U"d^ rynLr'#UӱC;׋ЅV{y9j#eܙ-d H,5'r=})ɵKc/?Ҿ¶:-Ik QGabBA2##qf ͛ 0IcP 5e{ ątJwr*W4>t1 l -R'u,ީu< "}T` Zv2:5윽})N#`,MN֬Jh3wA*]Ճ؂ ,io~e?ߙzUeeFP j- EA!`G|PJIwc4fk@CV>cmڗ5))톮pЖ=htնƯh)xJa5t,XЪ kݙ5$(PC$~l]y}3zm@wBrrjKIv:ldd&#bʖqN8*v+/'rgN|<kk Al0Nxg*ݒ]/藧i+ݡXtIl¤߇U1Ä3W#]a{;wI@< ۿ,'oeXO%~A ~Cǧ1é4EZuAs`jo?_*<旋H>aNk,FbE(z(oK1/1U{J+#'ˑSt ^Na]/b} xNyŽ G.l <uk>ߤ"1ڙe ]?.!G8byf mŸ`&zY}0a+i>87D1StH/ۚۤ0* 4p2&Å|P /L FHrR0`KRR3 V\*]&;ngwusS2]y]"M q\T%Bۇ3W``w`aoKv7bgR _3qp$]7Zv\w<,7aŨfKYM~6LrvP LbmkT3P`QȈ]H 9zb$vP6F3g/{bx0G#{O~y! X LQZ-o&aY^/1^$ǃŻwqjZl-$xn3XVuT(xz4 >vYݹ Mz&(&pk ҙsG[?1~Уp@jN AC2vV7g6"~QW{/wy'&r'ZyxSa]Jded#̪V vTlT?m -O 2^8}#{a0hD[=J5_RL@8:ͼPK۩au먬[rfDžw<dT9؟d~Ђ-Dr8ױ)/lپs0Q47Owmy7X>P1'? zn *vC<7Ǔ~5fe{\"p:r !NyΝGepEwY" Bꋲ l4Hn(~+ Y̫CwLL-YzfRm*† < VE# 7׼_zYHֱ*ǶOuŷ2C= 76xǦ +(Hc}Cޯ&GI5 6ҀF iu9E|zC9e,A+R5__JYLc[vX.ô4R!*Y(Ög`)9N^`м!lU/fB5jóo^@j2%T.G_~B6D2nTb=Kh̪St-jo 5^QT7VcH%;ݒ%#5'&p9wK;K$ؚ Bǡz !sl>jrT$':0OOdW;ch0pHP :PȻJs$GG?aE : mb>Ͳ0yB'53[+TE0|0˸ɉH ssg9h7kN5cngUؿ|kc+aaKljCs4[!ȥ\2GAt Ժ(_]Zㇶ͗}zrNx|xw΍eCLI즘(? x|YUNfLu`:Gzn_+]=զL.ضbEVd+/bzF+zSї3Dufµ!CtkLֱQ >o>ݱߜԨjy=XZ1ת&&e/^s#_ka v3WG: x펹}s'?1j6M]ß2u9d6E =tF tM!)dJ@ @TfC`^kS=ΏqyFfQE)bB&|$[Kt$2l6S9B$y_)b#קadqW`C-,ɕ쫔Aw՟򊌘k;5a,&)}gO&e4i;Qv.q2v;85%Q@@IJ:Yb[wo_bp^7mĿm0ʾbiNzhGv祰{פJz{"Xi B V4B"j ,-9-(Yu@M" D$SJʑgk?cVyEÏ)=b;E@!xumW!Jal&f '<ҖFW^F? @lc!Z!_kG; (=]g6ke8[ȐtRhCL*X"Zk|cԂq:wޓc8/ 5LޖN#tw *18PS)i!z#|-8r8C|-JRS5w9xmRkn#Al6:2P0`f.G40Á_U&b/ d"9b\ca` YR@w5kYhFSD)LN9^GI-zǂnyck2cЬ & i!śvE~*LUvOMmE)^&L u20fnhc7<-D?d2h*E޸]S-a&~ 43%|[+,RY0n5SL"1~騝~s dYQ-Vǖd7m{trefOU=֡URuigƎ 7W -yE:jѴrS_i?b)wLY>5 GI<%ߊaWXrʩ:@e ۗ=ɘr~t۳Lz-ַ?j^ϊ`E!p$Fs|&jqv0 FjlU69Vp 55#¢#6-Hx}d%V}$\r7W:Bp6{aBΩ(\ S Y%Vyy9E&% %il691o+*fDc2VEǬ BUVT?COYPq/z<:Gk~9Ј>$6Db;o[Zn]B[㞸oظX[?\ ~xSr?aE1< dBWQy(KH- DnTBQCgo':p- ?SB~$AJ-]UlٓdAZp#j$w)UF,_6x"{- ~#w5%ZRbY/XKZYPs9{-b4UHFƪLdo|KMbh_oF% ̕(#O0BS+gSԅ٫#:Fp<,79 YQ\y-c?~]z/%v[>ȣ>14}~V?G98P&rrr#n[%ե)ri$na oF/dzͶU:ܛѦsѡA:U@7P$K|<<ЫZat2r!=\ܞx㴦-(W<:D{*X!A"W}(: NhjafD{aJI3) i;S WE#l FYnT&=2:"q;uSQfTh*2g2lՔ. fϥMӸ E%@Ж㛓[`8QaEn8(8f)%ujPd3Pp/dH# gMGDH_mixmma_'K#͚|r@eζL;K#NW?Q*l43Z 228i9`iveqݪ#yd5FR=K* I?&!ƛR ]A6Pu|./|U&>V`ksN#ȏf&."'{_0E21e}C A[9UԬcěX9ĞH3wyFh.m9Ë{#Y0g F_Lo ؖi8;`q%a \N Ê%1w^$in$ŏL?o74|˩4N!1ݦAZl]MAVrja SnxbE(8'0\DF^&{>t(b FT=}>N$CqTڏQ0[@$ŁbDm VU0d>;V ӂ(DuNܣn3 I}]mWrzbAlW&ݱ!]Pvѓ[v=tk4jaSb⨈tPGIR溺JbH ;[Rxd'Ik<2'#aU_PpMXVNo cG2(W9~7SPи-,6MFG;b\kzyo(B f\h#:o8s0m|ѧuh;rB8^sUWI9 gmq>ߥ[Б/4-Oİ=ڢ{3Yn,#!_`i&R'T]ϰsM0](>To!x/krs.Mif0_o 6GZvo& ;!CC'`K 6iG>mQ7Uqe%.I3,&ɤU#8&+4f†"X2 )yL^z qqj.UDl}OnMh L0Dժ~%WR p%"'hlBlX ۟kyEus 1??Ttop&:Vܰ&3u[7_M{l иBr.b ?߂ ='<^ Pc@VWE?[HWMyj-k{"l}Cg;Q>bMPJp19c&uPW noVٖD|/_+A"?y[9e4`'s,69uA0Ofza*;掀܆݊o>fȮPL758XܖB^dBjQ-LkK8IwӮ^;Rl ؖ [E҆t9]F da*| ӴFfe'&p=ƥoe|@U1BIvz R /(bzm9L!PhWP.Z{{񻊭Mʩ* ZKeqQA5O2juSIeSlr h~YsƏdWx"kbv{L NRJ>|llBi"@w#}TifD[b%yR)5>ur118O,m(UաIJ06ͦEb:L+Ѷ;M7">oN)#ԵsE#giSPTS,[bFÜ AEfH%ܿh~/XhW+jn= $MyLpОAs.sBif q-!KG.? "َ@Ʋ tJy_MD*Wz!/csA {3)P_| *_wEKGq&cKi[r;,%>q|Wb*hi27AxËxOPƆ4ZQѰ2`qU\m616b ^qNrYEȣ TC:xEp"A Y]e^6#iqp%5 Ę>VP|Xç82SkĠwءFKp.`Z6L4V Zh!'hPqA̾ a>Ǧ&p|5ot2Qaciut~HG>:!]WS"Mc.:i?2xDZĹ C 1Z}w2!V2}E`x˺s$f IXnuW59Ic?'Ui 83-)^I$]Ja+SbQt/t_|`#+. ރ_GRcvřc)衄\͖rU Ù9hv5M~4F;!W4AdVN}0pfS5$r[=G>D<$e̮o; >OpdX~Iv&h>bm}}K^mÊ*T|tYyFG8Ɣ +fA6lƩ O 95w1_ <9  qB`XdU7< GjFt{rvw9iM.LUc7|/vVS5vauVoH!ת# zl~/g<AS.)2D, joX*/۸9 v".[/I6:Tcug)}ä!8{7% ,2UmZ R0兎$`t;hUWˢ9qLDj'y5n2bbP%}up~R,ݓs"E<+yj.?(Sʄ])-Wxu e EouzR@Ӽ[ y{jm1 BA~xJ' 1M<ʬF7RjUBjtw^&u0\{ؽL^F=…9Ş K(xDU#գ\#QLß/Leͦo&rz9e2fe}/ssH0Qy\}IUS*Iy}HQOkV$|N~Ţ3[vձ5?XMEu*6]Cٻ.(L&C,}wMwLDχ9vG01Y z {1fxҙFʂP Ǎ>~!xQ^SwqG896g3'Bedsh4CvU"t$PE=|FmXZN*z&t3r6;`֧愊XPbB%>U. akvY?y8Qu'txZ~խn~[r[.R* F5@\/V3, [r\oC7SaX3}5$#_~xi8[}i+#p6,؊F9<_$@{ (#_N ]o'svb!jF|M` MMk5bY ˹%G88v+@%BS<9Z@ OfN_-TPL5.ݿ$|Ly ]CrPTyۮE-Ŗ۹iivVߢ9BzhSXq%($os &T[%ko=}f/0F<DU1~S2RF+ˏtakAx{dC1Fc{!u.W /f.P:X=/By檝"tayA:JK HWL.w3)PlO_$-7ۻIrЇ{c(/4j]Q6T7yk; ]B(,D9^(BDsSю fh XF[-{cN"[*YPjLjAk <Xeĝ}qTW5zyoJ)O/&&.7i듨ݺ̹Ӵ^#r ~ۑi(~2jjRsW@yLh/(;Qy׏6mR;}V+ē7ʕjZdY;h 3 '^ RPZwWgw (ui=ker$eS|:8<=ʑ]QDvi򍐍yrr}kwȥoV23x:7 @ԈrJŝ LuѦ0 +sKWjџ}EnAED` bf·g 9&tl 4zaE6'8rT)S;e⯮# K]F~m>Wy 3gk@c^+ߡN7B#37Y'ȉy|V+u{-%.V|/]k*-GWA_$ח̠iCST\o2փ|=Q%Ձ\DRxˣ%UB~ #Y =WJA3l}I%0B YB|JO8q) F_'qD*H!Ȱ9DQ--P:bS: r|byc`urlx')7e KO*0=Ma6)P{]rp?KM+*|ܭ-ü\"@x Vu=){(݃IIGͱcHV;뇖2wf9]4WCڤJ4+)icYFiQޯ<Aٲo#xzGS{1 )WdH;|<MR V$ 5Q]SG c(u—Zc>d,%c"H3UDfc9i:24Ѯ]geO ~Sǁ֜EQͻʏ:sk$(ۀ4St taRfBMbnגćRANnY|XU" ]1#_Tϊ D3<>fF[z1o?$VcG[NHh$3g1lGrPX2ʽحT.xHñhCoIPLu30B8ڳBT hDžnj u<"ͿP+.G&ˌZY$A$נQrU՜ R5H\A @9,rB(WUqT+Az&j|ܐHgN.BB&T iΥ AN|Ka' Nu="|Kl0-ay1U P d MHbˎ3λ.sӸ@l<1V+#aFa/yP bO;N/u"_NUWQޘic_>`@Xvi;SR{W}o!ʳj nX/Ȗ^X bTpD!tB_Jk\,]-\9m).{c<.k@ƀ߯Xno쒸2[QJiT`gAyU$!Xi[:m\]ᔉv$YLoqΈ#!'Cg=e7S.{ Tm^y)Vx9$:YȒXE(#aXĖu6nJO&p`v:d&#?vIon9WULVr!~ jcO=MS$7o,/É6o,wǯ?/Ύ*5EVRUK$Ȁ$})Q+۲oms<;HT.n> ,}dE>f 6H8[bo,ըsz3XQ|DMl Qe~'8eɫVY[ y>zӍC̬qC+uxwM>mQ`0?o>mD\[VJQ8,N tB.=~ .W,/>*?ӔEAæyAEٰd){b-mgXec(2ΓȽ;BH7^OЖ.~hqUnr[kk񒝣؇(+gK*AVL>Ӿr6FmG(d~(@ lz? P]9j٭~Ăa6;YɼF@4.]Y4ȓj|nJ_g;XG`bEMpr q#\/Yṱm@` dxC#`7DL7-SՕI٥2/H[Vd/Mp?q=_PSB8Cj+ɟx15hjgýa&BӒdd~une O 2Ԉ ^i1,2Lz 5Cf<ӿZ>a* Ur4 ٣r>.n6OT~1?y lo װF {qT$E xlYb]op}.c~Dm,c--g5sVKn;j0g߽]69  U4ِ<Vnc]}W)J6휊`䐤9CHF'Ыi ؜1]Vxq4%nJiкI8T UYڂ2w "sT/o{_K"cty#*5`@sU#&y|[{QUuwZ=uy1sHErUFh)C ЅUpZI,~ڧ^,3PQhn$# ӧ mo0m:ipbX> 6ѐYܚjLu)|Y_1;&DB{Q3v6E'kXTr&#[/Ҥ8~{X?iMoܵƱnrq>(܁$Ty#MΦHܶ XÄqEŘo<d$$-.,1N$a|$fӺ'ęyaǪ\[zG wgF-߁M67 Tc*{&Tп??N<儻NqxfeBc cob%GGNoj ʅT݇(l'O#r'婩I֐UEaQǫZuF<!+NJ Tf.ʃB9(wjSG+rie%L!V`ڒzZDsE=mH4gV,=Cɔe`GS;l(jq%GVt8G x #jB -ȚӧSLiV".jV<"3OZx!L|tB<\" |S*b/ʹ# ?a,ozb .3^6L]ygQBLIȸoͫsW '.dҨRRゔofJ,OXR͞}7TM;MNl|@oI+3]_0|ߌb7aBmV,鋵t{5A(\*ֹm$V[uɊf e6hUh%)g]/zYIr'"{AW@G{I_f}ރQ9z,\ANp ^C4o*ΉxN+Yc9Õn=R'*;83@ףּXhִ utҰ_h"ttiI1Sqh9?ob3~-@5W ")ة4?,wUSƘ(⌟}P]jr6ź".J1AcY$=?xy8Yb~&ΎuWW_zz3W$fҷߊ9b>ť%}@EcЉIfS+g~Btn2fB$| V3qz `!q-^nѺ#m~yM S@HKRΉq%!T9s4wi/]Y*x4DAړ R0

$@wQ0ʫ7! AӥTH3HhƢj,oTz3.fK$n Z7gm (>^TXe8 ltټװ2XJ݁b\%.[ go((>XE@+WlYƘCI))zKٔݬNj_*(χH-Oʡ%hS.*B/Ȧ)g̹Ò{2R$#QJ]]˜cWƭkaIwbQ]I %2aۆ)c%em:[P>ރޑ_68+s,V he 4fF-a' MBH7rYAͤr7I nSSӬ%;d %AkZE^ۉš}ղm x͖׽?JB q<-SkF4ÝɑH6ɨقͶONP>V,LInMcN3s74B&74M[Z '5txdRRMRgv,/nbo8,xȫ;q;C&f &>el֝4V+5)FŽk\W{]:>/r PIJ츽aڣ%Պgp*"h гY^0{Lě Nlhʙ;*m1vYCi{ *t-M> $m9bIQ,U|qny6ZKb/Pyad~u P}zICpb>Qk4:]CIf׊~]m>} ۰HxP,1 &L(׍);\7 a0 !y]|L=O!FKdA9Fwmj%cȁ9"4e6)]8s=f096-/GJ xݱ͔ Q2`lcB5sq").LȎ.aB,;IM*aցDH*_uQ`d̔3d!ae+ϖaF?Du*L!ShJDr77JnƷOoy\9Gڬ n MQeA.6|  S!HT9-6u >`[˝,!Z~3-Җ<&| K%=;15`Jy|9pw87~m$-DIt?/zhL6 BGp H։]|B/aj Ѣ& pn˦(/W gSBz+5mGU>KFBp)}7bG1)$a X;w=AlwkOĩVSbϖ4#0`b ,mKu%*0-?5 tB}&(irnfw-;tpּ,@ou l!Γ-f{Fv*(($:h&'!yNO)(?}׀(-aFsT8w;[Tx\d2`N{5Ch^ʹ{&M B_PVu_j=ҭITZi}YB`5*S`"mxa PML>д7A{<A(/|u$ cFB(K zWBYΌnSQEp#5ʭ'85 642͔tjC2 Ln󢩰6vȟ׌H/m~y|Vp ~SX(T&bJ!VC:ˌ_.SZYP\Jfϳ8q0Z™^HRAF[{F}D$1r3E=_f`ss !tI)mL3Y|mWqQ#Ce0&{v' ԯ IJj* 1pEOpҬ"U RÚ່?E\%g(TF>񵴈es``qq?4zV:R+r6XB:j_¬F{;O+I`۬: ߱Ծ1P|}ã);hD bEN!O$v2h{.tr_]XAP#W(S?HlUuJ W[RV. %͉/i Oqv>xs]Q-OxFT}}u/27LdDiC׏?s&IdʵV#SƅLל6 O6BcGd*.)$p݀ m׸xWN_mu"{Wt5:cuoQ5J..r5kd/7*y}=il<>Y>tv C~h3Lӛ[ =y" "t ld~"i \_PCQ A U]/2|Rk:J:ɍ)ANREݪ:N CN^dnj7f0/-rs)ti"3a-HfdXzs~ɎfY)R汳`F μ gX50yV-`ltIr,CI6͌ܟj:$w 7g0P5e:Y& ioJ| %Awc ϼBl‡Ssdymsq~4磛I? k)z-Pd!ja?F@[Gq!P`+^}*ii1iN1oPf U٩&̣};BzXA6g6]zo-~kn.F9j2_@S$C Qkd(U_ _^Ld-F2fn̻4P^IDyjeQ 1ܣDc"t{2zv4ly6?R3:g*7x%`pZZ+r)^h>+Kkl.Ao߭iZ&6á:4ʟeb 3t- . E"IqJ{XBL=)&7-:Etx' % D50, ?=/i6Q$Rſ}dGJwΜy_rY5 08g ႢO# Y6>QtQ)b=U w2؉=T*9BRC͸ 1sF?CA A:z$PcJ#g~'F>ס yȘ4mmn'av׾gp@}s[vǬ#< ҌIH;h%Շ^h&}4]onYr 3]㐍 Xz<\ڙBء:,>qG?21> a}~S˄}WT:?"FrpYT|N?"zFݣUS,;%AŜP|s 7GVN`lEYӖ]S dCӱZ ͠! 4Q[>mb"l E|uxh֓>:]ݮ!1? C;JNkWW` t dRV$9&&HGc)a_P =hkތtd=HivGGpq>" 5JLJ} i@wֵٛM$VpڷTTd@LFkz1^x8Vc-`<'w}t,H;) Go~ʡLWmqI5OxA7AaM((E5#rPt%&Ѧz&+ymNDNݣw¥O7uzEv*>!RnƐ2Ĭ5;9*0rC0_,A(?# ߿:Jɑ,%ڧ %yW-o?־:`0H3Ff7@;7ĸGqzbtOXB .oo0To%\ ѾŧŇFX}ӏ?GT_e#th_X_<8&!QZz(=`L6 U2'{u`-)/F!x3agN쨆C'p}X Km5El6^n  érZS1V%E5w "n0Ma48"l 3ziiФK4ΐ'SȇԃIzM'OEMElKɼ ,m͍ՇXz@bԟG@6n =c(WИvePFE,tժ +rShvS"rYzqR:]bmC^V Z5{2<c.AfH|!Ы**Pf Ԣ0sÙcSUZZ=E b ܹ~SJ߬|4as3=8kM5Imq79558N[.mɍty-D VS ^Q~PufDLG-){ͭ7 M;YE*/YqSLY+M\8#D`DgJIJ4lVWh9,X~?wV;o=c:* - E Sz߸n쫾X&5k4hN鼻\.H;H< ÀZX 0khDv(X1pb];&Ç=~:gx-Bo Y {}  N]y,!ьu ۺ>sCr ,f jP oO~қ6FH.6d<Ď<Q؜ARuKS<{M**܉P.qf2VmaE{x%C@|/= aꭁ2D33ylYm;c?spAg<po7! .[!iʏ}-NlrW!0nW> ʽs6aGl~%$Ea:;ei uj/3DG^"-^Jrυ I~GI.(҇W[:^e'ߤa3.r˲|qwMج*%93Of#HM baֽ?+3$&$P U#2?š$HPO(h}0֐{ U0oc=zޠD݆IIշ:ohjv_ة2܆:~O 8b'nsi<, uzJLyx?`yh7]%qwAD\淣a ȫxO: ^2ahOb$0y&bp,"_.oޏR{@>`cϹS{A'1r~.W6ZÀB_-OtmGpVg![:>)ꍽu==J2%A;iV`y/(EW YSu4|`iE.܈U::sMN@hr# km^ *˶9"FI5Iz^3l!3qɮﲃdڞrO`v&^l։$,5 [슍\7jEtI][.ZzZ݃Lr^H(t>[HVI{hru#11ey|#`e2.@j#݈"qUHOOrxo+h%uk߯6k!A(˼eFS2/Xʼ*iw(8M,ȗ(XV5r݅Βbe%ba}SO#=$G+G}ZkvH5X.\ϫJ$0:A6؁?_yq}B4giIFv f63BT)P ԟ v߇n0B yk?,0 _sxޥp4Pc1 ~(KSݬL>"nH,<8h8Cޯ<T 7o}e,jH+0y:cLgҐ>ң&ηo3) %%#L):r!FTe A?-P ?Px!:BYd XgF<@ fcIvx- Aa ,s Nꅻ-iYE "fI)6& Rl p[ 񄇁 uacH9ھ<:[:'jeיiy4v Do-J;񮡄+i`cAo$NM%܀BIK|蚼JI!k[OxvAE]r+5BiUJ| RsPf`G ͿI '*o ?X*_ag@*ZW̃?;x_~/bCXO+> kĐl/h\>5Ϙ׻o' A໪$mE}ʈ!@S1m0O8ޙz#Z/ӽ9liYruG &z f,ɯGp:Qޅx lr>lL/ R, Vi9,iBИt$${53I(8ʀ㋕yssofɣW3wTvN|/2&mjcY Kx8YǞ _8)TP1rC GMWaz: i-0DFb>h  m%֏S=s}"* Jl}irRNDceOz=l;2:T6q*ˎDRɬ9(R8UNJWvm.%5s,U7Wf$_ EjBc9P|i+g7xub#s+hW:]~zLF2v Sپ4DX;ց۾ӆ<^0mmJ'-b8Bͅ+B6O[/er_6**&ht.cvs1Wc$qc6F2Gb-WOB/<DŽk`w6xpFhz]䄡XnqЦ x]W +5JGmE ,Ozj@owC P<ws~ E&cԎ @$˙7Pr;qr]"ދM̳E҅-U ПdIMz䍂kD_ }@WXZf̷M!C).2 ?l$BW4%O7 ζiPp2l; d_X-FPQ<HYJJu)Gczi*7ӻ[b܀PV~KhB:/EHGA T'+ԕ|H-[VWTC/xф.M%Z%MyiΜfsC+pDJ)J# h1vz4vqmMhmpD!#[ N4|r'H1glv Y'b4>aԊaݜ6VhZ%FC3WP!s9Kabw3?<0VշR#_:r~$f"É`0#)fyB, "DqU'@@bAq&Em8.?b 8|H[4kSoj)ťZ ef'ziWckRa оçG{+3[6Zsr{ $=y%UTW]!P&`׻@:u8쨠 bܪpe:>dhLsFEMFLM[hqk))Oe_ùԢw_4ھH譛{+ZԾ+u?:`DYMlb𐼗gC_MB0.y5si14GBYS?Z ƅ$5O6|X&Nk'ervz]4%o/|HFn_(v!砇5 }c4$cUn<~ȉNqn}57,eB+*oﰞcAݳ-+AKhh-8]H+'+t >ȧ-m1mgNĺ>Tv:Җi[E bIxB]laeu 0WZwEaH~9(hEPHH*%7Zݤ Z]RF)CH$踤r%cJeC|)2E&Owoo٢]Jl$30p ԽPY&ln2c,@g5k5wp2eG#R0SZ7F:xeR Jj;pS'q NN 9 @|^My="8; ~,|ͪbSpFn%ˍKr%W<*SY6-TسSūbGFAHKB?@Rȏ;7Rz ,Cx7Ǫ]A-|uUQiz FG*2cym.6X gKXcl>Q%UZs#rbWAT+[J3%o?pyۮ,Wo?5ɵG*XO+j< =),AJȭQkף}DpFM85#,!"3Jjas?k Ő6Nc+!iKla~.&}ڈK]\Y7Uke¼ J"7={Y 7l7=[ڛJ$t2岱-@з /5m=W!bdZ[mI,ERQ nIXa2v]-#xo'_|d .Q cwImSMQgM`qɥǽ! 0F;}FI{\=ؑUðrД=NfPHFd1Vv_\,bO|WK90s#fVm2NQx_kr**r]uFA[zA$-zbǛFi;!HkKD~/lg:KbJ:jUH9"K;Xx0/6G߲*`\ @ :? |"ȁANT{62hwcyYj6NRY&cT0pkօO VT2D)go V6@#Iv//P @83C#~饷yӴSMTŸz*[ESl8?}EE?]E|'' P-,t:]]`՗*{XNʼn#)GT8 j\wZ~}瘹 wA] ަ^khP J'A1RA[t/ˮ18^}[ 2VWo 688t=FL2`ow0_3o4zīW Fj+F|7#{djt ]0PȊq#_ urfuhȘN&ψOi#H*imɦoE1  bYHxSPTn'NNʨ\%I`43wSЭ8\ _NHXs^e|0ՔM٪y\([_nd3^e 3Qɕctp!l \}ǮLA\8,2$ֶ`fl7/|7JeCм*S7-ۭT}+fxH0!b8~i(aXޜlXU6q\~/2Bb#iSPCn>`5am?WڷyKvdP#B=K+5zBM[ص9 \ns*䯐ƿ tDPݫJ:W GKnl&Fp 5wtL#ۑyD`FX5TRyGxu/z={nG.=J4N'T^PV/5lH`H2*bT블 MX/z.Fmoed2 3pT ^ E}}<^VrJ|_8&tDp쒁.V ; 96B?gjPN`t0g'Xk49E?^Y]R^KUsmf7FAWHU$NC8k3xS1VJƫJ)p(z!g-ib J߆c Æ۴n:ϧ5jW\A'1E'DSzl ou2UӾ$D{= ^̦צּ!i[IVIL APgDwg8Hi W;ء ^w;>-Me ~Sm)\&,A~ F)HdgEwE$^\x^Na[au+xxʥ6C޷RHBO/8~H[" хSǖOMhqq-[QIc~z%QŤ6>֠ޡ(AJMW(5;rXJ~qL9~:RWםE10nCUSS<,k;?VHG^*6kHT>|2b7HV{t>Q {5VK}ƶ2Jz3"kD+8% 'X) BJˎ,K*|v?@^Vm$W~B 7Vd,X4*e[<t0 Й!7`2Hy/VFc|Jaʛж3w#6V8;u7׆x8Ou.y8r~NFAJo<;v ۙh9tl5\{ m/q*S?@G)@'(i_:@@ ѥ#9,;QzYIU2yZՕdnnK en\얪hLtUmA~ngmd  zmtM(:t/H%BZ"imK-ۥ6`{U\t뾬9s.`.pՃPy,UF {Z+TxףQ-RAJ)Mrci;s!(m*%~:uP+@/SaծuqD* T+?w'YI2XϺgjB9Є$>ǬN l#<=;W=zˢ8h[DkI]V򇢾{&֠%J|Ugx -{i%fV7DEFjӅERΒ'4櫑ɩ1dɲ5sH94FBO~/FT_y E]!*MZ7`"sΤ$Yxeu7r{ %ID)WB2SkmQ!!Y/%dZ$ T[H5]bŒC1 adm 3KVB(T1 QpSwfFXBu.@9$^d(: Bn1"`β2O-@`68j̿1}48IAiKC@?wLZɇ[-o58ߨnyh8]-X(}'K]QY6b;mѐ!JR q0t?x|*u4?q8;ŁqsLNP'R3"ލ8I|2A[RKYE F-Ҭ<豰g6%W-vU,=FL'~z%ˤɌKnuf&æ͝nXEQNMc3IOPݢtGYSܯP&1=ځys1e}:n5G]}i R0sfj?v!Zao~cA|Ԗ;5^Cvn-슾8~$!xH3ClTSab|/{a{Y[&܋3|(6+u-WQv Xi6&K<&J,}tzUOv9A$hYT-z޾>`*I ꜝtX0,A6j, f7u9_wStM?dNz>K#v؅1ی< b(Ap[*@gx!ՀE{nlCqf=$E "äzuhɱ.'g=,xMlǥ.L-:~tJuԗv➝j.Z;}+d͌\a^sfc^qً۸ʶ/5~E(W)Pz4?zM ws_Y~9'O`>C=H =96ӏ: + 2~y?`uh; Av/.Un~izUwʳշ|eS}9.CgS:}e+۽(dB-}+- y;@ p tiӑ`L 3%~ŚFq#onBz PDPվyLT|_v9ϚPWIr]^~Q3&'d8Ay.b9M[~X<lcEL]u]0)UiROQ+Aʵ0KujKyZ22i<,>UTEV/WjfϿZ :xCRa|BD2*0pf/5ZEY=b: `_(=N R~YO5H輌Q(}K ;, H;l~Om D~5I#54 \)6tyxjŽ-tD g ltwy:=r ax*k!VfJ] k loCߝ,.'ii" J&&O :g]DK>fVRCwd̂^UL MG.U2n-GspI56ab+&g@UQ1?2R6U_U mCZ␦=tw'%ʐL}Lێ:zJҽ&;<^dӤkyOZXjQ,"\7;'8!MxusB\$7^&)]33 ~T!CNLeqIjVXpg->h?l[>KUpj' ВmSMٲB \Yqؔ}0?Ek뎨#396Y :QEe) w; Xu%æaV`nKu<|DLH&wj m #2N4ʹ/ʔFB^?$kd4:hngB'7ًK5_#w> X $#{=] J)$vatF}-7gLסҼ$rQ3 ޡ',=mbq`Mji/.Et 3=-%fnMJ '8#_T=OWi $`!]?gUq0>lH{J+ (dVWX~u}&?5>ܰձ} yQkAk/!ymIs,%޲kn;U{iyP #4uoޠM-RϾQ k +n6YEpOM0̸4F_OYDY{ǁSHڞs<6ԔDžk-aRh5o7iƹC^ts TӾ_aVf(DI89F 9d@؍qZRz|kd}Voc09  כhԡ/J$ ́ɺN~臄 N#F[Ht1$$P{ qN8:{6d|$ 6,\p"nV5S s'p㰮u0C29q DFXXǚJIQEK,JuQʣy&c؆aKE\x`n ˵I2ϤO/͍+Ku/ĨƘJcΪ3Wt\`a'(%~1AݎG͑q {-N˝Wў؞lzJq7*_AЅR zn';߽b  2BhZ('Dj6BqW%[u8 -8;Cw,L9AI&S)%ФWTfţ3 V/HLH"Aw ќ@~== ,r^p C^ f, !.ܭPMpov΀=d“d<jNBM/˲!?F^s N K΃DE%baꍣ+ic pTW-9e. !BJ$haLR3 JB(·u`fv-K'foikw1(yϮQ?0p" oQz= -:r 3I W~KT#, {CTz<;h40j3lF R5() m}7^^:%SXTi.fr&>cELȱ{~pRQ{d,3rӁPKץdu#t-\=d[ՌJ$3g]w{T@sNs!b1 Jb|DHYdָZa7e0wUS:vCǚ5Hpx,w\= 6Qw0U;P@< a"T t%h 9050qY2'dI`GL݁ih1F(o4eaU*}_$dG,in-4?Fլ<ڔhه9itA_ߙN)$#H>HE)x X͸{ΜE|:"0|7rd w'H/1 *'ty4˔0xkEGre0d̨pEck1V^)X l5*8{Lp *![7LD@F "7:RU~dD\Egrlh}GĦISąG`1N(Ȍz lu٬A3Cr/ 3=Mw9|NPmu,('ݿMGCGhWa}hm2_HOl̴+R%0C8ހ4zXj9Rrr{UiAq!a" 0,rFsuSUE%>8ۇXo\YiTHBiR󩌓"23JL2 M@ր^<>;θGd?pmPV"ºLA-Α=A8rTqD"v+D<uHЖZt+(bҊOa#K0YQh.l=ˈ9KY=+n¹)ᤨ(_V߯Ҫ'ON.۱6_i ~j'85*Jw_DPalv#Wtf@'hgRi9E̬“3wJf IA ;@9 ?5޷B[}V0ev l&ZgNYG];!Lͪ~4)uB/뾖UnT`ߦTQ ;S&V Hm |w-$80+̚54Z8n  jBrp⚩n ^zlxAj8 ʴ vR1gmf 9+fC׽h{.bp14rb^ho?]0WwԲSG =F*L?Epa%?d30XdK+:1 J{bg4H@1Է4+˕ %P#rm3L!+.?X@W]~u6&h;=]%Ev,J 5-DALQi`RjV]}GUv:LZPLv6%+{0[.L! !^پR_#x ̃%f(ck~ep\Xdv kʰ: !c$aIޏ-J׷؃`c /pss';DLy ,m~:zGЏ%$;BR% q|M"1WچK,1EOԤf✴Jץa:zJ {y{'Ag?=8&5,}Đ:O"dx_ *{鳃F G(ğSO'PHTjJ`B$Iԏ`G;nl<:AeCMxPl=Rba>Ngʯ 1>x|7M<dң^yhE{bah5NlDsDEN@&AO{ƴ6m{dIߎၰ8p*+ ݂x]'#ms LHL>RUw.bVWNCiXŧp>JY+a`dxTF3SR$NMG5WDMdYT䍒G틛{*@rd6qQMN\=298bB#׾9$4*pgl Qd^ Qf5A_25s-`P|nANT xbUfYh ~պn2X[ /egD_o_pornoևOSjm3qB`NSD'<s'7haFJ[AI:*OTԬ57'|/6^il* ]3b.yq٧7xS)5Z%o=&r&z4?!AI&S3EY&ڭ!HN09~m?m ^`"M/R` pE񐳀E{yES)$LOrl=#ԑ:; z鏣2FZDR$C憉/B-uƩD `оjW ?~xRz!ʓ%yC(,CFy_A}׎s%Z+V |!pyJ%-Z5vʵ { SFB:ҽf#u(魧feҘB[ρ"(>A G,0݋i+Kc],L2Nh*d/.b+i߲P1{ƮeA66/O ݧO$9qcBrC׬"|f(0+-RkqZCf4M?1Zlu/t{>shpo\5"trq.~9X/Z,N1~ΙϪF_Q_ae*[WR|i)tH!^LWP[*6e0 uy31U/-(M GV۽m i0ʹf_* oDŨ&\7u鳇RR̨ݷۅ7/1y{% 0YwuyRF~AG)dC">=b #OL"Ҕˬ)7cd_Od%b ]Or~a7RőMj5 |Cvj_ۇ‚6xQ7-mڎF ! 7<=N|ĿǓGz>8Cr9α+-jk|?%cP-I`m]0+N&y d=oKR=;dtP>ejD^*n^FhvNx0( 8 f覠`>st ##;˖!x [2W;$w_ U%w:6\^`wi SԚ6hަT͂J}f۞~>.CG g I?SԀKuN|^65)VA|}:wч<IݱCmA_Ivԩ3ܝ |vJl.5a{;Wb6S_uɩP czֽc ܎>Fro3yxxF){'"5aCʹ[dNl2ZցRŔpꃴTE;^W1X1^A{p썀/2g+OMVpuȠQz\L; qӷx~e9oXBiLTaQEӯX-]RnI+@Tn׹拁Oc2 d]nΖdzcac3"&'i/;S"s \NO}mDWi>A"ai2?>UjK1䧠I(vχ` VH;م"NFpBٛ/l|N)qF $,L!Ҧ]8\u26ĩ QL6)' "k?J@T@O1~0>9A[T®F,*>Ψ<_')= P` OZ+uԢ+y}oajak,XUCq\]m=}f- ׵7$s2Q\kɚ"l/eoYPj9*LbQvBɏUL5(`|"sT_#mCHumbG`T`}gjn~ "ρhR(֟U3swnb$&yKM5i]6[/gס=#Z|m\Txr4͜wqgkt]<*w ϰb`_> d,lYuZsz\hp}v0<[r֨LW.6\0o<ъ<`D;u&f-dli{C*Ϛ=,\?| &w*U1Bq9n&S a~>Z 8٘2ؒn}+c\Uf:%vĵ`^=oeމcd'ߦ^\&N&F~h[piTaku˪ӵ;>E@e#wꇫ t8e7tQI'>.YXOJ͸\ss6!:Ev'7 ^)FVps]rnKhLZҴ߫>&׈:yee Dl"%@7S4Vؚ겉,AIq$W!˳CðK(ԅD,E^g1zmgh9 | rZƻngO9HP/"dk)iB*Av_O\lU6#H!AM؝7XgɻfxOhw8&v>ÊݯJ"bnD( cfeFz?b%#Cc:uCr]]"(sZg覔 f yqeQCfhKTa no/p;35OOO Ӵ&aIؚF5d X [ce+&&j6^(q݈lc3.lb-pRD:7폌z0#;M :ѪlPnt>dI05 ``I؊<ÖpnڣjvBlXppɏK`ߔIXfYmSZtШmtя$zU-`Ufy r%8Ng̥Dϯ.:yfЖ&*k{RDs%4j. GF)uOiMu46AC_9m^r!֥@yRsrH,M h;Ѕ/5a(K9Y h6 GC3%" W^y38Ou$` PxL7wp?Ǩp} sNPo&~LÂ\VX4Xc/ &uźw)5'IU8orpzvԍ}}‚*HMRmo` %-#Z%os1Z[y9/gg @G4ɥ;eދJo# dQAŜY}9n ͗-:>0VsL<T=yc~y30l1~O.^;+̜lڴH7 ,u}#fLl"@^>PglZU}-)7@$4ٱTR~nSuݝINjkvϟ3Ri9Ք5 ,">Gf꼲'#Zy* 语4܂ܡ6_v*d D,9: BѠ(HMxV=+KrgÜgb S%}'*ѣ-a6ڣ*._4)hK4&b {Qw[ӟSF<>ύNbB ` 3CelXƛ0b\!_i`-M~GAI&SD$B`q| H")4.i_RG*+< wYBTX3' |JpZC*<\X=|Ve(X1`ZpN6|!<>mС\#cX9tN'~ZgJmQj^xSXwV˩KBϊݛ7'JbƑ[UY n4P9I^{Ef(mr/vg&aX2~4l0 jJ I\rx;:"U*A7_qDr礸XCv-qE]@_EiMFxyOс))JPKG"0Jk\6Eһ R3aq?_D}d샌 ^d莶=?CbOGSH-jdem&H.9Q‘7X}_ZZ$y F6Mia[ʧ2OaCev"'/eyUQ 9. )6%N8n&ɨːS5ݖyu̜0!.l{R˛.Zu=e}$ \Ӿ'4*ṫL֡+ #S!: ⟟ic FwXŷ}4ΫzR.{XAf^,w3akWA,D+E;gQ`w{S947$_l[//z =7l> SG)PO*I37OR&!19K}L6jxKyQ˥"4F#ᜐŪ#)_AB ͏pۑlgߣ^_.w"@s̤@#mLPjQ~K~[d"\` u"$EM^l.Z)-#~Y(gSX^ddg-5t(fD;hh/:$}҃,$˝0,l8^>= q3P0JZ\El_ԀYK5Ac8d ) 6J9EeTPMy-8!",sxk\ɯH}hwڀu_o~mlM߰dv->Zho0t`M,$/w T j+ =D7 mY4V%qϼ^.q_Ovz%b!1,4JY*b ]бBB;S{Kڀʲ*7 `W: .A'-`42y2M:!}ISŘ}5ƴBp"6~bΤzcQ/Ĕ}pfRM?icY=eZBx+ǻrE!.?\.4 "?{r fYUL M1bFl| ;XtHX%EwLܹ1CgH {Ã%WQ2Խ6$xQQHL'C4m푨磟>ݺ/,fcz2*J9g(s/|Mx;}U7ᅶ -1Q>ԙY'Z4nӏ#T)c|{ۀUYsCbÕĸ1^<tp%-/ᜇ=:@p:C~rO9j 2hji 84r:xrS~h_aM]놿o _p5;Qm>tc}</|%@BXP)~ YY ^ i3ETWZsY _s)Kqby)<.Z`KL>inhy.G2ycn)|ONT#NI*ڜ]spGԩ{ްmRMcdu 2%Q٩ړbeOZ*B.i<( ePܘ5M=glͦ,1ycȃ^x vtt,DCUŕK=냽0mrW;ke7EҹY[$$x1 ʥ6 MQ.EOoO}mRgzKK, J 4oXK% Foo(0#@yf6a,6Zyt{X{ Յ;n̫q,L'槍fV1;sY:lQ] nk-c2 Ar_h}&D!8T'Xp&5v^u I ]Ymf6il]C^ cB.d=5Ϭ_^f ndE6gΰ8I7`5@D=04]&&]oЗ)dJOGxaêՓR2Hڬ2]uflgd3]W}R\])f1VQ4?m=~p+ MA'/_BoulT[5,hJߵ8?MK{/N6~U~|2a}oܼ^~duR /w6æhpy^=D{@w^^U"$`.c$-l j whWײ]>\Ln+aI!nQ񛢋n#wŹ+(QLVK`MEw=Zm)iN lDoҼXw=Yɿ%%0S$J;[噐]3ufSYU-ysA27z*p K$@NWSGדK&OV,iXsiaNᇷX7ЁlBLt9"Y>U(J,E."1.ڒ^B;c5 DAL#ݤA? ^)BbA c3JL]66yZU-O;Iɟ bS1k*ɤ}6ӫ<p~_m@/}) vC:+j1߽AvO)Ny4#(R?7yC 4Êlk0²kgTž wH <\ b!d>[IVTL}_vduv_XleikV10p/*8@ ù'$4[#=luȍش?hho!e-uMP/<$+K9GsO[818N#:`OF{ؒN酴YjJ#%>I[m̴oSEc@:j\QSu9Ʒo0;SM }nbgvgֶxNyz‡C-,9 BEBP黛Jy%^$%%=uUՎۂ=rW=1\Q[ЗL]$qe|⚕i{Yk]W]fF|ۼC%OG% NbLt})dWkq^B3ʕTF)nZb$ @v yfC!TQSm5wU^}ی})%WiݑiPkog.4(aKx枝:DM!εܥ]2>ayz0Ҵ8ilxAI&S3لa^Nx썛X!7 ˀFM{24w.`8oq'gc!y$.'AsZ"*!~F3Ň8J8*pimv3KmIN]a2g9j,Ρ}^d!vl;=?|B4&gs~N]%uk=7ve7gfm0,Kl+)Y)с g[](T #-@i!TV,ۛҡqlgކ] :UD$dekžӳ=Wy il!7֏a 1luޞg." ϑ_]ܡ+wB`VkŐLȢ.?*ͬ4 bǧ ޗʤ7.ON &l=npH=X\btO$Ļ3uyPᧅa^ny%vU FR͎V<* pnZ&! n"*(6sʍF6 ž1=]PR !E X_jI~x ̣܋q>-X/AV5xIA e_^4Này СݨDxZ~MVx\̱c~>D?C+B!k]e)V-%㢤[DX9 κ[3]8>Ѫl׋x?LÜOکzE%M\%!~6)~ qj!mOx‚ЫcF&86Fo{♷-m &o S#$y{pP "L,:&ޯY+(w=.^~O"JTqXs[zd'#d5|fqrX·p5K+1I1i j0j:O9U f;eof"z#&7Wc#B&si U8ԫ~i80 6ٺrJFX߰DW(39mw:U!,vR׹Dg]EaR֑O-MϨ<*s9{r 1>O0\Ss$a ;݄=*XIϋL0<ڢI _0mDZ^0$ 蕩Z9G"$Ӥ 7t.!eoik,x4 [N#>f)YM_\ ?eC06 Y/p 4Lc]5˾ #. >)>10t[b̊KV6t Mɿ!7:*^S\6)K͑G`hfmo7S纭4iS6QW ĦOa͜W9#m;I^@wfnu_+bFЗl5:k~7UwV$#`P Ws pVq 6~isVL2+F6ĄtwA>9PKNq*ϟ[ ZlM\ͩn\0Z:xըb1shr0t|;stX UvF/EyiPU֥Q__J@j|P|+w\lZuEX[JgM%'I׋mǤnJzs 8G/kqlAṘ9QrfD[go+M!c ,ֽn'Vr|%mrN؄{K !;z:;`Fd&o|?x §|F哺8[.!EfQzlap6:,\p_N  UA KZԐ.!֯gЕuK/Ǿ}$>sJ1 e(磱\.-axQ|R.dlʇ,ǡTDVlgbxLm$Yam!`>4 ɸ[vn|J7'Kңh+v\.3>Xͺo(b\2ƍXfTM? (nWF_)T [Na -}RH^i◗ D %. V5 "&h>׈)ivW(yJ0ww fatK,;irX2:'P %c"T )==k]˕< RŲu<.XA 9Bi>"?콃w/""}g{s]|f(RG`T"MHcŶÙ811U^D@Jaqn0t9K\ ]=p(XfߪX` r/``5?y|ҒY 9ue\;@r&}YT.開(=0D9+VF1I%H۱oraƗՊ>U]ua*$v-)r_~$W@25J)U (wZMEvi֌`bsdY{#Hʀw ;jl wfPڶfے=nү2耛\x'H{W\IQ G/y(; #H.˘4ްTy/'0,A 1svσ|NxQSJ$SkոLESp%OwNs;Xo0i1#Џs;J ; 7="63jl+ 1'HnBJE=uD[0k\m0' `.K>& TC|/7Xf!\=iѶ!o|?rsRoW2hVu`W9O ~96ACp?7|g1&+R3-1K#F/eQK&5 Z>KPRÅϚݻIj"G>L 97~tڛ_~j0m`hKkV2QHY0P~jW'<_Tg(YGPTXMjQ g8KvU~} g}6GB&;l^0>Ei|Iա\ހV P\s6^oq||N >F=o) BZ!gkcUU3NqSPfð,9v2 ǡ!!k7b$o[fPBX]DFT7ޡQCda2G_zxh:$2Dګrn{ פuW"7o_+J^2XQ2fTզgI>X'U ?"{5Bow+ʎ-i<QkDR uTdK [\50ՃvqSQ]Hijo >=m;.,/SĤa?S2sv$AI&SXsaAɒ׾ueuj[GZweFNB8~*/u;dJ7^]1@#8blgZOK wx-bƹJEz0z8i[fhTs)Hl~04qB8 XKВO7FVz&z2+QEWT=_C"/C ]_ ?uܨp5̖w.`z|vci3f {Ar-0*{83HON[Bzxw7 m1L$"kJ p1=`Ђcu5*<_c6ͭd+nO6YdѼAS r:昭Ә`ͦhޜŸUl+6)tRKcF?5@c2/>=٫̽9]aD5fdQ$kF {" dT1rH~,ش7F5qއ$B~qh?Bebad\b_>ďїioo[/̖"򲌟N,ϟ%-Ωm˅%(iWѤ &pfU舩4%×>8 ʵDy6~`d_ O{+|(.xdkfZ+tw@:̴]^fP8 1g;g'K/$IJgm6rtК!cOz~O@ǎ|{Jn#!F#QnnNWQN5IBؓ>$]}`7 7MpN*R8<ġȌ.}>~h<˜cjk50c|##b]& }l٭|`"뇒(٥ & -Hgɞ(b…YԼw쵧 ½t5L󮗎nt.f\,UQ_WxOpgk :i@@eAX#'U2e#E 2#drtXoZ.z$`HO ?,NapT+W3}y. g -*3["AkD y}J0iz rG)=Ga@}!I]~5_.a:~)N 2tBß  ]ۻ.Gwn9&kVmwO ToDb\r-{3-/Dt[ ^25Q4~S\HƦk𵪇89,)TK;^rEZT N X)/fbYn#.yHTF;bw+ ?߉XbNS͠VSi)MgEُڤ,șz\#0AS-XMI>f*!(QzӜxy5Órp[Vi2NRN`S7,N\ȧW:b=Ue2NUn`5fd U ƣF/P~6f-R O̷h&\k[MtЀlc%N锋J3|X$;%'nRm'!yOn~R}ƒ)gxwU#[mY]Sד<5~EK6S:,{9{gۈxG1ϗ;kC7*_էA>`X g(nG`h뀖ޤ  [^OcC|QM3pF:6_N]@ϞM[nE*fŧ=%!3%&u ʶ\6e&g17[HXMi나E.,pR YowHAhV-ˍINܑsP+AA=Z&KQc8sZ+2Р;ŎAqsb'tH^nQ;%_ksJ)["[md%.3~.~j t#&ɩ)<^+&K {kC:1fK#Z$B*Cr88,̍#*Hc07,́[9}' 0xSX6,wby]1WD<;]GxKuuG/2B%]j)5S&ƱYF>-B[3O_3?=~QǑ( zPFT`ҊYY]O~z>!UFn=H2;ڹe' R5`# _iLwB/Q ԧ[7/8'8}s?-jr3+Vќ%E]+ߣ_ ampy{٠>r;;*w 2O,iv$WRN*rQB P/@Uv*?ˍp݇焆[|;"d{ة.`ݑH*̓a˻ԋrp3ɓ9/'00cj^ͅ;=맘_gbz/jD5[Ў73 ,s*dChJ5+LN9?5f銟MhA=2X%^|ֶ6^C: _oz-5TuMBbPEr**l [g+v-.g1 {bJ)W#?܀L&VGSؿRXnF)pY_IyCd)!?n\:9Q4ٰ1]dv>?̑@Vī*>x3 t@];;l/4l*DtC"Sq62 2{z^Q rqKP\}mrw&n%T1,]@:$摭9K} \ɿt r=NrTgl@~9QK JeiHP @F_!g& Ce1:1dy&y" ģ!vk# WϿw. FQbV&nd__]Qqׯny o:f;I-K+%6V -yĝ:`neEIQMQ,SUݣu.95 @IMnTU.dWzjoDUAIo*]5&Z'śG{ݗo5t:G}]&9շGzz\y\DH:}+_J)8BJJz&BLS b@sʴ=jk[΄pP?ljW7x$ahsbf m2=ǨKv33n/.yVvYg?( n/Z,?(alY =FŝDeVE;LN>aj\iA/I&So DSmxVrY JML8k%: _+@={dvEkWI56c0+|*eYQՀ#`5IO8nD߭wf˶kZVcONV`>ʃX*'~kHh5QjzzwM~Ńsu2`ј`un1- ѝ~Aiz$FᄻrjoS?^Qr \Uk/A.k|=K;Ip]zdJIVlZ!C)ڌ:ZQ96p_Rd³XY M=+!;I>X 3-q]ks@c᯼GubDRjYN Nc ~30.墽!Nwƙ;nVQXiF'(~؟Nucw٬ْ}5N %k NH,AS.UULOι·[/|̦t{ǍɣyqQ@voW܍6RGн\ 0ÑxbI3t!-Sx71TÀi `ݍ/'y|iBhJ!<X9jw7:|IcJ= H< Eq"Ӣ;Àm3c)l3f7] =(Κ,q;ܛ˫ى"9<_5U-| yq2+;]Guj0k~o90ĀQf3#fS*)2f,}E+#}ֲ^-R^Y9SCc 3\omA~.ʼn:E85n6[_t0׻ldrZ_S(}dgr-U(,=iVЪ*~y`Vfw8 i޻E )TXD3_'NTЇSd]iu:- x&Z`g˷E+NqÅor9xzwTH c9YAp_u9c= 9ZE-LjB׺ 7}ˠiQɚh45=wѳh˖ U bek]{ k6y&h9_# X:wN$BF+ H#I{ sUA)`o'xdfKJjhrG^& ^+HDLСW\ti|R:ͣĂUa P+TPǠcl"IP@L#.čM{~h{.^֖acQI") Ya '58Z]qj cs=/o Kl9J\?I cĘJ 45B$}$HkW:d CBrZ-bPƓV*otXV(C=u0˰2"{|;Y--EpR`W֛m7nPQ%E汱se |r6_%xڧl*h߬+T)\>nȯ82l`tS~sզZ la4Zb_P=s:]DZ)*ʒ גm_+ 5j0v߸zW }q%/Xu\[!dm͜AhDpNt<ø՟cILQ͌^&aL\n,}CdrpGm5Qp`؟S6A'Uca '@+dDtT;<*In1Vym{PToyQj@KY{9b$dB^&燂څJlQ9xy?@`=ܘYf$fSKΚ2I?j?!zRqAr/VɃ$,a DKFQ9Luڙa{4V @uk_YP>CξطfyQ\DBoZI4I1ޞ,N*}1m $ #Z']I0/@ bɁkr4tۈ-~^ qD=G{ s`~X:H ^e mm3 [rMrsv_g&bkorcֳwYRfH[{2ICT= #^$dgl`Ni#uPp}x[@ ?tQ%WD gMei"^EN"||d"h*XX2r8ύ2}xNmDh|tN qt( 29m ZGMjA^o02^kGPakkB ĠW7cPN)V) h/~O!lVZ J{a8%2r"]/D?Z[\x41ԁE;6^Kf,=EahӦkvGfdvIMcq9_ʈDX%~ Gehi ⦦vD9V=X&$FX2-kF{syԇVuK'E/E w8 cW} 2\ZIJCFt.vj,f0=Vd!CV;#2d8rE 2L)γ OEa|ԿJ0Qa|cpbld&ՂΉӄc#fIzϳ;#WYalZt&ZsWGֶR|8K?&`A*`&|iBZ@!K(wi1Ҁ_9{xef[&gܠ:8V_<],Mc(hZ`97Z7-37u(}/tQPYWiU+,#j躦b{LN4H[pdl+%:hyX'pBD@1b9)jr9g-}>P޲tɫ;we)G=20GZSxg&yF[C _p14$2^Ltoe}ґD!`t3=iվ&qUY ޠ6a%!H4P sΤ`sV/l"C,>_EFQ7|>l[\M-Rj@1g[Ác1BK1SVVaZC;7 ̘pis?ɾwou&adA|Uayw [w7NXOIszt8[bdFnvYt_~s>Ir|(mLrd1!2,a|ZEQaSElmfUY4 Bm-PR>y?P -Q|.i{16WcUMN#I@ 01 : OGzz]ݎ:E'M'|A>ܹJrz־KQXe(n/mr'equ\vLŇ@0'0m09l !D(2BLw+MpT&L4Y@]:3<\[RKd:[Ri2i*mX|I1e^xdrL}Ȉ#70_:Gbo;'Ax*W>$oGs`;s MnOnWz \&5A//FReƉdk焨V"w)ZڙsOjj<Ȑ%8HO'eW5?mܱ_~Դsw/7"hS<ԉ"AQI&SuI;7۠oTr3!% S.BBsu mnydԪI.&ijq.Ss[{!jX&}]M8ЋG8eUt2V2r7vlT4nN>dy~TfWmfBxD`P7\i=iLٗ"xt_Sn_ku JFaGL/==SkzXvYK"UM-=remG J[Zc*ucԞfO">NPb#Dȯs/T 7Iaÿ+8|#ŲPI;WSA,V- @4u~l-B&u#UZg㴮T1a 0ꌎ/U2ϒ, a?E mP{_ +v(I=ypΗHa*ǁILL1\zeG(ۭ0EjIb `K,q}6?>9j5S /GmOQtPVl%+⬶,x2nΎp[Цk]$oCk̂4g.nLQ/ DvDrn3r'RYz,Vm3ׄ~fIN!O@(v AC\av4ua\S], . P.s-:o/2³B:$E2\z@S;Hik[Za ǎ]9:Nm"AOLkJ`7fyp>z~PmN>İut;I$I93,gcT-gY5@N )T^ Btr\)9-4β5֒U@C0Uu__"3az-_0\a _y+_VOFW"-p{oVk)AlމN8w8"$[6 Ja?SUx 󇕯-܊hm2:am콏_)n(k*)>x?A+Pf;.FqCa.|-1AN`:Q6ʪk2KNDrz'iyl)Pƀ82*)"K:L3) msM˖|Z,{JVAɼ!yA-LVm+lI%T|dSUPRENo5f!\|J$kg~FV4+ٙf{Fz6f.]~<ʿ nK{$~Wiv< QCB'k: :YZPB{J v ފ@neĩߺZW 6tc7؉1ZUb ʗWK}s/䲳ֹAt.ڤ_>yz?Ziy;/?y6[װv՛{6Jh<&yii;g[P#5bn0Xv6mKKsf8]4@⿱y\^:a@aŹ.mG$Na#: oy@G&F(@'!}ԼFKq3eM)~V.ayӿ貯B(}dbqR-'ݘz zD]ƁxB^l] 6rRkP7+[pmQ=pfdס?#c99'Wźnf`T,T1E^tHvXؚ,VF{k8[u P c] B)e>Rboc fpZȣD0ҟ:-V j_gS{)(Rgoit63^5Ddͮ\4VVDXjD!ov @_tjۮZlO9T3q>!Sy+솊PάĞP>I`.z{n7=p&ԅk6*?RXКe'dkq]+|%|j]/GL6V ;8T5E/k̂/ NP[+\RCf3fÞN!I%T4hiF4VV?;[='aX4fpg)'5P-c# C95$Qas۞~x2]DdWU)Z޷?͇Bt4͚0`zȕX c[?#ghq/Sl7d0D uV&IF-OJF,ӎP8l2g:Jߩ" &lF$D *1! uG+Ŭu},R!E)&7k(IT@kXvB8ByQYncctA 9; Rb,>td F>9qhnYJ-ʳn.ɲψ8]ݜ)1ZArI&S,OJY<$ .nζ#M)ZmX/t ڿT' ʵ$#FɔQs. XHl;Q! zyZTNWET8GjG1naBHT c;kf։qf{֋)g-"!5b|6͂ ߋl=sj}a!GC}J d6``62>Ȯŵy|2|%U~1А/FzdFKbD۽4Xm>RªؼvґdY|b'ȿx'؂9ȸu&G*ٳA9qBY}V@wsG)Czږmh'V=Fk:v+O K#MSk)|1|iHMotZ<'wAQ ,OE;iد\xr].# #* CelL5!Bu%~t\O^>9.`2 Dm-u||kH#[Xυo=TyWޕVNloױ#̛=$N\3{:D ; Ϧ]V cE}zM\E4cuu&`aHlwmy] uita GȥSㄝ(6taqc=;F,1GpȚ1ߡ?wf7 RtM k41ԆFIB)G[) ۢK6鉚E/XGD)s բz"1!S_d7Ō0mĐh S-jd4a D.4n}|S%hc8Fu8Cpb=uOPч׀RRaU,Pf x>5kɄOC+8,S㵞L-pR|l˻  Xm2 =<&~MvDb#ނ"0<)OW|y]BXsu ^J#q9 '`Žɍ3P 'c@7?CmUSPƐSpZy%bCU7ع|RsP|fpp@mIh4U׋b+-*\F@|`qx.(.fXv0 B(n5 ^'e-{9xd7EX: ۔Kz2.?яQyh ̡UؤZ }5Tqp~"3#'SV'; %5 PV@}J&-2;Q2f}>C>' ZcS]?az}"rJ*{uLS}& Ci;x%qK13.-7t"/(fQFU4!>:`g3VG&cwJ p,O)ǖ"k皑Z x݇6(i@ia|zS4iN t)2FVS2 {lxo4 !M8c >V?Farִ4Kbr{ksLtSCxFײe'=9;wc.+d@[Zg\30fY;?o#WSefҸTD{J< ,)޳s>ƇvWZ-qm!(΢bBQG' aK]1JoٟCelMD-EJ^. :֚, I6gaziM@xGM(s8KUL]_|AQJʉwGYu5GbQUIrW =}K774H/n`Iʺ¹gg^#h$><ffbȂHdDzHLwf;@I' [Tx~Ѧb>ϐq g-=4jVN:bUx#gP2B\RUw`\qz V7X6;(h8O)8"?E5J'P󞲃CnGZcgZ8dҘ䟾1h̀J:[W:{{<  BߞNH -qRVq9"̝TA0)ӽ%"; BK_#O`sA.mp'#Ϫ2γiʕ9``7 b>`8N6_V~V'r>5miO_=T`a}af >4!i_տ('EhU_ MKgP}8)7>| ɌqeQ:$4~s=/rB: Y]Y0( VGlV9M%#șB/*Z &]kE AYKᚃz۸nd;k, 3U{QikM(W%Z@T*^ui -ל`ЬTX8h*:aV/¾*f`>nπOK _&)S~[E9$@( 80@3P$'n3vs>zIgZ8Hh\na  QdJ͈X)zaM.unx47EtXP׼j%@iweE'S}*S~-]};KC/EQxyv޹*=8#)4,^d跪Vy$"Q cu] 'Ge]˫m|n|IBmPƔOĐdC&2 ۶M^M}8]NTct㖫z7AU tQu˚(#W>dؾeQL,;L';dSi(9FZ H6Vߚys.45YU.JO67D[$;e4գDtJ`P"X$_+59AJ:P*JV=,y__jt['BX˺ J3z,gz*] T#H[jtTK19#9[<)D%0ˏqa{N,wbjqn 1WDJɓ^N6L=!(E!%rRhNH"=AKCQ@!ۇx;/V3^; bx_vgP|eC<@%ѹ꣊zg +эo?Qd+DM{{>oPL kY ?zt r+`|.ʀsKq*>8,q,Io@@m"Y;Px8!r: mԏ1-HhɗԷr̪lh3E+9zgZ%`Qn.7ߎ+6]ܷ`D@haVM:k{^TaY(T=R@Vt=5(52^o_\:d|ذfK,ɍ)—(o.h)KM*24Q*u*TfFF=3~]jJ a9,>L`_57L5N̤S :\!ڇ3] 3q!&A҅ 0z`=$(9ʍRx?UPksSOC : ?ф?$/p‘ş[_?e~mK4Af0'*粍,a8(®N|P͈cEKW.e,nr߀^Pi&jƈ#{uWi6FŜL ]ΣJ$gq/e I-o|-t2j$qU]9nv ;t!xs $*}sOwc=[ۦg7se.roqw&7O٢i Hn W4 ܒYԦ95Hc<li?}M:=V,bЩPbxoenˀV(EVDY3i[y͌I#H1> a2{i^՞/fYer0.Ǔ8@++>)zeϖfo'~SA9 x|TE$,Cq*Շ1h =.!CΪ>Rwia2ՙW|<(ao)C_jft 1x[SuÑ `6H&.v>l|o(R2~0oN"5к %u6.sfC=$aФF bMZ@ M $c$AՁ 3g 4*#gpD{2I2O2K$d,2t ;NVjhKcOѼX~Bt;T4|2J >CT5=oY8xW;OtY?Cu-^X@HJo^飭[Zs~@AyXoed}&3gk3?k@q9-BfCVD}u6[8U yQzlNS_ZO+:wuVqrsTizsH   <|cJG8NSOakwO\tʽnϡ+g($/2rvrTXl$9:H7myRyCHjA|c( ){(P O~ah=4&-aHtHG(cmqwq3<!J,6Z kmNJϮZ\&Śzph,J:ʴ1H> @]VOCEi0f0 84I-Ãd9⡂ MnMXd&gPxi``#b2wWgxG;z+*hFkA.~ID.˪\݃ҁb`Nv&9 Or?\:@"@G,vXx^|%RzQr$ew7"Eɯ&pf`50|=4Ԗמ$39`"9TBNBs_[₢TVIVT +,~m# NFg^#8fOĵ 1Fjf_T ܱ͑eaEȀk6(3Yip[dqh/@'OuP4R(^o,'UBv2<ԥTtSsK|-uPnA [EZ]'UJu_ 5#P)'Ilw ;S'Q| &l)UkHj &?J}?zu,5!CE'P'$'䮳!omU4\+}l[K0r/4>=~2߿ `~8A`މ5qw~Cp8zgvtYr&U[=m35X?hz}5Xd6LE 9Ӈ \Ω2Z$2{t,4s^q*i)8.ev@`BStGMIja% FܝO5-U:i?zQ?ܐՉ{N_}03fݗ6+gwm:3"?mbL4nVCJq,ju/>cW"]dqɨS!\%*T/Pm<;*^USZx+?IՊf:k"al:}#/u)𡊨%罧E|/6&; K#!P<\ߥ(64"0F.6{DJT .SR+6NrߢYS(R"m`ހ{I z%^TׂՓ\kW:qf[&3f"E%OiJp2êGaֽwjM*` sSnX<l-e!e\bvNb^W G${ )#mLP+, rEH7 8S1NY|GL_#&^?K,(fqif<k1?a|Ia6~5Y%b'4X@y=/K쎀j%x`_Zml6Q7 KLjjf%ھ(#|uerQeLM+HN|Bj؜{U̹錍sH3SRQ`)ʥ/Z,WF*X7S*I%CAy% c;ᮭS{:DmtPBBa?.!f94y#v+`Ff>: gX4z%t{5!\ QAR[Qy.n=CؘE_=C^y)%|@,A,J:Na3է#RobiԉGfߵUX˵.b yiA \#qH-g]!]@ 2D:mA7mJVxk"24@#mY G5;fZa]Żh%!Bqs ;VO+C=}D0V=+z{ʈ-Uvn{Dp}\>L4{4~1 '~:m tje2PsNLpXGicO=ߤ`VMθj\[rYz&E% D3t B>2!"dd6;) B(:7=Ef2TYXL y&u=wYHɔtnD{=LDK=(pҤSv8[p$C̨Ra4L kya{z0ޢ"si@åι(06i7܉PAwGgVg ExpW#1Tn?2tAjch6᚛Y a 69b=6vľ9=-ROchr ʋ621G_JImzo.taKˎ߫MkFY]¯)`DRijF筕\UTpo Bt[ "hYt2PgX 4W-D[YKq7EW4Յѐa @Jc%|d+M]ȇԱ@ zɟ1rɠrZC-UY"p|ʚXR-m],9>i)-}kګSM3)T-Ji{4sDԹ~l@C Y$ 1yUn>[L(}6z1s#w_w.Of4Ĩͦ5y̥VmW;y$ń}Gj fxPX53iܒ%Z3VZEU0Q9 NOZNm|Xx'!W%msWCZQS)#~ʯ\z;Uu F .l1 t rWY6'y$sߐbOP&zahGy Ga14|GAGy ;jΪUWFb*ZD\vvKXE\fo1 iNY&&zmE-;Pl gJ9'' h5Dx[np Mҕ팍-a 6uT4C!ێn 2"wI5w [ûf ':W#|6 mvKQmٔF-{7I(퉹G\FaogUSe]ь^*$2}@sF08j(Ll!k)-dkr;FMxioll GD"-nFxMl1fvHWZVJ|\`Z[J:4b* 79`LN⼟PSd&Dro6b;Y{cpa^*/e{I(RK Y)!SsXٴ5* ]aAf)T=Cv.$Vt b,ciHҜlt Q"4eU/@?EFRj:/>*\B6Qw!c X~&`f$:b1(|{#\Zv[^Bu |q#b_& R7%,ot3{p@GM;Ev$bf'on^I@hzyn}C8~!vb8f=*z^7ަErKIConN%WvS0}GЯg~ljb\<u#3h*n"h:BUq;Ɠ:R| öG^II*Iټ+"U&Z)SA|炖߁%_IQ$'uk|¤ɂ1'S㼥AtA%3!^uCF>8a6{ɛu(+<چ>!.QV/,s~o۰ȏrŁ2[O],-.dU/v$5c1&6%jbPJ ;*(tVAձlF ?}n"ӥ%(9jDGC_iҕWZe ZoWUWa{@9ϭ {HWMDNv&Rg 3I_4UR^ZQ2= !U5s!PlDGO8 `k Et &,>3޵yY]Hfҽ@kXΝ vCa9cZR/OS$Lv]_aJUUj83vsT#e-6,d/L ڔ%'ˏ7AI&SPNh8qYPk-孖Ŗ*yNo0JYt0 ŎuGcRxdpCIލRD5khR(UO&K b.}ݽԤ3{|G d?ԛ%d>5JH3U6kf.b~4'ʗԽuhH{r}D{* L#AQ%l{pGCtQ#zH '3CjBX%Nإ?N x iv_ur}lLӲDl+! rx 2DDϠeEv@lz:C) IZ4J(f ;8.ez>Sd@/*_&@#D]݂u^~К2LD6GH2'x5 6xjSm4\/Bm@=Ep׋KϙnP'B&gݮ.;4sapBV%X@%WZᆟeؐyR !Hk[FcSFIaLRId)Ͻ_]bXᚳ?_MN>id!y9,[J#l)mb]S_k_aSt&ԮhlsR7[? 3²)ܶބv]7yjJ%$rvV}ib/4!il|5 Gؕ-<~JvUlU9yjub.oNs0If\-:A.nt[dX@C[͈iDTIE]&fb `UwA!6IN, Zs.܍wcrZhK i3 (7 8:b'ǒԳLacxԝsRv}5iƿO,ןq+0%y#1 %JVy{T xf}%OI &rԧ(y2R7" 0ÅD_W+f\2Hi̅"ni3 EN9< < u>i)+ NvN]bTM+tF8{oi`z9hSXF?\QV",E)UZdqDKu PnJT98'!R Iq55f:mI5Hs3L)T?>p| ŎXۅ/T7O_̗D`ѯδuE@>s'g/rql<鈳=[ QpeomtT ִXGUe% ktjx"&٥qy`d?:? m*1PyzWTx(şf3$3(0?kiWI0k YV2ƅ<ٽ"Sw$=Bu6+1 7L9'E)'[NM;A-N[pE7nJoZFEg=ì kl ^ PފEîxw ɋMYZpC1ӋM٢'E +XKu.c3Ii)?yM'3Ho!psFI26u~I R-0"ߍnu7фpmv.*o]m3/GTz6{ @cDU)jZ0]m4wG/} 44pi|/[;ehC?s+'@sueQCqm2ŃgҴ ;?!Maw g;{#&P a,8]+%S83 )U6ΞB[Un 6 *%#m߈qM>HxFO"Eg"A+ il{t]k#xIaT ɪ?~jDΑo,CHk#<楲̺riEf]T$#&w[&̮}R,o|UcT3\Ӓ% ,j8Uׁ4)iM퓾 #)Y]}kB0q|SeDtcHe>a(BEfOLU-,N1Md]QLW9[_w@0]rVNQk ER;)y꣌z-X^HOiG# /[gƳ G1SKT  /3I'lFP.YGPi|I$4%+G: $0Kc0;(HGNjY"mu*g]hbovЫ__)6H$ZO 'B?4%+/XI޼Y6_^>K?֔6>$@:y̫g^{llok!C{A^Xt% m;#|r]` =_,(+GF~&uְscĘ7DB(/:Gl7fZ)'*2Zzʼn i@.w 8/y-"oW`Rj(XXq6,m j3mD!zH$,Vjk|S{yMtO$η<-P`?H5з)QѰ#L&cNoHȁd5Ht+fv"/\+uA]_̌,ڳ^ЕmG!J_o_! O:0YN:MYo7hUZ8ƷU҃[1e dՄtrų.k"`p-hT/^uQ&,{-^RIGYMw4~ hEV1w6԰" \ y4j&qޠecrn;=S_dVj1{H@=K9 ;7ĸ8~Х=S\K\(k<:h7ݞif M8dg*Rl$Rlj/"37RTXb.rzJPc:є6L7Ŷ=t:~: x˅+ S/V3,"` e_*ʟeze~EP_~|ѧWcmi/ ʌi:yg7QӚ]$ -VmpD]s'>hym Ĥ&b MޒX\s\kȫȈ =VBPY{;*=od&o2޾d(s!y )`7nJqK=F/f/h.+> ޏdQ …K,\_l%૿>R7s4ڽExM*3ٍy&nS7qF$w2x4`e`1>uM6#N̨~ OJKeW{ю*IS4hA>.?Fp -8؝@YmE q}K[謴E^ Wl=̀߶5Zl1*aӤ_M8B`C Gګ ㏘ƱUނ;f~|GVt}}(ce\I7)k+v"s;U2FvB":Jz .-;(Z , DpC"\g']p NJoPeN_}LH`Kvs\5ҁE,BRpmjYi*&wgZ{R``}uLcLPrƠ sdI᷵v+" Ht!yݵZFUGYv/Ȓ?[Huwx/4~_>v6;Gl 5د-/:Nh&9&D@iSeo[5AU)PwSd"i2'8 XS<#| &8%ِUpUu)L$qK *{dbաߜI2L2`f;^FwOKf2FĤUHsB2S8f@+iBn]^jT NeOAKCQ@!/LS]bfqٶa7_mr|XZKZT+/h}8dC~ Zx %%o4U TgGZ[]'At<ڰ٧t,vLUn>PGgF]㐬LM67r~=$)x.N) pJ"C ׉YI!IH޵Txc*ShaX6WӠfjhsJqzrFom۵Z0B)Uݤ*%=l\BL`KH`SVF9qkɀ|OJ3;$EV_vklq%nӘ8["0LS-!JX$:N)QYT>/IZaZs!Ey4hP{gH?+Bq"ZF2pq cJpJs@+#piUş|xP33 V M2)a"K&˔;J;2g\6G209N㛔6hXi;0fJM1XIEkͦNRxVZu}n%HJ[^:v=\*c2ያ[h*q>v uzQ GG!Xnqf=8c:a='~i<{*]1W0^;6ƞ:F"6AI6Eノ{[$/fK㓵7ud` Y^y{6{:^:eu`U6~lMMhs-;A[49{ C쑶XBwbl?T5; roI[H#vĈ&~j/tU} V_!Yܝe,C14<:WDisXDC1# = ,y`^9]`ѶA SM3C |cmp-:Y:Oi9h_kLN'dĂxxHJJI>`=A}`jsG~M:Ip^b T-&ܳa#L4 иXb̓!U^ pJib!Fg63> cV,ĩ3ׯhBF#^K:0{9IsFx]xL~=e{:ǕxN,W]yWKEC!7Fg@Ugk/7JIDOqnq~1j^L(`i -'yEax33-Q4b]d́W%'LajIወW|PO4 &=dx!~+eg<]iFsQG@;9Pn_ff`9nFkec&fMq@:= UExupӳ_*M)N b45U*ө> M%tH>㔹BgaW51?"#>8 J>/ni̘ Xn5տ HmxdШe5|KIuHClϸ&Gw*Лf\3C83 `mxzKՎyZOqZӟ+tL ]/zp*NCdа0 VHў5FVU># q%G[34p3~)>>@ܣ${>Dqd%0VШ I ׫d;5r !y;>#|`3tUOz0רuwj%-wY16.<%j1!e]gq>/0Ďa^D(@:S/({W! a:'7ZX=7W|iVѽl?_3=MC\3g5?tnllL(A% ,trWLOw(E.v@1~̿`7!fdn@8o9"숎~PU?|QM&qnEu8wĪpQl-r 2kX0]tJn)CB E^>V/NoxCsmYGQ `n S'0$MSM"hDF L9mՊO[-2؅.V1oыҭdz0| m˸2̰ErLl Of1 OR!>afױT J!dSa>F:xpf`xBƇ 1]"̀nJMm s];qx3X% \o/'&ٗC7 c*Zt?3?`vzakX *k؆}Ͽ_Qz1 %9O|@%[iWqȿI ~ f詗 z5'Г(&foo3^=f HLi֤~ŜɪaOtŔDejleJh0t%|^WLߛz4UX .`$lF+YMbPf2YӴjSYU'O!8LfpruSqSd i >0hi(fTݜTEٶğ홇ι$!gQ~x xBO5c !Bhz-,끳Ƞ5ۧZ;=Y!nk? ,`b61_|2"8=Fr)Kmj(ri1/}h-9(wF0.ha&͈ ʤ>LR'Q"Dh瓘Nx_V+5Ń}Z;"hgQ` 7l"*xj|7ូݡ5iw<ͿISQW+Y@|H2?/ͽ(2.rx5c#Yk;ش5y([4^E{A֟yTPvC1Jb 9P66$Jj֕ySKENou׍Y Gݜulڝ3 d_SW{]}穖gt}KO&NaD#Oѩ5{ Ɔ%0nTY/5!3+kOρj{F{ ʋ @`0!SVE&IDi]$ɧ3nrBjw/a4ԐUhJIX/.mmD'NU04Du*l],wEߖo~`s  PJ?↓yx #,ź]]6sQ-!Q C;[}!pUp Zd=Ai|uA!Cq#9p~z7jOKU5O$"aUqF,1JQ-o5 ,9pV:#YJAyqUu&ᪧ\u`QT`nj"2i社֫}\ R~ *fu,W*y0gpJbz~Ϧ*r3k_'1 M T@$F,Mx(""d%*dS~Zu,S,N\7{?E|<@FZ1{PgK`a`HFܘlam]pAKCQ@!(f9*(%T"] nIuQqWƅ~S|Dzd%g&~lnC>}dVlgc..MZD+Ճ z=-njT A$!(7eT2oWǟv1~OuZl?f > Tj wF1uVBݑ.9pd&dOwR !<LxYqϕ;c}RҒĊQ eJԘ;u7(*6fejN=tI\/1kd. ٣Awu!mwF Viǭ=~XΕא\J7v?Foh_1KG`3hOL-wvK+'#+ >m-+0ɵkyOstYGzR7hc75RT8/*-5o#(<lER<ә:b(EPCydZ.F)#.AnHG*/_,׼(+7|]}feZ3#% `T^1#)W=՝kzAX :T sY6Sd ʱA:\ 錻ʊܑ6хpyiNjߏ_D ~%i8r=TEFVqM!YG4ņyNUE a-y`86~hrԷŒ*I_S-cq$F& QѦ*$a]| `{?ʇ6# a Ȯ̫+ : ē D|BLr%Gpv.a}  &sW5P+yЄҞ Ae K5D hs d%eyh*Oߟ?UF!iL,5$GY+mPX{N=ؓBV)gxotv̮+'-ۤۓ#JW}^L3\qQޏ5q"u!c}Tdgֲ珧7F&>Dޣ=>b eAslKuX.V[q^sM<ڤ²H8in$ zq/ ]`Zۨ 4y _s:L>[2  m%+ϵ0u3oxwB0q^E)T%0蹢 xZ/9~58ዡTJO7U;?NJe g6/P74яyOpf^]b3CZI %2&!^s4dPHnt' IhTJ+'W3DIw[~~}"FUzg4ZeHfo$JouB^~ܮ~F`ȵ}#*K C/*BPj WQj^ C\!Bۣ ({␣D?emL`ʖib+žNXe}`b: ؏G,¥1 {rjUf9#:z65ТK%7ABw;B$(q/:ῖ'byR*:dS T5ȝc4T+T} Kt<}e*;8Ux] 04$lXM b %Pd>BZơFM+ʱqus!Is{VwȑX%71lX=n򁃫* WWqzRsbb-dB)orqԚ2/`VOEcrӎ7*߼ޚ U.` d4\q;!}Kם. ѦF\%1X(La8I!7iϻkt7UM%gwe8XK>ɸ&:_ouwJGLunY* WFϽI?u9nGF&ѓLܣx֔ KZ LĒ iLA*]qP-GN]\Ym1$VU 8n"ѕDy$a *'PQD:Mx!A'RnΫ\tkhMpRPHU4$zi0jyKw\)e$̱1콭b+եY/Roi`hX) *֍2^Ԃfa R9jrEUFS/^IB? L}\6m Jf0ulO+ -ZvrGT`upA~p0U&qBTyt^ϑDbVLJ-!7j}Gcf_}U8k^y-c_+v rc:.9mH"JPq>5y>y$ E[8rC{8&y>^sC<#]}$Mho|qx}) ]HYZM`!gjZHI fQeZ 10-kKfRm_ MO;M,H4IgYLa:E:,F`ay8h g|F7˩iDzLn-JMT۠7"W΂1\vkZt1szh򿅇ju: 3u9.A8KCQ@!/Ù UnKܦ̇;F_c8phjl$q;/nGV u@?8qAc+mԞES%!h#DM9;= CoMS(.B??gޚv;@+de\/U_p7$?$r%'{QZ,6`'y8-;u4 (ԗC.|/*th=kHL,Q/~|3!ds`^5aMfοu<[Au8vg`Yyʻ.|!٥S)fxZ0+]}`tՋC{W5 T}K&-Hq%:D[-l65Q =E烶]q5 JǦ܈ m]ax- >1 k_JZ@WAn`Թ'#zW.Z!qa LDrteSNr$_Kztp<-2a?Up:CU5&Y c$jIwDhT?>O¤< ?rx"00g9=PWyO\/Ia4mF ЈB ls~>8;~ݳ%l`( UoQkX8\#~LE%wL-Uu+V$`+N `wKc;CiD7lXkn[)Uʶt14oUIϛSQwDL<ɆQ;'9pW%>yLS,è}|]F膀^mڗ*O':U_Jr4# 򸎻8rЯ7텯 hrXKe?nNbw.I@aٓ ^6Y͚ӳx7mj;u): J_Z;6wDJqT@N3Zh+3$)N*9ElXk]GH'ҁD\o)fËM )+8EEn# &J&Q"u(?SJ=i6TD~{|ԜAG[EtO@]!Q y>8Jw8kicA[pI8WI~5m\b`{64CQ.qy$7VKQJY2гf)X @X5E<q%D8'td`v |Wi$6 ӟeZkvG܍g!Te*hkgJn3G0 v|ZgT'a+u]YgC[* ܺЂbQ 6X@l`1_Be+) 5z|J7oꄉTEPDyo0ϷM15q%\CFܶå ݶQ-vG6N߬K8{ S}sE__lg ÙX- !-AfL՟vCuE#=^YmݞeFiS-(njݧDÖy~?Ѧ5Ƿ Vn N?PށafK^AfN3bc_X GR wC)8ϟ uT{P6╅xpۈ47Àě!(?}&vcCwe|!eҨ&FɑңKLʯ恖yMeCT,q,9(A7 :?CXF @1X@Ő MںK\ݩ Nn^/#`fPh( I%".wVߚZk*Z>m+"dI$HFQi﹚tg,G I_!mc,{ b3n`T. q1P9(q?݌0 dG.Foh<^;k{o2Sq^hV pۭOwk;{Sa.H? ]O%!}S$ ޟAt2a=M47Zyg? 9)V9>eWrQϕ[eJ K!M@ BZ&r'd^>y0αjȄy "R=h8uvT6l]wLm۸ O+ c>Oezc,.!X|JW]jKDYߏl=]vA;,o!4Zkbqhl6CNGY\=VRd(a;uf?6ɝ.l@6g "Z,9RKNyFSvyO.q} fIj xuك~qEDrk?WdHԺm?\v:lhdW~5Z:,c9gw!([͍j6ƕ0.*~W !ă2%^+V]IdRPT,g*hP`~ 顱vFzQ`9ңqhIn[N:Si6^F7daV<>Zȧg׬1"J$P3|(s{$]XOBFq讛FÙl~-iF}knI+(l},V<ҖCz}U4zP6 Cၰf@r5Kč_3f5aZY3QQYШTtmT,filvH.ZmF}FkԐFp9F f),NJ&H8eWx|k~IVd8«50 5>M:/(_a߬r~j/B! I PvAo_zf3A3WmOBh}9w*AkQj~F T;u.cHASSEsψڣ[ :QŸt|,9m:ChHFS/T&4/(%jJ5TcNbxE.e_VVn ;{bSw=UNY~Wv?i>ZH )$Ct&~[5)@`cFo0E)j,b*%ĭVYBȇ/7 4etm'ؤٚVh +fUx9 һ㦘Ę0Lz0kHPUS&(kkSAZKC|<%si!#6Q{}fIc'g洬eT7,5pOeݚ9[JGF(-CNKe\m$}N_ӁG!l9lG> G4!5#~hR&J>9K>7~Srq[st\V<(P-l7E-h<{A2pZ-uwq̱] 4[,w鴇,şUUvJt}k0>VJ=8UuD<#1@˯+ JX W1L0b@5`]z" l^Un(e.o"E(l\d iV3QKׇ,'Ix_mk"OU` /7Tl̗GbX!d0aQ ׾\#OOf:"4&S gwqhA]^)#5W *:SEZev`yGL[~-\-H~/#Xf;/N;DUG6¶C9Bӹ:s"銸%01Zlؾs6AP᛾tT39Uc CIvRl 82F" z v"#=5kQs`έ }Og _lUagڶei8oTYDѝxKbQyh++N{}k+cxl>Sʨ>Ɔ5hilq\A"CA):|:s_pэ\ G<:uխ@瓭, Yqy.`r&ex҉8`&j5ٔO`SՓͫt}kS{xS8Wˆ%aޅU3I\З/A*kg}]9eZg̈́ONvcG d@|TGkۘjVO;s]3( nG4laC۵]Kz̞W=甂#f8q' o,]JAW&}M[."Ӧ~^nca KC./m}8(aP}l'rR47Fd&U^e -}Kt-" |0e /!a6ļvT%4qtici׽mpU,I`Sm3;jI|bT!9fʣ/@Qu%YF! iv %!R ?ىz9mK: ʨxW-7R[3gw|+[*~&O FPǿ =!~+X3+diaǵd_*m 0%֏R̔Oxt:z(?fU_o[}QUs<Vm~cy[|lx? AɂSDCvCa]ej,YtA4g 6w-c<6 kBYn(x'P\U yW2-y;"r 0SJlJv,,f_ -|.'N >hN5qYâ˿+yxŅ1-5zۯДաړ#wK D1w52Ѵ{Nח{π tLDf>75vN1vF=\@J DQ1`QN_'B0 ֪3m?yP\ڨ6ʸw۞t *7[_ OsSȉ$㘧_3 qGݨb$ rMg$Of_QTiBXWv*;T.B?\3d=Fxlexmg T>J|BZ,J'P(^Gҩc/&/\ #_H7˧ںҴ'F #04(yqH#x7]C$;ZG ekGjv4Gb_ Z3ue#z~#}l@23Ax1\|BHQ% 7S<] \y\gtP=UKCNTw0 KPY_d'|>_r0]*6~k=ѹ=he+GMW :_M[HT%~3?G_U")H')` ѬZ:\h'Ug;Z7br6OӟA]t=Cb?Hd}0)[%fXכ5W&<͗E9v Fֲ- Թ+wrOz V)"S ji:h1$I##a :8B)_L0A8}M/0AIK.M_c2/Պ bT|wp8]Khѩ+{ p,&g9UCWt,1o!n ='/g۴&ҾaQsHV+oB'C|Zw-ΒsnJhYKF1R1ënӐS- ĥl+#[ЉOb&KOqtxVEW؅Pǭ,) &cu){ 9gؔB=5HIҩg?}#wHAþlB*:>QRbm[2$9-JB!hQNZ&]\h&jix>a徸.wh5^[Mh j+M ,`q ǯSe LM p]H@g%)AIvόj-#Dȶ"7DF !QɯF*>7F "EI "%p,m0(9D'Jߙ!%2eqvՍ/SU\/5$oot2v(n&}$Ӟ(ϣ3ƭ_ob1(`HfѥJ}T/*HXulziR FS BqP/q61oh:tr D$n@H,mLT٥v OHf0i Q@Bם\T^<'Vm$%`05rH-W躪ɘCH z8$S}Lcu3Iךk9U=糴8|##Dv̎Ai5qi)xJ`;>pe,(Q,6IpH`^Ms=W, OŃzoj 4(,/nWop@Q!*Vꋰz=o-#5'%0%ro1l`x zY[#e{=iZ1ͳРnێ]0 :QC{MXژ=uW8eyX>J٧g1q;։'KQk% ԟʹ`'Li *;'eV傒1g]@-`)n;3w۪|)YXLGBndǣIhGWu?.~`e&==DGvI7͛>,Wjd$&M|-ta2 q{9W ;˒ԅ'L3X,[6Z~DMF Mu%bS);H{X0䄬=늼w33M8I7~Em;wu;P*ƫ>tX7CHCv逶2B{ й_ȴ*q CFҞ[zaH{@դ-[^6.qVz 8%(Eg~U3 CP~E/m|aA Kt17Lz|= ؙUk-"S0N1suH?f^kYuY }m. CMqX|q 1 mbs["#)O@ 9'6'8wpJ ޮ]{k*BUr=36n&̙gLJAMT^;:Nx1a./صf9?a$ZRW&iG7nnPF'Hzw֕C8i(땏Y Img_ %i^> ṢyZH^*ųҊn!/lLhAOe"0ṞO \gݯ_6H@Zm6v"l)MXexyP؝^4։#mL%d*End0B~NSVR]P\sc]k`\ZNÁ>{@* cCX'k@NfaiȎgHH/ 1uR,:#sĸ5}$x1C*/9XV$f|YGAKeHCg@2 P LVԹGA7:J2bٮğ_z:v7Lx5w="Ѐ^U낺iL;g}8;Jy &bzEM`-,h uȿX1,Jvk;hMWgvțYNpkN:4?B=U:~Pg H*jOxobGjЌ̿ ,Yo$HPT8^qH$Pvܹe r5IlP(WSV%\̆V[y81STeCa@=fAB֞'|=o`vB-!1,$0GYQn*t]U"( r^k&nMDk6JH5Ļu|e9'ɹˋUdD#{.l7Ķ[jcJ<{1sg)~ l\4KjXy=[AɩP¼\y^\xiCM2٨*NbILTl?'<-˾rZr5S(J;4T*RB̧;Rp7_n羚WnQ}X]—r+sqyNV/,뱂=G៧}fT_H||ػA7X=dsl*s̖߮\*E.!4.J,SMyi2 rj_L4ֲ7xZJ.B9'0~orVo4yX&%DvCtLovN& & (]Z`Ꞓ p\ky5~L{:Zp8O /8ޡrMķ#_rr:]D}т".!:uA ղ!>(bO}Dcmd`NZ-+ن1eDTCqHȚk!E7/ e1Bk*`jw#Q BuOv96U&gEj/͙ZUSH 6=XZẋ7YK"5䰣6ԉS6Vx{kHllL? ..Po_N!KЄI 3חȄJ%J&KQJ^͢ [קУI/p-v,@$%–$_**9,%1=kwRxoeT]Y['ӈFx&J#ߛK1 IarOn2.`1J J6fM:0\̇?MU`A!J,OskEB3>AKCQ@!//ƩhV,9L4 3qp$LZqR Q ܩ)9*G-O`OLP?.ҁG5-&ԧP-~u[=ytn4p88RZ`59܉3nĭ{Ɵ4|6 (?A(tc,]Mh8m8h$D_HKA=ZHj *w @CL906ra6yh=- @fa׆^ R:}T96v] bzz!nQf7R䷃-p3]$JLӷx$qT$FsY]|mFjԏ!Z'Ex medsjn"A+I_`|?QT_Q /!R1%[ȧ]V/ ħhm~u<~*n1l4Y>f2ߩ!e.~P>V^񱮣!GV-Br YT'| nPuKw,M8< _~ &teӜrHd0!m@>UW.{+sLN{&nJefjQ'mKZpј[mJpHMj 讝+0;MbT0't.)+we{r%8'wX_F񚼝ˣؘ1Q2:Ua"C`t7܅pPT]8] #2 GhO7~cGO*~!%En5:0$6=h?J}ī8x)B.Z4\X{qc)1)FEh{/#7H|lR9Ubj1 U".y:[Z弄i`~]BIAU)wk0E@=Ψg:Div˨xj\A$?XN_{k4/aNs]t>Ɩvx̐h-3I#M1Z}Io`pZsDB$zkQr{n9? (Yi0w*;:>YK]$ Kе}~Y~P|jUyO̡~,boBȠv'b`3e8sXg]i&b0. ^iP%v\7yp |U{gy\%yS-N6 B5tq FWYRd7%ϝ%ʖQ{Cvju.%׵tF{c}gbΫĈq+*Q)0"1w]/5\jʇ'D%s4{p2I_ 5!Ċ<&@8`}{a&W%x(X:S8(Ȉ`Kr{q;mZKg#ЖG7ĿŎ浟)n&|ǏH{|Wq3G>|#huNBΊQVXL' akp=%[$(RJp[R.w  Ҫ4撱9rMz6X} ַAO*l\@7zeդ3Ⱥ) , K$`Y8wRY:KKGF:$^?U=%%qG&X }= $-aZ!`f mKéNz( pdd?U۔ i >ݦT&95$~P5!?X!ngQBO$eAVX#_M$v`cD\IKtE{ns/JmCakU)Ir;/OuMGJv2lT# v>\֟YB~sKߩܩ<S3"w 9Y9ƑBrTܹy{.餴[ H>xpƮw=/6WO{WT3C!d-= VthnmmhG]yQB4VbWX4Qt6.\͙i~qd G LYZM>lr$5"D6OsT=Z6vWb3 8uM}$rKw[v3C:XFDl76*9FRY qj%DGAz` "d_n.Q`R(KByyxML;5W٤,7nʬʲj (0cJ,|xj (T4;TM8f/Ӽ67 R|rV:Y5@!qgK0pat2g֟lt$Ӧ;QRc7taWWwd6YI5,lwffϢIdg<c9;3WB:ym3V|tR"V,G}$“|GʃŽGWAnEp}N.MaPekF6tGU<5TN mKuV/hnZn(LmZ$UØcZ5'Q #*b.ѷET mBz+7 01#iQcHTb+lNF(K`ǒJ.sy]`-?ENr/eZ9ZFS['1j7hOnU.ڔ=վ0sWbZ6Lasꐫ%W桅LBz5T'Ge D_CҴ4Oț?o6lTk 8bfU"Aߓ} zucHm(4@yamC}̢{V1Ӄ6WvW ni"ErfyK :i+dzl2HFOj) v1s& wLΩ$ė3ULi8<44& J/M84}hƿnKfbVͭ8?뢲eݴ?);AE8+/bWC~b`5]zh'SȒ]=%;p[IibB\笻PzB-E$Befɇ; Upĺ#@AQ%%|GSaK6XhK(cG1`q#rcоѣ -1Pd`$=t9@XǠcOAZ~?$4b=vcnJ$Uyf3~V5Mt۾FSٝlIDNAR%\" :,o}P5W=.T ^͈n->Q2dW30CE/y?ԒS Y(CQuwSbJ)~J0d֝vueա`s[ʖv.\wQGg㺣Z Xf5;jzmoXAOĪH,UBُSw`e4/J̤禺^$eU} (6<ڷ0 c-CqvrAgf"l7 6|P;i+ <;Bj$scęo jX8PA'DẊȠiw;yi_J4# *6iw>Db. =Wae˞qҔn#<(vX~V˜u^1I~s:_Y৹OZ$L"&*#ؐ%bI:Šoi{eU]z+PLӐ wȣjaw oXDBl7M뜒RZ̆Md~yXm1T*> +=/~7'vk)N#d_+x^Tf99|VpiVs5e't?uc8kYp.wUn~2<J%"I`DBΫndrnEiq4kZAF #J^4 -JAD\vQ<6 t+w&ii` fT\Wt/Pty4/zalqEϢgQ|RMo/kJB%-oO#kbt< \W3/wUA3x Ǭr8TTW }pAlpT@]=*Ҥ-4&lԣyJ!|%)SYDz_XN_2JVqj u;PJ1\n)A?&ƞgA"`y%Id]Tq:FJlfJ [ ҼtM F뎖W*7<ʣ>6oy(3͵g\rN<wg@eS=_MI{ڝEa(va3J!ֽoy k}w/Y!ْ}T\n9߁f.h"u&C+eOA$65GC2 o 3訸5`bV@JqRm¼5E_d~cD򝮶^eyѠ i  @Zw2毙P+6hEI!i&8!eVLڭ{e^(uql&1soOW첉yqUa9M]ߎ4@{L!{'K݌{D$܆~M2J#TQ6E6]0s3UTGǏFˈLU70{ŧPOZ rSY1',s 3E~S hs<$}&`3@&ai#  |jlyHo{$o򰼮 =|8# +{{l׃f}*x9KW>} ǻn{ va\W%ɣiK4ß 2uav0kꉺLL r*a잫,.1]f;k*3g?])] fmH} d5`9 $6f]:{ 5Y؃uu:i<҈>n' 3xS0iTO` ׯbY1&P2!qՖI32Rttg*k%y,T¨ e-`;.pXan{O{7ntG\&Of#<@d)-X.^>zqޕײ'fFJ$:^bj RaX{"uW#W6O4b |6*OWq#2U#֌:N飖8Uk۲b8 SvKT':ݮa|f9 3(l-ְN!rjhJs 5m.փ/9܁h :OcFDҀ*-.oKYBap!H뢈h5}sR3g(&idGL t[F )fS'8BL'Ɨy4(XӉ˱Xoo䒤5SVo|6&=2Aa&eFDqрI^&؎ыvmjd9INM%Lo:E!E ?;Xan_jy{ PLzWSaD3!an5q_j<<tO"Ac,g q,-i *tޏ c&i6 d>|ɔdz" ?lweP]qi/${]eX9`;3!ш]wUaR8ZFh8,2R<@zaReLVlJ9'=D%5Xֵs}_m+F zoƋ-)c} [$8Yc0XAV:CmNF$Y,KuGv]AH(lodsFlB)8[>"g\ndW#Ix! ~f g-mqP={dͺ^Jc9ܬ5DKFcXډXF&405Ŏ~u#I6`Vw:?nAYUn>=QETmY|{jS{53E˰X\zt ZM |.K؞J6)qu&װK9]8?Ɨ$&NFyl&<͓d ,Dkigrid,򈠶.6FbE_.C^[`̎Gj`/f(he wD?H mtL^N  )|3G@'@ވ[\l/g:&Se|3Fw yR` 8m}< %T4*a6< .L]N2U G:w4W1T%~9<2m%mSFE"- o8O<ݴ-Ieڜ-V1nPEWpfLeQ*0{w BSZȽƙ_Ĵm{Z}P3yvLڄ7y Jv{Ο,ncH3M\rʃ"~'>j!ǡZkf@\iwă +;}ZI;(BA0yl ,|$f 3$r W%6Q}_WpCa- gjG(\\d§߹VKRU"[mxȗ?о4J짅TcAQi~__*Gī6̑mFGH̅.yp8~{ `F+I$2Cp.`B*X231|&(M7P VQ&~47S%SLƱZ[":K-A j/r*!tVyBh v΁J>A*ŜPoGպnO%Rdžܴ}^~,ҝج_ABZ@׳ i9xz@(ӯˎ/:`v8Ϩ_sؤp`nlPhm{>nUX Tӡh)jmSfȅX;"zgpV@ d0ÎU_H>RGlDx>RasD#]L>k#2ҋ7q x7cH5lKfgw>P8"˙+PD{⹨يR;#|Q:!m,a9CL!r52`YN[sT3WRI-LҙcJP7޴MXV ڍHaª?w:BO B+"蛙y>{!2fbXߵs#9 LÂQ5c<P F$9SitZñl,f.qh.>wOK-nԌՈ(qE@IB9v50 LZ'An"w5)L M@]> ~xe46@GBK5Nh[r~O!y  .ݑ@8|VJ̽Mo42J*N!(^LnXuc>CQ5tp͋9pݑGkH, J@bx:3p `1 ظxX#OY6]dʁƓ7)C6%Б-rL83-_mbtmtLhCN/24?$ё%r\\9v>98qͧI:MNWҬkSpp y,O[؝B~Q/,&DQvu\g GWP^5ނح4,y>'IU@PэzܮV!6z#„@u}nxiw'*"%Gs}Jx(JK+OO:ʃ^7"4nP}&*-K<޴tՑ,c{;-Q=OdoGqIi埅d:8Clc'e N ~~]e!}r $S=p' ,c0̦ ,^4~bCr)Xc^n9ܫ9OB#v)oqJJG&JF!1NRguRh(9=RY7fc•;^BQQ6cmE0ȚدM O5b]ۮx3*D<MNYT3Y-TMu,jx <{SœEEj[LN~]08\8أO[I-Yu>ڤ i){0ڱ:~/3}Q B j\r$_Yх(˅bs)yT!iFi/ܛ{ )Q4^ufn) M:C[6 ኼ[SJV>N I) v3z7[3l]h 8ɡ1N]~׏t 9YޱVf# >0'FȱV{yAORL<~B>)ԓn]c(o o13t|ecHVQ 8ωZ¬؀ 8҄yfEB3fs-JIDDb0/ u쎢 =Mp ;('6pL'vwA (筍AoX$Z":Q(/wC|-|6gT-)/IOdgw-t/n~"PHZVD!Ɍ@çH C61Bwf9"4^ӷ|L_ܨchPbbRf]pfa]&-|7yN;L (\5")_*ox:Ж^}n(^t>d (d7dIBx `֋[V"iuj"m &%ہy ~ۊU  Ł0d$v:Ǡ{ VȆj twUB0BW(eQ In`~4-yrG@e9%ۮm$g"eFBXXcCOl9ߔzm[z.}BE#,JIV—ㄫ0XE}8 y9| W@V{aj}M]Mj\rx?G_PU|vE?UJTGϤmN)n)c&z'bRBWTA;*~TȌEenc;: 6dcY ۍ]3TJ˓N+ q dE" Կ!jn)+cxYnԌ{-zx%`tI6F 'H ę3w[K>e<`ֵH'Êt~v:;bX)T-Աk7dBNM+%ssL>Fy;Z].AUIhI>s{dݩ/x +Qj'TuF~'ܓX.  >\F/RBi;;RdC!& AmAZDx?2gbviP1~:]̉u&v[ס 0&W, T $pm?86ThQwKt4ԁd*l>%y8n!v1t?%8-z<_;w=.G3Et疰14)R|XiN]vO%ƽ~YB^ Fp8(ZUFVgt5R 90/ЄUDƮe[kZ/q"wZ Rae7zn\L@\w@7UEEäJH3l|.ѸV>؇Kbk{5ZʧbHUQjŪW߇YUh !o_MJ*=!ie#pNʌ(X}u[tR*Ƃ"yi6gn|w F'(#CpINpm*^4/d:Sftz͜kj"Rl4b ]8Ik16(upS"o2e;zdLMtE 3먁\9"UP`o[,^7ՓA#q|R}[0#@; (??@6y t DQ 0_-cuy#v,XԜ<!.]oGŷڙNxoa*x6fh/Pb2qWVqz`ڠ۟։Ȏ]l:eiɱ%H p=y@@Ѧ!|M:g!ðV›4}'Sap@(9DQ *JUh( VIɗ$S34dE䮔 xKzi"aR2(<ɜqa{hژb)@'p0\m>vaceGP>%Sw3 9H!j#& L;q'fVNp%'lЙ?dlg.8lwM( @0e1vsX *"&ÁD]:8r裛zagϦ(c+f4&D%T-8j%^㊨` wW]ăWV2;_v(taX"D}G[d(d.mkӽ$NEU,{rH):ēfq|yb;)^I8 šSKr=R;BPFd}߼)P\Wۜ{ҧRQ s&c0k|Kn\d8;6JNvGR}~9Bȡnލ{aTF{ 1[]fJaY K,*gvELYb3"mqA~̏!蔎ziL]͆7Y wg37AhNpIR4ar8e+7{fǗR+ck~xYQ3znѿT; ˰v2GLUM3ȳ<"? }-OO_k0"՛*)UTO@c@%8/LrY8>8O=( g'`ҋh ̍(U Sؙv!ϓy~}Hmߒxg k_mD#|Zl^~hL5;X4σ+UtlI6OTd=ۨ@&6*=f17#irn4ep31gUq{2ס&0XPѐuLijظ!-D -n{нD"l" DzWk]*}+&ϗLRs{_]{p1sy@gAe9Abp~gAs z6ha,1/7qcK+,:d*d2۬$$ ^DSb3zG_ SDYod!~EoJu[?N) akg>Lo?C)ޝ7ƷP;T6Gv08AF>uN!;ܳeSSKwK|zIW]Sg <*7Cx->6СEӠq\n.Wp&D*FbqR/yB.}Ш*t8 C|e @;A@v =Bā%l6IN~,\BCGKI) [@ܽ!Di 56cO~` ((RSٹE,4|ij!B|'annuxg{yzwr[5%y)  YFUqt;#RIOw,?qi椙X z.]NGVae SW3^ҥpb.p:띢u ƜM;~8k ]U(Y+߇^jWs+r/ Yo2mV?Dp**|;yR@Ea^Xk ~$ԙ٢ ,Qȣ7SD/gd}7;CjvA q p0 V>8{G٢NU I¼uzm7% Iyuw5pI\AX^ j&G}vRJ^<]T'\M۠ 7ɫ鳖o-(H@ߐe jMUOyp?8j9a JՃ8b<&Hg1ī&|s" _S Klb7Cԣe0M%+*JT%bW?R@5m\/ C{ld!BjfċLOz VNHh= xdIÞp18p藑.ʭ  G]ft}j'경䫂[-݋$k.Y6aSvDo jIU9C]ݕC<`tɨ{ӣs{"C8 2v0pMzCqR4QYEٌetfYfC֬ ד} m!<8 ʃ%ǡw˷.lom`i΁}wxv)~z%uo#14ײd^F _g#JPpi o"t]/lu.h>r;b6 ӱvgkU|0͌ۓkcU;;# _M|-GXPK[ ~m1M̱ 'vlT 5$jmb " $ R">zEq1\hw:`~kϫae|={ćn*lq/?J&11m$Wэ 7.&7`#6*j5.S vXd1E}mSqZ-+!K1F:O!N43%c^V}9[biXWcџ%4'+XP}/nH&1O;CՀx3kS&bU-sKܧH_ijqr02u!ZzNk]4T:A-cS+TO^{!ng.^ Fp+M;P]l>Ingo4lzz\*'$G&~;x L⇱ح^q.4s> lS;]R_oSC*fDkXhG3*`#`6S9ժZ/.ێ%`{-HT9nȑ#|00xɍSfc0*S\oNRx( _)䩚(<{Etq2}6YNk^Dam#̶ WFL~v5DX$ &~u I#cgL얪/΂q!P#sa8nhaEݤ  "peo/kr3"Vc}n?#w|ꍘM*seq l2?J caJU~n"mC:tу\kfůC&ʎDz_cC޾ 88RL&xҳt,J{rd}ƕ`W/AԺE-:ԙWa&9 E@\'RDBיV&HGf2]S8^4\ib^H;#ET˔`e^nVݒBci4_?\/RʛGкT^<*-(-Io6N֊ 7S{]+m̕][b{)]U 0ax;:Our>E^d2dzfm6z69Y0\Q7$k nfbhf*Se>@$h *tBf7IL8k$) B'O(ǟ9濋zE }L 4>5Y(\=<E:'-qy^7'0$)k =v1_w {< $¼4H y&.`XNjB6hPfMAWߟvY6W5ab$|M-Y$׸jAɓ-:%׼Jz*"Aϯ|%{x *$?'qbGN95fqAg.t/tV): r)dZ)>_R5ze;vi.쐇vqL!~GCdP?bFi&ԊJhjYXyqp} c bz$gHf*zdt+oqmסһΗ9wtND/M5i8/흸+\yC'j)j{{=2O_{2ٶv0*yۃ䤢7bz~U ƛ3׬s`<]qp0r[;W.< T$ȼ_F6kg N2!p!ȧJ4 Nq&2}[sF63X3KI>/o^񿮔k7g#g2<hfomEQKu]-۔ߑ^M~imȥۢr@*y:ބDˏڒg:=$}_ΐ琀OO/jC Nu\!NN2=Jj@kPodDsOfm-Y)7,ɫgH_Ig|FHS*CD/λ:mSV8;G^egh >~4j{0PCgSsZ7;Z`\{yfMͬ 6I6a/"oGD]}X7ۉpKq#@V6Jiڙ;Gň& ]ܝ~̘tyH Rj|Wfv<<̵W` rTLNY6-Z9hoYTz+ ]51VDYiע/Vikam|\1B|2K?6c \1v3;C ާJLZUM@E^[D"^joNK34W 7Mvoi$w1],u<%AS[  Ljb+"TB;BݍMHC4TEB>GI(o?;e-7-&G;}e_Qȍ )9Z q6#o&=oVm)3?)f7< ? Yb-7j :6cjc^uV^}E8HrѫJ#zϬZ5#*Ef[z4/MC1^ey? haG|˦P%AV52e c169{[vVO9]SN-3=(*Dw}LmܳcT@_~s޸u+qO.UOvI g$Αc%b; ~r 5xy{n3Z / Ly=dy)K[FX?`z7 %* l!VW9Ne֗roW=r٘47]$bC(te !dE_^9_< eeir eP-!H%;&[qOO?C 9?_9kDQρڰK飣82';Rδށ߯zлH#5ds,Xi3V8>A $+̧J߬Ӌř2^``J) 9zє-qp~uIO^ߠ岼B,֙*Uz*Eq^4]5ʂ԰b=h! k`\ۍ&⪠{FcEev- 3,I2)@ "d2W\Yh 3~Ʒ<| E:Qrp @(/TK`52жp O>Y@z/<z4š۴p$0jhNgas jҨ=hFLQo-Ȫxebm?ZE'#8 ' w9<I)fZ2y'(Ctd:f)f-=?R $9 4BKCk$^Kʷ$n{;z R%63&TMMC `6P-&9d6 ޕ,I@ VAs:fUR$T6LB}{:J ٜm^yp|ՠwOHBTڽ_&J Nsb$n&= ϙ\1 B<_/TwG2~w>Y|/薏.)L+٘B1J^N3Q 3 ~jB9-#Y5H2a' gCt. Mڴ|0+X-%qKN-} uY_xO.}%WVʤ?+!ֵی#M\Ed7F@Œ-?W>@@e> Wmwpdԟ)N:~M&KaxH&T Ң:Q)mW<[~n> }pgL&<ֺJ s]x01Aƹ;M*/Z(Ҳ -R#}  *,cB{+2A9A̾.М<w '+'U[ Q+ =1F+E5aRkwaOA\<^b);r3_FzJ§)0es9NNrM1bX >0E< ߨ5t/ӷ_8*K*wbK%Σ`EҴ;yؤ(R R t PI\tPFCۍmBD!K W1ce_se vaB.Z{Zlj1 cQ@dA"MSrzڊzs{3#F8P$_ b`I q#:QxP쎩hr{0Q wqj Oަ54uCQAz صZ;앁:.N9EX.!; L/c`<p:ś|kw=⨓s6|$#,r=oaj3-BSҦW$"uY< a^s8_*sK kcҋW^,d>e,z 4+kԅGcY0 En&Γw.?K:dH;Lf*F甂$iVr5leU'B9C>+,cYRY6x@ZHəd9YbsPD^]^m\jHm4ukj+rlmm]4h{}L$(}-Tx{Xu.e]Oyiq`.] !sI&ê 5"D:ɥnAB"ljȬtZ^0fX?cۜk+y' h/Lsf5o[(S<#ۢHbucAZ;! G|vgj;bl3<0Cъb1f*RGqNf 77}AY vRʎjhNF(,DQ EA~wmrد*5 >XyNZ IHE\5f8`84Kτxhr%"w G#UŠ tQko9*f4sbxGV~%<ƐavU85.̮OSdW--sC3|:p{w}vl`s羍\)i a̬t4@z ǶOg?jV܀D pܬE.~5*ىjޓ8Zek֥$[EZVNp JvLG`MP+4HUKq NMVzcMY,rA'1(r`4̮X\H\s2Q^+3k~#nEN.fXbж fiݹ2;P;+t y8A\|^UO;/%޿ųÓh>jAH˒kI9ſ 'jxg!↷| uіniM*~iOWj!![N=*f@U^,Hlfhk]H z%{ZD]eqZz3'#f~% & eަr>r)Mol9R91Y%J+LB ۪C"ާL4#aϘ]iUs=>a|x`Z-uD^5"S\Rn#=1?;B`4}L_ B.L7 ͉W^0ݵɳc({Rd̂k??OfLlDJ?+ԨX0KܐW+\JPO18LH;,#v.T\X F.I+8z5w E+r9WFҎ(rp+kX=3@ w  nԉNZTj4b[d)3Sqw _uG(ƌ7D8Q4jAXb"c\ZGUٶ 2 a**Wι[a/:˺[6vgd:$j<..x%|ұ?ë.&5Z%9YspȖpRu1z ~)lѸW[i0ӛ Y¹33jbR*$6[66)j`vu7'|;HZ2^ tЅThcTǓg>S{w-F,_[Q 0$;J>ʔ >}`[X36VdB}=VZ/vbY`,b ~nҹqąQh4eELL}Pʀxgw/Ko@Q,U9{s:Ώ>N_Nr3r첧d 3T}@JUsll l53#L9.!JCp2o{;U{VI ?#Ӽ^Hc! hQC2??Qk_O YQ*1XU=|>HАw NehqT*yu- 02oAj4c.LC鳾8U=_Iӌ!;]3Ρ{O=`6-tj$R^iA. |.nKۢh$CT.=)'b%$}T&!+ m:X7.Sa^r%V832diub4U|ʌ iq݃,,r~ (gD*lv@k㘡RٲhXCLgDFwW 2"4'!/h?%i&nt?C] = A@Z9|LkћBW䛫b4;`b?tbTtL.}SzAV2}6fUЖmSӉ)!bo w699yݝl҅í6|]?A$:l Bw@@ԁzVϲfJ1kf -IE_vmRp(yӟnߓo}URgAX%@ɾbV[(&/(*YL'X&zA"r#s KQâHbb$D֍5k3F='ŪģإF74(mʙ+"ֺ|KUJ!EowҿƧ.m&(-BP`5|r|S|"M|gc7Шڷrt&{c)!L`]!Яywţ~YtYMYlhzJ%PGFFx2{-\ E[^3kS=-b-/^wÌ|+pΨbuD-O9VnNmpL8kPzL멗 #\ Z Z\е_xZ\, u1{`ymoA17c Hgwfϔ=N.BM4nC"h("x}6eT/_+WYtFCo*Bu&;`ӜBDfENTY$ y}y#,)I((' 9S[ɵF~Q32.4);+9g N[8ZZ!q@^:G=pǛItq\`^ڸI74.O Y>:l`u Qfq2Ӱ&J"<8r6-d;'֜沀.i}pyާ%{ PV\t]hWtO.WK ٢D豏F<Ly!41GUA&}:+mtx{}QҤo" ^&G4z2ȶ[ 1=3,)M[{r0ձ$әp6_w9(MmwޏsX~jNoכUYb={k! H_v?&<})ۇO9iTCSpk{.J V=h(-TʋH= e ۃ23ȱf;t=6"֧#e/h wߌ{dbYiϗ:#' tm$rwn)"4gnEQ0("b-kd|SNA?6*:bLqpy'+SyJؠ`sFBlV@NRZ+Twqxշ(q%+.YGrkŌb, xCy4k27tfg&?į0QՁEW4|c)Kr 4W=Exc;ņ5ԁ.==l M2c| UE UW㹺6s Z0^h7Mu۸1fdhIXZ@5l*qTEɥ혆]u)/썈B rQh ¨Y@yfi<+ .¯gL}g'tz qH} Rgk웤DQ2 @9|/tZn!,וb !«|x|;ҷH}-cy&r>sKudn;r?d3c8ҏ0 8m;lo*mXv 6|lht>={dnG% :RbWG 7K|u-)J"}.dVbk, ?vô#a[ êv=:`W'}AwHAFZO8u9KCgSAMnfF=FgzkY(\&}KYg(@2'mN)kc=+ܵY~B'7&o5=S>ZM #q+ Zz~KJ2Zod Hp`pn kv9 DG j}q:^=J\V*$_N@mhqs 7+me\`!lXusϿ%FpD2t3O;4F謻Fp~ Z(dHY/uܷDЫXh@3rVxs܈XB@kpj: zցz(È1c;c%unYџ"p$.OL]F ɍ!\DTTנbou7ӇW۴igԣ ]e[-ot/0'XBǤsUl6tFe +Eܠ/zN i("FldRSs;>9%NQ O BqÊ7K DtL*1r\ RUAʽ ,k$ƃЉrq/CLf!;:ݦ=Ack.,uՔܥw.9T4 !U52X!WYy2ӓ%&:KaBZys`J*vr~ix)tZ.zoQafLk7 h܉ݩ@1*y@͉1@P n%I\ Jr1U:GJ|dBU>yH]*^A:A(VhN~OD WTh#Q~":_5D ^3**aV <}shMb&;zYTpp yd,9p%&AI Re0!Ւ[N|ǾRg!2BOd "?|&LZavj"[>x:,i~i{{Es<+9]"熁# ̔S=r.O\0od]VOeOx9l: pyJF㖢#ͪDBU]VN pdƙ"S`,bn!E GcHC16<6oau`hvr K<"TAj'vi;yP{Y=!\*2+~Y$i me].>yp=pD܈}g QZ(NuMuPjsh}87L,sZṳ:$jE:|_aXVx 7V ha6 $df=w\Ŵ[ JhclG鍷R)>h'_Ctg\kw \z#AB9`u3o臯Ged:q.m6:?ϣmvF-@E֥mE};s OB1IT2Xg3^{V߳a l sĺ?vsL \KR%:EF=&L{`N/s`u<SJ|]擘@,㢛 , $7u98YrNuHuݚ/kfFbFgu!_ 䈮TrYKIw"ԂݰWk ZJh+cyÝxU&8PiܸnEv萚uG7S`e׎H?*?|y9r+6+D܅r>`?g ͂RwFMԲOF[ `B@v҉abݞovK,^"˜3 #ʩ2¹steń 0}ORke&3wObj.oڻGKUQv-z#gD)8qhN bdè~t5l{YaEW|]fctԌBΔwHlF B{nb!SaT||F5:v`c7 Hs9 |3XP'S|=F;r)NPgi8]7o( Nɋ|k E6*2Ǹ-i<٫bx+YL14pdžUK[U`aOuRQ)ΡjQF3@Mp|yRwl c6t`ھ?/]Mv^]*(ˬxzwtc ">fJ4ɦeR}!mǖ92rf!N*t2sQt *ucAo_>J(etیĬВ<׿3챥ޣ@\VŪٰRCݳRu#MDR#B%,ڀ:HLjCg8#x‹!f >D7U8*S+H;^P;z\ش+ʺ9mnX|}?S6J-L(2t[!"ܴ)ѓW]nhȕѠ{YHT- ?BR@-@S8 <ˁϣcץ77е]l5;]2WXhKҷƭJٍ^!T7*Qm?>CYhPtf }z;qR4 e-(n^M%1ړ>^êO5O`5pGB#po{tڡt}Ai4K΁cpk jƊZ43:!Oz,g'(YRmI2>J?UKi"cO[a*A&- l$*#CQ`. zx"5Mz3 t<=qŨt@~ Tpk]6ZҖšۓgXGBlR%,97Q{8s\L.|*mNJ\{m)fjm{gʷXLrbeKac(̡_5ﳦܯR`^Ft*އ٘z'%vOS.oѝk}룷: ƪ鼹Ūc>g eh3qhɥ7\fgiQlLE2mNoPD tBЬ(ʱS<&':CL)~:CJ5v DtBztyy֮mc 1ST!2Tږ?,⧑Yuqu`>iZB'3>XB,Rn)_U!,sqW($] 'ƅwx4F5Aw6EOrZ60-|X;&ׂpC;rɬѰArBׁowZ.7d zn^t dFUٕh8>} XBLniB`n&m-ӉظdRe*N7>0զ$)+68n{A?p4h=?BΞTCC?:,Nܙ<JE 2mvh?6ky46)LehYQͦ{ΰc['d$5g(?ܳvx;A9dG^1-v0?O.! >]"@bNc#~5\kWN&XxjvDr0ѳ=V]݄6؅#7m"Z&}ABj$o-EK0\h-^hQx#m ֆ/]d,{xy]ӯ$<$Vj} G1̕ĉV 6¥ۗ&&wnU]Aʢdo%V޿3jv̟SOp d_Մ^_#SMӽeS,BS@֙qlWԵv_Kv7T=IJRZ닰}c\܁j6%)z,\Ɛ龅Z4j%JvSxP} J F`GD|DD oQD۵6>Dl{ ]/GQD漰JY)| JgK_m)\ive8eu,V'qwjqg{ yULoComJ"edR'Tk1%`z9ހpr‡ 8:*#1u[Q_ ) ǜk{V1lpcYɇu`\K"=yTPZ,SM,,;ne190@^$K@p4Ι*OX2%sZO1E'HX[`x9}K\b\0]o*mZ$Ў[pȩ,X _6FdVbI舣aIZIUA]-MZ1eyt1pgMl,KxkQiE0 2}B{EِOU2|n['(jwF)0Zvӓ4S9 W`y6C5%kCn?4[ P7»Q6v.'B2rj;TǛa@G)@EA)kdJP- SA;)B5UQfnx ?&40 uٺ#95WKFr}؊~q'5!f|w|qgf8#l!_gXHExi"ss^ӳ3t# Fr,ɟz_!$ ii Y_=-˕Cta 4AJi,2>#koJDϩ;Dj`E4K:[T UvVfMo*(?{茆 ;#| l(RiEH=Ald`r 7tY#X{i*.v&qdI]z`etmp1rsַV'<$`K`t-1Y0}@/sUۂ4B o|G_'I4>Ŀ;XCKV1%3x\yer ~]Rļv W&- 'bdTdM!X =S*wmS)9q*:OKBz?lK7@/?Tg'"t]{U݁,9ȞƠr#a+C7/GLfs\wSS"- mWzmXhLw=~m!t=TL\GXI$=ݱ1*gUjٳuAGu=Avr\g%@Oh1_q0.ǜ<Wz7(6Ms2P>ll nuG`nlYm1!-!AFu`OEѬH2)} ajN0&MA_ FiLZ 0{FTqwnQٻO֐n/^Sa r7=6f+]l{<(Nvo lJ2>W!VU"@UTφX\b>I[K([>яj'X7Ô]S(/-s9*0$QO`($l"HFH$楐0CKH\Eh_U*OCҭcH"ڄiT O!sfՏNN3|dc̲ ޚqg\`Y!2},I=^pД7 L*8=#1ꆛ/3H>ZI t\!#eZa4RT0°ÈjjAlꓒ]m63>-O&{iM_rSɖF2gG]UA#xy*+f^vj[zygH_M*O]sh:ԍD`hm}qgfH悔zKt 31$]#:@؁>iO[2-q^,,Qkbpjdog'@kĮhJ*;BΘ6(7Y F_kCghɁY/"4(ږQN~ð;-]Kʃr)hd:ןX2XL ]=XlsoҿJud.K[xuTP"GU9#:pZmK)Kfua=ӭΖhcHJ?Y`ҥh%"* e}V%pNc?70fJZ0ihofi Z@YFT*3t9cFS#6؉\)-* &UFz#b$(YЉ[*:R "Ԉw~+,+ض@E$9n:} o4ʰTryF^t͇:> g ¼A(3}dmc9VWU*IvkON==kjVMry6m6)\o&N BP4?WMՅP XʦUfBM9}n&/*:>K n/͂祷B^Y` ̧pi`)%8mOj¼BNk=Ei+C7C2wj_mv |?(4;{K0 # JDC1WIh_VeOj\on3v !@^b`2kz-L! C݈ 6 G9$ 2dQ0ͬd(1ܝ  徥:`1G\ K[2|m Si=7h/,Xœ:͓, "ކEk>2&vh%l&Fư)#m>~K! 3iT$&h]aUy|Bo<ۆ_p?^:!EN:F'$u9620k'kdVotr3G u-1YŃS G=N<Ȩ'<]t?v׍ȶ "|,#Q~zJ'[ҷg|!F[p&9[ˍ}V4k&8G; 0̺SE΍vҹ? -[R.砊HueP(#^p+q}|܃s:7|fPҵv:6zh$T4mmp¬ lS.k@iU]˿cdQȭ]~U?8ϭf i]q;֒Z0r[Wdq1>2ZӼ'yJ CEh;W`eY}˙"#kX0ztN7NaJ;jڠh*uymGdM&%IOe ^`  b`$f Z䈆pe 1pJ>zhBI3rat!{j;v?B#;C&01ʸn׌2zS5)qQH``z{5_y|ecO37!l(2Pu.ԟ}P %P(%AiU^/`_#Nqџ7X~ kM)FS*TQRs/rxi9~8`GX ǔҎGOtGz[ ήSH]p8 3O^2;Hm܏pZg8I?&5y.t;#PhDj3v&wԸvu70 H9HURTY !!u3e+)ʇh\ܦzcCi4:5AIyK_ [N4ph%mEDa# %M;_kHhWϒIE`]؍z^Q 5y09ĈL sPRVI\&|WV;yYyGr#Q54J_<7s=M1V =nMuڨ6DKiihΞN/PP{P+l_ n£_{M!vLLyzFP0}׌BUAv1t?Zm%~=nAQ1,Ͱnd\rl 䅐W(?'S[1 b_Ⱦ*< 3VꞋnߏֽkC^WL Inm4lpO`hR(SFnp&q2VQx_}^h.O`Ixod3UOܒ%->KZ-d)p}j<[#>?-~x=W\oѻ@wd(l%Ah\cﴠYx4;ѵI&*Gp̖'ҮknXīv.IK`PELatlYsb\1IҕV|Op l?)~X% (kUUGX}e.ni1;Q^k" JYiw;`>Gy|ށ&M|n]79\Nۊ-u10 :ًVZnnS.+V]4ID1qɜAgEb_~6ғZùc"oḧm|:ـEj(-h;"LMm5jĄE"d5dՁy#UTRy&i*T7LWwn?ް+lij ND5xko]=%. ϻ(R[S'xOMWiɱ`q6hshB OFâQ`d,7q vD>=^,U^<ǮL,IM|èo"J'?7*'aRF<|ǣY(G_u]qNQWj׽ BDzPߛ&&;a!TeKO/v*z]SZ~{v}v^xS 漭b,riG{]v)-|"r cKP_dlEmt@A% ] ÑS2V-xOE%$+M)bvYD>S@`s6*BZPaԛtRx]2x$_P ɥT-I2;mxmL|+=r)~Nd{7"(!e>(hLR-XIiY3b0BoGP7D)gzLx!nJz-%(^p+%{Sk3GmnK3$ƹs )M~DjB>W=jjZt m$0% ,=Ѭ)~qVZ֤`KRǖ1i3< `djaQd2[ZVws _ 'qRO5xYy}1:N/ىPtg7#3Qu妗ŕ*]8ï$o8SoR Ay6O0D#c Ł9}h57[e(#nn{|eMt֭TF×,Cn+V^Xmן p3D_N2nKa:6e`+Z}'=V`=eN8D,ip9̗#{ !2s~e=D zZ)V綔w{wف| T-4)r.,"zizSRF< iLC4eQw`ЪASSI [du8ԃT6ΝZg% `F %6*~@ ɯ/㨤R*^Hme^]ރP8و4dac.n {EN'?q3x!Yp'j%++^Y IG} $*8GT+B>^Cuз}acQw2s]h$=S؇_.RWSLV02l2U|KZT)޿jg b<T뽂0(6^O¨d}]2o-@#~yezCR0:gTrw'2X UMeݕ>g/^a(󻥽!;owo>$O?"8ʅ*Q%3ɒUm1;+^z^?m{тp~D;ZnFfb;pl7Ի9Cژk0M[vsmK>uNV4vf>hA><;# tEbU7旘ۅ1w3Hpcw^dt1~N <SuwQg$o1mܳX-'mU!rL+ `4kwf]&#q4oЫo~ m{ b1[@C\ؙEJꦨBLlD-s#TJe}C=Ajo΢B Qv;)遺[((o9'@a>= tIA}agH+&AZs[reUIN @fݕDcEAɆ9I?/z'{.wj{o:-#3`96ȾOc)pm$|6U`;Crmj#[G)m0õ0C [P^7:ٮe ՚ znEyaAbx( L:1^ٹTU 7j*ǚUg o*ecQhBcgM$L yD0 1#*.| 䉼<6j_=nivI՚ *-m>@JI',2(gth1YLN}:pB{D|TY~ ^-6P,\$ȀT-ӧv&^j|-8:0ѝe~zZ@LNԁirxfs1|V*j6 IȬ~q% l?d"C Or:P\0Q! +̄S.U ӶIh45,|EjaY9UF֐0aP",|O/H]2^Z*"ub/U=T9y 5q}j:@dXjd>Ly]9(IXܯ  4Lbz6BFY\H|-KNDC~%}deuqw[yal%T`b_N o_^LudHqOZJeA}g]J/O@#E^w'@ Ζh+IZ<{gH>IdsZGotxCy.9 5&BBБDTXZKoK[w.*뭎0YdrNx[ Qt0\$\ZYSu$,ljѤ2YNPζ!EH,R")cD(MnGWJ;іrĆJRS wQ]V9vo_):рD|UD>xJ'l}P^&|zZ]F*Tѹp^ŒP5x9:IhHob:߯u1l͝d#rBx\nzoP쿒o*+@ce'aVд~A.nҮga(|""EBkЗn6ELQ&j-ػ),T3%elčzP흄_q7&Sp!kKwK픥Dd68.bhW|DqUz!a&@T토~B'ɱdgN !g\V fP;e'QU~<1­@|?SQ/>ب;x֗WWy2ƾ=ey+]۹V#daN1+A8 9sʅBca}¶Տؖy@QK;1P]`>f[h2"e6"Fsz{ s\&R(8Pl!bJ͹-@bucmxxTc(E,ҨwŗT0"k:0O*q7\u[$G4gw[~Ϊk{ :"ʗ~17Cb4^ż& qekG|* }wIS8,;oV+} M Umf ^SXŽ59ѵs^O&STIb `)茈}TMrk|1߁|5g^#i#yC˒OQ W<];Zp J._(mH?{SQ@T"fDZ[6 B#zf"\0/[ V6Nށ>Yi.M_NmZF|7!zRM8sr]{|+-S٠8 漯% |NV[V dx1llدg2U5W:0 Gdއ.b /p!:AzC٫zNn@聓Lp.ɣj0XQX*cq+/} ][gw/D"ae: E&`~AN4!TRJ';w` XSIVHTTǞm2.*::z!g\azó.xXVw~N8eH${#pT=Anq^yO /[c.d1}-toHZc`!gl9nl'm7|G*n./'JqLokϚHQr$괰q~K tߖ,(mк>ݹ!Վįn (w]Hw]QqĔԗ ڂkQV^m.-*w̷'w!ԶE1G*5KW0}Gu YhǾg$,iZptѕ]BWOEl}b2AtU|3"6 $(7Z~p,uS< wQot uA e D+t?͊`JEF9cPCΉ,(Z@Hcx@vvPo}+D(ר53Ʃ$qRyc֛UP,΂ |6e~2$vExd-pm2~ yŕ_s H8#^}80ٝOxE,WnmŸ-J u6Qx a8c,bcBzN{heF(jێ8Lg0|bOWs  ,tH[Q:d yvYm.v & ~`h mYLrp =aU $]_=?o~m^x9΋ +t^D q馉z%%)3zM ʩ1qډNQt~t\cFf&c0F5Ujptύ¦{2 0 y9rlw!n3/qwyXa[4:=CΟ[IF@ƌ"KPy2W" SZ*$eLKJ<-3͂"٨e@ճ$$yDb}'ly3H؃t|:nX3?t=Czݷ2bF Ѧ鑌г"3]1Lƍp>_gX42(h@?gO&0,= IJdJU|SɑOSVn]s݇j~UF:ęRg6BT( :Ua ll1k1#J> 8cBA-*dD<`§Dbgc4y#7͹ i{-"MS}ct.P er9qBsy@p^|A,S?tk?!&~K%}8L%:!P ,A`.20"VU5$RoNi܃`rs.ͷBÒB=I7OmO-t6ddTHI$*R,9詘"1nJƟ_y)Jq<2JP#.hz9:e:lϱD;(RF B"\C3p߂+̑)cK@R tf]˱NИҔWq6Zoƴ^-'X$\c!@ͶG/}{oa$-ұOSmX)lF5Ƞ4|SXgؼau gA&"W/0B&"=t@Qh6 ,9d++2Y*t*DSUu@0Sk@*L,Bc%> n${7,Viu! `U˧Aÿ+INUF_%*H\.9OsեNC% 8ldsl;!IJhevJa.y\e=B;W2Ϩvȥ{>݌aƮ Ψ2Tu·enjuk5 eS@en:l0[_ p|7geuX LtTʇAgI Re0#ҕժm$fC;kUCM^_,:m 'B#!v"j4K$T BMCUVn +zwՍ9r-5]uB`WnXR.Iѵt KHourj:6:mCV:9}[/lB j/C A]b~ޚ`k`$:rG;+ Q1j0Fn1^A~ cл{l1ZH _wH*lNMR(gF{]R)E$}&>_# ĴS!g Ax^V}j@ltyVaN& j]n$JY4FܐUFK(qW:MMVUriPm<~e |3x']" uA>NY;=cn1,=z7вZhIVf*AW h[FBdy1ݿ? r4/V?E*eTTs|kfhB6a*,'R9Oasםy3 y.b5=Z[6}=Jt{O̞3um^$ٸJ~i8bT+j%tJtsɪ75 /;XD#$d M^VG q12~T6m 0֟YsYf=8HhvOSmt- *k?RGCüx(,Ikq G\їͷ(6ggyEs Mˎ8*Ker)g=H*/u-!dmrѳb`Ҩaa(;Hd{ xNp`ҩ*{'lmk<{-P#cM4m^saVYZ5fq2S!%A6 l[)T6<bXhX_}>u~^0%]B6#ʆWT~rh&zn-(K .Ï&e@q>b PY~w[ %]r% Ƙ{Wq@Ie#E5Ar($vTݢ$#rC)u~P(lCKQ\`fN˶A pVlR$tG?X%tP3 sܠpI`S%[kRČȠXnY1{񨎈:W;ez,=2z%' .+Sf]Ҙw}~#3b۰wYD"<٪5 -fkHoQGjpWY٣eQYFԴQ)EFY,:VdAH0N>؈;Sx.<2,4 5h~ʍG HŪ&Pׇ`:K1 X] C⚘1jx01X<lj?À*l{?ZnrF@R;s<.j9hev6iNA~Md]أ'7XPU)2woVDQPl=$020aT9+FH>픏"RݱxCG (cᤷm5e V+XB1R fdː\ߝ\eGu7_MOvsZ$ePb$o*uZ!?|3OH ^Nhve}OpJwup1_ apu<Up` e,*r}&(gH@Z"?:AbKaQ3X,@iY[l=c,܊3YG"Cjd8\@HאȴO"x(Ed MO.5 _'J5I&I: 'Iݯj) J4DU 81xL)?I)ݠXv)/|=Vn4Fj$2p=E?cD&/QEg]Rpw}X*zFՁOqbE72A\Hch7؏{Qrԇw\/r_JBx _ѧD/#ЂXaf UtY! gj`4洦\EW:{GsmfܰU2j,ɳWlh9!h ǒ_whǞ77ReX֎#d YDlA!exܰKBűHj$kNJU{E`+:mV81ۨsgg ?yĒ"\'zuOJ&Rb݀6b*(*_c\H: b#H US6с͊ϡ,i̾O|c?CnV/{XҤӛ_Aݱw`7bI}QEZvLڞGanMqhfROǂI95c]MUkl;N~ձnD;m%h&0pt]++ &CS^/>?梠,lJB?SܴN +!)p,Goe#j-ìxv,Hhk"&b }PqJ2EN3/ϻkG 2 ̒X<;&PxX~'_fqϑx}oZV/%ZH*9h5N!RRy3wy"2THbe`/MhJVnx:#9 E:矯!i8#Gd\ d{Dx("ۮT>5 1M⌤u-Q*C)H *DLSI $/'KT,kV@aa7yZizV {EZQ f <}P !ͽ\ύp3H 3!XzcR Yd,IMiT %~AKCp?01׫ֶRM^WEO㩢dF Ѡ h[l %Ft= L?g)/cy{Az7'5ԟ}uLx 4dN҄O*7 zMtߙKYx1JHRNC!F& $Yoٵ3_ӣGNMͳx ;QxgV3$g븣P-'$QRdz ǚxS5]'5\Di#" q0=l^"j-D&^ tLO W,I,CL ?Zu+Z݇②=Ek:i̘brBq6=d.qHZ/'2%D_Om Pm|PJ*ǽQ@p3DvYȻ}M$[Mb߬)f,neRµҥ ړk`Kjښ'TZhJY^0x ME{BfT>NV=`^{Zq@zcvxwUMdbx IY}ŭi8:FA|n~;?; q`D!;jjO6*0~A{N BӸ%. ]̝1[μ uo[M _"VO.#Y8AǷq5xgO&-+P*K}C^ހK<9/ $`(h8}+0S^j~Rn az {͂9.:(<ۊ2P g’;FLtSD+u/=;0][*| No|{%)p1 ~}4.e/j8#j VSʃ^E oϏ~&z ;؄N#DjLl<` OL0L4XՆܚ Al3}&_ڏ2Jp-dVԥ2aKC1X;Ԫu\߰3h^aBTx.t+(V07jcAbm @tt6f7SW$ RD~ =W -4LJx>k1ꠠdaG-9ҽ{⾭%D1y0=a_ %=DYQ~@k"Y<76(`1yu8(&Ky7@D#LvVeiκGX[ )a r.p)i˯Ac:hMRy 3`__38[ik-h{ͯQџ }P0*8pMñG=2HiĈ}7iM`:ql`L"֧J_@)}z1'9  8&3{/y/FQLȧ) Co%m/`1*0FaC1$ C!2BuMNJ+왾)9:rY^ԇ-jiH@܈; ?t‘D F7\[]J݆l8i2$|q:\׉b{;=RZNv QPۜ ʪmzBC:ڷBQNuOB=ŌͲS^`soAؾQ1jcsC[[|4Hl\n|~5)ƑM.7B&j*;_e?hI.~w kN -M_Kturma9,+`rܡi NWNTgY`r| 㜌{*H4݀5Fu9g+쭽lg6h wNn= Wa>ɬζ.ah|VqI[oq0Ω= 2Y%Wڟ^RRM!ǝ2!Ucyt1 WUM؞N|9~%/$MyPTV^%fRv'l2J!?AGݹ3%k@RYP)E-Fa3И봕nn\_4T$7Ws=Gjp &(5 {+"Qj3:VuךN0Cj^wX48t(odcoO}/ |d$^PeD(&Y3r1% ?0L罺 h=#}TpEoh)pQ:)S!j5a=ke})uqG] "peg{[X}$ }~Qx:HB&?Jqט+9IyBfXF~Rm` 05| {l# m?Xwi :v@U$&;d`L ]P9]- 47 jگfg88Oqf28B+N@ʷ*$j=A:f*)օ+>K;)D4;5%'IN$\]Ò)Q>RwTL{+K{ia-= a/'x:qC [sb4:*GsSчdȴܝ-4ơUX7{A񿋒pH2OvbF&b Z2QOVw@kg>Z8_B2t wtvԺHSy?NsY|U.OoG6?āW]+C ґH4w!JEɬ A4ktEh%Ꜩ Spoc$).6'qM}ڕ'Aj1hi5F\Xf"9"AQ6+}< @y(93)y[+D;4 da|.m }uJ˭tA11 q'XYD YoLjfV/v|n]]qu!ZV j(BC&B.*΍AiMTݯbH?`PҥOTاa m?4/y|DENeSV'?|{~4*&B<4,[[%KyF~߮<MLIQ! zSdz3\wo`cB>g'Y.ZD-LMa#UI%~Kz 9f1#jaGBCT3J!.qaUC9]AP@Xw>Ӥ1{l0}c])}WQٟy"9zr3ιvqC_ ~4I~p nP!mE?U,GIp_kY2Rq^~}\9RLjjۘ^ yN6p;s 2]ѪO-i9,Gjn|K6ZnV!Iь%rJǃGŕ^0F>sN̆l$/NyR?:?_ާ"SGL3C.u'nĤqew&\^a:zѬ7̰~hN:J3Ҹq{@n쪺 =ʆjW<;TD2F+D=\@4f?S9xY} %J%Ü݇ZZ(b^"IjEҸ _d'VzYS0uJ9:0#5WG\|C`1܀, }03+®m"iMC{3@vw]c,tq}2% C$;ԓ ; ȩ=u6Wр蒒V$1MgT"aN^e!zs@*W5HEt=86?ADcpJܦzqFE;_M>h^"4lQuQ?WeHhQ LbR(R]Ht5_Sg+A 5fw믜5ck јB,#HG3 E5 9wYOd `nIi=G/%60xNWt mP<>|!E(~#hs|CnXNmX.$Z1;wڪƩUSBJls㡰 @^_Tm*ultl&WT4> jڇsf 8\ N#J7]ա.DM+F82BEr!qJF.SחIMݘ:AMj.e""S28fo]T?O۴GRPM<>]1 Qw#8\r c2X. EOc]ˠjQ,i,i? jš*_ F{`I qr6\˵R x@Vx-SrO!K.!]JM+rAo~I:8mj`Bo pDUGQ,LK*#S8<F, lapR6UdSY"Hrm H҂"6N4W0'^h}Ig}凶'`X=I9\bK=_P׭ q{|p>~K&י 3ʣopԴdh416q"^!ZM[w`D/ݗ]N$Y^. gb!^; Tp5xa`Sbˀ!-L ȧ8].5`n`{:. #-v$K!)J}f%$S\` tׁb(e=Jc: Ibu|Gs]nT Snh (bB U\G/Ew3[/o߅jCtw;? ,Ǝj֪_ۦ7H9΋'UKU_D({Taԝ&1e;jw8MŮ(P*u.kc_'qf5sr7ehݬ(Y%aYe^ӱ~jDWpbu`u3*l ̴I|[ 7M fgs +Tш;@ tًиIu+*_T3[Hj=1z}K<>whZMvhn m"nٲyV9Ă z3О7A'r4<+ƶ3Zu9>E9[Q {y0\ U ʄ#bED?t"@eCxOҁj(Y lD,3JN3e4PFvgoF/[\tǖe~J:7v!lesmpWL'D!~BGm@ .;!sk<"+1'έuJf~H񅗞h[n/$֖H& cq&T^YZA-iu:0unDYw|El-]D>ϵݲuP0Ϡ]`(G}Ѱ%+ӑ2Oΰ@wQ$~+k}|VG*SB0&ye>"2Wa_F%CY@;KT[m8!0VV_D%xJD[ ASk(tnPA򕄐kO(hyᗁw*]?S @qḱ]RFO .+ 2FM86]p.3%۔q24nQ̸72jNy%vjK^nK8m#ެpn `T@Nm<)W(EK9}A9۔fu$V^*^[cTNףFmp]j1rXpL <שդsH>/l[؄vD>W[wdqyyJ{`O^ՠ[wi^@^) +kK>+V_a'Wo/=eGXMHyz eNXIZKTs0)i/ɅJ8(UkAYcEie/gd3I,d2x@oޏUޟ2Wz;G"Cez9'x>UBx. ߞ}`oIYuYc3|&9do!0TC?Xαl]Rԝ)znKݕw _4/-,Xay;\l8ͽ89H!+ƺy<{5?ۃg㔠#D^{e\zPns5ڈؠU@<ʱڷ8s.}xZ$F00_T_5-UP&e1~qFZPL ),y$Z[F35le] iH)oqN^}-lP%qyxIr?vD_(յFݾ7wzUREvҹA\J  x _m/BvNN`-T%#f_ v & D q/uWN/̸#b/)s.>}cd+s ]$yIP=%`6ېwIc.K1^NRn@M \ ($WZ-(p9ߍu9߰G ݳ >gSҠD?tff]l71^]o[96_Wn~ݑV2e4hP>Qfdif CD\w ,^` R+-gjSH˅9<;wA{De<5nֱ.9hV I/[j˺T* j%BWX)d B*82RiA3 was!{wMS e=Y'6|Il$ TJhABJNuMEISЍ(->aE3!3ZayEU~$׃^4uo1gQ$pk^MCkyeSWf(!9Q!vYex27T4^O2ڱ$nYu ÝYZ.ria=AI&S;ݘ[g]9A9 hF՞5t'$WlY8kNj0uj绪؈=2_}xG4hC+^3Ô,"$??ۗtC#*DzcK~LTGXo8c,AcOb..NOX}nDMQb]mg2-jӡ9K|}NWYC9u͈P*wOi$!o>ƣ]䂤5>GH6 Nod&%)j5]\Y_ugc6nF_?ixjjR5X/`alyT`YՅR>5pLek+m/ kڅ-\>H;kԻ. ϣgBk7vwvXHV;.~цc$T2n^T.l]mg9W;lNs}W/F0J20"}M*ʿm?>=ܢ5I6>]b“;%)X筦y/\駏bBXm )@ׅ9rRʖR $(Eޠ~PpsOņDky8]>~^ ˀ=Z-'!G+7{׌Pϡ%#rk1TGt  ۻZ赺KxTh3qkR,9ʫ &LK86hn.\ u"46kA=ńIJWW!A2ٕ+G-0< xc殣aFj5Kd˖~ V֑)@= ]҅n'd}WbޫCFaV_tghWi߆UdYHq(qH!Yl? &@{IۄiOHX&bc%/- ,v a@= dYaETlm!qc|d?O'~{, ^(֙uK9"`9c/9Rsުt/mrXFi0s!a+${ TntM.*y=>BV:0tͧN ӆыS8ةsxrW*θ#b /a^{kⰪT܍UL4^Nq=5@*%غ!d\k/d wd $H0>3xNh6lf$Э+ugB- yK81Vݿ;Kpx'S!S@Q-7& ,s5ȭ0nQ͟hi6"d4&c:8lۈ&K$12}ܲu2SV TeE7NyKX ğΰke{]EEG5L†W$3-6efd>Q8r}QQw(Yx{?"e!;ok]Z܂=$kxTۭ!Z}73$DP 5䍨G&:V:"*ګU{/Cd"Z &^ؒ 3{HK!l-ib;*mT^0S.7_b0@Ϗrˉ3@P](WF7ˍ0/>022& B|r%Kؙ OYWj>@۝598)LC$E+ W!OGҞaV>z4LϺQ'm ? vHavGY1@Y4SĶL ɡ,#k$D.|1èsGHcTtarE8P@8O5e-E->\!`7L-;82߾XΐOp;skBi ladX+ -=J|x~8oc՘ 'mcS,jm]Aו?yALpWF 髎))NrBp{ ^'>19֛Ӊ-s&=}]&1W!]eMk +ù' Rޙ>P_[{'eJت$)&aXlȻvdz&c)yE76̏WgE0psp1.m;-(Ok %+7|:5DA0sY, {5̚W} Iu[8n;^1Oy@P g#޼h(;w>q,U4v{nk;4A[ 8Soce:sݨ&ut<3<3DOiwUrcV#.OEc&Xó?[;Ưx"口|QAlUjzq!h tm?V> %S%hEM2D r Cq hGw(i(H%Gb }+\̌&kѧ|CfU}lKʬ=ANY&a{&s` 92JS?{+ji!H:gyc{SVJߩAНL07,W%z(3Rg}H4T6틦0z#0 h$('3D3p*L8Kl8Bn'tss#qsEF'&kΗCYgθRJ_,7EF^ l!7:; ]nüLwݚ #`h1C4iHҏJ $к2k2UUM;K0J8x^S'wt1:3_@$i£ey_}-'m ~-ltbO//}ńףu5DyA @!0ğ1my݀H1ӪT%T O^QFooP–es&jZ2QO3Ie=(3M /8$vuH˲C ]}CcOG΀b!`/8W}HK^n!J0p1#[\ҁ2ςr3T=aF+;T۞x>R]ZT &AyݲVH!g͕x벢3o_:(KL[rTܨ*,whQSὼ!Mdg|lA$Mna(h3.iD1s¯Ŕ'd5:7bo[ X.'fH`z?fp6r=[+ ŭ˕ڄyƆ R_aN9Nt;fǎ218={&fv-)QmFN@- T *9l#BW}U[,D21yVSS< t@#:WJ H(g-]Iq1mLUouR_: c 0Y  O]?SB$7qʃJKd9WI4A 40 "l[opؕ&4+3^BQ,:Te#8gVBއXY:ZRysUX\OzvHtJ.&=0$IVj\uOGXz[4v ןHV* soƏ1ƒ; &Nj(V9꾆$WK/9{zj;٤m4΁KwzZYaZxo pJd^W.'/tcDIG.>9қLMѿ{#5mzIE ^#pŇ0uY_{D p:qlBFY@ϊ/y؆N+D KIAo;qcUns;*P<Xf?"STR/>B<}J88(7>׫G$ q_7=P$,F8!u-/r̘[kU4H?ƂvZ I=L|v nF-F|~y鄗޼,WݑF^kp k|I4=Vb/#|=0FTkޛῩ3B;E;ImXĮ$ Z<_k4˓ &Զu]'>;h9 l!{US4Hʞz">-,XD:DNUEE.a$k>r*k$nDމL[\5YJv!/3' zww$WTR%kIBy=޺]`*M -]OqDb,2 ' N)zexKڪNUGǹ-@m/&J VGķ:lxɘ7<&)_gqk KT5,ȅ:JhiEc$ݬٌKƇ߹Qʂ !E:}7Ĵ${ E,H|aj6SgpgFTj<{M[^zt+1gm{G@NZ僑yF1YR6BCփX]6#x;N(jm4IzVvVqW*TݞcbP$#2?Ao]S1>S_Hkh'ʻP!)v~xЩ Fވ%N]Uy#n= ^IN^dyηV>t4`$1cBzJVCd(`MT7CqaP+$0o&R.>>sM 6-EI *kA~e>?n*Sy]K$lU9NVXv#8:/ I'_lx_].%;r+ )ց<* # W(?J3puV"i%2(H~c S묍7٬*GaV&ԧA7LCMresմEIEא# 2P2C; 8~?t8QIyN&jlQ~m")J[;#|5Pi)YG \Zydr^ ЪXYMn]" ·rUhC!T}>4vC`@󐰾X3&2tUn'T<PLҤ󃿫Oy2 v`,ȏP\@@ ~39neWzߜJ5̋V/EyCc}b+NB߮ 9&PqSLlD `k?d`nI Щ9B(kI:P9QhE3sTgPqyRCڗ&e@jN2q۾BŴ#ώ:z;bƽĥ$mEZPʩxlhDZ Z5EN4l1zMWQ++|j5>d Րnr4K>)3%uz'ev"sɎ[ݛ53Z@' VZ1^Tv8RX]#\(hŒ>N~58tb7Sa4^pBKj!ir!B$bZ*R m3zclˤklC$#;3G; qL6rI 0پ=qj:ZeJwdŬ'LV{āK)IGXpO/~7@Jj!5Sp<4HG@*6[QI..95>CaDʔR*JEx<EyV?l n{ӄ+Q>2N%j%p|Ha_ۋ3b`B[UUftX \Do&U5$)QxżG{eǍ?nx.>&zuR pQ*?➂n*=xԟJS}sYKxODh[~ײv zD+[ՇHJ\SÂ56P%fF͂sECaC"g:+@Ɲ IA^})5XeR^JD9a:\ToTA3+RHmPim\AI&S<-=.8ոd%fDO䈙/KkXXҢnd`s.t7<'PǪ_I($ R#1Ժ  s99hnEw,-B.[)4{juUŻ}ۗVjsJC쀏t9?t-+%{IHG? =f VSޓdƎEnZK38pM{J )x@_ߢ/EBR:B穕k?v5SQ2)./'l CA>> ], ]K*+$O 1 b]gӉOwhǾn3- fgEM ~SX?hv''?1_A D IڢoOt7j7wp9p1 K#DddH`[·$s$e%bXoLQ=/TAN4md 3fQ|z`[nt^ßֺQLk=lz!qunݛI:uW?BʣnH_VrswAbCу=#I#g7(5k J^Xj#U8~Ps@H #^ 4tsВ;v"D=U+mm3 ) .A Z +Vy%3׷0l; djm8~ s:@`C[#޶U l16zzxo+OզX~^8BlĬ40ed')ȩR*pŎZ&㾕2ňG4Bel?2N1)r^i$T{-eUENZoK</"t~e;YN 7Ѯ3sʩi"֬kPJ^Zqt:)3pW(67h@źB-NMK2n΃4g"s#izΆ)3iHMv86"hn %] m>Q8ƌ"*fMuLQ~jޭ0.%kϋs^ȭ'X=7ajF&ē+wʨrmR>]g푢Щ{ǟn57PhV2R^&kyjC]0<%~KU"hII@:@nBsk6czQzE5_z@KB` Ƒ4*7}LjMpn ݫ^~^H-idjĮfе/樑7ʫ)Ð8$vx$RLJxj/wtD_TB~} } #f ala e& ,+[7~ hÝ%~4rr_WR a㡅{Gɷj\$ѥ}EޞYIbx#pm6?::gjSD8;)>|Z?fa徸QͳU(7}f, cfX\J*^OЎt2g? !5ģ'e(ّHf$e{ڬ5P)h&VR}naPOpRsv7|61ޅmkeiH$ዡ{G7R1J8ˋ6xtWT0ra=ҡAa7,N]&A(W/1Ut-\RF<z]kfk?7s}| }CIVa<)=V-iڲMhn, (A;J^rՓ& IhswFg=qj:&nmy(+@b [# Q[EƉB:?`ٖ%Af ~ UBiv-1xs y숝a(PU2 τ^bN і `O鎑$㡻=r+˄ xN| GCM۳%gTo 7Z> P }ČMTsrB7"pV.A)|{4DÝ}"5Qxb7aj(ScXZ}zf( rLDD/?`ɤa:aW6d,UsPģj5h~%쁄w c| 8:s9}c[S ^Pb7yD,y`CcngH!:J/L+`UC'֛J00!C>=>ɺ~uO-NN kR"Z}$Aٍm`t֏ixkH9z-r쉃`va1>w ]9. '~9_, R Hti]_h 7v4k%8qʑ^o*.2q;X-1='<߱<*èIE?4NKbO|'6,q`v|yMj6mE%PD1O}F'ԗoh!\qz>ڕWM䶘f-YSpO{nNd\Ir1 vgM\sL6hm݊Z.~%['b~y.5dܹ@m8G3Mb\$vq)5pg>'pX%~y RA8ɣ QHRQY*.cH2RvvL)MF==szZ!)[bE o{VX[@`h8flغsy:5>3\{ v硔e9{D0b˯ d'pm>#x3sSn(,VKﰰTPu4|!$<c&:Hw0Q3pC jŵ!u-_m.UM 1 ,=L2A3H Ҏ eh?ņPPBXS/$IRmbE+vHNζQ޾u+'2m}KO_ y`B &y0d:Ro~#lk,ux^5(OsשWJ^V@\jb՟3t z>W#rnא %JM_6mM'^XS;PYw3oή%[puh8x-2P&]~y ՚"|;e?8v3׳FcJ!TwTӥџS+ŏiژͤS3eV,)Di8h6M{_Rʃy$8C6" 6dՒ0ڷPKK=En!D'^,C^{53Gp5,`N;*kȽY膱!w̙6g@Kݠ` DFU>xv㣺G$XZKV$A߹oDȪ15iOSBnfֳh |ʈ[iKogǥ!t>ןZg˻!CdPإ>< byۮm*tUc]#Z6^WDфy:02')E3~kI;Fa7JCE fңP瑟7ʹۅrFp{ QNW4-Q-eՃ!m䂳!KWg FB0[S۰v[KTr5H_~ar[p6q8)pl5_1(3(wW0n)IRͰRW& %ΊI#vvM{\q:;0j ET8*p*y _!2&eZ;}vpM 9;ñQoGFCxR6ne 2K3csk>Ve#f9O.MjLȇey"?;l>ؾ &u+u2~d4RX mlptD\fdrC"g [T1QtjQȡm-[|%TC96Кp6ke,3Ҁ@#fiuԗ{uf+p!6X^YAϴ_X#jb{w׏S\^tpRVD 7~>4n6wܾWSq-B@dB1D*r8th|{ExGd'dr Éԩ#L :k aN5.qndUh16r$hR>Kkh_!s0a,@p+]D(QHjdQ߁JLAi;ݣLcy'tp^|[&`Ӻq4]d6ՖpwVk:;;!Wq٢ wU/ԉasrK'֠yYhkCTOK/(|ylWNy!+TD{em՜; \1;d{@^X.VJɯ-1 ȕ6#j|nK@3+zBqL^;&:R;} x~}WJ_3VrB L<JuFMzv}i|:wrQkh>:&of y<12 ]e_OI% \/}]D(/}(ubQ]O5sÍu=!W-/{>&C D L.xΫf,(Ͳ[d{wM޵dm"4gWLG$ sbb:jVʮŨoSBZpv`dt<*cQ^ X,5i o~_ #zCN%!I͹</J}ݖ\L"r|C5@U2UB\e/&6~`CC(([K H7̜wo䞕%޶>nkz8'?b4ANfm _BnCY}>81)Hk+uçû+/A.#t[}ٻ4@29TA1$oBכG y˂7i@s8u @glE͓[8lȁS*:d?m%m;HBYz@\<#ꦻAO&ޱHWGa8+n=VPzY\Xyl!A΄RpہtZ5e[EЇ; |gy|k'>c[[kQ?s(KN 7 1"ɑ,I rcIOMCpH8[K~>>Kį#_2[zT%CbM2{-,(,Fvۻʖ(A VcgL+ߵGj'*Gdp1a =\%ԝ f{*/1)Op 8[JP؃=0jΡy~S8=&!ƦiZb݈wKe:h黕MGWn3h#w& ?8AGMKihB00/cNEGy.~[(=)Qm526v\RmҲ-S޸Wa$pgFݝY6ޙ )@ZlT$@14`>#(XGUR 2=K5Iܟ!Ѵc h[+,8aUH `f v" TvZ|Hµ{U:RDԲZ0.F}caS=;Rի5̨THOv[Y[`WFk^jQ ֮A+u&>5r]r/uˈQ@i?>,$0yNK[YR}Yħߚ.K  jCuc@G c@P8ѷRj3!#")t.$oˑ jt,tj"|i]`R⨅d8׺C>6ұN:__JO׎a#HHAj_tu5[Em(ъ(xw [${:ah]2}ZAP:"Y۠Vy[ϝUlvu4n1^5bSn]a  78+p,WwUäJ:_]{!"GA+}yƤ|ߘ$̠j e#1e6Aq;;3>qѰ$w()z%q5c @ެj˪ L^26&Sj@z^(**S}5=1 ߃ɮB+EwpD}e8N S٘y<X c$zGFj"60cB|OI:(`R34B(} XXf~VߐlB DU_:7 p6Yer0=%(yK7]%-dFJ*w>0頪/d? 95QEQCAӬ<]` lӧgI.MyYdXOs' ]u sixFyg/ _^i†AؚF6GVn=klz?o|1I=淯%D@ &ȒzlpZ D* b̤mF+Tv$'b;`-G$%Yg5Ei~*zsyMlX6ΣÔG8,>ކ '{ ߢW@ƁС>?g. h1GGBOllŌ*bRZE"LoK#+l m:#_X/W,ёa(W9NN+F>SR*oS6̪țTW?)7'+4=PP#muL.uA{V2~G4`dx8%*X=D0fF?YuIJ Fź-!{ lWe׶#kdmKNL|Vd™uqor֊ho ǜ8|- KSyVnG6S3Lrve sl*C2$LF┃ǼAFm2[Fq[W0*KͿ =ƚZP:1 !r`FuMZKچG%a.N2Q(`m"kjm0f$@&<#N+Εӧ`>)cWb^0U#W=Ycе%J2,~QL9T ciBv 7Vg!m?O{3JŚ IG[ T5?X@>y O/1i lzJit+"ү{[9JY]Rմpض GąRbY]Vl|4Yaf* e`D̎$}$C+Rh->-5FRysGnf?5 #mZITYO@@=]*F< vURms&anM?PŒzշ2Kq-30eL9ZRn+p*iw?pޜ>Ɗ-j_ק5i}AY_9aր%h4Qja¼䀺 $~J%@?]"\ON `{@<0Y<׺<g'Q1-n0_/46S8ZZ?1İU$s)C v(Yg)]?3\RTu KwX2ףǍ3J~-(h 2-6KB1 J_!+Dvk%"I-~ur&?/TeYn?rxN s2'ؘ zwdvbɚҮY!Ȼd:V Ո^Rp=nKpYq3{^~WN}TFm}mț1|M屿B^ yWs UVn]ں. `"[FfpJθ 5hbG%pL,.]jth,?\ ő*)"/hˠQ9,M .w$2ݭj?L hqɬM\lz탑1MAJ q K /j z%+J`1E s!ӕ4!׃ݼJG ݦ\%gj|SDN=_Oqo͜.ozV%+|xa/:yB+XbT,Oa;X~iGd DB\1HP=9C'УY/BrLb.e<*e3H޸H [z*TŴTf="[_BBŧJ^rqX_ q`2A lVdxX\ECG]ܦz G9,cY5`"r⿓>Ѵ[hㅿ|cSܫ'<]B!3rI~mp"ΑK?ge @ik˜``Y(loJ`׋5=l!74R#vw6#BU730Fm5lh G 9˭e d<؂,;"G^Z ^LW&(%yz&lBb9/:A*_Ծnh#s8뤑y?HPQ>o,OFǠDф\W^DUuV$w$9L!XM5vi[ĖyWiV&e_?&.U[38}~:aJmF v?}+5E؂Og >#X5U1rV"$VXq1_$*L VPAʜ[xo`AD6nkAh-u@#ՠ's!fs3ǻljcEDqY `;3:zɤ]hQT0+<CR7W/V/؛`ʂw&yYHw[*|J%vcֆÑ?K%{1ScA ̅A/w\XX^' 4DԳrM-'y!{A{TrzH6..Pֲ=]$1L4G_!=ИU7*uNi ߺtTjyqQԧ@/8g#Bym "S(:`_T5,2Ar% j`j10vK7=xM9B`cθьe*YĖܞ:h:YK <+y =J9Nx?E((b#c%kz`&-<7@J0$1Ζ nRLbp+sƣ$O) ;+: ]˂)[R[,Z2 '©buW2C u.I]H-V NJ$7jo#f"4!'/ @K/tGr//0Bvnf6;;jxG"|"J;U!kvCVkf=ܔs0)>ߦcA< BSrxfJ{Y"kXq߀ :o兣BuUǣsbY(~'. *bZ4}.+Sd]AȬ CϾO!]?əGbt=al`mjsP)!u'ì 0%^q5iG+?]kKfDT~$C o3.sqb$O79T\D*{3/3Jwz㍭t+|O-x80M6&W6ڂveF`IU\41Ĵd3xG9Cűl]ԑLq>t3%{HL`} =í-0B}( Xo甕Qh@dҊsƑ鿲[, !8N6n|WW׀PZF 1霛QMߩ&)||n/'#Wݒ"<^6c A_}2a$!ϔ!M4̇e$4x9ud8n6XFλ*$֘ jN\ݛ|͚Ħ2N7N3GD Mp0'W!U ൤2@4SGo2 Hg- VB UfTRPe֔r$sTѠ }Xi+ALo"tn e)adl:Z7haǟG 0bQ uguǣcF'y1t G`ܼ̩Uح8"i|G2KA@b yݿ߆ KZ.G;4{7]><Xt@rˋK!Nr~4:mYxv8c6 R_dQ9o5x7ޏ-;[P63 CilhKSQ ?7$ȖZq g b7nO\`f4nV C',2VDS %4kw@y.ap\=, E'%a4[aKq'8{{ h%d1 P.n c)Q ux1 1OWrcL7ZQc} <*^TI9χ 7"M\|?iw2OCd3G?r4wQ3npԊÒ=%ewRz*ݧPԦ:DxnfPUry1,a#:'f\j0&.@v;3K_:yE ?o>͖H-qbnvn׍@p]G-f^ۘ0"5297 fKo 6ntvb蒆Oc\ւMJSmrk^` qJRqlV\}pZk)+?U3;˸]FL*]_d9_ rbcW/#$/a[!; }wPbf!7o(f(qHF {Bo"iO oqEulR#˓DCin-pXZ{l 5ނȅ*(D^K1c^S p!:ż~ǥ̧!t3Gü$~LmPmP'l6C&9,$*B(= \s*R˪چHPE rgdsCƒ)eQ2 FQ I&Na-*K)'v:UTIW 𢒟~{-۽U9C@$ OT|\l-5\~6U^q[sucTR&Vx[0L1l,PxKqb:O.zɊyFcy^q&me=G: B^[,66M2Ahzf V%z/ ɇ@fb>S wϾH)p8:(' h\Is5WӃ#6h~'&?ّ5lߺJb\+ZhҢ0z4_Rߍf-,!RnI2)cAf틃.R͞?$Z+̛hU-ۖ#QnW-<XK4 82'ao]_lam;;W>Xk )nҴs8奌mJDIi5i+ii&QyٜwaG~,O 6ep"I].=5! sb<[ i8ifƴ[Yc{*3`q[GxtǸ< _;ͱ?D'eLwzxTuViIu_ᨒQttg~eos[J5ErN@J k0g0)p[*W U0RoZQMb[T)YRw<Ιz<;A7B`@{h |@_t_|[ ՘ĦBɏ)~7P]1zͱM@|{: 0eD>xiQ91fb샂\tb|AwgĀ%H 3R-ύT(z HGyֿhSui'TDVHQA$Yk,R>Hkݖɧ5\/SU.2(+r3MiEE]ivh2$j3#vI@f؏rPSTCÿ8!q&,k Jfi|1715uk;w oL}Y(+ɍ1eܗDbh)ƾ@le1;-%Z.\W3>&K\ ;)g]F&79i'`;2Uc\+Nڍ7&<)5OK }S% j Is{Cƹ޻.d/P_J~֏ޭ mNSn|q\wřٽᬮtB׌(û(;@ fcd-%rS&qhC$ k:nn"=c RKKbtwOtw=i.>~=6WŜڀ#/HruRrfqxųhG3+n:=zZ^eAdI(*_]T-W-0R[gT9mknv_&IiK dYy,42t3,b@&< :Qz.i9Ts,F boY%9r1$^Ud_.M|VN/PsCiXL%7Kя3 :A}׿oaLXj}@5˞a؏Ts`Vrt&(c9v!USV ~{ˠܾVn~iyO{mѦ0'?CIl`4q>2j.0IU?FeGjHMBo&BAX!ṾxvGNlғ|]ڒ}-iZSZbF ٪ s<<8;s+9|v7Yvm@slX`6)aGέDM\Y`v2*BQ}h*)y1gw+J 8/4u: 0ܞ:Rvr`}( R$dڸ{R|ad7m%=第 #e)#=C@+{A3 ~XA; M4%psO53λglX [qW;'Qrhxm&uɗpÓmHmE9kV[vގ'Wk|}#I#^r?"jtc~ *ꬕ7uBv>q'( ѼffL'jwD97H(SiG'Q$8 g(z=:+Ѣyh#2JKx{r 2.J6]EVETjoK<~0Z~$Z?p4,]"&qsXJRi&X'Cpf\5r4Qkcs1r4mrj!:O9ysmMW1 hKT~]mqH]%Dyx& r l_[0X^FI[O&NĂ66 4p+WcL kdR hE 嬚#~*0A$S8{1ە&͡(ő8yKH!K\0LGwܣ=Mܬ@4,~it ^vF+ F<܊(yYveMFnM-!cK-JsQYR\N sE0-90cVjl 3w;@~7?O&VnF>TNVvd\yN@ '$[x"),,`|lޝY[ut}'ɡ -A+:.}=ۘ"E=,c@;w2wv Dfy<2ƟljANƼN )@KwtߴfxZy9[bptޯ IA{n^$ tx]a5*{W_QT7l'kD!kfee;7e8c+u-# ß;NtLXi[w+$%WK.D\dֵxT?urH$K#yQ  q#&@u" *F[2cȱ"[DZwF &gdwv5WӀ[שgFn6?'~X坯EAPRTVR/ˬsDSg f]aءAhySFCЦq?Ï\C Rs:`$Iڄ\PxD#HRsfFsEzBA,Q(Kލ](US5Kj(lJxzk>Mbלj둙`դ]G4qfv3%zQ+-80zn2??k=DQrxbDbXA\u $C|Vn.!.H-,j4YG%Yu$$M٩b9sW9zIh!HB:.Wds (srTj{URS[ ]fJy#5ӴnX/t`$Nׯ;oGQ5`@(90Вʛ⭉eHʷJY7܃𓺧kp[Jdf˨wȪkEǤBx]eE a Apq@0H0?tbO $̄"P'$> R<0WNW^JGNP+Q lZٻV;HU߼gd#g~8Q2*~sg7|n板55e̢ k);,)<zc*R@}-43Z\%`a#>-q>zXsa"hB#{N.)j {pL Pp]lDGy5l`xsN-=csȱUXDwnC;Y#+>DVމOS9XAˍʦ eYҸ\nϿ$aWb893AWm}qWCf|<-GA)``/p$=?3Qn{K˓fnjcq&onrG(Rtp yl? ~x.%@TaIF!k:wҫFX\͕O078BeL͛F~OBm&n<>A^몚u緈J܄đ95ppd7̦7ƈ`!v rՄz"jft %UaA0!9bHkT>I\qRݗX?Лi|]hf&A\D>4陧PڱsR|xUV47k[H˯_8)j_醋J 3?]vlk|#P|27U&W@[Q<39FR-Mf'AZ|f?LߥKeˊ{F Վ_"LPuO~p5VUTnɀRh"Q#د/-Wۯ*ī1~;pz`ܳX\m56P{@чeh|tczhzg;\SckO-4ezyC`Nѱ`K:Px01%mF:#V^i <\G_%RW0l)p5 B!FP~g *I$N) /І!oUWZ՞)5=@$zi(52O'?dB#+VvzQ_]Eϴ'ĀʽMO'<)55x_"(|CWԁ3 L 4bXA*afƷQXVx0؆qH/WM/k|B 1VT5ڨ=cyC 5Qx;V=itM36>JHOF/JP!dvi%5IEigRn}"˿/A*H \ԩZh GLMSt-&uKzKL"n aEn.0Sf[ ) OJ-۷o_K}%c ])٫W^Kl˅x}0D I+*#%/˭ x]W [ ӂI˧$|cpIئ_ILD ~b!'Ą&Ӱ,W#!؁}vp1@p NUa!3i%q[&2>l$'VQbiWڮeSy|'y:J o̳f&$  cP<He=cj$3k^IJ!- _7i,cb^h 3%rјҸdr=F[q>,L&aw\Zr/vnkfGڄhcDR] fmF \%O/N&1T@8B$\mnqC6]?Y VR&AW s?m+YW(8im=zX&DdcM8_A3hJmBǍZIxoAnݔֽq݇2Xk+-T@mMX,Zw~ϲBlA!O({9.ߚbh33 =Zơ0! ѠFaKleL6Wl= l8h'U5?B6 W7Y΃&pF<ãi{q^4 `@;YpPF\Eifl}lV}5]c;˸}W K{^¯` Oެ?8qtQ-ߑ~ J"w[b Ofϲ{Ĩf?ƥY1B9JoLwy ]3K;#)2Fh J&Ċ{m(ʥS m9swZakB28#s|*b 0Zt6CSbgӏB? pw ?:KY;;p7 3;xҦѮBQ/mq27ye sL'z%*o:اEQ$ZPt ~F CoѬ_Yq8- >-#xSԩJT+a!.mh=P0@F23{v]%[8K֍:wd+amAwnSErq\ᐙHݝeQbmі)Yԧ-ax_hN(,CP/[7WU ]ـi(L3uW5Rvzԇ+8 Ct})&8m Ks1ЌϝDiBqY+{</rx<=%fnJmS]IPSmk- mݕ0(?; (9l+# V^]BVS[zP$ )TPl^I5İnYp K*ױ6 F"w~"ڲW}͜#\rFx_"=sWU0q0f}7-i* Y0n1:,XʊK;)뺌ٱ(H:@Yuj|@`䞟\ `1-3{ 3YX_Uds`rô)?[7h3Zji4XBj/S^7)Zs~.9*"hQn T\+#ArI&S3uh4n f= ߳,/Fw/]&8ia+ LJUskbR9M8T~PF$Dl-&<5 QĠT UH{]O*A2Vd1dPZw_^z"䟝WvaN:7$p#D,"*cZ5B 0LUy\KD1L-o qx uDp'OzvPit^y{Z02 ~nmֵ55^n;\)60,k?$QflDB-i+o?u%NF4Qf FmL(tԷk^ݞ"M}׭)&l,NAݖ)x"8 lN77ϱv>$0MnPUtmNC$CPRY1O-ʷ4&7ꐷ ۊUp@Zd'w*"_dC7?=_:* J_<#F$?Y9{@1v2aƒ /[9ܰŖ.)D} _/DoSH?qɝzrY0O=b=B<".@tȍ&霋AmF6ıJЫ_TS:F9$c l~TT wӒsiE/4[j! l$Z[z,֐o4`YH=Br aK;K9K'>+KG쒋"够c"P1ѽx'95m#v¡^@pc@a.4ģùn(]Ng]!=zׁh>^٪jQ>,Q%Ee$Musu#(vdP WL`cqv|"S](QJu3 zkE}|e#]ˀW|09(4.0$pX%kd@͡FHr"_"9Ego&R]lO h߅ vBe ɩįo#2*<;2lY|Jd6s .8O=`2AsRrfOץ$&0}֬<$>t DR̩ȴX_PG[*zyi|EB:t&BmEл~TXhhɔ.|AdI.Ƚiolt g3#fMno#\KZ-[_9Ԧh BWg0%UB&w][R:zr4N(xh#0Ԛ n-E-ĤUM H7xS Aɍ ~S%Ah0UMp#^ d[ fe@^gzLY:ԟ]#xz΍F{w~<\ <, Pՠ7v)u57$ ehtKy2ɲj2qB d4ٻ(HS͏M^"NlmfÞ|A?~, ;//Pg'Ybé@- ѽLsH/Z^c?5 '񔽣dMv0b+3xpoLQ! M=y ۍ ZRsTD͓5Ѱf~6gDH"1r+e@?qJtW&74qNÈ/1Vrd[fdBO}' z*w3u%,Ca D Hc~m^JϷ7GMAР6ôW.1h3"K vqR]A?mƛQٳ'=DA=S6~Ωx&ZHJ کO!˳y ,[V, q,_֪ Q.0gƍ Jmm0]ktÙQyWG gqxK, b*ykkuY@2"/5DsXt0gܵ &dyK@gG#W %ݭ v^5rɌA1!H?+Lr ?᎝5禑F9S6k 1͏]捘З.{} Amq;!_^1=7ehz~_)uRtU,BNAR[ Pev4;a}>aIՙt e.1?|hYl0FVxJlpw`B4407!"5BT$!,}TYowZ3 `8|`!|7",psR$ Q[ԺÃ- $ RSݽV⡳|P?i{S/sLM>K:~6A̜+ )**2Dȃ2kFΥwG6zfƅ^P Gb|֕ߠ0D?%@ IS_T$L:~%xXdwA1Tw1)ñNI(K[0Rr"uA#ehR ŇsП,C+E?-aZ/솕$&]3/8DP9$ipxHZVBߴZխɘ63V폎yðcrB :fJbxASr*s,y1\}T )r{ zƅ5-^tՐiQG"\;^O;:68|RO/LL'܈Q8wx I6SZxUR6uNr^>c_ }~%+Q/jh<>HzYEs3Dp!10\5ojyRˀ<ן"SpC8a-=TZu4<%m L XN\ 8PoBn`ɚǎó n$(f~:v굕Iq*];Cx\u]OK͌7<~Q}e:rJttJU7l%L.D=Q_`muP cbl{_W뮺&n|Y!axQO# Q\nUF~\)W2@of;w G\kabIJ|˖WCD1Wlr~ʎ 8G{M&3ԩ@̟r}~ ܁%3fȐu)\p.YҚkL=yKPjK -T3,'Tw`'o8QJ !eڅِ*9c W1E GðTj=fjiJ>bO&ݮIF&ⱿEϥhر-jRz":BM҉]by0U?\1櫬j! ?jsg-}0׽>8uW 뚉 iW )ft9<r,9vHmrEGĺ#Ce=bɟ*)S]m[qqv[%0K9Iv̏\)KJߔhMnf zN:0ܼ (ZA6IM-\(9D"nLZ*S/%V*zaqfFX֬|$ W$)U^m Dg?2_)vMeQM)y 7wӞ; - t&nTu8@UU2ޫ+-}"X0yM޿V۔g9b%LZ u $/d(J.S" JmgҰ߱'eތÀ*mϾu" A6N fwiAgztp"ٱo-Ow,[$yAI&S=o+lm<+T$۾{Ŀ=/O,paV[2{QWkH轃^wIMd< zRO Ӱ`!u+U8;%c$Ձ{\MkxY{[B7&/ȥ׺BQaZC+q}Wcŕ@ٔ8 AMdP@IL0@uS0q un-wZ>o$F˸$+Cj_Xǟ{wx*PM 9 ͉n:`=z?;ח")L?8~RK&>FgLE(J#<3fŵ:{w{JPEAN)Զoe2P(փ0_DB=G a$A`K4 mwo@}?B,Y e:EIvACq}T R =~T}be6)Y{baM38ȍ'ͭQ%NG=,/N-B!:?v*r\ }jws"Ɏ"DZP}r;z]Aj!k"^d.0مL+v[㢉'^'d0nm1%mpjRgX>DFy^A0B>+9{TlfǧERU=՞p}Թ0E0a yoz&,mQ^6X"6 f ]bj!b v,5% CʰERVSx{G0ET_%C9)%5vXheM"TeщkPjճ*#u꩹rUvb)c+b]fX)85\KK4pp >_l:)^X HwG:!^WWXqw kVBA,3*l ^:1:bi5~~C0Z~oNdL|F9LTTL%0 LdpqL~w[Nj|J9}]/pIN:D$ ]Ƨ"g_Up:/ .m0]- W^~TZT)`=DVdl]0#@GJOXn]U#XKkYJ.G#5hH@cZ* 4PmYLE[1Gr7CJ<;e.tFR◟wBkIokj^LOPL8^ڠi"Eזb[26ԇTĈq3} :bP48u-vjͿ`L %qG` Ub RY9H1Y˙=τ&TXimjI:eu;7%0ʣC<0M “ta V#L\׶R0 V_<:^l dUE|Av^6脫Glġ W%\uiqZAԄI JJ&הd+TMӛԺB7*//7Uy9w P)Fb nJSZZME R3^$z}!jzGuzbbZ)tF#3e`u^R+*Ǿ4/1IQ$EV:wmJ" h5`!;J +EҠ"ppon f'Wwm)2cj/а/%.FTd(zfcqCy8p^ge)Qiwʩ-dYW`$ /JMeQ _`eW#.F^wM&^*:b#ve l:C*f2jzڅ}Nq.v?Ԧ%"xEQ=q^ ș鯹 muעZEݩr<-}ЭO.T؃X^KfҊdUDvj쬕i0 QOf0(\C,Z؊cLsF<ެ22BNnmK a f(LßU|{`.qޭXF=]ӵ#-xU *n:WeU6Zb %'/?ל>yg*1>6$[D(186;h $"_ HˑJW8@2X&LL~Hz$ 1گH4JDja^own(2{l! 9ADP=.˱$,#@7~J4`777Y}li:\(ՆaK@d}\&Q磱W%& dwX0A c9Ƴ8ЂcZi ZS74^0xXEӠlk50dO\U%;qX#pFuBSDN`rsg2l &ˮTuwV{[Zt}[zuc^L#*2'3TtHPo}M!>v \kw@zKu+L^Fcӏr=e5?s9g$zo4Z( L?lH^zj?Iod/g#nBNc}D ǨjH8-PA/ڠu@- kKj.kxfkGe ]+ R&T-l?'M,, r30AZ b,ۦ*m3!(W 8ǞY/|1I5n+0ngA)X.̑7쌂p]|X?#ƹf(q>uIܥa$?e7l 'f-pg"z*P $jJkԇަ0d%gZ=׾a@;{ug] ~xyů'_T߹wǩȺBuߧjq \21Tm{Qh"Jb{'=;҅uйJnU0\Lc!ݗ`Q.#e$bRլy ݲ*C0 ^_&7dI?& Rl2 `ĤKjcR(tKʄQ-@W<[6Pဒ+` kBs!%![(w2׵PeH<ޗ[7K˘8;zHz="19[ZfCzyG /HJ"1G\q)dtz. heo=-zKAR#ɃŠWκ?$Rm*[ifj5{l;J.6xNf$+[h,TfNQ*c1ZNJCq:sJUlEt!5-|&.n p! ^ٟVr'Lzqt'Ш]"~4)[6q]?WײGN#_l&&=o IlU*t$].\=3 ]z_<arQB*Y7QY^PΞL0[\T9~*~u+z0y-Hq_|yX9{[O}](OQFKSNbl&/d9=ˎ|"TK?ϑv h{-]O_vs랈s|U;I(V(:::y٧L1 (VTJ\'I {!bDaE#Nq!}`mRLc[ \s#6}/w~XȨ s8 )0֕O5KBiXg"m͵+C9'#7y^hF:h=SAi.f!uoev0{IVUhPIL%{E bϜCT5@0ŞeFK\W x#53ML!˟;]DR,e)mg8<^uvwG6bl5VރyL g5{:8:*#RۻH#Ղ#E9% :Ɵ`[ү *r6h /?F07'y) $##xsA5j*wbSjE^q9 ?c^};#(Ĺ.wǾr>Lg*N"QV--ٕ9ﳲgʶh&pwQA)S T1iEHnc5>gIo*H!)`~KC$hwnV3 N咏q*@v(}Oَu#ȠƖ7nhxh(#dkȣV94k3ZVgv8TR?6t3 P 8 vOཬpavWxR2}Uf\ϒ(vqDDFv ӹN56 ^'K(d'l] ~;+נ73qi48TZȒ٨~(W1F*CJz*0@qB@'*Gw'_!\6,?b]#;Lk5x)u v2؜NSXls^ud@Ye_Di& {3]ͤ(7kXM5,t4FU}”x炽6׿_/wkަU }1ҽ3Tm<̏&޽ZEL;Tڙ;lDo.@:-HIo~;PC,hzWBl q߹6Tvv`{5R~Q*O|'sU}b\iWҝDbv3΋.֩0U HIAJVY^\7hAa'NFBdn B"8qLXrqF * C`a]YVcSB&gAI-C선냑޶&}inYj sJG Pױ5޲;i83qI0?x{2M} 6iˋqysMP\1W\xGx tU8.v3j9h|A` TJ_VHͬtI" 蘼RT,RnyŶi[۸T~⭻dR捄 %&!f\Q|{AӺZBu)!9%.0rF:&GeːF҉Dkں#eVr!;*ؒ/gŞC%x ˇ9l8?bkdkʖ k n$@2DU`ߥ4AU[2c]u,V{<Im3+ QfzzRktj.s&m?N*PLgydo tW9`c^9$UUN=2^ ~$r*V!!8R?9>*iȾEZ[@uogPcR1n-n {!xd0(9r&BCGUVY5R*D=Kʺ˺:~`帒\7ɜ[A0ַL^ #AFDU`;ԩw Lqw*W]ƔݔrsziQN qwɇl;~"RoN,D  ?Kѹi ,jb[Q gj/u՞[1ra^sVnt&U]9iA:j``>PcjLJW^B `BM@jGF C8ڠf{a䥁zV.#W١]BN;ڴSu7p'3[8wսrwHNˮ ݢ;KOХsSgMD50,a봝s`/=@+Ў( X6g*Lb0=y,rDKv撱yغB#VuG/%1$ɣ8,(OxD^VQP{z鼑p | N=DTS4:unX">4͓v&~m[ *-O(R %+FBt6,y67tϚ7@-|^bF_ectyP13 HY^ ^+b"ZBOLu,JɒGjL2JRj33kO!rLY|+^[-F˽'/īƕi߂!,ڹPg}%Ը.k< c h t򺫰YIi 2tRUrhi4>uTH&D\4X_M1? `=& O67ŵYr\iݷmߖ]-M("%eyПkxaPwz #q L=ܗ;?'G¤M5cɀ~!Jr`Iu+ppIJPBXlřf݊ s4'3B/V0ҨmRDAp0>ϔ {uge$N߉ ) *Hlv?JS%zU_NPRޠ]¦`l0L=6WYƖC˖bn[Kze5fء@SىJIJ1S G/ouT:rTN0@ʀDTߙX.[/_αm}d]5] PMv6^!u+Vi3(ڲfZmmeKSt}%EF8ǯ$M2+]6T9 Kv6:荦*_K"$#[軓d)ϧfaHu#K|?>M ҼhV_s$Gl"$AP'G' һf쐕x-Ht>WgI\k-k3NC3f ~Dl}9Z漖7HƘ&s"W9i }Wk;KI(9Ydtus9lkXmg;v;itPS͑^a2TZ)A g0;K>\(*u;SP}tֳ~#RO,9 4&CDhPy]oȒҪ#$T%H %TGIM IAF]=!D*0T¹&(/.(d$?8,l8 hn!fAB{9eˍ43֖M=37P[EyFdP ^JOc݅`NPИ*D;rH)k(+TR*=n+}QOL*Cm?=]^$?!^MvW&9L;!PR*WS\{|WS/[Nj:O\2Qm\V^wx;-T%}!ɘ<^d+Of0~IB|CǮE .JZ:쿿WuK/2N>× Jh`Mg eq3;sER `"u4]2A>yl-j_7+^PYe)+Λ~ n޼]U[r*wNk22)"˵mQJKd-/u'is9I\AI&S;aO8 8]Dw@3>$: }xb''^/ rsҋ@緟ӆguڶ.-'Ф{r+W)#[ݝ )!ӱKf;{ lPnXM',X6^`:[hc-:i_7Vuܩ23Z}3ɄX"EVV4X)H!!. ũ;ԜN1om77I;:Uʉf}{Y\]iFbPXQVIJHt Dwy(F Fnx?j20q&3BLD2l(/eU$VRY gXΧs4EL< Ns0/cDⷛ,.ɟWTԒVyN|s*Lu%mC+Xe\/iL}W[-J=|PdɤCQ%ڝbڼx> >KJ}ٹŜzhiѸkg*! ;je`[q-oT0!gPvp|țM\=i>AH)T>a +%z$.XŽu_LHB09(VKjPa]L CϷ(FTN +Ѝ(i'h&|wL#S/j) VY$c   h(xO=p@d@ZEO=ecep+ #`&0UhXU69V#/}+ I*8MF#$' 9FQ!P/-+_ҋV nV6)ӅT.t?wHNqpuʒ ªa*1^m;!CH ^j»aۈbQ"4"'!K :QD-ޡq5GC(Z/H(>J]/d92?9"P Zn~ ԕIyke]iAhlsT #`7kJ o>k`sCg=saY7NMZe>)2-_v\V($Pk4ٱn$N\b 0:Y2kȇ+hͣ3M^U߿M"aZK*W_,0NZA|kBpKY#ۤ}}: Lvr\Rejw@ :fQYɎrq.Pp"[39ɉUnW3gr(W)0|ۙe~6]721^ӂVz"$u`D}(889؛7eEB jא)yVPs3T{W}PJcCSmc׻E;tۉn5?X'nm6|wʼP\6>wlØM,̶C+ I*DКR&3Hzr%VXo!_EP2OYrJZ.|a 20UFLv7sl5Dԇe◔>VHԬhgHٴ-k&=)=OMNR&}iR,0J,:S ROIS` jbxr9>(,_޴?YM}+4T|zf!`A}=+{KE4ƌ_'E͟ r )Ff8ktK~dLcs 2lĴ@ڪilճuI7Zvp?55Ε5j) MMOEi&?"PoXEՔ "T%L;`}R4jI!e;с54h%ژ PH`N.jȒ0%ǧp~USq~ _cNqYns]j eY- J-,.if˂]\ Ew"[9 N>۪{9LP$c<=^u0_mYF✬ ^3H[D 3vAI9>'X/ϭz@q %@UM=/퀻IIw~^qm@o Tl^Xp5Ծ*A> `)0`?(X6-W ';) `,J4/eE)A4zy佉j߂u$7kX჈\E/y0t;)ae|9ݰ~~3 OM]]Q=LO;mrq4:zs8` `q,ݴOr7x5&ROnO/Q>g\P& oJ,ڿm,e wّ`M dC0MnPM u5y =葘(rK[q}_Udݡ;p̽\Y;|WJ*֪+/{>A8Ak 2."b25O_ 8%f`%Ti^5-fc*40cھ9 wGL1NP1,2`4au!/1CfBؕP.C3 Cn3A.DĉG)LŠy/t]F@c=C:O RttaU3`;~$d$h> d žXBcuݠ) `/q̅,_^ez9MQB#Α$V}gvÛ?˷o] %g=5aN\L!`mcGy5Ҧ JNh)@$6Lnv7ae_O>,;YxVQ';3E?K?Yz2[Cvz:Ip˚".Q_p3FvnvP ̲1 NSn_F?z|ɬ{b:-Pʖ+"3OWs(kDB4 o8}TZѝ8P9WXz2C]4TT]S~;-𙚾,8H B~c~#AǽWN޴Ds}K!\JEag5%S./svDp4ޔۊɳ*%޺'U"zV*jFjhq\},,VP25K[f'>Q}<^ʎRc9jQ3v[B9VD&)fhהޱ£n w,9T6C1[QWz+U[*xbq)$SL[jTHй22 Vb:$ƒHBziƥPx)@Ck(bܜH:U<H:O[pCCuWsL.>WνɈ ^B?<Bٓ*T!E8ph:X ^"b0% %XRط!dKmiL?)v[ioAI&S;YK3rA .gJ1eI9DRvYlb8|)}ӆ>Mk|aӬ?Ԟĥu]%"lxVBŇFʼF1"0`y%:\) zUMhAPar&:ծ3|ϵ/723MTL~IdGvl "5ކD{/nc:+y4 k_wГҰknn(5.w=$ ߋVzuhg i$n%r}p`Q|[+C%ܷ86]?'_K6tiJuV i_GiU}e~R˜OM2q':4&n(ΟfBx jHTH/xajUx/ZKniZZ\2r YCa" xxA0X/埔'Q6ϳ!/?apsΛș5]JXHL_0[[qjN<0`#yO Ky*+E563z8`߱R)buDՒd p ucדBiAڶ5N"ou~Q` 'pcw n/1Hkowa*dg㵊*w]AUBwy2 ĥaL$?%S_.d'Q+x+LǨ_Ւ P!j:uv^=<5ɊajJ,Z#^W17"x9A(l^iR: {PJǶd4+<\Y3o#$#px!uH9,Xuv~v2 Uy1F%ʣLAjƶ`C e3߁>h2M>+dG =wฝdT,T=1i雷a($A\\@)**lVN) )=*>!E}g{\Kk6V%!tV56I0xdcdY{,%lӠb%Jr'\L}Nh9{LB#8Q@u ї-,۰u1-nW~CvDM=uyPW/-/| M Ngdv>Ɓ9c s؏bv1fr7EF0-t~H,'Wɡݟᵱ=dd诌h\)btGRq\1l)EM_=f゗F SemL~~Ng{j^ u*;/% 5͐Q7:[ uAšsg1/p !\O53:@8VM둅-EMo^5K˔ *"ijD-|m¼:snz9-ͻuTG+#зGɀ2K/R"lԐ+=HckuC'WOrAmBSm@'BG-Hv\su{^MpksFD}r@<%`b踏e Gpdߙ[]cΐ].̛ ^->,\^hήG2 hR WP0OCV BR:&}4htt8;skn9 S ȆpW&PQ'N4@ڂV8v|Vbf!i p8AgL*fئ[hnWSAGCsz  w:2(dfe0O/ ˞Uyo0&NF2TUM핓1# > LFh'g4cQ5T>atW$D`.\@1v" "xe[/uYw7FB%nOMԋ .Qz/VnI7{]7r<ĉ>!L9 a^$E"(CA M}2p5Vag]3>xsU=^,giQ4SKhLȻrU?H;HB),| X emhZ>IЛE|+FMt2& %r~E/rhd.7$il3l(u\Gi N؈dhx}[_phyÇɒ`Y|bwJ;WlS\Nqzp^X|۞|fmC_*4.QUYI4mŝHoC<_DcS)8Xv(̖$]W|GKDV9LgtCb' &3ך-a<Ӻʦʷ/rȎxm7|Ey ,e PhΜz>K!178KϖЧըƱIcYX2"^ ƻ]!^˹4VJQGuƩ,wktYDwx7;Z&+iDC5QVfƛ+`4 T=VkG)]?f()yfAES >3v  }nI;pzo@"̽Y;J͕kA(r"(6'M'tg=d3JWBcH_^H4vgya7xѽP7,z=sH͝ds\#K5ˎ4EE 3;!G-}^8M-ƿh>?dQ|Ίٽ|j@k^@}W852Y65% P.'NQ?*|r@G>l#)bĦڌ'Myits(Ŕ5*Q%wB. Ce l ;6t@^!y-.3ظͥ )N!:ek֟4&EQO{%AeY]orko f@(&iy╮5(JO&4viwUɅK% J RSߑcsCrE +)awܜ*siq$gl.kki>V[HVί?RNeS}p9rf%$6%9)Mn~4c1'Dot(4' d@WIĐ$JBx<F̽ˤ\ƕ512*/2CHvѨ]h P fk6-n^@(/(ǁysZ/!sudEy$ bE.L4gD+ܖ7+ ?3V>5q @􏢑A,9 BAШY\8UڮVap]i(c׼>pBTXM E=Qbj-c5'a8.128DG*M̎\g8ΏY}6OK}}_;y6lJFK⇢2i0XfPar/R(ĩKxc#0(n֠5@~*pzayBvqCd7&%UjV+W>(UeX)(}d?1P3ZB>AI&S3ߞFe>2J֘%xVocl)JqoUr+fI=c\IHS J(^D:Cm m`+/o~o(m`>$ af;=Jڈ`dgڻ -_bfijG8GJms-8N|D1%}2*6I>Fo5B Y"?}#5,( O_^J^SFu~llz=>]H*TVU$ɉں]u k)*dxG6%8vm&.mʄ5<a,:_Ird*Y|4sk|Z%$ή(̏ƓAOЩQORE7ƬMq(oG}zy*U33탗􅃃gqDZۿ۵^"w}mdnj{Pzdr&2?5?ItXwZLCln41:54<;$l2hRM%EE-muIw@sBG3(Ղł3Lt)z~$gv7z^#^`;^Dɛ,m2T́,U|ډE(ax D,:!k=Y 3Bkf0`] !$ T{6TqKD,/KgTRȥm&?+5c0o"#ֲ9 j0v"^EB>@d,P'SaᣅPunur*hn)*N*ؖ^էA3 Ux6G!=<._c2ok/$b;k |25^_o d:.Oiv@ӥ WBGCrdz r+ޓ y}^zh2Hz3#5T㡏ޚ8R9YeuOyv-_ohalōAn3@fS &&ȊeCb!"~Zz1 b!Tc"wg˱E˟SGa70hU鿰pь}6ff%}0)`YILm*B >)ÐSkh h#-e(_PU& {7)9Y!•o4+R&^vO=v\Rګjk L|#]8ؔz[Ɯ_jau3[m4XC$oX?\-Ȑ'*:RnQjt obĩW-~B@cلB2۪y&0p \Q\ꃷȒmqUfL3wxWP6H&)cP& ^XeM iP )?diEH^g=,H0r.`xagԄH`wj(ʻ[8ު[14IM<3C)yUP%RB$O߀zQ)G|\&u!_Tiԭ¸WS O݅U."b3nzE- qZҗt~?Y.υ-6V2fi5 :0J%c ͥUE|bI#MN;Tc-4~%pB? =ħ2Pu-ZruR\&D# `&]0ZmKLV;XѦ Fu{e]#ctpFk7 }BD8+Dj] }QzxF1AfB6Rx+bQD7w黲ٹV}7vg sfY'QEM9 .[nW r6smIMPz3za8{}m,B&vh1!3 2ppJGjowXߜt]tIK!e} $7&G2f X%*sSFӭ7%Tw`K~Ygqij@iyh`ڞy-J< ݹ w,b:oL}n.a r4"Ȱm{7*so_Sbo굂8 #$ PONy)q54 (xӻbd¿i؃UY{Фtj.=/߇'Ѭ_y{1φƈ2>Fv1Rt,K蔶8/Q{\ D`R8^Z?<E*I@yKFL.2{md`Y2D9ȏԅZvk-bUT?osk%X qg3kķe]hÆ1& ;QuN, 0=ѣ jj5 g\llgQ.8jZ8cNbCQ $Q,4aL!9NcF1oBI+Yqa-ն,5eQR/̞$aHb.`%nȚ&jgmVNOK"Zj! @rGM@!~>7M(6`*c8 dV:0킿:ͽ܋ɯ8}_c-RJ.7: (ш:v/.+d1:`l7;{v{(/M#J\~q0j~, ^WS z.e/8U62~nf}hƗxGg7$NiY ,?gv$}"Jq(9h.t 7m;,Qr{|~;!}iX6z b;z08ed)h'--5=h @54?]G&Ry$;x,8IrݼߕVr.fWc,YoJ} l|YMADM0wAV:V0Ȼ$w egvכOur}eA[rSR6%q&{jF՛X_r5n9޵=BE)s)<|J41z\| >*noIhŖBY8߿R *%Lf)s~YMPΩbc+0ll1S/xԆ(ba'~WLqP-_mҗ,U+rKR,P6<סr.cV>ӿ>_ 17NceJ O|8FV'3=mO a1Dmպ!)P8_IPld€"gNBs%3.L>J6ens>5pCݯy2Z+g*Z]}tP,z?NLfULRԢ4H+Ph8EX ^cd 2ZP{-WsWD*Wf=!/$T@0 x]?$BQ$vvWs+qe*bqcC/ ݶ+"(U{ ! pXUSBmѤٖԗX{zM,D94Slld~8}b."/ZiZq8=KLځk(,WB}Ũڤnu;4\ w% Y'7_p]bٓkoQ iͻKt q }oVg.|Q 9#hS ֳa'$W>SL2/8p_NlDNN%j1T|ޢ8qWJ4}@ V$ Iz0݄۞NM0VG6]7¸xXM.lވ/ͦP? ۀTcϨn n5L#Eѻggԧ_UsIOĀNy? (n'EKܝjQ)-#buu聥{$Xwđy;ܝK,?} |0b4vAvLUuse4ۊ^4C6MQKDs6#֩^;Q\ye# $50Qfm#?lrاy.@I^w㕎M?_ۉi;QYMx>6X X-F+;&_Ξ+g>,֨h2b鎷r|&0WF|io2o_ώx[rgXrr Ax\KMN(3Ә#E*ɦ$#$R~G DO &<8(}6K5݆*T$@3e9}~nyֶ ^&xh˪rvabh/ɍ4R://~wמ $~oYUX#X|4ȘWӪDlwaG$G8ԯ@9N:r9hRc:5ʹ6 bOJ(ա*WtkM_Me2:||K=8ҒqIdмM:ӵ 2wή{q 61 j\U5?F f{CzÎc궦)]?#<3?]F jy+2|"5'ƒl- }Zrp@:Ѫ6E9:XXD+NZ^-fڟ $wxfqqT"$m^V2D"`FEq%DǀU 1~olI5`JܝT\Fw!W|FU';4kMNAp$mī6N8skSB]7R/G wi=5D6h B!C@m\Oՙ/>fw1fm3OS-IRE <ߔ'=W` XTr2HQ\;x>,e@3]. .gG#qiR+bIxw¥+xK9*#KR-CS|A,=WweWK3cDrBedfK3W] `Yz'lWdžYu NkceoR_|hjbz0 S2v<7l/MNbq1zݑ[gHdF0 ]^J쀃f~ͬ&dQ?op9B SiHzv R ͯCz`+5\S(J=`Mc=jեJS'%igceC%d:Gt{{&Lr>29+pӈ xq@BFկwPt6| -t_&biB#yOͭ:%x ^AT[{T}03~0pS Zz X1xfbP^HNY, c0"$R=#s[.󠻦䳌M$|k+,!8IT\, 4( #IdŽqzFx G,%FL0 ;]cPc+4G0皾 %Yrϝw>(|<9{XwJ D Pni;<ͦ&-g7Uo[}r26*;_|c"| aaT*Q35ĭL*E5WA8ƒu) "k׬+ olɅuF|6׊rbph@59`UŎ:PZ}@}ć!φidťDUꔖgj G@Mϝu ]UZ 9V8anGu1k&>Ih7AC<0!iⓦ.W˽A͉S~IN\;O'+(ЯeO jePIGA&tzdc| :D[SRFdpAd=}3TR.eMHjlR[\hEJ?]HJ^iļK cg\uLGn]-42'X c_O<.3S.tQ;s:+o`뇰, If#@b%^SC;]6#cofo< SYZfU_~kx!¯h-m{Rn[p^do'ʄZR?n GTBDՎ ?"x^1" $ N̝BS9P_Zj~u*> ka1@zY؈]߉wZC]nX+'mF\#xX\._ ;c7X9LwF]z{;5Է aUA 5?CWp~ރ.75@:fhuK2S-ˌh+^=G:ژ\Za=Ps6 ċ*M27 =9cЧT9-SczQX_PP)Ү.vKZ)A]U,p# cKȁvk)h$P9l7ZŁE|d? )EJd=>n$a0q*9ԦM&jU@Ivh%ِ'LȖړ9,2"& Xَ&b?cPhh^'&צBM1{ ɔH(ϲU`k@D@4}+R.L1!kwGmލ_\8*EL71 Z_?i\#*W䌎8}V@h.R9̱^|lxlFq M/څSE`gW\w[&*AAZI&S;u[[m_k:T:Ior)Nj䴞7JlloQ=z~τDpI_mBdzniKVF&w`#4Pܛ -dӘ(4yFhL]8u֥1&M9|B}*rYXYڤ$7[p[Sς&݋RG]tЯ|݁DH9^bE3(ORx^aW0RA5PJ {ˏf13B 6κkM`U]u \TS sZ(:zxƪJbgI*I n?{uTO,#)Ja l $59Ox2+%)Q.X,b퇬nNlӊSoڦf{pp?3vM[ q-4x=}ǔx2K5ihX5Œ_aF0i/3j?"oM +g q_:d?g˰k^&TXE;o f_;*UziVջs>? n1)a^36_jUѼ8lC?ȔXcV4VÄ*9V7w qHfwB֣{avj B qvi>Epf-CMdfsq\Rcs[uVIg ҧT- +vM{Úg>os`fZnB¾+3="Jibm=qD$PӠ[4HH bJ4Sm[A#$D%dEE0q>LL?i+IxI&V V~pL |+{;J`n2{Ԅ S!۸U"L_K{B#0 TSAD1V=[`NLL0K<POqcjT1qb9 w^N0~sEY W:M "}!Xl"~Rg+F$(.^J"n 4ݒ&H"ÚȤ.yIdtYم*J:8Xa,I+%hϭZy'xZoْ!e0}ۏQtKv$.\RXg AA4>7pʜ-xj]qUAQ>T?ce"8-kw&YqB2 MmEږUҾӠi#׈ H+Wp]bNIL)קf܃%l&OP{e͸ /,ȶ}-ɑxTvu<`|j KbKB0["| Eu U7y~HC0Y8>No{,]J;c M8+ G=dgZ44?\lB{WU$@ܣ!iNo9i WŴ#,"U&PaKW*9^Xf:A u1d 3t:3Zȹ%! ս+U$f L9Vd-Kn$ "V׵#i|QI'ʰ 8GzYU0y`n\Wk3S xE i8wHc_ΐ7m9z͗d4RsӡԿ`ޠ<%y8*zAg΅߄<ֹ/;z~36}aqA. *_DF6}GF hG߼өٺvˍZ/mtaMzv;^$}1ry9U9=5Sé>C84 K0q 4jO8;/FM_ͤP({EhiurND'^Zd(*+Gxey.I(҆Ek}fQmc~Qh ̀gBiP -Qbu_Y;ZҜޏ VڙzuK쎿Vz \Ieea{H! t6]I6s14u3=K ]!4&: rt k8h?5e| rUssVI`wu#'R7ˣU,|Z !c*C6Γq7 ,5ytsv'$vWm)Nw3-w_[ Y 7+oLHmQVȀY=-J)ip4?"@\Li*}v]@@~Ɣȗ3HEWEK]0ƀa9cH-E뜦HG4xb`[*%BE極RI}?0mמJU, ?NrEx#Fq]R&'MB6GCC퍪p-Q~nSm/Ԙұ"_QK%`_(d1sߧ4k~z{_[H O/&m^쀭"1Z$j ҊOӝ#^o3~cUK Ay]Up)J/YZ)MhaEc 31*>oءl}E>LES ؅dbtfUukK:1z.4dՄքxV7x¶n yKcWKZh0WP02eMU~5*bjǜp7ʗpkx" ?^)8P>[ PsG'a3u/9aR/Gm=TՁ9UmR #|ij䕠VmPD7,ypR̃'KABf˃H%km\CXBU9$4۞0wmkeVRV];qy8䋬(+336IWam^u1cp e"gAE;ߐΖpl cK,O/>`T^.+aZZXz }s2tq>d; "qq[&yϦv8_[]#G(Y~3f 2r*,o2 P-ËRq6R}1sҹooVADS:'L*tW5`~Q4H]j0tzikm#kӆEW{QuB_wquhcjwN4l֞"s$aZ3J<(ztRє(/f[J]m\Z68pG}9K60w΂B~)ku[phr ڹiH弔2jE09bw4&̿l=Dz#m+v`+e2 ;,R[Wxl,}gyzV4 3 5$*Z4; j& }ʖBtygв}Vr* ,m I洚 ^S0Lh-oq4!i{5cq6Md-ެ*jhswhmD|k%H RMHN9=6{ Du0hfnr yXgC>KҹOnfy@;ڃfՎC"is5S41֞TEOAʎ>i}h^K_ *p4y&$?ui=ia1jnsAg#lQʽCة {Z`eNF}Hawd Jm^/3II >=#[{zsBRJr"qp% >+]PeƞE%0YFc7bVͪ-59*2'`6 {>HH;|bVi\9%pz ^c=Mk/T:Ԭ =(Hʟ|:Ym<>vu o vW|1L)fM(l =mLy OxvCuͩxG|IbIbo9:ƖbW0>of6(TǗ-P=U,9 4DIDu3~jyq.Jj5Rեtf"8H%lJ%XqGiRi|)^tm>JHvr3 (>DIvCȧ/g̖aS̗ G{QZC1ʂ "ՙ6 R)iT-싩6rCN!ơ 93Rh7˦O\qz"Kj#r{-Ŏx"3˽&eN=&s*}4춗kDŽ+4ENH2A{I&S;ףF{bRy8 >-de]w+3NJ90t!':.6ː/!kХāxY=AjFeֲJ-<{y12Jl$]`UkN w/8q6cťQx#SR󩭷+:B"3qU0g# N<7A;`"(n"oLDs@aFc{OLG{`q!mޢz19:,iSwňI bQNih@+>U0g4tw7m /p-@>gE ooW;6V3a_% LOX/kjkt##}G"1=#K E=K&bp[@#2%*PQ3..$P}-^d#N(J-匎@܏.e5rR-N![8 !ks477Dv $/,Ym `ײ*VV=ͩ(^08Z\ssKB@i>r0W% h$DHIAX=V>>&Oo? ϔCtEpNVF8T/ƍ#=Kرrx3`@r$=8ZNUnP)}uS'<|8Fzܸdǎ8g3k6ƨ )Ꞅi!;g+X"!|-?KKĪlUd~卮~bW5 ᆘ 2jчP/SKD"aplS Di70ޏЮCo  Rv6V cmWpB^d wmu,\-b%|F0p-<@gŝY(A@Q._n̄xFoiy6{CahVtr+!J8qבXnȲqO n2wv'|q=w"` coεe{d^s6 |C;:gI>HzG6q“P![&ZP)Tty;ouT) +a8CJ!U4}&58ҲrJ2;X Cr'~ۄrK$\rCBOZCHQ빒ej}9;e A)#P h[TqiUIr}pBR}535u<~մaA5Sq̢/6q{v²% p95꿩57l3(KOo\j:iB:\hqoDdOOzA^ ;ma:8~țy)Ǡ^;j 0qBMo Hdu[jhy0C0qX έj "~xw F ~ Ȯ3 ĉOLxwRia_HJ,.?>_O|&(Q63}q"(-,wqIu8F6nN97dBd4S盧m8 e&,׼+k5;:G@ky'0K°1q.o+oY[Mwz]o0(Ryrqo1r0Ƣ:SJgdg[|eB ; .eJ6z1ɳܢ\UZp'#9Ju똼N_bθLm6"Ayȕxj# icOg#GasDtc摖_^;3Y[Ar1p;tjq)hGu~c5Sv9.{7[qMRgi.+RR-Y^ /?dRC GYu\nYU%%X&LF;;,w:4/6 E0m ~*_1s fܭp:g." "lh) R܃v_ i˄[iJ|M0CW7R[IбΘOWwHwGyoC춗 QR kO͚Q`A4~U>\.h{KLqE2OT8,MkEn]u c>A8Mߤ:Mݹdb\UU^*!gS݁\ϕX3й׊h,y\Yµԯ29̽8G\W=!A;RPmnPGhл5&f۳s9[0{r.WTWL})\08b!nQ~Os5?|5hSKk Md^R~V{_}? CB,p ZD` 8.) j5S@$Ymt*gWlMu>#p)/ RP0GGr{9 )E9| NJq!!obkPӘ;0Cv$PUe14zq@TrqALw{tN8R˨P9;d7}Dh?&Aqõ,Sρ6:jnmOJ WFk .9}lʃIM yxgUs *?3W lr'HGجpH~L[Q%J2*'"!Nʈˏ~FլbnεtLI kǘ @"xU2d慄1Md]!Eunqװ+\+bA mK*sor=ͷ@maD#fHI܇Rț=r#Ǚ,go,_n3g!3nnssmq);`O|1 Ы@{Z`ZVSS UolUF/v3,DbpdX{ lPqgyʎjXc_L kR۽X"61AiK*8,en~z.jAV\r)S ?#רt .jWHO=Wu@!GX2k6 9GD=ÇxŨR U;Am 9&达vUrLS#f a溧?U͜Y e60ܴAA(*cnUa؄3NesҲhlZe'=^Bb Wq.g"8l-H>Isuvc'{N۵KKsG-p޵G(Oc16,hfX꽻 Puj mr׹Ҋ ITA(l$O^ 磍4QRCҋ u_ﺐȈ@ -l~2.d4@5}x7@^~gU4)Gsa@jWH} }뭺*(0s9,u+{ߣP=" yٔ`:LEqUGKYDkcryQWjbc4f2_dU ".Yv  &uX::6F8s(N'՝̃M Lqc %PTCɉ^~f=M}8PfU(ur2_ L$'zIRQcyaf/sq2Ai}~moͅYzS=$B c HVKc*K?(%Fa3HAPC<0f8 Wl]Y'6Zt.u tX3w<h3B9mkIv!;;ʖ٥=ꈗkGd!@ɕN` !G'xfs"N끊m{XVР]Mj O/N~_Dg3!hǎ7ݶ#L oBo/(%oշJ0< Vx<8)D]7{~ɠJEDc E ohǫO /8bkC`q~~ Wshgue\<Ό=?Qpu;,d囒fԥښɺP2Wq#!LxEz1>fs*]ygxf; Q1r?.μv!9JX8D(۷?~tvs)֔дdH B<4S&Do %fwd-G(L\*g`Σ0Z'xjȡƥ;&A NBֺx J-8݋P(ˏ XU!O.4k[5X:^P Wj.@jڱ VB,9D!hQvJVXIUē4ֻ̼X"NyrWK@]TĊxN d &ˬ9U&䎦8AP3SS5ӊYweZGC|{U&urVj@^ʉ)^Q X9w 3vB@So(&`jL/v+HjJ[؆wbmq%'O^wtԺCD. g>tNu'J@AI&S#-5FDqn50fӅ5,"&X Գ, 9>@׎|{m<߇ekCnZ<]^Oؼ٣>{-32YeUEFDJw&#_4FW({p>mP; ௜^@H^0<翩Cw@:,yĂq[W|~;B[]p󔷿p(*sUYjZ;\ !l(K] %Ͽ& u"a+,7SѴH-4<4H4fqqϣ2JJGJ|W;!]@ӇjV*Lej xg9$s!*JFX X}ߜ˸* l+sDHZs,/?,TUn P-qQ,5GrU61n\\̧9mO9"[ywdԈ3hŴ6A4n=1Uu>а7ZIG/N>Z]Uqw3 nMvǻYR RE| ֯mSrw$-V(n%&} E~hޘ'_KWҧjh;Eo[t'Kl|[Ϗ;Qn ʈNW6+-Ec݀ $9F?Wzm MVX7ֽ̑QċU$/zSZ$۱Zޟ\`]ԩϰg$ 6#YGrUW?.%EnϢI1Qח=qee$` 1 ./p^̋V{v2 &{˚ԡ7X&^P\k_wts@'%6ϲH?%*0 &;:bdJ0k/! -փc9Bw9 #Ti/Eگ7&47%?sNh?츣M'Hr9Ğn,该a `BM̲) SdkXiLjL֭9E 趮5Bdml&7o- e8b6ez{_uE$"qdf{`QMjirJߦ1>Ɨ[qC/aJ_RQ,iAǍ7=z`j>g %n H*Z讹}bDWMe;t T]y*!\1= [3ʡ?M7m!lxX AQ+-Fv33ѻ5 O"eqv;D]҈ɳ{$޺Hu.1Q hfVjZ,e=a:,`u֝H_.IX'DI5.Aّc: "t  d{y}BKgS߷ -SUT#MRE{APo֟NK8Qgrϱ6-h|/1b1 p!`.>(keFF?[y:1hєh`7{ri]CØ N|NXXRf.Wnmq'2xD?DVTLf<+YONzR1^|t븋B,v` 1f]>yzh^k9D$'m0Fe-Q?:\8П9M>fD֦ٻ[DhLĠfBcFeP}QIlА^S@[I\s>eDI5F}-c%_@j$6`}"/_#WX:rSoޙ}WȌPHoJVF)* ^L7`A4΃Cv/ 7ښu`KձCzh.Z[kaBEJR(|bW 1bVRu^wmm9 7Jfe[1dVhxHכ[^qmgX14t^a7e6ߧ/F}B_g_E+JD]ߝ|>]F! NS^$.Y%X8yE ~}x<Bt)\vzKg9V!"e/7]}\'@͇E,Ivg}5+2Δ$'ԭ5{KK: x O)MK8vx+&JyV hvPP KoN;?/S\Y+T u ʜ>$}t ` l\B#A4}IOEPLj)DZ) &nIRG06梎A9!oK͋K.F,w^!3r2-Ro _m1R-* ;|9?#%8CJTޫ2yd!`QAшRP*ɍ+7Պ7CT\z^oW+tH:m+oCOE.VHs<]>.չHn} A茷z_/%\)_]K׶g6Jy [V+ F7R7Vōzߍ;҅:Ac0U0W|; b_oI:lɿ8{c<ԸZ٠0?HL|K6Jd(vl֎mbzdE6sڹc.Kkd'vܣ% I((#i >Fy..b⠫.B Ĵd0[sTzIkA#9=͸ShYduLN"Rb/.^G9_Dw yWCK[ <x HЃ-5˵*&]x@qrh*yv0WJ_NMqIMϩ7# "pX*S]BXjO| sMa&q" K _oBq{dEnf]`9IT*V|M{Oe Ønla6Y/1%)1P Tt =},ʬآXz=~Y9Mɨ ?:[-0+-dF&?,F5O&a rĠ^`j :ԠunؘKå/i S\WbmyfGOPat2G갇1~2 J 3, F}?u4rl-)L@uTjnpC!*bO$d&~2G]wu^QjjENU*vwz_ אn_2^]YnEY{z_z'r;yN^f<*fG2fwiʐ㈉hc5!Mݫed;G! R#Zn/;taؔ$/d~T1Am\Z}Owp|anN;Ф8Oq~al\mQ4kߑ@Bh q/r #)\[&f ȄqDXZڋ3['ƛ,ɚH+E )I*&i z). sl6F=;UPGv KP Z: !` 4e{N>@2ەsf}Z(QIsB;.<3bN SE^O9Bhjz_RSM,-V=G?7nv9>F(DI+><_y&QצKֹFN$_63&[yk5Kk XL$~ƒ1 +{yWY _bWb`Qq܄GL| nA~0A Ś'ęge+@7%7߀n D<(TʆeG3,>yv caIW_~.*xkcBad~Wd^m,5#,+!{󈒶z$nHbՍ_.IU/s(g ɥ4ELXggڌc8cz(ӣ]ufps2O5~mvyq{6hXދRߝSP!7[A.l*!628lcB2 |(~,b:`93jɖ-ng;i\Q N"-3oZh2U-3x 2 ՄɦBfj8cF̴D|7Z0ȩ}HI-[k>N; QS1EaZ Jb~< RQˡ?nHwibYo2KMF{w$C>?mLJs32ўmG6:VѳxjQ_VEwfϻ=U9C^?hx\Ȇ^p6%UL.M3$d].9PԣУ4B/k`R:z>G^{{-zx?p7a*Q9 W`'SBO,z\Ӛo~ͽA6hEDkgۉV%׹$K'qxdm?)=)?'JbX :4CQ?lkKv\BQYMP8E3y,miT+&23mPɜtPè+IHtW,BRMz kf8z}Db*shFo-n;U>CWc,vGfaEiŹ3$0RɾfnEvFV2I!=٨[ Qwt/!&D1=31@$h2&+qﰶ vV쎆9Ss4;,KTjlZ6ca#JTD3am>׶c07844LVfW,@d|Y?.oSY\ݣ =5O<= Pw52,d1Pp5NUn/ 9}\P st&:PKPvCWDvǖ!2#nbYfA&0L%DA[lnXPѴec3 O;_XɪkRy?>5*t,V/ST!wF0J^.BYR*Ē8[Ϗ1"hTw sMпj~\[;&(de/V%^])1bw&2 }Ԑs;ts$eeRDwn튵Iu'ҵH#7^!pmTNJU g6SlL2:c싁͐L>3%t׎PDqy:.Ep8od8x=rZϢu΃MR.}P{]BFd20}Ͱێ?_,ٕT$ =BiA"N[}FWO G4xVzYMݩcVȔ_ג8^F@u!ؽMT6|=Ɯ:? mxGM+_Pbӥ!tBP~Ū]GHJ(xN(ݪ֧A2DǭiT,,' f-)pWe qf׮%{-zG9sfjH}v/-]ϣZZ>.z2 8P~ p.F1Fx[nNXPes[IL ɂTB>s|}ʖBIoid\'8kXJWgC_U `F_{4Dc/9q1* <+ʌ,"3%ȏFs .x;dtJȃ,?i[SSUT6f{"O#@K贋}v̩?viIێ*ig>[l 8&dt5)\kG U0 5Z >f2wY58 dP@erз (s=5k4YϪmlqָa+ opGy/ !反ViSFgh],"Q}b=jxv3 ۭdcOz)}U+ty=T@h!mMY B8FɱoszG9Jd|\vvwRq'c=lA7 ^[Sgŷ @&d߃6:M+zJUMVZ\XRH-;kP ?\#VAuoƕ"-9dj^EY. #YyxA2ڦn懆XeTXFF @f0P3?_nhԜIjQ=uӑa8 ] #6eW逫+VyQ5@o#DS)|7fПֽMOn,Mhv*<d1{~2h+mSLc8WOp. at+ڈ/TciZz~rnDg`*6P_W%GqXe,ܞQr A;2D+$~98Vv^B8{ ٦͵1jpYs&A9H{,0#l[q.|jFHDGSl>ٳ Cȗq=E=CsA(j0= T_zm&uXʁH``{҆8iV*.zA]=-5!EY v20fNEcָu)uX Ou.+bD<~@"JӴ ] lkIKr)Ly/ƨ~C`ⲩB>tTe, *3n}3(p -BT/Xj* +mqQ%>HN^ L 7tKtyv=RR~(MލcOR=ȗ;"j9"ת>~rW\Ћl=4d+0bgr8z1: ~֫]^c q(쿚~5xhXnz8X8m:&5ILqOwK嶝H'Y C=m 6tuńHKAxe^mU/|엄YH9v&D卵hПq6B <*Y p~a+`*? J#9kt_ ~#dr~ PaXA/j)Kz;x {76- ä͖+T@&ש_xgᒉ !ۉ&cDC Э`oc`8QwlH"{GY\ q`՚.I1DO1(r/[ }6> ,dO`B˖ȹ"㡼%ZPZ&n0C`UF= ;V "AkS7>.J*$ff5݊eۿ+fWd1໢ e }gEj{S ջSCz[L%VԫhA&o^Ҹq\ Β$9}b2zg}SXq'|.Ye{<|3wI)RT<5ٛh>QUx<3P֐P=ݑ.ƄǪOv'6WR8 a y0&9t6 K@ensY55VSY&'Ke LQCRR\@ +ch d&!x3:x{!J7ɟd5~ptAdjGGH|!ۋy[ޤ,TLx,9iewDeު@'RބDHDsBN% [ ۙuzخ] 6Kh?qKaSۄWb@^d8(3`%,_43uҁ e0&%`C%˷RFr#rq=USp@a9 $pLw*}FpRF#b,|P{E0)aҜ h 6%(xAKC#@0/lQgQԜ~9 i:3nkZĹYOiS qjfgHIE+_0(0UU0k.H"XWz$74Hu3V"UvÁU.Hli\aj[ P5LMy9VK eǮ Qv$BV>*w1T=sl~G;(Q/coA$/D>I\iPbV=p_cNo^XDҹwōb}o_ Tp6d&-VvP '3r{@Րlt$}?6P^ xd?pHy1P7-_}_ oZ>^0k-S|W63 X8o{ӌUWsKvܺˋJΓK=I76DXS-W\ic JMYtYf3ݢ_q_B@~N *pb,X|0J<<J| !zǐ6&2q eօyE捼CGι`fKu#xr CĪA[ro g1n6D W8u,AӀB٩n@-٪JXp9!^dTW~NHT0׼3pezu6Ll YItr]/L:.pKu2f~gLn)vDb}8Fkb tYk-kWqu#뉗%u8† z>)[mxg^\գK˔&zK=.VGT_}r|N$88xphhʂnyMΚ]:tP5C~Fe#0ܺxmTCpq"EyT< ƛv4.ǒh5h5x |CY "R`Lن7ZuK?M5)ęӥ>LªkJ1\MPv8y'Y:/Kn+h*  S*`I_87樗^jflgZxrGdө@ZѐCg-w7<:+B,Ehitr|d^;ِaǨa{LGɽ( 8zY1/+^"8T싼˵P[nHh^ e9sHP2"Yjbe8lddց" 44>χ<7JuН$M7#HDE#LP'wpR9D asVƣmPWB@~ yiM,kѪbQ{MVeKmĕ +-_O<ύ4K6r @4'LH^O];.slφO ˂jlRpě~Cy_*cr=]N3CShfIV .Ҟƛ1:#=@\w=F CE"6k=~H݉e0Mp eoLFRU{:Ğ#Q+>rM !; ԩ<\IZ ۶.^'G3hyu["Na6Akr*S몌bpF㮤Zt2<ƼjU5u^wR;(o%edVZK"rs.pA'P#J;iQgDKH`]!GNrKR?!iM'UBmF\Y =F5o D)Y}Eh8C+Ӷuc0!g*2>K<@q2KQקc^T5,EDZ(e7Ɲ$T J+wl D&}h]z?aH貖USF3/zt.#4(̔Ni D|N' yhj q'7ed@Z/4]'4OΈ2_c_{W+EDr!ia9_)Aal$nf;Pۺ#lD_Ưeu)oAP*yȪҩJ,SVKr!n0'Q/ڴ!j2҂0ֵEO@ؼ&eŨ< /{  UѯExe?1J?<5?S:?Bp-6i mA?80%(IYL֘;Mq&AZ{VSzC2yh#~O53kט>??]X[SoPV ^YPBxM̄%!uF'L/ 1en[f^j0b7WO>iޡ.^< ˧N L#ᾂ-#N#h uf|nA) @mey[ κĢӽA5ݮ۶RA0r`!S٭'ُqx;fDfJ~[{ RF UL0glf\Q+Է6*/wwe2 }l fV0=\Tsj*SI _0sJ$P16نdk?Ac) ;MQ.K0VDǧ_Sxʑ\7č2)S"½ T[1\"/Ɍ5 \.:f% 9g_oQ\ ń5uXkATa}#*Ӂ<X#q"WoSbZ-߭5B`xc*J2I}@@OP Y;>%^'f95O<"q/?#ނH@%M+ FIRamDAwbX9c$><X5i-`#^v: 1b`OnfGhJfG⒈^߬bIm0B,0@?z!1@[E1<'=7n:lߕl~_5|;za 4|U0С\[lRvfE֫ĊvK/_Ji+bbxXh-+Z?i3<ERݾLH 紘*Dv'܆ݎw0G;$w&vcF#4K-$\VNY߫4+͑mGjYU~hso#A?s5܊t[9FCKT{y{29σxceif,H|bAhfd5D!74< 3ulZǨ% md9/7ܮEm2o|FN\#pW6-)p+%聈oZ @&t3_s%\GoII= B}C$SlRj zoo۰S d:s&'ΙeUIҡt:d<3sW 2;Xe)?3>wpYdfRk`x[WtǿŢ@cݸcl"2JyW%ļ9gEiDNdJ|.*S=W hm%Zq账I}\./بvgkWLs{j'\-"4j=uPN٤E~J2[zG6Cd(Ʃ M'^Q7LT>k.id=i#BT:_:Zԏ|zjUXo@/OI3gvzPp7(J;jiAOl--Q~}OGvp՟- ֶ$Y]J,98 aVjS]_6Y ^]&I"eʀ {<8PZ5͵ +WN+gǿ(7U5xpqNxFx|L/(Nt6: ip\݃ Ѽ¨! Co=k`p 4>nWs%(?@F-~!ycH#DzS$ NSnF`$曶',ZɋsRA9iϒ0Xf;a&zx3j.].9z9jhys}9Pm> @-_)-i"zsO 즃 +\jn3o]-np (W#WVسyVSRK%?_CJŊ& 1f2j] >b=/8>֋s.9\.!Q>|J} jՠ:PZͱ#\A.~.DJ0 eZWZr1(:빬7Iku{y6篞gW t߽c]W9"Hn̤ѾJOmg%Ҏ%Mv>.:`KnH;a*pbM,A(@ф1x%k쏦av5 "%U_ Ma[Z%5èID9B  rtPY1O@%?^@&T9MA}z=l01C3N"yފ6AHFFfaOry9˯xHW<򩈙gQ|قJm >Vs\;lX%7m*U^|B&.RV [)| 4, Vh~*Ԓ'KcKjM9m(&U W{m|%<^N}"etW^ZyI*$W0 k_A+1r27ael?&pH(҂w5s~Jd]ߞ,|/UIV_؃sHy|z4kԷo XɎgi { ') ݩ!W= tmfb l@h"sy4ᴺAwgև-{ 3J kϯ}JWlNeXπeU'\q]CvX,c嵾,_.0RI]%>3ž)*z- ٠U,|dK@ao˺33O*[$8g+;^%鸺i飯Av 9s }xpG% 1$)3/<v07a5on @0{vyGO-WM-2X(F|&w7,KZHVzWԧ? wpEoͻpneI܀RB/pf"zrs:e?*I;hjy[2R=?_ טmqbF(D٨ ?Ǐ_oA.znÐ9ڥԾ L?xT]$ .oiٌ`򐩦Pt6n~ty &OUyC&HeӒvcSu gыtƖk X\v}II\5w{p>Lj"('GpxFёCШÅ.al-N(o^e @Lr7^E#q)l4 h ;!U<:>3),%mN62Ud M=7l}kVb;rr&MH'D꡾r v J16r|ZJ 4FU}(gZwpVsͫ\_+%& +SB3ic)l5Eae}m9'5C_0˞}uMg_*ۀ/IHTug$vKԼu 1 qn4% G"<zl >jJCD82:.`t$lSbNX{ hᗵMR^?S6Ό1+)9چ@fHu`ө|bRQpD戥tX#!2NhT@oWk?b3ٯ9T 2ׂ{VQbp/y&{,4g1o+ qb7Q(Yj&uh}Uq7F|u8c?σ[c ެޙm_l3+3E KOUj:d-lۂØcy*3J@+EA-ězhϣS]&Sm裿Ě> \&YƏUs=9YzSD.NO!+X#%rbӽһɵ>竃 %pcc0~N}߭s:a 9ޏTLfj F±M+7؁&#A3; ŕr2-zmV;,,v5ۜ/X*`a8l?hajo?H}REwOngnG{k3]*AWĪL3cH\;or Ȗl9X7^\C%`eTB3y :k)Jz UKb叾W(=]DZl /3kTik5Inc޼ ڞ~r Ѥ9hFe%Ņ:N| 4 ૺЦGt6 ` 60DٴV*,PW2őbqWWILo)[i_XF( e"rƯٲݝJEܫ_ o.,-f~:6XO25>At-AOp<8>ʤ [zJA$4; :xG=\8-/'1ҒqH/[oA IyjBUà`FVK](zA 5C2e cqW3pPwOrbY*g9~h c?Skdr~$BQ:V,K`J//jZk:Czwk<#6sIkC^/T1'7sCѼXU25vLR#|P2\ :*ǵjE14NEkW s[x\K8ܰ3}##Һa%BK)uSdR#Dxmwol},&sEn {AX򷖗1s(^L@3 )@LE%Qŏ#Q|LTa>_64&:R Ŀ9uG_*+ɲ 4lt3y m2D$ޠ(6c6jEVF~}R7: wSp1fw7ICkDzM*1mJ f UAgNab?~Ij(x_ՑHaG=-K-|#u:R'Ѝw߂lsk>2nT:dch n_:D ~3y_ x&mj} m#"^ޭg}+)G$gs;oOrB1wE)-2YvL<'t@v)_r|5dti2C61lJ%fed498KE0o+Dޅ5{2W|[N*g3Sšd=(4p)mf;NNx*1QaDw,φ6s*2EIR g>=i_u*W+?'K˶ &SUXeQldGXCds/A+JLV4(Wn !;靓hbW*1s+h,ϧ]) FRa`V-CpAKC  ޗHYqw\'>mmz]}+m\R8H 5*>Sm="m.P:͍Z`|* e#Cq/Rl :3{p.N%;r4G1E [SÙ'2xX\awT-D~``"^a}`Lsqq"/w7ڹɶ04VWW!S.OϯA3qU hk00V} ^r|[JJ\!y$Scq*8Sٍ~uT ?͌4Xg~Br%YI.K].;Bcڡܿ8IdyAz %&088iK>P_U0j@ 2򲐎\mԜ\h)ZDET`XN#eu)'ip12} bΧNY 7ZZ;xdRH:u-NL ?r{ MFmbeN9 (VKM4Ha Sf݉0ЏU%4*,,oQov)o2@118gU ?=l'7ZvFa=OQρ@쒆ޣ<Uԕ±ȳPo?_2DWB}B}! ꔼ;SYᰚ.~_2MH3qPe৅jO,#3jGFU|ڽ͛E-212S]L#ٳ39A֩eؒw}oOT AѺUeJ앛 >|/bvalV;8/UX.YJ#2'Њ iMxuJG tߚVdc~ZFw#!'f״^vr2yJ *^xQ߬*g}=6CLhY/cDN00yS-EV)pS. Q,E 2?Зjft<(N$PV19F1|]zY$1Ztlђ\ 'RIwf;Mc6ƹ[i.:lyDTà>L1B:ΰ\⻅ Ay"pY& Gx_C2P K<Kq6<.vĄb¢Mqذ!^J1X2ە+J,&>8̓2Ѯ l4X>':6HgTጼtܜ[GR"@[JupR5,/1NsvO^ G9a m3 x H~ǹlG~@G!hnkL&c Cz:wWvKk'C|},77X¹bt^W\צPvꁒoL V=}%P@-CRBE}T#Ay苨'S>Gn5~Cȣ #%ڄ!E"'hE" jg[P kcN&EPY%*KCq[TX1S Q[$Y;1x2:#%#Խ@T&#T4/B;wi{Ue#B 5&|> X]I8hM1R2i$fM'֚~ijh)L@/pHZZ}R iC6Y /;R[]޵t$BkiQLW[}kϜcYDTbC~oTE~2r>WpJW^$7ut$]Rw% сH) M)dzB֖qG[c_$~hDk# wgs^/m'O^Z]_ur\'2pxө WRf?|$UueK.-Jts{\j,.љ[8 w6Kkt;`OnO@%9)Jbb`8 dlLp/mgֱ66@S5n[޴ hl)3 ߢO0FpHk0U'ς璫۾O:G>^Xy$o\ąRm)tB:%QɊU@KB҈3@GP+/KMnd DLT9Q?>,Nj}&TBWx|{|Y>ۀC:9fU h{ ,x̐ڃHST&s[I>F3$eNvlMa㒳19(=A^!0e,uFpeEeu+0b$-sqr p =)nt)y;2f mrT9Cqhv,2/!*;RS=κ-߉[sc2y^ݐwn-Qx~gf5Yzbβ*Bs vmcD ˚1\n=r1ySXhf(B*avhs-x~[KvLw*xyRx[E^&1o_!Y 9a*9;"d` l9hcL`e✫0 M'+?^*'h>A3 H:j<{lB.J="#|w6wXjs{c7%]:8L=XacACi n$E b]/4^Bp{ZV%C;uZ{:ꆄqѨPQ$Ra焠2rlkюbSߚ_LEy@&>`b- Q[]s?R HtUu]%CwTj5WkΗlvˢ%9Asc!󌀓 *k`\0f p#"}%CJ JJGStM}K?ɼ[،X"!V͔Tpq[N8Pv)$+g`|:Al - iW<- _SgUJ`z_29v"BБ,ửs])I6--&%(4oaYHfVCH k,J?;(yooWk>3Ta!q(j7 FR1NՈKfJҫAxI.8tSJŸL.VgD)Q%^&JR͑NL{9lr*tF4>gzfh!Wl8..ھ0u﹤cm"CMY 9&ձzg>kӼ UgA"KC D>!}DcÎLڻ ߇%#1|}R_M(mp]Fs{2ߚ\q'}tCY~Z.풊xoU' cY2U.@bc URLc} ҩt$SC G1iC7sܨo5Nq+oﴜOg.}e#=KjKj3}[]kT/AFud1 48㵮J >[‰G]f{a6xGo2>E] Ԡ5 R#߽r`Tw^wވc-s L-~x! KN*l?g;x&2ͲF؟I:[6`Ti4I˷waB׏)9/3jhc]XXYUi- r (kAE xvhY[Xa B~~7 8GE;\ϳ I_ >yˠ#.3Di1OKݛ4ĸ@u~㴌#NL8 L@Kތ[9CFt/1oT,F"v5)|5\RF}^mW#=)S"ZfhguX;~HuT<; hw;-2%CȘׅ *M p)k3&Q$ \5.N <"aD)Nmu=u[c CӾlrgWs"jB0 f5.4n8*tz~ 1tkLl_W--5YϽvO]6+ ~z^Q HH;(3 ׳Eݠ'6߳ i d,2?p,v3h.YwX[jb)-GʟY6A[6>8k NéE?fO~ǖ](7" X|_]:΁Ǐ<+ө0.mf*ds\4e.L1w.[yԠ7Zfk;12vi:լZY=,EX'߶j;ѴշgڊǰgçT ?WSC-O:tK^WC6wLJm*8 Jx-Ä{T> Ep"k`& #zj6BXTƕ }̀ڌĎQ::غn%WGoўT<22L6v޳ve Npzs{iZ@~O@ '}+m|=f'Ѫ@0r1F+J~j(Ի9oA=2sB"YK=jAs K̃I0o69C_¿_r?2^}N뎜LߌwE*5(kQ54x..n}>\ŝO^:ȪG=&r>=58R=x}H{I0-j ˌ~*S5#h7೮\\%^l5&G|.d*ҬvyOEWaEm&dDk@TW&k\x[\`CZj"Ǩק$ڻYL_'xc٣/X*9( A -^8@gs(O;,~ZP+iGP'ajZa2O`!ܰS @w1AE5>svbPp9kaJ<6E_xϠ- |80\4ݢ>K҆#L&(o,ZLo~IH>I arL P7Zˣ"嘾\,8^r&[Qe@2:UŦ$cEА³ >\K( 2Ţ ]Ai>p}pJ>Q̄|ugTQx]cM;8gՍEJ+ liҜ*t98Q))Im>ZsFCJvMQLk{Bj'k@W1hNGq߇ d>phP.00HYkp97A+.k:bE] sVgSL)ػ&}^rS\on=pj-ݑ_C(|ua0po=(~+`3L̢<MsdcW"}NCApdeZAq/^0w0b""Z10π=#\N/ K{5D].UϯsD( c VziYٻKXt_m\_c%[P|^ւҟ֔,m\w%;U87({J&<]s,tb"u-.Fv ,P9~4('6#F(4B'" !&rR(J(3mNZ]$Yn(B [pue EcV*- TK2M `xH.Brsk۟iNE#dk%,#PaIGo&{kᄇNuQn8y!@eA}pE{|I3,C:d{7R(%=b-e}*sTI4ty/T'QU40#zǗ[wވQl2ͥ\:>PD`]1@91C Z:,"68ئz{%JW=e)E F3`.dWQ7('b1oCҋ}:h+}Kv䓕BINqpCiCNn]55"]ϞY; )vԫ%nFIBjBuwIlGj))ΒcC|c> \U.>k)o>wfghE8pIi`\7ea'cabɪNN,TTrEgeN-N9.evR]6}<1;-+BDaAܕE|[sR8ZLGRa+/ȜnˌF۹KW݀i|v/JaT!b{(a&V@ddf:&`%;P:p}1aR])[0 wMRQ'-6?v/KJ1w0)` #3b+Y@k+(5B+NU󔽊9Nvj"69d BM0(57uW˩Z[GO 2Ak2^&EHL@$iuHhӌtUC7qH@ݜTib~*:]t&/ʮ |1:'+}wK: h :G1!(Se:MkĚfz/>5 L0}4xP34Ѵ ‚y5{}]4 gHY&i8ϑI :/4CEt9܇GE#~^ZvЅ ԯyUCم(FX o}f#Lcʸ!^ʷÄ; Ǭ*B5! OT>ks哄zܻ?Ue3lY (_L%>- HɇQ =⿇O?Bޜ4ݝH q$O(Fp0S caeD)xLx2aJҤN}_^iN 21 YTLJ85l͗#cA#ᰲyV7`y_Uu#]+Rrs0 p!'.Kąш u1S~6 aun:A.?./6˛a[ţΖ] >5,X y{DEnlq1QsmcfZ117F}Bd994|y!f,0af ٝ.o֞y`1ۆGk/?ߘW)V4=)rg`P,x"{Tw!@& X#DT魲 jړw}ߞ(r.nQyr˭dwF+Ef]8C~c0= BTtk\&,8Q8JZ}IQn^"ӣŽc">H f[WRu7M޴kJKByW^mp?C 0YM$%Dr#%ZߊrONS>]NJRwW03L>`r/;'a4~Fa3Ȫs}k' u!H $ ^!ގ!BxL6߶zWho{cc\gLVk?vZR[(\8xM3~mNm؊̔]4n(~~ O軐+r*O+A[.˲uɇ7jYa`}a4bZjT*p"##9qQg4CօS۵Es!`x8CSO^o9Z#:ne"u5/V|+G>!{ySB(`)+0dˁ˯C8i g]9|Q>\<*SV&]@BUjNO1^5I^DNEshYpH0,Bw݁d@;M[a>'L:\vӦ~ V Z&&x*4| #B,ROG>$T,J1@,+ԏVGZV3)b2\]ۦeeMcu{OW&ݯɹ!ldIn[H:XʓGnQD#?3+nP`v97 Y};O1)C!DIQ2BD6tYv5gX FvLM qkKGB6Xeޡq܆p D㎻ Fu*WM!kj/◊mme8 YFvRgCߞ+8'mH^d#LI~ 9bL }465WpHeeiRQC\@ kK5fMMX ٴY>F۽֩ܒ5vfw=[F6!\0.5%- 1ҙMl"Y6LL@-\=ˍ9Ɖ̚icZlX \Q ,MF pCoy(W 5 MR9= ҈EOi14 Rh{i4Ցs Q O"/9rpעSt9zh˽d?D?zV~{O:ϼI˖+WtUw0(y>V[kTY-JCa)}@pT}"VoRDfk z2R#w ݲ +Պ|%f* " ~/+䊘OW.: ugf0Ȉkq:y R@`6fk0" &Hg03&fi}>]3 b ԱX=_lpҴOw$'ev<'j)证l06v88DP!pž7E˼#h7&UGF%c"[j`59iV]~'JT2 "ǪضoyaťJC0WT|=lz៎m+"rUS.9pt *~/ƶV{7;7ĞĒY56ᡤk7K!E=.{WS M%|S:P4<uN@QHv@gFVYРp6A "w8WV[?絧ADO-ժЙ{Ƞӹv[]:5ޏݚS ¶>ސheMkzU^ܸ2i3ۋO4m#Niacȩxc A29m BA4(Ԝ*#\\ܑ% Ol 8(1DN휑IFc"Iĩ˱tcF"-]>AEM]^3K)MJ7FM^ j\H+Ն[|SKRo YjX6~U ?nY]؅'0"9z=;y15[Kg)p9-z4l$ifF0r^OS4.v\ m#1f}H)LbT' xçv۠ 7ೋmH"ݱ $&({-/I&ξM"@ٓB2٭#40j֗o㲗a81[f`"AK"xnK\cZ;s#ɦTrIa|CP$l%(o~l TX s,ؒ̈W ,sh#:HG2N2q,sb*2p_ _Nb٢B x83N\e,4uk@F6+:boJrRP4vD>*r^S^DQD1L]:뺞V6QA?UUWIxi|-=Z,Bo(wOudf\أ㉭XɟT}]<:1‰#z,)4R013q~%pF:E?tZu&4Ըx+Y UVw +=Bx]x*EA}[JZ\L}da%Z-<>p䷣%} +@NJʱd mv +ټ׺I,}`⺢42WZJ:n;|>-sBc䁚.˺Ž2cXl ۤbí7e nliFIdN1qh=.y!hbCeqqh;xlw"9etAǤ^lf3Fuyψ^TG ʗ!w,(d u{lJlZvGt!tMN=oTǬ$"j*J`CL]U@i]Wd>  ^H5%eSoSs`Wp@8*,N&aD'0|QH*\& Ks{K | ^Y9t#Ch{ ?Y_#l;-]tauҿ7ﺛ7*UZmcH/ś3(SgjʆJ[9$DU! ʵc9x&URגc#ۨÐsn4l&;(a1luM4WVEQzY&c:ڵ*tsg;1&J8sK(V[C--޷UT <)r¯˺Z0V.|@wJe2p56r2ߢ, Hn -u63*0[rY>|i! F࿒iK LK zkWA+Ds0WWSTT4$ji+%CT4rL|(ߖ_r>ìv[*HTʛvq//h81}N90ZWq|3R!*C=w~y fr5Y4%~]ű~gա, wZSyNdp[NtJoNf6Fs'4nc8Gi _aw>%0G.mFLUL"î[DM{!Y)WV㵒u ׳kl$O$<_`bUEUT3uH+7bâ}BjYY?)ija*(L'!4m.V?f12K${3vNjҝKB|K9%'؂SN(g_P~B𷝺P+7?^E-P'y~\g\N'/Ύ,U]UH2 veHȤ+"͔#t`m90ւnGg4*Ϙ/A5~KR<9϶FĴCUjlR}jg6hHFt-nNݱ̟zpE]"Niw#,jj!OjscnĹBƻa،1zGJON8mpk+"L>o׮5N!aA38ARL&9i4v3;w0|P `ʫUStvzJwJZg5׶pIfbj;*%`o oXr56(I9N #|ymhba?lr  5(cb\nG`& 8nS%Oűm8K B~7[G~Mp:*BQv#wӑ._N]=cH3Vy<(Y1u + TIbʯ_i1QلopSS]$3F\8奡2G ) w1.-FWb [ekcdsDLs1/oEK u+▝4 &r #tᔢG&>Y>zPzl]t] .3fc Q"? ~Ūj>C8n;mHcAd$&<x._!z,nv~ !챴nfRٚ x\ F ߝظm1݄D G:Raכc+Z 5V*[(({BJ?a=x9ym,#C\=8{j{ɭfY ϥmx {Ϊs,; \z|+] "׶^{,.}`~S3ZGA:}C@j @%l3Io׹F ?Tjo5BPyB ^]4VВ]pe23?Pi-@!xN^v%Ocu*$<)-SU`Ag܉!i1Ճ.ͷ{C44ԊӰtciY.B窤/ =xADz\vI¦@`K@C\}$9^:cgد $CЦp!:Önՙ}=v^jmVFKpI .$(GMr Ryo P ƣkDZuJcYX[h ǝǬ:fTkwG&]dݍE7Jdأ2Ɏn(UZmPrz}z#ʷ5TlXsf(=9VSd:˻/j(%2G[b91.o D<+@\#̢(1 cm&u.op߶(z7%3tx2-}yzojPdyiiE+) 貊m*˹z$Ӯ:b;\Ў+rO#2^yd:`_Mηjw]S+-vBniĊκ9,ÄWF.=d%D (~m2D{5>bx v Ds"P4KVweܻo15V/:j3sf^9AIqlQS7ȍO? kdJߖY09A8ȤXRHjL$]D#5 ;Bj4)k[Yxk"ƋIǖ!3VC6EBxP h'r a$ӻ=^Q9N*/[q-s8Jg5l2Lbh i) Rxb[ b ž@k{+Q.s`X{bnoc84rqĆJsJ`w}, GC/O<v"CCMD@ Qw0B/Yc )o?ڍ*\Ѣw){Z2xdM+Č*tqb١zqz0qdXmO`Ќֳ !w> ثOXdiRI8H 7%RX1GO^./gvzELڄ 7QEܘ"`@xӆcW(TJ)ip7o#U%mrPV8-F\cwaKLֻGA!P(ܥ>UYP#QnjUVbFҖdP{Wd[C6D.d [5 qUob4mάbe[s<9Ӭ-{Uh m6u;[ruC?7\Tf3I W\.^!b#yıK.S̲@A9؃ͭ*:Q;}zArzNHd˫آRl\nIugP tiMݻG+ P̂RvuT6XA72&M[lD4 ދE-Z>f̍0_]ny@,&?#ba,,iwi %NcicۼU`5! MjR5C@>!KTғ4PҺ8 rzMqJgE{H>0{cN=;i/tt$/RJ"⏰cW:(EIF7ͳkqVH dh`4lvX뇉w? $bx*qS<Z;:E6HFO^p{=b 7l଺bU=A^ϼl>kgV?јk뻻@#DãzOFz QֿV96GO?Hz|y>Vi4iwp-EFF@`$Ep(AUC"€$& V'rA#p,4e@?EUuA 'Ǽ$y%[,AOʂݺJejgmd6\R%g/07ލoI-@+Uqӥ 6*^E0iM`4AWm唫64v}B#|b='˹!dK7PmTQ@dnNp4E/3I+6&[)׫\r/ )eU8w0mfSPBgd|F GJC0q_=JJ[PwMǕ|A3JxZC/isC^43itf3Ѝ:7͐/K'j#sg}DPi1y',."(Z9ϛ? C(G ,nۭ_|!I /3Ŏ\.VxF&X ^SH74#:>aH˶RI2]S60wD1*>B5;&tWR tmd 5YbM7Mdp Sm׼o!&^=fԥ+olN;rzڥ}hЅ_\TTͦqYuQoȭ1>Ujc&_g>8u+ N;# atn"c@;ٺw-yN j 6lC&/shI߇.ȥ`uN*B %D1F$A~c؅2gFE֯LUPƢ2rlAlK_W EڻP,&?cuI07;6Y{QĎW`L'({G=E&R-8/R߂ES]*5k0\Ëݝw<2K:+$* !>w^\b|!/q i<5ghN(p~Ŗ$9WQPg|rfbaYt"pBϪw.̋y<6rN q|TMz+?<,J2Aǻ:L;8@!U E|\96wV4bl0۵ѸIQ9#o RQW[Di(Sn쿅#u'VkDX $Wqu\/!V۽;"R B 5 1a/,2OB[2? s̛ &hIXͧ+SKPlhIS |zo c{0*ƝĥV6ԫG3lNVd#D AS(~,lQQҔ앧WP{Ό>S]%Sݸ~|mko~R,0a5~46J2|Ԇ p1\E1-5/|rCךy_(C$mfW7ÆlI,$HJjI#z@qy=J}?蔏5wRWS@g1 lܕ+\͟Pk&Q*f[D> E9÷ _ s&A8ps89eO$Ȉ ʙɗg~t G2Viz>tnx232FddnN$7 6jҭ0#ؖ=o؍zZ6*2,yN)A*##<z~An@HR\šFj1U[J*Ļ~{h 9"#+ 7`:HKmOϾ1-%rWIb'~:w}|\ t{x>X-[K>rfoE`:9A)| 0&˂]lHdM pbsf`? Qt(ܘA=wj]{JHg.Ԁ(9֔J=`6eLT a8nmà)wf꼠l7C@l d3V0`?3BcTKogmyX?tKM͊@s4ۆe1f !5lK(7 2h5>W"eKr&-/S~@{(m`2BZ_WQ_dHK]>eF'ıF 1\ Ŧ8eDmTWjňX)&뢣(Lyą"ITdcRD#TCq]mMIy6[<c>D(Fmиq_ȳ]ʼ29*7o<L=WϋQXUg7I|.=}*mJSo'--ٷ/r6P@ٸ;}9erV+V&51+l 7.L92h,w16H TQѣNx. E&8tr^MHxJJ^B1X ywzQtJL!3Sc GlDX'xqk`-plC,@>K6WEܺn¿Vh" N7e9u?!/i9(Έz4h%ܧ[5(vc %^+Kx;U-U+DY b0N)uQrt𙀘C}m5|Yq (ȳ")wFkT[3EfZ{ZX'kx6s?" ͬǿцԳBG %0rTm`9_GNE_‹naUi:zr&I ҙҸ Vvcy sp?CkTw 3uFsgS2M̄1vNZrRrCP&FqIb"|A7G(ii/KzG^#CiQ|Ǵ*$P >Ğ94~ /ĉP1c[IU>2Z/+BRQ҂)|ʁ!1:kk.(BR0Lms%mF*OP̐>e>[2O s"kr6'up}vK1fЃ/׏B-~Y`e#=ƃP v(!yTs\mpz itEU>}aoќx.#ݮ(>&1-K0`3cWfHVC  ,c`U=f3>2~k2HR)1{.HEb!# 0|߳2U.Ij;p=՝~"̊ҏ2am)g3ઁ%R" g*D3ط#b$/5,"y~Qk fKTXyqoiq(l_JԐ }frgx٣5XSL"g#?(@XE;BBm: Akwɪn]zkKfZ!FD7@=3h^3tbi|2:A3Ϳw/X-oS>2IyQԦRQZ۠gPim~/}WlE1MkKC_cix(owW-lz -ϫ9&W_:R X]ՆS?֟j`yr6*ȩh5mҩGJ6FȶsRދiŁy+cb'g-ìEa {o$c#c{P^ IϩP iUE,4Q[^!眏ܶ4 pw]n uqYJ7 Xai4#R*JbY=E-[F])r݇v2ָx;ePK]I և5"ɈwD[%d!{ ɟ Yw"-9XQ oO[DyFOw_Tq^Z^4Nn,ᙷK]`B9>EG;TCds6 5)f]}w]c.,!wl 'ښɠ&\sCh<ΩZ 8P9$vZ<} PCmi~E>:;<2tQa<'HX)!̴#wżA2A(x;|.# JDC&o1qoi?c^t-Jtvi' MU:D*"k83~Xg˘{qvgg۰ Gu \is={~2ɴlNޏOwS">sb4QYFbִw`.ބ<=RtA¿Z^Ww,WzoѺW(+G)33<(ݜqO!36ڥKEtm(+S鳔9d@E3f;eO$6GcNhr=[]xKyw08|i1+L=>MNJ9QJٿwV%'0;cbeqJ[ԢWοߝ0J6q`)Q<٪p=EnkřFl-WUԪnڌ[y1DaWsWa\W+*]篛1|JfR#"|Rp|9QlP˜Or* 0UͷտaVUwxx !jcD*^!x\OZԬyԉžWVc:7P>[*[g)T9ŋt: ?FT:}w,F>x%8E-'dǾ)7\T [(պhˠ%[-dVu߫ R%.B[ˑˠ=)(PJy_V^v;|M-`jiǏ+"yiFvtt G i`Lu_@.ٛ#|tzs1Hj9S 3Rt VXO sW5OI!Yԇ^YpcaB!4m=ҭф.1TwJ4UE4sɰs-<RcE^*9,$#TeqY.U"TUԭe/5W2ۓX`):z'2Y-5A>/CDxvtoꑃ`O+a{2^M#)1"栂Ts-$T@ Bbӎu$:Cs<  %Ԍo,S?N(qNn D նC4J&pgr+:tSY+6#;~*9S-OЁR!өk&w?Ҳb| RA 4*f0Y}6s A_)\ ݇ܥAE<)vn .Pqe5E-& ݶ\F+?D·- mͱ3yPRGrUV=&DmSe$MWļ# Yu%_X&V -bQXw a#; ~'BiY,}ZǾD}jA=SO>8cycf$$x1rj&idU5̃0['='[t(}v9+%COQ%{ߠs֍{꘾pZyô(SI}尪W$R#GA=j<^)aVO jl,8em,yY>L+z7t##jLEKQO}C@wp.p5)oT] c("9Wa!AzĆAIdFuXDj3E: c+!TcIaG>ԏp&)'mP-ƞ~ѤnKΧc ]|SOi(+:[NP? |2qɗC[qJ /k]9|  7EF Ky* Sm?3m47 CD <&.$e:74#rx6~7d"HDrYptKF5bc%PLCt 4.ʕ{}SRVsLQI3%\9lqTX3 '/L+ܫ׶;8A+{0mv`[cWp(nG$3O3C6K T{-=ίi8cDX{6'V{5qI[$;Fɝ Ɖ^05rN"cA;Pxw[ Y!fhS4%f/`~o]Sk"\(q`神;LS)~}}GO F̄VP 80 *H, 1+3z JŸ́늍RG\t'}2RE$fd$d9?!tZHu BH,V-lXJQZ@2u22@7)8ʆe:m/ Fڊuִi~jrx\@s: /0ȉwX/,?+b\,\LM;!#BC=i3zZ^[ڧpG1D*W2=[pB(xb1A>%/(ga}Dڄ1wsNqA0{RY9k(Tf`\KE=}#_68]!&BgDB}B O";KR# d,">9`6,Os.0M#X4<0ֺO((|1D[T}m\ 4NIzsyzDƝbs"lmyMj?glHˋI545Z!-q֗rc</P'}x|W5Ѻ>FP~+>4K "0>~幢0qlaA<ۜP"Xs:bj暻R~ ĥ}R"]~md;;g[ 1! 09,袐Kdyp 95 jA~P!?]o[Dh *E\,M?Ofxbrm@jM`T/]]^lv\k!hiTpMdJVy`uFk"層R#ୂ^cYZ_AZC;#"?8gݽ⧒p*,Ŕ6cׂ6IA"ʻH+r~IaЋF<1s@v_@-xN*҆NbSCpd0WhHhߺPfp?9M%K(3)'eTZ<1NXEW6@!(d+0BUFbCkA^ Fw,'p'ǎpfx1V|1찗qkhnyjsU|z:wFG?}=|Lũ}+!B 2\>^paQO}ň\n#~H+9ZA>T~klUnYd,V |Z LƜ(4#s`S؛ԇȒ)s1)sx]]lRܧKeZEĽ`Hd֊'P /[X.܉ {V@ g"rsx5*T%[nbtHbY{-\J_yeLʦf\VBE6.K~}?gDd~:{d;u/4M/%`z؞I#a ݥmϘBnAYUA_~>M(ЃN\ 40`xqפr?vK\ (^Sx詼#L@✾<XTZS1]zP?"2BԞC a *tf`/H-'~}6, f"ŐN|c =Ŭ1^@"0zVcY+DjזJn LwC1X0MOֆ |?9 `@{0giB m5529hC"16 #UC#II8`fTU@U^|Uݥ=`첋r~_N,! A'+IOt&&G =& Qh$e)U÷|#Aă@ "!&+G %{`Rt&Ǯr %zVMR*` d&a; qXk>pdQhkɹDkBlƗaJ=q(%nԠ7(m}k:(vp xx-B⛍p}_uI+J<^'xwb|EL̢=lܐx|h7Ic).{tِݟu[jY$[l]ii}% lFM߮ʨeOrw2Ls)QUBM_B͜v]qk-+3-'>ww;KN%󿿖X׼yasm'w1X۾.z׃>H05-qZMFYdV=䡚"sQFЏL^ѳӿ\L҃|X$F#ֵ ~""\Gf1^#\rP7SªMD $pG:6oWA'jm49F8)NO#W?$l5g;|w 7$]'5 Gӳo1h +sLQo>£Q~.kKGfS Pw +;>w#|?+eLx泽ɤ' zqRv4Ӊ{79 ~ݦ=+Z@ ,eQ-*ʍSQ=+gr|59dkid!afC]%EZ_QT=b6 ]Tw8Z~Ϛfw~KM]|yEΕ8)f$𖻺A2tNy(ЖSGS31?AZڣ%3p4b.5nnV}@ܟ`a馣SU+86g :}GM $r*)a[DC i\&?rg|ymfd}@;% u\Pι1jGHBГ4cW{c1pXNV]..ԩ|5&c`܊گC$Bl@$܏~DEy Ji[NJ86lfQi?Le6c0ڨXUyA@ ߧ\՚B㺮kr08^Ġ<,6ԌTv0~<7E eo ^`^;ᚒH@1{Ĭȫ,`JkdT~򓽼i0kBN] ]S>(rbu>nyڀw9L]WЭ!5D#ݦ΢iݺc0e2>}QرD:g{mz7/23KR@MztZϕ]mtk6,K[B(PjY=xު|7ٍ upƨ2=Yb0qi߬B->|m6lps>]1pN<éE iQ,` {;80p\sv誥DT[(k2[,SiQ`+L~Q5༜~!p K$?o™]\57)^SخH:WU'9yT(jmv&zyIzQLs09mc\1 sN[_hwsoy,:W?y+ X%q 0{fbS5_Rхql9X\RP?ebJuJaRYyB[x$gcWwnȨFμa&JnK 2*9(- DРtDDC UVRej^G'8*Uyܓ3&|,rWkh9IS*6/'#ȣ"߽SQ*6xnXz)dNc<:0)mylem [k\vUN%8!:TPHi-55O:#pd:mn#@lwQ}ľXп]j~^<a V n_ġd}๹+@[1"% mtC_`=6NūG ]sc3 -!s\]o2.{#=,eV&'evwp̲k`ES+2_#Mq7m ژo{ˈSrr EhhxŅLߤs7>ѵtI:CPIʛbp47g'ӆOGɁ AFwWu>8aK G]KMj;<1)0Ug.v9䬌FsuSD1xQǴsp:vm [̉~-䉞o,m!^1j);.C[FraԸXʹ{N Y^_YoTdVwOh\|8P `y.oKWf"W8UJT}@MܫD*!/7=(Bcr%n=L:A'}*:whpgǃ#F*kX虂5_Ts U /r_=m@U/#f afjHds66@GC,6 Fgƶ<;Ǝ$-/fܘW`~xs}IY8%u؞s0ab#n+G|‡VB fktn$ua;hnhtzPywj`̫5eDrSp_"ت(?}tHۋ@ӪkR: #`?s" O- a Lz<HKi7=>+{P+R3[9"ܵ$iE[Sc92sR9y8 O3RVb&UMg/ $P`QT]NHQtؿpBoCK[61]kT ueOh5?ЫFzAT2{@kH l6LY=g(sl׮o!( `lieZ\J۲bH.,]Gf"V17RU"lMޛ9i01n gPI& 6շ4Yu90"6lB6Mjq|zYH*vYLG`7lє&94xw9MU(-U]|#JV49GB(ravBÅ" K!b,.&ueܧ=)*R{QS*0عrIz=#}. یmOs:o>.0t\ Y?\cCG.TaL SmfmlY5Z<;g-xY6!WUr57!0Vr)) ubY`lEuJ6~q\|D 5r\?> ɉWd/>böU [{ȫG.9y0 gw P!8!,bOzVkg+&z'/VmQN1u؞\We }`֕g;6bΙ+ l; 6O C]c߸Oy\p8Gbp4NjBk9Ebt5a7d@` t؂W/ρi1 zXfYY8: 3 fzO3GU.}[|#1eS|65U`!dT֐P=㹒fĵ0_&6.C˻ߵ"⒐ IwQ}4k86+Ok;xoGgL{DqQ&CafqeP"EBʲqu2"H}KXa%u,\rm$U U/8`JXwCGF9 A) D/gY98SBNO;3o=߆n? 7KY:2RfGˋHcƕ-~E#X24"YHqit"ED|ql֘FU3;FHl[ޙO|`ԩAdx4E)uL,AT6v\Ou{g!E*Kөhh@-u TX>Ke5/6@' лPF_ZmG3 E4ֻprq*8Cf' ,JJmߖ8B|? ⮿Vh;SЧa:P8 ~<y*;v̌$q1ﮕ:Uߠ?c jS* %t ZBDF*qEיau4k/69NIsn$Үہ?8F3㜴gȶOHM^\"Wܩoп4/^.Љ!(ODɶL@.'6b1u&l1Bmsj甅=U1'|Nա0$%e {rzNpsq:gşz[w3sd?nl|H8xB+XLU/S u#K)`WUyS&,O|YJr|6EaR4[:tr}3$OL|O˯̸&̫-5X^P1RYA=XP4M'm[՛{O_N? \4?2:,^q)`7畁^>x8^mӟe㟆Iq] {{,A b.2w~֝%BWzLn ;¹DVW^ŅvCRB[Bc PJDZt W3,ژd"O QP[S.9,%C1Q]RJ<܆]5/ՌTU^7p/DG?;:|3[=PUQL},/sЇq.`O'8Kq@UKa3=egtzv1!ObJJq`~PH.7B.XOqW%IMWߴf=r-mgĀ69bšH*j*/r]F=8iU|05ŭqm$&2mbT.x*tOVR}M-HvkR -\`;{h:kvP#^3\5,W5-OFV T L9ǰj4|DV~\3; wlPwV&7p0E!@"ހzw.Δ\]ޘLli/HAIAhLSU;_PhO/i$ϙozIVɚR 4a~=uǪf1 Sw1IKtEK1u"NOѰ '"\"BIL.(z'5;)x?vHˁMX?&=CeWuCPݧ-rR:_`5OV~U7 ԨNhs}L9+A<|(=AkB.R|ou f tDэf$ꎶ8ґi= e(F*9n먂ռ=ϱ&H[b3@zDv,Az2]Ne3`,vKUD^Ji􇋤g]6!Rb;k" @EΔF]i#'Hjcy ôY.2U$nw4 + *5@{b=ϐK0&z`Aœ:C*AQ{Bd;E=x[߱qħ. 1e.7@j'x$Z5/[4őZ ]߄ kr'Wԧa ϴN+brF/B;(z,HC3fvݢR8l}`x\3(bREeVKԀONjy–sSP (9\2OTu1Oy^k-*}9L7x8>5+~IE<@?i^e >QFg*mCRglm_1Td({ND[KB d/θ&i$ \`w5^ $6['<A$҆o]OGpj3Z+1vXp@hx keңfm=VLvsԏyp{g"n LUFImU3216 *LhF+8F X(a6,{=op:b}<Ԗz߯->w`Wy7*"'Rbpk?.cP[>zvySE-d@rjf-NP3#qC%Dbٕl"`1bbQn4h^+O %z=z{ y@dW/LVY 0 cJ}+s};~X[S2IYFT۞t`VPbEX~<_4̱:icjxJZQ.x&E vnXbLn`0} &zOzytdj31h}w0Gp,XRp+9so. ZgpZA3 H555g};~1,=ެ Km6䅔抔[I5Nʺ5LYBy-9*-c?\F/@&=`?6YZX支С@Z8V_ԧƒ ]C7In亼kyzoޞaϜEEJ$$*4N&v,i.zyJOR(OhxҫjdОn?{?ll淭K|οȳB|eB1UbyˆMNYq*TQZk:n>A͸T(7 M=0ˆYѸN$*v#rF^l07J4\3n&Tr" 5}ހĴϞ#$*Wl|*25d$66LH5!_UuԃD8YZXrh~X]U/EwO8JAl8r`d.Һ6W+X깉n z}2ΣEjq GHw_ޱk) $ ao3ڒκ x9fN B2X1 }uBr>' L1s.V'tMҘzƩCadSٶev:mڋ Mvǎ% ܼJ-o7CE!};&S(vPhpdOPc0kTaR2Q=cYEZW{ka|nZ~y{#!xO1Pb|uyrv ä* QNk0fEicYBOP=zN_y{(-8a%:aB&Ha?Nc别 >MAd^swU믣dYaF|Ҁg{IFϚy&&5bK`).R?E%ӫMK'OxW+7cZL% q `oq= >\ b mjzbw=8.2\R_J/26,&؊I#{(Lc w5hA/ )- 谿TYzMӢ/*2C%*D"L5!\e nO0MMV5GLC.U1Vi[ͨ8 o _-T.ɯs! Z\c=DMwyމA/̵(3Ѱ:I~d&Aiǯ|LҌUZꂅ+.g42P2%sܰӯk~sW|k][E m]pM֧ңjf}g`t4ğ w>&/rq؂tGwcաHa,I7$wpd!0:YRmN\&&}mc\QGIIuUlKEDz)hl"/<-ZԮ19kdZ[6y0jҲqgRω$KA(9%D1)iFu&d&R ̍Uu,ЉVSjL㰤~2ϫzV T*^63$q~3]TqI (Dy(uP z M,+Ȑzj;Ѷ,/UY2 i[ bG$u};Rv%D.j3Y[2V')^)^uptd10^ϜxNzxʴTElK-xVږ{JDDZaMTpx>3$-$XGzcRH:X e'":{qtY흶0񝦦]{\A%32u2C퓅Rxj;,ƂVd*CrP&oIKhA4Af FK!-{Y)z!oc+&"lr8"7-߄]zM^62#DNw`,׌=9-3(0+\wR::z.%|s2⪀ <^y*qJUӀ0I;$-cp5"푗pj`6ov]@gR DXrkCXHJ*oV?1/ g/RWqesb-3;q:9ɸs/N;:@iLIC;MfB 3gkpF>åw銦3VK!&D/4\)eą1`kKne Dꁰ'eөCRw_G]R Drwg(kG←cV'VdAǼ~ gK<'f Sk7RI:t{B.Zc}ك4k{Z H26Uf. x*8Јq6Y-Sy X}$-uƒ ;4+J{$&p H+`??rא=u!I4 z`֩I)_ }p?ˡg,%Y%(\x}l/4ԧ.@˖A$@+-D C&)Blpܯ@Ƶӫ0,yjX;3f|DU#ԽbQkM9R~GH<ȏ1,7ƒ+"J(9Sw@\ K#@ Pj/RenzkK T~E(J߹vxwc T,VkxGD̰RoO p}H=1ܡYR &sLstxi[ܓY),)Vtyntu'dw5˙*]OT*EPdu"Uj_XDh FDZ /GGߔDwnfY>pa-6~$6H}8Q'ZD>f~Äp *z`zV Cmdk"/7>o\Q:|b}f:ZuH7ۓUCxe)y$'46-[ el^E]6?alE"3#R]\ʈYigy\MR /I:38C(EH= 8gj18ZR=q\g cY 6ᛗ+u1~jwQS"6~tt׏I "Oh,O0!5#LXj8ze} zcSד69gd87eXd35g3iN 8A!Fj+UYD[ZDpH l鵟٢6BLUIFSHJ~rAdt0ɶ'0^'X̡ /tDJ5HjNZy8F,l r]]8e1UR{,,>F(ҽVVD2bx;V"-SGuڠ"0"+1@FH(}8  vrfA>F_͟\vCE?_K.XZc 3REllwho,QXhdQ]7/2^H_W'(H$Nت;? YQ]WX7#)󊡕GXp}#LjNB"#{p¹\^+k t~̃bh=2V-C=nfbBvX҅.@8 s`o\y //>32ߌ38^[_;&`}# a3 xK3Wڐ|L?ϛ)/=Q.yH,,Nqfœ8ŗJ`e]5EjYs5YL(E|E/AN}DY^1r4Uҗdwɷ$Uf1a1֒a8wC/UyXQ^7j,p" ^]b[>E;I;{ȤVigT#UUbU>U{tL&nKΰXǝ{>7ЛZ]HTא# R5(! H;yN}yef\7Cqٖ3aGyfD+]@1Z c#(ޮ$ZQWQ"I# tf+X/EF -N;se;GW+ AΝkQ9Q}mɗ4"WmHn?~zlץ`ℬxq2FmH\} j2PhU)ďl+QF  pOjkKjm5]MϽ{T\PH;onظ {c%!bdT< jƯgA3[ =q~|~M=Kf۴X~7/ugd%?~B]}(?=:=ge9>Ȉ} ޶.@`\k%KgWoT⮲ٵ O/+On"H*ʽOɐL,}C`f|z)&tgb: 6{lQE ޵Oۦ6_}Q{qUi1 V~┴E%&>X^nWm#e:*z5T Ԉf(UC]@xvm}?$lhl_geamsaQW܇U|'%(rNߢ >_lGvm7T _Ųa] ;Es*KKavK:~L 7nf FzNB۠ΪDgY!pqs ^̼6= Fԗ 6|RsGGI+,P%\q#vY sI;Hßf}~V+ar6:^c,TŰ"2fbkV6u/G&hz|9uEIq\ aP6wX7MbInOTbg{lߪ;Iҷg1eVr.m\,3 $,}d *0 U{bN<ӱS:bc09# So0I׸:X덜dB7| %ᣝ F qω5cUW*_uF7nލae3  =0{x[z4Ua}yi)7DYW_D,=4Z݂(]~2 \v_JC/KQ?ф:x+n5(!!1NZG;f}v;|)'@ƫ$ ' y0VE.OgU|3J8 Pk"לAѾr_!Ã1`)^Tzc3$s1&̉XU(ߪPX޾\=Nqpb=nըޑ6V(`6ݞ(?p%J!e+ euNN45lvEqw58 U#pOZ<c߹_r;# ՗dYg#u+<"_ #.Ybz& ov^X6#b&H4%H#mQ ;1`J#kPt=[U; h{eO3A M/Hn#+SgҀ<'Zp^V W2rf]Ȝ"5AqxV6"I2 2He~懌{!sM̻yRnZr,brڏAqs2P]tϰͯ~<(6>gT1BbKplٝ+ԭ[U;[h`.3ϝy#m7Nrv=bC669b&$f YT_JkzJo(L K-IJ|0Xlm'3B/E24ʛ J&H~E"ӟu]U񶎘}c}B \ &`c^xQU9=Dg l$K豪3ѹAa|"0̃!jQA؁FNM#^c󋇻Bz&LJ˹VJr8+A KCP7pNw|@] )*vWwQ];-QO`MY|Z'gcgSvN-CϬyf&ɈZfy=2i>nM\֗ilY24WigIڷ &{eAԑ.h#~lS_Wb;wq;,aK2*.:H|䑀"I t@5'.*X`1fFt-orM$ ~])`dGgtu{᳉ AF31w Qln8wactRa?Iξ2"F+.g em 3b4Y]Y^*uѣ MA4t0SZWk,T8-u0P(+GT@Лo]alyt Ey$݁TV֌tt"*Q?V7a`ΡcE3-c.Fv[W+ت~̝apyP|sE1:)%[Qˌ: 4@orwy|>nq@7طzm!?xl۹ iJIBۓn)TxyIt Sf]PWq 4Thu)5Lq菻 f~,DANnYּF9,] iP!7Xb$ؾ>DS뜸|Iuw|>4Ȃ L&6\XkPn DțXB350.1-oJAzb:@ $Il𐃥q]u1\đeYz Sٰ{-'rm<3H\XD(`{]<ԷPsĿ!&YK2}\RCxɬ/>wؚr%ǾwKiMH_ۢdF;. ~逛P/bAtjҌ%'lKmn~bEt" &|\O } WY93"Ohzr3fAyb # 4rgPϬx[b+lchdl Ү5N]7FԱ-V"Tvj P#lo 5U#}!Ժgv B *n[5"A |rwc tOvSi#y!Nq̈́Y3%c~5FwA )a 7ֱpr'yեʅCAeK/94$7U֩ )Ե 0^rmdޣtM\Fd8f\4g'WrEF;$"<"WT}oE h$ aԬt\whمggu~EV$'\ ahJ Y.An7fVڙD[Q cFv1ga(>Ǣ$N_MۋWP{mSyU46h h^ezGYцH0ܻM?ynu''wׅ "TanZ^hޝ6mw.  UE[+kv9Vn /2<,B[YC Nb|aL%iBgEZYOPMy`. W@яTD_FN4@ +wP3dcʭzR<,>۱3y>ۉDwcķV HH6*Ag~ 3 -OG ݲo?L;$+/vA!I#{LC[YQ)T'sP=v"UXn(Ԉ\A^:v9%>1HfU?]DE9;T|Q ΫWnk!ε>+oi.##1*c?Ⱥv< fk#(*ޱY7U_Z(] NaYD l>G4-va0Hnti ڎpy,wh p{_kRCni*Al .Kq0!ݚ+f4dyA/]5 7L~MNXJ[CӞV>_`_7'GQdi2pܡ~: Ծ7y3 xi$ղ'qqT/5,3}2IX+N~E.hZ.L9IG`#]ª£ _>Ji@;z)佛qZXՙQqH^TL'wᚈ d_XpDAƐؕ &2R-0_%b]pdT)_ZjUH)pbQ@y@vrouxVaZrqҷtMbHc-6@0~1 vbYȼekOe|xPFuԁ`W'd6Rp} re TFL}Uk˞[5_FwaP/XWK96JW`S& 5Y0`>OX 0l8ŝ܁-jY(컓3 6I)MDPܿޟ6V(,O}77Iѷ&;:^YEvd5-w.+R}h9i#ӱxFdIRΛHE:4a^2ϙ'D fV`),#N0C>rO>XD^g\:@{ qBe*cX@~|g'vUMi >a#Ι F]ƥwe&]F]T}g~I6#y4EMT<Ԭm]ƗPk8V9RΝX-Pp9y@KhHR\ݤ歯l-HhXF9>?lؽ7%ۙںTr%dZnS0zOk.k _EoW%nW^@źcCH oHV\l> ٓX4x_0+-[OIБax(=:+>YXqԁ'xCPױ$d[*E!9|%S:k#$[fuk@ppd#":x 2rjv1;(zF9L2<]OCM v\lo5w2n`xUUWig%lcd 'ޟߔn$Xp_!D^35%j%fh^hS[-rI*y:ˆwޚ-7O/*1c+F׵LSgj[DBťw/І'hd-BoUϽzb4z`gj^bø GSyCK)76$&}Gkf(. r]=HZbU³N^?t՜L@^ Ug&UJ8F+#P@| t%VwשGhZxC T,!AgՊC5>sA4+sFQuɁЋ"(bZXMν!6R8EsgF\>jGca094V*a\9|cUpJ^yMN|:mgZHȅFY(sd.EOxq|aTpZj\PN@G Lf~X+ŸMV3=cOY)ג1j`51]‹<`ۮ,,'Ij5D:𛹕WT8Vy.jԯ;ozGJ^%:`j/7H\X./B*v: gV7=0 KW3s4orA,KC  D?S K^uVQ2ȳ6go1л6qł8 {Iu(n%T)405?{bݻ)l:(Zc[n2!L[ۺzQ7 U+D j)>|)L~Ajӂ@K"62D1.q1DT:uk1V= N4,ϵ!]I CW Lq|Ψ3y e"KĚ5ĭ_exf;K93JJҖ|>RD&jp2[2z$nCubVDqit{1Y&!\v1 Lɪ_FLd65 Ux ?rk lIC1 ~Ȳ`B:%pwt*x/<۠$o4""̂O}YF1)N Zk\>[FjT0a1vAM73;athNgFUROһY 9BG1ucXBȄe=RVKͨ GRo9~+5Tk!q^[M.6_14΁BP S76Ahux]_9ى1$UޣHźFu?GC)zg)q@Mÿ|*^qy+"q,g8,,CCD,LFT&%YKHX"*soN6c>@w?{}F"͆V ZWdvW 1ܗn*/"|EOR)M`ϵw_e9\x@#1'UkSGUX r>oh˄r\>"dԍpx0ݰYӭ. 킡L։Y+@8[ 7_ze`8X9Gl^,U$! ~<&)26yzOo!g8:gϡ҂O M 4w]ak e)DO3wbYJ'u{6N^OrGriC:[^Q_FD9̕Z˔:o]{(N\v,cfƁEuIi}(5G4By^iLT BNп`]З$B?dK^ Tx eOvƿ2e fdixÄOd(cֶ ]ƆշC*Пt[*rdaXAj?~] ]-t0f@j!ۼ *$@ʔU6r+ԫ~z?{(p9!1.NIpI-I~/ 4"ПX-=HZJ'd %ɿFF(m/ǃb}MK.~OVO[b6)^۾}Lfpј{ōjwu$Ü \]V^[@_:OGSzWL"4Fރ @ԯE\JHe (2<]arT', R,\. q ©JPmZXnڇW(S5UEi=4H&hEYd(] G4U|єH0&ծ>>{ĬtU]Qr:#P;Hk9@޶F֟ʨOu g.uYԿ . +8'Ī=zޖfA!D8S7dbV5STJpc>Y  >DSLo,'Ųq/hPT}87OtulnC/O M{P)9[o4 R>cmGb"ODxXO}GE])f2auD3Klm|-c^1Ub^m֡rsu9yr9NF=xbd=~}vpD8`%Bq a$= %;acZaڏ?CG5x`9G_,aeNC΄a1MF"tZH;$k.#c[]?1t@ 9o`Tmbq QOPNb_^ %B07)& Z06a.\=lmu {jF~N1xFsp $qN-Q~= c0~POZbTp Zt V:lDڴWҊeЖ6C'&٣_*=+Xnvm=f{#k)ĀՈYY1- T̿p#>cƎW Z? Y!U>@}~tVly`n"1Myr4Zu(Jn 8TQx߫rm\ӚHuWrU`S%58eڅCh;ໝI MJ/gOK 0QBfκ'Q'99d%cr&y’_|8Ã#F25ALưe{EWƷVfuZ?@rZX,Jv9NiB;Bfv!N1 |30 &z-}+F=aWmJLU-m~ m;u: 2t2Γ4m' aSfp-[-N~87ꖱѩ? t0b@x1)Ӌb@ :jؿ7MϪ^.*@xi$A %Z.L <#7>+wFN?W .EEr-{X|= A zw12JW7C{K2wQь+OqjXc E};CB)E3B\ևgqI8/4x>Μ1 ej7O|`u 2EĦ`1^o'5{rtF_ዒOsxZbFtVLndPXՅ:leek0g9Cvs15I<&j _ Q &b}ه=}J+(%q}7焼!9 4gty129 bHu}ߖ^J]HƲM[iϜ50)BOT Z YP)zloiWSFŻJn߾QRg/Y?4vsn@0A{ڧLAMKC#@0[Z695 zдrD>$&C<yoZ 5^3 |oYQšsCk9jA]B4*WX-B]uU+*E_A</+] )6L@-Vo2o\o;_DQxMu9."݀sEӣW`]uuXy*帺VL"҉S$la|֩[(S@\Yf׫ąv?l0wFzDӆ3Z甕%(Af5l]w3O|eLoU[1owCTM-c@Gpn)xkrd+ NsA+m50Uɼ-WpKs4]EaWGr]fB*ܶ[? /O."Hv~Hl>/}&}:^Z?X0ˍX&eԾoTC=}ѥÆa.Q'L\k}FQʞbٲh'7"(2aj8u< ium?r|\$IB|ȷRn;WcAW͇UGEH@!M>eo^LG$49*LS='Hf>"nxSvp쉋庇ȫkN,nڿ&j*-xQ9YISRk@x衼ZΏbFxA--)OxI_ ̋`3J= "xۏ `81P#(g|jj,(|eE0?G|ޒ>nPYEzn:`ȷz'3tх?W5\8l#cv,=$;t"O kP嶁ƺ*A0=ij@^/͑emd;Q~ahxmôP*q0tLn'__^ vk VƱV%QE_UB'1 *nTdEJqd\jްŠ:>N:Vʽq?H%v6{+B+D,3$%mOjLR̲,m6Sζd>?k|r-}m)wuB> ,·!4.ݮ%F#bY Ecw$J(3/=oEtm" .m>۸pqDy Q9d#p'|ʸsnC)bsP >BO .^D0e4]rD@ c\Ϸg5fY"P3gE 疻?`)29LߛaevkGǃzրEx2FZtL+P{]]ʈ=bi|Oq/s>tUvsb:G($ Hngir>}6wnМ]Rb2(6]*`qL"3Iы'D1YP*Ց!nd}Ixn0ҟF" ;j$Z{5x@ݭ:+,[|K6hH'3YtaAp,~=u#NQ=5cniDw.ЬZ*⬃"jǑ FG6?8~BAMkGGY 7QSR \дM;? C'5 ^e:U~ĮLe3q9 _86"޵kҫBf܋S{zc!:$SgҤԮ/i*k cZ^rBOP"~^-oZV=>;.\9yhu|r 2 >aώSm?#,bvd6ȖR@p(- >󻲞BN{ϜSE6przb]yjZX4.˛jQdfrE$'6'BW8pPQ먊}ӻWnFA k*7[zj2z *Np ;vK!ug⡝2yg#k~Fb)Hyt8g]mapP#X;ɔhgAɷ58K9Z}'jM_~Fa#9@Qi)ȻP>2kͰB2h;hod|DWk#htYa⓾mp\)D*Ж~5XVX^: TLk7Z{  j/AMp5Ŗ NêƉ-jY;:JYs#ĒeND*P ʎr%$1KiG̚`6&%Pw@M,f oW'2Q~#9}R).ckgWKϼgĭH84И0كAg81FjʴA/IjQ+9;$c s,U%a5~Nd h` ["VvnkUTTbc"QNGn h+Pa,w( l&;+_꜠(BfFYʥ$_KvMu[{eϞZv%ځ0t݅,Ww V9ma)]ߊ>ǝXJT$/UIVIň=Э@83Bb;l9T4ƦlΦYf$̈uZ=Ox"^\Cv_@>@oBnTĥϋ;7kԟxymb V\ĊLe,D\-eYh\ i<%nbu{10"ZxDӹ%pkJJacjJe%.Z;e9Mmn݆P@-p6 ;F#6S"Bclӂ]7 #fCږ!Q#1dv89*U*"Ti/$d˕yU˥Ʈ+QxIO)+-kc;k/#Lb`h7hƝeVQK©!%aQ+.lE*82qW>`OMMMJͦXgj&kAMtNT$(c6A4.%D1;K4 ʀ?Zo0GrѧXɄQ'($ QK\@z!JadI^ Ge$`ZH5pAnKCQ@"?x^?a/_qwӯRKv\ ļ*ŚU^i<5%xX|@KH4,@B%G?Y<:&z*zMt;=~&b[KWˎS#sSfR1VŌS96,QQ>[ {N˪ w>t+LMG~5ةx8(f yPFĥS)j 2KZW,.VO]ec_$SjtUnTGIw Ó5^X}@3_yrA{|JhBre8zвXZ[ĕ7utE!kRf)?|ܦȧXXiZ0mljk4@IWҡ ^H{S3mٵmlT=3>"b_z77,lk_PRIAc v\E FvN9H:摚Y\零k'R{gI +)1 Ȋm c zl6zD٤PE9߳rC7{!=MBH#,zRj%dz9sYv-Ý!Zy])tf8͖@36kC֥G'SLmݧ{FW8F5|xXr@C%vb_x9yKg1DEZE5c< \#F>]_; RvxVS؟~s_ m5a&sP=~cMl: Ī6UKNm05}.bo͞y%zm,v3 mrMz?ȶmKM񿊜AxQ] Aȴe*31i65eGF  Q]]W@ǘ;R,nS!tAnΩ .U34?㊭PSb$&D^049dX ج~'AmyDE\\/(BHX3/ p~WeuJ* hW%v2Kz9ƼĬ!FՁb>a q쿑Wl w1Q2*3bm ` oԫVPik{'HiD*?>hu6.3kzKVFT5iXdO"Vg_ߵ-XdE?#uX+z*lvwqf@>i᭕^\x w pZ6|'MïG'h}=kdJ=>qBA2drwo8{}&X\$ nޔ5 :{"TSNff<,/O}Tp"d9frm@kKw.yB6(zwj:E!_y1@>"UP٣+5,@Pj7#fE8ȄjF)4'4h':X&J.,cR4H#א,U$~y]cEm Fs/?[-OVz-}껍6 1b!чM6sِxmV^NO{i`^X;м0"7PAJ[~IGPT:g 0揸*ca+X/;Gb(Ow-BJV{-{~8EOFK͢Y8=ɟ@˽5wSypOY},?Ai-TNحMA)4zŭGg*es/Wl~t4[la[TRl[7N gVlbdF\0mߘSֹ5-kH_"Gw&XďkeE񦃞_Ri4`@/D4I;{Kڬ/ "!lLgV- t+<&?صq|]HCtF2X@Fmio;cH]ִ_6L2֊¾]ϑrC B=IJ!,ʮэ2`/diK0P-<7'v㿃ڟ&P-JDI.5 ` 6]aőll-4JANFz:+\]=8hN?B-h1s^Ûƪ4%ʔ5}sxWU8;9׊8+.jlRBU:kRl"s̉J+{ {{l\ƴr_W(v>MP㖃ȬkR2WDp̕"5 J `M<0D~Ww<tEX{awc4 _몕a"+{4:;Ee)}*fv-u"T%%?GSr HZ]0};(΀G>2YTL_lJ2YT4X-jFU$'P<"VghrfKM] 딗,q!"Y0Ǣ(&DDxb{bALŜdRɴtϭu%?mX7u(s O&8pP7k!O/WùⅤe9ND,|Z B=Ox]N !G~}%D"^H%G!:kV\sZLؓdUQ^%MhT%zPIlvUɥ4*- ̹hM9vC E4&AhA^e`b5\*fٷ^*>\~-(sZ\O2ʒ;F=#JF聞 =>a(8 ; $ir'2>*[E|@ApqXp `ܛǀtrj= 3`pN=`lN'65*C~ ToXvVg֎ч-1vBiwO ʚl}}'pJ88ĹәN(-8U[&H\#PHxAݛ 7w#Ԯ۬uOT4w6hO~Tv ?-E0q͊zx\ k #c;]CP\֭^_fq! OVuPܕ> \qsA<֕[R[\יoM5}/c#h;m?!*!>z/ U*Vk w1DŽFCk,s#D"e.4BRͿ,өrVFѬ"KuəyLmw/@{Ĩ%FCCa Oo_H-!Abyp13\cH0w}P+]T=EFPv iX^̜mj4'9[0i- xTݔ\iVݓD >|-7UXllp:Wd$ma;ee1L)_\;D'1@HA~ m0'#Rq):3trxb;Xte%3@!0#fwYRC٦&!e _4,؊o ȌuT #ޅыY?Wc4۽FW~su+g[5(:miao7]4z3$9WX&ϙJ(nȄ7huʢ}`-D+KZ)bI}n4x^eAwEĵH*9dNs7*k.uA5UrW:˚A\ IJPN ګo{ST5_4^%i,YWFfֲ{kUl ( ȅnR'3hZ_ ^XLA5Hu[}k $(d䩁Α IJVf$IA ٝ~:FfZ={;ʍkNCDfZJQ܏N gZ4PpNAKC#@0D/rn%$nHܯJ&Qi-r}ZyRH6, H碖^=T1c-wr/!17EGb~Fh`v/y>gI^+s^gRĔMƓ?=kig r*|/gNX; X!z0?M, [?$Ǹ1b=zBI9YZ+ᰙA|c%[Ti!rk=g%;Hn.:N^N6\m~f1aܚBtu[ޏa;M[us=M_gt%$tW<5&wU9TW\}=M^DL&ayt906ݡiW%iH'l5oo!ON9վ2cECUzdl"K9eBInǧvM6`ʴ fE !'{- ˋ-5/pHfgy~2b$r\dhX ;]dNxGl W[kwȃN[,Ssq `i'+?@ꀜ\voFZūfS{!<} ;\}` C'*Qyi_򬕁3 Is:1^)u0SЀлse5#/M9/䰇QH:dsx2\I,h3^?Lv$2;vD2;\^@)XPW@ vopyp1k@KM9 cz jAxֹ{cI+]B  H\1(29]N!"M^'m˾5]E("1pw!vXsJ[,V W}l/|3Rd7NF7G'%nTTWv!gB$C2 I;ѯ-U[-Snё =8Y[9R.۔\gT_@X=ӎ>[mWF^Ep$?ੰ[=)6A:i-൜Z |1StMF"7 g: xPaɮ3(֯׮-hptl_s~):.D#7my2<tD^66șu{U < \uw!׌t}Y8.MdE\Iw>]-ZS,ퟃXjҍJk13&roQ2pD:_qux.JiS'=6}=i$Ųʪg,>@ܒlA{Kٿ΂; U9xS.VlwW1p@Nj&rPD ދnoDx7H$g9bۙR2 {jie~qϯ|{(=chaU?CD ͐]b*eyHPSYvA5&WT6m\L™W]Yg"67>"@ =d}EVXlM( +xTcqN2d|cQǨB^./[X u{/WC0B"zbGi z^[P亜V0]m5p_#gQp6ª3LHu 䰗6v'k3hV} Ut5s oOAw^ۜ и48"uT*B<+N$}@X3$![P`y]f(M=u@17bUrmhP R eF M $~Қ"N$\#;l&Nu*UWe~r9%&: kS~}\7b2Zv =_zhQ>Xbe'~es7T{kL[;[?ش? X"F¤{xpąI6!(VJqasX`?r܅XB-~uqF l0^!w^^_q`DQ{Ҭ32s)c % #'$ݭPoS_G{X=n)H> 6L6zPgȆatмza; n r,h{0|c?])iu.AnX M)9~^?7I]s,9r#"??$ȵ^B(5DЦ[4 /'#kAVNtFPUqM,)6*Yb6c|T/IFzw)\-v 2N$jL}h$ʓU&h ՙoN9ԫR* \Ra.k`F|.VӍx.^.lMxU]T{EDcA@P<6HS%Sc%ZA#h`a pL rۙ~Fl-xGVv f03Ig%KOI:hw H\-Se{zϘ,9,$1Hw2zUԪjcYykUI*us1gQd*T؉jNU@#߸✁~R;&ѿoH&I@8b*8Нt\޸ն*vYd%miZ*y%ȕuQH@42uUYJLVX]M{~ xjDxQ LB[f&: rQLc3wVHY%]9 jh#$kEILAKC#@0Kߎv{]f =zzZz%'޶yRq^D9!| }$g#P玭w¨1NYd"IŃ sNE2 %u'l~HH-Ux6LQGTfȆ&sUܽ zUƙKAXEț?EOG?M_)H`ǧcGy up^.O_ Eke(V" ;uHвj#=(`F"*fpIc ܇.w'h5#ϡ;Odagc\i&EE$84OB~Aا]]U%iۀIR1wqO_^{G<ƿOF; *^:k+T6w'I0> nb%up^փyd1Mgx`l`J#L7$h!|ΑB+ٰǻ$oǡ K]GS{۹#%dSnVRnҵ_,q9GuK I-޿q`iOY-65A*>m A._p7DR3SQƄZA9R>6)hF?dN$\8! 8c \ LJq&^k_28KD|jl\H<񸇂P?7T&ǜZb6h6 q :(8:Ա~)Y^E8|UQHZܪcavVf΅J)D 36ΰNxaf?y)kp|;I#S4 h4^x8ptwYU84 |FS)CLN SsndxwbLy-涫) y\j*fLKcXuE,Ody:ѝ!F@Q:no8Y!%^^ԚڸY$6' %BsvNYAB !֢fҮ{H(ʚ5o!a( \raoFPn4CV@./S5! n1i:"uxS\*&n)]]\"6Z19,Fkoy`R̓n҇CY1u؁8@y9W@<xT GKz6(LL|Q%>3  +pN+9d7Y[J^;ĒXƺvR]m;bIk| Y~7E]a. X-ghN5l L;oa0E:>N2{0wjXiA} Vn}ږdߺGOh<L+ ,zI?A]([fW\NUޝm/!J9ۣ)GoԓpwMtpMoUE=0#z[ZpCH | rcH(z4bUd²˙sʨQ=%B&Py-|nOU?^y<˔rd)hQaV otMGR {;RKi23;{a( h}Ֆ6k †P\"k&3E#wUd6f[BuE&T2Yw 3X;~P75ݿYADn&~: B}exz/(|\eK b9k+ cTI 8 VCSaYʩEvDy ' XGP<7&*I7 Ǟq?꾅™[@AH@AqiͶIDLH>d~\ i%jHIX~߶,Dt]ot3vHtYTRRu{iƳ9;7[5x0~f-mbc/eJ6b]w3r[c GȷTPL;8 ';4{]k؎ [BW*[cmtM1'2nNjSV~G <(-PC92\Lpf 5t2qڮo+)0O>zX[|s&fk?>YA&W݇r$w!0š |d\0*Dt~B~!Hlg庡qdҿژ"mI8S+cJUn1KY*X~@(>4JV_|Ή10s.q@6Lcy,/dhN (%xaD8? ZS'8WAj5 EO{iSRWl p",oVArOM> {Ԇ\m˰R/7|^ҡj0-Ge1*^ *3R&9T̋}tyNkmlA $,:%,wi?avNd:2Sqkֱ+t|m0"ﴊF՛'y eL|T}&B|Ȃ ͪmbYcT`)Pf9ZwY> 3 BGȦ(pט$ps,5ߐa2(xx;(݉n@2!Sv, ]O ֳ~;Qۇ1=k5).w)zMMNpl+evk3 i Y(6Wg,(:,p?X)YC;T!FQE0Mt|IY 3ح^,+&?FvgKQUQv| ӏZDEќe^!œkbp}SbUv л1 f|0UZ |B$qU}HP <0#X#ULa!K0fx]@K gRgK翐'5)̈El^|ҧm a)uE+;N57 l~\U/3SO4cd (0C (f~ }hs2-[?E>\(CCy*|4cԲk eΡT%!>,Z$^bg77},ǎE]:<D{38@waDq ϰ**x`3a{{;B䎣G+ 5PsoetqRTM޶!,94H2JܮVjJx$)5MUt3 Z>>A@lr%a*t'X-'H"52nb$O%Z::3=|oUtjMhY 5!L|UIٚ'afRQ2D4)^5zW,m3sa`(1KEO(~?*σ#{:7v^]Å.szQVwl6.7˥+ץgC-\9;1f[z.[^؈8P(bAI&S{R7;SHqOsfUb7&8U~]wy쁃~8?W4A.XK ߩ'kQ%XY/ޓ\c{ܨ@y]:GblOվ fѨPjO^%83Mh^ Z|iO8ET`yƖ\vd Mo !bg#{{1;8hnyKρ$ieXޓYj8e aH옙UeY8ZS! K!.𕟤H*VF{_s'$h1K,S] S`Uv8:lS>`ilвPRZy{|W[~rǢBb)1Kߞ^&0 Aꅰ%9]R)@0%+ )L.?˧@e80s<~-tՀwE yp XOhw郶SMO׺W6`&]yȪP*P3  ivwvX!G[K1.epCkĵ]iЫYޣZ/KqrIh mK)[]JI-RWvđ!1ͩ%cbdJ&91F9,:b{z$zt? IsjHoS<( X0Ä 2NR 'yl-%+p/QE#,2v$q̿߈ʪS4[ņY-TВ8) }(MG ;JSժ~Ks\&7^{{@-A5}1#B48jcor:? [~[A5L zSM2o1>g$kٺ lrvJ. b k_ZcVc| 9m9Npt{ʤzJDu7fp%JYIDC;8d/s/6vMz 1 }^i˘U:VC" po ʒo˧z(rhƈݮBL%\Qto${” U #e+.Φ{uմR2X }hc{J@Ӫ>Z -Li^μOriGs(ύzxbeGLR0ҝw9h~[|]$a`cN?ݞMf|Zc_#kʽA F*B#E=a3&H&; K5"l:"HD)T<( N*E{c:H!,4><*T/';lDfsI΍Y#|y9\TeIS3WWlSb3ҧ[$?ۓ-G>4*|11jQ]{ϱ@7>T"9s SkS{TlCJt'"n vwovJJIשwmP  Cb2M kM;GYڻψD 8gcNx,u Ãq9Ts =^F|Y 4jRŌ {B u'ӫi ,Y-ISiؕ8fAǏX? {ɜ}KW]Э^R`-Q[JvV=y[H4 P;x4yxi1/A|H*eyX*]|p)ԞuV_t?uZAؿ# &Fu)vz}ƷNbd$G:b>՜]&kfΌw.Zbkc&ĸ9ݞHX <@_ޒj~W]̭szѨpC9mݢZQvf'VX͜Qkۆn< =D5T:.P̺bm!1%XR&]U:gouMafD3: ])\~#BYձ2wqbP,Q\P0B˺G Imu9#x o16Z2P-SޭĉjUYh ߔD/&r6_'v9 6Kp7((u D&i٥*:djLv6y֚+ yaum>,ppvm`BR.:!j*d䄲д¦t+U@ 1K#vX"1~{.6`Skr뮿O'OrވmmyXr/ANsܩ*mrcu>&.b>!a&%8.ԠFS% UwBN,n~r n~}O~ǑZrW I׏r!(-YkZV-#L764 Q]6 Qy,jQR`zr<GЧZ{(-tYԳEd6*F&5ģNXs~tQjU3E@}U0Lccop3Gl@t B醴OP/}tıoVÝ28`%vgFO.w?+Q,MŲz;K>Rz=,0|s:+0zP1W;dc_UЖ̧b2jd^b߷wAlz܁  :~rN(%අ:p[|eUU]=,?}tBם뽦~8YtlIgZ$.@`3uZs" m 終X74(# Ҩ:ҏ!Ug=3&9[忩}P X#IR-ͤcIZO}ܫwiz=e'$d.OƖrźV0$Kì;6o6Rid!z1ۗČ!ɤ+bt-AjX xDX+.74IX } cH9p +L{H6ȅk,WiP;MWDC QvSfې}Ya.#љ:ŐT71.IxNHksA!Ȫ5t_3G>C'HZƎM5R'u00ފqTz#ф3BkGYu) \Y[]: ƺx:j5eCpN31].P ۿr:5C϶^O hJk'W&x9$,7]MEܿ|Fۻ<)+Z#l#[&x~C< fby;XWIt3,wⅩ '06 0>R![:XQILzDS;{c?R'y–DV}׬ Fa+0Y/*w8RK=z? eYf Q6 نi] I[SE7U#dkWa1}ZȐe-SnJW3TW#?蜴WwG݇==5ާn'w[vYW|iXTdս n).0$Oq/7"l4 P<9?\'ݸQݧҕ~A0QDr5K*ml FB^wTZ'V=Siq?@9z m>ېɒ6ܿ&]5ubML!,/ &>O)2-a790o4Ij5q>`% r EZ(32+*7ӳ6Q ` Q|\Pd.vH|* yrɍWG*gBL)]KNNNS6(12p̰E( 萃ΒN5d'̸A .u~nFkˠ@"t4@' ډ9BvѤB@Uvi"Y {wk `ƟO].zN̗)86UKw5wсIB' BG;m~PrKNL:*,"H0{ߞq@lZ)0<:ț{Sohߖj,g͠[nޏ;N1 0Jt!|puw9W@CHyQ,0Up>׭!:.ݍ9&:Or[~wÜEU9Ky0-w3ۉo >ߦd=+U)$@KږFk e|tB\&|Q01D, ,9TB C1ݹ㖵U)mWKV@Mh)hK}ZhEXgNIy N $! hei\7PNq(A**dx]% iIDiC訾sd.לٜd{ȼ oS]%ӢV1YZsOpAE<1HBe5r0eXEÍKcAoq^~gtJ4]dĞְ;yqzB!Ʋ,>Ncp6']K xT9e G P%#hhL?(ijz9XI?GU,$[ͤyjAB8S\C"*A|l)we툳&WMcjh%3@]szѺu,~π p1B>&nt} %B.Ow^# ꎘ?qFUrMPz/'ZմÅ=z#3ġh|_ G?/γ /y'A\};;ׇ VV{GwAϤw7f-3ew}VQ#.wYGQbO,Rob\@D:wƚ4Ѯ𼠏[߭x>r&dk'XzA$~#}U}HYPR aGne<6. .P!! jya;O3"naPpS-bǿe5H^O3t i$[BuwƠ"81-2 >N=7P (Gbu埥f;"B%r/8}00y;!(v@wVl 7un߈w4nTULMъ,:>*lܘL&ŭ6o9Fف(I@n{uܿԏ ,@mt !XjSާL>^1WH]iP(zeF0ցU fp&oRbA{yD,vW;c6/lW1(_`63V֯lz!9f9"1쉆^5]¢s/=:j 4HcYak׌iQu%כ06Y/Ӹť]`hh* su%x:om_0Ovsgc/HѢ?dMZgx:eP10Ra,GWwPgZb8̣Rn"?.u%ƶ=2wڡۿ%##S&Db bF3itDPOSsY CN"l3*.e2-@x@#Kq.~G1u֜ 눎tqn.yFg&>}z2v\Ϩ6|}6ÁO ;B,M]JՖ-C+=b6O zt0- 9Cf$a'0̹_ it1eNa`D23{T7(X dk&S Տv䂎Atr bT$6ءc;1Md|oy亁OIi~8{6$GE һ3[B()t\(00vR]Cϗr(lj'.S0v < ~:pOB1Y+YQ1~R0lpo^1ZE—JeqƩ&  | Qw..ŀ13ւKf!0M@LԜ )whpG4Ua) 쐬a0|ө_Ma,}`7awܠۧz屴"CLn[ ױ)Qqo׶zݭd/&PIDQӥ;& 1~RO1֙T>mCUУBRֿ@B&YnY+R2נhUFwR3Mz¶kJSc>5Dxډ6C_~DBC5C> ]VA>AQdYRfu+}D@ʔ9$(e eøGk @Yɒ8: ~ *iv3JfwF?>T)Z>ptS^mB1Ȍxrv_ENrlWHÅillCΊ9MsBd۳As֚YJ4Zm98 a# ,V8ksnԥ9XT{U|p H)̨d4J_FBG|IS}ȯA1a*P0l匘 đ;''-X՟B/!+DR7>VsIp8"2Vg?X$ bzA)M#ނ:{b:v(/>{u&4laha7 B1 ~}zTnz-w7HȠӻ׍etfrq= 69/ k q}Dc }/fe$ʼn̏:1^*`©1:U&}3w*k0eb y\zkU TfuK0@8j~j[kM})Q%V ~?s [8,dAOLpsɂA.=~%.pHL~Xj5a[\~T[¢K:N#‡';8U`+DGfdׁ萎8S qᥤ`ԅgE|O)rseC;ƕ69훞yV,`<N?%vߩg׊n`\UcWxa|R/.MTK4|T!øV+ٞ%\͵+Ў4Η" S83(vdW;~9i Z8jݩIFD6 ]8󜵡6|O#o5ibgs| j/1v/StpCőz'UC.XǟvԫF 9qDh`'Ⱥr chdT)=Z;U ȗz>hf=*R.fb2</1>I0,dGP:iaMd.T@9Ҙ:hd:SpT,AiO_7NV$l߼,"[2أUmh-9 ':+53P_f [e|p)1usb7s:2_rvAbfʆ_ ' +H.KcNp3]P`|'u5!Kӡ#gr>la,SS {lLd,H-5398V| Sy )ӉF:gZa&bE ueŭU;e!QOUiX2)\r3Cqh}dڲf,.2pj9֑`@*$ߏIե: aePR3|gN)z,Bic93h*lE {7]*6NG:=~4ЁcX sYhڦB6p @B2eodeȊ eT1>㕐=Zb)0msjחrkR–(M:zW|&O@BBۨi)#|P*T8XeUܯSƪ!K^BldtU=?zZ7Be&2Y.,t@ܿm\ ܀0l-fZC!t&yb^k*1mI-=܆>u#fh}SZ9x)nT I >,TV4ݥH=g1ԒBo2FufllPW ɶ`4:bU &&v=iu@ۡGnC셲-pUNj{+|;̕Zs9aoW]8Wh25$ L|2 Tk„yIx -q!@P t7)5b`hSOݮlGKeȈk,:%Ll}އ <9ӹIk*DÇ! 6tzB7H6?oKԗf4-JEq"^Y[8- LE%"kT^;_ q?.?0yxl.0Wld߀鵌cz>z5'?m8'l,JD;yF8i3fba~,vAf<,J8;^kJgQA@5sxL$ʷk #gp`{bj __q NU=P&k9/מA2W}d4t&:O}ɽ, 9m4"٢~|p0TtKEZ#?r ;-խ wb;:0g\>H,E>c+˻+0UMR.b"N}zb£E+>- )RH"&6Ř(kA94ui ǂu@XIV!\;bY%&" +(kd /HE'qGV5 ̣pFfjIb.(Æm<^0ΌO9[\-o& 1dj8n{dRBz^^R}Ӎ ~-`|9a77POH/[\)6 LU]]{ Wy~&zWV7K h./mH0%CV裊V=PT58l6G$y+A%F_PI|zp'_ZE.G3g=YYxl/FC]3a@MY7Wu#l59ݖp bZMs/"4Xg59G&Հƈ5E\ɗ^9:5QI43F{kZ1+P7},EWk^Fx)PZ7}Q^ĥ6!SV-QrϞD d_+M"D=V>g湻l+'# ӢzI(`eq/-M(KB4( -ĜWGeW`ސ'^gf7mVP<϶ U񉢛AГcs꒚=J* jBPpq5i Y!;҇n~CDQo3]w9jY?CFet|K?NAOWi*Kd< 7:ȉ#X–V規d 5|hjtlgL70i9zȾs'<%BxZ@}_Ew i: ÏU6Rmw:bǨE9ZOrtF +T#3S dWdvQ ؃jx+<O]{k=O kN2e9!a3`+D?1@ !Sz<=a=g\mzW]5_ďwyTޯĭvW TkxS:p JtC_k!ڕyuk_"EIZղk|USV~S- (irt0eTj|^\q mZpB?HF"Vڶp-^AƁ V]J7JSNEpa.Sh}NZgU5 Qxu)#3/m7Pz yfnt#&̄tK@o,Z6aU|߸&,Dpm=,2Uq٭2Cw_C,Z{~ 2v>^x,ίDxj"}6Ty 4d(trG9EUC&g?Y4MXՓm,'Q_(,>P-޸ M _Ū醵VJ!CvzsCK3v<לGdk\:z~q'_0Fλ䗺=n+ssWv۠zXd WRps7x7ڌ nL,{}M4@\}D= o5ўwD쨝痷_1ZZ*Ik4]㣲e 1h2:K&jc2e D7zXFY,Q?m_@597-)zcDJqqGUY< rtLURI~HN?]I ;qNF H3aR/.S{]7?6. PR \y W_RMyƐV.t@6I_iOVJE{F7 2n_Jb{BV~>ҨAJGʷTdL)i=NQp]G;Tcŵ1uV㤖>zg7Rs}vyubt|j5' $ ΅U壋4,o3Ʀ?1m-i:2* 9QKݟeVS>i:;d{4*Zj,i'xb:u6jJ~q[;#hBfZ >d?Rhy#”6-?m$Q껮ǿqc;^UKQʹf&~*s%R.%+n_hG3ͱ{$fQK;<ˆܡ!yJ5jVܾGݣ '(Q&I/888g]ϻ ln% ;R?9C,XRRӔ7vԣ 3JN//@&Wšz-94,-أ4HV<qJ>,ɍ3G9=C+53^2+X/9L,0wTK|'ڷ2!1WgΒO՚SD|3.91G=Ǟ~w2]Jt//~k4 ,v$o`qH*Ε3q!\% DLjeDkȗ(ŃOUVl^cH;? X~n[ly5,3bh(2mjDeOf~җjG{x_YZD.Q,StBNв @PtCjQ;Pȶ}8-i%2ҏ$h  /&C jC7DL pN):ѢsaXwdK|9 #o$7KOχUnMqjhcK8$=UVz ҠԤj%^7E}` lBل={Z~`GnY_l/Gc:Z4ErF~ It%_"f|d(!\9`Pu8Dg(~elq%r650[lN W[.Q`{e(3Zrz,ġI!9q+WJY :iMQXoX3B\#g6k.Sh.2?p>"HH+h}c?śmG`GZ0]NC8rlk>drMB{]B :f;#,܌7l_ mԏjsĽWq*GȾ?=8VdNV4߸5^*V4%`:yjiUZtRx;Dh:hX=RHd(նQz{ ClF~D\g󎧝=.;WNhLRXPi;Qs,z5άD9ˋ_UT?qK|h|mŤdAܽqF U <)I˖,m4Qz2w,}.M ͓ZUУ,Z5oBܞ*QʂUJIMX.b@/8YNҼl?r~⦮4"}UV jݡn^?{K^DS ݌'oHؽEg2d穨4oR {/IǨ'+,G[==')Ima ų@QRW" +Icjd;Dk0"2 dQ:0yN Th]_Ö7fů1U\t*6cESu)M1=oFV%^Vw ]֙Jc:Ck"8Փ}PŮ[>rKƎb %tE`.sRlm&ˣ}ꈖn 8jYMő7ro$4?݁*m<FKǦ.a#Bڕ=ro dS&IY&KS%c H^p[ MOh[JЪ;;1q#]M K uՀ -B%N|Oa8eX,ۆo@A^5zFN |Apc,w(-+σ-?[!vw/o3 '}8<0E?;]ji~հݿ3:Q(J{EKlr="?|*\.w:_8J\+/xz=PjG(7mZWg g(X:e֣J`21o؂ոW 9ڠ2OU* w 5[jmv56ox(eq&Y.:+C'Kh`'χt0=I_ӖHkxTu%TUTmzь"IޝH YWP}02֩l])GT6 3Hfl #/ yY̮#8H6߭Hpz&ؕʲ#nF`oF@7ժldѲT] $ wwM~ns\YZ?Vy؞ک@8W4c]RhLջRe]q y!w;m җ覸#d ^?B GHD ܁ndcuٖcJjS=5'9 :ɏL:PJsM k[_A{v;!쨞5˓Ӫxf!pN c3ؤYRGZ}ak/"zUHA1cI0$Gih橦3Fpc\. ;A7J<5@*9dU IoU(@o>fTR(**Sk&9ЧcV*{r" ڴ)#2UIM2-1Ll$ٔ @: Q .#Teae!I 2Ͻ<7dD#(WFꫝ1qdd V2a+hK1$RD|C qwknġ8Ŕ0SPz(_,s3슭 &pAKBZ!?$cxI?gVǿ&7Y{aDaW\vۧVFH/<#kɉދpO,* V`@^%6FuO?農䅿o-IetYzWtRdR4#-VHc5s ;33xucAN[|14I$#8VjY8 P"0vRj;rO^ :Q_&Wq8{-.9Sȅ"dq2_N\b`kkQFێWfRrQ["!d+cw? -ԲjȜ;Kw()FOC;ut%h$l'&<1X.]U [fXF pV5'd%2&X cO67ZLEQ^vnm"dُUJ:#i&9ڄ$; A觮*P'4 GG]w[ؑ]qJ,\m嵕g" *_&KQFxZa& )0禟˱_HU;9) zďoU lHڿ4%*Yeeﷆ<^*-2k{KÛ4_]w&)6!y[ K)A:-VO|`|hqٕ=Tp :#H4o-}Z@hS" HJf^MDUHWrd3%=M%]`6 1,xt%a;C+?`{M֠&B8`}%j*|s;F(a3 JpKY"9җFхߥ{pN%-K͆:AD5hc: ڦ،IB82i Fd"wͥ3d !ՕfB8x[dC&&Ut)"/KΨEs%6@"T1(u̴>ǽ,jљTC#sr.\l0)A~0U^kM?1Hw%BA],G'F{>WsҦx3DA< 3O{38Rp _YC&dLIoDu|csݽg_*I+nP SɗFF 9]}hz'ϏcxTZ>傖qhHݸUTi dx*օM Zꄛ۷^# 7:bж"R8vvRw@';9Hınw)*ā4 ㅗGs2,? U-* I:;m'?V9hꏰ/J g"E>˂ ֲcqűE_I#'wnJoVqH~䰒b ģ8j%s>79 \KhHm>8eͭg`vqL2P0V r:`tсXҐ$. FH$2OҒQq6sy`*t6z=Xؼϐ+uRH#{3 W׻ 7M >Հ+0,)!>V>a:eֆ7ʂ޵918EMuj FfRAxkSS zY1XDY3۳x4͓HDTC GdC+m<@5/gJHb,gs$wwUO|</?(jw 鞌iQ0SD5*5%Mz9i.TB/J12"DN+y * w &N j./$Xceԅ\Ρ`x&ǥL?cQ}q#"L:cT"ִo(⠣P\rS"63by%Uᇋ*3:+nE@](6T3qɱ!9veTir?T gǝXݓ&H:衕C!"IKB'{b k8Yvٲ{ocQ x OıVw/3 8i8|9WhzsX9VOx$pw|ld5, %?G{6"WBp I|Х"8[RH<g:V<)Ry$iX2é7>8 -/N^f-^Δ˫\;S+6=o*y~EuyT&$_&4P:\`Y߯::i?<|]3vMnM Dkb MQ5 oqDâ7U]MQڑdЃ8$H7;"#2Z\􌄃,(!f9S94%5(qyWVFֺ]-51㣛8߷s+/FXlY7vXͫ.9P{ !J67zR&^ {DkwO8Yj I'-F2e](0o#Q,5ߋmO{?!+b߮ڮ-emqdܨaA:#}[ˡMc'ߵB˅YnJ0xΓ@d4c#N _8|nB #zY"P͂4()IkAB>X>&WG'cL낮t(c9I3>&=azQː mJ9#+Z{'ʳl{8?T!x/p!oXj) jƅNXX?{isWbZ#fsWGLF9)"`8M|_e8;@\4󗊐8>38>-.Я$cQ?-PaFm_U[HS朴'^+`; p&G'M+pqU/JWK\W8-` q2A[ AȏfDc,A-6=>#w ې #"D /V~.=w-sjBkEfIJ\y4aRĶ뜳^:V)CcGP7jЖgdJ?0v.#-ghܷ3_t}VXpI\qHtGY_<< ? BL(_&?y<^#Sύ<$8=r;Z{Y_0pa#zqqgxh}zҠ>JZXsnu(j/I|JaXtҿG[dLؚw+3颢C-T[PؼD%e.Ԭ[C3scji?7 ulx^zbAN QjRId_ot1dmQwAЀG}"INtKXǔ=T5#Y=l,S#o~\?m(d!ڞhчXo?:~-F8cͲ2vBr @,ltR{]ﳞ?= 'WՏS=hs!E3xkߋ11!w2`'W]v ]NE-~@Nt%:%,mMw~(WWHs0Ð:Kb;6R"F)Q($A=yFc[c(T`,<4Tv >q5ݡ -H(V<*5TBwU3 &{3c -FMNa-oJ -70(ʶ>}VtpSi-5' Y#zAÇt@q%Cj:0_;?~y kG4Wo/T0یRBw`9E\l^Nir/8ௗ {QF" ^r!diXl渘:`T+hCމL 5i5R1c|;. FPnYi3]vA:L,Ɖ,,au,pCU Cf3id;(ۦlk#*46b:75-m]8B{i_Д|e4.":&U bw/щ{TrFRܘ:LHv-/d̐dPΡQ}&#сp* =Kԕh' ;DF3[RҞw=hj!fAT2tJ0QX|}ДIB*x|QE K;i)p7ɪ \&#v3|+[wu[H w^JavPj>phlv- ."soo\woqh$&?W*9, v=9(9DRTΩ/||^JŒv Z5iA#$+mFb~Rp1%[eñgbdL5[LW>m`v) t<8K[髮ʊds4ځFXAgLP n2J_8#@|_A)UPXf+ A5-3޸'gD0JA4+c B<˙^g2:^x2g 1 ;2pRAXKCP:Mq<'y]4Xo3oRaUz A6l]`zEL* eC1ٕҮ@s" f]D=%6xg cA+Da^2J4eZ H[I}Dw_ZE!D}OÎ-c%e^l"Fʗ]M&:{mI V-3Va4%l`+i7; rm+ͪ" ok\Kp@GJoL"Wc U,1c[@~L~ v{3\jgJݔclz\8ۆprt(.:° \M؍k^(ؗOORG4*Uam A!W4SKEB M|s-gѡĖ9Y|@($L-41ms=¢?0⓳ZRԊk_O9”Ւ[O}^@gEzJ̛ :ʔ}Hɉ?ڙ " ,Z7`t+d}{. 4ٶh w3:bR D R&:B~Ҟ_%RI -H;p;v_]&3`R<s=.ĥq<(%"V7K 6_?hi=n$c$j %%0#Bmh|PUQL P,4P>Ǣ577Q:)Գ҄cAykluHO >Mm(Z'R'N82ZPm."XJ}DoLwGi"Jntn- ER J3uzbj{S؉-Ҡzg E8 ɧ Ft+,i1DvȜ_]s~^;=4KXA+̻8w/)'}D/Mu L_yIAHTsU 7c:i̷)+%60P%ع `mӆA6o0|$5!)Xx1n'@ .-2% *ae>.(P쟛"*N@SUi#/`)w0qBy:œ#xPDs|u*vr2Ij>e1#LVbQꅼ""GM3cE(+{.3Ċ}\c݀OK6YxnJM֪e3h|(fDg bHsm|؀qtx;ɮ?nÀ-HToIU SLNɕZMg/)b-ro+ FB|7- RiY/Rͦ1kNcX^΃Ī'F`1XXw9 N|@' <o8B~_ ]uҕa᪰HN4OR ݘǎ%>,+eWÐKRcIrT%S\YWD/@.<@K@e@B6"5kt-[o ;Z!w҂6sxҼ (DIky$8 :#A.[$ B>3N#W(~O!a"&~0*k vQF)I3 h, ŪvTP YG0t{-lX`#;:Yg(ӣ^ou)P `6X~tDrk T1l8Q&zCcS3 [ZQ?,K2'n>K|ڹ:z 珓7r[]_NΤHQu&6}Qb֖7 "ɸDo oHucXD{6@LG|2?{H凖.5]թ8lѪ^dc{ùA-\4 P<ëfJHg'C<~c4t;92UJ-C >(gT\U9 @lt#{J#\֍ DOnR_25u2kpjױb,0& 4+TpIu;/Ʃz>e*yw"6ˎAEz]-SC!僚5Tmwl0N[⹂mB (^)hPgx}R$5"FC*Ӂfk3_}o|R%mqBkmZ,E'*our@ԁ0P}j[#D䳧FvHbbW2eofsj {V̗sg+$RW-br_Fp(w,NS6+U,<c*bkb2_%SsX|6"5 90`~h4olM̞w5졽Mtk\_:JGfάuxkTݎ@@;1nÅ@?E:Ó 0ߕƜ||5#Wعᦄ)R+lߓN7 RpJ@~Ȓ! 2{IbyY=vDfQv( =1BB;4ێq$ʖpW-#xg`T]K&V΋t,kqʺ8?dB G>5]җ9َeS#!,?&E7̛$q;a /}6+")&k԰yDT [շESIPw*f4@pKS~$}=ƧRz7s?LљqiΰN #d{S K1jS?қe|$Fv缡$GE q+6/Ǥ,"q!.RZѹdԴ!2}F|eZl"!f Mz(:RD `Д+߲rCc\&JGUl.`ģ 0Oq$jI09Iիg.݌1 t{~ȻU㓹vkJS#TllXѲj]cwJCo tAy.*Pt84rbpLg bUs@;[xz 2Yaq:3S4rWqC<xPJy9 4S}g@^Ȥ!"t;?ȓ(=I)R} |y)K٣ Tz<غOd.stye[  [6x1Ok1IfvB;Iu3;kwĎ2fN+Ĉ۶jM$` %!U2GJaNo@6QhlQ",94F1RHܒd.J܍TJJx] \W&'MaIqDgiI"*cvlT'ZM:\W J&Ni m'K;)vM͎q1{JkPl$ZuI]^p$"D8iXJfؽ&]&i{W&5 KBoD 5;г4bt"=59h! ] )FcvDt2f ,-X!Pn:Ă L]N:ma^~82tDcCx2"/s{?Al8>f0_6I7Ժn'vZVFʢWGH'3d#ρ1H3Pym!}+ p)3^WQ6<_r' nqsxZy6wgǝ` ;麲ZզV߬;CϘӝ6#)E|0U?"͘ =L=2<;0T.UO.If(41`&&T#2G8|@S١WMCW{kBqcVӇ5~ 2ߘs}lm6}a%HMFmɌ;PTe?s(v!ѹE]ȅNiMH#$b&O P,Ը0YzէЧ KfGu-ɟ hJ}g]2"m0MJ+K.%}d%P%h&d ywbYSƾ/\k县#ksPWj:}Ϲ eYS7-.r6-[XKD?!?HQ9'F_iW$.yZYqHO74 ~X oXrxw-ԍ]T cX/+cr<#5ˀ9o}otI$$7}\:PYy2lr9SDN?9 ;ViMVgȷӀ=tc'67 :KUUKDl irxV% ߇K0)Hn ʎa~[:7ЕmAC3_.r%|Hϔ&A$T LΒH1w50wGS ^/Έp0+<[|@B!p%A*o y9tоaOU'EUfL.\ӆe0k*u.Fr Itբ?D*& E~_|r#f&'SI=  b<(.K@0ޣJgC'),\xǝ_lvR)=`G փ#m2 Ǻ764r)Yu#};btD ϯ^?w # g |l۟gˈ׎#2;|OO0D7u1XN`d_rٜ)\ٹR}Z;Bv*L㿳vL,lvwOc _=q$ہ-EhQ!CV0 eb82r ?9r'.R'TŜWI$Q:q'&M vry#p~ J8  64/uF` @mdWdGo94j=* ڼvUo M:E%ȸj 7Z_+ ²ħi S+L\:}A`g%NRPFjCb9!u ܤJxuiX~f~;0:X ęDm;VsRH VBf-.+;cW]TSLҒadD .\_p:9>N bYs*|WVu`.̊b'NLJ?#f'%+,~8ەJ2כ[MU"?ar؇.h/`PkuR\b U[ [sFG%zPūK4svZoʟe~jy q/Z>y(?-z˒D~/gVJhBrs2]=SӝSٖ}:VPQ@bqצغon*Uŗw' jtF&Q*cE6r 1^U*|!D7=R\oipE(] Àֈ[56æIz]d=q4&kϑ+2}+,뻝W G D&776hζ}U&)/벯 $5h}S%edb\F):ј#*Q-**v0n̈1*%R=rr ީlOA8tnnqGC3'K\c;/̦ lJV]W^ttE:dldž>&FOdC%q"=]D/9\%ƋRͥd^$Jo+(>^ht87̔tI;2;Y+ybj%Fj uo $ܞ O-ZxETo,&lp愺C /1%^ a1tiHÏO,f j,! Ą>uA.74Q24[hjiI@bʍ}TEsę’@d<ؖ>dKuҗ#<{Z:+~+peByiZ5=8$"!,Lq ,־\R)(:NeA68Ѧ@lJBEpQƴ;YWR24a(l^`yC-p~<|`R-ȶf@JmG(MӁ5~!O/&0#ĴMhXeuNjTu8[foMzhƔT0[ca;9U9v+9{66ЂeBY =gy¿~O8?cˑoXrn"*3Wuy3dB#i5 $'* ]y5]jF?7Ƽh aǶO|Q6e%-gBĶ C +]a@kVOW(|G=F//⏔ql͐W'OKԘ s{QBRؑF*=éQNx`Wq6/o `aV`_?.Lউp#.U^*otTwS=Pd98fg^<-gKǟs0*Z݉WkW`O!WeYD+<-@d}^sĸ)pfd0[#9 Ƽ#^d1n3X$+@kA !Y&9VBEFV5U"d[.2.nU.wl20L1RCϾXh&308SP S@8)S=#)"1;$.*N g`&4u8_u/SwDŽW)BocA~SbݢY$,(|Xm ]bx4f`[`!Cޢ؄$-£.Ы#w Whg9ׁt٬䥙uZyo&yTt=t*⻔I<''ǩ)jCDޜ[.ܹwli4ax.Efu s`^j?&|=pP B3@elf `v-23+:YFJA~ȱ4?]30962 F$㚛)$V{wUEe'(ߴPFS'1y+{ z2h63>7ު{?z X[Sxba𪎭TR0O)4 .Rc]>6;qajh[YgcyL,i]sī oxqu p=Wk1 i^*Qbk<-HU@s.&@9NSz[vv*rhsc8jefȾaߊ~}w᳊B_eTM q [-&vt^ AI&S;6L b5Oru="p揾{jFW&gR)l8Ե849!wH>o!X8\-P`tFVn#OmEO͍Bv/&KLKl!<~ n> Ati*3.# ?F²[-=B^o˨RrQMź"O_CK`*sh/ʄeTյvJɘV˭2_ꎿX z蜼trZ=HȓeU.hQ+5zvHErL.Z۳8!s>~t}cΛ3\:]W| JKeUJDeQ% R>{WQ[7vT!ꐧ~XMX\(V'PWM#838P}>{kMb!qDC:RfD93}ͻsoN|E-xA~ZITi<)7j@/$# OEżl5qEp/yk8ss^[ #Arr֟^|a;ҦBn~cDߌSQ^P|sZt_y㓚}>SZ=;d˚vX4+=J칋`Bn:羍r:*X:`eq[DHFǽR?s@ /ɡ3}aTFV40ΩzEb5x=hp%ξoA;0|LQ{*6 ?;/#&yM}4!U)L"°[f(/0Wg8)kg)v%me3 ȼku=v!}.iKlkCS8u縂 :e v4W 08ø"C=h{1w vVv}~vIL PL:{@emD{Ci;f *SrT°Z Hy=͖Pά`v3WH(.ڔzlswIiaMN{O)o6!2,kr˻劅R3RG2 qsPqywoƒ :nV, Y R '(MΝ]5?hsL@"2H1wMƵ/1p#bSM-^I'F4lx#|Cu0~_>λ]́XQB^{y69H\eoΡOxx>4%-@wd{+<>['ht7qN3N mbPZPs$an~;w/\O9V:J?9?ĥMQcQs2u-jBq1cSaϕh%ef1-(zG(M*X( C66x~>c0f$Z|eIp3%[h->.[?sq;B6j ~U1kխUN$$H .^ nf O奌lB"${6cMc|tC riuZ!ߙ'"d`KWbOlu_})TE]|Q@&=i֋ӌרǔK4̅ufd07!>},k>^\:JM%n]m}cA\|H_c U{ʏqp0 dKL,eWQ_u3CN?FWx l%uro/W5sEo)f'2 59SQbxyp&+Gu'2q3KZPd4*Xvqn^^tR_wؘDcih]aݻ;2|k<7#eXQ-M1>.:!İ^pDr&m BGYb~n*@tD#M2$/̵ٺ I!bbx.,k Ď DnxjR:g~h;( 'IJ Ke"h #oپ!OHc-;l|\D~ظ Ѩ[K`UWZdMn\]bE2[ _;z[k1_.t=.L,{JͩSXV܁r 'NG'M jkOt5_T4EI05CoBP0H>.eJEjKלwMG(MT4U!xy+iC":`=ۚi~kGlJk'NvFP':Ў##⁗ϸQ^S$D"=咮0pt>k'a"$[pxճ)Bl8DdFJGPw/qfZS(Tf x@+ץٿtr<#B|ٞhzgL̛\@ڨCsFZNKH?N`>\-T +H{#&nrښ>S qz z6OXEkgPFc޾4b. ~ 5@[3>JZ'q |"n6Mwe4Eu; %[{<ԉ+]>JU0W\ ,SIgxM3}b:{K4"F+mL *o4(%?6ULt]URI(ux,hy[4DO}~%eV/ vh%IOq!&I4wCYKUs^ 8@d y/T 1KRu%*9mTBeqIe$UԫUs.y6I~ QO%QuBԢ`w}cEKaq AA%ft4%߈~ڈK*Sa]k"–fYw<^632=E5 I6MƯ{#@TVlJYSC>h Xd9i];G؂NVWWTS׶|v!qEZiׁgAI&S+-3yLU׎Ja28mYnICۇDDr-T,S;_0Wdh%D4\&f9y0MnM!AJؓ>Kr}i=9߹ NB !FӖ4搰dM0|^;}F o\߀*#e  4@7q 9<sm2l~ {^@SԔ.h!xC3"s 1Gj@yeLB.aV s-RQ7^8ݽ)[v`uWvyRlۓ4r(,7s<ȘTx-"O+\~R t+'^1b:yF`M6T94I[u>Ρgl YACX%?Bv!7wI* Lt%I MTBnV$w8_e]9]pXST‡C=t6br/pgF[ V4a+񧰵" eE(bdRBqOER0.B >~ד Y[N=Z5z7#{KsBӕVyhF–t10 IHO>zoQGyVxA:C8,z=J.%I Xh}"gY!7(IR)Q,Iqw?}²Z=%(j1>-#=n S +sX>_#n“gVne`|5S" 2M//U| ETxFb \8y̠ikFG|XŪhxUoDg )ﵯmݎɝŁOލ|/ay2x~hHRefvG@g|SzD`UjK/KuFidywnRȊVrH}&PHRqu@%;!d1p{R8]V\94Ku`xoN 3V#<.02c$طSrfDD=L ǘ%8ᮦdQd%6Jֺzzǫm' D>B4jg?Y<]!垯a%4g}q@D.0ɩuxsl:gY{'+JbAG8R*ͪ Z{^٬ΡՑMn31cDSM=9:.v_qQ1}͌UH!Ddd?A2vslE@id c:fgtkPk׸jUaS-("2 oJŔ-hM֗7IwEXT%~{Lj8͎R0SswsLi[G']C#L{kAlÍ,cF3^@90\=ŧ?Apclbh8Y0' JVr# ޱ'mD&GO^wwT1L\|%Ͻ.G]]6g,^7GjL)"ڭL$JpuV7.Y) oghjlڔßrĦ5<_X$`3jk-w<<`!rQ.u8@(TqG[?Fv2RD}.GFm)̈́";CXWԎW6YS#Ch՞@{hbLPX/b9V&#=d!=U&{c^^tHH9kYaB)0ݩaCRl_#7=ɴ(Z Bb'Q22L~ [lhD>ʄ`k,Z oPV9tg//Xi4E{/bRG&)AYrP3CO H%F+fgF4? $D,rw@\q~;r2dVధwiAW(#GB# 4>V\%ɠ djdLPHm+j&]+똇g VXk3|`Hۖ$ ӎQsG(6N?0_n yMp,h^Zƶzt9?z}!5?q#0>J|96^ٗx1p໶L tO6F* ,Ľa~1\3L!Z|]Vnێ&&'bS,   TPY V:jAEb:biP$3*D3 MXJha|EaG]BsLjΝ0 T3դҮ s& Z@t*ږ3F>z\$ʶmatqEM.0Msq@ `v= 㻺OV +Β->O~^8|ztbіtӟ{ڹCg r0 t ^}mN l~JheM9sx#]hh\HxlCk {)ZSJ&U_UMj oS4"Ah(Wu $J`G4j'}RWcQٲ2X Ѧ,nx'A73fH=rg ޹Va\vofSZ{'d,9 5{Ԁ֛S>UVA^@EHn%{$tQT"1\V*,ǼF5&E^ZTօ7Kaa^[T΢=Y٩Ί0 JlbB`M%`*9L* IA*IRI+8ݪ+I*W$cE=H&; 3LGQ~qЯ@2G.BiWX; _91,b%tB~rmڱ3 Qt}WW={2PЈv#=fEc,ͩդHZ!+"F ț2JpDz.t ;n\+3ԶaU17%TVC汲Wޣ&>itޕ9E5Kyaj`9:)C#P IeGOw? #))o5mQNU$o+H}O;N b9= 4'Zʾ#; [`E0KBuZBb10I8PEsjI A[ܲp7Z,%S.&k?+6]p"4<⋽s-Z#L2M;&%C#@@S(7T!τ{ψV~*Rh"ɴ1'CԚ0nMVᕱV4OV'&)bg`KY uF-"jYCW9́ R-+ BK9Jח p \[cց/i8H:;06YÒ:t Nm 0e:5i*l+T]CPN5q7GFm|vA[|Z+ SdÚKsKmt:EUam{Hn'CRe{r$&?sC3g4|;#e*4fp_S2 _2ŞkB?&˜@+:[^+Haf%B/N]Eo((*S%B䴝V%*d'+tWNF3P]yb2?4Rh,B]- sқhbDVY>^!7 +]wY׾0 )F.$|6D+b 'u$ˎmY? -cC*{5qWm-i"NsDwtн>c7qz":$k^`gIРS`c7{@ r4}.i$pӉY2&ga[@ջ <02X/ ^TjrGr˩z9USlhI̾K_笋r@ɠr(TZSVȦDœ=8n]_BGR :\ok$54"U , k34s+6 qgd cۜBL2U^/i 㰽H2Z0r\]_d[Dz&17!4dpBE.O>8ƍF{,Ȇ,qF;MXI=ZIz{+VrD_#{=c{_?dwu߶<"W^sE'pfL]:^tr$k4Rv[b_yQؐ g {Y'>L-O7t>}Eb.6('; Uy, u"ffik/;v#Zu^8^X=)`.?nWotƒmBO/(fM0``A=]^Ikǧd޲c~vw;?5ӕ/7󓆿r\rB?6;)9Dp\a`?,P ~e|r%W:㤁Ƒ=5GYZW-@[b"<3tįJ_$ m]W'LQg4,n'XU)eޯ݋|9 4qE'VmR|+駈q0/۬R :-NX4a "5\o[c5t\EwUEbŎ3>x_M~OI㲋؂CأnVoP` 4 =Tm_`;á"~yDU/TżM]e+)b/Ҩ6nP];/M~X=/XJ㘤rJDyktn?L}4#9wXЦcƹzЧQLCe@W Fk4.goY$8]%*0pxk?Q<ۻ<+ؒZ9W[7V@>Wh CH/S#4T\-7۳[ H`k4jvr~VT?"֡a:N;ֺ02F8'*]^ki?Y6&}|S5'h3ׇzLq<vrͨ tUֿ̿l{^]3j5$04q~GIFꎈobyًq2@ } Z?>a[\h; 6B/0~IqTH1lrb^8Z2H@<ӯ* O8_'u./Ps7ZRI2 #a'kܙmF2o.bBف|i #zlB3.2%"ISA=밗K/Qή w{@/2?JhWҝ g?  &V.Adm_"sBk l4XUx||ExBl |EעYEKmMnQY / &ulQG "(< X?1`Q n%k%Dn8;OZ7˒hI4H$EpK0V7gvg<=DaFٕȎ_ q*8,K3y9y/pb &Ta's2pHLU! tbѦ*bR_wA k>Vsc [#Jwj'HW8ssEJ:QD6C5Biaq7Җ1ZA=FzQHSn`8MDf_LLߖF+z|YX]rΐ_be,ݔңW9J. /XJlgxf+4 )NUQY _ݫ 6 rjD#}K".%O D179eqyљ8?K'SWS6K%!kCNI4^H$es$seE1 M ww|C]yAJOj׳x$M(N#ʥñYMԺ۸ ぱKZ/=3< 1Zڹ2'{Uڴ:tj, ]Gs>xRziC ~x-3EH(Sy.^ bbe kU hs`BOǑ⹕}Q-1ԗD6i*2#un(''=s6+H#Aه+aJvN_e(.3D*T(^_1lp(f1K9oVfP4JhIT*i_DaCHx U`O)yܲ`oL E?<}+JVm_ECƕQcХs7  d0u3c-4#k^JoyJRw~@gl%m`5rrpfǏbsBs=x|1ķyT!N)D,h\fB?C Sd.8]^NVCiЌzD.e`0wĀϓc8av"#/HNx$zRhvwˆ)4CV}I0-YF!츈Q:n9d瀘 7ANuOo&%EEj8ZN3o3O}dGO{"ɈnJbFL$qDd%רoT# (Xj́x/V, x':|V 䈡yy`5 !,U} ˡ[ӀR韜 )%J4el?tyfqA>/;ADZl+ucz6g$C1,DAĂDm4$8ޣK߇P)){zD"+d\i]1a\#6Z)a Q@'G&b\АgS4!v3 ޝӀ_)͗Y}UbA`*:WZrDyX>Q|~upⱤv㹐:"]C uylMWk eGmf7j EŶB#X ?L (k:OoJq X4݅|*+nċ_0 tT\5hE~f˦[)CQ}9%iGJޢ3UKH^QL.$8T0DB$zlsݲ &T"|cHj;X>[5{=f6U"81O.N,7'OLn|̟ $ʸ&`פ\'d *9F`|ۤb4}4tzugQu EZ`Q{!cvkvZ8yr$TT <&&[aQ,[yc0"1`6Wԟl޵ GVߝg[ [%.= X 8`r4g&Vt^ Kߕsn$Mң$؆@F? nS٦&=23cL.o(ri(ǙE/ՊlhqמASQE ]I6r`/ph2!40#v. ƥ6Q?eʄa "U7e0%PZ)eZI$\}[brVu𛳀 =8bE9d`O ok N*x Mo{lt*4, $_攮>MytK9e |3 U PYE'=bd]xкɒN1oD}$ht׏=)77"׏mD獨_A>?Tn!+H8*{Կ S^6Z<AҿSk2z=vD@y }@U=%pČ!z<ֿ%]W7=Vx}Cz ş?ڽcR9n&kb`}{tP<Ε6L|kIjj/bj8~, ,c': ^\;vM\QUg Ɲ.]XX[7rXTl_ŐI>B5̢CNw!L,Fzo 4mw nR8!hP6LZ,KzK94tزn]c2RЁt׶?!('@+3D'ڹp,8rQ?mdžoK#$Cjc%u_fFqi{2K/,KlX&oV4ST 5gҲ; 7H~KL(u!̑ 2c`fK[Lͳp4[Rnm4BndX)+,ZTtǙ4[DVb[ aK xRhL@AM?*an(@֩ݮm{D3fA:ۛKr[jzaq|Tې7N$&޸6-@; , OM1#N-͜2I;Xq7Ж ^Y^+ڥsܴBRo}+YH7poC(zֈ!2&]竸x%sNm=9NMPa"U0 7܀8@DmUtcPM] e1'mW::(U)Y9ZL+ؠ3a"sh!vF-f[.=,xqS)$qHUY>'3WRެv+3 0) ^AhD_gL֨3GYfWȭG WmY|:s7 cF^Ws:3h߭␥*QO9.Aro9h쁰Y!=vn`E8$;DEFWfdgBąNv^ݐ Agѐ`;Ebųrּ~`cU⫬y[]=C#|dDwӘ!|2WŠ*A;~ %FZR ]nxn)Da30`R\lXL/[{ uĮw T _ZbGPɸM>ʜ'ΗD8t#tfNفvGgl"\jݙ΅3™PȲΊt*q҇ڷ%{,Et;< -]>58WJFe"ws7~o;sƫc soڴc{>4 f\t9jL 2Vv)u.44h##Θyf-MZ*B8xǖF>?&(lzO_>"M=“ypuٙ/= }~2v猂h,&픊X_*Y%Yb6Rԃo52bѠ&>0Tyw {rI32Q6G?󘥛#Qm򋝴_ /)LSƳT66ak\Np(Bhqъ) uHnh;i^U_޶mGe$x {S? Ό YE |"β7&R }F8>LBu "gX?V~Ӻ 7n X3d:[z8E;&p/6Oŧ<8^vVgnϊLyg2zz)JY*YhY/ԯ77if07\Ӂ_݂>[ഺ1uBȓpLJxJ$=o]n5y /tή< ~I7OJ@r?3gCZ,5y BYݦEYѕH.j@-١>+E';D"iL,@\urb5r!F[ifduBorh6vnE`orLJg+c69 EJ.5.3J \iSX8͏/L{ьFt[mh șk'Jy-O\4/LM4>:Y-ق򠶏&/Cghpռ.k藝ۊIO˜T/TΟi-d'j{CF}6QkI@ݹ/Dm "ݼv8!)< ȂqD`Ւ54f͂U9!*N0 W,h%v9Q|΄(.>߁W #K ȕ,~adyWʏi31! j(;Va5&ȝodBBЦd70y˙)RgA.| @v˞o onqBs*'0k>fqof?j:As۩vϭ9_;ڃMFPc ȓ 2O7զ gs|Z-Au } [gf (?{1N@0YbMM)% 2PgE& L7GD/al_d0w첈tj;)X6E4L;`"[鯘D~'G[9";p 0 y7-Lj-{< MS̗S,VuN8#OaKG~-'}2 G귉їo^5> t ma1[WDkOM#Yz4.m˔kX/S]^> g+ITA?dvH[4HSYΜZ9fn&QلZW(Av=DXt|oN{G*Q 0r&VP(\fMpljD)2APr1¦GJ媙Aq >K6VzfyR emB"-"}˜=V^l6LsUV~j՛#;G S.ϖf;+8?Mm쯢ɫnM ]EvRɩkE5_6 hBZRz\jD:Xc> ,JFPv -"@_t /X0+g̭*g񞑜+oÄ5B3=*I+U>zwp~ׯ76rYnHfTDdgXzYTf&@+c'ڼY kQeZkGy8'A!l؈] 04y.}/4&x o>/ 96 ASw4Nj[OR EGixɐٸbҗ<8mJ帧)ale% Dd5sYoi1z~^Iych9}>ҖN"F60,o?+v& ~{WtY-$& fLD_V 8Nv Գec0Rrci$%Twqyn퇓;3KI0Q9#rrcӎ~\z(P2d^J_n?8h\ rjd9K[Bm`a|YIo L_.Sݕtl|soZY' Y僎cok6,혞' '/ކxI/^ًK!K%Ơ? 8_vK$W,.`ŏPs@dp+؀ik<׷4}+jN[l ř gž]2ɰٔGl.nhǶ>ޙb;b7H=ag` (ӽ@sJ:zw4Gʍ5y{ѥzaf.Pn-l($!SH v2ãD,[T\Uqh|r-[_|m#ofg ٗ&HgG8PP\!|$%hYOs;졬=5\&_t>t'ƓɂFPOpF5Rq: ҷKgxfcjhbM/z.:{p$M!a] /~zfKK0BZ09J<f 녉&)1& Qh1Ws ݷ N[k#)mwhXN`ϹHԦnVj?kGF f 1@! w_U;kLs%sV¯`5q8);it߫mL2)n( K S{|!(D@:Z^gAU$v,w|0k!X(@Gl\Ooʑ䂕 EMflR'Qw6~xIZ #Ja7 (抑{ʓi F%BItĈ..|;DB]}Z?2NwK~td hz~~@WUwl [~D"uʀҭ(bԡꍓ,LzqYQi4 fnxkƛt +TbͺޜӅ- dq@h=>:Np* ؖ.5Lp(5 #sj龈'WYBѮ HM|ʄb-X^I4X/MohxbK#%sYk5 c`y Rẍ2q^>lPfs|H4T}}g$=5 ñ.}$\>R9=BDV` zҥ!tC?=A~QT1T:rQQwjT+C=I{nx$-lxmApwt :F"\)&}IDw"'o"(9T6CPDqefJ]R&kmd^J%aw᝹b"ծ0D1^]q˾#1)IdHل!O57 ٙѫ8+b-YESҌuFflrWc,#FHcV:YPsŢb^KP+]-OṯH$5g0 nR*05uҹK&vgcA&W{fGV|2 MͰ).ݪ 4]].A$lC^?бQ{GFlI]wX5Y1<ǣ>zg:CWn3?f3չ,_ l} o ie7{\3 RML\.%p32AVȠкr5୪Nmԃ2au_쯄n\>5֧>R88JנHRbQPqM"Kΰơ`Ԣ& ^˭ \[%xhl (45|5+j$jFr0e7|"Vuʹz!-?"7U&WT/T M9yCqٓ L'!87}M|KRًd|5ua'8کOr/Pj?ohAE (=GBƷw'JW5#M2 <=YUmeP܍g ˱W.Yvcu%8z[D"4+E"eޤmv6 Nz)^7Cjaf_z,(΃c7ӏƩ=;g 4^W:o?({>l3:`Bbحۼ4iSFV.;_?n RnsNƗg:EQUf7q|x=wxKINs 5,{S VG^`ܣȤ_sXDP\js;AQ:. w :hE؋&Dǘ#9~ lnd!' 7"JT)RJ}STEK: .Ohh_])8{xKX "U|ӏulv_ELjGGmo`.)= ^YVH2SQ­+$Jr$_=g+3.چopN&E1@Z0<hUC~)8C±$iNds3ɒ `1ψVqԶ9,'% &͚ۇ;* $nqsˍ@aA+-%_@mgC bGvtXZAq=&|/{@#>8o6o3qRR3uKl 8cSXy`7K zNsʺ9tš~!HhW@ltUw{"=~@tݬlI:O5[jJbDdgk[]%ux壝̗6QIJ4B?7|wNAJL * _qR& )W?y~'*\C G?vELfG͝dAŊel*04tUwsBe:eA`ܸ>6xJ3 k-S7 A()"&+ȯQZ:FM7Mt9:4h<~a nU']0Ԕp %Qgf9*9viHpjӘcX5AIY̎'O|ȱDz_Ŕf4H^pNTmo-<`5Ơǯ2G@w@s AQgk-cq!Vs_ģT \p(ᗹy lI*]SsX, {Уߕ4ZM -캱?~Žr9%`eP,ɩqJG vۑgjd^O셚7^{\D/nՏߍÏ]{C_ @~ϛ9Lzu54 ȂT4,` Ƀ0B@!_ 4/x! WCs*w%57S H ;"F̍7Ge ^ah >a^̢I| [qǕ;fTog c#\;2$%}dnVOL4ĵĸh_n (`%>B5Z cJLޙL]9 \pv>0%n^If:x3{;;$Nkd҇ -?H6m>눵I#ztM&154ظf CjޡsT !uJd3/HǤw,\zM>Rm|ܡvf?};uh$Dp8}.;nS#yON` M:e3nɟyd^#u0K҂y"}s2ױu$rlɴ9J~J"lPF ?w\3,%NNpp bΛ-;J /24%Q oۼ{_,/h PtcpPj(dhV.QG!7nj 9^|϶h<YdVX (tԉi /rbϴ3Fz;Qg(&W2І27xKs0(HT 7h30a}Dd_&IJ&CvWrW3I2K$JA Hm]AJʞLWF$p2F5T@*#kGv~ R@;).NDt,$n:̟Ra0O/9boue0Ȭ<{\𝕄X0L Zg^C1Im/&K{lQ21XGTbҘNDa2G⛜(<:Eh`[,h]o eU+o$niw>:/24w$epi+c}֘05/%E@}KH[N{&?/> U@Suf/ʬ_!B.po28Mf%ߟi$'27kFl㝚ʻRYvl"Ƴ6dk &99@H `Ԇ78|3zPΉ3p$[ 7rjֳO}--;ĥRDn:(m'IE]LCf]%Љ NA3ۈ|9({2T u4s]=c)6DYb~ި0y.̘zPW9!vWS_]0Q\ ڃIpۣ- :֡6ϲe=`ϗ;>Y/xDX4cN=gNRpÏBv(0#VGNH7zА80uIMm'7~&xxyxx@HhwIl29mt-} a-2ocxOzd|K'Kp.wR is~oqEp7yޓL%xd#eEH虘k%iUyQBL.4I`bfb;%O}bKsUvl /{<Au 4{r~g]{ >^5;=MRh e,'>o*lPwI[Q)p9Qq|7])2}"ȾB@\Ce 3d%,ɛ/)ӓ<e6Ut糞usq-"{1"@^ u=#ss5% Ҿ@)ZdOTKM춶-F`A.I;4W ޚ3LrI-楉\&;Ƨmܙ\7#{ o f<*ZHQq*+%wB /Afys&$:u%E.nq V+"9.v}1L0" Ԉ˙ab8+B9`j1P۾kwojty=x,[Vn=.VQ\nD5pN= +54vs9u@_(;f?PN(cWCDt;~tecP|Rmvr$Q ';m^̀bZͅtN.6 tF|| _FDl|Y 4N "5"XG~U<}p-imHj\(MM>hX3ܛ@#OPeh$+!N,/i1L3h1_+ó^xwϼ1}%Hxwք;GGٺ/~H J-t.Hv, 7_bZjVU}~am"~c\w[z`-5˺TVx?z ؝p0 3qj0>[}CJۛ4f*blRؽ5?T0EXKG5(N+o2d&[RUt 0-'#gŗ{X'%),kTP,lV"坌g؏bbWЕ'g\ 6*s{@H۞ xT=/Dn:IKUUϾl.IMC1.a թg]'&) J,K77ZI[p =;&Bn'Vr 9zte60Ut,cdvj^&B1!m.aO1&ؤVx28Xi1DXS_0'>i Q:MU~'r´潮jEmA.$UT|b(.,t,in>aK~ 11=]Ȣ_"2}9u*Ͻy] nG^JǿLpҋKQLH\oeej/=d ˒"t?@7Q4W #AkklPitK3u>jNJdezhj,ױ߻/!-M=+Lc{K{XDdfjc=*[d("Gij*[sdZ=Y?Yx+dn/Hee/xrh)KdT}ɋ7|#:鵡u~ޔR **Yr7pM;H'F«vra-DJ\,9ϗ uݞ틓lJӮ5$90Bg34Hs<Ƽֈber4Jƭߗ ^,#nƄ~.\ЇZ_pCouHدS<**u* z<\/_{]iDYؑӀ#' ~2[kGV*BS+&I߯v=z;K/!\߈'C5ۗ#8[oA?3U=vtndwgݷ 5Ef /T+tK۹sv4xЇ*"Q'm\z ̼=-&h6@9,"܂"]R{kexWr;2TJgyfo)KtyH3y]-7ơT_8KAn7Ar  ޵ڴ^}yNN̓dv(_i(Ίt5D1ڿfJ~jR/r @Zӫ.Ot!߹/`2M̦ rcIS,U3}I,`KPCv,UMwĎPp&y*i6s`쩋2۝9)4L6\DluPBCgt^Cɰw4`;/="?T!ef5v>;D-xL# 7.N?Igirv` F 孢S7m̳zmk=vCn,8-|S'!*ķ?h,i=rElS\Y0m 96 )@8NnV4*ǵPhq{-e&^z"& ]FɢAQq.D dp$2}Y 9X!Nk@: Q.)[LJ.-Og̿Uи~?QUG8H2?vrPߵQHA/Y,+irQbPNT%:8c[TvV$?!g r7&F7;'TJ.~} jLLqv>PXoHջzaGQ#'2F4b.ƟAR~04-<(͢BَfT%FCe^yTKq s 13Ygc z6jп fo܆#}垙"9p0#8e(a2Tm 7vE~FhXPyDdPo0[֌KIϪdKV0LǦ4iOLHmʱiQVc.G$KG2ocfFimѲmT'%W"= @Dvx<e]V669= /Y5BLK]޴1޺r]EDQAM_UŁlxB];=P %B"t (} m`̤@lmUM}]gei[_qX$KO wW DB%Β3"{F؄FΎy M?IYZ=v|\}-ڦ+ד~BBMLOgN}krD 'fvJ]Bk "¹|wy[|euJ$_(uUo|dv<7))ښ}p~C}(9ҿ`v_W&xѐiL*=5vG[i}wU>44fM/#owҝob3o&FՉܚoT?*VJֺe\+Z8pK; N=sݺ,Fc*Jetբ;<|QoўSQUa*,C)sIR)#Y]^H&13C0s -MBMo t5<)ix#ߛ 9iK"DJ+Dg^2.ߗwV?6ũ/#)I!Drly@ٸt*r*[݀rUTYn^oX ?TA |MтJT/t_R2["uZDmYtn&-82<̇†xuA =P=:sAN s\_٦?#sL!Ð#lDXU&-*Aody)f54*O| ROFwݬjs'H'"BF1j KM̛j?zd2ώ􊔷84MmUHbw YbiұGc0-brY_Kz.< Nq5 z:׌AkЈI̥S |׏Qn Ub#&]XOX`M(寑 b_HP3Bba@蔛Y?-Q<=5!fJ{S[@c{e6tK\#?e{rFwsi.4%8<% Ѐ|Bbz2d")lہhHDc;ĕfu 4Ö:?vЮ1݌}p'K7.T Ut-cmB|Xa2-H|# G -V976cE_)}d"x Zb56*q!- m*7k:Rn9VQ*ІM& gNSă/}@K pD]OR(^HeuⷻMN9}zhOk% U EVA8 YF}M͸&RrK$9늚WdXuE6:Bxm3TU#ܖ3 ~`g g!Lm^k)@VUan-Rb_V m2v'B~mMDa(_~RX:c:_$Ox~,z@b ^kLM2 PC0YЇ7^X!{@p"AcX"AJjDԵ94T /eyq~T r6" eS4bi<({Ѩ(0S`UJ3qeA62(pidqثI |*Bk¼j|8G<\(C#orD;\!&ņt 貘ʟ+ .anycJ#72 `_ 8ςw6i$L33HIJIC)wUQHW) xrrd% 9] -pz-A/$)뒪T@L7@]iC$m̑X).M8nG4j WBG"* :+\liRgi@2N\FRE8^f 6U1?RΦ7)-E)Qt) iNDk%CBQ 9 /@uVa+JZ:6-9vһFGZCeuK\K cޒixUt}R2#Ւ#a=IH4;+e5&?ˡ4 JY x~2m==B$[{?u~h}1FNR+O"Ul.[Y6Eݫ^jEZ//%z{3prNYd ?L~||qI?旐 Rx)Z!t^a ЈVyL<>Sݸxu>&ZNDɡg?J1''DX]b%w';_zZ>[z-*@O7Jʩ;ݙe}reW3o}i[.+)cmrJ8ɺ2wmC/xJ $Rh c;^ Z[e0Hv4s4_ͻZMلSL[-R.o' MG x00Req{ bE;$SyPtѻJS'n_JnQwJ]zU`tg_FšMF7=/cmڑ H- 19F;e }vdity5ސ9WUJ9Woq|L><1ʶn.qџUNX=|$yzT$2keHgtr<;T6™'1?J[Ij7ݡFaaq̘Q'jy"P`J;#-+ZP 󪤖G"@6Khh ` э!_2uci*ZWbA*9W V I\Bii6+ユ*/ʥ =EbԌ{7tTֵ3K~9Z1lK+Ctbx@kjWBu:Bu,WRAt\b1f&92DG@PKxV#| *ꈩ{ҦN9\R$Fb쑘B[b!J򃅝:مjmm#G_N@*{:[I&z%74zUP+ϳe槫(V 2r@7u6j)x~pe!RZax@yQ;X˕|J#502XN5SԨW삮 #^6"z1:RQ""Р3Ʒ}SӾ]Mw&h.jopm_Xþ˛1B^*X=)λx1`JV$362%%ʺ & p̝-Cܜ `f-j|t |թc&TP$BV="ӫ}gJ+KlDj&PDGR>yN Cʘo52.5>q^JPөq+ܪǝ15\)#o@5zt5@z3XZjiv'n j#NbHFZQPwdQ\ZޛF f!RN6?>Do 5;it ao;yd b$b.:JF'5ٴd5@V7nɨcZ82W av%B'5<|[rH A AbO:zAV<|i7mҸ]2n8c6j{kT$aBZ]̳;I >ܳ[/3+:2(R*O](J6q1^V;ebb$bL*185qAT[ KzctZp2L(oÊ+k%DC876"S{S1.+eD5n!5a@/7%7: z ˚] rIK>flhD^}.2qv;ǧ^فViw2WRN?SWBys>ܒ B!+kJJYI5e`-ÆփiY*'cHA "argzJ#y3öᡮk)rе}x+:E*'I8 -S~8"Yɸ8}#`星kĻYŠ%􊷪pz'J0p=ēkwKIWջ*sNeMhIֈO[ɼ}r){Q_L<\z\9M0~UJ m^G{m"}7hPmB!y}f!U^iK}NTj{h-jj]5(SjtÕxS,rnjϯ]jGG/|i˰˵)%бo9/6jjFZ]9sljT2(XoRɶ՗;_Bלԡsle#ZtDs65+O ]ԉ*8:h:keB}O8)d.ģe$h?S z Csh0d g3y[z#]G"E[zfx@ڏ5REtC]W{7, ?n"ZsюZ)K< *`ET8*P46hMs9|Ԇ.5o Nj $۾y0y xkM4tzׅqJ \Xao2 xzb7#,L] |2t0ekA/*}ڲ2j!ivئp m(RK)p zOXh6as:Y8,3\B$P<޿"_m+ b UFG'gCXފ}['+K@HLAI2z_:Ðg]3 7iz+KC ɛ.S2N8pfO>TW[B,d!pJ6[Ⱦms@WOp8L્J>J6= o)gMvz`qTAT+Tn~G~Z:}.Ø3yIV8.DV6?S跞vR:!vŅ0{܍#0m䀚As"5*ݝԌJ{&غtԐ€Pp Y hsFr䵙dOM?tXM4>AY.6\qV݀?[盆`k,j_.iՀ[sd*.!tmhZm}Y7{ʼs@ Ԋk%oydXjPM};Lt&&`".d-;3Et2T8sP Z^Ԕ_ft1ō$,)a~H(!^d>YA F5gcYުG+`(j \ͪA&БTrغ( +8M3gKMXCQfQ4N56z#Oy5Z҉Y^{^Q N7͐/*l~ٔ@CVܾ “`A[8jT&@wAy60⤰$4V+E]K s>*=T7͡4Uկ=b"`A0gA“' OKXzomj}4uyu--nX`oǂY7b'$w _ZA`i| W\W0Y0"n f^C~-j͡߼vGDԬo6uy)Sr!w4ڷ <5(5cC9dR?:dZ$uT0UvuӰ\{帪mcXD.yֽW:gCةLWe\z[H"^A&2nw&ѳ؀'Zoڸ4,b%t+U6 AW,rEuf؞, [.&/RQ(߿`o`n#? #qZ_/t>1RVzU@C6X M6e6l2 yjȘIȯs|`Mr! TrjW-}DrI5i'#" Rd (94F1B#WqWVPI&]d%5nFk-lm.)H,r aD-'V Kt\L->T @@%_^F#O@;~nTCCD-9&pOLCUƛA'"WMh@Fp8z nل6>Faei+ˊn0!,s ''dv. jmlc^~Z{ ? ÷͙|l@ x |FǞymMn[oPLjʿ 4atB_ 3nA(`'.E9NtT~־ U%oe"C#U!-Pڽ/._V rTLHJ/15Hw_Fk*DFZZI`@~9o DV0Z4ea0MHKKJrEQax@2@ cģa{8ՂHq+>HP^xO9Cҫ8x[ݝ@\6Ǫ׆ali)'; DfIĻȼEyb R$XnPUhoZ6;f*WSU&R4}aW™ ݾAǍ`5E#>G(Vױ%Ba=ZA Վ =FXKg#͞eoeKG7iݔF,3DmJȞzݱf60 =_q"%npY==<[*N9=]P%<1MG9[nk3|އq8_rӇ@}}+=!kS}R5UQJ`Εvb_f9^б^`zPF;;bRMf9NRIlОwؐhU}HY,F/a("ȈQ_ `9 eA;&+OS<?IvYdO:,G.$s -Y.*)6)A4ijmz翃rQjїxoW)yysɜwV!/rŦI&{.tj!^2hg(92ޙrN }2X(x*g#}eTaڜIQ9;.Lw7)GwT{:nH>V^xdӨ{ WGcKvDDWޠ-(' %Q89Vbs_?7@7%{G@16v&> q~lj:T [#Ij|htWk Uƀ.9 ϯ- hFqLb5:ﯟ&Ut0Mբx3cHv=**<(6Ư][-f#\3"j_/z*]J#JQh+P&ȶDLk:&63s B y\-T6mè.i*yNVR 7_[2xJFUkޭS^Mceq:`+P- &r %S+aS~<@uDxWӍEUGH'&1m_Pk2 Eg+98 @Pm>P7ꌔxHҪp@F~p:ׂƪ|ISy/8<5G _K'EjxDLN8;5 KAi5Ihsre̽ʥN5e6"jH<㕹E0zN( 6j" 3@7i"'&qHeHr#f hvqH㻴 Nיz=|*9dǡHk/%\&I*.\N P␁uSS&kq$nL`i(*dH_nMLa)u^/380 ~ٍ=XsLJPnkBF(9lIVW^y#kA5*&Zo&A{^~o<4]yHW o|)`SXڴ \(,o}uI ,*_asޥ(_#k cjC6[2RE(wCf$aQPqPGB;=z;زXq.BaNߩ%'! ˊc[C( XrLi 7ċKIS 0OKǮ$YaE{ς{c"|&_Xr^evgqo@bPh! qTxnY5BtLhbMw-$5*=0ckb6iGq mV0RzZ]vOzrn׫VNS j)v|$3̏1(uTٲy9J'x|DJ5zV(M%`F6̆9=H8yݣ``T޾r6k m]tO_/kVkmhE #/%D§?C f2O];Q< UwT|b96Moᗔڰ/G72~ig7 ɔ} WtjAgS69YiOCuEP'{ N/lJ;^'A7ZKlC|wxN:9:xA+5^k:&Gc=3%mV/&w 5E93K}!`jgW4j,f_L̄1-MfSiP[ۃ?a&. u֤'p]}'ɧ[ /ǖjՐA?@Kk?0tΡmӏ0`w>ԱܡMВ5|\t nG/(`,bGJ_dg'h!b5RV]cw9xem:t/I"H-(f A@0S>JO%piuثÅ($Ƭn? Q;jLYTilC3$2E'YTE ֦0TfrJFK>bE|py ع8("d"*hP丅G29BK6}-:czUw ƓQ+G"7PE%53u\Mm݅1xmߤ=x\uJ^R-莗5*Wo6^)b s?J~NKWEgpWC GNg1A)4RrNmf^kvJ.C^FU矒:GX6ZgWֿ^a( ϔcŁU1Ϳvyָs"H |%d S`ؕt+1Iab'нM圑s#[nvg}9٤7RG7kx'ov1ZG, .o#p`R̃$ сfl>';m' i!;GW|`SqzJ HcJ`8 * G?'NY il:vD7xNZl 0"]^H]62]sJor tvڀ28Bh[MʼHSo2UbѢqf8#jf}y#*E<`0OSF49CUi}-~k;P"gzER<6veWyD*qzqxFG$z+D*IZKrj}'l꓎ђ!22Cs6o&1i,/3 ~CA7fbaxKX$tƿE@.~䛅q(aA`CT2*~&Ͷaőȅ \5V|@c𙫜,ދab~$.)"a4h𫟓@MdgѲgSnWR&N䵘j.R/WYM36=.;TGG$Izٿ _;J)05HvN'3C2mec'k N@!yD ӁT-P'vldȳG{0)ԍe !zz &2ضn{l('H }CYҠN֑7FfOR`sFF덖]%O45$*~KsIL}b/F 2zΓP Ig:$R |1᫧`ƖI*Z eiM060{B+n(^p5xѲ s- ='W VU')YSӷ-@o}uDNIj`͌:WJ34h lύ1Js)(uBh~ƒW&h7JS$<̆ "Gf:K78coō(, EUŽTMB!ZcC!Wv}suK@QFnۦLx]\tJ#FoWNL򬲶iEچ]-Eec,}g5ZuZowd"8OϮ<_],C 2eK ڔZ&݈\[l-퐱7w^V-Ҹ&TW/ DVSغ_;ywLhyJȠOzf;FJ]LTbQ)B1r@\d^c=FYiwR$u=w /[+hty#F`-lK@qf}Lm,55V7"@9Zin k[3|ͿDt>񦟽Q8H[I ѓ7K|tUOE3I;kbEgy-3dX) $0ͼv# HGwBٱ]< xLTwIfX}&O~5{ޖh6oz%~Ԋhu@*AxAg+d.{)q!rd ɗ%)&>ҧbc5hfN*T͐A"7 }x 8! '0<Ԏ`\MJ§vtbb2dn*xOgTw$|[JF9~P \,hD9bO m^`X?aQ1wBzLV:`-+W]p K2! ʃ3Ybba±B,[bT.^(!(6Q6B3IjUqegu* dƉ8 9%&Dܑ~c/>i[ЕpIs2,0UE,.Fdj?+LȫfÅfi"0Q~®߄"c79eZ>G@*P=# _ƫ{ ޯ8M[%4='l0cc>_kaJ^鷫y{|TȰtI]mɞ~3|̅I&zI XHgVdHoR@ r}m cz %gMt^eoʴ };k܋IVͭ%c< 0 dP[wW<8T۵w48E GG.XJ*!Ngw@Sy(;:hyobA+w*4Qhs3ΜCI#$pvC$hPŋK?M!V4 %ttզ}yDzp'if̍s$|#M?2B%=+PmyN B IJd5_\xhYM96碄1i;U1"ژ0ao91>:NEHR|lV83F>ۣǠR=_tQh9 HSxDv_޹3b_@H}m7q[smRlT#l!5ia}21dbisMs@^?ZPORNXQQ˨z2Qdj rbˌS&{/ 1ZJZ)6W?j&54mh%* ^@z,s,!3o9D*3bT =ib:Cs"~̒cܑ?6BgxΞ}1I&7 FxgۨWB,GL"^.顙5냙N{r n5vXm Rs5AfVy\!$Լ9#f;={rrabx|5pl#^;{J|;F1YS0!fI y1O᡹'@ש4=.Pcp+qcm=~EQP:ֆ1du(D=' 9x܈s]p)-k'!Y(>MML^_)T{F*X0X: &bSϼ~].I3'ܜ)[ m#@[ڥ^)|KJvYڄ rq އ߁)Ҡ]zm_Y<܎ %oh"Ee$ˤ=B.#ڨHqs,`֯4|JZOH~-}V҄;D0U߼Gdn [ F@ x4` 7ۥ vi-/%v^z-61;"DߋN=nyr[n҈T&3= {|x::`2}"a#=A =YGꔲi"̄Z VAL8&#bOu<7ᥲfϽSFO[D?-s6M9eIaH(q/[,fb~i ܍[[96y-~,,oPӿ.N7"8*_7Qz9(zj=; >4m>+` pS+[h$JW!Aۀ]&3om\ J: lf\O\|iWy|' 7#3X(kE5sO1!BҠDĻ4%3Gyyq+!i7z kŧP N\ e>g)}1,. 6Ϲ92ʕ% %:tCw)@E s &w1۞<2"~$~kf?Kwt3 =٦ T]#ua *8Y WJI➞hnIW!5ݗSw'>Xʹ*08·/8iVI%,j 6'y+Er~9].'4aQ$3k~*V@o.Q(Le`ؾ<6-ZVU/ +lNw ԙVT ffb;:18Bk#.26deZ٘gF"ѫȅ.5x5^C(Z> 5M _Gi"0 3a "_-3!¥98g޴ SN&QH#. h+YӠ ÿ|bLuxN U9T AI[s̓f) ~n:4]/Tm ?SBK0#3qpւ kd,SWs `{6}%WPMt`D}7yMt$VD$ Z ^b.8&Zbd OU8C٘Rr%ƨ;* =uXIbQ 1kZ)3Ӹw_ջ{^gPɍgj-/IDq3%nn8AJExJņO[ ]*K>5Zcrs۝2S5^oq1\{ِq2mi,h{{ ኉t[>=[kr0Ɇ68'sZa] \߽ @{Tqph3_u>3z sr%4OP`c_kBT N[6˺kҶ gda(mR4fj(Tΰ`ܰ ڐtRQ¸쟵9mabߧECGƸOy剗걚A-C8F3J$-8DIH_І{pf6cE_*TPu$cP+Ɓis%WP Ql`.5ELqtF:.DJsAzZoMU Bq" iќ Ó[2|*0^wIR*DB)sT'Z\'mK'*?`J=¡T-bL~8}A05)Fk%ra a2 n|~A: (u ;Hk'5Skd@DUjkp4UMh\L`σGr8 DHJm L'IA#cĐ)xw7{)&&H9i!"NC7rX(TNXo촅\hS2gJͩ+8Ωi.B@{6x0Q'^7L+Q޹`v] _ ^kgmM0 tlޭBT!\'3C1fdV Na"dUVZ )䯗lo>xfŗmq,,WT7&#W0xp,9 4ID(0&DTHɪ{Tޤ'L”V6aJ%mEHgTr$TZ3GI]KPˑ:aH4HIAj^U L rdeB'qYwSh?Y8e/%fС)Gh,TLI+"f JU^K" G*dX2mUέmUڨ84O)=Ꜳ)>dTSsœ(lJkrqʼkQمhOg AE,=*tfbg[W\{Z"V{trfCKf*0(?``.P__X"dW 5(&xoY VHԖIc#f(urk` &8/ DA$6 C`^p&٦Ǘ$]i uo9->`ε;4Wg7 c٢Z$^Bwl!'B~ =?&bDJY Y4hd*z񮶾~4ci O˘f;# 'O>jx %-N`DFLrQ3P/)$'I,<+ f\ ty]}gwBɥdi4(,roZN9״WD<[,Ť z\t! Y۫%$CT俜+2ʮ$#%Ey`ok#@ZaʹB9<_Zdy=XU|(nr{p#h$̝ &V8 y@9@@E\k {)W&7[wtuHtљ69pĵLW;eeML> N ;,` 4ao&0gpn=#ː$ XQLR?lK8/o 8bH!-Ө8ƪN~WA ]: m{Q`Jex0[\'ovms]IUOc tPrWi.!-ċ,ط+RȵFRT"?I0>W΃}ʓ(sf>;HXFJ,?O{h$+=py ʰ2JpnO蕀ފ>5ŲzkEhqoHϯ5t,px'FghzJk)))||ˑjUlpN3fM# WeY"4khЙ+Ab8^)[^koY+/Th.ҷz?NwHz ֿ+EˬrTvEuGSD (E7SI(p>7*Lue7I=vo_F?W`wTb" \m Ӕ{*U|©oJ+Z+G`WP o#\{)>{l}Qvf4_kSJm3?[aR4e E;!ѭf~$$Ty# +<3xt,>Q8>Q5 OL*B-(t6rJEƣ+=j"xodžp"ϰ]3G307KB kꢟ%PaoAz$CYT$Cjyx rrmIߒIo)׷ 茿ۏCS7vÕ[ t .ЁB̜oU=N+Q˕'A;hvn9hilt'A.PtD(EUH`z>mPؒ;9-=JiM'3 L pJ /a&ߡe)P=`HqTTbaI+Z!߹ v\icsJ&/]eڦ }ԅ'E3?(ESjm ɂ8j5 Psy @P-0 zysNZLlFpW0Gx+ ڙ;NX9gݝlBTJSrt oV4u@g(NCE;NW[~̕`ՌBX%l<2c5}7iΩx$ Þ)l6B̀z|&rQNVٌݺ( -h7c#eUk1̲&"0xskaAXwܴɇ21DCK8xSIצͰóW b lA"^vh型 ~HȠ㖰MN%YY&Ol1pHQ):idsذGE/hQl-"%Ă?M7^ 06x5*?r0Ej<-lM+1/ ŦL&!5ŜC?՚dڴ[z4cU ]XĶr2,mdy"Tׂ|F s1bB5Q& Sr_Q;K'"nc9;5@,P~ yeM` -W f1qҺ"W6􅠎x=Af羰; XۧfS Lf *gLY[i!(r3t drAjJ#6@Cx n.AM+OLѵ$.s_BIQC1xls~L<gz _j(p4\,zpffa m9ފB , -J,9V:B##zUԩ2ҨJ]m}l.3,)<ڞ |2`c΃ٵ*J 4£:ͪr k9vl֝_V$s)믠Q?uNss-Iw>:4 Hs$hCSjքswQ ~D=} wj?{:R4 .EZQꏊ/S)4pM3gf lǼ0q) iPeዝ==`<9wkrBC6x ց5&A]4nid([hۦ}mbq'ENqjк|1oɲL/ܖcqMDfzGFiMWXfV K)1 5ف?;'ĵ]|谬 0>R[mv*E-*Al`;)NhV;ooD&'#[VY[a֭- g X /r?_Nݙ_+Po[SMH&)!z";Jnbb[K@?@8MقNQ_H\z E| .xJSK-p Fz$L zU>%=)fagpepw:ϰj D?3/*y]>fVmPg؏h t|}[~%|iе)13r7qM̤~u(tq6˨J ٻ4І)QDFڟN]Jx+' xY.6n=ey? uj݉O!Ս@'8J7/jM3PXI¹!]J: KQa;gt۴pEd>{ALG*JtJ'ěB}<t''_݁-n,J$FB')1|Euvל V+mL4S[' rLW `zkyQyt 0[bq7{\~s ^|K7G*82jCl  u4%I XCƮ4!w/v`ݳW<{K;k}1&ȣ?+=\ )yt;j̽+] | Nmo?E5kNo wCA~_Vk% :i K{ Z!TdwQXfB Zχ7efq7B=#WBʼn֡tYd3f]h_Q"5޺-j 5o$K݋Kៗfh8㗁zX ֶ4#+OcތR*A$ &PHP)=4s]U}wJAvʡCi,-"2ԫUqY1"+MK?:kV-$ˉ]X ӊFޓ\Pi$v\߁:{1 aNQM-j@ %T٤˖6l ,9T2RR+ Kݥ5UhRUhbF %uDrNۉō7Kef. ]*|>~mYSD<&k):GhIP(#UOH:࿗UV)DtBȏb:4F :ѕyiY.^ `ZmCy :6Jd%-AA黥xnܱiqR1ԞM&H/svz{x!pAIAlLcWǸ ɚJʑN昝l*,3r_IZ><'`YuӮJ4+ M0r#K+Ṽ,us>"Dhݍ8gvZXRhs0AJGd6)S6ԟgd=[{!/pjNaQ ( }poύ l7CliY? b*91=ˑC6MlɥUv\gwGRuRqpc+OKtfi?dCoN3-CߦI;y2_c8W<'·k\} ͫX!b+Dgmy-SU#]reQ4*cLE;s+[V,G/^|GPBΡ_8DUfHBt~?u#gӵ)@T`" >c/~ c؜8f>&g@W*z,q[\~ls*ON6ӷu R 0a,Y(hU&tl`Ni[,zS8!-2E9=u0{̰JjxH X"2bZs2l PV.? DHKsPT u_\GHow`0fjV6&QS. v$hn4yQ%['{#66xƒD >N^IaX!3[*p>"s65ԂR\Q%W\kԸ"Z O $@l LӒ]Qa-#_4= b/dɧ~Gb܋1yE\"\0(0feJN%I6ov5wуnH Š;ILFC&JO~kg+h?P*_>w=C3G@:ٴOa>! Tc%Ӹ,P)ޞDfZ* ;iQ%7?mbGv`5LW@DĖ9 U󢃤u b$rllipQ4.()dٳyl (eUE_:4Iա+H} iv}ߝ;)ʊ-!W؆-}T~JmM1HIT q9a%NgGl'l?7!,>\kR S@up4|iô {/ !)k=W=i;vĩb$vbx &e9Zb٪jR>i-:xMwεޠ~eJJІQzXİ3\յOyR(z\xԄӒQÅ]?RRV4s3'%irxcUλW [w :_fԇǠҔ`FPxyU*ܴ,U^[='[vہ^r!?l]S߱4MC˨xѻH` ᘴ[+6q, ÒCKtG௭wN,\~,qj,(m^]lz-unfA"e|AfL^RNL4 q2'_5LzJ[7u,F:$]hBW)56 t/ @p vIk=cx"-゚pm#NJ0g{uw%@WI jǜjL).'Qiqw5`ㆹkNfg^yw,`D$#Xo'QAC(iނ}āXbmmWc[ʸRE-6."A(IQ4(Ol%l(:QfiTD?q̉Ka|(\~|_j||]}}OH_ylPt@Hpa' >+c(f@6W_2V(?Z[0 jy5Nք5hn1A >3]EW-Qp_yаX Ž[SxǬD4W^ 3;jbB*pd7*h̰lv0LMך>PRjo\ A^EBDQ x,l^P:WcATﷇ3cm2,MӾA,MP[感}|Tt)4t( }@Uf|#WC$Ŧyc;hն(DC6Fn8Kagl$ZNH"|e]i ОHG3s, 2L2AǤL]mT +QqS4zIo\KnZ*7 q Y.{O颟XH :N~\ In&"M!/*#h^ܪ O cs ~8\V9}J"LX߬AsVl'Kk2\74vQG0;& Lϕ 0 #pi&U%٥5Oҍ@+_8a~bjY*q_ ~u16<[ej~V.ïfςFZ{ĦWPS%O z SRg;,kQ"/7P{gڄ{0Y-^/+6Xwr8 P06mDŽNS^6x# 9 0LO稘]0O6BECU-[ C>V|N1?Fap&@40~ !NOA"nrJGfRw*tl*ujrlBƃY[%дY{ \qq@(JFNG2 f~&LJR'zx"h.Eҙ5W2tkLZ' SaI_BkQc&$z@dlH7[x=_Υ0)jy8%=8) <@A|'h>Ie3ԗj94q?}dҙ%~dB&bˮ_Ldٍ-QeX!H}2??ypb0\^87r Z+RqcRa%וCA¦huW7Y*a"S`c b0+¹MMTEuȪE Нl#$m+ΊcŸ\麲Vo*ڣqsAϡ-$[ڣYb)ֆbwfNTmH҄(PRDB)sJt)ƻN $RcP拷s|k})'[xyiFj$\0]u_f1#)^ҾS$a6B0򉺳Yͨ-2R_Hq>)5( X@C+CU\^B(Z&ժ"ip%[cSNu 80BJhVpUo~`NOk7h=SK~([ݺ "_wn 0?aAhmwU%RKWgn*MyWUB喫?x$iD7{^͍i<Зmv=L-^^-3emGDBW֬pKfQW8EɣL>ܠki{xqwfHB"BI E?zb0 FRۜ|1XYS)kHX2VSjӷ2K==iRvR/ZrRߗL2㯾+mR<* TH<a(Ŋ:u~4sfDOP$|:/ 27Fm'/k7y$z y\,R}d03SFZo%nZŠѱVW;`Xw dXDٙr&q&f֞y:aotKvyRJj6ˊqS6e?B6GL*bpn'+绕類dsS?fݻܸcsίѤ ?-_HyJQH.1\,FA9]ZTuAknݏ | >rm65 ->RemE=h-V2-4+ =VV>u!maz);$!W n_7/iDSj2S4UԒa)ag#dpeo7mmv~e%J}h3) cRUdՉئ;䷅ip] uezuTԑ71&MNrDƿE@Y$Dc͆ 2iz&WE=g wY+(0AtSNX; 0}mwFU)UuC; jXпO nMEPTa KL5w;2 inXpl)lJaGK^t-v;=٢u$͗>O̷JT;Esigt- @<ðO<{U_ӵp4'+#0qpPey޳IJBGWr|0 5ҡ̎#OB ɬg/N34g`2BM=yx:܋:zX!Pl.Hq 4CCX-zeCQkν$L͜5_d MA)G`rkjŠort\çoB8NYe=>AoW g٦sBHIs3:%E0˾d獭)ِ&㍔ѥborV@]muBqH9=KbWzHrmGbo^k;Ϸ Xu]h6Mqp2@!ee BbC}8NBx&_bqh֎BNw+)ףVM Y%FO"rp16'& ζ7'v G{a" &Fm<z o96<6M0AN[G4wAd_kLy1R(a4gK%E 7G-DOduh0jĆzڗ4݌;yi}#8GoZ IS(>sQꑲ,.D7aG%N֮wmI %Vأ;Z˔8wOcE\h=+?N{ZEq@D40ÎFq݈$O5u 8lwsș"sڪӲydtífO<$}Y% .HWnh sLb)FogBBF&%53!\3>؜N>Pocn]I۱fn=5?W|7>ʺ"y1ɍM/$kgS4!Zv3vB*o:GKţ/J/dDL/c UON}TfV߿-ˮsv54>AE,9D޵dž^Z0]2X݉6硷΅k3΃ b\;F^6:sdH׿r8f1ځ(õl 6E[ (U^b(vY0XlP9}c܌;5_-^DV B;cO va!lR$/`(s¹GpΤfS_aRC +3Ifmqc[ڵUz"ItI>++ǯ͐nbIy{|VXH'n=W%S ɪ=:,Ɯ8&VL\!6[i.r>h^$cil #$D@Ep6TᴟM @K,{)wd9r- ؤ<%ҵXԸ$i#N$^t-ppy`ؽG_f٢bA0N-5rWۿ`N2QύB6SvSȲ#l ^uF "I !޽#9Ʉ-jxi+g1 fq@m TM7BWf&Ů>ڪyܷoC^lHA1ɷAc*tHN+}t Gc(mcpm%pڈZ#de$@RD)˱f&-10I+N[N}t/yfg9<*Ѱ>w&eè:oOZبN.-ԞW-~$&¥ SCHH? lCث).CC0F!Z84CXs\\0‚]i HW)1y~mГN,q13? vֳ5s簰(;SXP5^12J>EeҡKu#p.+ 27zߎcZGCk | Mb%$?LE _t烻eE%ނ@i7Z { ]xl/X*̉XK^ J M&k?na1c> +=SKĕ-z6< *eisyKjֶ?QlOmK!lɁX$l,'Q <t?v;24{IR8x]f5{tjQ*x\9;DE_QUҗ=+AX]b a<~ý+fߴ{erTnH?P[O1N5$ _m`$hqs `a RzazL |,YQCl _=}hH@(RxOEJPCy-=?_T"̳Jk|[In_JşC6S!W1 jӺ"2L/;-_,Vg ']HUoF6]p_ R5 oŘx([!:wxC9CNGm%^E4,j]mf0alΫp;7_RD%W8IgqY۶ЗȸY 2L 6N#oѷ|ts^tV 8"nh(uVSo^#FH-ZqH]:rGXr(JgFv%w<(u͋|gDhDt`e Q2zЪW;3L@*hULR= m1p6yBx0\gum@t~/">_) s'%QڐSCWo䮅KTfպr rJ^s}`6`S;a wCr<'Ugbqh8w~zu4o ?Sn@vZ ԓ<#鋦0M]'[>=)qgv#%eV]I1NVҡׯ\_hBdǪT;jq_۲;, $rX@Qa<^;ue)6#cX;X<Q X!l[ZaGNEg!yǪw*] h(.!R܁ [!+[ PF)Bsձ%xЙ 9*}p}2z*0jJU5B@I b)Rk[XB aD?_$lqxfS!+TU]<(dxOd8@8E3oW@R*%~п=/PG*R5^ \:cblj6&b(xd-dU,H>| vR;:h2 $z徨x$6$Xw5-(XMT ʡ}vl˶1 FWcv( [:1 hL;{9Beȣa$ 1Z0 niK YbٶM(Mf`[[ u:}Tf@'YMg.K:o2JnvǻA8 1*{Ue/ =B/ ?Y(og(m E/ c *cX]\"n@$ulguާD!Ff3ǯ3 :bUΔ 촨F>sQ27HP;_,xwVMC}{2  J]`+*KxUXP+ ٤~^8#sJe y#]k@䴣`v[d1Tl}s&},:S︴1{>EG4'k#$F+>VΖ#20>P !Cr#ޅ8Bv ,es-iKÎ2]y ZajqYVȝ({uM:ST{-^Kx5x{rFW[1ޯX*^8݁{j{wg8d6c4 V Dc^cf-o2vhf6>5~*cI8x`lր)W;v@7韝vJgH^ Ů#0,̦p}*+ˈBԌI9Vױ9śaHz2%`09 2hTW%\qsF5* <ƱʒRh4ZD3=Cym`=r?Fq tN6,a.NHx$6~N] n#⍾2TFC$œ%l=KӆkN[:YC"Zjd[%HW(4Gp!BG5S7#a`qc#*`(9TIAv"`AeuZʣo(Sl! UtAٝ$> ~ '݆T;TE;)%# v Y+3$!͍iI%B$q/QX~ƺ^ݯwI4X@"kMl]^剀q%*.gd\_ޓ]l5f AƖ ogtMᶷQ@Dde1 J&m:-g@L5Ul>";%Lb~4VQTqKtn=暁^p51自 3{kߴ!Jpg7(?W[Hh S͝E [ :?<?XsjHw95ewnq5*pҘ]A"._oyfw%$B2Ҷ.wxdvEYA*LMxz:nC|hMbNu7fB M$}".g91Gt~eWZ>-3LtrܗuD73;$u1Ck^)Q3vNإjGmiisDs,3?+Acks*Ͱll6Ș޺wޭ.&V9ppo/SDC٬*V?fLJMMnM8Fwc|voܐ(i|P%08#0Se4,TK*&Y;Ӭ ų}9/ J' (esĪӤz2+Lb2Fh[{bLe笠~`[1~a&'i.$drWΎej4tJSGCռUZ x7&}P@yk/;O?_.`?{c+w B~FY^P?>6Xt4bIwҬ3Y6';2 X`&ㅬK8G}Y_'DK]_=}!$GHzlVѬP{ח%B)~ b]˟,R45|,Ûn`W2M*d .-z >ߥ!p'όW,}3\B#XE(}y¢U"LCO j03"4)bCh}\Kp\ϔSv\Ⳏ!{g *gt\C@q/3Q͕xa,rt3IKԖ8RT_ÜͽKDMe*ķbH6e]|^]#+ٓ3ee퀹T^|IM!{M(~ϴ,b0c]m|QmzYܨWx>kryb!].Sz .H0u8EΝ7 ~ \GuW?rO1+ˡH`xes2i_ڰo@K4[8{Viަ b&L: oG5Б * ]Bc$4bu h gF M`&.b C9 ##O=n.){Uz0fWMNoYDӪ?}O\+^ /WNC#uN* W ~SYg{Q3||.qհ8-巘nY5 WNiEN>k'lI">mKeC`>f d57ɢbNKw8V^_";G8WXĪj4^ynOwD wג$/UwnY!E@v7}/ "zlWߔʱ7i8/gNOSZ◇w$޷9ʱ^y'ﹽXG v9a듼29:$!0Do3r V%R˦=IlER)Uܬ(C63VJV%%Qu#-nAHmm0E"KxB8,&a DXJ "fg L%Ȭx'QR)^RƝn-5s\O,q;qèX[J{UYjӕus\|qԧndJ$sb'M.mAX o;:,f?kk=nSI<=٢Q7i$k&}r18V52-tt*ymUS.lQƇtw*v^4 `KA-õ`b kuxmb<|.x|'?p ͷtԐ'L)XjY>8 MHqM BWrv̎#~_ P*:s&x(ax'X')z(M9X.%ʷ7b'[Goϐ`F.:m=, , ϽBXMN@/lS2 ^ɉ[t2?̈V1̃ koIv%Y i8cKۡM(}7ebVv@&yEqXzcU?/qQ:)S6?EhZU6DZ&^F)ϯIo/Xkq7%Tl-{NM,.'9okA!^Q| [~VTo)כ@9AWP 惥nHٔWLR LC}>Kkgf9s$< ̕jiPJP;Y8g ȅB C|#%sf|/#^%_9ɼ>>%5 |T=n~/Hyǫ^S0ɥ؃S z\JxF*ஙFQHM/? 1KZ)̔]9E^ lyf//"<[ˀ1By8|!t ~mG,w?ѣ;7zM`&&*¨5Jc$J@|YϲǪ۳bY6i淖')k).SF 5m4W1`<` TÛ9a?1FaޖpBX 8[N\_91!B_PCߏQwb-Gӽ,d|J`3"䒿Y{`7'|MC#Ns|uXw{5gq; n1924Mi|G[dq] ɇQl!\KR~.ʡix,FM7 C5]@[*U4 ضXd/~7ʁz8.UX]3f۔5`oP{/vd47&QOtBzLC␐'7cÀgmAvZ#X~Wyjj^4[#Hj)U!4Fn,FCoj.|ϯv0r\;?Rtm#vr˚]Zd`EUsv`|ˆ8UCWM֔؋~G;1tk"QFٕIp5eKnլWHH ]>XX_yIgwrB8#ʢqPoUDie3%7ʓ9#K /:ܔrՎ$uGpufCu~fdڰҗQk ƁY)bC\=Io~ _eO {6\/XА0ZYdD]^<ѣo$jW=60#Xd?2B؃^cW.d?EvL!VNjfԘ{*ϰb}Jug %pTl$&Lu\189fADB2 Ȭ2kng3qY)\NMKdz{2[Q7rY5q;xNvNM])(CK JYr :Dz[9Sy?{^f۾ fYꊦiTBFU5'W@D.T,'%ѿ%r~Kk>Z!LDW?j,2~a+ GUN&r/eKDИ uZzƝAh;OM9Z0W* g.p$8ԇgê8ts> AIAlLsqٶ(EQGvP#Ǜ W4]ĜpJm8`3dKnJ㴅8  F,r8 KS`SSIggtT.-\)j4!{M g!mG+/]^"F"59 !q oOObhY̔jOWSЧ`7[~tbJ[׼#ZG_XO{a['qvT{FkJe6Ėyy1nLXIMU5b]'. ,/3jcիŘVCp"+dȉ"uŁ1C\me.+$`N͖; ˦'w&O+.u<jxLD%S|sCLHբ 6l#JjP+4JSޠXIUN‹X)$ߣQmBS !d3 *7rڂZʂ{L4R% FcjcKƜ)>&{*C>e<$%1 .o#S?dmׄF;u}R608n+5j劶F ڦ99N䡡i C<(mTԂ:ֿru^A 1Sxeq1sR@4$J 1v+x\ 4&%C`xh'Z֓3x{pYb kfx݊rd-"K5zIHm<67,murg~ܱ@0y܅-q~w(Wgf_@blz#psx vGon 2(h̏R FvIZ-mX1MWa󟠠T'dmdfEDk$ ;q u"J\8`;Yb2xEwx ["$H>cSd1&ʹH:|UVr]|+̷,7~ cR9}6< @b25a~#'*(?-!saw뛄)Zϸ Zԑ" 9JDd6R30*ށ.x2c s[#M"f c9)tfh2h0dQ z?7&  h46ݗE_C:w i ϑc=RȄ`>tYvojtv\ {ravC0Rڂ2zll]}@UۛЯaz-Tpw%2ʷͅT"CQhszG|dB̏6 /!9hU7gSKnwP82\ R}W1$w9ľ { rΖ֍`He)@_JS۷ Xk7ObwdX :N:djD3*u %,mX-Ao܃(?mY+x˦ҲDvdHvK^Lu~d>tVNl˦eKFZI:v\ p 0^ۯ:lxr9m/Cx+Qj_;7I #wgLyJP"NL"̆:MQǼm/HXw>3w)*b̔ (!5#x # G(œ̓yƲ6г\ҌUy8dfM~|ظyn7@=5EjC:%%ƽGʿ'7g(f|ಿ{4[T OfW|2A0Ţ.nOفQbw~?5@b=0?GNGBh3\5'D61 "C *;;Gغ=2/6ѫNJ[4VHwY('znDv,G}ե1X_>&q=*>Y$\ŶqGyKr kql4~Ǎ#i;myMZ֗WOѓOu^U44e¢x S7ѻ hz IO=67%K8ֈTgkO_r wZ0"W>_Phl]3wk]l{o&TS̼ 0Πf ^; zL2FMo`sɇLF=:黱1n) p^X  2td"유!cqX(dtXފ.y[쩍`Nj&)^^0WҠrP`6a K!ڪ /0;UG@x`]P^0zU .*3V>:Z7=>ݿFV5wn*b$W(aVlY]o+``ܡ6Mmv-S32Yt2uZfY x#vHaQTedrkmܸꯌ44NhN~ИV[c!PTPɴ"|jH%D u>jB%)T yHC_,.t6J:tVMlI-oA(2!4B5_OwܒIieɶT*CtAW=3ye5o|[dbJWճY+rnW~wެDweҦke{I:׶>oNU@5S ` a9\JV/5.F! " qa-e "[9qNt ۨz﫲eO z;t 9e[`!%Ibg0:=hd*(ޖYog~f7|n݃ "v94(" p~ 0VzU-"P>J\p2%&@.\Y˳~K`m&9- OpTSr}w~oːFGpE_-ĉ^ i_~e|X/^xVKU@19U^tUD%{J0,mDf5<2N"t뾬Z}KZ/La f6c>{+E+^V:ָ\=B|dn6u@@Q Tfa,/4dL*N~BPvBN\.PPɅ靝6.Gđ aqٔ]+i>{ḬH SYbX@L9fz]XR~^/w*'fyv)NE14oN>Nk͚|^$y_GnY^n  84kJ$]Oqnbx %{vƸ_e2(dѥ,{1^9é~Gi?AA9F|g˜KYr"hN&Y CнBW8W _5p?dWgB|!ʇ0оG` G'U!hQkPtK~2wzU99"Z ]kVSHA}plnJ4EV4ևh@3R%$H;"kA|C,_$d` ն )N-g)Wr:5*L Yo_ݹq%tA|MYX,\]Y*+ܯe$Wn$MZs,3L]&ucIBfnLBki9vhΪxCEzZ`܍43~Ml,٪Jh|9UodէV>;>Æ\-1 6@Aޝdě_0sADBNjmrG_}̵Δc@WrM޶1Qr2YHuޏlpkqnL~ 5ʗء5`( EUyRigQZJc%Hsi2U:"MM EH7y93`Aq-xT cc11nMB<%4yeSkJOV$>f:t,LH h@͇.^CްuΔ)>Tʝщ-YCUي){W-uSV F CBAKAA”Nmвr Sm3*V*Q!䲀k P-8 C^t(]NLO.n{yrw5!zAƹF֥.G˝kX[\]Z:9V; t$ QmSn*8ꢩqIǽQK<>Voi5忙sE+7EQ5?%_ɩA{c5J&~-^>wrsR+l7U#_n%(l6kj8d+PE$Z~5u &p$x`'M\ 1L^Gľ? t#lugUQpơb"USQ8(l3Yol.g.7C`Q&kRP=.Ne> ]obY#dNdkA0II~yMYޝc8 ">BݳN[=6좕ED*^!s_@0#GkDsu;z6C̹UYs5S# ;UXP7 R;o>e=-ZWfZ| WKzlÅbvKow272\@v}z%U\] kĽ!'q PrH/W z<92)Lg*R+̗V|@qe2aYKD0Se;ɮκƇN6fԌ.8qh-9|=N}g{NW)E[DsFl:e$ -/wtDry H9}pf]7`~|PȌ'Z?1̖%w[~@:6fO52)f<;Х@<2lA.@`cqnx1|AE,5Tc{d`aXXj6ᗒ?zy=FPM?a[s]0mϝ<91dL*Z LZ(я՞=1_ &%[wW `tٚ. kLb*8~+/#FxKOOEꝇ'3f[}ء󲜏h t߬}E8\)8qjqޥ945d61K+.p#MMQTz.>1GtiJۆh]b: :mA|0Q&^2"Kz/.:6^ +h:mPS95x8Ub dh׌gb[+"ҙ{g4dV iZ1Q2A5a5ʹ {7`Մ=!b]q2?ih _sE]ȥ}=dqjrF1Q%%ϗH--yp20;+< D.{ ,7HjD iє hn:ҫKTfGmVsnHW+VlN>Y6[Ώ  {35=ߊ<@~*sbu'װq B"dc05u86!+a9Zܟwv}6ڝO)Lu)8huOu(~ɸqk߯ap1KߒdN6Mhr ?Wݡ"RrA w:V*71ٔ3[d Z)L0/SpAR^NQPdSvGI9JRܷD/CQKܒ׮ c~c'l8hveקgƁ ],ӶGz-z|kpvfcՅMIK,S~C*&fym^%En#%_p=[ݭDVD _.ߪjl ( ho@j.o%X|-޶ իb䬻Wܒ.WW4}=iEpWe=i-AEYmA* w[+ĵU>("$Cq%0 y$(8Z i0egu4D6m ݃ڂWeqQE^8pER&)R4(["׳cre:]caLR4^ ,DGąyE(Svz ӳ<۶=j: MÏSbyʸؽ6\Rj:!AllՔ.fn 6g` u8~D%*ݖ C< *p%`E \CN0;A p鬇}۹L(&fi1CxU0jpD]tہ?K|B)RO s^٤"*A EN /zqg0KCBJ.Rf*ʿ?p j p@ OckKAh'=N#\&LH aXhO4@9M! ;m}Kd>,T͢3c\Ope#cWLvkSFcf zlKF5МJ wbA^J ؉ !kCDjO$+O*ЧC @ODӑf(cD'&]=EAAYȚ*YWbtíjGW|2dr'q|?]UW(pAt#bͨ>aE+^JnYn S>"_Ar=iCW٠[ltUS%*uʨY&Bl"<372surKʑ nn!u$XT:XDոyZ-? ˣ ;p&I#hS f@j;FLiE4uLu#JУWAV^NMYPA|FcFSs\=H]TJ鰪K*Wb0x?fA"gUz*ңiQ}r0][h2^p-t(m՟X5}{կgw N1U! ' r }X2PȯloM{]gJO_`н{ď#?h ) k'ߍF$_6_?eT 9( p{!O"`ùO2]taZ0ri%rjEs72Ǧ֖;"ŇQbg(r/ȏ{ihdnGJg2?%7+iej0@$&R W L}Aϖ;r11`@Y7S'}śs5И~BjqlJ2^]b,ZmHzDHBUF :vco-Dp ^;r竝sE+3M*6(MLK }O3щb9wX0_2V5$\S5* g$$4/t^]^lR'wYm(9l![DN`SKXyW{GB]Z=3ލIf"PpǶٺ+ BGO?TboA[CmaxZEUgv{3ޙOHo/;${8i#oZz7L{ z(3Mm9ܙ>LA.3Qqn\MAxxEϤb'U$ik?5*%14Eg2(iMN#'gq`e&v0=9΀BJ*aTn#ud%woB7_jA tFA^H]IlFv *THR/(2LPbzM#_X-Zwo`(nClw YC(f&>f)wbae,,xǾtB !18%bFk`og6HVE՝P.#(9g \ZרԀ.%_n6԰lS;YtFN=~y4#<[Lh{*4r|VMHu _|'0iGZ2yG+޸$ҽapaub}Wy"d3X~>ϴ$M/qF-ux8BqF)[}DsADZ<O"+ OPvR4iu̝: +@Ӵ_xT$lU,S{Ӈ/spUM(c=1L?*zZOC!t;m3 d;#bW8jfdlҧ%Q>o+՚pm'twW}HzMEh$? _;$7z&@{GO@ȨPolI=݂sHQ;2<];(zR滬˓U'󮞆>ݨ7?߷c+bY5,sЀl <x|s ӣ`IO21S4[k]A40̜Qֺp:Z(Rnw4>7N@hq[_AiRASoB@Tה%yF1(ly g^xq:$]i/\ӃZ䀞.ﮂ8,C'O&/ a"]=DFPhd7:䴹dqԹt JF˟yow؛rXs5:]=šh-1M1>S9a1U7l :b rӈH5qs5L n " =;Ƥ񽗺Vwtӄ!1 0| IJmc6`ifHV=Bg+reU/ꡃ_1f%'lFrqv- Itp"o#/&p"l&6ʀn"x ʗU1O#d`ɫ˫ @U'D 6x̥cRZuYd:J291 H<' 2Il])|w0(H9H[9Am``G%ueD38iT⟴g*0mnG3ŃJ8ӑvr dW'jXrcV@_+H.t5f.>m=yJ1_zD7j* {9}Y)oFc /jA$I'a.WT|~8B+P7ig~5XAnsk s3C ťH'~h۬;=;I+ςMDATzaz 7،UKT^s@߭M@U%J֟'>PvaHϪxP=HN9UFraE]1]x|Ȉw1bFLϵ+ΤZ04XRv 3T" %>qI#o H"X'卛:7F3sPmg@8;׉rQ&R, L1䊮,#>4 ʆr¸l R3K6 d Ǟf%;Y˿8K,r>cgs?yEGZG$^*1F:u䈫nܶ"ҟ0o5#z ֕t }c( cn)'t"m޽PU>> ]Œ : x@`8vʱ*xN1 /c j.9@3;C'hK?E%0hZ[O<'Ia 0-#f]m;v1 ##cp [@d6lX,MLVbz7ZJp6 0~g7H~/J @u[H&!컽𥲾u[SjĿW%ELNhm}UCAavBzق~f{2fp)77slƙԡIivO.rfvOu'Y=HY _U;9͙"b@H/Y3N 2rb|U߇y}6?ѯҤ(̈́w# #y]5Sܓ$3ch*2') GonU kenңp2_,xՆ:-"QAass4#LPdx|C)"tvWw/ T˚iAL -r$'7MH{9Y|4JLq0u%]qCJe_Czp^WVS%|*p/;qL~=E_g\EڠN~g\LR B7h|N۬W3&,Dˬq`y;nfyPT͠%lmin!Kة 8sw7 ie[ۻ*A` nz)aAKƩ-)X$)`S_ycW,B؁%]fcB4[)VCR8j Ami}*1 gRDWZ8~BhÖUhil'JO"f'kTݣ||"a|(-KHIЀ8 NeݽLZ/zN}I~Fv0i(Y*3E`oA$Ak 4XLU$.wx<2'pdNNZXToz7[P8+؇jȄ&4ڨ} _&T-O~W_43s@MDLqݬ]s)'pҎ% ݐRG^fԡώWgEVF1޹vdq:@IF&q69! LMeQu U/rKy~"*^e֨GXQ-]t k>2^%:7M2خڿ>iB9C' SV><qrh^^wfLd5)[җF$!jMi4M|D roya^_Hߒ>FfO!yN[BGtF*<#w 3 ,cHJIVX_5 ^A4IAlL[Y%Cv`_-%_lֲg%rQ*:yF{>ڪةs#g@Rq'ó1zj^SNGBuLd<>^\l', *IL-f BQpcv>K;41!3_(11ySˮ59wTmq) ٭WAf |!Uv&b\!Mc)$ miF(98Eږ V|7iD֐:ogN0}9*Trl); 4ARjnT$@3!J;N:GA L22 .%0=0]x}fG9 DR/靅W2]gs#sc{.BVc>_\:8:.l :INvOb-}=A\uR앪F^ݖ'3ZD0jj V}`'iJ݊3޲y5%tA<5wu9J)'x}>+2t66_)ImGkX%X K#u/ނD`dHUd[ቁgmض%e3o3{ۯ~W/f1.KsԝW6+u^NHi"—(؍}TG) 9X[nHLU 4p=lUjȦ^=EOQvT)m di2/Ur[WQT*j]`8}[}NcGdu d̀cښ*ʫ)tRuS|?Wg^c[]b&.-6"U1s~`E>TwIz (ihRGt.:= PYjl`y ([j<^RSlRo> $VCKb{{ IRsXԜ3 Wk#ÀԩglgdGb(?pE9سPn :B;b _*KT,fHL-yz&Y B,kC5kSh4n=ƔjXS0U k@$o+q$l?=_Np̰#(1 o:L֡Jyן_H T=%albp`I䄁]fćWTm űz0(AHu0Wr:HXq%H.5D q6yj[m,IJYuD[m+?~L@Rݱ9~ŢMJK|꣇t@ ~=T8q4;`tgv3i>Tb+Y)pmd+iԣQ"[܀R[@: mC# c=(] zxq!JfS900Oy \fېȟ@h"c[eoQXX=~ߔA׋Ia2N&gId>f&_X፻6)z@/OǢԮ]&?+kJp%3 [I|8S|iߝt(|yB'(oerr՘Q6ln+jt@ؑ A>1U =*X$ #k`l~}Oy#~(j>']~Q^ H4 b B 7 Қp㟴 q$Ąy㖅P?vjrG Ol^W R\ lTiNUXZ Y eW *uM[Ui݃i8][Z dv*F;xOh_-sX0!#$$BzkȨFh'C>(kuxE;jGrY".Qj2r*sL {T(ʃw,qXݬPcWԺ be\9`x;mF=, #o[iߪu޷>h1eb|0kʫ@Bv9fD) [ca`2&ȊQ_i!2%wz p˶u Õgq|pvD,3rƎna[f3eOsK9}^ /o>Ec&:(JzJy(2VEG 5w8&diN\' بh&b=Wk-19ħHNd#({m7I+e[eԏo᩟ps,$MN+C$z.?-hTVe,54޲T/A@\WjnƤ֕=L#cpIIB`sI$:|>pIgʴޘ[_=S2|fkx&Quh"#dDzVR 1G&QH&_#(,cۉe>d:Ǝ?VEw7yb;Z=s-×? {xsnqLbÝ~^ݹ|)ھU:|OTUry U+u=ȘM^xxNUmSZ ? k#!)j#]aJVƑh1Nc*ޕ ;Z.w9R?}CMe?~ wBp`@K! TF E@zI,c z,&'mv5A4{]st@ROP,vKg2B]-;5 ->AZf).x]D٩#NoQ:ثKMyQPOQ/Hj #BI[@eWw8RGd,)/.&,96N>6N2pߦ.L6$<\*K#ХJ/A6|$yӚ(P%)klEǘ(ف%pg,:p_ 44{?> [!+!T6W"q5 ےZW!2,YI$GBB6|*rbPrGQ8;e7w7 Q.X&+a|k!/y42aLwz*^J0qㅋF&d$7\@7M!ۅ9&}U) 2F` 8\xQGQĘ0pywaԮ\/y,^}gY^0Gi`^3]i+dkh%Gv IvZ<E(:k}vS(k h*8"1g Bt4htLEF^~F j:M%hƢF]QF6΍~Ν2SW)4$z@n/IH]9-}fa3j1S 6ߴX+|Q[(Od,%R*N !BE?ZN}21 u#9Dmc~I1mx×ڎMEW ~gyM6\<}G}Dj (R;SM$@FI]-nIwki%_]Ln1z8cD;kgLzdo?ʫ~|\gYD!AZU-@VΞuq^(v'G&}dN]Rs.GB{;HTKǥ'_UE'gpN{O5CCzeM4-m,*m_cǼ|Om(#,NX"0 Sya@ M lyvnVlN].,S}GbDb;6? RsU(R`6x`ϨC64.l|b6IXeqpVMR枤Ԛ ܴ:PWjS`qL!p0 zRX.F f~?ϕxbΛ:dRUbOM$E2?R@b^wZzka&PV07$4p{/Q{`䃚,D2g/oHt~m*;! b5Y/ɧC3`U12AT)Z[w m%YIriI/Yp#6  jq?Z3b8}w.do5_L ى,]w5$u$Zԭ~s`?ŷXH05Pܢ"}X#ɧi)?P'^dXZnje- kȟhpH8BfJEY5\zjaI߂P9[(8kh{t-5n.m֚57mMam+f|i2 ǿZ(i,&8[:hc@dg u'rraO*w*~?g)<AHB{ ƫX[U0bO<D:~rLu'^N`Nr+OM&&kK{sQ$w;po=sn*; E[k|9[ۖs: D_[oa+A ұpc1C FΞ3őضJ:O@*|,HGjq@R)Q_ ?h5^M2Wo=tZԹU ϊQ*nm\ӳ&UyD6H r.X0Íēڒvzў%%|Uk$cc7s E&^1GS+jR~@Yv .{< F"C+_^{ԘK-3!Ea&Dffi O*_̦mn:.SÖH]].&h?SX8}Ry}@fL5 `PoF%=9y_;}\p=U;ʣz  7zPquM9 .j`Օ?W%n=wQwAτ. ? :}K!F-hq(Ph\G3\#y2_5yrcpXR [\7n)qWrWr߬+zs~iPA(RT˩Ky%K%ND|UXjhM.OR$|,Gⷿچr8vJ0փ?Uf  ‹3 /Q9);mFVa'wGghSjrHΤ;8{y Y  PewF BU?YQML(@J"no2_廰ײַoiA-?媇]W9S]X g_y ta7,Җ9 _R'ME,uuu 8vUo9D ]$^r ^N(ҐV5I!7|ށiS#a.Q&.IsjAD?Wvw<LeIk7P+ 2nv!JG-3J]QU2:?n`@[0nZfES52gA/Ī~f!N>iߍUQ<DOjU(6]K5UT-Ɓ8 ;F r},ЗG|Lm]2px8I.,O̭k4,GqkvxiӉ:v:R™` C#i;`V{s7K>egZMSl[SCy\HB@ z8'9eK¿0?X2&0lT?3ҩdSGźв4C{PhYP?\78BQOhMybrS1dv0ʘ~(٤MF:Jٖ=xgD]$(wޢ e56_]2i{X\Q)x[ p?`C/:nJJӄ 0vg«kFddnd"kj;D{VTlG5O69V1)ɝJTLT]^^K﮷zksH0iL lhV&+0 hԆcn;SMr߲uݯ=%2 E_A@`&8ae+ [t Lh 3 /kVgb6%p7%W=WRB+uT5c\ʥb]""chC1ΫK잰g[TczX"0ARE,13h/(Nj-kmbj,}n'(zC{63;a$v <(?U+5#.Ȇ7ç]䅠KxqrL40{LNYl]/DߣߚFRmPꐴn?-)EKz4DOH(aΙ|P '5pH\Swrz+7gg!4`Alh-x|ܒ>cZC A1fvyʱCM'%WFP]N8eѸA icG^S%jZٛU4)E 6tki|k<޶^d3D6Gdy\[6uOTJJ®-άm1b-6  h# șn&:$k)4%КhMcN:r6 qD_SZ[aPT(pō:Z=9-BD+as:[JK%|95Ncp_3L:p0y9:76.N} |@~ ? پs!@>vT }vۅ=_ `nQ  e^:B_5S8 8LmWT/禄:D*u;Y"PC2v<<+͏پ ԟs~XPXbrC3V"koAqt%*5N7` u3fqJ)e"gO)PmH A}I0o}rt 6?m3\lDSMc:PBM3$)7l' w$Dq8$l^H Op̆Cؘ`kBcCdCIzbTYjb*blR)aФG uN2 'l޿}B"xuQZaq"VRaXz֛1z%)`L5k;pnvu^VbE豎f<'*w MJ/bG©i%N\ )bb0doGp)+9crJ ¾ھVeH{QhA4NNz9뒁kAVߤSr,ct&ʰHDIF}yA؍B/'>ܞ5+]䯅Ux!;>9a 5n]1r(H`ZY,nMD R?G3[oDwCO! ݬ}:ݫF=>8iY u J;_oAS}PD<1Þ= & /'˘.ZI)dnjnQuPw/5ڡ5. XlMZx;. ,<Z9ޘ1i(.U 0iil i'K*`ŚК xRr9UBU6[2nuVM._Il@v!4ɳT.^AwBr[.$K)5AHrH^KjKY̓fd h糘7egl+fKPTDj.iwgNi4Ł/F ^[patOQrVf{o1(3u5+^cLm4tv,?8k (Yԇ|4hӋswGas`q%8U'd1XW8oee9F$g#$dσ &s'B{v?< `褼wۤ^˔mPT82"PXF?8Zlj8<[`>#77h+_6ЫQp? ]c;'_o)Z( f/DWBT P^;ZN?2sB s 30r uJ\&M܍0TRXxns:JUuP=ᠯ~rL0eh!YA5wjC>]IS.n|V_2TFS5|HL&ZwDݷf 㦤a5-&\TNe7 5aok6 BoV`5.ڧ^Qwl@*ZW.hI.G",XOFlDd0Z3-װ 9!uHjKK*;'ZH)(i LJ:ӵ/*Pظm{frCl#ddr)BcMNJ*; {U5Ia;N%S?Q7ut)UNfܱv=cRl%n]* `c|qٌ:̓WHEPP6ԧICJnƓDe.G}}6%p8Xn=aupM9(N'nȍ TT7 0!ȯՑF+[xbʽv,VHP8;qrjf̞N;ҁa\\n#_FF[]F)@:q~{O&[/Wy{̧J>Ú ~S],iV:VL!,ouRvP Vjj徦]T?b,,y9I zyP=]jh@^S|;Ts("k4f҂M?5 &͍M (KFe)bX`}ފ?Y5X D#{2Ҿ@~8}Zb-Lv\i3cQQ@."W@nWmGCMdh$Ċ/xeuMhӜ@3gq%]N~/ .u4Y/svN,n҅4gd M^km[@P@Vڴ-X&К'N֑E(q\[ށդ ^GݷrNUn0Z s dVgHM)֭"cDŧ/-ߥ j=\K2^j7>J"m|%WH@7PԂLoW~ۓx 8y7ƛzOUa(^?1;<"^ܵlJ /vG\H45Z>}xB"r|n>'*!Xh9j*R=|pi>ʥnOT5{L\5TW1+.s?&A*9_۹/QuzbӲ#ESx+^:]JUv޵۩w+W[Y1"$l9:p,4S!BOߥh@ƨ h ^o dyXoA`VUٟf"ƺ+Ep(#ᕤ5FJl \ psIj<#5 ߏ7ohT#U4+d\e0qsd&9Ǐ#F[6shʌPJ_(̇AcA\ߝMݲqyxcD:@t0k !ܬP8ev{94*v *s]DcJqm+`#~nf牢8Hm$,ϕShz̈́9^{ MM< x+E>f#Nio^c!u)[C#cbJ@och &UH]3)bnsZ _=M93Bn[* vz zc2&*P#1wD/j\)8dGR%"H_`~/IbPgCMZ˵**rͼX$5'޿`ܯHLX%@0t:g+0ثfTA[]p߸|A^rL |z@Grnjء+!S0E<˥ԋx q$n {fߔܱ1Waa$ı}j@49v8"MTDw.2RW6"U%SqW@ ]$uw LdԎ2_V+ L6!1Kk47&7!G_0>9EQA|IA:Kop9%3Ipޘo:q<:.U$5"Tfh"1+6O76rZ<%L˭|a-)kݮ.eihF5Y6#[E[\*T: qtA/*jZ(=NM)l֊z9byэ=_ȗbDaŭП+xؚ ul7?AUs0V{:U2sQ-e*rSj?#udһ< wp]Y_D9?yT'\fyIu`Ik+/:?AԵd22U*|ڳwE4&+gL[p(MqBC.gzْTEvX&.% Z|] Y^/0xד\`:>2쨡%l|;ۂxօz)JZz׈>0hHR|tUſ|aY$~zwm|*R41ke8.a;Hy zJ"Jwx]pLKۍ"C+ +B%],hjgZ0B9LL{Z,uKxA׍T`ۗ }i@]cȗ;v~>L+uIVye'e.ԌXR$Ȩj" }(\Ò[դ}P.E}( pnfD?͓ؼV_BLm}#Z_=lUI!#BwUj_aaլE/M;7u͸7هPg>:8 ,j{ԜF7ڲ;6IT_TX^T([Y:W}J|۾q3MP&IrF)ˆ9,?.$lu?!}!75IJ'g?/f6 (VGhF7}Өv2P7 ">;+fGbMmRG8k&Yl`0rha/=(K(4=6V ziaLzKDN>~+*Z6'ڋ}**1-pmȲ1~s<~p՚b ^j^QIX테֠X`oɄ ԣe~ݭPd rFdl nPZ"oy)ʼnȅܑ? p?L֕4 Gu靾tFGxa Zux90A|5ׇ>S>GP9רGk /_}FiBa6E#\vf3s{~ȑR>Ɗyo. ^WY?Ɯ U|݈-TCĒxd[I+V47?,(. F%:Hg9sp(3d v[@Œne5H/5F}>_~d׶j^5/ ,g6)l䒼dez,EnIWt8* .70^E.pL{4#zOp0TOoV^vo, IVbVS'L4 k<Ǵ/rk3,E+l\q"AM ,.,'_ F *AU+|<=!Θ /_<`1QkfVFu|W{ee-˶KŮt-D`-@N2h>5}G օ` U[6j /K~e V7HaL &gZeC%yAe9"\SwD^oԉ7<%,!:hK~ۀ,e涍ckI>m33~hx}5)Itrp+H^('9w>?u%Nz}ẲOSZgJ8 ]7`8^fj!]iEUAأxĂ-imŴ,D9v0JI "reY}|IK\׷0/t9X' mʑr&b%v2IL҈5% ~L\RĬ }.DfJK]=|:ROz H֣ѷH%!|8dp$^}L!>|].wK&dQ,q>BecjPk-٘ПGE;ߊ\z ]hMy)J7ր}C@3^iFӴ sjC \[,k%b>۾,W/Ѡe*;6U!W#XB5O/+ąT_U_ƕ4Rf_b=+#B~ ?j$Erz(eqv@Z-ӳ6{:UKͮ_XaLK3 < F!}{"-rp 2R8xJm;\u,˰-#NuZDV#$[LQk " kJ {Y*"f 嫊#Y #+5-O{;%D~bЁ{ࢣH#to՞.֮~N=>_K>EźVvvmzo;Y Ql^ bYsB{`3_:hVY^-ڄjEAqv~~g` ?X`6 Df\2˙TK!(5$"UQr7HlȊQƴ311%(:iv!͸CgFxOGJq{PPKHm1`t]>Sf }2|pt[{c<|!Inp;/\umrc/>_`#8cRo~D7[V2.S,![VV\A o|_J}lE`-\4^ƴ0!kv ӝ u^i"^9&%slwC?A&EdLV/V٫N SB: pFCn hVp 3ޏGIb'>.׋Q^?nvظDNoVg#kI\Ì*MvRʎ^Hi'(V4K[J4p700mf˟N+Qte/*):L4EScBQW6 f5 eNXeERl>Zi@cc^I%Qy+)aeP l8^q6755hu0af e#rH)IE]+폦l/#JHo/S|A*n+|9kUR8xcNPSHvL`3;;!#JݷQJlyrgo#(m:ܘ9q7r&>![uYiŖRqNy~x䞃`H/ ?n4Y^Z7X A K9ƭ[7Jtf:Um, 3WNjBWqUU_VQ$zi=G=$ JQTڰkt P.U1-8nt 1\Sp %9EiՊzs3JPSwYw.ǩT!WFROAa= I|ٴ.: yˀ.N(wn #3Zfe2ahG Wt4=-jxS. Tp~I+d9K')8K!c=O3bj%cFy ^v`=LpefV-u {LwWpo*'(2 ,6~=q:H`G8pu%w> W<|yd̅,+]J@On*'Tʕ俴(nvƒ#v@/\8hO~^+ܟ%C:cj 2ӿ+|}ԋ$)? m Dw*0\vQItgQUZi:h$iv)* $ǐ{/lz"XY1H9a":ޮԩQ*imR7Uyb6AB%*׋$)Z߻%.BflcfUɡ"+NK$ݏ+O,Mwf@SSOMS& QPC7`4QnKX[:f;8dv=fiP(XI8˥IF 9-a*C-oJpТ4^v;@= q:eqQkWˀ qAxIAlLk.Zh3T1s)jZ݇,*',c >qf2WEf|H kF-&獨I>l_BrbUb ]9tۇ?$Iư,]ţO(@\QR͗heq.„>YF pN 9ڟ*c|93~Me7UӼ#;]ntn;a;g [|^I>fy c.3PBr?Os.áoEgho'A23JS[:oT~!i.,+ʫFkY=5f-+a ,M2g .t}q";>|(R( Ə0QС^aFR{ʹMPI^8 %qzpfw}7 7|+9drJ5CTQ_;?$qZ|g8gD)bV~Lx^Yaw;,5 z5c#\Z2|JNU3=Fc>\5rUVJORObضwp|]b$ӥ94q8YY6Eӻ&tl=8X׈h,.2・ɒѺ4A*.&س⨀Rn@_#)Rdٹe]P#d{d1kZ9 dr4BM>,ܧuֶ$[yZ!BVb0`r= -tAxC]],J8#oXGjdt>^?-=275f˾ʧ CRs uV}їU9= gމay&6/eTjMK )!EЊ#[gM?jQZ^}F m5Rx}r95| a[< Vdb2;Vk^i4JN 5ߙ-N像e+-P3d%%IYV ~1dNxJ*/:1˻n- 8#T=:1ߩ[|~LR*X#Cdҟv=*+Y)CM;ԇ {0{as餧l~NQۤm0cedT{sܐj]0o@t X<Ԇ"U֦J<WtnߪYGk I(= zw=on%P>zB WHAsinDvICu/4 L|y64sZZDD<=<2?⸐Gr2~/ݎ[`S; _0 &FY˒&LKd1lS&*t,m6R8B՚" Is j߄\S0-M >b4}kveTsk**n {bhw:J:)gV w܃1yG9 Ipxx\vAfS cFAs/1> A#ʸ%< $I:|kՐ)D(Bյ;t `ҧAKnrv1W"&2j'&OHK粢&7ճ,1=vTPC S UFs%P0=Ah%p]!5u3 lM.g^&U2X߯نֆt8B|L)\ eG\(3]Ĭ*5+A?&e*&.Qޯ Óho#sA+^I鷞P;tjZ>m/HK5vĴZwfC+Q3'i?Fw!9yNf!7]?擏N$`Ȇ̻#$A)6}пݑe"ZG{)#Ji}BzD#"?_wtW&N.bHl)+J9!Q GL@]>g &aۯ&O)5Յ?; L%@' `82i ğX?x(c4~Z/0دgvܜ8)(,ֱjv','stk"dv`f[/4^P wnvE֛;[bBkѹbhx34[+ty6[nw14ŢX-@bo*wI t KWƿ᩵oc8!3 DfTֽusc}&ay<;7ŷ+G&cITbɤ#NI,?q2Bz}C (@Y#{ݦ`~mZ;8%-B#SSXR',MvM{M*[.nތ0iMr%Ayli*CY4C-;ؼ/5gR}zѿM| a.#b8hHjr]s -G h)[?/ġ[qeQwldM{?/\R2Q?B-fHO9خߘ\i4>Ԫm^߷lI N8wK26ꉑ9*&֦`o $ј -ÕW<.l=!潐fZuX gf:dJP*[RU$2dLMh3k^"9k2,;u߀ㄴ٤aNddR?Y?5Q×SaLP>ʈRzRI}Fz)a RǛ'49EJF]+6pd 4C(iJq P#"^@ iVʰ\&zx4Q̮HI ??Lm4*PWX 'X @(/L`䥟 :+S6FĝX8яPcf睦p\Hsy*33|eUsUfR><9*I\cKA0ݨSFy|,y!%Zie}ŦT\'Rخq0S|ou:@B V~+h~j aD c@(a9PSi TNK$5GQ1 ^睞; :bd8sqp| 謨 ץ /\%ҙi;d33zb%,kM;B[v<:VZ3_E-fCT !Q/4u#[%(vn_spCN%0Ԃx[TCH`B\.P_"3uBzSɰi15O$tƘe$YL^ Q,^t9 ό qdWX/8 8 4Vv9s3T;D7NHih T| . QRFAn5œk=9 Ȧ,/ž3WrRc={Si ҟ3{zb޶A2Ԗ,< iCe_U' (߂8(tzseDK s1 lv\V%zm>V]6ܣv&Bg767}nMfO.b p'LFhOZEAx:x$6#|;1UBj쐐fPnli|^KmD2CW`良ڊjR85jC&[%/@sJ<;*ȂcRHfHmVuEpGcm9Ti`! U1] 8fh $t[X uD#:'cf'^$ą3^ ze J@^4ғ a~NlߩO%uVlL3MP ao. , _$=G|ʐH%t.-tD0n Wmuےr5]u698ϙ"s<mxdOaz #Rxt{:[(D)3k0Gc[`@'#`c!.j?30p'ryWPDP/"c 8W[Hi&YgTg-KYf`&)&F;_.AoϽf"f; =p]w.73B4'ߥ gG&(c8bGaP)w=nZ]X|.dE+t_!~Eqk@0-pP0c];p_¯bt?G;+>|8݄xzRAf5y bpUڮ<ӧΖܱ]G#RJ}EeY`( !( ]{#)2}(j@b2;M,o|*וCU(YC2Ҫ6?]*Zi,(BISCq/^uHqd~3%ٯpe;֚$ΤhkqQ]-!N;hJn6/NzN7hr`h`^4QpGOlzJߑDӦgjkуShB1\d3/Ҩv oo7D%?Y@QќBBF|ǢΔ5w"X^%]1 3cx$ '/ x6 BAL0cڰ6r*M.=3AѓsL`nD)Xnj~Kj^{MCށ&.H00& "ek_6C[ ˵y Al>n['+ZEV) QYbMX?'E3qぱah Mc H5-- Tȓk.+<[6$Mx~T UpZ2'MMSmEox: W#龓s})=@}9I}f\\իΏa: mQ#:7 A ],YΆ4D.ʟX**qTQVD..l!Sxy94˝KZ(ضqPO :K+bz)bSʋ:" z ؋ҋ`%@ NjVX`{b܊rE˗8$|h|oO6˸0;+PH.ҭM3淾s]9݄Y4NBcuv2m718cj>y )[s6ggcmf#6ln޹"(4oц)N̂@3"@b:L7|Ƽ=Z tq1;:Aܵ䱧` wSDw\'e c}}4`Ϊ8+`.f[~e=un1yz0k~gs¯<-=Z TzΌeܑSt+dv@EB[4kaV?5H0YBGz( řcꆒU ݋gʂ*AćzVR())%V.70Bmu1( x.<Ѥ_cro4Kb_Gm/Ɵ+h4W,BMT{"ZeB2Y weסoR8FD=7b]#-L(s ϴ!L(vC^Lqքeyf4zqb& n½mFʃ8'MN KJKa|,?˂TantǼ#.F-|eZ~D|9Jh(e(˛`nqʖpB E(/ڦγ |EO48VPpD3#*ӀΏw w1 2!*3:NۼmGr72KFՕ=q+j2us/ue1~ɭ)*rjh@T_Я&7rZܮFۣ3PgYS3b_Gql)FQIw4lN&-Ilz!sQ>;zi'36SGݠ=:xX!fސDV:һH#&s cHc6rvIm}m;SY\-c XrCV\xBȽ"t~M7 -ô0E0VQ>IyWaά<ƙF[F͙B4 ~BbW\a"t,ŸWP mE'VGO>ۆN O&W]5aK۴*3% "*vT蓓C&E,}Tk]-߯L7& 3-]6Pf"`icwxPӷ2 ވ"F92!:o;)5W5 J)'z3]VRſ>ƃ3|J~:E^&StLJ=GN@U-ĠGi =CqcC yW/>,GP-V+nONoZN.Nkj?!J)u띃nEvI uz & %'@qKză)*ym58.کIg s7ɏuI+.;0B9xia/5[;|d8*)cl%n fKebgƭ`h…D6ȥ1ۥ*حFxm?oai֭)9p [V W*`c΋4Pn1uCE)0HHqzj%R\-c[jլBVWS}Rèԍ]EC,|0V<7{M޹s1ABX0i=_Өy%JsD+8G 8bxng DEUJЏ% hAuLj)^GIHWAE,9 >x:g[4xg!së6i anRØ@4hF7oikuJ\CD%y< 4H!JmmD %ź(u4'бQ7 fA+Yd{lvxp!ߺE]{\Ş^Tμg%)-> cWȹbͩ˯VSBYF(E?,ǁm>M;pR~W^U~ELy.q3ݘ:8&UmaN_O씟MўAyDLc~@F ^nL0JCHnlU|T`O {UYj77J $˜"ajtylX[[zA*)(\MRW˅Q-%}J4dmIPf #B?P 1u/N@3+ۮsTPΤL4=8f~8!{?3J3,Ih)~yufoK#UQ qD.0b/b(>/Ϟz?n{b,j͂ԡNSET uVNP`F B8|X'nK-$o@&L]aS${3mE+>~U+Y㔴m9r9cvn\ʑ@IINk77?N[ I@,E-gD]L KӀ[=qcJdiJQax{>jvYgwõjui{$; (ūݫ{#鄋^NQ!~X4N;(/Dϧ薧⿏طaHtѵ/@[Wa) ufVV +邂Cj(⎁:j^ ci tQ@ZBBǔ.>Uiڂ3yТvgDX;* ?_) ^PCklPu f@*!1B^ͥ-_`K'pA?our?򂔹)0eƮt["oBf{HYr[b.?e7+1 Op>.9pJfe5j+S5GyƏZFYk,xz f:ʶ=̙TWqQ2bi$w1gE( !ǣ~bcPh |0dߡ6;`fy#Q$>gh6G//AׄK#)7ɤZ\ l.[ʚ6ucܯA3M惁gH$~J(B6X&溚h-=D.2[n8@l?*JG+IA |]J0FeE 1B7 +jf e#uAʛmGӗm1p 0j6ƓG"D'#*ԓk/|DtѭHJ@Y5+ruG `|%MBh{F* {+c;c|Zw^tb#XLU 'wHY0`0uAʹgJ#3F(CEfIkߔee h'%zljLXu><nJ+!{0L~0wͭ]лfgSa)- ̑@kLYy\309oao i "0[wKgPb,{8:NQ o%D]Vp$%>l\M0^B2L!4&0ɲ2C.Z!;TI.Fp&ZP#1z;+׺qJp詭g0/O a3hCV]p-Ĕ}D`o%id9N0,8E31= = N_ĐtL%CY/Xs^k QG9*D( \S*C7;xfE#_uŔ)U}5fܮw''b=?`O Ý8@8̢sfwu*,0~9W]/[l.q@ mq; 㲀N^Ii&{?P&MHE.=FD&}U̿ʲ9-d gWa{ؑă@hMRpnclbS53_@kq~>!A2\_laQt`&( agXx֥"eն!r̠͆SPH UXp>]fB!.;5b(ٰ?*yK3V$Brq//K4z 䔨O6(j˗PYs+Y{5)uC~z#Ve:~ us.m%zdyhu[s;>c~tX > @҅dʗxT8NpOUZuFt*y(v`@*T9o.c1MDuXK1޳5cufsAYc-f%6A rx|2&e]#އd Uwy3mt:8y-ϲ*N =lFMEa\GĸLEjr zO?̊fFoF|R:!Mw^ltgM[Cۭ#tI8ҾNaW־i ‘br'-JNf #fpA$:g9 ΏJ)F!Zm+)娾EՌ6mmeQfYw+ʭA K%Y =82*$ݬ.B.8}"d+ n-#8#CZb{Kqb8$$=h I'GьQG!DJ] B(]tLkj|@bϝEoԌbdn:S(C+b 1,*V[P$2exG.B݊o- wpX:f< T>)jzT9#f=F$\kuj!Kq;%ti-WPE"5U#Q̻=+|.tCPP_ц&‰:?㙦ZA?)3G- LsQ|>OU/TSvU p'DWCK@X~*!cFvZ44zw ֮DYNQ f(^obc\s^aLz|$!rK79w[.*MNLZjL+(]UӞMyۖ!xy,ab4?sSQ)#Y[-$hD_$ܩ6,ߓ82&J.9=>+ẏ>`i62<59]5"#-. Nh1l]6c]Sgac֊j`N4yO&&p_]OQ 0G4gԡĮ'<ƈWUItBi@Ka2C ]P8EU˼T e'Y,S/^n}5maJ5dU2i&KI-d 8a}O({ > QʧFiY6Y1S,Dl(l]$ I@Gs`dIGu)AU/F,F>+HQdq[^XjX|$KmeuM:RD ٬jy7]N Q%ȋ-̼AֳalRQrt_n֮+ 읤& 6=_&SY^snUͬϳoe:YL,GH"/h߫S!vVU%V_`\{b`e*3ʁBfJ!ѳB4T*>_1> 6Hmв~%Mye|HΡF OW&3 OƤ\w6W )[]z{cE0P73~J۠L(0͒=SRX+\xwdhU<%Y^uOZdq*[~B2%ZȑH@0lgw IUq+^YiZf3i2(vR\A*{]#+H72&#!߽Ԝs\.\X?Ϡ#N [+A]lĞDo[!/hae˳Fy'|H I9<JT[:]c [Lv#Em7ɧ|n1P+iڈ-ut4H5(31E]HGMFSh1\@3{CO:%wﯽn Tўēa(l}lYA%B$NCfܭsmr@x`!K<I~00Һ?Xkn$:uE/ScGٚ¸ׅNq آ Uׯ9bIޫ|n8~op7-)w|x-Ӻ\>b]4T ʠ cGցG6?5 itZ#/[뭑2G\+"UNQS%RhҵiIۯ56cMPη ۍoo<=;.pL7 m["J9RÌJQ*J7:$5u,ޜ{F Bl%l9UæI” &WAh.gDU;l̥JFTP"r3_V>Rl>(*  /xnUqqȀٴʦ‘Ģ.$pknv/-&>$ Ztc+`\,O+  P!-J5ψ+h):sf8$G BtCFҔS ό(DCGvC6rBnzT(- D`uV'ȗD . W؀͔Kok uxЃ8<s:%nÐi۾w]%%_l?!|l/FTIR+ c7 cOvUN\eb'ý?~ |,"6TA'IGJ6t0HεbQKl!!pF@^#Z`ͤquU'P,8&p ؏2enJϊ 6|iްm Dtm^xY' To驜m!m虽j رIdR'6j0#JyUn(X_OKm>Qhgzli3 / ([u5 g`UV 2zu4|Ov3mӖ*kMg}ר j%@M5aǍU t:߻l +>!JzyP+!$8 XX<+I@kj7ulKJtpd˷`Kp tK;dِGx9<4I*(^M#ԫd/ ü`v3z"?L(W=xΖz@,]6/EfR.i ;C衅[b`t d'U8,z)- E{:Gҵ)#t5wBhGxI*\i a(M3iIX\ ސxU:2uVXh Mb,^}g,t$=hOYƨ,11S=ATZEU!UG"Nv0X [`Zq~5d)Tʣ#$ռоkY% b ׵\p`*cduDr ߊ)>j%Ns;i`[$g[@LTsﴗӳv@h΀C} $Ԡ9B'\'=O_? s+[H'o.B)hfXB>'v :@Mm|rݎIs$x/Q͙²zC~hE1K%~aK G͝B0r!!ҧ~^qXv>EK.ԲNNE^Bh]Mp&PX뱨"QzpB V:pqd륈$ j8/>Dv eoql)lDdŜ6.4ZXխ!nu(N~A[*RMzNxQJ}ef?4kxϲ7 N9k`g:wƍk/ν+yS\G-{|S\~|UF&TL? -}d`mlE]HaBqq`ޖ2 x79 MTucKx^MhzgB(~YC6UMX? Öi# ]_i.¯w>P-Y(b$}wЅ[;}11 wǔpP3@"d MM $ztq8gpkRj轾X,О~rAߩ{C mlGV`\_do'GEDVe%zRRq І۲fNv8se'BAc1bPT{FyU)tZHò:Mr[׫-̇4Zn­'WrO JXhv}Yf ]۞mA:@jh?>:=_oMg q? k6sς ϕXx/5QB`q}AFVh6⧸&[BⷑWhӮESGq23lY}Z*fkL7!!04NǼݐ Fp>n ĐvDu!}k®HəK€K8M/J9кC VjnRd8ݯ]3SD.XDhEZ^ژقe5}ιk6#Tg/AΦ-b-CS\ $`qnϰ6꺾^( k+2#խennRhs(;ÒBkAWe%8f }/!D49c:ɖ`R Og^'YdZF|Ux3BD"ە> kK 3? H 2 jAͪ#Tw $â:W]mLR/0 q@)j($7 ztuJ v/$Zn(ryp57X"aB2[{^ʄ} bNg FEvRQ {g{RaZUEL@aKn uB Ud/?,I9.xK-s؀;f?X oc֍7Vқu7ְk@H9&FG}oys&ޙu{mqE6XQȭ}cwJ|6]mǗpG94j~?*Y&>.; K X%-Q"vjԞ|Ěh{v);٢z0YxPჽԟ:JV.6:xDOR"3MEJI.vE,Ma.r9 aU; OZD(I:]+ysZCFU<+5,E#4kH jLKhWaǸ n=uf >4;"AIAlLcRkJ׏"7='k|/'$Oc[e$v")H@e~B2a@zϰvމwXUvPm'DTx"g7z阵+ V$hI(WZn ( e|t1٬އ~HyᅧN٘ mzH-Suwh.e:P`Gw=5Ê2aiWƜ!ӂ꡹e/^U@# gT99o:fSZ-}yHtx%osU>-<ڗ< OAﻛ c BhC{aF-WHnXr9 eǖnKU A,]ӓ8u' '.&V#bTouP1 e9K_2*YUN@-c"581Y&D)}9|:4bYY$&[wyl.YM)y)&JA75֯ѱ<7 ͌QFRߗ)s&8?. _Iz@I +q }osZtSkWi^̘̀/3 t{SrEm:|ʅ ԞL" Ss_F?GAf<ӊv`(}FbGYK9FcE>ْ (6g SxubcH^T[:pu=6p?.4?e9>yf9ŸsYT4Yg:olu8V(r3vr ]gW#%SSOY+zpQ6XCӚTa͙b2$vDOjaOcClHfB&tPdKʋBcH$аK1:O! 5\i1瘸_AuKs2jIh]I iSDqgo^IM½V#Ws]9sSiG9o?4haB6Vr_-Xi:/ ˓81j4r\'!g8Q ދJAP ۟e[ }p f<:=fիPHe-ij24W kCryD]f;_((,Cis>R`_0j13-E>tBr>/mHr=8vscoY} A'5e~6W PE58bWJ<#;=X#Pm>q>n4GV|^DfxucYCĀ-*K:VpdC|N6R-;bIu~u>{fՕF ?ȃoۿS~Iб @o^iu߶M}.HP!B[|bE! L&1$.<0p,ٲvE}Ku ۉ$r=V|f6h n Ɇ(٧nt\rey,V!8FuIɟwΰMrZi]2/"KI5zRYg@ʍ;G-\%͌ ҥFmvV&N{]7J WY5b]T+}( Z8s:ݫ<3[>dqA ݉aI\X1PX.Ѻ83 l5;7-N߶xE?k\T;fhЯHijo}S}(YSvE,R/=| A}|f&YD_:7OCkll~Bq, ыf Bno"$"?fۉ2A?k΃E@,b}ڨkn;DqȻRbuNԐAl<4CL /"/Puh8cVhI7(iUҺ >UF-[9 r#u?ݔV"/9D=Pn]^Whdp{Ct܆q \$]R V&]jf?+NHڞ,7NI(4c˓[:vG48qi~j=P_.;3 3/4^-!bp5l5vXdAMDgK% qPkl$.LW}0gmp~Zg bևAaY;mVE6}BT!5,M8m 谥ҰG~ =ct8`k:W1a\:g X1FJ> wފNJ w*Kmen4%d6;z{M{<^JqlR, (,#hYF{¸QdڅMb2hq1};ǰ[.X2Aj1(Uq`^yzMڤ:}COa}75RE0ҕ܈=dnkdAGǞz[8U#g{dܵ]bDG?lJrR٥Sxd`3C:C$6Փ$3RRpl5 >Bf:kgڭGd(.M_ޘZp+ҬVJ-/9MxNr儩1 ;ݸ'Llw.) =S1KƯZ!٧3(eí h_Oόʽ y(nMB3vqP9FU-E?íqC@oʫɌp!Bŭoˬ()4r2cG Iyf̕MS7uXm4cVwW$wKP6.[ܿ \~I{͖2ƭꦦ,wwxE3'M=7P懡юͬZ-&8DIG]SfnFy㕻!Yr l=nrwJaK^>1pLxVQ MU(;Wm%PMF|Xdˠ9IDgp-#Gq^\R8% Vp~!*Q>) O_@/׺'ur/I2+y5x?Za)J #9`\o=.$;O~h鸂/bkQ2CFyb6o֕IJp1'.B˩P8y> xMYa$g0Ŵlg/_z =VMhےzˎܦK-CjF6{Je> q$EK=Tav$7~Γtg}~{?܈CB@Wo^/͸1*E: Ϊ*W*?|d/OnS֣ |2قD==q84vc}; (,I?fPec@N$n^(?(3zb͡`5\L >"4;2'Gj=c^9$>HzS6,=SuI/w.5Qi|V}`֜}yY^ 6[n/+ rNIn`~uQԳI鄍Dwש%>~ I)#/xfzϡ)A" SBW}6 kJgxl_9,kvsPnW_KHFBC$4P=>b²оe"4bjռkBG}cNJRek>)2R})dLaPdYrr/uxI@-@f(PaCa{d;B_; L ƾP}a"k;5óQ{_ޟɞ,)asy~vL->\So vn৅wrgoqh_ ]25&a{7.;XaݷSx7" N# g5wV#K7%/+HpSLey|Gu{#m,s ~Z֊ا?|z:dvqc"8"'[!f?ˏqsѸ62tx c&KTankG 1qʄWFy;Æ N+M4YU>M*.JWכ3{3{}ߡD\(vzpWd:#hM :VttFh ^ +WGOh8S7DY3}Aoт(M`Cvtj Uq4ϲ# nr(3ǝ3p2Ex+ w[a7aVi\<ޤ(=4X9M`r ʶvYEk.VBk\|Ko7Ɲb.y}b%w%x0'5;u'Pw'PS܂ctc8؈{Eev$/v_U{幜%ɞ35Ⳑ+? Y'S< m̚_>+ڋ,s}.ZE oE3eyM5&.7Ն9Z4GejSQ;(>xgW L -.HjK/GDc5t e(ǘ "j5DT/+(u:;CN bhK"vL '3Oaa?͵2h,w0=)6OKqugI>˶A97˶SڕUʸ0*B_Sw@O<@*sHi45! J`X$G{LD*V#7 7ÿHl@XSz-'0O'8)@z0[4f"}C%UǐՇ&0dh\!'J^p;I[G2RBҥ.::*MV̰0v:̚Mlp]b[?Roam2lp;htFIZ+- =vrh4)tj At`ǍFL4BijG1>l[v*!#Ĭ<>nIE Z5Z-dsxa!P#`V):ܡj&U>dG>-9Ga]ϮjR~)JY֮PRZ"Ƴ|c&Jn4=?W[eZNN[QThm=D&Xwf}‰z#G&r(kZhă|iPKuDͼufqa/Y&*v rI6z^ɦToG7wW֥;rr^H(?<158-,qE͘ʆm†O3-SNQz9`Mth{|3;hVPdRj9t|`͞yr@ӞV69SwGP sMb靷3O$3Ӧ椨iϜ;ƹeUq1˖A{%oǃnB1ifC4PgD9s>6ad d`cx #'`-"H=}afR7 ȈIfڬmചfdhOLj$jڶ%^J⳦ l|ɠ i| "^3cg~ь=9'7]N~3<k1J>O8vpz?fI_&O\@]Y!l&Hjiq8N~SD/0XKٯStIfK8~zaj1ƒ…$gB8Pªp)h .2d6sG:;WIpjk䕺ciHa3|oCq=1SDɕ{.oQxYJqB91N2 SQ iI+8_*"2MKLpH IlIh(YGTk2(+p-4uK CP\1-x0G *OiD5fӎ e׻lqb2@2"sweXu LZp,VJ%KX #ZZߍ"rZqa@&3O xE%UZ csxr~Ӥ,J@vAE,=bEʛl+f<|̏ *i=^3>G=,dH9`ŻzHƜd&A \ׄI`/%&5 gpНZ4<}kJn~BQKaHQ(T$6x9IҢzKfI6 %[m̊ "ry@da֜[L=65 ݆f@Qlt/=)47QT8ahMٕS s"{>~p7z8׶7kr;T@[Yc=.;1d~ ]^ґqcRtntYl `T(n3^#or~#)*3GAW#o$G ?OQXp4+) wUuxwLm"Ŧ a0ju*`q/lPhm slu(dNIBgv)sr`#T}(~t\֡I$"&~oCbϾm*$gޥ[B%l>eEL~5}k^H ~'-Yn7~D"F @PqTjB^Yi @jy( ( $Mp~峈Sgj(üEFt[ r,!eߩu<+hI&ۧfe+[`ՓΦgux4 INk^4UU.}؄Q^ 8=\c #{ QsӲ3@En ATwd[("+]~f(Z1c_m#~=nx.{v F.4->&A=䛀c 0}:8Vn w?6={)ț֨Ob3gF܍Kd/kXu4+a;{=M4Gg?g b*>*YOp2.= pު60u*GW1(v[1a+=1mȓfqn7ܐކAwԎ_Ϯc5KV$!"C[^y=&>M㭝 W0J#JaRmvk:X)f[  T*>u̡YBNl(uVkcv2s2&ƕ(QOJI];Ʋ793VD,~r" $oHZ^ӋJaĽ]nշ马 w痘oBBj#O [^0Q7EWݯfMnkDK&0?ni!6?ktO=5.)a: 79:rj/DU$0:1RvOw)g=dQ̖EլMK|R`U!O$䴀T݂ \h2]^īYWٿ ](j}1Kk 'ϸ=s{|G׋L,s*R vhg.hG)N 2)Y퍸L"YOU̳Tr]zAU١iMoy4c}>0eɇ(3ie vڥ賃M=w=Fx9  W,(;%#ȶ%<]M8!Q㗻DV9 l{*w([٘ˠ}J.yJ444 @`*QSq8 ?v7Iy>bkJ]UnbB#<^v/^&\~06om' D@M'^$}inIT\.r'L,IXJrGq* Iր4e-!tЭ$ϒ0߷H?=c3☔oPN'BxS~j<镫MlcZ\7fA,?)sMuؼñ?c'El] NVcꚀK|28nK[NEk׎q~'R7vmPթXGКE@B ].1+KMƟ艱dЊg7i!7|=5/3(@&X(vuUC'< 1PHpez QkwΦ'Mw;lmA2+:ڥAYЪ 5-&]MM8$i}lBo)mq6I%FV+_uz&ܼ˪*[)c> a``/3b kXs00D^U;F>^1э+Sֵ=4rɫ]|}f(ìYU@Q.=l V_#wOSsv/4-g"=gqyV7C~.%ۣ{b=Rե}m9iA2I{_#g)£] [cV'G\ӄb #JI#BK:hP o'p/1;PAڈMLS8n-h (X?Δiky[I*w|ݠF6G﹩&FD:~)@ ǔJ9O-Z=v6J.at4,)AMf(VaBԃljYa2 X>dϮOs# *ܰ6m%¯s a+ M܋gi%O(EށCi}tqjO\ګĉcfxOk7ؘ_77_[jK9(2EzT间i %.Է|yaY&[ތ1d{NhbMG ;՘JfQK<%%l)2HK0>GTZj~;GIDa7Mt5 !B"laXC]z9ucoI7zXD1I(Wjԥ|!Fv` q˥ jx:~d8y"Xy-qm"bM}ޮ],ŋ$)'bX6j#E¾ҥ}S%Jt>o4 i8*Z 7ڳ`ɯSApRg*GzNIT94'Tx{YR֗#5KUjp'okvXTz'?naW3p;i^T;+@ ,59s'2Ss7H|.ckS-/N k?\Aw7JN̈́Y6t VkBA䰮{//>4+`LfadgoԘVEo?nHRH9LbJŸ8Vxhm@tgeމ'PmZ h!tN@ 9s=Og>K\/iȄ{Qy(=PKgM }\B3c` k`]P3BkؘV9 Dhuk-\y6 آ޿w]6yb/ZX3%o˙YFkV bRjN~O(n#Ы {86<ZG'HnnK B߮%Ȩ>㋷&!5}دC="Ra|goՖ8ag:gρ;TȬ,DO@A4=2! 49-/T mY\jc-g9kH}uGқP޸G0 abU!jHʁՏH4h+pٌk6+ $9p"xcvrMxUu6Sk'J]ntvyr`b**0fJ\몡9{22[$ġ>Eߕuw'-kO A~sjch!˺J? $|'BH7"⍝KK6pH- |̍dk揢POsޤ48D@[\kOw֬{(K$,>[@aj?-%VZ](V:{rQ;_P}܂bvW<Ѕr׸o,zZܼءAZS J:=VN;2;d+uv'b;mq)q /!>,- 6QxRm>3^(Q!~״+#aNՔvD!ͬL:ä_TkZVewE 1 ~* -6MHC"j`! L2d9K1[?K+6 Oy\ >$3Xm{ TyeZFVUh!٦hBuc磒J*"dzcKrJNU<=%-6ھ >Tjddz}11eqV*QЖDs֬S,^ʹ^ԌBͩ:x,$Pva*lB2+$n1\La,aXno,8pC(v# I7ꨎ"\Rfc9xL9?0I\9ذm#Y2Β 9T.Pj#9N*`0a'< 2ތxYb>9BT]\cۂ܎(hool»&]bєvS#Ұj`7-a:ebBönʙqCY:1uxfgv-%ͺF''z405Nd,TVٸ `4vX@!JГjRy~(CcjeWLt,!Pg9}ymAC:1&~{徽'8ɔY- tAFnK49f Z6a6F 7'.܁aJn8؞f_iht'9"~VԤX(b(i.f0)k0gm"}vҐ-?q́Hwz;7ZЯ+oô~1,Enpol'8$"#j xUbfq<0r 6Z,@U91d 赍"V{S{fIug94i n[J~Ho& &:N@6TR?j̀1"W;E/ψO >  i5^Xݣ%'BtjF[tyB"e[zKnf, >7ay b9'ώ.x,' ` 4rvE(`ҥh_/ %Z)kخEݍ'`Ei&\ڨAS`6ʼ Og/7OV +O -F|a3'bR0  >Cltkm.yy>,z$}*VfN-[ x-r!:oKёTh.2ŠL]KgR.[уPu"35dkqHy l 1[6õ|ؔ/mF0:?uF6{"|?rqԣfrFbk+>)u#+S0j #_i>, rWx"'W^Ư`m.;)b " g* [>`5y[R+vZͬ(oT%UA1v̻dK9P\z|PI N'jB(ɽbpoK6|.*}mGlbyL-aI}U,l6ya,B4cd>6P=۵ʩQz'YB1E-`_0$y'&x#8䩑k}Lk6MsНx/@%ڝB0 ޻+Lzy@1mH[('unv19kde_/3GXꙴX&`1g꒛3w͓ëТ[q7r[,}5;|p-W_YWv}J.S@ђwY R=.TEخ1'pտ4AU&K\e$ fj@Vt` #WrRL1ՠ;2ۮ Ԇ<|1z R#K=.'yTR.Q!-KEJtU<1rK "/z'kx25 x*,1ܟK)087Vk}RdJ>rH`s)ve6+*a:xW[,b; 0goHO8%y&"&f2ppkף㫦qĬ^>W6fcNe6t;C.}P[܄Rҗ ](G# ߶Xv)f  xi)(R&[ƨE#^k{K۪VYwtB^7I 4~$2Ω V &d0jUD3I"\@xf Y_v&,,XY#m &;I1^1v߮ ;ձe*E16<˼(ԺUܞkʼnYcW(/JG*ze*ͤ QH7ŇrWHԥ-9 "ЕLFIır;^GsH"4iAaz8D&`/{,6f%u!5U"SZYaԞK-P `|@WD̤h&=םk;`]XMl _Wrϕ^HI<'g^ KJwN[cNCͼR$\:o2CJX pC>^~meUïw!*?zL_ҵwX5*2 E S7 n8VtX=of8jx{&Xgch'aPZsL[B*5qkƄ;f+M/RT`WkENzm]6 V*ԠlR:+ajM t]@AǞ4>c^t}2e(Dɪ>?Elr^sv"m&}%#֓,]\;[y>92`S+qIΦ_W.i͡>}._>la cserO %{KQ T,f&7,6} < CNpVsv]|EUUS):!P ɚ^1 [&KƱrj,nqzvk6&̕ʺBiVsʒZҝ\LɘVN$$%% :Hs@nxȒȈT%+] [8,C.;*jZ,[9װZ^J~WGH(#Bh 響GqIWKԀp jA!W5Ɠ~w Deaw[Qq//!RNn7X4jҴ μ*c$A`|[1oU*$|;M=F,;R+ǵ 8iN%r"5J<ͬF+ؾY2ݓ3 gMnNm8h׿3v+9~YHO='<‘dX\$uD  P Y7D0}CЛAEꨌs3.z۳ GN@'$ʵ`6y\Y܎soa7#†eO+x@lT+@pNNO,6RRŤ]\ס뗪 r)K c/LyXWBt3̤!@urmܜxuov9*b9Zez3_tk(i{d;d&bP+Ͱ9 M<\ikg #!D0\f莈riAC*.^G`M(yUԪ"bηaV%֕)9Kakd +KhG'TyXM%T]ykγyDC`.oYgfN of5aC'm@!eL%Os*+)_ YRXIHWsk+]ڙPOj޼{9b=ݑ4@;; *}ɥETK:bCk[z|x2% oZҥx~Т-*>V:%C2*g8"&WtkW_c,ʝ}?qCZLz.q㦲zrfϱ ]1I̯U&fꕲozDzb6+)l@@T>-zAx#qpξ˽ sD6bTK8-6*~BE-vq]o܆0\iDbaϰ $akLՑn%G4~Q@ +뤛]r;g:Tes:O^\ idq6mEv9 8?_#Ǖ͘F,Ȁ&z']yϡ H6eԞFkhBѷA=8Nl|ޭ<|u2>xF7!HeS3/ )K&G(h-zd| kk3ץA8*TVuqI󹟃^ʜѴB,*Sޕs(z" r\Ic{OHK#7φ [(_rAy_NA!a/6JK#j؝T(?0<d+bD=/E:yMB{+m i %X=;k?.TȖ;.bDxq|KJҹD`.u&S-EFd8atN uLj+98e*˔l?wb {sҁDZpa D "jx^%Q*_-5x>Nd7fK|53H9-PC]?V8crv@^ѽwVC. Q]LuKzdYwn0K; _N2QC 5I>9Bp*w8ۄH"msd޳EZ;+,' A)LӰ!=UO4-0=n2@qyJy[N2Xb- iq6U\]bYH(*AF<+ߍvޤRK,5ף/' }02Ćg0mh |WyYW.Hn >Q(ҺѪ™̮:VQ/>q#7wCj^kLmo:9hC2sg50%q뮪1ys6e9t6߂K\?A=Zm*=z2֧Mv1JżYwX LJ•*5ɩ*[3R}KET>֮]b-D"KՋ{^sʼnRA4t770s@`NI",9؅=w肟yw%+/v6Kd{\o.d@^v0X5@3|E8(pNOV@#~cɛg`L-o{vBX&C)4YZ8s^$cc.9-a `KTIͣxM57^jnH?n\< YOYD9#pN"| '<)F+&8\;qLmElpp4&gW YooZWʼn`׃4l 2Ϳ(=XKvwDX4qXt~xU5Ӵ7wM8S?у_m=nRGb6rN$[ȣ{*$"v*Y30(x;(IOep˟6{G682Ox Hɛo|*"Kx>|dޭ) !64Q?Vlq$[]f,o9 Շ2t5,J p,B)tGo{П4zFdId_\Ji~ ̀.BoGmw[j%=9Z zۯ#,\Hkbr[B޵mdy!W3&; e{:PRި*ؾ2g(a2n"?7 }6^4jC%pf.+xGD0fAɕP2FØxMq0ϏyNB:LM-w9Ζpyh~|Vhf~z8Qua>1uȷHhSITs[ocZ\qMS3w-29y0C/Ά~X̺~Y3&l̄Kpc NԌVޜ͎8&ͦ'G=e'H)_h7^a1/6CüP:+\GJ^8`PHMΤl'/-lA`uѐB'-Jy鮄TWVޒjm6&穹8:| dGN?~Ӏ8x^*Tz!S;ɠyphL'L9џ<לn+?Vl5{i28Yީ6c}'Y}":+cf7Q+t0c'52o7j cFO}kpHأyL?cGגjlZT<-nqO[O|$P-eCd&evF?z!SNM'/5' V:ȸWH`>-=^Y< #Y_j>(xBٱ2dٔags2kn*h C JGŸ%"֋s]Sv|p bj>fAY LJX7sݙagbgwAN_dďQ[aȧJ,gSXXh5Q͊|kln6G[Dm[6˺P#"aR('x<<;W7  טGn,l9R[:]ܳlxeg9Y[| e)*uGE']{,y_r wM!g=ΔJT15໑?2L/:[*tSOY]|yIr2b sa`c:O98-2zzG9:/ȄDvU`KDl'4BjdP$D ĸkFD0͓ 6C%O|M:Mb M} {3SMJw΅!PcOM|3cU[jPHAݗ@P@tZDuFw2 CI ]A=XYV,iQk l_<ZH`/1q7K% hI(e>7)#FjQw?U\5w㮼TA>5Ru6k2л8xTci*bj#V>4$95T';%`GrSJSCR_qd`dK)1lzџ꿞N?LquiGq$?xn ߣ՟1x:[_ֱf ZyzB< 'HO&e&lN7"(y1~R)h{TE8Ez"!YZ l|}`b>yTfnVGJ? jҼ{<"s=R}h|[)#ΐ^3\|GLI+؆`_|ZUrBJx b@dtE X1m͟& A@iEяyF2>Z9~{@y// 7#oGrp'A/曬4vJxO$ Կ ΍solcIlXt Ə逗Y:8v.\1׼_0!8` y`/v|ou\I`-dWU ;Zc3͓uN+o1HuhHnWmdWSoAֹp }&?44)..RT5 ^=J~f1l2MGI~Wi7`|K xrF( T5G쌼}6Y8-9B,oJԖ J>O29Jdpjl4%jE=fMezMЧ&N~7`@Jd &-T MC'Vva?qw.I!+KV8 raM_R?Q) >YK!1] _s漡 ਗh.ۭ9ňw ?N,+q[3wƁkh0^*\i)u߆?ANd+G?fᗒd4#ȫFQc|Z|5q{2O2#U6IV >} B@kO dC~R:k);t!pzĞFxj@'H8[ “Ѐ80;S( BXJ23鵖ɓ%zyr>z]WJLANi 4x/wF FwB_Ƭz 6"v Ÿl z``|e/Z o :b)U@khB^Yyۛ6&ix4_@R-UW#o'v DYb"r+nvY,Aoo~&~\wa};+ u/i 6* }:qkGMћn1bScA$Kp4Fя-Tmp|k^,/35RTz HEw]JIGn|E7& +ȻAvF#ֈЬ]Rqrky!mt_( լXmA ڀ/װ[TB.KUB-87fqEmXoAN}o\%.BKU[wX4Gr|#sTbT zy)V0z;vFIGfUt8CWc2_~b 5wxd>ͲS|v*(qGl =sv4W#ROzѽс.= A ̚Z tnv%Ήk9:cortu`}+"q M_qZm^|Pۡp) HgbqF@Or|59C:Wb k-3ۀFоb/#oos*ZYF2.\Fyv i{/؎Q^t|^ޠ>yJ7M:kshRFP 8i-Az[E)4ۃtQMet*w5n^!xV pG纫4Xk/0h3+V?Ȱ3[hHfuϳ aL4" ~':Pqa!fHD:Ey9Un<'Wiwq|&$eH|k\4soN`ė'*h)^e=m0Yr QԆG dK2ϧw@JKD3 b"nmsbʳcqּ9/;bRj|78#ysg72@>E =s@G(ÚmIJ%Ă۷H!=b-]w/~V \vȬACd.˫"^b:*zŸ=hi+`ҥIP*¡{P$cAӨsOC窪&lZ3ƅ-0z_m9o=vX|ZEcfyPR=O f^MWԺojW;Amej._Ajb65~B$ .8 qDĐYD$B/(\ sfU Flo]F]977 {w> !Ժt?d6U6 Hb,$#v\Jx<ť^'@!@uM%AG^X^P_GKZILjUޤ/2f/Es 5ßA޻Ihkw558qoTiNycG{R&AvzeArE/vQd&t aMC4D;XxGăXe& t>4uYbEssĬn:P31WƢ.r za nlOԠ{,@:zZ= S)PYT8ްT_H.S۞^mBh byG@TlXS2P p1g#Y|P8b양y@eXsGQ®"4zl&gYy ޥD2ak-ޥ>HsFmJ~3,nF5\qE? 3eKG\8HΎ`aYj/mP&ѳ4 BnLޮ4nE§1ýJbr!Gыo ˲͎'w_GaI zG5{ = (p>JuK5:h~mV!D);s2S5WH%^(4U[3YHYOfNAһ4v+}8"n0A>>_l""zoTutym\!umWPf1tYؖz{slC).KŎy%* +=:BCZ?GȪ&B?o1=D2P*id6У-l|j(rNf!me{#/(0}tH r@^tLoqÞc|kV0+ZF^i IvpSF.ܡM[b4 :3F]*ZòYK㗧;m'IfTd u#{K (h8>:V~ ǫwHFtq0!G  brLYNLϣR(h(>x2rFҊ|𻀂*p*5~LFkV"&o Y;(Ant紲;EBMYH;5۾ 1@×~V$[@!US9%68٨?bSb]|^y.cK#6Z9խ|_<9a*77UԨ%xLkQoh+D֞^o&hd2El%կ|EýBSboG>  qNXY❟N4Һ'Hm7T*@Φl)㻯3-,%uv^<^ 6?Ҹ|^MTc~a)uo+ETd.oO44Ѿ9Aov䏉rrut!HB*sNVR^Ц=#lY%>8PDs b_%3p.ʑm)}rKϗ/l0SEC2Ckt)7[)bz L,w(CCR`V љSp%]uO׳M1qu@T1Dޒ y8RGi!`EefE߃UC~ĘpﴌAw׷ V5_}7LAE婫F6q 3P{3aoq lT ,341E0$~Z^ 뾇%Db˖g#AL%nCk5 lϋ“RYN1]le5[( qMY=~BXcǝ?P!JcM7/x?I¿>C;<87'^$o\8$櫋qE7Xf%ңVX8G#47Ǔׯ ڊ崺J6ˊu3&}_\1rGnr (o{=]^ĦGt1=tGҮY~w]jQ ZC5_ؽѕ kpL+R Wiуjx0(D1VF)l+>KkJj p>/,ǭ)F R|ݤ\Y xYF)m([B6H{@I>rRMVΜQ/”SZWaFsEr3ΠEE~\C1ja}l:~$tx:FP֧@/¦df\S ;x JͻqyH> 焄շok5l=IS(`lA!B;R+y&=$0FNIT򩎕H_mn/9y Ցaʣ2e \>dNl5dE8o2,\+jmZ4~lce o@M q01 fN2LNvvtOLN]pC>oTf:% 񄴥f.Dgrg"W# 5,SJ@WW;xDK \gxVe²gkְ!V=,Ft>6e!W$ b l6[ _"KDqA_>W&θ=u%:uoQ)xi"=pRGI*CXIpPIVI{6ͩ|Kԫ)Wͤ+cӀ?E;j,eŎIdˉ|})n(L!~.Ȳj9]RQ=X<"Srey1sFmx<{|C+`~O<]oarX8Y d1*y0D F^fMV:讇7c շ12YJM)rw1O$ րԂ:UI:mOPsbn9p P %eG6x_Ϩ02U+}P6b:z$3lע"Vhde{) <9eɖiY?!cG,܀']!kU*Tˑ!̚؉ۓ]y q@yz4pTBebK4sbnU4Ʃ~JFl6KXl:SLlই;Gd!;Qh> ,eLeu=@>(ct(?P60쒖ʒ1Si] ,;@,I@@rԃq<?}J5M] l k7?>ӵh/dXųpl4xS־c`zZ_HK3c9d>BMFƊj/*2DvZ#YtP6l ПvNAƷt9$wVI쒣SJœ.d<--]@P-~(آޝq=E#^`jVV?͎ {&ȝ,?+@tL1V?a/#_+ed qf#G(UWG)WE&?9kM$1Kwi#J-}80]ܗԬXs0dݬBv~C'yv5Қ!t;>G%2 p @]3TVpKxѩHr%ێ=;TGolzk}zEi1eNƿ}Od@3$vQvԹ{Xi!e傹Gcy渑&P*KØ0šeHBrDiS/aձ.5!*0l3|Tp.I;ozWeY@X\Zi&kWUȍEI/G^Pȑt'{ U_= (*V=_ӎ XI0.Y9$k0b#/Gfqf7nޑ_4VMz;Q\Any8OGKHvplIv$ϫ/$. hiϖHUfl/\?O :I [=g;O6xo}js( ԅROBC˭+в!R1X}Kn&%˘XD>-N]xB[, /ʫRN48Ƥ+׸Pl_{!+ݖBq-r]󍧍/Bi!s>Э ؗDQMeS*  L{ idgg}3> j{2~VX/w!HvVz >Dez,Ett^a" |*< jGj$j}}+B})q:Y#߷Y}+{IڐS:d  ݤB7(x:\$[w7ӨaixZgWNFϻo{p[qQ۫ɎdN]Vw5*p )tE䔪Yŋ>$$OH2px!9'x:%@_|A]7KjG`]útcbXb~ܵ:] u Rz[2smU0"pGI2/v_p iD׫ RҦF n~WM/eRnޛ~\}(W*&{y@ջ9004í:XAhS-!!%?ZHljdU\ %Zq6xD<[//KMS7"!\F4w+c/VN @fd.|1t$V6 A(cS_nsE7oWl^ne`oX=:u~u<`U,sLKa֦ m5EoצFYyJbMaLnXX}+b = ֪141$9'ħ`*IE-#+O̹ 4`?rkJAr1%u'1='hg2"H6!8dnWG6ѽO/J $ a O(ٺ}} ׷Hj Nܨ[pPV0ިpƺzOO#xQKȃtUw[]( ;g Ce ,Hk^z„GI%z*,xmȩjMRqi˕F̊T r@=<bY\S-Ƈlvćl%0.Ԯf^LP Qn`T]mN0l$ 탖5*SQ,H3kclH1$ hdLeנ8D_#iY D^K\¯2]i|Ӏ=&H 5-?lFF`)Kwd9=b·myiW`'V RAz>ܝ_3~5՞2+׮AOx+Ϟ%S;fQIcCTԃ[=.#Ze{j8ߋ|9%YgiHeðLSȻX }Op>w}rM}"sTO,:<mtve8?oɆ6giBE?t "x}F(e'F/Rܺ<9'x'uw;2mmE.G8^*&Z{[sςAKܐEjMI=H>X)@W+ OW@jI7f+B^W8Bz-KgM2[=Itz0DРvLa#a0m&CY!,G\T8ƣ[*o WbmǒG ٩WFao'w;E[(ٓ#6-ߥypeV4;ޯ19Ayz;J HqDB<'[7ʦ\JB.cgCЫ>)*2M/׺g"s1O <ʻ7EZ6sb)h~ ξg]leK25V.vOHRUVWz0m[-Z703}a '}5?h)(@ԬȈZ,`%3eM'Qd2P>_vp]QZs -8س??*\jE$''!4&4YQM( %+GYTcm4U;NK 8A诒.e—p }/_ݣ跑AbsldF>m<9…#!lƲ]UUF\_nsuRu%T(ZH\bT<1Ί7Siz#AqǮ$)x<UlyLg 99 -g !A p{l[RݟL~891A2=R*_!&rg£peYB0'g.shKC٤jR |Ir aX}L >lfub0>Ձ CfŔo;[J S* 8q?jB_H(';B~Y}|qWPP18/zsQػTN*ŶTs`Oȵ)֦>ELܗ.jdڶ3S~U*ut0: }6GacC++C.Dt#{^W"!|8 ʰd/Э>դ&~׶e<$^kkR#?des4u46s,/4'3(Iu/3Nr{{ݛ#- 73H)Ug-f& mHqtFpru?=LZE҃s8\DZU vCE4 Qak`j_~TN٘ @D96; ɚ%I WW䌳X% @2!b$PMAvSz&^wb9z{9S W=ǧF١DQ Xב"%m\V!rbLU4xmHlRj(B62)DRvW(S&B 3}a> 7>R(1kg1Xf:ɛIH(5~(0scmrN&p&g7#_!b+EQ HiOX6*"fhǼQE%N?"\Dݏ=U"ѷEhnW y%x:ܩzk4JA;JA937 } 6$\?kuy)2׹4ˑKP}:y L^lN[TJPXHq&B۽\ JEdBVl^0:NI(QtO Al;$|(fyժ>A\nd!Svk &׏WA±0u͓1A`+\.TnM,];hTpY]jDB@g@ pAJarǟ|fu_"CD+^yKHiքGVo_Bs0$3Pd(js\å[KZ GF^܏CD-bUl#YUjq[b৆5sRxOPr,v&I`k5t7ig0$(x5hYFq;ƃVB'^]v 62JaK5Fn>7\ޭ$Wr|pM5pDS@'J$]Z5lQ." LήQ[mO\JyOIHDC7X]vr j8sQfVX^d #{5-xh<'c1CoRuK›*cT߅A,b,/XQLBuĿx,`ٸL$ys^#}Rɸ?qH޼~/7nBe_5x~00%|%ݖS]]򙘛]`4Z DŽ '^>CM^Ι(67/>JbҮ+T{T vEt6˥Zp6stρUV"0BA8L֕ .cرlы s~iB-\3Cebo$YB]uACo1o (͓QF4nvٟ9O6ՕIGxc*|Y!Pݔ@x7NÂsZ쪔SW?s"K8H}N0.s K% hy ACa)hEwWsB],~ž}eXιCnr{omXblW7>8ELտ0FgZg$sQʰK W#}x AdȻu%##4ZiN Mięo0^{K."u<:s8 [/a)E:w`ckh d?=q~a$!>qIpҢQ+ +{iSJL,EBxSV[v"~r3H 1P\#Mzz޴Kɵ=+ QsS0's^i851s;oʼqƠv|z p}!ĝ v/6o2G9KAKKݒ;@V~t!E qSUg"F6z2C˸qi+gWҴQ^9  X1F>I#a/Bsmuսu[ӊQŀtDŽ0 F)K'.w[ig1bF0(Z.щ8~o^詣@v4j5dW!5(?Y0\jYt0Rr^(}ƕ5jByhTSY(Yg#ڣ:o)i~05X 5E|&3 !P/M+)f6!zRKte>N.HɆb wv'544>DL.d1!k2ꟜDV;R&S'z[6QBBLEBf8L*!lK:3j nd$q\/DUuő 7= ׸v6e]Ų⑖⇯*sκc"bZJF1OBŀI4%8:(bD$~V=x3R.ɿ!xo+9FYz2 K HyDY:-o+p_< iv1\Oe5up,/Pƣ(̤ 'ws7KcuU~}d6eqz~;ѯEVeҠHbNrlDz]l k 1r"֜yFӤyZ}Ivå5}GeQ4Ƭ).a(奼B$Jsż]Xs9csHm|8mY^XZ-8_d2!'25&g$GJ@?`4|jVt3Lamrf 4©g_۠93}c' RPwS%[}i4v3b 'j,[܋Y`j zv9k#&%~Ǩ^tK4=,򵉰Q6&"c!Oܥ :zQΎ!diaK5k)ju4]THD&բ`ftCrYj7 [2Yu>KN߽9OuVas͂cTO>~SF  qlkHQ&O%;1MϋC'Bo[|Θ/ >3"az+ѣnS77+"'qfCS0oQ? a}թ"N,@@lh i?acf#okG% SJNbsfڟ(n dOiTA /v"Xzƙo!}&u/\ ._7<|(ɵ>8r=p28҄Yц94l47o) KNMZ}Ij8Bp- Cp~GJkpy-dI/ԯx[JxҿlA]ÿ/Ȋz! NP1`i/O5iQʰ'¢b8=ڣ۶w~`Fй8 UWҙHB-hVB5𘫳ϫrAI|LɘP T<&Z*CXg]gr6me.z/%&(uDcU|CHG>\u~a[!W%8_c;3:7N9%r7f%s5jb52s4+"Թ"]w;J QSx`Qi=B̈́ٺES;<gJ՛Pbh~ABLj7aB}.qeM>fףOf)-bd`NBXk&Uur<Qo[-(rYvqշmrNk@& ˭!gش@ .~'z_'Ϭvɻk&U';tŧzq~$N~`H M)HjZCho>5nzbf΁*;R?Z=7Y@rJ$G[ i\}x{Lgto[QmY2WwV^\{w/1Ï AA$L%Pez@;]uڴE%>VĪP>!uYP&MnN8Fow1Of <ɡ?S͠6ctPGϻ w%) 6UI(FkC+Z{7Ħ* /hv82)0"w%B Wa%|ʵ(=54O'{ }s{Vcϭt?;M&^w>YdkYX$@v&)gdsH]>]slLTg\9GdcR:j. 'y!^[} s8Jy"jʘ'?,QTB005R 6 F P‰*wH}kq:Ʋt:~zBQƋ*5Qtԃѹuf \֑R葺3} `Q{3ڮ1TGzTTHu8t6'Oa(v7ctXi"Npx/skIKticwф ~ ^*hHcw\/3.PՔdBd;T g@%޾"e5rn_gi.(Ͻ@T8 ¬Iޛ{y!4S\|Dʾ]ŠB8UAR,&^xмZW5C(%l,wt'p,Syv'kF][b@89b.//eYBEI8g3LcL3nu"v` Kv}nFV?vFAKU%xQ',iufyn#C8 I}#_s?2os (v7v߮@}O'31=!fMbqG]jPZW%(vH{BVGHh%ͯ"@|#dF'73K36Π܎Uhث=7&5cHS?r:w9JR56S*L pNCl{+P۟wy 5c =_m  ´6aFS+C0xds,r٨ꁷKX/y=fFɩ Ҝ#`ճ@x 7}pmY7ɨnkJܞ/O{3.%8׉ ѱ4Zg,7gvfNE=$)g5GF%;yjǿ粶@ bb90;b(8>zelhz&X\v4]aFnt8 jϧd4M%!tjRM,wۼQnyj BsWcf%Oiu}־om#l] [r+PV7&Δ_rI_h&vԋ{ `TBvQu.Hɹ T,lk!ĄrVy$s:hG˞|9_ J?d夳.|T%a~va<8wΓldNDD^+K5VY2<萋B :Ӓ}]548Q`ʼK[~,th[Ǖ{S9/%BG_:OJDĚ8$'C:_;;+ְ >9$XH4̕j/u8T\j..ӽTD `Ec!se2FtA<=e޹+U?㷎.ι~)bkyPގ:W y-gdAm ppyv۩.x95-RZK9W**FR *Me:b9j[JĜ"c gA?KBYUgMEώָvD;.C48A.jAAE,%&Ҿ[Z}W?h|ϧa {Z,9,!| )^c2k+~+ʆ @,\r|3]i0BсKg{mȗ<ܒØS$1ڴ@[o}Y(N,] f\ ]x$g8bJi*϶Y*r֖)XSPr};B4?^egk . 3swZ BczH]_Ů}}@+儃~8ܰñiI*8QX, c;[E8`Ny~?=h|y s^kp>'iFt_Լ b2G d3F#`YIb1jMW@-޻Y"f@:GMYw0Txtp@'~&{t4G9,4&5 V5D[0DfOx}Rspq_+h::/3b_?\[kFIrp]"Ļ-꠹qrq\/8]Zi3zv+-eM9V5lOsZ-%~ևS8֤rֽdR5p~Vp +pѕGe $B|Cya3[~5P4I xz?QyKjրӁiaA%B"9;I@aO3$K$=flЬVyAlE1@{9P6Uop yIP!x:h_S\/`pLjknc^ 6I69"]O\˜(\ 9{_e3pz \մWZp}-~$pD̽T⩧,3LOqZpJ.v0+E^-^"OW|(6 gwR׼΂r~yܥ*9]5ǥ\a6U! FР~nT#3&$y$[Nwk)q'ۈZD)9tF%O6s?Y ISj Mܤq} 6',63G~+0>~' X8splL%f[2cG'aqH;@Zղ{ "?MXuG)lX3;3/ ]\o-jB]N(#81_|%(6'E }FjOn㎘'XsKm ɲfF0Ғ QDt %Q+!RuiVfËV֢yhz{a̲Љw ޯ+ CXWEAu/f լI57P+i>| caUO4]w[=I"Ug>S+fay2Iߞr%y9G`r#FXqtAV݅$Q5EsKßS]%Iyyjȷ'A7U2緝=^|H~i?H/&k8B^uT[cE6a9~KzojY/-J߶d&fl嚘~RQa+a߭c1KhM3\H{!k$>DG`y`F{5l5LZYB%Uآ58߃4~4}˩oak soarp"7fi^ 9yL}Yns5 9Z7n$3ۯ_ty>lr!~R}Z1thN>^#%+ SROe>Ey|N4$1N4`K,ʌbXL#Q 9h~GIF0#~g(ha_3PdC8XOjx֛01ⰡR菍S?-{;_S K*dqp#-=w2f##-pӇɂՙ[ c%/-@&W>l'.2᱌IgYDGXJ,!*dB "z.2KfA65"2qYRSŘeWofm߲՛(Js("}YH|GnJ%Hg*ғ/;\yāuJ߸0&HLuҙQgc5Mmdf"+5T&U2)G٫JX_Yq|'j'= {FsIDnDzcs6;Лonk" 1uuUy]o-}~[ck)ZN:ujAZx&@kѫ)N{^ lK ]J-E5z\]FJ$=3S <9`<'-1\J}1y.*GD1Jf~~W8͔h4pIqHd 5Ρ0RUxu֔ >Fɔ%Q:ȾikV95o/ep|E"cO7C|fՊBp` "0q侽\,1#Ds2a9 tfэV.ͻH[4e3vϵ G2-D &T)XsfA*z'Vg rmDnOrs(RIr:[rBBԷL-sE 0BsRc=#/fm/聯ʳZ#M."Ηs}yQ|/f!V*h8yscɰViB˙X?  h3^#fq~-5[2|\ X-bj|%Қ_aR?OƜñlIܬVW@x|d2$b{y0ӶNp^O̳8FGS`℄1I*D(9Tv$VZAW3[uHWj⫞t rzH).,뇞NI.<%s pFdk y(MzV)4gz.Ё2 sRi݈4fYV{x)윈P2qײtXi>#gBV!cJCX>jSmEҋꊻx9rZZPzD䱡=U֢80v7,,Gi)b\tYbݭr[NIqC\RW}Gn3Kߎ6<4A0o+ꤗtP ibjBؒHpZtPTtBsR]H·DEf|E]Y3ǭ7 }oE+ ?}frBA5T`.J=J ^^ƅ  a -JK $^Âz*ĕ*̛B3t@-~``&.l87t(ٚG˟WsHN7l:V-CnťuӞi-#Դk#[JijE\2&؀ caȁmt.%Hoäg?Ϡ͚XR/fwױck,O,(PA ;QY y O! 6W}A)r>}s; D8ɸ|OIQSi3zTD>f2}Nhdy  ۮmTbŪ~ǡ;bYs⛑vsݟ[+jSy{xѽ |Wߚm3L .~Z`SX7ĎP%bH侖M&? _~.q}]6_me?I|ܻ0^qn[F;v FxA5 P~E؝d0վz!4Nd.N_j0efױQ |5Q!40ft/xi#iW9jħRFi kZ#fJվWcvS[ >B~W1~{5֨򶍰fZ*&"}!XyuS+;J~뉧|6Q/LmBVA+|0Wq;x3Ghra*,vcV`{>`XD eYpDã{B_yֹ1뜷gjj>p?Mbe1;{ $ʝ a>ʳѣ {)T~h.|ǧ`<-y/hq2ȍ7sDlL1  Q]#2ڌ__l+F(CAs|CsECԜ|*tK&w* b*CljŃ#EguP0;G 铚 ^ےyJJUhc|Y=[|^Xg+l1 %&ì`S a)"cOB[ gkC4^n?PTZ{ڋQk/UHID61$Өp"nH#-/EY䭝;]Ӂ{y"] \h88UbY 3fCT?]2ˍBl%v$ߺD5.G `ZPFv/ 3jú|ڝj[ +{gbLewCF)Qْ*`fa4f왃vMplV+4$/Gm96$oY:aX\x&Ck5>b>j)SY lKvviKDMS` Q⿻ř-ˠ?-O/R7*GN"\žTw 9H vAdáAa]4Ayq3MZakq8zu_5{ Ω.#.,"`:7]2M Jr#Z~/!dMuX[^b:GӁrg!WijP|"w K8s.wdTnNr,^/Xz@&lb NF1Ռ k\q_zq&xߑۧO7ro B[p"cJ1ظ8w$f@ eǨ6ЂbӃjy#BhS1:OB5rw6JF]N_$Hֿl^@? #0}åx8ZPWS /[׆ȹ\P ӫCjC4ޑm8Yi=:LBOl}]x3لK%e/"lxTO]ku+#?{е33#JɚG0;s >C`y⪳y*cucZxɎ|C?i]T$lVJпv%,iO M%Lq*4C]y]Erh)j(GK+W67zI+WXPo7%rrf)&Kp{A6tQyPƿ{%\{3jD< 7V|m zML0*lMP1(m~R(P8L&1ٞS~@D5ú[S5.Il'[I\ex}6`~s=MNR=4 BƼEMIurW#G"Nq»E`zcV_9`~E8]vg=YQ.˺YNWH{2r iϿY7ZIx^F1?hr=:!seo 3@am7 /9}*׫c=W=4̓]Ih)hiGA'˧,V֑bB6XpSs"_A/&~~vxkέ%MVY:g[/ mk_tt|NV[P|= V@q.X K>_lr釷d]Nt72l;NHtE&[]X(xCNX":.X%VuDΈ8z\m#Yrow&*G6~!ѴF0!;BӝfZ_7n*L\~L~ר϶ Tr 41~,X"Zhk_z^4PR-Dwۜxm Y#t3T{~U 5D\,ΧN2pl`<Ҧ6Wl`u]ޑq |=B~S˵oU+Md=06tP0Vꪾ"'!ߘ舮b73BoĚ2Aȿen@ ,GʊO5M!AbFl:1+VzZ*ZXy`?ThnPXI`m?ʖ{{L1 ݦ5IJ!c`vٹj Ap_ł+̿xf[FdP&IoC0% `Eaoicc<6ӳwFݷ.TvJ 8|BʅpE-.BO3SƁ E!$4ܽ_,g4..C-tdkVqM#K?xRz įhYt `b[t6 ~DɁb0a%@x$fIo]|ʼ2Z'MR}K q{Fp@}Ǽc/ԓn&}Og!9-ѿsލ6cqO](Íۣ3' L2EVK]kԔԷȱXSOm d w]Dݛuw?'`%6ZuʞFhidl_^.P$Z"{9AP}i:gOq Kg}]4܉yoSΘ0`sE'ZJ2kcU@&!:Fbq*p2P}'e sBRSU c1-33%ecߎڕ@ h`WD c َM ?}-LQۨDxwt {g-#^;afpx-?2c,>ឯz%XbF7&Z}m \ z&xs#Ƀ߆ < U,8a⇉dٯ {~uFR1B}/-ѥYH)[ "lYQn),\P y.wwLʴDdK >q Q׌H6YrQ¤n)vW/ʱ?!s6~dʼnh|.Eϒ*i7 @x aלce^7βp8o%qB0rp(E99F]"PeyS? [S\5_$ǫ:Lwtux?LSi.l;md{gdcWΓu$EGmŻDW E@'elTtP竲11ơ9O 8vbإ/C]LϞoC^nU hYY#W|q], "J>R$/? Ť>X*! rۜAL> B&tEO``E>{+L/|3ڄ~;FSథh/3+SD@oM|z^Boi"PTHtvq%gUJ;] >^OK>5 +orp7N'BMn݅EB`[^ݚLvgƵݮMb[b&1jCCJ<$>ҳ7SO|&9`>7ݕ/$cOd4,Ey3$ʺ2`N!e"\b7Ipw|1 lTObӐ`Cog)G;(EkLa 1=T$Sw@_\-H\UXc4nq@ϽT[niV`J$?e3ع:`NZ[#XŃw$h/f-8{gAc _9Q|e/H=mNhzuʄƏ@XK bBA^wXnlTQ A&a_ ׼MXΙ|m -MCKWgϻOD0H=Xض;f>K/]S ivtE$&Qg pB'?OdqLeBV8gzӾHmL:90ܹܪļQK$Δ81XvD![Z@ ߛ34$FlY\澖VN93+XE1R(1|_q9EUpf*Ut>133 '%t=h`7gpr_N ,o\xHi۳\SO#Ɨ 9|4H&L6izR \PNX'L 緂[9LD6*N%Gv .n4 GXQ6&ISJӕk,Շcfɏ(#X!?џZJX0 Ys K+/+ǔ*Claa4Pdh1#_@`+L8T!@@alYJQdZӿ#nk աh!4`bҢ1Gig.8(!ĶO.'gcx1Z5N*v"׌WS,m OBI85 ;m9+G+PӾ,DeS0idHh+-;C{aGHSc=_nr6Ďi*9)j(43#z9#m*HSX~\h4Ndt 2q~ NC /<8懞l Wg} _:! 82 hLkmޢ#GT?PSz@.Iqm &S?M  l s/wk$+@̮{vR W#قP.HVcQl1ǧ%|F;jq땣fRj+Z۸YzM֪R"3t@m15v[PdiclxWGm.={M{]էhy:6FڝB`wPOMV-4.FJT/iD *E% Kͱԣj׉czd{g^vg_ݿ6tmt}M'٧$|kintCxU": oR0o.f6ɶ.=k zabzRnί;ї}V;K5ժ*+q}*[c*V6gg b=T")&)Ζ>3gv ӓ j_4F/0|}8 E|xw]:8ROW+@" g̷nוer,Sc]z{=Ur?QX̀GȻM6n`$#1{P,\GN:[?6]n؆ܵX;Jն^Sbgb'71O;XL^  8U.F`6/sf>u|Ayp 1 6Rj 0KzwS/(X1pn#ڞB'l q΢ ca , eE&Exֹjn8>Rʗhf;\iEC{= F-~ɡc+% oI ĽGEIQYBIm O0CYEnxB}(gs1VG\:+ ZHpKE$Qs.x#Ff*rمw|7vwx9odK㛺Y͏,*Ki֐tJ%MEKɾhTYg䢫35-~㠾M-;D2g g}Sek]P˫:7( Z(qdKM9BDo YQ2,m pG޼XĄu|u- f6| 1,oL#p&kHgwo}추Qb& \ n`!S=.:'`>'M°g@id G hgJ|LF5̢SzZ(O0 铇ja"c@π7ګ9P j.Y׍5#>q 1YGD*Jh֚QKDTH_H9S24Rin^JI7Ķiy@Ivn:.3I骡7Sa|xggg]V=,nKlXE ..ӛv[\di2.6~#ܟޕN&Ys48rBZ؉+$$C {c)ذfH_akɜmO84r_xV}'zQȮN] 'KVn AE,- s:: i^}gob'j02ePIb!6\Ij6-צG[G=v&A}^ #-kpӺWѕ>|o"9nx>z}c0=*7'H}L|~&I;E{[5KBվP 4pYA ᐶvt_xy 璃QX0?er |~Ȯ g"z'Q EFEjKlAAdIXF1Ah pq .x3p @:ɒ 3> 0.wuĠ evq6䍩PǬ CeS=l=Rmj rmæ%Ti*DAړ Gܨޖ_NgIKlrNB א~Ю%0m^5ms/ /.Y#jdz#QJf ۨ&[}J"/1:+}|jz1=a@TFC@3BTF0. 5'$F)^AڳnfOxfUg6 Eԉ@g҃@E!UZ쿛\hGS^tO҄-ˆY֗/a+I<4eBI֒ϟʼnBbO~(ٴȑ-FVe;;yZעi3ƋZ>]ts;1ǢYk8 4{bg҉Ob($GE4ҩ@qc>u`\+d iuޓAH `2VKE*#.=,@&vz@԰?x>0[^w1x n}TM^{EO䩭 ЪaL("z,'~XD+\Zzy2ZOkể3ם b֋ҊLTɼBq?1WCB}P۪'a:` ploD-`B0jZ!_I7'a˶mbzU)ܯgT4oi#2LD27 %|ǜ)F>.ĸ%j詓qnoahʒ"NTۧ>!1q.>Gs  hc2F]5@"2)ƨ@̲X1u?BYn4C@`[?Qos8}/n ىéD$2 Ùi~8*jl,LS;4ת)N c3 c4't FvrtZo`{9Ύj˕7ԧHܟ8a/ɕg)5NIMgv' H 9 Ц۹UA'@p@2NJvѡwz $ Dٙ?V$+zYO 끄_3EI;-8ȍ?{!m 4U llzfK )^ioޫB(&6!$4׏Gdf$e!4|Ãۑ9$M|)ENT=5:lPChU7.1SL$fѶ]ښ޵;~*ĎCs0arVKp/.h'uz'֞.BC.LNkȡlMHyp[8*|l f,AbDJpyПȲ+JPʏѳdWܠ:{f'ň~`#ޔ./ yGC2jAd٣] QkglOs+&r^-@ϥ'XoյUA"/: J 'Eܣ4^F+f҆PDDn\93\U&\8]\CNױXh=Q~~^S8][r\g F3sjٶAA0.l3n ŕqn_5lS^v-n"wY:k;bw$ȎsHB@(79fGkaXt1,',g%9CÿL;4}юtλrĸa~+ y5, ;;UM]H_9ҾȚ~D gI!ɪ߈H\oʅIo$,M=U]ثe%V5+hgVѲ 9r.gbj!KmV'tmo͚+wBg/낄CP F91P!`GgSI/Q1 NjC#,@^'98MRD[ߊ&ᢱP]Wݥ3݀a% l)VM:IJx}.Q6A_=4 ,T 2X&ƼpSڻzqSIfX*ٝs$NvH(NyF:2~2Sݱ Un=vH?)Ww [CZ$j4֛)c"@]WS3hZMԐcvcE҅ !$NrZGDž-lo IW#^Z84͞ev:وCJ5p޸O  @fNeѸҠ 'gsU<=tK]M80?$t :#%nh:cIa"W/1);C#+֑AGH5M5{e9bq'rX(>]iiɡU*@!Qʤv 12+5i.q< A C/ fo;w3Q0e(8S; #Yx3Rf ک'--Wg߇֚>(\sD8_ gNoI_*&y"x3Ֆ"Qtl=z]w=vAA<5I%$1պ*2LN2#W>nbd7P.h7ȕ)tz}XS kKيcܸY <ޠ)CRZptdC*$m83W'+/8ʢӅ5! oM[ԧfQ~dNJV$tG&C o&aM6x e"˸%YUe!+.܄8ߜnul;19*&UG'-87&﫯|Z5tq'd$-2D,hxYi7e72Z'KgfzQCqD&1!pusVP!w{/fkðO,;I*1^?^lupp~aC,p@j2-Q k D9MJG8noǥT{֑t㞤sjj]j0 垌-e4&ڜJ"fDRwW 7 (ܦ{/6ru&٤M4mIa Cz{U̲jv, Yudb ]Y $虇88k1ofNu`0nu3M q7iWJy_?iaʰdQ$&+2Dq<9 #:XVyz$nz3oP:MSGޔW۫ m1޷ .b jBޅ~j܋lO, #ڎq;b--,~Wd|qxM\hzTo ;c;g>v\COA / .6W)%'.&3EGUzMu,Z{>ށNa)tRA 'LlhI nJ(11> ޗmb1*{PRߺSkù,ymCTN:G&:RvZ,iYIjRnt1vWT6koE"{Ix4vC ff_\5M7lQ yĨEfGXTVOql`C\оaT|R ဩ/ 0y1VO_vJe240 #x=~Ӂ:RR׾2|w+ ~*c'bz^Xrd4j]҉:!0#}|†Q݌ A "^ʵYs-g$4_&! o>jZu:3Ǩ3_ wIktnzpNm>'쌤dr;RCk>'QW?C˓tdj::pգH7hcpBfe89v НY:]s\>ӓH#%, `8ӹpp.0:|>mSSⷯCRفHΉle`.οE1[KGB~eJOQq4." nJWiVbI>|1CO˼|x:wa+ zUX˖k2'}Ҧ_sVgĈ>w:{d4zY[qb%a#Js#"!P~A|Y'zt'J{r$C]8nRA\8pcn G z% JUѾx!N|6E~˒*ɔzM @j+Zv; nd[bT[XR%bmXh3ؕI9HbM]eI9wݍ]Akb-Y`Q[#GmFѧg6g(xV3k;ҳK:V /Di es .n ֫vhd}4VH'b.r2N7.ZM MHcg9Z߷6.rDtE]bn8 K~[Mu;h`^0֬4u6`K\q 7i:JSb}@y4=e [/`EvO˟WF m2x<'Swrܩ> &0F,sܵ5;[ܑ}c+&fA.B. .&46^u /5k?=q1}h@|0MNEpІ h <$ R<`)WU_sקbY!oҵoL{iQB녍MXA$^>Gzpq' x|#vO0.{Su~ ϲ9$8cnT,C]^y9˸՚;`_y4 /Z?QBEJ,ykQ^9[vOb+;4[6B /**x ;:^b"3u35ԵYNO͊~D/6+P(*:-ktxo#"aL`fTCcВ=N$H RU2SɄtnKO{WtLezԂ B$IҘT!T)-0H:O!2h)q`U>]5s.W2ɪqUStyixLav~I,lN<"aAIAlLL!FQK0*M=.{1> [|F#[%'U/婁3G|!|n(ѭ3kb׻āJǓ#o3|F  Cˌdaǐ|WZHRMx' _OaW`pG7[E"JBYv w`*(Xs8vBDo7=!(.T{zw=I +,XUzj5 ==椿a.OͶJw_8=`^=:߹G47y`d[q?ljT&L1ʋ 9Mwivz;e sdq6c9hq[wqcVE'a? *g]73O|)CN MdTΝ.fUurr7@>"I/nigM7VA+o!F;Z՘ݨk3֠%c`课{=^47zI׼eTB='j[tg4uNV(k@&pcTպX'*@gníJT\ə҈bz43\+`vmtm~8ڮwGOJ10pʳB}jstgD8-Ѳ;:\ID_Hݵ/D5*Ek*:t~RJqt`O,]TƞUI(AU#*2 1oiB9!o``I>1w\4{{AE۞U{lPTNBf2_g\e/Gq:3n: 71Y{n3Id*r4 r6\{QG}f-+bMk/`h %d#7fpI4S@ՕN^z _u\w\n22%~~IcoV:=i:][Z9R_GTZNl1;K8Zs0}n ( vߞ5$:͑|t pN}[CF|y/'k]}XEX:Ulk}I## ~=3 U鍙} >Nj8{✕㗋 m1avܨ(C^JfzAڄE˧= |=0æӿ,OFnE,\vf|0 qlv+ f!'ED8YaSTbiphLov-s8$V`0+w$2 :Gm_2~k` h)cB?-qHMFx=:: RڢP1dX~erFEqR_n!WZ}x\S%szl܎)j`f/V YLSd Ex1T⬷ze)@-*i.ᬽeɳ_seF.6H?sO]w̧!^,"ݙx.ar)Č(>A7־ FU#WحlaaeX3y՟v  +&J҅Xk(Cy Q#ꄵ1 ^`J_Tfm=7Z/% ӂSCO5{ <8fF8>f[׼hDJYt=/ݦ`ZS!k\$}sx'i{̬M3M|yu8}`64=Wj9FZ׵ݮcT8iM]<im|w޻>k2L78«"+N#Fs4?tp0P41W|>0\˟|"#2RInpxׂYWKyA.X|p-l{^?1b)%@oF6bEPwVT;T9FN{u 'WӮr<j-x#*T%85"Em+ ͏ 7b\A)5L/9t{M# hTnrߩËAjV5 @B֎hWhO})x:(~J굘tU RKscq^Uߛ4$rI!Wts&>dz_S6abeEe糏,fBmjD oDžu3nK}g!+ET$neHAҨ%\!<{oS͍c)PO^0{ 9ԞRp"aaKGT-|`d<> 45 (3%xfk6'bE.dW2.;$tϿU+u Td~D-a0ZV\E K?UeB;hx AbC+lfz^|O8tOvA-v!VEJ ݠ9)>lFY|>o#e, xw+(J\- /|f,j<[1Z$=D?a߶/j.k4)yPkš\D݇/\]343aָ4 6#*x ݪ3oP8v OVh1nUR`4@] ;,IŠq8, 8F v *?0XG|I\:ΔNs;2-BEfMh&˴`?g?r< .AlHvuy$v蒊N>\.!y Gpp>ǁ d8vmUm_@6RC{'od͹[ >d?4]sR21_'j ke;I#nwϤw ǭuc\Q~R%-Xmf +z/!(A1yӊ69逄8hY| 3P;uo2s G,GZ-t9gͦ:ٷnJDhQìԄ]P$PѨm ̭6.O;!2@r$hXcYݴD?ƣNkґO fJYim+;zp"L0(Pi yjPOQF|[Ygs?Ͷ42ߪ.t!IK;vI4wg CL=1׀ƀ-+%0QCe.u Au%qzIP'HAHZxWڅ9_YٸމKIq`T G%N%R U):XcU"v5$ R%/Bs=Wϯ!=0yCN2K)95LFke4!pr0[6[`a8 fA#هuhuTvLW|o~نkfJ>o]<1EE{±LO s\"Ȏ}Mٝ=?k0!Թ@dgFCv&i>4K`s.4]Ăgv2^#݅0wҬSP3 1jw5a\CE2uE ׇ;X_.-v,(cTt؍.D+ EgNTEǦÅ[i90G0of|hW'q.fViC#<,Uյ89׻6FI؍_5꩚dqw3tri]fϓ {} `y a cNzcኇx%$fM4P a_G_)PeHGB1OVu#xT:) ሦ%$Ը]BDHFJW$9>Vgim?L B1,J#c216 ,Uxcc3q08 ?]\,fi%qi(IzCA92):tCnYj"ƠoMR y0j>_n|>(%9b01y Jw`;!B) z?9ZZxC&+#^pAfhۘ0-]"3$vh^y4,n2ݤ#ǑsSec 7>0#\]pyo=Q)1G>murh9w0C{ pi5V:URE&q޿Vj#F5C%!oxātlQ& 8N^0o6=da(P~j5Cϯ%Cc&&H,-R8/VZ;cQ:rQeG&c U`>ӂΜԧ$*2ueJ] |׈򜜬R~:?+nt}IֆJ `/.ieZ'dʩWyA~\[;6} Ea> I .Y ՞(Ky>d7 Fx|TffYq/VF+rHu8a^O4 QL4bHmsVh\jؐPL|}聆3Opa߽uUm$I 'Bipڕ&JEy"FKeФ]{}p_ʋc(&?gy-}ΕݍnVzbY\Q{+Mn9B{ю^K&6cKB #& _M:9[t1X3so \gUQbkA\ؒXܚ(8-`zb|osz$(/} %F/ f?6) P]4]yFՈ#~f_l}K!5б{)tFdI! &I OM!~Ys^\eҒ,7z2y 勈?ҀaîY|!GPYg YHO@x޶]$ MLDy:W8M'ON.T晰+qSΥCGޭu1SX^>x8)g>[(ְ} e1#=gG*y;`#agNt)DB#}TQ֦hʘĥr ɐWWbϬS&ZS/-4?"}E.a`q:w={4?fUMΕO'/1@} wBz].J0df-3gSBqRer=oq?#$*R$\Tf&d$"Ee}j438 ]?tI.NyIqvӖ Of̿vp@>c%|xBƦƒjP\'#}@F:UU 0T0;i"ryR]@XNihDP.kXLaVlt,ɭqUDb`S=i-:qø춸wDxV8gg1Rvo(E+ν7/Y6V)^Xň蔸ⱍS|zc+ꬸ蟻]dҧެ;} h5ecVE0A@QZDniu?{%+#"V t"!C H tԈtzEOeSy` )GvŚt]]lWN;j`R6okw,S@` ^su>sŒ^ :A7VUZ G}F7L4mY@?dn'V|5߽Y-fGJmdV5Ycك嬋ۅ{oʬry'%*p8I偔(.{\׶0jH!yӜ4_0{ŇW0̇\| x]Zfo.,5 =-'0&  xɐ02І;J͋QAMRݸ$fM'QVdMLX GF9m1 /o_YBJdOb 5 +Ra1.!$xtuBY|U48WX)ڠ)msqݬRvpԓwy"!vzEB}fزۿ OGۈ&m^g`׷yWv'< S=9ɟlaO@eK7c}npIkggq8bQQj$+|"2$InvSM˂T}-kaoFs]:ċզr[bA^*w3KrrgQhaM[/oF;-=+`6T(өzTw̪Yzj+HQHh (XkoXHU bpꘈ>'ټc*]w\'c^ 7Zi5aD'5"]FU~4^X0Q#]hgUU%L (Fbz+5ŝF-949)wҦ%ԥզ^jb_ lVqP%2FČ eU^n$UWN#YphH'6{[NI_6Tlb\qb"CobL ѩʸTYC-FAWa8wO) o:Jd 2!lTa&0(|Vr]ȫկ t#YG$Yl&xTqJ 9ks Q>JLg`.6i mF.5*{mq9_@WTpC5z乩y鄼KY5% jB̚g4g:gYW^MxDq`_i}) 2 qd,]cy؂2ymNdvIUɳ ~_<\BH󙵯M*eD" wnn9[g2s &e? Cw}Wc5Kh0 %7g!"9G@'n&)Dezo [w:m?u\>5>ZēȸR4;'Wprjo y{7*ݖ( }bLp|R@UyZd:n)[no}]2q 6'r9P(1=`J#+>ݒz%QejX+'ewBsW}rQq`/ .c^oWs zWC2Ydc [BKWDu]Bhͳ~$mLipxxSdkM¸2uV0~&^ 5M#!S[cN1 ?U)P9:K:HwМVd canH)'gUy~8q"!kG9/C"`'ղ%»vr"ͪ#qQEM*U<;cjBUQsO?i9cekHd5ٯ")ttBF7lm*XpA2pooj40CP!*aOܰSsgVRGǯq(MAC y48 !d[Ge7 )X7gFDc% ٳg0KG+j ʅ(k0}wL-|M ':yt>Fӹ^hRq71x{DjN5'0|XX7c:hyY/}q;b ɯJM=ꂏ.ͤ!?2ԡ?sg6<[8E[M=_G+^x4 AcN{hFNpЬ`I2V;=.䲆ҍ:=&g"A 5d8ڬG moev_~(PB2І-o[r+.L$Ŗ*ȱA U }XOX[a7BzۋtWINK =N/C݃v{H6eL+HvZceC}˅bYo*ӦCk"j ) 4o!і* "#?`E.d+ oņS[cNJg&CNQ(H#JƒFGg-)KGzQ50m%R][v\KpoW 2{n5T8?u4{M>Q rJ'ێ=0 X2@k DfZ0Cu?J=Bf/Nւan:T <5BL+=G2!$JeF.#R+Q+?^"h2|Vǀ ˌb>Fɬhy 9yJI`* p&q5CP*heK- ,>rF덗SŰOWGk*nS.7(0_W tԝۚJnw:Zd#Mм#PUų LjY ~ܝ ZX[75l~0X[7_4i :{N/]ޔ8٤& <+Pipj muftA#$շ&<ɐWE^ m D&9F i1MA: [ 1q3V3+%tWfAI Re0!ZNq)W+= {zTR-QInPmq(׏Rاz#CU9qIgN --#&Jig*W q.I6uD$&d6ZjGP.8'iDM@^H'\vT0XǑ <SGK?읞5QWnV]x+.#ܢ@tZ7 MV<vaq;mGXYJ6Xsg+x+uBYpbL`<ò'gV]Rۿqd})ŀe0#a ٟgkegb*U*MJ[㾺[%6c J %CCP?8$L5'I t1DŽԗSjXxMl{Y ?29شu-)i S7ԕ#Hwv 0rЊ=u2 t c# sZi,\ڗ+D dQگ=#'\[Z. 7W\ ՂYDBA‹;kE~n# Fb瀌tYxA>>?ՇaGU$pYXiύ\g}lUюQV"߉["2{S62FtJa67]Zs$)a$)sh߾ۖmiM9A8|'/}+ Y4(׈uX6oҘ3X1׊.7J1esdgctέ(&V1ƞ5S7e^2*uYi팴C/~Su MesT؁ ܨ_QJV:;\%R9-G(#>~FqGn!wDz|%;(ȉ<&zaXxè DDje*3nսgGUF:a.b2](E)Fb3;Tp= R>[$ „wyEɛP,K^N.0 ,"ieػ.Hh k{d$G$E`юTntNxwݺ@ts"Q\cU\Q;HDHv)-wTPX^ ,aݔ4YwE@Z~q<;^*ь1t.gC&^K˩ז*Kݣ)׫9nZ .w[g4|gWAhUommЁfpKyʧp^C~0^L/#-5f/ ܦY0TҡA|'⥊By J-vPq"h@1B(&pبZ :ʭ)8,hn\ ;XgdOl.БVFمe(U&K=XP#emIgq* 9< tXw2I1OК)#*Y+8TXʓj?Ⱦo_""QZw |*pKb}$T;Xw;0w!rQw!྘Dw.eOS܊)gD;Ϯ%/jGjmr4xo~˔T$b4NҠcPݪBr_* 3Bsګ>H/ksb+ܚes|Yc*wDX.ŸN9|ެ9z'_W]|+Vݴb^P귯W1|w7q n;S3&S!.0_T-@_l6P1[N+)JȠ밹hpBm F\dfL gnT({!YՀ Pa^YO^ȯ <np+%cdiӭ9Jk=aKZ#2@zTп1`9C2npk f-BJZ.XB&r>Wi֓-?DLf2MÞe+Bl\Y`XbڞG,ΞV!Bb v|$\ptv" JBfb4dRwc@ud?6TgJ5'{][bHaCKN;hw2_ut4%6>8s3.3?͚ApOת :\:-"&q4ovhgBLSrp}857L(h74vkʒg@F Ç,+w/{#3M:1DYݺ4lAJ\:G@rco땑>G*oe [LLB\d!ZF'@&7겔9du#2 bV WWk#vY&sa0Igowf5e;Ys_g9৲5z{tV2:/F@[?֧+Uƽs}->e6#NҢE1 ޿VgK:q{Ck%JwS)JwwX/py;e ;5g[*,{bxP*f?Wi/7i~(nη :ಊ\ZQslХkY `0Iٯ" 7l##!HŕBGfg lpj,IkʂW)&@X*jUN+!WyA,1]DW̉D[ӣi6~4[Z<5]#`֤ErB[q@8.9UHFW0@FlAKK[r֖tkl$C~*z!j?STٖKX*`NhT4,#^zJk1}V݃m6L_MNgy ,emLg Үo'YA%€kJ.r$tG-pX٪M1椿6ԅa8Gҝ{WՏ~P!!rSUYhw]bӃcÙzHnG֡~Ob4n -ױƤ|mc4LrXmNH>Tmi;h<޼sцAq EQ; םbWʚZ8ldii"pL9TGS.m 'Q񨵂f|H4`0f!pf]h"_|䟬nr, ooB=ڹ\ȇ[n}T;|Zz,LÚ;yTlސUVt/~@e ԿGnx]رML!YW> M& 9ҽ CXjE<:$Iq BE[e΀05ҖE}\/QzV@M L)w=`yuUjŘt|,ͨ#?LrE(#H3[d5&'4VWi1L6L^JM`o'rA-ԣbhVgdO8r78ɨЫ% X&Ur ̢lp%v` +jƟ/ҳ/>)ù7cWwTS$`i[@"P3F,4&ܔSCojp992Z/UKU5Rn/ω'\,f5aEb<-mq82)THu2n.ë2],E/Z/&Gi/I3Eš)4eH$LtR:3b2wduMG!4)M܀gd>ֆX8ظwެ~:_XÔ5u]k)~ ^1yu/{{0%K(yezV4WqA|ܕ B ˦ߘTU~SrՑp\ AE4L1M_^@!P< _*F9įeؙVt(CV46Xeo + mDYFqS꒫fJ7*r}h-3/p2jRAR,u⯻VY@$|53~){~zp+1u)OGRJ"vmO1PƯ[_ђV''?[nAp̵zK "$ A+1L<|90KzmR6'Lmbte _PfE.NX^!!!,_.I,$6l0 'G8 gh̀P0yU$`QD%п5ڮnNސz`j;~3{230;3ZN:!lLOhHa@ ,)SeY٭̣\*w?&Bps@(6o01EIq.( r ǠK.l.Y37 lK.EAazS!9֚ig0.@f/aGYGbؿ+.k 2@1$Ӕ*ihcdYVCOY_{R=Kٜ6 CZ [M |SdTG:Sծ2K "DqTg}WC] ;<ޯz&5v!E${~{o| 6XsP˭Vf EÔM)МC{ @OG/ƀ쳤&:kkmF+?n@)npYa:?o앲BdHn">(=@}jf1wCpM7<@-{pڡ['JżS k[ [hUz} ɲ=T, f%$?ŵsߞ] 6r]zAgB<<Lj5fŪqSI̮w=R^!:O-bIr[ѥJ2PwZN-njʎ-kq !6C=/$܏7އvvi)xN( OG538|(?"eg\ٙ:m$dr"8` ֖{ӣ'iI}c䬨 ']7O~X$:Ȯ8ZSG~meS>>W`IZ<˩Qܷ_ V^^V?D>^{U_n\jk[Rاg_GY%Sni$PD0_[| (v, _TqFo {z^rp-^,{, @1O (z?in/0R:` Cr=6,`d/_#QMaANҋSBMVjW&d;LbU}),GNN~t kS\sdN]}Cw[)Tˁ)n\^mi!XLZ>%͚rCaDq#hr $u5S)&*JVjѨB3Jp;$suY+PypGD/TG#<_0mfUg̑sUТ(-&P1w@=hU!b%V?uaHOx-ѡ?SWo#ynwRr}+&!nPtz= â:PHZ:d쒋S]3rHqK 019ֵ,KI(.Vd*!`qi;&UU:vG Zi= LAa$\-d-./ǃ dǸOHGRZ >̩᷵ 0͌)t8k=%$_4:aU"tcR%b\t'DTOXEY:haZo(U|Vd@N=B6d!o=.qCYMU3}=[9J+,BT b6e63ckuqmɽNXm:꺦;pϼeEzޖ~_b?2qgXo|:q3L}KM0%{zT+"-lIB:BQ4vmx^CC5U^Q%L4/ȫpֳX~.L|Ge+ۣbd~'̭2MBI jS5˼\2xrUE1UM1"^7f 1۞"j )c@ uر\YF !YըL.Z,+Q4*<"LlМ* Qݲ$NϮkjoi Mr M HJ2V쐱_ބ7&m|{|,8#_CaUTS@>|fYUxU5l%y.Ȗpi?D#wT=Y*|K~"Ħƪ7k.G7D/N=ηdPTb@=tҽ\6t #8gF`vMCw1h!pG:k(o W # Ox-BR\VCT:sW~+h q>?N?`!*=BfbwV|{6r]t^LzE"`F":} tBȻ,o)TA@1ӱW* hbBDV0xXZ(fDy>9anZ2@TBkI W'8𞫳fH˽ kS!d'M!IF Z {m ]QEaQ.nQ7W.d[!iCQKԞl;6VM=9w 07uT<v)xf|+%Rt+~n1j^󺲲 $K@;1m4QÆt!#5lĭ 8E#ro8;^=AbvV;sP P X"P!vKoKNjTz+1km eTCAhD+)y4M=Z\f٘O͵!J%+Æ-*{[#Iʯo71 N86Sr:3[rcƅ/qD1e[gR7Vɤx yhbBP^ZޮJIr:|ȥ sw 3IDS'ܵ {G͑ZY K5*)Q|["!tBvt|9u\yl1_bau>G 8fE-^gE9~jc!tqdi8B)Z>H]@*I8RXV-(VMbTӛF059uED5F_F *vpj Qk ,:Quh;xW EիahV:  ]Äufu@z`ISXS%*h% )"GKmهP͑xV@ṽĔu1;/t(kBKtjNa1iBFo1=n;a1e:(/zr&vKO!59iө⽢~7o rN8=So1m'GI8Cqz稏*uGt'1IuR0rlL*.`LEoS\g<*#DQ% Mfe)c6/jvi,{F} 乭E%E*;&fq/Cբ\VOضHef`R #x/;iUys,f 9in:yB >{~ỏl9_$|{jځ" ZtqDU$N'ډ'c]R[0/dLkTpKY݇+i>mze WVتEc.q/ĤץRѰ]1Ǥn=ޒ*+t~sն[en]:MBUN7o#@l{qńX7VpjH9wsտqCw%5M?p+I/!xHa S'Ic$U7 EB~Uf?U&3IwOU+>/i'R1Sŋ @V+>56Vj:hJ ^)) vw)f(ZuE 9ksZ!Q\wQXq~ub.80FR%Q &:͘m֐x =FEDhc 6#j@j7Fqj=ɔ#m 5&dRK%Ge8]Lq'~,Pv@;K0a8zF@6Vhz51(] ަr]ɬqel$URI'&%(AGP֣P=UX1h4i$=jv񥲍Ǵ:a1rti T|'C49YǪND{{e,fn\EvƑMJ+#l{-@as X*"޷vXK)IBM7GcL ڛkiC(G/;FkZ|H%*˔=9-6 |GfPKq&ʴ>sF=Ҁ#3j^ 9"Ӡ>^f2sn5G͵p3 -.ʳ\Q݅AF̋B*e"d#| ]T;ޑ%Oz7UU{t4:SQ"0Zaw8~-65V\{=qqHe09M{~tƄ!DlYubbJ}jl[FՈ|ڐ6"d22.Ixj:P\;d{xv`˃Ř'~)hc&68%uq0f`'IeD!0g\7gA KBZ!?$kυu p;g]@yl:>^89_Sic,}cՖߗjRJ)~yM(_=@5l@5{iݿj=V7)&mYuH;l+-&W"r3Y0z@=WnPr'Ҙ˦4,\EsIZB8aa,c4{. Rəz&,3#(OQ""v.=GotqVۉrE3][F+ї*X⠟$W db8e1zihY0Gh.Ra {i2؅Ypt[%.1?fEڢC̵h]gTȌ%1~Q;u 6LݪԥL{yK^ߤ ܥ'`Q#hqĔrI]ˋ?vk-qXH oF3Q F4;U@`S.wܻ%dC9& +?'G+CC׏WzR cNWC'>@pO7*%o*v>Է.(}iӬЬc yfj;O6l:?%xLxbK9ScAA9u6=4XXX g7GU*s"zJUGZ5jN$ia6)(3Sdy#{i)z>lnP:9~>l~h|C{rd=!Sv| +}ѡ7L(_ -ZvTz}h1ݸSq9:F 92:Z9bMb~kr! OsѪZ2S]zw2b#0DFx7TR;]1]=`i yҳSPO3BCesJoY1!\F("JZPY* (G7vUx 3atOat N~0V:Q'CF s׋e2}Tt\i^HvM'"d ,`Fa)!nZS.b٩۰r7!D= cZ1h`q蜭/' @MQDVS]ꩫ§>+sև9FZRJ2!GhW_4(ht 0[`paɣ)59'?kX\]i*'xew· ]Y <)5i/GӢgDXeiuFהŭp`cg)-?Fȴ`T3wC0HE){!ϭs}#[&165!RZ0C+_Q|rd"_Ek?!C&!BqyFKpvB\ԭsYey pbIyLgŬQE eL6 1eHn4*QU_^IZFi Eؕb K g#aD3-91| !XS@Ꝋ㾇0uvȻ SY[QO/uIvqI6-2n ;9%@oV'i!*fgOL0vj%>SX:>|$=UD}Yu(؊Usfw5M¡ɠA g4Sw3yZfpͬZ9ᢒʘ )1&?ЖmohjS%eR-vW]Մ4j5:nC˧.Wq =wrv=V>ziaX"~O!O&yȾο q]V9VFBP;V2CTG͡!yHBܲr Lm~GO]uPg"n3#D3E@쑮!Re)AO/4z>ӑ9<ܠ9oh[] ͮ]&_Z%[D"K2cɥ18K=;66?)V?O85C'Q>nSq}E`ԫ`x5Pp4|۝Krj:i{9mao2;9ufۇn^Gqh [ǷS>Jg}ð-Qslˣi"rw%–X͎brNb3^h=R=JSWn 2|Ɔާ>~r"k)z- \],g@Ex0!d2!f~ՊRD+l~\Ch@^נX/·Wz.~(*?z5lWzG=r2a&Bk.JiEjl1cHHHDjx(SqDm(B3xD_6cJ퐡j̮_ÀA`)L60+jhu$H/&r5!}. k_l[eZ evOa`C@cX&6Ҏ3XgW1DN%9@3A1(kʑyjKHIr|VA..s-)j.ycB֌t2E܃*v\ˈL|U $yqa+tw~~Lk$di Ww_Kv %0~Ɣu 2JyKOvmΙPޑe;'R ~%=~O&J3j†4Kԓ!ij[BMX*C|“.g}r9$LWàC%sT6S,23hӉTLpȚ7^jU|HL5Al 4[W~tT(?DG.Hw@Fvaa"O 6R!H)kzx$ M5& 0Êk6EF^Գ7uD@&3k]5f` E1mrm CD.,ٗ~'\D+z|]o:b4x:p8-7E3s2;;T^iۮS}$=HނKFe9ubwx0y89T?mSP_4HD:ˆtT"(Ng2ޔm.unCZ2u`mJli!ٺu8TZ~whzz*w+/t׍mrfj}])X&1 `8LYGe;ߎf]9U\vۘ9* :iǏk8Źs5Aό.q`?~8LV֭0CSŕ/ˊ^ O9+Jy~z t(zzvFS+2jG]}q䒆'ʙ[ j-A_jy00"BU hA"1)nĦ.P)v[ ˠAWs_vOc}%ihRNiεvVȑWL90>9S:5/j+UR.W~Gnu nd M"],ՠ94U b 9bcGi*m*;BK[X!|U2~JubCݕn|^]9(V[Ò\&bl^DMxKt ;'Ȏ|ɟў? #cXD_~  3vcPQ&Qi{a]#3u)%Rb:kkЁBF=Qh덫/7M9A!78Eg)\Mfg8Y7Pi9od ˌcqtI^j CW/kYʂp!`ŅJ ynܨc\h~$E'$%_b{bS"<7d<1ýVA8~dPΐKUU#=ՌʙSw&U@ǘG!n]Ϋdapɸ='GsxScl[rR> ^K,u ѶGn7Sm5\=44= TjuI>&xk^ 4iCg rfPRz=Am#Se8cHTé #~-8 a|䉌V_p6ȞٝPD?:{ 'Gc - b`\␩@P}*ڵw~ Jx |9}:_zsƠ\q} 4C59 >漞yC t_Nz#? b Ȉ1ejn9)g'N*(SNx}'xu]>f88O- ĸyZuɨúdh/=T>jV$- ֌r*pSr(z@4`tZ!VV"Fhh׶jD&hU2_kXJ:sXvA6cP>Ef'UoCJ cN0P7ܼO F&ޚ;XNO%_.2W,~)4ˎ7%! AD%BT} UG4-n>Ctz.ڕnd}0!IJ Am- ,ĻU]u 3=^{p=Ź(w8^ b0r@4=N;{7`W_& pZ{i}1,)sLK-/y{ xUC&W)IwƪC<=0k_ 2KRMHk"򁟚 %VgNQq;)HC SMfs)k/h(ɮ 0Rϸ ־&Ny@YئT# *ϺپV) O̢=ɪ3D:Q %¿zG8$T#ƤU6VGy6qoJP*lE sBM5l0xZA.cc:@BY_sΨ0铤Bפ20aþiՆgKE1 nSAk[-g ETԗ@|P٠iɂ ,ky0"w]v)JV+SQj5@諒%P{E'HkH5A#nHNxvo/[+^kUEDB.ɷVơ8iG/rI7Lƀ?hd7 A *HT[1&sYU p.TF6EB:Z$,$X I5 dbxn,;p&~#Q9ESazy dG uXa\N'xOۛ`i7 wZsP_ۙ] { lxKMC<-Aa!IZrrE]O8xA4/Lojn?J[Ș=`8}*ǷGVw j7A`=ՄQNVnbw7n@xp2tl({G4ǏWWkn()-;fS+W}{r19z]j?@tT{{ĕ0 t1H?B:zM]Rc`0QÉqx$(ƦqS_s@09{l 雴_HZ3#Ji5xR&Ez^.Vr_~wv#{~U T(d!UFr!g(oMBc?“pBe`!Fq2hbpF·ӱ4^,-h-9EʜHI,]-l'*~:݋"u٪%j`QX۠c@"oeR! {0|-ukb? nSV7aV.Xlh_^Rk⧸M}ޏ\Cv"$LUT'+:@|Vf:dN%ͻ="@z'xn> *`dImaI^CX*-]Gs2g@ACN)avD#k7۶GrJ؟z#7BVa>y}Ā1JPBR>tgH>Œ Ȳ07nlS\c0[M -wE_7K ?܇Ҫ⢹&3j53M|1~]7b.|9_ldn++H!|(/䐈GIʇ̞\< B27t_pK8Fӽ9;pqYո!O#P3z;݈lq(nӂy'HR&]5`Ξ!W.;H;zz:&tNDBgY*+Qs$7E "Z%'?hICsn1gSM9ZX ]B{Όr@z>[h~bE@s*Uo`$WG6U \d4?|*5^h{ΩM7u)ys^$~XvTÞ{:;K73B5ڽP~Z P6pCk y5)k5@K&C@;,"9V~Xo. rvŻm$@.DNz%ҏe (1l?8Pj1`=V~{Ms#6o*tgCځlmKEĵ[U+\=A}T۫7jIz;%iYk} 9@wL ńxQ⵩b#_݈i]OOFl:`OeX9Cyoϩ-Geb|]-?ZβQ`|ry8[>S> (TW@K+Ch&b@]9d@ jmW(/)o}?D%BAna;,N8yd-Gڥ?Xоt\Z`4LR>://t>-`-v/DCz2)'gn+YlK7VFx6SJ o4@INv RVsۉ$ 4jzm |9?kdD2;E*`]':9^ RIM-QF80AflxŢ6Α[ArC> b87?9/ݶ~+a#gz~|P9nt@@wL:m%v J1U Q7ċM'^Ikj[M!\lNX]UV,^Bs&ЦU3f -.})u>2ѧ2Lho79F n5`G&sY$|z! mD- DĵU X"8p?jfìEٽ J|7=Mb.%kgՁ'L8[C=)- >,5.ɮR";NԪm66ymyeÑ囀L-ow>>'.8mMDgi5,$9eaw7ͫS0Y0OD|"3^P7I<,=sVR`DSuR8FhhN2l^h1^oFlf2/3`A%tu[ws,LZRm:9? g*-n:(k Ĉuc.A4̸Yk+n Kv`Ml2T!t!㚣 7%[ oG Ge;I.hթmEAC{q޽"ЅkQg\f Z^V$)r-7mB`cbp‚zy,co+:ĭ*髓]q.\hͅFy Si-wcM?/<ơ^>";Όc>ja=g[b,G$*1+YoR?0UvAC憋.\}^Wqqi/b,MQ;feY^k7Ls@Q 'xзE1;P<˪F`}OWCI"mpꎔwJ&L!cZpsoX[Ixt2 z?_wٟ“y]N4e͕OJއùv:EgWPa?#J×oQUqlǵϾɄ^_ q)|Cj͸I֐rnfu,(m^hI 5 ߬$x͊>.E+}[~Һ[7㘏oC!HwBܙ 'E]_ekD".IdE J]Ge%SZqL@ɴh*u9-RUJgN]}󚋴|+RzmĂtv"r,Tߝ 3^'&l`c~ \wW.w:>ڮߚKy(sAGh23vQ>3 Ǡ07[St`JP>-Ea!bRY^ΪdNG/TeĠ|@X2)Jl-r*bPNKjquˉ om)^A`4AJ#@$E&'=8`dA6Q4qut],XȐKؼrm< ~KV_S&>T/:!y×ʱ~ n8ko {0J.ss#\EJ^ψ:7T0?*K[cԨyT[fYHyk>d[?2TNn8-떉AvCmҷB ?B}Nun񟽣wyM'L9 ]> }Z9}H9(j́6ʹ\fױ;6XDvMk=,{Ebhn #PGQ$=~ <"l ֺ›(bs Ɯ2lP,p{4$x ]F@Eln/iN@(ϦABK)U*h*ҸSweyx3˭gѣ@DDʞ.kb?O K |5U~ap>~h~C;a_$ducZڪ 5xnIB` 13KF2,=&Bs`O&Otk.jW)Z*dK+>G{Jf-\ `gnnFʶ]G3rw.X mϚJ a~hΚ5!¤yN3.Qcu9)g̠5njIZ#ifѕX nܯ 6A/:fmK M> 6ŚW_O'o{ֵ|-c_(8sFF U&]ፎ1ϳPͤIG3}Չh <]W(рd_'ϼU>Bku+C!%l53Ԭ$oiEu0* BM=u S:mEC,6͇$L2b` T#.E ilojT-f+hP z#ṗ`{]f8UZ2/:`[_ۢ6q CR֢hky zfܲ~ v'7۵=`Ә (zu*&B VW\ԯ|&IsR,Zm>+W $,MrF;ᢋYs Gxns@l%5{arjWψ!q⬜t?5cO :u]ヅH$*sy㨶T9R|~Uo+JYtMS5ʉuEL>8@< /(!OYoi[jUF7 S0UB ?)O.7>!L #D8s.U !ʠOKݤo3 r,vKw*F'NFhK%:n1>γm. _~Z'(lZipbcu';2!iUij= >_"9 `$I fVr%_e#SmBL=%6eO2)=/7〸kl6פҩp="KO`oHx„54RZ'4 b шf-Wf5Q%yRݞᥠlY{ f#Gu\^7846U΀JQ6Ko-j'!LD&4sid.h8X%~){k tEQŽ^7&:Bџ/|T?[z@ ǹUn1u9Wb"Q;!QG]n@;RB3\.2eF{Zu0<\A2MnZU#뱛6DBY[Z-) k4EV4BjDL;)B*Inx-Cő=g+_ n%2`wH &Bn 03qj';Zy"Ȱ5]*C$>Լ B}ϓzL\ֆ?Hφ:k7Ԯ@-0(ͽzG7yIp x[T4Fhp&(!f<| I(ɑ|na877yr{q0>ɵ[PtHn}yF;EeU@3p"h3.b.nVjW;J}IƤ+-Qٟ 3%lƝ}fmX}m0eAAb(x`-6?l&Og+*Y_6Vj@,;KCQζ>V)sw3ML?G<*{6|B?rE=WT谘cʭo!O+}=xN"$#7mZ?-jS_gKQ1Kl{֛5Ʌ{YgO S qYZ3Bu)_eU)|Rd+_em fE0(Ɔ.0ָם}«YԼ &eMІμ&YÿaIn\L-G-T~^{0}?%9@7zm2C"[FKi|C~xxN0*=_Ϝ⫑yS)g.ѡQ",gFkDe|Z%7f;Z?칍uSR'8ryYE *P5aTI (Q\ïrr-*ksffb錀Z>,3E}#/阱X )n~S"BcRoj>[2zʩ o^7IwQ2λW`ΌL@%{B9)ȁێu)5ɖJyd]lYZ)̡ݶtBdK PtIUy^ LH# 1GN7 }Is>L20XRqm;&ҩGb՘"4H^ }j[4$+v8Rk/Lš[rcM~֭f9$phZJHpN~UPQߨ"G;/(x<_{!aOeӿ~{n!L> qW5ܓBغ٠ 65)(bǫ`Cm&["hg4 m܆l}y:ș^x@O(bhuO>;_9Ot_KHn%H}Hw2j.^13S^=* D9H>#i2F=yW6u+sGbaL=71̭(;I iD9P_A J-;cP~F3K)I-/9`g_QoL'-A4H@ gb Yb"jwz-(ׂRlpDX$f̑Qn{>ZT(^G;?)[p9ɈoP a\rb$CWmyq5z'핲HRKs6ᤃK,c_5" @n G)W@΢{?M?$FZ a^!VG&A"PҼh\j(뮋l`2MnC-3M@V9Aa=t=ZOR[.dcB{AWCmbb,9j_/pH"s3&]!_ 2" R()]R{z}bfj 5PkyG* _L(S&@WJX3La-ȭV(➩z7EB)'Xٻh1nV TsW|0ߕ E 4=G^bkJ\isy<4@鳎cF|'. 2Ua1OzG* E/hg^"]^7=ŸWhcdZ!p"b`.{/ْ BFmMu&w#t|[*@[*DɺO5G^u$cn-.wyT*twCI'RAy{՜J7ƥ'o 5`EG ].IZ/LtiLk`k1>\ӭd!h(QL*ƕZ_"%RM;#&REo‡;-I㘳<[,eqKQBE=rCy|ЪD\]W/tH]%vf.@tM:0/H9s/GTE;'Gx/v NKKٽ >$C ro5o} di—6)!QۖNd_v /-w&rA٨/PcfXz,fw"A{J0; ,O>qҲA=y Z0B{TcfrHg<ֵKj&dBhx3KNz T,c딵19T%H\)u1-U7g[z ^(-1߉"r~v+*Gyo}i$a>?vB]rYiz(+g j<~v>Wfy.H DD)Yqpiu8Vֽ~QrUy.Q?x;Qdĺ,8Hc=!$誆|]Z(Or&L: 6H3tMU`kHBA7/rcNK|tVպI 0x‘nwB/ͨ V׌m(# c8o^kyv_>ÂZϜRSjgܧ8BxC4ȍ-0;U.ƙjy2vC8X0a *=o<=H?n#(R, B,4*H{EXH4ɞ$%#s/%n6_&\`H +y|kJ=Pi,1QgbnH7i[b^ĐER; UDbPv~XD`EU;cF%G~TnpU'N"ʔ*wѣJhv|FԬTز|X#(Wq֭b`+RQHhP Yw[q[#҇ S)Os|HC bpczvLFGn։6rJ `J%KiOҌ0mH5,|im.Q-VgЊq "^mP]3ŎzYfrD <I?#'[*:]WHjYUXmMUشLdW<N_ydb7W+e^\_c]94q fu٠OG}mο,bٕ̳ŹēvZ z^_gyvc*i,uEyf.ږ0 GX'ȳ%OLdO\K|SB{񔋗 $;wfͼ'#+Z}֢>4\AiBPIuP~ėBG:Ey/6U>S)8p@Ђ\ͰHý@`DE(d00  ^ukYhp# fՔ4~5AoHE{H=蚎_)]4##}BjC2-Ǭ5 "i*uK+nb{/lj+ꀪ0ص w iU]X  šAc+ 7gK5PW9I3w2BL/Z1Pxt@_D~?~˛Ip.KSB5ѵM0_\/1{'n^AhJF{057:ʩ{Jʇqu`hoiDcuʈʞ{Z.FKAEAm,; b`ng˜aRz}O Oc _nd(:_|}{w^<Ƹ \#¼[7Yq{s"N.9j^/Ux&-vd+1c5p9n15TnN~kKLX6,lӺkb֕j+hrع=I VP#z/ Nda97=7P*@ǹSEKf,?5IAȡR]| u~^~(%+L@窎蟳|Ob),A z71EjmrwkMh,'b4Q+[(E KX"lJ#$ST(_XHsts,pO ETT'׬PWDC |#(7;={|E`45\Y*e8=ՁF9h-abd R_W_k8w2'ɉ13uѲYhUwA"v٥hYkc+qzߪ|v1<&1":E(RVSZ#X[ڀS D2}) CZDܙgl +Cե#,0<*Ud*?fu@$;aZm |^-׮`|Gy96B9fzy 0n"ҿFPWׂ{?JpcK7!X9kA M z$9Kx hS֓=kuzorX?WKؠs*c\%]Z6#\Z̃G~ DHmgN4NULzrlԣfLͅ8Spl$"+v1i`x 10NTT7en)`JW?:)u"o3 _\ q$ml:3}ᕅU 万xmHW]R5^?8v3(r?om ?IkrQ}Qʃz89wW],-1KVCp0M:Lf&ǥ~ ,2%4q b,PЉPNT=gvymwy+qޒ/` QÚf68s*ykTR#cwbaS0Ǫ3*QXp쿨;4fZoRhT̓ͳ\cP.4͟ZH{kg5Ʒcwԩfbk蓽0|p2 TT7ӑ'v2TcLL$WŮ;Dc]2z} 'X$~tZ<ə+fTXH  (?{u`hUŘ'rvFGaq omzHS|QGz 4 #AjLȐ-~.[µB21|-CW, J-"&k1a99B7P(`IU[05Ő!]x { !ޞ',3:DkuJ\+=8DE$&_sJНu)[ M k)7L8Eߓ} >~]7+w;'#]kNOr8`݈LIɶvB&0 3B@$t TKlƢhpE鑦11%rq/Ӫ4 6Zx& Vz),$X3׍)E$8c՝ ``n=?r`j{8Dգ '(W&oT;3U(,eazwl ú%8SïSK TN>y8&lJ|o75mYy4~ky܄ӻzvTa*Q",Ul3Zsw?i6:*a:_ j`կ3gxy9Btw,TI?UEfҁϯ]잓˃y<;vț bV?]0|'y' y\4}<7^X ccNE6#!;^ Bi`uNrɉ:`3)sr|:d +w(ኒ i&f!Eڭ;~Ge`BTsQȏ7PI(G@z[9qڔ |Whe?bH'^ }{R66S;ʃ~IM2ne:8+pF%:$gZqViZTNOB:M^X=Qt20B;`򅦺X4*9C%4kCH.|"m3:kQj_2|d3+`ѐi{uvʯ*|8Sn>n_5gBC<8}~؏18:q ΢wph^ch<]7|-cFG/*ҊSOIWS%T8=Qas_煆x8xB~ghyϘtk#{hRj;ICJ S9Š{Yeo7t3 :W$H i/=SbscF\ܪ c!&.XBFN/@muASݾT+ӋN&q@6z3GܿeVzUoKq@U☽cUUr/AޅAs#"gJr(+6V1NJQ{Fu0e2ò:Ρ~k=ͺίXd?Ǣ 6Y Qͭ֋a=$ .`ͣpi5NJIUH'=Ȧ2MD?W6)]KԑT"b7\QX`:Yox$r}zR=I>FN`bPy\]B|`w˴,+`^G^/CP YѧQtmN=2#bI8D⌁4w=zW*AP`puEH^8+7#9Ju5Y?j6nWLT k|x9ScrDdZ<_&[;Y_ fp$=[LX]%, !ɑ4xA/Z=dSM;-^v?H9&P\>\5ΦeV"%IAL1Ŷ/꥛~5 hXrmDZCSdm€ GnIkD]dx@H[hnb>(<﫠 %ҫZ8S-%={{kxh!vXy/A3@aaGibJ]-zlU4ش.q=PSǧ1z@$QJe0WҐdx!h,eU 2qc \pjC ݵ:*ۋBTP\&9G۽hVr #W<7ȁ ƛ]$T]յ3f[O~ aY6JCs"PQo竉&ζ)ژgBjsCGP9^)m@M{yZ5RWd M_Bb$Pȝd k؇"vU Y#/CTG3u$3֥r3M]ֳ5j|ξKӄ3~]Cg<3SJQ|pͮQ=,Eh.HIqND~H DqwtOZuA=s)q=:jORkWc7꫉.EJS TAQ$D۔ﱘxd3́v='E_kR?$qh凜Z2*Vw7X vb@r+ IMc<ͦU }iM_.D]썼t.2; g_ݷȥbo.*-ӼGD<(0kMoKGʈU#v`D ܣ0p=XA__#Lpǵw; /2Z%5I}u[w,WZo&fv %/i'}xY-i?=!;ՍaxU.d3刻\Y?[YNBp',{pP+jF?F"(( +]AshFL&;.$(x[!{8, K)ī}͎Sdۦc=RgCS}~b}KUS꣰ MGXQ~ (?KbI|ɟVjSS Q#C`,@cWnH]00K_zC'0s\W[ozח[Q'ZfzJ)70D6xO.Z"q7K53s)WQRZg] ĶT{'}W3酋%vɽ2{E>Zծ(qTozK)@>grbI c_ &7N"å$U -(ˈXk/)Da|]խ챴w{9xY'11O8Q2cnLm*as<~;Hjѓlвy,&+Qdj"z% x5?"9Ph٘4Z7%<@TAIl7[% 'c 1nh ؈ *󬫦Kzet_gS[uaoovߗwYRv)A|D'5f(YZ䒿=a. 6m+'0 }یm\ʳj8 űSg(m#[NG}o: Z4>փba!enDlE*_8qbU֥4buuFVѻ; @lPm;ē(,4R}fsѹA 'fہM+^\T~g0 Qm>ǬD뇳MӛIɟDp@7ܶ~l#trc%o0$N < B%P>) n('ٜ[v8mY$k=Q 'GTPrQrE70dYPbeTs1Iiߐ>wD#aqO.g7֣i:UҹPϗ0TD2]3)߆*Zb5)dj 6Bwt%z% 7LU닱L >iWUC(bAU qvE`]lvD*}Rg1\ eH=95QxZ, TWbb<xc vFsԹ8G_P;g»qfPFO)=ޠƚ"=^,'<(0`*=Y5mODl1|RpƯaF%b44@otͯ Ctߕ)^Qa825 8wic8i_Jz o>`SONNMuAF< xleBFZmt1P! ]Itw.jױ tD9)Đa'U5eEE:4e^$Ns2'x!;%jqJQtgBF ÇN]NQ[qI }Ll肴I9݊{e˺(74I{$Rc>HY=N7x5@^LБ7 Bb70Ϸ4$UKp\TlFSq1yߨ-U<|҅uiko%#=h̕} iܑ,Cf5dXVEÀdArIAhLsG &y$@i/ h45ɢ@%0/sT1EY)xfEɑo*vBc+t<9BA[R▙w#8ܮ8&旑X o}tŢTn"+k Fe6ǿ*[$y:}ƫx_nKSز-$ UWF-Tg`Be R$e*[wbpŦQCMRym h(!pK*qvڴkvR1W Rjw^|+li*vgTw= 3xf-^{8&'>pүy>L&UɡY9=kt3rKAI Re0!FpJ;kXlufi%i& yTъܝo&G韐HtM*X=o6;xl{zZ1i>z{'~Sx.4 |)A&S5]IrC@ͫ ur#$P9Ir/fU6N 1(!̞%}|$?Bpg 叭iX" ]^71:ÂhmT>cĝś^Qb?;GGMg.| S7 Ȃsiz=PЁAeD%"0zmL*: @p(d{* `h)f {f.W̝0o[2I[FFna}}ۊp^ue]QPJJ]d gϣ_RaʸYZ/ =@tS@O5N}e4`jLG)㠓(8śbf}W {\8v>G'f-/0rQ)hNL`ǩ&!w5C/D&,ÅMeMZ9e`nMVMf3aTmNdZR㡭5Jn2uJ[uWF|j{O f\MI7 ,bn)H3 _5 VtyΖ~&*aB˱؅)Z.޻|+1ζϪ6曗,SdXb9wD2Jσ'4q-w$|]ڹ 6GPԾ $4 y 8EwW2MJx1$r|; jENpUsb[Bɵ2j"3'(]'fzgd?ƛL͍k>MPo<['cvL|%LQJu :gF{6RH%د8:mm9s-ZeFc5P'>Yj=~wr(^;Oc5y*w>,ӫaQRw֋Gs!LjwT*υ+J+cgAyTH#h(L_1 yF oY \Լ 34t`lC[7W^+ '!9w; Ҝ<#c_&d!j4Zю&AzENB%/]Þr ra(A;IJ4N+"t\AGӭbs R[|2]Sfl!Acj&G]Mz7jG\>|\c,d) 0WƄd8~  Y#iX"r KL!5:i$۸H4J_h# \"/yKwׂ[[:TA#./~< ٜZmM {|tsևgVIoX#O 1\4Hxg%a E\N@sEC[yq9`bh+Z)!{pe0MH>b 0-,̖>wTƿ>gp%Kq7^X)[\WP.|u>t [ '}@uz8Hleϝ\x:҅-d/X/l}䡣2|ҦWf7Ve YSpd&oݘ.^m,Z5'uۨ2]Lyjo!a׆-w}վOTclis&(QUpQ}`(L yPי;-#QP%څ[>"KYHʥsJ7YS;=t0(c^/ޗ-zoC@  Q .9N5ۑD./UvVN4}3БhF@~(U -* ;{KnaG"(@sG/&QOl615j nuoKQmU4x-1i jf="˰T|3f ǓOyc6(a$PxS9(=P P8ʱm7“]Tg}36= glk(vEz J̃Y<:L?~/ $~2m:9Bd Zs=EK27l< Q)Ƴ^P^iE66Ɓ S &ɳȾƨ5Ƽ椆уX}p5Ju+(׸s2jݷA 05!zP(̜w)ex),X 4 82G>~9Y\욏/dfm ϲd3hbYÅ|U~{T`K`#/HLg\RFvEKR| 2֑K\Z&t?ڵ^JRVG%'y]<,Wɢn4qUaN?fbºbhjT*6ع96)XohgZz?O WⳍoK,6Dt鮛ٮ}W|ǫ:}U [5aWf};n.L(XgHRObwCPچ&lru|2B= 7Ct"(NWݽmJt M0ugҢ'U-XhVbg}uDB-%t?:!`+Fm^pWUFV[PZK>? !6ݣ -[i,O+mV (]Ϥe4F|^[j͢IH蓣i%.ښoBroչ҇'p˗dswNQ-ŒF-anXjxֆx~밧t̯﫻( 3F☣ 1]Ke.qT'@2"dc R}P_G(Kr?bd#:.ĠIya(>EJLV,T,x+O8,6b`3חLT -%4Ԋeh,0ƔƍH_牓WtO ֦*{;8!aSĊ"zMTu j;lZ, MQ0`ΨuWpje(RpgtXl7'> I/c9^$ Q.FRe/ .-4.gwPSΛDUg8RT6 '{ '8ؾy&-ԏ z7c\'JbK!@]B0.6rl #|/JH*r{Rf;,&qYE яT}]84+,N-Wb$hXUi*)otR9d DZ[ct50*5|WtZavT66ֺZ3G_J`ÅXEDzz1EsИ֐i% 7ǢZ ! $˳#}^.n4GZ?:ꃲr6*ȹkr $o=d!ZwW;}zJ%)>+jƭcoWB;j"?Y[PINa@Fe^fG`|XܕN-u=q[XD"|GlD'E5ĻnLW*|z? yOCC=H9}Pe=e28ewO:? } NBK na~C G |h=^GۇY}J }TُKy&tAr;Yf7/EI(#jdYCtؙ q +~*]◬*0H],¢#10&5sȤWqʑ̉ʍ-p}F;8 $ s}{#Q{#AU$ pBDi*>fMOxNݟNteeMʊ#+X3 xi$ 8ݎH@vئBy-(<8}E}jZ ma$*StEPˋ"%?(LK_;`Χ_L: S`U&|&15\o&*U^JVm^2*Y,btMej@SFtm~;sdybpubl;ܒ~r^px{LM3~7xef+_y@&eUKDé$'ݍ aHi5DKSc@!#bZ/qǪ_/ӓ4Ot[@ॎa5jB:%pcP$P(6NN-pP‹ <Otb*%-qEd)I̱yg٤([ɊPsrdTL,U!S N8TO˅$$D`u⮤\RR by]UR' -;0 d4TpU2AݾfIӸ9҅U5"A*?g$FkH߻CRy$vX<LJۿXajcw))%}M\dψ ID/"nفzr H2rl}Vjf@,#|0k|h%ʌ|}m?܃[&GJ4kC5| y7N5QP%{ ׂc7ǧӁp*w t+s]TE)H_Tep^Xrx69˶9pL)@x*}"9if}mEqkނndO7=&^rEsv%+ m`JRwx_bH_WwqNj5]g `|ny0Qk:);bq!x=[WU/g-z+b(S| =[53&HE66|l{9wW2F 3^bj hLy4%!OT J(e$1o<Ֆ/W:)tNwBXHvS,u7d 43;(ANֻ$p#u^؁7?ZݥomC8ys>A` ,?Lhb֌-}y71,Gpɻ'8 M^k/e;Ϝ. 2Iɳ%׿j}RWN(QXpƘAd',ư9h216/2ī*qı/$|%`9#*K P$eL6^sy%[kB=pgYfH]@1*8K8fq%P:Y oG{x'9'cz*uR`#b=hi-}]Ȅ o Ӿ2Ht4Wj2sGYOtgsfQI ¤p`M"s\P F@keRX ew/Lˬ|3J"Ҵ{EGڳE rH7 `WdŹ>eu>ʲfx-%t澀W"- x]- .ZZHԙiSu­&we?v'aLÓH&HAzMNQ' O}$ j$HT xPkd=їm$d=soݧ2 nZ=5UP=DZUSDTh_TY2lMJUW}Ҹ' -J݈SĸTb]IX4=fzӤ,^=ho6z? I@ʣ p /LvvSgEeGepK]*䐏Q뚡V>n롸n $v| 2x Z"M{̄rkw#NbqjI+?֞46#ј?ofNmAb@ނeƷV t:(&k@]u mbQ9}ԯd8" D󤉇J\HZ!W[ ..=h`5#[]qfjI9ڻ6{?[?D`IÅ0"ޠV…GJpE%;W? XR6JK b)Vl}}<:oNF[.~,`6( 87ψޕ Pm^lB*T'kR^ϯmX/P3ҙ4dDGv͡##\-b:tT*e},O?vS'y[[4Qa,:lt6$WERȐtfv Ieou3M۷A "0u6RIn3U`~3);-PR毑I4qQ#m+)WֲnfG4y p4*4 2 )9RܳwMR Rhf% XR@uF`j7'xQMczF%\NdaA*Qz:0:U͒iNhyOG @y|fZoo0i,7ju߀'%O1s978I{Nj -ԮvH~xFdǫ\ Ä9~*-.,,RUN\$ZkҒQKpQe"#꧰D ~lqbxf妆̀ Xs>5qN31YaCB*ak#MYԞ0?[ n{5-v7P#T7=bNV c@ST[yFO3I9T p*/7 fοYqłJ}Yd}ѡ*IÅ^ e+B= /su G5s!Tz~4Dڨb<%xkjGTŸsD2I$oi .PU 3(S"fp̼SVpiD9kn)"9+?>jZVl)}IĘ#R*oLB(aG!͎2Clwi`!/ &` jpںִc:щ~&5/>٬4߀XlSҀ NoqXW.h cj]<(5Q6?/RXp@ ŚhF2N9D(IB<. ?حWR= `^JT6y\4bFɕ #fB"GLЮ?k{1U](M9?Q%lJ~OQ%ӏ!)g/N OFu&Kߋm>\V/R'g@CRBx.=m dH& 4_=zPJRhlBHU";R 9+mpBjЎ# e 8ӽtAMn4zc!e*l;SY.KF W*| rMm&c2>Km/#HcO.#vXۥ׽\q"hȘr'97Z?;#ҜЮwO&&F;7aȻwҽ\=:c~ʚy$8S\r rFO|j(.Wu?sLկo^&zCGy5XuEiRmE}˺C'SChlb$sx; VN-ӁBY#%H%m3ٌ'h!m~98O0E(K'l뚰CES٭22zQ\UpauNE'#@}FMЈ%f3~ tV*O|J?A"Cn EUm4ğkDMLՋ' 9P:xw!> k h}w?ps + @.XIq|OQCNQlE2_iQf/(ɯ#_:SI7X Zj o}dTۢ 2A.߹EqFeV@', (V'}z| ` :>Gϵ $ g*m{'򡂔 Ou+5:﹩Oc Q/z_Ren٪J0tmq$ zٲUsԖ*6'Ў(aB+WG*w Č4чUAz;+4ޤ4P=_,hsمQٌ²% 1Z E&@8AAcb$_ߖJZD#n p+)Z&}2n-F "\$%nR2BMiFhDqRYU9tLn ߣZb@y5 ~ 1;/\7I*5 ge)9ҥt3 q3ךNb51b3Џtô:jqǦXˎuYaytJlbj0O5[SzO2 Rx D4`l *?[c)WF׏yk,B?ǽ[neES QB_ρ!|8b-Hbޝ v8gsN41[`Gz2yDL5Uɮ)QgFesW0aۘI Pt#[5R?QTWwyagiݜ>2$6wERujؓ)9MpۂL=#}'=rp<+Hʩ3I—鋋5ȡP킦Dt~<\ |^ZfT-gTJ$,9%_rӜd?1o3ypVN"'9Ɩu9^v7/WF850D^R[nCN˙D[|".5JW6^|t}! Ӕ {xå CO jTna4,z<)C՘N0)j4D bh_ZrJë*Cgs~d߉kViQ+`ᱰ;Gtˬ%^0*uh{$ﰨ;^N#T CRMsU|)$ϒ[>ǭZ*7uKL6bwU$֝wS5ŽE\nF'dC xG1Twօ8Ex1djY16=5;o(*v y`fIV#9'Z S6Y_˓b&x#B5CxҋlvߥTZc_"lH)X6mEvr ʽEy<@ה8 'RSV!@^3BRi (f`3F\!dB lMW6@<1$͑qMBGwr!ג 5Rt47Ņqw2j\\T!ջKjU FvVEn=n,L7݈*_. {H^sQgp@J`JQdş*10a"tha,Lӛ@m@;5L\^7P`r{qJtW8sGKώ{z_x7.VЍi EJ=g%"-]F#Y{ߌ5Ըha˔ H,4b ~f=܇1OiT7KoKBdzI I LUkX=b[ 2$,UOM &\u۪t49#E$ݟH J[F瘫:)sx_dfRn3Z?F)1>q&0qPrq2G>\ x؀RԶb RKY z3JAR2iq\[?H\pA-03afjQE喼'2lMy/O.ơ[I=!)boEЍ>! ''1ce.@_se˛4e]Wx@4 *4;TGr\KҪ3xpon"6v8iOTO{TboMbJi獻_SjSĞ@/XaевfrJKk!}|z.8Z6SMerfp1;y6=;Y!Çt]n5*Vp!= Jww"aB'a‰aJD HrY; qgx@8a\K|2 w,$ӸxI3N5C'=SV?t6`S,Q!cwI.؏ }) PjܖjGL2()\:گ׽xE+Qx5Nj}zEvq9^-Iĩj_)\ gM\LX::,x7nqByrAq|̈́< L{u|uoQG7 \iI)ЧTN]ڀAwSyiM:59UY|OeH#SZ=L^&WfAK& GOwfl;igҙU176=7kJh׎ WhkY9<cHP1[ R=1a<ᡀ]@ٟ>_AdHK{{!b /%@#FE6_Niա@iW'Gḷh\Rͦ3@\n ̏L⥢w%"p!|p:ژaN[U1s#CTxs8w1R9nZcHN ]kFpp՗#V`ugoiPLa97oMD#cU㒽E5fq/^Ӆfgc FmPp578vtxU Srokm\ Nތ{2kJXY$ePQS =hzS([ՠsQTDR8J_~wxhB=f) CZ_Z Da'%`N@|WV}g۔zι($l}Bp89̑A ۘ&l,,)<s$o|u=C8S4V(l޷2 I h)^mTGHgwnmJ4 8\W-ԣB\ sR9 nVhmzgσhCݏĔʎ. T,O[pm闶ЅyM,D\(턡6'C˓ݥYW@07-V!p|uOaSˣђE؇*m*>"UtčVL 9>ܫL_/ vz[]s,98 8([*OY u_(t;; "r ,S`K3?FnVs⊨nQ aN.=XHor mC_OPcYE/$FO|[,%B|G [9WԯrZ]!$ 1F+`b(<9*oC& "  WrhbΚ7{ưzL|O63,\GpR>K6;EY/xc<ҕeuNg|.NLvmtf֎9Mr)p}DA`7KJKR#',9TGKevB0Ȃ#ky7alVa 3;o_U'緇]-$2^xkuMbtr=)Bd2-lO|X2ٱIM;d7[t_ niN=QVӰM1|(R'skAk{zCR>ڀWBwWZޑ[._I\ՌɭO]͢pC;ѶT* JN,>KѽCud[9)fdZ8[X{:(8yQ9i:l:׏S)64m-wOUy5p"xQt5үNd*?ШW-6a|NzMvoa⻨~Y'0ۀKN c[XԞ9]T즼G` u[?۳ŨMH~#~C[M~HѰ25(qϏ4UWF_kBG'?DBU -AU+϶>)keuvQ#QfGXN kNKSS +֤슽N…E{\Bb1BWRt*[c z #ȣ 状˃bH?2M)<7$zva~- 66f$&6p˪;QȠ`&]<@JOpʚ[1.ݦCpN #v'[pMjs*Ls hcڋy_P.L|Q y}֎i\(%g}G Nn;@8Q:V$NE2 UJÆ^`'>TWD?2=WH & HwsP5)}닱hJO1qnKOcY>V>A9>lo Uk7`>ߋ n}O3oNUk-ժ<崨@V 1O*8lwM:è%( Kxf(B6 s#>£y$K8@#8ye\1לRqm(=O7#|Tp mk^h껿ɓ)E"$H)oGg^e)i]hԦ|/x_Ht^Xo4tg!+~0NX "ⴗ5O dzfj:hjipDRбWx#՟VkvwF?|ٶ?c5Kjfunw-lyl$I[j^&DP" L!Ս=*u[d9|elPKVWKn뗍~]uh[9TUeZp*.ޒE;37/\o.hi=tm{NfnԲ~Ϳu8,4lGfz!݈'Σ'卿t1D˂T]bO\ (_WLw&{5N/ ֥sRx)@БVyashn3{wJx(]`Ӿ PϳepMq$ǯ, ^e3XJO5fM pv.I vݦZ,k ێܨZ #]C3*ӷKz)ATnS@ΥjW6+DYq-9uV(t,Fݟ1Pөx >Sh/Æ)=[MnZ^}H2* Ae˴bρH^[[qhm- JaVϩ=itd$2 eD!o>,jMǯ3V⤎[Pzc爦oU8s;@!FnN 葂ڥ ԑ͑(RkFs?̋clx˳~+:aK$ib=0.Ҕtuv@Sr78 85ƛ=&@͂|F(zIO!nHzs7'ș-|2f*y(r%Z_h JFMŭTqsP5Hଋ8!y&VL$*#PaS*;8;$~Jgtޯo"ɉca$c 8ϲ,a C蝹S_^BWfocHs TGQ *="윖Ŗׂ(f hw5Q5_+/Hhx\ yyhy i:|%qDkM:Ԑa"ꆦsڠvP PJXk`P! [C=y؇؁dbDSL ބf60.FmAQ(o*Af;xf/{2v!SܜJJҥdTG0ղ[38{ 4p"FB!GFݫ-ݥP7ږ`k(:(t(uLw P ⭑榰ǾAśLs?lRdj Aff47{C"Mژ+ X[2p@҇/5:l@'; >쿕R|#ӹ!&>~S釲h.{+y];*uX]˻(\NچhXz'_§ɢ1 QDP/4}$(vi嵼ޣ@&sl&)’;Nʯ(VGrB^zmDĿ2:@w Vg% sȳ[ZyHD6)X>͏xJ0.9(z\!D0"gxY\fNj*HIT"M{갮z)… HRxƝV,kPNF9BDPg4]^ie8Z(ḿ82y˪=RHtC:5<*&H]Ip5#x0LY샵 M!2ʃ rGO: h?iKPki D>@]^b'A`J, ثtC #$)YAhQiĴNHt4"'\T* tC_bƋV"X뛼9:O̅AlbiZN/i x¼KM=+X&'1 ; .nB~\*Ψ?];LM^\W6^"̋d. j]ybM5qq$7xt:99,.?^JI iM$ϙB91I^pž!V4,,l{ Ee႑+f%e?o^_,r)xo#hk6O#:KF)JՏ3X܃8|xr3 0F@1*h3Ns8(ԓӸd!XM1Hfrj`=NayȟagjͲaW5f޲~:k2hX)3FZM})cˌR1bޞ?괘unce֌H3 @F |mz'رO;wL\-,"m} PD/1E6eU[D!GLU/8p&nZʇ7 ]0"D?z[ v:S!Aڛg=}!*M3}[ҧR"D}GCVv!+Jfg{!9ńƺ2M eB f&0-$7 F Q4K;DUNUMwd]򯷺Mm/봪]W+6{ ^SenFR5xwO7x%P'FNS) m?6v. 37jfoL\1p6XV?)<&vhN݉5Nob!/A8 J 7{p[V ,Z⹱5~aaXh`W^rq52MV)9>c7iȕ 0ŧnC3[% \b=Wuh2aQWKU6Mηܛ+9Z<|}Bp% Fk5`O+?rd[#cиU>ANЅNRN?ͥVd-.bo¢ [o n"/ԵRyfi%15:[^6a{ZAOՈwZڎu—=:µ46]ynjT$#4pi|w D";N N='ն}SHO8L'E;Dm^Z럽(ٳzL7m\v ЈWYdOK@߶OAz!7 Z,9[W'ʊq_,j!4%N?7^FZR+ ; 9&A^NBA8c 4"@!g13l:`}{"J<3rYrBuO{?c!aC*,9]I/3v*%'(fn6Dy `WtV|H|>,qzR0!ݷ,ʎsZ۟`0KV+ }#c}Y/xKQ7*Ǯ5Zq$1+|%]Gv(>%< i &`-ͷX}ͮ 3)zA /R(UdC%gWK# n'l=1Y2Bs[Kx_vtmя^l-x%KMO9Rpem+6nJJhZP`=^0>;$)t`4X L17q']cuANj0e;[Y{sRő_lbyo|CPvvRLgy "N 0ңp< G,ПjGc3ap\]!hc}IR%Ƃm%"_aίHqS"˱o҄#v>He 5ըT [b) _Bnlwi"8-L b 3QuqiࠖcⅽwTSR`83lUx0dWi;OqO- 1S0[Un- MC=W̊ TDvVMQFZ1 m3:گMgj4X6'(S콇8>X6GX y!|6/۩9rwJW뇭@SÆH>92aTF"VduxX1t^Fcbأ%׵tbBp5|o*ǡI4gY< m.%j"eO 1> f+l<@vlBٽwV [ew:0d&O=2Gn*$;;bR.d.(ElYE.INrwԥq4EV'r=! kyxŵ܆?&m* t͌AuῺT +jA׮~CSO?5]%Z.6icT9̨P>Ls`"*ͷ bkZ58NSObQ=VHz7 9tGTF˩k%Fvtfb=]c1= 0=6լPI T nGW$xm+216HX"|Hd% BM$¢nyr~s*t1+$居%/W:9&t*E g'Vi_v,d[9 ^4BԮ!ޭ'G/!m*4Ŧ8~ui>r@݃Z* {O¹Jg:5dU2Iv*M.r"^\n̵*Pg}tqNշlhaU腲U0\T %u@ӱ Qro;MC9ܓ~/؉AV'>{ގxb/0ULQK@~wW>M]DO8鍟Wko)Bnf'XFG? dg 0lh ;f)7ڷnZȖE^fpF a*G 5N/s䉓=e3ѓ˳J؟įڇ@ah?>4d8E-f{7eb 8 ".Io!ZFG@x<b9z܂>N: DpK*a."; eC?&[Y~+_X+*&~SBv|. PlAhܞ qz5jzkmF%nz u f fE:';@ w.7'tOg:h>o2c|7X^} GY?)n$ qEKd0 ["'F>z}Rql;=(F7BP.[P~6,29Q@ ˶ދۻ'ΑXb/ 4edhGԗ@t|DŽAWcY}h3*umpGNOw*ec䴠8B9ppO.,žoqKzcHZ;tRX3dZ|OG^o\>s w1`76h^@y+EAnwmcM;,;_D7SJW|^`c@i>2S΁p9-1:~e31Tz7}+LXw8<ΘM/`hqp9tsț_$#<>غb-AKʂ]O_d<!{^VJ8}m?Yr& Njp#O:u&^N$>1BjwzK#U Rwهvaig3:{F)`f~,?<2ly/-sV>| +wAY&:ZE)HDٔo f 7 +R)VoƟ0ul=J'@ 6,O5z+] XwG F<B?ce+ H8%>,)RgfE(JM*ln9gWNOMXõ[B+)1UN}=IzylVڜ05^:QQilb88>=L4X'jT柶zmL5pQH8ldWYo? ylz!,*V^2w.8o쾙"2v wk /*\HU8& JMzjpX(rXPvr#9}t7x2u-l{|>SA.w{Gp3ܘ39L4?IVH :}[J-_Qq)0Hc٢@?v9B[Lk9q0. PUxE!RCe|)y?Μfg:g;G{|! efM!կW>_`,#Q(y  N۰EM׍_V:9pGV+O%q n:4H+VtNaj=+#\w V4yRG\!^ȣf&XhCI "պ[6_^N'q.D'1`?v>UWhb.A-PԌt N\՛|EIru9пhզ:=<+؄ o0#5^7K,w?/}Ǒ;z9 4M]gBԆ|tʨK ymhx)ʘfKL֓o܊L,M;J. B;k ƻZr$iŻ&(9,%KEp@TS06Zg$fiTww2qɠlHƌXJS{͇Y~ϜϮυq0O g [1=a7ur $J,B(٢gÅ B(wC"Stv@@1d32&$>YL;G]{dW{5ŃNr?oeu.c+[Eo<0N[k[=!>9HE)'z3zܲsW~u̶-Z_(_7:UV b5|ZSK@>`<G/s"L"$c_o7/ˣq,,SZyjϦӎt^~vVߧZ\C?xW,]H(- G)Pt==;ܺ40" ;@ 64i gT0n)Tc)h!+Y$$+aM8Ut b84d,C,AIAhLsEFL7͕;$ ˠid3b w>jQ A xC.U4Җ@#uB6-ZQfL\Z΃j] LIbD-Im}^Z Vh%m g- ȼ6@jP(iR.W!eQF擇7y$}γU]["yx˯h&O_d<sp,W[`bypi`ݔđ*3gYC$ /-̴VLOÊgYY؄n41ئI֟m&QW9}knzS.zFY(c?znWOJ1AyP%?žQ"bkC2]d}%XHV!-p8Z?RZ#*ؗEjj(+R+y3ϻ έ0^%Xa݀$Z&;9M&F=_PaMfZḓˆlג߁rVjZm o]=dxX*#w!,<[ツOz ' 2F qc+(OB$XAX %@ۗ4\E:,z&_3 ]2H[D{?AAfцΏ!<]ImzU_hx}MKPf;KP=8N ='-5u@30GfOY}`].WB1$sۈk^ GMz<Ϧ+VN#=kjtHC,Gi8 %]TUZǨ-{ӳGI1XTMVC$#(P*|TvüD3@ۙ'ICa,}ȂK2>TT\\^3Ȩ S]pN8u`VghG{DeZP6yGiӰҺNVP1%!@x7jXGYMa7&{HDŽhȟVfja j;xo#%.́!=ѸvL4cւE!+ڑ!.yEUbC[뗓)c`F%rDHh(L,͹+^#: 6^[^ibc{V֠*A-]I~]2E2 ,v0d3Ak^n <>"&@u,,u j Go|g$-XGYו~SAÆ`0& o..U5rQLINEN bucƗv?==l(HyfG(-,OA`X`j$ ZǷ&YkK:95l vʚ>IQ{ Bt4DWj0?GDs=+<8sAW^uobC;%.꨹oDbKQ/!,3=+)X꼋 )$a3NEU$"tÌf N*xB&iFm-!ib%/ O&f[7~^"6~T߱9Ê}+/F"Gl: _zu'ZGSRAA8ʹdmuc:3!,|'J[=AS7;RCjكчR7=(olñ/*:2BDh 6tܛ(hR_ēHMSotyN7r Es h=R pNץ'r"}뱠PK,Q}e7HdnE* 03b wbR04ױ"NoZtµ}R-0Yhsw]*> zhj2Q_굌ODV]%1hmpT3N?~=q  SwzF tj`nRQEKJl7NfRgͫ? Cl;@I~{ӿ3n*\=OJD w/̡QK$s@uCBW0~#@cQl\ܐH̀p}ϟuȬv#÷đ43vp|+yӯ;f_8dQߗ/wz^16z$ɮ8"R qa[4ĬoaEcRV̬%t"iɃ׻jKAR, Y?z%F-SMNVhuBQWo*,8i+(nF|j}c S':WЦd}dyG]-Z&'5.ɾuA0>2|)ryogA5Hq!0n8ղlFUsY΃#5ϥʌ.g&:"E!`rDrD&3.QdR:uwqot:=I m&״0^]*Jvv@"Sk{l..XN`u/ UWN:hB$HOOT4rd2aL5~vYg#6w5slbQ3GhE,]zp0Lik {&\}? ~a]xl5x?SAi$޷aGpf\!l+N[a3(߂?01'~;p/"޲O=[ݹE\_C] Օǂ@!(5Z;ɵGM0K9p_|m"­G+<obF&׺"U}Krd̂àà*e^<i p0d"M>r[N,sck9qis ggH*N)*{m#I0TG\wGgyCz vn4c#mlFz<%6nbq0*G'SƘ&d#yf[> =[KG4Ņ7b75 ~x C~?ߊH^"H Txі=Y#񚥩4Sڳ{>:;@?f *uѢ@&8W@aHFR 87"t&8'0Xw=3YX 2PxBͤAgWnjC t#6hWx,)/dսt F!dwG^2Yϑ-:祖=PKr@!`=a QE[vz]̬]8Q]](D.iHLE_ -D=xI6QHUWO:j؃N<֓GwoJkW%~v3l&K& C Y#2e-Ę҆3ql"5k(,8q3f淅wX}6PL lͥ2O.?"hp,) F Y:mҀX'D`}Wo yO9[Nj#m<wӋkŀ5MFbzx_x׈HTW405dr_ߙryFj$)[+]I.MsiМ?3BSֺk'E_qjϠr jqp(A.-LQ"'70idj<$l@܂&ԵXe}|cܚPRᾥZb֧#o)p kŸ!滸Kga.U>2o- [4u#xsh梷NֲWo,gM8qERIf,FNߥE>P#+\Ԯ4Np2يr[+`;fƱ#R(9xiUٲ0 K~8F]W(C4G:;lM ~FvRGR.=Ψ 5Ֆ!D AEl+ڪNS#羽ȴF:CO~`YQcԙ;4f9"EwB0^hlS4o,'1z:nEJˠ)t" g77K9kD3zΞܿmg!\WCGa]Di*͒yE].ў'R0dD âMe2we~l$(պ@Z2F 2{cpa '$e̤e+p:􆂗tri[v*&S6'#Y*į&̹gOoҡ'>OR J: Շ Qmn(R-4gPhK 5˪恥pB0 ;;.l59ةl ,g 9y$ڤw?b^\Jr ZwnVh ^㢃H UУ;;D'AA3ع91H :OVqV:CF Fpt).b)I Td4 4~Slv3|F.U Li8EjW?zL3zrzJU >",VLOv=ALV&7q>RQ~"U$KmAJy\OW'$˔ԯܗ4HVF;]ӞkXg:[V݄Q0Ш 2imSg=DaG+VropAxҍA\-O!E2e5OOn 0҃WA[#[sHOㄇѿa%JEgCHµ<3',<^Q+yRԖrE#@_)-ڭ~J00Ylv~U$ ¶ZⶶSP/Aaá5nߵP]rntE.-AKF=zuPb.]kuЅ̯ Ra4[|߼a:+Y3' (ڸ W܉Ц׉Qtnr ye|jVs]«o3~BzvϚ@T>4DW[!Oi})"i7ey@y;qy@b@Iڣ_8GM@*P5ȎeBs7@lP/?ADL`[;n9>8A%>E2]|}۫.uM,Zo,J_3ΌW+ 1  k҉~4=\88;lj;ӥ1o&S!'pc` 4FNWW_= ҝ+WkRHr@'sÑyGXἈ|dIfSvbb8,ƀ( wbbkr,l[Ļ ґ$Tv B1a$CŽV@[f?bgs6 49ZL@Q㪤T[2MޤO.R]gPלwu[Ml\kE!!%M-5>Kؕ|q>}}sGPJ8NNۚmB ̐inа$byvTrj4dfdHڃ ~Y40D3;Քzde,汗uul`s=J"Clӂ" Տ|vV覗SKOF, S.W6LŬ+FAz#y"a(7c%tL ПiA;u@9NLULu~JS/p+h߭RK߭ը)aq#OPX4Z;Avƞ5< ';ժutMKuuZU7~I_XZ1ܽig<_Z{.yvw2FtGFCR+xY$>N Wb'Gτ@HpFd]}[{Ym -?v*~7|d?oDGS+n"]Ymr›D,'R`H,jb))Hbv)Tp'|]v×>2ȗK#>.=n&*omx*;aVokB#ؿ١ݎo)8 ,̰  [K{HC.tY:tTV7Ka^ׂMax<{EEڜزH.B_u3Kys@83ެ8;":٢7l++Reg<:謦x?\Bnj@ N?yoO)?VN&&RȓZ&CxSdMK_΁[Wжb׻P#KQw28 Y/Ҳ, įO \(XzOE[NJVw ᦐ9I[RKC!i HßSC6;C#xee uQ><#Tl#b4Pn3_ "8 0 O\_@VȗeUfRDcysbYŪ%Ř.0'nck%ao;i#}O i@PG]lR掿=AiL}Uޒ)~e뢠!e;ҷ*B rL0qRFiJbV ,w6b{ nx]%=ZE"& t/B6ĎHaKQ]uo" ;y1u*)#0@OYH.Hr^ Ŧ:2G/qLFNSȒ3z{#RUPGU]'`&T9YRJOrx+Utvh |AwPVע&9O+<d` vu\ &髪2ؖu%WNHPN:ş0p/MX0tIR5?['nާO0F9s4B*D;;JcqhX:{$ {nW SK/T$Mlo;;d0d8k* o!rRrMW t]/"|p\a9=Mueږi4c{&ϠR6T4LCOHx}x2f}n)WxWl?2)cA> X(z7×:-*i6guCѴjD{"u+ux)hӸu>+짞9!z&_tJt A {,FDb e)I៝vJOj_uQ{LEZäf+hUM .3΍jMwmRK8q! 2CDx! qz}1/BV?WC4+3;0KJyYnMR#2A ԿG=IPǠD{üY#;"IO;W F@d wƻ6 M7:ÆT1Խc(ө5qJ;2V˾ 2@zy#pBʚ@H~`8ީ 5Ao 5P; ( JgG1Uju#Xy27vW2p((KPfDxwcL<-X< }2R3ƕ<)QᗮV0m04s)1HtUmmvf!7-ȿa 3Y`BM"VLzL!2W0Nhу?%KۂU߆:5%A/2N~sfcӪfم&:97[`9a|mSK9fDʣڧL0xޮ(kO+DJ/7Dg Gf |d*R(H~ @Er 1MYD2_0`ݶ&HyBf"ӃKƘ(u\KdF-\V·AĐ!b͹EGUd9TX jT @9k FAώ3޷\N2o͙wҪ@ }H ۷ּ~ (jґeT֞P F˖'dI\z/~ k 2l5E4 yXxbZRi]9tkJ}]"&KZm R ~ &E0%9s2"pA~.fm:n5pOwNAkIAmq7ޔDzn|$ֹʼr 7A^I&SyKІF.1X'Pٱgk,12;[kT{MT&!!}"i3[O*iVzQqaE Ń)([ss J2v\&˝)"9 9 7 s4YIǤ-_2AĦCȩ d3Pm{|0{`iBh%|{s጑)yʮƣÍ4Bf1[X,/Tr+,][ EHa۽1<o9n!P0g\8e-F ī; oԁ5۠-F8=@{H**!.6;h/ڙB^#` pY&{R|s7S Ky:CXO^LZLHzaOǻx2}&< l$VQCDF8?z)b(]H3~ լ Ix YH=)z?è/τ)l/X[~xt`;74kU;DӀ+i,~>ݑqjbìUμˠUV;zaz7M2ϟFRH>$$1L$Hj'춉mՆ=ػ> k҉BBiitTji8_ڌcÌc[}<\?TeoJL{ua 1u]\(ɢNkwNRBCDE8 Lpa-RFi:tweU|״Xњ<_`5M+IS%χ[%WgzRfBB8E{] C{yГeR==oˇ}Fxӝ@Q v"nϯx&V)Qdrbj/'Ђ6U Qܑ_JY.6k9cdyB"% `:L;F|a@/X\GTnl\[ z/T10s5J3*>2\I$ lg/xc9wO|Yy.6NOf1im+ӂ{şFL#&I.`rU績hrTSБ^"=sUUyjkPIxS${&L17Jd RIz @w#;?6]&4D4BB5CSMjŌ4jluu/r61inƾS(43nF`M)\ŕğGxܷKo`֙6 y%/Lې2" >ǧlS{#44im+P?,TSx QQv(R@nGHkx#sM(]CUc&yPߥ'"׳U(:m.;_ 04o!.}B}#o҈3U*~`]Y:*œS@8~U-ZO*>l`<<ףd5*n X3b|91.O$Z"8"B`c܄qJ2oXt1peMJN1!I[)`',]F x>gCP!fL@\sȢHtZ l)C3ÓV5~6Ji$'!xJ1w#fj_I19ulmp= lz"\O'![^XrUFELlp٨MgY; MtQӾn?[LբE}eB(Qd;)Gg>v"uoқZPl=2WEO0%PCai=+`1 &L^F[ye?73;;h~{~sv?;WUyhC'9|QTeQdfo&A2@eG9)jEFKYɼU,[ ^u trڰD8RwAAD&0h"k⯥ s|Lۂk /:QiwrXjXM~|UaANU *'vAR hB{, ZR?:ؒL*x\Z.-͔ jn['uR#h%&V`՜}8˰,Kb}aUdHH&rzd'vvF 4@qi4KnT9?Fsy$ P௴#Fu;Φ䬻"iK$?G5P6wnJէ.٪qMRmCuOZU.+|]TÚV6y ~"VCgq_.e dlA\Xdfr3 #>IeixK1!M {S,,/vl Ze p`aҞ>AV ځ,u͍u˱%n$sSO!qn,ƒ^ rQrXٜXK~A2Z6bUy.2Zvcǒh(ӽcX<=%A 6ʥ̄ ed=jјW9B'x$hUn,4ŭ2/ Aw&,Oپ|4x+Ls8gZ}/Q8KFy~Nٿ5L\1/tSϞir4yix- k)rgcGꜝ׶&k>o\u龫7x|_ $6;n$^&gTo"9׆}f:jc,tF]%6wuZA:iHHdA&MEtr=ky1:2fYGέ_pVj<c~%Nk% dNkI*u!󼛥 E|΁0%`\@U*yxl\AGSSX<$M`evTm2otYjčˈ'7s)f"@LeuF5_0 ;x8)fAJRngXo-=dC`UA`i[A;tQߚϩz$^dSSFwq/ #>J/eiKOʨ5? Y'BSʡ!/ F/a3a&?sАiG^XNl-oԌG%T~ܶ4pYT E8&r Qm/zhϐ(<i??e|'̢ԑrD+g63(U^g qRƮ hPJR-fIl՞)<vCvw#i&M#. lTb2&߇d,64›D2#% {& f B#)Ϭ^pYJT|[ Y~álfr3$9b־u!n 0kCHx~DS<9#1'4rhc#Q1}%@͐m",OD\!!:7SH*s:Mж ev+A4}Cp;ZTHiFo9BmJ]zyԼx]q֝qt ݠELCEUKGsuJ2:{T_L%j,}NRݢI^.]U?2oFf {C|f8"+eHET>:TDcU󄇖AJn` 5@*/SxznW_ (ܠUB&#Œ}b"\ ~nagCO5:Ě}Bʩg(1r1c_R^<..a\yAa C@<=v=zKUe5G=0vb-5HHBOE*2J@+qeQ6n%LmE-鋴w9in}OȌ"۫솞~U PqxD"9áwQsBEN9i_"8G=@ %2~oi:rDh-3CǰgGaU[s]UoP&ܲKeT\`P*ܐݍb* .$_qGV"5I1H?T콙ۏW77A#˜2jtбLjB{c*T~Oȑj/7. Zp*{RdO0I DocSebI0x9V5`d@dzxe92U؞אaSj.(۱pEmq5{c;;·} i.f8+u웰YVWjzg.5@y3_d]]t!u+U.Х=zwgKKZڱo A;n.=^Aw][SVq39ƨ&Vm<@R3n_5su^xB5,\x22K!%UUi˱hN?R6B#3K' چKRi~TJ# 6S33]j-GĒ|xo[;_wd\ Nba"ʤUr6/Yx?-tWk#-5@qSz8ŇVg1p:0qu5*7]v<QqXZ狪cckd #TT  } C3ĎůH68V/t۹~m( 3~< cU㗭2)ϒCSL3oݬ'J~Xu*)x e,j8gF(ªY ӌB'eij o AH#kMOU s|\8)i-bKӽ퓑@ɲ\LՂ#`I[{xu;=f҅3i'VTV#:29'BF@5t}m;sޓ78(>/Fop'6 Թ/^#mL˛;,UhmX B*Gs%_3GMFQ聓t8KӺ\SDʹbx18,55"RQ͑nӵ0b#Ĕ6^ΓrIl2HtvbL 'v:UpTaO0bn V $NZBS4_UY+7.A@_9o@HrbOE-Sw{ELa&~5@ wZtFܐkS\@#d]IH} z56 RXR])霮 8ѵbgvL ^ߎ]0iBUϦ)k6mRߝVpAvĆ; Ȅ]1^, [+yOJ^|ҁ*yuqE:5 :炌i'em?6E&^V!؏(.㦫6oo9 Krشi?һM~sO%'JY_GNa7kd*^104Cq68(e@,8`5w5J؜:-Z)tg/T)QYgI ޖ9)c91xj^jp Ogz%CV|>rʅ xn*.(Z%OlxN ‹Jwu k#+S82);cFFQ)^uMOфr+cR7;MԈlm?abA&MkkjWJW.f!pzfKMjdo4(g8%'= P}I&U,DܭIt|AR{l$́J+SRN& oC5Jqo DW vGȸ2S%nU;9Vjw; M;9*#t7{ t:y!:նA2'~^2@PV$$0o J΁?0߲ù̉A%%&}uxs<~B4)&}|X)y6V[U ]p`tF].42B,jT&` ZziX X$EŲf.*5@E',ɾkkO:`P+>؎`a`ɽ:Gl!doF::TR-@w.9u`(b`U kЂ͢P\ A|E<UR<@3)|!ذDdV?"#$%G D7fTњF,=zڙso<<T·G2AĚl#RG?*3vXrV92t_;  A~,U'^(\>h:QKz"kMN8T943Jc{a&)>'h1bmo{x:O 8hMZ< j d\EKN-qY̶EhAInI} y'SпEN0l逽\.pfNN&F%=Ux J^S)Ny.Ef /eeʷa?wU##xHT;WuM#binA 됋ג-3 8b q]0_o֩UK&gto#oV!,D *]5i` ҝR<zE% T{SƳw> {sX۵tWƎ$HWgVi+ py^eQp!jؾ>>s PTiʽ 6 Rm\gkGkAMjV;UϽ2}>+K?C_,shM;(2Fj_t'\;6Jֵ멭!Wi^P %ՈxwlSUtL ?eK w]\_ٴxbM!Ոt R "HT w5DSVW31k3-M>8WL#CݗBɇz#U ذR 9gԸ_@R5c/gRSQ50Y_{ O1.2T;'pgdl'Uv.bɔf?pQ's/M N,UhT_֩a?d Y1%a@&]oT-'9txzh1pkSED(zOɂ+9 ]#M okhſKZϻ]o4MB[ hR0F9 4L9[MLWys4D* m龪E Iot3,jWo*XΘtZRlh&NZZ2xVOWU@CVn%^Ϭ06-%p D۲F6u}pxYpN8 n㦬t(bcMptNHm|xUօ@9صqs(acslϸݔ<7ic'aIn>:5h} M&0L{޳frR'ztAVؼp`|L/J%11rJ:粓Y La&}k:YkGOeE4%זPݑ*}~IkENB`΀ʾCJcaF9%F3k;n^k MWKWu/s 0e9䢖 6*)RUM)wM`8yl[GL=6MI''-)8$0ZP-q%CnLdk!+fr` d<ҁ1.Oi G<\ֶ~-I}Ve/FwHF(#(ݰAӹ*J3yQ2 /$C ^)@F Һ!eIE\m7:` jA#i">J;"2Y'˒~4_0ؓ$88\jTbl3w `NJpL-giJjO'wN; o Ḋ1W–_F{@f;9ǶPL#Xn8r-kOFLOKE[~q:S cKjo3baN\zvm7D?3np熝J&Y Iv-096[EGٚ*Pɯ*f>6J.9#JS32;&y$opxx>&G̨37jKw4,CPɒ6ڲ^j`˶1` +lQ;rFƊ-͸,X!9h0tT,+%!ZDQZ*6Y 㵗"MH$gU-63fȎxyV@4@h5h_qB zBWיo5~ TǚeBm@[Q -|xw<^xX=%Px\CT7Gs-ߪ$[NY*ċ߆nc:4t&Sl Tz}XNzRVcl|jF6VLg\4o>Ul:a&3''?&k :H0XNq24N|ɐ7[mVRt#]Z73ĕ>-x;sY:rl)`-o8<턺^ԺgBi~8ҟ5_T/Ny?ήeHl:M6,CDַ>N.W;!,gq'1!-;PbPFg4v+ёOǬ:ם: [\,+ViUXAu1Ic毌o #z)Vd]}fUE?qb쬦_oY6$(fCƷ__]z?b[#w~l% A3cޝinl=DAzz`'# L8rUĝ XDsր[hHoF!Ǚ&#7邨Wlf͟<ûW&"diۮ?!#öPI;WIL1p1͐gtJz\RpBƮ#ݕbD=>o #Jy9-<Tn1[Չ}ǵ,8_!@%Kib9GqRmWP~qVjgQf$`ZIx=N[R Ca pRE5/OD lt[Jb$;1R~Rp\TxFbs y V+Ga q||o~.Z-[ް˯39aClsxsѣ'd_Nw-WF<֖d?q#Y#yfNEϑY;C?Ħ­lY:eSTb~!j&Agc"v`@I,qCV ХzeE&Yk __wF {7@Tސ@;tnW]%um77΋p6C4H<{gQ,K)fNA(K _[Z2v7T=)8\AvaϷ3Gk/g?ˍ LU=QfBxӥw ;Yk04dx!H '.,e4h6 X2C#~36y![HH#Cڐ66i1-u3^M9_|4N/J,h d귒#o|Y!E ͯ`P ٧ia@Db&ٳa}>vs3S}xvlqF^)扒.H4JQK :i$-ȱJDݎJV%_lB+!1snOoSMo~\41n(^8mA8Ex9i YT{GeFb?G6VBS#a=F(iu-ű}uN$7ңcFbbC uZܜ`] lagCA(QCzGaoI=>3."kW {}]knꝸ ur0pځY+N t/ gDuϕuHmbEHVI{rPSL uPFl:,zJ \&ސ+}_ɵ%!B22z<-d3+W(4AIAhL\^q.)֔! "y8Yoɴ%d%'[K H<% XT?7 r<8P~hg2!v&c#C*hDIpLY}ɲn[MbGՍ?Û>_|#8 2@pvd?*w+E*8nƾBa$ Bp@FXec*^둔^t:=$&svY_<&Db!o%B/ؗ+*}9OJ##}r!" S`+[qLȂ}[۷\ܐ[o/:|:+xQh%喴,*7 @7F]  Hp{NN0țrЉSGp!G V+dYscGt>>smn=@!N"|Za{ P /NU-AS]EWZa8s׹ ܢH;-uܟgZ<5AUC=ݗt07c4bZYb,QedO"V$Y_okp!Czn {}>gTޑ1}%&.wư sDe_r Y/;b3H=L1ҥ';`Y+'9F%͢+3~4;L=:V 8* 4SR.v9J'Z҄6mԫTmQ#bM鷃W _n:M9/voU 9VY܇Gx*uOA #LsV+k軦00cRF]X`- 6!z,E[X'⡬1*{7kr^q>{iblG:bTe;t*3%?"6+plv=7D&ʐ7FZ7I_| lJo x~,gԾ2On'p0ü&`"+e*z<5?0r[QT"'0dDT^cRV~hqW!!L3[w& aM̩T=ߏ'?Lmk%n0ǮōyArwnFGG2bL:9Zwaȝ]b.PT|M6$n6i $B~<=OxFǀ]ψg]$6ϒcPa"J3_9b@6OtL]D)޿]>פHX*OobK1q*(bp:ƚ5ĸ2Eu S񁡲ڌ :-(\4v_\w^v݄o5{7HݻF˃Jfvv?Xq )er@CNI%a֯[DRJIXޱ'guaz pj ;PG8oqҊhڌ$ùhA13H&˓"6vt[]NFh*ХD{ULSZ 7u x60 =D^ NSl=ƽ[7v(&#*v ˧`T Ip>.m(g>dk==QWYVyqvqw)?jt' 2XWnFi'_|ah4@Vr7V|'ӕnV*I9edjJYs ˉW(TnۉpnDoY^5gcp~NPn>k4&8;57}h9N Rn -ZtW }+=gzYVռ=* *K~q( SKֺwHYe)8g][e,ުgNrO|˟vUκ$ᾗϪaC2nɎg7,?2tX~(=cNz ,m:j !]I;8ӊ 6Ӽ`'B!d|IW'zi &u)t3'HoXh =s:y;;M07i4̫h:È  [vRcX\jvˠ6bLqͪR#%< sF`fle6x-;9a c*F-Ps.88 ~0.H>{ @eI˞cMV -RV&qѳU@tfvK~#KlKPTppuV';UKsPb6]Վ7Υp9T٨fop/>1l5D yc1<gzQiijp.uzh~2`LpBWf)\mN鏽vX1Wd+hO.)[ ,vZ >7ZaPۡJEH-z\{0/Ϋ0!IkM9' X2a@jukkVD̪zʔOB`pu&,J `֏x>'g"ʃI\ lxӏm,-~e|:Hf UV5S̟ 4[l\I=:)p~uqhY!MO Bx=xJ7blY6RjreIlOUhn;D+%$z#8J)zCD71< 7Ǧx\c>FvV84a0[T7aDc኶OqTlacɷ>bS;vu,\]k٤X }*ti!/1؋ !;~-GD犬z =qC~JލiVIXLfc2|_謊 3okgSj'}1H*`7A/]4[a5c5> #IG~0LF~4Iv!oq"khiH\(Ie#84QpW EH#`a-:_@I0Vz?KQR.ѹ#ol{H>UO,Nb)D!w.(ʅ: Reb`~6l??N7/y'- 5*ǽ/w:򿆦o*L8ҧWoX!śL#g 3?.Si/ES jwr <єUVa:pH 1^eXdN2AM&R@;'nۆN>.~ ϯsĸU6qZŌ"^7;y`~O ʽ4 4S?R~@s:J׿U lMO%B)a[J w5('lr$0'\f_Ea 0Փ<|qCΠ& ֧JO(qwW(hY2E=[Ut8{h)"(FÐeVPB~IA~eLOv>Щk"o ~8g aM_= _z`4*kbKSY'.#鹝Dοfs'Q&U4BP7w'z5eu6"sX BqG~f{nr6./0ݫnwNtmv7fX2HIDqWr (*tPܨ09'@xbyFYt?`z uȯ;$ ~j!Js]w4G~Yv^ 5^yi!GSz d 3NOt*fMr׭+Rۡ%- CoA1ثg6 HA(vnRA>^`= R/mdl H/mFlԬs AP |5 ~Qd::yLc)`|Bd \15.9/^.ͅWEK z }?DPLe!n(TUƀp,5ruH/0%Ȗa1"&N#v֤6vm0ϰȑYZ 4Ck{\x:;{`;V)3%Yə RNJ~ AT9{=x_' N}mH[Vyʼąt\pĉaq.W*JI j1?Q0z4v %[evOi"`]M3UϘ.sY]X^{΄ _.:cҨ(i}Giww\Jo%H&c G!PZF4B"+4!!-U7/hwH':WXܘ^4}OaNlv^'#0L$ּ쓭M}Ldy { 9E#bìZHQd}͛&e/v>R`÷z⭘yc7JClXԏY4d} sͩr]c#~yMbg >l`_K–)}bѹe Gpt?M'q[<2ΘgoU4NlZS֬襹I7Xm6aطEm~Pcc78C;H,VAҭ<ʤ4TN@vsY|DsL1 nNz1%{TD.R"/"FhF "& ȿ;,pnin- rnˈW'6 OBQ^l5aj'=F:(旐˼$ZAUD1Fy]VȻi_#ZML}#pq)߯)RoPөҭ9(Bn{Us=>?P8UHЙi'\\xy3tyC | MPUE:= B`G̈́ti+y}lݥM'eMG5+KNE#f7/DoLU~ tv!ڦ"T!Ϙeϑ)Լod]pDyO3:DK6/[Dt_ƁKŐXUg ^0rW7)M3A"xb5ULz։'^rdC"!1en񃟖ijP q8ui׹n.2=y{k-z:Hy8`=ki8EŻiɾK,  78ߺǒ2,HVaɛ]D.@1k94fƄ˧+# T!1rGA5tp;B2#b(J49:$NFR'+ZHL+x =q#3M0wE}@Qxn!=uGTjA9R'3ր8q]}n**؜4VTLBPW-Ù2Ah99"{R(ш /'x=K%|ղ ]z8OA4jP5I21;cKV.f,g}XJ#2a|B̃ @w I"8Y`6:;~n}/Oz2!-|)4`k0`dORAeBĒsl RSF͂ AALүH2أ/^U/$Yb?[=@7JaN5_((9z=1'cl`!aRF. h-Kw g$LZ7h(:7|XqqoǸYG|T?r $\4J=PI%GjOQy SF4GP1O%bA?z)lY_=o:w:FA>?XW슷};{YJ@2UbsFy9–?JB`BC)X~4TO5&NR2~?TܱEaVPi320,2,bA_ u ?mdN?ZtEQ=1Fj\hM=U!]nvRIf> sVIiȚ*UZq֎I՟єAi6B(&Ah=BNQNRw=[`38Wgҝ̀ -qU-~ɜ9هq}♋N^v"mʥ4߽ޝwoLPW62׬qjp\K ߉(/+:FGW.녟5 㔡EfFo]@aLS/bڶ gBB +@c;s GT3/[7&CX0^Tx=PN_mT*9| o>mK}t9`$ 6VUx*6nwHplFJբb3ġZǵ"aލ[Vkb/H ^fӒT7}q:r'ګVb-M>$!}z!UM'ǂ%EYv%ݺ9Վ36 39DGjL8` oUckA!N'Pp.[S ua. c˚eNܚ/"^Kdizx]DLضg > ;e)q4w Y{/t5 ]WƇ Pӕi"pFvECOol`6^&ٟE\9p: \Mf^(f!*H7_A.oJIv4Ireyh/Yu+KyCݽ!1LGh,z.v4t? -8[j_u.#ζ2%ٟ Lof?q[~e!~QǏ/K)}NCb )#׀]a,œ"teܚOfnö sp҄|0W_/,ĘK\0ſAJ5 i,Cԍ\\ r_6~1,N7heLZ7NͱMiA}e34 )6 QM͚frBY8e/t衂W NqF1IO=o EB* p&Yy"d%้ϋ K$r.fQ /3D՛"WKWC(9pU+XJKB?a+-8i | r:3l .ߋj켭 m`It$[S2KaA5&*Q$N }h: %"WXm!>5m9va#'=9Җ"Q_=P̓)d&GKމ4#w"1]e,v_F&Zn)]HM,m@j1_:l&|AL"?,lҮLpJ"JVd35e3}Yi<;"Di-$iV(6p  J{Iy<"cxFKOL>a\yL3׌ 7컒pN'-_=ц?Hh>. | #}w2t`{4!;$_n-A!V)/YW.nk8='Op ||hoV} _TOPc;?>gRrQ3jTN~ DO. K kO^d ]"ʄ>s;-`yM}GJGS'D)h"cJV\8?)?/XC0Xjv5R4 |/quC rljhd[hAdKn"qYcF3UQYc,!!<=W ;ׂQj$7arc٬ Ly-Va2o*l]f 6\LA`6Hc&*'w(:RSx9SYG9"EkRR{/hD$X*?zor/m&u6*堢B\ n۞T"2+ '-;KCF}a)vvbrekma4Fa. ywJw+lGw%W.V*"W-"7ʕO*#l%bįil!٠Z_jHFE |./^ZLzm$J񔅬È["ܮ:UKȑ̮XC+Ҕ\X.U]+i3V/{\Q'~o/O"F9I n4Ep [)m9Ķ+aY.(e`2TpWI/8p.њu3wDC_*V>g 误sl)>%)$WMx/%R 6;V//If: h4bY-[S|k&gyGv߬E{cVOf@ADS%;_nnU1D9p ίī7SWUJ庺/%JҵU"d)r^ \sVfT" E6D^9H01š`!AC2(BQF!iOwlVe ,3'2Z^CI7"A rp?UCűW >@@:!`K#~ufڱd`^ J49MJc 0Z* !53j&{4T*ks^yAE,% Dk8b8N=r˜ɥ̱[M͗(d_%"ѧx[AsPג@ [k L}qc-=TJwŒӢjR˘Fzu2x;Wu]#afz|Ghdy'dJ@7e`?M;6I˝,+XmwzfY Eg*X=h>o\$D8wTF3^]Kn y˳! a4BAWNQqߗHot_ܶؕv$ۄ5!HVn7I`Hk~3]]V)& X0?̨Y͞Bo0A%F/Ӗ@9yAYir$$COap yc}Ⱥ"e䍷7SN" \2K*bɊrBQ(g$}4SXl&!.[WSH, Vtç+1R=TByP )jTkIm=xJ䣂HֈSeeCO/5-'JiN#W YʂJ$VTpGBFv6ղ]2u$}'-b{ MG ]])h$IV`I9 '^e) 1'ەcsMΡ⥅;qW=<z[r:F|s(ۯjCX L̓: 7ڒvd%rv$Rܰ~NѲ|8:e9pՀ~b,M1++ ne|Bu~Ö98,DF/81f 'E#A])xa|+?@pUXz۽T VT 3T5oIPIďg\TӥW}mljj3%BCյ(2ʱo̕=zg{Ўh(pOxߊzfz;U2@pQi?u?I*~0!2rBr2z> YAD"J)?dR Qa道+TQ#B.eA5eh75MBU؃xֳ9}߆n;v;~œXh/u7C5)R< `>_rR9]'wg7Qk0Q$\-\1 *x 6qL+}+ˆ@xK*eiiI .zdsd'y㰲hw9͜gGIct4aA0I"X'Ea7ds> %ƚOc1 ZCt~XxjP%V.~v/s4M]0~i2nc4cW¨: wJ^ 78UCtS!WP8ނj c0Er[|p9sn7˝W{hL5>nm-v @q̓A86."ƾ ,}>}r8: +*0qGeY~2dRp߾#<$gc)]u?]TҌ,m1R͏=8Mn|ZA\sϳ_SnZscE)*r`vKҷQ2)\`Ԏ_F"iZM*"Mj S )L7#%nTTY &eD743$h"U  hEL'e}nQ׹3Ê&Ӵ ~j k`sbM5=9U*iLΐJL0BO<>&#CtdyK) MȻ}ULkOr@,֡FU=׋ 8<ov)D_Q4&Σ^:@Y__XŪʝ=p a^1|_ _;ǾqnՌ]ydqXV8V^ŕQrn2i.2ץMoCBiv*w5T @ v'a x}rD]OLɟ:ASdE?l2t~T0nU*_gVd׬+oɜ%O9bI9iRՅX>;"a8=M'i|s޺?lfRQܘ1GS}nϧn\`ċEDK#! "f)} g%^aL^WS' ,syĩk:ْ[jX6݀}z&sEb[ 3/Nd(tQ"otX{տ>0'zpހ ` "!}ɺ~>{|3_bbPg#k[q~1,. Կ|uXo%21|g(3 sD j" dM!YàI>z >ѱLݸk+ni_UU& W;Kqdn?dUL۠A=CFm`-KKDn!~ܮ(jzL:x隫oPhSAgvD2kdݿ;OM}ÔN?zC*LmW#*ҥ^OǷ;ٶj4\~Χ N&4oU`&"'*>dEH,VyO'kG-(a7%Cl/`"]7RؘRx.bΚ y 6fw/>c~<8 hL)wHu*)n8v ߉ 6HKZpnzp FCa'(J oP^Ir:"“lU7uv2f[ByEpqך!Xz>@Y Lf@ (5rp^P{ )jK`;x5Dp"MnLjD='SetWjJVymqnFاʮ\9Z3ynv eP!6yP}楪OJ}6u} ta2JW_,Ď+Mm<'m56%2Nu=I~$3!"G~$<5  fۃ{ԩ >X7:*f1r.|&Ot0E\S VUT- 1!XfK%hcoJU+ykkA~BjDUC׮aN9SC&'g$2,lͅg2k";nw36 MI^`S.ޛ5>=cl#]d!NFƭW6N{@79^{tYOɧ~!OeUϥ?-O[Bn #?3A)z6B4aP*s^) s^gH߷+b3VF˖ {:tZnh4LjZ7jU긵B7J~–a3Ӭ3"vS1*<'k0";D:ߎRQ|N- ET+ݏy"C4jEYGv<]BU`'2IIL8갱!B\Vg"}d7Cck>9Q5`SVRЩ= XOY8<5oa 0qyQtOƨpt̑#c-f@O! -\eX{/j-cz60mtLnIF9(Q\P^v>VqeٵXڦ=>kσ.C=*#AwSPU#k!Jy1<+[T=G~:т " ^#{Ƅуռ.8V7[a}ɇj&% %里3L&{@'|ٲ"ƮCpl)FCɟ6 t*l2j$=]\y'41s[AfMc2%z,F[xY+Od($=ZhK6H?8d+~np3 ߵZ:wm2dӅjƅ&bD28ĆU!_ÝaD !1;P@E7>㨞HkJ.`PRPԽI1rʶ*t4۷zߦeB2rToiP1lU#$)ØV28ljI @~6vn/Hy*:9t:wnڮ2y܍5I˥E'j*zqq-ӎrM(Gp9`nc-1++OdGHGe.+NRNIQIO,w: Be1UsRVv^ğ5x2f]y0J|xGasXxn#sж%\}@IԾ;hénlXG1#GHd#}&`xcn mGk,̇Ry \5OpOnf$r_fub1{~4bT23S!+}ws;3&SiߧNصѪ]Q Q kg1EU-x*H0ҭ{^$qu bK]Xp|5h79Y5f46]9FH|%fܐq JU`$# ;8ҿ ^ TNjYBy^3.y.|r_^uˀ鏋BT}ujxq 6E9q[[W$l}]6NmHNfvŰr4#q`Z+vcCyl+ߜIlrsUm/\Dz 7ӊ#iS'S~*׃]$YHGB^&_.7N#ht"5R r:ORw]D6vӓ!%Sp1gq1>CdofT0+4R;!g FD ݈G-g*:~CdvI֟AVߢTfeή&אz& :*hֹ8r-=7~*MՀz_zZGBMu%Dحfd )mF#3hM/hעJs]T]$B/y6RQ?W×w)ԅгC^Ic٧C[S>e5DZIt\kr)po)ԺPs]u IyWk hgX4]b˿\ q7PbksB9ʘjI\pDJS{+MG#.\=} [Vr!÷uλ SUV qCPpT<4qNK]@u1t#) ot: b CiQk+VgTA4u\)BƛK sQT[݊(p)j!a'$簡AW_ &P?UDuGO*nI4hr#)tp[y˶s꫸EVX|PFj?TLTu<ƹl<LƍtÄp-_ETQ`K(FXCuqt~Pji ?Fhy⒯:T:xh&U)K߻nn%vi8h V(KnhPs*s%@ =AP HX?j0rKJڳEGS)&o=IB܉cVzL̕\#ϖq JׅZŃs'u} &La#U?"@sEn(][g ^W[gl.1b~f1򽠿e˴AzְMl-z~y +Naْnϣ^ ˝@7|vB3+-cI5?gUL?'oƍa8aI|lë'`@D9jy HNPƹu˕24ƳY2^Uv^inG϶!GYu&*J2bdX)K U@Apu5c#a6Lk9Q.N80Z$mM澾Ϲ~9G=D:jτUKV|>1gRIvuMs1Pwˀ%" p;A.1g鄍=uDplƈ@{p)_qVAC~Z-XMn@HXSJ(58ۉgfZgYO jB-ِXX()o_)K*]] )tj?2܇,g(ϭG]`V]QO+ 1Pi됟 v .6üGԽSd!,0@,_77i 3/TQ fFRӴdîLk|Ld}AƆwS5/?G*<Qg<%'t 3 %k/O#ƕxA~Q*v:y[Qg*G?44PJgjAB9?Ҡ䕋& >)jc~6~A|Y ||sº.٥ 4^OM)1wkNf&-lreu-8[+"w@mR|T#nꕹQE xr/ )M]C,1=2%ao(3hqjdfwVjIe|G!eox Y&U%j/Mu( 6#_x!Х_UȋԼ Yt:Xs/u:pAs/IBeYwqEZBh{kx!XD9c@8 -L ni؄vge,)8Wcf~!:u5PG5xQ̕VP,6  P[WF/KCܫƣzmQH0A'3wh &n}SSkdt6L7z5nj z~n3?o})̏Xѻqٯ>pVҨ%"^Aⷩ363PRW}Q$r˨(hpDD`lM$d;C|y5[(@~mȒƦyҶ^zemthDd!/M2*,l)W۾KtxZZd?_3BM! ON Oaq;oK9ZTwVz̴X1CIKM o~@sPP]&x0x%aVXҞ鎻I L݁5m-)*Qf[x&Zp_t.t#jٓLps߇(7;tGow($~حD.Gqr_Uļ4 ($Iϣ׈2VA"V8(ۻ|#x;Θdh$;F^\ ud@rFPW!Kowj )it:)Kni]dK1vרU7.)Hvê[i{t5éO3;m mpS@0!T݀JX]_Ƨ.?M?zA ?Kcb^5RjC ߉iWږP,1t|<|I )wde9p"|wn }^חòMԂFZrT(*_"#G2{~V?C];DD꼿:)HӦǁ ]%*ZgborЁ;8JZSJ i0R!}8Z#@nnk^Lm:6us#)v\vxVe+wB2}7 s@l0&wt}ӔT뫋- ė5"5Rw-?g9.fA<9  'q\9<\V&]U,|oi,Քlu8Ϊ,LJw0s]>d=LjC46ʁl M+1HuB9p36&j@7{fYxkqeFOW']4L(7`S8vtK< _%mZlt#r?T@$7Эa]Dk^=.;mE`1 # {OqٓeX2pCrǁea(AKB[!?$L!w^j春bNV4mTk+QSWfFމ7j  1AgƧy1a2&YtVf jƧ2k03*pQ*n~a =qWg&UZAaj;` HkG 鸋` hKC-tJF[| 7RL܇M'鈅 >7ţ\L5FGz0fܣ'E=9sV<8LS``<$Q6E!4췍HR.orf SF*JYdX0 E +TiӉ Tр(D-Lm+ 7+dG/~00!a6 I3wK&y|gg' }f8v=Ϣ<*$;}ԗHi %=Bn.w rp29X vV/<] -HLQ{R٠K$At?'8yE9SVE҂?G}ɏ*?BhO%l5 -Q7`F8A3Y$t0q^MaI2#.ss eȚA;J" i=z(&&VsS`XyU0H% #QML$ Z_ȳgUV tX6gٌ"g(#A!Œ$n<*/|뽐#z0Ci9;šE=@vyɲj$!bǴ΁NТW# ŘHzpS(zK9KH<=g &AnwS~b:$IAvT<΂}LGVR]“vUHW~\K@v)pc[kiȚ%Tg]5DY/oۉ-6e/2z6ؼB."sDQV^K";%k |T dAj,7d%Q{;sLJ*/;־ g9'j>ܟP7ZC{+Wu-2 0BagJX_6["6'Ѻ;1_foЙBoX@|g[nW/B_\>d3@nV.>fss@0sOGb=Ϡx'e[ (*ފ*g'F}+Z_%cL=2τNkO0|sr:^9=< A4oh )9tbUoEaT@\fmD-WjÇ'%ɶ+"R22o*>oA%xX|"-w' 7$ C y>Tang cѨ27Z[r@;};C gF^k3YtA΀Y-oih{̀f|̊<, ֚XH (~,iuUIOWd㏈?qcHi/N7AJ=0<\;-eDi_4$W@u U\ .ٯeg ,|+Ĩ&%%(h%by36x(q!Jyr$.Ǖ?L~ "x@s̩Ʒu\@oQ#_%T quI\ݒ![ pq)'2cjn)^)zEF b|psF f6h(B'/E$ ?AaN.wrΈ\6ߑU/0A[uXL$0$$v΄EJ ,d݉Z_'/^DǔQ*-jSkiZDFyy *qL/e\¨.GWflFow5!B^ٛG(-;}&+ .`qƵre:Ib rD&4e6;x6NY'[VprÞ)0k% pT:! O g8YHzG4-@OB}e6|g[~\l KFDS+_~no:k.&䚓kpx%Hz.iv_֙7^6*)}vtu,ֳUHq@ʊ/QgWM?uzTmhi󳵡q-K C[{"Ur|YHqDQAS,&7N'T{ Q<6#G [#-t3X]/FP(VMo6|d` yp[fIbY$Ɍ{|? 1˕F3P 41#>G&H^dOθ4bX|t"V=樊/a 5SL3͘G|^NDrzRrУS&h.i$NZF͜ SS]bfbox^X;O ̋É@0h0(Ђ$ D` tĹ<2`n ^6)3qB-u|b\wC{[ j+I Xe¶2K1Y7-ot Cغ'ii D &CX,}kˉ5G!:f;jm'Ìͽ}4"!sŽoI7{2A?4xrֆ @! @EmώŠ eg8M3FaaIyvd=8Z\;Nm`*..qP l,8@Tyk-7^}jU" 1s+&^v7pWǮUgD*6MjZ˙,U>EmOfyeu  [䰮`KpRC8V JX]TG׺\#j/XO Z>sQQ6M30*<ﯶf!Y7}*wP,RPhhe{ȒXCL<%m#D` ʔ s,Q|0>`Q:oL5:\HF(?sKF=1#=V)6cYQI썰4|}VxI)7Mi:|?jyhaxPgHe#  C̥w~-@ w#Լ}rV}ALĠx& l3ajťmd_&fhGѡ* MoO>Ծ:Hqyɛe7I ^J;kĥRy{XRs5-pmVі؏"Vw0hkx4֟(,ƝǙ 6`1<;De~k-(Lzl9(-.GuհN&P+9RU 0 qfРD*Ơ]8{cL<2TAq! ަ&H+-,Y6d.SGGw's!B;JLG7d;]uqRU/7( luD2_$ EkC#Ů[[.sAdV}dK<ÞP '`/CouCxZag혻s-%a02YO0?q%^w}P>j!qǀw+Ji0U2hu>ɀ^8p;BjB\D vkmqуNj1Ŗ!wu%NNI"-o9̡b \߼ ]0^ ՅLJ$]¾pB^.4OGiM`@JhWyQc]d=Apxbp ZQBlc|KAu~21x9bqzþU5-&l??YJy%v=yãgKyNڣ 4)pɧ< ul$7NW( ٔJu,o?ֵ-՚ӹA.Ccp0eR:ǣ+Ɋ#pԉиqL{)+IqpiAx:N5e}'njBm(:Rg*^IQ {. },T(>o\@9B)5{{Y^yQ8JWUuf|ԩU(9hƪ-jkǐx,%jt*}*fLIHql DT\HiVίP<6ENu(Q%sUUz%,AAWpO) `{ 9sf~5 eeqrD'JO7DkQefQhۈMHZz jZ9RDN-fLtOO+AI Re0!o #ӛ\3s(y"}Qۍ15DMLgWÍOsP|`bv+ K>μV6g= l:^ DēsxDڑPNԷ\!E毚{n(e/62'I ŷ4 1ɀ5 x8Hl,QIjZ&&z7%TY:V _>& ƕ-G E~T 1$9J)H:d:G 6ab OٮGȆ8DgRcth3x1Q%+F̧hjl~WWvm:'{v!Uߗ@=3M ¨wY JV H0YK .k${D4匡dM"St+k]5yʇrBOȾFY;!CZW,)CSȝbL'!P9DS=›Q~Ou;'c옺h|O*v {W2TZIwWdvc1k^E=QhU*oy:f82 ypu#ĥmJD~p!xsee(c`U94t*({Q+%,a4wR,R6a%#L7{{I[<B?|GHZ `->q \h"<SjB+]T-!<^]8*pNB;\g =D*Xr5߳\> ;;ӽmԽ ˠͭ;Ƕ/bU!҆foī)5&t_)ExmMV -4E{op b jo:bEkz). VȀ,<֬oees(-4 Aa_՞nQSʖsd6uՔ0:@9hOOi~#_N924huӏ/kh_v'z_֫UoXRVܦYtE =DcN Ȣpvȅ?'pFXwQ?n9ұ/,4E!"ᝲln(5 |'Zs- (2v0QWGFwú ͦ6sJ\B!ZLJ~; <Ә_%3B_I!b*a"}O$WZURgsaJ\5ၒqgJ u0-UGC3n`G΀hX >M7YW-UU|^ mԡN]Y\ P9ST! yI.iΠGT8> ]*0AZЛE-=BDa&8ٓKܽ&b vϪnK˴%'>6ɖɥ q;+|ݏRPjו.Yu봘]fe{WDxHb+u@(5H&0ʴ7{y! +;,U3ΖK+GLsوK_O1/Z[,R^ -lzA+ߢt"[ZYzdŒij D28Sݖ VD_޽BL0RrV 5p7ӼTvZ]hO`k>ZOc'A ;hةrS٫OevQ}b= gtVs8>khQU!#Y.aSCP'7l>%nfi‰ol d'Z1h6O71  "iUK3'y-S9 "\Cz Є:@-F'VAGj'{ OTOzI_5Z}nq#9 Tw@B/" >IP%! #]"š8bamGtY,[:eaBk}}er}x|^b$TZikRHd׃iX,WL]1&VAvص`1|/e-pezZLMFPLPHĚy6FZ^b}RT)*EVCV2̎៴~5E*bw:5Iy斆 0&=Ir6 %LMLI]Pݍǹ$7m8D& JTGiG4vնݐrK(OކL~/*8 eЯ#'W\k8:J}-~bD8>fWB*G}l+. k j9>`s@=2ՇE1 3 11l-aʺws+A瘢K[BLg>ҋbݗKa b6O?|9~iґUD vNo1*M17w2ϥk2㝮]Vѥb3]>.b;Y@Z՛@F;qc00'm~Pr6yܰbW~ #JsGْ5aւ1o-󠰎gh_LM /Ŀ..%:Z;ch̠CsI<_': +{$2"yڬ&.?,(ʜO  @5s(i+9kR̆p^5-4~idDEC,⻔Yv.HO y (knQL#.퍽ܷ'"/yIT٢+&hBgXE,z'TJ ph|=[H^*E|o]L+ jq[6eqHmTLtvNAH&{E!H%E# B+6Gx,Y;NWUTBOzrJ9KͪҌAi~ c.Ϗ*D=v]2g 4WOW*U?OO#ާD҉͵Rh3SQZъeM.p"2KK0azO{ n8DNC "-,dz3zDQVV=ڒ+ۄ7ҭ5XNÒI;c$ľ~Gy ofxil.Ӂcm.S!D=@)<vS}'n<9j{z5Wk%q\sWޥª744K 53hBrN+ $TϷp\ɞ : 7,1%"l.hZe9GY6^Y^myPmLplU{U5F%.qU`|8:sp$.SmQ7B,bc1H"[*Y6p'AI iNe"=^#~K؄B؆#d=wǢ#׺aan#!r\%Ak ]\|<~&Ks`?7C=vTz<7Fb% {ljk 'Z0M C~,=BVyY p ő+"AIaFؘEh3Vp'WUKʽ.z-_}j[؜'NC9e~1l+O]n} WAԩN,$'9y.|HĜMk֥}\2O7!̕qai\93; Nt=j +vnFc^Զȟg!ţZr9k /;/jXe-ưq="! x%0S:NH 7SxX P~x Y4wLMIJnCa)hsi=kSW&FDǗ3"nOx6d?jP 7c0Ӡ{P/4s[#ӎKHWZ#~"tAv _qHZL[AICjTB(XYvRjIFvq0Dllݕ];E\sN1Z隦G ˀ(ؐG$>&v1u {ÈZΖWKX݋#]%ګvlt|"qZqD|X.LZ *dP_\Xk핓RHZmhBlJ< Oī5fjNM\4=t+) f5" +QQq;myAO O&\K~ܕk:+ALL:@8ؤ%0o%z5S@;-| 4!P^rݰI- gzĜhg@՜K{HLG|pN ik3;ӳV,&'F;w+j(}8 '=[ ZCoی+T aœ_]: rcaݡj_R. ѝ~:p{pu:=jX=[6"Z6L|ja=Cjb iZM]+k%)ip;̬67Bã DAGR23[=|XZ= q6b#ވ8r"|Nq$ލbD95?}eA6n{gck۟8G!|à QS3VW?Oݚ/+ f|Q.8gznߗة}g_[`gʟV^ɨs7{IɐEy,_IHĢڛISbw,06H*0湃D=Jes7;^xwumOVe; 0v^W0Oǁ$H-!EaJFPl0`:&څwqpCakhbhi vu,AWwbYQ &4'Q4ZvYtM47.y:~Y|b':қ7-\_Wh{hY,7sG˵d{G$jCn#NTd68Ty72`Zh{BD f%[#F,:9O#:MmƫͥQ8upQ ~P D1H*X-xM.b[lC:g>QJsŸ{"h r0qBȞ.(?aht]Ǐ"HP\ G2&n~%b\V4 U }ޅU>dɁT9ETmRFAs,I*31ɜ-t9dscO'^ؘ}reaaj;U7'nSןw263 |LI3[~ڪ?SG]rͻ GM<^/fk>H6]*o])pKЏ| ׋6'0bgE#Dl 32JW,k̾̅Ns8+| ]:j\ԋe^5Kԛ EWBUj{AdfnX'r:cHTU 09G-N>Ki6ozu4Km!cvjß6B.it݆n۴c4kIY9t7:<$o`FjNv@  #WKJP s@ ϖ|wvjgaji>ܢ0]K>pA+0;k*NL< Δ0nϪoC=qnZ$ un3聨U7eˢF dEBDZ-4wm^騫kftup] KO,"a;5!v[ӼΞS2]F<|6xϖmBaܢa"GdX|]WNk~-\&KF$(drYE]U"Gs'-q…L򟹗wF5rZE$cwzZay}fρ?1ìn!_D8$򍂨A&VTȜL0<ƃx*Ft!9l^<q $,J&C s8Wf* ؗRpbD*YMx( чm'm/.s ?WJ]gC:wzlK=S=zYj7 iקB3 QMO(^_X( r*>vdSnf%wC5FJ9[6?uSW$!dN"z1LۜrV5:A"v5FO.`u%@aj#$,Lo?wWF٘=˼n(\$i$хto11&_" ϡrag(*Uӕ9N?Qzg>8[$|Ul9[$K.<}gf:1?4gV}|$mIj3.VzC~2=S%6mk&]^}ldwR戧eZ()Abx;.*mQݧ=R DƜ4svZAMl򾓊Ks~ %-וJ A5.T"]p>mj<6gHjI'wW^+2 A,\"ji v41 h1 ֙0\Q``{ Bx^FFwRk =` 3LQ*o;JIr˜N~naF m2 1USܬr֋1>k "tԡ>/!:D!YǓZMHjRQ[|9ؚCnhbvםovXqNcĞqD1Ȅ*{#%3bۀȗI3 1 4E4Gl)kwlLmDžû?Pb_Mhl%ػd,Ajǫ;m}7+S^cF[? A+ "Tzj<8P #]f?Dwpmڔ3t1 [SpG CЪli g=`!?htS@.vlg+dtѝn*RξB$(kti'1jsA%ة.XdZٞ}O"XmHy'\2eݹMv /ҀeFBuWhmlQXaxa*4!ӭyS x˅5:D ϵw&+2{0l BA|A/ğw"d#M!iVZxR;#-WψSb3e,'$\ q|Bu$0hn@ۧ[m+?mk쾣/ϒm1#ꫴw;TG4! *K,zMʣZMze_hpL+g*xAAhc$Ntz{t_/BhUq?w[)g^+}L &Tdمp' ՠj~!%;ALMvGJ?{NT~0DDˮ[XtzdR@m^.*snQEZ;ڴ>CK RPSzCf|:ՅS&šl.08oJPXA#~wx}!2:sC\19Xc0QS]Y T*O+&P(3`W,#ˍG7h}r5ۉN^d8aA.*&sr-Ѯ1,mH0C`!UT8ߺBEx 3C*A(a= _GͅM`8uzi `Mbdf7np->5jq,D7LSuͳY]bHg[=Cڪ»}6c v:2̄8+ju.bfKkK?Vߟsȩc{C}ɍo~|vgE%-'0*>H-5ʺwQq=7nʳ.`F|!hNN2TCBfeB88[os}zzYC]^*meHY2 "腣9Jb+pMv-{*)j[m @ۓ\i0ovCWI Y lXb#^gMڴ.gdqo[̞yz=l{hiٶѾ q lr'>JJ _j@*voQ?^I!V+ Ukg MRai.̫0;ՈVl}CQ}K(p!ց` C*Ǘ48$v yYhEN;.R`)#u곺)53r]Z_51pV1#}^A/jBKQ-}OqtrIcS$צUFO<79H$CB t_H%"aO` m)՞˿D0vFh!L/@Bd!.zbkG3;O(x~ETΏl RewOl>3/g&l]0Pa[록SpORKRBiQhsKd'^D$0j;RuN!kZ乖sYM)c"<`]7 |_C6G 4n"5HH./=P i ’ad/zɴS7'`Psy֝QeBJI9voE(M¾| N>}[WUܕ+{0X`z_^: ,&82ޅ4 4QPӝ]Z# P~S,'t36̢G-B;r^¢ xw3%nDGjhRɑVdqVK e^ƿt}̳]1__iW"E;GM \M% x(sH 8+<u}2 ~`J5qLخ7RszTWI"<v̈nYNc2+ vZ#ԯm7ĹX$ǠCBT F.홀ԗ&$y%+9 p?N^-] `sϋERl7 Ŷ݂_`"Am dO~Pִkqi5}6DN`_AݷDLuP Dҝk+끹:Y-v7Պ zAjt)jb ܒLv,88B!ڳ͂ `X AQt/p@c=jiVS#Gn!X#Ů9 [l;ps#9}/#4Mg9V vmkfҔN ڡh2-ק,퐍)w%|^O`6[;uJ7$uʭA 1%-Hs!cQb֕h׏-jh!Dۗ^oNTJZ-Nbw偡D}qҔRء Seۚ@Erm7{g7+B "8kE2QYhߩ˴M[ɩh vv,lmWd~Wř}z`:wh.~U|eV4P%hf')hR,KD_FDS3DKGV՜X>Ƀ=L><Mz Ԭjj<|$SCP¥94?} FԠ&C T€ W}$F94!{nUՍdWֳMܕs%t(V,,"d8Š#:+L՛Tpok_Y 8*n"Ի $RC!abS' הt3pcH;g\m1]bZ|6L\K/x>fʅ&CVxAX-s~7;tu|LНRC__Gbo ee`na 9$`K'Mc ؕ]4e倓+Ө,jw[A&E<=b?ORvS5xŭӬg6AOPEGV6=b7Oit3oyf G-qZa ;_n6+: Dk28JE!jgReEբ(wFU YD̻hvQ\"wΉj}> m%$$cmY;Ϧ!\=r<36~jPu(EycA5(2Ϻf l]ks{i=-~s0qɥppLNa_z}l3t)iO_e¶RL.9[N0QzZm%fڽ5yoل5 :%a%Ƈ kK6[vnoBXh)3~i+E,֕-zhR|Q  կ@l@Y5Ngbk{s\eT"p~0$걒_q L(*5-3˼4˟>l _|N~'P.<ϗYVqu;e֪ ,;D$h3 : 1тi~kWHdհ[IoZ?}VI6mb|.ۂVyI51</w})1j^MY08Jo׷ӝEA5CN [Y#ͳZI+g݀mvg1gsb=g]ʴryʷYd j3ـ#A/ >/NyBl)Z-@VoL!V)Y_g 튐|!~!5,jL8/4k. w!ßgz0aIu1u1\xS݌s1_i11PMlұҢ4b8;t ֱ+#ow27r&j* b+\:LK)i`ukpoJxi3WT;\Z753(W Qَ܋m)TmܚSY7#`uc0k=G 5`B7Y0|$DpvIGVƱK-Ѫ ^ϜeR6gj< l**+ }_9uކXTlYN!n#Ef>AfT _RVD@ dn# ea8kvHvFyF>aZ 6.|otyۦpkFf ݑws|l0*?a!s]ϸ @_ȟ]PW)\Y,)dØ}-dvj:rT$hRXo](jk7CBd  Ը;8c/AUZdHhY9!L\K"qhH4ؕlgy,Y6P/*!Ў/`VH1) ܅r~ ]V"HҺi%A.;tUGMxSavT}K-b#W,߾=S#}#<>'q(GI[Ku6 eA'ƞ%+fwR|,d~l 8# '܁v-XN~4ңx͇wq@:ס:@W?:6Au|oM~nBA./ aO4B"iQRKtϰf=KTTZ42~"Rg= -w3b#P>gf"N y:Ȇc=`n`*oeّ5/VViƂ>kW'd*_@6 54o[_gJyȧhOg>ܖ*Y2iwQ=>咉M/᎐+#6u(ikBS'D!x*y(,q!J=S=Rtr( 9E a珳Um{Qrgk⠗sJ^&+C5Pr;ZoԢD)?!qgi"bZ-Mag4_2wA p3nWo&֜xp3LP '5~ZZ,a_fRϵKȝxXddI_]XޑC]%H\:ɘ%"IK ь?bO̼i"j|G|+LQ:u+BN~h8Ny>ZG=zn+M`5iZ !:#Nn \$OWaj); qqJ?Y;B栫>Jу̮Z:BIyK>J^.?!qd׿Fez,./Cʇ].WzOƿ< 'M5#dG*O*\6~RM0&39LįV)ͮP9P2ab*p?m 4܃tNB`;+u_ke+ߵgo.=Dɮ^WB &..s+FYM x7ޘ DrQ6-]&G&z%G"S䕮?2vL~GҺ!U-$4ֳtϣR>/fUk38lAD9P{ CAן dߝ^gn+VsU?S?dO& JĈ8 :68$t;!bD-ic7X=e?j`3ݵ#~Br8ID&@\OX!JUT_L[,ϟmغ*DŽ*􎧁rYӧL 7HIٗAϝSyo]_Si:?6uрcI- 20-ףfP3)c=VKf 9񒋏߲nd% ye dqP쟼.hW|Gv'Rc~E]א! \dj,zCH(n+b?m˧1GMX20"l>.%A$UJˈFgHge~OgH6*DDq1n,DБDg=Dx@{'oriȅK~(g!#hYVˆ"]EhkVaK# r6Kn~- DUM'}RpU4!Cj4])U`|U5wظ)=;'\+5^*@\(WOMq g $+鯢j !9!hRB58-UF_ ݭf('mE)iux_M07Fէ;2V)ځAxK̦`kUQIZ&QSўQP1 ެ7xֻ|sajA0):oީo:u )ujmht8Yj S7LwUSKQ\a.yض8߇i3  Ʃ=߀+3nwJ@ʢiҦKIV)q,k^WO[|`ُK&L=}n  cVv\5v$c]vTA)0i^; %zkC@Cߑz)qDQ3U6wi ^ 8vwQxoH| UFb^tPR^02Tû:0MJ-f^ħ`3f+.+s:1;dB Ƌxө-ed~o ]%{ cz d(rm7j 0+*~ONߦEpfrFq?2{ YUsjbi1V+C:zyLx uԱT~MA!Ӱp r̠01H^s]!=a@9 W\˪swK5Z[IVNEQs0tӍZJhmkN7aQO'!q6%y6"٧Ǩ4A]+iQM4CQ ]6o]aؤ̫qpJ1v1VD@vg<'L=nF({w)PxYHp"ִz<V0̓4cI*S=R?-AIKBZ'ME"߮gVq\W>m>M'caCEӖ11p1vPNzjMw}joV# cIOzm]3 *G/$b H|k{Kofw͞ F:n҂LhuI{#E` M³՜!ߓ-eVjߘ:Dyf vZt d.StQUdw)8"с 4/ %4,3cB F['QGSMr?\Xݳ9BCW ז9ͯ"XDr\ oUQ@l L s!6h_¯G?{ZĞFԈG;s5[Lv5 jw˾v"HdzH MEߏ°Oxœ[ zO+-,&U^;*[]$.P4>܄Kn1KaLLyߌvR܃y>Q,g]cq v搼'jqo[-R)Mh:g1?.mfz՝\IHCc^J$* T0+x^/.tB!5QAE}o">  L)%ŃfOt+,KRxWmѢrGn$JӍ׭]ؒD $1ΕYpgɽHVA&䢣Zi #1h5rGw[=͉O9Wf/JVf\ FThBNɽTWOtP3˝0.4'qwHUg>@zsŅ*䵏E}/5M5ݗ`D+ȕqk>Yc5ݸ5SN=݅990 aX!r5+wn~rԼ(什H>h-LPbuӦ =~8q{9z\0:vF6arxj)x1XO I|-p ǭAM[;PCm}2qS2XH$bE''SlO4U {c NgE(-[/ח;h$yt3j0^ypMrnYM@+׀M yY Ca{M\۾Wp H`t>kg>R;5xNs(!>r0M9ݹ.UE/G=mLGo!x7 ,o}#-_{jdo\Dﶀm^!Eوނ?UL(TW*Y>Z;E 6uÝV;ݕyu`褨 {f^on゛s[:\Gz (vHsس[ /G F*UUV;+L4|Sz/G>s ( i/o-J $@3 a1Ɂ7Y#ٲZ]}4#ÕE hY:I!F-M+}H듍Z˼GUiuRfWɋa(6q$D! Oa T`T+RL1z`ɓo]m˰v X@xs `[{q0k2LMK1 5wOۘ~fdJN0V  ĽTY^΃I?2 LTtaO,+GKL]rףOvpU{>iႵAD.I"bzA{6^C1~Tkeo>2 q'<\r#$ dG_Z}KUDO+5^ z&]5B))d'dǞYS?v٧=ТO .vF2ҨUSFu3$p(`L3NlbcX1o.$W :(qQ\>'V^jnjjMp:rc҅Άo GE|w.vJG $M͏9dPuuLjY4xL.UR<=KfWE(&Eq_B~ !,f`FO;*h2F0_`svB1 Jڃ1-b|(z 6q>Ah@e]0 |4{>|8̊5ZnW}!?"RmYtS榚 um(/޾1ﻻ٩Z0᣶s^ɕW_YvCMԔ-DH/Q|B5Б`# gE^:B :>8RY@d\) D0A[ףn>LX5֮zc4ޥ'9I [riaD- (%St}<:Y+ʬS(@N5x2 ~XQk,`roMxmQD䘝Npc4Pu޾QeCwO~ {֍k5K/":J;sB+OؐoO{#bb3Xɷ3B9T Da%+Im+JUI<L'ѽh\ U 0fn*`LF(Ό&ڮ4Jnlei,Idrn!XE}V$[yOi]m.N7-L x;LMEY3g2Yztgǥ&M-/GQ BHQe0Al.f,GHFV~g2R8mq[0)O/Ϭ%BPoIe5X݀26a{w)+&S? ,mxyOoԽ2Նqcq%`iP'U甲>ǓDG Xd0 XX p- 8^Nq\ذq>tFl+p⧖e_::25 >&qR/dRUF'̓2 WGtFNAJwM33N&B Ǐ6&6ՍlsQO)}E3T-xqdcB0W6m0<`a#6MMol? _PK=,>;H3I.Ld TF3Z.`eQn+ĉ/0*_Y#PȹќW"~^W& <88KGM  ĬGϑ2+-}#E\?eYRh𤊅1$%&P~,=P4 è.Ʊ_)u?IH<T"/q,$ݔg~ޮ<1n7&nq-ЊQ D^dݸB4ky,zwl Ӵ2̑Xgcxdh.B6c60Lƞif Q5c$oDy 9ċY;gm!*foq<HN^%2,MzE"|}!/ 8bvh|(F_/*(^b4 499REIuRPL^-›p._289SqA11#`b*9N=2%杀Tf]V1WSqWcu\]U- W]R`jhv*YpvϘ3rM##c78lvCGm"F rpȻJ#/~ nni\Ee'~++3>tqЫ?] -yړu%s9@V}_;aRSAx2jlJ[(7[5eBcMrCƠ8j̥|T JʮpQnk0R}@0C1# Rv L %?֐"IX](aw;0Hv,QJv\E NP55`x2AƉHD'*^f<E2 g[=?yhhlĀKm@>t>~ !CwO9STn!b-{,w٦rNj+dlC8! ӈ`ȊrtNMO 7h8_r]V)5OD9Uw-e$HʪS3s9?e~ ;~} 57е~ujfBSDE8!,-,9 зaw(љr %8.!7"EaAZ_򅫲K故 s(S2Mtq"?ܢEL mK "n*134RYG\{ttN:uiz'E"Xx$WXY\E=,qLϊ'[I,*sm*%fb*̳Һ.6g`ŅasseeHw5_;m03|̍hGWMԹo~&.ReH ȔgKǵNWLIoXnx>PwfoGtez7/_"66"GՔ S+[MAnl˝hK!T0^US.Ӡ1ѱ*v p~qr>uK GO>T8eN1N,Ҁb%8x$TGѦ[yJt ͵װ` OO/$eh5F|!?鮷I-,Db<"k[4ozX7:k?XqM'CPULx蛊hf=(KU^K-πPDo8:=qxi@+r.lIFND甠 fv ͼ4>ʮsS`df0%\n[J4 tӒg!# n#'Ngz ?\vVy {^h4vµ߂|xh=qsM/RMrtW!^FCN:{TztgVqG|daKfYpKhʅݶuԥ^(sM\[/ƎţquU{A )(H-~nak+ 4 ->ļa!SPޮ:ŖT^1Lbh`.sO:[` HYAԻ׆gהoY(akU_bc`\eOcw[dn~I Gj8=Mw!32 o-Fħ>NkL]wv^wxhESѲ-G0R.>ǜeTV!Y O5 їm SEtӉ~mRT3̝ č$#WX!֝!hMQ񆇥gB`{A͍ ,MolkD2+T{֕RL6Ђ W2ë>i"<,Y9m=u0'`:Ja6\Ch Ώ:jw#Kl3t2u7f@k|_dNcX~e˼:?տ3.f@!fQ ٷr|#"c=t/SJ|[B)dwyN0UP_sF tP?{ PYőŠcbL0!w.NwtX<*?djĜ{9R,b`,+5p05iOZ<Wt9vMBL4e=|wWn:jEQpocdd mC+6 F,n1AS$埰D:֋.~@P< ?&wS ~4X t4쇔  g;]-ym\[wGk:niM~kZ?sdP\TReϓӮ(Pt c"i ~[>SqYӵ>>9p':ƅA7VjjU:D乂>lL:%}y$l{e ryW!F@>6&<0wg;dQVYamA ioPf]T*l{3!]DlAOH"DJ/嘇rpfX8PI# +t Wip&KnPE5c<Γ#%|> Ji~ڮ?4ZWŘ7]l۫d cK,ĔA̡GþjF8lv& ߯ZErb+0OC_\fK263O#8VI򮍐C [;{tfV((\%Ո]S✍gGE.IoDzz6'=x^`%l!Ήk )*185t}MLX2ɰ,5Gц:2o2IXg`}U=ӋM@г"7)y N;iXTT5ާۜ)JyM޼,5¬M[Z|ĸOR\Nl H~Hɫk~X%x|u4t ~ FLMS;bZ}ERǨܪ4|?3+adoi+"?QA4`l?㷑R 0w_,gmD tzu5az$L|O$H7OˈH8%5Fː}13NQbqFsV-djrmCmLhYX(`A?{0,6g/c /馇-c%arMbBT~[U,4eK>rUmߙY4! uۅO xýa1}3W~0 p'GblVQ1)sFNdݤZ3@][OV vȞ8rj5tz ,k\Ld0]dG62' )JZ2)O߶XtdYD8AK·>V|ďʙ&LAg)bOJ1ރtN 9:QPJZ ĐX1$wU:ͫ蜈)]Dȡ~Ӆq63](Mk~Hc]xtiTgPP=_A(gt.}$z*9H޹Qec 4S]6nC qXl@&r1mS!`:{(SUR$)D5gadX'O;MX**KNQ,Ӷ)ixd&1RSdOgPWatTZ35YR}b)۠^/KwdtbnՎRQ9 c.b Mkoǫ)cL&2CViGd4`ذW Dq0F v!W=r){d|voM \Ky_c|h c9MX 85*WBrD?z#{ .' 0l`8eG 6h-4&cm]Q;D@{)5a i/h ;4DVO/F'%a)|м|t&#t5|]4V bȣIra SE:4G>zzJs ! QL%FӺo?Dh:#ʠ6NB F:?.FQP0S%ȊI-^cc:6F %-cAѳHsdc!B_۷& .w;oktZNZM{c$_ ܛTG=u ]Ɲgs20GPba/|[`ecPxjZɠm3jKIǶI=^*d=*ֳQ~gd&*&;: "^}2ZE3=zL@m%v<E9C5n-"'o#٪"1|4"նE?7݄5%ocǠ6YhL_ZpO(yJ8:(:3፡ߡ+Ȍe&&ZYՋzKaa VT^,80gҎv`~OӔVW6-էc)fzx4( щ}VK/gZ6*DC2%Fr̾NVzR~PS9ӫ|d9}GN 8sxJ3ѭ[vVYLza0-pcϓbz3d ?QOݹ_/HuC|hTqb{砻 ŁZ&Ӝ25bʨ)Hr Z|&~?ձDy@p'e>-$hJ,K7]H5pe8uMVRukk_׹!En5Xd["וWxhsKST~m+%y:JK~#0q2y|/k.vHmņ23:X1f!P,o;sL/pi$DƟ1% X"pZF_a?nŏT7RbW$yM/Fqӯi|( W|J#Q{vJMMAp&:ˍԪ'Ǣ>\7=oݶgH4~F~6yzj }IzE54m'7s<+>fmCH %Vg"+-U7>AļQMXʴ"S-Bv>-oqv/[l&0AsvJjtХf '?'!?WSq5=0 ".΋ ln%4"WAb ԺgP?/׸.̊m}IțCzG?w/tXk@uYr熧cI%#8 GS rdC>46lCmp*FjF>gO(K ~:8Hsդ $hАv!:9sʵޑ~Q3t; x&6;L"- j= Ӗk͘_c!Q;JYӾ8#qw@qiŠşnF]8 ,"Ibu_[0XI  J,FU-gTy ZДb{•, _CހQ{'0]jHgITؤQg3jQg} G؛P 0ڟ. 1,6H͙K0p ;ƔOg.g3Ժp ><^%.xNr6po3Oe54?-xf ahqkI^. *1Cc:rҙ|^;׬0:] @zPA.PC~.\#Z9+矹ޘ8zp>|_l&ҲcC3q"х #f%^tg+h[{1- %!YLAQ-Kd#Př(/XJ<;̚!`őeܛ3됾AvX9e4qя rBA$%] AJ)6 n]:ESeϣ8{!41ϰ+~M.ybmB[.s(P fz:&CgJs ҋ:`b=9VktT$1=+E&)r[!A DdP"~U|cz6Sdz._~;%t'*WTA|ը5dc^cz 3v9(9W9MiEOLGw2*26zYTW(j˔;hhwKhiq vwZJÎ l<$AS=ݾ{gq"R6u{5e; 7њ' IU6 A{hMP8bEd*s Nyyr~^Q7YB'rt: 0ǦFIq@= J^0áwݜ> a@~vJ :N\7T wÎc5)NfĦ3޸ϩe%s[l2 *-l$hؐDOO sf݅!.l^.2H'HZz ww%x@9m DL+%g[I&U-iv^%C!'bѲ$EJVcO*?& 3W\ozҦna(,&`JG`$-pQ"X mI~< IDOiBg%+7(Dh&uR`0(9tˌFӃwhAE4L!i4,!S5-Xp<7 }k-X~wm6 FWE";.!ItE^-׊]iիf(rrٵ)QlBaE".9r/UP#˳yhCW9'=j"v,. 041Pp^oMzNU01Er)Cl: *ayekC|ެg&d%k2 <ݛ6 |(R hE$A ֶZox RqW{ڢLkV_=KJ RʗBEr<=+-R1@sC+Íc1fL8 RkLbJ|}&X?)V5FTϞ+rG7 0 i<_ah`*~ ¿ٮ|&rMk(+ݺ'ն4Hm]Qn)BͿ{9 -dRwlr(WAhE%LGϩj{w @p@ #Cis%Q2K.fS8W| ;q8:GM"̙@ ~> :Kx) O?d,U +Y ̀&K'g\۫aX{:AJ%\Kq@ݠ]n?=1GK .?@agƺD1ؙn=ЫWN( i-o8 yq> ps)@=wCw^(6ٽo0=Wq{k>jzK]˨Ę>˞fͦ`#ڻ/bQΘB+;H2GGN'n߅n}Z+X= *\ A9|d_( WAt4;H-WDŽE=vJf&;k w2H-XnhP.\U.EKl8c88EAFNo^aZ9o+JL1`LҶXNFq&r"Q4Fܔ&pS;Cg*Ek-2MG*}C2{!br\zsp@yNfoOS_ntWQ|D rrO$7pHcH1$̲Aw!(gVk^}k*gvС ⦅|䚳ޤQctq< ]Q0,U?VK QhltH)6r3Ƴ@hZn9LOpM S1W,]ٯW ZV6AA(ۯz:IwjjW&=wpAgy*aJiF( *_@;xܹ}xspZWbhPj|Mˌ4E$g  4Okx+5IRx)࿾bL⦤[墳i 3:,oV{(1,x X"[o8IkCMƆ(QO㤮L\|魹?Qb`ݏE-|p ԇЖ*wz n=^6fWs\4EW^~m@Al#݅.в|jn\OwVMp 9v*K {᷒%E>mUʠ jalgTEK|-X"*8Xv1!%J=/i'b[c& 뺟 /)ߨ zpFCBML088qa*pK o%%=KFń8Qz PO.laK,հ"]Pj8:RIixC#xrGLz+c=Y;Y;r0R:. K)@a->u}24\ ѿ8FXZ Rpz$bo~熫G 4pWPjS"EyX{Y:@(gߺn `oE# bJ-\i !q8͝C}u܋BY{ w)Sĝ%-\ӕ%XxmayP"szX;LoaI(m"zOs S1]fZ֢&zGj[ZRSOpS(ܸjӽEJ$4"q7 0cawKdsYÆV,0_+ 'C,S|A/w3>œO2[ݕM,(nn'ؗ#MԯsDqR/E#A(/硑2A1;jCnὦm'vUKHQcL棖 B} Tm(5[6ʘ`tV)7cpFIT aq*ZuTQ&8îBh ZcPae~jT.p@>ǫU)Yd# 2hbRMuG>YK+`QLkWrsBIx7n]@(Mz2O%_7q}%Ј55rUftj 4]7nXsWs|j0%b\[Ŏc_opFܯ>< u /:#/h]$ie , O-zCgmuo+ɒnY^wkGؗ,y(0ioSz5e.kA0 jq:9ž4Jr^`.QM+pkqoY(ayZ\bwC0P[r6h/:r> e4ݜgᮞWCwHm=w7@Ca2v+Mӂ&R[3gNWF\<c4;epV9I}<)`]}1uk*Ch=lzZ|t`GMw'E`hCA+m}<ɵ8 OI능U;=E.ph$v q#C FE\Ey@#^H=y^zk)F<{kS<@to55.+ruf U3qmK);/`nF[YvNaJl)nX(0DҭC/am,b #3pxVJ~.:ӁCRwR9w(N<G~GQQJ(:utZ /xIdN{eQYdEt8(~L茟00*No-v1Y;G 0d˷n/?j *WVK|9zÈ63`9{XX\N6)@/S p(2?+BX!Z DŽo}nOiE+Ǹk 1qRF`vFn cF^N9;8H866L51 D]ѕc@/遱3WGi[ilg $19gr߿bOv *?)[ 7$sZmLmMd;njE&v\V)la 4nZa  P}@FåҿMz z: hi f[JPZqKbFvSY-RcψKQ/T\vaMr$̋t1RMʀ Qޟ{c?J˅S=qsxUTmN1B3߶<@#n2N6iz{UsRhu(dul1Vla[Q-կfm n2‰PTt w=!tb'q:#T(F7nOMdZ3=AyxV߬kfFo٩ [,IOI;/vYf4*S%ie9WI9Dیx^q:\\!~?h;X;"ᯛ|NGay&gonW~yso['ᥭ$>c޵+ނшdfWXz u,"@m+CW?Ͳt8'$NgP9M(vŃKÊa;^0Eaˆ*hDE9yOz''Dl jK-[ښ,.B9}~b| */UeRݘ1avΙ0EtSvjSGl{Υد…@FJM8h)=1*D.5K'VK l)HetW_WmdU"_{V+F)qrݢ)R>9T$]T>/vbT愈P#4BN"+*h55e,ʛ2*S E24m. J<`I*@Kv:m &,Y*;Sdd<77  3_16dwH")vK{T R ~fntf6("^gNyCLb zт CBcI$AzI?'#zE',tB_U ]}`axx\iggrCCDa;PV= |/TFh6RÅ@ܫdnLYm4𖗿V+2V\omHwNW́V?H-d˲/MsV_zea,_ФM8}t\W@ɎG)ay&o{`1noh`UB'L"mpe]#t| W /F@ZƇ EqDmgГ ]G JA2/*U2WZq7/YW5w8fɵ5-Nb" u>G,ȃ{wM'^b'T&IMHsIٕBYX4}i|Jwh nW>-H$/h bhf3:Rs+`zwђ3F 5L8q@ﻚx5=H {F&})0WgCf?;6@}/5^㩬`Ɛzww&=P'?󛫛$-*yfߗ!B%j\Ik )VR?;qڸ %!z#tѤ֝W(%Kd4$ ;g)+! meU85LԆ|8Y8 S@sy?Cr<_4`菬%vxQ9Ls!3P }ּD3H73ی< Hi 3p2P B\qngbUP5o:-X \651ZMb>FPnXq~$?w=ԴP xi;sOk ]ـB }Ut \4$f!i+x l"WfV A ]%}ZoŅr¨1<"QGrkJPR]t@%Cz?,yuYYi£ݤh"'yv?> =чB͏ָ{gH٥>*̄pX){#fNIRgډ:wFy@' $UO~wxWREk$~9`Ma,Ec{D]Z2|ΐ{y:ژvD^J2@L ?h˓cC8'sV^:Jj~3G)i i_wF;_I?E$E0}Z*tu D 2MŊִjl⢻H3nWR(( !|:а 1Ht5B Le¤͕ j6'"𫃥tbF\ r-r-`E!RvRPEL~"a?-NW\3 VhR_Жl62Ip .)jM“ңo_~‘v3c] ݙ_fUEͬ%c&@ ˓%8x%4݆f)%'50TLnғ$Cqf73*qwc[hҺGK~[JeѮww& M2ยST} :OM^/jaV[xdHԺmqi O:RZ0)ʎ1kʂ)'N؄ʥlA&)qUSΝ 'iwcrbK0kF?gf~0(PzEi,7EKp5ȏsqZk769[Eu~FȺQ'>fVr9x(B%ɺ߀[AÖz#Ҷyu,lP{n\Ci(.,oߴZ-␌ %AOUT*C1* )ǣ6KU֑NDߜL ("k|cFqui }7%kGX{` DΝ0fRM2R22 v( <vVØy_ B ( ?ߠZt>`8T:fT5x<dR.AQF'K{m"sh,+:ggV-te(8,@bO0$Zx ;_\F6 %u_Ae+|0V:Ż(n; S%%)2)Vmuɇ,tf=_q֠bGm~#עO9EfC4pg+¨`8D<\x "t[2X8Rqpg29) " J@Yl%ky>*\oYRuSR[wB_eg}zJEC+dS3\;`,@*{q-˭|ՇOV4Q)LOd٬#5(+dc%~aqYN³IPHKAH VK2! ."8@S/rn 5"L'R\{K;*渝6"jBuQqJprGХ3?l"XNf ɼT6H;A򭽬J_xm$l&XA)ޞZVƨM!jeIb|pp !!2l/:tHߐ) =(;+>Qf]br"p dv1bO`02)΂ZΦ }"wUp*J̯"p00fUpG1Nۢ0޻6'H޾r@u^A%+)z'j.ʃAI+شx;c|t$1 on.|-z~;i _,QZFkݷ^`ۖU'ᙗAꃜHqyJ睚7L*Zv& ڬX?#*뤘u.c:]r_/'wThxf4>45$;j̦AM*%##O4sMR(njGU "\`ikfZNOj2_jFάtzT?h}ʼQ<1_PHt-FTW&fgV*n23LJakǤ}x8fc H8؝Q' d9iȲk4?Zo-/ѵ*xIe nߚl,G#^ N6Y!m|tLIS(- .4/}8G1LΗh4T+&(7dY<<یa'Hʘ+nlCOaY;q etl;0h,9{!C7>핃a7Ts c (b\wE|#$5Fh'̒; q@ u@Z1cyi5k蒫;\ݒpuZ59£d,RfXLKJf>617G@w \H4%ޓ!DƶcBך=Rܪw#0!: Ŋ/">ô%,D.H>N΂ hٓj@nG2G;Cґ{-@${iMلǖ5l\{-ԀLC.4/E>6K0diM̤S.O"[˦`~v鳶ߙ#]Ԅ)i(-᩺^~ .p9+GoCHuڍ5[OfjYN;faξ#ckzM*U .z$ u2@#y\ޓw1f\F|Y↬r%3[PkK!U,( #"sn WXɚO ts'PZÂS< SrjnP6ZčK8U 13UmӼd9׀]LdNk/XVq`1Ef&AIG^ݛYEҹ{K瞱e~Ubu[?޶r1V6JX] <ƆJbmo7q#`ܶ34neՂNO?*)x@jI#soоbz~\[HǑФDcJ&`|e-:1#vRiI}wtMX 9Ndŭ7$Rdb7NQĕo5~>@.ρI<[ܜ43Ѯ@=T@rmb9uav::JYejAbB$-} ,{b Bbj\Wf0tqw,T0ʢL*.o.<5tz‡‡NEu(y l%. =vZY u;ѭ m;{yohmbvDElxx>C$W*/Dd&)f.l0 kGW@JJh[6mWɨdXyXR6Xf`$$pKJ"F@|aw A4!sY ?M$6=MyV̏SbnjQ_l-PBf_7OS8ED~ ,fcK@a5o?VsVdQ{E>i>"+g0+5@5*v)S[?[I +\lw{7 5Q is-2d@{4hXo/͹Կw.i &}e'RNIQ\#VQqU`~yCMk-[ɚk%ZD nG|a@3їt&)C,qp)o~o4Q9[8} J;;GLZ{1tqФyACv r@Jgi'B<%T:}tM`6QKɗ{} KaFu dڣu-6ҠTvm N.+:z&4"~) 4Bu @ O,U%]BQ(FKB4}p C^g\]Kr#{!&SDdxW MA'P:7\Yu:N?M`'ʶ" hHm'G]iRPakhIq*^\'A`&& AsbTEi-cW2iNG%-dŚ&36ځBLe+4IIijF8:@ #PA1i~wNJ4rgp0` t|va=i/=KPg{^`AS(DҾ ej<,Jhr:2 V x6୎b';&n [2§T tP~|Y=׷p^H۹ d'!n+LL7wh&ؼ#r%Ɉq!%.գǮ3 `3~65:b})س_7.Vc%ЌXF`MLDQ`-2ףeAtuE8qa2SKpJG"a|2y.ɩf.LW!"A C!V_;^XxyKvֺŵ$n7EȻnйB 4ג&@0A9]tzwiBGFyb6َR?|OS/{eeð3*-#^U|hԥsAwwfDMTjY!Xۂf&d$toͳ%, ɑvm02ZZ\kA__lH]#blD&6>#o/ZM<%HB -X!:ӵ~鑃rn[00W!T2aw(e'ǬW7yKC|^{?ňxbzȸzDp.&80S[gHwnЛ@t7n+{ 06Udb~8'D kzqT='VtCE~m m fK_-&Wn;;6hۀŠ gSϕ~[oӓ4Ȩ016|;)ASH84{-]\n;)iIReGK*vmtDgt#J0chV:p(S]?[f]X:78X (,p6ȘZ]sjB3w_"59߻1&AVI^f64S74/p+yJ!=%gfqfMpܸT4瓾>Do.Q3>@#8YC^Bk9j"`sI}}g }|\R{4Xr_Fynhl,%fY]9=WG[tK ӧTaeyD0&- gsWzE q"?!xK>ek^>g3ONa -1g@`e#Z|~z{^ d*3DRF]%3/FU#/1xxZ рlFc% Fo|X_!UFKì`*wq1W`WF2w</yMjpaԴfwjdvs>HW|2<򥤹aٸtiXqJa >wo$@cW])>4N MjWTG92s6Fy _Ʌ}#Ehv*gAs7|aUq'.FL5N$r" <Z<%԰'=ϝ)CGncl#l1Ŕ=:؛\[xAQt /ΜL>=bkԗvri!$#ܶ* ,X˰WOGfsXO_+*!_:R=Jgg~ʼnA}ł4ȏdXlfrn(>MgՐ`$Qehϫ40mצUA‹ls'܈}kpr&$C IUT*Y=EA30wf> yLJo|f 1,SJt>͝o րHWۨHGOxiU̱0i8Kq8, |X"Kx Su8 a۷~?U?7T\ͧC z-M_rGܑvTVŻ<{2?_|cj3F/95"hG{&M{$}[tڲ˔[ˆ7ookV?|fzJ.&FX9h 0!:yTޮ~։a )Dz#OI85BD~kb,nSNhȡ>\55n~kGwCM"ɺ-R3# 3#~0c!SOU uBKDӗA ̹Boݟ~'I#T>4|$+HFTķye\tO#39Y6Va O\GXkVSe6NL[H&B}It}~Tr呞c/$2YVS' &(*c:MN5eBJ>/$YR[P7l<DbR?^=lw0B"#T,K}_ꂭҍ]¹dP8WSy1z=kj蔇gעY9U9t=s'XTJ2{_%pnfq4 7H~zSs -VYzZ7+=7(#P;^zwpZvn"b'kוb!R 䈚RJS&Y|b?sWs^2Asxr@ ~"[=#Uѣ,Z #VcϏyۻ*YU}+1 P)$2؄$@:YNU4)ӥYr=sUjzh K$=zm@4;s07x@Q_'ZB{I[NXZ2 DmCCp= ;Pe \?/dTjS'6k,|Yh )DV4ؤ(즱vGFʟEՊC [; ]f 뮔 em rlF A QM=)jp7'/򎘹~ZLԘU"0W42HAK^S*s3\\8Z}I(h E)A[̽| Ĵg*ߛKjz);wnf]>d,X&DC2N s %(JmY۴XK9wOrHakh]źXݠwHFH"$>kfNsbTGmP [`=l eWJ~NXS>S$> Mf3 _@ PۓM[ 9pl2A`W$hn}1#,t[w[$v^d]@YI+#lYNɴ*,j[3r؍Vq ~3pV0ETARBC/n#YLs-ŞTz)̕Pʄ1L7mC$dM6 <}qAgF`Q'09%1eLML({;,==ruC7K#d-Dvi=Tv)}EcCJy)MT=GqiWS8w[$D-V#FLΎHnSoLKItq&0! :}teza:$:ENaHl~Bh@$,*\#zJ ̍T{4Ss bo:ROz`>x"!ޝvco:W8r0f& XGoOը~{%J?4I J+æʦ7" r 5]1A̲)2f}lZ:gJtN'G'zl]wU~TxR~.S2b?pIo.i&l2bȊĴϏH +RX4Bҭ5xR -/Hh^ TGrjy3 H jڒthk D=r7uU>dWO5HFj7`+<\pq[Gzcqɸp*Q [^%PҖN4][`Dl.N!+:+.5ī  Z|eIm3tGáx0I.D4!1ޘ6} =MGOeiEypmuWPHQ /G:>9Uk.zÔ~)OFjxG!N{$պKV(z 15AX!N.-__-aL.)EA/Fg>,ʪD?쎇°xs3{/[wxGzFS5\i^SUv}τɡNym J bwgXO+u>lepD1tYYXJ5kpmSެe!~rz < tA*2Yeʓ詎z-J=lV'kTP::bI LB&D*aLF:14Ei6,\k֊ՀZPmgо0)^: d P\Ts]LŎ|5*m.?9YR~j_fhk=R/}N69HIPA.^ʙh&\QyC(kdȟŲ5߅2NP]5ܮ{b[ϗ)heIl3Oi"9np哫.F6>nDI7x#=6!)ei2-Dq E:f؎u7YQ[PXo+r!N [H098?ӏ;%2_2.5ǎ. Y-LLC H?F G[q YAE,%Ӳq +au7!\X߻+bn@!ן2X/'N  _`IbbM2@ʕk/: 8NXQ"x-gf,xZnEfW!o3 @qS7#׮Yy8-/gaduQTHA]cTŠ֞eA/GLg3$_%o6ǗS˛-,82 Ize>[ɩ#!o*dt$ T2+h@z dRaBi8גlN^LG7ނ[Z~rJHq_N{~NJ,5W8Sك9Insp/$諧zwJ; m9wq`^=t(MKOL#@~1h:y1'%w>܊ bTE{{zaF( }X6W75ݱ{UxHn Bb!-9G"羘^t8Bǔ>tt=EIt2ª'!5Auý=ڼ~jyWGw%I>l+5+ 6I,==YcPlڡ&b|:C? /:?s~AF$m ?*`*+Qܩ·lR&}MK*+2'QB0>#wju8z~2<Ō=yxrc{2/k!8Z" jh9xfC-=OéJCc6 2VG_8FvZf+>I-]y*bûbƎvA~'$MsoP]O>zzs}[:BӍ|>7(@. p)AeeLzAPjxGP(^TS75l2;\Qh·;)bz+PU/,k4Wzu\\pB|`67˩Amڨ ݕFzPК^{$E^mMX6 M F σ6Snu?hC0ՐA$7]靳h˴U>Q*﫲y-V\TxzXZ>$X`W(lK|nWiƍ+!88 <3BIKp?3xWclFvn6[P7@oQ p0qa}o[p >T~`'ꀝf7P߆gyVM( Bu㚭ypл<-黇7bM?/вӃթcfn=lu ߈O.r@d 3Ch ^ԏ 2-'1/>Xɪz#> m C$R|m!䆨@#!!+" Cn,,1\LnOH)U>{P%ܝj}hHp$'5.iഹ%~|#7[=zpMt$  bQs53Pܷv<P^ 8ubA@cڶMHIM(sR{_hL{gkݼNĤeG"{IMwߦ>5ZG<KO ՂHJAw<9.$tU-G:ف(3$df\AA*c|@U3e54q}רSvƛ 3(R 鍡`K Icҗyeu0;_w,HҮ]Pz6 # 6Y() *D8iVZvVMjeLn4z,$qX{TiKIɢ!~3%#3qtoQ[uL}+#' Bg4<㎙Ʊ΂Ж'cU\3a&uXawOMHy?[PGO,O%TOO·TԧOf9LorXv"W̯c:`D=#"jqL9tvQwh;ZO27f,6# 59wIm2HBoƷqܶqIOLf^"t޶G/!"wrOibbtKK'q7)wpч:,xErFh=:$NX+?8e4#?u3`N~";L|nvJ݌X 1.dpFg"Q;L`|&YM|bիF_GTu^:Y$(1Ge-QFȓW>=N+퇝h": Jo;Y8Ăhi@S \a嶗]/}4 KSҿA 5]P6!rB\n7j0 ¢Rüģ' L6WdÊ5Cfav>f`![&/M _cU~rV+ }pm3 +܅*#Li0Xs(JM-9Y눙zdjܹ[i$`YnPf*d0A4 >J Pbq.Fq.梳i4=1q'IV"ُ'VoQ %T#o8P_n&;t_*bjɆ`E޺n$8VGLPr50Q -K\L97qw("tG ~ rb "ajq ӈ/5)v>z2'' N# 1^'{(6U˭F?8*=㷡$6Cp %T,r %T_>zmÎ~5Fk_ Oߋe!m ه)h'1lvjgYOi=TQ{w#@714Y@jh4t鯌@1JHҌ/t R _ėԽYן#pM0tc'y7Q޿ ¢_oi`_(~4ZNX4WAL /Pxe\gkX8!ix6=|CvN'qPE(᪌?μ}.Q#ŭP;{g:aU_V>6bfT>++Ib$E(C NP+ #lӿcybjMKEJ u{8#ۅ8xk(3Raa7Q VQ~U3ƫAgT3%M&e]9oW@Em5]ӭj(F]cXI5:rL&/0dߗ=bҭ.J#1M!ȪU}`B%Q0SbP’3?\Zf=+]&&rD1V~=Wҙީ ptkQӑ뾠F *>*!t2eeYs`ye!e1o w#m[s& 㛰m PQOZjΞ*;L 3 K@G{Rqzx+ӄ)>0ﯝOK'k7Kc0U&EM4Fa>Md@ ^rߌ=˙+8;P-ߴPjL`nVPu>gN(yE ؛d5 T=O2 Ud[;g>&N-va<*XG钜#0{E›zZ btddF f3fc&:VwA=-xԦo6Mq^ It)MDˡ0w$!w 5a}EbZX/ʐn+/èx,~#34^2nW܁'co~~ n&99mUL:ai],_6_<o]ݬd9VeHhqK3m/zֱ!Y^52\<82 Nt 2YD&ʑF㰨:YS)%b ]dꎬA7eh5̢mѾV $C*W# ψ`sea/ݍrٺ}nTbMp}ﺾG{H _teNKS d͗KT#E(Rlhhހkk/W&:Hѝlv#-+a!hWAx53LVCl$µ%7'zrio 77J b{>mvM9yoCl 4TQCah߬I,$ ` s_:В!M/CIfp]ڗ{%_z$?_"e~슮8Ep^I#1Brn R5pD:ߊsshVCpYˁm1@4C8HE (xo);HD칻NQ%fQ(Tt_,lUkGH-Q $D N%8.F+M*HFj" s`6\uMj<͵ 5cdT6dv*0}R0-E3%:_ϏLg(? w6D0?7;wݯ{IJ&gPoOik kL1J֘W܊~DڟUBJ̢hz^/gr*_인=&ޢb$BZKP"fѭsMۗa1te#}OEd+c./X_u6dR5I,#Ż=7=bd>:s#`JJԸYsSvKf{7r4>| aGIAlfw"W6r>CSzMdyj&FIb-풐pw`_ˆQhVBjWZHrx!B 5wD:yL-([öܜ9OD)0Z?WS=qm+,rJҬί۾m闔LF dek"5ǩVVg/@3DOG=_3/] 0:[ZQ(ͣ)zqݒh !o mT5ZWnd=fC#$[WCj݄ yDf[-4v@8Do$<4pֽ*_ebb!a#7cdc<{S=~]29*yBm־/8oMԻu:F] gS_w.d2+Dpd#Cur9ef̵JmnO{߂kD dmޖ 1#"uY ,0s-*x POd$1n-jP"Lل'2SleE\:2u1{(l3 YrBrU]ZW.PDO^AYmL 7d-I㋨E2wMroz4/4=iRk=CX$^;fZ_[~F#MtB_sү;KOՏp~Ok0%DAcݐHe6Փf@c=7'LTbSb; l3n t|ƻBj@E!?RjD<%CibZ|ǀ?LEݼHl |Ge ᩦZtXVYטpd;dѯn32KIM]ec W0)s9fFT" ^1up0 XByjJeD\d"f-ʠ1w\c uRMI4Fsq!^o0#:(E@dn)Ksڲmԯ-;ٓ"%=aGFP?>@KLA{3w1bHɚ [LYNnToAgsGnɸB3sڛы!ִY~:[0͸BZE>hap)Vh'Wq!d5ݒV $sí-ԉ^Л }fm'-P2?I`~o"i>d*p`mQ YM_Q'89|Y&V뿾|0R;=xAZ1gO !hi:h(w >IHxÎ^!:R^L'H]&YA˩DDV/VKG@sx9gqxQve.-uC"-b,Y|Ou?~t94ai7UܹkKlOaV.(zPDsS!*8΀ȝ\F4Kd ~=ɒIPJJj,4A8{씳)Wשm }p 謫}_Eǩ*ʗ{yHQX4(삿h}l"W ԠRSv>qH'oPzv hC&dvKbŃtv{ ś p#0}^售D'vY$ejQ;h:#92o^y/Y['S[MDK< ":=x!>C& n]#ˁ0졛oC^z$lT*_,)(v>/ Myg^%,VSFK:_Ps{9\u}]Ez%J`ƍGND/{F9g7XbYrd9"y 073& ҍg}l9$+~/}}s0t+j?ב9dXH٤^/[dt,z|rw;H*"+K0$-NfST= p7ۍ[;Pɳ!)ۮ9dN>cfߦҧޢF=0{_$E"PAzL_/!G6xс=ȕ>Mslr֊`grȰLBdS\$(('OlD#?Ge$.g:>7` /99A*x/y":{F[5:ӮqXJ6Mh]V5BX#\vUTV2̕Mlo8In/Rn.jĻ[TLUAKznFHmwI5ȒI =N'ű7!؀E½M`Ss*ޱ&"M<ű628MMR343kYsE14k67 EV.s- (&J笐W {;0W@_x@gGGo .d;Ѯ!p>wbz tsߎ@ ӫNqYy˛V5d\ f(`@Zkɞ~kwo\~Z;僅}5OhMRD;e:WMP_IoJFL kt* \]i$VqbS0nY/M d>dB!|E] dT҅mGmr3,hݠc־aOK(QpWn(|ϙNȱ (Qd8;,[_9v1J2߷2e-nt8%LҤ*D) 0' i):=roA.lkdzv[MjZJuH&egj[L4Itn>%r\~vѫ2+mg)]K{࿀I÷MVH9vCWU!d=焴щ}aܝ=n|cV`0bb0ڟ\ _BL~,vҕhiˀjBǎ`!_©joq[OsQx6p*NUeMd){h,oӜ!Gyݞݱ8Hth㷲Y]#.C:։1H+&sV&gLKl><ͯ"5Ӵ{\/:=]f($ޕ-3nWAd}!O*PƸi@ѝ:3O4t0/&Uj,b)%[P;c8*%BKX@=iT1ic;tS\3X?;2<8W][#, /\zdktzȆ҃]F$B הۿp}+ыft~h KCf,q)Xn"4R/JMTg^qUCTB;(8%ʛ`֗m<,<md[Ռ[4tgh,%mV #~w~AS/_ SÂ̬Q i2%!4qi>F.x'xļ6RzF{֩X!K5?/0&72;s<yks dkj>@%; ߴN$6%Zhg\8Tx?-"c`7 Zo M]f́@k.x_=~+@)#t,Ex.qy9I?k;\c⍳ڼ)┯/u1l4!*^O4:❱D4ZIUօf/FcO E C(dO3wv7m2< \پv['>[e, v7Dߡ8=Jwuf7sێU֔]ßӵJﻟ,GRG 0tx5^n# VĿ) h%Lͮ6+fs ꟦M{\!3E%#/֘Me¿N9}`;gFU]u ч~V~vWQ(L-Q}9(2}Ik'B"u.b&';Ih =B֖' 45zښT{(``fv}!_:)d(('za3JzeC 0{*+u* DWXo_UN֓^[gK*֨3Q*D^>N$rV |a11C;y @7SdIA!hdd'jzp0ܳkjUS [әO#?^ƈSRSW QؙCs=/?FWetxݧa zØH ^גFn8M+k@4װ&f:9RrLێԇ\&_GJK78W:[w@|8ġp϶xR^hNxK@IVs2MX0 !̭.Rplu1 {jr1qU0 BCX]Bӌl&=|Ԥ#t|6DD*x"pgD4nj~ O! ftp|#e:W"~9rBuO QO&N%}y7v&;Ӎ+9+nzXWxDk^3JeљX=B]hHz?=zB#EC dxNְ+/B-74X"7aYy+o_Y鿖پ;a7%xtHiߴN,SKC''5Bm0E՞Y]:}rh04rtΕ-:дELJy.nۂ}N̷Bb0v7/\?}&V;f?8sTT[csË. c55^)QzvAȿKN3,h,@U/yAbir`GuD@ap>Mj[Fi/irɄdݶ' jR2Z%D0UeI;fךˆa>+\uFTZj .S#jyICfb}!-<09{// H%!H<[R&O}=RUp;g!r֪K!> f|1Q'k̽yHV=j|?\$FzwyҮ $aX8c)=?a?'2,8F,TL>x.s`_dKҹ] ntT eYMǚwIg%f#Xh#`C\KA]pM׮@)꾸;{>@s>njŧСh퐴ɮF 8]G474#Nrc˂/۷"m& ] 5f.F=͔g Rzz{\?ә ] W/&/9&cuxS A{씉D^159g~ۍ~Y4dFY'{D6{lS/N2d#`%|qGO#l-M,:WjH~"Q붊\59^t"U^)GPE 3i B ̣d&A葵n̠)3;IUgq"qLٝ$%D%%?dZkR,~U֐a_ t,ÐȌ%.BRiҚ.?/S *{ҩސpZmN}ުPKCr^FC®pVR"["V_Gͮɛ^ܱ|с*=>n;^53Gv8rq2qb?ڡw!\X=xbFq9``i(^pwDqB=UXNMF&ذq#M/7m'o؇^Q8O!q; Tql=$൛7{&D{>F#m7E$S||[.ӕ2F35xe{ xt2k[蕭 b|,Ih,ŗhx \=l*cZ+5g &(1i1kӤÖn9r{^3dE# $/*cԜqVM WYWk=(uw'~xW=ђCҕpY9& nG=|i1֦w·bS8 v8-ϣaTF ͯ]LL])T:iA70:296!5D`kk<bLɿ:.97]ћ wXJpj^#azdvC<rs;++ a/LHFl O;f&|ymqć+҉ ҟ\]K+oG2XaXR~GV\nY"v21jHEөj@Vbn0:4L/Oeւ S+2R0@j4ZRv,"u鉉GE%ml|H"")ťtcQ 4ADOجzVǮC-x^N42j&''ggǖc/aӑH4<՞ ѯ 4[VP}%n(Z2!s'bQ=! fKrw*.nJb#:[@lt9@]ސ<  hfTq^]f3Y.V#h6Tj _ ,co9B(!)դHe0V=8P٭M1E3ic`ۘt(6w?!t  X˻ ߉!׫`A.;V%>zR<$騧j{pVb)+uXb7pa&Yin,UU.,g%qϾ76r~ N5`wK*``_X/`*Yiw* rՇ\0TW\7*OV{Jh)qWW;ߝihfW/~K1gWVRf],EMh ź!@3&f!XR̂K0|aX. ]OxԵ G1Tv ?h_%D,AyJ^Lw2ɤלFEq0Qf:磞vCp?6Ex>3j Ԯ)`ITL.˷Uwg|aV=E~(LU-ն<՞x؇ZC T k  kfpPp>"c/<Z y]WW=5E.Rdhp8-&2GU4fxִH(,}`6T6ZoyG&#SĊjj݆&,33tnT?!Fae+2>oM >Řrƣ쏱zGJhɝӘLJH-#|#.+Nn;bFx9@X\0~޳AH'ߥN@|.ϩ+Y&&yZݎ{"OHwi)kXZz#N'xof$/彃i.3I!Q ~:eƒv1B/_pʇa+d&{YJMn|mKX;聣 Q.4LjA*̶0?Ku~) Nˤ1p1J 9K㬭hV)8U2S΄\gt6riyT[ͼa_4I `dyjKr||a"gQ[P=!Z,F۴~w2*.EnTX!7UhƆ=xeT<<'ݢ zpS 8_.-; >rYjĀ{jeoGm>8Us=1d2c=bV{KB /j3q,sbSqk[v"5֔@!֗3퉪׉[4G9` N蒤]~a^-ƎQ^̵酓?"t jX6"jsq= L^o*^薦 P|.cbѫ3(K:"'ΕX/dlRņ,T[b/֘LD9= ~tCt <{AjSo {8Ŗ~ˡU ptz!C/ʧ`IHr\y5j|Oy\;+4̹uumIqhX)ZjG" +5:2"9>ȵ<CE6[ fXa}~+Ge` VM(aF&g 0Y+TAZܛk|4Vj1r5H!cFٸ/ KX X+˵DڞC 7BrA- (}$.<]zוa573-Zj|^3[%%œrqow_]? (׉F HE39@q>ߕV@L>p=L'6os"alZVċ  Au8'E_p_piSi']U$8կ1aOza%!02%iqj'+1啢m-Aq};R0-h^P(qt~JJmtш6n.v|FSϼ9FaRiBj#Bؽ"ͷ;-ESbdKUd7.*sdqv0nੜsMX \c]B/' oppolz>[3 :!`r[rI8/{A1aϹ9,B$7^l`uL2Lc+ڃ@dAwpgUXfI9Ѓ|@Q}S#PKkzq h@Qq|ڃk!+i$8J'`1}\& Jnwv1U{unI|&,xUcԮh(pw3Jbn?2$1GЗzARVBg8 "QT]$ u 姃XK ]A1FMϞm"~2BCd{xԨ#U`^tblxa.4WdfdCH$Oݝ`hx!Pߕs'35Qj}1RvF-g Z,؍!*>J2Un_ M'mr fe!}i~|JI51vg,EEdǻz)aBqg6WlKT~_};go1x05E'(z 쭹4R9ap+I4,'>%eYȗqBɒ5N}Ymgq1 uq]Oi:P%6DFgD-)cA @}iS < wǯ59vrNsn_}> I#M)<48m#dXPZ9dd Ƃd6H1Lj6LM. yuc>-.“@3*b/aK:nˉBk@8j'g^57VG2dLRqts;St :aχwUArͯ /m۪: j>0gÀ>mҽAabZAz?Fvږ~ƿ6KeJ,߶D*F_O@k ˆQǯ3hx/f 𽠃yzc2︓d P$X `>4e_ GT*YXsSh\Cx&"$6:>zf3 " x{wzo?ж=GNsցM N;&c2IhMhF,3/$MŶzKU]vCnsƥSE"ZhR7aq.u%`7˙~uۑ7.Q(Ҩq1Y@]۶Z#\iMA9pj ,GB2"aqnCb%i9i/ϋ~חs^sf@sNQc<'c- XfhB0(lV_~USi NHג]Ż>Ï] m;ŕ,|G'cJ!48OUnePDSkRjxGNJ%.hI|ʘmnDS0'rwR|C_H`9#:!5R}@~!h(g,aKszId&`dʴY^׉{iu.+Ю: 3rrJ3떝dh7T R^IBӛĻwpBCV{$Y<"U0_z^yfu`"J\OoQe#1y,A=?< f"v2D_NBxV!K#nDH*=?4Af| ;3C5m y:H o}NYL%E}2w'Np|w؍ϓޟx_a-f=kkW䕦VDNA|̟FKE53| fýDU8jUhCwؘ ֻ36 hgBx8 F-5@+ӽ&`+|~5I*Sl+hyjz@cb)u$yg 6fj Rr d5*nt}$ٖ9ԙ%^1S ?ߝ8TAo &iy6#m'CHHL`J{_L,3ҩΩaUx9];D3Lm;jmPxqeP]r$Q՞+y!.cl?D2iDްPBM\,a}w6gTiϚK"<2!L@(>; <.F\mp[jyV2Rxq [)3ĥ) Uة&^j)L5auH?~MS-Y-+ŗ ,۹w LJbmlw-}n}PfC\ غ>T&SCdk䷹ZV?EYT͗&n 6« 'Q&Nပr Ԁ+۳oCbO& qZˤt[]L26tUg 7Qh'(I n 78D1/iL%{.fJ\#p2x8~cVP_:ZFD]Up5h[7aqT2D~| \!6mLgl1E2$;"L)ӕЅޑ^&F 9/GmH8^%v\jJ7S4z\=0 #^ad>FxPZ$NQ7d4*|jn&NL"r-1.?'= oEOTbzNQruXISJ&(JjGn9$itӷcQP d]QBDeomPd>iƫTSᅽjO[~Ðvq)[8' 0kQϱ>a[?Ń / L1ߖRРl?Wj'P򮼨:HtD1TSU FRV[U%2ŜlvK1w6T)=8iGأa 䮕{sFJn܆y{rq`ߢ[]OCNFQS?:GN!g CҧoGMZz`7?bm1_l!Vtoo|v,dYq214h14ʮ3߆H+VDtd%:?ݮ3'|49=򫍣hImSyb/@SL:™n- ȚȩO*!b Hv " ƽIa+&((!^/Jޡxp2#r)N0oէul -Z)js:ީU&N\qn)>\+w[4R>F쫀;)K{]h=0gZAUAȫ(!E@l#Nb. Y$-"^4H8VwDkBд R ÔxBb\K ÇLѾfd{۴cϜ>lץ< EktDD^QDh| տ]/ܮ_"Kg 70veMb,rVP!ȓTOXO)lUOK XD>-4^ufb\ $hy&Hw`|hj!!]PjX7ߌ|qgӢ-a,@lb%+uW1Iે!%]/3ةqlzCs ?eJ߽y$:*B_)^LL'@F=wb/͌`S Se!n"l6A! ۭ'[bN5И*UA c3|t5) w$Ts5YP:MIZh1L1E2J6ZM~߸'j߿M&P2bE1O_P$kimi|; {t Op(ݯDKdk$aE?r6Z" _ϻ,KƼ_p>E1s="%9ʵh1E̊^C(==6:FSydOzaP@^rNW y ߕ+#y\= a|T=<;RQFj&rQU&P V.7p\!z k4hfW|8/{uC}yH"x;c+F]9 xAkV& M2e2}wE]{ɥay)0%{J5iDMZ rҢgkALBds'iq*̿F?cs롔31wx(XQA-!5$9b ,z7;[Db;ɘ<(Fnk> #vnh\^Ḡ] FcD5>Z»ݹevDYlo'";xxZ3:f#3_ɗ\I(qxUEaV5c8SlH4n R/:)P(H̜\/'nx,4z(XF fQ.DBm9$ &vBI4 C,zg" ^cV\"D25&8XS]H]!=uTHLpI~"A/.-blYNJ{!eB:AN?=|byx'S/eZ4xxz!_u5RtM`ե5@I, 8}.w&ÝdjBz )ɛܩ"\ /j),]D@mzYTk$TuH-LB'"mVZQыЏs :I 9[Qnh",n7Y(avv9دBiiQ EHq/`HCm*s4>Wfi3 d W#dnyt\`](MlXogŏ 2IcL.L # Bua d}T*ZLQãۍl}u9ǧl*%*Ɛ/Y?SRݹ^V8PhO#a'6mO200ͻ18K۠ /‘7V``i}ULkv0|׍+8J{x`a`o[v=) ^ԡpA,&W- #UZE:r }b-o4y)brxPxEhԧi+5j0*Xm ԫOS먰Nݪʬ;dErT3尓iS1 KhVx?ͮlO^w\R>G$%u#%ؙS]BnlMЈŕ] 3w?89Oʐj0+?%|{t< ,yB?̋D-s?#[+C+(kp+<{ |נS;U-9^m#ǀ]{``,1FPU%[hxi' k!'wNXą\|:8nDfԇ߰gf ]VrNف h*,lR-v)Sh,}t~U}DuߴُW< #}̟(윱\\v5QѱaxY  }kAZ8s^F?wu.Rk.ރ/gCgi$x+dngc/&(=WvUAљpllMhwuQG\Hvy{RML?{f.;E@:9e9cgDt\zQ9T#8Xd%zL1͉~귣x. 9aOR{熨`YJ]˲F&IQv _w3}( ƙvJdmpx >αZܔ4o O ;I}hyc$=x~\ #.8~m{EӕMUC-PI0p '&}w`4k J ^d Ƿ4Wg#>c#;U\);\ F;'KfN.ӓv nO>149MvIݸ32jOus݄x/"o)s3/VTgr*]?41H x܀ߞ}BeHeBgEf0e:x4z>f”+%_B"f)rtF~-ڟٷ+,AiZZ8c`/fNn:50R8[_wxZH7i-t`_͢(ž/?`P(70:9f-[2]ݓe}u' 0{S亁sg_~ۿpQY<<>7~XCd`sѵ7=UaBvzVkdx>%wëknQ kD.vICEĀ[?$Tw }/T@0JhBXX&ގrb:/U_& oͮR&E 5!9DؿL4Bf'*YWFbV@B5˱ T^ctfsmʙw3A?V5_/ WqC}/㋦Xda y9Grn߽m g%d zcX 7~.:!a]^5-,/%A)Djg(C0vH*' eH)Lݷa䳈"ًH>"N_N}ns1yfE-R3H"HQ_P u-|YgM vb͋LXB։~6mnOPfn#%'ITҳv3nNL{-.*0o,=%Ζ֜a;<텄ڞ2# N4e="ꐄ7BJbJX6)P' ;AE,-c+"GaoI9HJ^=QuS=g O Jw0;f{Z4H. Sϒo f^œ@os/7iNS| AkSx*shgwѡvu0992d=}3g,.E bq1[r k4K>-јU 1鐱qzH>;Y>߄M}02YG|+`LO{O w.ɘdʎ@H2j^b%J|3'9,ܴlEtK ayBbF߫ M2Ɡb-DL"ŕ'."~>\a|]J ;eّ[hB7 X7/&, 1\p,摒`<2b?5JCww3,mڼ 5 U1<}ib/ihK4E`끚/:ƐGw"?|`nr5)߷VG7E}Dqmz+fYq!e70 _}/}5N$YO6!︜7/6LU#MIg›0cmVijdx. ZhDt$&ባ ZU*!{Y/)5B&mOwq2r/'oET_#ppΌKjaOܪuxCR.B(@=Ѣʀ X:|^f~5ʨ"9?,8>^"h~'WzB}tlߕ'^DV^PBs." =x3e]^l+wWCS6ryi?It¥168J/+{1[{fRW~PS`JU 1ly"C]M'7qt~M4 ٹQs>ߤŬwqYC O'YP'R>R`%x)q4{<ӗµtä\6sdKSuC0%{5^[C Yi]@풯EtZJ1.?||x9}\duSfXE7axxܹ{1AFÏ$i#'#-MZhfiE'6dMlHQ2_[ UUh1_\ R>q~/h|n-z?&MWLdwp̕*y3`ۧ.ó`)#n ) a ̋ȋ] B} ~ qz!aXme!iҺLr؃c:ie+݅Ҩu5꓃Ap~H [raN7|0)MZz&I)*Jf53X7P$h7Pwl'5Gv[P]b$ҋAdR uwB3֖r>yqń^́R{1$ZߺGWdO!e}w2Ց0yLqF._THN fzD)of,&*ܗԤB60NrX.N#>K6_~컙i<5YDc"=0c8b켗Z)mq WAG+*]Q~ !{~':4%5F"L|l<Ԗ~gP7>]!>; :hзwFw+6;9ܭ!62?xr=>`{Х4ەӧshl;F"0 8 =XQ2,l#c__3W79~&Ess؊\c73}F:b?J;ʮxp :AMؿOH#eN\&tjb 纷Ć0s䶐J.2ŷIp-~T!S8J3=xq,@&KK+`P_Os|<^{I|V/ϾAĔ{26aUq/Qnlxnu C,f^oBwÅs$2OAKy4i'5D=91Pܙ_N)I"G!̃mh\5̐)qae`=Ծ QSk0,eL+Ƹ9^Q=2%JSe Ә5x&(%р{qf[pܯU'qS7Eo+2W,n #22:͹>.T>sz7<5kس nlnȮPc6 VAfj<.tOĸW) 5}Fן7s*hE?*| wDVhOȋ%^$dG:%ËZ!RA]`ُh)MkzW YLO5ڑ#+rY5}XQYBŧ2[ Z?a~ | z݅ eT(bYsj|JpӤDճ~wy`D;Orklxw2F8E)+)1=-zO5_d?n`%` "C[)' r870Z$^-Ƅ)ǖ+6_cf'USG/ etvJY IlhJOuv`}n0Ty^ZZB.p""?Ix.Zy$C %B Wo뺢"+ftMXI*{>4[8ޖ6Ugj2_raC, l"2a)R.: SZGKxC{,83-f5b< ^h./Um0{+vwN:?=eY4呈6e&_c95[cU@3h:))W[^(ǸS+ 4rAFSvZp*Dů&?þ] * +V2ci1S{e^s` @+;>M v| vtPVhA+h:::#HE;%lȇwn. 07}spꩤbpU(nVsh c_O ԡ e(`Nt6A4+ s)@aPfh́6EpѴl1,:N|d]??@|L1B#z$YN$P) NExP#Ɩ$R/.=-bru!rWSO`ߐY|NR`T*ƿy-!bŒ{v%%A,orl =s/ng[Ցt #B 8M4`Ԉ .$C ziLEAJL#sƈ̧ "9"F*pxu\]!z@ꌟ;egiJUtC\ߵZ?򐁫j!n#Av??k [(R/:b })6pstKSRԝD'5CƷke\* -xͯޝnANF_Xy0alwjGMA_ JX{iB5[z UG1+Ʌ[ԩ? ֜П1'-WP6?ވUaGWZM8 Y՝ʁ1Mm2t@rDprT)q7n_qw]ՔYGQ:֘5.EG wYڅ [IL{}gWK% LM$\ ] rZh>y]V8~}S0bJJ X@NakɄک da>iJ gʡڎ<r4yAMxKs#~Aep}\ڶ.70Bk!CcÊ_EsO'Ͼ:*#Nu6UCx"'9-GL {k'B`ؠApބXhŸߏr#Er DkK\SvHRJ2>ѕԏ/2fֈL+ⅶ1g Ň0Lv]"--V+tPL1wSoab݈8m%ƙR1%/ۅwe hck 0}EҜ+oAV=+Gõ D?]>y<<{蹚effю vl2/,@ڄ@څfwJ5Tw8`ʝÚ.{Mp4*7:aOyMU\W^E?X4z[*b_9jw>,Z>{ ڹHSLW & B )2: pD}2$eM椁l2 Xyik7YnL0dͺ-9.JP".*ƸcJWz9@vžTjFZS-\"oE>\ 5BJB RP, ~K 9rtXDbQUVHfiPBЂ9?˹YWQ/eLۼn )yataj4z bȱRMa1؈5fEΣG0#|1f Cr+x%*LRɧB֨ɍzrk@[MC :L,nʿ ǀ؊V14(3ƆHӗ)`IX5z!T#u'f'.zO(ߕ;=GĮ Aƨ:ZQ2e9Va]@H8cG-hUoP[Ng'w/}2*i (ϬY4fS BۈuTZfAVZ7(9r$'**oٽkbtkYu(#Ex%4Ģ P%' a*ʢ5d?>(-Q{"D)K>k@JH6h3d^ۗOe;yWw iiitDFۢE0h1xrnӲ&kY8c" #L4MN~+%%:n󊑾Km Bfą,@ \B@s&yp 2tB_pOˎE5t worɛCM;-"؝& u*8ęqKmIy-[?w&=Sbl|[X٥&z Bqw;=VnLSċۿ@T?Rfpwh2O;Kq4/̥}Nݬt^SC+ݷ\1@ ( ԡF`UTIuSEEB%N f5k\Lg@YM,!#tIGjZaˠRӛON_SAtm`;{)ș_HGzzf 8b? rSK?^ûaÒp~̀Hy';O4$LM]BE4ln̂+)$ kʵC5GS!{`K47l4Rvfy*2SjRu!%sOVHܺ*q(#EQoc~vH5 ,+VP.fb0krUE*a]hNB^шp si9a~TXuK 3󬸞40mGS!`υ@k:݉׷A5̀ͩ*H~?;B+k!п,|ln]"ǎ{,,¶UyVn] &J3,tb>]Uz7y]ƈvio AB(}oōjR8r `,E\dy;ڣx$]Ry-*؄F̊_;Ag;c0;ό^f`<}T,v*`p?/b(05y-MZy@7Q$Dsl(o}i"ˠuo-/:IAO9)af/'ۧB;Vg7pyHް3_rͻ 6`U(E;+O*Jdr-bd #,tm;%t5.ڣm@%'U_ DVE*Us} kjͦx/ 'If3r^$Zgv$BD\w_$8~Q72VTRk5FC3&Lܬ3!ɿ{PDԿӬ,:e5u"tH~S i]8g PB ";hqu5"l<" ~1|'1T*VA-mo&s4N(Hm

BA6^ tgC)*QٹG͠^ITş*< oݩuϪg1W\Hfz@Os\_i(ɋhbi65y M&^ F%ǘԚap+0+ܢLKǙYX*}'q2+qFZrs ~tyBi|w-y NqD{ - Ҳ#Z&5!l"7t#\^hǔ7hNj21[ebyN̋oySHO(f׀v˳ 8K=XokJYMbERЋAԵU0(xh(̖q4o Gn 677# f}?m *m)Qކ>X8/S ¥*ʽb^kan(cx?WT/ﮂU%RlE5 {jWOrt3? =:1)('|y7YSq2: O@k]+)O4i%o.8SK2`k#5,_X,R%혰rW%+!A!cLJaTu@H 볗_pʕ$3hD(rv|<.Hp/xVxO %ci(Xj?lY=I+aAt" kXe-LA_!:Z4Qp?zWKw>sFuiH`4jA]QtJlMQ#q!1&q472=5|@oMaɗK+gwfrO*9h""Mܝ^>tG*Inp_ZC[;y*Zc۟0+@GE;|ۊ܎QXj[/S[!Բ4f4a`Wm7O **ə89}YIGDpe6)Cؠv֨@5|H:gn.3ܡ7x!yлkJZ@y7a"0[erÚk2חsVk'ӟ[NsE)m,~$lhCKx]1EqY^khk!l}xd*K '(; !RZ;WH .Wjцvr&mS\42/506elػ_ $`IQNsT␂ڪ:{|nN AEm6r.K\ПP\q(f`kBks{avH!1\ Bosqco8o;E(Pck\<'3w(,ܕWp,9yϠb`p ]|`;k/%""7Su_,-Eƚ )|׳K7xX:I%-kc6uȊf9BgB f؊zG(}at-;)~_VaTAjLvG.s3PQw00nkyD:>!́~aЮ6Uc5Lz;~d(*}Qx3>@_.m"+w܁qUm%y?-N!spZ0%t'oflŰf_"r]%lA}.~oBL©$"F >HJ Mú)qӎϋգVH0:H5&="?ȱJp^fRK #ĸ+uFòAe`L֮ȧ(1!s.7fMy/tFoݹzS"h%`!1>˂ei}umR̚nZM;?z+oVܱFԪjoҠѵD 4Q*0N$e.>`8g,4 Lg91#dˊ' mKAAF] XX5?Hm(- BM+yrwOW?Oo:FT8+]غ.ЎĬ\ғ4lMoK0̳0M;CQXz. 6YN.ԏtZ7 $:&=gB'P9Yv Pcv:BbN&KOvCՆK8Iw:]ܛN|hVRlXPeѫ-;IytKy6?HFֈ4wul k/#U]=+a\ZgOOs6/_=|d$Wq*G5Ղ+s5*~d^ \eOɲ\=C9|@$^ +ԕ_o6+: ,2⫐:ͳrq\Xd4Rוc@i lhs04AW]/]elW Np{gOiĶ3Ju $>p%G6Ɓ-JaiY!҅fNWo-At׈aVF@hZԚ;;~tn}Ɂv&,Ǿ21MNG.MY톫D9Uɝ[':KD`[DRS[{t?=/ 85h:ߖ+Wst/0Ĵ*lűW`oVԹk2.{we 0TDI43k K3R4ކ?R+YdTGu˭`x]c~.p /Yx 6ɻ Yi]IpKm%Z*F4ɖQm@Olb@C-We"Sr?\y~J~cDQF {=5CWߌܹsvշw5k׋XQuśR^wGa5 Eϔy-хVh/_U}4J@QTY3Jjq3p{0oxC{aS>~׍HoicrAeo'=u7J())d'&z<;x+>v4U%B+59DX9^L!/sҁdj5oPlsܐ MDlݮ;v?\j~z@zc+mYvEc)܎yU$M Tv{ju= (R!F@HdmiI~ &ܧG)~7z󯩠c=#RLo̕IizjWA ׹uԻ8]O&3Y4Kma[&Pm,FR_/KP<hU{7G6xMQ:\ v݋;u{i_V1HT ȩm/^%K1-Fl'ڡPD6;}IvЛY=2ۼ /.}§ 8/ mım|}gp0CbX{J1f*<ji[7hJz' 'nBF#KDO7B7 rݵ%if32 ]x/~:_,9l! EPOUV9WT%fz&%R IxӉ&^'(W}]CeWA\er-iT+5tQUp  B|'bZs`%X+L.0aovݽ98!х&{K&e,UzP+J2ƚ"%%@ ddH)UOh SvuaJ9DŽ$-B,A9IAlL{} Ӈ;l$% BȲ~KO9 {Q+Q;z]c%1=\,䭐1,+C=7ō ͊i0tN`=ULltE3^ I?X!9AikU0%Phv喢B@GGK7GLjaqW.+JRR7cB4;[q80)+F`a #lFO ^ꭎ jL={3ј7Auiƍ%8u TzC .HW?/Y5Ͱe8%r#nTW}1 /{(_Vaz76\\},0{5 xL5cuԶxI d+ggCV#W XWbo !̾m>ݮ5@['atA*eBڦ?Ȁp' \CFiM 4Ux:w1IaiGᓑAG 8ʙt@Z@&1a7'EC|X~7c ѿ]#e d ? >)Y&oh]փU[CR4O\KbI1Z?iN3mIH6pW\RR2&`V:*&.G͒#rjLrX<$w&r]:bعz3Ձ6U\;%DZ,c)2X+׿ZkAkjc-|']/qL$Lia,J|Xn]/Z4X$! bfjs1m@3dp틌oYō}~WUaKlJu 齫$Z]^|+yR<|B+2ey`g#ll$/5qQZ֐(}F6*l sZII ^tP^}0*lE2Sq0./q&l+yP+znxeJjrGm^Ԇ7gJUqK9O0! c!IQk(NPv<\w!??sG>& VLF{x@ Kе0vl;o1s"(MN*LYBL޶u68me*p}5ˎπqjEq=E y!+ VܢaFJ YX3z(qPTyMD=zlSٔ/B fRkgxNC_vڞd Jߊȶy^>;y*Tj^K=JaH%mŜ16~  :9Fz/e|l^]^д{&_y?ͷX:Bl7wav ay);q̛*B}! b㨁[ZWV_ Y&/i#dy.OFD7ޙj@Q qP7 ˔=y #$p_VFPogw]_%_^hgb7HDE މ *o|RIj'K}$IIfg[,|?]{J"Ç333 ҹml+ZC:h<8DWʡGrC\צ]SC7_X%FЅ "cZGg_[4d=̭sD{COaD?H'~j;E+z\ѨqPy'K_.}1vSaj>K/N39-xg uM-~0Ȯf!uQMn( 2# lkTUZҧ[;kOIU|0ݯ "uuM8ށfFսZ U2/zpJ{.כ?^ys`~*zE ݓ{Q&>&FY2_?#>y:q=aNN9Vs?mCu73x֫uҕju[j_),ss}SAdG2Lx ГOB]&okڰG&։$`Yi͏+|B6r'oYj02k EF}$,> l +rgXZEw(XkQߕ/]{5X&vc-="02I04 ҙ\Phoo2..#w692?,d&seeo-\qAD@tԷRhഷHFZH\wߋ:@f\~Q3{:${wwPNQv;1ȟ sPM\l4re!dQ 9}2x~~h ;:HCOq/>$1|GJ+Y<%b߿\WEMB~ҝ`}7ǟ+;+9T7 JOŢ%?+5 uXyj\Lh ﳆ 0Ib]k@~:_8,S[3gQ044a{8~i=Sx/9; 3;c ;g` *N)>-U"Jj$__oY:4D *?H*]f3Fj{"[%XrIQU dÍ! S4|<+IIx/sٝukچ kA|E2JBέOOq01|Q丷f-Y}"r7 4EpsU0꾕D^M 0*߂_BKxp~ݞ}&B,M˺[-I]ܻCk"+4A-\`w[mCl>ٔO'ܲ"b',#{hb. h-e)T~u]A ~G8ÕJEn 9zh59É( 8|W84`u:VtBBz{'>9B_x& @!!.έMTpToIɳf),c9Ǖ9Rgp+0)q< ]\q{V'V'rjh=5*@oF(ۍEU@Y$2ȑ+uۧoOIԖG1G s}KͬVHF;;>:rq:ឃrDg;gR9'l6ȵJHu Rb+% G;Еj. OQ\?V61 $y@GLcMܹ>m+ߑ?y>ա\h^^=W0ܩ * :\>P#hp[(d9ZT iδ8 zq{\}0.XE o^~Λ>{$yY~2O{@UOlF o򐤀d#.o ĜI0f>]KM񕘫W"!vaș1Q /=ށnw}̗lF(ayyq l"=5 ',uM@[х-T" :{aJѣ _̩.,G}G]q$hE!_<熰"3'x.bԮSGoHY XJ>rizh7WsŖD_9@jeN iik18#I O$F()Ԛ>9UݹGe1γ,5^c۷feYn/mev~~6BY GnUTnv,yX¨C6yʇ v .U`(~PcU9u#(@&uPu|ͻHEnNDyTTzliA%MR7j`dLA"W:(Kxϟ%otN?Xa5=hy?GZ?㭉%mkT|*_;)."$WH.䗫@$PAl"plk;GeWέAMӅlo0pYf*G%0~<ϑ;X_yK9b2I6LX/T\>liީL\ B*j.JTzUdî>$?Zk|TnY[IKu8p4]z3]W|b.3yR<+0nę-NbZ_YRaצykUudғuF_5]nXiJ(lV?|Pj;׳_ x,WbxiiC g.t$ܲi!"i#dLVSvmTwI_\,{,.LQes c|.9 @3LW *ثw>u=8X"qu`rXC-0~'HatS%epH[IⰆ_ڼaw9Ё*#eV f9:L-769C.:Mw%|reptznsYf3a˛ı 4TM T虌} &-/6c%_!:+S7:%| m1^D㻝פ +j\]:M1M,ж?%rHx[ Ye% 1U8w݆2 e&-+rKW6e5gPa/jȢ9*iFxD߾6?UF-ˋr3DBMd*a+iKS{L Sw< oF*|7nQO'Y'vftTT Sa:e6rϑoT d+tŧҢhoL_S2L,ٗ*9 3`7f'ͤ1&fmpf FaYֽ!"T{Py9C҄?%pTsvJ83hB%Jjh|IB;_4YYSe5Fu37dKZbc6ձƷvoM^ Y.ºMqEd.(l|Q=t^0:nw1m^Y0 '[C$Cm NIq uvfhv]F?pKN/2dK1tg)BaT{t .Kq~>7bfNoU]9;psb{ZdYVniJN'$ᩧa{po0E)Ϲ6Լ=w?S}>ė[E;W{6J$. , 3X=0sJ0oƶ0b"=#V<>V ҉FcJv+i*k5HuaG̭U}dTܿ^CtN^%g~©pED(hۄ13G x&O/@nw{DU|eg L EXuPńyq[nBy]؞ijHY^x'6 0) A0csRU-/JQf%%#C9_i>a8cy~G%mmĦYQwFbmҴpIZWh K qfO$=2=\"0˼|*;aJJb 91 ӚGV1͚ٶEdTy(/n5!owam_[<6$Ye2rhȒӇJ\*j; lAI"GZ`AW/+iJ'\}7+_Zr j'uQ$)ZjqcswXi1}*H. _į9,LSze}$B{n^/!s16B)l&>~foJ>?"DڋV߻Q~$1Ǔ&!h(ZsdzS9dzrM@!S7wK'K 2.>I(tZ7Í+Hh_uY-tͳJ>:橜?Ikz%Y.2F[?6ƛ]yliB a9[M;QD _qG$ueƍ*TqH l$kfLA{^CHV[y3F]c#} :v9\"!O;u[i\]|/҇ ŀ'F\C'ӁnC:,X0q1\ؒfDXq&xss.2+#[ooI;W)NG"<>y+$kcsU0~Dav JE9dBE9o Olt`; +<̴ljjq!h@)oN KYR'Ư/SzAV=;4k2pv'Y,LJ!ay2*XXI=1ٹQHxH7RokI۱K!9EaexFVNUY?%zۙ$>L *)fbzF~S*,F58VF7(s Q+g8%-=,Ņ˭lj绣q>N %c,0re$bqUM1i>ZN2_jNFV # 5_~{%ԹsS)T{~J2( go8D1Wf z}Dq]cFzybidCy@`aT_e$i,K%'s (3HМ 2ι^1Oad՚Kz@(@&ȣ|pA 0aW0JR?7"fm9@ ʺ>_EGCkSBHzJFPٛ~,z__q| h;MP*Lj]^j#Ȧ+HFA^\AV mouFnMCBzɸ|=q-->SݑT"Xtw8KQh.Qu!Si}z5w:_ֆ19F,SA?.Ea)(0RezgJh? тiԁO ͂Q;w9K]nQQp hist qo, P8w/8N ޛtl[`Cqs—eD)ҾоX3 CZ_,So|#?y(9l,!JF|eMuyxԕ&h b w0ҚLt:9=˾;SEț_[*'ffLѨߍPIF1pdFvZ{54 Y"RYFvDj;X\ ḱFŃ::HI\ 7EBPrC:Lo_۴;57_qess'R`kQVa 4G6;T4r5[eWmQ\H!+#Wvԡ)5Z7AWE,}%c@e lAU+GzrJ~  %o1 ̝o{fHM`-;ՔWQr~0# %(}9=E9 ]'b=<7g]晠I?{6ϠޔX@̙N&3s.樍oʍ`d8<~3| Y N‘]RH$cS׆ '%y &*wԞXy `IhWCV6zyK٢[?Ķ&ZO&NAI@ dOPO2e9Y3ݧ# !o2w'o`i4GMM\qFFZnU JLq2\ޭ/7GtY\O&j!qm9;oNlˑAHU23VRz\N (NkV;՟'Yˈa?6D&l:Ts<3\.b{kpP w,\&oVDCh7HAX!M@TYư܃ Dǡg$/7lLfE7 0I$DKǀ#&if|O5PU:Y[oWITi%b}S):.eX:`MG2,)V{!&63ܮC~e1ٌA yJ)Ħ޻8BCY{FJФPNnȫԛlj.(qBA3M&mWʭ Lo-N= 9aIGԄI(=d}}j{X3Z_>7andK.do ։BM -rvhqmF QBC.3Щ'Ę\ErݕE;"HޞT"P#c+5\EpL 4>4!X.OAmVN~VAg @]fd|~S55rK>If&L D߻ \*=@it3#xS<5㙩U[FwM)' 3]jQP9;Q"Ι^HP ~?WvT)t/|A͖'pHs22b:ՉkS|wW6KMOپR~\ho I %QURTg!1GLG-ʌ1g>.\c*PB>?Y.NB$l}!&ULHAL""0İUm@|KB ȫn5nxdƩ}NY^8BNҊ=g2“;Xm32P+g\@wjf<9xJByZVϺIINM -TkZPhZ;zRŀ=p\MtUf^DP׮ik\e2TsXVCl;lm`mK1?Yir.3xWnxZ`*ѼkS`r-ɗEEN,lw 4ґN#,dӸƦ󧮃~|HpүqJ ;)ڑVuIqf;҅)e8IarΑ_*H^Q+UpW"PLvefC:0qA]1*BSuF2m@;{_$^z]*I}d9!2?FeitSU<۬Do]ǽn؋}[\itb.ǎRQW ˣ||R X& lL%*3yZ=T3JZu78b$Ϙ5yF , qsNK(V# Eq5GQ/r jr1M&/Y[ވ9&rU-:# ?qF`6W%p1ӯkŁ׽ZH;` BU}El%N)a \[(jUu"?P8j>ا =WGY-lm</qLLf57Y6+4ʛ.C2kjF>A;ŬB2 VbP֭`6틸_M.!i`& <K}Kme#2)qxUeַ^3lwU e~G҄POyM擘)b>{åD%(R7YEDj rw`f9~<[Eo㩬QA+[ xל>"e%j!?(Lm/D_rjz@ w>ӋҮi# =^˚ݙ+ i{?!l*i;@>5酩n|@-Rkmg.W'"hZt=VXh=Tgn%鿭Zn G1\-[sx(4bѽ~E%c6hXp׸'-UrHKwG,8lò!_Wă[#%]0t6Ӄ /~_[ ,T |zI7$ Э ;]ɤXZ41LO~#Iٌo #+rY `;ؽJiKm d $_[/1(42)FVRr8Pdug+Wzf0YIHn\8 g[ iVxJ#F~dBv|,$P^crmTf=ªLؾ 튕G 2MF5*39+tpjڎ1l~= SΏXvtAAANζ9ߝB-d,ǂ3%xD,G{;Վdr\$\{>8ے4Ү?V6şgf,a uZw=lsuLbI$йea9u&, #H"7t|KU]M݊ ]UU('' DByLG\$Hq~:Y'D&2p[W ^PfI46R)%. IJv׶.r^nRvxQJњo 8eT2F`-S`U C)σ\`:'0nhH~-wP,W!0S,Yy[g[U`rPbT =8 xjAA$hݙSqumޣ (֠Z'$F` Xbɖ!5pڶqO;ԝpBbG5ho4pa5 -1Vc/ݛA'󕸦#ge'ц1icnd%z' eiϊ#z耪28Ucbb6ڏ(L%Ty6^: ~DsY60"wUtKtDc1@B$9xjz7(L8uc&x/qȧ1 "-ɦKp닎\Rx3j|WX`I`0V(SqϬۤQD:f( pû0Ōp1JwqTZUz?T͔M!vpjxLbecPb8GQ05d 9 dt ӆD85 G=_?1#a$ n<un1]쁘6YUXAbP@_I^yoD$4aZAu?\;rC}]Tn~L_ t/Lϴ>Ad.hr(AO.N&$C*/6▜I6iKځ_b2TOrCA'جbL:cǝ(@AۖJ~[S>vոGWA18Ϟ"_^1 MfW?xs} `ϯ<&'e G*Pcڰ2'((z $x[n݆79Ml.B%3>A%*yzE?{^/~Jx4N2(12IF|HwCzZ¡-"[L]ZWtE=Zh; u6?yv36FĘN8H %T{we,l`v u4`9` Xs~@≡WM85ytwhQ 4,%wfmCqQJv߯SrR@JG)`]0U8;ݑTh[&<'խCZ7QRiK_w!(뉱'Ga\q0/̪qdҜww2~ko7pD߿3@Mp dD/eikS3Kdy\huFId^JDwjNfF%0m^uz8^`]bpM{t PAU`VxMN7 Dw{'lyA?ak. zuhr%1<Ӭ ͑{. fG@.4>lꬠ ^$aJ-S sҾJRjGl";1FN" |rpYjo!<#aIdhnMSgZTv'r!.,wSNc zZ6\ !.a" 8`7F8:T396Ne7#y4BRB@ :>etw:*# 'zoyn@ 2[wkH`8x>\aiRqQNԛVj y}FxV j-<͔OU՚CI׳zS9?`,1b92E=bAhpU~ͼt)^Co9ŭ S)vl) n 9ɒߐLZZe%3KtQpm5&pJj5_[jy?uZ3;] ʇDf[]&skC0ǖZ<7Z Sl(@*5fOIB "W~/9.Z6xcլ.˸6R6o۞ _*Z پ8YI_ 2µ @ӄel,Q9> ӢIIPGQRU4*xnR8jnd5A5R4V񼂹;+F+fԯskn˛5S\i8PuMT#/tfZ؉ Ώob;';S%GQmjw{&R1)-Ō3z!/ת,xv櫹$tLYҮQ[~!xcpx$>ۡZBc \T 2!t}exO;&\DAj4?X?q)rwҐ$O6C0p /;!*]Ͽ"[m25'$<=?m)O#а.I0w"&;Y$MKc'Qˆ#3Ts'+6+cውz( vڸw"M@>劂0LЀ9aes ?@B/=I:<8u\BvBC!kƂqkjJgY84.Ŷre;mM:`d > T m͑óp4R-uy[ƿ\x* c'ˠ 2DzCfED:cރ~PzWׯj3\sE.S=*'[t~(ZAk HdwQ pŕ>Аv >ЋxS+`:@t՜'[gm 3|ɹV#lgҸ z Y99w/^asyqEެՇQs(.d/3}1vb[c;PF%# 8aIZj]De[~)9Rve(i_M?Em(laQD{3#j`bs `e_#ju=[ 9S-o9l+! F*+/.dRyqjI3;v&P򤳀X؇36{R=iw-KM?hFpPkN>\z՜\ќz)FOyQdvNy^s<`cA+q~%VvIjWm_cݱo'I@ZJBY?wg?z Tn]ɋ*q+rh{Gǻ5̓K23$1 x0A}IAlLsS߹W[-&8}#𳣍O7F+O EggxhQ%/VJP xG :2*1kokuYJB yhhO++sZl>]9OpO".UF̄G9u{_ffߙo3@L#z<9G׊jZz ?"rw\푳JignbE vfֈI#jd& Qvnmtӻ MB9˦Gy}tWv{ih=py@hꈼxV>4`-ۣ,%Ġm0Lqxᾎ %-ݶi.c1(-)mux8߰0oJhYo4gz%k΂GktBW6?k̀OgzZNtk ƄFyn+H7XKq|c@ť o`.5J^h#\ ZV5w ioy/jTO`$YPk8#gJ ăGtj)7RlSfЁNt#HW,|xVv`J<ʜ)R,΀'=G6}]Tk_̮V?x_ c6dpfIYg/[kxҵGؑpk|kJ ;)vKEnCT ݘ`L&̸SPt 8/w?FLbG?ja rȗ>u Hwԋ2^q[\LDH٫o`7afwm_h栄 oE0ZH<+Zmz* T=(Pӥ XoJlDPcA_dM,dDW(1L}OKh[RΏ|Hz#졣Xjc}k, 5Rg$O^&%ZK2s&n NR߾uW3`@O `5}BLR,Nm5؜gK $[H v>b'T :m!uMUm׌0rrp+qg} Y+É䅬yHHl-v %n,+iS_R TP rVxg8К߁@iƏ`4RدֱwM2HV+3jГ?+cq7-Y|z, ` 7X.`Qdj/]L =vE~y!][v EpjH48xd4g^?񱘒-X+tUEvģ6om(t&29M+e?qK,4VjwіV \uu\IMNa.jFHNMT #Ebӌޖ?@NOM>}?l ѐ*sΠOWJ`L\L_Pgp@m\+C;CmNZ~}a D]ֻ:~SIԵ boU?$׋CXFAxG&9'IH\ svwB"+VŝQ ԷEp!Z(F U/7 b)LaGhE?sbfc玱o*jT s6mUM:50X~&ش}goX}]v\9hI LMCrLλd^m}vh=b?$Q/%vtXJ:y[<Ƴ@MD{KbؒđIKhx:XCW/xTJ;POrUe q\Br|H.e3N&7'zšoYUpsl34" ]Jl k9Z 3Ce![m;@=юATrB~b 2"pjL@87\ ez!_Dc mBl,@ԄMND7'5໽ -?f#is{S7i%<1 ܜ뎰'GK4L$[uZ4@1qǯ(Cm8XW7^bSK\ұ^uwg("!/'rcmh1N~ 7 Ed(u3-&.W7CiHKԷͺjm]f]x{=c$v/2lkBiפ3ΒnW4G,usVZs ;X%_Iy/rnD K&]U1CAcVUYYS@Zk>CbOΤxߢ9d*>{FxvSd:␕yG#G}C *eiz|?7q=W9i=L9')88?ռq;?Y|h_E)r߂qڪBl!3+uM1FuU`{zhP-dOppvhxeQdX<YBCL< *tNaIvb 2jY[撟6]d}QLuP1a&w"iG{Vej2qmDfֽރ4C5/Nf\?)+?ZxT0D" Xe\ ' QZeT(yn ?xBe034ZjyP 4YU3!:"Pu=&`o@$SPB.8C+ ()!ZTg .5opQB:>8 q|WQb]f G7ń]k09= U?Os{sDWa2+P6lfv2P&| S|g ߍ^?~OGdQ ]|Mѣ,Weú&MBNps3*q[fI=%p)cmn2Mg;(]qzy9r1=%l[sުZQ)D/ V6_f:evVildS +VPQ>R iu; i[m -x2sNKR?&f@ȩ#v883螷\3 5f2{5aJz")0UB#7EkzqP ) +仠By.>3x“;G2T_@~D c("e?bL&͏'w#[w+}qˁ(Q 3f'^ x_3J U%1A6$p`v^uA<dAY9y sZ2/E}׫uwM}+55(e({ahnn뷬|o(k$Ԧ>FY$ҳ:JdGR6uf,< S%zޒEdlcvI34?PQN `oA~ jd\FmN24sR,crHmHǾ?@#xJjid[#fJ)5E |ifue ^^3L1 ۴)SrYE@OP=i>YB 2hvPSI"6B[\g1DIzƏwP]fjy-琱&则, ʼ:y@_]ı~opɈBD0OkD~aK$L9:ܦ Ok]qS `-v KG<jОTٷisZ&Kyذ()4[=]h/MX5 #i p9XSxD,X^%][E*!Ys*&O hٽ.Nr1LBI0 y\Ҏͽ"9Uc%?* _y1x"<1F/4m0*JOSC]$G \CdK>9w ƹ.=`_1,2@$7ry8]34Ogj"!K=tf8Z8k v رvv;mNՈR$H{:Wb{pEeܭXW!mq}Tr]ʢJdL-8E~\"r e2F` j EhrP}WE@ ְS_BHdToS?Z/h,*V`40;MҙB܎Ko[xhN9Q "BthxžTB19k7iJ~&3Ή&X7vxIԩ/=WV%1mp+gu1vn,Nw}kp*=.0J^\?PC,]Q8=m2  ϶8C`(tsQUǓ|ax`SH$yZ}* ǣ!7Xk2z>ٕ7ʎ#MԄ_) XNx[J ˡ(&֎^7no>dh5cb[Ln5YEsDhoX_XrrP^pJ.0}u ؊{ǦYY@l9ays2qvֶG)|Yw=5w!3qT8WdBz|4w)M^ :qq; jjVilgyfXSˢ~oloۗzޒ(PЧpuH&Z7{w-q\PTڸ nX9rE˽K$G9MQm.88E#˂N䳧,MO4+LLm:7VZl֏xZ͹^sI yVeEBStptWf,[Z(P̠ˇe4Sq&Hc@kGoY\_rIC8J*>Jꀓ%0qp[6S"*(c;@wO8~dġ!,nmUs+]AƔZ)Ƭ bn5D4i=+*gZj#ǘtV cXcSVugWBs ]KAV܊='6;H_PhNt6ggq:.>o.4:57k_ LP;\8ދF3A)ׅ:R0!2`XIfW3ؒ/؃6OK"E^`*?M|[>߃o+{M^W:e5:Len+/AF VކF8_c 8wndͼuRW񠿊f|ЖރvHl5 m0;؟pܔJKhV hVz"R)41P>fh+M0~$|w5W*}+~?uﶼoYv*';g$Gy 23M ZCY,8}y 2،( H2R' Zs^X#Ki7<{#cզl)dSp֐F4=$r*c> -챛Ez<:m崤քtR9EZ2v'g۱ 9:W̷'t] @_L};]k{mSM}]?>&Ώ!q)1VǛحT ~Tx+h B"ʧTёx [Om'vט[59-fvWFwq+T6Tj]NxsYLnb &l KI\\?E<[q LI#4Az{fDPE_IB:R%& yjPnة7b+2~NQ;6U,uBi=#~j[fܿyTګmy9婻w?T0A,1JrkZԈPZ0 ])u=h~GTd <։n2*oY/*R04WWI /P<'o(?/ uF|5'>>?,6-WAL_\\ yЪ)OfvcvygN'~SC!w7a_Wn`!_U dP^sUF Xħ. =4 \@(}j'TApb2 h"pE5+ё'' ^^Ny !>ܹ:>m%l}$/;97fK0KX]SmA)U( es^V{An{N)ięU>8= 4 "Ќ)v 8촷(6r4/0,'5u~0}GεK ͢H'V rK8pmyV ~ָ#sA5uG0!LbgȝVDwo{ Iڹ+?v$y~bPk޶ʃs*by齘WAds21rSH:^Լ* W>L‡lEF@*D҈+ &a3cQH(J$ƁY9!e1ހeBhο4n;ǠyC<h' qW>;jM)6%mͦhEԾ!vJ Y:ĿXݾ NHZz&, y:n'%{i[4HMg5(Bڵ)aSpn%<,a{iu:ҡRыIztw0n|jl3bԿeϼR‹:/m%'WD-&%.`K+z'5|st)/~/w`$n(#n1?a؞<4|E(|c]ַ' "b{?-3ϳ_[O+.NU+ "*hO 8ytX<!ڗ*+AM bցP}Rp7e "R Dvfpw*-'1"@Q*On !%ڱ^C0we35h_W8OU jvȍ)ɩ_p iCbSTxӎ+{#~%X~E\6r}NeT>,򙅼綻m=,>@Dzq4`,n&˟X "JL{V@Fh?Ĩ5LL @Z圧=,GmaIKd'i|86_WB/+V"4]}#eWQ9A^̮oE` 7inq;n`=d &Bde@ش( c\lzLb>͸jrRrmI+($CI6NJ|rKU@=W_oqDTO!EP jD{`sA#ĒE!=ݰcKy,L(>ë$=Y=}궜%(bHO~¶3z>I5&[A ZRT~6B9J&R&)zȲaҏ +ztfWofrt֟dV~o~2|m/ٞyc-h=mQ9+2U }+W\cRn; gݪojg4)w fMm M GPRsiTD?Wea:_'6lİ:WYolJ~ѫO6Dz+OrK䣼[ūr_Ol;z6׺6ha[F AKg7~0+W* \w4 \G ^hGΠ&0Wg\ a*΍UR{!|l%3x?햼5vz"y[zW1bAkeԍML F3 MZlsJGY@jPoܩ'7',f×:K KK9hySFP_h@mr]K_@Acir oK3W&>IËfʗn.vO. oCmY ¢(;-=<.{#W%0`W ӛU)D{^P=#X"8M榱x ]o!UYS-DwD8pڂqqmTsOz;e- v`t8},W .%Sb<}E FCpε71׾I{ >-tadZvKwVܢ]3'^1_ڶIG@&灔wކp0+l2o8x^s<KwOen]"x}M+!S3b 2}XLv&T@,~,hťP&Rac OU 560F,JzE{ki 16:}#Q#漃R!s U$%Y)P5E˙\:*%1N2;-sNX#c-> %no:3mފ_-^#Y){E4Q}sM1';Ȕ*ySq}`FDy=.-]_6Hx {| Jn@>^۞i$KR;.af#g4_l3lpK@RT`@s{/vo6օX)v{H+#!,'\ҫpNoQ؄\i$\D;YlRS,YK+;iz}"vA- R8fv!_HRgaɔq_-FJa(jʠ 7DLVhAKmԪsub tX cfm8v?*e=:R8o5҃C<Ǫz]O.$/pUAp"nj|k8v>gsoTNKBWmqj,M&L Tzw euF$?ަh+}cn. ɶPz`kL']J7ķ?Wkg֑F튬`EzÚKP PF bdy'Ͷ5m JgK䢉L +g0ʭW@h.Jr?""|-A5 շL}#+} :U(lKǰp(5AE,9Ck9w{A/VHE&q#¢e1_0~ |ĔfkijuGwH8#v?An'&p/5zp"ô 9HNXeDq_PoކJ[[[߾J&8k[^*£Ew%joQ`AHV\"cxT]f*RIM7T?;mM5b~nrހo[8|Yd CNJ6:-Bvwwߦ9^Ew4&zL ]R%B.)vˢ_1eM3rC,Pj5+ K`KOSK¿w<i* G8_wܜ{g{(n£sxeYM*'- tъK7[1[7 ɹ/۱ 1ZT`tr^lذsS=z "N-O[<ɲw5%f}5>a:Upm5B7D5C5ږ&ڧ{n3bo{o]XJc5C!X D"KI熲g!vI +jfm<%ž[ ꌁ EXMu^x'NIpW=]JDe,`q 7Ų_{ҽۛznCfPOZ<)(Q>/KˡeI+|B}3OM8n?Ql{`nuz2b-rU'8xzܧJ/!yΆsIu:Hkgܵ}#j'G"d_s8+ͷ.5WkۏNKI~E?=$/`  H+[q[i=gWE@.KD)+d3ۧŌM{Ud#gS>eGd gЎ#+%c㿊pV[ 5 9/݊h}  f<7D D(dfy6 CAix]!kzhWUB$j"( b fw\خ [@XL9-4/JJvi#"6zQƜuVN} 0˺F95 šq4e#畴ͮo~88=.~>vSY5.aƴNЯP}dQ|e-֥bljigg޵ }^__NQNг5k vhZ <X^EN9V:2^9lxޢo&9 2x&pK_Lp(% ΍#&E}Jmk TFxYE. QH"?u,;|#dn/m:%2CTTM+\a"k{%4lǴ4ϳs.EC7~le8dۊ^>D\ħ3c[@N7jxUAK'DZf4bƾ¡X6:s5[r[kn_:L_}f(X{MUҶyurJ&঺yBd%ѳ.ajr5[g9n8#*2x꼹&QNP+OL&M aBH8:.'Z- ׈Lu_?bYj2Iqa5bOmć~vJpib8́]tlvz"{,1Fe\Jx) !đ5k&<`@,±BPhS{4 (TԊ-$wF.WCS9iG0^|VŇ4gv eW ?4~":"}E7^;Z{8p?wrȡ4,/p^`+oBR+Sw= 5[!?j";ʘ%nczdFKdY>tuP- ha2U8 dqUIަf >X<X"=Oo-ź$+?-˜D~p3$*?5B5^Ax\R ZCQa)1 t k៟VtJ\CE SIS~>9 R$Sf`1փ РqxAϴU :H  ~.`ʅp bbx{l30̽[m+"؞n,;WCg+H@k>b/BDm9[$ < r#*'zwUfb@W8,@?tp5`8:+QhHu:0lsۧOC[մۉMQwum)tWa_#> Τb0"^[1߉jۥ u5, yfzl,cL㦉b ZPn LW4P0H:/Il ) Rݫ,sMB 6ud(u0(ԌTsms6k'ȏ;#ylK j x#8.|~k,zTſ1 HJێ7)^NhF(ZWAC"`YN1:"a` Riw]NˑHzh 8 w]"sIF *|u>?Hz1-Gű| I؈\_͉U*0dƎm,^nf%ݧlyL!_~؜g뎢.˫#oJ?:5韐ǩ* !P<;1BnfƔH{?Fsqc5(vmyi4Ϭsw8^# mwX$|DuB_-S 6k)3ԵT HG TOft뉠*{(7ӗ>̭" $RcdӵE]:@e㴳K~:g-qv )LQC^jv|O,=[qڬ[wy>LAvQ?+BDmY:LxmO(F98(֟qnykcU>StmJ(ػy_K3W+IecT9&HKnZIoR8D/sFȈMKIu-ӫRlTb~Gdb𖎎8]ͩ5wD\ oQ$ Bi; mR36׿7PϵtUX7X=unSIvx %;t:R2?70-# m^,u3Ȫ0Ie](ʦeYMc lk?ATҞ.kmC4MQ3 ^8W3Ź],[j[̐JPF璇nԿ=vQ[L ⸈-+jfp"f!3#Ph SBC0|vLO蓰#1fKs 7"wœ*3 *|84*S 0rB^r>9^ KU Bؘ{F .?y8oAPl-<-GXy|3ܖԜLSYui24blGLJOq|soLv /Zء\.@)MOxܕv'9 c{W0ne-e3 u`DcgT^xNvWV_fGyRnf?ՂصA6= 3l違 aI丯m0`ROZw_>IiB+ )us `4Ho2'yUnu I-ܵ¿71Oۺ,{eXB(`ĴQ"Q3 Ƅ []U][ge-8Q{q:a*/dYK_/N˳p}S@3s^8Ɖ>łeY-=SFbߍ%c}tB6rX(]²!獛=->_B[  `RMBAVJ f@4^ a+oѠs_W 縢)JdF--`LVIѩ8G yVdpζ煶u8ku0r7\Iyu {^ ;[SjF'%Ü諾16F`V ,OffU%1#!ZnWM'τH►9hJg~ Cc:IߏG&PnoZlb{-{?Ř(${Tl{}40j}IIBpo B<&W H.{A$So^PFj4Ǝoe9O0w{O¯C!_v#ce, HI-(PyEFjP>!IݺwM΁Iji`ϨQ5~ZB xr v7~&u yJ*h]>}~ w?>`f|v* T ]dV$'A>vƷ ODˎdЏhl WZd@|0=oLi) ӗfqЌ RRNd Ɣ=-KWkLIm ikQ_l DŽU2yRA /sc~+{'",Y``3<R!HqZKǫIJk @4'8}Z!pEwa鿥|$j2e1u5遥D5%Gsa2YNUu"֦s΢ ޣAhPZiMR<Pm|06wXf͆8;pfcZ=ٷAR꒶6iZ6-pٖ!tAY%Tm*7/հE-JN ݉nNݕDx40:\%UsU NԦrG#UHt+?'IP$j8X9nsJ+ QQwN'-VVR#(?YOC@QXbQ19 f۷:v[[V_=5]=%QA[ ӛ$) WBa0!ltSB\^$E'pJ;<(|궍M2VljGI֝OԺ=,ϕ"CCPz.1Ǡ8Ldd= ge.yn[cSznY5\If Iwϫ(u i0)cxeJܨs+0sw9jAnςU~oj[}W {V?2z*VF z#NP$+6uߍ> 0i&6~FǓwU)!Elv'Փg 2R[*˄tVWalW:/>RDzC\Yh5L[/boN1 ޑ~%儆y,݉=% GzAnKA{I"e:T! dvG17ldLiV6;1z<9OdE;igG޹Z4әU!h̋M?27G q(Yi~t TcO,ih]fRƒz}k!WҕֈߣҬvVq0oW[%XKDz-:0m*a ѱ!y!4 Qu%Y F= \oOY9V{pLbר+堉OQ}GGQ e5U.IMȨ 5!딃߈tVV9$b4 Ut|9X ,s79M3$^Hhb;`-hk'=bQ- ٷ4r}=-t5>[ 1.B @H/kIˊwWhn+JҶNVkc#m5@x"bDmЅ#PC !H#j(n,ɩzr )8;QNu'Zy8W1*cQK^bƘ`e DG. aĈ <헌!΂/yCW9x-%~ d]Sг\I>̣k}!PX zښwbUX:DK$HJ Xpuosn`#b}U9ڇ9|}2Z_LV1]3|ԁ?Z]"Jغh'J+IM)P3ۊ/xrWXE)OGߓkʊ2>&$L._0Sc]ZGUĮr?pUV00ks B (y\o6p`R^MNQpZdבnfgP`vt5^%`§fQئ`eyQLS"h K6"t41)b+\+LDl*]Vu~zz#5<*TIP"af_ 0ȫA+8*ưp+26KJ9O%@ ꊃʼڭmP9o\IarYҽ濎"^ʳ% #oO D%71˩,O<~E mЖm%?l6~Ap]T8ݣ2`e5]BnҠ}ˉ<x:Oz_q\#۷p4 |U5Gt`PȪ37rآ~vcߥz]z\\E² *{:2ăFt'[ vjK%Q @w,z竪>`k뵡,F@;6X&ˋ.XâhAHN Ny1#ѡU=;d"-)s RFNp;KiI tB7_( ~2R+qt,Zi=Qb=o% 4$&!r5I!CaWG鵫ueQǴ qqB9^tHSJ#L ŏd =kR4JԼhh.n/" ~Sz3l9?.㍧4S{5>2޺]›7ʵ@%޼}xK@=nW R0'E-AJGDFQV?3  k$nkF2V_.o#XoHBs%A%K:[5Fx{802{1M&4RtL)/?& ~r2xm,jT[q0N{72SQwjw@޴Pe2B͘DnMzeѠ:Pf:UYNɟ_~uI5NB[ڮgbWOGm 6? iQO[7n M08 ?O #3eHV v|ޗR2DP ȑÙo7e_b{սg," HRr ,ɼ;9jЙnOE&9wlἇvӠ=[W`Yxޜ='@tRQJׅȉX-&j/씐fHJ|Vg<0#JΧP ۴S!lq 3_ ?Bju (蟫[<0R}|W6DZ%.ߺr[2,`tUeN:H:ʛsaBdb`{mLMkizkH ט^L$dJsZ`Aկs%hϥen(h;R\{$ChDZPsB-]=аKuKH kb_K$IҼkWIܼ`PL^1&,^"]V,$6-*r#ғ^i:#^ҝ(9PK'Yrg\^8ܥ䕭ČqUD{F߄19oهw9&n:퇯)kFU\@+K5EjHJlV6m]\K@*Tx Zq5%,} 22iWF%$|1dgϱ.ZY`쁱,/ Tt?NRVn/uOe`屢+c.aJjC46GsGp/|321!@yQj`t=_jCi+0*S챶>CDe};| f<Ͱu5uAG49,<5s-5vג3g'1[kqr~OMېaO_P w:CIcsپ}c8s\*u Qģ $v_YAD, N"HpEN9[JLu)Bu+ؿZ Y#VWCmМ[=_ӎ j"K~Ì n+ѰKI&Ԛw+H WlA'|Ts<0qwJ3Yz8-'=%b"gw *+^FR"np#%b nf"w 1fEAx4lO ܿ;M߭J )V'# T+SN]4h^]B1ZkӸa&Z'MYW{ЋiE=!NGO2Sbky\  _^wqTj[ LoʒkJ&@[8)ʚ.y۟V6.{q[9Ύ9㱠6A+ ǖoYy1̙2 #*$I64{lkgi %S&RcbX<A\KG2],"k$5#r@/T r T[;b@G!jc'~e'+B%ϷdIJ֖hqO}Xtd\GZn8l}>uj ùs/3ɢr~ec#8ۋB4u 49;` Wq~>]棳Hk܀G l}@ți4G~w .$J*䱜M uJvʹYXWV4zy(_MGԠR Gg?k7NLD %-RcNIX|7vNs'YL|W0AЊ*M(!5Ai&džm?3mA36c1ꖏ6oJ/[eL_3V]˔byj-st,'R[M}nPo=%b+?>J~Ȝy_sUO*EHtp=oY+ac-q8Yo=;'0!Kͺ yl+lE(WmV~}I#MMV. 6ÝCSVGұ&'Oh>bt#6ekw+/#,D\v 2Z%Ʌ>qYqΣY !}Xx|Q-x-FEsn T>M>V4$V8AV0_\^W&~#[MYnan#XGX~fdH3iJ<_ƠϰQ-&w$=UBd4 XS,KJV_ /+_@1GTL ݇g FIA'{==@V#mFM搪O9+VQ5k[璷W fg& G` =YO Ufʧ] )CJx0%5j쯽ʁDj8'}Zu *fzǵ]&Z K LJr-L˭\~ =N|:QWem zԱEBtG9ϐ S?@i|dYL縕:E|ߐ2da\khVBPP! 5_ul_i;r8(\ 9r"]|AV@ cww 1WROC=SauMa0kfPzF ꫌;Gǘ´Bk{SiIx0Usc,ُFV&aU ^c%b\%"~REG*oU_UGƠ0O<u䭤TG7%>(Y&Eajmővim:v@XBƗdpW^˧Șx`V'Y2}3tπ|iSkoӨ\6 n%rLJ^@otJҴݪ'ȊG Wœ2rSJojp'0ʈL: XڨQ>ɯ/wqA,ɒFa 1E+-R f3R2mg 覷۽ 1e}vKid*7}X(*R"EB6,V^m%seL<'\)A$2AA3E}eedȕ;Tb\"+b:J%B D^S ?wA*УtMKs[ښ32R;鼗vdNyYwy AIAlLLa/g"{g_^"Ȇpێ.90w+jA9xe>W'6F~N1["V0cBuiN U))$L1< dk#O0.M1-$v+zszuŞ~rcrKjN^\\RK?vê$&E1ܫߓbL3́FKšp1;qJXeV:ޛfmj@\%I#c21&Dĕ:?nA%Nn긦53 (BގVn}̭!= :eg~ZRve[Z*n I_|O퇫t.]eΎZq[vҙ3i3abHYЗ }F"Nۆxzr-Z^h]\F$Lw9 g6m:_i8K3@7&i! h-]3݉l6`ua}R P w\΁V%曔̰rs?tާe$hXAGVr?_ڟ csK;۹\qcnM_B%P>BhC&k̟?f"PetiʹM kz4baq}忤"B?h,]^|-Jc_l.jP_Vm f{kbR`}8C;fc*ѭ%k2UEkQ٢iXI 2ORf$_B/TB英'K!Er961ܤ\^ +5Adk88;7W_8%9B_|.q' E3ffbI_W_Saz~ K?/H_k?r{%Bjpؠ)BӦTopkV9Su:B"Oй,ͽ)odtѿΓӱq,Uщ)iN0@."mAZAo%.RgCaߠEVXX٘"-Iя&{&Gbt/1|6.y6(k½ӳ\ W/WRSłpnl4 G&v:Go 0,+;QZ`=w,&:H+X(}^tÚ6Q 5O yb=\ zkQ!cp@H:iPlP3'y¬GfzN,>8GzMQ`q|F7hf9vT 60J{O<1[CP~dކ@]o;gFd|]10*7T<K<X9yOSnusAQ"T{̖p$bQa]'rr%'DϞsC^￉Dd_M:f~{ܪ ޟkbJt B)CD 7"`gM Ķ*=(8̀o^!B ] CCtOpɦ L<Щ :,4Zлq=E}Rm([ktWzY$gK^YUlK~##sF$޵S.An#`QQj+,7U]Z=0sg)ۇa-`]Fz@IZQ{JI RՃO(|܈~ tTKwԅd9IWvc֧v{6:2)'cPWzթ6" ZCA_Z-ēGu!*".[@p8RgUP`:rnx{u$;fל$$[dw(5UYL++qXć>u,jޣ z'V@B"p 7_:xCal|Ot(8!ad@)S%#Ջ|a eìuG@ÞD ܩIИ쑴兲U1l~΂IzsBȶӲw)<;0DM st᪘ 0\>2U+WJ4T>[(E 0FUU^6(D5۰dKP;&gc_2NvLn(1P'4 _bmXF pW2T'yeWa ,N> n*$yNQ s߉|<8v9'{)"dVM^?XlڐDžWs;&f }b]/8.=hh:/ߟhKp5jݥzu1D+'Z!ĺ^>Z{-gFn Q/Ҹ;ڳ208REKwiR9A[cnι̲?\1yPL {Ra HdG|0?I3< "~ɩYĘI(}s󒧦X/c3/cm`iU^(Vb덫a>bPRVVk}{,?߬XJc`>hjL?vxbKե{.(ڛV Iwdo=‹5"jq2&r%Zځ +MryaiV+PYxќŐ].54}D$mfI<`K"F@W:ع2Xֱ^!.$>484M<#uuc D9:d%+t]#DWCFܝ@#Gi_qi~wCjSpGB(eJFNRJ! #C}qZzP,)izB%ĕ(jAO VMi܋;En%v׺S{F#JvΔ/K3-jj':*Ο[O3r媽W+(5Nj~Y^^Ns7 npU O9QK<"_0iRPsM{- ʝ g׀SR;Y[/E~faj5f󕥂hb1$9P1BLB{7*2H4JꒆDld-3۰j]Lb \2TMS1hertVYh*E뢲m\nMdTM=ɳV8Ҫw FgܵmgR>zϋ1iO̰IH0:%i3P|V ?p^;TVć[6YEz%ld< t g3 VJijpK]5)z,6\Z;ɗ턹Y4ȩ=1Q]F־ 92bJ8F"k `Cjdx}3+ $z>UdDiۃ&y '`*(59SA)b*Bmy9#u _㒯m6Ч\w=Xvqߋ򣵺YӻG#rV ރU42yUM#G_,gCk~R3TKoGe%쏙tNi}oh)wӫBꖩ3 qFAڲ ubM2!^ٞRu85Ni"a1#wNVy. xm2rT1On\@Y~<}JʵT H?D1wUJCp|zj074XN?S޲#dcSIK.O81Yh]JN]zR ] HsK&w`E4Q#UΎ^OuyfX6Ed }ͷa K(2\z[F&~b:yOi096絥J4Tw ~n.9:3mq)׷0eBies{Kx1o͠J}q 6\5[QD&qNYN[-;`>hp)LӝOitUU=)iBg?ޟ7B@30:X9Q݀FD겟a pX\d@t/{-sYQ&fq@`Gqr8B"pce BH2hE'$sg W TӁgķRV좩MsʺD[jav%$t[r /lUzjw$;!/S"2`Y-'ljkA%"I,@?\TSj;C&/rm3k J}=qݻK ۩Zj2c%>QŃyM똡Y(lB;Vj j8UB B^_$hB6jaSG#DVBR*+z|OfqQZPihwHnɼ׫,%yl}FaΞ}Q\x'P>z (9N[L(a;MB? >+Ew4:,27% ԲB|¹؞H +IseR`cr/ofwmhȘ(C8KYl^e-ivdBXdj_j5{/L5o+s{ܗG_q6F}xM\y@&q-{o2FK?檁CYe5{t)d~$VZVݗ"% v^g؞A< Ft=fNL]hOo $*K؂?0~*`w/,$cJXk`M}=L^B# @OO9ѕ= u)t7#6(uӧ8l*4S=*8 w^GTGV;o.ُXtoEO Q-K'Cкx`|1INt1l9dlh[llPvm6a)F]ĕeb>Z-qQ Ɣ4Gtm7EB +zooluX$fqF`(? uNi]`z6 0Mޠ\;JVÇ)JRQ >)9aDd??m*r&&Yg!C.4@8\V6e?,F3CF}]P~7}ʳ*&UYx)VtjWLT@;%E;M5w1, c9.DTh m?*+S))JP,XL92JwWL/v{iS^xnP^PO;̌]㡮B O le%?E:w؏m/\b ;PːKZ/|FF6Ⱦ۬1mZi5'd# Azc%ф٥"54J ;ΑK)z@ڕ2)ʪjE^$SB~k0ݗg0gG!4H!Tbb""v d/}Ᏼ0\xz^(wosXTg9ͷjzÌ7%M')\(8Wat'%|j["pI|=&Rm$g2yg88Kщ):omi^/[iix~,eP+^_ԠYC}M!!uEu'K7o!IB񰬓bsCQՋy&L/!eLRk5xMIߨ]3{dͬTB)hzTRw;$0Req<<rd:bz1#eVo7/`uD,23F"psg 5C"R'K2+9ZoCO{r@ЭеL@z]MO݉v4+pqܳpҔQ:A߃nMHS{RH"EJ+5?G8qCD[V9Z('Pac110_)4&˞K뮾vIq$@X3M mQ]J`5'a vLc.=Y3ebT=6xǕJDEI <9d\-Vb&N ַVXpL9VʁQn,ɕ{AvŎ ֠Qa5EiFX}ptn 5za^?("qGK-]Q_z/,KS?^sw;*wⵞUw ՠw  ˺ M\g+>:~hmz bs_5K,wl-i)NuWϮVJ|vr-ΙUm ?r> |Q2B*ZQS:zzA(!=zqHfDAIܸ6q9@[mmv>ɾ95R9$uqR@Aq< ޴ڎ3uJp9;j $6ETuh)S~Jćɟ8kV3uDA׽?iucX.YVӊ{m&XFPkCբ^?'JC q5fP[J8, fn$HX_NJ&ip4! ּmr`.a(8!`^%H)IR~3OLmXjk8MNx.-y}U.⫣Ï4BNUD1uȖvDƝGG#atv3yxҳ4rYTd,* J!w5iy<MtNyVE aR_ycƮ9}C23muY"5Pg,ߝx v`\Z.#fopEnP/ lI䄴7Qa:b=!?0~Dt0+wS㿾$bsT}A>e|ƤMaj],jU>=z-ag5U;1K, ˷5bhʬ`>8FmGQaƨpR--IJXUHqfW&&JÖэUEH5.甐$0mK,Lž3wp14ꓸ)Kh*VG+g %܁ȑmsJi S PĴ!Y[/Uc|.jyEtI`%>,YL`P 7ŀT6X:&#)@0 hV=;tᗜyp$ec;aNr9 %m`{tVЇz;HI[IbgǴe19DTC4V=lg*M.SJe}J}J ɧvWr՜x؎#|yuz\\2pΈ3~viMlcJM}ja+@X^1#@8U'L74(u Г~pU$fkR"g,F%V%@/g ?ZGK| HI,{[|Zي\G٘o'a'{R3ܷۙJDz[i -o,gg窫`+5e|˘y20pbٓ,~^AMnݗZEӘazv`#7VFC0;il4ޞD8Hbnf;~ 57fSLO_`h 5}֌S.utڢm D:#UOy" ~bmEHIP^/UXofWBܥ9 Y{^+5l pkmvRes&M dV+&3Pd/켮-YignЃ'(׳Mq<[QX 7~w&i =Ӛ:+M(f62YfʹuVȅ\iA=Fϗ&V)d۴$ h*aB+u/u c$D,C]x?B1> |Y]$C0M5٦({x-]?Y[o<}n9+L9+ ks{to喞"b8GB)Ftj݄ ЇV`/ 슎ojs-:tSBMZXºLOTy~z=v<ku?d FHZM+-KAŗF_`jb{^[GrZkK\%(.]pK_)DE7ٗ͝ m=b2!=j09o,lK^GLj3񱃷 SjIrӬ~%3ʰ徙qtdQD:Jc$}fo|6- >V{2d G-}S*5Kvlxt%1ZlH!V 6шRU\ϸt̜+h7gg36훫J8aMS3F5ZiePag5?K˩ObKr.D6(b7*Woee,hsN{\pe ګS-GVMy'蟺jYtS]|$SSuo[wc{ωrml|alowiBC'~=QӍpEA 8C""s({O6*&LkQNii$ :•#=pM*"׮GNe4-Zq!I$ˇt!N~呿hKZvSdxXK ̂xmSru ]$ZLt44|PV!])k`wAxu\ZR:tl}*Cw Ի-H'GȥF|K4EDbeȉc?WtS.&o;lǫ"[ÿ2E}[V&!rP$8|_Go3bcX@q*~gbf.ӇMD6Ǣcuf}bɟ#/aBQԅ,zMO#͉\E)3@I!c~ʻm9饪(8<,ԥuI \@MW [thb.9 Qݧ>+ݻpTB)oq:&uwZaqYQ+m࣌ȗ9߮ˆJU8OzpktSQQ`=b.昅YNl -iA` x+W4y$St.@cܣҌp|X$ʒ]_R>r3yr1^ܢB ?T&VlJM]Ge; Sc,(GGsޔ6M^ SNP1G4}BK!WiodPZ6fŢ>5"<=e*Ӵx :è2V<&V;߰uQa4ep%#kK6%VfO1#c'#͈Iy;` Ҙjꜵ~JCó>§0=YEg%? ܄MʄQ4G(VN.bjhC8!ҮfXE@@AW})A l[?݁}il\BdI0twőmgY lWƫPYk1!UTKgOـа&SY:4$lF5u"^#5MU7̧ټ&Lbw *YP=7>}y0ϻCJb$ΙSC ~טGYVP_G܆B1j`<G=vD3(MvNڑ9%p%ލx?Ղ]t(8n'wHqPSk5,\eʠ\xKwM1$ V#׿Nt&xmT-HH[IN7 O鮳H6JtvRɴW6^@Jޓtm ]o"ʖ Dyp޾wwD5h#VڢVCI{~ښߠqJ2X\KzOzt$>"{/_ï᳘'nAUg<ɝh^kdJ,NJU.ܬ; ߩP<2G uX V4M}pxs@i!q+jh"iwO6?gڦg1(_Sl<+A_^{>N F;uюڙrO~ \RR$Wsqk*oCU #0ڱuXZHNβ.(G:K~{H3)9ѹhni^?w}2厹JCv.*7S&RKM,l(P נS|cv)߬adHfipSplWQ=,'7O`)2#ypUODR|$; yL7~?;]'PՃ[>WpGY{V@B0 ܃%KpLo*Bry7:elq#Ϛo Pqͭ!2Swsޞp"A#[Ìf/ԏ5;L7!`;{nZ3#Yg]ĝ$98 /-+WBJB/+Y75sA0?騴(pPC~gruɬ '=-bWF1M؃5h:: u+M aI-`T5"Vlm Oft0z_C[AL܆9'X3ҩt.lTKRn|e5ě(GsK:~PCWW}Y Cwa5pJp=/Hqא̤1.tix]45 ;6Q,@+`@mq,7 c'`;F" l|w^ozm;ً8[7dnMJ Oy! lfJWI#(Qվp_h;V 'JEwvpnGq4Sb=,ڼ&oVwK '3,fȼT;l5-C8͌_q Lo\ F0USsu78;P6CHK_9Í׳ fE4! RZ0;T[`,OxH^y)ڜv+4҃m MbsM5.NR( 3OѤSͬgX@tT]}wY%DHfJyox.!7:3{{Ztcat~Fe^l7s"[-qW4s`9?#-D$-͗C Zp{IL.'׮>)yπ(hhL7I&ݹ=!}˛bכs7% Rp'AoXu$ ja'IeZn,%Q4B\i ? Qέ>kPAZCpS76$+mcRH', 6&PQXt|6.fs4o$ԪDZ 5VsTs@]) 6Bm3>dbpCa@?Xv=?'e{[YG2 c-8]W ,.D6q\hC6ş6m@6Aa]u9ejãyoӺ=6L#ϜT!!ܝHΞNw3'Ab#FVGZ/?=B*Qηž9"QBzBedhP_tyxWA)  JY Я?n|\;c {_BY?.lӨ Z?`>uqP`b+pBWve+7~y.:NE5 [vna \8EԷvksh&~L&2UsCm<|UkdQ[d % p#R?A' l%ҰWR'Q ˧ClkL,!P"ѩ&4pO(f>d瓍*5*ϧ1@V.w(Kn ,#}a϶Wn.c5?թ݄[xU2cm C ɰD8ywpQ;p HQ-:#nWɓK6ˈՉ9$.~:n?cAEORHIhU:YDafgJULj;b,4X:I꘻p|M̀UN1Zz5׶yhxj| W/[#S&jB.4\ E @1-0k4:IBd]AK?:2e_k\?op% Eq_XW"EIZp:q.+#!H%E\9؆fplb_G0Y eqK?t⭍y!6IǩjoXƌ 8EYa5tvXL%0y1p&!<x?Ej-cYXN- W ZrKlt N]s]bEFmp .fn6R[|UӀUFFЀCLrh?&x!~/X1UN̴ OtԈQך34(zŃHr#*Ǐꥁ#xuI {]ZoF.m8✏%xCilD{NF;쾆[cQZI`vZ8XЎѪ]o>e )iba-K5yH74jA^K)%Dg;F͓!(F?q', qn~\LdSXN $7U.WXM(*|8Vd2uoT@PJ8q7 QJg$kk](Fw(ء!G:}x= rL=.Pr?6i|׌֑l.,6Ds EA.h:T_cZ=aMXpgkR6 - }'ɂb8MZ,LK>\Fπ KA jڶ{ O2ormMϰ} qPhB5CdB9`ᷝt/=π(l'xoD3b[$ Pvz|xPUqv!aMc%"h*ZEĬ^ά-^=+Ri -y r?Bџ[o$RYM L:Ì84R;vqn4K>ֺ pq5͢^W㧒5?fRr]vX}d3C&X=G7 X= Uxo_A3{?~)^Vn:th[KZb'XU q56дh;eVMHŪq⩘ rj=it mLܩ<:$mOə{1YEhrW̨4'( Gi0YHZ *BcLE[%mn-1b pm)E`'wD,u;Oz5kj †΋_$TV%|{e-qZ[}-xo!1A$a4C@Ph''a]5#.WB1q?InEh qIK&G:N<-5z%VMw&As6"^O4K(Իd  W\uA- Haih~0; rXi7i?hK;bBq(Jc޽3աd{Btjkc_^nh,$f5o3ÖJ*FWkg]>hXscX)^1W>gZheus2F vT-lCs#0_M,- #2#pXKәYo"!^U ׄT;zV2C7QQїcsqG;;Ry4`E^u|\#@9:;!&DuWCVH[PÞleG;AϨ-wD5t>R`7MEH'`/٠:BmW}B ~MZ{Q6b|^65?w>F0rv&6`[K`]RS7$ԪH4VXbQؕWgCЙ[^Iu>MTMyc 'WiFAIeyG(Bf=RItwAN~%/ro[qd2q9fEMv~vǝ B,ޙ&ʚ$qkjWiYdelcWVºPdJ/C'=2i/ġ8,5.u}h4|p| zaKf#o7"Uf XmM] l!h3ʻ<c'03xH?Am\LG^ceh=M"Q!3EݾM0Io2^rm|e>JLl'p~vC#G-Bpkr}3rɮ#4uL& N} x*n-<+]5R͜*/H!@\a)!:̼⛎LouQޗXP(nP͞OLQb%+wb?|F-2F+{[; ҫ=W}b(Ŀ/ h*9(kj/W1vս {i8SW: .t!mc7h6#1ㄶӌ ns|Z7亨{:Ȳ毣d|ʐ3}=\Y ]I $qF(nO~Ƃ\]_LRqBt^4:uD#=` (. p8 kn2r%p~HunNbMGiL8kI3̇B"7= 2]М |rs]$ǣa{p+۰#SZkI6g/K(߹5]Rj8\׳қXm_\5^ щk(*Wc`WzZ&2'[D0)Ӊ$|_l}i rsK.,.'o) Ap:KGAt dz9$#TZTd,hyBlH!'; %A-۴~g} ̴R=bՏ;iy2.=OW|샢|5 g_ l"-a=TtS߷Z:((աs }vzST+_h;R9+Z ()34bU> Ah^He) ? Wv#E!!r"Wh^`7 (g lj 7\3f6]NwszQVŐ+]Ž"!@uxaLwbW@َt\#$\ڔGsTuUJc=pe5jsQc߫2Lt&JUxJK]j avf[w_tV8cHlK@@09Q:8\AwLRd84ea_&+J/_Q(Q[a TVGҠJK΢|rY gێ<uB`Dm8ڜ 2z oq@ARYvtғg6>=E% U%ⶸ~wkt7o.zFjҭCӶv?/uA\Zu2{..&s/MOXO}ayl@%xF{%K_s^ja&Mc_+]HHeT[+&_IĮg ǘ-pL`bpaXm+ ÆM!C[MT !0}:f5E07*zC+Ҽº_ m8T[NWqÑT5݊K=BVsUO#VfC‰~d0(w/BR=ƈF}Qc᎞J͛ߡf|X7.mc";LFJ4T'S}k5 umzɗUAh}BbTuQS2V(U7Uus°E3nǼɱVjxˁLrܠH$Mud{jP{( .Kz`j{]~sYs}kضtӢYr&TzLZol'H)ZUq۠>[=Vl563z|2 ꬮU@=:͂khxvrSO97E?e4DcFHs{Fv#wEˤ, ]5wGuj['9z\LK zbEQBl ^iPq@i,?1 5Ic&*)H)(O.ǧ.NLQ?0/>Sap a+*]}+,wEmu= .V7ac aK 80P@]{ ?CJڃMUiagΙFT-C5ωccLhE~t]YDW30Ekr&_ \#C$T+'$潙?0ZTؽևӭBhDPK|( v0 sd)G/Hiҝ_XolR(P76\ F\E2;@S<'f?w1\y TbK#ܽkF>. X,hp|A$e=1ѐmQ_NrBZkX nja5Θj!f.#QZ`N;)&JoJF;,Tx)Rx{⣖ +; MK~8ɏo=9[\~oqTn$%Ej#J{QDQkC*≕ZUp C9<1#d By+r(6XK QTG>n1+jmh6 O>$;[[ﴭ&hQi(@X !kF'C} O1xih]~ܶXE@& w/*7TlEURNž "z g)(m?NPᤙ13?畝e٥ N`Zx_Ild&h5AXLqS[jMt?V(7w#d^23?Pru/EH O|r2C撻 dijyc[J N'5$,A_:+"&^eI`Z)T`2V2} PjerDFӹ}1]pޮ' d} 6zkD-N"X'jn nb{P-|@ H0Frޝ֗bxmgj)Ӧˍ9pV i)@IzZ#272 W:3W2^s s3z_85 w*3Gԝkb ޔ8P췫bhm7hjR1Ҁ [3Pn0 _0YL Ӳ$UZFk)?n7xW#7È^H@l̡Fy9Zt`PsbpwE*3coXh3ŏ;4"~3/2jkR oIX ;_7R\t0~ 00kj҉Sk>iA<TJѸeDI°C?kh9y9/}^.v+d `,N9^Ĭ}IYi $ԑ!4<ܫOlէ{5kʇ%DOvE}CuhM oI S03g;Z!]wn*2 QKKw -U:+LO(l93L7i@;kyڎ:u۲רNat6\c m`gy]f,L3F;7y7`N03$89jpb =$e84 ] !τw5{x5TBoeʕtfX}@<>5ZqF4{٠qG"{Z I#H~F]f(K#zu(I{ytbSr19?u-sU@(<@f'0TA>dC~8o#pbP~Z&wrMO6a~NF99 NQm WB5W[C:X@}ȋ9s\&nS)e<&M^@÷NL61v\\@R,YZw4Io4tևX౴SN}s~LN&uPE$aeL #a;NǴ6g z;U]}c 鿨L%5Cio`A&"F&v^VmQ|l0PƧBf~N(e5,WU_0L!M7C˶3M8þb7baZHJX M퓽 HƄT쓿K`^b(V;mon}1 8l ]ɥvDA};~Tƫ 7"E`r%2D)yR(d(Н2 JI?VW1'Q}.PD!\4>NhW~֙\=N>{ixػ{INؠsW*36{I}珒>w )e#;zwa?L7/4MRZ?)qBAgiWn:YѩQ#{#yug֭ =JY|?"'K=#|MGJ6|+&d K6+F$G*Qz8quFlD#ǻ!el 5|wf--arqp c@w^5+4k<(UC >JMZƢJ.u|Jh*$|/M|Fi3j ~.YZ=Pj$+)] {9]8a|ԭm}PA%0Nc_III^ZKY,T8(>%rR|S^]I ntKIڥo' 0>7"OEƜ u^.~>3>?o_;-?q^۾Ey}5|;3,>*~@;=cd `rCE8Ϙ >c|)hπb @ɶzʁ?Hȝ`hi{ߐL>opu笹-vI1/6]-P>GwDJIl^-ɡퟕǡ=޺IwPS ^BXe"c?o;G!€LjF-p#04 X0c :uQ(1p?/K,  B8XGo[֔h hP{NUxL@`/ $|:P0;[d|YSYGqp/ABx?\4Pad U~풳?nt͑z;*]Nc+_2s'0Bi&Յr:Π[YԖa}(q@ %WwZ/3ѡ<요F,_c-V76pwU\WR dMV8ĬIdU^N,@vgLSyNObZOz[Z&;zJ#ه n\pgfSD<@sZn7ϦȾvIJjxK< {uTemt N 1] +d}{?d#")aj޸ϵ!z)h_Q|480Ic(Om۸V+( /ҠW-`b;^d~^T,E ]Zjܞ!Mә𘡵)YЍo<6"WEV'+>MW0 171 F97?FP$_7Tc]5,}?<:>i h\ CkCzZ¦9B4?gS"EМfrNs/3b%V+26Z2?&5^o!X*ÓabrKn6U :f+8-{|"+8jqwN?ġ//Mab;~c'ùN՜: ^3Y % .zT떟LQW(BS, R qKT2a~%IqQ㞓t5@ m\* xALD^5k2EgUK|6 ;nai!zA%Vn^/UlP\ʠQ/P=M*4t+o{{^K J>QР? OkˈǨܨ-i3nlK@(I 霤J^صQ qNvuzh3m݇={D_yr]A:!M>op#c$;!>*/BAf+zt3 . >2!?o!ĘFqkޯglAL/b O̓xƣJn;4W <7-Qªw=+ /v{c-hijG>e=?9GnUUxtfD~O=) GO"F/ %}vkfcĄ;ٌ3v)M%^_̳Ƒ&_(^.H65ܣ_[yB}A:nI]ijg_q<=U?G$ .j&|c[N>DZt&ZS[!;EP%XɊG3RR3;٨ъ?:MOqO; w=*V 40z*`W0v:zݍջvy=E껍tm%v\xKy]6]xLvvt,rd%ӏaCiS&vv|pIjPGџ-\?&pkfoBa$gMǿNAj :_!fGoMɑ@h|I @!ݣ)$SU/fm 2V4rU[ &,֬z3TUVmC~_`pF v_5Q4ԫ7fNJ":2ώݰrr7%Jԍ47tVJ $M $ S^`[m)Mt ?]gqwԂr}~9џToh34GWn6g`DHrŌd[``%ӈ%\y%8~}g+:a<'f0Ys*u.4(Cil=\J )V]#1-s,lkKf gl߲^NK4HJ9hOp#zҢ"A=W8ae=+Qe%jdUl=P²iصw.z9;K L[fE (#\53CKQoIUU?Z, m.{sfM4 43G3RѼVɡ'rpuj42҉_3l6J56#@9!MMZ)R58UfЎxٍ_3оU}~ = FӰ,P򏲘[ysuoٵ0%N;F6Faa-0%ếͲS`?KSډأӃ]G9ZVY 4-T/u4.a_DG## }4``H!0&x>vg\2׾C f42T|`G# G2HaT6"# Uer'Zqz]8Mӽ֬P qI%:\| Gsv'0HaЮY0*g3 1Z)p6ל(@owL)2%5C/?#\:{sS^c[PzBxY7:#j~l[$YAfq(5_$_vߤ4* \1ZPyYBhw(hst738`atC_=m*(NtJ{sxęγiwϧpӈJB"tdݠo,%ZO(l<%`:X9b# a$}&s~gIywW/5*oL+v`lg}J(=WxqjgZ}Yc5u`_d)eҾ%{z_*+sF,"@ K= IRU%=@z6#pLcjP^*23x-疥#j#zLIyT5)@p %cjCtlp_) RT [=\3 ᱍ =zY mD%A&,ͫ9^3K?9LY,o*à0 %I 5 U@QY O L$~@|8;5pxR[*q/AU4;D6Erl#dVغJ ©\YYYYx҃niu5y[}%xfv?z|$t8>7۪CFb(ϨԺƳymɝSU\"0=65-)^1G, нS]d?;AP;C |MG;XMW9|30o}JLC JGB0 ;uhGI9^Te V+Rtj$Ϫ'}0 coc"πJזH]xI'֛NB3Clo4O9|gq: 쭶zΟyd`c,W!F=3עy$"cc!Y@ސz?pwH-R0RFuz~`㟏*.4YFwWTYJ/?9^A_9op)L ! XM5>/Em#&U] Tv:b"*5*-o\XFnFRHK+Z"?z?i!U֙"6 =G/U'R/['7pj랉W^ЬWT|aBbgG-8r.C*t nA, ,Mz,FAicEPش4 x~*J^ogcK n^0`3<5XCf?G3(6`- 8l2bdȯ !@ ;<ȧܚ`iągO(xc;HV]%%Uv.S%g&ԝ\O{i(HHp+qRA?a+ZLux-օ](:ٵ5I~ٕPQdd~:AS\JR O߃}Ҕ>b½kn?"A9dR{|̧|Aœ:px5LFQ O鵐z96nT2t=XIw6#F)z"ه,Duu3k$̃!6<[·1Jm؋ z}1J4^Hbj6[+7XϟKvغ.Eb\^&1fyrR\\ċ-Ś0o8=mS ,s&"M|*u w13ssUz5 K31}ƿʃxi&* [Q7[[tGlέ|ptL!ۿƽG>j[ipDR.E¥,_Uf>oTo^ %ѷbVFgXC%Xր`>|pv"ƀe:0Ӷ}QbL!WȬ GzL\ya 6$Z]Eo!tߘ)VT \T*unZ/#Ʃ&Uo;8PH I7zL뙵uk.(! HV91Z*%WU\KĽz.=Ux!T k*םN\7{ҧ{/ cȊ(,}BBl]VϫjNBcɗu`"6?$Xqp6葞W Bo:;B"tp$:B)J{6Blmgfvqܭ1>osӷz3hȝXp{fP9{3f(SL֞g=ɸ2 5' 2q!5|ǜ5Ḣ-a[y/s W7ܮ) ^S}gfymT &42k F(ƒQF9jK}aQ)C7En~ˣ޻oa:<`r ihGؚi{j !D~XWsU1 U! t|w_lv.W/OUSQ"eAgKBZ  <`sqݐޢ$`F!GCw92qC6IyCe3c%Ef=hiſYAY 03MUa6v;ֿ']@^Hl i'_/5*`H6FuOAHҢQIg!W\)^m<{c zS?ގɤek938"|g\o5IŐLcO1醴[ n^K&Hl={EvpL{y{%Z{&8vhqC Al_/(x#]s12^%9tBUܗYMhH>09-6`Ini% X+|?ϔ|??fGM`d[4ރ!TgJ+k(/?'It[+!JCƢS:o*o!+$峋N]ÂM궯3r`8|"TƝ<+f 2=('[>zGA_ldSڙ_&G }v+f Ν c$G זmRUl5Mo_ Űs0'v< Va"{;,H0ɛ\du(ࡳa%6>R>]1QvP֏SL[,Ԇ,R$rIuQ J<`3GȜ謋\."MzR }Eq0rtd'V=*d)G !/N 9qu6cXیHV f؂5행^,d' s9:翳r@|ghxxU,I7\P_´%AcD;JDkvR;C<9S7lPjd|y?RSI23$|tSFIiJR$'8x -q:JoܭY0ow##9D罄 XnIGnv ji\S W>rb?^;) mGg a&R5{ b|2T''T!DNJP0wPaQ u~RtN nV}@+V5T9fo9F_ є=H l--_k ɲb :kFk̦ sJ^YT7۱ْrŦT7)ܲw|qX(WzXA'orSiz|pElrd琍#X' KA]I/H*EH5n-]ɎC=;7Pi-858Ú͖C uuEQz[8uM]4E:'SޝB *1nW%nWAY3dpvfp[bIu̓dߋȝC8rVC 0Cr@T#7u_U`!03`$j!b*@_b$Yu˽v2vlIF8e૊a|\nFQ_-K*ցѴ G>02|ED.A^`\x&2H<$f]}~_$E+OvQpD` ? tͅ[w"_5{'xyS+3B5v qR(<O*A`]o V)j1m,<~)> @KWC˕ԨhA -oԉ]^>iaͷ`U kF^Ej_8Q"w* LM݉x zx:V$=z՛7}, g7(c)g-yÊ#T*ے%rE(ERr4DyVti7G(3,q%WDž}Q? ՘sVpBܑ&>rlj[H9 mXÓ;/.B$BA4"V  B1NnFAUD*["@ 3 .^ʽ8s}eD?DŽј o+ adfce%KdAny7=oWaoHdTWvd1F0w&ݴHL٩{S y L G=6x 8#FGx+Ď#7Xޞj}?d@P6 'Af~ewyXn@@@), b"{[:ӧ4A/yX& ۭ[?o ¦5ym&L=kN][ 1DnjXc\6ZZ^Y*gUx9+zWP'ݼM0UL30, 㓋6b>/ɒnmq.2B IF"m dP^ݕP-԰} ѱQs e-2P-)G.X oP?-&9q<q _#@2Wf 6,>TF|Cf{Q1pF:ghFm0%} }&@Zpax4dҊgNL=8@}ݼ,8$֚u7[U$N 览9u:W&h39>/;qyfB8RR "1g%KRTU ?~V c?F;eO|:{=җ !<}[㩀T=]n.]1'AduÑc݌r='R.lwp#c#&*$@8SR%˷ݐS0ZM|d[$q}$aؔg0(kiDJ޽L$XM\,fT7§8݉I8m,)RdeQ0ݝ0Yh:I|A4[A6\DoiubPÙӿFk)S}8+Z\uJܫMCx7 8!Uelȕ ϱ䀓hՙ>O$FuF#G9vZdFk0)E4Pf>jg0.4u s}ͭ.FMX]Mr!цeϊ|땂@- RV?GB|Y9{̜34m;[b@MՑs?*6b-D"BvjV-;mz-Mmps7Ŕ^%x>2[E7?0A-Jn3T0&7jFOmndž2V'b?gU>J퍺^|s+wSQU "A5=IXi~@2+`[{l:gQ)-rul8WO:ڤzB' mع*#iPu@UFIɾ'J=I3@L*%bctvPvE]b)1lp^zzS \>!?WEAk<5GC⊯a֪\N&50UO{*rhә)"!x ; R֮W гX|23W>$B#FQZA0LU/ڞy%If+yikMܛZY`P/`.^(>2%y= }8 +zyLmSLk:%[cnu&\'3|ƾm?x ˄qÀs!uM1'f};a{ՕJ˥Ӻ|%%/țR,mf\/|>zz0K)pld9+NmGlM24>l[%,y~M8OٔtM2k:2DD^"(r~i;oNa_76QK$gIVHr!rkV}[pNa o\hF3hƶ2d@E!3lN'R*l, 9DiKd9i͚۟D%}zOz3騂a`ަT9B[V3{|ijٴU֐H%k=%d9 j/D{M$ z"y~VMnlޭ=M@]pQVaҍs23lS$!pbc19-?}d#pQ_g1*"kOΟ{n2\fVlV{L U`>-H:R[[*U"Ę~lz+i+JC!8-P jKŠ#3hVe>"D[쟿9[2rɪcXS~J9E3^zjI=@| ^8;TYG% Py )Q(`يMN褿ZA 0|݋6i෹n @\`Yx(eIeW^@"x4|t2%ʫj3vR <vK ٰFu% Û@VOCy^Kn)6 Z%YO]?mev{+˚ʣai 5×c WЂ6/zhkkVw(X%ϚP\AU;&۳]x #{qbhGx,l4:@[iR5Q~{r#F˯SA7MWKD yy ,X#M]Ͻ-s7(B˅]{؃A?qLW kWPO`*bj[]RcNƚHǺo9%C[}r n׌ǸXrQu`fLyGP%r#ѹѯ cKh띯gϻZCg;e dX3CRjYal@+ՒCl78U+Ho S `['|QȹcЫCs7jҁF&:4<{` M7@ }V\yT^/`0wr֠czS瘌(5)8ϑgV^?G͠1t4`(y_1go2B4MNXc=6JܰSz-kb"Ѩ(%U^ [ӐLIȬH#z3^QB7NcdvUŁNx5G3ZTrv,1WxaLV00u ~(!ՂǐCQy<g<;a1UH`!dXm`\9+Xg^U^ RJԡy,_A:NTf)gpz@w\}]WFO$LNJٲ$H3xG^q6 3uM3{;A cv^T^%K}DjWzz"b1$^]M!2o 2|sؒNO]dth%H(F}4b =xTu\m Gc!A\<ȹxa\Lxۦ pwdAE,9) p953eiq-LG&C_Xgk@e't}.iJ= 9#:ÂHXIdKs. mɚ1=jm@byn:=  A\Yx#y?D`r|P&IGtb'4&bu8 {C)喱X@A6M]GK'ެHzK#B́Д0}ЮH*R_G)y`EHbe{;%;Tx?[OeXaLou&ܟBڔkGӥxwk]8BLԜU"4oGH_:I^Hk1nD 8M68+ͪP;;QtZ;[n_Xh #Q레d D:F;.]Prr9Y|̄`fn[K0z{ i$Yz,1IנncQnIq}VׅOXJӓHG=`s=J9_J!]VrEUϪ? wC #Ȑ6+S/FOh`O|`gO)tzlvEЄl(6QڇH{=:I`^I.bދ8Jhoyu/:Xv9LJ\~MwM̓R T>vk Xb#e{Q@!ů룒r=_3&{sPS#W47O#f0@ ;V@æ Ǎ_8`|EѐtsJ$r|"Ie99 _gej.&Yʗd 6Ɠ A1%f;A`23&Ddὤ%:~ KO` p8]tx&."8c[U+yo! \rpONZ'"ZߚrUFG-yOB5s0R({4AYJ\d=UP4+n!=jh5 [RԴuCg$wo:oȏ Yr> aKb> TBʐ*)Z@9jCۛO,vJ ooj+9NL$h~ة"rHK[B dsUKo$@ RrNEUO+ oqqtRy@xN]PgOh+c5rX*<[F~O/IazMH~( NP;Yĕ Gk7V#RKZ#%L S3 ꋦZjpp($U۞}=2}ohNy<篒<7´p.д SzgX!ȽANr" ϠJk1Up 9%E3RR)qU^я 0?ɸބ# !r A7LuWN]uDAaxv"? ̗YkrI9orټO,PTUlśYҷf:#ȅOɨRxO<M7, ,mՔ5slUcD`uuAq]/^/敐@~/P2|k, 9CEH?SbC|uw/}-޽։-FUxQ[E 2Eثٓr_sp @bn[ܞ@[O<((9 @K2 SAn-3U'kQ0=q (M5pFV+7ʴr5)a^ڷ]'m#j`s v#M>\K =+T '^oUQFZr2k^W7mJyMw7GčQ<${ᷡ^0Ȼچ| _|O)X}0遟 i~ 7hcIteqRVuyT>r'Ո4WO Ԩ$˕t\`E24Q)J!V\*.b_Af&:;K"Uv?Ojt"* '+. `YӟdN+3~t7SY~iE{ʷ0&+ hX;+[]SG/?©mO UXsۨg䄳qF{c{yiQQd)ÉJk5p 4L;s45g= {`"Mkrz8 ߟ-Һ&ܘc'X)OtJyd+Y@al|+s[\a9j0cb>uP P!Z.4v 2~P_>K>o}j' !h~iFdNw.xGJ:dÑ&a10| p0;n`f?dÒタ 3wg33do@{ jC0gD<0k~ UU i#hWlN GހNru*.dlZ?erhuW>uyY,Ѯ|bSK\X3c gv~B2?xzau}Wj:Rأix%MMPakܱM-͵P|"܆2oRӆ31/!$%d ܵĕ!~TJ,PQ=䪶4pm9/^[ێ,":N\;K^4TDD{Lֺ;]6W ";][k:vmxw{po߭b't}\Am70D*o%`Ӻ9OC~hLJs&u90u '}u}!;fXZzϱਲ਼9t5"[Aߨ3 g[O?q{];ɒʭK9A B@ I PE50$&圲xlۨ5gDR\7(m"rIlaY5͈CT.QqVL::7B@];RJ/C5;j݂ ަK>N_|/kWmB<4L4ܡLbV i7.{ ]\*=wl(Kкd1}:./zR[ETœ_Y*SiƼ/D#:c35OMZ~#QW\'V@1R3[(nGG{I" F܇-EY'4h5fy`6'YGC dZdnix!zR;;cO?B?k_lX(kkDR$"}yTN[Kϰ' +c)TO]Lڳ3kZh:&6+x-ŝhk #xzKа?qcJ}\%s$ab&Hc̥U?("̇Sq IjN&*K2$㗰/BXHsW,,SW|: aO|5幐}~gvC: =SdQ0QZ.[拹HݱLp4 sqЭcWJ 3 ⳱Tio6f.Crٷh@9l<`=tZUS$IwO N6"Wn\>0l/GS-j߸lgM?z M+8ڹaV?!B&Z"niL?27*f;5>2^ L'ʧ $ٶP@We/T ﯨ>Xz!G i 1\ -#.r,%kCG9;l .sk2r zmۿpR(S8.GL+*Ee --a:k}Ζu4=ljksԪ:[R'i3;= KB۾)C| aTKC ݬ Ndzј6+m/x6 `R hlwp,kya@p+E3|.(ll K7{].ӡoHCW=}Qv'(]hey¡1o텵K.0Y堻sQ uC kN$m|LxPL MH8f|aDĆ`;c@+!Z y7>nr;L P:arVwa Dm_0Մ^G;ͮDLB‘)۾=MJHx^^FĔæb5_Fϙ:B< xվK- ;g {l`^ڎȉoŞ֙H_.D\ߔɼq9h<'J_?Ԉ.Rҷ(ti$aн˯ 5.IrEcfɉc>+?V9p3H@Pǭn3O>:꣍U, N~ѳ_M0QlSMъ>, S,U{).@o/Cr26(v}= f*ᕴO:E/r3XLsRt\뗋\A{Ju3*Qɛ\NeWɶʹ4x_o uqbO=k{Sw_@?Fw։5.̿e5< =S5xjgELmՒ@$@E`AIAlLLg5K^$h[[Ea2`뫹` Ѿf45ebY2̠O~H$:@\=[/"8!L[cvp8ϴ zz8Fdy/$S6@m1é<ãۙz [>Q8g-Vw=[ʱ$,D}CZ[Wr^:u^Og_|TJحEaZٽ鉧)KFRfwT\<;UIj29}b2*Ӊqq3;%nV@_4'668/]m‹0 *:B\>&KludHL(eHeUҕq\Ps9|Rl{[k#shF&ţ`vF@Aiw!8f+:lHvZ3t wE]IЂnrsƟLBKUx<;\V193jd_% `1Hbʅ24|π~7z~pwuLhp\|H#:I{\1""g&Z"aQS=y&S)ƕ&^oI BR5Cp^n]x.n_IG@ߦ,?heoqŒ,7{{rT_-a/,՛6*CN;'m3^Z߿Z|x9dG5(&CqTEGX)3;zɸB܈QJH:>14M2_t1~sG(T{.!8"G>8|ܶCF_bRmiG")8P&ϼԧ[+if YtOzcLo8O7ti]n#GooQfgCCSљz8cFFjseBs!e41;[t[B$ Rm_?h`6hȸ|8Lchx. f8u3rtW 9x~=Z`Aӂ*'d 1/e7)6^ vP?KO >K5ATO0Ds[D8<[JF xFz؋r!դҥ21*Y)ݘ! `|-0G 1JK}O?h%1 JH6̣,[Vw^HIgk-ڍ_o!wl+fj"/ Z.YWEb=k;&ûKle֚Tib 1XbPr幇C56)) ;yy~:Htԗz1Ça)) DE:~lk[Nf5ciҲO+F˼LC7c^Hc2mZzCKÞ4ރ#SoaA+X؟_NaKYQc#K ɩjY~򟗩]}DQw`.;GDhA`<_0){oVvADP"T[NjNm6Rr#"AiFQALm^AbP3d.Zӛ5Y@>P5A~R$ÉaO',dk™Ycpjcōݛӽ,ۡsDgʟ (V''}VQOUU6UKoSLG9[ PjV>DO̡S=cqA3[}}4p:ŧ;UYUYPDsv3g>[KmdD<1P*Lqv~,Vڰޚ w1P36!m$r╚+exK0'睧{,e#U"M'yGdd'\y(AAgHRigjA5UXEg6iC\y}Q9 8,#\BAWU1auA M.MqНpe])u*ut\0Bj#8Ai#I P G0o 2 [_b6`y"iX%njrۤ.;%뜾tW|Oq ݐYX]M-NwAE$U8Nmi? oR%}7TnQښ lFcģ㊖j2j8,tﭓ*d1jՈwNҋ6d1 d QO:)S.' eo ink.!kUE)5^{/fF00lVD* &p; 6[ s2uB=9{-m]2}I'|3̸t.%g3XCWٻ+jCYхĒ9TEKcbˋӕS]Ց8h9QE $ΘE,n8VBu暻(m|}E5_ ~]8[ uiZ-rOPĎ|!x}9R_⓶Uw錎Zv,E 8_yMm,bv;)MT:m2]eȿ ynrCG1Us92ItpB-ټ (J@h<۰g9Nv^quȪ6WfIc\:%/S(|Q8Coޞ!ǂ\S2HvLǿKdɱ=0"0ߤU-f89b}p^6:*[V}2߆] 6C~rjN׍Vpq]kޤDy2:K9M5._"|A[=5ʓuW8mhX&cgPb*7BTzF*rxA@O6| Bzjz6E&P޺dl+qA0W G!GwSnDŦ;[t% A;n k2R65r'~CW؆l(H`-kǬS O 2)6PD"5KmY6ey_$>0B3Q xtj X~*v7I=,o84"ӿ|+⬲剨|8sKO"`ٔ" Ĭ?L#dʅhK_`sIo@xfB@!2"Թ$s ,)jPurҦ'Hq!5c/D;-Ɍ}.ي 0S*]]ܛY7# S1z=һGBm_ـGCv9YV\$KUKy!tC14`@&&qB]ƅu, 2C3dR^z(Cz= 6.1Zm#I5! hfIV{.𨍦iOXێc8(LkZ;*2 OO΍ 6tP%\F紬- 2PC y2{8W X@qJ<14sv#ͮЮl,([&3ŌA\2/`_{M:˃I>n̽W\tpsP y+;;~sui0(𰚟@}iݲJ"-ߩU7|W\zH`xCȱ a%QMH)^"t3~ctp=%ַ|tjvJ F~w*]!eDNG X{tϞl8ub17c6^e.~]Xl qk)YZUnsk(YCEo 8"Uyn: P[J0$>j o@Z},/] `2s'Pm('u ׽(w,o7'eg(-+χ<BCy̯8xY%EZTW^`˧r? Qwӵ0z*(l=[+9Me4|5b!{2Aj!S,a_ܰm%]QZC5}~%F)=Go]-M ax3 4u)Y%B9jl7/ĜN3n9e/xFhQG땲.0CC"LZIWBy4 %z'Kc-XhuTq[b*:!fP$SmsչqΛo]קE"t aoc0 !l|Wi}t.W2|P9T 2pysS}h̆Vo~"th9)k&1Q>PLV\KO"<?_U6o N!dAޜO"qHG=&зhR7M-v(؏%QF"mQi;>pZd,5L~[xu>P֑Ŧ= !^ǢG=QxGPi90i!.0fY6'I=a]yoX԰ )4e4eܤ=Ѽ0y#h$[>NVUäa#p^n?Zo% 4,fW{ڢQb,߫f ?몞^Mp;mfFsUw䴫Ӄ6:tR$Lj/c輛{QKQj>߱RB6F틉31`mՕ6OXA[Vm#>tnծɳ} YIx4M˕ ,j7~?l*B]r)R\$_ _tWQ,TdF 0v '3rJh=ʺ𜨲!3b MAOgb ( :>W`'g>> 42ʫ9AY I>Z&\`\.l%lPeQRlcՔɄ-Z my"0>C/ӂoI1rZUnkt_V^OX-.0^U6G5.s:%>;4q7eF/:!ܠ9}h2X-N$5vH9R934be_Yu_־1v-rË gIPK~JDcK FT<ܜ Ti-#;HZ^fLqg%2x ]Bk Ovۛ;][*PI6I* St ~ClhGƒp&alGQ%qIѬD-Nr~> ػ11AVI@7IK(Z,[ЧdpN Sz4ƴrͽO܂ \xr/h9!MMrN=\㙎0-.Vk+$w@7?\ i 46#J.O(qz:b WoMF޻nmG0vGTQzQG7+w d\rW΀7^rh +jC_:(,zWo+s"Lx䢁mZ\2۞37nv@rw[*!Yv~43 UX>ƃ_,|%SӁVoߛ-nLSoewN)igq(͉^<^HN ^nLq(kR  [&.<ɓViY!^*04>[ڕ ,$ƭ>ߒOl)hĢR#ͥ^g-ZHRÓϣ K+RATvɓigm~%uâ4OJax]-0 cGQ /<; Jc5`88D`]j5_8Vs6TJH4$`fQ2s\;3)}Wᕦt`qcKʂp8#Zedp*~@;QX]9kxJ:'|LlЌקN.i|c.m&bfX́~X_MW),phCjx 1Y1S=xj4)Df\ĿuCk{e ,7P ;H` }!"g"E`7dF@F9fOW KXA#Ԋ㷌,L㖈@ KZWpPb+CnT P(ȧeE2X"a[~k ~"^(:B )b=IJiLZdӉ؏ef"vYh }3; nxNҢԃ0G1/ΥupډۖgdCHnad g~V)Z66pm8'de7ۛLXbC#`3 {$$m^+3y}XPvNw 5ueˑXWqEUAI@Vej࿘~QoP*k?={58me:ە$܋o<#=H]Nyoˉs}ӸI; )g`{x(Q̆L2,j_/}{;[܎θMu@}k:LӢݭex1:61zKqJnNCh7}mp.`ɘ(#TOv{ǾE#Аmd;dNOmw-rT!޾\+w6h~TI!l,.&D)ǣ9ُ#ibߵ8Y1g 97(o pꙑGSQ'>WR HRT? Q{KXcy6b[sσbʂ@ iL$2楖D\D4IYz)PT6WaV͑x|ErX5t1+i @}OZa M|ǸΐtnΖ~b1@&ّ.d D qCTm1 6u8Rl>ngf/E˲gN N >'PPklE ]|6,gPN_)N/mvB5jNU>vwsRCm\D RAP.h1N%3Ȗ%jw=أ)*9lƹT*%wpГ,Ȭ D%5C7ޘkRw|gؿy6TLJlK4FO?L( |zӘߢ{8}Oߦr.acqwB%/r_\H 21:{d噀̇bPwDԅʖ_X]5Rq_]>r"閟VK?d)Z~SV͹ZtX{}#*4Ce}(H)sfƤΠ(y36b 5eNRd?wO6U1uR y#Ma5qlN|.82̘rBf9Q2 9SwF5yg&~N^Ҷj[*xbئ+Y+'[QGy6ZN{K@NgeE(*ې}JHшl{k͓0zU4A*nȺdV̪wy@OX?O9e J9) *\֐cīJ+RD>Dg BlfcJ. )h޺հ\wJˢT76N6HVOf:PA&i׫IQ}>X`<ɻQ0S^ fCT hQAMf|U3J͞?C2eϣd?? 3||ZTZ@@gH >O?8w]Gϓ*\<AI Re0!wcԼVE;=[NCڳt #V%HJT7]ȧ͗A b]$N,'0fց<-DDdXlilBsM^ڿ>L!weoDb(JnCL.RWme??/FQaF,F _W.X`{pz̀bQ u~WXyTl. 2^p{zt>NeU~v0EnLAh&K}c8 W1j\k|{a E! 0ûO b،$R k%|nx &sxN^|u_=WjҦǬ>BAqT0s4dOb CI~/ նgcݑR*!ϟd;iyn di.ũ?C c `dћowAC qx(T]Lb %'/PdoӑbLTRq8Ql"t+2Z) pO0]=UI?1lѩ ~clR.( $e&pp:5!0& N1RA2cWat̚S#vm"֟h@$L^HS]^ (DQ#e+GnhMipq( BQ.r5̅bIN2*6Wrܮ)SßVxoO'XL2 A#2b_H1iUTrJ{!PY9 r^Zؗv):ܓkLd+Κ;8UaY .smݏcU:+gx`%;]=MsKx1Jhсtbi^\Z{a}9J#ȥ%x "nn 7nI!v5h,$)e-0KJRvo[?0 -5G= Y'paUN@yJ^\{ޚ(i֤ }!l(0+$=G[FqQ3(9{kZu!mtf(һX R~- w㣄WDoSN5zwx]c;?,@+~ɺ|g+IMNWtR9\wGsHeI v譎n(=KoȦ!#nJ0|w gLz+#/EGG0 "Ek/?PFH [i9xy i Pг !Pp6b ՙy#FY-; 5 XP4|VWea󟽋LLvHbO9_Q tg0yDbh:=j'iK< 4Wy.׾Tg~ 4~/zްC͌WecZ;iZRjLV*`i5d&&>usbٙ5Y==}hVc8㵘xgWYH 0b3KTOȤ "XX٬vEL5 /+T%CtX@* بtnͼXs& Z2k}ck#RI Cuɳw@WQV\@3+ԦGL\oDτL7N,U"q{ >wF7QVp浆 d~< ̺049hfB|3$ %>-fIJ՗8ZPoD>Z,,~rAi@n;~0"QzS%;ko};]Jv-s_؀J1+Pf?)Jݳ+8%{-ıK~+ဆW :Jfɛk] ]ԁ[^(&Qqp>»o=NpZt衿 pMo̦{R,lT9=;Al< a2>oY^8_ Ȏ C vh'e6N8lJޝi+xu !`ISw3 s|E0K>lSbC/$qO6}p=- Gs7*lOZ֒뫤(\8qRN/0XIqSYaN1t[Әr &[>$O5awn#%3O%5 O+WPz /'5A/lYD[dm.b!PiGw&lcɀ_.'_:S!m{kR\#m Ͱ.<ロ4ljmrFOl\bZ{:KCGVMO(˥@utL(ؙ>g엉Y-IHnBSO! w c=5 u2pֱJ݊ oәiB^z,Wf.S=U 1+_W &MNK!MH&?屳>IԵ( *`T43C[`CB/kw٢b)Ֆ,%bIUm ]c&_435*Yw~sl^3aAE*_cˢ+kjKXj?8>3gذtm&w$wO6N~j8_L`eBRQtsȥv\|.qFB`{nve2ClGo\ q\X]HqW(u\?^[+tjXl(_a;r @mazzx# ֈīx*# I>p4NK1CQa ^:i3F'ԭa+E= H?7c2.o%$NUG0xtm2=ov,nܝ4']~Cu+GPVf:+ALrLVI%0Me YAE4L!nU;H ac_`GPL#Ϡƙ}o, ۵Kh'=WHgZ?́8d뮙DUj/uG|]+X3oɾ-z[K4_0y@Ө OfDVy :!ONP;^u smk L^p+~2II-ũxL]TZsyہMIL'y)4>#` R!Vb[;Rw᣼ވ݌y\2 0vPf߹vtC  3g9 b'Y tI 2njn%m/nSUY۩%RYK=tCx6 咒SDIͅ"}߁BmUoJ^ti8_)Lm "PK] 0dtz(*0tF,dƴ`8Kle6HTpn=QQ02ܠϊ'M? AO tnK0=1x|\mS{N놫_~?_Y^M&GO[70Pyӱ~ 1+C_Իq/s-YzyklG & n r06A {dʫX0 (kLz :=A&qkhsXrTE"̲8w' GpkuxB$=~]fmX>#{l3+ԭ&S5zy3I$n%t{V>5PU1*p _)'FbhqLwYac/aߵ3(j8g?_ڭDؐӨK7jH) E *7FX_;W|L B̑68JP+/C,TmiozlާFХ33aױ 6EcQuྭHAR_>i9d+kV3OG:M HRA@~Kr[&]R u,+E::rgx~.,YJq %^d|$#]:n,8{5|:EOP%8o8x}f4,}@ٍ 6`f0o J2wޑ1c2hX~-^AJ=:DG#'un"/ȁ"d `:槸lK x{ivK.67's`Mϒ{ŇEO ȸuԕj~+{ p`BjZ\ MeܿnB_J tnx6mDY QXÀb=oEGdwNJXЍ:j_k #{~2n~]-˭?ɧm[)>H{,"M5s 4 ڥkMcdtO&;G} ~P5`dbG%A_4>IET!Ý%WJ݊gH&=aR@RVĤAoN9},& @mbMLAwtse^s.)p$rIɠ&kYGɉW D eZ/WnDy(eH2Ъ yگͶCl)V0'J\ 3ٕ!N&>#ȎTDb6a|,#2h$멌Ɯ'Yv 3Jhmf͞KȘ 3X*G*+D!R 60ʝ~Y[\ZUU i<02uS^  71n֟lG!\-l"MŃO,z9՚MܭlYlGvGL!9CO `$H ^4Tz!6z" A4ÆQl%M\!R Q$ϴa) A2MVV(&K#-swuWYaW2k& BN3{+>MS3r ڂmD8jJQN-nKV9jkD՞{ F$j*ϴ6^݈!=";cx+^me2RmtLJwP0Pt@k>=t|;_Ih0feaP?(pd9l% A|p+{g;7&4V&D O*C0+E*v$"NuxNUi:ECAq'㶧T:Y TrKjW%q,k |$sQ^WraF ǴL }ѤpJG=5ڸqf3z8A]!f蘒uv쑁!" 6]Fv9K*c]~IɥIg;dqG/V _\ tBW+3wЇd }*rwa gb:ҵD4X2 ʸn$Ҭ kY*1Z9P$9׭_9ۋsxU]]WR $Qe7P/D8RZpp.rQl7M"9 Xk UTq9 ]DA2R5RP_|mF Ϸ5C''fJ l+ԉ Sēv59V+UZCRikAVRF+ߓj{k _ĕ ̠͐c&]ec Z@tMEzbrNCgLAFK2f>9 v_& %"3O  jB_TqI9a y`e?dg (_%aȡa˻?0{tI g4ւoMvln0حVV4s8c (xݍ #GILLp"P"dcpQt)]{,Nj^t< DTɩ[kA2_:-dtg;l{ڢ:92{"["<BMr3mÐxcXM̩ 65Z jUgCΞbgS$<%I&b?7 TBpΤK< ^C LVW=9x肀Jw j~&gt-q!}!ݽ iP~zާvN&Gr }J%lU'Nk9t U+5ǹO#D_wRdXߨOюs/Frr9q-QQDA=VuSGjȬ@?CvDX<-F>#F阕IKvXYbfօ~dM`7E-,K2x'ܵ H3@ Cy9%y# WBK7uo ,vG5FKxx6dBq VPAhH)Y!ƉQџf27m6Ю)o[\ 7%Fo,Ï㲔T攧tg0˃(K`(pypWNOp|rʼx[P~m 5I;`tP\n4'`p Dٛ,9K\pqPmnV|SP~͊pw@^G aI^tdUu3bIVi<ػQ'?s#` 8<'6P?!}D)u>3u`0r?ikM-6=1f452C^ yi=S։Kt3ʞral=15BY G?kEtst;%2nw(NQoa{uA^I'~ܯx1QK8Zt_=KHYܨȆe]J_FXMa#JXXa@.$?ӦʅT 8|E'h?k Q<.2>Q*HhTy/x%tԣe] e* ] TzC{?*U|# W0w7QԃUa`w^G۪Ե2(d{ 8֔>TI˝0Z\Cpm.@WXSO ٣ oL9 ٖ5 Q!f qxБUjL+c &asZQH h> ]{Y8^0L{=ՈѳGa8ԍ>\]QHW|! ީeOK}7sa;:0Igh.jL?z| b|`Q W /U.=j%p5o'(sU2ŋkR-Xx_3uiy)hkb򮷪OcL&Cl /u[r%L!f#€N}ٍOPJKW%Zb)|"|x3؅'xG 4t~"X jptבnap(aT]R⌛]:K.&MhOE%YhBP䝪e7W %xCQo+ٽi"̓r9G(Cẏ d{SI5 z(|l,FMk>^ _y _p.&n+DЙklHfͣd'p"Q) GH]?!u+uOTCU9B^۾l"v1'ўlG<0eawKg ނkHƕDq>>yvD R$7m&) A:'.(K=F@p\a0*l£_U%J mR`N, . QgrUnXO}$I7jG2|AKG1 l~GexP2u1 <[ܙ-a;}+0bFl !9뛒`E}I\]~qh5zI0)K3P+1zpC@3|ik &>cGgv{ 6FRq'RVoјfājǿdovt{b>xTEbS*vpJӵvlk8mp:^_Ei$M'A,\Oiˑ2[ym8#}O23;Bm4lw׼^MFX^[MXSRB}n~{Jc!QZ9{2+ze/~oֻq*TRu[[VJ:8eݛ ZtL>̯= KDr)J1kB&4)cio_NlVv8P8 UR2?>\2\ixP3htCk6OmU+y3+iP_ӑ1|Ё|Z;r4>>It5841А#4?g(CShQ[gX*=}HU=}jjڅyغKk;k)ߣ- EXrOA|jܶcz_/eWŦ:AMe称{oË6Ax0`,oj޿2¯@~lDĤ f Pmgó?;7)L ϊyFlRea8knXI ei\V`Os7GtX; t]$8ZB1>YMG~T#Qq!d]Gmhe%|塃Zfzv\j%46ɅF[ _I wBuJBߞ_!7t)ݜ0;ѯ@"9\UjJ Q!JTu\6oH - !UvNA:q38 <7yNh{S U|ijG2xbp  ZODU(/`֡{ ZYX;P(kteyNN#እ1짂(&̭̐[,(]-GOz aNjߕB;pS%-S0 *x8Gh%&f /VSnZZx.%X^~l\#ƬDو86~t[1~\N哖EthQoT[qvO]D~˽=uex]Ch@yÎLmibE1s( =6WIt֕Eѝ8QmɪiB.kN6ĩ8rHdҹflI'ZdDG() t&2P{b#Ĝ 2rpIҒ&-JUC2rہ+ CvS 9[Ѭ9y4 XT9jh=hý$ Һ,&}zt/>n9L¡NOEÃ[JNlVc!a |Vjw 뾚t_vuO-K5D.QU{Yi5.e}BҶФ?uXH Wtd}gzÅ{Z/ %JA<K1vFfJx-+) , r"g@ψOBtoIg,@ i5bg~enڤA!!0ʦ 8&T9`xgq!U@ xpTO[(g;Žށ5w)U[kD'4GkZ6sBg " cx9W[> t4 Jʒ5¸o{79Ǽ4:e]ⴳr2NqP}l>v JBC I8szUUTy@"'pI5e#yi$Ru񛡠Ci5nl7{Z7y틨}s:C}rFöBV=~@ۏcƻq M^tu\ޡl `IDZZ7 |OmS9l#Dv`^٦$*~):NbW ~3f^m_4.ӈ4ћ8T忈ܬˎ \5"\̀;N$H$ѣH<~:=#lAmFz4ft7\fymWWtPӸ?.OCg.E[-,O/nQt0#rw:4m1y6/F3G}N%Hw0p W' b$.rD֗oQF, FgrڟBS]{k04`":d=2 R_#2.*k4DgASsϕ{r:?b3֡wog 3$RVY ʹ4' 1:rOD)^r}:{/ibZAaO4QYKH!ڟ(jC_a|uZi {[(sjQ\zpe_jKSa>9Q|kqȑLW:ME$ SZo6J֝ b(m6ಘH4c*fG"e?M;#:G/ !<S^A{,Kz j.9{H}4]Ot5˴nB&Lqj j{TWUnh QuxF(^Ox҉EoJ )\蝹; QDi6bq G]Ά[`V;C`;OL(.bF Vɸ:x{Rii![ o1_,7#RuUv.yXY H1g|g`T8~̕B ՜4 ˵$]==&'vQs@`c0RAx:\cHM0+tUM? UMuwBɲ!:neX#ejnF̲ ns63hI%gABryI@=p^XzN.$TnH TC7Z!JܚޢdС su_fz:4x5K{I Q aX@k;v|HbcHI9JKWq\5弄P5~ +uBSyӼJηfEKAՍ4"jM?؂%`1)U"_ lY3leYi]x(lwª1Z(JN?m+Gu/θnl d5&?Z^h1iPcm-VOn["ɏ 2 Nf9svu.&[ay(I&ۨ vw6EƯSNᝨbTʒeouB`Ȧkw+йlyҫ2Hݪr(*2qZn)?:Gqw;>eT %1:9}fUCGX4ss%Ҝ V9r*)އEO3S%ܳJJ곱0pX]$oE` ˋM9hNoWchxSȉ@u,N"27f+Xft"w CK:A~Ƨ_RzlfA]̀SMqӝ0}xU]ŧ\0io3%I;Hp ƶ%7;!cԙK4C D^/y_\6^2 h,XkdY Ax)rBqBbpisO`AOn ͽ5ׄ)b]d!`1-%;N=.E 2)آ,u /2v0H:Φtus' Deɓ)$k?Ab(DV(Dڨ_F&z`-C lMh^+Pf|3dP$9:)%gBis-V*:<,=G8OյPv_vz1Nm Lr$B_6y|o D=p4tìOd;3^=+= Qs}uZ֋~ UFp<Xj"Inqx8EugC!oUVukue)CE4m`4(xMP1MsXbs+yDÔx{B~QEޑ=g9 t1*J#C (Ԋk]rGX٘_g䁮b07}9HFٙ"uadxDqc>2wK: FZJT6tp SyLavc57.64.101s\Rb>ۿ=$.U54#A,B (IE <9g`KJ]i0pP?Gl 4Xr50Ld{|fP` Lh6!-&q7$щS'x RCT|mmFj.X^>ɶrӮpLz*eZuh竽ϫ_Gz~w{"`Y'!&h3Q$G.g.:µK | d:]38!XxXib<>O2z15a;,a!`vN#.m[L7M?=_Q7g L L|q M#gǪGo6U$ w`CYʕt>SOo@aa30S|$$ vKG#bL ]grlJi|A\ܬbH~jHq ڰ gpgtx\9(rs߹._#4] # փ4٤+Vnk3Y--J=g_ ~si}4LCOafZןGό^RTIQЪD_B?#} abs@M@PV 4Y, )LKR]zSD@yJS[u1Z?!ڙ^+ڱf)bKL ksUXFY7t|Њ$w B[yk}v!h^ S)Aj)Sܢd:h?RvqmChU7,fkA2zl",U~Q5~cĜ3XtG|j[p^G5zf:Va23fE"i{0틆LS06jnF-П8KnkR=c$bAU:ݻv:'3fR3F*ofz3 &Ք(T1BeVXN *m H]Ý,nt@wxsu(5p6<˓9 >OR!\~BI턛wS+A>zSSx8Vzyv7#5"cw_y4L$u gKiߡ%13;ׅ#@fC;ma`&V lCRzi6ndMNDNB E)#P0O lSoR Rri<1 W=l'b5GYi}\ ~6N7l]o_IrcN| nYM>+bVaZi٘N+Zzl޽YF9H UY~rHOag~|{I^L0B\ j-Z_w]Xmm(G-f¶qICQD[F6MriugR$o?C8*WNZFfiIotSc: j,wRb浺|:ƂbtnAt7G^R(O%/|=_p=˷K,,\ >tOmU,߽LZV Dwnɡqf)liĤ靼:.Os摄*.,&*g[ya!a_"`g>'h/fP]؏̏0q)~LTab!!P}js?#\XlYĨt{'w`y3tjfƓY!cU/YOB׷{KB [0_B ۏo^a `uܰl@uG`'J;#AROrUUGkIC@w9 Ndl|cLKM& _.?+!Yd'dW^ՎXru~YIyүV+1Z0ʹtZTw}ʝGnLi7jhO [A/Tn%,ћR1!ȜY(mF[ocXŷҺs'&[u9e2i[% Yƈ;mbK?N%9}rYzXZ-Z5Hf]y¯O1Ѫ93{gi.'Դި" o'aVXk"{3V&xtkץ<@8\uaՠxs]WsVtWo ;Oia`Yh-P3{ꤚTqҮUZʅwippeE)SadC>#J=F !% PTeaqB%Rюu3IlIΪ/ Ȫh fCr> `:>z%> kࣘ鳐R^D. vxs0R?Z EJ'\j_9\B񣨷 \xL Db E'P~wKKWj gt%gh»U%y*G?Mp`OR1mS%\ڿλ2V9S+áK$ckż&O;BȹuzkO_2q+f@ӷ%;< )l7+7vqiwd^mEŜzĝ#@6}m?M *)1&ϕ0,XMʏB'וݶVz{44hF; a'fy7n9䀛h4+fV0OYQVAy I/N~è]CA7rcP 0֨&V=Mhf1 ߼b IW6<\!`4m;f*ADbINA2n]w'xCRhDTK#Oe]dؒa(iҒ%&6d,e,7kjjPIbjTH[ya*GoWS ;&QcO¿{h&rNR4L?ѝc׏Rb2*f,u¸ @ gpsIp" mmg D;aiInW}SH7QY-" ~ek"V-j;8W!fqsuDOpPI;#.?t=7#aKT vCe*o$\ji+AODt>$s`m. ضTohQ k1,"m=+&]&)tP.깸B3d27ПMWcI;v7 l=AaŷLlj pO}! aIMѪ-`Sh,p>> !;Ai+"M]lC]>e/rSџ؉H|YԠI&`\m.?11 :o|Wmg0T(ӯŭ@D($ ւnM78HSMGn]Wm߭anXռn<^'\8hs}sG'/{6 C 3͵wj?6Ynvi|<0d.:1c*0ΚZRP[E}+q<<ou-QSN~LقxK]YN6HCU@J @IrO ! v=sH&Ps0Lҕy;-{d6ܽߨJ4}o)qd_p7 J@)fA"`edi35*=5 `@O3~Axlvfe?eyXϷqG n/u\N{!jىV$aqz)ȣrI_Pb Z!eu(4"BǬi9%v߾|ׅQu2dfޢ١X1 ֍`Kz1/[J_ zۜF>q;JxbHE׬{S0Ҟ89 QBXd-Q3 cN XmwS*8aưLp2I؋i|bI"?OGrֿmwښgFV6-/;.-$ 8gbֲ\pU`Ty66jq˜(X6n1;F)WFEغ\|yAro'F =lʦw\?)] Bõ;R-|¸ra4oz"0)cQc"r>3W]292qZdUs?gDnZJ $Pp}3 61+ƄfKAdYa@!T! K:x$"fTJ߂[.qāXY΃#օ+ܩAoܫi?H^Q{ :qպ/$tywk }8aiXjZbUTg򏃨^^LDu{.S [k:_֧nQ+#F)oz/' JM y /5VPݝA*}`9k o&J ؛(dSm1l{ޠ :"+[x -;)ul7 +zA-Qٞ_/SִӤRp%1wH*K NUd:{Z3L KRWxH|G2*AI69<_qCOY7_}?Mg|y-ط;eϜ 5zMό^΄>#]Pqh ะ[G8S]1f*KI{6(PTYn/'{2RCQ U?Dօ{sbBҏ n$7_M 8fI`mJ&P}N/V SI\N=qWvm!F%bvO|ޘ8q 0ՠ>9_l&^ݑf~^|P"㌌-p[HvFICґÇJ_a(0E2-ՍO}Qz)$L+V> }h/Cr|Ƭ3'N%T_$>51VUSk$[ s}Q5 k 0Y("b \= >\? /AIYz;u.t#$y ߡUUGc̱5K0< , K2}ΩIcqE18T-gwdtPP6-8,!O_*0l+@`5tz-g=)Gʕ 8X@ ,`Bp_kbxFRlh;W^Zܚ#k̉v9k!ߩhb3uw4/ԑMvj=Fy+OvO;b>r8tARe=D-ڜ([+kDS uӎ;V`{0;`L+֚޸5ReݳW G4ƀ (,"ˣ OQʒg5cqz?IB00 ׬*d&Al{ŶI>**'Z$Jrg3oլ+J G$~\9?WU|C'ا6e:Guϴt脲utJ A%ti,z n¾P-S-Ģit Q)a;BL'jO"RSARIAlL04ŏJ=LV=7pfZ6b<0pn4ݞΟ> g&9dĎ'h݋Fy/ln`IoU&ծV 3<4ߜ/gv7QM03Dm[RV.$JqZ oh壆\n)s#j܎<7pTIպ` G#* E"c=@:)~D ef&6{3KՊiCp@ ڇY~b-6 =FFƌvs6$[e)<|m3H\zXӊZSR+c a!_Tf q2΅ ŤO$+_e}n=&܊ } .ݸRy(R'?L,χP6 j*ЦlYg %0<[b8iʚvzл+;PvMgڅ[ Go#<ɘ}m#tBjG ƃMUC9:=MdtWV1id Pjh)I DхϓiX=SHzv&).rE3Z\U>F%ש{ʆ˦ A j:]B.m+3EQ %R#Bl&v)4>ѻ~yqV/#Gyd;uGQwT1Pk |h-UTI0.F3]Uf犖W1FOp>K!*jt&l)T+t;VT7NAp-UAzmep,48=Rɢ;}A^7zF]/o,|HCg"xO/4(G/$Lٽ,NjeL۪ei" #Ek]g9ن;%!7$!LgSnZwt<#֗ ^B1h.KIuPmέFJPۏk%g$쿢 V<Ϧ-=_i 8ܺ+^>u\&3 |g0KMFda#Q}}Sw;vvsܪоOSڮE0^A)/%?e⃳7W-ST/:&_(-#r'_!L`zp:||:e}i@YQϔ1Umg?7Wՙ}ˏu]04 4[&Ao !0},̛]g;ZKoۣ,o ?hz LqJ:m0==ώ"2,[\Hd6w$.{ !o,e,[͚_z&Bd;jQUcvQ3DQ2r Pǃ}3;F K1x,UߌMJ.nE`"z =_&3z`17V(yY;L(%蠔Y BxV-Z׆fЄ=Gyb( ᱗JF_¡by$N^ K-e\QnN XW Vl V;!9- >s擭.(&* e ZHi"P(Cq&oc z%Gl>KસJ3zZ^z͗-q&vɰn"[Ds-zЫ?*33/߄mǔ(}}rɏ[HbrT)<ժ21V5_W6Lʣ[ UhӎY1t3vuͱkJ "^AKԹg6a?}h΃dvKf{/ݏi"Ƭ.H ^/h 3,(lŠ*+ '/Kn(Q|zS;20^3QLDFٮ@-p¡]@y&uG1`RRܮP  .S!vk#;h찂)@JBOm_ؔnVۭ=Τ6GFoFueyd2~Ḏ sr1ב: 4{%ŶwX8]>C/GaSIn2J>l \Yw1 )CqmMj$[KQ=,CF[itaEe bʶ':8TRPK>0 /0?`m^Rahf3x_3/d_Y6O٨[XaA%UT@΁G5G Tdk +Myìs asbB4UAQa?`* aY~qNɊSK6.0jǙ39{sBB7Sq6#{&ҜgϾX]{ C䶑Z2B/mZc8ɻ&VY.b c'dHѓgG)t }D6p^|_ޔQFgSzY83WszիTqsթwlOUӢZv p~%?Me-;v=Byk^hNZ|vbJS-1_eܵv^wssVLd~sA_i[DUP H@}}} 4fCklό\uz+{q 3ҌJt9fKH|9p yG&yR^NG3֜'ӷ(P'7xƧe)5&`o4} UI!sJf86:=YAk4LIv1 L RUE >oXn v8t,#X+0H&"(&ϖ,8ATwgr7DoϹ.7 Ͱh7&07ed*{iܤ(s3ZB8]kpDKԚ0[`K83ǔ*fy33#A6S0'@#~ʆB}.B<98U(، 3]u/d-F@c2U(@9 ɮ89862K/*/$CHo ]vX&6%%UP{6iW[+GHB76ȿ1$Ju}L}+vD]2Cy+0~] 3Fdu## >Ls~nk1UZ^UEZvt|HaY[wb̝DN9hxCŃn=߄dt>vKM33i ˽[B/%zy!nJx\3HvX⛶^9L+IB$#߮pӎ\ĺMoRIWyu*5ɧ86Hx6,K1[n-];_l`e_fPޯ6; )PE} O+Dw\рW-h}>0]\n}ޝ?P }(TS HyĎ;Bfŝ$PmAOnHEN}ur6tgB*PyO{9yGFx0sB^3:bNފ_MWzi v:= w7'\̢d] 2ոYKl4z6`qfV5 v9x* NswunTαKpiO͓R'nW=vnbh̅kL)VΣŲ|Ua? |AU*;aS 綬 M3)"Ku;Ґe $-{qAIޮ^ꄯ``2"5F~GJCq1 yU7ˏ`e_NAx+]&[@jۛ мQ{%CLFd$tZ~Dz᧢Q=~\,Nk(4xb1lzزBjV-qIRq-kD/.T8,l@ԒF+rL ^R-e1 :t'&QALAQZc&ob0EhH,$5KmBi$lE:-dNX$u016k B{&O\UE` P TE|,7d߶D\նk ҫKnֈtuQABj>K(` n{Q k/ ;FSwmCb~Xehp#g:m;sp镅 ry Q);׋N6!H3B})6Ѷϖ[3c٬鲬ɻi\y!=`(8 |?2f ōOY"zOr"}Sj؂\E;9xCӇFIIO{4Ș$|7ó^4[D.1ͧ:,U1mE ܊u{bHࣞV s@SUv]RL I)e2%$]Vf%j]-TXAѱ2?)UP$(qF|Q"VW:k$ >jiݼ.Zp5KD 2 C;vuDZ>e0ϸ{^ L,6L$''2b98w^Vr+8Scl 'XČz;&駝n<,sVy rX >B7.4%%WtɻJ[cfVXЂ&F@r+N̙tiЉ:L[]K+/V퍒!}$.Z(J]c#[y?9u,&C`XҦlBq_^X*fX(J#0ΊVPy!mT:zkM`A"8<<,b[=VWd-;zf2 x}}-YC> iIX$L 5T:m&\سb5xւće:&9p7e$<{jv iǂ&v?~l4KP6׶1[c%ܸPn;'frC.V6yKJqA,G8zm~ο9}ڸD+Hw@۽ /YP>>wJM7- S6wo~=%6̤.UHn&2)Sd!))`h= јfр{GN~Tp,Ʒcp˳;]LDtr3 U,ޘn"ĎWctE] ̕/q`БT3#|APgDbdž]t*bsQBV)5bЭE'dC~e;}JNRձRVTi{re~$'3@ybDCM~,W96ǕSwFK#bW2S". f1~7psv0ЬvA],5R QP;I[4^Ǘ)i3EjY7L"Ԋpj-lY 6؜<~݉j%*"7gd֙n4)wX@ wt {rrE5Z͉W7ѐup )sG+BdJ=L擰QD&)X\ 7Ofb ~ƾi.b*Yt>_#:}e5 e>uy&Ȱ/\uH0nT-ѵw.am2CV5t MN~¡F) aX^ sQ]gvaP4f7}%z[J֜̈.gB[@GtO/P$_PY1פ/qR}i7k𙃓P%V`nk;&偞|#~%֩=; i.#da_?x09Cv/^1o/v5TWI)@=ؑ+7&˰X+M,G[[ \S´G`@*kG?SK }]l!ٙ!:u ؠ=3}YU#i'$O;Ze ,ǰ/@aIIĸ3rE,Ŝ b9>MliuҶ̝M>=NDlOkI>;lX'(AZ:,C?wڠ0 v7ک&V肀(("<-"xW͗|qUG.ۅ=z9 x\^!'Eb 2(m@eIc̈́  0[^O a`2Wd>gf: +Hl*+yISٓP L9qH A&Sˏ4'ر>`KeM֚rn-qd*U[S+r0?ŠCI-!uXU6~~7{%Ng1:k0FP{,[D SjJ #zF["ץLW .W1qyIayX0G#/ث9]Lx3{2 ,/%ZK0,/e/ć|XL|@2xH򮌻15읁Zө'QALO }Xg 'y4[V1|Ɨ>"ۑ!cI}7ݑH|Z|"{+!- 35cbϾ1ʃQ7^S6N1~Oa0s<*P"-9ѝrFJ`މq#k&3`0ֺ݆a"&[n\")n-okE}H(l8y2_ V b[XXS`䧵墡wg(>Ϭq\1yvI/?KvS-%nm h>I-L*)':zA} Fd+ 'Иd\Jn]A`ǿ=mHCtXK`$'-3rioZhmd@8&%]ܠ4_iu 2zA+;ZcŀE$Φa z%ߜ"OLnMT B S șI8]wk6A $&aJ#Rjled4sk|6oCU4er%Vj EV83)8۪g&7d0Z`O~/"YD%{Mu^,'#[JԜÙJF%mMYFA0W=ƞ7c}n^AGgv(;,3`>։A)0ۡ[SA4lyŽÒi(pxQ ~Ơ%3=k!f,Ւ|∻QB SKW9 ǂ5?Q }. I0zZVTAh".fg1ˣz$7.O'ls=qx"7o'! |WZ-i&}{>2IƳݫpm͐$ҔkST[[SDŽ 3OohZV8} d3 o=ԻOlM nd(Iķ~>=@g+.o^`w=Ӻ7c7 xFOyo>ˇu)zX&| 0<x] u#;M` tgNОQ;]A΄p:R.< wOPc\ݙ,&iZ}UjKcxvi|W5Kոڥ#` 9nXQ#=+ }D2>m& 5AGpE)v&Cu͋:9x hÞ!PXYdE DdI?1q %$Jk_y<=}aN%WxmY]n@D L#xJ͍>0` ݇E9bb B;IxgLQ-S-rdfG=>NwG{j?!!2(-fnDeݱ<{yz ޥ `,$I3b!Qڶ/IxX" <ذ]&iDZ>SL%NRfҦC\RCD¿瘬nzv-LV7p S;^D(ʜ1"&/͕k#5䌥T8M_یfv:$֙$upF f<6,MthQbd2+HBwG%Uى}%fM$&ڢL\ QپmN<"RZGg={Ta`Ce`b_l;xP5/rJ讥>[!c}`Zm_U<ف$V=\*IL͇T}~JYrHxI0[.~!5jG̡!uJ^, ʜ\c]h((YK) 8)9^byݯGAiȁ h.(c_KB]#?,;[Q19YH&`G༣'S,_Iϝg ژOG!o{^&^GGt{2djPLBۂvwp(#ًhZWnL0! m| ]~`xDrHf8@@siWٛ:i22A`g_iaQLĉ +(ϞqY C~@L=+LC[勶ez?2KMZ3xYĦ?AE: Q.=<(nu8oqEsSY4)Y`2+{fk 3+f% KR1,UQm"ÜUB*P_(|L)9 mcO0nW6eQy7[Pi+_SwKr|cn"8B d F3qy  .'ā`j`A ""$E[9˲t㱕9;/$B:9ۣ%cv&J_ /ûkW|t 7C?:833/LJ39Uu~@~!Jl&bi_hkmqC蹣 73Cp"k.߼jR嘍g$'wHokwP:K{|E|5 #BJޥѬ8vN`9j\6䠍?1;ӐC05'`/;48~\]pzQb93`>gcI vħǞYlLP͵Pҽ|'p`{.PXkؠxBAגئDžknEve !BR+@Rz exS_B!DŽv^xxVWGGeR?T-56cKUdg_ Hz@I__[y05>*/ˆGwOj+ 씂g^])(wA>\W<#kBeB@GuA /fUap$t<ғzQWTCf)ߒw6ܗ;NZdS%_-!o7q62˷޻"C/^ݗ&D*vkb%e\Jo2;|D"@w"uyED*-h"YCޗfq C$E; 7TȲV.xcR22іY;qRy&pmd0v}vω`# O̟=!V6E}C[c*r=ޢ]Q+?XUB:IfC2ӂَ5/mC֒,AբA ^#Lt5Ƙq/N$iܤdM4 F+N0Gmid~FN !w3lX31b>7mZDŽDCЍ*`$poZvF;urB)w>GZ-LJ7bk?ooE>~|Ez̽Pw^-nk̫d?$#dv!yZRSUB휛ch*ֆ75[{V =%?*%!sຽ2tAUnfLQ l: OtžTˬ9K`;u+FɐJ=-lY`y?MOF2Qwex~z<IG \;r <~ŵ5uToYm$%uN$xx20 Xܷxo1k y($-yLCU:xw_yiYC{R(326,gd>>p)E&".y>yX'G̢y3 i|%k:<8'. )EF/I{ygAAM ( ha쳁7 RiJAH'?ˎngfLe(rh͇z ?}mLhcPyol堺Roe'-k|b{L&27mҳߕ$,`hy˛]RF߽|3,~+zXPط JebCC*\@X ]l& 6Pb" 7gEt.މóh;B~5ϓYPc@rH9+IVqB'l C$~b\&r*wlƿA;rcMki vILF#:])nӺa;#%S>O"~]hy לE남P;VˍN4W?$zS!9Z,'-'.E?mk2/DK-%4(BWf4nsb5WO _)SƵ͂4X*x)bhIN!ko<|Nێ3=Yžcڏfjwo';3 0;UʹГʽn5e*eZF(vKkUo!X+U =&sYx$)RtraTEp_e>ygRF2|V*^A$.kYRyfUKM@?RI"f[].X}T drs;̏ڡ%; 7)Kl[T0*ꩯV4nq=.*os iay*Bt^e&]ZZp 6ǰqxdm!ER8 d[@"sOi8 [\佈FQëoծˆ 'Fm82DR.;wW+OKB(ǡ .9/iNjRppoc{#;_NS g ?exe8FF\ afvZ~9:$(D(8oPTMǟYM3-;<cyˎ\'R@sfZM%N r2(#u 0īn:V-q`Oȃ6aSY+ަ35fN$,# QiML]ԝappH@4칐*&jM콌O_7"@kXoO&AuB֏Ktsg| rnf& 3itk^y hF{).Q< \c.UC,E[_=Hm婻߫k| v/-{9TN\i2ҭģFn'y’Žuٌb[WA} l]P#r\Vv* 3ka/} Kb"/ouzM9Z3>d4_VY:(rv_whܧ9[/^߾b G?6컜| %tF?u0ѳ`aQ`m*or3qV-Bu'}Njf`$}chC$QU''Q.7,!# 퍕 _%Kc[|۫…|gokM(hsPE[tݑwt, ոQ.1#5 E}FAa|(*Z~<(x:LJy0YIT7c%%g=S1x׀(L>1ͬ~:'۝!qj~$8N|o'Y׌_>){gn.Ç׋qkCX)h S==S4:6*8_ڃhA_iq]?C)cP!ܲ^ƛ3ZJ2B78ih!;[_&uZ3D@ջXw0!SsFt8osB:FQl[v'RXJ(8R$#1+탞"*6uE --`*r,.W&hZh-7d#ƥeO=q`%VYu?KEާi%'W#a[v񅽻v0^U7P5(L1ئ!X;ʩ-BcN~mxq#:R@et2|}#, X`Gev\Grĉوi#'nwS>bm\ĭ8 T gOS$OX,܉fLuʫ |o# 0'T  1Ԫa//8ȼ⼱L&wn~E35'CPrClc'-(kGTw1 ҴXg|i'%$Ro|9v|PU2~CMEfgxד=!9*%j0ϠD)2j3v}i@" QO]mrG,ϯ#JEA^dh+Ef,l< s⤱RƏ UCp!˅IYC %6p{edkX}̈́_l^t2O)a!ƼzA!Oŕ"t.F1 #XgYΣԣ4w^`jER*k\3]0"OϚuU߿4 JIOpowx8%+I(xҷs9=E?cM.=z)2C4y^_n+:i}]1:^Y:8(eEʑ[.nAO/}fYVc7N.q5U*I3tr\>u)(!'DXW}eS l9Vs_:䎤sq#9:vH1)ܝ6PA,2[lt ~g@jdd H7 %`RCQSޟp7^k6׳.a[,f~:;@b曞:\뚎>|?'2eg,>mx(B(,2})Xp~v5_):dzoЩ3]I27<2\_ O! ፷,k\R {uVeSrV ?b]F!&@$lu 蚢ont$ D5.A+,zs<'e\|\5d7|ȏ}Vhs$MJ!'!hf1I>"PS\?E{G|`Y%& I_zᎻSLTET`X }Q,n ugꊴLo@W$[_]ӠvvvYh))+nVQZ#BYAFQ=ȁRWr7<>"&{ ~Ŝ1j{-w Z|ml^|B0b Ĥ-C>u+s| ǩ: H \S mcu'|9.O jFDYo'@vp-ucp-4 4z.Z|;܂vEN(d |'i;quSHDg}v/(o"+P^Bp RE5>U'ӈ9[sb'diw oKO\ɥ~C)9YOTFٟPy3⬋7}s)NIREpS8rS牁I1=TFfٓW9o { B\e)x{,,Qh`G}:VKa>(spD_'L I@JUvWs.w@f(@!. !@Ey`=`7KϡYk֐:."$P[ j\Ĭ^J'"3+H`+id, YgU)m^.GiK(v#M{AN<bB:j43;%[̨ uAZO5*a.6c;kZ7GqaU:ٚ^55@]kqdaMuǸd7he"6j|i/Zu({*؞ ~9B s.Id#̃_qZ(@ OyfޔݗUڹHт5): $Aq%6iM6DxfֆEO%[4J(pɚ mfxtZ߭0z >~o҂WjAxȚjlԥ/@'WG;oo9ҫ[:=G邔v%yI{ǩᣙ xO)#8|r8$URa^sQe %$\e]傔9lEyc7WO3@Q7"5(Pc\EP8v;mB=?OcJfkzu_n3OCs/ \<-`+в=z^Y'0̈́X߱Z;GT|t^ ʠ D@B$N8 )͢8OL^CӘ1Ė7!Qq:lJ{r^2&@bu̲)sߜT JgZZ뿣&vd0t miPXG<@Ø{/1VJkYMIQ\DG{7@ +„mÎ4"iD]]J6Gd^]ӆMFδv<8ڽEN"Eum&#y&qx%J="\zmuԗ 1.vQۗ|R*E>ggsF΄*~0$95*hGx7!]+WUͷM1 c ի9US p᪯PO6J]ӰSX0J IXQ\$00CezUf*ة2`=¾ayr 8AIAhLmU ʞJl @n

#K Fӵ5.ozs1Xvl\n;m e67ԡ ` f"JH|oRGjMtqw ;ݯCx꩛:'' Q$iNc.dU. TM)*]C|u3Ir!11} ek)*apQ 4KugfVe6b0 C/d~¥.4h>Grɴ~'%̢~,_ɘnPg7%ϯi-@f؞J.TMb"*MaePWrvsj8:*$Ww~-:ZS}=+$nLM%>Rt+'y+hq% Иݤz: b=R8.ZsV`=`0e: 0ᕬ<Qv\CEevC<1MAr!h>ÌSN9<:'ƪAc‹)=j'DBJϻQ8;Z{({ߞ= L,6Y`n) ef. =UT,!g.rg.V#2JQjۄo0wuay-kŒhkvfu[qiZ8!}Kw2 R`5 \="yc6Aߝ/L -jLhR˒H-\NGlٰuB3\ʅG-VDaDY'a:iQZkShg9x g.xz zRQ-TLr kzW, z+Vn uSm)\| B<-yWvqX 3&'f&oCײ^\Ij&"˪B'k|S5eC {%X=:&ݰ]@dk顴xj[MkߚQl+T UZ ZuT}Svjkڀ'`hLw/N_m/|*ϾUҌN[,ȔnC4@%!tq(ī] ӊ\bۅ Jo{y|6Itc}"BAFn`> $Nmoڬ_PW5\pB>W6l/]TӺ@,B0@PR׹ $s/ŵ Lk4 l>vC.$L|}vi AD|5CK9<oCaAwA>)Wfiey`Cޥ;Dh15@ ܁򃊞#Ck7NlYiq/-W@70 ;#Ԫ'fShIi3ir<cL#jDYR0JMf.$&4J3 ֚7 *qA:0B!xqL@Jź7^<ã3`3g*b;@h{ѮOV&Ū#[1a&b<}nd ͚jhث>t Gm$!yc[,NB1q&\5K&&В~xxw&ƢYɲ5* F&2i @޴ȾwI6 iR4Qm! <*f]Nіc(lO%R:,QӖ零K{wFlbFT`w>(_xc$:SGmEKs,gB C'>_5{w qBhKK*|Bڲbք 9"R+F֗ s[]dDj0k&#H1?L9hY̼Ri ~ ^, #Fg 2`lppT"w^ 0(Q9 M3Eݑ8qe ԦxEw1F$4HFImjuT•$ϓi;t(b@S3LFI\UfnE{ H#n,g_״DZqQ!`!4a2n1u"ѮIɕn8r"GЁbr{\Y’KIokL tsg@RN\ Z? "w(&oJ .UXXà{3qfO v(McBjbb(e%@=mO@켧!0 ߉>=#u|(S&>܀8Ne~ټt==u_h;S ISoԴ2?{V*Gw%fWbK%} u2{)z4gQ KS ]֤P&;LOS#ѴD,zXQ4\A:ncA{,:,i"%"zqɢJt `sЍt *Qg%Z'{@rpF/HdF 6@i:e'Yl{_r"L iB\Ž=/XQ4n",ir>@8gpӹJdؐPFkXe#g-XnWh=W1 .抰^9w^Eӏ̈́Xl.f0 ]Ad$]=}tsDΫ'],x\' Bgb!&݃ǟ%7m d ӐZ7 VM$,pQf-~Y {s l/c̅Fѷt=(X&6kK >ҕ}rVw{f#3_F^ L&RxQ#?d:ku3 F1R#m/nHA* 3p(V}D"-! LNC9KA) ucq%OC2:ۨU;ԭpdc2>Pû_BoʥCS Uz$&E>I(1T2@ça)̈0g Gѷା|J)m{ j\oVPm~_)yE@,w"-ң%,ZE{th^e`FxtYO5bU1\-xF{pYٺ+qb # VRmD~ K^Xʆ͟ߺw4)%OR"s+m^9wo G,*AK8(+ jL3PYfBqV5Ŷeᬐ4_~w誠Q lto9qdkc_nȰQ6@#];mdR+, jd$G&Bmۄ0TH:9_$YosfK>O3 u+uBQļ&Lg*՛>%x%=J$L)0CUStR:!`Ic ޙ%%1"+pDnwV*̘!OcpOL'*0_ ǼHR7Vy;xhAS'[Dq^ V$o8hGIDa]Ss%+9-X|jOΰ`˜[R.EܼHOFy&cnu!Y WRL'x<ԫw?!870YUb{%K`PտV4JK;}`5ҿ9ԡD>)Lٜ2'w$O&zxC@ţƟF2^=x(} |+ [5D,\AIW,WƌO!k Bvz3"wi7[)Gw:/:>n Fc:]6o|VKz[ydn5Eb)/S]*u\zr&% DZ!#mp[?(hT+$!n9?F#!Fea00gEpm O3 l넣d8Ǜ*кRwR;O8L%ٺ؋JFK6kQ m?6_o2VRǺ6VdҪi5D͆ih7XQ{D+kjP%tُS9-;Yk^T /WEטҘd⢥lHQtyYIs3ҾoPfg71֑0.iޚ{>{DV5T(@  mHCxUtXure5Y#◸վ;x0=N|mSOJX9:sZ";{<j~өܻ?] ȚĆGr.]`:xVi3tBy Г ؗrjsV2e 7d0Ϝ\`b#7oZ1Rh{d G;F̿C(!Nnn=" D [ܵW1ʧ%ed5xIMK9Ad/VeWO{ sG04p^! q,J2Ēq{Q3Da;.%lyp{jll>EM`)֡h~ {k`w=fR@g thVX$W8dPOPNROxHiBrfq2_+TD5tGũO& s_bqAAP%{y|$8>ry%>uP]; Do|*?._zIe8uj=e:wKR,H]>0MЮsAaL HNzKe;WGˆkdL.]\q-*L!h H"ZIJ < fڤoUB5ѹ5阖, WO1_'ha4EݩS \Ŷ}?[y\mi:~ngpoVw!>ƿ UF _^hr;b /| g}D$ x[kiY9A,< 4gI熝M96γ3bYbnQ_";(Y= Emb``[ӕ:7yɮ_U, kQ xsl'ƣ> O0cqژDd$]jYPu7DR!יP.MJugwxtR]xOH cd Rm .pG/2K4 (8c{tu`8W+ȬK|eۻ': e<,auy(#iBOPfSZ\ m@Tq-b7T>\?Kav/IF @FSwېj"K@ \B7>$_12\ZaxpL-Sf ߩFY䔫;# >٨s=pGH[m\r8ey-Nv:k>62g$y='tDSdeGT$ Wҍ_̔u Y(^}q=*v0GoA AtABt+3tOn{п[Ѩ雨헊̀g^2AO-*ǂ22oJu]4ܠDԀQpQVh -jA_aw/? zVtŃCQ`ˇAs`f^Bu!?j(hM٥DIzRnش!kz2e+8S82q!<(3~#_pzg] 8s&CexAGo<?mq%럒Q&rn<7`N\mCh1Ck5NTR2]MuZ$}GE^ g|'(iO[Di(|uߋVU2!Z&3 /BԦ/ƬosV.{EZI]1AK>,6dm5gݎZZA(#3B .]DB<$HՇPLߡk a⚣0==»I*(J Rpi [4h#Z5zF$3[c&uxƋX>)'ntSUW;z>;u~/_Zo1 'A$z_k 8!/9k9jh2 OC6:m©H6"ǭcU OvZLl1 ت6$ZAeϸQeae<ދhF{ zu\łJ[@T3n_E` NdnI!Ղڠ__iћ 0PwpA1r4f!5d=#޼!!#H/b*W{75]zPoȇjk0|³v_ǶO븭KLIB"Y*77@Ņo|J2%6Pc'&lv݌K E^ by'$hqh޶CZ?l =ܞ,WUh=ͮ[g70;zz0*R2m {1~~m]3eA>H;CJ҉f>oϫpw](5܍Iޕ*[ƺPơmE/X'fl*g#)Vo5uZ٤kz t7Nϣia|tKnc4ȪDkK nWPG޾HI3DN7?9# +*3@=SOt5;߹ A 6;gIw[čyab~7S92˴罊L i^Ϝ"븯@r?'ָX e1Fj5ܿWl9T3 G@x}9׿Y45%%Mbgo!! 'ٳAm\ YWhF򾐾G~9 fLUߒg -'s^.:">'-]nEHweZO[=%%gy( Ug1H-i,-s7+>)y*~)^ r mB1HFUaX |P sEtc}k'}LCցÿ_Ly?rgj10LcJ$:y 80)jDqp{c4{|d4񫦇*u]0{I݅))횿|UW5ƙ:sS5`:υJȆ&F+1Ozą&pQQ-[|G\?:Fl6_ɁD˛,IX&ۆp-uv ؝ ^DFC0.vW}u=[QWݿQ:{g$Dh1!wZep$ EFϷ@[frܯלwHn0}WƸ|G@B۫Сn͟RmHkETiW?p_n-ty"CkmjL? #]J+G$yeؕsб<^$1bRq>[o㚗O-+D Y^k|rNrч;=ADS# ,iz7}sxDv .ILоD;ʰ܊j2.KAf0G]bg w^ݲs=i("lRgVyY<1Vzve F`* jtJ3QIr$WÙyrU0;n΄.2 r>Zr7m3]ثVfs~D=9~ \TUDGjm{xS6A&*V2`o2)dEn0Q^y~\%o[=FKxoZN1=A qZӑϗXV:cAE{\%l9dzJ""_ǿ\;ܕ\V].RV2ozw_\13E?hi?״irh >C]sG b[ j z$oʴ0]KG=ӭd @ w3&e'ai _Pw;Vϩ0my)O2i ba78*YH ȵ,5hN̂K<֎;Uf(@([*';G~ A.IAlL>hrAo2bb 4,ijXu"|b5['efkr* |WXFǤ5Wr yJ@b'Ni;$`ӱugKscm1_}/2~VTXwt.CHp`W߆'i-zR(9VbqOY][V^z`>Ģ1Hmlܯ׬}c0΋D"Egs](WpB_ob]+"FW_RhC^ *šuH_h.v>( *9L^v睾 \W>R\ Yop‚Dg~+~ȒNJVP7gE&raXz3:\IT b7\pqЅ{^]=|&wc1 ~<" !\ԁr*9E Xi;NTYXվ=|<#bY}KPR L\Sy 2J1F"ۤy/I9)}u敉G9떽˩!RS$n/9C螆'TvT$pq -`Zy#Z8FF^)As$a2BbepӸ.jN2 XfJOa_p6B@,Nů;0CoJ"_J76Xk9uޏm4Ĭ .׊hYw>ĒEg0g=Y)5>EQ#%m:rRm)צ&UþS zi՚VmLS4clrW"{{1PcJxNj0C z \53aX`vϭ@1̄ЯңV1pQnq t Q ʼn{QSZJr*t?+\Pۖ7[7B}lK١Ⴕ=^omG1iRw$nrjHTp-wC+|5"d]aǞxElW^ckRH:Uh)ŒIZ|ԌM8DL^\SSߦWZ[ 6G,}sx3݂gYXʙQ1FЋ|imQ=_&;5~t^H7I{,H5T/zՈ=\ Q'Kap~S^eH/"ttÑ"cM4j+Ubh=h(L>Dpƺc$3tɋc'5dybY%#H:Kr4 )#\~)ޔtI\=2/ޙasgTr? ~(3'볣mx󹥩'bmmi2v8\S%ӔNqpU@F9%G Z~nwt5&3}y>ľ(h OW.lC}&Iy5=ՌRQv9[__pيS&զkI`iݳN|mSBe;'DA*h a3cPK%mk)2Ut􆜀7sO]U ѻj,B>ٶ!|]4MN5 ,&|yF+FTŹc{ʲfE ףN o.u1fG<lUtgzƜd,7$T5Qd\Q8EY^;>WY77q"7NyG|V&rHTW9n4}%LWS:r>B.|-E(IUe9 ,\g[X®v,xu[IQ5L$l(XioHַݸ,>s[PKfMv`E5i\iyf_)Z{nmnAebOq'Xӷ)&EMdo  o'L2A?n[/Ot*VCQz3^alJȳ"fJh=@ޔOor)Lo\u t.|0 ^ڝ]yEY {NcOYE|Pf(p!)q^SIѵk?kkW-~"LwVR#bTȚ&$ht~}d`up2w+_]hiY%kKE0k%<QB pjJŀ*]喇RS`wasޫ8̿_R12+ spI=tMY&أjIzǹ}nu0 7o]<"azKӅQk1j%-Ee&z.} ~YvdݮOɡ|z՗O'VY|ȃy^5ؘqb BR9)9Ʈb&SpzU ~7j}#Eo'E!82$< a.&۹M Qy 4,u&lM,MR5`![UϨB F r^2AC zm=X;WU~U):#*=3~3p,q`| LM~c/dK.a~S^K#fzn9tC'&w׮s^5[n[]8tw9W"Cr5^w)SJ XԭRS0 +fmV,M,;ǫ@ߤp6[]\\lrG'^8ALE,W br9ˉ8ʙFe$6QoJB"MY> B^'/b'ƒݭ+۱e*V -}5X`vWX @ָ:M,ևd^3I(u_% mN_; sSPRVI"Znj/~<<HY>kǷ3 t9*4OVBڇ52-rĤ3VEfKxqfoD}G^~$'s~+;A9&+=(gbfiSƕ6 :Gz+AB7\} ј Gwa`zVbq{ޛy9R%ry>NS}l!ƾ>ZNf-8G%ixd{1^D)wiݍΆ7ᖴrrR֙Pkً,аۥ⚚~W Le$wPLTMMZzHu3=#t^qx;Ӄ5!]̷5W|L U&~X=@GUӪ򅮊*zHFD,Z&|l7. >Pqة1D%4<0֢(hWg~ia5 <)@[nԚDoHՖq{y2zpo{q aRS}SȗIeJAKg~S[՟`z87qR.r6*-j3Q7-\`)rT*sBc FKuPыjhn9d%Bb /57-1*V'X:} 01N0௶ޝA2q|)]0\nyذS vRARkYKWmۯVJg`Gk5k5㌆j&ʱ,CjGךL( #H ͕COar|ȱ bg>vB;w SnĘM:"LǐsN qۡtd8ԙB:xap]4) ktD+0 `0a3Ʋm|a:&pR C^c]3b6oi&90Àz-.pۤI (%,u;F.S|5.%F僃WV0IaC@1#Qg &!1_HK'!W+E*2Dr9LK# bP${WẶڪ,Y͵@Uz4GNItӭvpegM}0\ϥwvC15p .`$ yT5SD,I뮿~YYek @JvG] ɢ?-B>oj F(>=}tvjDsnkW5]]Wc➎f${| zM)0Wޔ,+%U-t|hjC8mjDgI(Yh#砿g]v&OӪ~| &Zb;ujYЁCP/(Q۟ XNf-ʍ0] u*S 6@2]ySrɄcS[`v'NkF}k)Ixw0l4P:szʪb;/ ݧ DF"Ge#ׇ]i6Pny ~,)$`/mG\w!e187z+GIZ<1_{u IXB)BS,SQ!OvtIUnRso?%{[Qh."5%z{(07Io"n_ЮI˻\s7pq2H > 4Jqs+~L. < g<(w^@MӅU*9O 3ځ`pW*#Q<tN8{\-[[Wq+i2b?4*ֽ߄&38|f yp&}47ÉW+(1;(SK^mpZz9?g+f}/8JR@Ut~0h8_3b617|QZX#2vu:n(QQt=]5+~C .jBoSL8 .|@/$oen*?@Dc5xKWpT b!2!ckX'ӷܶFWJ*{;VaK/;0‡#fƂ E` MPnNKOJQ~e ںzix|vB 8/aJ5|.Ǜ"u_|x~^1}s_zM:d?pF f zmZF Om H}aJPg}&q}<3b>#< glwSa_(’gt7yg2ar'*x< &Ư /ᄱ"HAK?|z%=I1T(he j>X*3q2z[Ԋ3">QQx 8ed Dt5j3g'^}MG41;Nߓ'^@eq9%fPi&*ssCC,)0g ɿiPҭP6ٵ0X:e 6RrR0Kj{.<ɽ 2kkجdW:.OzXL=Yșڋ(j ,}j:vLqb;]rH4;|Z*ZHȬȄbc@Lԛ'V%jT'od8da%Y CC'; BgBlz/jukİKg`$-_o0(:}.W,vs~Qrcr8U铿  d&󆟚nb"_[Reb.kW o^v tgqV6pd9#%0^fHv$B4AGN6Z.~k"bVڋ X90W?TM3ȄbTL%ZYٍt3$+ңD;׎ BFƏ,Z\QwqK9}r"E!L*#5^ bq鮥Ec KS܁Fʿ1Zy&lZ*焧PuM:yƻƸ~(51rArIAlL ?Jr!r91WA%|>qŃ{!9<$q^X;vsz=kgC0vG2R8{;?Cng(; VN #%kEa~oaSޏX ]WH'Gx#Ud{VPKzƛ,>T?fَ ! c`κ1D@AA#7񲸁(ʄm0phouo#$4JĝF}1ؑeު;VW},8i\PV ޚ_ w~ d-ʐS$` 7CQ\U6,9B7t&-~Kƻjޟ4@uԵGi)**s"- ps܏@n'2cit0+M$Xdqb˭<̯v<`9Tna6}Y* Fh$ŖYPH6mb.)=_VLQLa$'J~7 aiRZ͖ أ ZFF>`26 s՞WgkE C65yɈ2 3׍%${K;I=HƏ6ڝ& Z%P\+u:_%=CꦴK:,<}Ϩ_8kyy~rb!VQۚ B% >7숛dYz?zs,N ;8,DѼzF-*^?C=K9 q~*`eԾ%GD : Mwp Xvٻs`vMO0BXN!2l~ YL'Q5eom , $$ jk5L]hjV&u_ n-wh;Pz_LDgwI~])oyD>I2KH?rI36=@~ 6n?ލ2=XR=Oۋy5y[:pݍ ‰w3Pš֍p~}Qzō2 5T5R:Ah_$y&UE,֣B:^hN56joZuՊ-\s];_SE\׿J'ܠF{a\l}w1 (nth~FۅPVG۳ͼ&6#`&fFaJJ$kN8{qAߑl齘w`r{=q!sIkyDG&M)ERo4!`d H$~!Je5MR GHL:UQ-ҟ ex^{rKu5M!z!lnhrD CT݊5V\?%Ç93*Ciwv(oD iŨNS0M: 1ԟT9{1ZQagjL1~EV#kVn{5?5k$:lZ^cc)x ;`bJ&00L_Sի$~=q\t> ޾myS`\zitHlj1~oO:|OgI#YQwv %|K@Zkp]h,Mv _脦y O RyG;#\[ &6fwj Snurۮfw~h;;+V1EF?cX i)©kO%Q8ǴYd׃ ŋUyh>ӐnbjZk:KEѳ" ~VaG;ێRF)>aQȨ)X$VpJ1w.UYX;ٌcH5@{9: K~:|W<`ek(k>55LU3;ɾ9ݔKY5Vi%+j=ME%}?A(Y| }6ySa]_v冮i{K>(͚Z3wTL9vQԈ+yu)Y'(0\Zҷ"F}Nen ,4#໌Ti+vX䰝S\ Z̭3 DZ<&`U"O8H1WF;)wz=C^$M,~R հ4;0P-$03N`MLAt4|&'I:UćAhzXe  X##O# K| $Kc zbkf>rGw ʝdtYs^-_9.ߡ _A}VTtlrޒSo&op+`m/"Јx>Cz]0z{'lIq yV] Q܀<7b"fƎtð1b\_xjP9 g0f%e͜ ַ?lns\р jvZNcPi{7`Tl嬉Pڂ[x*7Q%j2ncZT5~B՟)EY `ilCZ}4;t F ?HrR=2@b(BUS\K*I| fN0E7;d;c$0" - xB;NYt詒迵1ZJ}6nXC%-ͅ30V8:6ESD% Q* mJtJ_8Z(d'~ik)&60 gZ.:2 p=tL5Tn\ E M?zu*ʄcU!ύj Uٺ !g0u;%ǚG ܴB?DMe#br^sD(n\sRetI+(oh{wR"+ ~W!byIąaL3|,)Ђ*7z:|&R4PחO;ŽY։;VƏyJ(=XI} 5` bccqÈn<7H~6mA dH7ha0:5URnm^p@EM.BTUY[Bx*B?+ۘр:$חR, }ݱz&cN /n$9뜣3@kp(R, 9[CIVӂC̟Zf@}^taEYvu8ku٨_8ѨKuJɷ0thא*U%Wi|\g e0zI\3n] kU:=iIg9.pzC1mbߘTDI*%Ft &9#c%S|s[T!|_DXMW_>}Flmx! QTg=|s;y֒#&a`!s>MzjU=:`4bUC5ŃFZC3K9`m{47&&=ʂ7(}B炞A@ _xȴPT5KaϒD)/YߗI"+ږ qEo1j볌~kR/t;~ LjeyNָ铨Cv(jl_ɹ9V bExED\p| k`tH2`d{/ιȷIz4E)^BB)~c&h0Ipr#h²ě^'<!;>rXVMA.8NxVlG_`]rIҦ>#6lǿ:VЫ"^;1: |rꅯv|a!T7tϥp-0-ԛfiBZo$Uк~f-T/%HɅyѠx^5'3B5ĆbROf#BVmFMpX3h4X| d˯S>F<}ȶ":l%YRWWC߳\+CRJ_g.AD5@pdu>6z+ P^dtQ bs7$w V5C%' ?'⻸sK#`Gֲ숶e%32m3'RΞ& [8ۥ|UGJi!}s4ihps֧ƫ84c'Iξ*ZfcŤcN.Jљ9)l^\$]–eVEB*R,jBtks{׺Şcߐ׉<)Su \hp!0=  0آ)ѧdZ o*ioE꺆 IJ99E.Py2HU&5`]R Uw^ڵ=قVI_|c2Юyi`4 NM_%]i wZ}*%>Bdd=½@?b-[?[Ňdc3zO]o| @7%-D/jFfv1@q=cF%X#~.Ь,34Y{ZVՙ2ivj8CGх_?N{!qy_$c^wlPg\P"!pz[hW,ٱ9EV@J󤈎@Wx G֏aғHK sM93ȸ}&^ϴ9"cGٻ\hX=|T8IVbӼqJC ;nxz%4dWjP&EF*Zf_N235fy-8o,ON'ltVLHXѱQ@U[pS'e F:e$$IWl^a,7ᔕCw=fhޟ1̢-L}7Afzq0襌Ae^7Y#mK@gƐ<6[*ebYd3) F@ݦ^=\7qUrb%Y]V#W5h^`i62ҫ["G98qnw6й;.C40tA)J3@ %cuJ"њ*Yq{ULЇTmNl[ lQ7dP1QHy:Nx+ z ##agww85ctm C9lo-:c۞vo=u;AE,Wbd56P)pw8( y2UG9e]!籤DM0 kY37+RURkUk_.+$G0Ki@b;"{,IW4v-"6Xw&vpZ8~!k5lYN𚐔?iG$D3yEPaJf{¯"oi+QujsOh$]#4ixl#-YǬ0|"h 9P8!&>_]F jdavT"8!U98҃QTP6=j.]kJ?N4aGD[TF. aj>Z*#C|j]a&?BE\o$}b>ZSErp͆x7*3ktSDOIA!:uS}'dt֭>}м`0d/'l˪I2\LFVdw`M_5?PH4hV"n6s L^l-nRWa;3NTjBBK]T^cp@oB̸EQ׋@.`Ӌ FY$#^f[g0KhT 7)*`bEdܡ5`9';oxGxqnAi$pE'."= 0"qn0l'ξǾ[}fF;G8Q];WoŊZzbEx>p9FHA$t<#%lG3vtqQ59ƅ=/9ہ+{&@+jfΠ]rŽ# B?y."}988hSŸ%rP}Hi70Y`PRA+ayN4` "9cMoc,iWqv3P_骙@?`)`^~"7Tz|"7e 1ku@)Ԃki;rb̔샃 -@G K9M`T7ށCue>kзo=ReLb4|+:$B)q5MXv'k|C/l;4j+:OAu,x"ǩ* ZI Mx |Lȅ ԍ%~Ypƺ%`BT.4H/EzEyX+E x۬R gFL7 xgrݜ3=Mq( "|fu/x^X>BHBK&kŎ0Hғ%t,J9A\RkfAt$5sc7{n쓀h:^Ob^/Hb&J̖6bl2_D-s*ݡ9F!E9`Jt.loqT4FYkL摒Yw߳<'-G]a8aے'L E5hHA$;WfGz0Fޮtޣ[p+|=Co/ecz]ժL>ϻoڲn]S2_cz{yɷ|nN{lS2"U9ߕz M \yA[  ݁,nKO(gT3O6:zהg{ƻ#J ~{uiʞ\j;u6$65QYg<" *H!wZ9I\*T!Z3R &Cx9Pgkma-]W#?ul4Cd;,<{^/rZ ^kʇ*cBR;mf?z+XOV@}s[ ݲW(tE]I>~n\pQUS|ֈT -_Ft2IRvS]$R "s~*|] +[`:^0%UyO z@yYZR &k4@#I⮌A9y+3J !?YQ*p&J߀-{#y{^ܥ]$6M\7=S.#49'.["5fCX׸_p>+#DN(-BʣkA[y`/uyzu'*{H`9 ?cFȥ6yxc1'#-i0jVÉ0.n缴1Z\dDNLpS}޸a{=14 -|y.*K ApmvzE@=:"i q T]L¶O3?+ I \aG\Gtre~bZ0A?-NGZSN.TnecHЬ%L": cN׉ux -w>[,a 7M] MYL!*s{~`z>HgfAԨOE`°35v%)hX1Yt=34F|%`) lrm*•H-g981֩2wBMS)wYGH^p@V =&Qѭ(-_~FIߟrIލ ,[ DկabN ?ݱs0C ˠi>؊F'T85yuT*{=VޥobxO7ARIOB7_jAZ>Ύ~oPiՐey<@ՐO~Klvv/r}?fRuQnl wf+pO_ p4}˨"M'G[^Pżp%ϵOgF%O\.t#Qp Cqq _A* $?`G$`mЦO̬a=@ђ;Cz*2 !w*~?T ʤ>>H\6{UYbiCLi$_)&af޸n}~ÌQͭ$7:CNAxW.j[L}[ I;[wKzk"D% ~xxR&fIE$A=,ZHJ4̑C[YJ̹  _4ϣڔ+N'T} g]ށjYɚ(k ;DſW,t6?=*OMk䝉 0Sn< Hu]Gg G{]ҢV>YE:(ռ'L:93DNK ʦ&} '~bvԜ9K:\ قpjSn}VSpIi6s ;96ll\U{7{mL~2"+$4xB6Y][o]6un𥩖>t3==Ky5.9EwS؞+4i헍5`Wn.]|:dNh3(z [ _o5ŌGInTX%kչ;K?a{$ುAOcs1V5(?J \wY\L$)jhB[/KTeVS;`\B6$Z$NBK}\7W-ÝBMaح'3Ncsq9wF2WE:.%#)>Xi'Gedc:qyd7 Di:^BT @qeKej$}gp"/l\4hK)UgVW(]_1%jwEU%`S/e{3q|iZOUnhU9ߺyN^'Q8|P b^G",nM0Luu NA7lT/Zh{d_ ?m?=v1i!r_!?VsLGWCI#Ǟ3++Rw*f;?|kArGG2)\)l8ټEjUZRyd8=?5rĔf&䭧¯?vmyliMEijYyMDj+*~&Q[/tfO8js?ӯY3zih0f[{nThU^+Ol,3ܽ׍{;H2Yǽʇ'f6MÒc{Sqx+M;$S@XYԘէ.ʢ"W;~:U<4?t͂]xu0+k&n3]rh/[jsyac=kU%<4s5ʔh"uG㾓O UޛaԨqך9\< Diu5Rc2Qk˸ }`2"s7 ?_"* 'q%E`Nnh`9SГh_(b\7m At2^f&s1mk`$h^c@~JHga/*8UAG [P\:ÇvTĆKIv4SЛQnAVW'FcfZ•Kx&V J-')]g=z ;LGaیg/ ^p|[X ZD`ې͘Gl,9J եvlYw^o#X4zT4}!7hdk+}8ªZ@U? ojh+AO>*A*к Ƭ0Gbd)wQu= ~ | E|' jdUBZDPIsrnlثoS(Gɰm76k1TI/Sxc֫6cX'` fjا4F0^H٣X.7B/; H!gc>N(>R_l0@R|P0UI_٧zTHVV&'֡﬚ ;{0$y%E})<[ɟNfg wr0^lkQcdSFj|[X7Ȳ}=Thz-*-vy=5fs9Cq*K x?0.M%g!-C 8q>d!PpXjvz`X 8g]#kn.~=8^".xE>/mDi.[?$؈1!b`9HCOx-hnQk#+? !"Of c5^a[O\UK`EiʌXlS5"n@ۤqT2ƅkj*8PFQW85s}=^t˥@+]MЗl|rհ{3X(hPq!UH3Bˤ @Z}6޻@'H_Eune-?ޟY `@`o45,]ob'"Q8qv?[ZF+g(e1YV"6ihBqݭtףf-HvaQ,Uی9QEq51$z@hmr5V݁v8ЮE=W6#|)ݕ,ʥtiF4iUeεH^-8 ~A}^nw8w#y,0,/pc7$c(Q\4%Yx(V%ɽ$2KJUBd->@5q;|M h,]i3c _R6" sH2Rc9'~1ⲵ2@tŢm>!)0>RKJ5MF!}arOV *!@^Тhi0Q`NVlC x˺fU sU2f5m_8Ԃݴ,:V,Ч 㷻scI2(lCwhD־t|j7ҕ9^Cqq^Sz;$h>doO0gOSk ME* Z s-܉<ڹAK %$pr|}@an;U!:u0:(ah#sըU;;Kes+zRs-9u}ɯ@yz 6w%b^]B}w69_Qzb:5EZҟw:(nR΀ˢ~8dib ]=SMcl<sگ۾ <&iIYhm_ oL#lgC2o҇Ey\1/D߮;;\'%S@#UeƼ\_sNE=\>HCfݾEF`P-]Mz]; {]/WՁh;B녏V٦ܔW|XX,B1O(Kr|%jV҅FC +hW?RNQdS`YȏIRauU[-6{bNP%=p@|b4Lvu IБ45WY@**{Ғkڇ; >;6<:j$rZK*)`k(h٠1CeaϺ g=ӝi0TG$$ZSKUL˝v^% '!J剧z2Hv IӡvxuUd;VEV Q( %)9_L~ x uJD8 ܉_6吞?^h9 S5( w.VsyW=s[V¡ QCb vN@BiE"Yb 6@Qecmhԅc+v ep.?޾Ŀ7ȎgIk҂´xdP\WE-=,3(>;/ku!WE4- T<~CZ76LݵWz/藇~QI2YF+ +j-l 0A*^_A!dK6<&a.VFnj>5UGw;_CūRb> |}Iad -d-BN7 VWRT;ӹo@Zi E3x?er,.K[A~-9t3+ݿ f@$( Znt3!\\ar9+(fg7q[U)xrPN,M]\X9)%S˧= x7 /j r],)$B]aV-48NtEΦ+NT3|@d+9AHiN)?<0qSHA8`aBީucLN^2Mp[Z TJA1Hr(ј+ *+Ib*0v`Bp~AE,GFϮr;ۨO0J=aB1Fv,׺BfgZ{Qz@Cxt*Ж,~aT$ˉ˘RnZL^k2%wDfzVs15xP}Ѓ#bsjIRtdYr}uD$p6mU>}(|oa= | %YdG!r^^ORգ-vW*zD7r-ڸ)gk.EY՞mNRKJz6-umŘyh'LH`M4ԺuAT{joh4:ֻ*CV^"\]\,Q의 |뙜"r(BK>(ngݴY[}` Aiܺ(uo܊Mo46Ѓ2 G='chIko\%s|1Z|v Ce[qu^@FR(,ӶFp`O=\((:CmS_uk*])+f>gF Ry{s(] >Z{x~4Y S0~,97AbdmW)S (H /C p{$Mn{5ڽtU2ykϿf 6lpY&Chk[_DkIEPSGE.gp  ;8|D6=Pk%̑ :uz HBW\^ GYj&Utm&g [Z,tdY)j=A ק+늨2y xӝG95ٌ*@q%׍$'^qJik( {kw0-\t{1^j+bGA=N0] =l$9Sw;jօ;q,3]Iˁr\!\]j`[6Xvƫ{8vE{<_HU=}D*sex|81J! g}Î-zgdmOD@xw M3Ft{ 隟a&pӸm_.zB~'x7kt*B($(kP}/4BFp7C}-\T Heu O.on*[$0EԺ}MHAuѐ A s|:~fƛ=%KS PYCg|KI^ ,b6 .\J3Pft"]U-@UlIc&tHrhea; ט`aq!V?zbI;/&di( rR}5P8ELA~{Jz^3ppLhސxZ1X>Т-+!(້޽5!ZFp(= ő8,AJ* uf7uhqb_QSf%<ao:oͤE %Iaa& Us:?9l=PYk,GO6bV_pa=O QoHqGmglznr+f97h7qZ ZFQhӵĢElFnÂLϧ{%YبKUge4O!!`^{ xTЋug 8uvfw.'=GxmfO‹z9cmZ(^Hz(lik$dP]hE܄ /ȕRBp[,>#aƇTpJwh1#t zbq"A8{ԞM["aoLF}y\r˘ VR3\OTf.lh\11pGHgR /RL4ĖA܇?7Dt>)UIĮC4S%d=6(PjezZ~hXi O?/1pL\ |krS֢è(X'HS>@t(ҏЏ 819蚖,GaQA*LL IXA\)-\pb$7o;Zxߩ ~$C<`ձj3`.4n93($?_q_NsHn\u%q#@ IK)FIC5 y(Kϧv%Zbw+0&KtaR8)+@Zr8oIh{5t 4KNĭ5y -#=fB N=}swmԕԲJ!rQ4o,7JxBx\/6U0Qilr"wf+\0kP'9) pdtGwNO٥]3&!@~N- pgfjEJk)QC jx6nUYԹN-TŴ'݃FaF W SkPldwr5gb,V&Z(Nud9(*&I|}Uq^ޤΙw1zՁ -B0 '&emݞkw$R[3q`IJEqbԟm]OֺjszOp?6-""ό^ AԳ̇gvz,ۖgj2 )9wn8fa0n!n ̫ QM?+-CN ΨuIOh .a^-MRw+=hj["D$P7AIAlLLGMr_-uJ_=3w5:ي8n?MM/<+ݸ(uX'wKJVпI]r#a}܈H>db]I_aUȼ2V.#\[RKʜJ1F$Y+ TdLƥ=(>VθAX{IhV6-gH\Lv}I>pTnPOsC%'"U㚿H=Cm+D1JYi iG>w7 .yH2_֦QgH"C VY :']# |to l]$vШhݐYbHQT?nYk{KihM-D *[YH z0i !k4ٳa5-[bՁTnH6ȋux y+fʧ=9GK:_XX RGaQg M3cM e݋[l +tsk ޅ CUm9Ŏ LKNSW%:9_جJrEۧ&ru'cZԅT~"[ޑ0mĶQFIrlO׵7_5r篺5]4нi?G¯5vcaRmAhpw0tdǷMw A f?l| 1;_?qi_XM 8A?bMtȬ-ZmV}ˡkxikv M(>A('fbٛ=U*d)[;.)dc#7=eW&>濸ˡ0.!VFq7d3m/y)Tأ; _6f7;ʇVBmQGY=+Y Pc*wBk&J6+a)EeC[Y9eu =ͮ%!\{U"P:t~aRɞ։xSm%M:ƃAIxf M }3;z*AӃD Df+㶮cz~C`#*E(eVx@Z;%R5*< '??\Qyf!ޓmQdJ6.tXp ۈBAlDnFWïVF"u}[[ل4b("~4uᤌ=;׫_oBeҚFhtӋ`& {ՆE=)C p\F#3S`۔1Euo N`sY1UREǎ&vj ܻҳ4ʹa[֔ב(Oe{# RN61+{C# iToEu{o̯UCcZn-e}7u*! so|tѕ46AT)cwu'V֚͠+-Fr3hWS@4{$ H(9';޵`Yò/C}tĻW7Y):"L P5'@+蠀Tk0A9X|7FD4MtDd%IrSP'āT)'Nm˵ {v^r2ϊBr^} +mH$m=0Vp%"#oӼeg֨*J9ix_LTҎ;V)դhCRgJ! {A-nB,;txMjzG뚀P촳B;r%~yy{`%<: ]v'!*.8œ,հAȃI{>$d5E̫O}Ϧe,@/jD_*g tJJQ9mσxπHHW?aǎͨy# ]ʼ(D9b5fb|^98v'oz ZϋMZTFV>ջ XXBOTeJ=H1_{s<<>z|ӅgѴI̲w*ʮB΀!Y[Z##B} M908.re,Bb;cU܂ v Ƽx]t0,B\ o t:2FvEU dJ]i YU|X? $mu}"!&c0:S{ *H_}IS^;~ |ٴˁbIxNHrЇ0#xqe[HH@{RVڃrMNb߄"b)傕ϯzdPP^N-w q .m,GX@Vwk1U8{$GC̜Z\q5^~- QnK5Td=vi?`ǰL]1Wy9h5{/Ӡ$L;MX'I"Z_ rGCObGd Z7M{:g:A\Wv7U>k^4g(~$g'iVUbUTiw¨`W6Q4s!M at) k#vN]D+lm7K6ZEEa8۽_e9'(Gx{b*9(q3S0$'n^\(d9t[V. zzܲT>e)@ _e~ t ̄F0Lj+[ hS]019_Vhd@w՞_=pE< ^9j5)<ǫWYal(yD+p7z@ ˄ ݱˆ=$fk nwc2ڮC# 6X7*䐳!+"`x~D-9AuxM!q*A2i"ڍ7?$Y{8R כ#g}|Qw~V$z,Q[jԐXU 1c!moY ]Ԍ:eMSKi6{^c5- d[@`1ݯ8VVgblP➪ֵW\n^<:cVcbv' ʓIW #,MauY%= m\ۛ\?XgD]]_٬A3,7AZWYo/!2O勡Ֆ 䏩 b$B,9 &4*9lkD'Jh("-G.[!U21"ㄞGkʎt)Ԭ8v3BCrvly\oA(M߷D{3mI^ n А8O76]^C^ eO;hJ3=6!.wIx ']؃k)6֜#pT;@ÁRH&,FN>=P)\YLd!FB'ynukʽ7*U'k,? s׎ jVVЍMΝ . )[Yh]jh67*إ yy/o/'@:qZgHj&"+]+9n5tm 4١oV9|hRh)nx!GkG}w@Gy˺²7UX PQӰtѓ7?ӛ\ͣ|dZY͜:Md{iƪ*t LAI Re0#?gl .CogyS,3)(*z-KMfxіkNTXN (\ڦl쓰ˣHZ BO0ͰLw'_>Be4 wLϕ4E60 be#f4j%Wҹ*b BȩZ 9[U 6@`& YOS;eX C暸 ǒޥq鞏ZB[I`؀jOME]D~CpzͲt?r[-'t=j}QV "KVOܐݳ}Q{#I~ 0cw ݕy-"XEt+mMp_)1< biÀmx y# 8Rkvp& g/MYɨ)_O-/$ H~zAY90˰=1bΪi`PI%/!F NO79tH#Yy לe l?d; u=+&2њ.BLz~_WhȌLVes>}A)|G'x9rhW6s=Ĕ8jcxz}L~MT5欗ĉ;6ǚ+`-o|W,`?E! &b*MVW[L%G (h-L ;]C0ena ? % m:atB# T  Mm.X*+>zшT2(`*D}e u/߶GNr O2"R?)a2eqAޗxɸCE uJuM]M0$wBolsV}P`!; 74\,tCid9[wyZ ([H%7rw:r&SsyR״,6"~C$nwm+LT ZS<5wntzogd8A, j'kmv9_NG !*i=}!w,5G^g-׸sl,H€hDb mC< 0 ²*{QGﯳ`5qc*!5SBTZBH `C>bd$rs#3lkR+u_ N-3 qjtc*'1 c4g#f *3D_ȋn{L5΢Pwr`Q[n%{ xh(pN2o:V%b3vufr2u6Gކ m"vpHe(A9قL0vl(j}`ib#/ SeVС)_SH0#UW?qA*YJ+?S_cRnȏ\(\AO(^ؙxΎ NkNa]aGG%>6Ha}6At%7Q(Ӯ,\>6W~r1g.1n\2ѣ ;>+%Ic*7+H_'Ej3St~´aukOȄϨ+C3|Nqˋ;|h:L/I,˲9u>y;q[/s:nВ%"z_"FyvjvNƶd&NQA3-ܦ9Udn$Z⯩_ Y ]ʎ5u-p_zDE0? 4m5N {^>S:؞n򣅌lKcڅEcD2d̗ޠ57MqsΉRidZ95ƽ#0Ep׸} dh=E:u<3i6 w"/I=(8Ac(M\OA¸ȨK,ŭq֨KÀWֵrv#ސA"cĴ,Pn.Fm30eԷTܘ:`xeAtBF3J(,4E [?F8Ĭ&B^U$[vE%_&~VF#CYLC:@ jCNrLkl{C,q 9{DTWod /8njNwdKLM}kCR1Yާt,"uLF @Cڭv).*-I/ň/ }`9^`oՋh^!Qwptwo.EsV~`ڇ!΋H#KzKdUsaVGe )G:YA*rOdPbުXr# #>\_&ҁ;()3H.RrT΅qB#9T"&PBXJyoHj amƌ#{#y3z򯜼#\KƆ` N{۝"؄;}?۝uZ_.'@t<S`8C`di12C~Ncv&hrJ/0#SͽK}t`L4xSlFl`\R~>MͅK8!~wPKW1F-tЉx]oױ\1Of++гII„]gw=z'%&}65eDȏնb`,ZC@:V4_׺Vʗ}*1v:6OSbH^v7?[|uRQ.A="lQ7D<H 䪆J Tnҍ 1128"_q-(R!0<"û}zYl?@̀.փg6@yF50295Y[$iY4O0/@ m\PN5>RLrHf@$)1\ eA9Iݺ#25>kV?YRh\R yVݘ; |8,Z\4X"o즗e}lU7No* r>?p;)ޗFj rݍy7!Iu^Ekg95WZ==sh:htXbYw0!'XvOtjRbL#);,`77Rܗj_4+ۭFU ,ֱ!6L&e4a.F}2Tsѳ{$ (}K ^%OH֨0\z֊/)*->) kP)*XRp='#QTE"}&=PLqN7iZvdYR:C5Tad$y)j=87׭R}OBsW?8F≥SȴV:>Btca͠ *- 0C;2 DM@j6d]1S`یrj VL9h-gFc/ Fyjz*eVp_`pd;x@^9O`Wtisjݍ]9(jS:(iNѩEuNHI-]_EP, *yvOB.\Jzh<# D=#цБ^ޙXe"M]A.fYN,2X̏06.eyq(@a|PO5շ܁|E9tXP6yqC^o`'vѻ1_T ^#Z)^RKfŁ;3vuY4t)u`x:skn9~MAC(`>ra?Ff߬1y9e#PN9YXZ9L%?@P|0}M\VB;VRV=_OO!( c'sBa\CWo! ڻ? -^rDYIx/Ձ6߲¹9EE6g}ҀQdラe/V6a;LJlbjU38!UdjGRNuI[؛D,WO>%n%_6u0 <ďڋv)&[N~.{2N*}UeK (*B$j8%w::/ m>OhB|2cA+*x\B~%s <(&0a2/UZ00Si 3Ԇeh]Ack[ʵĚ{eJW&iP3z-ͺmJZNR4ͲzhQk/09P[+1mhZ[Yh=\[hy=;mH|6`O酻iD GחznPLn')g=f#\lpk_FW%@ u<~#qaSΤDl 0g؞xb0jְI"GױMo'ҟ`u1rm)O" u]5 7Qo1u̧RMU?dYRQNg8k=x]g gS'h4N*8M׿D? uީt'} 8#drXs;߇CvعfP;gvRG/ౌZ[ۛq7'JݟJmi~5̣lT͊a C 4'S ]aV^8 >S !ʂOسAge//u#YkPo_I=5gAX?"w-.4ܿ5􄜺.K}¸z:1Lݝ" -0?vG d?\L޽ӗsi{`YU#4`@5/x Z{=I1:8jeߓ˖!BM([-DӈaTO պoGj5(wWExu`==$""~"i3yDF <ų=R@ Zwķם bb6v-+=<= \ ;6gоo:?`O9T!G/0_9i$>" E.k*9jt#2œbl˿ONy4 I( f6DXO8xWfiHIܺ.TV@dYlPk)dkG咡U Ir Ei?HQhg0P=AV)}%9W|~++)t8Mg{ʕ s1lR {yqkk7q!W_\110%B0""IP,)r\Xjmkи U;nۇhc H(a:eЎ AZI&S3?&;eZ_Rg"_K+CrAt~vHX#u0TZOH)'q:9WLig4,-xr$ɜO0S %^# r`ZcD<$b((};apK6Hl9'7Ychg~ð ǣ1p_ ^(kv\Ea6w|F??!(a7?:m;A&3v8HiT h:s0d7?y³?l-ܴҘ0?a]YIn/tJ=FbIq'j6 <7FJmuP_,o"@jVy$b'u@FUkwS<@t#ԟdyh1د&4鹤0h B͕K"pž ZUt)qiaH.6#(''nUM1KZ@%q.CoRFzP/vu]`oH(U$ uBps"@i`jɧMxhrL@o\3T֔J͌M¯8)ڻ8'~9k0/O(ZP-+" 遳a1>O!BF2$t>2xĮ73k;I91H"̻߃6?A=֗(;T6 ;2XLg/%ch.PUE2_J`[%X7s@O8Ȳ0T>A y۝`׿b29h( %d /ZYBg>g#L@W?Fbuw (Lc#GUKu; !R=-1)Vu }2YC(uI.V4+SZ%"mcp&\S|Ioڊ pI Sdl|@{F\#i.n":ih1!MpKI_3cIJM)@VDo%]Pjw;(꟤]}R7}Yi/R2ڟ\:ys+qu AlǴWM.?1zZXˣh7K۠Քzz 5kDA6YHΡȚ6g[D#T?Go1CX!tV( a %SI[KO4z&aGԀPw̒74ey (>忷Äj)\+t辙\(LlMR촥͋>nTC9ЎxIQza& OEbZOi_Li6= _ ?϶/Vu.,4|isiq`r [M h!9{$ bW6o%oeJNi+돢룷M0kzVDz-o7spo"WSr[ %cL))yx@Fr*y>(B`BnO%֠21UG!|W<=9p]``MhRBe9m` Yq;HjʞA_8NֳE?3{5H*WMحWO+5i^Z:6ABҹ†';EyY/y}mO7 )}bS[1Fݨ%2.̊x>p CQH :\c6oq]Fe`ݖ?GDe|[hȄyGOk_)(HE"` bIS=%D.~,iX2+MV«xi.o׹h/,R@n,md7Yz뾲  lq2 I q֚J_$A~ȵlf6YAQwdyݮ1 Ɍ#-⡼44M_csnܻ h (9Қ^i|IG ;;}S,wwHm0'/r,k@>{L\Fciz#wx(Z,33;mY=Is0\bQB5"Rg wWg>YI ;͑Tz'1FNN+wZvZ Fˤ*#bUF6g2MV^V+=,9n$ 6}@"$U`#ҍ8(81+"rMlu!*{]k=$ˍdZ'X?O]' oݙև }LkZKgz:YUʄ nMߚ*G7:09c)Aӹ5bޭ'b'vKsZj?z)z WC?O'_r85Vp~*HώZ( {T FKT#S!$רּx_anJ9мt6O1 $MeX.६i7xNXY'6U__q\l-( ޙ >΃H6pyB/+;6"@(1xkz, qa @uFiKǂ0߅r !6\-v[rLY;H޾|T|=ue;)ͷa-F$Vl2WMKjg(mE[O ז(I&_kb,LT:#R&3y%v`MĥoiMB٬?4zg5׽0_& BIR?$op Wȋ91+4Se  'n{͘q"Ƹ\p k}Zt;2 :rbl _$1.hyQaO~ΓKARUp$VS(n9|z3?ކBK³`UoMdjR4fo- T~-3r+FԯLAmR5D+~i (y @Ẑ#ogWjpRp*u? orEC OOGt̾.Ǩ 1IaeG}=El 8;XrZC7IWL. P[:cca y +o`9!5 "v"68ܺvw"L:Lcv!FB!]DxxoYVH @ Bb9ްN&Jn@'I3{z0\/YfkXE? L5b*>]kk|7ʤ%0J.M&vPU,k3Xzrd]_- =ͪ\6il^/l upCDI12=I{iK{MHď Rs `f53hu:]mJH 8~ ~6w%-]o@S߈;vw01;q*̟u%j3FC\͇ B:KG!ܘX3"4Iu e[a*a <GcBsn})7|T!QΣ.DZUeMK l;nh`,tS0:3WD{45EhɳYeZ{ACW}O%SFEe`T+%hT[x6)U[=/[blc.seS>q#_o""+Mjԃ)sxu۷d _kt>&|ޱVNn{̬.||*,!&="LE!7޿NIIࢧK*<;"7$G$ Ӹ;Usgo`力Čךxn)Hkk^y?Dޚti];'yrHה50dx)hKwmJQl.eO5 0e '{DxLL>x<&|m}O~`=?-$圿WqZ,zh@'zD $G_I8rlPbkz0"w#,B恷W$~&8Cs)-zQeq$_D2N_LRϳSaf|43ݳZXrY'ch&aH-65OLUb9 |mNR @=L]m5wOȎ[M팓n^H :ע@ԧ|* 8E-dTv4\}8~ňZ\c }HM>|*)^P=[߻);aw0§}CQ[l<}?p mTS6c폴ERhX`u+vAhdMD/vshJnCѣʧO: KgD0DU;lE NimDPs3%)Ad@#fCsO[*՜d$8xw\[.x9:ʷ^Acbtc*/Hk@nm}rc{=!@S#Φ*ށWS ;A_bwm2ޓ_@o_ L#񐓬p.C7 &Lu׾wnif9>"^^d9I&uGnJu w+4#Òec71ߪ;Yv]M\ZK]JKHZ\FuaQa@I$7\HЙG * SJWxO)y` N%dXn=#p [wC^zCjTd#uO}Ճ1Іl-LAP|3[/>$+&i*.ۯPjݽ]$? ,c:Nxspg3K^FdIJC@zhTA'|#C~=w'B?/A4GW丬B7vjeYhN?4MuOwƯ8GjEgÁ٢H͠sE \j=qsR NC _j>* ؉lV5lh?R߰'y4hl^1SfƊ9?A }Y5 jCezO#&uwIh۾񽴂Je+,7p[WZ8\ &YTb+PLH%ih }> Sq.Lavc57.64.101s1 K VWUލUxʗtkw%\TEcyl5}$WC2"~\OR [4?VC)SfFY6 撅]ݙ'UKIWLn]*FymnS:q+-B{*xQ_OLg)⽜^@8[N鏓NҶ …K^fpr| YFL>o@Ztn!3Q&ݠeqFОf ]AEYm!zU[Aכcn1BUɊKM LWut%*-+ *s AMb=Rh/fYqp̩q]AE %} 8Op)f KAXGr*S~6@$@ #/=)u}~b? p~r$,P}ᨭMJZ-a53uӄUS@рNU ,<gӗ>%-WLHY%SvvAkgb=RM>2KwPZ:vN&cUϷ^{ $S i6ԫ.$'tpkɬ+D%r[DɋJrÍFjY6z# oRL%g/)L#;{#O[lU`˰ӃO[ ZD,71!-r-1[9g]4EYk Փ; V@ݸ%;zhc2ąNr9ˆX;kL{5 %O#>6p"=:MJ3-l9)V+3s/G_BBFu[ݏ[נ#܍cgy(r6}QFӪ!ǰY/䕍aNROnhr!du0V06E%kBʛo~ml̅o(=KT4t!2?X &]ΩY{.#:F&_G -7W,.\-e4Q N/F-.|3x:\(Uy;`/qB2N,<^(V~!j% Z8gNQV(_]gG1w6K #.!tE=1aMe=0kyph.@&!{M)wD| m(yfmf ؒwZLI SKT9YtZD㯞&hlͧfBt@"Wgy;;!f΅'_1Ӫ?:T:#8#i.ӏE뮊*bխK$ы0gcG-ozˎ:>W;ɂ5/zݶ,0P<.zY"ŸK]oge9enF agnr6ѠɟޮdG`fi,DzwNcS R޳]/Zhp*f70uJ 9Nc/ŧS vpY ͷ!O/ki&F# G0jd `?{E8=+@=1Z ODŽ$/:{G6~77S$3!Fɞ3a pQ .}^??X)Ue7.o.’dct0̻]fPgJXK46Pncl="0GC`Lgijس+(%_3> B&2$C(;QH5"-N&\6au8K#ߺNkF}@V!9 =_N\5&G$'",di (HW}CB5ʎx~huGŖ4e8 PJ @;ty gi)aB$q2k0q%w)by(}mlA jJtgAA*%_~xNd?h]-uYv d2 (yCǁp_4HIo~G ezW#Fk|J`*S7v6LN .$bnG9[a~@'˵Ix4Gv`.xOY>ԡw`q17mzkK 7yF4A:Ce"B Ù̝g|3[Th4L_*)g]ׁOrV %N sINr5?VQBӐ3X;Eo߈<"C\H@n0ɶM8AC45g[݃ZG'C|-({ פ$GuPym%emj _Kܕhy>H{V&cϸ,(ý֣H.fF^;6B7=5G % 2n`[W9~HY*R}v T"e +s*lfًqA@v蓁"61fyA6=V88SIU/#(_ +o=K0?7`pa^j|H)q%i2g{2#93mе $!:D\P|rE+K6? 3]EQb>þ} #k,k|T *BAXIGF!@6 \!܋kӀ,"佦1+@+j}qM`9&rsEM= 8qA233˸ӊS\|wܵ,=5Ł}ʆɋw(8EA{A{ō ߙucB+DqOB~.3T/5|K!+&~ 4N@b'y񟁉{6pJd:X˫(s 6D̀5RzL:(yݩs2YRLpWƩrY@hx&3d͓3 ruϲ,oMf3y$i3l -cM_^Ou%?yYDO5kŎ%` 7/yVX1ױCp<8BwC̛8,Zra9[A}&WK -DiN%4ؕHo6)ę46/:QbBB]ULisQ@D lԁ:׀#Q*(=jD8Kf&18Qb IʂDӓhxɋVQnN=kW/Y#3sByrbq.flGt3CMJ1T CS=)B}Hv30\?6Db4Ϸ7#s: ӏ.j&6 k))(7gj킈巸wwZCBK̕E̔2_/^F#&ץHɟ<0jX|Yt I5%_5*`J0o`!ƒ٩u}Sd<sxsAC^Rpz&DwOnђ c~4j+o!}< пCxڀp_<&<**FM..om_|fH]:^!( y΁^dV%0{A<r26 Yޯ\ig7JYH{_35-fyȓAt<横C|vañ(5` @1*mS|7﹒v먄ve9@duj^TѫP2DDB *h+b2SSVEN 1'(NC]Ώ >KVn v@i[<{=:qԭ4$#(J L,mc7f+{U3 8 G;$e!ObScG0Qts uЬ 5]:f4ݲh{FBFmڅQ2$+NUx3"@~׏em$C笫Q~7ϲoPS_=yn#Q+_uNQG-}=kZ$'(/4Jlknlos\3@q]K3Py:,a㼬fRDdr[ÀU? t/qd@ÍF6㳶*[Cmaxr\^˙';Kλ*ѼE.Gì7f/4l %. _6 -DwO&mc8a'. ߉w?f 8Ѣ5*TL0q*S ONPF$3jdS-Jdz ':j72F\xk :"rgpFq~r.ܠb$U8.s>oɈ@M wS2%!q<9tg0F޾\Ӗoeqoڐ:4X`NKNrzX2;XH 96Xz)"7rص`TkfJ8Gs#~uhPb#ܫnF;D.$`1Oj5"*ExI׆ {c@]ɾlc!"Лk)#1W"m^y u.ɁbXƳVEHQW@_2Pgegd%qZI 6Pv,]WKt!߂O"c,;Hd~h&~+k}.&+SVPgaTRE(a\<9Hfi:4Z>P R vwfCڕZ"th/Jvz )'sxQWMkcF8\0RdC1%%&-mRN(j'$5e1m5Ub*yFh卐+a_(,"'UL,iPEKD<>mp*hŠ~+$5 Y7?㙀PF˚F$K-#Amu<$ӅD)}aANt#^$֘FS㶷ѽe!+E|og 4i#Xsq6Z[._]O z<Ӧ  Ҁ \Y3mN erBV@QBd]8\^PBf,|Z`RQ7G^BYbomaF7{!?b7Ŵ£f񦲵8 Ry%iW_2xT5v_R :u6F"a9T^qn]FGAaT#ՉѨj1ZSZ ɮ=~tz]u5@j {zQޜ6ay. gHZat"q1l +LO1ؓRN1mӣ+wj6e$3@Lg`R^Hے6ʎ>xM}Xǩ^k`^ BO\R]JȐn<;E,kZ`GKIWdE'HWqQX̽徫0#j K/V{yMQ:f+p(6؋YV#:r8#]@Iu9KS% &?`_@c?!R⑍̾K]]e2Dԡ#@?+'S$}n*6BOW7'm)2A6 qhO;kFiAiYpI&Ԍdd)yjk !/<Ac !w)?#]RiŮ/."jV-mI‚CuN++,5A;.r֣""(4\ >Q;et-KtȀxO#PL#" ?-9ѠZS-+{G7< q k% FOܘݩwGl[R B4(ϔ0R1A#ɫ'R͗xw =x 1vFe' 4XqɇFy XCYDICfjyߌpa?xz-_2f$(A#[Y?F* K#ٛVY%o"VoV*glj|{w2 йXv$SMڙ IwfUSyC cbq XYHkb,Rr4x:1&}ѽ Ǟj+d;ګ#ैgA3d,j MTK zXzOE"oZ &GɳZ-&CjHdRYT0j-T!Ԙ֝L"i9$jݬʷ87؏q20vD9q}h:ykVGQ}n/_? ,+/QW/C}' xl?1@ZSy&B%|́v&n}[!\0̶݂>GaKEs"߉ tpum':7i׶rXm3$J-5? Y?j^`!kpp ;EC¨ yR[g-/d$H#JרVS=Z8hd>TcP<#(b5$وKx['k$%MG%EU pD*v*vD˪'9Y&bd zdd/mZjl ] WtSPiIG9:-ϊ Fk*Bd~ʹ|I ,<o{^ڜEBBf\W'ɢ-q ϫwU PuF^!8=zsڏzi Bk<!~5%äi瞶򙸝rqV؉Hѝ򴃑ĩVlz7[p} m02H 4 59C^?躊!+l 2406پ>:/jq*-N hJ6)Օ2)t׋D=OH y(C(VZYaݸ)>[Zϝ;1a˶KV  "z1/ 'dQnCPfQ4|\G)6Ad%d`Ofw*YaPn"4y؎KNC:T -+} ֯."οԃ|D9bEtj(TB$CT>vMʏFkuܜ2# ̃OIzlgl2x}9liL8,Iwx cuPgmP6]Hba -ﺶ ֙GƻqDyko{Pq[u{p /#*͡x:ևz-V5xCPlOauj|ď)vD(4V\=՛G:fXB&o;ktM]p\N\N]()3DxByz`}4z~p-rXxh춸~0]Tn Rv/F4_9BBKޓ~_mtkc5f88$U H.@@O8{c2rxˍqWb ECK`(ɅD~pv Hy U3"eE{-8wyO\vG{+7=xR,#˼QS#snAAJYc+=8 Y"ƻ-cQK >t:tp T^hdLoy*5 "j[~|V쩉~C-Nd-vI?TB_M5d{zGs;^,<(e5͊H$?(CG_`GL;ɧK!w=JHCՒ2?-f}I>!Ѧ&tT෷HE:v]iIׅ<P[J7NtN}om@Fz,ͩ/E;) (k3M6"ʖ@PT=/}tWb<ӯ:ְ4F3yMi ֮ AQMj0v_ #ZFhEcn:M dqjҖuQiXVDPzs}K#T+j}XEْEFKB\+_ҮK Y*mUZHDu[!`NoI1P"Ճ&`_wTT X5 o}'XVϵ6z&pjo~u'Ub8 G#qEC)7;x]k8bK'hNt0r ry}Kx ·>yR"IȲ~pgF史6duS{IJ6%9h|'[i H;F2XU =3!BW 1ʇ]m!o*7zB@Sʪ57xD^~G]7 Ԉ"nhI2Bߎ ڥܕ` uB` ˋIǪr.[˖Bч`%&>l不v-t*'KtB^ԡ%_G0F'Da>C1KH͓Ǡ#Q&9G[^MLZTU53'W ̶PGN; !Ge9mtQ#AgߑCskPK>"{Zd @Kﯗg_ Y,Z+Yͳܩ_f&P6\8R)aPMB5^}R F"&xTF"~pր㩤wu/0:6p*w0ZLryu`DwƬâ#v9[~waų؞Zi\/R 5;$c\6b2RJ` ط*>>s!e}]*c ^}?Su!5+H|P@o+/wHeɜ-[7ҩ E_(`GpY!]ъ%K, lYhkȭOF"]^SÛ\wϣP 9_]}ZDENx⨀ؒ5w"aW$RϷe+3q,ٗ~x-mHJv>[Hx}qyQ !r[L#>-i}IT,m##+ßE?Avb1EOªLH@5k%^rUWqֿP"fdՄGƑk,&0a=91dk`6mht;QeIӧb,Z֫,=_wl]?t紂{H  'G ~AQɠ@ܳ% =Ǐl@ѰM꧳,DZqUyŒ\@UU hISxn7^4 Z,E #|kq㰠s:Df0hS*l,Oz%'BuIG1|)NW19V5gFLT9گ' $p_xb r) &&mQB_bi<>畐:HM)d)|(Eﵬ_r4}]| QvNnqWU,熅Y+`v_82ک=>ҦH{Hʒ}nHB`k q@R91+sxJenédW[뛹| U?wݳ*MlTHc{*&Y-TuFo*>V{~mk<߁2!V8a>ROJF&R,B. [ZVy;>=̴FCh>l>Ys}ٳ{- Dw,w-cPfXf7hƆ`ђNLLٳY,C@7Bshp$6!p;a `a|jFNFPp}fز ')ICJ&f-5ge0jKsE؅t!$1hy_1 +$u`j50-yC `E[5Xw'Awz"hxh5̈́k;!ŻTtO dz-4BlV%c_Gnf,hҭ _Zx%IE"&~47 8Y#?Wu> fٳ#:Z5!b$ CCEG[Û;TYD0rAqز&jƑE{nfkc)z! eK厧|^ &Y%?|]=/wF71qKaE S?Eط˃ٛGzbe,?T1C66t㺺uo" ڿQJW3x~K+.BZSBq)˕:u`5fq`jd24ee{E\1=VL:0;1sS ӓg{2Fhb?"p@-^d-ok[.-[Z{oZuw⭣u8/k6^Nǰir %C]}אOdP\C8fd4A 9yD6] hrlՙb@Nv"Fw@ُ E,oaܢX59F.+#!tfε%e&Nj)eF`ȐY@ 4>0Oe!:l"~O9w. !$5˘SEos,*`]vй^NmHTa:AsJflA+ ~} 3.oړb^/j+oqRpgC6`PU8{:rH./*B\j dF+M}eV{7L#@)YIFaX_iڏ3"7\VB ՟yVL8WP56oM?ATrAIb'@&{(P:U2ƒ$9/kjJA׬M2Bk{E+Y;˔KQTh%3hz2҃XPGL3x̨ 58ҫ9;4^үCśRk*'j%,pdמ*J8qgTr_}\4$nRA/jm} jl:O>+[qf;APw]h7/ĞSMLu3uN:-]jŷTT$#0Lzɯ)Lx ܕ<ϭզoTC|3q~KKY[0POU"k~ @͞Y ;p Ơ!o5a[s@,q+ބ8!Mj5G;bi9a``MzA"zI z}| J{*۾Ta,"P@ѓ aŊp { 7]JG*#'d ^j]hZB:^V%N"KH<*8|qfBnj̐g?8sGwL^&/ zkgXdGpƚ>Sΰpj1tsyixkS'ە5+D(:e]R[D1$?E=#um%5ﵜ#i(;* NvЍbkq$bNP6Bd9OߖD;~ /=sVTԈo .Jr,ФO|ճЍO#_$.>I~<)T4+ܝ;J |9b@Lrpt31uz'`k|^@JL7ZxxLqkWu""$TC yzLZOj_\mDh/ wyilZX{6F 3<1{s1|*f ﳚ9r$,hilkCŮqRq)\0W kAi -ģoթΌг)ZC{f H!}te?!jyJ;I}NKXԔtCq(#u絛 %F}(XC"4EQMI )X8_X 簲NCM0A?oϛm&څ$ȐkzN|* ˽-a?5'a9[=|ZfN΋:1XØa_Xղ¯%'xDuõ3E,Hn]f(܍UR5g0 .aD8Bmn*ff_h`PUr̘?E.\(Cd8DTaȆi` ?=\lثWbN.B7 rpu?^LT7OkO9]\ɜ;`;Ix89F_Ḫ3hV~Sq0(dRČ!o "IxDu߀;1;L;1ȩaq_\tcpjK'UӧCo^I ^ӧƷrYB;l7Z y4{Qvu0Dz@0Xm{JԵ6$6 v-]+i,,RPFP<~XbӘhZ y]ǧi].̡,)/5JnEU$\Rw&ImS4Q0'F/8x宗fj]"  (F_q9N@|JL)0u*zlmE@),Z6N/++~,5? #=:Zn S&0{ݫ/O߂bvJ%R} /6ЌcX]'XvVc)>/Q& @ץ+NQ"D28jcw{G@3ODNT,Q%F^ ?p@#W=ʭsj,~]0ߴĻR #%1uK7=m uԈ6%`{*v={i+^-71"X==nS"f叜r\>#5KL|(jG& S ]_#p0rJIUsd,zBgW'މ #HKK}`rٖ.6Fi!{p:ZG߯~BָBdO_B<6Λ^^t@]3N|ڮԧELR)gʄ%ݳz)L_ͯ}= V#QV7sv ΜIxu#?-jz;[^첪받Pw;\׌vJJ)p7`  ~ҁ,AF'OC7+b&bA>F煢W'R'pA1 RPU;* -52Ԓ1bZZ'\^đI lzk^믬dvkQ[O_N&s6 H?".Д6 >!qh *J]1vB dƗ8*ͥuNTgjI~_S*פݕl?<'ćZ xj@tTq[?:Um=S/R^Shfd14z:A YC uRD$Z4$4[1&ءך&7Mq-ɍL8ĪyiIrB>@I\㎋O7U@zbMGG hdJ㰅DSiT] n Oߒn}EI\cK=rC/8w^jVe.GeсfX%VYlGs8;ydU)^o~\cU~8o}Wa7lyhlPp Q|WFe6PCRlёYHv-/OFS,h[3l}n1ѸSgN&Ζ薍L,^j) N\3(og>mcuX>ҌYPl |4Ξm;tHoғM_'k̹h.ӈ9&>&$jY ihA4g{V=6VCt "0~QJD hN5+KHq[/w2a5vl*Q>:ɕz [ԃFr&||[hpJF!U\/.ȄB)@S)_6,䝽VfHv641qgoSr !O.~lK C e{ƨ^ɼv edU5C{'?rdFx'2Va{xûJދVl$ūϝEAŐKNFs.Zx2CyA\o}\8{yR[w}n괟{iP [[wZS7FL[Ӏn|NxuryҥX!Є~8\u>PQ'%߇2ۇ Mi[7z>DuNBH#$"|͌^{p qVÐ$S&{$atb`I0 9W38,ݘCBN1ė><+χU.)_[79$$@L=T9u+5!Rj# NtCA-޼F,BӨ/}P#jBXO5/=kӉk]a~rx˱w4m;0"N {4Z#7,zYpF4`~Mۡu;^!G)uȰ Xl#0ZH1%QL 䢞3Qi ߿^D19#ez.ƝٙRV@e;[_\ ý t;,(B̩Xl<%_ m|rW䪽S73hY*4wfZv5^e-jZ!CbH pS s(,Rdws'ɇT\( s}F` NJ#U@yH6me2,rSDT=.帏vM^ 6e*s';>-Q?br\s bݦ xagvl h;_ U9.Rۦr}Y[‚>I 1c y5hrBr @AM>JIowGTN>U*52wF>/eĵ; a3g(#+l"6orMj|sٵ4iwXɆ k.􆲹,^Eҋ~̻x\sg'5"DU;#mнMQnCX 2dqw d'#0u:}dPsB@@hvrN>S|5}GuejYv>rNLvBR"R9dlXtER ,CURh23 Ivv].16[Ipw-I]7β,HIiSfl{n9)2E2wpC%膶.pD % 1BN]A>U@U0Amq 3L6b& lG0(]iQm \~#(sEX S1s9;e-ffW#n]][fM(v>\]^(wqN-h,,m0ZB@G YRB>Ӂƅ 8d7f &1f(t JJ6x Fؠ3L @6~Z9{,-%RI/!םow\.0 V,Cc-McQXMq뇾Z1ˍٶWoTkwe6jqPr &i"> ]xMV}Ybr d^wi5 5`yu0"(PfxNG!7Da,3W>qc.0QA3?T~!E򚩈<% :htP7aQE^lA'I Re0!2XYe^@.$׆vftj:_Q Q8fmV0MǛM 1۱EhII$6d?L{ELBǹ^Fv <SG׽M{;%#戉}ZPq|JLWI(`3w:6д2 P;N`Hٰ"yq,Xnq 0bKIE^6FvqnEjMoFMb寃҇`ɂ!k;hp){vfANNU{DC0-3#D6j2ЬY\ zT!jp:] *~dBwD٘@A@I[۽A ,u=0"&)p=ކ>,oW;4`{kN}~aoK!?W ^`m C6/" jhta}d.2ʬov_G3+G4/˂@bM3,rDҠԆu4Vp?GECU-e I]zuePS1tF'v%/]qC}-6ۆ3+0#5H?S'K8}S2(u<4.i 3DI4bw4P]]MwӰ( a[0Ծ%#C RYWxudISvMÒMt!gp}{ p+H%2%]F2[8N m!N P=nDb )QPI33_-tqPq D<( @y $}ٸkKE4g} yWbB)^d@eG Aq7qv[HMU G~sTʃӶŠV {VkVΐA`Ú{07&xEAe2E7Llºs;ڂAgl*ze_UQ_Nڜ~dmG0r 2+ˋ@&F-k\X1#G6oxTnE$WV_EcH 'z Nz$Y" "^D^2dX[нr:{wjb*wi@\=ka#CHꡙH$UGiC5˼ͧyFt;s9H VeI*Helh<[KO_ǮB  /NB~4 fѓmMϤ獻ːS ] U>{5'q29[5EX9=n| y`B;N.6tҕl=G)ϻedmyd ;B.'`7FHѲs1S>e-e>A̓f=Ng2  542L;";rHha]EQjrG{ eWUjJU$rSVHsr?; b!Eer; eNn>4 ";=:'> 7h\!]Vi`+~r:Y4%jk`ՖnӞ@涐 c 1L4-7,Smns[uUypBvI'p01[f,9wo1k_z4*QCC`{ BRy%XzM=I+.I33xbHwBmOb|E(~u^eA nZ[י C`U5?!xKh'V4 mFt?b~P&2f[,H$]JͺҕU#K2_t!C=ki{4I!_}H;쫂MLN٨*Ya\1mNKKԔfg|hW:&^2dCB :MF@yw<@ʌJ%/QN[TKW#d.k5GT0ӎ ɒ *\ȏwPRi)WyѺg[.Е1^,;WUO^p9kԱ!>`WIs̜$}J*О{maa>/ɽF\(-ݑbꠞxVWpBo;k-Y1 CTIoɭdʪb髯U< Z Q-V:gٺ(h]T: 4 ؤv,2b qCF65ٙ'9dTYNAdnY]l&Fs0ĵl v:r%KagД9+˞ckZ9iei-: Lyb1"`;g`nj++뿢0~6eIp6/T[VEt/qUhk;zH Mr?XuF#/9/pV;%Z|Wp*ꞁ!HGP@f x"J yX'wVlíyt~T?˨ļ5@F /csɐp022t#]csfas0<:8)[D=wlS˫tOO;bFedp&dU(" \zP_rW qiQP`m3K3ޔ~!yæAPE?$=тhs"Qs*$g7HUpUB/y*r߀_KC0z7=we&v :KNɗ^6E}GzrB _/6.j#?-KE8w=L,Eǿw r[`WX-Axi_vG_mtl'FaI:zwyU L=[ƺtebN qԛ;+&HQW>[o:34@EddrdO:Wҽ#<0ow71&{tv;&]ItL^''caޅ^|X6Qj-)z5!畫v}NˊQi z'7o}p1H8jEf #k]7!]i݃tO7-Œ4Iv:q-&28^3d4 +ci{4}P< 5c܆sWN $Ao"\}/߯N)L+cgZU1ЄE]r<_Iۜglcr`uw|Q`"V]g-}f9: y߷;bKfKj%Ԓ{ަYp,5L^?U9}nސd3+LTAlvc[`)SzA:qOMΚ"JokL+Qfg RbXRդog".]6j#<}at]!@^*di7P:|8g! q}Up?vL}3jAEE4LwȯIT%3`fU+j:G;'~Op`.AY%3JVwIxލ K9 jZ`KH>o չY7c~a$01,U(>@EY.}򱚟>ҽϧ^:c[;U\<4 ?'M_L2/7m)^Y%!n[i~`w9p≣z\mAIrogUH MЍA.ղ( =r-SeX3(raՉ_{ NAB՟U)5?_zQu) Vz0e厶b4 c9U[jxoQEx^B9ɏ_$;]PMfLJwi9*ޕQnFpM>%Z3Y!Ar7_x~-w869F]?r5¸4YJYg? J]&Nm.*0G&O^'M\b0#y1_ԙ_DQM׭3%GZnĻ`\QvAGL6"N1"d"*lj> O '$1Sj,pCǹ;J76叅eGNC\ܪㆯJOn?[:ܛ pjxxOhao^ҵiωhϓۭmd%˧ Yi>J[ĥ0fwzJC͔;]oH~W(3j`3D8=\]u@겤<2_B玤*R"P.-$6|EU)Lv ?p[]\1_^P!pOsNB=aU*GBU~'i#M}zun%4{ i۽5U24:RmϬl(&`wJnS1.ݷXldy1SkߕG'/ȿ,LS3*TzdhhPKwh?g AF(~mc8g Ykn%۾>y!/C'XZ' DWfP 8\B>.Sf' "1ToygN1B"G7-i|Jh58V,Q|RD"3WșK,jmMU\a\Kc6sV1|$hm }cBҥha0!_zV+T8Hg)rTS*>}kцF8͡%rhxE82,٭:JMN4pSMIm2d"ғA|Z] 1᱑_>oFAͻfܦ>oc?prd¼ Srb0l{xfjB֙s8s߫]Ajg?`E3e<1hͫPQYw(EO^zPm_~II$zJ~1!I$ h*<73dF|eshmqyZqv08PAܸy' X jvQJ`;*$rW58dedJWe:h܁V9ld!YKqy.w\K*]pƕ2,>,)$ 8i R)82J{;ѿcu/]H(>m·kqQJ9P+_E]<54ݜ)m3ADypߧvFAKV77#.0Y$d䖉);(L>U"]h6^ape">mePe w (ZGO)Tȹ0vD"FX^EN6qsO?A>Y(wŏ(AkIAhL[ӰUۻ3UTt:7&BLK(pƖtFԯ]Daت .W^^„}Ii0^]:DMV}]@ iiW}G(1t뫈ێD8$kE3#~=̉( hڏ\3yEd%]:eaMoQ,4Utb;쓤 A.ziy"9[>y*]TraJ)u)FY 16oԠ(S#2j6' -,VT=2P*8䭖W2<&q7U*Qt[{Ev#־ֱ'1l'丩,3beRӲax`r)o^.P9aBEWhe 5T~CƄRdH++mX+ NuͧwLa" f}όK@*8+pRQAUak^5`0Hsg:Dت})pW2+D)dW⊤۱ªRPDgD-Zc'ǣ/6,!۸21㽙-Y_%E0ŲF lIꋗ0܁Xڂ'Xm~g^ PpQa?!*Mx#t>#Ui 3e^0g4/;q$9 ihn+vnzxғ*c^mM~R9 =-jb'1~Uyڅ:UY$v߷nsqW 8LXz 榭'c!1۾YpsinH_0Xt Udl\HPh˺%휞pנ] mQjUG^ Xw] yqqt7tR5@;f*+͕V}<|:!lZ0sYk;@?XO+Gl@snq7n{EK/Ěܹ!ITDGW#%+rz(Ws1S˼6]D04M~dOvqU  @p{r[*P,j/U٪/Ocw\y=pF/Y\>\.Zp~>(9YV߭.ч WSj;zL? b ;2Vs˲ѝLQ&%&y[ڭ2͈:ل"Us{k3 C2a^[yn4+^%iU-hK1?WFG79|,nđgMuGs uFj")i%WxQfDʁF:* K$Xs}! “ 3RROi}o‡t 9r<[J鉶{ĂwpakrXqoY%Ė?+S8܇ ˻dXyk4U@%#Myo9ZЯQTd|! &ƨ }7irYQVuR=UӍ"o'?DQa ild_&B ,~W9V45"X0:[Nj+y-a-n8w'ٹ`=`_(sT 6+ c|i얟WV~q}ƯHbXnǕޝߔAe@ܡ“4 Lx̹8fӰ5Z<0+n&ZJ Fl-{Y G>5}|Z䚯[ ̺T 6äŏdHcLEXA0YTH3!/<_e`qzqQO>;Y~@ChTΩm0sXUѣ-Cv$\ZA@c^cGO2L)<> fT0V)Dws5}rDP 5aƑйkI`,HB9R O#bNNM"!0Ԓc6Ŏs~]9J~D!hv]DlZI$D{]5Gy';YlG*262pfLɤ>7KW=D Y+b|n5rl&fPLvo~ ^ĝ_B N J0(hF4pyT;9p HnA8y( Ԍ=A q`:k:2Y}X@ 2r}:g=؊Abhop'Ch!7&MA5͡gxy_9g>rGڧlﱀ/(Yb avUmfEa)w'և8 x9u&h;jFmp_?OuspUtIAªE_z g^'J.RBNQO׶TDm᪏Z?G>= "xDF]`z%Id)~U raH8ֽק4{{O~ɫ15U(='e^+IwM WrJp!T$TsQu+Fr(]SƜG./8%~Ϣod6QW>z0aJu&8gP.iKSmr#Y:n!:BؚteQ]OAL^'ǺS[Woy:ƙ!ʷ"I \&͡3oy,",^OشLI7TV#]Qy8 96P\u}Ĩ/uBPF7(70)o>țbXxVFW8o^7Ą{R,7p fwMP~yT ndנֹpX@•Zt#\s{ R*C\D۬mM>v nkMsN;@D1T>|9'?QqJ"W͌9}6锄 %u z;PVlvݮI)Px]Y$S@}(YmJ O\VݾR=+8TK%,8`7%s ?"HfK˴/p>4?fA* `=~RN_KMeʯF32ͮ!m3 ôb-=W|AFF[>~ܝdUeg6.:?GV$h_/_~Ԝq8CS`8%;6&$wXѤWVLEj gUD qw |m6bnnGKwvo bO]c,عO;aZ$O:Q+2XJv|9yk}{dSh# nH֕sOc%ϓvPkc*@Fj"{j]$Q\> ZM8Y:RTj-zyפF_$[ÇV? TUZ}p:ЎĎh"E[)b[uħOZʴ^L* p/01F`kّϘwjuASJs=ڝ]SZ?uZ,() 0&kQpWIeveWhl:AU!܎NʑF"f̏"(sEM.3h"cT9)'#FO1$ yA԰_/ї(dnU)0j)0z]LA+\yì|&%6RT$O ^} +K&!zKb0F"~DIO;4p.;Iʼ]̒)u\9"ogiEΧX# f,!@1zRO`5h,fֵdu 4\-iO>9/n, zqbRK%,+8%`-b/y8G ';/!эQ!5+ Õ;<@rjLR[ M'MOăs~cGTiGw.:#>]8x7 uJzQ (? лE{gv3!@@v|%!RQ+ boUЌNeVo ƴR@aU)V?Wr_Uv>; VjSNeYhsLyВ8ւ dx$XܟքopcUG'~rNXwwE%G|{vKIi? Ӈ 鸁 5eEԎ`,:N"9f}z)<=WP"nU֗Q@\삐zƟѴ[C;"`h<[xǦ)  q`uq$8HX_y V3-,,Y@!R5s_EwB-y&0щ>%CkSۄqk?pΉӿU/ߕS*adH9iiG38X˼R޽k \NP'-ЁK-en] E!hڡT(}bUDoW%Upt,ҫ Z!!\Ї͢H,c/(;P"ܿZFOJi0ۜg8_$]? |[~SQb\CV$G3c: {_yB np!fg*>?3gwh yA]VXDs5W=KYT7R Q?{X `8h<IɋM| g *{(}Ir/# =}=>Ԧń/yJJCXiD%~?:+q#=0'd!H%rN1 z{n" 1sY'=s9zV7W,-!IF'" r[\39tkbnkmjȪ-뫊|{YqqXWlǸхӤW_jhSjdM{ V15鬡5"Cqw2s}0@v72 %@b 쪻eetC_ўY ?6/TX(Y=G`>zkȥ-Nsۧ}ףk0X4'74(qŧZs@#Yw&c6׊d~*2޳&fHD,UCY2U;ek JK/d3`4_lǴxY dM v& `ypFX@d/jl\63HY7aX?b]@ҍ$֚.STPΙ%yR$gT\D? Ǩ4l% %)سdie˴N9zn 1ۅPy16C!OuT(&#ޘߡDQ:$OzD^[BᔘX9M˗6 S)tr:aƦAoˉDϹzkޮ⋹-oJ`5ƌ 2pi@׭Ik8|V?xN>CC} L"6 $= Y(!;9ľ6@`)iчx%BHb}TPkDOZF0]}ӈ@MuKxmUoPAZ7=cy4ME75%vzx'1t}e_!v7mԼ獷CiЂ)u- Üؐ6^nO nms|aJ(M}x"UE FLEb`IM.sg#T0ͣ }:ky:P~VԦ{|s <׆~4mtolQkHNu#N+QgA\|= ,jV  #靘HjkJ,fmJ:">Atݶ#wI԰U eSDkf<ÃhxosY B8Tm8ys9:+pԈl+:[*,Uk'wX;ظ}G6]]ոc}hn.4-7&`K ts-Ta磦)>I2YUG%y S9 ;95қbc.%8ev XKՌ̋NhrjoGCu<:4SJ'q F}Q-jp<=r2JyR՝V)  ] GVwqb2[^`09CDRuanD79^BJ9j%Yn9U[ϿY-{N9M"t7>D3UTY;W ?d' /OJ % 1k*x`g$cC0`8 q'd!.uaR},V@++M>+.yn vc )mL,LߠvBN@kkFL7@8tBԞx8,&SpK3w5f%lsL)A8jCkVA){C^k׹J8Tz0u02 /UO( *~KoYNoT8w-K !u3w=O${yF O>}6%DGr|7A'w ~ŀriR Z*FV > obP(T AZ>Q3<>:z ϫ k-n3(H=z$ ߖ_A(-|(18gTr:_kA;Y2i{+[v(Ll< hnn[TWWmE6;LUb0%ҜA'( ܌ݬ" ZNUK&*=]a $&T8YLTh} aۓn ,I0^"UGzl (0eSܲ*uKHUΪ>C}6BGc:!=Ka=j:dȹBM:}e{a<, x adsSAlDŽ8Ƚ7Xvp":DQ؁Je]ƁrXwxز5惝vWř09AzsW%Zh1z͆tYCR=a@+:gpc*/G~1K!*OiauO',xXP?ҍ2Y,mFmѳU'i,t(8A;!VhJ=NKf4d5ifm4Zݱ5zRl]>gB =8j/4k* %h)',,IKu t54nY8ǃ=#-٨6 [q;8o%a\a?RbxmNCtÎxbZ9QDiDΥJ^]pj_[e܀ 滀W\ C$4HNR}i-^1ʿ\4M bNyÑ%*žْZho|dhBwiMĴLIPehŽx:M83YN+L"t pdWkEW{"xCкhqD_! خ<ͷ^Ͽ8[d76 w<~֤|H\a7 \[rʃwm8!zgYȅ9 [j̅]JF=9=cv\<~gu_2Fڜכ*RA؄>n tQB/F?y)-&x71)Z=SD9`N*G1IZR4K t8c#sS/20 |OsYv\'}KJLM¾KƘ-Wr;C^ A~I8.3"L)bh%RLSr=X 駙@B p2vRn/ѳ+4 6GmA~tU n?6I+2(@*LrAVH ^ϵ20ap맺fs͉oVv9Lȋb Rj~^aAZHKޑ7Woua8er= }Iv?Ÿ ɶ{3%ki.HxAؼ9Ej7nPJtCЎm8!>ؓhzsIn4q("1'UU~9@.FӶ ͷc2aF y `(da2X`{hvAX?O>8ާd~^]"m-ΟFvI׶ V w 3F gNM\PBeںEtH@8vQXٸr; WPLo)? Rξb.2A_JG`t_Ũ_ѐxCϚ隻y 1ʸH.M ܙK'c3D*UN 4!vUjmk!ruOEcA^ " ƮHl'%&#`77wK ,l}o![ o'*=~&3wόX܌NgwVYՕ*7 <r*@)tCN`8ۤHPf ָ pLr;幝W㜠5>t6hu\$7pR{{tICF$_bE`,!^ῖhG=*̚D[R"NU Qz#M1,O74tf:q7ԑF=8_:ǘ8=fi߃ D=hQk87D^- _=[R1tLbV)W1 7A0ی'Jo`XrCÏUW!fQZF&)F:5q) 9v[2 Lt`"Z/HXuo.99܎lO&i J^fRbSCs%Flc^l"5?˪٘8 F2~#|_y탾Ne}1FHttw 'updaCp6## %•& kdʑA 0hXϔL˗O6y&>3՝2bvVwEHZ޼矖(17SF1b$KFeCIlP;S"BqɹuTZ31,BV7pW`cS,t/XGvd+:aaO$x>9$t.h=r.AA6.&VE y/kTSsTM@9SQFL+a_Y}+g5[M*Zv7 oqgƖNH;B5ugU<2qe-4yFO@蚮.VH;%Mp[&t h ڷ!vi^Ij$2CCs}!#pEKCoNswAz9iN)cjnRC(ñMy̓Ⱥ= ǯToHLGWoX0..IxQ(вhͱS] ބSTe"࿦Eq*456YzM0$~0ەs'lק 'v |-ɓktXUUULerR$ځ 3z>VSIܱ8/Nn.l9hMJs&Ɩku>afͯ Fm]'5mg%̓9/2Y#3UA*¯ʞ3A%"kRvnem [ ؃C@X402~n $j>eu2Bnt$,=п9DkJn ӤH!_ynsgzOyZЉwm ⪈(?נgB«!+!}E"ۨℑmajoٮ! *xmpgU OtA9Ri[8~:f$.eHՃn2y|mC;*$W~?i ;NJP~jF{'4w^- }xjcz:wϖqd^{|vb~[_>y1Æ%[q_…VPIp&ق_B]z4?K=X6H#xvGlv9xf0DP1A&3joCWߤon ZYsA$F)X(uec(!m7+H0,&\?-;_fT].–'7b]t/=R™ӈz@J}b+U_O#5pRZ%0jGGa0R9·Q?*F?/c *(دC/E1M;-NH>ncv"P."-tsi3'j:*Ym#6X7ojlJ갮 ިޓ\j2+-ylQuMT>[9\/P+pw۪ڱՊs2KU>)-bܭ! mz9 q?I埶IR:]5OijF` Qu4.boRqA6,v"2XMuN$8#/o5DAކ9U З V9Lr<+s\fҸ'Xpߧo;w ]NjJ+=eH0UQm}R{, 8zQipEUߌ:y,4w2@v*M_] 8 w`΃A MԷ- h4/C?p bvY0 Z:Nev'~ IexiozϦ=u%J`To_^k-ZqP }UG ^ Xfg6z_DAE,=j ym;l)Qa"'Q-wq:1{hnʶT&XL+ҁ|rJs14EХĩ-mHFfha^, }y0xNG}\뫓(I{vп9E%Xe-|_Ͱn@\fBZiA4@rzHE}+_PDàe< l)W ­IC!|;O]N;3'X O_x]7nVaÄ6I5nyO5bS}!i.-2ﴷq 9 S)N đu^b lUu^6rM~>61 ޯqG(R0;)N#B:QAذ̈́A?Mjy@čC`]8[#f3Zl&<a?OQO L & sէ2֠4@I+f%N'`,ei ˚!buI5 1CFhX,rIjzx |avO zn2}2v"Q1{{D ?j"L_p;cUh$\H\iyEFl} UA$DhYKwfTE5Õ@emav:q+}w+{Ln>-S Yx$J8 2JȂ0تu=ھ~6^SVD$ʳae(>e⾅{t&K%̘_cjK-2Ax{.p` mM4X?M3@1/6֛#G^ 6[h{"b2a_ R9<%lYqeE߁D5kq)ĥw i(G8 p\2ٸcz& }z#(zu[ cbxSYk6jVvD$BUQžn%ɞYQA ^ SET8@k}1OW]{Skg@w3p2تA1~O"!vwwй'tQDaK1 [ݐrCmOhDW/#Mv;+ƚ aoٳoPv8wl'ZbjokF* Ve'~q-b_5,{MPʭ?k&{Dd NL* ^nC#Bq*mnh>5t`B0%vMgKe@W;k3Em9m! сY喕uWWcG/$d)9:׈>mPKao5J*=(iy-nN5NWWߌi$+BSfd.ϣyoka_A⫬x?,5=J8hdVM3诱MA0C+p@RH1@ &}zI7.y|q ,k۰'Ag#~2t>r7&YbZCnZ}^tC` j O|W0!{ i{7p1xCem 27Y>T_La0 mL ZÍ.C zѳR1lQ/qg)CzI[-;romv!7:7%E"#sys[Y}=eReFӻ3v$ϧ,(J'57CN 'lX4Ef/N0|.O;xuF$SZvdį;(n,wHa(/3{џӠaƣ/ߜqKVstiN CK#Ep@F)'R fmu =$Sg}^0֑t[KdQ˗k$l?CXhH׋$d^HcqӈA/tS8X/~l3hMYxNC ]2SǗ DY')U^7d,l!rwV$M8Ee|\tvn&kjY t3;$KnSO.@_(]6kD$X7!ltH@(RK_kJ2_J8²qKeIN>K:J-x ?:M9}wet]|F޹`88%-n[ru¨ql%/Cg 5b} @ɷ9 uK&$;-O7٦1ꆩ9T,ǧG_BTvbH y|ռtEtu>򩡭O\aNl  JVeӫ"%q;^yت F4q >f^&+a2 ^ѯɲ3?8Sޞ.G>Yΐ F۬02䊶f@Ki59.*c;.O(~Uj(V3 m +_"zvKMN~8ߞhlN#KYI"ŖC#''_ U`-dK6@07l~̝3˱^PE]i@f"T|WV]= T <|8~MR2gn,ݘ9{+3CzzȑВsۄ`E"."On̶7q]Z#5s!ք6衝;-kU Uu(8Ppٜ*U)ⰉуlբtT$WK莓қJ/wi3VZ#*T?&"!L9LrӟN|&׾nT'uZ:^hH5巕KmS^/nN+W:юwb}x$5)پ_L'iL9uS h`%Yw EmM} EQĄ@%wq</ӄ;egSXn몢%u8"iKbѩ\K ިh Jx}ZJP\Qh!k&r:_rjB 㫤J k9ZDy b‹0)Dci)lF„kMJL,Te~0NY׷ZSqs*nQUoayQ嗼25aVŜsW EK$&v1&v3ƛF" I;4O},tKO>YyPr Tn[c(ڟJnCyshXۑun7y-gg_vL֖97 `EIe&JDkr}.B9H t0K:3hEY@evJAMšlϦJ9s[(c/St$40 Fiw{;6KyaN'\պ/~ u6&~" >CNFm%;dqH0dSRJ~ 0 j6sRmT~ Rys-&sqo}nπ6 ҾC|8=iyrބ6gܝ=7ݵe"XQ LM_X2NvDF+#{0ޅegh)p 9Ն7SCzdß )"Ipe7u?kdB%pgvT+q#3tAbP"I8M=vt&5 ,LEVEꔚ=ʗ1ߒi<|sd:fF7eCdMسc43RdVZw[o+Ѳb{f5REA>=Yɗ% \0P !$ ׾`sQN/zK:wˣ~_*@ad2AuZRe%_L,H-mr8 ; \Oag %EƝ-7suIQR4NQ ÷jC՝ р;_#‚Qy㈵l[vg|_¨&0{aE]?cp1EqsxKxaф p@9(7xVW{"C_b')$Vn/S9Ɋd7q:EO:ʜT7?Ju44" Oұuu_yS~HZ, 4^ tߠB}sYG#'3wgIlsyIR.'3Ɛ6on-1/hb6RC_}YBGF~&9؍v# .o$ᮙpCg'zukl0cb;Pk P0jBD}Za$ k??I"{}r؂cB 1t0PrF.A5bR{U&18ܧ8 2\򑽂n>QC=͚1Bg |fywIȕuAd#@Au2Qk eGw:e,ɀӇN4%L1(:0bp-[~@ٔ<̚qۛ'sC6"m'>Bf_i c wjqVJmV>7?lVa&1/l3M.ҟ}DTMa4;lL݈G4'ѸC g4Ci\1T蒬)Rczx!(ңA*S5~ol`mOwAAkpesGߣ!^ }Rgɿbki8]Lfd^Ѩt2{1 To0_ԗjs?Cavgu̼lC{v+/: @cM(/O⮶A9~. )B9LpXoYBJk%ljbN@vm4 _Ks`d OZ=,?C@Mɴda I& Rxn `h*sx5qߓh[q{=x`Oy&4֗{ Eɛ SWvdyAQ2JvPӐ2 y\hp.lMDNA6X.A:Hhd<=Rc ݨ dAE] 6h_>i-٘b }=7^l8a:dO\,?VF߭QFZ޿h]?/ے+Ja=|+Ik. $EbN*2"V)42 }kH"Kʶg%~C=/#xܴ\2EJ8}d7j bU  #!Z&x+C<T7dX`_E?Op=Zc[ߥtpUE SH`+ihv+X ŬʔE[OYRɬNBIJH~D9g\!ʴe=ײ?pkPvh8>(b`Rwg*=ʨZ˿I?`-Z@wJK`y3L KER \{tH"ٙ&U=%8*O#cn{"XAD &/9Ҋ}N;tV0gP=I*녩Nވ{y!8x2ݽCQG*J{i laxyRtx6)#|!ɐk1f _1oVY+~cTJ&u2S<4Վڏ%T/FJYc#"ܠQt:ftiyˁُ~{B窃gl(רxL?O#$m!M}%ȥ@#9f j)j"0ZBEt\7G~\(=JMԪL \g GKD~7',J Н]jw=+"_@.>'9%>fz-x" ;6* nu\|l@ X],nVq9(]=VmL8'è-63c'HV>k|'ǒnLqF%ACt`qp}h/R#{ˉ)LIFL(M1T$ߌx{nItwe}孲 h0ӿ;LvKPq2Q֒(6a!xo`ؐ|I?OBhp^j%1g*r;~?<,yd_v *2< g*3q4PcRV @ k%qԦm6滅(j~{l|8wK&Bn?>NiK.έrzG{?@Pþ.*܍$[]91-U 0"c=E)t>!hE`Lw&]>DK,GHάxm&ayg2bC!{ʀP"?(wlѦ Z"Zb`w_;(Nl[+IWcDWbЎ"p̡2RX9^ڵj S=玓{$JAt7|5Py-rʋ `m_#^ $-})s&1mY"W ݰ5](-CD//au,aRP=4@'j&ۢ[ƛH Zce)霡+,Rx p, HA ,?%&i7#aHJ-0XiΕS &^D4Q߉ rG:t9"/^F)M݀|9֎&$u. 9+7_;TsAT9kA Yyno[ߛMjU̞rYz4)zПH՛UTկVbce+ `:Z-<< kOU'fE2Ԡ<2r{j j.|PƯwb( aR~g8:%Zl`/l~{i>rx*5= ʾ< nϟO]@I>~{>>>ux 7|y'bt0~jC3 \SMͣQG=r+)]R& ר2vn_Di쎐騇,<5MfYъ,DZC.U.C 1xY'WZq<>-ĿUwW`;܉K88OZsv|\ظ;\@u~MŚflFS4m #3b@517W&;wq7k*qcqj@dGcT̝i??6aD[96"PY~,JRz&=$/ײ19G̀k%_AC^V7NZ.Ax.bIB'd'>'H,SQJ b]p]>( Zs:sͽ=YTK˿,xH CoEj߳~WdY ֔[e9-b1n>El %<թ̱i"`7M ta'Y7D[\&pCZW3%%6K8(^ )2 Jo KM¢poo t2 ZBox IX}]HHP:7sZe8 qpvYZ>W*M 7Z OշБs^nrNFUQ%~7>c~z?b2̕vv5=.g5 s~XgFe\DKdXJ:RNk˪zXniJR!;ՓIi UD*,= "DrO*5܌Txzrms3ZlV,rpI{* p!36 *F}f#'J!l9TQ\7ÉS8E椕5EP#L60T C,i_ַINawjGZJzecߘHT*چF>4je$xðB=+Ip^ρ <63­ I Qכ|k"kfta| M~ F&nhAI Re0"ޤe98\:2F 4lr9?L{( N|x.ԋuGqz9Sm1MP-cK0|*SNUfkto`N\M>-r*+Unf@qho5}ҺDyXQ=?ZUon B2r{zIPO] rJ_ -kwv.&2 0%cw!y|xݫpwv<ۨW4$mkS&Ǻ4W8^HZf@nե02VTDystwۆ@GkxWp~`34@j @V Np~s)^m(J]ޛ!Q3A BV>}|>n Vz4lhj0+fV ܵ EP朾 rPEV /Or<6Tr_0920z0v`/ٮL/ 2qv4~VA?R"HG~|-DٯNTtyx rQ>go$Y;-K$vɩ Ɏ_nS÷KdwF$k 輜5# ۾^H⸅w;)|'ކKLzݷ]A# v `4r%7Aw|73Yp΁2Of%@xHnRȚbJW!v'¼:4k*( {gU8$1gtpap1S䐖m@5K})07#!. oixՉxww>gs]7 :C B0ua#<4$`åBK-l&s%kS lx:hx=!)cE:M1 })h%ف' I+&<,w=гN<黋gR)5kbG^Thp|Zmy [~ jCET.|vKP1pF|>I|TG!Z:JG+FwtY4_Jh&fm{ڡ~Rf NmS5xީe%, #,0aZ >;[#:.K&؈fΓt ?gZiUMՉ̵)cOK@k"Jjq.{K^,2il9ltߖʭD7L}Q).$/ lyTsFTT3ƧS CT֜WJmюi:QGh(.b4tג$[p,Kh`Gޭ *!3u׾ۡ椾©aG9PFIU!ilԚ ȇ pO [CB]! ~EgM[w>g-dAG`btW Hk!B K~g5uaes1sP|Z2&c.N` B\)2?wP2Y?6&s'8uq~dwTo=8iDWOomzfL3m\\ٙjzCąx&|N6dC5T]f9hԯ/V-N&~r>m!v`Xw24(]qY=uJir變wL:ƠH<\m_wj0eYv T-?s}W/eZ*W)ˬSQ]qjd-.Ӄb0ol A$b=ElLΌБt#^)Zf pvxӪ'43s'Z~ߴ wkסpV ߑޤ? EX?ojaj=0n QׅS.̳l-aNY"^yΗ̨a*eJfcRb:^ <6^nZS† UgeɁ ^i%0kdBHRU9f!?69R/de\H峡nh3eKųjуgfyM)p_|DCi~&jp NaVX"-Uэi>O 쐌/I9ݝBe(*xOF +85o۬y}KJe(Ib ֋n0H&a5IcC4~yF<?.WU=FOkv>)/'KѪhWicA<<ʸծsp!;uK'_R0fגwη ~W*:-E8g$,iWE%2LS&M0"dzPw؜׷y=Mn?rR 4 %kPjO{>c?tKJ{OGCQJPPS|6<8A[wߺI}AO~gu/q\t~Ѵ6^^ЅTHvj&':)Z};JDY8#^.%ބh( uBIɃ#[G PP4އ+$ޘJ?GW;`ϏoXaHxm~Qs@ɖldm4FM}ZI|"7(] XVHUl6vNi|*c̆8(|\)t5$٥ z'YA6nǿnX2!ߚP~= =lYD=ALmh--y4@ 3#3Og Uxv$#8<\/LF=9vN"$[+ 4d bWtNf˥-n[*S Lأ`' jp+4& b1'k?ʎN5TPd7Oq<hR"{% Ǔ(e bDR.1b]q C%ZkѬ@"Deס{hocE)_5ZlPR|M f./G|Ȋ8*&rm\+UaIsC9R|Qq/7/"'bA /eB$ ӁdUfog C)ȗg:7,m:glEԑgެ(,zP5Buw#s8c#Z@;;ulm5J !t̄7|ib<2a&[\0;`,nR{;h^{[:)4Q!NZ~ )M?plbYinegن0HN@o]J~ߴ!X;,,[8 ƾQ,[KՇֈo.knē`^ٽ֊]*㘄ʁcݐָ}h(YNL:Noe PH,}{I t،BB;jW[.Hv6fփOxy4׮ q )Zȃ4Ad@STW #-ZPC}aoR=>Q7/@ܮ}ڬDּ?R(O甞Y:CUSqYǶHǝņoOѵ1,Yd4ד_q^ *(W${7Wa6ÁMA+m5~l0aLVv%ȃx6i]jt~?"RiڠbKj}R҉(z|)p(,enju}ws@aMhHoN-z|fcGy1B& 'L6Qi*;+>]W ԍ5MHh@q #kvÄtV'xνLAY9tz'Aѩaq`~w{XV$sˍ BoTEEWKM)tn1-%/dg}`IU[H$WվeB}1 OxoUt]vBK'D>N?~@a/dl ]|{,s J˾X`WXו)MJa&<,!c'GQF)g`᳏6AZNUg#%UK|0y&vk#-3.:[Οn"i )xaZ_ Vpꊓ"g=5N19xK8pvkqfH\`z?F!vuz^~ lX>('iʝ,=XT]`U6GWEGڑVpS Qu@жs]M]>XZ|ZzK%iSg1봹^8mˉZ(_ygދ𾚍F*lP Wekw:ágAQj(.g >e^:eIs涳O(Jq)˹A/ir,wab^s t ]tBC1ԏJdzMm:'Cku+lQ#6>0,$Ta˰q_{ّT]˯}WQ1^(P:oIgq7c|iNx` }:%x/aixbA|Owu.Ր1ߥ "fy < byN>&;_p L_o=H6 )]rz}kK- ')n-]]=[T㯊,zƎ6Mo qG5t|i6Cz-9V1u1r QjRɮOBᚒZ,t"v4l4-1֓)jYo[!Ů#ϣzO6oUӰ'}`{Svq"CxA0w9?|ሉ͹mj}]`KvmrjG;~[ my'o6V\Y6<>4*,Q)2Nf*dd>7 [7 jATI&S#$k?cŸqͷKa&d ^6zwr[)uÑlƉsa0Vm"} fȄ3h_iTYCnm:2a>N""&9q!$'CB~= R3ײlIR+lC>"1ָ4r#za'L>Qdk*R5'G[J(ZkG@뮂g6ArL>KȆ6ʻC g}E "cw 70c/Zl@bUa6&|r~Fjְ \N{-*j%`)oT{Dvfcg tb#W ijJoa"dBe5܎C6kCJ0,^=ِ'M,*sosvqK/ w&`zNj&wk'cy~K$Xv &;| 6Y pZ)q>`/X"g!m00o"qĴ,FKߠ6~f,B/ (,% J%Uqց ftӡ6mï˻ܯZmh[^k1-1U~B>#?6Z-I͸mI,c:[<-H btn5̸ڇͽ|DQ~짢O"D`7zUc\fjP1!nfu³I3}t)Rv"Py16pIc. O)U<5MnYL6īr EfQ$^"A:*l0!9ݺoM_?g.4YF|ZplAp/b_)lF5}3 ϺJä2:9Gbcĝk=˛lx5&FXB'دV ⡣hS1 S~UHRy,%$}| $Hr9{:"o>ʒZksUZܩIMbRkyցa3u{ye5R/oI+'vǼ5& Gn?"e9g[ qIE+HHJbfBk ?煱UK^+}|\뭳WstoHLZ.(eI]n,Q8>{[t?h J{~d@&P\&U\` X x?fTk :i{["/aug kkR LxCLi'FaLLk+m_ww03 ķ9V.Cy't97G Y'FdYI8cڲ~&HEaT(6+1ߣwHCVgc;R*΢mK99 4 .#I^62CyGA7`>͐Tk?A: f&X LJrKET /:Gr%uN i[;9Y eJgM_'y'g.;Lݸ$?sjDuGy=5vvzCdM}geuނS*`pm3oYpbf9|@mQ##d>F<Ø֥0 N5ǓHo J+ybҾ;^vw{"b# 'a=׏ń㓷 A='mUs!(SjMR&ut\rX_p]Mf7k>>̍hY]r5t8ê#^?q <RnUbOmXW=ث/X0XNC~d/=y[O3q J]Ni pFŵLtlud5#%824]9VLoNjt@iW{r;ui9´`(k 6?[DWrWj?l\3bP.hcEs+5=ޭ5Y=5uUc @УZ# Sy잡Lo{zA%>9K+VuՁјȝRs16OdgD/A _ib=2ԇ9FPNXbTd;ZZYCυuߤX%O{&SS9s~șkٌI;-6fڭ wN2@)H/j[8;5WV/zd^Ueopmx0JEE:O;~!L8-KtLWb&+"[ڠAQwɦDOXp&'7[MI@O%۫vr25T֓,LۖKFDzc`yX2yk1o#9Y>A'3U&0_+vY2kihqY|$z$5L~耺7j\H-. Zq5LJfTJ6:׆P]gGҝ3 BΟ,"_ѭ-Wqr\40 T y u&]o-?YL(ozHSYg}o d 1Hkhmp'ns6ႽnD_h%@{rҺp:'DIy̫}4*]#i^BoŸ;;T rE?R}ShN:B76}v%bR޼25&h(p\W79?:Vsw5ЦtR,EmtY];L6lɟE qC~30F,l#=Jl.ۈ*=ȄA it!~=o$ڔ &"OJekDjo|hyǮ6^?F0lܯk^֞edbs-?0iJWF{OtJ<~SFsE=dO۝aP5 2j3Q67[25eh_7TҦڪ5p!@] ! 0j Yv԰}%ɮ8YSi9RҤ3΀6fp*f׎,# "gB` fPb%m*^T1t7 Zlڧ߰y,.N䓂e0;ߤb[b=]ط hCa +/lSc_oFRL2C9Sr8* `V"?6Bvj[UZMc;hPP6Wqv+ܺ"ۑw0q+TvN}՘w}Mv9UV1Oߤh5t㍴8E>F:BɱYG8ؤV QS6sWiӊ`ܐ(~@tRN}6J{ !q Ѧz,Bs.LCT-R< .G<+R43ih9t+.~s翏s=TԺih5Kf G$!0.`aLT+-7[2R%h^[pԵ};UA.;ƜkU/&7 5tɨYɬ”n|)ctN- p,.{BBҮRfGElʰ brs6-٨k !pѨ\"mĐOލT.k6=UuMXNu`COAnCPAI&SӼ0UF2[/с-D+{ :pTãT|)4m^"X-oZ)_WJ- ڐ Z#Vϐި>q犩餷fQ$d6'ow6}=$݁^DMrOǮm ꘄh] xYsBH{nv-3Gy]u&Y׼BEoEgiy@9DE2>/oV09al-;[Zp5qyajA%5 n[ `| +S"or/쥠.·[68/˳w5|na3>z2F$JhVݳ.wQ&EUwkW;.@)u5+q5|Fp͠ۮ)-qcf&ˏX{c\q㟢c9[F_H: 2?J2TvW(ƽ|d fn ~:gCdF*+9SZzNIF}G mFB$I?]񉉟 sp5Ϭ;[iǢ #_fPڿb5a] nN]d>y|~2TA>2B?L$D Fdmk ޔ߼j5_Gw0Â|*[8n:3,,m46X(? ,t! /L?̞R:q} vԴyw[PFRr%&M$zS0>31YM}@.viE",Kkvbij kډG\e姳A) ‹iDQ 'ڽM+݋YTKk[kWgUҢ9c;4_ Yq,sPt>[i_B8;0zsPT4$dE*ʛIĺ+ϸ®}3-YqF _OZe r]<7A"Y\?(=x씎Qq aojGQUy?1෭&,^! Ylb'Џ!yO((@6@ 4KP2Q%~=& gO8}' v <Ww*lZU}D 3x"5( []*L٬HKt1P^k.!>E("(*j}-cKj7'TpG2K@PIe13rNP)p}ZwǪF0v'uNSGMu=T#4[J )ţ7$ o[vڣK;]_{ __0C4ڶ* = dڪ괔\l{z_k^4 |&iHɈA뙉UaP;u?j&ОkWݷ`# pQt(i!ČVcۉab !Li 4m4I3JkJF/׷mϙqF%J))ӻuG_6 J| yXUF{S

v0$|6sʇVY ^2IoX΄eYV(n NKFZZ hpy'Jj{/SAD{c9`= ~Co?@:3 _NJ%_7?o= >@_oubw Ÿfӹ'V-eP+' UCɴ!<wt2 D@p/<2ؔ١ êE=ܰcyY\zBbfn4yC04UV+mC6\9@T7, K=/xvI>W2桅6-}{?Њ? \/(1a=e\=&XS"RamW%C sH5֖ުkSPöNTm8&|q&4]O6Ge}htoÍ2}vG;@-mfolc =9abN*/Qc9)7 ƈٌ Fg**Rb6#o'pr0ӐcPҀU`7/F~Y[}ouCTcx3P Bb8:CJ4_WB뤭ikO* w,| 8D+[Yx`5hv6`;-\oR"O9.Ԇ,Lh8n5@<t#,P.RM^Ah䃜F2AKCq?>@@D_Bf#jxYݳPtr4oQH~077 P_0_7G:`"(F+șGT>$PfvjRAn`Bї/R 'd~r5G2w:0 )ΚU4~Š&]2JeąU4LTaEeRo _N,ޢ!BJ tg; #nd e70M4P]<%4DhEhz&ՇDW+&}X4:{N؟T%s|Fl71%N~j1p.M>Yzby1,^=\{:|_fF\sWp$~Br&uJfbX K9 $} 7a(?/ީ[o+@6( !J5uD-6;xW-be.t%*FJp,I￵鮡ȑVL̫czY !5LFhPτW{yu" N/mZD)%Df?XA'4C(5y2N…I8O\=GZ+b1k="q;QI#͆]Vo:"(r="gh+Ό36b ׀ebxOȉ-M2ae3ZڧH"w}dg~Jk6l2Ye~Vm4\%ŜmW[^*WQj$|(Lx4j>\3sԧҊE< < *X*u ށlU [5Ff wd(-ةA#*lo"JyL[vi@̒P6k is|PFw-p05q56} _Ĭ":$Qڂ~5dH!{v5Uu^wsRtŌOxB:^wV5 TUlwsrUJԥNejݝx":6{arL9֜V:HJ&xVe L@5xr㚀?xKG+B%{>_(ym-Pܰҡ^ϸCT)Ct ~z+GKWԆ8Ԡ>' mϣF7>30;W("xCsgРe(A"t/q2@{Sj/qrُgy.b@5{XNpd8acsx'-*МcƎW+kjgCzL0Dg&Š +s0dhF^ਰehP~NE혱WqXecyl7& 3efFkM=! -[Sl6ij{c&jϝ+N.I2ˀCG3-5Ă1jMS6}13 (t79dr9]TɱCY~(cǂ,92˟ F;2ӂ2Hjޠe΢R.)I&nV Z&(|X`ik$Jv6lSKR *={knk8 )ּ~J.# ڽUw0G>$B"/sy}l>tZ12.؎+V” [ƯlƮF.S9u^1=P{׼rǗvCYwtNmo:%޻ U4qf̠ć{7G[< eftI7l{ Ft2ZZ%inՑKn?i8-}2CZRj1AC~ߒvInɺ UXzCÀ %-7peRZpdnzؑmixa!5}VVy 9b,mC\zDQWmh.MyçJpMIXL8;:Fl6ـDΓ$bLuV KH׻KR 2h{#̚QZ hkRr1 s+WLkW g(!KQ"ꀬGhgb4=zKICި+.'5LP5˦vE3NGNi΅:G#4w We޹J'AQC@1XsyJs$i Lzjctq.5F-@x(a3,% DF)%VD!ӗ9)yd}4!$[ i\-StkIT #4R{OųƓY^ZSZsD)RuL juڭOs9W .XeA M=t!ue{R\ Lf\=SxkuMDU-Ai?6?F.Nz"/Ybgߣ&-j7Sp `M\ aoMh K>Cfb*:)^A[/˓Zr6imhHWRuΫUc.sYpuȆ uWs`M)_ѯ?3>f f 0lVZ}8׾NGoѽ`G=9֕1>edio¿q}Yd3w6 ܃ hͳ[h :{HaDU:{1Z_o(Msպ~;L=|ҏ7:KyB?'N1TEbz xY0J en"F.ܺjB|BX@Gf[<&01Vu#G/m__\.:ӴLBFey7b[^V郆Or(u`Ⱦ"L؞_z<^`u~Xxh9fQ- FfUJQˌVp]IFb3iZRKj+h:/gzxH!xUB/Cqp8!c(Xw0E6@Wҡ[,T9o&ԒyגΖ>z!R=vܬMotfp8zYC5DZZ@B1\U@B%k(+ԥe0#S[?{x_|LçqO{hYDV( t?0vf; o#6:Ox ͊l/:ڶ} /JEYAg^.+ zn҆RDW2 cy!Jx4gD.ɢOPFԵ'y-|qgg.qM4.'2ӡL9MmݱnH`BG%\92V cU8g ;ba#@2 0bԣko`y/. 2id-y|U2jywM-Б>ۂQ!9Ŧ ƵjQ#aLŠyDiss < TTW>@_ڥY{IW(#!ΒUԖg|o| 9*sD .$@6þꥯ_w#KNTfؽ r.lpEb56cSv[\zH+{4{*T@j)=ȦJEy{Ʈ6$;M+%VP1e B[UT#!;Hc+v/7Enisv^@q 90C#D8C*\}L\r]E^pP jC-+DqivR,azxw ˨^Eέ{Vމ:Qa`U?eMB%$Z)7<-nM)QPd57y$*ɼh{\2 L}XUnLQUl$a?- ҶS9z:0lhu@&`q.w(^m)+1Ms> ߶X8`{$5PDüGT5%JHVǜ2-yT!+)0Au` YSIo+ٽv[' {cw<81Z^#V:&Di|1_OEݫ6Ts҄:HF0Flvɔs ia94<)E8NeU\+ )rqӄO ;GOI8V 4~1uxmInn)NG?͍J'L@yӬx<H"篻JLd =)\u|- aǺN˩H)h j>ҊK[cQO]h4%~܏Pϒ˝WSLsG s4ir,N(– b&_&ѳ7+RH\@_PĎouiitE7PXO(#Jb/pUp Zݢ_TX0Y5C`K#Sz6`5X7Eks{9b햢PYIv+ZZyH%y="Mk;ѡ}-IRSˊڅ_p0+H!i5+ä9-VafF uN'L̳D8$az|N\}1Su*xEތI|J-i]%~ͫ&L(}'цy;NuX՗)*\O$K\>ş?Tqҵda8pTٖvS1k:X4[`>onzZp="i?c}x&{ӲuG񺆚d .b( zIaJ* D82b\P/e$h#BcTЗ N H ]Xqn$ϯygV4~ᶩNt4RhBcK}BY48<;XnAlkѣ[Ttm qV (BrdVi>?aAo.LW!~>)PDQIB" 1`3V&"E40b!-~۸[ Ip h׊}C 4Z:_5"=}t:= w^=JDggBRV_ {nD+L *apsM@UO3ǹ? Z <-3F9R';Lĩmh‰2#/m,W>]-%á|itJ4YG6JݗMVa.=ƧϓsIEܶ7Sܛ*ɖR1`aumk<5Ϝ4^m15{~+mQ>מgy+J[ǻZ` Teuˋs gQqS^*ؕԅ.`Pe95Ť~xϏjGhwƆu+˥uoFpգؠ_eċ$>=˸5:q8echoZ!m2QK N-!zCSW>?8\uyo?fn6Lt?O{mkHvkdAUf6xU%H窤Ho9UKNjs*:1 .NX]nB S"hXM+^limNm.`҂D[?sK,ݻR[A~oxPJ,,ds+/uR "n N6ւ5֮s{:,ęCM&1ֳL.Zn\_nj,CJ̌1teڮP@@@&X³qt17&=Bo8Oޮ7q ")iϑFE.XDB;YWa)x*#5:xbbc9pJߎ0(U"bn9ЄAbT _GFQq`-_`ٔL8~L|իШ[I|Q!mvʦCu-u<^hn2"s7ވ9 mS<7 ިLosZSCӨ#%] _0(lUp{\|>hK)i$hq_RyM76^D my( <®S4tU-R[[ 8c MIs@SDW`p,::%4܃i&jFD& vCQzZ - "ף½K-1)6wNՉq&,Y\=y\$G+l/(wQמHeh=vpjych9l;+ BZ|댞f{kr q2|ͬ!zpMsstbXy6Eيb/EY˷_ic{vʔ#sSY|Z*]tʨ@b/Pt3i b_Mhl:B9Kx28jEߩN;Œq(QnV̄#mYqXA@7aM/[<D7b[GM9)A*Jf9FJP<[[3ޭL+U*V 4Y[1LGn2e K1C!=Lލwz_lذxoe p:&IU m`9v3׍J NH`yZ=FҔʪj4B\"*H_->+1ca!,|B@%H`VR|-'٘d =X!F,TaFJ sS"Z 4/;Lur-O26LflmoeSvj): e۫VAI&S3&Qhn&wiMg15m ?xJ(fT-KB~-u(06'tu2AHǘm yү짲$QU!;Nr)W𲏒ޜ;:QFuJGgvV/:@Z1 y >6VgOvTh8\it-*gRG}cۚ;HZrc;Lm*|S߄d&+?ߤa,hN[km}5C>&prv횦|mOn%x[!3$L(NՇח^;· = aZA_KM 5b ;GqM"al[tnV&DQi楺za4G[n*q=eN#>IEBZ$dF7ef>>C^g|#zEu)^_'Z.eԯTp@0i ܅]gS%hYY[ń#op Rh$Ӂ[ 7ɩL(p^U!ŏ./lgpCӻ)OƑV AىRyn[($$&{GdBȤO0m]\dA)!tQ3:x K8jֹdŎ598pd/'xV1;Dv댾Q3%1"qB/.yIz3` 0j'[fm0A#ܾ^GDwC}oPlٚظK46?b oq\]M7x'tf}0ҏT~s]t[b8JّWںezvAx6MTYGTe5AӸ<8Cǿe lďd+!ye oiS㟉SYt),_юh6#L6R >sJo7k:( dRY1g4n)Xn#KSDrp܅Q.Ft# $D"9jXkŸ+Iq1bЫ9䜀˳-YB؞% `ۄ#V. ~_Ͻ4{nm";:žr8dy*虅^2OZ-"rY0zgxԀӣ],A %`{6 f "ƽY˵m=!O(| >-فby,,4td?'{Ăc秂=DہD߀gen6/LCʰ2CSip928,\&cF\,NPFqDB:2$oe4E5n Rf@GկX-A.}_1y3UͷxRr*jy5 ISSqoQ.)%Klb)K_g;U!W`G#)ο,&Ǧԩ/>}%axZ}p6%qe%(*~ =L9*hy]&xP'PE_YuP~CN!sL:4-ђ˚,ӑNodGO|b&~6U4A:wࠢ;D[/KdZ$cqUw.ݍӑ`?22jcC^,KI:)E9 [$TYφ>2Em0McFXYCK]`pzޗ, 1R+b653ǜ:ggl]h{vUD^kP&رK9(Bh;mܹGg(3fTxoabYVԸ*ڣ + WszlZhy?m^OY; 5~z ˁ%z<GL#</qR%&pr66'@=lLk5mʞA$l[UfGi [ J~t>cVne/ڗ`il(NzuҺ D>%Tg-3Ěrwσc9K韜D/u%"V@tfb]IL|wX.ʱ5iUPN2޷N"7%Ob1$w_F##VGd.>rCR@Mc5L@ewEҚe!( |_]&|j`K33[ˑvTLR|QҠ梜DU( +%r#n-mYr6; iiՅWy=2V L ceJG r>dq؛Kz}sxlà+;#ݛp@ Mw;m39`ppuwDbxoMޏaf։y6j)ru 4U64E{H:T|Ëc]6K\wSg'cW28*5&N|om^Uz*HSQ˶q5{TEE I+׃\;й©э+Ԭs]ڕ}0FX⃢Udi "CvGzy`UVFyȄ`[-c ЄIv6ۧ!$%&M37jr4K7k4?Oo+=kȷ}+wLo&Dr 5?{w*[cjxr [?`wߥzvw1p}v?X컛9 Pv1H*[i30ʹzq,~C<J@,{5x_>j =1= %mpDjbف?ͧ;vړǰ匳gbN3Q+7 >L;Pa|WAFj>>80J(喯M] 1@> T. vWȄ ",5NV\c;ܺWꞑ9NQZI ӃQ5jI(v]8oȕwUq_erZ 6(n͚oVU.k#H:Kt.b+6Ԁ2.LBWq!֤5c¹X5 MiC/үT,} w. uЅ ΏxYLГ~_2MlCz_ZAS&OFW~&y3Hc=sҰ7^b V+`241{ Am 5+ .N'cJ.D'b @[%8D#L',cjv/ѵvw(l€6#dzU"^aWO(nD~5ZBNrw(`݆a۷0䏙ǰD& X3D4άvHoz3 +'“JXX(ϕ1쩘^8 Vp+? 0"6A ƤA;x~N1**~,UމTan^Vn/{L -iF_Ez}á}{wۙ @nM|i`sj [1A.3k#OGE=A*ų"3B/tw!qz}֕ SA(so1 Rk =O:#|SuC]/Ug@7۳9@ms|s朮[O,m̪hoRa$Kpw]eqyS1 ޕ U/MvfJgS>\rU$Rq O()[$dyifnd~9<m X>l=<4d6zajqm_L<!Ovm ϵT/HMn_gLF TD} XTYFŠ=9`z'6ڵ|j9 }`ut`W;2s5+/}!l9,Z*KFq2sڪMeT]qRPL/812c.3_y΄>SՊrn!J+gu0|OS(F3kgܙOMg=f;Oonn7„TOauH* er9u\F?FfL&zWV^TVvϛ `}h" ]$1Qȧn9T; ,Bgn75¼jf%-|/$ՂFFK5 )8_USߡ_Cj孈yZn@+DP+ZzhʸYMJX=ڲڈ"TcI"OOJ 0mL׍6j4JL -`V vѩ;GMJ#nx_2Ub5T{6z&qm[X˛zCBCpZHgqx!;BjZYhy(~ϵ<AEM7&6Jx>LkVͬYɳZSS.9 o!m B$*"yR7BPf0eN(6Ӡ o~X|5CC5³}Cݴ3@~ pި$fx*.=l#VRaь=HGC=)T+&)(~`=񬦻]ˡyǡζ7;Q2NZבñjP^9=ow܎-C^o-0yǒK -" ~!*!ƻǻ,@0Ԙ?PNTɲCK]h){BϪ* =&$0'JGj`בRvlkV l 3[vR]'~0x\4nM\;9G8mHz᎙ x;78W<~ۣc.QRs#$p9woD?0 ;2snr mpձ$_e'!`j7+-+PxfRσq~%)K?s%ټ aqyQy}NL6ExαO5kCebAIwEo((g0c\nH] x3> 1!`G yk9G|a{yyg_!NN*w51FEѓ؜M^=)V>>w"JR2|'J+]{= f3n1x&wxR\O$O?Owk4+ʫ0x1Lů6[jw?(>J 5^F:y P|e_\-u &wcbuY4sVˑnqٙ2i!WDӪ-p3=ⱀ@U,/!m{>cNEA(ѢwShqUjQ2Ol32ٿh[eCΖu|iQm0yTkA=uPVW?GLK0=br2]ǸK/TƩD셆Z4ܑ풙& 2trM~Ev-'aߖ-IIhjEA3֭l3+/HOhCIQ_h4#,sǂ(u}]5 bzN.uWHxLOvU9wAqPv7Sou@UCZ5i6OޫEȵ*7;JL~?RD!۹UbOx/(Mk/GGG}.(NJNFa\ Ve2BmG8G$A?9#L4-fHIgNPly[^7C dfdX㤕SAV7̾W.Z<;`Aq!ܿ&0UnuTIDPWN}o,hrl踙S}`5g" Џ7Vjﰧؒ==a~dF`WewZ>2U#C\?#zِR\l |6mYW(kiNj>bʮިki48 4=(EqUq;u L5Tݢ(&Cn-Facf -ıFs`\~[xcG\d15&ݮ*TP (=[8Ueha}9F)= s,xfKݓ93if} ~d)L RnHop#tFDgP7e! P!Q&/ը/UݲĥDӋabmYzJYșZ+[sjOl`[ 7 |)lnJ+ /I{l}h8Hu:FxjllJOPfu7!$޸(j:CNzsJ)$l]MLeWǮrtJ^eM~dz7ҬVĉkt.>[#{mT=Đ{ç]5xk8e>tDKIzHD:ua?ٜɼ'ѿ۫y$Sug:Lݛ[m GAU,ÀH/%uFFgGdcp A6hNG/ίZu\U(& փU}eZt4E]0YdUJ䮉7qa6E~B%'T+$YՀXFZp=+7(n!ϥ]J~+ !0+i#֝JQ"S63㡸Fu.:DRq3N?J 1'R M P~ l~<<=?A-,< A]J<9рH9Y|:*ʦQFn0d:t2S3$z(Y-3H O1 s.=k$d-=ke\[*c/)@e!sv 5ۋ(GŬi}FFSR[F!ΪڟU= 34Oč_{f~FS(:Ʈ*cx~GZvbaG$Nǝr~=/B \)'EҪRޏc2k+Z›5eßf(`, OAʨs]!gk 0``vx&,4TYžaAEr`/3C~u{)Q۴o!+ҺT*DՇS7cg k.9Ic9tcx]*bk@L4w1TD8ĔTA"&s[o^6x]iJxnD^l9H:{{MT2u.*"T^ZS$)O9(Ar U~uU^zٺªO@ֈ-E|f5md5IEHdn}3lUjFm^9+=t4mr0W+p̗"mI`dr-BhG<؏Db 6jތUDzv;@}zr԰ /0Jѵe f8-LOcDNHStBΏ,X|:#pQ_#}ylz80ig kA!IAhLQsPSa~/e]n:s¹m1WNVh>e>n[TGh&Ȯ6wrX[t\gjoYOiu_>A {M l@8gWĈ12h`s4DU"@FRHÆf J;k~ozK y;a+ڔSx+M2\AdM~(pAKYU4.!ŪaL&;E%`zư.k8yz!5kew|muU=^[Z2GCuvV'/iRYbRNf &8|;Ux-0;)j!씒Dqn?ޏ$)~rA:۠+ՈG r-um&AH ، WZ/RK%E#ª'/@0?b^2EzveMM>Zg9X,="c>kA~\ !BC:#v.5M.wjy3JW_:ӥSD" m\#oҰ-.hg% 𲤂Kd+ܘJK;4 :$ZPd03&#zşDuc4TOsstf {ɩ7[xvBk;vX\:; eZzVl!? k;ΰP6(@*4l=7֒ !ͨBm7-LX!Mm;HOs/9>kQgbs)(G MtdraXW;W 3&tpKDvUa5hUeqOʽؒ>m :J&ȟᄫ'X(Xq?b<,CQ^*kP,Y[4+^%cevG TdFP;z$wJ6Cpv+~6T5ׂ"t jDxR>]Z? !8ȿ>/Pw3A_7ְ[o"HCxfd€+eXu=;Vf璮p8!EuhMfGswmk{ft;)yȄvg>]}BZvW\=e9{XЙ 9n ?×ӸM3o{E ީ%@e9>|ƒwACk&*^ǚ@OgW^ ww%tW4놭2B~;j" ~ݸ>X"-&'yvP4XFOJ/7~~ U0(kgq)Af[:>A7|zfp}uyMƯf-KULc$;"ȕɃΫw,}-'n٠Wd)SFD _ M!sAgVS:VnLxc̏Њm~C/y^ϡ+ _G%S'\~!8ܼFTx]ZIFʫw𝴟+!ԭL[4X7ZE{acVā^Caώ(95xL^0`n9։jT~"JDyQNֆpj^vO=$6KՄu g Rd/:^sZsSaj^l=q݅y([~j`9#]iM?ٞ~Nԑf:C&:G"3coɄ^?]Nl&mo1,NSXA}r/ѥðiP{21dBE3rG8ӸdxFi`@W~?ݙjj3ӠAY,OR>SIqP3g&mieSah5OKiF4` Ԫ!7Ăo~bspOg2rGa7o&Qԓ^@_'NJdl_MI\0"{)v,m%S kp17 A8_70DŠ"Q]O%z+Y;&ss?PcLBaT?\r>gW6j0rӽq*g`#Ȁ8s+9k8Za*^wQڋ\ KliFGc{:k&QsMx1˰CJY3q;7|apF fi.zNpR҃Ї]k\)&0n5|QO\r4M<+t3e>#6L&O;JˎgY[Suʃ>Bо" ZsIO$F\tȡP5DЙ$8A'{  XM[[GNzfBֵ`J5RB1A؅[Ql v_`XvzUx5wf>nĢD.͡=RFv[o|L~<E׃p+ufh_)}Fhq2cYt @}Y͌,2 +7;WFqVf3kV8K^s` WNqFq M.#%$BEjo;^-h2z[rE[% #}?ܖpZ+WANg$5=~`D23_g*\E >2QџJCp+%^۔ ~= Hz)pÙم$ګ_md"7~Ϭ⤫< )RXf0TM2wopClaPԹ~]ToGm/'NHk ύC}z!S&}rCg%BѼ[[po$>ERTrcbi,@sZx  KӎٝPi4\% 3 _eIyʤ,Q wRb+@Gh CC"cJ2+'%on6PCD}HZ=tZ 4x o 뚻4@dmǼ'"JИ0`i(k4eXy[e"(Bu p9F%'uǵux%nTEKаviiKicō׳g &w!K_mBtRߠGPqh+DѪ#_uIl8UJ: 2ա=K^TVd5^q/dT8-iH#1vӁ 鉓B^V:_HkkdTпX|=hd;KCeͤ9quFdvÀlh?&A_E,g凰2)f#l*μ̸t3ds-$o+ɱUoܜ}+2E{)ѫ;#' 3Swd\d"S%!iF̮nH国ƙ(g D^_ꖸ>&X BDan>D(DB&Ӈu(>zg{Rr}ı5%,gI:-Y.-[wzLjY~ș"x1<L."Uv2=M ?u/ l\)^>jeP5 :>1 ^*6:¥t0z05dJ U `Z_PP,&KrYHn`,C" J-#uX@͘BaTrahB*5OT%bEP5ETŠ|iݫ8%X';ȵU9a<^{ W2Gv>է`lKgQrS} #I_`%kUi86"SM #DFޫ gLB=∸Tf_i "u_b7_o]1UhJ>:D4칄+'=)x F^|}}Ro)?طy $/")wEセ+օydfuj\Γ¢Ѷ n7'okBLpՍ6e"BiF ;,GIn<ǵ c4,hda1Ox@\'qTy/"!fOo= [\2/Ͱah9XJ/WsϞY3KʔK-r}bvH>JZ0/Q< }kJ" X6sĈC -v2ɚ9{[qp%ZY'xŴj߅kaՌ_жqaR2o,esM<*@kK`9bwH\ Oc#l3’Ca7wy6)cz"]n4),rass3ߕu/:ks)X-B9>=+_ŵ3~tFi"LAHzPo@7lI3j OTi is /%Ὶ{D GSoWxth,*C6 3 B?WkKQ).)dM}DP\Y0B|S4SJ *c 7,Dʼnjtע:˂i z)rujgb/Q>g"K<z-A 2IP蛤gbמ؛_FKɋ{2EBsjM`ԥGRX HC%;i X0BrGopQ{Ey/'0ݎ/kSE.z.)p LELCc9aVt (EW4bçsHor@ޥeŦ-L?.ԘQ(E8g > ~ J!֎9;$ -B{U PNn5m.rܘ_iRyz](=-K OcAiY4O?/@d (n4TKd{Ugl-;dB:V̾qT-aIУ՜stTQ:ԅS]c^l>{TPbSdx,(K5'-}e|oRWe.] ji3{KYVT98dOIy^ (΃ڮδQP1ح^SdՒaje_|Oc# c!RtG(JV_Ws~wE+kX.~DK(œid|fk?mґ3 ϼ*eM΂ 4 +h|cvM+M셎McjnQsr W6l̀|W{vK*qBh}磝f M} [φt?ڶv-PVC>spmu1K%\}zWbFڑgX9q"w\zp {* 1ޫK&eh!?8ƆٸO$#$ސľ"m?^*];G|a{(2xXz !t3i׮H E!N!^q(@lޡ?U8 lc×.|<ścrD_N7l"{!CF@.JXO#ЗvVUR\z_}HCTR`ԚzigSBUQko6bcMվ˨;ac1yP2_5\H:Ken V*m5HYEO۷m JwsH,<:` k[Q5edD8 8}CbFw"JO{k"%~ǣw ó99 x֏TZnT_UN:ZD' }(-Pt^^9XWb2u0ZL>4ќsI/Pw_qEOr{4"$F+QPתDŽ m7_s~mh*P$HVEEaA2&sH=FG]( 89ayvJ?KwIGg&ׁ1N41U|<fnd #{0#v #E=DU-]h4%$z2`9L"#UԮWT⮳U.ܖMa.@@t Zrf\>ls@߁А(I!k'9%sV< L (SF o{q(NYʦ T+o,6]?:ZՋIWފ}5U[yG/9.Fz$kW0t^a@WawD8υ~UMm:]|⯀ `jFGt+͝T'zo*u}d}GK_&t`̰kOPѷ ?|lv^Y$2JG6YSK-KQ)7XŸ[OP{E c(Ӟ@j{AB:oKfRL׋>̋~.&}r^Ycy,Vks@p9r#&nV^7^Խ{'U qQyiWWIٔe,3 X+zJ Wߎ.lv1&YoO􇜵K-1"^$LJ>5a绖 -=Zȓ3}^i|Bɘj5@5p:*l/5=JY.|hb(0Gjiz\v[ny|k'\ H5T be@}OZ|x)- AbIAlLrj;]MS"b,`}cX3S )TF#:]wϻA7SFaŋ_-&A2T4"߂/QrnH]ټLAag8;Y~ =qK0d˾hRl?3Ɣ) ;WI q`= suCz=av L"?"/Z%D4eg۵sJc'w[Qk%U?E7?,8lp+H~7ܵ33_*6U]Hg/_,k|7L-nkj&bR2GK*њ`ځ{uj5mґ,<1[\842#wI߀OƉP`;A=I<3ғVŷrYCnc;ߋqakcl(RmRz֦~g,Ҽ5BOj m0sJSZcbl!m{hG.푝f aKǝ1smp 9q޿݆UYNa2³% uޅD>jQ|p)/5lTzt3yqq4]H7v6709]&Goˈ2G3aݬ?ҌJ.[*hRJtۛ2`j#6݈k{qdX W>ñac"E~nx9xԈO ?6(2w쁧qYi̅1VM2YT F*(%bPdFMv:f4V::S@y7xI3,U3XpuY {9cLj$hƗ$PEI7Ca/@Ao qܸFYkZv6rγ; [_> MF.Д+f P?Y% ti԰Q yd>@x䃍}*5 @䬣ZḂ6їdjGj9'o`H8Oo0㑂jiM!_(`<w5M0i髷ZKx`*b5/| aCCN=HV Wzۨ%iM-NpS.>Dj€{1jɔ#oo $^tQ򻞓8췇A1r6œ.rc8:3\ǩ%].^8+yMid,x$ijCv ObÉ9ώMjyYG*eOa?}k[T׬m#:s=:sg|bNhqo+G.3o`}AlkX51փt)Y6GDՒ#פ#&-&8T : 5k>v5yK^4ۣtJ" X0 -o5O:U*]-/kϮK Mn|reG${Uugׂ,[}y1lęѺܾ'۫ K-o? k?hY\b>},ST;prLD1 =*w]5܊g;_ġqW,%s҅~Rן5JU"[9Ҧ!I}rظwr5?z)BU\ |e&4ژБH%4rda6f Sև}J5397ViLj[/6!* n;A$ߋV/Y >~ZUns>AwCW ZBPZ 1a[pמù杻Ǩ_2`R[:E}),3Kx~#z,>2)8τVz0:9qa#yh?@T鎴8(DV4y i C}zm#h\l"`խ!Mc-$59\&cKS1AuLl@Ol)+D4eUd/S"ᲅXQxMJTQNz&qb$R,,}/d.$?vx 6ߜ `$'լ3/z RDho zi%ܾZϕ .Ȱ|X U֜@qHTR`^g+DԻb\; ŁtQ dd23A[¸kNmԛ pa|lfE*[,hp`d䖎sΈʰtNBu)e Ò; #B F 21ll&BB 3}zIwm<)o;D0/TcϥV³ U gѵ^]@^y Of%4W'Z&0zbK/Yq9?ew|1LHߘs N&);%;{iOgP.a hzG6vf&i?>{ksxHY(݅B49bRb9Xe[.\^qQD0m=3uQOWuVt$L_ a"мc5mstҼ&W8RLS|R6B⍣hyxqkf}(4є5rŇ> ]Y6˅r@ɉkĮC I6H\|x(5 MLfivBP- R PUn wOO4eĕd<tbiqST4%N_9?t9ZYVC<' pz6("i!ErLJ ȹ}N"6Xx^r)t.Y߼`3M=Ĩy3GQ]s=-Y$蓒gUpcwvA5M^!Y_y}ce/3YmRGKдT *Fg6s~[EMy{[=_vgȰ(C9b!IO|7SU1acBTA|UF;?c%h H;Ÿ wsֽ3Q* 菿C>sf{"Y86g5`j9j:!';Iw{g=LZUɗvR_$*؊Ϛn8G6fbUR8pPZJmCK]lul5-5wEHj1ŔCoRkpFV;@`u i`TL8[(K`YDâD>mT~Is~e5ooǻ¨}S9k͂0m_GT1~uw:oK*]eC=*p.{^{,ҍgKT~y~7-Ke ů4__%`8^D%\}5קLja\ЈtH?C@误b"Gaiّ;>D#APL EJCtK#qq@bS9#,b잍]@{ߢ&0^M|.Odž:҂J3kőJiL2_J~>#Cfp.n|aw/N/.Btl= f>*90wA=78k@& dP)!I6J%dvSs& սX7/eHz]D/8!7JY%XZE~[nizy2tqv5Y>jfOɸD!RX!z&iP9ޗؖ䃮Cdj< y Cĝ?)ZUQx\3xkNW]8EgiܲM NJ+UP6b\xRҝԨ& * !,nA~qh~s(cCZoo0}fldTcXͯ*a&Sd,9^d#0NXh̃CCg'W,a?x<,A>0Ӻ_XأT@=z./H}= [RiM"oȪu?1 [ϽJ۰fñ7;$%2:npcS`;vcI0RdezaWҁЉ&Dtjr%|N2_טeN 1+S/G1YN 8}Ӊ1XC׃5[ PzYł3={v.`:,uh6m5mOky*hpU:8X.>栗u3Q3Di"u *!Jӓ5Ra;:DSG.懣$249漄'Dw>C`1gÃTFtr3 :bɸ*wC X,%! MҐF$֊oPDW 8Ւw#݊GJ9.Tn=2w@IɒMИrv3LxH")@v/(4pTUUrZ\+zl85`Zs^8g?V/fEntz8o|8GFn빧|: }'G<2Mi9dl<_`>90v/oM>É3gb.hiYH簒g-%^ң:Bxp\{RO,b8<YMaa5< |uXY-0lW 57h ʴY?HkV ڱ _PP/G~h*4ћF^B8g%~pTN, I5BzN+~+tDL'6(:@X4 P (R#'apdiRDЉV:;uCZ}a$qek1 Q.ڋ$R{0,L^ /\%(4jӶlqopRW^} 2WVImwJ-0'x'ī_ƪ=$|*K%G4i!nr\z$M!Vvf-J~(} ƨpde%i^\j+nUr|37rxSu }?`QoTa1fU]qx>[on@@ԈPrYc.L8l 廐X9~ r-b^%_zKj)pFI ŧ7ee[Pi{`OX)i䜔-a+VjIYޱZ$EVB>/vFO'4R <Û}6ĝp\5>omtUA!$b*eȸ" hK<;lsƍ;wVՓF毿)X3KvwɟЎ?-nRyan6*$=/t&b#"SŠSOGmXCǢE&݆$=]_"$?*"e2PC&:&6BF҃D+ Ԟg vJT1&c5=<~ ȅrmh}*w! "9w~fiaoQ3V%Bgn[&N^7Ys~VujxB*"5{fP&C cG BI*Nl菭%5!`=͎#>Djj䥺WӖl[ zaZ؜I19.@nVXYGi .1G%=eL@$S5;yŠ t86s7vnvyP}n"Z ig{N~Bbkk>'` OWls솘"XG21UF D/+yMrIHAic^\3f]T_vЀ: s+@d/\_8hbxIdhl~ʏpf@e/s%fő/FUl4j;`rMU"W+I ݚM!2 1B\}MX_eoB( ^Y)rkcZgwJx'wI'N1Tf;|J=^0 z^}Q?SEyу m"P5[u]4)88zWvEWϹqh ﹲiًٰa`˭oP7I,Ȩ[$w1diy1,Rt<&_IIA(&#1Qs(y{zJ*v0Yfj> 9L\E V0˒Qe3ש$ #,t  y NxuU%2/stG5Ƙ-+ȷ oo M-a\>& T:! \ſIL@&Dm|&b7:[ :`26s *rֈ׬JXD=qc1r[?¡*ͺk"T[/QNjJq>JuEXb#{ݣf212] u*hmAҩtk >m.\wk\ &2Q3wwl:l؝Q@GSymw02Z;2 3+{ٯ)8 }SR%t5‰I[y )<6VIP_)*FޚШy$ǐ4ԇ/͖>=~L+c@"cLhj:A A!9?Es=wǛ`cJl2Kd/@x?WNr, u }}:Ha+bZ Lybm;F'K>#:Utم{:s"eKVÿw6pȿC>dn690j1DySw7SEEXL/яpAndAF~ZnB-t3>`i4+ i$ghcҷ][GYş^[ Ӽ{Y壙/t\X$=&5Ƣ5!t+ FfZU[*t"L5.uR~U .¶"l?/#+/K)П_['rD +r%Q6⦵]`ǂ,y#VE0 ^Xټ5f$س-E:sA&Y-YK0-TWZ*(4qOsMS0jZ,֝sTϼp%`uj-b`Nhا zt?j<pycAo 9˫b&YweDZ T) =21tjawM_nlin=X׈:P >93l 9m4#Pv . !Y▼5!qR.]}6P~sXЦgi!+*+'-`Uy*~Cu]bF(bO{uBM̞w,BRM{ 3;cfDRh+}4&ᗃrx>պ.c͖ә>;Г2v+/{|Odu#MdfIN#%2k*3LtZO.q7=L^?9gc;fKfRH3;Poz tO2Q*C~ $HX 06ɬAvj0럯 (+tO u4!He^螘'}$8Nv*f-zrGzN d<&[*>xl\yO-?ӕ-or1"w)}3ZඬpAQmB#J9\ 6C)M~$nkAgkf,!0'h ӏsT@.?~|kȏXCJQ4˽u%4)xfr4´ Xau؇Vf&æd&: ks(;h=vfaI[HʱB#Jp"HJh96ĊI̿ӴhD'\y+aŜ p;G,w|qѿaklN)送7aE\2VA.> KW"uBmVu%9`6(aZ*=KA+KՆܯDu{|q'޸nW)T#FJ]"t$]Go?5 7-Gwb:QlwN(l XVO(&rqñ9u.&H z|“0% R̴y0ZPw!D9=2}?{/4`)zZ ͖VSݷ+|T/v/jNgzH ¼Ԛ5-O<+#U(ϕF,0 RdO4En_mIecef*YZR몺n i87z $Iܒ< ZR KB?>(!3H^`Xph+5|.烔LǼT746߱?g`.6%Z~jvhnv7HkR>_\D>\<B'%=U#nnOC3S 7\xjG)LuG^(3BlWoX`,fÿQ2&wY$'~|Z%G3ɸ=^{*7Lx}~"`Xe&10tqBU'w!8럼[|[V<β3 P'W&a%MߩhjYCk9IK:q,Ϛ&XWb"Q ;wpZ[gRvmgMAC`#"zo290; WeYR̴SxKlGR0{$Tz< ?hSwX_UI K EX>J*†bVDô. ~qf<ۧsN+#ﰱq0F2iߟM1cϤ 9Rcx< h,G+)LkIC$ 0i!"뾸^(Qk$\x`&,(_QDPmoL m:\oWQE*Iy\80{݀'d6Z4&_fB0 /fVem'¼I 1foЗ ,a'^9o_tk.Z@P-a"zR}g2X)*Ⴌ~dB0DZ-`>k~(( wח<95;#ۤ?3b}^xͫKć=_'qJ08<#ϭ9Ztf6Lo 2hŴHƪbxOB%kZwM=xG#[%hJC)XeS-RlWlgDD؃#NG%vT]F>NIuRvi02{<1=o4cj&XfT@;0`]}PTgT[ե2yiFPo^wfj`ȫ@ XDQyfـiZk̊_i3s e6pp &98k2vJ{۷tv-ޮ4EϷJ&R乓kF0z.iK$N2zL|45UjG%z4L T*<[jVf~[/3EXo;̪yY*R ꗄrh&/"\t~b ^ ]2g2(|e%tp_MQT؍0(YA 5*y $Nu;NQD;++IY`V]73D'z9Jd1SmS/uFKxN3jA`]R8"LX$Pfy'E(W$Wⅽ?5T!<F;,h\v'}칙s@:m,l[< 'w?[=А{S0PaJƮ -9ߟ*52O ȯM^S=U}YftC8$Ř\l;ttW$Z usXZel̀# =P?vRqM喬RҠd'\27,5y GK*rCtu"'d^*]eQ|`]Nf ajģ(tXFi/=.eAl o4=+D+2ցW'h#[|%%-}A;s%Ң@P\> M}3/FIو]ざhl'%[D= W\EF ~Nυb z'LQkRJmg:DYگA6c|wfˊ5Ժկp!8c<ֺ)1]CkӖMCH޶}~(nS5>o8D0#(dh\ cIڌ j3 vTtQ".8I bQk|bu=ᆥ3M1m-#oq9 ͖c{=ht%; $*2o8W-725?8B,w Yλ \ո)d$AǶ0ˢz@OCFP&Y|? \CH]h/wU>lCO663OνEx9YVu ̦"^@ʗLF+_{dH\0a535FaƠq@,`CObD'ʆT9BaI{pVWigrUѓlQcc)-;#hnŃ.£Ċ<^p PL4 0XZw^bIvU\(]0s z+I] BO: Eo0w#뤏+2_m,Y3g榣?:ֱ}=xG7 n|l`f2{rs#++8r:`yiM;!:0t2AН8b̴C~Brac;-LQ4*KiTQИ]~ {;ot +(1d)x{O#!!-|})~%3JƨKT)&Gn4ͱfMna&(@bl/-)|+{SoTqϖ•r-2A6%LW>Îv]{~e%Yp+V3QX6u[ڏiDᴓV1xcqG%W߱YD B[A|Hy蓄.En)TY*#V}I8zR=,eSQ K(/(;$gzKgpG3[1۽ PS } OO")rBmZ+R(!X_k!TICvv-(\X[Q4X)v7D1 Qn9b3 M]kb^|5Y /dÕ]rN0PgPE\{`+kSK.bB7'Bw+\ƤfQgP%ǰ/h-FGU &;U6v ;w gʖsHFr*ށFkLj撄U5|mAv6`^ܚ{=rzϑs-/bߤƈtybJ…5Eb'_ZV( K R=4/]Jm j'p%GnOܙ©O ڠZ"`EUF"'= 2|iЧA<ɞkl)BtR~&25j׭>fy KZH3\5Dv0s΀-uN// K"F}xjwGYP8(؝/2z!lx*:)9t=_~=OPd =Vz;KYCQ>ك\ХV%MSMBH? h)ܛÐûʍy*!#קIngm¨UY7 7|'; ꈚ1D#G7g# E% FT.4~ƴ%$VfGW4֙8ȅe} <IG}kCh9̏ޣ=Y{!\ϝ\ mH%/S\ ssHOT4P!Mh;aA* <|]@ɪ@o/:lP7pue%}5;r9J4xtAJ\H%ȅ15UnG~${w4WkܑuQjh mױ5-3FU ?RZ2Yl0|tM`L:([*0s" XWc_6ZsITMSYe3:ڒy6A4_[)fI!+ի10k INSfpsg3 C#G4b>2:Y9~MI?FXGOɴ^w;9 4oq/ebSP s4yOTݾ% IOCG} z4pʼ: 3"Ҁ4%+&_>6h!9M?>+Y'ZX2smh{lL6W@LVųÅ%x~K{zu2JnClt35[WpJ@w!NֆLm,31.Q#A~>fP &L{ gzWUzqlA_ X.4gQ U,bQͯl|^U@ q)Y{rgꚴ9uty pgpy9U̗, 2ōō ɕq1a~-d*Eɍ(ۗ,Wuf *Dƛ*^\nu6Pgs)nu?4& >)^j3zσu"wwA=Gp{GYa]fz)@u>LS.MLg*; %7`J~gK}v_t0**Myj4Mώ*W;= ? Tm`[7g|dLͩȢWtح:Bw&ƹ<N ^-%ueh ᭇ^4uo " >jb;2 Kr*4/U?}ß̡2=<墋f\8bv-ǹ -n҇9dwFrV_N,ԟUtK][P rDwb/\A4UvOمJxLqB;:V W&O7}a_hjIbLع\AތP4Hp^m VkjPaH{I&"5N] (E}iH3Q)g "f6$'qt1Xy/V'xx3&D^:h}Wu~OOLǙ*!x1\@uZ}ƈ\ZSgfk!g9a[sJt8Z#xYL]m}#&@udꛗh/M/3#\E#\áQ3;$g9/MP;#7{ٌ Qymf5LLuM&<{0[AG7|won%ĵ2+w`&aѕp+r;?#e`2I@i_ir{ 4hZ['$OTĴ)VHLh#!fHw|N-%G ҹYeiQQ#!x\iuW w3aRtX_^LIZ=A4-s-:o+*7),%Aݹa͑S22 S'ͺӞ-[EvDut/kJK-^G}YtƝ صqY#ԮNTH3A4]8C jCo4>qAcMHNA saz_/C |9'' fQ1-# --0_2|ulxt5RW &R>7]f7)suTNE@+Co]̟՝AۏLo`t}@1:74^6e]rIK+s3Gm-G bًPo? ƃȺSVVpZ_dU.9ywYI$♢`2he8z i UGJXibo2Xт[s7@:~iC^uIyk;2FhP) f0@] PC:Ibb~ CymX*3ȼ5Ѩ|n❡Tf10~hؐ["sOR3xߎ{UIΝfM26MZÒO-#M¥ѐ/ v-*#R]s6)|ZbFUm_5]֒@k/to`y:~{&mHʔ3C\4I;ZR8ݔmI U:U0u违k.2~&/'xt$ "c PQ2jQlT@&g>2bt_FM`Ys_#=WHn:Z@$'+pjٜN2&VGjG#{?k7alwu|F~*&mj>sSrWU?H*)H9;.yjaxX_,K5vKE^}_.Xؑ[Ia &@/)OA4G)ep9t$ GF<~wM:޷+<˥I3X5L>OS-ti1.v'3ɴSFHsEÊm"šxرcYpF&NHUd4h OͽD/U%JZ9Eh# BW+-|S| ^e߶[0ܬ鋽 19 Q^ySʸ A$WT(ڡyi: Bnm$娲<΋c+CMێbABxc~v!mVn_=6D.+{toh9?FT%M絻dW@'Nmb~-"SYIw+﫩燩 MNU]0D~8?0UFgZ_Zn0"xBir"|:bLS1L6x0iW_ñuR^sL7f! '`g׋N:Oiś3=q6i?c?eJ0]MWOTW'I96E}!T0f)hQAD_=lfB7G8_ ։%m&U8+ިN𚮯ŏ= UǾ qW.b/`uW*ޘƯWuB6curU<*ңF 6F m]Շ 7 |lF }{i z2T,hao0.izy uG2L3kزv |$Ѿ ʍ,e3R6k54ЌU$C>nQ]"$4ja?+Z ɏe(> #c%DU׹IOJ_t nYV@ЀRrunp?. ^mYAό7,TYDG_q-PE4ϝXB̯W U?h);dY~B~LI=_r2X2հi+rU YɥCٱ K|Lʊx/sM%Z3D4Zu$g7SB:$O+C}a vzo>+MEXȧ~sYY ro輋wA[Z9X~p D.hQjCpQ\tز*{$VKNdԲQS@ se3W75-x6%rm,mMȺAsޡ9^-oJo].r 9iS3ߵ]K449xdlKEy3G. g9W4SzE-Ly VOVrH]nP|NSad=ia$ FO2s\_{ ΒENN$8`_eǘSzLzJ^Lf~MO=Aq'?ō&s,: ~)Ke`=0.R_Og4ʛd"9]uߛ-'r+BK-.#A9(gnIS^ _ hKlT0IpQ^4תA`C'v~lL}xwJV -¨ #]Ѩ{M,b 0v|uv-+eo`š'֢ݛR!eg>9^`\c!F|zt_˹#r˓`,=!-RMCyfX0p=:]J;2_rXؾqH_Lh/HZkayy2ş&a2{ƅ gghh>@1`UL؆s&?"m9֖d6%Lϯܟ & k-Mw-}65S!2SW_)zeX'S0*WဗmKYjT&t"3el#sbsz]&?̿%QcǸ/|=50,Jzl$~[6iyOmG!gS RA4ѧL\Agɡ!߰qRz(AG 'čQ3(6j9Ue |pd݃_$qE[gدNorchph*oSX׬ Z gf-2S@tju'6N !FU| (Y+bCWVlzw?<CG# y(ƽ: (%xiP!X!}!Bu@QZ;@|X,O~mR dR ' (gpJVZyhQye "5E22F8jFT;YLEԓ)<]fm<9:8K^qL7:]C 6kN(Ξe8>4!oKL;diJT3%}2c1꡺׽<3ڒBaVsG߮幣#C6Q$X5 g)lZ[cUtLHQvrQtP|o6z~!M? \q 1TEd(}Vmڭz!|#u#x_Г֢SoxzᏖEsƔm"B%?9b վBURpom*5Ւ?v(ٔQggvs1PsGRXթ3Ù B9-?N\#9n}-׳f-JMf`Z&a.+nbv6K)) uHYŲF0ֽвR&CEg]O2&̫Q:(Η;<{_˫}瑽e;/8pEgsf4/-dK\EFj{-|quuIim." R6@TlS%'WhX=㏇]ٍ N?F;ûcxo[rQV:}^͗ l| dlՂfJ9nxFC^Ԯ`%]nn9p!?,\^n_]xe:pEwUY^P%?Ug_dREmU3MII޾- ~6D!~9r|q +UdDJn_uJ[4z^ݻoPo^gY*J(p|)1:ӶvIG3;#`.yÌΓT1o`HX}XPP FɊgzi=Bw%W hO n쌽-^ù.&?hkp;gF')ed! b9V,o;7G=HFͪ ј^@hVEaF~Q޲#, lv`{Ӣxs,;';kWȔsLRIAuRUD*BNudZ ,9N]އ(}==st֦O)@iPzTE i '/=Hx:*Ga@B!.zu)U^b??OF7)Yrv sy<kmZ/$7%fAzn %n uLXUBĮ"!|J rn~:,#eb#:n9<%?3T@t*R6҉Fhk[ lP Z ܭj &ʢپbϧ<j9+ #HmYsrҨef*DJ,z,5y~z5xjkqo.Ģ'n}f?F䎣 >QM|6 O.T ̺JgD<Z@ggO5;\Lڟ|f޳}c2WcCOx, *B< %P)8HSQR6d:-QT/>YōaPY2"=cm|'YIE?07A#_j{9m!4QRG atB=q=lX6|>5VZ}7B *Q}z]-5N<Ƌ;>yPSNg($ ༻!4X$}\tZMzm`w)ٳYM|NS^P e|&a"ɗ\vm;rpcA^XֳIGd6w,Z=bϷ[սokan:kw#`fnI#JT-p?: L;ڬ`Ap>gEj 32@9M'$KϜ~C@-Uǃ 6@{&JnX79ކ;=?AӤ* Q,W),Yēs߿Зn;KeO^vRE[2(O?P!թS~PqV|^q3xY|9 KG7:nYvTCmV`׺R`߹v%EH&od\A-3_ζaֺ#Fn."7G20l>!{;䄪)]eOOd~ iY" sAkL8 Y&j;4{6e( J?y.jN X%bc`zY|BZe(E+~pzU('R3ue~j!qD`lՊ^,tq;%ek?(:ό\.iA^^6*xǘK#KFg*XK2m AL7 Agg hao@{4$d)c3@-6(фoui}+>Z3{*OOtع7(? wokxk160'p&_^d3?qjQKD7'WA{w*Y0Y2=;+ 6f~ΆLWg댵B+{ j}f-RS_2[P/1M {᫹ m )7T]XRwfFWz*!KX&v}*" -y jRM4?}˪GS,笁0 g(l(5\Fq,o'UY ii;TkWnf0[:xH`^%ЗiƲ( ɷnw.Ni9۹aۛ&n E6@Z{ ^%z6t6+\4=pa2VgW2iq偘2WuVfQ84;+쁖2Xv)U6MvH8cPh9=ģ9`9H5GCySzֽEJ`uɬ.[ApM0K9͚kr|s8gJߛoHmٵ~@\wqJwPȎf-43,Es{fsJuNNmS8CQ w1?j_oK*dlJ7i~,e؃:c2$<9IГbjfyXEon*?R}>^ɐqt$ k6A`m6kRg }cjBN8Q1AylBz0$}QeaVY$5)}/)#50߼7[ dqyy;W*JQARR+zvc+/ ʄ/ !͟'0lLn"}BG a%@& nBV(Sft'0*Qx>Ya^8c) ΃gJ|_@ZTMURj~:jBFH2?k!!S)^!6:RW`CK#!ҀV+4(}nNG<[ &EBMpxn.kWDTf $M*|mٹBqE=Xz6kpDp0ʉKAC\йHS h}8tCQuX[ q}R26OMX!q@5LVl?Yd)g_'=%Y>3mAjjW?D2pBE]E!اoO:YԸL gd$dL9Sb ,.` W<2uPQ'2Eܛ8t[q48ߦFIDOvA܎~ JH*+ Om愷yUn _͂.R]$WjfǟgDc8݋jJ;b֍Q8+}ԪI#܅JRAO^"p[CqƊJ #]*J; qv/+L$&etIrq.wݫ)!cst>`x1de};N _Н3,zS LHۥkWdA>!etSRӃMa3\]b~R58%).¿o"̫0->u(#k5?AdHYg\}W5O͋mb:_ǚ _pDdhBݲYngYDJ\BaceٴHWQ@-S2G^,tr5[NsHռfڦ'A:7ka/\Ke,FƬɂɧ9WW eP+b>4d}5բ}:QA } E4Ob鍘3tmR?FM2Jm9u=ߢ blFIR[-zݖ<ş{DՊ-VLٚ>LC(ӊ#?џH1JGw%`s]{ r`@u{cKiVPO̱cc;i<^,\lU-ذQLJqqAa/sK˫Am䁑~`spHrxtNG7nW$`Ֆ!0wa2UfSn/&la:Rs(}g}%9e (lj"Tfm[r% w({cf0@ +|ݰ 'k)92ĵ,RW?qo8 Ը _:ĺX%ZtZU:shp3 *k֮f-jا3'mM#tyA=~֢O9z0eQ0/sgѐH<PخCyK.CAPM˜oִsȈd+uϾ};Շ$bK|ȫDo ]4" T[JzX(QqVXM6 4hׄe b]ha$JHJKk!$>SSHC/΢.kY\U /j^gw>ۣ CUjV+[窮FuuD!,.XPHz8WB|e,C1,>l -D~t?hu ¾ݧRpe OO3W;,^A]"r UD^0;=LyDw] ̖ S a7Af#<>,qH?IΐJF618_YtT55G{*^6qppm2/3~_4.;hSg?iImMm#K!^Աʭ1u[z$07HwPJ5,rhk{: :-Ki $Q_"F[-K 1W]*Ÿ54/묇sbG::LHǙH`}?'olm;i v{R,<5W:/C07v Jk m.o3aѭE(L͋uV@fmkpO`uO zHs(=Ae=EB!9Est\o[ ?`)O.{4H#-k) p9hDFʩ|X:s%iZHhq=%3RZE5ozn<8\ / QZT~)1#{iZ~0z9#4]u%:`~/0DI$;d,OTY{'~1ݴAfIAhLA2S,R9AMקZ)`#ͥhs /8Y>B+S iYK WgWwLя[#ש䓛mLH 's{^c^0/pvUO@LA|Y2ڳ:8ȋ-Ur7)_SMͿ7wB>CiۇݺzYջK!VJtCs٩!yg(EGm~8S+LC9A1. > 3ʡaZ~\:E;D9J mPxO+3f:ūr $uwd/GY$`T\ 6eC˷=J l9kR_C4.dh!ܘ[Gز~<:™ݑAaz2sj:~>)c}y#҂K];6r 7XЄvLJOU-]鼳H)ƽwx5VzsUJR++B770@s 'WEׄ6Vpb3hCQRϽ7`^">I~Z3 r1_l+1 xqGgn,utwdSOvYθ @ݠ/Ml4[Pv^4YNo# P]^쵮R=!RT6}i1 \Tsh?OW58M{U'9Oe GiViZ2?ˆi~C{rP?HoLwڌG`,̲% )5+<.noly:gvDaPC^j"+E2zhz2 ˉ 791!4 Ђ@IAӋ DE_DfZ#b>1tV4Z _bl!6Q[QʔE'ګׁmh­'ͷ ?AEZ\ r>?3Dt=D oha\?,-QT*SR}*O(Lpy bVa56~OPFQew:]DdroJfCaXC6]@߅km5=ewDYJ,ex9-/S݋GUS`},57L#j4YD%xj5YJi8AXJFZ]=E э _Z$Ni"lT^T+)Lb^R@}ocHm/bv*\<Gc1gR_"])&2u=ދgɄF٥-W7i% -x x[sÎgܟ8l,dFO;sM4/?\zX -[<\VO 3ԟFRՒ\k=8'@_xkV#077a:C!g-e6Vv\1oE!k'*Ĝ9j0  Z`YZt7pb{o1% A\]Ae}}[Qކj" =Byo5>a$;CfWo ?"9:`Θ|'1IKG$whײ8f6:*19#m2c90"&ϼ#_A5'gƔn)H1;:,ye+3N&j5t^TI.έkpoס~F ofތQiԘhy>Cʬ.4$Qɥ(Hcz=.O ۫(Rm3wP+mN@?;ۃdkO}/窡}A~pB*+@2Ժ2ZY0G:Ξf+Y_W1nsjM8j$#9~hkkFO8҆, xbĽEq! ;2у< NUCv:&75E;^w%SZ/T2X9@h7K c_h82tj/F.|o)UѮ >!]Hcd4aR1t2 q^KYPIOF&79s ='Ԟ@B06< ZN` F   6^AW"D鬭p8d*GGݐ?d9o@㊛1 { $1kЭpbC4HӪ89 ikp_T z25X8=oo+6SULJ81YVn}ňdljGϞ,}T%f H<۪ [ݮٜT׬1$q22 x̑q8}VH&}8 /$WRNYk3Lz2*@AS4'~|ZʍՁ3+ۯVؔp[o.\kӦ̼-?Mhe}R8/\>Pϻzx[w=DUnR(b92B*X8&t^%!Uy!x13F͌(_/J4v?=k(0>=qp?>#=GS{n? ėdmхףt 9]6S[_]236#P}?Im)뙥^ uZD0o@>'ݦ 08l"ʚP6xqXh$\vK|.EUH>dd !Yus͡;B(jWQp4pw)D~z{XcA/ $zzF\X F;"ϰjW΅.rZEDsv 9a0/B^ %2Kf7A(y ŠL|v3:rSl0(Z 5 5?&8f:V^xhGJ˞QX\O 5}?BKriiP"uH%@v]ZX;ծQ8}߁$ԏu?D+pyw5BJZ,`PԵ~auy) Mʭq.ch_J5n [{6}!D cE Qx7UQ ~׼]0 ϺI 0<,zE)srHO&(9BZ|w:<}|ttb_kl.0a;O?G#QyeǢ>vtFbO2kc]3 M^KE> P9Wx-^ |#SW;W$ @1MhKGhm$/i%]+9O<{u DyN$K.姙A=[YK;9iO4h|>1M*5͌6i>ow*Y@Zuq +'.ty:p\+K:A\ߚz_ DDP+pW߁Pc%NK}Y%}z{('|7v'Bv:*Æm3'0mN` bϝn$p LjB_mgEGWZ w.Fe#]#br'O F?tF@ԁG]$84wm$B5UieѽfZm8%mIϬVwxנ*(aF įĆ\Z("-'k#'n) uAy]Av_x,ɵkך~TFd;j!wT9@-ӷka1id^V`9ۋ`ͱi!$i &8طd2գf"u#5yF(u p}'h7cnNVד#VySR֐NN_¢eIԬ/KZq̃ԤQ\UL噴B~Shרpπh ׹xWٮ+>LB+\*䠄mzP,%,+֜G,-ؒeTx[$ _8,f=dۥI/À?I7T"H. uy9.Zl4}D$L:b0% }-{*Mw=9(?1XX̣JY{Je57Ql)f^_WEolպu꯿FILhZm!d!- hM3#-dP/+,Y{LX-0ȉ(Gj2w簲Vժ}:XĞP7XA=Aii?Oʛ@mv-I5L36$cm:;dTX8H.bVAߋ_^]6buD`W4FI3@zc yISky{4 hk to+~>Iy%r Q".lfo3#1Rqlf]WsRWØW~fIQ \n?337H5QP?ɪ-~N5,)٫~H mk]ZV>n'Ci`[?6\K|rI_2{|ny"'oKI;By| c:^}b^[vikYET)U??@j7mg(- 0 G|_38%rX W>u3m;Q,ޢȪgttn#D/0Bq{"pxץp%,?K3+.y;BSKӍLX*Dt/KKwf[A~`޳TSX٭C8d<h p +OCPF) >h;WG:7̋*sJ#ZK ^\:%>]V=V@T3-wJ-g%Y!}`D|aVgiA:l`v, ,TLDY6?.ՆC> 4o.& )NSa33NYv&b<+eHr C3 n+`m+6WNi= !`k]PT; Zq(${lH{S'ҽvɇ'Ǒ>.z8I7Rغft90[dB8iՑjMCj&y{lPՉlGS~bwҧ Ht;o %;L:h=ke仑.'3ڴan̕A=|暣Mji_oKU&c1v8EZr.sa|t)4(]FPtH>ZUqAOT3ӭ'/co9[/{d4VTV4"Idfb*t"ؙi]!+olq[m%nLXـ `OY7ܡ_ 6V wU{kfJìư:-.:чG[#*ѕQi kx' { &2Z;}sۮN9P8NI.^ u T<=ޒvێ $M2&YBH-*K\5#\05kzװJ]۲y+cu-LipώX,:럨aMsDZ0UfAnV̑*L5b콷k]%L >Pۼ>[8%M]$LY<y8 /c{" ,zk=%f*q)(9>o֟5#݌Kc 1Hd7 s*8#TK糑ų"ؽ| W$\"p_={?7Wuc'n5'͔Z,+:nGc,Qc]`|d6c!EGgdSfԨGx,"Ņ*(0n6((V?~GiH#8+s^Gə;$2\z)Onj}MVa;}/`&ׯ1{ӆXpv m"?;.zEWo6'|f;[[2q8??YDn9;>:ǵkE4+{r4FE@-p0lܧ۔P ;tQHИ4v; η@}7C2yz4?1o-O6byt6}tLYJ N6SGS(Ï_Q[_Q׶u )BxBš H1 %X!hJr fKBlvoh]\˭4zg#PADj'P(zVuToQ6 25s+M ZWEYCudOra ܩhyq :[1$Wdϙ iMikV(#0}Z< -Di/'w##Nbpu/,.Jm% aYpoRcL[@BDn"> WdYUDUU< $ܾV/g2W8X2CB}O/DbOJ4S!oRfٴaݺܔkԎ Kznb$/^&̠ }M7xѡhidͼ2Q,HVّsx|].ߍM]_a&n,q*-)LLLG,Xn0>\FmMNSp8\̔TGmtS%{_m.-Lws Ska 5&0 :\s!`q^+ccz9|8|^<]:>SPC|t8<)/k#<(K{[tFlEvÚ^uEg*ӝƲ9s@%}AqcKfur''.@ӸxN":ŵYȩАN8g.PILH:>0ߵ$XĎ܁CuT>&75WqP Eɷ^,=Hi؋ QfQu;SWl`Q͌;stߒrGg)L`ѣLG8K'vK!H b$Hbvaå)YJ0{aNu-?AE҂u.QL*z|:=2؁0-HVq:kۯ`QK*)Y#7P }\V[#;ZH}wR7X,!\% 3]$zJ9饙hA!?2`p-uH}2Z |MK/-dl`@U4mBI>H>Nry2>x]t5Gp3U=iٓnr׵ Ǯ =$xQn3$YelKt.?M)%LC#aUE!x/J\F18sQ3l9K ދcd<կ ^= ]-!AR0Jl].aXZpNqkƨ61g'ⓤ@WVT5J OeTG J\ᒁԫBW/v;nQF qz'߲HOjeD8)?0B0ߨgrOFqyodOQFyҔ iq}yw͝z7?S6&vзQl&s+M5f\pC;ݴ@*\YWPXSps eU9sN  .E;eej_(_[M-5+A>h7o߄*[i!GUض_$~K5Ef9[.e&/Mr_/AFlc[Egz!՗y }G\_3| G1:R=?&p7OYٽcO:Xc7mPaN2N* d''LHTQ Z$+`4߬[%lK Ù*_v@TASѿVh%knq(٣j٘.~o NBMm6<@[܇(l$ 3ҽ(a}CT_l&i&m,\Kˆ4}:J[I8J ?h]O-'isFi`iRQg-)=~Pb)Ɍ=QZ9A=cVc}*e\q0\ S\}vv"H!U^=KM?$BlPCxOOWx₾'wj,fk*|:Ƞײ=SP(8nN^C :6þ!Zn ގ gGe\0St}Zۇ*;= L9!@bϐ`kV02A^UiY(dvkqX w#t3,w7Xk/F ܡ܃+R~v~8l3f8qɪ#F3BjUzdUk0qpkɛim a PCV׿sC˅-MI5ly}T5&$!WJG0$gBULHNq'&!'+ڈU@/q$|\= t%{79=3,Z*wzݓ{~i<$b!${a@zq.EZֻd23X&ҽm^w&PbJܤCdIZ  1ェpnQF+Q-ZXO =R/7LlAʜ ċ:DӚgPSCrV߽OVu> Hڼ(kߵZ8^R}dOλ ɏw`B֝A X^ͮ\TeV5;xV5 +ԍ@ϒWF8dTuFnTd*~z^%:Sƽۿ ോRxTΔޝпMjBz6ĒiTP`ìG9oEVTF &ԘC7p;#Lbرt4~=*m]x+Jz1)76NrG؝(g{[ M,m(Q5~WUt]JFP~'Bf"П? 9y_(ѪgdpLr+IIC\?BM%kK6DiUGe<#2diCGə^LŲdzFڼ交oTDn+ rI] VctF v<וI|Ⓦ\-dGG0Ιaph{:* zc- 09zP~ޚ C,dkJ^:$?v'ǟR;$ -0ApORY](x^tGS;PmqcF r ;:V#܉wj͉=gIcKF- Om? )^nÐo:-ل=;R7u;.)B9sW|٘gy5.˽|)gcBuP6 ǘVt3HMp'*|5xJ?; ީ@6%Y$DLI ^05&bPBZ/ вR .js berWhش)+eעX !*n}A~+飿sM,< XA . bb3K`{JyN:Fm `nreڛwi {6Y9)޶,/SףZ2=[\,s  *㱰 a H:p'KE0qR+1 :P{$ӴqmJ{2!f7k9WN^N^'Q=FطKOBcɦKREdD˔FQ^QaXxNneOX PCyi1 ٽ23!{H6@6V޴2rizG1ouF\&Z[Jⵒ q5>AdjX1 S jrXݏn@+mnk>;WLIuRVU֨Lft~6)c:r 3N>0{ &N)ây4K-5臚9a@Ib=#|j6u (cڸ(ExRIG8L18`oy |dP}$&SIgo13%t 0τ='nӘ"dAze4NҸAE4L!~K)~4I򜗴Jnx(C43)ۄ`52R+y3 /TyD16 %yhkG>}eϧv 8A&`"Wac%&teqvd{lùL]Qÿ;&F'%d HP]$_354F+I\喝>d:6#IX^- $Cn:K6*ɜ7,%SG~3♭P6CTm =An}v@R7X&AP;: 8vqk` #, GǰaDxP:@GF5|%>xm9Pz:N z`Fa{NK.p[1Ȃ ӣ[" 0r? :EZp;RMعDjRM(Dz*Vfǽ* !&3GB(v1 Lq:5n,ldG֬?zth/b`-:s\ҽ=!.`:G?ۛ Z׃h(6PՌu5*L]8㌕yܨ ¿p {DZ>6imq9/%L`85+M17CJ6HpV~$1IBE!Tʀٻހ8d{?e*xVa~\|[ y?y&F5qrlM$=Y58 <۳ʘ R6=';MMzVz}t &[ު$Km!H ˺(םJdc1D FZg!9fB'NdZ%Rkb;`\~"zud~[VG1g|R`,+&wZ4E1MtD3"sJ ].K%sݱVCuYۮoPFb!'cn45zL<>jA}/40ꃃTme.(tJ"JtRvmG. ">uKZ"DwS{Xq^@2+IIQ^B,?΁Hrq}$*tvqM~bjfmǦP͈Rx3c|o@,= o盨X\sQ9X5{ms8LHfkZ#?~/-Vo螐=+1e !uM]̏)xFK0͓.ȟ:#1ZIg\w%G6k/[\[4$3ؗu hX:wk]Z7 bw b͊GeDdTj0Q ǒ.{{Ȫ%絪1! Q|Rljxv]oحlhJbJ8CC+1'T7t׎T`ܖߘ;?Eم~<_u׺*%(Xq yU&jsWRdϞ˚NMgNkK:#k^Z9H鐲`=>-tk Gi8.^ 's u\I׉8wڎL?XNT HrLc jϱh (q@Q??PQqBWC-5b$+6jNnɑ`g m}}d0Yv8דTL~EIvE'\i3[;`W춷YY#VsMŭ赮ĹC W Ԩ!sM|72ț@ra$3`MAnFp+#4zM`ܔп%j#>&ov/!( Eb,2S__V841V m?qL]~;;wI`\'kYս{\K"K`GQz:T&cOWEjvm>ƂG8ӃiuOC( 3GK0MVrK^DUo[]6\_6K2^yNsyuVņ4'N ?lO og,vno維EN$H+'-hܡbYjoWRtHXqưCɸ&xbDژ-rV̥uzj"ko;V33b3HVƑ1>%81}"jkP6mSi K)@۟D(`Z|Ma-zĉ.;PKTnS1O&<>ޭgzw:ʲk!|ቒweg9s^W<\3 qtV*h8;NN οCyLGVp,QA(,ctElSx_7fAni:|3ȩ!+[mm`JΦ*<(3cH'53q7;!@BKsP}M8f]]Iנlf>pi!K>;A:vhwZP٧R Ijqki擂#fc3lPZmqҼJHi]ߧ|uC{bp{2X` J^!\#XJġIfDuC"I[!|FBo#s>5ANEOGqivn~K f>TԫQYcj hbC>5q\-, +eyT2xg! zigy0\zUe2ƂoΉJ'FR6f Zߖ1$W3j; ļjV*dG<H5,@4{kY:BT%ܜ"ZD}RnO` !GέBM)_E#b pN3 Q PX 'r_4czpT@a%GU57ldD2뱻Njk!XܐROcC1Yp)QH(i}!c.xv h9ն|G' /֌3)O(bQ}8 1"wLOűKOE[JS:'$jG{P#u'Y $afg@'SI7ʜ:=bW8&xuTˬdqi7W_(YiU7wS1FmVgz>79wUI!wQl1|=,s@UCAu2Cd0)_"$sAҎ9\le,pF1/9؃i]p׳il^"BAīE6?)c 3+_mjp…Mp?XAGl"_MxL8N9݂vmQajV(9,CuE4{$Ad/CܹԎR[$P?Rf䤇<>5տ._aH1q@8T|:a@D/ xQh#P/LSj3Ԅ:n^"I#[2+\5a[|g!Rbj?6+!>h~x&4{gKt{i(E51w喨8D-1ax:pGj_8BXgJ1|X$^v C?sX`'3Z̛/ K, $ lHբ/`]f7xWy!-/=qiB%$3Z,԰u RHgـ)f4<!enTCx nfٞ'DOm=~+7Ϭ|#Ve 'j+gOH~bʱ7·Y-(<*7t Oiz&_\)P ;wncRg2F1_ \jnx>Nzf׎v}|k=U~`}1<.߰nAyyE-[QL88)ϊy&.bBh03P%)x^Wx'<އaEa,=1y4$c u%#- @hu|g W(;ZPl#एNFuG1^򝑉LVz{1/@qNgh'gG~ӑ0LCة8x ȟ 9ާ%Jμl5JuGmT}_#(9籏I?ty'+P$-Eo̞VWE0LFC )RҋPqQb8޲PW_^m g90*xʘad+$W8aKaVU,* ^l2u :-{aXhCEp`KCK}$\@eY8f(hkg\Wq; Nw2 :K5!G@ȉtT}#|H+tduaWǔf6tM.o"Zܵf)(yH+gIpqk0SjWS' ʚ9_&[e:$ksLPsUJ9{Qv}~.6hHpY,F/Y4@y4TU\㤩/RqS*Á'x&|Re@HT Y-WLԺ,瑀0AP/فؽ1EV⧪*whn,7tА[Ui4" S}d_NgkF^_+4*{5GtS?{Uv$}FArQBw_>88Jr# {'xޞ:|ލ1DWmQ~L-s)qq7(sWmh^~9HoOh߈;"l=;K*@[?$u1?t G+r.]; 9d)2<֩0_7lŕ ) H r62/!4ʦKq@ {p }PvDm-k)qq#o2-Ŵ"mN6'FđZ/$XS3}t#_ > ㇒9(,s6xO>] ٟ'UG?TlqMa3 uHMO6%krij7M|-+6ҝQݲbg[ T6Ik݆v ĜKTY1#"vKdk`$]ŦCN1*6uNN$~9\̟i˶~X?ck[9i$w#>k /Z98 {[[No{_s.WURF\ae0QFՓDXcdלq֧o)n>vKb86N0^d0z6=\_o4h|CrEO2}#ۖ4U1-a!f|ws#!Uöۻ<"Qyo^=2z2BA=_;IYWn{6 65; .8 9ՂWWN]B1Bh~ڊ2PQӇ}ѐR@J4X ؾkAIAhLjR&z᜕K(".AwMPl,9R)lo+ՠ$u 9>m6ćڇkfm%5epHDK| bTǫLD`dP+|{Pt I^Xr1hReG斗uf5?B!dŏZw (pdQ!TxP8r1VHA,: 3u'(]cۂh} Yl6/vS~$os )3+k C ,#\H{zk3v3 0pGW6`5xIUKC 'wQǽj*kV޹jRQ' jmze^/Z}F2!.U,!wW#&{͚sIS.N)6"X1j``V\]uRBhO?N7 HV3jZ, +He;̓ 'fJv I{sLʩjcvq{LXOfh]!V6#|S9iV:! l-53<.# IލߣUÕ_sc8V@ [9EI xɇHuk] \",Jk$?v}/>~Bx4tuΠF f?ۧH'Q񍉗 IXqsKX^BkקmQ櫺Tt5;;ao\T7J8RYsI::NBESh76z '[5g$L5jZ7Z-TnY6J,pHƙѥգ%2#r<~>~z$/9X@+y7uM 462%`j`V:s{´"ahۦokl1;h`rUG1 @vmDnڴ+w#;hrVsApyvUaP~6 Ix[,gs`sRSsfz9S ; +' frS H놱Ģ"Dfnu6y4 jo)9?X-mf#v B7$}mh-dnu;xs!$H?eZT~(QIy*T}= Xty&A^Z ܿJcw)2sI& c#bc]7Z܅"PfT+]i3 L _Z,h1겫eSP 3DU+x]0-_`i)t /ёӯgrh=z <lCNckV|Ȭԓ|}K5spagi -%.vR"zCH=9gL2YrD$m lkJ:]4'4νo35#Po2 3Ѝ:Z<|5XKܲc=Jq`x)~XG?/_s1sE +*Z |-Lm6Z=Ua` RI;]'m?Nѧg-N\-푥w?;Bi77­wEQ-6N9|&EyDҲ΄3錑ӷ1O͏?n~%U4tx`x/DRXUO\ p} ՁgB9rhIzz8ڂ3Q\KSAOa -MmīIym+n֤YWEEfwvm4wG^<_ EґnJc!yhi|-$AOTmOB]WY //́ 3#&KqFBeT>v0H CuAўN2daC$PȉY{ۅHz}C0CdPLN%mt结J9nbqzJcEEb׺Wư"T%xq5-*A5Kq ^7]0|Ɇ<L65E=iBdjvJے̽-ujǘߍm..Cգ+7 D?o|DxomNw]4ϱ2Qx۝6aPH ebT~|K̽=W΋ 4V2Kc J7LFIm{7#$8̦ wiu-bcv@l#G?1!fFXܒ>v༓ձk<^`A#w vH;eZX¢b9|ɐy078=`MH(%̭j%.+j{\W0evwx)%`̀N6Xv7b•-EzAQR"1z0VuSN2iQcE *VgCqAl-Fl9t[s!jvK[\Q2m+9ΧVV3jRIszW}&gnDbX YytҩPV=~Pޙ}ʒPk]Lyije&zkw%5aYYcI0@clNlڡCE1\" &le}83 L *:gn^+2Nc_8@B7. Ta*[.5M)"˥{8LS|,T; 0brm/^&YAr($2K$K{1^X7:iwh_tob|$ LJsXE=̎ύ=|@SGlCa=ub'_k#. 6|q|!2wST,Fcw siom]iGGf+u@}ҽcer kbW{7gb|ׂ0B:ҡP'½3/;<7Pg9SE-"{x ;0eёu f;vmGlt ~{[㑁-Z:PVD\ "?(ur0R\ (̌*Jzj-7nf@|B |IhՀ=J^M85Py*rF$ LVZ,=ߵ15^CǔT{8ڡmIܻ: dObC7k0W{X\h6M0B \<o1Hb[gCpH3 Tt%+YaAʤGDt@әɈM_GK"&]S 5Z't+-.emkdb _ou-&.Q*8=/|,yoE+_3UVVFX6Ոt;'c{vh" "[Ej3)䋪 &XZ}@ZRuayև](3 wh-%W4P@U-h_<:$Z2sp}[t,A1W&sqݸCX7/|sij1y{]S@нTQ!!8k\GFlEEPmW3\4в&]WA IWC"Bm֏n}* pQxx%> J~gNSu3)*%mc) *ÓZ,o'9V 5f M8LX55(}Jt?{o {ML[%a9Q@j1gǼQ(:S$Q_=)aaCtaH Wy0 ne`-5OCm>K(y}}L tt{8B06Y0` `^W|`jGv%Y ~Hv=v"mIDx9LX au`LN;=A4iʖzĻ\Qr]Fҩ0t7bw?)PR]II [˂`(e]k7E,$0n5 4;4Ֆ $/`=7j MW~}0`,IPHw;+'!HAN7AJί!<MD ǎD8M(KvNpE%ym-GYxx?U_xD޴貤VS22']hLf-Cҽ-OdNʧ}1s[mՕsj;T3\aHF&覲ͧFYu+ZA75+LDEtR$er}8Y&vrjѥR\zɤ8'L2t/Z`2uNe7J*jkA0uB'07<(EFЀFGCb=1VXt" Z \'9h㚚q/ʬHj]E3h3` pTQ\:dЈϵS)׮>be?_"q(`gJҖ)L*lLJn>^6}cy}p4JBtэ!hW>bXbw@`D4՝+ĉs!?gAV((+HðC d 2OYp=RuK 8^fсͶ؀2;učΡN:J1ׅ́jiHͮu˘"ݜ=x[d #=:)̭^ ~܂{/xCFlkt伎?𷣟B~SBb |s8:mNBދY#,yFZIxtw^.Mv H*N NJx/@iFYzC6 `1`<˜6#:1Lw&{Ԛ(MSzlY.]~64uأ\CXlUEEpdE yυkRJ 1|,?w(Pim 6:g)фmS V/e 'i~NйLKB.ic h]IW]ػщ2,jvG+ N KO= QOc '}6X{0*/඀w2 iF_WC]*?=ySA˝k)~/[LEpmM !='3a?G`lw[gXZ%l@7CBG(ICYK ۃ/LKP.f.sh_b|}ڤV,He υefsΘUCz4*$ܥ<s&O:gO9ɝ&r |eR/@_<. s+Y &ڙ O1V0 qVS8JތKzFn|z>eaѢ$tQi<&FjkJXA޶_{V uml9D(/\jtWZV.g 9bDa.s3~lqc4~QPHڪlDInDW&n ]+&PQYe]|Q$ )d,݆SjhIA;!6 BY@Rʹv)Pfke&@,2 -`KjB2Ya-X05AE,!3G)Z%b0-hq#fE~3ID3 GPkػfNUV +|U]^&- N]4[U_ֆ 4}-P\|ct:4 s}X9dzҠ&̝:E?}elqag.0b3=eHR,Bx " vf!RZzgXFg5`GеGr:tS2fۼZr튳 rv IB,O$'A `TǞ ܘܓlSt:"D" Q@n*t/wUd -{3A3s6Ј+O,{ǞJ툥2Yē.I+Gcz]s5tS=.xnM|ohiI%Pg͒4hK_k{>yl5VЍnx[w[i)_:%mK#0_3^]Y!2Ӻ~P;ụ{RJ;K߈NFtȆRDGvBB~} ʩm ]P8c"cYLB 2EagVޏ(˜ȭd>\\xG~jnҦ t\r_:47AAo%%5 mC?ܳ{/Pb{3if 5֤-ةO?<[cg`KXhLϳ+*xAK,DC4Nģr0I2Jk#vwbC4oGɑ hv/ lN:/??v49)4ǐ\)ʛ2:#O復V$zTRXb >_x9Z$WW9)(F擟-'!_&i\?:W^r\焏/^nD+$<|R%+NF9EJ6&cѹ^٬N4\EgJXM"c*"#wDxѴ&uO [.Tef#9֢;HE^d^dj7]q87;־## R@Btvّxq&(ũp8Sޡw~5'Q[ B'-<%zcy0۔#Xq`A(\Nw/qTq̘ ;߃ y0:o:K{ tUlvTj1<\ Q0Wh#~5v.ƟH1|T&op6bޡi/|/ 64\I]Qmi7f r"hS݃WZM^%ءYc|5,-3B) gZS ̥&'Ej'1;xcۆ f˼Taz_\ w2IKW~:"Mc=+B.{% ΰ;g{SQϷ]әg(cXSFj+a~rЇ[-8UbC7P]hZ!yH(DՍXXr'vV" ʑ^ 4ж:3@/* wpJԀYze l#XMC_n7S9Ex;1 qN,a}9@9jFcqhNN"D'kH+V87.c{ʿo@(YQ U@{u^#5z_226Qx .%N묾iO7cI-*ʖj∤Z͗~Y1O=3 VS*s᧵\;/ kdBwk~i ) Jv[fv4>ԞZHJ2 TIm+''q竦"beNs_&]%80&q2RdgytAd^x~4Q J/hj[X-v7k=c <(5n1nLܡݒ.؊+aJJ('<7y!Pa|[ nڪME6%<-&oA³B m3^pePj9*NAdv$9Ƀj{&F?A{9ԀƋ)K>洿NvF<ѽ>0)^=-h*-:2DV$EWTh%} 3_bjY`b!n9!ރ31x˩ ,{Q*8H >~q!eH NFRlgkKjzG#}Gf1Y8gӈR4\Sh^P$$Ǘ]q$wjw J,O~Xfsow_蒨 S]DP`,H79;̷Vߋ48ſ ;t3B֯? }] KoIUƄx$b9eii9kC:۪@-NkYVyQGW Ѹ e>1E &!%0+1>8jc4\.^r酦8x T-5KĸF$ECKic7{Fp./&Y0Vv%g16L=8ܹ6WJ_¼,QP,}K3%7y<ɸفgCx^q֓4b'pL[Mc rp֋%?\;T+HбVS4C;gMƥZZ 0u lo{PoQ,$`qϏ0c*"m:7F"CV$SG/LEO,+mvmCb%kOW|lN" mܦ-eNl4EOUͫw[aƻğ ˓#~"%UdǸp`:Vg'8Ar70^ƭ KƳb9pbe{`"SKsNg2i$ʎcEo$[a"9٢]ݻ4D$b6W)1ͧLq{C*{F*ȼ," 'KKg JZ&نwg4B}XC|i5KrpF$.RnRB WK˿5Ӎa˩9\<㛀L[B5.ysͼ3Z'NAW}CβT*s*68KHOO{O؉A;}î;L]cker$e4SKbVq}Pwy?mRyzOFD\zzoYFV8=ikJnP(ì#G= Q0FϺ0+B[ĬFܵMi,L d2$y;eͳZVzꙔ`P1?L7ƟVLU6bkzOhFH5 mrxpڔgYX?G,HC GD+`;>Klw)V0 ݡE80j9{nk]*p8\Y-8A3ҷN'H_tFhMA#d[Rj,]Lz?3SiS$Cȡ nTH#DY &ec}~Z|N0ȹD')!4, )c@*mFyJD2f47_X@vWIMW'9M7 r3A ƈ+pɤ -@ƴV `.ŦX+cz]aRЉQP#7@Vj3_ΉPyYGXTMwL,yGz[ 0pA }h0,.H{aaOh1*zIۡI܎ZLO؁'k"@SBZ4qDA~%>6wzLhnR!nJܖgYkG!ڞv2h/|"AgQH>f3D})"bC=A|47ja=_7x,N^*腵_(1ex$Bk!%2 |.)Ȱd"[wLҶ5e]O!6G&^2rFdzևp={vR1qX,Z40t!FC)5(>DEl9`ly RՀpFF?YW]T?Eb@*OMtX*)sIśK?sz~xJ ~d92#JFKbWMG P6" 賄wOK 0qOjw |.!ܿDd|hvP A[|گ# e0~d2+w"gAєH@rÃ2TEQCI 1 _1JDVHEmysBCx_kl}@բ" ||n]*,%~Dź SnPf13[r{#ԡSUV42BQ.AЏp/ӷ['KC`>%\CTx'H J8:΀8:]8!DXnvʉi<s:x-Wfǐ{گxvVY ü" Ü@-ER!ثQVdjDK@TĶ.В( I" 5')wnnhc!܏+z|:YcAP}ոȱJhӱe.p1(7L] V<Ćk/_ T`^nl4-jI4ш5mA$u3& ,$4+WtPͅ>/FFXAu:4=hC[Ũ.ՖKܐGb7vPuW6ì{CT7fʟkUbSXǨKTX8;67g_I.HJ/ |qԚ!"mJq"Bue6876]Yۮgfjm=+%) BKF&_9~Gu5~|ݥMώ91& Q{^ViIrKsݨVbHk4/ OBKX vhaG5K?*ʪ9Z@ݚzza^}Z)I'!ht&~f TQZ=-sYCtMF1קUٯ#̪E UJyK%XD1ax &UZ :[,PNr(=0I`y)4bk % :~K I^U_\:#M`9h1 %773UG\.U!vT*H$+ztKO*HPM QF Rے [ ZXs$'vm@f9qݒ]R ie9 <+%us6rj؞Ųvb^ :<* o/pxbL)6Y:zV!` 4W[,JXU+ǻjc[5`mCJjۍ'? .7SցS}˿ tB{rdb9;-a;!hp5nk(g 2mDyuAhLn8rC龕^2v<`V.5m2WuzXGSo;8(H@L W :P ;V$3jqt\PtW\Ҩ؄S䩢4cP&"RބY^]"?Xm]okx']%t` 5vWn0o,óTQhC5!sd8d\p!:ijoх|`~WWb 8$R# T4^xP"0(7\a$DcM-]=:LVPeGB7h9G{$DȜCn-(^+!k= r4P mFZUwfWy'SMS# XXldt'w5΢A;"{k4z$7+8Y祍/OώͱSVsBF?`w65xغ?OMv?lfE>y Ր?3$݉v4qmE[#ai. f3 v {SbVNŸ[fGaVF1Fz/A xH*F&\; Ա6$BFj{,R*$|T?b{" xvO`l8qHZ3?q2~PfEg/kBey໚L@W 6ӨK3wK)b߄ \O 4Xa]#g h(.\CWbnt 15ґ!/#}kJ2[ nmbgq "~ B"ܥ`5)},B3(m ;-ר'O)[s.ySgjg>e#ɬ r J˗e; Z|>rB"r^$;=%2_w?MFk=ӟkGP%"mWK$ja#oo,i5/zU l%-jfwNcXU?0{yZE$m[ƿ:VK!q)HW 7 DK8S"yRU/MnMFN^ʭx(J 2T#V]+A߉S&)Φ6bf^4S3Zt03Z ]ӖPdv}AAiVkz=Wq;|\iÙK% Q4nfzFspf^hSǒjG*"z!唷?jxǷTw M{{Ekl*OXjیY>]վ8dY3^RI f >jiK: MZ_fq+'%cP,g(}X@l󎅔lqck*7t2okFע[rDhTϘxmJ_P|KRRsJH^,vE˯R- "td9,O3lYdjk4&,h@F{'㐜$슔ztV3*خ{-v~a7IAƱnOOP|6,IY*җ/i5ӿJǵ dmW9L<$>*s1TFdXgo^Nc IM] ̓z} G7lbb8fsU6CxÂJɦ~(zFKC˄:\[dIŸ7Wc*3}k0{XFCkqf !;zA)z.K(7 ¬݄B*Pfn!fqq(tDt*H rxNV" 4zS.@vڛڻFEؐLe- 3؁[E% W쨛QtXTֽKt3akdue%,ù plexp'tjyZ|Xy~uʗn4FUC\sbCS2߉"6#L9jyFN/aם ?Kg|stuBo u87[ 7"JG߼Ze),Qv C4_-r9  1|nJRcuPÓ\6MIdNK@_Fk4Pc)F+ȃ4]}a}ؤLs|$_X_}C\ﺶXTC=kM4%LM2mX T-& qc=*XnH;>T)3?;dB~A.Q T1p M<%eM(!1>R)`-D;VL:f|cص}hgLJŵ?,zQdp~YRAJk%KL|.=Im9N q؜?-J3oyE:'wyJՄBaU)rBseh5}%E[l8ӛ~3[( 1.!sH3uT>yNdRe`7O޹d|?[W װύ?{2' yzϜ3^䜐D6gYe{;S@n9Bn8/Ǹf哚QALrʙsƺ$_5w$ )r N;'{0_(Fq瘛D7.f9g42A>0}&j{I{/f#%Qp֧F|1EK߃).`GuݝirPig.,vG Y:}wAq$#[2X#Ys=,EDqa*,**j?O*Ap~ P%+e8MeꝩZk:ih޶ R`F7!| 0߉VG0 zfY/&OW1H\5+\NΔ "P QQ=*pT“U||')%_*J-kMJ/yL>I;YkD1>v{ 銨`B@,Lk F7[ R %fy٢nܻ.MO,a[ąk[`"߈sx6>©6,QэsO]ɿ;_~[cֹILZ Wr&oDb5:A7 gk07h( N:e&S;8|q#P"&Yc)^'Rʞ2~r% A d9V?ڈJE_Ĩ1Ԗv@*>] cL, cđd!\ #sbUJ`]+:TQh݌wnFN%5w .HXw>Aر\;iB?^B-wtnjc3zDHi+p]TC'b/TϽ?>/puA 9[ŭP)01.Zf~3pwu$6rsp5kSHA22,ukox}ě󭑺/%N,{j Yïϭ/|Rb GQ#eWRNuǜ U)qCuLbSڜ%Q/ V[ b;<X~oLO_؂Ln1h`#\%Nav8_@I5*`4\,@/\OvTÔ[p+9RIb ymeuk8 t&c*_XCX:d+mr@';kUkx,NrBOkԥ`89 ?g3+NԒzbF;c{@^mJv4/LxV=4bk=8R.ZN~ʬpOϕ3GЙlSYd }]I7)TH1J:9{,)) VHdFNlA.$!:hruF⠣&t'KH)re3'J 4NB!t-ڷPX眉pj"^{96/ȏ[ nǮc 6# Aӕ5TS@Q]k={.igqYMS?MIJe]9 A${ &e ~LJ ɴ1|cw z[cH;U8,޲!~JQV+<3)c8O* !|Q?.2|M ֌O?L$k mg`R,l`個/}VGV)}G{j!SlMuY)׳]-;Pt4wk'miT]g F*]vի;ɠQЦB{ScNy ^#6C}87fm/4g]?= B/!ZYv+oirR2Kʵ]Ij3 '"/tH=J)fp}[Izo j4|q aZ qh"o^YNO]Fӱ%qVI:9?Ў`Yfy[ζ,6,ɟY48tdH ssj 1GI>,?rbH{ނ-g#GiS4i'og8JZZT jEwD΃fh *N(<7|/HR%2X5<:w>K="zrz&HBm{%[ւpnyGmNt}wyX #{^< ,2.K}!FdChH/ wR{CksN</ 7 ]p0#2:8tVUhX<0lr~tODem4N~XKT8)2l6F6 DF߈A֬F.5ݭǭANloZ  :z(7+Cmt4OD:gcL(rr'~+)EGq(y56g!R׻Nۿ|vc_yx%j_)0K#P Q!G,c72#3Q2H9(_Y9j"0U#*iUs6Q̔m-8ͷD* ±bxI%h!_ϻܝb|mm D|XU_dsQȴSO͛Lmع5 j*6]PT%P53nH_b9tR X7{GqBGH:Cl7Kb\YI ]`Q;VG! (]'|4{-ߕk KF4Vch j,IXJ:YW%]Prh-"AV=b{Ip:ь66"]Ċ7ݲe$(u#WeݛFR҇%^U 59 ZՔ ]vb>jS 񇜛Ǒ CPk mYH/Nݿ3yx\ atoSR{.͝Ve"Ck\8ô "Uާ~NKtXZ{zH/ 0) 굚',RR*Rd7E>@`RLo@0O8:9y\giT}DfAkYW9+]DUtBag=2){^li۵/:{ѫӁdj۴eG=tD(K`Ϋ=t %=妵Nhh)I< _9%J֤Y<8mBQ;TGXTWYP8|1g$_g>YOA "3EM'HWxConkY7s z[fKmKN/FMrbM3n-]b n }6肹XJ mn^ϨpE!]b.k!5 .KٷJbO¨ÀZf?!s'\|P<t(J@)MJ E]q=w=\G=sf/5XQMh~KtY#E\ \&mF'sj G/SAty`P[]b?4X룳?$8wG_^hΈ[VHV;pP&N\$@ UgO[wo(i<Ėkp, *e/ϵγ}s3edTe'9mEF.@b8cHs/Y<_gH.Gm0ҿgӦhD ?!e ÈU57I!nBo󔦄x2"3k)S dNEl72HIFUBXͣ%Suc,}nGT`Wogc+YczYDgEqIm3;WDN@"*3G.7:a'ց>yr\60嚃y*" b#ӭp.N#Ak%:C65)̉"ꌘ[Eػ*˽+rlҐɩ\sKR}]uCSW.\=B8bnгW*J/Lk1rSi%f(OԮ/4HS=:9~` ݂Z{,_ASi^j+kWkYpc=!G"/i$ ݢVB36= B) }Q=(9(o @H9{o)UF aA:<;|HkMq=s=1nێC|FeX 5dJZE Ȍ"} iX9Q]oЬc\}K]ֆY-5L2uBC=8>21ggcMDt;>S.0YN6V1~yzV͂*Q Z8oz(~ xQCyl(^rB55)xTX)]G,\Dŏu^&rbXVr5̊Zy<. 4B[CùY@VlpYx]ж3KGL1 "38&mBA¦SjDJQ]a ܆O Z@&&.5|0 j{VkUS^) k6{X胓Evմa-y$PǑyQp oU(k[,!)BhJ9xGׯu@H[|( z܉InF- s.^ʢpbZ_unIǿ>CM뭵ܢahѲ+]9f+6[5J1"Ê;sMp[wD F>Zu*)gt7Q[͖uKzOH֋̥EykD)Mo; r+/5 9q(ef{˒ΏU?Ueg9:"W@ѴX˳ң#25ě:R%:D_^G*K·CZ&1F&kuMb|ɴ8'!r"K:Րyp @ã8'u>)IvkI[x q7ɓP藓htfOfFܫ,j:.j6= #SQwSK7A/4hdX.y6y?2&6.IZA|rFNˌ(ܯA'L>  -وa}MiiUeJ><`ĺ+|jI\&DAgZ--ʎU˜?pZ5, 6]y$knAZ_ ߣd3?3~Kb7i͵ u=ݟܩuAhiL:ĭw-%2}..Ty 68kc,]ģ c3Mh^!4EGeE|ѷ &``(AgF*I et Ag2PFeB.' xFwLΨ%]7~H( Or ,%}/!Ωbݵb!P? ͹P.RD Wn= )`G(326gOjZ䴬> ݾ)d;zim RYSARn}f; |ۖj9WӴև;]@QaV"@s˽I*ԫ! EOnܫ|6l\V'.2yx*:ݽi{oYD3>'*n+jqB"g~'%aK{(o˸T][(P0EtZY x9G [i"P:T k|k!2qDK{]$RN9smB؞xszwwWkgOZ:w574_k΃(6R5yш)DW^2!lef:]Z`Ք2~+X_i1wX̞J7BBr$rzة/13.cϋHh6l q͹n]vG =膾?0]#^CwuGK~Khrk LEO`) UtK,љqP:3d ACJ]};3/q ӈs˔4QVۘUlM1)F[kz]ŵ}FcSd܍1d3~O"Yߎ=8/–`{~Iepnn1VAX\gBcepÀiCs 5+#[6_:(`Rkg6"{La8 e^Şll7245[qkfؘN t5lɯIe$F?և55<̊&y{X59ȧfe1ݐ?:-QO/ @3϶ueJ6)NcΉbg=tg_Ұ 7')ȅpY&|("iĮӆxxnQ"7W3' WLQGƦI~+Z!錒`PE~X+ %VE.癡.ja4*E^WI3dee8ľOwo&o^i&r݃6JvY.EYraUiOw;|bl`I27l'%ޥ6ieT@yȧ4 kXnrMa|q ђm>yBf |JhcVa57s|Y.VQV{wGg|M"{= òk-#|R΋"ݠ9(wZ6|R]B q~fL>xL|ԋ-uFoh2`gV,}8FXyxEGine &7=/[`5ߒ-_Q}yM&ZoW-eؾc;M:LRRovIՋ툗?#DVꯏ^"k_2*QYoA?2CL\$GTu/uI:pGd93~hCypZe'X:h9!Z'Ԥĥ)!㭆z&CcroҤBu Dt@fqLPXZ* 5`RH c], DTu-,Rx$6%_v4!K,´.26-q+opOLY&oDB7@Wub3I;$&X`\ OUr9,oAMz)k}+=PDjj=bgM5%v KHr;)' bIϿTiэS:x nsXxLF*`mYP^!u{mu~iײi戈J$E_˝"NLYa.&]qz 6J ը4}Ej@zCP12tn_]`1ΜF:&F8`Qn@ZGbb7S[ S-075[D. }߿m>&iU\ -ȝ1[!in`U[2)a |sĈϿ1Hhƭ?iM7Yj.g/RD)ax|Gl?xBocW$ i,l RBK?&VW@sO%LUUpw_QAZ0|^SPo|nr# l !uI?ηۘ] S㧸Ou^%Wnrm7A W8D:^-1:΢JDja>!4Nqz,뒓yԇ$tdW>b5d#J1jA%*DRk7l@ aԟQL+[P1^/)Z1ⲝE]-]W*3a<ƥU(+m/.KN ~\i;?\~  r-p7 ٷ u+bLUs1[6=åE ensJh_ZTY# #'GF%&CGʦ+ K'e C̍|u3>%Wӥ1zLj/AG[tEKvl=uT tyД%H%;fvUEq+:ao謾9`0śN_!coVqo}]+/ 4yoIg}Nc3eTmvumSOU81W%unihu~X!q1pSD$m5({*x쉭 ܁rw-#܍V>}~eղpyuj fDd7ܵ{hr)# %AC]ATZZX FSRYH.5LT],#5+Heo=t}UA~ E I U5sQ/#2z` %+%u-yۜIʲEDL`wtnVlJMT%m@6JlS*[)q@W ܨBH?;,I'mzbsۜI dOS.O-n۴Cj wRDr7Hy"Ur,uES|Ꞗ~ #qrƇ=הʹ1RVi#ߩ:*3؋:mBzYo!8Y-_mz}ol+RS7ٮ;YD; ;4?;){tF%8;Z8`, !A:? !Nz1}CDAJWgO͂40S#Mz0NLĻ'nK#/CwB6W9cVX(q#'?hp(,<1Hx]:V 4֮?뫯-h]8_WgH*0xE cݮwkD85E -"XK.~96>bsѡ)2*ca\?r:s1P݇EtL *h !?y\=};dT!|OHF+iǹ%(U*)=F@?vzwϪG|.K9P3N.Q=~uٷ.(^F($K]g e]j0L%|F#.~RUBFBFoqw-|%gBb\eqYctNȤ3!Z9wT `6ȍ?&Mtw2idmz퓪Apf+-H'giӍP8r\ɕ7QbR$b uz)/ҹ[p4~< suL||ާ[o|unYEE W? ҭE {]!oE/"+yckL^f"%sA /NHѨVp|Z4[OB%j0`nؗ!:|$樟6ނy3Ē4f+\ k#!wilI[޶}$9PÊIEl9>5kwJx$Se',*lPvMCt+M 5P-N-Iw{:زsVR6KPج"L6k.kcйhzao+( ZA==3\%w#7θ^MN$Ue23rpt!W Z.R&-]iʉZ-]N)B Z௸)wF2 E$^1VI^='2_ ǝ-"XCiTtgJjvǹs #UfxS*Teu1,?1(HȪgC}iB_zbs]xeoXX횚3sd{ZZ3p +ăjڶrp d_=t]hI+M+(8MŎ!tе!3ö>EktkCQ /㓽Hhp6]g9xl=.8ES.)] 2+Kf؛|NTkd5b0p ,픅w3j@|RCJ kucs+=ʁ6}rƖ+JB9@~y)KO82.K]VI?' W-/*C5i55QNW*u'Հ0؄WgE 3uH<a$>ic2k/ U0hxMkꄣ`r N]Sn;##i_>271H4KsAQ!]q1xJ&VOkt v-χj_6Mp]N:V.-{&)2gP"(N㺿S^cCEy+F1Bi Sp~Jp4|0 >b=3YaZο4O6c>}ּ(Ph2d{ b*Skm.@b~pV/ZVO&DzcP"FW¤]3=ʁ,ȵ[ }3IS/STm۩9OJM7'j8 S nŗLWIu'Qߘ+-T>d*(aQCI2pD%lrY%0VmS%1V/<$#ܨ (g:>un1\K,8AT'3y٢":y* ;㶸Qq`o(Bl;qF6e`h' vhDi`3+ѵ\kοNo|\fQEdBApϵpD?Js~UZvL]U/0B"n]腷MU^1<&d'!X4`Pf[:jn?dWMŦ-nzq䗏yBs {A~*G|2N-EvC4W$*1 =:jLu~Xjmm (F=߇m%vXin5o29A@hZ,xQX;mmNr ?.{Jn [!"7'h`>.ݹTSBD$(KG̱@ԧ"|22kޢ{(MNyo=ALʢp h%jɑ0+p-O'sA1'>*=+RY˩Uu~4럂BA.E/TF7NeUGT%^6Je^!3Kv2͊o5!0yEqTCڑ_VI@IY,\/g+j?伷GYUৼ8~ܬJV/[asY9Y~~sw?luz@#Jh2`{U $M8*L4p e!(bu!攍.^v6U}܎qGA8 .cjɫ961Y2| rQP<^|Jts떿|9* y)f.Ιݿ?/[㹹@,u wp7o18AIL9 =rx,u˟;ƨţ>(b|c=_2Oצc}؊n\8p І)̧ \F&x t$ZTz;%=-[+ Cy Fњv\0̉,ᚒj8_S{7;o^{QW72RXVij t@Υ gß98)wvƘրy9nM(27/prY 禂?ɣM֨^%ۮ>ēO03! `k0CHkqbS&=;>A [k  XAB/BE!t]1A]2+= ~[s[/SvyJE>7M]_'j rgi(#QACXS4RaU^!:˒7o @>.\bRaYs2f%ک5? ʊe8tf" v+%Zh{빈d>YF$KNniO욏Vvy8!2H9/KIcsnc$4y צg"^(6%uXkttcw﫥VׇݒMR\Ir֦qODPk Yn |#xw|R:>cGȱq*9o =~?(T;YP7 @k8gEFLؠ2M%="Gf~@[djb?afY`T 3&g9$1;]nP.w4'"GC%꥞i*DC> m}uC=kAjOXŌ+$akGmMΡs:!lCy1Ք \=jv1z98ja?Ch`/p}".Gw4P!vZ5{fe(߈ x>/WsU1%PoA,gNpHUA(kxTb4s^ᯓ3$pVpT7ldu&o!-(}"soKXf(!kaR?`r0o!Uٺ?8GJ'8)(DFyYhqRC 5qգ´yu{g5<2e |(;^pqeɏ})`$$D 巚"ԓSUwzq4)|A +Z &G~=Xש< I#"xY3C&3!#4;NQ ]:h05}CdBV$, &(2 l^E9 c[TOH!WT,}F~MYV?fVEPqw|tcjʽ1?+.s!JY!qwf#B׵pꞂfJ0А9Wp\qFWTqmtXrj3"p Ϣsyh%UN*mlFtƫp@Ԥ>s0(qg<[A{P>zYw\Vleއ9a\2ܱ ϞR1+:L횊 hzN+fAڽ-Ti=!.\$UBO{曍U Kb+Bf3qy"SM.bzB0.ry1 +$ En_,-ܸP Ψp6H?Km.mݍ Zʑɚm JFySmj* M <>Q)40|҃yʰR78J+],َ#*Pv(λ>o 9zMºˬmue)Us?e3 Tq%dI)99/_|U* Q=15}v=}QB `VӾ%>VGWMJ_**5O\6Qy"KA8;JkȺfA EE}~jy+oႣJp,9g m} Ylݿ4 9YUO T|wIj%;")ZVӷjʐ=RYկz<0A\:7 _f^ThZq;ZRt˶c[eo bջZekuPH},ub{cA±,M: u /tkj˜J t,G:"YiA6z'10W{FV?YhY\)ʣkL~*&HZ}0S^ جO8ϰ?pYgwսRhQ762U6/ب73 Ntoq)9'xD]XVE5I= zH#FJ΁DXS+0 H+` }~m~\~*ts"(~qW@!wӞPYH=9ب!RN`jK#Z.eY'_k)vj gpe\.cFMPN@)8+tDm"yk"((HzN%.$&k:D?(C:S!gEDtK0cŮBP{6_+NŽИ\(RJ~ZZEC- @Kz$9J5TyQ"iy=Bݶ!sa \$4|G~Ub`tql[fDvoUbP}AhyD-gDxEH'1+Ap-](~P8̜'Xgthݦ*IF[vhlTg7GNdܧ]Jɫ%P:u=ǤӚdوD$vz;,{*ïI5VÈJUSSC^\ӱ:3?f>}=yY*Ԡf 7";: jM"#VTzb> HKdZ  EQ. {'DS~ޮeo ΕFzVFQdCJ25E. "LRu9x ÜoC-!|Xr_Ʈ?,{IV 9t|<>`XrtN)${H/Ir7/j<:+A )|m,)jϣ0X_v1kH{cjNc wļ'^A>xC ӎꐞoǐ5<|kK${&_Pѥ!!VMn!.r)v싃{@O+-]7}0%H\_Hw7< ]@V t{ӜDFTҳ}WeeCv?M"-~>Fm4S*s<mB|z:yv-d;`^gھHp#v&E!A0 :ymdEd!mPO*Q&|a5QeYN@qt\K`)۲ٔA 1Y-md4{e!6f~~ mq95㘲*C(ecU N΃Cc#. }gwɱR#߰ARn|)1\8B̺,̈,oO22a~{$/ɛmfpʉ,Ts"<}5(deߝɔ#ES ʁJ̖F!ܝKoZtX,+ErpzЪm;'|[Rb Glmf2-)tvXA``Oc!'~BE=REW ȯ:;zT5,q9D+a|<嚪_yUֹc>YSi-6fĖ5eؓnFֿD]mFn'KxxP6cC< b;KŲe 5ywQ8+ L23e/]')@>sXLmg~ȿatYGS N"kvKMV*Зk<[ٷ/?q;$]IW-l-4k o!Iaud/!y0HJTXEu"tv73EF ]ixD!lj$G(ݖS( ]裟N/NRf;B3ƛ;oԥמzjz@/Wqu [0qШ$Z9tWuQa@.~#p @Bk)ae A1; /1qOgueu빿>t?Nhc]yrv-֔8 Ms%D@@wS\Ez\]gP0 W\}ɭ(vorx+)ᕳu<Ӯ>aQ9ն?%} 2) vc (uQhd FaE;8S%WM%%V`G]YhxQ#/@/adicѺQ pZh@2 Ҫ\,fTP{F?'w]-*ο >2%~meSӃ!iFQ%3cC1?J*xcJw ; ø xp9TC${ֺ]8̺fiuW-FX{f7gJ[*?b .J WDqK4KjU^8)1\Y0] V57 W%ޜ>>^t^?ء* &Q vy*"Ww}d9}8t BMD%QզV%YxrZؤ8NmPy0)Ve?/#VLefQ΅ y1΄)hsɈ)AQIx(S S:EJ*Dn'ƩX_ a(H$Rh?xQa!ZZrw.?9^_;G3~De1ȟCk#;u⏯P#XTiP] 1ܒUGltsO)˫͡2ziҗp;[+nnQ2zyٲI1/7{$y~;]U#jwIddzm_'ݒ[T+_sg0P'm(Zܛ99_!$-4?uZ}~); OiLf?7 \U략ue[ݫĬ gGxlaZ%D㑥N$T2%.v͝؜1 3I$ I& u.q1E@4|:VBBeq~`ڟGN*(&=v/':}eb&܉7Z*q//rU4ZTBCy'cwUڤ;b8vZ!'sUOƞ4,Mnmp>b X8vG+ 'ᾷ8{8R^kO]*,u)>`tBiuA6E0yR!rUJo=:t\TDx:(a!Cvdx m:'tW͒CC ͨ$×{@3"hҺU^[sKac%|H 0;n+=e|oQTCRWd(r2ZDMbf ҆XYkĘAC6%L-tWoD4[RA!sJ{GSaDmY9\G/;E_ts/H/eAUvy1obЯ$I;,@~ke{w iP"XlTZW#<*nFCƨ=X,Sc1Aʻ!)/r} TN0B-NJˇ&h%i_i`2Ѝ|#KMgP׋-7^M R R|f suK5 glmin |j˗3͖N$VfL)z܌"ƉP}rn11(  IL,r~O~@_?[ =%aSqU8`!|Y}p\D4`bpW:.[w Il+f5^O_Cxpu6qKVp>)7y"ڣJN UV! 4TCځ#3%8&,Wg5IcK_Az eIV3AP<US"5.!q3[ hX ^ f;ŏ&DHU Q0_oEu*K3 {M co{pj3d*|vƌԚRhzD~&c }߄]'guL]eA=t *kN%˜kD~ ,N{yrbԨ*y%2<w4MAYPJvǦ**FQ}U|^1loSJ[9IU+o5V[ Tƛ?$a/d&8N@D?QL2 }i͔Xp7j./,(J Ya,>":&-ה,nj>m~9憴tY@ ̨0ZO3qJ'.}Ԟmh{*Ic`ZP. qp|`auǼ hiTAiInZW4a]X T θ"}Ǝ%r!FzUJN% \^k݊DΞ #Q&[A65VM9HJRJdC;8Ï*x1y xzMkYNX{;T}I*~]yI2lؚmd!V[-A JiRpo umGK棛IwPuxS6xIc)Q .ǼQHqE;ˋsktuab$QY[ʁJٹ{ O,wWfjdY bc!Hy9828“P{:?RO4?ǣ 0F~Pޑ"BF+K3SL+$z*b~&'׿Jͺtxoݺk qM>jx*U;#MZ%ӿxeCu?XQL$ $UopFjs4<_ gMYVeAo;J?6* sަm;t1*ZHe9pt#^m!sQ:&FjMCl"aa9x[럥/n}UMs:XE3F{;|3ڥc j]*@I>ZeP" ]9(:#Ӕnp7̅&AH ܛ:?cYÓjߘ|P_Vd\ ;cg@x15u0Xљ#꿗!k3<e{vЧr&l57c)QFEh/ʜtz2?<Lӯq:~^H/ qx.ڗ=(.85}hUE[ ?GdoRc%ɦo;),-u×R*xk/epGd$w єKlB1HdMpL=s+@z΀uǓ*,e4jU3#Gl3(1J^=_'~ zPjm ]iه]jtҮ4JYRK=d| gɞ?] ѠD 44{U$'-\>a)"aQ t善Vofm`0<:I>vΩB5a*Kfǣרhg>atv/dgB荡_$2Uޮg1S;tTxoda`3ϵeH.fE{|߯#k]r'73Qt[N'y`]][H``r')/cŭ}“F(2ϟLx*ڬ` V2ntR|f/W ߞ oZ!Lb4ѡ&`+$,]uD} i-A4R~hfRVf-apB QIOO1JN/P"T_-tcHQ˓EQ$*o՘E;z# I+թcɐ^>(ٵ'eA|wj:r,zfj&pQP0Lu_xiW 0ErkӪXoJo ʁweӼdSbsk֖oWٵ1V̘oSE|׍ 5+k]gtlI?iG }x7&bm0鏂[yi|*HGU`{{|su:3b)MciÌ #sg9DLuwݰ&E3գbe 1ZK.]0:3H!Dn-N.6'.ϣљa k4A?|:~=u(/6 Ig;S\x/Κ'6DS5 燇.LUċ0hIکvD"wIp$B6S#!`?5 ׅ`Y_+z+vYc *Riױ%娄XmLh> |g7rǛm f4J6P];_o6o<{d~|eaoJz<~~0Sr螬뉢=:H/G/3.Fx|. ChT6 ұ\yNCppn-eb9-"g|hD!u2܄J\$(@ sUbPSbDl,%#+€Nj_~ybP[ӡJ #+{h9ur i^HqJbvp {THck%.VⰼM20b Yp$/CVU(:GmAS.9' / |^"5@ M1dXFRu#gv9t\6q (63Y%ӆ{C ~+zG=w_Q(h柹,>9>qqe+I2X[\^jIL}N{2!iXZ#T%MeAEb Rl;_{**;-rp`}KA?TA&D!Ԇ]l$"^ALgKi}d^bzhOy1?3jk}û\!0 >a 4`XH ,_< %U6 3p o谬O|9VbՕxխۊQ ̛!7 UfkÏ0Vn')R_oxCkXEXdƶjsE ($oik墓E3mO)c=US׃^њu%WS"t1_CmT2gR8UirZUYW42).AjInN!Ge=咄Dp31p^+9RJ(3rsgq`X 4/cT  ڲK5!~xOĸ Ֆ?ra?:1=DD|i:UYXEo6"*]XO6аBy6}|ʙS`m3sϯ FV+qdpA+Ӛ~:vށ&)E4Ƚ?'xJ,NH mkR8J9(Z{6GËN4^UqZMbX) >x݇mXU9p3M7;GFȳT}JӅOza"`77-߫duՠ#*v!wm W CJ >_7~v7?Ө,īz6 >7ܽ`$4z _0xᔽРbM wBIxq F=A[3lˈjz}!/[*LÅ/Bȱ}2`ԻKaqOo¼T'nQJ='і@H/@j 1 |A۲2QMڨ3a_g[bx A3l>#LVy/'Tj”F۷3إP蔷2PdQ_LF<#;buaEk,RY˚YzGPLq0Fۚ$ޛቫ"l#ym)wa3,1 PPO͑#OZ+ w:5`IU ,L١3}-@pzTmN /UCiuU[S =j>ʸ}ۛ ;s~C:gbUT2j#Ձ»`B.7 `ԫB^_~ܹ:8UtS@UAd <+zhxFg&)liu_GZfŜO;4Nmq\xHdx"mR) jv˯B3MAt~*B&Խږ5H-!^FiuVϗN&>Zv:m?Adݰhn<2VF`kӂByP`x@=9,&&0axϪ4)F#\hQX_BVKPQ`c/wTdkѴ榡36㶺׈wL5f9,CbF)лQkON&8ܠst†^Ün gۤ 84# p|o ='yx w?PR EWe5gz4Yҩ gwJ=s,d>^t9 0TNH`NIlzR(m<īNb]%zRbrplvy,m4oqMcz@jܻkpP7oX07n;$EIچդQmCpn^|۞ƅfst@<4r% ߏv˩/B%Z^.dxXX@5Y2\Ӎ\&mس] p)?RhiS~jMJ;_1SX䎮? TR3J5A+#jw,*eAdpdǓH(V*ϧ E%:# tLnlUU<GhD)@y4&C<^NS i qįٟr2' *IdG,Oz#2|Ç_df!,S.Y8^(%)R,"Z㾽&!SU x' 1v Η^ZnvM8e⟂ǚ"6 H3}hx͍I]0('ۂn7ܭq;1èlGIl}i3dhyZՙW󣆳$(I|\iɪhxA(\Ngo`PӖhD$BPpAĎ!JhХ#I68m]MPd5zK/%VCkz5T./۶ ͍C:@"ERDynn7hjeTD0{&S1QזX4Z]A@{&KF;clњ0Ci1_(xbh̫X'[m,t>5vNMGMSdMVg_0*Ō8O,  ȾQ$\V&Ή6"v WYW I;E/gQg0O @<vaU_=焮BƂOۙiԳ'GoO"afOEҴ@`'PL%sdz~)?}>RWywy 2WDcD.{?^F 4WLCΈlrq5,SQYn5:TQb'X9SP-HWYp/ Zd y+I Y>y!s0i$ 4>8J0HQc,PW Ll;(!Y{Apl3ggsy1eٽEAӸaFN543+9I{ȌJ|oVQܹ! `zc![<"6Pb 5h^vpuPar 6U.1| \:/cV>ѝ`dy|CdQ)P/.zj 4HNF9]8}_3eLe1Vx=F?CEm3U*Ѽ{x$.-!Z$ չ;~I#2]K`U6J`}s }'AHPӿ^Ѝ)m @Yk2 ]x;KNUT#y6%Y8!8+ОnOQ*6U>^{__R  1EXliq%kNy M)OجrѸ0/\Mhͷz5w%WP8I# bA9 Mg6{< I5>nfRyK<{;ܧ149mώE?9I"oo, "SQ~ǀ:U;3Z` ߴ [#Dl#w̧q$Iφdz(VʹY fP5 ƒgG{Xm IE=/|US_4nʓ31q-6' fl"/.pqÈڶbJSM+[g0~%~]< )H'S@s7n߻ 0ll> ]1)`'j#?|ASБ%]xuIkITlqvSa)(yRXиs1|O[~Elr^Q3v[LW2r+a%KqHl5 S0k1x>˦qi0`xkL } u-&h$G⾈,Jt$abEMuSd H(Ԭ&'cl!iC!9lMu+(Cv4^Fi?I}!¬ dtRmFV7;Uf4X?.p?ǀ^^Eoun^N'#n}tDd;kuW ѧDX5trzlw w#z>U`$=j\:|v"F~&q+qG=tNz?xZ!4Eְ4K1)$s5uӸ84ύ"iD%-=zY4^RSwb5'Qq1̡/B:&C\T̉Mݟk5J=/S/DA3dgUKr&EJloKnSb(G&+k 1LC>tq ׸_E$͇Zi7u=- r3 |oBE% &/"r{cX)'3o0:mN8_hj OEڠ@邯g M~gt݀=#G/}8(E,r-}';DFgk^%N,q]epd=F@(Sc"a]6kiFU]S x_|X˸O4@ՈK9.׃YF9iq {w3KJse )slaC 3I&oYc\ʈ`&S }?jnטWQ9t:q'r?zfr\-GrYۈ}ۤA inmBc;?HnkĐ_Zx.3BF4R EW3/*TJz D446RHZһ'EnLvvZ86vq9i{QzQ];u=4]XVqa ;ïp߉[}Υ:%m0w3g* ʩҬd?!!^e糂]w4]A=XzG D>gM?& Αgۂ= VJ?,"K^R!-4LRf&v_ u]YL~5ChkHFv9Q($U[W7q8=zS[M:+cucTZw>.{,C\p5"2+\MIעe@ZEGmR/aEQO"O=FebÓ` AuRZ{bX":c?. MȖxMGS=C5hPɲztj|ې\ZYy"pgt|oW2A >gNe4+F\M)r֐jƥ_Za|,lIb]ma]]}煀9QA6s/^ % t(k/P.Z Y^'|\e?/U{AI&SUxIGD4oMu~;GSWm3p#@1djNDPd𖩃]2>qK p. y+4;yL%ArȚ\Nfݖ##.GT@߽ua5 \i0$T9bkMy ک];%a-K5Cen;b @ZֽR~ ]}no )_m-b^ȍC_w_'-Y2 4_$ʄdMX߶֖}vӺᖳ[UJ GEaIU+A:Ȥ~n*j$} QB[P= jp G\d;^IE3;4bY nwSF%BƝ^_D٣|$*XSf. hSɕ^0Iß%>(ۘtWiZE) xs0C U=lQvn:umF {K<ށX )mzRcZHvmUI*ҶO}^Ũ a--G =+ѴX yǺbCW,6CF>̟;N9U7gW|4 嘺KU(f~-8\nX h w%)u~ODV@Pg**A$DϽPlLwˋp0YN,`X 6}an`"WsT춵Df]pC-.s1V=1w4E`ٓ%ӗ-嫔Wj+DŅŲ薄g\0ePLa럔cʌd5?>J/d8Vk}|UƖ3zȄ:h5.{q9dWW-fPEӺx/ҋ*=4s!"^~Ƅ3NL 3)f@tY%[S&R<nϻ1 ?> =Awt Ր rἜ#X.W":nfW[MԽ= HmR5$tlƦE/FZf.@,8ڈq V3Q DzoxhwSn( ]"$O"\rnY0a Ԙ/2C#ʌ1/'gLRiZL5x,>7E{#J Tx7Z|𩲒~%f뎔͏-۹+t<ku,j@ !qLJrbU@h8ũݟa hȳIz`2ԛL֏L@ <[!Ax$4 [9"eK1G;e5a @0 Z5lC>{lV֍{ۆ{CӦ)l},ac?D%v9Μh0 {j(UdJL[]> iW“&nm$vC aVXC=$Ъ4xH.|ViJ]Ȝ?3XMŗaBu&;gHL`e?EW˸ځ0oU(K? Fл?*O F@濕;i9#뽺G"TZ<)iv8LO(e!ʡ=!dk#v>M"LS#R`Uab{7I&ܓC{ "~G\\׿Y:)i+asO7E$8c˚.cFߟJ&x+zO:o|4vluNY)[4Ǔj+7m "2aIzJ&#3h<si~˜!7rb C>ȅĮ`f̔Bc{Di|Cc9utUl!2p4&Xmr )h/lT/mq{ګo_e y G(s,xiiD W( `i.>DK }B d0mj; AK_ڶh"zq£( eX|`aBCa*?8D)Shvd* ɆͳFmix4x$ч7vZt8d>lE6jhıG*o&.4Ø[.t[PFj7>3"5d*G.+fG϶@t5Cͺ0ta]B$no#.*oG\i:7|>]X2emo\ŴibҊ_ܥ[ua%,84@f0DCˣ0>V+~Ҍʍ?S[K%X M뼵`j Ot:EGB3 uIZ?ԋ_z:xgT/\b<>1~{PJ8IG-! sɺxv3`LЭqbT?N%0O,=؋Ĺ\v--劬gHo&)XhjǦ&IV[FDI/ ѽx x ʍ2cOfR^{5T?gi5;P6 ,YjKGIϿtN=|HRD/~ڈp 0i0?!_oC.M!aoXЇIjO2,YNAkZg KF+&?nJsW!1M胸[+^?c}_?&}ApzԓOͳ"r{hb0 œZEa!UkIiVB"Á%/]Kp{`g)Px>TR{qƸTsU Wj4E&jl"RzF/Jp8]XgFqB؛AJJ:m:nݢw5vW=@b*C(S"l7*db>Rnvd83|\Fҥ39&1: 1]LAF<43j%fJkɼݘM$r<ڝBz~Scqd4 \4zYA(rfm$?懙M@T oӥ#JD6@Ъ!-}}j%_ +, mOt? D!SZ.GWkFx /GH$rOY`_.ĻԺ())A& "M=Aui '>hG1HR_}<:qC@8s˺+V4v i:0c8HkQS[B$ryův"zh[ J`)(Ү{@L涘;.b#JK6[i3nE/!fMpD(82>Wp\ѷ3f:颂>(>p,c]90w8[t֔2{')iyNd>gzB,3D*۠0]F&gS2p]ƃ'q/#kMAnpǾv;C-;X5XdBuU,Wq \qZm&53ikY }VFiԋ!e(bDp^phThcӧD2: 'mmǎPBBZۜݣvc=x+ $(6?^,v`Qs?-Cԭa5$U¢n%)_֫4㟫xveچn}Q`jc+n"͢/uRV3m!ki / F_Зj#HҜ~/:}Cf f~^mG.,Ϭ[8Bd_e&z1X)%+ ؓЛu"ϵ 'B*?EK(=7lNni)6J9 r (ݑˢ 1jiZ^(N9x6U@lme܀+g8ˆad,Չ4H4L|bqh;B^:bK@ ΀p 9*S&~u8@j@gs* !;AfK<udG(Pk/:]`[$pc-i4/-d!j 28EQм.R] -H!\~`{߸% 3i?c*'aHpQ䷐et? ܁-vq;`~7֒IEbzaEV"gLD9O|gu1iX?%8+ iHFʎ^7noa[{h@ >ΥSdWwG7A۾4ۆL~g ШeP:gW{&`\Fn}H^Ls Z.dHrp' #>q#Vu ,Yi ߠ~X$~hZXِ ơޗn>H3s,&D%ȅu!4~8@iק|5H8Z51"RDAiU6<3$;J9#sl_L?ی乁̽Ȁ-`@f"KjJe 5Dpe-> FTlowV瑵Q$̴_c |ݤsRO韑G#S:g8%Lfmt-)fZһiPMODZ~?H[ %/ E/ajTT w-Q&X)#4Zyڟ&C)x?'5Λ.)*(7}XTF0n{WD^ڰkӵn =v,)C6[LB !.Gm%Ȝ=gZiɶF$\ ^`(}Ryr߮X :GjVn{shd*T 7alchEJ 6r*4A3~ A3P(ܰ!inu*˛@ {W0eOnCNޕZD9&-y:!k\Wjfom±¶^/>MF$.L28?8d #i]j9h%# ]ʒ5޺fu2𺋩 u@4^#[Zp1BZ:[$3;ev7eg)";WzuEo[AO<inT3d!&ʬ'\B Lk("P6ZTc: `k_71vˀa\?/,T2ُ$3:9u͘]JfV,E'5=+_Uz2*qu3^ *-T7S.C}p 2]oDyH6AI&S3j*!=B踅ƀØ,)JOקG^\qxl*KYxgBj Em!. 2( #TGaRPl52A%vw(ڜ5ݬFX٘mi(;)*GWנ%BvLu!3_=Cʅތ9_;v!j@c5;Λ`#CpUrf2D+,V4$=*4΁ې⼸Q޸Qff>-Y]jE uAHlI18hZI7D߾ԋ&|N ʰ*cE&%z8.5~p&B{J⫷9QJd0MFeFLnՓ̴0 D^,ޔ ^8!rj T )96:>J5k"ըJϻxB!)6@%__bڞq}[k:/z:~GXPT+r99؄F0(g@*.uvT&ϵ\F'uzW4hi!j:t-ęMᴆmyL}3[@1?.6K>cF׊w B4D~3`ΦoP_yLEo6PV_1\׍ώ )]]?tF: 4naRxGU45пoՏ>è1:l#)kmmBJiX,~'SE(²Ugiқ_Xp*y^ e0Ɛf_.ycSc'rZ1jDe/fVfOIX*E)LH^ѓV޺owH~Q1+) ˧zۺjL"TrR&dN5Fg>E֋Zo([sHE奱(j/ځ Ʒ |^OV\ Spe_')!1(>8uq6W=E2HO8 n+6?N7AgGt i}Dʋ.zl3 #pג=_wNG|5U#5"]ߔ6m2j?E(JNO/bI2UP )'X]HsfB~X(.v[5,Y1%{/髁GZOޙ??p ;K`jBsI[W9CI\*EN-VPagPHGjo`H;.SJ1_̇4֖O x߱HE\箟=BܡJ/54yCt0;gu+ &p\ڦ HN`&tfŊ8`B뾺q4$g6G rs)^V!4]ߨkah1.D9ra[v 'MOY6ײX{mDXa8:C!η \$k@I M S/磺Vz/ g=R&}$"Ay3SCmz! >Ц};qJzCڭA)"v8!8V`t(|**qȳe.1$e~np-} zYc[9! l{N6g]4i!'YM(ɘP|2$3Vx{$a0n}͈TL)HZl]| = N?\bGσw[| ԿDS~GnC)(\Hv7]ɐox֜qã7Wqhoyo.xSfZ(P C{qp4=rY̸Ĉ*ҧH a~znnm(^]?@6۷bw~u"q\j&-kױm szÕee~eW cލk<"Ka`pDQ>RY„ @2NU@xN2g*|IzHZHv߹Ʈ ,MD1rF,Rb[R4v+/bfXPh OZW;7'!{dj֣׌- 7^"!l7۰W}C NNl41rfX3[u 7,YF=e?Lm@ o6&K"qFa4Ջ/2,=)$]ykk&g6CD&ClB%NXġ: ry Q#Il}} :/}:`+ti ۆ!#AGH_v ,9$"QZ%tOf(31I1+CaPV҇n㮁:_ h~q㛧c o*htI`5(4c2̻pLJb壨a8҇ Kp8~Z- ge0#$A(s[[$xhd蘱 7|SP2gQ_ƃX\w%-Q ԃ`L ttRD-~Kc1[6n̲G ~z@C0 ~4 [kUJX:NoY$*0z9u=ШJh;_!I]wI^ 'k@wVIL`lɖ KdH]*9+-syw5@Z#8u\rGy{I6hA[\Fi4#UTG574a:ʩ\Dza,$NR\d^4:JR[M } 27އy 3{2ئ:FbLNi ݳk4d?qLShq*Y0Җ 6_$-xjLUro ` R /D2>ݓ+jJFY-;s1;]^qJHrF}$svH=|< K HV_ґ;{ny"DyP+X46=|V4$ݾ5~ ?0RMכz]_d0P/R ٗ tJז[ht6j3&Xpe X7]s%*$xF^L:fsQjDm]8z }h(_{X7'4- Z0f΋l{!±v CjXŷs< M?!aUfS<fE.Wjtm{ǵi<}p3DiæY r} -x(ϲMm[)tE/ 64d—EdꫦXС&h%l KЈ%+$?#J{i/zŔ=L 07yS ;R_@VEGnlx[ Zl7FVQ ؂0q4J$ BM#U<&䩁;pq%X=< zƻ<^1HoR*f(z>0/v],M'~Jc4"(rY*A&j  OPykk'|/}tz&"r<}a<Ա#_?kN#5vزƜDʼnl~&ޙַt.a1U:YsE.l5Wɣ>[ OcUʹ{ʮ-UnP6S 7aVJI{XBT,l>sw ZGz}ڰ> F\:]妇Ae4A)bd_*bZ`֛b廤֚Ssn?0 ˇW( eg\V.gc~2Qm0t"mPgVӛyiSM+sLdsE)j8Mm|I7NAhcqAKU.KU>6V{ ;3 (&Af2!Dkeo CIR]M+53Ⳋ<c;.D/j=)m/EaByS9 פ)h]08ؾwstFB)(**ḓK C}9=3|ChYzuϵޣ'i|%SNՂ<_QXf}`աW. .5J^*pHɩblԣYw`Lh2}[:ֈPBZhϹ>mucvJ;m(Xj9Q9& 08Ν%gO-`Q/``kLZ=$pk)L|i\S *=x{x,Ѽ{aM߱hihXkp10iYx*=IUScYkaX\ &lyAtJq&ݪO$p+V!t﩮Γ-=Q2B0ٔ&; Ekt×4c8CFw"yqLIKA}H:yױif2Oi$|#NȤ 61ߣX!S`lX <]#b!qFK Qnak& <-yr|՚nOԢ\u2v&@[>*AiXah $n84&<%aUs)|Vq8\vUWҏԂUd[ədoLJg@|UAry(8l8;%-99faX$ю{p&^?Fr;Q4Qmv*9m˗p ;w;Ū4rd?QP,&J9rufrά<B`  r~{E++&Q݀@ S 9,}ûM#5M^ʱlz-\-RYHhXQ uG^Ej~h*;4ǁWDofe{hP@df?/:s\CC `@Ő1-ff)W fٳ*?7: {#dFd9e$RQe6bs8+`om4rȊGڞگSXZs1ISEvns)CO!>Z.zٽ;#ш.e%*$=4 >/e$O] Wew匡7g7#or:f"ONLR4w,ZݾZ"f듗e=H D IWK֝@"Ul}i?Dxsμې89R2je=/J&ejMfI|ެ쮍SɞKy(N9wDGT:旘OwbDѕ%FK'k'³%3l M D奣F0Oe >퉺13L+1P_e{xrEB31yd F$L*3ipe17hEHm1;]  _fO?bE[ټ2 >9BK,fF&'~t;Icr*C ~$y :WI/0n%Qc2~`<5k̋ 2ɠ'f>ՐV(~öڔ,U;X-k5(F4C 4F;2)DM\N<{:ƧQ@VRA8 &[HǓ,k-Շٷź+Dm?lDZ_lZCߡ6CX!G"߄!Dȷ{:fdvQ1QphZ*Sjvi1Y3PtHmIE> ̞ŋ:o3ZVb 9 j쯡(Z![$#~A-dȗRžt"$]v 6xuqVZyx\߳hl&U*e-Pg4K /c0t yطrD +̢&O0) Uto]fn9h2W|Wj>yyuqU]5HWflj?MR?x~l#}UJ( 0dp Of`jJ_BQKS;j:F7=ypVTY,ssR#QaVȳSY-edT73Fl/Bk]6S ?b &3ӣ%~] |p'o@[EȂ,cċK%bMpSEw"LȔ?&w6]AJ>f_({ƠB1J ԁ~(}0$2*MߖfQa{d: g9p!h5W ק,aD:@sA]<ԀE1عf. cO#Ce94U6_ӪuB J؋(9;:[éADSPEGqɄ)zWtf"m=| Ja &ER&UZ.ny]k0ms|M`bᅮw9  ,#jP!OQ `ԯ)_Rz4"R~_8x)`OWqƖzN^sݟYg ln۽U?_,@{5ޱX3'p=Z03'oi/G@?[]X0"<.f}7]z%_;]q#=+tW %щUC94wڿD<>BI`sDҿ#D(w^R]C4Z:/ma}ės@VW"uMC2'!H43$W\ AS-0"ogߦGisUvص:}6b3,μFSyں!HXB1ʽ25t*6=8\0V#[pltb{FDUX7.6)lc 4ڿ_qkSu.9G- }p kRo ŁLτqErF7r* g,l&+b?wQ`;1IcKp?L%c:VM1r*ƍsg_sWRH" U)@iȝ^{FbgYWd}3O(S| .w)Chluw2  wX/vu@0 ]ӟ"ƥ{;rH10*;f!wD\w+u,M`.0;}7Q7],"F@@2'NVij5C瀝5KJ#!*ӁLVgG0i@RLjߧ"k#tmI Ή'|)Y:]|0ǩ 6Ԭm!zn2Қȧ.R:;LwF,FL{bxM}a'>.~9L:dXX*uI^ˀV~MJL`K~4xV;Oѹ?[nDlDe3gd޾c*Ϸp ?^H.C>H + b~mWrcGjGHsxLa\6\]S:$n<.e@v[; 7hV׶ t3A3>icv])p}a+WMlLH  h`ud1u[O(t(`3,XJ[+ 'V"t~C"%JCvn71@>jd6ֹ RĿolsmY`iIGvGox嗮(Dv;L|ߜ{8iѦ%J S3z2^K܊1˺Q 9Gs4+#4pvp|2L}ޢ gOIs}v"iZ%1"}ʝ Cu3MoZ%ELOB3"1Ra~6ws6PA(b~t킵fGEr:0@N2$l<.I} OF*%!9@>kgbz8T\\[ǂ=O{T<v.EӀu^Rny1a8R/}ɸ'JcGkf_c^e͈_6ףi: K`FkB^6ɤ.C,- T0?~'O0] FKmS\7.՘(qʛksU  #A}n?V[DFi)lI20>[jb+trjqQLv9PARmC`[4ehUx뮝K{&ʌ=N*PE}I&~ {"o%í1"!B=N 窣k$:G#eԇwmB\We"|O_|VμŵhKFxYf:X*;?7p[ XhI7K֩^ThE6캹>_E,>N 5\沵 N4ʌ=p+k?*+1,P#.*& p0aĄU&݋1(:IQ]*Ftq@6-khx")+?pϕOB pH~h1m Pl=l|e@ڍB(a}AkL^Z>LlK -!q-7n&V"@ٻbr[9$gzR!N v4+\#קeQ1t+8ef}-xc90^wW+OBX*OC7An! 蚎sZ8 | 3ų+a 7λKA#Up}6 Q4*g0 h}dB45c#|ͺSG̉ԓUJƲ2D~v<9Z|xR>=\Esj-o—񹑚JԟIj6ș#r[l>?K֧G%8W#=#=s1 跌671)Ń0,RM]Cf̸UsiH̊2%] /80DrB%^Ueash彐c{ʳ"9>τKj8`]1I, -?c #y|ء n&aI/E&*AO!YyV ?)xwLq;B;itdBCPGJzo}M.n!`yR|wnFzK'Vޔ`x,V`1~ AF赜/ۚi2s]:36i+ ͭH{yYΟU:[nj>n)Å^^Bs8h3t @G@ǣՏzN+4Kl Unxd6^)D>ITP[߸I<>cNo_EZQlG#IrZa=$J'q` 1e+W1/0\b"83Wf@J\g RR`{aN3%& x oЙ(;b"FnCk =aO%s蛾?<2Ԍ{ThɌSĖ\Jix1ҠyĤhuebZ*HfSןAgDtGޮUv)Lw9t Fa6@jπT׽p 0;FrHbdKۂ\Sh^^UDngRESK7D_.#8Xhe%:3_{ 33l $'ܛ ru;UZzg)aylx\Є}0Lz!n}my8 >-\InO-@1^ld &h8O U> PfC$Ulh6(w\_! `v˦ MOЗv벋[Pi:=c9r8:q(.&a qF"0JDhY<^qqwl~kWt{A1!Kxb=daD1Bk}1fYfq0,Y㛋%"0pQÿB! h?L? ze}[H@T˄?%/I=fH=KmxOCH$b~붷lʊj;>ڳEM !QUL `9F>1>r"ͶFeadR]7/9g(X I#^Yx8U0#;o\YU!)M y%>qѽ\WNAr z{gh FYWPDذ6ȦF5-jؽؓ} ¥iYCY}_t/|Aơ4濰'["sny k~_鹦jaT-ih$tzmٵc41y$%~G @ݸ<1vϤ\Vϋ rUЭ>Cf `QOLrYj埉%2WF1%&BžMt?r/OSJ^SM-ML !eԲ\k%}Kq2 2xI;CmKTQ?d.DIs1xpwUiPeQBV<$faLk},-ZU>7itA.XL)UY0''pw &6BA#BcCxA}g#>zMi.Yg^kZ=x;h&Ze幤~]ɄmJgnoZ|Qgi\ @skgyAENĵ'0 {.gRN0=>#W<w;`UQ}|ibfwSr|H&ȢώuKl-h*AW#xvдڒyR߬{^߬uyY (FgcV)WFÎS2(+7OJ } N]:{<"߲NYImn݅&46]Ƣ `:PXR}&Lh+Cr<6Բu?Qsoc'\ a!p*.aw Ga%Z.ZP:q/$GԨZژIҷِ0ѻ=i9V/#aȘz]>b r6Z]i$3<#8Ud]BBJ`&bA*3E#b[eE|P0Үm~3LD)y?KHҘ{_$1iZ$Co+Ck|d8vi+/DƱD4 'J^3N@pӹ-whW܁ʔljIN~C-҃lNYu3S /D0,x"}l%]˖< UhyǼ6V+u)k-lܞ_5g^UFxJGj\YH:!%H7~<5Ʒ*MVTpV]dpwczJx!mV\2zu:6\^+柲t2К-zT4"tM\Γ< zLi|8kؔѰu9MNUL)6sI87@ysRuHT5>\66x"&$E.+.{\gw3roD-Gjei}#l˶+pOóYvDFVn〰օ8|rm5m" YntCyį g'viC%즗weˇu~Ũ{C/EQїO6$J棪rf(jo"m&LT%|;vwD4c_f}AI7͝耋Dlw~✾o1|uV!#"QVVdoϊc%ʙtq4<˒hCs^5:[$߈zu8C N2hL=r>zUk5h`WHA$dQL !*>̒Z:F&G\?lvqcטql|yz]hN`,ģItR9aA.k ׀YiDjTF/`AHM!RP4$Jq~8Kxxn^%7kf*s3Tg<1@C}q kFt}hee;W=l{f4g_ wmONۄeZlR$x = m:k]eoA`K>T0?88:7ϮOǮ~<$H/C~+rBXn%wSnl~A5 NRitۘ >:q SRYǕri#R8%еF `'j;FJ 7Y ֎p:sΎy\4q$_njn,ʱ}'j߃ۇҡv) TM u2l$-9~os΢QsDaSI(uLgXv4'@S0iǏ0BD]=_݉#a,쬄;ڗq[ѾѸT 4GbXZ ;>b_D)ѕr\{ R+b&OQv0(꘭\U~DDߍ\({{ubƕWa%]$~wdZ7eĵV63#$3q9 R=kq,?] ,0U@XN)] =_ `GNcdraš\x"_,w> |Bri#(|q6tRoJQIY%5*M29,tsQ-w2{v뎺_4!Vk#j&ۋAiG c.gnKJb!H ?tv7WUuum'_o'w GD|ؔwE4?5:rA2$Hi?΄m8O3g$Nr-| 95P7#ڝ!Ci2˕ك C`Eo y_ux\ >@)K2 SG&m,j[KYUaPx"V̄yկ t:\IK>˻0xC Þ/2-qT-t*bPu) 6A DIM !xV(ש[3Ν`h,agtٽ3kEkCjWyP=g\NZGB^ !fx(nT  4IMQnx%M P4T1޾w'̠=.f>yV \ut "5 6&96o]k|O(F[4 U]xTqGZxkS B^XH@vR@g}psd+ 3(`1Qʭy1Tَy@$2:/i1nw[ܢs}tJYLr p-E>"B8\vWP#\ēfuZ2yțOPV;@)vM u<дY3̹=@v/a'6EI@Z &LFjޘ]kN̎8?aP19~?v`*Owcms>wRېv%:g10ࠡK4t`ߘ Lni|,}_w6><GaKwpp`wٚ&JI "PVsZ.S-, ܜoFrRǥTFdxV1#~4T,ܪ4ś( ƲeNߞb&4!Zf%=a+qȔa1ÝLZeNDf$z!#ZO]B< xτ3v)ɻj\ݙe{RV6kzg!3 !k}{pihȫ:FA_Øag{F=*q㟗vw0N-JB= i U9,rO i<M#^v&tKC>D\h7.U)ߙGf4Η[$I*Arv]Uز̗FF_+Y=Zp({ BFTAڬvR,nv'?P%C*ADCExH'~Trm?{X=G, d&Q)5qic{q.?-vbP: wqrK@vPn-AM-NJh]/Ne 2CUJ,}AgVomm~`p*nO#f/1еOS{n\@d/r[jڗAOyEv5z-t-UrB@u_=gt3ſih;뷌x+#8tXAjO鱡Ân9VɺfkJ ,IZ!)c6DW ek"DN6U F1?A7^Y1>S͵ُ.I1ı&Ha5sٺvYOD`ъCEEۧ5ɸOV76LV2$=@/ Č >*׽(HWd1$)/&qk*>.ho潾dNaE BWhZֽ"x/Tiu!Ǡ viNƷDiF\rEpg-lgfc2i: zKulBXZ?f1]=k,(k}6O`[_m=as664H -?װێ%m JE,ug;Ot3=_tYb W<*Ql Q=ʩ`F+7ħU|7b+$&3þhCXKI6UՉxJfGΉ*~xɇ` #UPN3A1=o4#:0Yf)ɉkp>e,, 7?n@#<!FA#\y31#lڢi݂1=}Ne6{d[H̃Gm&-}o\<; ̾.=_(ܬ)8oOWd:p ^c3ɢɓ!| jP0W;Fll"=$ aSOUvmUBj̐TA& uio_ vlQ2yMcZo2y2!/^a0]}~ bg6jDy_0:-{)_$>nUVAξ,ϴg{?(/+LvS=\ _e\┴bP5j-ZZȤo 4ŶUD6\)LD¹1G6Miຎ.Ի!P4nֆK.p2 D^>Y\S`^?{"@JfpKz7%s-Ļ7ގ ) 6}}= l-o1E<_>'z-Wu\ ceWpqٓFȿ޷G~= %&[p78u\K|ƬEKY\uP7E1̇|ui\橀%5xdcaR>kMOgB H΂xNV0)8Ԧ&գ"JZFQZOw1P ȼ6`V!jx cvԑj~cx=>©, ,H~߮Agb 4 .ĭʄ]2ynh+TJDA3orQ:-J#72sD Xi {`vLT\M>X9MڙZWĹڶ' YN!F pDXBbti#.l(>*r#eu}H<}W Xw`.UDO"``**n?Rbe}dFEeCauݥGkZTz?bftմ8>{qY_0"D6|6 KVv#"jmb֔h5(2 Ѫ!uՁrr8]4cL5i.-y|jg5ceu501-i2m]Qtr0UNΔ+ix;H0܆~EHT9V㹇Bb+9lw&,@=ӞJȤob4&_ǁ+:(E//Q%+Ql D[Y5%DM'#0v`WoᅹL QQ65Ŕ12h6"%FN*QuڞNJ8A'dHO+%ĭ x&ܑѷ;/zE#D[K.>Whʰ :tDٖԝw.o l#UAmU@ATYhM/)D-xf< H\Юe] @NJ8V/PVvTrr  wMA! ϰ F`sYӺx8BugT6]}ffo\~sI$|^N$7kSP;D$9\I;VmW/uJ5K)IVpTJlMyjAt|>q\Gbݜ4.!iXՑDgч5y #P:~{A㳲GX갌,Pm0vHgg-x*Rc2cIAcV~c9^5Էv<:K $","#7~v6?O*.ja/W TxhbzF9 8T}ORvPKs>"Ihאu6@yuՋ<ep(LuL}zQ`5fV@eMpk^gVw[hh\asƪ41`YVsNs ΪO%jk6gO< AI&S#?3غ~aQH4=BXY_ ?l0dOe^&xVcs<\$ *4`*eجq,HjeaJHz4} Gy 9e Dt h['g-6u)}ڹTijъ NPL/ P:#NtU2u3xSwMFlUQ`m`\kշ0'qeIfU"1F)ZRlj>ygBiz@u ]ך,G+Ŵ ՗,kCy s#ڥQq^XQX" <8 ZG~mhᗖs9ܬ!PҮkO=dp+akmK bTY LimYm`ttOK? H %G65V0&#nw 1EՍs u9:Z;9GV팮/t`wI*s3ڥ]Ys"P)MVt给Y>8k|w[&E/ \ y=]#^8*Sn$7]_bH.mJ(Pw LG;9$v@ؙH㵋d|CEO&P(ܞl4!9 fpՒZ1t06&٧|hoj%m$cYW5\;YL?jxk!pEp],#6Jbҭ 3iȥ;e7`?Jp:vd{Z[B[xE |t=vD#}Q\}2B'4pɝ8)"ZŢ̡CU-t6:_ bsZ_ǂE0JNBb_ްczՃNܕO+Ho_M|N?jya[0CVnY\ CDj8jzuO}%צJ[e}ncudPf#2ϫ3fsQ<)I|KTRkQaݶARw%CG`f"UZ~_ BxK{VM;"Y5} ğ`LOgqT)$!0xPve5Cp}`Աa{enrl624#_3wr"XS_cFXu1뾵 N&tu˛J)1cTkA31@yJr 7?Od'Q !'|^YzxngKQHc(ߖGzJ6H e E}XWfHLË|Ѡ#>l{b{Mo_e7Ycn eGq\XC76o4% 0N%|eXENp[[UA#e((Zي'ISgV߁4!'-zjZ1R#?~t;]1{iy'$ SӢp(f&?Nh;+ww__ ]^P\~u2@IhY~c$Prc᥾YLj龳L|syԛyo:R2nJx&ޟ y(QLELnR477r)G#B Lp};k9N0IlJPڱy8h t8 q[;ZWhc4O6j`՘6B˭fᡕbC_tWNc-d)LE Zm:'d`SSĘdF1 X7@sҐ,C1 d/'o}l}.ćO{sJ/&K=ȣ3)FC|BS'wfn\J~ZE_+ A@. { DIJT$<+ĩhŞKe@!&!`{KJ%t=gw]c/2}ِfI[ `\Q d4r~g6,wFBjVAFeq&}}\eV\Ffk(نODĐ~!3`B/bt`bp7W_״@1Ο8tHcYiӇыnD%1-N I K%ai0)H]DQ:+:uQeTm^X'Ǭc@ Kslvʂ:6lH@`w?[vלVnJQ ֙$b %Kh$޶YzO). [^]C 1)<]&Y[Tr_$usvGlW gB9n^$}⭤?&JՀ\co#pJ-+(d*.W+VRlpsjRV*3lͱ3ɘ]A`u#$r+{.]K e_!8.5&%[@Rw*Vջ+& b*pz/y$08sO=^P#8($kfr~Xrq/AʓTQVy^*4dTm{8alO{NIZEÏ>tlĀkZC=-,*qEB* 6" 4_,'fUh!Z_ _e_uA E6dSHT>-o@ (jSjp,jƥrmgX r*VB͕絑2  0DD%w!wBv/5.{3CBc5&"#ӫ¹ 2&ڋ_,+40oY(ʦ3-j8 ? "D,,]~y;;i3MRJ!&,R9}3[¡\#۳y X+uJ _O HDA|-ʻH1YG &†ű)1W +Bz=B1ΡاkxL Ac ^?.#?\YU` ) cd$,HI!rgXD1t5ŹFWXvY4iؑ-Π W9RS1tWgN*FDV^JiݛT'łNU߸ft"m^~Y<2S ސ. [ ]8iD GP-dhD5L{5]:ŹdD1,Ζ Z}XWQ\ xV|b#^/˫9AҳC b%$@ʂGIy164 H a (uzXaHH -M:9<zte̐lvhzR hKʛ; %yGPˀ`X3'YAZ1i$0\v!ݤ2 ~p6A YaF'cB>Y`F?L{z}% I]bQQ:g޷|VM㕆&AUeK2HLc^\8\AM21i jgM epW](g[[0Wl(kpT,Z{eyzIڧ-oB}Ps=*|*@$bR]o`J^veG.&B$=Fj^m6`8ZbQw<k|`"=I+'`'2nw°nid&V)~^2? W2x߄d6Mee|^(\Jm:_"e,gjpS?A|k%^(,eg0fR<^Kdo^r'#DT_zkxսW&{2!'sc55*afQ c-m/;y`NM;heG^G 3LOr\2}\.w! ~:t:&]Lx8h˙cޡ/)F/T6V:bqy`FH]BNB۞YI+nJ܅r\!NR ;W;10.4+Wܘ{={ب-f콑sfW' j+1ۜFYޏ"yxDKqDv[g [^i$WnZHk\;Kn5& \'kQ85dND% Hȅm#qC3/Ѝ뙌݃iAtF=s餭l:~up6T&1LG{>EڥQ6>yVe;wunG> 6~+B?Di!'NjAم!@:)qtE<֕E jrdN>ʑ'v5v8Lra2q,3-g:ya2%V."Ng=)[WLRe|UV/ָ_N 68BvQޡO#l J43R)ܼ[2nI&h8b9n8FsF\:)K#V 쭠knn7Oz tUiSm,gy#)Py9r)V $xeTj$>!'w@}tMƺXt49}{L"nNi8Qa[)Xp w 8.>3_Մ_~蝥prx6ׁ=m<}~j0׵"q(#[0F ^ 4@|BH9y ` bU(1O浥mUitw7g[Ca;ּue )~WmSLKk48b`8xcVB0ߔdtZ[͠BhFђJƎ(&pykmM%ա ڳ^r:i`y |HfE)lUxҨbrpW?K%x $&rf#y8]ϣqJ̡~Qdy 3.]{$V7eڴ!k옇}j9,'"O .~M;HanO4-4Y3]acvytFBFq{!atlcXKl4%"?VpٴVNJcMraqC;Ga[`;/v ^f_e9)۷F^r u@F}w*z=e_mzfI.]HNp7B䶅4y= 8,-r-R,L*j w pGFuF]چ. 2E5b1(ztFs^ۍ:Qg?V(W6K)iEnnD]7k'gJ+tD'9N=–Dc9'PĐVʏ =0[[sD59y$`?$w9]m܄1mMpbڰec|CVăS@Pbz23@`aӊS. ^86,41Tl=`4dU/ Z3=hl*KEy8 u@d'1o Bœ{nS'fn0 G}޾ՁOLQRis E‰b\Ukbdvs g/ lw =v fISL6{M,Nbg4"9HI (p=Fؠvjz袏\+7%%dMK+c/F\P R5*BnѱUL .4\w=t&tքeMCR_ Sm}cCepߑ#F0#,BA>0 |vG}Ukjj}vƾ697pr_hɁSԞO4j?aWVsIrr84q^F BЉI"߷ʬgBtapj0]rm[W~3K9-[{rw!94 PӢjC)~YCȼnJ4~@c%AR\nݤj!ıcWq ͠i7кjwOUՑd_\yxm儓N[g1@ ]SHI~q.#8 ]a}Qٓc]\ b)u14M8EP8M7 d6Y#8w;~:qߐ z Oha͛BfB>XU_JQ}XR.WLyYK3ވ7 ЃwXSf^p$@VMy}]vqy ֹ<3O0vh2,IQuÛjI7uv+kUƒ/F+QtXAGKagU_)άa=kqOtZB_rL^:o[9KQ0yUcRM~LQ}x'2y(~>̰BBqCxđi-p5:wQ*!l^ <\N%H31>>JI O[ͧjkt\ d@Aʑ'E~6(I7B:%LnDeIafބ˝Y>ΟǬpEdEooBs=>iR.\iV7u}}B8Jk!HglS]x~j"JS`h\lSM08u(& `DYŎ v 3/iÉUY14ޔNťa (xӀi,D#TDzC*$^ d0[D1.ܑ:3(%k{,匭89+)X87R.+< FZuZjRfO`thѦylD^'HM]Tឰ Vsī( L3H&א'0ز [F9ȧz k&_^4+eAW'Lm1Ciۏ%Q[x6J=f ePy`/sJaR hgBп3.v~vMQQ+@Y$*a\Gw$ o]UƖ0sBeDI_pZn8^Miݹa&DiFiQ{S+x.{0&!"Gi-^V4z ^#ksk }E}՜0Ȥn+7I:P'/^x -#5  pnDvEHiT+sZPw|Qģ+j^Nm0t4d#z(Ӱ"¨6@ߓS<ϮT hNPW -zc}W@' W{S3:~-j//Ӆ WpBg/}\~t ԓPC *. 1+u_*:z wMG0 Qhy8ᏸ%nB?vbj/f -j:(9\%qmEF <-ebd_>&::]LM~p-+ 7'QJG,#2!?Cʐl"eZ['<]BȰ"5g&bl>%G:bn D^_|3$jbs@bOU̓ uq_eq-zp|J (p\\_,[D8ygP} k~i2]16ehpBG-C]> _DK $"^.>%&A]QQ0Ldy= 'tڛ6x&b3b[a21Qn_Lbq[\DF`PG (Ӊ#=~ȭxrȨSjT|dJt*KE'JZbj2Y%,Xy͑.}ImEmP^;a4I2 hVAWXkJT킞XbZ$ZN#jmyL#>#ayuKM%FO,?i|d"0*pbnq|<MYFr. Ak-d2sMq/lc8'͸N|ܯwFQt ycWnE( j(X+ G r}Y14 Fg64@@=@mׂ wAKed` ݪ !V /{^יSD1Z1Kq U}'ZQڧxfW6l~`8 &S@sa@bp@AeknTky![)ko luKL#ΙYo4<bUsB&ci *7>ه0yZfDG|?id؄TM0 s Ѻ2utL*lVd%{pm=1}#òfPW@eR'3n,BzxȠ\G Ԭǫ2<ã(F2S⌠]qrjcpaN&ݽڬRC d0D_ڏYUinI+`/nq>n|pYP O{UOMM߯N'o:` Q 2RcLY5CwR9ZC[MND)jp&9}Y5GR[d]En ;CE+p {Sx.]NJXqFX*yv4oLe@c>5 V`Pc%y:ʧd)3Z:sQ?/Zof$Fqn.z2h|e^N̑;(|Mu~JFj y=v?P iwJoq=iw 0}nL9l7`PRjGMDLC󾟩 a-@EΧ|]㩝QՅ3;2㮔<}Q)I9KrMTabfmy@0nԉ+տY`/qvA̘_ZgiPsBu@K2 {ԬaoQ9T+ðD+akt$J$ഹi&jL{0'jΓ6O`[R=W$Z yg|E6 N\:>| ƍ}?yD+9sIqw&gu[4&}fL%۲QCr؞rV( ա#n٠bez?hM$V=K&"CQOۢ='ipk:Z+ᴓD&ܝ?DF!tTt"^ />,hi4Y՝Qդq aJ;!"NC/mk[%^1lF1]ɖ͉F3A*o ?`*( %A ɑpw(wJnk@  _XƒdPE^ *t0, Ǒco);Z1V$ T^ydșGWFq+ȠQ\vR XՑ慮To!Pn[GPʪGߚYO,$Q^R)T@)XԽf"}Cu@3f9.!6Pw.gm:qKFS ^E?ݫz̳ gJ3i]k%ݪUU{q?soGǞ2🴖31cXc%JБ :Y|Z$2nkXU_x<#tdp=ntz8KxØlD|qDJĔ>ekܑ5?[>, G94-!8*`=_2}U'UnYJ-%ce޾a{9Zm'G4tiaFTfMMqJ, dVE#~ DZ$ί"LT-j3+)ZBA3\+0'7/q>QibG[R/cqo;p"a Uہl[-u./3SAzTn7 u6FP}ۿt eZGpfumFV{B_QfI$Jͯ1};hJǘ~+ec:1@\ ȦW8¾jVdc*%<-{dZˁ6YB3\g>l ݂Q{OIc.`kOrE(hy;71;C u~L "m5;7l=5ͷTsXff4M+Kڋ03gǶ9 9 K2e6) XA=tؼ˴Dce[FCa(Bن?bnm0w@9P0.f&vhľSwBk/`'ROc -h~ylġ/-(^Y!g_;TW6xg5O JWݲ*5+ި<4_gܷcO4G.-?ΧciIU%K^UJCT;-֯N_芰6t|/QyؚD٢j#ciA5Q"s!kfI8΂3q#D$.]6WĴh'9D\fH=BPBM2!x]|4DzUk-Wa*ѼO ,I.oHvbfCʂoêJ_Ћz8uuCø' g4en MC 32 ΕobQES9:33 Q4K._ [1w!D\lN1'UD[ 2lU[oV⟗;܏|^}9'TS${ RT ;:8|.ҪKVϬqR2 kg;҉DGcL>'ľs&-O E=s"Ӣ`ͬwv:&Q>GKI:aePj҉,CebDC"+EJYN<7n\Ә䝽/q*;JS[$kKFL6u>CSaI&u70R/6CC}GXs#%|l(Hݭ(<1SZ0iqT'}B(a>|[Y: p,(1 ]?@9zث'֗y,c1M# u$kb+rWuܴf2Ա7gJ/}J'bqB s:'@wBEJ)^B %rnvwt V4g~#BMTZʵL6?X}^#mV.|D uٕAPenBA~Uei+zN8H$X*VKy F8MJV!ӢSN' C i."֏꽺WRt 7*HL81zm0RI O26MjQmޝ{)XSy,ev$ʨ/s lШlFg 4~(>!;#/&vdY^2P|U^@B9m4gE"\ ߨoYHiucOHɞG{Y=g^KFw}ߘ=m?ع*"N.r+u~f\/e{@e=g<וE\GJ%F`Z*վx\<==-daGPxIIxVZ ^䆌Ҡ6vmW2[0%E7f,jN 34.Hg S P7hъwnTm58Q_4vh=er=?WטSQ`uhE\l< *fCyJ q;vH_s ((F3'{`f A@~Wmlqx©Ju_?X#@V&'d>UH"@3E L%H"zxuy+}9.%}TwRNJ<3ԝ[Y=#Q%h~'V=۔q^6'y^oj"ÙY scdBWA 2^yފ ;0jeK)A'}s6mq]VIp7X' pf$|p(NlM`pӏIz@J>z.?Ƒ[j]=rܨUJcH/ʲW[007/aO0Es)]!TSlA. QsSM,g$hߖ ܐl[(H#ajвmhŠol&ZVfP @ZN)o})T|/hb~r>,|$ݳJjWXjjJT 9r_\sxVog>#^I8gbv൬=u{:?MLzEdxyPM1LsHM9#V3Sv  2 wwr.[Ni2 ~J"&=a #(xqf aXp^Z5 ./(Fdfܝ(+vȀL|jeiFN2LLF\{ˀ<JliAfqqo_RQ`D|(Vѧj`^ U =`;vbn SPB40E (qzHfH'D?u<6ߌr2i{5N f0sDOu3/U9]QW$ E`Cu `;IAgˉ^R ȼ"j2u/HٵI 6K  `$|Šm~a2|3h lWuЃh45kSUs8 h L`f- ְKSf\*iz_ѱ-TeD;XF39 1%EJrғ[woʹG֦=DtpʽqXɆ}^l8k9%mGnBUFȱG;t*f/hF]R! [A0 @uYX%GK̎:I-@n^3<5'2Ilm1Se fH:Tg#ˠ%CczTz:nU&w&0_/j@wqs5d0r5ݏ{|K7ŴlVl}:%uQFhRI AG1i>ƍ?=T/p1{6Ku;"S$;τ[NF]Tq.'*Y,LU4=Ń~OL}C[Lz QM_۠;ɹn Fbb?$jn{#}'ϭJ{Ԇi!qM ǯBasHSb]o "^ l |p9 um@C,Oe=>pȃ(n\kOfAgm"fb=|mӘ8iΙ nq*QqTK] pz+YdG<0vmΦ#b! \ְg̪R q8H/,גc.3ՁLY:f #[텔J|#a B & >Z7bIKnv+շnE9 r~ǟsV{s{U\1ӀSLd Dp2҃fk/@,!0kYZ١W}+{dPjNl]u'@ s#_v~R=ndd>L{ j s<[8 :YGN).owH 8\`8㜬tS@[i;#[Ԧj~[32 UJk7&ǥ z"p:Jb )ic\Zg(%^џ<.ƺ> Pͅ[m@z!kwR̨#&<2UӳGPblj)w[f][9 56]w["7Mib؛ TaL ^"2-M$PolE`b{u'%lsFSTX: XLq%OnO%!˟t w6#o(CZ@)W2} r)<-n>Yh7K%=@|Ԛz0nej-PA!-Jp4㍕O!Ƶz+@S;شi)gաJ;_f%Y[RwMT;:[Et̺%F@0^A=_U[@Zk ) PWܶfp*wv{F "wa~+n!fTǀqd,V; ꧛i4d@=\w[;<7{lJ |+i }LTWqnB9DO̧6Q}buPRwR8rzW]MHLXEJ7f":hR4ta VUc}~P!u?W gxHߚ;9MBX,#\4TsO5=aMKƍvol^CGc|*㗢Td'5+#El+FBR_}ή'͍+'V>&\ѸWq6Uowc=V )wx:T B4a}//v[Iv`j̪r|@I]WGf q$2$xHXf95m vwA B@pHG=P5|s: Na|dW βlt]k5xbx|5g~qJ$ג;P$^5{;˹~aIJȃ;+Ve~)=%\`{'LX^ANX۩3hCNG%!3 "L '2z֨phtDXf!\_c O>?gJ\A]tRyq2^>}I)'&(ٵj*5(5o_|=M8$*l.>Ijp:ہ0A M Tng}/̓n =_5U&g6 V7w>WfQQ{e g]HyO+VtV:-WiBGxxC|< 8xC$KX%$_qT݌E8waf,Kj%N`DtI*Q%&P uᬳӎ!nC]m,֭͡R° \{y6y?$*>1aºrKx?}Qhﶞ"X&򈵡\ةkb .XS z'KI@ i sw}(|:bV{/K䯲@]$L@Т].q4 ΑeWoX}ڵãkZdQkVOWmq!*_fFeEm(G^> ? qM &3=Aۿb% O[/7*D \[q(~5I TJxD}Y1d3UX(SXc꩟U$wÊuSt$?.T Ŵ[Ve+} Y)vpjۭr n9d*# 4> WH-3N m92d+f"UȪa௵"xdF ı9\RL5P(dQyW^P3kf4¾ͽaHs21=MKFxYx/1kw]F~xΔU e8rU2Q YAW;M{:~bX.BXg.&eҎjxSxC70Y.vu\ۿlH},3aH<,qZ|X'Ϸȴ I$<X5 0 h9L"Vy\k7&ThMՖB`7ʩ23YYLdw?*4Q߻Y#>Ø ckxRwKԚBmN`DN hkmݰƱsc5яHA2ZP(hVU>zQBxq%Z;[(/@[b"c€O;hWV/6N#d"BXzDH;ND %9Kπt#p*AYI&So)qp^Yc& g`9(+-L|{z.;|T*TZ2 K7vzjb7nëpߜy㡺AOleèa; sqDf'y*'xjȊįDAF;$#NQΖNG*T pFF(Y @] >aAG* zPoO%S]iBH}B B/wGZ[M1T {7Wu}P ^\!AzI&S22@.()%ќ.{3e٤FWY/:;&Y=XCφ,> {[XˍPˑ8j]V\1 ;94Z/Cn$-3?W0+@xX!N$SStr,l'Dͼ z:m`km~X%֥@'F6uCBwcb->jR48LbYSQ4RCeҙY?q2˰]%؈i$rf81yElt9'~SS#>u i,Vf_Lo8uZB -|MN;_ɂZb~Hӓ[J1&p[T0^`$\?*KyNH!H;ZQЍ0^''*&3Y\敺+z#S/rgr&?ꨉ;'Ш􈒴2N~5s dKSM6R&GQ۸ؗ"fp6/i]d,y'e+XMȗVkl@="ݐԝ}hoG.%ߕNq$ew2i:u ['NϪ1!쎣vP>Ha(i^Ssl9.8;2}Tb!~)BOVc]fշ.A`!WќgŃDsoAr̖oXFmlk'\T/5rUAQN\`v=%p.kJ+G"[n{wıLaګ1uDP1CyN2AUo$rT"Z9s2{cQ )Snՠ9!U#ZoyIQ$ Z4s#S'3iH-5]m[t#}PE=0m^빈rxumbXL&~L"#LTRiGy-{*#" R;EuZă=*ˢ7HVy3Svٜ0LVŤᡇonv.>X䎅&/Ӗ󙡐 Tџs(̺u8b^E_WN]0GL4CD6}Aq{:[$ƵTT{YLE`9 y9!CNLjK۽W? S b; =="3R+`_6ާ*aXl 1@Rv#HJh .L1yKE9GﶢrOgAbsZR`+t|+$#c%2gdu /`p7GR}"#f҉hiԏ*"Ev!op-E8rs߸m-1~EFhjɰdx±cs~KT#Hrތ/ge>:œY\ A1왂268M0kTrHr%D g$6)iSpTS Xf]qn\:nYj_6]Bq4}vO͐lG^ޓ+NT/3|fHAZٙT..^^Cd -ÐxR7J:ɞْkv[]~R_O8M-OD;2h%72\эs6 v[*)eyAlui#8Cm*ֶo6򂓡Ee shBiV;{7e[ph p4 ^q}ǰbRֺ`XKF*o`8 &VhJULjWskTF5)}wLlb"jleZIeIu FnKFz:%4CVC͞"x\ Tzb7_{leR5U8p~9ZAH(Sm~U(Hsn;7!DX"\!Mڲ ,O;-sѝ P2eo4$o7LS_/;$~6p&78/%j( @M̂ëtMD}|WbwZi(vXd+'ț.e#pJmV#( x%Mv:R߷DLF 篜6AqB@ -zwլ[;%Dk#E -^FRHSx3W4VB8KCd3Ii+DJMz3_EYls~_#ҿC qa"iG,22oT{ϽfK dOyvּ(tbuߪ_m녍?JMC%0yNQW8&ZRflId&=#/# ,> GQVg:[_Ԉ]A [\ѭ̦ B,F--ɲPj'8i QWKݑ:9CᕗtN͸|x$)@Zt V'Avk%á7AV< %mT/RRwJ̀N]{e27X"IQ[@wA j-4,@ !H:%afFnH\ːlNh^\wf7d̉i/̘|{\dY!CQ֬|k#e6}m ,eqxq_#]P[l8!D.`&g< ⊸AVfZdho@=4@Qi;? sʱ!s2IH)1)qKƗ_Lհgt vy|(SS_(>xbsVLyt))zIм-qq 9>?(aSshFѽDB_~;f9-kCvB4b[\b33F(6ˀV/Db K >IBIp[~XzMP)ՉoTx%kAlh>b+wlw'H* C 7}BGMv,CF1}qW|# *Z5'ԣԥDN ! ɧj)jgΔJe. 4P\TR9\/Ed:O]\o;±!+ɗWNi^(vwCh+T!aiK *,p}/GBeIOK^*F3GUXFJulSHsdY|i5Gc-lOksJMK@S\*o.&# Slג0q^fy%(JE(Ga~c</|FۤV-UؒvdPfeM@B.Z)(_d辻}װ .3v gx䢼h#zuC(GM_BZ2)z(9xR𐈽5 %,6 x Nf Jr"̝QAcaB 7Ku{9pCO?N$sK\G確^]l M3 r?<ܟ$qa` F9ڎ-YN:R%ĀG B~^ ;^^0LIicn|,RW5vU5291!b>5{ SA o%[e-Gf`>@\-_HKRZډx%N`+n?ni +JћWKuņYjA )W 9m0W#5\ɀ,dhm@ r9]@5*B4u4kMZ8$$]+?qiFDYB_Vű` %}VJ#73%qmʮ!X.N%(9 02p+:U26 qI¦'w D/`tLXĄn-*:M"W  MJ$$#!lkz,vDBNqҳ;_l9bdѦu 4U.0Tw4tՈur<X'Gpe ?ς 4_9 VtlXQP. ~z߁&ԺnF3;0o}_7u~=]p@܂Ю'M`T ^P.%?3ݜSK $\4 [(îO7BAWgn@16u[,0.q/ /M,i$/KCB?~ch+]{KpnIuٌ9)6F'qh: `{lq5d1x>l@ O-ЛX)w$⛒+[_ .oŽe@LMY: UGCŒsY㷄8R$]}DlsallA crb! 魟 c^ERqY U'9Y"CAА#Ym16; 0QZmM9CGoi񅰭gu Pz?' }Xkה$tQ q9fzr6 vO* ܓOƘ7WkgjLP=zg-EReө,yAŎ .B{9ϼKL0)IUv+$9q,oF( X9J=x|ΰUlI֗ψNi([$lcLՏ/3@cA&IY0Ar+v˜¿y;͌Gxrc/tnO \oo\Yu.7HzS?3 JwBZ後|Z[y$w.2N2i>L,cJ6Vc8Su{WwRy4hr5:Ɂ~+1b9 C5)Qڣړ@l_ٮ~[.ZE-/6oL:EkU¹{wF+1kP*͞}pϑ*a=1_M2MOѭIdk2Լ>6'%MoSjCbi[r!/E Adh[!X} !6'^8"v(:Zw#0;Y7Q ɞ=сVNgXVm:EKqB7AXu 'd˘SnKF$n> smM `Lv 1I\'=+;'P,+.B3"mKm܈ܚ@oLBltTYa&cY9kx[B;l Ki7M|a*vfSO=pC,=vg\'ˤ>iNNGxAD)Cm:D3G*"US2 }{ӝZ;K.rE;Ae8W+mJe[F1'xș!hwevl`2e O0$iZsK[tQ_2k6?;B[.UP/F1BNA5+޵ +G#e^GVϝeE'^W|bY6M Psn෴gvG|1;u,o^V=).<]{ȳ""@Hcl$7AE:':aBZu&?%;8 ?d̒RBĩlք1Sёj/} gLjh ?*kR,MJ%o曢W[9ʭ+Vr= mY| !L.t4_7"l<{mZu~gV͂y$ڵ{cmk*f0ϗ9ѣ1EG(fh;kd: ,¿}[glH(5ps^͎ƚ_ ==T=v/8z!a#?:*[SvtTl#*YRt-FY"(U+|z)91+~ {LOU]c~]f8hF̺VUI%=w0ĵnCi ;.fqh2XYjM,FW2Eo ($돮ߤ+N9%Zcզ֟i3Ԇn?Ҭ$_j~OG Cz!Bs!$'9C[LD Bn5ܽ+gEp׊tY--uܚM?c<<J .n}龍j3Y}<6P+H:?lv^rE겱?> =0Y zTQްB`yjj<BE, 3Җ6*8_ˌ`67iHZ=9Qsy#̥y\9_@=_n%Pܯа;p"*& &xet( 6C'PIPu_~mtA IY|jqiHyܜWsL{}]kB(a p:VT' H2eek7:s{j23}gc3{l VO>tl ;&"AI&Sx:t-=h .SM׷ɢ+vDZKj Up*nbce4Z.| k4 L+prVАI"Egj(Zڑ}$B/D//cgrHF6CaXj;@R/3 & %85mfaS )cQdJ}s8 gv = Z9i9sldZ{$ٻ16>7d[szE1QeyA9_cIr+Y|O#VEfguT|Lixw,ǤAWiZ3rD5aAFv"+xSY OiQ$vB`ء7wx#tx@E o38HZ|ʹGPpug+nNWa3jZ ~vw1'0 %tÊP.H ,S㷤zɼRofL-H?6i']J=Cޤ(]75ZD4 F$niZpIioCQ|3 >fD/Qky(2Ԩ\>B˘aXHT@؄Dzϧ1MPwL&gK4eth2G㣥GV צwRіMJV³AFc4I;/rS3OnH#v87@'':E%ᠢoW؊xȄ sH+pbs#\b N~LFPFIP)42!o~c0áA Dcʳ(w3"vF T1xNmA٧9lJxFnf# bp]K;4W 6,1X3'yUg$8ZXu+*8kv#tRnv39/VCߊR L(SJ9U\eǠ*p)F9ء8ߋ",׈  `lQSFǎS_OwO T=en:%}Wj>y|?o,p@U1xUGQ$  ZA*ԝo781BO[rr&YƲͬvg< eMVs9C5{θr-^}%XckTHf=AXi[ &bH5DH 04Gl:*k+4(4#GU tZ [ah J&+ &>;O7 9 D9kZh$|A먓:2%4)M5 !_zEi]H ^gύHANddĔ]L46 Y unzE4^6pImwHa3j/4N)LqCCLÞUcG(Qea_1'&Z$DP\lr)fTLzi$ ,;2Qa7K@)_C#)kv=W"a鷽o'j.!ŲXd^-N+}]5qv !#ي\yzM&C so:XFN|4vLdlp5"@(Qf~6]·)U Exjءc7⏍ATc$@gɶuчT~!+epQ0`f#XF96%,Z23x -ۉ5?TƇi:?x00w-Nz}Z7[t! \@fMxhfV=(ъP{H[w/K'%'6&LS{|݁/+Zs6S</hct*"{mszqeߚCRś 0`ImS40 JN|xcԝ9W4?l4ugV}ۨoլBXEf# PΔ*?_0u+Ac¥F0Ȯ=uP ~Wı!S]8]E^gbFv$F;K|7i\p,pO 2c5 !X=sRmp V9) pxAF(^rZ0#iW_~ի!c 슟e=0msG")+U B%-o[u`8b%mp*t)cj>X$=e+?/Hj9&1( t 0xMf[jD ̝!)He0fjGzj!M5i&W+ u;s]Me,K/ auKtLK: {h8K Q6{i(թE y`r* 3ʦͼ<%Tph3>o@&A<颋~'L1}eVTGzc?'놧 X2'{ZrM(H6~X%FFgxnVKBb9ZǤ~sT[:YjP9);flP5/%ڴ_? Sq oAuT]l0<9;l `.=͝<wά:\M)TUOlO w}}P<%pp :<8 HIB^r|pЭs }]v36"O߫O {Mh_A:7SKЫyGq2}lKM@Ρ2*lL;2k{^(Ƞe|\ L[B6o>Ci-QVMIaEg-Aj4 ћ2tl.D괍r%;7[D[s,`e}sX3yy7_{4i:'#HAL֩0lF?M_"uH1-n?'ح8@[ʆI/|#01n<|?;k-JG^vKSQauz.Fݢ4XuW%̜Kq k}xD/UinW?D$05[$@ 4:Yns9nء6'mȺ{?F$xhYtCU"~_(jLg)l`>;jKV)¼WtY{e.6\Г %A,B;BW\>!2\w_>nIgg\--X]) wWuSYwιۺh"bH+n6Vy]~Zc2͠fZ6`6W느STֵ( AŎZ~C:jY^q0f tQTgW{9_qg O 6i]H-8 T`AW rwWQHq,KhG/Kg''"b_-){ wG PS?κBqt5JO2Y;}oG&?0 GӅ4X08 r^-~9 6C,qW]vs0J0 ]5qWc~Fś4^.xeTa'M}tRtc֢0/.ϣ*h ࢚M8 A=qǿ6, %=G|dѵٌ ?/އQ0 ['w挎#&~t+*(=a ze ا F`h՝}D 4Ya i b=oQ+ !CB Q/%5Ꚛ׋,ur!&Hڑcr] czw0գGOOˠgIc T'YK]J`E5{|%^F!c;qBq@zVb1ُtʎR^?e&qZq#&7N*¬ WGHgMyNHa-yuAO)9Ơ"V2Y_w[k]E86]!0mfصQqpeYo5( K6b Q%+×f x]wXPae4]k̡h"1,@-FZ_K6!2G4ճΓ73WT0K,ҫG^QŴm1#h]kY\I+c^`71 V<T wUzj&:J i!X\D#YY69 E1[Ӟ%glM?"4AjZ ds@Xv"lS>Lcİ<i] %[`VrjьzEa*Ap//nKFBEjE='1#ю:¿$mG>1q? *벯ذc\ܵteQ'ǭm+Ɂ ,*[Zpue~΂'䯕cׁoBvꤸtWmthdau.7gvK鵱,AIB`vR Q& Sf"N2 (Ym,*XHdy7:ڒ ؏ĽL\׮ FtVI۶Y MLG%t' rxsDPΆ>O7(p`NB2ϛ[aDܬ<`\&&nvI k/fc*[ jO_!׹"114=ϖh}X4`n I*rF<0zۢ#hΧ`+kW4@ ^4VK< qQ=&Lks+A(3ԨB[>q}og[Xw-#"{wKjĂYkΤm. 2qvPVd9H Add u:;U\o*&9Zaa8&j`?UVWjjfiBV{X^{.fy1l:8+7J3 " > 1f"}JMǩBp+D%61qn~Bjg\ݗ`,-A%qRr1 &SN(B +bjz| @41F%JOhSF% bNV"AI&Siٓ"[b:L?W)l%pW鞂!%Iۋ(Ctd?)1AT`|43e}m4iiz91]Cq V`WaO?S]%=^[=y%϶C`ʟ T\!۷eh6 ^Y.O\@s2J"+@ПJ化'F!gz:&E/q{(ULmv Sq&($|֫[y''YO: 6zH*NUyMwA 9M^xg"Il[mMo|Ct~-jGUrKꅮIut;U)wBZ)8H/_S1bɈDݟQUYnj~k<nMwa"vlyׅnj-K<R+8$=U \RۋK>02yA M8KKS227EKuk礼|qigYcq^-.ȵ3Z PuŽx]uG0e-%WZ:)yU7~=Λwk d>6;˗?hJpY{wEV-6mIwIR1=G$P/]h7yyolӀfL_GH:,JSj{\ ӲJg:b0A9I}+Ju;gKYpItzս' BBkLn}")JGyx  PWƾgKX||Ge9!XEo%Z².rSUՏ:a6'?1./Gfeih$-Ls!"8S ޜ%· }Q zoWP[%ϰ%wcVQ/ 9M4 {' O H5:v<4%81D :4 IJeַ߬`'D$J $x~EI\qsє?S0ӭ'+^LBtSEJ ml0f+aīC;^0f8HnJxFT]K7e ww_YQ+\z+IjawIQ;b*Mx10mӤɨ[*L1f|Ofhφv|ݩ#20N+[zW,N2Qi(~J=vQ`<٬a`bޢeWmG@.p'-uFN RՋ>Z"րAr4POj7v¡KF {q=65$'VOEĐa71.*ݘAl|(*VDŽM IyS<k8Ա U뚐CjGUe A)⺞~K/q5G7@;\E~Y=1ATֈ#]\GWuP]v;_v6=lCJ )ӊ3Q ;9ԣjJN}LBj|uq/:_P^ԝ!z=r%D]?qB$14{j6NK>AVB@"BO(2=ҩPU# NYu(/Dcg5*&(pQӝY ܓƙ *:O7gEzg;9Ki/,ZKgJx3$B%J4sD| dǿfth`)(#ݧΡW2g'Tܠ_VcSyÇz[%)-0μ$UsE<3x72Brk񤂻vUꞼcjadtV/HK7XTh͈kwo:y v*q ^#&}l*vuXUrOG fm*w/KC~u?QLX'pt'*=ɬ_ޖUTrѸFL᾿>0| ?.y%!u 8Q+kAwE򩇌2Fi%Z ۂi~eȲK&sˈ2PtjF;xH~T5ph-Vfg?̵:1FUp p=OA,*>' LQ7õ1d;ps&2s*_2TxR>B ,mkeR/Qv^~<-49]t;r0X?10qg{B*c$}i@CuQY'Nmv Ұ<l\uBB}{K>`[!۹geu|DM:b"ʜ ;2=exٞZ͍1TP `~p(u g!\g~5VjJ B7x6+`^>}!PU DduWpҜ WOL,PK'| %$"l69?G.<>Tc.D8҄$Jl,$g<ڻxωs>, b S(34~E"yY"#v+jјiJ6#u: EZ+>]GG'x s#&l৘/H .Ct>ʒm\@eWdŽ_hMтv ?ieRٸŴbΌ6.my aޙ{p $N,_w׀ގ4rRٚy!VĜ?g?R#2KĚތ$yG,3Vg9(k\[-% 7p\V"N>{uLkerO"=qrG $Y_( 0$_hy߅}-&cBu 1Wx7x~wOk9T7b=+ ҴDS3ݽ5W7"pM A/߱y)?!P{<rJH8GHtaOvm@y5a=~9nz6[H}fePXx,|\"o  }(xf( o2ZCt+()(;\?#*+|,gZs.yhJGtLV}+N)H'>1Riu~Bx֯X]>.xCUC V{?.$ɅBT"xHDzE RV?FHbg5z^O:,ĝ=7.x!RP4'lD /%חȆIbk[s3]y`-,!?ĉG8cjvcd9M3Y?zAɦTPh*V:MǾUcv-A^gDm= ހ%(Hz|CKYY"HXmʝqiVc['@p.wXeeŗkHOl7d{,v-7P %l&@Q1Z=Lg߼7i4fQvg><աcpH#ܱ\]I4 / х g3:4g9.]ltCGmDt1Rd؛*1 h$t"1KGԢ= iU؁ <ʁ[x==j NܕrVwx/`|SAFb d2;%hxT$n$2ս7#W[ ~~XXDVy1eY;y@X>!cBnkQk@ ,6f|VUS9 {\&ÈF5p"~+og)IֈxR2 8 , #">W>i?i* }SamT/||asްςtPSj@љL!'i:" C xE!)ZWEF8 %QɊtp^1?l*Pv !.kTt\G#lyw[J6]WP\73}R\±i2t Q%* C`iJ<у螅Bni  !b(:B8&(MǐZ܀ϮmMKU D&5 utHGfd rN ub<*('b"m׼;ga+q s'RVH.vk E jɍIZaN*J`7[V}yJ2g ~g'UcAmx,~f8rc?ffbk_uO1ߣbM< = c/ }E;V$qWDGB jxD(9bҘnX!FAv(Ar]ikY[*a$`M)ϰ8 OЖGw)C=>q{| 2Fd]'a(7A,Q{,CEVIW/s+=~دU]e(`#A7Q>zpDSքgMW*iwl1fYz LÖVKaL?615歳 UKC(K[\EYdRNR"k \)]|B)3 mSa&-Ȇ/MAgf9&JOr%+_ r(0IJcv)aO E Jk4c], zla\!{T8:Jc$a]v~N2Ŧc,"V)9CcP xvp8u< 2FII|wk ޣƃ}4*叩#Z,ǗJ4\ٙٞ Ii0>0`^IyLa%?7<1 #/NSI+`\F<#$1}F>UXhdKi7XUh;\\^]-pg4xg`~ܧp)]25O#"sK my ͶSs~M$k<ynBZH 24Z]4 `CގSĮ#}y|0]V҂RRaMқ{ЧlӀ>`2npgRyՈGr<SmC|ry_ۤ#:PuG[c5r"]rmyE/q0+`c+ev|Ͱ@2DC VCL Z'L-T9WE@kTZI:Wvdp.ʠЛ 3xwoIaR/s|^*0aj]!#AkQb9;N}vYxnHnVW&H^% %088d@åCc*<;PE5A-f U )$'7q) b赬1-dދ=eN6^Zr 6ŜG]ז6PՂŲ7F\24͙׌ۋ{Bܺw@r\y쎇mhv%ivg3{@e4tPw87 H5Op(j3H rAI&S#@iEz&'w_x(̢Y&0a{L";hFU0;u\< ,D}sAU^ 㺰H\^\^Y՚ | h rlr9Dp@oc]0+4ӮGZ܇ašwaiǬř.š}Edj5*s?$ߵ7B]ފ.٪f-/YΨ~̮nEC+g_fkGP@<f*!uŝFqGˡm9NM.) ZR0^˄>R.䷍LB?V y¿г\nw=&ju 1$(Z|d0)8㾯y]Gt%5d,򓷠Po(v$^.LskAS-m3W02a6)0M+v?aHuѭ<5Qy] }PKUh)_D153!cA[`8QZn@˿ AcW%0hX}62gbʁV Km ¬O}].Zea战<~y}>2c`q {/MiVYXMYTyשX*/(΋^&ǙJHZR.){k}}Gsez Rw /p 3[ԥVx.ݸ\^jF/.R.f]WB}'5lhpu݌橎x1@^AUb:JC &L(LБV76x,odR;bոgy|$ܡ 27{ V_-oƞ iJ ؖy{A\}dg,Mz9窢<gd<)c?n76>]@x"/b*Ο.Ujw爮$k'2ڥGˇ޷)8k&C Zabm鬱E \n:*gwhX(8v,%]*4&:a E 7 GZSYV#jn|C]I5Q ق ~Y>5S'6# FQ`089L YsggL!TV2thT8B㦾0zLxb.Ujd|,:kv)M1 2s_9)e +8[kTrAgAf,"fvA(G6:$G/%̲[Aq^J1_w=3Ii]w9Z (ՖӚ}ų͆0II¦WƺӶi[]Iÿh'bY`GgL BV64r-kt׽%+4t#WR G9e)kQ=Oo ژ5 0(y35+E?Jۦb-JJezfיEzǃ:~.Jo avҖbO .uRju8>8.Y  E1$-O j۶2M>U48b*Y2zqV ٯԠZ{F!n]m;vŴ.1*yKV`h!Y[gT,VINYT+3%ty޵INQ2Lo,׮|cE%V D2WDٮe2|I8K[čHЩ!av=DAcՐF@g"3Udl/?^8\<q%,rr,#?w& `-f3PsX5eȩ =cߖC w<{F8 >Vq*cⴻ̿x \T*_5U.~1#)Wu4XZƣG:h/ft@NyU(r W/zJݏ(dꂙN(BdְA/sUת@7&Y'J36I/ǥMe)ɯTqM?GT Fسsҁ[O3I3'7"n A(\ѴǷ~DQ?%TiZbA~3on](F=&pk_ڕd6^7d)`p@[>“idYm[i4oЬ#M-yu|fZD`01uEH<.p튮<E" o.9Eb|AtR**q3xRiمޒ@$b0 YhfU#HnWC@dr/}@xh-LU:!q326uyizɄ*pŵ@,DnN`eOl:;ٷSS?U8ԍ.5/1Z+[#2!(kn  ۿ. qROkt!8SăXH1a$ ^9B|ֶ*eu.kح'o*}0E(vyi^ڻD~~ZnI=!7y2 e@#j)#ÖDeXLPⴍCBU]t^⤊R(> [i]og~I}Rn~wL'EŒ"/N'uڝba9z ^RƆ6TۦXZx¦ʽn+Ƞ c*10|O9A|ev~8·}a%FlI"hj̷ݷ?8&~ɖ1$;((k@dcxUh]퓱Yu@GAO[f][ d)]FL5U3($N ^^O8!4mè;l]QwwO?P-"`Gw Y[UGRGCG(P)a;ra|߻Щעul YDz#,W7,W=|$c(:PSsM t&t\z"3VDd7\3věE&ԵymQa•n|`N)(C4*a_ɋU^/ȶ9_K2+Xcv^+9kVYڹs3o/#-{l$cuo 6{8ε!2‹su1뭮۬AP8bjq): ҟg ݀<>hS]#Qa;FۉX~)C/4v{ 3DIOx|7o~^ ?bh0õfD`~C93_m]>CCï\iR=ѬI Wi^kVC'bm?EyVgիĄ,LNٛv|OkE2ل1JF%hZm#/ss<'(|X^+RTx:Xjn:ɯNlIU6$aMv$n(xt}gU$ [!GvAV[hҕ`N7riFЛ79̢Fqtn;m*TxaA:RI~wG; ZĽܯ#9p‚9/+&rݕP# ~1VDgPxuzVrp<_Pդ.JG>oΓO7縮j9/NVk<3&.\H>dz1(MN l6'~ѽCU,!oeC!ѧW wf*symU Rh4w Nj̋.z( 8d:al]IŤ;x6HLZ6Iks#y\ſ-.Bq=#PS#Ad)QJoHK`z0g%9P5N:OhL堲Df S_qy+ qW 4Ķ@Z߁BXR0` IW`4 վl.:w8/ʏA%gVbZUįWVpOE{L~J/[6pR?Iuː^' Q si4wGh[liL o6qW+pq-a^b=k66^YȜW9C̽^*ߋ_ɓlWwo? ɜ* hOzn(H.?J1Nymَji"Ud9;9X"zڰ(l]&&^vx&={:*`:@ǃxj}ލgz\ Aq_Y(W0l<%8'Ȯ".@3^MXuL0'?U=!U6O+|I,ĥ$aɉaP[ v \ΘԿ{O VCN8y%&F>@MEmۉ[K|]ܪ8NOs-_ݎl/-JbFK>IV3 [UϬo+=eRz̆}-}0imڵ C5"1ΕYT{l](4J-Ù 6ߺ=:[^1~xIHFY}}kf~\f;12uݩfi^/DiW΂t <7o[zBeѷ5CزwkS2M3;MSU؝ %A 5JP-_?r^eё<gהS$ Z* ۚC5A/:“OIntM0M,O&eKe5'ALs}SI~`P:5zx!`5ԩ,lC'pLXղuԜ~YFBMpSo:_K("tp{?JV>)=wjSDxX=1tPΣ ?Dr) qܓk[Q^·$SRG(~=0sIj"ny=29]o xxs 1U 2lU3b5-h,FEONh`/wZ gTz7eMـ>1޹4, 2*`8В8b~ =z¦~7,5cT[uwh$Yhyg撏Ċ("`4F< ;8pN PC5+..eM2/|.ܝ]׬ &-u W/&U-(<瀻n l`?pO,9݄S5{uQX+ao;q%?c.İ8Nax?;"R#6nra~57d>0Ep ص1&"f,w>β#*<#X9L+!KCUΪͺ2*+Ukɩdy$cJm`v9;_ r9Ȓ6[+kHQ1Nֱ@ylg8K|a W OwtEu]q%,}$Vj|F5jSYoՉsBD>@28pƗl)[=P39r|w9-0bϕl/mVgjQ\PL23cj`S>߃)e ^U[< lk&2J:|.Y-Lm0atjMz~-GCN 5 r&GЇxֿ)nepga5Os^:PǣaPl8g_#Gs)1^.NO:ܴ L̜I/]SMvΦCw жS2g ,dukQkM#]{Y84Li¨ }\*W'imV.*͐tt,E_lSPX#,X&Aw.axGȺ̱WzBr@5ᘤQ3@0"LjӉ'rּ\|Ee`Ȼw,+V?n5ٺ̦{e+T0/6}]PSS\b$O4{z~m\n=CVs5+`R[,m$Bwp#W[*eMX+#7 &eXVF,tN:4Ao_^`gp 51:&{lDx%ωu`ഘT?-Wϳe.YLE)8Gsm]tkuF::kgCv=@1z4\f!`"kF/> `IۆNdE$mk塖 2-Jnk;$'tu 0yGevt[]D c\TÂfAfTA |V:kK +ZNy;쑭.=\lk+0 3Gdr!~x@2b5/\i d` <^1yӉx!$1K'2/kk*PC_2aqn,c ^=7i{s@͞.V24NҌ.B:72b!)[3?/ț%y~報h߀)kur@K8ߑNCId| hUBAeTL߷/RǷ@>p*J?U@T`mQJc9䃸=lD͝{% &N|x#9Q_a@id FA ]|Ш}c6 F%2KC>kkҮ+FTu&6BLǠAkq;{8$D^U^e qF"$2bY><h&4!)dS S@~vAZ<LʹseVNTbܟҿ7HpnD eg0̆1yKؾ/Ib2ދG "{mv҉NNמSRᵫ7&ޒ?w`@ Kr5wVvcX@f ­׊`牉0$fzb2ĕr=|aC\?ڞ&-\̝{ . '"O)g"X| 0_ޒ~g Fw_UEEh>Qz}r_Mv冷WL 4 D&JW@~0% ۡj8PL C6Z ڡ_иك~dfr(}`اV (9;1!(@_lƀ X[d2p"(7^)K%$Z|eY(e] yac >=XیbWLb(Vہٹ6J%ܢ"t[-.;N WNJ6r=a}[8'2| aD3[>NsA֠|{ƬQtj^2  ]' doZHϨ,6C5F86p8/E]W24uw-:^9_[^}BY*; Pz]F[4evܿi Aa=vܜ_2"Mm:;i1Y9p,Մ3*( .6\(^8faD ]"1Ac% LOH3<:Z*QNۄln)U[4=_KHQR0xQ( ,a֮UHxt!?9'A nSM7"!~ 61?7}^vrZ0]pMy)]čؤzLj1g`7mAH9/'!fb|U$FMWBLP 4QU".JR! 10Ĝ5Ii≆ ~\nd*$QL_ڔ^_xQ+=$[`4-}"pdmzW o{IXq@gTυVW~,+ /YP]OE)c@|" 3)+P # ݵfn:=Bo7V0wI|K[. ˄&=JBWB8me$9NȍRtm~INxįfb:f9d4bvN/< msKsG0 %>˃E|o3Lq*]cǶpAt ϯ6@S%4ٓ /"-/oc/Zs|>MnSuX.[-6Uv$Lҵ{,o!T~Y? 1pgx碞/mOn"aыsyA&I!=/% 'mн$K:;pٝpL< }8- 'UTka-l^sWMdbqőlZD~8tp}ёfF$V-gv (ˢ$WEEHnW0ܓeeb_a8n8ApC9x Qg$\ 4ib'7 w޿ZPRJhRf;yd)at^$Ti{pMZwڛGq@lzAP?1MuD5:Y(U*Vj+i &qo:MiܣҤc_<\zֈq)wi9,n 8@̀rwquxV0A`'-mHTҎia1| 3w9ƭa׿s.Li2g%1]OFCD+LV_&:t]Ē롶:ta^{M\K6 dQjH|\HB,hӸYE3] h u wb@/Qqc왇xr};Hv&_*O'W9 ã{{ T32O tWZ{^4l% TEŌcruƻi^Y=]y ̷wo~du5)L״\ErF=5txiˠɩO#)qRER9h٨LdžCpS]b&C%S/bʧu>~ew8t<#uP;0 FVDj4S*Q+޼$ ?y$4nJ0 ]Qfm.:K{}it T I r+?0DwwZQ_W^]XcvpxWݟ=Ym2 6oI{E32>AueS<BXyymA % aͦ zUb򿅨%eT/v7݅FVɷvym.W@- \ncҒQB9KӮ )E+s!zni&T'4%;5,)hAnP̬ˠixSG$}3ދj4@|aB|%Tko&温 =} Bl϶ eDzG%Q.-a.#?F$ kP0h~Wq,.^,VkawܗJY{32C-to)9`L M3O-av0 M3P"d [щNLqG tKFEzHoBrϨ+ ?$ĻZcRl͸Y*Xg l6q3&g_Oʕlutv%zݜO2+$ynO`ɶ# )lɄXٳ&Cfd #,,fu6>T? 5 ʧ%]?!-kA & ?iq1=Wfpc ,tKg7!VdexuI/bi) +,kz K3)N_qj8SgZ  Jx}]h=k IG"T+_ eZҫ5{~&Ђ'5 nWBz5gȁ~-ihyxَ3B*j=DV͊D[]ngvdY rRZ9h8J )%AΊR~PGRV2PZL{& r摸Žvb!Jɝ`;:}N:8NΑw6)gkxU6^T7eVaX"[ZuR J™!ݏl9L%BcD!qTqlju̙*UQRLiGs=8AI dsEjYeаop"|pn*v&ʗPUP7XCW%l{N"]]5lhI嚁v k-]tZ6OD4¤bW'Un)Y6w%έCra,Y5zX㧿iogצ;35TLZ0013cwlfJ]AaJ>(b4lqTk^)]Cg,"JuЩip)ewH/vo/Uwcв C'*C }9 b?{E׃CQߓEuj~ tPOB*m5D3|MwfRZX&z2A}@dluMpT{&XP:6N9>eRȞ g %kD%bLfxN MTC#A\qVM'L/ VL]*56(tWǩCi36馩*&%9:uKJߓ(F  A34hMNl#L_]fsJb}c~ lq%)w;F 3Rr0B(@Vܖfs{p>cyo,1]PI&0%{?}]xBgi^in;5 3ΧhC]=q5 urW/E^dTK-~QfYTa‰0 "6AA(HsS ;F{xOђLEeyc~(f gİ?p\L,ΑQRɁ,YS?ٿ&U$wEL5YZĪ j=VqoCQhgGۿyJ ?˯ZA'JY1L!|6qA{ p*FmAhsaȆme5S.2, n!UVx; b@{00o{z֠"=H1Gi?i[d_bkľIk K*Ni_^q4-eqD8Im1YFkϲ=цgUkx2=ziTU1j=E'o))ΞIeX{DR',+a0rw2 J@! zI]W;l`5;|n퐞x6#L'uix|>KU/`6\5&R$n>RXh4oЬ,Ǟufj^kȥ]K :v_ti4ӽU=H^}lnB'LF'?R%}rt@Oe3gV<^p y1,LYϞE. hAakٱ?Å?Y_ok00-{s<2ŪPX:Sjn1R7\ߢ quUV{ϴ{S48m$Ep8 ϡ1ȟbJ58U"3}(YPk'78?ɴ 66!ӊZtgs{-LN^&xL!2Jx+;֦-ػF"IKWCxopYD)(v\! {G#C[8&NP v2gΡ/爱&s,av.3y NL{5S܇C1{^:H7p3hs2(ߝTLܲ*%%1ڀv7Жkba۱ Hw,`58,^x oqKӆ;Xo>xz懣@]*N݆%Vմ 4&OB 9JaZIs~7s#A`$q͐KOxe(qG'PqjʜxF68EV&Mr}]\N):7WI.XV^zdj̩6vgi:;OiTWC! a?`y0~nŪ‡u;aѸ̘ۢ/ЫO_tB g?W--[v ۀ\G~)3j^B]ʊs+f;|ŦM7ee8`[$\oc|fS%n-o)2KsqxF{ VsZFgG]˿ף9.!xSɫ*XG)BYgϛA?az׋yŬδG=`ߟDIt&)kokzfM]'D}i2,EE{uB;7J/WK\ƅn0?O.yek0M@}A1^lsfe&>p3҆9!e3%J;5so)2 0r*2MLV&ggvRkﯡWrt Xmb̭|va*8@&^b- hB]τ|Li_Xqq7 ^ Y {VΞ󧠰@ss|X|*h^M|`q"n:ǃֹfǹ1p`oR-ECooVw-+u$&`uEҟΞ{XO,x ?h[)[PvHTg׋cR_ipa1b_g^0KcXxGlMU]MN6(& c>L ecE[-ք~iIQ_pPαFI!e9`ld` +EX1W"P}.kJ\CJϥR2پP/r*}uPL I#65wӋH!xR 4MwZ͠#HtKȊ۰L~KI Wzd\q5h3WI/, q@: |KV34JxSIDMÞn<y֊_K֮U>j"u.dFZLMқ ?(;cF,I-;&>;?_[Yb1 Dj%]9,rƜi)f#& sjLPbۊܡW /_$%Psh (i0[F.jS݁ꟺi$Dk_l*+Gvh=Ny0tzNKW8˝n Ƣ0fws.G0qpwqy3=qwW/a>Qvog)EHX^-=政x1B 2R.\D6kVo*izW (F5.J],\fN$X0)9 2?dEd땁0/*/ ;1_>*g.yx W&shZ=0);Qvi'NZ\HjDs &iG%1 }n`ð1NDۉл{!C''@D|SBrݖI657E: -IuTVfݞ54ְӣ>e4ų`4+`y$v4i#ܒVu20͢ȎU ܑ_2i'DX&>UȈm+nN?Ҟro@tD58QEOW[THI8 {3J6~ tLGP[!4D7 cWu?DjEw9}Ex,/@$! ]Yb@#[xF$BP[ aXf b@j_tۗ`87.eHYQPFd3};=XيW|َF\8lнX> /HfYö<. Xos}wt^EaBOflJBl};ErűxNsmV8Q.Ɣ7)B\.-/ױ(2XkI%1O "A*8$5ky[M-XTh *ߝ\kiCkirS߷5#^( ʒ(jh 5නm<00$jY,FPᤌ,K"|wg͐D|_ 'Y(RϜ̡YσOI,4/NEI&9~Wo_dA#t.hʇ4#kQE+@bC2 @e4ͥ;[ڠRMτW0+CW v0 ӊ 6Mk!~|?j*LMx6+G7, ۞XBY0n&]%fz*Eٙ?8=ZO S`vƩZc/CWXHVĘ ٕҏ|mMF~m:t/Y2e- Ն5ʙXSkjJ q&+@Éf  ,N$k&%! %/OM`4>1lVpX=\e_Ct׻u'&"i3v#Hy8Y:}KaIm1f B_27N"@ 7:Y1D/AJUݏ iEF \9Ѯ%ZQ㧆mwhȲ ~@`u05Sesc7LȜGKYژMt]K`Đ ȭ\,cQ: w13-4kmtqZ OvNZK@ȟ5 ԏ G]^c;/1l,xRo hI %U!3w8}TW =-[.K6Rs?Z,e 8i&e-ҝ-IWQkg?vF.20DCF[2 &~tNAc:ʜov+eu\| 㔡k O37lt#?*TŻ9w^|0xM?D.־E*T]5F!xh;f{൐r텔ۄQ"VzL0d ˒MjsF3 clqPAp*t9)|5TH3L$БH^?m9V0CZY T;ݝ&kF?2J\{ Pѣx"h]E}~1!:sHo6' AVJOL:vmz Y~ޟm6Z:V;E<X>+k9 ڽQ1#_ #:PbR.bEG hDeĄaGm_!8!c汥5~l $4OKCb-RHpk XFg*2"k-*jnW IЦ'ԠŞ/"q1iR]E* (ARӜWٷINm ~d˘$Zx4Մ:O96,Bճ }\FsäoYm krv7kb1 ?l1d P|G`:0Hp|f=*U)@o PtMXrPn/Ef}5jyi;zV%̩9]a&$Ok)=kwbZ&NlλteMPbVi5AMOJC3pzS :iNq|2T"gZÈw"gT]KEO>w+nlNܭ1]V-}B2q,$5q]/hFҳtR0/`)#{[̿Ͼ ӑ@8_[g&Y{% @g@CӚnO=['wۓ{ 9?< |L*4i@$IĤu97q|Ї2og?\QЃruuJW;FggQ$ 9\d#yzY*z`5f2 ~'kd.h,7;z>oOӷHtüT~ip5Yd"ǏRT^hOsD8i>Lz&%+dTkJѿv8ft12t$xD(a8˫Wϼ/&ɱf~hkWx~sj;2bpd.+ET){Md׊=qsFJϖ`h[VF@|X}Q6zQ3cn5s#EӰڋ6}aϺ~8W$wLƫw JAl ǁA^АĂ,RKҢy@vI7Xvx0;Cv4j%7Rls90ΜܨՄ;deCJgbLPR|չ)v,ϣ/N},FA(݉^nlzbhadG;vDadp>狆z#ySmdzܤ1[<)@G[sFIF*Dob[NF02j-sճ&T-nµˌ:5':&O1-YGl/J氞AAYQ3^;]qDz_a_tkL9]Y[MpgAUOeUMXj˴z"#i2g K>[ac,V TQqfKh" 70{$߈!3'RS]%[8ly>j WryJbIoitSuD;*IJP\ Ts\$HVH{p=Z9+I@ּ/w%%kEܮEIyp!Is{U-b;2d$ֳ@ٴNAȣ5O:!:<ڸ]7oR"nf&B+TQms"TN@bRĩ{@;Sb0_K zLHWٔ-+m+w*/bP=Ys$ V%CZ_L hR֤8v-'CRge00#CUtP?8-jsFJFnA"lBDʖW 8':jFI.D+ETԽױ+,~ӂ"fb܈a}BfQ'z+w 5)GZ8u__{q5$[+fñF;c"J\OnʻoʬucIqFAz%4Ez9F|ho~;)O]$! G?:buI8V5\)A,uUGDS3P 8N믝MrpΥZ57t87|ىӿL];(LO ?N 9D+&\Ģ1F0¦?] S؛q-nzcї@QeMJ{8I\Y[evڹVHV1锷cEoɈ'F|)N7X|`dQF%kT%*_/$y=fa$ ]o9F%{n筢Q(gBv9.˅a9c;9 KMV(FfOя ϠO|v 8mwZ.T+jCf(gP9e-('=["Z n9}LĊ,̟6!y>Zߠ6-2S(tG{Kwİ'b[XgVǴʕ`0̐Ccx_6i[\?['sQkQrjFcadZ`!nO_*FMy`Db(2O-j+AJlY$1D|X|C|(S_ %",Vɋ9J}lJ"H3>BŃy8m /5%& G}yOAFNou ^۟( *_-D +!e3:O^BL.UHF΄8>Dܱ|~ϧb/xMp)X͌a6mYCZßaT*6L=/$EIa 6T^9vT7b$Z}A\1oG -I~+ȋEnf#}i}M[ r䵯W_Ex0z vƋJ ߩ9K 7}܉2kc^;w$W  h)ȟ8ѿi#+KB?]eFcXWa.^ohe0<:OwZ{jj^1g#Biu< u>KCm QoC% ' 5;/G(ļ$/}u!e@;|Ոf t[<5ݽ*pE ²=%Qƨ"d\P %ȔF~JadRrA#s:0aa;:6o4m8]'ÑgO{-u]V3+ ̺>n2VEYY&8Jo$8X5U"To-[zboYc0kN4W%'"AT͡7VP;(f2lYJƍmu|v)>+ˮfO k4OVʗaXWD1aB/hpeA5Md@wi*E%*b ?Ύe3uP+w3sCjXDԘWpY$M=<ۈ]~K)0{fʪ&:qXB:EWm5Є9ʳ.&3Q= ͐HZT^":*̱}f蜃K;=BD*GBBZh IccCǺb4ș? N]QJS_/EK"RZ%qUFNɍy7so,<؜tna0hB+qBMwG ޖUn\fHmVbWb`4K{ˡH{3WX caZ8&"`DkNEYqW*+ =0{*+ߓJfRd :lM!m1>4>Y%᢬ 0Yq/qv#bz­|ZobQvp23ŊWjYl݇7|-K띥aĕ\&tY41xcQlW`0qv<[ ^?t07J-5(=})ݾ.ZɓCXG0B X|O-Q&7>o:w+e4T5g\b&~1(5 P8u9fhFv'Ds!,0$6@GkQ\%?T:_26%ѵ0v&aPN M85@"=q;-^0̽c?Ezm60}>iLlwyZ}"Ӕ+×*Kd2r*꓆3;z.@OUs|Eh+^j(H}2>$4td nnr{'`ҳ*'NTz;]@rߺqOGi=Yʶx9㽴Y|Q;b7E'h;-Ul*́) b4k!7g8AVloTjGqKUfJ xFSoQV*\r~ߚX"Q+p4TG5@p6a+^uM1@G$l .N{1JWLRdqD9]mj8sZm hQ,14+㰄U{15+ Yy. qâsK*T) w*  \Q IPQlA̓a @t%K] 1.1vtB*5:q PY'[_O*0!L4!VbÉL6cڐۂ%L8 ~c\{ˇ4YVlnO`tJC3zRF 19JY=k|dc\i/!S"Osip"M=gknz̪/w¼=B\giCSJ/3甭:}@'?gڕz߈LU~f `y&C)꒛ Zؖ1.J$k' DAK :?g6W5rCm :IaLXo0v:+f(͋'p7kM4{VҷKjnudoE8P k%~#6_r~NIuWS:ča^:=>KACcrD~cA7bvў[9t[>Qgҫ*nf8R[8厧T/kIu—7%e5|qDlsڕ1}GL1Qin|/GJdS ۺ`]2hfAY/i ^z*P܆JG)w G_U_jƆrPr?hpF{(j=s_>񝃁Ĥ}_wxITV ӄ8W̱.T[/h74jhX$s:*e73zLP\XU:Sa]Kf ,pkh<@ZyO΅y2ţ=̇]W^< +jbn^Mi1QӅ-.\I婭ALIZXz!2[V u /)"ʿ~vwK;Y9 ˞lyq]svUW=ݎ}^P;^=p h/a 8h&ɑtBrO° .SechQg&gUԮuŚqt.%F!@dТËJZKU/?CtR _b˶HۊQgw79 uh`jv4t|'ۑ{?aI3U-VSGlL>>>>>1~=*G Ay jE,hx'u$jQ8 Wr㮨u{t"cs i7a@8;Q-0JLT?e]Avtڊ:W6%$J5!UД $|l\uB>aOay{~b17`uڞ; kjxbRU3bm9L<<5 #2 1̬}e iʼHaL4vE {__:<\rdWײMbΎ|6 1+Q$*`r=, GOtc`"IofO ?]/z66Y*rV}=]D(ve/1[KH?,gç"muPdkH3-o71QɜT[<&8]K,ٱ[4RIߪb6 ?yy;\jU9mcQIZI `^' l,h*p0"*V{` h ZÆ}?͠8=[tCg,FH=~x=";WFWU!J)z*:&Cn~~R 1s1j [:ߑo`_ԼAOəwmPG?X?ݿ 'koԞv-zamSf17Cf NN[^W?N&UAbDGf&AbR2F !dktbe | 9ʔ5,$8)bQ2眒zZƺTZKF@T\#xh49AނBqj?BJS7^e$:ifEmdoM$:lBhDvH Kv?23Cs4)eOl{63T H%2q7Yn3alˁTńOl*v V_R삭f?pޥ/Ѵ{AdGe:0VzDƞyz^vg7,ݴZ/DXWG;&Y;1Kbk(jI{Dd4[ʧFcіx 8| hlg'MƄϫIٗ\?l`T<OL~y<0$*`IC:M",l9Od`'LMUcBsP;jdXFϖuNӈSvxMבh04'>;m]2]-&/%mUB àE=> _}Ho{"U%H-8lY‰7̙" Z* r$/b}-b/+sV!j- LM\ $<9kf41kZ)~[ss\*aY&N.L~ Wٕ2cTLMW}.uXFOVխ OhP / :{}2dNOmʛ2À hI 2XNm"Oq<'hi E]Bm~ZazZVF8nG)~o {WXQt=![K2Ϡ$͗- h4|Pˉmp$wFǛ"єЎ$^CPO5 vVD_+x- 4Jz# Gc' b˪8aȹf=㇥ȁ5 HFFkF1Ҹ"f6gj~Jra-ň R6e?k|l4o=FY|cbIzEq>/D~BAHzFM5OŨ=l8[tփTy#_x< w?(Ź/_f fIf.mfy =庮0M;?/XHZ e iZa+zZ\&ڵٱ$=Z@G߭UB&퐌㘁_4gM%~F>J E@Իy*st*5+VUstNn+M4+k-ͪU4yiCvj-?JGm3 yyn,58ڡj߾XB9mJBRGS+Ըԣ\C&S~ZbA;&0+C@q@Ha.7e~t@(DD g,^ U|偝J"<^0æz|Q$İS[C#"+WIE:aPkHJSyI^Q]yg>$=< @lm(?|޴fJS *N8W#e=oozJJ?ur$(Ԕ 2׾Db{?ǥb#Ti™o,#  @wqin*_c0l`Ӎll09hpo'q́k |El shS\dyS8; ndJx\O2AƻdGbZqgDy&O ^ :%Ғ|PGusr rJTZ `KU+ws7C_͍J#{o t){v4pݴ\#zW-,qIp&J\҅M&p׃؋> ؐTj{e*o>:WPϱӑs ^[=ʽ:M-{cLӽÆ,M'k(GW'p4s.C[\O~I ~ -yCɚ;ǗU$q( %,(Gxr`I{Zz:}FRtNyv>$enrM?{0$~I%~f,Un~ZS}9m)r% =nz^A2qLBg=F;f&sn+xƅ |y h { VK4<e.#N9l%$z.]k}fqj&V)NAWH&9燳:Q2 iKo=lSoKyx%o6FൡX(.ʮ](7FA<Д[6\pk^&3:ׄ\fJ (uۏ1f.]{{dz~%R/?=Tx1' #i,ԜZMRЪ+$ݥl f"]&>$8X$"ЀDD!LuAF17ddϕY1$0Tsl28ZAy)P[QSb'BY'(>-^eYh(C$(~=ieOAeΓ%S^&ޢ!|3V+2(h =MeDVcfu< y%v7j+[(U%$ÙkHToOBʲnsFXzu*ԈIK}12uwG`I_`eJ*'HhԴNyl?b-o,(|cBۃ*%a fsc.-_lZ& '.v""JW,aB8tI=+C»ąc43eb]=:> YՑ;GDJ"^:u :Ov%?wgŭ~Vh h˅(v-\_ e~[@:PH{!l <g] ;i:\Ys+#S7J wXn'OT tX)\#GQZ)HwӲhܳHKRb%k>j+|*UMk#́"^&57OS؆z ;%!R8{);$F9iO ZcT EEYXQTx BlhE^մ'="WE3!" l=,<[cun2JPfג$rED|PWw6%JK /0IN\ѐ2dӎ6E!aeZJɕPNV@] 93ذQ: /UxT(mR IBfNh8" (Y8Ytr=ll1Er%oUҴhݕJ"9 %HVRrf-j-0 9 G q}Bݲ6?vo c?.UM_JgS@—ڶuKy٫Yv?$X Fk\t]W퐙BDXSl9>~9_#(يfH/e{Llw.Y.8wUf8ތa1ѦC!dY FaV;4F 4pP"z\3aw ;+v$CrjadjGH\ 1q$wD3$^z4TM7͡7 :h7R|*1)ט_xdZ4LٿRѫ-S}~DoɑV͎evpV ˄Uul)4>d41NgOn]_344{Ի}[ٓ3un~cc+(*hk{MjVF`bj.ԝ[#w.U,"<6 $m"@WEO!2x5;87j2 QzEwe<CGx.y W/ g )Qc dD}_ԉ?`,F2*܏}uK,ꊉ-LλXT4LB>EaW;yC4cssLWߧ¿Kb=x;zۑH)^Xᅋ~?)'.vgY7ZX6킞'PRz$o~%rJ:cA8l(d fyRWj]麧:=3#!@8lSP+BFE^zAjvPSA1.gvcA"p]2tp^ ) e"!&ևB[5 )Zozs*v9lU7X6ka39'oGuQ9-8Zmu,4m ͖/ldX9biCU-(;O'h|ӥ:._s)fM咣2mOD 4Cv"[ljG[':]dz `P" JV-#!t-8%mȦY'y|7UƨElƭxJ'!`E.7wEC:ԙV2=U?6E糨=!WGfSRtَ/aD Q3 es({Jə Zϝ,-'u|$lruz_j`6XEm&Ŵ'GdjdVWP}Po#3;$_>Tj֛a,c/0y*e.K(}L≦nDfro/m93Co⓿1?/?VK>T#i /0JkY|%C3.Ӕf)'C^w[/8)~phjlt/"xAb[vk W \mA{ إjZjeUi Dž6;2wDo>65¨HeҚ"0R"nW!z«~YB˹Ύ|F#~6h]sgAL(mDGr~O( X߄j+ 89VruT1|.D$\+X:%.6ʢ>m,u%8]ْCM?+g⩐IALъz[Dz )IfWZ82Xjљ: #lRX0. o@KZ;Cj:dI5)OͯIq"@XKvQ.+YoU_)y=ȳ:$(ɠon.lW~<)S]sERVܹRwbs-ƑJC0rsESc~=,ygh.9AlYtI;cQDGL'҇"pӌ4yZî@WI2"*,(k_:[]sO+$RӰ,Eà*X.×RȜƸ>G#͊ozz[ ]H_8+BS1%B#91Tޗ0{qIB~_+m!aT](pUiS .owyN7O_`p^?]荐 Ѫ} %pݓ7q3R+U()VyřKs.?$YȢD\>S z* ^B (()oAwszoj%mHs9L5>}tu:f1] |sQ]N?FGXlUm6o80}2Sq\"GwƈE. ) ۝qɖ+9V` K@OSrRl9l0oS!?{wfzђߋb3}@uZwhdCbpXjP3sp.mř%E`;9Q_0\}xI_)_4(?M1XSLK )'mtڸ貄%^0;%އJJ3+ήv٠Qnrm7@|P)EUm{M!VERM[6P`xݣh[H"i ni/^dy fnܰ킂`-@'XOI;#D@˾?#}'`,)(vh ַ xB/2LVߗ*4Kرu ̹z=UY6it+SNow&()jYMx|)KHl/MM3H4DLjDRKgINNr-Z_C9)2ڶVk3@ɑ3Rl(tLϴR\IXSݧLTl/rUꮤr?ivbr{Tɒ CF>R4A$h7 Mʉt9ň  +à'Adypbo3Z|k(^/nݺ٠WQZ-'v tUkzRU9^bF||Y5ijE9H#\>(J1o =uaYn4j<Tᘝ:ѷQ$Ɓ4XrpghPpU_ > Pw%\'xctFBN uuY[ZU6JR:4>{ tY_wspzl Q4Wm7Rc-Nrq$dĞu  /mV9k:_nC{~!LMy]>-,1RIV=&' %D68GE>{#Xa'(a,+řg4 ȯ$S%~c*X$z|>P X{#Yvo1(cP-  AdjS_ Vx~S& XYQ Llɭkg7. 3>JC)(aߚ:{٬dL%(=*_n=qfHpbA\e_t~\QCV]uʍBNm!ˣr`{BФoģ p?Q!q3(s]9Wf*3a}v/YBcbw z$ݺfѸ9w-!bZ"{@,0RD+qb#,2-WG3 TzusꎓU (Ul6Ƨ8"-= ^3˥p5s &j^~( JUwB 5d,'}d,ț!Qq4J0o3{5Vj,\?t=HA<5jU﷝Wjq7ߎg<>L/Sq6T}-1 V[$F\M=k1hO;˜ܫPox-6">Ee(ՠ,tt_:[uGģF(1곤Bn o8Tg-Q >ZVnSt"^͐ L]4q}ƿ=ݻudmt]-k#/|k1IG29%"Z$ͅcb? H?j#@Xz9mv$ݓܨ1n1s ˭H=d 9r8k<ֳYI`v쳂V9aR,] =j'D)3i!c5 ~8J|e~ES*ב 1·Ӈ&VGcVϟrȁ˶2-m*QR\!ࡲ=Mp $/Z-c3jk(Avc !y/bGV)>28>X?[eG<_nSx S`R*[9oAZ:HF<9`dEQ!\..n9c#国V _2%^(tEB~mOܴ^C)>[hKeKRXr;_qMl8AG4)oig-޹zxcgS?+1qHV}XRvk^_PH<Ѿ ϝ30znc,det)}ѡFCQp/Ȧp$|Z.l"F4LOvA=/:ΰekr^őj܉$4(iWXZtI՝$: Xm.|4Dc^v Y@DSc-)Nj9ڠ}&RA]e{2q&,Ǣr3S Pݹ~S ¸\B*DP1a.kيAx;O{Odn®`ӒW(b_Zl6 X #A E͛78yvs cE=6fyVWVh,z2D !N 'CYF/ 4Ү (&v.  ЋLf,n+͂X\ߦYa΢k׮̚RL:% fuJutb ǢdG dZ'i'$r,ZGYtmzE}Uy* T,mq\Wonh/, mI7mA1}MC8Ns̭vK7>%. MQ`&dZ k`v~HY 볁gvΆJ9ZK˱5hK43:ȝ'ehSo9֘ >\$eM4`O_v6.zɟ`GAy#=eY&됧'Mwu0{D߫2tyGr,{Hgw9$#XoEK76)Ä6p1vKa2Cy@5RU-#`}!) I^ a[n<ŭ gΖj|?u !ݿ{9*YC@LOzJI{hX"-]ztu32VR: IXg&G ==I#6P+ǸlK4G5Ƀ+}*$`@Kߪ+;;/˳|/ ;~;nU=eX,Fp.qZA~ *s`ZЫ(Zu~5(ΝΡ4!A;SZAbSD3gA B}0I8ٯ W@f׭)]NԣB^<`E^Xk>ʲs`l!R`؁1d1̦v2TI= |Q)`=Susxe%כd5KӉhJn!!7Q -uFZvn׫rPȴr02N \ԤH S9[`n҈N 4񱴈hG|Auv6*ĿW j0 Hˀ'H\ :Bݖ(A-r92:g4ީ|fq}'[jS[WBTK"T8G㑉9Hʀa fcwNt=BEq9UZW{)F]#ۀߟMZhP}+==VQ' A!=5w^`4Fz~cAzg;oBDWp9Q''JIxtBmk^9P3 %tĽc\U;3LwBM9r mD7LykK: >>̔E5 Y]9TBKTZr'vgB9]ˬ`#^✐t%&Z.y\;~枵 nVU[F.#6- `5sa}cf.,`¯;#\Q@c lk4¯% 4O#=')^rǛ.CǑϹ { Nc[uDsI 1c31[ },< )6D,2ڑFGE J & 6H!^4!|z1ѷ@=tՀ7H3z'2SސN_w{cJũ5DGRq-K]Kx$ruC U3W>]撰5b~~}-l1 2pViʈ_B4YUҜc|Kt݉4jj(**?Bewtq5̛fB?Zl}yp!~HsITq>BQu p= Oa. t1nrZc*Q4mCc*Atcγjkj@ :JO[Ag.qfI#ȳ+O'@Q;|\r:`B#cTׂ5n@;g\$W~wxTN)PJf&Nn_E}:enNS¤z zu|fM06v׮Fo\a +7qJrkf{@+{+D?w22-4h0OTU8`R_Or ƺBnd-{N xM:UܔBk'뽀3O(rgUOP&| >kp+UiψZ;藆u/Ӈm0_@dgyзY4j}[issalLfSV7_;EoW[8Ā#'/@Ƒ 1PeaZL睇_~^?gҘQ8H\UFf/@ui̔/ȣX+{0#RэDpnq"J2zDswEkX:۠[~ F[N/BJ{rյnU?+r:+I+)EtSJIlJ-EDz)UhK8hj}a06yY'Kmq\cöԺg̪i#M=v@.17J+1Cއ̆O6`p牵>ۋKK{qz ݽg:*+hZeϹa9K} "J Tkďq(t!ؘ"<ʀVvE]`*m'RC5 7s刼AYJKFag,/B pԸ&(~ڦfBRd/1N>.ߛ7.ƒ,1Ə683+f #3OҪ,\ބnb}D[G93-qufAh9+"I(*e}W_?WXk.4"oT4#~qqڴU4 w#ߛ4PB1ƧaHq(vjN$yEm{F㙚$/oռ XyNRJ+`>G&w$=2?Fv_J93IJ("}J纄w]~t9x෗*}|y >&lӤ)zhznv_R57[8AIAhLC쌇)k7vjfl1l}ZTғ t\CोYzk A /M).W87 4 i^]r(QeTИ~_nx̰>6h? u=U`4rtٸY7Y+Ցuq~=lsǰu,&BtЛD24%knm;JɖU% 7Ð47o,e"*@MbW {{#_%VSڎ佾t4ظ;D$r@'c_x8 U5#<`ˆjwSw<|jp .~Dα5g>v=oEFP?̾/ Q< #A82GNMk65l_(-*12e!8X%kz)Zy#X#bz%Nl-u}I=4`.LA*_V-SkjzsaNAA[r*х>'Q- kֲH|."tk0gjf4Tlwapn9UIߧ1"eYa CZ4K`ʔX7Tu%6ɭ{ba.wUk]s_eȁކÛzm8%OgˢRMUz:a{W79^5오qDϦ_v4dMYfܤ#}A2LU/@`S[D񥭖۝#k&7c=D/~H"Ę\xt"T%M-u#+H70F8Fr)JB]RBˇG2xӇ7G#u%ǶǡQF&"8֎L%0ֶ}N+aj=Z=>b"+-aV2JiS3Kcial5#OPVV.993&qqyJv1闶Q'>>xr@5^̹s^ Eg"LBRe)eq\i6wfK#R2]xJap6Xf߇Vv[|\M uB(NmՓxi' 2pIQՙ%Ƕe cمakZzG)֙s%> -O;P%!mD&szG^k{Ł̳dT>Bnb?#W+tAw۪{P}g #&ݲh @e GA cAP\o8mx4,Z7<RBGwUq۹Eq*ƷҫPDu q bs[ )a]k dn3". {K^ YŖF3Xy/(U"ͯ$+T$ॡIJd+b OcmV! yO4NV~K<߿f!ىxkhNJf/- HV5OXu)LEBݬk.?) 0K;cy+b' ~Pg;JYkc )n9m?tڠcTk:BH[i be1ZU[yHs~tJLĈMY6Lۢ-\~P[cz,ιbbSTG$ִA{Rjc;n+uxKiHyLir!׾bP1)bq>;~y=s!tðz?r7x= X zk?fN8NRAr`H0Ff}?eeZ*Wۧ٧6kKn;K%= wN6=i$ [$;3"q`4g{9Eal\g|>$)i1 Eo]8|S_R eWRcz-^|}S~eҾ@(7u$=X>]ݹylyJSh,-|h_iM4SuSb(?٭,WOFL?}!өӑ&=_ dN CxILe*?i8vo Y7Un(Gckc68\$]DmF$r q<Irw~v &ʵFvV:V01\/Ͷ51_xgJz>v"T=VXbJ צ|0wQ#^z34dH'7%9> Q9G b07,F0=r\R_+o7ZY>@<Y4&T1GWC\3XTA9'Dv5!R>/)sP_.oԳOr.>'ŋHgֲ}_I~HMR""Mà4̏8W`n]nY}x)Nl;IЀ pRi"gHbЇ){vbn-ic/йeuyՕAXlFT"h*3MW ap[Qa7 OkJ ˱b*XVkra,.mZ\ȆE5+QL I-ꠝ1YmzmlD3Y\Gm\G?Lg?5>4u$(hR-$^iO a=0ss.F1CmPFT%l=\ܗ0n<~J* z$]DvG%i@^*֨f49v/掽G`IGΛ""ɻ\z_ AvX4sK%6Q h1@"ɯ <Zr}ĤL406$C^*Ņѿt{ݗ%#y'=J"/mIːz Xsh7F/fvw6w&tXBD8TDOD.X M ̉zurdl aXI^z{7c n #Cz` l3i2n0~mIH=^K=mdTi'!#W4:Ҳ6Ö'&>L:̧-"uD隅X2MbVUQhnmvX`dËs;/@K6Hub,^K=(5;nJOb8NsdH:ڲH*ezQjl(z[@phL-.đ O%,1ϼZOs3q7-ُv`2)-#6a/jfW`#Kآw#&8U1ՔA" ƈ- 0Fh ^Z(s)9w,xif+T=_5; ˉPh 8VvOlKDLJ;oڭ @^ڍ{ooQXv@,%-M\[5\ Ǘ-:y*a1j&piƦ[Z-A5U@\LkZcil׳ K`?baS2`/02 6D[d >Р dԣ &tu(=8'FDYFGd,Pcb(;x7J&5brM0A~hess3ӊЍ~%wb`:3[AQ5Vz ,$K\9L.c%\A\X9Pe^imQI_2f\U\ŭ<#ED\sl.fՃg"O%L 7EL%ExGV-UC M0Q椉*V#MEǮ=hp~0P1\nV @¨}ϲrC*j <n@28D % 2!WB,~K6w~ XD1֞o>j  OIuRc]\ޡ_+uDcP'*c%,Hs=D{o0{e1(ܗRbGs^J/-|2bߥ- z҂⎅22}ϼe5M@>Ud i~<+N.VQR6,37'w"<tJbºwC`^9l11 珞;u__[IRV&DBO2?(oO$k YOteVh SݰG:A)h䳰*|{mpAC6VuFdOKXf*ck:WlbKdFk-0:JKTwl2*Y wRIy;I唍x*ƞ[p}|\xzB5zFI9Wᨙoݎ?SGGBqIyyaz%!j$(ፁ8K6ZqvIwMY9F͊98}ZYz"FTc'M]*n JX BAK7zC(!Tx ,cdJ Gx$p:Yvք # 1OW\-[Ƃ6vbe뺗Rn̳1W"TOyԐq:h^. r՘s vPI]l{:vKvC8,k>#B5P`nt@#8[cS2|hDgCq3o@'pO}J %roEYdD`*S&HYs;dɘ%S/ƯCX>"lL1!A V {-r]$)Őt&G#w#i V¤f)K@ŒKG| ýhQK ,2"\C;Ce@Mԗ֥Ey:%qKL qm4j;Fz9<*;BSR_Hh#zȐА>2.oug'@snJB['1[l :qϼrx/C%O#&;Z&zqgT|lKALvޭUwDo73.3RD_X DkQ|5۱KC Iޒ|s¾0=O?^JHɻ(W7AZy}B}jLJKȏԡ:S媀1"Xvc1f^,jb!ۘTf4FS1pە\~֛I"'iXOl0pu q"He`*8[7S$@b_e0=Irĸ|z T#F!$м$CvbN{:j ˧Wٙ)]Toy^␚I("]̅1FDŽ`]h? rQOS")!dOKwA9[)ne]rx@H_P'?)t7ZP-Vڐ$90RnCex#mlk^LW)l}ӆn sV'Ÿ|+E7yؔ?)ԵpWEX{={@QZ:eC1nwٹ%v_&tWgCR>ωQM7\i<׶{K;شIK1B<m)&i x7 Q!(ߔ?t8xsJPשlmx ~ematJA &}NJyO5]sox+k\(B?g,0I?A-h"Ei})hGOV Ye c\ 9W%:%dP[U kL '7h42p_by/R,D /4{E9ݘ>1ۧ|, NW%M^jJq5m+^ڍPh(Gu&XBVǡqAӧt`cr.<׆}\LRb_yG~JvCvzfAZ}٠* ^\+30ro#os/G`x)H5i ׵t6gĴ~D EDC-{oUC9 be!Bއ[cbIRqu 7Lɠ*W_SPi'Yx.}᥎VIO Xjrg~lǽ:p]uM!m39BݣtE):lMp.+fPc\xu}cӹ$?s¨+qk~(&\3>@ lVߣVfq Q\a ̷rfW$yg\Hmj![E-0E"Xhdzy3pnY]mFa`iD- 5 [gDxBLY3~jtb<.7A}FZoXb^vKí ڗ OEӛ!ԮǴ+)v;܏NJnK fxoQHR$CȬ.4! ]A#q0_X|ۗ X"=`剴NK5"yjދĀNЉڿ\kwr Ve<Or4< x;Z X c$*UiUfBUᕡ!lŁ,;PbnZRd<)ikJYP$Aje;½h[7pz'Ή՚Z9v١r o/M14<7`2}nwldֽ&A9˙zs3J¡7.0ϼH4,:oEzQh &E<' b|;J%pXY+(%/|y<_Z1u5)-k3܃zwaKo0JgЎ=cD+,+(ApvW UثPz4-{eWfg2wwHp@6p:/؜ zf#oΣcXlfby,@>w4nKB@NVLM6!Nϑ ?Yuc83N9tát4 eY7>\FBo 8Ӄ=]p:C\FcZF}4< tBxJ&>G?vtdkPbY(j٨"`~F|`QĖPaφs \b'i+vOyʸ$;pY2k7n-m|x! PVZGGM$֯Owe]fSBh;с͎Ւ~ a")"i\9TJ UIyaO H("h5)=lAѧ yA,_N7&aFnnS@9lHdgU7<"OW ອyր ~jqcgkb?iWT~pO-eͱE2FL=7KtRY>vl!ʙaZ7w BK&^Oީk'@(k݋F rx:4ɇk荵QfՁIQ+)Fṳ*:/s r8lLZ7Sz[iD*@ h@ڌ7cfYXn_dQZpD TB =U# n7J3ڛW~\ɳfu/aq"nrZPL9҈B;@Kϙxty+XAeqn^F] RǔL{֧"6hhkm%`9|lhKݷ5yORF|wdCc]"nZiVi$'c5 >}Mӆ*ڒ&꠵7ZuqdGӘDjgE"z'ͰF;ː"\قa8i*ǵEyb"l Ov#gP$lJBwsj^4')q nձ!_aCb1 $Ggl:q)(ோ #qYHeŴJY>8s-GN1:JZ9A#5']fD"'ť8?2O(Re2D'z2R6£m~gwq `*Na\5{9]d]I|W.7t@ ^! ZV0OkYQ=*oxDڥ.kL``A76;`i8!ЀLڰlXкsaxOxE|w{Y3ԢfcO[ފjC%\pФAeƵN_kȐÔ=WؠBVaY3 +#)<&bK]2<(ڦ ԙ@[VVHsvݓra#Zߤ[3n:kqԊ#1+R_z$%x㵑k&Hc \aP2w ~^$×GAP䎽eki nD}ua!1gӒtlc] .<-߉a`F/SF:Vn%LWEMLO&)%zˏi. _ˣJ9(nH[*q4_!Xg"'h9n `Bs>!<78X-<{8zf甶>,duGK]p \+jѨ{jjvewmiA7V{h%181}\5$L~a_ҊH'5J wiPPr@>_3V;Խ'zt9ys\4p A'[ʆU&FrPS[92n=tٯא=닏><YkzyTk||MX urlR-^Ϗ]`MgFYgv3MM3Dɫ@CgmP!UGuQy*%W/^KY{0Ǽ,Hހ:^;ޭ㼅wKyDwϳ}W|7ߗz'` novSk%R~|oxntV°k⽳#: d jY9 B܈V]L'Lm"[ Nn>@cB/:F`CZa3ު%gȘ4#=sGxSb7/)n-Kjbͥ5ֿ5 0a< \Jܺ lOcŬx1 sPT$ (C Srn ߣ\qG0E՝q&6xF0 DaURU?@|>pnf߸>]?v߾>G# ŭuN 8I"7pԧ7׏4%/8yRsuc(. 1jGpַl,/ƾЪܾF0zp˔? `|mmz+pIͣpp0t?vN0m8y`*V Tbm*OY23a,}5M,Ge3D%{o.!JdGKufVv||ގ7pH7 BߤF$_4sxS"\nmnjH7%,QqiJzdl 0OU8'U$M3nt!Pݗl,&zϟ#=ΛB=:n/T'KEqHMB>akySή H'1̅QΪzӟ()eϊy]COH/_knX Ac .j=G>HR^*H&" `E@5Dc#mLk ق% {TqL3=NPv#q c8HAg=x&}Z@Z`>=STfɈ;WKJvl 7V)"!ǥs:ttB*QA#0X#RjE1h0| $nVlpaX¸ٹ( B =?5$K~P9xU6 Ap.nq[VdnU}&x_sRc*a*`wsD6I0cNU> S ju}hY%33ƂH=r.|O-Urw?'"mOf|A`p`p;ZF1[=^G-&%7V .kpe;Wbaɗk-iDF2ɻ2tpЌyjkyM3`LeHU qs>h[֣urXDx{V/xvKSv16z0,0〵l->:aVl}J E]C/ijQbI׊+сT 6ϼinB EY-UrGg =Ǻ9}uՑP?``)3omTy =J{}p%N.Ex4IqDu_-n>Hm|1͝ vri*~W"`w? D^A@R83tI>x )݁P?|=U\SRzb1@LFqS"\- @E>T)B3mZōHO3uR<LW:/+I+'巰S]]Zwu?[20&pP6@HY_+-.z!Mn$+C ,dKYwwZ+k፷ RF(Bp5Xu>, xRd.nUpkk?"6<Ɗt?gn껇'|ȒIa0R^mLN#5JZOo Zs`_ Jz"NqF[ɔ.ht r䦮^#B?D &~(PfR+ZώFwm \ t&Z$0Q<xU?P$ٚi]D~$< -ll'oYd3]xV_҄xAsE1@Jg$dRۤ ďsΝ ;iz {3II-]!Y;>o' /yߘ|X+JԷV0ik߆/RZ,$htxre&d0tVk29B`|nqT /h2( 64byMinW_W~zQbc9ETeX9d$ YDi\M޸dZeKWp+BՖӦY.ݯ#, _HO*oS*Ұ.Ch4B'Eɹ]qYSPU-{'~K P@Ϝ}N806qajTM4<~gvؕotf|$n rAܥ`/Rc, x*a z/V XGcAIAlL[VVXJ&K3:8+Q +:a2a`T sKAq7Pua - Oż߃ T~%t5}cnۧ!ELP Ĩhn:؂t%:2K}f͔0H"zB޶4F=شEK:.,NG=9izvgTVtwhĂFM8 21\ɒ8pp)khg-d b$TտJֶfҚ4V\S;ǟR$揣=SqS|.N|WDj iC~вG* n_K o;̏lkšQ=A*{ %7PջWPMJiwGoGVr/MnPS֓w2~=o;Oj s6QC0lzr5A~pC@9_kYu_bP7\r9J2 LM_IoPeR7:YPß/Q[W)I#&_HFBy:((by"5+10S%O<;2FX9&80# *MFKY!~'Z2! P/tġخFY+ţL.{2w V-=ҬUm ª1 įz`s!nQRh]O|&BȚUΓ/P15@N(DZ^а^wO+Pµ9ht#l@}߭2~ VY3ï?9ϕF3eO~XUŷ ە0]f+(՜BU{0vN+IXybMjcI bkor@wոq *ȧ[$JM5ZQ. 6 :Њްa6gD=R'H+;h^iFz`v_S< >l:Hy+AHļ7@i~=A F'R?09PJj#j:-6I=u=(6OV$D᯲YّGs.-Ԓst#KkQ=!u: 2n9x)㲪QDoYe:QEuSI>_$5JIֵm* LU]ȱ֬ Wb2.AkUy4#M_`w6WEC4"< @7Y3Z kh2x}%J^Tj~UbV}yPzٝݲtE|j(f+- 7)ScV[REQnYwMU2W,)A._mX 1 yr?2X纗Я 4Սy\W uw;m8W&wCȭlA8~`W$yJP;C3~qDk ~+G.xo–v7PVylZ!)O>m'}3Ӆ5• 3QW?1ߎTP@Cd¡lbmatr.w<] s/@Kaq9o}xgA=2'*y%=Kx7t{OLRD#&8L=PtرL+q]bӃZ:r^()nY.ڔ֙1 ˘ϋu<<*\.CYI蟀 "Y 5E>x)(?A /{7[l{|roRDwL374,9+9l({[Ry:<ż>4;}YJ lv"Kӷ&*MpA谪 k`}{d׹K{ۇr@UɟuTfx.|`pz^YnU6E]Z$^8V_ }o4TXc:t\?:@,Egir|.i:ޛEWٓ;rC^2?IUvu 5=j;W>#0S V2PH޻Č)llt 駌StϮ|mK%ҕij̥4*!N8?pnl%Wрc{M3ETpdgLVR89ƐHiP f@ђA/rVU9' 6x "'K#K]HPntݡ6>O#zev=Y9HtB4r=:dMHc"WXEnD6//R0qpahcLiif79o~8AF1sADsCgzFBl9~>#qp[EDy'Dro?KYJv7ڞⲹmRT VK@Ѫ$L1={- rN<޺ [FtaA9&_Uyx\~Z0,_D lz/B{)T` \}+ Գ/7DQmqOI:%a 7bb|_܅fs2c(famCy&nD GrA-D,4 aN\ߜ( Z XYMN7ue |TXBo- 96XݪGwX,QU yBIī` ճf4F- $xYW(ij;-z [AޮWjL8:g[1E=3\"ڼ"?s}Gk$4uDD&F|IBg\yLAɪp+mm( 7Aӽ@!4OXYFl 1wQ-tړ5Yq!d CӚ2jip#4"sbQoMp fj[N8jp푓w##4BbMR1Ws Yu9s7e9{AV;/8'3|N@ҡHM?k=L[Y d܄1ĚZ-rDn>̢=,;As|~I4 okbV{ez .}QiljjSFXpw rl^Ϊ`d< <')]O:)ww%oqũto$75߮9uxϴt[{ͮvNzUaK1΃~ wR R(9/RD}+Ks)^cVd|BZ2E Xesi:,57fl@_ ,#Jn$~,~p44\CH5ylw En}܀t8LGs"8lb[V]CiM^XLd56A}HQ&/F an 3tL }r]b\|غZ/D"vBidWo]uPG)-4%d6IʮX-J_^923ชH'w}MZeܪxx'?:}cpw9?.x6U*4SW߲s < jZjdc~ S`Y-XM-ʧ,_%Fq*:O-{G?8/:PQPx[DmqPhdiDOYg@2!|0 8? Q趃{O-k=vdV@D3|Ԋ_=^@\F͇1Q#}!V5G=L E]o.)tJḈuhx'JJ]ಧY`ˬTճ#oἅ;ZqI*Nkx>o=`⥍Nto YS>9yqMcO]@^dMH+h }*sn^Wԩb_.q?тL/p;voVO{y'EZry5x l`֧hkV2z7vO+ QmIO\B+>,Oz癁,:Nv IB ݢ[4k Jy.& #0K_ X' Kǚlu^ؚ7_8[r:ֈK/rLJv fU'3?KYT j@y yK]ם?z6#$Rx\%{dcQ %2֥*9#(nq&vS5=wUfCYjt~M*cm^+:c#. 1]m)3 A-2h`4G7y#Nh;F۟+x3p4ӠUJ 蹺<1S$oGvA_]X._;V jEZJ%\շMS"4[b+/L~=A&IF2w֏.P=Q(8կ<@X߾9=j9RݠRSm(vcu\Q~Ld$߳ Z **M ^S]s?.>m| /&;ojCv  X|gNP> n& -N_b΋1m.3tJ 8켉esKF)2m1<<6g LPQ8|eb3vo>BNrZl=};"jt5DuSS TXWIW>˛*,CYcx!ښoV [ ιWYz= z]F3qLt.-ԓweL:ʵ+&hm%g[G'Ѓ7KsL/PpT~1@iPκvfG:7]x=gR5=?D~#}3*vjޯ?"ՋmuN K$_b\F\4 :]17Cq"yFgnk83޸a _WXrJ@-r01 B'=fx!Fxe Vr K6Ӭbv= zh:vB?EeCH q֠ݩ8D\m(ӕcTGJ$i g7YԸzswjӸ*J[Yd3 YC95t HCG WɁZw}E_J{k}N24RЈ5>=Uۥ`d<ϻ WoG] bxގ|K]¶7ᄕ*g}r]C*A(+\<#!'5>ozUXs-ێ'fn_gM-*Gv x>m<θ^1׈[mKCY<7;ۢ#ΎMTr_9Y.|qnçlq?@/b%|#G$hNLtOKݵ(62k@2^&in؈Â}2ԕ {aŻU7|5'};+a} %Fi@iޜZ}m:A3)~s*>`8?0S4Yvq)+0h_Y1@[躐0uS^FQ ֥wۥa;Dn1(Kh+DakLꦒ-*]m)]8L?>u&5gqsq-`۲Mr eWPy cTjAX y!f_[\-n7|\:u~P32!uGlZTsѮ{[d x?~K\6\Jn,jNW* L(Rtx)0^rQqF_sC7J2qjDEd/ѯ"/ &k·/5!gO\tSGptӒܟMu/.k?™U`!74 /g]1.U v =oTm BHUA{cס}<=).𐻭s2j;˫H/@5tbi`Z\+M%8c4sy_NgO1POmS`Ŋ ~zy܏ڶ&k`fcFpO/?$7P۞02]ODwR'KLew e=@=o;(%MxFYY| k1^,`J_p*8Ҽ{T >c`ޖ1l9Euu:jMzWhIWE2P%iqT?܏4%V '[dU~JNr}Y!(ZXGܕv7omb1(I d"v 4{%i8*VPJɈ6\fu>ڋOD]ձS 9رW4k~q}q(2plqdEF+g}o5]|@Dxv _E:,bz$z6'4M<-#Nuk|Ō^yR>1 F4[泔[FH *fa _ q^\L#BIMDieة|bXRM|n$K X OfRv[MRpl̦#3 ¬sp5;vқk2N>x-ِ'wT뚞*m,Osڳ;? 8PߪH~F̗ 0S&Z/k5@̰jGT4dWC\󿯛w3wbHb`M,x!略l}1>N{#č-$pCr,d~pKE%v<0 AH 2OYg.~@$0)؋RpK{w5n"a"X!* `((] $pcuvBπ$J5ؐ;5Uq"~x)*р|?qq=)f9( VqztEcjҜXoaphmжnnGZ7VZ;V(z-Oto8!e񎢍UΪvt;?B$HӼֶ8t G6~`֌tI~& ]M!$w3}呑.bIx:ESQ6ǫgجsK!jT TFNHŜ]S/9QNT 7}ɫ[8 'wܹuꇅy7bY3G{ݖZl*R "O O`CFh_C[aI2FH5;|kZ|}$. j:Bx/|ةPi"},AZ#\_ \}ԥ4i  \gq揸]jׇ$M[kq N҃G׮́^Y1A`)7ˮms*Vk88MTj)aj=T~5x/?+Ngpp_yU]sY,cը2k|שm$N@J@-.M6"dW:h ){ J0{jl=`O|:5@biBT˯$uy+l^@vu/g羯柟ϳRlTL&pɍ:mu ʜ> > e7rW tB_7#b*p:҅ll \pċf˜fLMf3-c ph6(Hʔ>nm}f9 2Dn߳~Wnqn =ǟ6"jB- K` j1):7eʖ{ w`Fٱ65>0m:7I5 'ac-,0iLޯ|42jOka!U y}JZeک:JY,&v/T8N'fׅ | 8ؿ;ŕ/9n >2T]wZFSK8M=6a2遈&/I ]~jVGsi~|*{Gƞm \yt Y''R>힁uv٧U$XA:[ZHSVG@)8OfV\ym~Jxi$S@ALo#RcSu]X&RO]MVK%`b? Y$9Z (;V"dҹ􏗣K-28l\9hDQk%:UU^ke/ĺ(~U0S1[SE`*1cGo OcU7,BKRNEN.k5oG^9}F%Xn1;]fp[̇R,7:zeNW+HXqX#,I$]{Y$eV4b ,l Un4kn>:0Iz2PZ嚾'&Q` c5mنKP@U?f힡[x?dk%#Uk@ߍBM}b]ȣi#5N$kk+eݐ:&X8xz3g!O}:]Ac=:Ȼ'*f1܍}eUKv੖^cL{r富E *L&pa3^nڳQ9X1qoM%= k/`z%TP j|φ*f; K{& H̒ZBiJ%nw,9tV \ xW_Mwn9UD m. .[>Rz׭ĪJB'/&noUO%'VmfY{[a(kƑis~@JoC#RΔ]}A Hj3?!MхBJK ըЍ9q. uIwj nvR]r'vzdAxIeZF%R 73ODc5֭J!.J SvK,ظX&{1iapxi; CH4g/ƍ3d)irH`1Ǻ{ ZݘfKRr*o >$ \\ŧci&gi҄ґQ-&>xa?>"qKbH#?i=$88Wer֑s1Ixb8r2/Nà uW.s8=i% "$w%=H=l?Fg4^H+QvsH"xhJ#* Seq:HZ^CDZʀ5[ N]P<_IBXiZ看zyjFzRg3qE yN$0ϦizqmW*c4<(k) $%(Q'U/ِU> dʼ٧Z2@7ds8* _m cC/sM48ڐ>#Vj{7k)kζSuT8A:_#O?It|0}.D8!FWa0n 9w1]"b,(̴͒RV%iAithTkeP `܀چhZIa')9tSw9\$_n]Ҿw8 νvwZR\ȏsN9XJۀk/WNy$\|{KMϮ::kUjWj]y΋K@{ER^UNu;eK7IXۄ_|Y\77)l/S Qp-^-s.Cґ=ڂ f{GMB-OU }Bb;Ju{Wi,fkU@,cD[e"B ٸ]KRtaL/epȶ"׍\ /@+ ~!z>z=M YsZ bq `IT\Tx-LyrD3bܨ̝ݭBNɶRQP=g\\S3!7?9Bs7uPº[lw^]%:qJ{Is$ Mcyb[:379"m\򯏇J1_'"jW1M CF~lx00L1@(˹vk>_EZr#"*` m {-mbo"R$ԶdYw~s#Tgyh÷;9exJ*֞?/9^mGsֶrb(1[SiXu^td{GڥZlYϢJ8ƙuEIdۺeP(%{\4~U UZYP@Grq3 w|V+- |.^?+TE \\GeيҰB`>gq!mǥG4j 0A:Lf:>Za(? AS=XFNg$Tb=0NO=NK4too|0)лs t|Z{m.JyjBiS":6]džƼ2YOE/{qllu Vr\n E`TtH"C ]4ZW6]eU@s) DI4]*rdQfW[$ecN1}ۻVIZuoիNTN0ToeeɬΊ]\ivz]M`dYݣgE7xQ[ԩ{~8BBoRq+W*5]%YEF窶$ kϬ؂ `*];<[{e.tckm? (^v:oGGPǻc nK}4y*QCBWmKv.A1 IR IToQu,6,E3J:vI( f9谞.l0סd AIAlLC[*g2t2iUG&1 /VVXo uUBЋwsڶdOćz.㩈^b½gsZA D̽.ZCZ؟}JLF!\\wպ}ϧS ۠ת=B-$1!$2 ?i)1\d njAc_ncNS%[` R "=CK$GȈ_tq5brsԉ;Zzc:G*`J"XM0XFPt(>))kE TN{u׀|Adİ*yM80K,|t0[ҳPSBPu3KojB2"KecK#!Kjܾdw 'w/"%.Ȁ];~ƃ9gK1"џ2fIm[5#\o m&"'+)gʸf+^5VCQC]¿/xV-k8?Z0p:xn/8y4 w(Z1WtI8ryJ*AZ ˿qYl]ON2:HSvt-M\Ym +",OBYzO0##zN8=KKQLg8y w~76QXrF7u/ ִ_-M%dxGA=]wR@f!ȵֻrl3C"` .V#1ǚlng;h'0[w UA7v?h6|[`w@QL`hİ\lҏɡL(G z}.> . ]P[9u4~mA@&o]W%/R[vt<1SfP<\WuzoqJVy,>AGղT\ 6Y>o{?&ENчN?|C7^'ҫ*e<'zH|Ƅ"( [\e=,U+޿h.Ƞ`SSɛ[ߙ ֫fE&T$>g5)|?ex4\ǯ3;R/J>m<:p%'zS,@ bMVuŏG"9pd(u} #M6nHuRfwtƉp@ q;U[fH4NIoI6(KwV >8o6d$F֗(w_0'Buet ]H@cF]`6@vN(d1Ӣ$]-[ii2WZ<" .(n-Q[EC ʰ=+=!GobWNYhmx?=,?ʯNij[;7\Kx}M4-\|98`veJ͸oR !1e0ĐrUs }tM֞If0EWMWåt-onX8H~aJ(4W =,X2#,K^OVec~qzLAcj:!qtI//r. l%,96y{8i"%'uTp FpJکG;D,iBP8Q,h@Dϣ?W/I6 |חoG lja$Qv%<]a! ws{%#?ɵ5p}w LzYiP_m қUh2ꮈMm>K m{<;H66 Yev;rAzXГc~^.`]`EHdM+h}sAVX !>9n6FWӶmΚqZ<:';mmuÙ-mDR ClW6HH#SEP?8"ɍb4n%Al؃ȞɤA^z[Y Cu8θo@?lڎ"yz -hrHEa?$#߹~/oہ{}#3zGnJ0L55].F&Cv]uaR ; 8wکOnbx=]%ᕌ@\R1H$ԖSw,ݟ+%jI;cA\әX.W̳YA/aֆ>̗3f7Ҹ=\Ğȷ>AuWO,#TNc-%N?RV:_{./OC~q/#J.[nw"ɇ0f<ڬ,Pi%u־EbEήM V7{*;:$:̙0Hj{ #@eJGgcVw3>@`w]⎾nTUTVnC0r8!i`wKiypDV )!0vLDht }z7.rHt}k"ǃ%o,U2 &6#Ɋ`qDKϣUNhyA JuMicFf6<۲qL4bbkkF3ւSz-%?<g;rM>K5|HwTh ~Gv2]OP^R35.jdF`l-߹;ƕW.ѥ*]x!p F`4$5IYk iJ9@lY@A}^;>zPV,Gp~}_ F&;}z (w0;{{ˇv^aw73ɻ9sT`Dk n<1[Д]1v欝kk9Iav;? iGcȋ8^:C6,ZxɊѷp>DYCH: KW\}A[^xCÕuq\VLKb%lw{=<Ð*zmU)Xb(ugM` j+ VRe&}ꅣSrm8*1r0=q9 Q;Xv\RcIQ1K%|2I ٰ2^b3W+[]ݭgC'D̙R g k<Ժqm kƩ'~IZAd=J7cucA}0 {F[G$tׅ9c$:)+`JoLvm+RJص-a0lnyz۱rg>g;9XO>2(‹SC%'B5b@"3mۘJXjv,L`:Gmפ7T4:h53?]$M Z93썩K"y9r NVy+y IAeu0lH#"Mb".ܝn2_&D-נ^~&xO;<)oNA~sˡ#BgmHǪymM,[t8Q ;jOX^NϙǼ5AŶ>lIi:@ $О}ٖ5&!52SJ"2%)e_򽊱XZ1Pe(좘FIWXjt8[6\(ĸ'^u;e"OUIE|z:naJJfSV aS\=[ ;cɔ(_M+ B6!**&BhPOGK/kn;ធxr P2G2~nP S YR҉o?&|W"RUlNL9m%I*{\a[vJmPɚG(pl2%?  ˨>[uu "6^Տs") *`Gߩ,Pk̪g𝜝)ޣHvig_w֗t@oKThݜU\~{E4*OE˩qișjZal rvc `be( L >(?%J 5ETluLVtG4Z 황оPCI!"cV wkI\AyVQ#Ԥq]=N՛!`eQewbg i Z-5 沊Èo?H-4G2GHBBTVyi3K7OX"qX"KcZ '!FJU刣_2HC'H pIns52T$_сUPZ%e&~[6 D{g=#s8A4t*p4Rҩ\Ebl qm~;W-nR92,*]Tx2u=7ԛl:"yI[,dȈ)O讧[Dދ& Ṗ#"Hp[n_jq+UϦqO,5:~QVK  Ι CMH6;ƞ-+R5mI~$VyKtuUtOݎjR.~8YgLaM ɦ$'z"OU]u@ A0E,)tȡC24~ˣ%US .{OIU>"&k"'z͢09,CJ˽l,T/`c*~Z8r`Q54Q HrvcH?dߡG4^ ZJ)H̅/c 90 {{ +=5t@쌲X]L|oA\$=e5 :UӧB.(r=Ot = ǛJ- uJN|Ys> &pu? !G{~޺2 ⳾C+xeq-u,V|r $LL)K񏰲l'}{R$5bk]tsWh[A.K >n. }ˢwYGGT$ H (/˥ F/4g2] 2'2Q&%QCBTK?HBX2[J bE9rس>- 4F`N;e< u?-sg<̤zS qx׺ɣ5 թ簜x{y4ND\HXzT5:' 5ܽ4o::lPlXYck\k*i4^:w|c3'[ sUMYFz (+b n܁?wU~xJqF]P&e \L`* kS'x^<. TCGFu<^0d-8Oo|0wuH./RZڤP /2/ιƇQ/4clb1?~7gV]vk@}$&J1Qo6ϓ]{})BʬE'vVMC ?. 2w+Ss)oa0o=QC!MM!>z-\_Fʽg=$܁%IzB0gNWgɅeYu1OrI։y_Y&MreAJ*ywyѣUvQխZK9J@Q0"_a!>N}K]*A;apۈ87{5dKer` 7ېwzU8i+ ֬Z9FwBBAPqHaqG1 +MB9o:ޗ =<~Mm?F gWiO (_&OWigtԴ1M(}p&h% ^η@.BbFJVvĆD] M)j1=Ɋh Z`喻\Z[ NvqdY"Sa6<(WGJT MT>+-MlpQyH#"BŅ+^wx'ٵ٣lM@PIB*yz:pnr$V; Ek&Bg87a:F |\D%)u%*C 8<,B!çzɢi'.ą?:Dtq'ϫ(Ϭ(i?GtPw-ab::}%)]^u:yGUGO>=dK~R~@n+#Ewr|)LJ@ֹZ]0͍M[̈K0o^b}gZ RD`QWlH^""d+Xfc(6lt_#)ANdgp[;wJ:\Z6 #rQhǰˈ{FK=';`c H]b}tğ(vzZ.RRR#-qE|-5"g3`"*e?o-K 2#(Qal t$"6JChu@s?~8`&H1dDC|Nj$IZX`uxk! tԊerƻGѥ#?WVLn3 [uU^nY8ATJ]q`Ӥdo_f}*I}@-!m";;B$=\#`7Ad쉪7,B| ~qVf b1r~^%2sp0ˎow.<*P m=/5v)'W;O'^ @Z@q[*Ƃոci]:D *,²ms :7șc(Ep!~W6HpVfln :jZ*>6甭WĢ;y/w\./Uo}OEz'%^Gz#"H铍ߩ--."jߡIp>h+t 7;M]VJ 1⋃}8kt$aŪ$VC[( C7ޏDծjd,+#ŽD)g-eϖ%Ҳm;~ P2C{Vfm/<$D5Y>4DB4aӈ9pkIoˎ?(EݷV g@W]zȟ S_w- nL92+rM{r&յ)wyqUĕMčHB֓j9v>Z6seT>x@nӜl$ jOT%e0riZ=QZmG 6).>Iw3L ǶqVx&w&s?#CNsPev%r0:л p d p %y@bqv -0l2*kmsX ux0U,h01Mn{ OtBAc>ɻ3r, TOނ:3yũgQR=Z FKaGH`I9*@oy8 9ffwD" H+ú]̹e%UF[̶م{8spbIMŷ`!=IY \\ :)pڮj1Gq;UnށSvfbha, Yh ʢN0lq+qfc@%WwX2o:W*=JLT.A,TRxbbR_JxRM 1aߋ%ٺ̶3 pqPp穎Iq qwZ F}wǰEbQa]*!Ⲿa>݌5 نuA/Ӯ99-z:y?-O7CϢBjY2%Q9}t|jQ,#ꟻ[yB1d`.a8"tD}v(h |a{_Ał8cr{|M`CE1D!T4<^ @1@IWmª/DFrHbm"];#YɈz_BeM U%v@-)Tf[o{R?@S_GB}35^844Y>ԫ[pn;^t[Z˨j294G'>ϢuB⢕xKoN5~1Z X7e r_Kr x^FxV/ vԛy Xts;W&a,=$i@ F²` H! !/˹Gxq[RS O=uQdj=C17~0;8z ہJcp}縂ln!ؙ_ ǸAsX3!%},Se$)"CpDңjr'ٸ1$w'@7o?*k,ӏhPaAlkN-5ȁXddHr$mO"rX׬~@uBj Bӆvoi{2h,E_[Z g*7-چB|Fn>ָuuɆk;S?)arE!R/x멜,`E)|#?'R`xUPK\؂Z\sF..G?{^I{;ʄ?nw{?A^ ᠒\U;ES0iMyPJInPWUCZ_!(l<~ZSJWB s2a`|>9ׇ R=!j(8I2Aɡmv硟+G. F[@ӞM:%<"/;kW*2ZM#;Jj"sNhrc NJkVO+L6ހ(&@f0 l{pH*R4Py4ȱm[diٖ<^v?#S0|uq)_u›}q*d rF#iNhXS2Ϙy?8+1o ܺ < ) bnAXM4^)zTIp7._#KKi8m@Eo/Wh=ĴoRΐҺq D)|LC(Z%HfRO ئa*{a-u'GI^|ilTlҡ}viPotyҷ?;˭ kUBppj ܫ{ߐ`q7qiA.>G8!!ʵɿ?VQCgeVPYr1K<-^) 6b^6s&9X9Ӿ7FL 0ˤBN_Ժ%M̥(_Bо p5!=Sk^k"&ęQ9}[\'WhDꢽߝSs7cɰpb80ڝW@uiNeTJaHkx<Uab_y7[/yEkf$<[}0:;;ڴ`*n0nX~eHp]󟡌eDw4p@}x}_mӰ)Hґ 0~ S} 9ǣ:ֱGtO6Ɠ\e'vKb#%]tv0bÝ:FS!JQuUWC^ЕO*z o/G Ce-.MMyfkоL9zo$"Y}T䇛_(z\ id+3;  үHA.5%єt, >67(U)w 2S! "bdU kL5uGA**ZÚ/ҐC?,Hk FEin)E3t ::ٝgo1ֳ37Rӆ%#UN2Sfqi()<\lG>k.5O;(L&(:-e :F@LUfP9e*DR~*q~}U榪HEVɩ2I|SgZ-[8lV|35?eo]LߍG^Ԃw؍f7|]7Q# M/:-]_WB>XTNȌ.M|6:I:f0$6kB(Bd)Mg'T>lxlPxҏ׏]nM=" >`,* 6itI ,$gu)ATIAlLLwutшUq֡s`-ȼVN@̾g:q8B|.(`Dowl9vLkK)װHW^[ѯL9|~X,v$H0^F!)E䫩 % !KhX!f!2 TժV62u5!̐BU1w^Su۱.P\g#f*!:x'a8"3piƊ 7_nȓC\>o71ʟyzڰ2ƾAmѥRx˾^?sG|J#Bw,*4SW$*-|ClOHl_=<}ԭڧAO9gA5I"|ZpzjW$vf.JKvmWW¸VB5GOuY!ucGH{Rѡ]c嚯axY,fuN|覦D~;0Nr)knNIFg{I;DřZF^$a,;y|j3:00zg͛}BAkp1UKX5=5wv Dlဂn~ EGXH;DטcOr5 Ҧ4"vgGϰ&v-ep9s|;6qm4g(ňO@ @rGπ^=tח?2^!gi3Z,-<%^9ۙ"+W _q̓!zTg%5>D+oj%0;oqqO {L~ N$X户InCnйRKt}JaT[ʽ,woL\ Ե}%qX_~F}o 0*dTM_yJ!SjOwy_֢-1$3aPBp ӪZ5 Gi6yA痴dklB1-1'|` ՆДw 計"WZ|nU,$G'u.nOPRT$P0+1g" _FW csM'mt:1kדEx x\! N'xH 5թ:'0 +}UEwHi_'w`]xDJҼh%bsW7/wgus__HApP$Ņ}9ӑ@jAv*\xH։xi #]3EHw%/ h݄owGEV/c {/Y%O~wM'\)Sl8pfdiZòh;VS Go/K% 3~P֚>H.ybC 7zW~$(l\^iڰQ^:qQ ARv;+^Aa!]<,(.>^~Ǘiυ\?aW Rwl,Dh6հ"?/W/ @CZ4@ı#m{S/YbJIݔ0 qsT zeg7ptda.G)L>+x]#]4:B:-xn6P@X8Oԕk"%Vm#aNl.(7u&wy?wF-5Q`l(URBh1m{zHP-8 Mf}Q@Ocֹpw(V(ܺ(_Wr#W6VwoɀAPKZA̧yBsX$9#IIVٯ-B7''C`KlT йu# =/:F å ҺG{D|"9"%asӭj/Pie`ήO0L4$a 0:q K71fk2RW6_Ԃyztg 'λkl@rZYCN'_ZgP84{AluZӬ~ t+3EEKO"2pq1eNQ֙, X!.qc#(^ks$e?Q[z$nL׆"4|Hsh;b1bG% jv0|0O'֞x67frX:  p;7Wq^bIBw5h4B qٽ@?'\'ݵtoSp{Im7_[ƪrgq09AШK mb4~vHpCzìV7%S!0̞[~.awpP\:] OXԡ |E"wqVS1h8M#3Ej8[ngY2h idBIt M;*p07S;MiVZkY(n@iW^S cҌ-<+`b̭M+p9 `} x-[Q`r-rƏ8s %%'lt *C`hڊR$ "Y@Yg׻`P2>tEJG>c`=!L]\Z9FyjP*RG*}x;h5VVoą75OVs ]41fCA3n0/u ٰ< $8("{TvR6̓IHQp\~olu[S5~bb|Œ$0 HU[l4kқg&tnPz*wJCKeYqK-U>dɞ>]%ͮg$[N08X)>Ӟ /.R$ a"7ɬkȝH M㼊Y"NPaiD,_S=A?ZF".z6a~S 1e=ˇ?Қk8S >c) ;%9D# Ad a¦|K%C'^ WDH?/r&z w? I7RD5=6k~Ymf sV%8w)oC/"~#6hux uA*.meǺ&(Ŀ.DY\s@j[CA9۵sO5 tq"؜D拏`亄#8n}Y7N-6L|4r)_u=+Y21~La b^꿟ݧv(RNC%]Y72[ ctVSUw/㲅WFѼo Jr/-9}%D;dз#^aZi Uu!!R#ʮb-]N۶c: :8[L׼5jG f_N9;?E LhuY{F> 7OgA@z$t8?2K1V-(!5)Ε6'D""cRS?&XAn_aIEY6w aC%kܜ8hnT#{r"~mG Ӕ*Gr6Ma˦PH$iv[ذqX=ٯOE.Ĵ/:P*<}C`Ԝ!]˂oѽ p ?R;S1g¯  ^C|oCA:IBWzcdH.wd ٿMEe 38D Ymo¨nHx{9#6KA&9^Cq}#|"M鶌;i:<^-a͔)f3JBEw?)$ddھMW17I_<#xSI5B)_ آ;=k*1%,tzqz꧰< ۿF=?_eDt4,bHg}gMPS^>7PAHȹxQ~((4=N .dN~O?w7{RYEق]^,zjZB6aٽ9Nn9huuBK`|=GU2Vx R_b*W&6 /VF؟xv.M;dBlqqqv E R`bAZ*S+rvdK&pHO)ivE 6hp2vyI~p;w,JU`Q娏c_COr`RR6^/oVZ1oM"ߨ9Q,ܯQvbdXmRr[$dG. N9X B~U{S{nok狵4{ޤh+,;%eȜ0[4-%~aɭ1%*:wJM(KCrQzc,9߉#ai3輎gճmݲ!-R?ިquP-cT4G_LۚDQEbP{慴CK!^ͳ(0хhֆ@5NHv} WS?Z$2wv~!AUAG |E͏c5 |>JdhP P<'9(0[GRjy|! ߶wՒseԮ0Ib m;Π [:4`<墆=~ 0N(P'^K;`zg7dƓ\x+ݭ>e%ej5ށ 0 t8;Z@s^!?aCzONܚa6\1n]sG5'm( yy[(>|3(|ׄeN3Y&5JyEio(2efiƐLo#$!Mnɀޑ9X,3=:)<{vhg{ʦ‚|~C{n/s@h/qǶ*b1m=Q]~soBgi!!A5rA.BiioT#T VʲUxeOp  jBrkj;!Jc:i> ӟ9,h`@BoLD$"!sYvP#˰Cǀ`Jzzx IVx"H溾@<}"WVĎH%lSM@+[n?o%;jMןZ/92a8;DU@DP'h3m2J9D# U+MG^j8jdcm)}iȓQWc9zsۺ+5j$"Zܜd?wzX܎LEēc>Ο MuOO85J=RL׿o2LXc#QޔNjpybi  k0̒Gn/C׋ň/Yxg@Ӵ U5~$ W#OҾoLP0+1/<% $&Xx.K?&=il6>UZaˁ̅Vk2MuBӉ a~&}kCl8O^1Qs.S[R6ﺐsLnǦU_&y]8(MþEsXbffN&4a`oUxk 0RJesXa#.SOD i^soАeA^'N|trWv.cc{`mX=`6B;[Ӄ 6h_1{m6VhJUtӂ"WU{ө"}4 =~/kR7ò=ݏ񀯗-z{RvPAOHSC<\]LVB؏= @ƌOT"0[+NgXǹ8 <?0ePb8MȎ&z{|_q3JZ@'4^QѡqU(#e { Yq0K͝&rw&P'%wq=l;/İb#ǺV?),asOFrM84B!Gr?TtW#Do!fҐf>(ZT`. 5& !ݧPh.jix)J9wZ'/ϩ[EMh<5OH#~Jw̕nj#GGu 9S82,n|s-vۅ/Փ_\.IКylQ,Oᨑwp-*ҘX<7W!?9ӅF/F ?{$m2Ľܹ&ruۈ l`.mv~Ѹ'1:;&Xo?LZj< ޟ恰I{ h(7&_¾ {9og0 U_!v9Ž?aY *Rd`lk^z9u஦ЏPk>dœTo.7{H_D3Pr~6Z]7\Z.O_~Y} 5kO(fAYm%_R$6R.0ǽgeddsВس9- ipt{2(˄_-b;&- o![J$= QG-2 $h6ɬfXTDFh]5T Ojxf~sPĸG`Ti;t]> NJj@:/n zO#Ơ]Iq,g5 r¯Y"qkӢ˰CǕ F.V+51 o8?QLtd`Æ|5xlW N*FcjhK 8 YS8H`ykhɣь+ j4q00=V7Gi~MnߖЪddo=Dn9s>j&L7=sr`ܬ!޾"&2j:I1mV+ݧ~4g)*+R_3bzFF `K}(wyEb+#K814 es!,%F HP6S hctMiO%E7q'xwd_0杄xoSv9_cb]3/,o`d^}XdJٝe] +^9F{煤S6".Պ_$^D`~{FvTb*,^,*lРh@!u+w0(rIE:%aqrj ]Zˬh[ztCn80v#S} Vvܕ5%‰IuGX-yқbs_$!;t^__! UGc߬GiƘq`~]l'3VZR룬tَxٰ$)k-(s'snHA܂abo %``߬}<,qM6_pUv rNDCq?{,wWZwEZJiO .~력醊9RM V]_>Jm>6inD[Z6+AC&^TJ`U1w <[V/O וp&l{RfBeR V8;>GJMCڟ]XBa]Jr.5ƀY_T+O%Xfw;b@i_2vXWU kQ~!<ؗol[}׊#TA-/y3ZU a7 bz̦3vb\2rmͫQMN zC.bv%+e2{y[)ӛ*A͘Ѣ]b<·…¿&W@~vT5t/͌R PD}oI>io yt曦.sHF ?$  JlybLz%0<؃TRǼe_b@ˍlшZ-"c)J,]R_Bg6\nfx˫> 2o}EH]0#nXэߪA` 4ˌT$cj.-ίͫm&ԷN5bŃnK*ėˤ !췒aE+ ۂnvSBj|T4wKTyq0?gr@Y}

U-{j$x`wm'z7Jq22pAE4Lw` jU#` 8*:NAbr J\r=*UfvhYLzjZ1b./@XF|່t].tú FW<;\F` ._Ki<e|o) {gC,'6-\86c jAAAAYYT$sfJIa+9 e玂tR0 n.*X%`1K .@qJKhwgm;G,VF6\4G$zMm}68N/uae :@N[sX>S7ݖqGsP FWu8Gaړɫ3.0;z))et63Lw &.{,mfǢ+I.IzŖlzU?jQ#MfTR.m>x _N8C!]/%m2Po?j|GB%ꞃps_3RV\a^0x˦7ml:4oe^$W5z]:J+kL;ٔ 7L_wg~%=܁|I0V3>KG1¢xC x¢<5sp6yjÇJZlӠc%9.M/ o-Be\sNC?؀/\Lf%g[(8=]5}yxhf/6gy -N{EnSF[|+ 90C:),5iGQn 0BdsFWR  M}h_[>=m=:w@] ;vN֋QwpdUmI+o7Xfft9s܄VhSQiCOD G(P8^ 4S_ZyII@ȉ0gܿu& 3E1s0Pc=xpQZ%'[hj  *@@,喣2RPԬ䟂=^t9{:( E|_w~fjnW$OZIbjeHuW<[sqoΌ"Μ^!#$_ciYK4R]pn "תqd0^0[5EU-)$|>WO3nOB@_UKpZjgU"6;D)B|豆XxqE*gFA CIj ءHw ,#ׅBKWPxGѲV7?^3v[ m׿lgH_/tB_1Qdx`Fu-!ƛ 7`Ԏ]+zD7{qc.øԉ%6vɖ9TJt/\riA@_QU|ڰB $Jx j;u&MyÁh"$L9[J%H>s1̧5&T${JYh\Mc-jgV:NP7i`4tp+93zЯTWۅ >c\Ah6w+?ǜMgf e(&8LNoREv0~TllbN-^$| /[by֠4vNM}ɹ^D*ZI</j9q_7\*_6"(̰|"r Xc+}h ({3M_P <6 {{Y"Y;"EQ6nt%k \o EnAB8N0&7x۾90+q$()GS zE.+=Ҳ @N92BI 3+u{ԭw%o/5Qr"Tnt YI^q_Y j⤝ 3>+yJuoڜ9 p)$p#^2MdϱW6eYR=Ϊmhn8c UUB_?*c[a{Ep%3Fhx)F]xWngf/DլhNegť߲A4)pIO @:: @MיGQO."H,Lz+Zg؀/2s2pAIAhLSYp~2QR\_sK^  ȗ#LwZλKJۿ2df4~ v6Og>?O+Zݯ( yW8vⰇ7 @2%Y08IfS5'|>vc2 %2d)k&ʢc(0C:)b4EQixF|LUr7> JV! *7)'eOX-%Ր!n&56 )Qj1N8jWVlHF]K`Bl*MB»<' NFsk˯cܴȲmgb;Li=M,_ƙ4(kͤFƐ\+%h#84*PWQE3zTmfrI6OalR&A =jmۄN&B4a8>)xЉ87['ug:a{'{ $NiUduobRDngq lU諡x,a1ќA5.mH:"WU?j^qbLEt!ooi?2HM/cjy6'j_[;tٺuE _{;,OeeB/[4Q(ݻ!8cf{m5 C?42ǑQʢ:+ u>/Y苧db7>p!f6 x-[W3e/aGZY1* ^9Z%3di-5^3P2N:.C$y ҌlaJjpRX0/^<Be8Vd/-Lyi@Dϣ ]m!fZԤ\UME$ǁ$VҴrc5vps=}hĥY ICהEOQ ;@_t~ByoA{|5./6b<R"m^n$h[=Uj";nFsnt< !c| ;O3l]NO.K.&hXrpH4!kN_\Òʟz<ȅp u]I}UʒX{{Bs.-):<3s{DX Z\Y ӽ^_@>sd !Q|ؼea`N+lVuJ]▄bқk@SEqaAF>tq_EA`XiY+3Vڗ2h-.=dq ːӵՖƭ&h8P0W)'7į?MmLH֎!Jfҥhgkb.:q m!2eywlb 7ٕbYLmGR'hS?ٽln`AbdNErCҿD#z[-Y[W EQAȬBƋܖd?pPH+7I~G/iy 8ǑbF7s D&ۊt1¦RHm+OԆ}MC:n]!O"4QM5 "o<>J܅!ɥ&dhӨJ0G0*t9op@m0An^svZQGcFpQ|giE-b{M:X]#a0ǎac7d*wKXrx*jdѩzbvFx[g*<ѷcaJb_HS:.7LO?-m0L04m6B~&ԂP'^fC#ׯLC+q~cDY\#VAt.R)ثBDãyfN50PK.0؅gs4Jrf)Hf90X};V'61rkE& eCgH 1N@\=4 ժ](r9C4ƚ@<6a u> l`%f`b"=\WKH\+5}[&x6JҶ%j$ϼ ”xA$]բadCQg |+_cs0$x y0v lj{;5ߔ6Y\T˜4/aHHe6XF`OlMAp&yaIt!i2ϒh&۬VVAI5 v1Z X1j$uFWY= =Wy\Ir = vJ8-WDV$);{(${E;~i!XGR~Lո I!S.s(*iY9*e.mG+Lt|rE0ʂ:9[P.pˀ>UaR;IT^zߙɎ\9Mq@*uJVDw{HO%ǀL) .^VinCsPIcOnB/#V^ ޤC$`c׎}a oS^93ȮbYQ-Nhk>c"ms{8˃B/3Ss%P߳85K=!>YI˷V[f#Rzҽ;N2CÌ}eGQ˨B>qJˮCP2L^k*`6ro}$A5/V@ae!KK3 +XM"m-B*R\a}TA$yY]35L^;e:$Me^O}of1?{IGrsQx^wr{/,ǜ 3Mb()=Ro鱳qRK)) <`rAa$[ݴ^wANo])a4Գ9iˎOz,E=~.1ȃme&IWdvbmC`0j+WD?.6Cbťkå3DW$iߍ酲"\ ?,K{ Ok1Գxm@w4_ c~|5{kY p}/UM8/NǠ Q%![c^3fgσ3AzgȃX02`0QBhWkjE #g~<R .\~ϰ;8߼<,a4x'Zp3{^\-솿)6FnRjvUEG3o 4هI?sf|TWCgZG+\S $1jPbUJ,EB2ܺ'Vt @;]f >+gA{g!?%L`ǴU- v 3%y;@aZgnreƛ6CXxDvIh Qv KMNq5l7J|u ;N8?][6l0qZTTNYyb耠"= {1^܏TcT(}QZڦ$~!fa 3/zs}ͤG {V Q#A Fzm"prrDzR7V0:t7P(;ws!,}1#S]x=<w*zؗc7ݮ3,ȏ~2 Xy[uޅMt] 0ߦ4-*q!VCMi!0(jwɼ&'O3V0;2:l3{ޖ>Di?iӳ:c'"[qϧnfS9˧9+LR=`|^ɆC!آѳ;~gڔ+{9Vi`O\'Sh[!YbM, oݥpOQ|zsD |]ge3/o)e4GEY&co= VrqK0A`Ĕ(YjPx6b Oh5#y{rWҦ6 X8r/Cǖ@21AFJ):t]'GUj<[Q'g |i& 8 h Zfxn(ے* f)I`_j eۮ"'k^y||@pW/⌢3\};9V&B {:lQD%u6J _uS4eX=@q,*\A\;9Gɑn4uU&2>V*'/WjBG{^^BP*=X(A'y6:y6=sIJ"m@"E`yOl%l`lyoP #9yvF 1ŮD6&H5U}vh/1O!>\d\Ok'=|N!`'aHPU\/`w#l|ٰ. e 0x*)}EyD!rb Vk S׻(W'[+u؍&4=X#Fyi?PF"y AQLɄDROJK՛%kBSؒx f6&3][|h@zeVaLJuŽu9i'd:E ;eJ}ެE I.f fBJm<5803 T.yfNZ*s\=OC] PiY\9{;B']z:n*ҥKIXqveON[;nou6D~bxvri< c\:)e~luzmFa3 P\C7N '4ײP㫕 ZYb2ֱ7͍X+0xY=#ȝTn] %G o! utP3,d'e+V9KC2NDѥoXDBqPd%*X@@jG0G34>bF#<ʁé,5LX5  oozCoRl+uƯSS2hqPW0P)wI6A1'6(/fbx9(9qɱ-gc6路wKWiJpzh7%.m~ LiO >7OWq#SL՜7:׷vmPd&GC|+z}UNgt`R!QbP?" 4 ^{Jq7H_*#h3 )BX\mDKp?^9Њ36(ڵRbTݢ@l֓dZ z*/6лKc!qr rĿ2yG U> or*Ѵ~ɚ؇=~8lP|YnЎO xEG+q"WR{'U溝[eW:al5 Ub"a&ȶ^l|X:h.$"gf-~n/ŕ"v' Y SVq7M>_XpLѤ Rx;;-\8GpYpJWVeivxN 6%M,XQ(a"DLqs'I=WJcn^e~i~iFDٳ..t~ &k}iԳAU7BP IQUl=6HbI8gG0L/\8- R/pR6zZh4"{9!lQ]< l##-y\~Sk0%Q Aľt_iD -e[X Bs4>6xj| wt#t6mR>g{bWq¡{zA3ֻHoKaI$XTdX:?jcVjJ? dX |0-_%_LD1,{@BSe#V{Y%f/lEQ󈌅Jk=I.?4EPm{+Ŧgd1}}\^hN@^" 2Lf-Û1QDlW+& Rcw1-VT>9Czñju+ E&%uU% ̹1w M^7xuaٵv[KlvV*"н aP9v,& I\fʚ&\V.YJWcBSrnH bzmF 8܁FlZ?wV&x m+@g[^*I}cza%;&xZ_$Nc#JmrTő6_J<7g0@RwgY TLQ$],OVt_Yڇa_㾋q-WzzDU0,r[0p2);9Q.3Tm^ AIAlLcMU@Q8Mj6 Ax/#jӎcvTz1x\mFH[4jZ]Q˼* .B;!Y2LԆa九>su_?N!LdHy|?!|zK8&7Ŷ&E? '5j' u|gd[f{a0VXcpLϹK_g8W\pCw|j>_b|WO1zAu\lVGBT_"LSuy>Ł|a>`dw@F]t{L{)yʱo`Ύg{8gAfMc= N5:1cK.ضGyJԭ|di 5m$0$/"kY$!P%6͠Dj?+jt4p)7Xvuvn Pr?ӌIu 5ɭ6:Dєr]"bi'q;WW<:?۸(ca*yd[:dރy>5o p-:%mQZ\#'qJL]Q *$8;kJyM2;V)TKHaM9PL%%"j0{`[NVLJInX䵢xr|0*ܩDS ^SWӤ.9oկ*䷘/bj`(j P gd:wɵ!*澯A.])buAv53l_ҾD`aX\d5vn/^ҵRz,jNV&c"b\-ڶg+Ė<#C㥛Ac|fW`(E-M χ)|Eƈ dD$%a,l3:*o8W$EEhEM B(u4Oh=*Â)&^!<vB4&є]ҕk0%"vJkNh9HBprqrrPovK7fw-ϾQa#( _#;)2*f׺mr$/_R5{ wyqY^?x.bZ-H]a&C>˃#8v;2gNՉ^Y8Uk@"HCTP\S( ^vQO4Ҁ;̤a5U{cK hWg6]+VtIpm,0m@4.mCL!mVa gs!q0ax(*kh) v>Cm[>2s?$F F32qG\T>57VS L ;]Gd+¿s%٠6E2 BI\w,sEᲲ>cf --l緣I\lu&;Rl)>NO?} Z?>~ʉƼr/Ǜ"BKP6Z$z> _ uob}9Ų*פY.k +RQn9ƨeQr}P%MM1XĔVӘvG1/zy;"%, m2!iusP*7-xPl NӜUK`?/g7Q$uv#(FēK6@ͺQnΈuYyD8 g7OG kA p !cN\ҺnR3AE5s+)A2"tUQlJh6lJ`@F8~6 F u0Z9Pߨm<ͨ=xCdG؁*4g}46.گP0~Q:7I#[1~MڴT!5u%9$v^}?|VB6_5#*n:3fx9- W1IDORA;-kK qԖuAd芺l" >z?6+ߢ "MmiF^Q۞1DV_2e.?,BL؂w{s<-N!-s=wݼ)VS;;O>,.5&\8֖_`g:Ȁ G /EBAp˶05aXc.=X/8ONTdp^oO}ݣN|Xr;8hg x`S 3Z9TWqq]?_UVyKb8%XQ3żC:'@݅6emZh.Ju3 Zb?Ρ9Dg~eJx]-*M$|~Z٢s{'}\u|avo+BR@Az/d}XF U꽿<وkVFѓ҇-gCgiFJU;Z?K195?$I/ 2"P/ons9q[jZ3V ,AKBAPL,%@*Ƹp\XbC7*Z|^UP! =ZP  1)2SE5Det`w$+P B(}f@֋q:V6EUsyGx^ƪm1 v:abۥM=z n}e 5^T 2\@ɑUpN .kH ?//t,E~N9qEG%9da-@5K[1RFwR>F(qZZvGvb` jf%(굇ufv:nAL͌`S|*,O\h-0r1'+dUJm%b60}fh]iǜhPFҜ+K BWѭ!d*i i6Q2o;߾\:g>.c!gM~sBVw˓Ϭ8 R'un/bJIo$>(`{-$kW^:5W7"8bΡCy98/Mh=*}(0n=6;z=_Ȱׂ?x4;P4.K6SִG{14kiEr~oWH`Hv_Di1WEJn=sH/ٱC 0>%!|m{kTO?]4LRryO߳L.j Q?6q lex$1.c6ozRYGi+]}Jm7c0av//zφaIYkՖ+pVg%_ iȒ~l#C݂3>M!OzD@-nWimD*r/-q5Jgے/ {z"gFW!KH@ Zl^D)y3/ Vx.BzRfxvR%\*NK\mF]&,)-߲Y'_| YYWĚ]FrTx#_j';;ȭ@iKxG5Fd2ovǏ(d<._G_7bSsrƵ\y.{$2dgJS9hvF[N7kI`Hu,2ਭݬ? >TqI~ ͔``O5],hr@?&X_ #! .?U Q38r× iyp3>fD6 \_{Ũ&MT>J[$Ӂ2?F G݊-vw̻-w/ԄRw_Fe|*qH!eݧ O6r-TcUM='ܳ%C!XN%~ t[d"&n3>/ ,vyejbv|k5K)plil030(T6]r1Ɣf6fyd'R42͵r䚌<[13мKtA;4Qv!@3p0r(5'FٹƉ6XCUhhRU9MŨUVnQxmdq7$TfYҦȌknk-YO.֥BfhsDiv%Jm'XxMށZ$q?i_NN[apjxk~vupS3WpZ&qQ\IXut2Yn6drŲV?)X|3\ùblXkѰ\YB$o |N-s$TA!'C>I&h9#IhAZxI"gK ۯE'$B-G= -uߵ&j!VCat$uEO+ @gW {mױjxk.ReV`k q!rǯh؇=I xӤfaq!?7^dÕFPߋ;p@!)H=o`ݬK6KINo(@n~qb@6V9KK1$_޳w׌ZM5qI+fump%C jJvڊvc"F4#5[> Ws(Kdʨ#R=+0!:E6C9!rSQS'`jփV&2B$ )[!{<c3eh^?#Jo~ ]7[u*a:/#O2y  pe~4=BK mPh G` r:i9  p=jB__rllv?}Ӛa +v 8e> NClyL>肐D:nd"Sӳ%|6SH~? *?THsӭSSPV93$Hd U\glWSYjY\V: K-)P&SӳdQd{ zc";oo=9<~MǒklU hJE@`@u5N3Ee-粵91gXSѿ!WGYe\vӚCOtrt$gR ,-c5ڊ@!Ŕ+ʓNd $5W^YGlYزGn'y;` Z 5A?IOS'IG)yS K>w' hu8/"fXdҊ?{ch6nWw1x8g3~ W,#Ula59p]#f(&L(a32KDs6pwϣ_OZoo$C<<;k; ʉTMg*JTR M9wbs>~,5V>.TOb& 6U:GBZbF%cYH@4_I!tebi ^HC}v8'/ff̞V>-Ma:5c)xiM`J`}42^y284a%rg{ˊtLV j{71H;o^G`hI؁`6z9x쉢[8#Sq O%,AinoNՓ0ɋ x44gԈ*HY Vp~:VoLO}A؞@ntG*g_-ƐQ6ctp[^:atߞ-=* }yvl+:}K@v yq 2Ŕ/FL +@Hǿ[pwÞc`bLiWnȉ̧4*ƘM7X|);,~>rD|`I>pꈪ-H9 ZrLKXۯ{M+[?l [Yc]L("/pG:80))rl% drBXn#Kb?Տ:Ph{n#bZdѸ0 =񒹯9MZ`qn^)oLNVE"k9Mg'"E0dϙ 7VCFuKAI"}&l嬡TC85hL_xQ(81B$ˬ^SMºMotwZ˲R +S8EŁ)jT_;c0`PB *{U~R!![&g'ZyƉ]21Hi-4ekkeDMr޷Es{/*BòlTV{VKw 4ixQ/tODF]Ŭ1'2]WFVWo#g] _ކdmgF;ZY%K˩> \h}D$ǟk ww|jA|p^[¹)bwZ,$I]$i0u,C4q.$Sd6,+dKONHT6!dq!y <ȮSvX 㔋E&w3UNv^-V2di*(xnfe(" 8‡_V^]/`NnW |jZ'Z0^e2HI֊N9- aV+Vbw̺|IU̩.U(PKUop#,J(`ۊEzd"T#m4oDX =?9}vNv݌.Ly/Y|RBDHeپ[3 ŵeMK7@v)V@m `k-7hhIUH)[%x$+e5BY4^fE7(dMx/D7׷eĸJ]_0>mO>V` \-  &P A@I&S2Hl#W߯ }$^'2ph%?s1rk`r_)}|i&o^# k vi0d&G QQ-\с!{lnӁ48e4O}ڕ('ߴ+ރn+>=d`@p-& u2#c[&ߧ# {|3H!P .B l3&q.~ -_t?FZv_bcr}/3ԎVui9MuV.VtJUVG,7hʨfa~VD}ҩ`gE qmsa8Jyl0lI1LTt[+4)4Zǔ+Ix ÇWvS+=tC7~u!S:H`2GQ,6~n䆓8PUUϽXt )öR hzU@k B~$ k{w(EO<8v9Z1V- i6A~2J " I ldU(]e <뻐 D͛͞@J_,Y&m$4%sKȆoUE{XQBIkNd uYiKr\ %L={>MJ?rk. @rS #;7o2v} ?Lakn5밝&gvv);4F]mOy)ZnuVKUv"@)X1=cl}w b p">G6rj}~cr`$^GN¨KlUxY+EɨSIKu6 o:I]CwGxL0y tB'7E&]A"ozb`K/4Ʊ'P2mq3:_ NIm[\P!,d&4jj^tb0Cmg$׏ތBNl~ >f='AdI~u*xBG/@&W;/<#yG_u~Rum<W3_WE#O3dLeB0Tf5 4< ve_^L:zg[;DC p6׵zz!G׾ G1ݔ1PέnMhkmf9p5XЊ}̑tN%tv]1Mzi6/cv:t;oJ-A l^' -8: u\'/a Gͪ MWıj($aR c UoD5e7~)<@^ހ=|&by%"\5cDq,Z1\v磞UZo漧 [wc/eogYz=PA>(C ׾UƮ)ú7b3 oocx#"2p>l)헃C󗹛,]`ѵe$Fp #7]QW? Aqʬ)k9/]tT `=jK5/p^#܈H[{-/1 *yČ?RFٙdpHi1@Y7n eFrѯR4+jQ쯳9UA 'SaD-p\QngM{dNNl\\$/k`q"Y ,>ԭ?qmZMAvN;3̱4Ey­ ~A^q&]ymϒ,XdI0v?\19Qf*L&r0-ۜ3b"6 ]<;5Eϵ́եI/uM/Āyg1 S$4 F7.j2TcXR%6įrȐmJz`,z%,#=snc]K 3EU7.hŔ%,zO-EO!s/QZHs5?qQ"w_)4;3Py.B{Fn62X&@GϝT]UAWNQ3kXs0tT- AsH0[hx(T`A@ے_{#=SvW"E^i,!9?}>6>ްՃ 9RM"J!pnFyxw#A OW].ZsNAmc}7 iZl"tQ!D+8<,+v(ʲh&d /.C"N5UL¬}nc_d!eFHMqd$vc3< aYx4:5[uҖ·:̏ $ 8{QmÈkԨ΅;LS^:?*[1O[ ldns*+6~ث  I1΅#lg˵ǀjbV} 1F. T{=P|q+]~H>{fו2+{ p;!ۻ슂!YumH]"Zp˦0aQ{2D!G9zYtQ]Ip%켦d \9**;Te^\iU8%I$0Rh"a v/x'Iݞ;y46GxݒfWez6*./%oP60rfӶ;>@4+"k ]WNx6'@p0Ne>kD$֙6gαHi,W],RJp[ϱG=7Jc)2uONnc  e#xKY37fB#Ӓߚ,; SAaI&S-/}hiuIWR mUSHT2BiÍ\A`rj5"1'=ϽxRD)a_]9ҽ{5Ap ^cm[]6DHR7Pkg>S}(Mem @yL]d4FMh>2i s!Y mĝ*K{7 cllT4_-i iṹ!GXSql3`aFkof:;lo`[ 5d&p jC~nREd?SJـo6 ^gGEWAaXl+aCyQR(;^TL9]NQ@*އ'CCu)nW&Y<h ' (N'd>rV0q*!D%I)oL]08[Y3 :^58Q*4~)ras2Q= vR.D_ $nk:e$3x?Y2}w奶 jOE~t6a 9 Ȏ,\Y?<ЙGQZ\0G<#^Boh%}W1l@^jÖl52XH=zJ dK[$/Xg-ٺSPN:H܎2qhLLiߐ IʍaoxmN}^S:P8H{6èWp-h{  OO73WD5|h2rOT$Kle}J\V,RL$VX 2Ҍ9ٹ̀=zЮߨoiD*}I"H/V(c"d']m2 \:GEWvW!u"DǦ3jZaUZ475mK, z HHΉAw\!2* xˍKC 'ƙLj*:e@r]+ AluwˆgKr<0;w$31>f7GFŜ/Gh/6{OٗV)u'ғAxuPJbx9#Sk/<I뽒6@NC.': k |hqZFd`*4(L袕~0p͇t6茶vRf?awz|/3M.m=-wWGüzf~tSaH~O-k?tW8d)'Ԏj={!MGPےprStnV lHQEÖ́@]>.TQːBL_j^$tIG %-\ 6?Ik;SI  3w<@+=W68T{uqލΙNF`י=#>ziw4k*m"먵in]*]^[,WW7+c&ORv]ITuDLP9)M;#I FKk0C8)[Yy,#]R3x>eHXzJ-MbC!_7Z )̠54_ېscz3ZTEkw3#<'-1|[|%R5"P]ρ8&A\2R's7%vz ΧY <+yB%Qc8c\sB-n +#ݻ ƀrrmmkbE_a#kڈn,3bkSe{ģ'`bA̸/]`NX` z$v8A1с1g$H`m4_hDҗyV8aʅ?@h-IRPɕPX+_uVRr9\93% H:km7YWZ;^Uq dk#]ui1CE([4ĺ`% 21ya^ D%AD- JWc] ,xetKt [T R\B!蜠ZBOANʶ`7ugߦ T >>MY-6>GoV7%O#BrW > ( Ө΍f9M:"ؼ sO-/g>FbhT.>(Y0);*:`:w7}=XڡZ'wa}n? N%h-:s@&2zPs-IMrd*B\XMh3E*[hY+C)LZ7! pK:If V(H[ (IPQ-uv;Ea"|j(l2qcx,v3~;jW0.qVkJH|;1-U?[CbU {ޫZGlCፚ8l B6,aIߍ G FRW\c%#v^ÞĮry7WqHʭ3w"G7Lkh,tf!WJ~B?[n,Io?=#C/ʑ /S`S:8RUOBi5M}> < y^8(y7Nc.Hd #&6b .|?Pe ܘVt-N_c0ԇT]S+\u%| l/um &(q~}Nbꦷ'2,2Hٰ܎jeVo^Fº'^T7,nFB㤖oDa4en_a֘ 8~ҥ uCvA|㺚d#YB  `uj&H7M&EW#9P d}<ԶTx53słVb !7ʮ"*1ZIMP,0'X[Խ%]A}yM\t↷B0MlqF|! Fq՘v]Pk-ڝޕFՠ YAu9#O=0Y!B1$'ɕP^۰nN:g.61}XTG+=>}w,ۉxi8ڂLLHԁ䩻:gr H.v 5G!=w\6k=@eϖ! Ӗ] &hb3'("3f>-D:HhգIVV`Ie4~?(Du(2UUsAˬvwg!UEiш nP(p6EkNm^96#ϜrnRaV8qt d6o~.,=F¦ eM]F tRǥroX;orG;) =Nl`[K]=L&%5;$1 :vU/IE U33fd"L&JK A=fؼn\nLaۿ4VU':bn2C{ ,:tqUprxˉ~79"By|6, z`I]7'QTߣ&Y>PG`|g[O0m; &Sm35g̤ҝ_7Vvf7ސ㺭w[yB[(% ? >ʐDj- W4tu`zqL%:t&fˠdz=tېiO!,ƵƪYݗf_M䒐}NTJJCɚ۩/Fn9疺jD={3wS\1Wo`8Oz`Dgͮa*B8]KOƛz>3A]'^trt0-[c[zY 5~ Ig :W7?gKhBnD/]MC(6m|:d^3 ʢϒmIK~e }/ 6YmFOH,*w)Q t^xAuߌF YCi4w;U#S3X tO2/r.k/ްefJִɕMCZnL$$c9(DVt ,nP9;1$d|~no.sĤ&$I'YaɂUٜ,;OJ@ F>l 70C @I!!kmM nÛުd`$yeD!aڪ2D[9R%v'S<`Nhl_YMyKNtبa2( ) ڧdw͞hdџB3-yi=B3O+XÉkl{43;q[,E8rڦp^<)` AI&SyGw"ru(]hCdj!pBWढKpհ_ Juvb2.9҉Ϳ'zߘbVRcl2?s|v.KYwB=,)0w2e4Ռ5KN!tSgWΞƼaX6qU4Gۦ c~ōx3Q$f&ڨJ\J*|wŖQ#WtP|- M硬sH9|UV[@!6iXUCB7"-`-N|2L!!o0nj ,C`]Xv&?/3zNVY)-G55x^LesNQ?az4'}} @v$bd|~W}G%R&oT2 ur_ff1{(T [H}9Hib \MSf-fe)D# xL}K #)oX Q;/#'A03~UK"/6/ҕ僾7j)'ka ł [^|>cA)kA̭|584k3^/Jtq Hx8r[ )>>}P+̹]eE4SB]zS(S}&1dxON? ٵѰ@ҙS??CԿ/$MM' oihZZͧL纽;UN D $DJ0tVxVigĞ\M}<φ<+֧]ϗ;Ϩyqo6\YeB-%9a`L Pxu'!ͯ)h#oJBW}ȁG"#׮Έ( -9,\|DƙOQGUl Ҵm-5}n1C|3[2#5F `\M/_`r@ZtXz3|<'VՁs,w<&q-8)ݍ,I{fiq˅hN ɻ谘9[4|a}467}ψQP7Nt'fʤ*S@L.v3J2^cㆋk2,K`˶s5k / {yHcf)m!34V"TFe݉#94CpϸuI&kk`ԬTv: I<+ (<)kkQdiƣ83bf%~]PŁϸ~#w|#iK* ㋘0n2p.f`,ɗQH.ٕ o°P9Z27HWSfx,9X̅by^Вc M⛥'˚`:UKC%aL*ܵ ZUH K.(+$iOW-7pbv*-Nc@#`g̤" FOĜNmVFa*1X`})²XQ6VF~㕕6t iFE.YӉ]F`ŭ ^FKC31ǡ\OrÖ;+nm];CRǕ\źѳD?}i"/V3K sPr#fo#{#ůyģv{M Po8aYVlQ@ѼCz]XsE'er\VIO! HeR^1 <K#X Vx?MFWoдƫ8 AZVlvCmXO0gX0MnY5ZGe}]T; sOYL6tgy MwSV-I N,ixq\4ѫ[&?Ö͔/66m/.:@ %bZkM"8(^[?o"*T2-ٿ@i<3; vG-QmV}ސlSX,`$ iv2Xؗ$T9hH '5wrdyfNRj 4YQ1h ki0bYX[ojbs.>p.-lԯ-M-|,&DPY`erD/ne܀QDCdv3-6󤎀BήK]F*ZDFvd'Y |Y% ;Xt(꿳SHiA*x'_ BhiZ5a AI&S4 CR&Okh!-=n+0(͆ꔶ*r^?,4Yrh _Auc=嶯VuKjd%#.]m'0u(|@u1ED]T.3ȫ%[XÚz~1JmD I ?-q:ժp6bØ$Nɭ`z=.dŧ,XCWc 6`SyLi8$P&ǂ enu_r!fL2x=.h%HR7۞ƍ=-)<<.vfo\zK4Px*ORd}RP;zŻQ gR^L@c7`8q1%hdTm40gXL cBh wA5ͮR Xw=ΆNHOx#_7,:H[!i@`F0i'vut@=K$ [ϗ1I6$gGEvzl[*/lGU04d̝1ĺ(i_y:BTb.,l&8]}'fT;ZT]  ӧ$GV{T.}Tw..;A{i0N$/#7>miƩ~wogO- Nth!\)(DӖ/o3йaK)|&6fPUQz)}<0Uy'su7셽6Ύ!ҖMCH-&w_oс9NZ!z+sUZåh&+YބЂxCO{MJe.eaq|KsrͪkpyO]z-Rg'[j#MGXQ*:wt"W5BiDwtU[.quI%_h|t{VfDž JQ3x J'O5Fi {y`_1xn#k'ii;= Eie$h֍}\1螤L#LgaDžFA^G&H MJ$q=ݳX( }J.9ƻDQ T`狀xYYoyRZlH`NzN)NSuRкXG\N # yc83e&#M7pNi銠DLG_NP#T@z RBĹB2:*P4xHI.12Ufa=}׷_P]'JTjM\0[Y[ILڬ0xA0`ىK CȾrڿd˚@2gj;krudfb)<%LF5QTkc4SFX_HPMBCh_NS3 8iv1. phmerAU%C>1'َmcdx3;.8C,p9!x(-Zr=5&Vhr/+`h_Z ^E8lXP)St$S>=aҀS`jAQOF nЭ\' eP Kg@z 9RT,Q6wH~p('_ [}`LjboG|vGw!!>'S=ivs^Nr#4X_հ׏Y'S+A%b4]rF#6'PC{ꄥ) sb Fh:!5;`?ܢ8ܙ RQ|4<žr@ǁHGEwR"1Ś<3jxT5+REq:܅.nPT—MNP"bs98) S^cR-=7ia}w}^d-m\qwtکT~b[&,x|9)q'Ib̩Sm`7u7݃+{:x8dGL~E-ϱw16WMEJ%4+}Գ&#)}4K+o5^‹KG>P{L6jǜFh PSA^5+򃬍R%?_wB}˯*sjTQ Pub&t'8uKY8n?˙9>zE%CWg/Ab<lS E{c(_fYj=$30@Ueo q{[3e]b %w Bd7F_ƒ ~n "Ȣ80S#2oĔzz'al,tEIno>T}|a x@V"1mi"K0p#8"%)ʉd?:Jݹ;Dk,ӣ6#!|ߝ uc=ޕ޽}"ǒHNV=oجbk1js&f*wD57ɴ (G}ʜg}?By!9-i;IBLLjY)3\jhOÆY)X檓XO)N7Hkz8QIA59MCm.|28hpdQQ\>(2Fͺ-qUi>  (I1׭~2tbp9v (i\m!ۆU?`jm$ҙW \D9Ya@ɪ b{^?G[l_Ej uUs'f -'.d`L- $>{GQb@Z(g6gK% es\cB$MDuBldjCiHaYmDU5A8OUuDt֓. AI&S%" U\؇MJf~A#s.TitND-iN1z40Pwd@qyԱ{Uvuu?r$9Bg^\dV D;7n[h-qE+3;NX^\ M8d jJKYZ{8fAz% 5Ƀ{h7 bJ/KRxލǣYCn ѳ'R鏹1M=IP6D9EXSN#nhwC%1,Ĕ%nfUqe4+H@C9&3v7BHwtɥp!"$5twt8BIJ'f6@9\ }|]JbП_N<qRiiQJUjp< ufMyЁc [aHtïA1}ߡ0%XV#*wJyLJ/j[Yke9> x[уޣ1ve5nJI]AqߟJ4FV=)L͔2Lw{ 0 Kىl߯7v2j{z˩a iuꃃД:$y_y%s63]̾XǮ\<6YbGg/[0qb:bq눈)@wf_`~%6}oqߛphT4&i9)FNB)4Z)^ IleN.rwvbLacfZ Yl+ƔJ\H%qzhj &*7j;uq f\:e(?W%._;XlG+m@D^ࠉ@1O|{ RWUfW+'[$ϷM 'пK9jCkLF֔7Any!qH{ {}8UO-T ([`vj]C_kK얶D@q9wt}l=W()61&mZ&ǢwD{X;3>|+ra,9V*㼢nG+6m=ma>L iD.Ηµ@GCRz=@¼()zc tɃ ' }nF:>L鵂y b&EpPLı n A ƨdZ0N֘OrH%2ڡv^aM y=f;G >Sc+Dz~/mUh*ID|i)FG[; zl!t70AƊ >{ia.\<*ܛB#D|O@uqbT_^ \ٺT4_lbhe4d.c̾ᛇI̸_sW8b#oxLbr /F rfZ`zd4{GX咈#ݢ<᮳5xt+nSq8lzg 5K=%b(7l,hs@/qy׏yDsb~p進pAr ?aG*i"%P(#8::0)Ct qhVcA9gBSkBr)f.u(gvUȯbmۿ10:|}-; v"La%QnADs qa-=^i"圬tѝKiHF6 _wXfE#՚,PfWeFy6ڞ#6mY-VS07fkw脙E+2pegם'A#x):($<6wKǰ,& *U/4g޴m)(Scn:@۱Ss7eL09DV%DČ(dC`7pt_[ds^q(ƍLth-}ߛFz!7BN Oא=! i.ɵpBi4(?7(xtQ.|(g[l%i WaLM#y*"m3I*M ;֪$^RVccKwtp1բH9,Uƾ]tD 5\$FU ՄhQ, l"w)Ta&4S=yXהdcz“ g(7?H%bjߎks8`gU|Gc@H#BE3]]bflp fr[VǒUK>n˃£{Y?O\⻉6J'CtU"KC#T .=QGkGU|ؗNrA:&e`!dy^뗞w!J^Z27gC!s!q [ SJ~rꆤ|>xs\V 3ra\{ԧi{/tRm,C/`;K n+ Cqx(hռz?C+<$0-Qciq, +s2#i1bEZkm -q0!KM͕\9<`mg hC6uJ*ZGf2Y}#~r&И~ <龴Ԕ7"*@.`)z12|g5$Ôp둠Vyk kW*ypv1c2 G7KPRalw4Z (Kdjr2SĝpnqahH\JdvRLY12F &)L,,e}4rJ+$t+i^M i2O /Dיƥ-զ!zq3AP9{;i#Hn)LyI+>3W*TI5hfg@ݖ,ZzdߙV5.z[>@=/U1 e<0 @aW;+ sK7xG#6phSP(O|W"}/fJ%goO ܳU!XR}㽧YHG6=$W5,X8f(cV趨lݙ.f zXZ_Ř2H7*k>AI&SCΓ +iyLtמ.~t)VT R'xY8WWay, "^V9.ΐI*1&,m'v4h8Wj+!E[EҺDkeXNe}\3(WI2`gj-SOуn4Ɨ հ)l 'xޫ'k#:w)ȊiAd.\MSIXyś*bLw B| 'qEpk?qT^ӠY}(k@LVSUtaT$Ku2>k܌ pj`Nʀze6\8Lnos'a*c9_$:.^ hVb;Zp92E2{c&F0TĊ!Ga[Nil#!J]u#/WJ47 hY!ye_}+rwy-4/ox 93LCLxW-V4^;Jf B fdc }jŹĜ!$9SXΰd)J}"o@{ .x\ׁ->OĢvm|;W(/a쟴n_ Isc_ҏt;e0|5>߂e[aa`Xp={6Os GP85A^e4ʝ%6m:WN5%b`LãDEÈk"BJ'p!1$[ӣm{@6gtoى;1]Wi7C(]Jܛ3IR+^ #F |5ɂֵݥFZx\NDpÛAyY0 +!wŊPsW HۂfX DL?@,j!aTKz K<<,?xC=+Ǚ"~aԬ3k8DJo,nXSEDG*6HucIvsZ#M0kh}<]翻yf\VΈC_,Fdnɻ:i bF/`Q.{f`Ӳwho:`i75wͽ9)/~Da+V/qS-ueࣧ :1 smEF+f?M fQ8@R&2ĜkN['N9 txo#<Eb(y,;=9®f0Ox*jG*mK6< &S?0H8.)ʨcMс рSWe~SDB]1hr%8ؗϒ7 y`Jj=8)~ip\1MWq-:Z'k1l;W 6bU"v!"xWU. ОPDU tWs5J gI*j9b9PD1.ɍJ]& ݼ{d0'80'YBH|'tG[o~s=;-Ӡ~0Giw?Pbw-Ye!B 0sJrߵ Ɏ[׏⧣8i&@[DD-+PyqBkU*,&q ozbT4Q\u ^? p QbD !}nT,dI6t4BI,a _ Z{Z ;ߢy?sǫhߞ b Y{jÖv4auw>MQ;{|fh ݇<_iUbp}Lbu>:~=??Bf}2J!Jmx'n.& K :@|Gzu|7jLzпm"Hx Ѡ3zQbLϧdQmi0-,X8Oc;O &G] #^"$BY`[/yK/ V'(zMYt( ƬlŠ" Շ81wyK*k xnb3|n.@? xN#Jqs?D:Z6,Afc!?RBYp͢jbTWv6D7pғvٗ5v0&x*>3`g mYi/ -Po}lKO&*,k'BCī؛ ;C-(B)Xf75jEn7Er/9Zý3UK"`,?Jjdqe HFȠ+.o:ȡ3WZBvZmM>8%Ezh%, L9N ֒E kr 2 @hXuf6<9]TJܯDuϤN)Ob]=#MrU&ZSNt>RB]ӆm&p_ 1hz\^4"_$~aj4ʤ4C*{t;0$@:HIdpS֙azIgW B2P ̑6{\Nij{Y]7:|Ċ^nEP:¥4xՠhŪ5/` tm% ,))kU~w hQe89b?G{#3' N5'M+aJBoblbz9+zε\/(Z^}ҀTֳqȇ6^1Gˆދ Qc?*V f+OZerXn%gr@՚2NWc]9m ޠu+BUYa/{'ݦEN*3phpG+Gd|Aػϐ=nA䮩㞞;Y$]+DV}lB1z" mv`-~l~p'N<,qY^tz$dW wqL-5FJe'`SQ s,dRQE.)k29|w ׍N9ݧvc2Qfse-&-(LkFcC7w*s ?P;LFAl[SJ_o8w|̹1 qPrʢo/ڨͧmax`Bc TԖX]Dt_~.6R'86kv8*ƒR>+PrW3aj=uX ym1iUWrؼsnXsࣕ o8go.y7y9<A(g]/ #+K`"'I {=A+CHͮ D.3|vdˣ0EqXnHsB1{rhM$YT9V YM|R2Rn%`-.ci|rNYR9XnIPegWd>>"x61Utva@6{0DCmۙ3r7\3(5ꢳ\EQGPT(q6+= ;(_OUtFPpւDށRYk9 O󻨢y}wwXaεw9Ž8 UA(I&S<1邏KI޻f{ң)Aϩ k[~uQ<}odvaeOD lv T_ 6-%ۨ]̹l|kR{8$B_ps669r`01A[GC}~3 _ApdY%+:$o]WNݘo.hU?+8 /G}i^VRQA_nk5/&dedauglH˭n$8/#]>7Q qL#Hջxի8ȩ`h焛"bX,>@b~kWP0ʍGW͈6Wd`/)3f؍S{2ݲ!a^>䑏&Qm]Ttd-`FOßb42/05  Uޅ'ΗCH@~o/}e4DR!9xX1be1<9s@0JSJl\CO|zT @V/}.^>=#n:5Ү~C583?ӌmlwnؐy -xP'q X!ʼ'@Vﻶykz'y|% CʜYp`I:bp(r$*LCb,08g 2a#K o[` ۂr9Z\iRzKZùo+- mItScP76oWmZJa*E{Ԩ&|8.@ $0\j_/:@y``IW6f=|?;vi<+Cw.)$ ~4R$ň$7Áe hyxe[>+"hN$ԗzlԿ-p (, :XISjOp5VO/bÙݘѧ|ԉqQ?;uȵ|zPX92ICE`Ҧ)(;dA2tpdYhMZ(+fynl7ӂZ #SKB t!/ܿ={~uz@"o/-RĆ<\ Ɠ!` P#`7aw,Vgc?c1 9vvChD¡Ά,P)̈EOW*욀2o@w}B{?AO[9v.$@Pnӯ` EW|e#>!ٷQ:{s2X] }u|&0V։!M549Ÿ!#i)Pe ̠816@ar+c*lы8 B@FZ ~.+9ɶm r@|'KQ! ~]áncd%U`?Llf$WR9\#XXvͿ$ b)[sFˎ$nPbO(Zjs,o u)H}G#F,(jb7׼kO`A阭y61>k@K$n 2nAY=4NIW(v!,m7+hsʍBNz@#,O7?X"A1 u,*{ @jm|+yb:{O+!g]L9,0 5!RuinS{T<0:1 ^KTjKZ)WY47ؙB?3ݿݾF=/vtp[5UykdrEB"Z:AACRz_I:|9ZFU2 OK3 QLgّT149A27DQ1k G9&N#;Ȥ❳Z#PJA9^6)1 EUAS7Ix(!P5T531S|}m0~{CsFPRFCH2Y( a?ݼk82p~|,,=B.Bl `zTm2U@ #U02u tqs}4޾O~&/m֖K[:¦lrOKQV9V 1 +FW}[Fu3$} EaDLx[XpAZ'X$k%9R'Rh9nL~8JN=;Qn63|HjRlN~ݛi"o2"gEX=VEːe!}*y7WL-U왜}o/\۷!j_#a~z@eJ_;~p$%6-;@KuPtWZй|GjB-.jف#v0}_DfxP®Z<Լ}`|#G0 )s $En&ԯdUc49yVTiiEuӣ8!,Vю6CK yQ@.#׻z)$p/qI!W]j&;7q|a S_iLT9t$ PN3zTk/3UkU5KmTV۟&"W;/IgPՔڶYdCp!.TK ( Xj>՘i- &d" TZ}yn Rd^UT.#iU nT5:q[Ra%44H>.*X0I_?3l-=iJ&=(="=潻UX{-MAXm?5 WYֲnss*'AKI&Sz >JZSx{i Qb'_ ~ C>nT;~l{PT_~BHѤ<ֳ2`Gæ_o$ q 7F>%|.}ҜzcpUD x^5@ȅοG':zM,k9@a4-*2*(#< N`M~LZ nK4~:TVR C{6ڎi.8ZD?A0Madh// I&1u3S_+,Ujs[X)sT>Xnkg-x 'ukP$ kTJߒЦV=&Ts(HQEΚ-HkNuhKikBdzQġĴEEm G0U3 !dƒ6v2Y*ڲN$x+=U,a&)+Tcɦ6Oha/nTT"@qJvBD3κQ֋DڛK~:t&:xn4)9; J90ᏟNbT'+8>ΨE0e!ʴ[)GjX0&Om'aX[(# j,_9w!U@7U-3- O1@"i(6VbC4 #&҉2h aм`soʣeJjs+)ǿ-ZN2fȣvjUb ,dl>,4߃WPpg eeAGsd|J%I.]0/180Ů ߶ ,βv{=s~+5 :9omd|֣-VZ_z00w{/ʽ>!/p'3@2g{D33ESbHw+e3'o]#IO; ѱSL,)rs˞RqM1іFmyNiC=4zUΧ?QumJo g_}ۀQ X2L$ 48~ZȈR,uC BRo$ qG0\P#.¡:8~$D>=%"y|*!8-ܗPǼIpiȊcpy_iuI܅6jϧIm=-wIOgAu5'1^j[U"ϯTq 2E&WVd\?VCu_xU[jaó%;f[iU! 㸄BO72vja b 0mX)\TMFS]ν>.B.StE> V2XHKB_+&'9S+̻<ѝ.ѵZIHN!L:εĔ%ŬՐqw!&!W8~&)<N"OA)›=.?q+iRI!]G={Ǖ.-\c_{]iʋBŋlZK<8t3o0Z4sTwuHg `yh*Q^C#oڇ|տ4ׇmL _6}̜7(7SrHZˇԀa-2jT Kf\T@Iqʒ'R-=8uĒOPDyTZwB$;HF^ʎK0c A`أLv,$ _Z٤'*%-4WˑDK_Uԓya'Odxs[\Ip(*^̫fZ 5,iǤvًckبȚ?W~ud4}a+GQmPHI?nq3Xeh=Vg0”3c&} (iI!]4]F)]lpoa߿d=f-ws57\&P6Dp=W"[һl\_Yݫ#)X` =GXyyH[ KO0s^wLf'ݮ}?P0ȳ;>Y 8_鑜L'%Ȳ tC̴ݾ!Q`p# {BCz`|U2'H 7|cn~oOD!8N/[a>u43G,7 2jrρB0DsܛrOg<&;hA# @=CN^RiWU3,\c2mXƬs?lWDHOXQafj3zN ],}j.HB77w3ɒwN$x] V9*+74Bh+pDlZ2rNEdziR6L\njX y 7C+-ޡlv?󒩦Sm_.1E1!|dJw},QN{pDE:YVZIrs%/J(YTYj*7uާ).蚞t[.}KQCLb]nR;,6Fw3\UKC2^d>E^5X(Ozٴ} D $i/vLȢ532}#P; T撙4~'%÷z&"Q"DERג[xVC W?!'\piVb*2+AIKنr0.̡5.dWtzXv&kΣU"˓y2=ull9flz1`Wblk)~StB׭쀕ډ+r.W?]vWsQ݈n{@9,8mvKv+B[ux>=f=> T5Q\Vګ[e#N46g4;zS7ME`/i5LY4ޓ󯆗- ulcH5( R;Lzf+>8Y0 F 4d'[0, QN<ŔR\oM7X kB_ߔYfd)aX QN !XYQVY*+jToLN*J3Ziw\́jlMxM8bJ WΡ~>mɄawݣ c@ e4ygN40! iJ$9̙=r]VԼ"4F**QhFu1&`$j0F^rI,/.f3z3C ?O3s|R>]o>MkܙdwϛB֏L92n~^Lk5>_N|hǾOgr>Fn m&nɠAiE<1 _=v{~{n XEQPKa[ Ƃ1&Xdf)ͤT|P{͵-iZq+|B=>+~Tv|8dX #Ň<=s7zd"4 2j߶]NrFJ}nﶔ57=RcF](\徤 >k2S'4xAPh!egImЯJIOg{Æey7񌞼؝jZeBU?}@WXq`>vOs'u&PӟsD5rʏaN/o90׾l6y/=s%ғE2'Nk_{Cg-25 'Lj"d.Hmh@Kq:rP3nb(EgM_UP ATСh}^N{AUAZMVv7r8"b ~ @i-z6!- lZ;xӢ< ,k򛄀#Sg=ź"t%5ҭg&\s>q}J;g( 6w}F%E+uUsuuܾb)k$,.9ZJ'bI z/ޢl[ 81ӟV2D#<n\`kejz؇T= ;:**@s.frAR' y!Ń˙POr31̨,}".f?+]ҙP6 bi|Ŕ{ނ.[d1RDep oTU1˭5.А Ë^'.d T|kd eb_!6@|fmEe!TD;8luȓ+ 3bI$WxH\j ma^y+3!9Wdi޷ 6^n:erOq7iY!O|7ӆ?!2edKx_k(W(ɂ{?e|{ T 47[t)CMzOnݎkhwIK J]nhNXcӼoj$&<6ȘHi_YR#?+_ֺ㊷ƅTu(cҢ=COV%B4"pI{tbb|TjA杈tV^(LM^՘j_%7tɅZN[iB&P/KSgP迚+U7?5pքodXe`8v(wrCP5խg*O>j3Y`kVA»bMecp7,+l꘩ρ/3Y_d\ly2ܴ%%haȟwcaAXm= ] <ߒ/1x%yƖ=;{G8!&4r~ý(XBF7e@jC_ ]g#C9 6|9F!=T֭k$?y-ҋKE ~}EZ2mEz,<8;vZ&Mq#󺆼u&3S\@'>.4Nͤj ~bf0 >)y 7Wp0VނhT\a89l\7 OѾޭ} |Î= ^5,J$8ûLsڶh k =y»5c\:jШDܲZ~,!f`}QuzoGaH~ҍ oZ: Nfacx2Ap@!Φo~i+$kЯW\:QiEH0fFX˯ :y㴪lbQr,=}Va TUERU(11\#M+.b^>R4ǥM;q~Y 2\zbpv; !~,Yz0(,vSŮ.S<Šc˧im'w^qei Z{"]\F<@K}_S8yZ6+3fǹ߶Yʫ=|g_60.ᅪ^t]Ȁba=Q{S/JYeCeS54H$%J8XBg}`N7ܻI (ed3&U+U;Lh^.T_: u%z8f/vٍ]է+7uҺяJ]1\}֢]hT`+C?\n#cէ7WuHUZZ)EUb_waAKBZ ` ~$Oڸۚ_NqܪpNVfLMJcW+C9/nayFq-|-ʈPJ=hGV8OHdva zRZ(2'*Qp8j>Q#^K@: >DM9y<a">2<)ISGwճ^nG%ņ 웪Uӈf˩9zf<ũ57~m%J4l}bEFA2R1jXoc)S=-BtXV::ҩZBϩv{1 ,?>dP{Ѓ߇MX;Sb;H.̒d}6a`E&J։_?. Bf/cʀIU4uI&0H#ɴ־J>R | Wmy6n1Ɋ]dm`nCN dX)ĭ[?ޕ6yFrpރW#Q'T D?/ۂGkwj?|Q1JUMǡn }luN, 键݀D/`P"G7M1/6F|NvyqT@biy: UKuyxWi*ƄRcTy<˚TN}S-]O'MW ݀VISkSżs-0ɦ*?n4|EA"rgK I8 E&?Ndz-@kQB/u ٔ"q='R{Ba} IX!=Ŀ3bECvo>~ Ph14W_%dJ_{t24 ӘBĎhF1QbpՠW$&+cSI/.\'iZ>XH"qUs:, ֱJOwݦ.SC= Б)X:S3|ܲW$©@ *"W'.(aG-܊)AF3n-):05€ ;:869 q kE.ofzKm!;/Y}Ӹ}!2dWpb A9D苇WͽC.U:|b(tX0kwwaubf[CSTu\I<b,2H~@_j/k +jrT ؉rϡ k9Z oY5ecTLzPdW>Rsk)*}($ھd{-yyt!0xƄ~ekfg5W?-E0M$p#6!(&xcmG26^Op5)(07H[1j>F#@F`7OŮڇ9 .A]GuHǷ o,STУab"Ű٥q;St?> P L=&Vqya7,З#'*j,,pi)蘫(g072 R÷0W䷑^$䢏[ni`y;#J *Sw¸u6X&OriOmō3="ǰ1dQTbvR$M ;g q uԺ&@<[$ZXv9dMR,pzzus;4HU ցaߤՠwLHJ3o TNe;+ۚ<~Э2 >>~?ϕaX)n l)(;񖷦eБ2F4$St9-)BĥrD>/Q\?gz>?6` l;ZSv Tl!iimg J8Eu ȶ\u֓BꐙUH\PܘTx0am:?8[ I! ka쒱@9"".Ls h3,V$59feqEijJ>yzmjJ i=Z0gcrVn B8\#T>Eķ#J)'b<.gxY5X1E#ߵ$..G¶QT@hz%m-*g/LhoeR ;2FzD@d5s&\AF={oYqWD~O(_WNaX{\r"`"$2zVMZ##ħʞYrZ d ^rK7vOS_c`!OE^&|nTՉgv%ts0` @oan?j7{6* \LD`0ה|&9e[/s2iЁܰ`UD*E-z-JUd0DX]qapCBW+xki 3h; QSDУ4VewU΅=-V*ء(qJx3ؔ10XNqV.{]}2_=Ѿ V87ZRۺ\6wn:nS֛om`B @N[~u°q.a lg<5U޻_Zx/޽N9'gM3HsYLGe,hzuM,~armUԠP(W5=ޖ(;2UD8B?l5sJh Z;n FRUdMxʘ*yNʅXޏ!gLcB ̯u<:,=F:I* ]cbEǤb">bGZ:0Bvؤ3>x5 rn\ޛ<1YFUKUY4kKW{NZS Zۍi z9)4zha],qcR?XO s$RLhM(BG$1e U,&TRY1 ~4d!خ B~\jCJwZB7diOBQ2]䢼ezܒְFs-FY6VKP-&(jaT\ WXC r_Iti? 9L *KStu NZ$PRMPaT/sKL Y \{Mّ *4~3)~O. 4>>N xOժU%?[^ܴK[GKv$ǚys˃ifFOp, TxMNTX{4;~^(j9<~<ƦW8H=1f,**P_߀}s\va?VqZ f씅Mz(Rw@*k?ds|YČҦ2q@FlT+_ LNߵ5)\?w+O?\|elA^ТEO5hV[3 BΫ8AD*|O-YĖoRI&GeV[w8z0#q FY^\\=Yo!BA#'^j\taDv@PAݐ*zp[%TZ"fQ~El}C]?f"Ab1Kt"@{krsLV>ž Cimu< B·`!C:7QX@/QGwm:tTfOKQ7EdKm8Lh)1O%EңzN7%^=]']:7Utc*P9P+ C-'o2D2Sj䨺+t:״D1BK4-&{|\+xPi#s5cP |wIZ2o\$Q96Ct4W!(nkC TcR]ƞ=,$pl oо҆0/$/+gD%3y %R^p,V2Sħ%HҨxXATގeCP.:M8''AI Re0!6B;,@a\n{C{J1InDv 5 &~-%P;ޞv1>&kz8*c/˨·77A 4 t6!ls:q6X뤬x@r5^JwΌOX#lgeuEwO4ퟴ*Tߣd9[Z$1@Q|q=կ<./ګ EOm;w}i)xc_ۜX<9]Qռnz\*Aֹs2<؀=#A2DP0ևZ "s#A9.Q]u!Տ.l`Š GK i}oA,зS;X`ދŵDKsjGs(sk7lÔ@U9/j f e2y~ 䢬TJn=7wID 7&Y&#>]|WgUo뭝ԅnPSd U$)D/dz< Vo4^O텚܀/e8˯+; w(L^ Gܐpz0 M2cOы+*xh%Y/d~-,m -̴UB!QJ5)gQ?G4q[ FI#MU`.GHz]P_(Yk~f.auԶb T2INP/  %X̀Ċ<=9y#߸utɳn?K ݸ[3!e|?L$!+,E`{T7ާz6sǜ){-l5YˍڋC.3=.>#;-}b k fO=Blz J{S k:9o 薺_"y*ٮ] CKhDQbUƯ؉o߉ˌX_PQzS`aw[m]DJJ lpVh-o"Sx:v#1.b٪ j*m៑>(fz[Ŝ^9Mͺi%usEbF'o\b~ 6ѽ ?xz |Vs˅/"i Xtހo;>À d`=KT7|8Ƚof:ǐ0UqAx!-xp~54zP ̈́U S# V9 c&?@LwCJ5U;(C\D+U7_ekKt9bfDži P(R*V>bºAz:`oAp]> REґ ZPHFlH+}f6}fNj&иrqtwH,',DŽ$ѦGjNp6[+ou : 4^ۯ B>MyKQejr=s}GrK)a;VC7TXDzc-uĚ8dq/kҘ *&ѳ:=dK &qAsކbV3ie *7#=_&i,2ԃ{*A[bШ:S>WC!-++B "-`Iv27 IpAF(Իϳw̶ve'e({\"wS 3LQŅ=b5Rw:mp e*Iyk6@b8S@+os>)_ߔ9m 䭩IiDﳘmץKfza3%-0>CDzF,P},sG0yׁ:Щ&LGxj#S\7hgP7h{1ln[.}yՋ?oσiHD]C#S#ک7)Mt4̕4^aF'0y~AٍtN!fvAgZռ}16*Tn?V< c`~w] Y|HFc)P9FMh908٬CY5ȭڬy˥7)I? EA5|OgmȝgH5]D<䦈HJ]h{m-w&' C 5 '\xveAte{#m*oD YQ[`6jtSB5A6<$c# .%Fb!TwR˼ΤAnC)f\l&cSiq!V!/ݰ=^7A/L>#D) bk{95Q'jd,<| ~&آ:]sq/hvӶxjɠW[\^őx<>B|GRv9Ǿا?= @|0sƠ)RV'vj9ჱ  %q4Jg,Wrccӽl1oź)9!A[|Cy,Q؊mX-z¦P | R9X 1$ƪVq+wuUhjRj.C 2m.d5%ٮgdSv]Wn|T>N辸;_x v"_%P4S%UG5 9ӒaH`3P5m\~+&Tq68)/bj]ޠYPO@_uUr4]3.f`:gj+Jl@#EB손ItwSǡvm AE4LwibYcrvxRzb:l @ݍRHKochvAk'sQ꨻c~}𣩍9&4g4͢Nf&:M7ās1%aiִ8B7CTMvnqRV[q8~Dz $< 86{CZF{mt&O34U#r褼nH*;rUVFz~T<;n24rE]%4U]07K(8N7 ==#uVP4)٨An`bE0dց9 kv*jRG>Qxcx63b#4 Va|Gj31Va$/2v XP[M]` vd㮎GGf?D8Մ@SfW[i2fG[8Sh?Sr<B2{l5=\ K|e2BMڭ1rRoԑjbBB?r/$8ʬ@;fkO6lQ.j5 LTY;PdMvF R"\9d̨Ι^(EgX5]@kc}xuah0>Eʋ%P_iW`%VBjPOG|3t;[(O9"L> f1!6uD"Ϡz]7 ܖzpt%j${v뚵IVl%E ČUE7laYڣWS4S{>ᝄP8!V9Y c tsC|o*o\1|KIb%WrPqjg;s=VQ`PQ9@,hLs]O+Zsk%mʶN]}~C X `p=EP+M`\oHlGUwD\Xe?ݝChg^n6?pe֢HԼ"rW:ٌrO 0$N9dHT*oQROǦ&WK*B~T`L%Yq*mV 9Vf/[W/BWK C+:(dLI oq1KBaGeΉNku3}ΤF'SRztwu6Rcu`b04)OKIAIM$#,Jo8 -P =,f\7\CdQΰu$Is&h0|+ڢoآ~] # wTtC_R "*o7궨QJ5>?9)?\c%b<9O=]J .W8X_: bv'$ o`t&cOw6r vڟ -Ar3o  Y{ aHUF6r89[IDF":J] tGNiH8cu 1g`p$HGu7J\a nA_0/)lPr@)l0ݜSǾ{PW I:nh)[ ┸#3̥0B996HĆCuE; oؑ3Y8x<9֌'˼˪ cU!cC",kV72_Ri`w.|+bEo"oUӲ=1+PKwE򞏧|\޴s@szgks"kseUGUr֏sOBYg"PsgsLeL{xjB_ip. My`,Ҡ*%(8E:4WV!;-2Jt7-0"=27ᗏq$GOjjk :0ØJR_PqӁqYL96:M*ՋSް5RěEԁ6؟A) sQ0iv. BJ.Üm~}!α/1im"qsʫpݲ$42(pjl:k68_l  V)B_ \dϷrKlB}9ҤWᮄHt4g^T5aJ$[OA:sޗ=R6w_D.jE+^d!H)IT{SW`y2P f*\t"O\x>;jφSle# ,nt %I,/<9-8*eHU&)\GխxD_@/X{1>u{M_c#"㩄=QϿM'B_qdl]"i"h@B*&P# qߨvMzA ̑`Y|e;[cGsd@ ooVŋ,?o섡*` PSSe:鹭mUoM]WK;gC/!@D ;#R3eYg>t|IxqZl#X¬ -Wi*+4to}"´=WI"7w_=KAϷ)o͢/n>W_KO4^fC*%4I/> ̞+J~ ;fPwձ!I\V悮J(%s%K &lG,YJ7m"&G ?oXbO'~3[Mhӷ:NBvFҤ&` rjV.}pirz]Y?#)Y>&_3e39-w(7`V쩟CIta+ݬhXt2 GaA6׶XõbN Q/Kk}΂+~37K?DЃh <Veǎ_4ΒKP<7Ӽ$z2ɥОn12FҫE~ůP~`'K.j[I͔ՠ}pl= 8odf.6| g3VILb~B}g/rVO~yZOCq\kӴUG0&k3>#"zǩͤ$XTd2k5DKPI'&@6 >eF1kܾv\U6euX|Zwv^z.ELʪ& tlN kң HX A4 j'0Nc4#I[Mu]N(x[S&Ѓ>cz^D5ml<+fA~ Wr;Q&ld af-Y6y@NRyt?+տ j.$.(s/9[ff띏TIٺHM&L>_CpSi.*"կalh0@M?^z;zu-b''@fNְ30ϧ">$|oǩ)=~+AGvdN;{afncSnNu0ILPZH+Q#S.yC |3'zȣ#b׿_"Wެ` *"<~"^n黳0)T k}ƜVJª~@='!Vd9pq[bB@֦iS7,Ėi{1A.qPL5}|RS#p%jH|?F[@)?Y_QDᴎbB{ּPMLn{A%;eATesp' q+(e-R)U36FY^8裚jgL%Г,C- gӝY SkP6UaqC¦"xc c d3,q5mG4E^ҡm1aٲJsX6o[B$4 %w\RE Y TEs`㞧UFVINûKF 1 ^ -RNJ@GA/ޤ?^o*t!iE RB.$dLu𩱈_eƍ#P+湶nN+nK q @` s1-P< Rʽ ΃zeycƛL?rhc3uupFm]R/CdKn~f/FM9gsOjݾ)PK3L/\ Xװ*̲*%K@`̹c~Mdo|8ܑiaЗdg[s2cZjH\{Lc&YX+wZBhk"s.R ȝ c7c÷K@'kp>=i ]%iGސ[(tѝɏS]CI'% >;.Uz q(-pqVXQ(,L1N(i!;Ro;4g"pCЀ=χ˻tEJ=Z$9*y PD68]/ux[@^(-M_LgmHzEmFk6hI l$"82Mm컗,S(?Giү{ylia4VEN2)fGb7ةd9ѰЙѢCF1%ڟpnm#Oҹ,sB%Pr;wC֟Axi࿅zY֏-71 , CP۩d RGaYtK3J݅.Y,9: pUx)=(ATu !1PMjMC5EΎCbo7Fy&F˾$`$7.einϸ}LSZ^^4g *s?!g7#U𣙵 32窆FIgp=s"fAmrMYG8B9uKrXIpv i+ϵ^a#Ж.) {&\޾vH ^ W+.90qJ=W &kMG66Ƣ+>(5Q n]'x$K}yس UD&'IUo{<,[ |/)@%bbL<"pu6Cq*ÅeU'/TB / /6HKW< [y׍/`WgHlN4+cz<QdϿchd'S۔ DUl8,(\@{TX99 (X^ޮNm:\Ui3k%;ƋZaa&Puc|cG{;ؑgs9*{#)68s .(XIb6ޒX.7- 9Q:?Sh- J?A}" )ca7|q-s%&X`e)Rx=aORzJ LoiöOy! ժm x`AE,Ww76/;Duއ)N'hk'P]]𼵧0:ŭa2sN}wL;U0Fm}eɅSfp*]1jo#Rw!KSn[nOU=m$4#Dtc~'9E1,Ƿh!B0(m_8isa$'p3P^PLn<0-fJĥzR n&wPׄ*37HS0u:ɬ'Qء=P֢~46G7 RC`(XÌT)˛>7FEuPB[H4* ڃBkjb !Ű\`lM˫ĵ$G6•Y%&wD.N]p'Įcg+tĘTT}&*Du[S~<"jE! _lϥ3~t8]Rp h䙍NҶT8@HX466P/_*ta2zvØ(C4֌_zl͞#ҍE]$"h!jINN%3v%ln%;QJr$iU|e@h 'Ǎgby8.{E3N Ȑ{޲Q@׸5ʰA1 r4}y |v2&pR/ϣm'| -/ BIUZst& %M[:/+UC'lVl1VGġw?#rUJQ)b%M898ݹ:w]X%j0\F!I#}|ʬumMC3̝XΙZc,*r_b/}'!)9;a2QFNa`nC-.Ӡn()r/%8l\#l{ (Т}X `ƚў(O?sԱH+.36d,B-w2?Z1Y A"qjd ~g 0bfgmf1;AZ@rQk?cR,ƕCHqu&0+G7pګ)a Ӡ"=b2܋e;p&?l!D7X81BN(@1)M_qa1Z}ly-kS;g w qOgSMwK&nS~޽,;iƿt0D/Ʉ1R_)X䠡;`,W+\S1 *} ^ }1T*b8\!S,eOmjXbIVVh;6#)xW~^O6Ig D@5TxJ{F[d` #9\HNK=!MD(kk4ڝX_%<VBIIrS% jo@ ~2Mk ΙAwT YRGxLMYykD=k򚌙aX6Xl#\t1#OA\?!*pŘ8m1ղASa*JgY[mnO ,_VL;F#5oR6 IMIU.Jhi&?3+z{* kq9=a.o,W pnzX[==`J׸'&h$Q)'U⿳1j:V}" gBP-)<^Rw&wI$dA~ 7H(0i鑮Ɠ zSV\pBB^׀zsK/P32tBGRb$=Vk6YeN[m.D ym:*t,~4=x>}]i(a6Ɯc{vn[,~eǨ$;FM\KռzJOpIrmu(%Vo;)]΁WGʽa?Mjw4oSbMWlhD>עUau(1G踠9.[?3" [i#rR5jS/C+n6p*TP>h7={¯kfa뱭>cv5aj䣱o|n4 DQ.b%3^(2M݂Zo|ZdSil cVQNQ o,$È4u%CJc?k_01(\J 2^+ QW_ÆB @q --CdqmHH4Y}s" MdD) A cP^E#/HnE;jdGz^C iW=\}V+R2D|:%yz=cdP)#1xݾ1ҔH/C, [[iC-=4ooK SV"0B'YH=G F*+!KR?Xt ^Aqp;:Bj@b G-eŊY3 i.0iG:$k;&ҪqQ8-eI@ٶx&<%YF E{[ /-dKLl%HKC`\YE9ij$W,T5YWB5~8Pcff&{DA#!ݮC)xLn,WM?$_?!=itT6 aq s\U7Z"}H'=a%}mDk `}%?3?\`xR|@xjoڈ}mB~{~[ހ0}N!~]}7W4jB_JCu6>rq b"Ϭgga<1vmͣ]&v-P9PIFkzvW4Td.|[8sY;v.3Ay⭉BO-pm+m߳b?a4 f?Zr/'4>`^+@=fWj57s+E/q*nØ5`*cYTV!Kn7̗il HJF>HHp!}p..j%A]A+4FΆkdsIF}!ۈD̚DobmɶiS>֊+idݷ>5+6MŶU.}_}sd Aeb|s0qm4 O i0Ȕz2]BuSOy=(Nr%Cko8ۨ`'`4T7pʀ9bxETz8u-i5ْ-1?]%? Qg[=8|Kc'1#6) 6NvON(Q?fLJ\p8Up]Sg;9xkB;b.L)J-7oGu_X<*7%\\kA'@ _oZu&H3pk[^sKW(~}UOnK/[   14&*8A9IAlLc0E}V5E{$ІjЖ;tl˜A޺\wZ (3=$9ApPmKhޠv}ա|)K ѵ:xq?u.WDU%n+!s#&Qv%2W9E.b*6jf$'WթOп)]C8H]4 fk[?Z⋧9S8<ذ@2j`{-E#铰f\'/f$a`W%nnQC?>PVq݌A;dnz$>XϽ$LdkKxy%,D%7QȵŶ8J iQ"GV+g[nGFȠ߰]Ķu vAiDRQ|Iiga\m/ rJZe4j xBT`]%d=9|IGTK cE\T6 S7z6%-N 3su3(bÝ|fcwYIv"zOia(rE&G k |@ū]#[1៾ *IQcK&kHY c蒇>*@ @lb'y(ŚT@a=AƓLTKP-kiҾoǻ-Oa5hEbj'}߬D&;E{FGpe{L9𑼹ńkI IjÃQLȘǧzۧr ^MA1Ec m^Mr1">Yt# 0-x^}y0[)q9{ VkewM4>,Q+,kx?*Kފ\WNޚ@vۚ >GHJfR `)—r6!J5zT6Z+`7hXMZ b}}s^%?/xH׸NtKmǀBG`#+N|ƣh%u3TKgzB"(I'@|1{ MVt fZ$Nnqr׷D<!z Ntmj /j%w'Ɗׇ!v:,Ur{54marVPFySB1%V+軍?B' ou[MYF\}z:ԙԽP~3m~% ӭE 5HΌNl.gj u;f&_#3*0fu%37?DZ Qc^Yep+?+U U{ 6w 7kDZZ-~ lhgrQA<'abdYceӫ3Ci'2Sj(AasfR]̧LTӋ_vn<`jO=,$9 Ej|DM~HH|,r>vT3B)MO ⯆yF V =Xk6 ) 6u}Б$ D6g}"}fy{3#LX E>]/ ^bOW)6JK2zfuVtifmi / оmHMKJyOw; j bq7#o7g͟J?S^e$`M< #IxE!}2ޝET5!LxA)Dc78!#оy)(4lLK܋cco=@Xjd/ODPg =,VܢV;Ĕ=c5y'AMBEe`( }cЋhRPQ߅0 sdŭbH4\^MIx0xqzWt0 ~ym-UjI)=-OEw(YF:}uqMpH|;48ۧ={@-"xyRtJ&*ZgKO7QB ҷŭvYAK M 4IHpRnݘb:?j0wOIYd}9b;8e^pZK+# v; UOx*9AK3Oj9|e`No8Jw\+9;_Vs/ŬA!:#"E3⡳,ȴT5OIdfExnk."6E O)jc߶9 `@6ι޹kkH(v^'ɒ'Bw i4єXVk[ʰF4{,[Hlىec/,i'ʬ.yhwUI)l5wxtܱl˻ԮEnkE_8i `m?;b&~j!ٺl1q4yqrz!U[ 6հ ~f 4 mv NcsMzp|.R"5H0G+N)5C|u9~YwU |E zePUnŚ}J+E@xyw⨵_~7`2{ .\`$RpM(V=">q-{Z&iٖhd hJ^i{o$®rبYfaM x"1 u™V/$ o&5F. MOf&tT79gzP;A05@&HK.~V'AZ1u6{OIIQmp5,H7$' (M~CQ-9P.6kP-p=61Hj 4vZg+> (,隒o$p_6ݤoL2'@`F)u`)*@|_Zc1*'-J[7ň!*\8FSMKd4m7y]a5L֋*ww;O7=)n^L`e/[0wU-ZXؑ7/l`|O(,?@Y79Mώ55>L"Y*]& %b7xsъ=vȱAOYDWƿgn%dyiriJ04@I>ƥYTݷ04[yu ĝCB՘3f7%s=P.yr=R6&,HVMsI7 .sRJWUYlӚҊ`ѫY2\a#TSb#ʬ>jzyP%%DjD#8&o3BA548zƨ;Ů^“_D>as.(g7M  qWNMKH3#cr,>a&x%+uIVb-AI>a.dL4 :;814X/Ն-'`@)%z2pvtC2w}05#U5nD <\8x92Z.CAȼ04hw:GIecfK9=YH 65n煱X‰}D6kqz!+Jl(${5G'ܴڕFXדX #rݨ"(vEp#Hm2 $t u.GZVG so'Ql>Ҵ(a)rs\H^7OVi0O?-4jߺ_Ҏ z ~&aoC@JdIE#} ԍtH~{̍zsVsy{dhC}35y|y+;gf|V/q',̳x:E_ yቜJ >:bE~j_^냋=ṫL!ޮ#؜#:)k杹 ~ƾ;F]۽yi&{Gz6Y %ҟ D*C)TZyzW| !DƬKj<4ë*V.;Uᇯ _$|9.ʹWL)"@ Iܷ6<)h Ϝ7B.x&_f-$}pcDH z A0_\K>#nҊK6 {@"ԖfP>SێxuT ]s e(SFl0Q]%*[xCY5E.'O1n n$E~oeܱ"ɨ𑰐DC&ŁqYnv =[HQwRM t߅WEiM>ͭre7NM'`Y2m|l7j[\$6;#Ua9#n9$zqk@!k2qN帆W@{mH! 4pRҪGƴF*Oz#lɌm{HAAܫiihBU~?15fK{T{ZFt.&a>WQ90+5$p[[nq2],)3Z:h`L@ x@ }{ ~t0-/E4m` ~!lFY }F"8#"? ,<2cˍSo[9qbu H!&5P0A'ҝSj$ >4~[T!~y|E;r7P9RU[$7o{˹WTyܖHC֓f(VPjh\SJ)]6v0ZW0ZagTy3T(,ޕΣU7 O\djΏ :oq>adDGJs*0th\Do<9!S w U\u` Nk_'ԥV 6mD)Q#isK"(UK1<xjC_3{==h;)aFڈKK0n'EA`>`\U1f?5˾תxu.+\p(IS댬Vs!\.C&:y+Xr$J0/S4uŽT|.Y̯+}k$%e:}Yj\Aao43yE9HĕAL9d T1]Lʽ^FJY/WUur)w.-KKsPȴ[\NeneQRU3̠ lׅ$6 %M ۏ'^=-]]'N9X +f:S:ߕu+$мp kڳ$)9& l9 B^O=LBG(zG=b?e7*\DK4g䝇c;12*@HY. D=[4Dw c)p'r 4Ϯ93yM- A{IAlLL5k̔Jzt; |p.=zIV*Jɪ-T+EetPHS;^K(,`\ߏV(⚷_@r8((>Px";nIEax(LRDxmuK6[o'C~~tT  #wKa9NA * NW-6xv-&}A D,)V&M#@`,ŗBWeU:ԚE.sG m(0=xP,k>uB~Qerhrc=[FZV'[i$>qw{nM ?gI5@H T4e5/@ B,TZ"h4LT N^E1$.:@g2a[#!]+ I`P"&]Y̆3pnpp׾a5۝ 9'@+̲A`Fj7Ht8⋻;(RmDd,㵕49[}Heގ2J5]&bBhgD[t*zi9$dwbW!d`Iyg{ErqBgcMRBa:ɕ"4o*J;X_A?7Fw =y>eJ+bYf ]=vSYZg# p5 Uq{5Ã2od]# eJ׷Գ ua:rnLad8.6=I딤yD΢q>L /I4ԃ?:I?R:#l# aN~Z5"Fʴ3 97;KVܮ{%v ;g_jae/ X8Og7,m( dM]"fѬhW iv9uO]Rj3'TwFOGw>t*[of#YFT& 0;E> ZJ7DWMٌ\;Y^fs L\!83Sn,tg I /vc|$I!7?+Qx?vŠG )9t2УC5{|X,7 ҏ5.a pA/0*mD턏\KR+fpjʿz#M4m5hE40#H'\܀r?rؽswf=&ޅsOT'#@nWVv:t*j9hG|A;E4 ibۣqFdes<dsɖly޶7ة t͗0ZcѝWI9A=d^('ސңJRމm!%Hz}{:.o !LWXwA "b;(/w,F}y`Q7٩T4?{k#7;9;FH{9 3jJZ}-6&}Beolb7TT c<0bpoxMo5p6|c<7*/R 5:$B9)LiRC_LS)xZ^ssma .e>[tS Q]AOSx컂BkRI=F/HԷKO 3|S"y.yh,e@sdtrsa韯خ| Y:jkـb$ЪIb|Qߊ3y~WY$7):"9N96!'2$%dʻ1S^f5$hA_cQ.hfN2eJI7xإ{Խxi׎U߃U`ʀXyL\A3h2&$-du͝z{G*4śn뗈*]Pɭ =*ޏz  NC>F{0ܫ15i ! daĹUbnb4.dą[q`&?i'MVEbk.1>>e{/4xDtozT_0z|+ H3G,KyrD,P;Wȳ᪾az)-??i=Du__sWXlx #W'@be5Uɹ?:styL~)#R;KY/tjQ݁<9sgrvv÷p% Ӷk3>ƺ8J'E!b@9t$t"F(@X5;"CB@M.^O3I޾A8k_uGK)IUgE䍤t% s$[)5ƛV=ϵ%$"\/Lȶ@J[ {67IVnl(E0eb{Km1ڨqhwZ–*QYѱ`Nұ.PASP>Iܲ?1F|*%0XB޾EH G0۔ZGE$ep)kɧ;.Htun vp^`3wD]:tٴrٿ#?0{A)p9 ]l!#hV]_2bBڊKÀ8ss%bset19ﵵqa/ƞd>4XBV#H2XwB|tuت/Q[V-@f{NcF>SRhZ;uV9fY9FHlu.^fK`Ne.1M~z7 "WGE'5\FCqbk7\grnҔ`\@^ICkl-M3CWsvM'kPr7g5xWU bі<0\l1&nGRoi/<9,5, $C4 tFHeI6 wQJ1hqp\!`[~Mb" yԹR#B[/}2r-nmyk{"j;T*=cLI0x}X9x1M@iWKܷJH@(lJ^THRu>EkUs5~7t;1,K u^.`} b\K◘众ǞX众y{I'I%^py=Ǵ"fۤ@.$E3V1b, 1d@t0001b̑,]1bŁ#t7@Vcmoovlmvhdq'@3Wtrak\tkhdq'@$edtselstq'2mdia mdhd<U-hdlrvideVideoHandler2zminfvmhd$dinfdref url 2:stblstsdavc1HH0avcCdgd@3<-h,sttse,stssh *ctts                                                                                                          (stsc stsze//@[ z92N  Y2T+VvZF$? H" f  I a3z ' L%y c[  6l,`+ ~kw;0  |' /'0 RL8|# 8' q3D  B =!a ( b : j  W ?!3) F)  +k$x t/ a n   f 9c L S- f ' #V U _ z p*m | y @~ [# y%0b'35 V ' U)L! ( (S@ )*) vx's- # M; u#A&~ -$9  JM=K&^t2WB+I; . %*\ gA`  $}D8sEh#) qLPR(f N V@I. 8  G !t Y $ b u F "z h? un m j "e $  /  `hO$& /0F ~ (8} Q /'_1+`0!.~ ]< ? , 0(9 A!53d )"ih  / ]`   )   4 t [  q D  A o  +&  / G X  2  ; kJ ( Uh: T #  ,Xu ,yA \W|/\ {T[ =.c K H __ M LR'G]G )d;L1g  Ed pz u|  p3/XKY| Uo**[= $T %W  4MN' ~ N[A4v,tj: P i ay/TnHbl E nT-yo7*aHf   P+Ro;-D:W @ .!"" v@)  ; 5;[  &-T 0 9 W  Y`X|d<(  stcod0a}Ӹg ()FPZ"py Q7x+-8cZqhzq[zEWؑo$ j%*35#Hto/|Z C@^|#{5GXZl}(k2؟/BW kGG|4G6J^}7a-RlzX(}?U~v+` /BP@R{H  " t 2& 45 @ S h {  P a B D / ;3 F. Z \f ~` . u  d * 6j A l @ ] r  % 7' C S, p  R / V Š ֫ v    % 2# ? L_ ]? r< | ~{  > "  "->`\jDv%R–z+47Ygjnv{Uˣ@/G]Tb|e:tQac+W@0 N!6IdqI_u֓د;%!7I2]9qr|  ۂ|p H^JiHt b {Ka02`CTg{NgČ@ؗs1"5H[X\l{oҒ  E*/<Omx;QȈڨ~`9BELU,e{͟߄,@S~P  0t2Cm00{[rWݰ^A~|z2@@N2iMsdӁ<+.AQYiw\H  +:Gjvklu+*,4<cGzx]82 ` } 5 NB Z gm |j ~@ 8 ʯ L !!4!H'!J^!y!k!2!-!$"r")"9"f"v"x""""#$#N#`#Y#}#P###E#β#p#=$$$*$,m$8<$R$bz$oV$z3$($$$$$ԗ$4$J% %%%1%A%L%Y%r %%5%%%*%%%%%K%n& & &6&8&CI&`&l&v&&& &=&m& &#&q&''a'')'7'9='D'X'f='q6'{':''2''''Ж''(f((((8p(9(M:(X(g,(`(((q(((())1)D)R)cF)~))V))5))a))[*%**%*4*@*Q*p*yQ**=**|**R**F+++ +"+.+?+E`+TJ+^+c+ik+l+:+)++~+++/+G+D++,Z,*,3,;,R,Zb,q,r,z,,,,,ĉ,ʫ,,?,,-4- h-C-)-1e-J-R-TS-]z-~-----i-F--O-...#.0.2K.BY.T-.g.|..?.I.8.ř..../G/ C//(q/0-/1/H/Q/}j///[///0:00 050M0c0w0y0o0;0Y000000301 81p1181Ap1H1N1b 1i1k1r1Y1111h11w11w12 22#2)2*2:J2X2a2f2l@2e22262N2ć2͛2ԇ2k2c22-2 3533'N343B13S93c3tT3u3-3\333^33Ҵ333442z4B4N 4\4uz4444444A545-5k5n5155!5]56m6?666667 d7)7T7mq7|#77l7 7O7D7ԟ7+7e88a8r8)8B8Q8]8g8}L8C888w888888V8%8p8999 k9-49:9Kv9Y9[9l9r9w9]99999929̱9a9 99,99: !trak\tkhdq @$edtselstq mdia mdhd}$-hdlrsounSoundHandler 2minfsmhd$dinfdref url stbljstsdZmp4a}6esds%@VsttsstscK23JKbcz{  "#:;RSjk*+BCZ[rs23JKbc8stszFC30#(F-E%5"%:B%%/-B"G)+ ) %80  D $   Y +!# 0!" +  #! %  % %! &1#-"  (% ,(   !' 0)$!0 #$' 0 ! )  $$3& !* "1F'   ! )(.% '- 86/0 3 :* '0'" /7 = 9 5 &% :! '(&#= -$ ,- .1! (<!" !)$4# $  (") )'$   $#$,! @   !I A#")!"   -1 )1' !5      ( (D   !  2   stcod_{HnҴ4 &(jEOYoxR C*,7)Y/g}p[y yIbBK$"2 4"Gom{:fAMzQ"r4FWYk|Tגާob.AUj5>l335wI]Z|*=0PoU'i>T}Y[ -@NQxz 0  d 1 3 ? R g z  ڽ ; K 0 0 .~ : E Y [C }S _  C ) 5i @ kv  F i {   6 B Q o ~ J  J e ա k  $s 1 = KQ \ q- { }h w ' p !l,=X[i0u5uls*"6Xsfhbu$ʍݸ-F;Sadw=9iP_bw/7 4 HbpI8aoՁך'$5\H\p)q]jځdGG]&h'rO}f2R/1`BRfz*UÍמU!4lGY"[k{?цe -);Nlw|1oْo48AD(T,dz̉p+?R}w?Yiy/[1Bl-~W,aܭ]1\S~1?MhVfSin@*- PVhv_ʽz)8FiuNEE$)+;aym.6Q @ 4 M- Y fT {b }0 o ( ɗ B }!!3!E!IH!x!E!2!!"c"("8"e"u"wf"j"t""##4#Q#X#{3#J###D#ͭ#I#U$l$e$)$+J$74$Q$a|$mn$y5$$$$\$Dz$$=$Q% %%d%0%?:%K%X%q%% % %#%%% %%;%Y& &&5&7&B0&_&k&t&}&&&F&M&&&R&'[' %'&$'6'8'C'W'e1'p'z'6'' '''O''(C(w(&(7b(8(L0(W(f5(O(((Y((((s))0)C)Q)bA)|));))))N))X* **$*3*?*P*n*xY****e**+**+++-+!+-+=+D[+SN+\+a+hS+k+(+++c++++$+G++,,)L,2,:,Q,Yj,o,ql,y,,,B,,Õ,ɑ,,1,,t-~- y-K-(-0a-H-Q-S;-\b-}----N-^-(--@-.w.m."./.15.A~.R.e.{)..M.G.x.Đ..Ϳ../3/+//'0//1/0/G/P/|O///i/կ///)00040L0b0v0x0V0,00000s00$01 1U1171@_1G1M1_1h1j1q1G1111a11n11J12 22"2(2)2952Wy2`2e2k22 2222/2V2t2v2m2H222333&I333A3R3b3s;3t3$3A333C33і333441e4A4L4[4tf444444&4-5(5,$5i5l525u5 5[566>6666Ƴ67 <7(7S7lZ7{ 7777'777F7`88R88(8A8P8\8e8|/8:888d888888788^89]9v9\9,$999Jl9X9Z9kb9qI9v9`999999+9˖9k9'9G999::yudtameta!hdlrmdirapplTilst,nam$dataVideo Transcode Demo&ARTdataNorbert Schlia!albdataSnowboarddaydata2018%toodataLavf57.56.101`cmtXdataSnowboard ride footage taken with action cam 2018-01-13 Saalbach/AustriagendataDemotvsndataffmpegfs-2.18/test/srcdir/raven_e.flac0000644000000000000000001345464715052412651014674 00000000000000fLaC"3s Cp=Qn x&-VN[ Lavf58.20.100ARTIST=Edgar Allan PoeTITLE=The Ravenencoder=Lavf58.20.100 YpLZ f绨dow_4'f'$X8}a80b^++-:ucCT3Qغ*KD #nii08f|@ UժB}%\91mQX\ڍ[ӿUdz;vȅ,fo42 \ΌAiIO< 9>1K(E%l v!P+KC$VU$F"{9?WҍS * UY7X`]<4zVҼ/Zgf'Fh٧k*QR(tOAB5|@ ,*>5:dϙDn&7Yz9 HڈmQ|pwÙĵ۝u |E}R_!ƻ9 shi|Kxg F$ vMԉO]9;)2VKi,sXd|QӬrdGM8䥸]xIж9EB5AO3OrR=L@V@bxN 6#͓ N]'6+.I-q(64f#}zbf rSe]xk6@Œ*c٫ ˨hl3& )i "y_ycTr5_4 L-Q;v!Eܱiё^FQ(BQVFRl[0jkSLkIf*E٬4cYt镕z؊\Dm+A9)_c3Ȯ*&ɩ;t7ޣԃ[1ZbW sb!@S!4_ m!!@M@竴G " v}>7^yQH\RJWZ4bWɺm% [)BRO DIg/`4TIsk֒C::.H*ضrI}eOVy 3g3u0$YjFƍjI9QTrdپ]YL1I'n*!8w8'Y6Ź]9_]S٢ i |,/U)tٿBYS42N4!A, $MThVζx~\.L "ђ7R̰muKZ :' q8k%du))\)vr1nZAVxAEUGmD[F ^U߻5HDk22cUq|oNlI*AImYSˍw=W[EߠW.WɌL:,96m{+QМ잶BQ XTWUh](O"D2Qff;Hl;?gy.b?!oSVPR) jT'KԿ?AL0z3؎k+ޗ=\uC lOƈE70|LMGjLGzXf"B[lK&9\\^O %´{&1 X7U|HIDܝKO.#u]"7\[ρR #։ځq Dqu4)INRvIqP*IA޻sp%ћfwd9,0x-fӱH4PaVzɦeDy\5}\@ ,XdP!b8SvVGU"y$Gzɛ FLt嬼Ч^e2[iHDAbfkہ|w#3!;ʷ ۝G^_|HŅFine>JǪIal KEF'sqp'tҚ-)$@??=_D3+g8_I`(YrMOO^syhK (#NBj Uih:9>IL*=ޞT|jr?NDf{8h-%?ﯜ$`YAa[Ҫ`wZkpZ. ^PN mª iP>I@'0s5ڹ.9vbO[ĕ7Ms1;7&'p.\&{1;:25Rf1rfYl u1U+O)ӂ⡨+ގ")) }p.fLBl˟8)ySuhJ-B5 (+cr]*@l%%G5VqAC 0˾c}Ϸrz׀h316MذM}ᠦg) ƷG%;XtIBk;XT!7eos#Wnp9Xa~M̅+{G&3:X+/,QJqnu;9겢}o$_A _u) :M₤uc:'߷C=^,?WJIRVUBΑ0B9HVC)A,zD@MaBȮ`K6 ^ڜVQX~fJ)Lfp5Hs:I}ŋXnG%n(7ڡ#)N @c,T.sq3ō)!8]hN-a<.X/hL $*v&1vGʵ-!9/:)KOTOW̪;Q -gs 99}HG?s;:.Ȋ*ӌU Nj H'=7rR\"a^&NIp]ks-Q-EOnt@UeThZle37Ė[(ym7dĤC($gq ߕa4BTFMK|{$\*YPc6zS)=\MYdK4RVA#j 1"9(MkaM - ֻ_!)-Ի;!ɪ~y"oƐpcK:'ğ8+l"j!}BǴM+M:]RzJSʹ+c#A1ac֕%F}9ͲIvY)߽Z7z$eJ=j4xC&iT#V,Q+3QC<([B|w/-29oHDC9Po)91ѵ >/])bTD'Yhk.VH"3[fG!tTEA6}Tf)InA9%ɂ3,"`ţ {VΞ(B5I(WQgw>h% v%MhRX_ ֖|6Nn>-Ru]B{%*n6-b/-Gs)τNpw\b*a(u5LYNgl|d\Юe呡dz08._yYr̢ʳL)bDnh\$܍_b\ʹ6:Vml={je1[aLފqn1N,ڒv K1/턴` [(=Zpa#r}섹?fk`wᙜa8XZ'u  jQk;jgn'RMeD{4I ti$ >sg)}t~..lDKZm-* Da#MB&.쭩M;(t媍,i氰^Ѯi?'CHhi6K=E-9SZi7B},WUhLFETzl(<,~L$4_ w/1Di`/ɚۢnj2I.Kqj5qJ"8ǓZkiV(^AͿs-Gh@-;^yU :WY, YA$!I;g b0ef.&` nDX*mQ?L6A(;+n 6)O90Qi_wzXvM@W{4V|\8^41^8BW8{ϣ|`߀Z<{W4_C_}[;ZsF,WwKn`R!GhA@݌LT(E7^/$փ Q31)er$9nP+ $p2T:]ĞC,'/t%ڨP[ui?WjlTys4IjFl7,DGx˽Suڞe#q |I̱,=Oۓ\Ƹ5\} f#nD'de02SMa<:mI:̴NJ kui%,B?#d6' 7zHZNTqFMiC9t 8*Ӳdt(-t/]>Jq'D,ȭ~b!PQ2zE'(8. fQA^+.īZ%d#?"7 .[PSe-{"cTLcxSY>{澁7a\c(8?yI|-x͈v%=hÜD@1c G \f^kvxUp@^) (CEhsuä;[Vt!4tݹ5(CqfF4 vA')@[4`)#G_He@R8WYgEƭP]6!U=Oިd]zX֕4Ŭ?$#\tAp"h0"PYbQq 1 oX%lEȐJRgbhWHW݃:!:4o'ƴv~ִBT{?kc`,m8 +Js&*$lyr&L$yL9fdy$?'3$O'd2fNLI3'992O眜grs$2I$d$$992~L3$9$2dϓrO&L̟'&g$2rI$fI&g̜̓$$O$ɓ$$'$̞I䜓fs3&I9L9$$ɒ|&y&O&O䓓9?2䓒Ig?3'33fO$$dL&L2s&I'<$$$$$$?''3ɒIs&L̙9rdII%Id'I3d$$?d''$2I$$ɓ'L̓$3ϓ̙I'L癓$M&|$$2I$3&s9I&~rfdI2y'$O'&fO9?3d9$&Ng3&3'sdI2fLI%9'ɒ|O3I3əNdII?|?̙9NNL3&I?g'L9&I&I<$d9d339gI&s䓜III?yL9$2LOs2dɟ&Lϒ~I2NNd'$dfdIfI~NyɓIL''$Kgg'g9L'ɓ2I'3y9'2rI$Rs'$32I&g9Ly$$̞yI$$̓ɒII'rd$$YL%i5&FһGrCbw9&6!"G5W h'd||oejD ]{#F6R˩θR&k2WQ:E \Hz|rЏoZ"zܢ *)<nZUl)W%g+j7m!U8B/!tHiאI-:,Yp3|GzYZ3g;[ht@$9aaYyn]Ǜe:C;}X^be|q/sI޺p,b:qbS~V8+\N~쨑H1'޲Ѧm9WLs6ͅy34yoR "kij8-:hVaۖU9_V.7$wRA%8P"³XBqod3yII% P|!T.TknfS4ۋ4l^vծW1¨d*rW> TF5F"M- ?Wxb|}͇s Rl8;esFш 6E= v[}YlH? ,ba #xk|JD<7/"Q4s(f~qII|HH_%h#Dd878wTIv䖷ʶ3m2Er 5b%Ťqs a BoSC+ #@C,}6xD+̈D^5I~Π_Eab 2OL^(IisUh*5ݳB,>E$[&_\7y3Av9ʡ錻7E4#[N@n&ڎrn,7-U=6R'X)vxB!B#b[r3 ia~,cAwSf]D9Sl4!H˺4BO|#(F~?g4E.MiRo.ЦP#=z.ʰy6Fdغ,Nխv,$:Wg !SK@0$bӝ`T=Ў,xx];EvvQQH[aʡKM) ۆ@ii.ϫ"NZ -"7)JsNu] ޥ)$b^u"y\ QPKRD(r4cy1z\~k`B^%$^ȆVhOyA; mCCt6fnpR/< K,9Oe[`Nml_IE茣,Z#ڴ {1܆7u:ћxlv+&.l5=l% jߧV4]\ Q U4_Ь@1g?zva &sa=:>MdOI?[O S=Lf3ŕٓN-r[s^u|DyPw>]<cPDHS2' $5LR%y[liZjk_z$a _ʩX9eG}u+=벫75܋hul~x=e,I΍x^ÌUB4GO5;Sd4fղ9ҧK}ѽ`Vh_)?\cJ8o#jOiSҜUҟ+'t D]iqIjijBbl+tڒF"pt"[U(IT@oG&lGp*SF~^GŽ*,~(;DiL5^zwiTPɀ+0LxrȐ0)f$5w;5sm#$KÏ ѓ|Ju/ Ne+FM3ºMpmcgiM yP偷n'4EBcmbzzX܊]ŏХlU-I.tAvD~A;Bɂ(D qE oI[܆G?Gb_-+pK0R+9a7b!4T d6)]P~j?C 0ayU >`k9+6jwq? mC H5#vU 'YK^C>}&HtϞAR<!tR'`qӜ ?x:ɭFCmL #P`Kogo5dZ/LI!%SiA-Fā,4儔Skj\Pw@&M϶>d%3?C&X?Im13tJHٻdXQ"ZATI^ȩEf9F95&LN}Ǻ869řT:C]Iǔ$+EIQۯⷚUeO+30ˆUW/&DB w.΂.}S #'sD! FmѲerx ,d@]30ywF323׎,2Mqyss>Sh=FrTqAK%0{])A(]g%ilX"Dʘ-٪hT`b*$jc cv_IՙpӢS!IJF# D%:1ZέwPbd>s^@3X'bQߥ=kI!uwKz?[Г)?&{ vgE%DS ?G;J1vSIQt[?b^SC0O*tl +WeD\39ZBj}2cʻ`(_,KIPryk}՚Z|( 14~RD"Ȅ{-|IYJ:q^(4pMMìT&Q+u[PKaJh\`S\̣,бa碸QR8pSꂈG[u>:#$I9LڱnžKDD L1ilLS-•Bу r6UsHx/]eH%]7 M% A"Z'j 3W{+4lXp5D+9%6Ղ_PgJzSfbT~m$Xɀ#tT H30r4HsP=\U!ڀ X_hy.VٶFD OQ7` B+wj\,@. !~TƠ?q@T.'c8/Wvfٶ?L@>j ޘICR]p+W$}iP G:˛ /}s-Ng>Š&H_[[SeI;ty׾zL;R&3YؙwHu 74CV'e}Bjm )i-X+slWwzd754!sRP8)W J 4AYg yO?0k,b)2?Xha*%)~ :Ny990'è_oxe"(xlnWH[[d%l"X"s/eF$i)Bwp+T'd@?0YX>a 爫Y"-ZI#'ôPS#zS')/dJWLlyۊxEIƅkq6ESc VBk'w精gk.LIOkbD`RNj}F-T!A&$}EW>R_d暀t51jVpLy<̡kgDE]Hܒ~]*goNT'RK4baJ,N<ĚQ&aLC/w^0&$EibC`8^a XkҢڗHb3h3V059S*bDvUGtvX8Lx 8L(b  `,/R471Z-C# IvU !N&I`NqOp ʴ?dn4~ 5d(:TE>9MCV$7FF6-])XY]`0Z5d1F:/EMnCwm Fd(JXD GgI6WU"אXۺi' hW?I*n*vĎlGJf_HǫwR#r 򢸪D2&#A{d?LX?mG飴 x2ުj- !k _TvR.ÿ1*))Vٯ<߯&?aMdcsFp`8i skKrE 6m_.{kW Iܹ|y'V@dCX > r )q^\ >Ȱ5)+#inS;=>_/mD>d5!gKv3eDcvqĄlpd]lcEbyFp탠۠IYt?^}k3z#N^Q"g0ƒ C)!I(V gbwPTzS-l߆P6&R țӨvhSStko< B?JٜiiV{8P'lRtl〳|!+ӄ,orˏk[2<7q-{|EuÖʛ'L7HXKc ,ؙ[Nyăak 9L" 5J0"7lM#U  Dc jpYDt̉k1+N^j]/R EQP7)#M,<GBA4-P9N-)Td2 y;qg?ٕa6Ǥck,!>#'<ަXl"owi4J-'2w I. !1t/6bL&Jxg3I}e+s~Cp[9)ݦLa/2Fv[VX$3]4}#FujD"OkG3DAS1tKKM8ÉA*G7]^T" p ٨a œ#3𳛬EvڻSYIqkapI[ fC^cJv>:G,;\WuSvwo?S cqЂ!ߪ7A)JP(QXM9# 8oۖ l$SF C/R>v. H ъ["a4(H?7Ǩ~Q5\$p\f,~H쵑#lxbBLUmjn[6g@ C;A簐@nl}@$D}@8vr) (l5a e9+DH}GPsa^r_ `X[ZcFx@lm)$MёJwd`:nB~Z_ E jVyDI},&ѷ&O{ y%ut0 S#:HUFa Rx#zDg&>_풇7)ERzlz?h2W. MDb@cP!CTz{|йחz,aneP/1mq1(@آS_SgQnnx F!R:c!nICa{lU(r~ԅ$MڼȖωͺ qxrfYm1[UL/]DАbl[GN.*d^N%IKQ%(op)!/nC4&@=J_#Zpdj?bD^nD7g,Ҿ,"!=Ut3^kĉ]R]PCtcޥ'eyV2oVN/ e}ܓ,U'Hu%SVH{!;?$cXus׼9"!*]qgWz{(U~3Qbh4?hJB #8l>L3$&g9ɓ$ɓ3I'$$$̟$L3&dNIg2I$rIIILry3䙙3y>I̓$ə'3I9&NLds$ɓ'$$̙9$~L$d3'$dI2I<$&I$2I'2I2I&drL$drLrry$<'fg$$$I'2Nd2sdI&INg$?|2I'&O$s$O$$OffO&I'Ld2LI:2s<̙II2s>I$rd9yy99&fL$ILɒrrr|$I>NII$2I9s>s$rNIy&dL|I''$g$$&g$s&d$LLI2OI$$2sɒ3$I3$I<$L<2|ɒg&d&O&I$\2LgIL$Is&I0=<$$I|92NIg<ɟ$I!*VMջLPmZq4zv p3þ&_v3(` o<(#‹g__|p:N<8$RH!7D]O-Թ ?YX"RyRbvi762WU{uRfB}˙fjAV>3Tl}kQQEDmk akIv.{3)Ys'܈ց @O.8Kr6Obkh%l?QJ4|Bm b0ds}<%=ka6t)Z+@,rƩGܪ_sK,BBf 愘뒢]=˶KC^K>^s(2Ar䂍p̪GJPXOuN!3pDZWR2HpH&ꑓ~<.D o^oF|7j6 { | 󢾼ޅU%E?8Q_D~}>}^_C6 5KH4 e)C=tEIr}5Ώmɦfɗ1^1gx`⺍-I.GnJeJ=NLӑ,!taѦ u.}Pnd,*ȈK A<=g7,s¯#` `*u*}晙2~ \d-hfNQs)|uST弝ҒV3ܝ=(GAF\( ܾ1,q,@QqEx >e _?d _N.˒׮dY@omw#7j^[ɜpP1E, zbprR͌1P>GC=," =ybzU& 9 INH IU2r'jC@9$3KPE8Ѳ $fѲ݈Owm;X%iЬdG2`b7HQUILE"yG1#9l2dbwf➙/T/_&4N=1rrZ#Wjėˆ|d%8DZL8( :#~=):}X:e|1xU-t#5H/Ux`i'>F\^r\D8+քJ3"76囉8>VGP4'>pox,ꆠ]2|x$mr% ")aMYn;WQ=)NL{זߥ`Ii9zu~K*d?P0X , ꅎW3ml]SB:a@B0@9СMIH6rݴ ݃Vˡ?6E{( xzAMЎdZhU۪'E2ua[uz]RS~`@6WMџ3n:{Xkc~2w[c:\.\d@L>ǥA0>vNZwֿZUUc?5= )%Yygk ȃ?@ea+8RH-]I/wPVjqQhg'ny֠K֍SG# +0㡎}>83-$; 5] 28DW./sMmD$svk9n (Y%u$!Y~Aahgn},x2;UP dqD@ϫc#Ue$VW. #[/~M #5bUg ZkD?EΩcd-w &7F}S{" epTޓz@ o"ǨNx|x)} ,6ZITMN.%LM IR R3gqw=}񑹫(.7sÐVՌ.ޖb̡=Pӫ>BFm4Ϣ7yNc o^z*t1=YW/ƖsS^@ "O%~Y-gXZH&v_T/==BʎM i|TA@nP ԉWE`×WuQ$d ‘`b^Ɂ2E Dl~H{yGJ eFJ<Tךa@[/Ui%RU_Ӑؠ8,ږ{V o84/u_S4r6C<:qϽ ̯YP@%5`WJ,@)`뒃̉;Ñ-ᯊy!ٟ1Vσ3;vF2 QxZF9eyFs4mAfuSFEgr \٤YD!oqIQ H!)-elqJ8q\J-5%c6\LW6&+j STFh匹m-Z ="?ڤa^k{զ'>WCaRL.{ )DjCJM!o'Chv%\g;bզH(3)[JHΨ"w(mcY0Q1rBT]4,wݪ$GASvS.3d.~P4 11n )ӕnRӐQ@(S/P~s^|(e9zA3_6C,JkWzxXm+O5+FMZr}kk{*d$ =ipo#@3|Ȯ$jpe(;嶟Rb3GIָ"փՕ?!-c cÀMIMFuOއ 8H[?>n>(FHuI";qa3awfl+p 0ly~y,#x\X~ȣyBߺbZA#˻voiw,Q'xF;A2J%xh`\6`T(XJ t[r _/w ;t9ώߙ/td=)d_#>T<%\V4Y(X˗n Գ QKZ}7,!~!Wd<TLU4A qp١TԭkjD7Q6LA!K< RӰ-=_1b1n9-E(<+dV-5I$%dR!wcwt6AF.q6UyCx@Un3Z ͈:wpNr)W$ Ob NݣeĈ3i Ԙxݢ`T$GZ28_)WJ &pD20ռo( oʌZq~{]^>$x= B~ UB||ۇǎi6љx(zHOIQp-E,y̒vƙ$L,t K7YoA E@j,0dWGw!/ ͑^>J._ .cnB iKͰ+J;5+&HNK'Fnw{n{ ^;躼t j崃0R# M=*fc\Tي8+k`kpbWpM*0i-TgfY= "wX_c'16yeYTSzISfr8-Yk,ípFU?U) BǮʿ8I!˩G0cymW2VUWGDepΊ6=s54]úƒC/˅OV vX޺H`P.JS[S#EEB a" ih P ,t* m5VGuk߿ fLnYa.{A1P&@4y a Ky/|twU K˺gP9+UQiΈ/>c0=-o/|h%UF Qu$[H6t%L~ESY vT+ qq'!T`ɔk^ $K++L " T%ž H敲l3 [,BUߎM|-6ȕqDZ<({bX֯ //9,w3Q#S蕷GoT'r5 dF!bG+[#/\21#܅d +TpƄsF4œ" <`)26v d>}yS9 YC=L]r-SG>7!o,=;9 g5é[sq's*z?lFlbďܫAHE"€m2^A :=HKmv$cK>gsjENd XZ^PM1CxFXH[($Ԏ)QJм.0^[Ó-ıl ٸHG~JN؄A+i(p#AV!Z?EKDmg:B, ױ)"7c_ " eU+X6,1+~êӧ/cDtͧ]رJiΟ~lSd074IIvaT' V+ԩ2`M+< R濸3}x3nQ0&NHP@ IMt L#rӎ<%NK_csh(BN" \݅$qՈF6Vb{I4[TlcW=MYꮆ}sߟT9sBd+>doBf%d~N`y onn^l6Z ^NiKB"I gd<M_EdT/n(1Ȓ @(5Ei8@H]BP[yy&aHV…1D]Sö:xSϮ]tʩc|PJqs>q7*8~=ȮJbX rZK %C$r'ͧsWc{mǸ0rpEZ?_߮6<.,+[KsV(ބ8V3S܂/Ш'YDXdeP"ُ. Rg|AK*"Z޴Hyoȵ]te$ E5 RB2 yLG&ma ,Ibu+D.Im`F:E2n鰕;q-0=dz#xd(c6 17/"/Jkopm.DL0@E-s>ڔ"5+߲r] S3Dd7 WΙ?P,{qA+}MIU`m𫴤}q~AAHf.ߕ{pXdiClcCšǐ~! x Fe88z,rܘ 6 {pomJ#7ݏeYx!3Ajm Tn~z<ވHɹf^Z#]հ9a76Y8cule,C$LxN ƻl耓ip锳6 cg ?PPKҊ[5ڇ&6D%`râcA *6}%Շb CŹV0fSlt4?BEi!qmmУH3T`04uhgST|˛xۍ7f&9ARf asRh*#)Y}% ;n"iᙰI[j꬝EŹ| bN6 <|\d.QF޳Ą 9Щ[m[fZ5"f$B-=>Url)F>BoR|,ņ\BHd"Ū~r*!g˾bõ+R]oPAH`:;j1L!G.)ڰjAlQ[ bӬ'B*Zs;FU`i)oo:V$;K^>lJo޵7yk#,L3I++[>~}9yT@Husf|c}LSG(A_;!ΰ2vdZNӇ8jzmb0|  >Gi@cZrx7̉|1xy3;11ُ(D 5^̃IHbɯ2<@, qQqjYI#,9 {"+o ؑ|^R{qfC p^JÝSXes ^(<0:HbE`WC )) KSt$|ڢJ= _|2dᾴ[(B![2ćlj D,d)7@uv(Y ]3||A+6UcMϫ챵X#Y q%>f4@ zy4:.|o(Hc)Ts/ΥU1&6?m[OT[&Pv\dhĢ% zi c^]K؄xNlAM8t ZLH{Io^vي.O9$uO/oΣS2WwH6 EO{ q=N`,y&fn含,2C7TrD FD]+Yk j)V=8ReW:7 :$6Jf ;Fo!Y2C!Nd5j` Ww3&bVUO4j~Tn&jRrd="I_D,tURv0{0-̧X`^b֖x16BN$wQv8kpĐ\/쯬պZХ!$ˤEy :BZA_@[vcIOu +.h$DTW 8֏Kzl F_sg0; J> YQpme&h |ԵyBr~2:(; .1Vj$'J[e9Ƌ KuۧC|Dyp[in/"$#%v' 䟺V\1 eI(B+d_Vb%_&s{Y HL$'9L$IɓvL&I$~NNdY2I/>|9&s9dRsd$&fL&də&Lə2I)'$3g$I%$IM3'92L$i3&dIIfg3'2g&d>d~'9$$3$dY'9<9fsw$̒Jf|2NO$2I9&diə$IpM9'2g$LrLM2I:9,dS&II9&O$d䙒LdILɓɞ|Ϟg92I='$32I7&L'$ɜ&I'&pI'3'9$$I$I3$ɓ?>fI32|̓I?$O2LO$ɓ2I/2LJI2d䙓&IdɒrL$3̙$9$$2d32LM9$I9N$dI,$9II=$d2L'̙O$LNrə$y$$ܓdL$$?'&I32gfI̒d&I'2IIrNI?L̜39&f|$̟$9$I&y2|̞d'2I=$dK93'$dI9&NfL$dgy'$L|̒y$NI'2I:d$NI%̞II'L|'$NfIL2I6L&s$ϙ$JL3'&L?d$L9L2s9$YN.]CtG/#>Q lrt]$'vT sNpPcU gun{!gAmTE@ߡUОB i"\@30)^w[)9g5̛L,daizc]i3bI[MT])vvdM^٣F>i!PAb$`#MzҔ?Sm>n2_h@=ufMJ{ yVPѢKAܫa"591t[}0hf.*g>|>/YcHX)G6c h{? 4,fɩ h_ N?+Kﭰ7XG{5 KP+ɝPew$PD5A ?˭ \t/j5ʲe#; )38&5) :SzCB%G/ u][kiosE)QȘ0ݒ\f~;MdqDdZ Eˠ)KMa@zJj_z&P#$ \*\@`ɞÙSEx1 GctcHm1SCQKsD G9%ϕ Ɓ"${}f0Ն#a ~;] Kah-Ԯ?=ekRʴΊ;ݧD\JTn r"ηF}ޏO͕Z>f81;֠Vu~Fqj7x8Ntt斻Y-?7kB 7͏BMդcW>s ?q.͏˒K> I4-pMD\d WN 7> e>2ٚ Ԟ+7ӋFY3#T.oC>Lh"=/HzUڕVʏD*^11?jBW@$#N '!z 8l&=.$0%T+E H}-%sg6'uHaL ب_ F10CIn0ۤ]0oӎ9rV ^dVsUnQe7iL #jiGbg3 jH9[T |C#v?KM-FmށoݥR=_/;4맋Q8 A"d5;ɩ(V`Dm ʨЙSve5$YG@y"yj"ZXn#C$q + s_MUKp׷ xt[E q[ 4+),Bo+5.I~A2K/!;7C!%&*@S _mOΟGWwkaE=kfM`DII% ڌ?J$B}}{b\)fBU"T_cFE QitJ}?3!(EEI| ɡ6 jdU rٲ|.L|rrȔ&1t5E-fvUncc|Ę$^ "@fd"gd'gIƓYtMwxv%G4xwAZqK,r͟>J`T(F*][͠;wh j-'kvY_|؞cBPjڎJzўVQ H*NY) N6k$_2.,RgM0':&gİOC4Sadݗp$EnW)!Px3n W :Ȉ@ۇ *LɛP0_vĔ,6$FY8yYر~F Qe(1_D=W^@!(cW[_h@akiX5\ODAeصM_cBIA dolǢ0h + GGTLvH ;M[$s|tXZr:|nH$HȉeΟ(-[9<93fR, ųpǔT>]n-S6 $lG& vE$l+6pa¸tgע2m_5B8! &oؙ&e ڗӅ2NeGժ|Ě%sf$o= oWI`ӜGJ`'qWbNL6DWTsΥ2"Tl?;pgl04=v`TBL5wub` _( =&㞿9rW~,b 9ӻ a;dPOiPm%S܉ d׏ϋPP dKFh$8H"\8 y$^ɦ/XcÜ?b0O ϳlD.i181-B(WeLa^?֥*SrptZTvUtyMe`XbO;xr9R/=;j&S8`"6_f)\DFYLX=_S5qlnlDV9ԅ9vmtֿ N}$;Pl(/HN.A!W2&Goѝ;>J fn穋G ƫ4fj٨aW7f} Ϳ,HО 0zE3ictF[nŒ2' <ÿ;/Ip0Z\iPO)Ԋ^.Ǎ2\ bqmW#S+Qg6#? ZtX 2*!$HMj'i梠ӧG8 B>tu|&(wY1<\;I%nNHcYO+TaobccƦX7<5%/ 'I$+N_+:7r@={1mn]joR],r\F7~* Q#U}s\(&L~{ah^X/lQ4T*\IQ:ߠȘT(k>S9&^5p|G8tЅt %/tu8CQH߀Sz2yoUHD1ȟBIqEXh屟((VdA'ݔ vJh=u芢y!)(X!'[*IE*YP"")vqXE`'ZGMeND҆39I ki.A${G")Aty|`' }MP緋MvH7P)Xm߲ +)' / W ܟ$NᅯuMtek̿m_[I So^8XBvd\bhY1f8cAF_t1t=s(l ̅CuM{Hߨv!427nb~sHνSj>HPY.ka8 bx!S%Y3XRA*i3aP+ 8{oe2PvZGCu84yVY5gÓyŸps=H "}$!0 C31 _1V`jax1|1?]0{-]zY˵+p`J!'" C8%f4m_L0UI::=nS~Ù $|C./#'SE^ErAKOI4\M)i3K!#̧7tAbe2* c&l1YJ#ҥw )7 B`&SATxGIUQ"貝yK*jSqi;Mw~+LPaz,QDE "2i}sGIr [`7l}> Q4JW.1gEP83G#Ԡ /$+;Ɣb/Ea+ZQk.IQq|- *&@4C|?7N S_Hץ KMyzؒF?lCPs_B*d}!^bIY_3bL%(EɼC_/5%Q=tGZHwu>2KϪqўDa=+O_FIn?>s\PsP%~nqu(՝5M [̞fJ^C_r ~ʴ-#2k%CJ:/F"uJHIkp$\=N U'w+sG(Q~eM{._W fcwx:tQ *B6r;nL4eF?raS:l%(KX2] Y\@ 9=X0zl؆EY@B#gEZ)|Z)?⨡JOQL/;$YBc(^,X RIDL>2{j'_g&+xwBL{ 2ŲѾP5[\+ htP:͉LXC$H"p)&ύ CAѡHzO (yL%{Jox0,%wW19&ZU^h}Z@X*&\l1wS͗E N.MyW*Q-l7y`{FH 7A,5+wO H==jF o"$h REaCV$/KQuqglV2S%O$sj0LD}2 1HbP~w(}U5yS{NLE a"z%U ]gcw]2I)rNQ-W]4FT\<AjF4 iPCņTc+ % ly%D\Exo_@Hx@-f @ KZ-d9?ܴR.&[gњ2*=uFo[)o˸z8lӝh֊g[2rI>= `w8#@DlMRq 6_\8*t._.v՘Ple]C8WQRӥO'+4*Vnxɬ'~`bxo9= -qS4]I,T`j߾Oqa"|ș+I7%O -m1e"OmuV LkV4UDjѲQT`ˉTȽ͋B2ڤge|G('M]Ddl";T. af`iN{aM@NGB Ȅ>[i@ ?}Rg蟫נ ,ZS8&jBŒv-syi tYGŧeZ)>f]dnP:elmJ )C5TN6SH,;T5Za8iC]lh4&hN``L%i7> up@).\_tb!|2e)eG!jbqgUQ‹"7(5ruGkmET6PE,XʝjpZJGHN/$ f$(70!4`ͼY{`rYbKv9e%:m<캜N}ǓīpGjH+ M3UHRX^XoX~RHA "!& sA5kWthzKY !9iyk<'0OאK#N[ h=s7NpbFBST&:*,dgx7Xm'#6 sZW&B/W(o.՗oM>fEBBfUpCT? kֻ [ ,9+qө zD[%̵2:YgaVZc uEZ"mU"y˕'`389v+ּM3YĤ\ fT\gn T֊<aP(UĊ | Z/I@)~D&|hqcPUEqÛT䵫))oyҁc1'HU0 U]ȃ`9?Unab:sHCs&}M&{(-INkc bsR2edIt$$Sz `F8YJmjb ]߶ (8K54몫fY3S7=4CB=ɳ*\lZV*MpS¥s)zYS"Kg'ސ=mVolPބJ{b#{ ;֮z70zTG1{:SHn9=3u`#!0&3j@!"jʓ Ղv(Vl]]?jX6-⏘G)\0UX`9ݯu^і9FKA=[PF…#Jodp`2 y(PN[f蟱F/= D^C 6H3|n+Oҷ&`f߯JIɸ {*leCyLx3HIOpynMjC][ʽgXVۆea؛ ~.8y|0bQTm]K؛)E/n+dcP lLԪEA{fF],=n4-ed_kLp!MDH޲3sWڽ8+R]3fA([^54EG ޹j_/ i-<k*26L=Iu YDOxqKaX88N+3Y*fQRE0V1륙3{iʄ}Eǭx z柢࠹Fe[%nŮ5:eS;A7SgQAO07bI ϟ@47O8t B;_&j`[r𒌗>[n z*kLHtMAI%)C~W!h{2KKidpg g֒%Nv`m:_ѳ3oe~,/v H~1$,Bgxdnr;II&992dNg$I''$2fI$>dILI$$>dɒL2LL3&INs2L̒I;NO2fLI$dzyrdy&dɓI/$Nϙ9I,&g3s&L2I$ɒNs3'92g9L$93fI932I>Ns$s$Ng$II$ɞd䓒yLg$ə9392LNdL'ɜ̆fL'3$9̒Od&NId3&I$93$<$w̙3I2Nd&I3?'&fI3d̒Nd̜s2ILɜsrfd$2y<ə$$̒fsɒI2yOI&dI&d2NI$'$LNI<993LLy3I<$$&L9IrI393$'$2LɒIϒfs99I$$$tɒg&LI>&dI3NLsfIɜrLINd<9$&s$ɒs99'&II=$$93$frd>Is$ZghG, AѳjDDIJD};p?V]]_B^Kls[6mm^Ĺa:f! K4G2DAU-wc +*ߌ} (4 ׻昨6MXf[k v-w\''3ӱ Xv:Y4S3?Rį8O\;`CّX(pge[Ie3lFӣ ~Ijl >#ڣP<ǦvޙMh\*SMUn%$ ֵڨ~TVu=H +Tnr}oQu%~>zk7`g=6P9wߴr mUT )wm#R++lU7gbT*ud|eGXΝHxU= }I2!d9-݁c`{%Mh9v)w6ihc7ìq&5,0 qL%Ɗ< 6wGhZe -9p'We ]qX v"jN| ?iWger7mQJL4u9inʪ_I|01Gy[:bOf4Z'gZg _sJ-{ޟ4 i ־kq"e f(Ȱ-#(OqyS\A{`")E#Y/`~x7(3߃.(Hqv>C-JfC_GĽb=4z)@% x5 ?B R7zHwq4x ${Ge㪤1A~OK!d|{B:e U7wq%Ơ܆0Qςz͖̉E!UY)4T_-֚=T~ >̮c%,> c+*;ę^)Bfd%E͍LHsȄڼ:ε.7fWwGQfa|*o_j:m~'k^FWiXȹ{_WσMRkw×;] x*x%A./rVxgɍGz^ DV -P%pg,2]*`ޅE P42Hnu'c^׬k ^F󖷱X}b9V#>E.5TT.i__#ƀ}ڵ٧o?IbaCZ~aeՕ3BPMd{k#I'J@g"Yl}ܜJuTBoЃ_ӎ̗&_sb猅2 ]I_Sw='Ο/+lt9N|'Vq;N o-;CQ7$>[-#1&3_-=M<(])}( [p$`=76]o6HpȖs"qpд$?%x)QI~{hz._gh,XؚE3yKTТr"pOfXyRn AwT6G(BebZ! -F$g0I[E˺\m<5&ZXp r_U%H~!mߵi9Ox霷/9e^ 9` kt vׇ{^50TNe뇍U8H,J)_r׸h׊ã}ůf(?DC _bev_4WVTBGCd~r辧j)'K`=Q9s'QH"c^,թSƕ+Ϣ ]k>Z?(R2҆Gan *TD{;9G$:U&$m8`=Zv#ap>Gum[=y~u ῂHT]]woC z>gD2xz'̜=~Lf9 <:i"P&}'r!LjdN!M1J71ƱJBeE¬GRT3E&\@Z^o[6l@>慀\NJceB+J pSXL;t_6[wςz aM]̱Ɗ)` ]hgT4!_j,j>q4Oh^Nƕ)-)UDD 9NP*7>VJ"h_9d"vzWEQD _Hy)zˆHdB4(<ޛɒ8O}cId jGbWb&DF8_p=3ɐD7 -( FCdg>la}'+?ĸu9FwS3ybشݪMl >+~ѓ,A:f ICvq"ő>l8<ĺQ~%d.T D4 \Pk,nP#Kୃ2$H3i.eD8qR%6L(Ey#;DX~D$m׹th|"kBJ;ܐM&E(Wb?п( * "ƈձaf"tQ%J|ęl1XRZK7%;7^>k[mi__"=(nNR+m{yZ\zQj .F}֢J%CPI3:eԣn"_unɵv!O!%NjVj[W`z/ܩR` cT; _=Q:EqC0,cI_?{ IL$"h4˴B\Ĝ| dUl,<m!Bxc2'zif5̅I1F '1hmGxړXa0 *تK#Tg1m:> jp3n]fnH V+MVͣAcF v+jl3x߱U'A J\0ъ*R GT $ZS:díJ`RtDi=`?˸Q$HaFWN:93%9$Hz@Jde:WOPLB<8" wb TG*|@K4'NS#&UXz6xg))f`/Rg5_<:Z:N$$ c4iԼF9۟MbrSR}/u.M G6{S}Ҙ0qtMXJ`؟-30A:+(yf—]pZ PCC-Xb6'TñVj%i'~l}P1>\mR𱪍j26Zyw5 BJVDLC1}{NHԁ4XYDLZ])/ mtQ(-*h]Skl0E},,l 1ڵVJZқ+qn(c Xj4LZ87fxkH uIL%Zn/ C 8C9} %OX~4NqY[mFU2ЋC{Kcq7X?V %Z!j]4rL^yd$dPay. 8kkBd<"(u"^efAYpCHPgĐ\b5DtQT/ |AJa8ԭu_"ANnvDUN׏MIvT4 r*])dvɗ2##cr9,RU)3#Ѯ⮡(jf68;<;b 3V?Q͜( EQV5[zA?K3}sBDw/ !І&04FLSECA{6].zX [qSu.)B &Yl}HgdTz{@w"* cbpځ/eP2X^4]B8*+b.#{M{2TT#ִ#J0͇mE s Q ^>[ﳖ7)%j|-yAIqgj|݈M9WnD4n3UC6Q Lq$/J?i1(#ރ ҕ/6[ݲMb;}.SA *5ά"Q<)'爁ZAM:Ȉ͉bb<~8#Qdž:r,@t᝶o8W6jظD{GJUOݨ"Tj3%7"U[ /Zɰ @)BBR5ܠxIyVt 쮝1߬jۙ|Q23R|ѭLD,DBm& f;2`K߿(h{H"N*lDBiȇ[o:L01)$> 3U8M` ~vJ2՝PJ bŒQW!gZUy5?rnѪYF0\ jr F/qFw1C%\J% 8jN7UrnL]5R+~]in^{FF{@;UPkWX!{URK/"ri{#jKH`8b3;#S [^JqDo>A˃߅=lP32UMdiT/Dd`EEWiYV6z7'M"͜elU}` eTݶ Q\#u[B_=0 tF8P@J~X}a@mbvS+r@ /2oJ)/JGbj\XSAӖ8CBwl I*m`JVAy 4DkiQ"L]96t:fhZ#-,׿ ygգ<{O٧Abt7noSPPDO\砤GU[.*q%,OmB 69P/d]*iUK^hocj& 2%CT0uLY N'|A:02B)0^,5GNW=7_q6KqHp_H35M`7FW]7$Q~0+mhT;u!B cZ0Ly.圬CtD?_ߪSApEڇon43G_2n6ʊm| 3^bHi{H3QRhSUwiYE"1 7n( `` *Lf5 qO"!X< ò(%p ;(C.in_E-AN@ܽbk)%bC S3: ^x⼂>,(ơ/2n{4xj. ZmXAF;gyNL0FFx_nL rmD0(=>n%؀R}Q}:K*{Is8oQ[>bbs;MY gjȡ1 㬐t>%`%,(1e7(<15ޔi(5KT_/3V-T%3}(ŁNpQ-EWyhRZdPfƩo-u&V' Ync4qorرm5U4uE$mX?A(%MNxcҷlnf8LI+T$>r \ȯj^p0]w!s~uox X{w!'.K jHj%!hm3?W@<F(*H X`yDsY 䁼gyńv$Ϟ3ȩ:Lܪ݂2fnzB{hie$UHF>iU!n(yˊLS_q`# l,ԓ5j л?wŐWwvLqXTs%*u1U9f^z[[9QxKK!sb#`YE5\1Q4Mǁwu䈙HHDa~酱ͣK;K}`xzKH'Vk Wv{ 2cXບ ؊Iou+n `IoG,~ya$npM7H6@8>LAQF,QgDN_۲"ѹߞU]<"@wjOu?-لwNIg{Y$FG@ޢB i6쓓H#Zb/mB$\қ&Iܠ'`AQqd+qv1uzunYd9"N:veg1KEsxW)D'/b䥃 1?olu,Xȍ?џ}+DMg :\%';Ce+~emEu3 /| $HN%;R9ڋj6P*N,5l_F^\Rk >괡≮&Ar]ί %3<9܋*' 瓟&I9ɓ̜$̒|$$̜LI''$2LNL&dIy2Id'$I$2dO$'$2dy$2~gd32I&gɓ&də?ɓ&frdIO$$OIdfds$3$$<̙&I'9$S$3LLd$y2NgIdNI$$də$2s$'3$L2LϒId$̟9I9NI$LfgLI3$>gfI$2O$O&s'2Is|L'$I39'dg''9&Id̞ddL'&r|g&d̒rI<'932I's$s2I$s3d$$I9̒I4|̙ə'?̙$y9I<ɟI$3$$I$3&I$&dLrIII9'&I?2LI.~|I?ܙ&I2d99̜$nIɒO$fL3I%I%&|fI>LI&II2|&O3fI$I9'&d92L9s9$>|&Ns$s<2s&d2NI2LI2~d̙?3$$fg9'$$dd$'$I9&rI$&fNId&II$II&yIrd̒I=$d9I$$$$$I̓I;'I'fI̓$ϒd?$9$I'̙3$O$$>I䜙&y99I$$II9&s&LuYNchr쳾pdW!P;7} (=.HLxŶfm^A QT!X~>~rd$?CU(GI{lE@TppC' |8{e"g$6i}oD1_?G-Xfu6=bEc aus4тRt%{geMBo.@Sv*fM?>wm֋.(IDŽ"uI3s|Du /LoW>ZZl`"1vEL ypKw0j")lk%QV듖DI^Y`koKDc\zL:n]0_xFRij"#74oY ,j@jDL6BeE&zD~u=aݣ2Zк [ L„U`[F/baE!Y<#Tz-'sbr!ة{]H)&제Fo@_SBBNNrFbPYM^0}$vщu @+e9ǨrXr jN(`w_49=ӑ&JHWU˥ țoJV$Vyb=<BCgB6:4 32j|N |\]}qzi;e 8nzA䦸ׅ˅`!k#i!քg=d  :5XCZ*mflQs`+((ᆌh[,60b˹O)F "l_IXuyM`H@l;:[N+#r颉+(pQ$dTkӐM@JPdPbYsE D$AĔI&YJԕpt+^ V%^5&¦5|RGdf0 C_qSx(ЄOh;_Yb%gg5aJ'zOFk6RʣI9`b(ⅆ*Cm.U~D@5fо3%Eֆ&%W|j`V'/**9%@TK)[ј?+|9S6P-j95v3q\zcFn4%B~KM$U5'(US$PNcykp x>~<8(9Skȅ -:WF~)`L /|^x}rchul:< _ `yE̤םKF@n @z&J}!}6,Wh,LXy/F4P#EkpD]W v5iAsE/6+궖%&/S*a Ev 4 "zY5*3XK$It!C@|^ؘOE/b_D  z?#xd5@OdRDxf:?w‡ō{c'`jxKJ01H(sg=%o0% 9RP&Ez8V/tnt7+i֒R`{IU>>gSDi _|QLǦʩB?NH(wS-~ UV ^E6kF ]'*UsqW֙({@چݺX7KԨRZE9/FX4\|y';Ɋ =x#^uqt1T .u5?F&YGͷqz[Yg#@tlGacc 8U+/- ' +x*fdwaGr P5_J/B1¬ˢz2ּpM#Au` y= Z2Zz&&P@HPT% V>^B+RV W9/)kPͶ:vO|{O}\gw{# 3OfBM)Blb/FV=e5dAѤ 'wx/l1aK~-Mc \bga@2X= S..3f@˯C-'^;G+jR1԰f:JY y1[9@r`#mW *_m9 Jߋ:h}&iC+g<O/_Tff!(0blk__e7/I妵"!㣸c0?+OTH]>pv!O zX\׎*CO. }ditM+xHLvr29f"J  ߎc;JMjQKoPw/~E* Ssx1Qo1 \L:%=9[ oIH%#d 7F=Ф. &-v>̴T|Ջ#P.N$Q4dō$R(SbLzFU{2Sn=,BmP#(v%>]<µ!(1/OPɵu ȩ4˩l|,x-Pv╡~xƧ"nYɏaŰ+ m%d9<اsS0.`iWVAd!:޲Ł4JZZ0'9s`6Ǐ`L50A>{^f Nz'26dFZRIlboW91QzǤu7FZI/8٨Myw :.#Rkjg),(+Zm5\,[ļpW$mJwΉ1v_ j ըJ7&0d[-; YK:"RzwZ9o fqq ˹?_֎qzus(Y/-tMOV#@V=nAQ lyl QȎ 6YdM)nxs>YYPcπPV{uoQ RZ  -k!󹫱ʆ)UǗ-$!5@YGoKX/"d#XoYcd[&od46D5R@Q_̅1Q ):(jbQb3;@H MX)-Е94 Xj T796e7I{FFxy&umMEˋٕl(NjtރkR6tVe㮾H iA3p~ܩ(NIJ L/e}u(հ ˷?Sb<ġ3}Qc=.:'L҆Lv}GԻ6"-t牷?Fx/j( ]1O ֽY+Z7x%R}]9%%S UfnT'xB,ؒW qpSd>0mN3oVݥeD3Q,HS(:3HLdIK>aM^u3s$r bb>gV_Pk;efsRD#@F;o=D1O"s2ԁ,{,pK* 'SV쒊ւ7Bncc "ʙ)>=xa|__lު[lvBW*)1%anh{3w&<9z RD-(9$Z7˿¯~s6S! D0)')~%M:Qv|ʑ$^7$l.P,8]76T  n7]$^rcxrJLN~Fe]]i2Aڗnqg|S":w,= / %մ }0'QksJ<(:^P`UKDۗ !3TA_QfSBej[{A pIcv\\z"'3+.ׇ@&:+(+kVyrVr2-QoJ14 ;wߊ=mh{nGE C#btn}10H4Q)^FŘj(`O'`5=wҢ̱!Q^c/h,4INnf/koİ[^.2Ih2&²AWSz:\ aS$/,dW-E/aT<we欏iaos2_w' )t97]H;+M s.Jdv3U//e!yzx71eѸAE nmF \?F[Rsg(t/I }*.Oz L:aAX|5Gl˘A [^[U|D'ڮU4lH[nZ`Ni>UHD<ˑM`jt|kFC\(W+ d#ʓOS\@aѷ\"eVI)]T * `{L0msљVo$XLNJJvuF$ؤ3YXvu0DX:Jɂ!79ݬ7?롳*;}k}SzENneaAIXxl8@x"K)v0 ga@-X'AyfHr|]/t5Tpdg;;*t*S&EJ9~Cb^-hK9F8L ጉޗY_n]@ &׃ԔCS5PgIRE`|Z|tT6jQr:_lHLh WVGrxQvD%aj؛M;ǾxX FU_80YƐ.K٧P`&P|"Ck@s<~/qa= E`C:B"?ΫIހZ}J bA8ў~P ]߈PJ;1  "v)gZi niqPeOod8S| P2&b ao!eK_@pX[KH?ZbIS #B) 82l0O[-&AGN*$6]/V^s42v9o 'E`uCs7[rpZ`t~{{ oo3ikH/dQ D4;5(ctub1!MV5ި.T&AK zxB] 6Jp1%֥ J48\!n –(Tɣ^oX*L_4:Uic&V".UAE'YM&k7s*$Lj_lM럇(7oI)?~.RBJ|;>ytFkSoكTP;3D@֔e__aN2=0z @L&l2&jꄀA Qtשh oI)m Ɣe }71"gB_J-rQZХ NЫ&Y2Y~ '(ƵSSt pa){UTX/*0h2x4W*QɞAT ;=DUDSJG+sᯒܢŜ˚0VHnEc)Zɨ><0N^JK,s9ށK8@'8u5u+4X4]p}aލ{xŅiCE_iwV|EeNDn_&̅St=;)ĥo]=gfլ; zRUop㭍LEw7 I|عnԒfXuhRR5~ 6ovwF5S/AsS\Qo6}ę)I@,qr|H׍o-BAC#kO2~Sgfr?{ЊYtB+0W19yHSh8'C̝ȾT)vΌL9nd!$El sJ-L[HԕG '(.nT#ïQR9 )#ħQ[OJFTĴҧet< wRK,b#:X*f*hK=aYBqlUhgCW-tmȊ )],Þ[,Ê}C~C|_i :+A De`Ұޜqc`)vEٯ(PZbuoN)2 IۇT ݫ u={#*#0QNord`O|X 6袞YĂ}(i+(3ߖnSǗ3 Q{%/lOE|s{?Ǿq;Cqvx>;sKU5o}')11sC# *Jta &;J+o[NY%HAZ{K.MWKby&lB9^# 9Waԙ+V#j%;>޸7eUmn~1 bҬm,JM~x`E~h"Qu3Q'n$*HV6 ] :|lu:sJȘKS+Y˰S%ix&.:xU@9MS:Kf"țK,y c?#ڑl`R2`2 F7R)W >L4_ 2*gi9!(&ՙJ>exc,`D| k4oV%k̠ 8iM|tu X"OCšŦ:t󹙰7Lʶ<qp!]0~1\i0 ;WtQ %QIE?/}ގGs"s^vNuq[G0Ȇr8ɿNL֎] *4#,T0lmvM pR*x#(&H(Y"ܮ"xRQ$KG&d^ge; iaoBP&i[MC\ ".7&Ieeaf~2孊,Bvb1h/Ҥ2:.wBT8U oݐaAAk؛O/˨?Ɔs&lj8%M6%(]ssI& s!<̥8~#A{me+H,lRRãv%5+h&hcNn9OJE"0HXd-kD~Bo-UQ!phGOmAɰR\Pj?49deQʹm3!N/$G[Q$%rLpvDx5-X2NdX34˟>d֔aB\V*8 @_+﫩H$zKdΪ(Ʌd^[/=lxBax=ѠZ>YU Dߎe!IF5ՔAgy^Į輗xZbu?&l;UjݟӞT&irZXȮᖢh%V}ȿRl@Ƣe<ꈨߎf;X8w))\̻u PIJ5/PPBpB~ } M.O>afzv/m6[|S P+[`nA JlyJC}[w0麤X,AIq|E A&.}q׈T@*0uۼb^}gN.X_ ]2g#GPCtMc SH" 3PbQHeDžwNC'[=y|1gHAMfN "u #0"RR r\vN6 DĜ6̷'h_ '4CnH꧑ꔲ|^vL}9#ykO dxNsGQ #\2CZݥG)e`K쪘)ūˁ `o{!]baƬ bUZ<9i2FW ^taRȭM CI*KK(d @mօ1 T-MG3xL^t1i h=PH+O)x}(rGu#izDE $:'aӄLrI3'&d$$dɓ2d&~NL'93&|d9$I3sd$I'd̒d!d2NI&d2I9LI9'&LI$̒fs92I2g$3ɜ&d2I$'|䜒L䙙<99>II&I$s<&rdLs&d̒L̙$̙!?dI.dL<ɞNg$dI&LII$$2Ny&ILd<&I&s9$NfL&NdI32də9&s$$I2dNs̒I '$$̓̓>dI2gI'$d̟II$IS2I'I99$ɒNy$i3'd䙓$̙9s&L>I$3$ILLɓ$$!2d$9̒d$9$I9sI$3y$9$I''g!2NI$'I3I̙$zHxNd̙s$NI$2NI$$2IϒNI$I?$<&d!333drNLIs$$N$$ϜI$dL$'<''&III'$I$I2L&Iə2I9$$^L'&Id$INL&I$fLLɒIL$$fJd&I9&L2y9$̜II2I2I92g&I2II$$I92I2d&I2I3$I3䤙ɜ'$d$ɓdɞdI2I2~fg9$i2I$2LI'y&I$I:d&d'3dɒOI>ys32O2I<&3&IL3&O$$L2I3L2fLI&I3$ffd$̙䓒|2ffds$~I>g$N~g'&I2s YLaZa"qBG7C# =Ch!2d,itM$2L1CL)@%E?~rN9 36/-֢/s5z8S++7@^P[R.鷮º@HvRguvInBsf.[ Ӯ9l'O9쯞N|0#(>iv9҈j#`܆ &S97i)a&\V@0;@rf,56;1Xơ6A_~I6l2vuYs-˲x{-d.]x*<k \Ek^뫼!5A/y'VB6sMVUy)%g*dz5O[x(N&z%>W$@KTM4HF }Mh~Yd X$*P o F) ,NMfֿSڇ{x hNc'n\G˷z#c7[Z2r9@=5]5H7g5vv+>5O!yw߲8h l2\A; %Kq' e0arMG&aM7s=9l+e-s,[.!M`mc&{v J/Q4"x"1D $ ME|BS rUK.p57LD!}lxI OUvqE}/1ȉu}!旤ͺNCW^5uѾ[o¼]@M[ə;:mp(mpgx,ٝ)h~՝Nr6t'!BFB0=LS@0Vqu`$p=: 95@lH]3$;iBNјrpɔ&6[2/_^4Df%E<ѲV[ͤlX]~6.TŊf缗ŪT5N{Ȝ:툎_ƑJ";/?O.é -gJ76#Ke_Ow2cD`hA-\W${!OցYisx wfx~F{N+;o]p"Z%XWv[ t1e:c$\ҳ0AjOp ߅WAUFw=j[C*X'Te lPzGL'2k1BMAR"c=_5J} R7l\,_g ú!N<">b©%PIdi=dZjLܯBsKwh V2XR oT}#*SqƘb ޶) !%HD$L@幍{+yU;)тnK Q#=Vա%ڣrX&WHS+4-0V̼ݓZtWB\W=L$(S2,r{slˣ_zMwa0E+U 7} ,0>MD:A/2y\k8|#L0SXPjv@?R,6ǟ&!>HPw”z y>.k%d6Ge!( "&FA]?5הnWu7hn+Jl#L6[ZU6/u7v_6r8*w#YCcnuK=P<'f Uۑ|S/ Y^Xȸ>XzϴbHnm^iWQ(Nh*4 a=7EHݟm&jn=}&bJf1A0r?_Ն2c WOWU&<ӆ:١(cb+|ɔ`aS^1FRi('.JeSmL[nԄAk!ISƥe8ઉY50Ɔ;Ie);+:´ZȓsQO_-9- |qX⛃uM`K'Pg&"BVƧ''~1P&!W)x{oYed5jUwv'ͱv2%a ޒtu-ۓCIZ</iK{P'12O,T s 4!$S9M`rNښK9N##'awǗy3 ^x`GtX/F.J'Gaiiehq;uguDRSh+3@gV*bf!D1 7Q]BgǦ&HI"}47~9ŀvr' j=%[U}9fkbd/ԏ ~+u8 Y&O,:5ҝC$qzNnd jt;& m!K7;L(2908+#D4R/CQ 3</l㬿f5ini> VTe7xVM"ŀt23a)* |:Y$,6aL5/pt*丶{eS$š=K+a<hzGlpFQw^|$N\93!abK@4W"+C-7w|COO_WTƗ']oif81ڧT|ADdLMXɗM0K4q =nT[Y0%܀  \RPD-`') tL(Kpz\1)QMP:)G*J*9lϬf'ZSZ%P6 IGأbNR~eR|Cb"ż ;NL{v)'9+0KQB]f _̄YUY t΀ Hsp$KWp-3MRv AW8ǿ2B $˲PA;dgPfuue.ċ6,70( jʋ"O=hn##jD-C0M <;`J".X)JgPn|4iI9=_iOa_GD# ᗌ=3T+DH &1O$瓽 jl>0ulMͣ ЦW0>c =oL)Q hm_w=}BYCpƝ)Z)YTֈY؅jWLj3#Ah"S*^ E+kz"FHj*V~2n0^HN%$]\S1cȆA. IE.|Zoɂ[{ /1Rrg0?L C6.jQHiH=3x4[ ;SzPDʧ@ ;5%0'z _Mf@#)ϓ\(&fm5km)"j>tk%vOF3Mlqb%Q]YL,+ݽ 6.U˭Rb.5_wZiy#L1bxfh)maC?1 6Ow6|*X\uJMWLC,Lp]k&3{,fԏ~=}xZѦnvVqvEpÍE:k\i;W3APS1ULi" Y߱?S)/ U;^&YzfRW贼Uwr- @-+m 4QrIBb}z-ԋ\whJA8}OˠlQ)kqM YM/(hN[C FCԓ C]Ó/E,j~e&*ń(cd a8p>gbÄoldrwPyc| Eɭ>`(,P_P^J~yL=RAh:i?uRȻGmrf6JC wȰ^ h).#"' 1@&T#c b#/U `ōkfNIze GM\;N<^Wtx<К4^o7wDR)|P׷JCv +4C d{҈,1*Kz :䲯٫zl0~ kz'Dv\31Jm{?J\.jjmإZ3h`8Qr^J 5b0GeX )"ʼn+kRX@ܚ'>[3ݕ>xv zJK.KԜHm(k)OUTn`)phf1eg.n1 ~VXI].liܭыg]GEЀ'gȏиғ8 hXBwTS,,EVG7ܾBɹI m2I~"$5sIYfwj0)O٣hqiOB0wqd[k*`QLt,0X ):%|(=MrJ,]Skh<#Kg셴+}D)oy-8xmCR>}o!zb I郗ٕjЭ,gTqF&]ͶQH!JH+JFW)az~b~u;=DJnhM) Idlbܟ4_)hm+1اcXXLENctFgU[[O(N.9\E"wc !yϢm;"8 a";;rb▕kSSy`g!|.3"鑻&g.PB10Mܷ~r j+J@a糀WdD܋ X56BނsI%ٕS>'yO'8W'IWF( >yuJlMY٫&ʤhcv*#D"G0]t]X.uԙ% 8J ,B $WrRQ30FY51o)؋)H~6`8> IPL+ 69?(|=saVgC0A@"I.k6iW€uި #Tn3ĨFˑn5(a霆8kX{[Hy$68 2*ygY ;s}HvlBD![0>{g2=6+Q Z Sb?hn UReI:"Z [\oW薙y%q{9@l7]YYҠ:|##[3&4:wq]xO$=xT]Bp 1WPUD|;Ը~ gy~MB3ʘ ;j Fg؂}rҵGXc*(ɂaׂ|0둍 9QMG: ob#|y1&VJ f*Kb2qJRB-hn3}:GPIob{:c|q+N!\\GZAl%:HQ|ˈn 30 pu]"fA7" xd%G|hzF$*݁K1Yo)f2EXd]N8zu%eg 8ccnmX )0f ¥y'PNvbb-%FVǷ /NR1}KBy ]Eé-~6f럃Юm@I܇'zM[4K&*3M"Hau1O4IlU81"P N3MG)V QHad QW[*'gu|D%kB*ulf4*/pggt;AGdV@{؇0o*io^6JJVϭ[dpP+g O3! ĭCPƢfn&7foK1ȁYl+ q@.?}}gqܖ]OSKO{ *s6 k|JjWZٕHU#4'wPw=0Ϯ?)c Lߵo][?ڛiۖqͤzHZ Q2TUenE8>iJˑ !kn²JtPΤ‹48TC;̻{ X vHެr* H0͘~LJ S!g@J袥.m/RDp q̏}:CG}t-wl ޹V`XbYݓ+óÖM]Hc6!6Η@QFem'oj TROA}7w?"hiG mTg&bGו)7UziAh_I؍8F';?9=ay qǒ;祸"5&'NV V㚍4VV,hV,lmCc<an׃"x crXlyK3]QU( 4N-+W mpXQU;?_ΰiϝ)"0uu"qiÙi3C$}AJL>e)N㭡jWf70ƀr" LԘTUYdG, ?NuJ|>k!!qmjgW ǧ2{sv{Fe-$"՞i-blDapZOM2L5Cӧ,Z+Md ?QjLVrԶv~DPeg\]3]iȉǻJflNx(`X}"moe]SM+=!X(COG'P!F2'MR偛JzCw$bFЍ*GoLZ߭/_3!3JqDroE[h e{ vk?F ?s`O$I33''IdI$̓OϒI9LI̞O2dI$32s$2p ,rI'$<2dI)$Jd&I~rO3>rIəI9$rC3&Nd~rIs2I̙&O3$fI'99$3$$$dsg$3Ls̟>rg$$rLL$&I9ɒNsI$$2I&|$dϒLL$s$939$|L$$?'$$NdfNdI|O$ϜNI'O9dI2d̙rI3̒I%NI2I$2I92gdd$ϞI|2II&I&O&dO39?&I&rI̓Iy'ɒO&~NIy>O$'3y3&LNfI2d$rrI&rs2d9'ɒ~Lg>I$2Ifs$I&L32dO&g|ϒO9'$$2d2g2dLɒNId<9$$fIs'32y$?3$̓39$9$N>L2s92I33$$&IsfI?&NLdə2sL'ɟ2yI39ɓ$̒g$$&I''$39$'3dIds2I3dry32fOI3ə'3'>Lryrfd9&LI9'>sII'2d̙9$d&I2~d'&|2LI9O&rLd$sdɜ9$''$9&IO$̒gI$y$d39ɜd$2I2L92LI9$M$Ly9də&dI92fI9>9I2g?9$$̓I3d399$̜&I99L2I2d~dɓ'L$'32rO$O<'RgYL% Q@ P(!vG"? P&៘T+1) bkTyc("d@GBq:VpYdq\Q4"B\Jy4l)jr"{x[jWִb@aAǚr œ5&y) @\6a>s7e_j+ޟY`ge$|&Ĵ+C,Ψ^#`y UߴmAhe!mLFO:?ZD1hqe'4xMɍESyŠ=oκ P)x%'veL{OoLG 4ʞ*ȿ7j>OE4D`H1Skғ!CV?K[NҾ̽>٪==&I#kEVcUsWdޖOQQE*H$ɗ;COd:?$$)a U\/8)WYgQ- p-H""v]!`|\¦pjKJC AL=\Q[]ˆvhsCc{Hl&C|~*qvMJBT ϣRɿR)B_msRƹe!o쀂/a X _&V.5 RgBBuۿqLIb6RrrСj)UYNҬe,ZUN )`t2ͧ]R#[# [䨹%俓GR,̗ [Wo46|Zz?#4->BC='(pٓJ9H/hS%O}[੕VOeZ3ox'y$oŋ7f]4„MY@\ǝ/G.p2\~]YL GIխJ1LGeae}vlrP5%^k+VP?OVIT=qM vo2'mvAK5uS^X2LgxBW3CXS8a.Ɩ[.SZ@CRSxDyB =#uyS} r)6Eޤv>o[Z5݀J-2_60*ˎ-kЦS~ѱȭ.UnQkݘ}5M"7EUk6)Y땿v^Ʉ CԱAS*ha6Ę:e&2LehHt'&o+vɵjrˁ O;W\Kiڔ{cGj]GX3(5Լ ;W59CRw~΋ JI*JORPKoݝ{ 8\ HBnjN찟Z2\{f8tYpk LV4r {gCHkdyZDKܺZ.m Y/-sU.ynMD#fWЩfhu'K>݈-W|.S^P?3q.z5Zqpa)~vi+ n*> ]Olnl=92^]{;YQ)sd:l1y#e>"Z ٩/fL;.tjҬ~P{J)^4dN>fne9QC>oPo<̇Pi)9yFRЪ1&2UuI vt&. \L]^8{>)JGt/u=l%8QA`&a1@@֧4eM`OVPJ?2%Mw "ZϤK!=-śm1AFomEY"fD ʏ?Zq{T3*Y&nC#|r3Ͱ ǂdz|ڝO$d3dn2#+9@? -H^wYaW6wR̊Xݳ=dIP`V]3ב^1eVuLx#L)X\Lт/vy1Pf<܇*EKYHՃyq Jrܔ(Lw9H/uczfy:-?ܺ$Yjp95/ך/lb6BfA^ ~a2l(jEhwTJ붤4%婩XIh[OK*#B@y*2zr,m'4;4*7 "MW7M;"Rl(ZN t.hmDyLx"Vb`i`kApQR8x{@$L]Rb8}.1j`ѺGɂhGnW?}w@|aUGpa成lR.aH̥ن蔜s>2ی$t4M $vu ^Yp%*gg4k=҂<RA@\:8ݪKg}m/p7 }/LT넔 =4FtPϷ- J~_jCKloCbAW+|ٲ[j͆'9e3, Z]տ%?MF xdr)FUZŠmվZ${ h: v1=ݥE{DE(6ዚe0$[0MjajoTFkN!x fĜNB|T(Ir6++՛5핖2/!e sZrH9W^-KA琮w*aH~89QΥm"̖Pש85G[R>罐g{XNk.TV ;z i삣oe%e ΫYcYCE4Kz9!& 㵍ՕLhG<*J~?ÝErg;໽~+8L$󠴅tgtyPvI~w㾩U?(CQQțKT *sD䳽;ʆdU΢VDbctP,PȆnQkPW'jZ16A.A81lӐȭ!"6~z^{3`rfghD{BB5ZH0h`l!R*Hg:dom Y'h4q|{ ;_p C?W{Iq)M#D{WSfCkN;h\ cٛ4SE` nY]yTcd[fAPLj?fhO); UlUӂZuftcl^ ȢBQ&H, Dm]H}0U%$T=N> p2z"fjjH8w#Ei$I4.LkфR!,IсP'f+RF Ѯ&OR|]'NA{-eaHGiNځv.;,^y229~T'ڛw"# zQA"4φLhelIF:I]j ?uBj!vvaiFx5'U\DmFm) r;4O;\(-Ƀ44?cӵљy'syfHR i 0d--(#xsZu_ZbS(4|;;H<І'/d#cH(2^f4˗R{2|h4ɯSeR=1}%u`*oSKlמJ]+cV)Reb*zs)Mf?K`8+% ,yX'Whˠ,bc{0cT/^kho)mMDc4ҽ\fVfFoK~D MטF蠖KwT̖%u47_BM^7^z8O}SZ Qrua1Un A"hcxІo E@٘K*ThUU!?4<2NF1xӂDҨjS]ys+Qoo ˪J 矞OeoY^ ol|WRgAW"i9oj'ATV;gfLSvCƄ7)X,ij !4rPwA9Z& (OЈk ^ )33úZj˯1RMH[ص'@%X$Uo:5 Pc\p5&{SSb8&t;&V8ːyl՘*e#"L/gn'%v\8 ͝d_mNR!-#C$k*U?9Oq ikUץnٰJEP!8!a%dNR |mRKb#j, ^F$.ޥ9Jړz͡!G ƾU %Lkf,jHd6R3G碴,8" iAd:csD3dJG5uKjYhIL^AX TLR{'?1Z 4^ULnf+#~,udCWdȨNnG91+[z`I){nd^kn#F~+ 4H=ىNM7°B+1F('fm5E>(*`s@y,(W(;:ͱLnWxP"![ Na/TEAQYgu81LhXuj6w=swc^ZVk njxT_j-I`|43i|x#>2l ,|#]9(TXNGQM S dv-a]PmqSn!Fh&ÿ֒%3(V-Ң(r%Im8R^Z̎!2Z=\"pcb1+b7,*99 *p}Z4!יtV?(t_S.s ډA"C6モഡB%9f˹#x'XJ+I Wd/[-限}e?G ]]GNzwK #.YD&.[ +8fQ#kҀ0 E2 7z/T#&{Z(XY|6cɀy+E8m{E( lg>j f+1% @N:?u7ofA %[1%0w7nQ՟Z񥦷S[f AqfT iG DyA &۸[TVį@5W14^{ FMtnqHƁ<BUQo`DlV2> qUϞJr2>wtq)9_vr⫅G(f-L_)v|ғuhL0,K-ZVfW/΄9e)#UˠQJBC.a0vZDzu!Lnb8 gkMIMg:V:GgV:쬳M#@rh@vY&SvʞN$L&ʽ4JKfpT'P&=\5sBG(D]#|a rd0wےI^zԖo9na%~6?#n~Q4'-`rE X &~5>|(Kj =%IKj|<m/g":|9"=vj]7 g4c2v ;0NTxGQ ׅIKr>Kc*O-wlR%3$ǯ/Xb؜)iDX"NԆp) |f݈X2iNcb{|sa"yՑ^@+%Rޫ%[E/{^obbuu\q <׺72Fw.˜su!n/V]ŖZ,Tn @yH#ɮin~{Qa7H6K/"@K;"%e?<%L&M92wHR7}EX'pjAN[cc!Y9],=qxV4:5׌LF|#:K'Qs_XxZEw(ܫJ֢9黸Ʀf$٫7x%+\bB6 ؙm…4 6P&Nzq7&fZ5\ҕԕieI~']E}jBDu#Jĵ>Xdg[YR/4{. . Gx乩5|T2 UXM* IDRx;Uf.ົnM( A$_Wo MŸRrsX"<3 IgV0F$jZ, G]Ωb6&MJ/5)7:6:e^qgZ_-$GP:!.癇g*%Aٱ+S57'$9bՂwo6:# ҄uA6Xh1`mcuF|:QXcw37N 0@]֕VplY*4Gk-GB(h+'Q%fcE >}(;igbx7ڨ+b1 c$;K$ndʔP"'9A4yqń#|dN6hz,֙xf Ckrk`xtaw@gVFٴ)tTqcbfltZGf2Yo|YIpBϪqŽsm>^o Md ^2ALߖ|'RQ~BtlG$ń wٝϖGY\Ny-o qmɱ+k襨ќ5wמW}!DuvKǹm݌.Ȝ!F㢼)"Iiv(雀w>m|~PwgGEb\"p/TPS͊7奵X¿=#zjN,G M¼Qg'%AҸkzq6VGZ<ᮐ\5Ȧa~G@2԰3wr<LlM8e %U f2݁L}pUuM'Zv.l+ТNj5C4l7UZEIA~/ӷWM=308lϙ/j?VIe`0efeZ N\AO)tҊ@Bc"U ~q"C>IƘl^ w$[x;kY]wj ЍN^Ds Mϓp fY1o BMWF7I}\pF6x?pl;()o%:i>Z߲)$*7X$,eW57dG̓``6H{Ey}$4GL Mm/L"ɑ=\0|T+(c A( $ #D@8W#>X~~3boZc*MXnBIrp\K\Pm ͏!XyD2p@)),ysDu4hV W%6p OTVVz}^)YT*o^Ž[&b`3ա^D|es;Y)(xM\f^ |!N= ll#Hc9(;{N8-;Y~@f{d괗ٞ3j$S Ds,:fS $3{"#$uzs.# g{t?(&f)uZ[\dauf9xk%OK:}E/Pέbf*7-(x~|EEf[ Qn˷[ > w\jjΜEAⰛ3Eńr/1Ryvҕ6aʎ4ZzхԈg -J?JE.U96wgSR3Y bv޷4?z| (^r-pW;N;-@Ҋ ϨL^ 'kN]uj]tQ.#mCcdȪ^Ir)\S{UUR.\όu owI3*X_K[Z܃>!#|]q)rB5Ndi aw:G 1( )eź_*w ,UKl=ikl@.c5g #  5nd|=,{^c'>[eN%L{jpD14)-zl,p_އޖe-r&h]reANfk)@"\kJ1"d?˼ӆ[Um{ ̗]$抚vYU ~Dkgz@.Z{l<M$v+%s$1GS1T_jpSVzZW=eKr~+vv]υa]uQbz/Yd6G7qnu~h~OdXbG zP"V)N׷i#!]2C?mCGW^W3nYށ:+.٭vϟ[ztmRPBD@M3~p C*AϕP_!nFi+U3rqb^t&N-^9#_qƵvoսxEƊ EsӶf`oOl4:s]*t8Y1#~z2vyt"YGt-WLDUΗ%Hd{0Ž{b  5FhXFNf f%EY:Ɛ0b^V[jpHN{>PtιbxEgYr't덀!*rTƪA%Īgm[F~۬S@WQ&ѱ,աȐI}EW~Sr,o(ke~L=YR*bɣ s$LyL>r~y$̒rL'I'$gI9$o$fI$9$̟$fOI$2L'$dɞy$d'g9O䓒O?3I2O&dI|3$tɓ$3?I'9$3dLL~g$䜙fy&Iɜy3$ə'$3'939$'$rdIs9|3̙93gɒd&IL2dINI'2I&rI̓3939&I92rrs&g$$I<''2dLLg̒Od$y9$NO?3$I'393>I'L$̒I)3&L9̙$2I2I$I&srLy3I$$L̜OI&rL>d3$$ɒII2LNI<9??O2y'ɓ̒dL9'ɒs$3&I &d$2L92O2I$ܓ'$I癓32L3Ny$yIl9'd$d~I>Id'L$̙I%2I'>d̜2s33<&L&Idy9|&I3>O&dL'$I$L9̙2|2frs?fdrdd93$99y$霜I,9ɓ2y''$rd9L$>IL3&NNN$3$dϞd'2Ng&dNfd>Nd$S&d&I3&I2NdɒrrI9'&I瓒I%@U%J DtU.#$Y0۲r"pJgeMTCQsI;tL5ef1T~3 Awf` |/+@P=vcz+oI+D{8O5a,9v{?=H'UUm̧HMǦt\p5A#+.@3TNjE]D~/hfd)`0mNut)sG?]< w!E@ԢYc!ݺً 8dy;by-xdPUQHI!̚>RU!NVoz91̚b5%䉫)|Sa$5X@lFG^ ΁. xXIυLI"s*qa{\cTUdv94 $eP%GY MɒmH&)$ hݶ-1!G &5ր\A_B³5jkMb![vyw|?w*SZNrw:DZ'"^HR,rc"&.;ʙ>"/ ' Ez6HSul=Z$JvDDÉX)QIBjt9B5[xtZcޟo#J6U|`n܂n P;}0Q/Ky CD"S}9:U:"--מ؇d]Ô%'\J:5I>e yߠ[I4fVM)K//%~7~C,M]Ƥƞ60XM<6 ?0H9ƓԠ02^=ZR\dܚ=Yx1>)+4\0 Ho*@q-5їa?x T?d@^W~-CX &Z ҞGЁsŷW(=ƍ5{NEO,}6>gJTlL2&e>B ݊UV6YJڭJ v|%| i!,9Yu?*Kȇ H. rϊB @V KK?TE"@nyrIx%-bմ~}GĮ>Mz(r791LR# ` S3b'NG5{ߏHwNJODACm]Q}yTT箜“exaz?ZmF--\c"-^!{x-^0SJNLTIS? I<s_LSEE$hA/UrG0˨#!,g vW!*Bsqٍe6T :VUƯ9vg;J-)n6P'"rLX/\A2[Ǥ 0"Ҁ+N=O +X]E:@ *wRbԩ@%>/$Ey!ZfFv-":(\p٬my;qNU|$a@ۚ\FEixZ_cxQXij7D },I'^=[>cm &Aٛ\[L5*J9[N(p 4=}ۃj|_GAshJ@E S.liZ{ QP %y nGPYs_nXk#Z@(lc[F20Xtlc+@ơD]BrW |Om0v w}eaM=AP(#y,Rcd%3e\r`sS^? 8 ތp1 I93GCn'p-Ή2ba)%R^oHWTʾҽG_7~ O)yѹ&O.gjŮ Նk?H]Խl)QѳIv*>ZC jݏƤ isAhrr:*5Cqth9X{X@0ga$9Hݏک.CPMR4f] ]I[yu'>l?N>Sb2Nc2{AɤwoV=u6WV[(ےJ(+c䗶I|"S X 5ֶ )2/WE&.j4-P@L➿shC#SlmVj|X*Y{TA1/ŕd^ ^hfǝ倄|0GXSML'к*av{@fΫs&\XLs; )2ߛMVxʞѫ>hK;QI VCRGXg\CnX@O>ئF (Th=/ycJ31F +WAµpX)̀"@-wOx(jU=ƊpcmJu5bc$JYUqr-70e3M8/"Ë E>ȕ]=n9%}RR rU)txɠ7,H"vUjEL-lxu|8HƓͭu%ʰ#Zb|]w{f0wbR"l鬃"l 0MMD@Z i BՄ0bgS଴&.`K$ aJ:AيJm{*;v䕺3_ug08aiw\~3W#d()co: 85$ʂ>OJ=_]"u"\\.vU z4T&Xä,%.Deŭ}(PRj"*ڽl4>^[O.7/X $CP'r-Ml1S3„w x8,/Ndb5Xpw @W^A#hdw2q(\,L[Y} KB\$Nȁ]HY< h=HXLBQ,('9Ҿ$0Ifƕ0ߧ޻m%6$k"lvW0XRƸ,ۦV0Vfe ;5i)O0n3aA}F[EQ>3H/?WA(pbE 3]SU8s.8R|)K!'FWa5_hrSJ:Pj1 3gC|*JiKD[с5Y55@lEʡa6?'2> C;;+uNb١۵NH!qC7̼s` +=*;V*JWb+tx[λڐO6 yi܌#5 ?q](+WUM&U`!C . `k^O(yřk5Fur3G&M*Ɖp1lUD+?Gv'A厠nPLE eYU@$oJRthcTWUUÉ'ӯY·w%r<&SM2S-4b)_aDQNs<5eeyaߊN=0Ζ_EljUqcHCslϋ?!l X38pakI}ܞs%+kRP"icXAϻHIg6n{+霐zWA-B2tϼqzW O]'af3]紿eXOPubXN:W-*ǾlZA߭NTPU@[tyW -h1vH[G'y& ^kcY%uօ+ɪusw'$)cLTΪ~q҂ lˬzsR5x_!yM>VAk䆗Wch(K;>Y9*[F.gg/'؋+B9SX~#)#IW҆3A =]k^C[@فv/џetspHtDBZ+J"y,B˓B]\OyFN p㈓pQZv9&h8jUakHrH8 V×Rf屙B{IBB12ZP}b\AW&x ?5Y kV3u JяkIPXGGJ<_7{{FT!`f"r׎B*hy'2aP#]p6QVwӳ"xe"`=OdyFqGXƍ=,tQ1]~Ke XNm0/2[g)/sQ*\2X`2bO1eFI쉗UR9Y 00?(館^S#.:u:Lm"l*ܑKڟnf=#$w ܢÞt *'}7߷DžQ%O'DNɃBv<ѴuޚǸ@VDd@ZO-?(o!ﮰa5Wdߢ\ ]i OB˂q)=>pxYcB)[@&ɒ/{5Hp="r7a NP\sa3F8Qs/QlE_-j4Ca d'ݑپy)4ӝ4gKipLrfKK)#6L0&KHUe"h ~Z( dFP+Ud]$1D\'I a<;ahdsg_$ȮI%KJM5<1ۢסX3dx'b$Hw8ݏJwJͦ m\Pxm>¬P{iVaY&&RfD%yOhL&0[i={ WdžN%(s|)Ep| \0LC}(sJ>Q\VE!S"&3^hZp!"۶A ,r:78&Ǥ)#MwMT H n0SٌI\OR4IFYtnԘpGURrC :.uS9~!<}с[U$5%MRKQe=d95b4a~Uڸ+%/]M.l*94;e%εG B&hėqT;ݽ,/Uw7% $#pn\i-jVVɵh VS^QuU?o<0Zt 6ĚΊm8]'5#1NTK;Ii RUd.y{C?L6HV"xiQg׺%zўuf7l^pn1)Ar? %g`SKW;[Cü`~^B:K `WfĢ"Q6+/pK>^>޵Zk^iE5>9 ޻YgM#STC p1 ނg]ҍqV]mhC+)>_Qi\~TEPfDGbL7 a=KN洔^Rb ;BiZ<EW\0'i1 e8"x{TveAG$QP" Ϲnv5No0n #8>`LǯJ%]ՕګLhG6~8<K* _| Qfi8$M?GYGZ,F\T6I8Q~U.%Zg^Y,el(XæBy|ssWxpšw9j&o?/oҵE6CQZ-kz){*9NL$`u~heof*"go+kA*ao TD0gYy|$ÇYpÂ[rRI4Y1!L= 9D~mp#P Sn('HHgүȮd%sgoUxdXNS,J T;(-Sn7av. r/}G~hIE Y1,zb*K /^=Bد*P6wUA!L^[^S#rv;c#0&'G+)(nRWuIx2!tzDޯ "aeg JgƢ{sĹ*I~rlw1M,`#8h"W.lJLkbDXXے~"##հH\ͪQğؼBzAx%U[;'K0Vi7b`)e(G ~hgpo!+I8 `E&}&ҽ^/|"S(#&4q{.0Ƭ،7ei4VcꋞA$ktZT"-f؁6}+0v7El[~V߀>am”| gy ݝh0% ssk1[h6Iv It},nWFuQs_=l?:ÂJcz1;Y ŒeTYѽ-F0qM~Gq快x`& UcsEwBD(K Ho|IZmPR/XЫSldԁ$YaiIx,)<zj=FEQKH6sw,c$׉lQ8Eܰ +c^mSTW 2?\us[9[lMŮ[U`2G)N55.N^"x"aB\/1 Z>}X5 ?1#uk1j>|g"iQDT{Aʵp^ˎ tJDZɜh Fߕ~>Xɦmd+]y WD\ɛYbY,n+]]JekeAVr$v]څmS;RaW;v+U5'"׸Zh/NA;pR3(5DZ9rFP LFt8z@vI)̎y5]D(Y!7(OlRgs(.ơ Ei- 4;^nRY״)g-THŤVA/=?:J~>Ӻ~nhKR&-Lr{1j[PFokxNO LqmsU;J{U5a(/,cǤ4=DƦ7p)c*-(&ĢѶpTHjҞdnw(3Y-yq\Nڍ{v|ݝ\$ZQ}? aM?df \4yD*T1(+f89 6jQҜ !D?!C<4Ft+|K$|B=t!4q9FPՒ92ϯQxx,"[*Doeie+dmL 5XR/{x_ӏ^꘣9Yu^ԓ-rYzg#7/ҾEt/*z4^*Hx`܌W6 1ȡO p 2*4@fWOeV!b,@"/~ZIp݈3Imq"dټc H3_IمAjOBl<ؘ(^G7NA(!Bc3 +WEq\ޒ$K:tŅ!9y#lJZ.e I$$ȍcYHH?݆ҧ{*wU(!_Rx+&.뮕I*ɳGb[8Ƽӵd*ƆN~~āO_+d' Ýdt֊5hdMʂ}/TE[^|d1Z"i;֦habU,>H䖺QBet>8z_P'hWvXWyi *kG QIB+^kz*&yxeVM%V3TE3A\!oE#D$t ,0UbH&B<123ſu%uACqwP%npDc/"Zg5I+e)[HmV8.ulMխ^ae,E=eؖ HbVA挗,1%@y2v.kjqF3pbGs^71]JEi+gyiԈ/m{VT#%UfdB2eQ^76$fݠ *P6߃ef{iH9O dKL쾲T @8T` =M Bv[, hVb6&BP@@yt*y&#YP36Xhcr ڑӒ'sLW9x8# ,"ep78]M Ƀzd;>W.eQ61H(!mn)zYW cYv >=0ӿ9Rא>0l.QH̒O$2OrI3ə$3d2g2fI''y&L2dI$2|g$2Irr2d̞|$dgfI$''9&d<&I?NI2I$$ɓ$d2drdə2fNgI$ٙ9?<$ dO9N$&ydI3&NL>I2Ld'&rI'ɇ2dɒI$9'?I2g>sI'əNI2I32rI99O9I&IOg$I&NI&d2I$$zs$9$9$y9&O?'<3'$dI2|O2I99gds&d$$$9'NLsI39'3Oyɜ2g$&I?L̓$3$IyINy<$9&LI&I>I$Lә>sILO3y9&dLI'&də$9̓d&s&L2d&II'$$|rLɓ'y'2IϞLɓ$̓$$NINfy&LNfI$I$3$2fId$2s<'rO9Lϙ3$$<$i'fLd2I''&ONLrdII'2d&g2y2L9I3I&L2NfL䜓I?9fIO&I'9\2I<ϒIɜdI'$NII$I92L'̒dd3ϒI̒I2frI2d$I?Ig&L$$dɒI>LI7&y&I0Y N%|Y~M !;m,漿 ë-:-YfdMu_l?uG>ވV ^&[N7J(wޡΛ>'ecf\}ۈ&+LyJᙶq qJR>ҏQؗLR-K$CB(dJ~ HեqY0C@Yh{:D>XtE#1h)xt>@O*R|8>80.1"qpٽ=Bj*yV8#\dt˘'c-Z: c+e2vre˥drFH`)'Y|EԱ޹i']. T'Q1w -޲tۊ܁WF7+Ƀ!R(f %{e=j0*皹h5t<\V*Lp28@()tv90낫璤u98`yѳ5PoNz`;5|% /?ٕ,:?]R3V-ahz %TKM_0NѵT3iktLhI <1ڟ!$-`Vzj%\xT0j)1Y(5jZᖋ+m?@/8C:pơ+zԟozSo\󞳵i#bZ(uJ@ŔxIG(1Ab[h}9%Nk  NPKJACP< ܰT?:=js [e+њBMo,^`UMĥE@O¢1ZmpI>[5A]-Sf&]ip6\٤?JPF/ZͥM?^>\c\Fh3@0S@&i*pL9csDDg3!2$:m =b;9AgwyܝaCW;E1!y<ˁr&7I'X HꛎlkL4cdGq7ঢ2&{Ё͹D(0%TC3a &?Ǻ:79%7M_=!ETLUlqhdm(b`"Y-gmRs9!x1w}w3#/%|LQ2|+ G6{ <UjIf~}S.}3~@Ku&zY 8j0 pZYY¶X:53ɕpէԹ,6Kye(8Vel~\"Cf^mBTYwi_7GElЭ(}@Rn+YpZ,eYvӊti G>Fl {ٰI¢QBD?ڇUBDu!b6a0_~j2kQ P=#~Mya3w")H^t܂2*I-JWP@dI< 7y{";>>uv"6< 'ȗ E=Z4:zBKj”=XueLk*J4KW= ˇD!$lN x*[Qh,wnLd8߹Rv≯wЇݪ頃JĆ4^">^+!7dALi_~/6 <= "KI!I"QkֵKӖT} wP YGt.% { FLֶv.!U5 mc}skWMCg6 8)0dnC]d8mdo؛ZCED噖,D2?'>G1y^٩(H2)pBnuziqsc)أ0+2^Q[eq`E'&<i c #'C̲|/ 2Δ=`gЛYk} Wbc1Ap娥CA VxT #o7pJ"`cTA5!DRR,(x'\75>r=Ub숣O?d'>E{4b!13 lyس剌$SvȈhsEdTfL讗f#DQ6J5QJZ"{4q)L·"KU0yu1۔CF0U TOqd/T/.kVHҙACId *F ٙ$04vTl'o(5X˛3}wtu3sY P8}JxSVS/cj֫^zu RLu믋#A 4`_RƷ5zhJSo<?Knr##xqJh*mKbUWE8l 4"Z}iF΁nK|є LᓿgVR(dX PyDѡ#,K}1l9949`IՌ;mL|&:,րr0d_笠3Ę_򹑂֜0 gޠ:|.6șD/B&%@V-YH( Yߍ1H aĎB>I)C߶nZ.[pӚ!-<%b- +3@J5HDoD#j;Q(EC\)qD[uĊvɂ"ws 򳠫$૩X #'!{zn gaMD'TS|6 3*H&>A'( ܵ( 2ֹҵ_9*B(NQI?jBIg8hn@:3$jcǨ̯y03jSsF9t:Df9ߋb/4Ǚ#aWJ g_ń-d$;ؓmI@D_G~8w!B3nQ^fkɑtﮟeS^1oc`;t&Ubwavf=1 )V`fݿ*8=Ķ3قG"-Z8 ^O|$ Ϡ˚kT!0^LY35=TM!luJdM:-ȟAqBgDۚ%oWKuJS6& 2IBW>L;9MAˢg."Pw=~@[|pU,H+2;e%8w=zhں G&`p lts,l:OMv{e hVe^ϊ9;\WB˸Z6v< 㵹SUI/֍P쾛O&+Y#>Ko$4MVSŹ T냤{@p \ъ;mrI=%(H`y7:U~&IregY *:J#{MCC_Pm3=22Wzau(43Q)qjEu@U+dۗoH|g t@,fT j%=IY'R  8ܐpA;@u3.So][A.esE*[cdB=zT W5XYhgyQ<d~щWIp_QN)ύ}1/2 F`*FSuE]_H+ j.Q턗!&48w-X3G [$&:fĒx+v]Mk#)fa齍—j$LN64wg}HUYmH cpicy۠;U &oUxC{ o!B\p!dpPIȕ%+N*Ķ%'3 g&F?pΊ%'zH|EDoq" ͵p ̺wثڙyi/ph~ ^D7žT Fcwސ'LMuWw`rF>[Gzz3aK%k+OPVOHaiU{/ME u11aT4<a*-i2|C7;2fpcj9ZQ"ՋF$/A~KeP (n.Zk>#FOVfKPkԦ"(w@k5Ф+ X|`cPV65E%]PHϹM0}D vsP9&6*<ڤMx~Z6>q}eSI`1u5R~O*;;}$9Æl4"LÓ JiMKaUqƮ%8f{B XbYsi3E1}Y<1rN"5*SW(', !Dٕ/iKljT‘2U➭XSƗʦZ@==$j1]-áaS6 ,E$FwkJK3bK S(ZfXG([ӿ B\yis#bJ;b\y{UědvDl xuLB% @& "f4T{*IvaQu&~X68"+WU4zp%"E҈NMhҮ3uPg?ә0+I UgbIRnxGv@t`Xe>V>,~+PQ 76g(\ MRIU)'wL 0L`!de# ?^o!5CK, H>Is -ͧ!Y3 wn+~-\P%K)ݞsD`Tdf:wh[(GJ藝ZwlO˞@1ܞ>G:bByi1 m7I3Q1 'T~8w7y/].'H>IE@Zxu?I\P\£+0cOd!)>/LJlUBT9!b1VWf*TiRBb 3c9-/z5X 19A'Y6o--zV #ҷ\7|%OYέbk.Eςm6JcR`9縭'Kjcr6TSrk1i:l1݂&:>Ot)M,Ca OsUg Qޅ Yh+h҄XwakJ'NS*)YRc2buV-VE/Zyɂ0 ɺЃԑ"T 2l88 !]=>%oX/=^jzŗ|G1IL$Μ?yAT8&BeÒa[rpֆs/khJlH׃荭eM^ }ԏ~LupPmA.<ɒ\+I&Q>Kz,$]~A %㱝(`@0NXLu/v>x%{=!EH/w IzmiNYM6[$1eaQZ+)u+ֺk+%ϤYyxر% wbB'0^>هK`Cy^+[(4y ~'%LT}lMfAP]1[m N` aG TX{20 q}H/-Ă:ɽr3a9Za$j="e ,!j $<;ل)ExJ:1 j:1(mEtJ2n+g>dm1M͍W1~I">S;~"T<WƦWUٱ?`nma~":R+X.xwj!lp7A A@*JIo]HFe(W}ruSWU-٨tOI0$}iRGɕNkc\&$fy?:>\ID{l/@i" -J\r΍ ?yiХйNx>56,Ǐ}j$pBIP|_\hK8BB$b 5^FZeQsic -20Lu} 2eexCt8UƧá2w@u%2 7KůL^VM Wc8gjJNLLEVS |76csXzns 5*|Z4Nvֿ4A ޭ*LOwܽTGnޔz Z6߈##[ o Cvb=L]V3OqeGۄztC'"Of[.ëYd_„zw_ L0x{MkT]Sxf˦kyu|bo)ղP?>x2-b :Be\ 2ufˑ`Xqt0q>~JPVh&EzO$@PJ{-8. lcKɑ{xHZnj^7cZ@J$]2em*Sur&tj\:4tد0 e/=AtKPױ"Cr'U H}Iq>{IbK5sQC2:Q,!R:W2ZgM0rdʗ}:B FՐ?`L2Mz@3u9 ,fjLMm\"J9El!>1t8ܞbȘ8_P#" ^=EFO&7.jI GͬYG)ɐʊ>D?e˳#.v'ϓNI9&dd'92rI9<'$$'3$9>NL<$I9$ϓ3$d$9&I'$OٙIL|ɜ<$̜3̜dL$y2s2ds$fNrL̙'$NLLI2gL$2I3<&I$$N$NNI$<̙g9$ɓsNdI'$33s$ &də2LI$d&fI$I3$$̒Oyd2I&rs3d<$r939&I3$2fd$9$$I$>rI3992I9$I99|ɜ&I&də2d$$$<̙LddO$̙2dL̒I)NrI$$$I&I2fy$$sI3$K&L&I?drI?2I$&I&O$$L$'9&sI%$&L?2d&fy3&I2LIrNI'$y3'<&L2sL2dfdg3$rN|I9O <'2I3!|II93d$'fI2I$&d'd$rrd$$$$|$̙$9$_$9$$Y2y32I&I3ϒI%̙3$ Y Nf ei !|#ˤ$x溕<. }D<P,A/y?]Q. +_xn @Dh+$&F?" |t?&d9qxKˉ9QW >ŰK7r?b}OW Ös1 QMJ2xIZ fp PrWbQOUF ]$J2 ik+ qܶ$3<Зw\F/Lb 9-@|H&Ӗ}Y%|+)r|X+w"F`oY &''vSp/B.`T"gm%qM ?q.w.fro2\nvl=8rĜ ~]d5{ȴ*:؁K2xh5#\뻽G"qx.@c+$XX(w??'Dު!Y+$9˚7!{XtSfA=a=ƍ+~^uC5}g\y"jzQDQk,:cks'o8ǑPmJw&`%7y)$II4i&Ā_j4m=b.aJA9E0u~Л3̸JG9I`Y8dfi\,c*uB%ruqVqU\NM! ~9JS֥μW-ݪt"qymhdQACeFh kRd% h*YJH ,#Y0N7iyO WRm lGysYb%;O(4Hm&ܫX3t2@υY)cAK|7L]%肚J)-ݐSTѨr]?ʆFik,J/IRX1KVxՈnay:)N<Qܷ476m((uD7!fTY7lٻI7߰QvZ|+*v44f@|_ĮRDC {0lŕb %1o[Dvd Abڜ *tмQ$IGpF>v)6T@P9,!O=t%03UDCjK/$ONAg{-G-g'4 VMWZ ?!GԙWv'*DsEgdVtⷺ`q7vVl A)6ZaػT_RYPՂӊZ$X~z)5KkMaI6fuwc¿jI^-фgi"3x2x<I:NhY˜Vlm>sYD$k-V˧٥7ė2pɔ^R#]a.)@/Ϗ&~""ZyQNB낸U'ʹ&!F,kH:H[!녋3цJ=S*>Pڧ@.pBJ0aH@@m}B[MF+J82%A; CqXGzb6 L7"fxΖڒMZ#e&T+lQ:4SV*TBuvۢJn ͘Sc$}=+.̵ ؇*$9XCIafU`㒂{حD~^+3G\0Pd)cKJ/1q#br/_>'B#O2>BaL2tz]2qJ$^r . %$t7 B.A^ǣI|RS ؓM^;RaEKq[#'0׼ӧNIr*a8r`«O6U.SHj.Ab[PJ 9ƥ#Vdaq[΍2;{ RC&6B]!:g"eci&U:9xoixqV+h'hXJa7q"ȖKQvBp5BS_qUT*qpHɣE uPXAIF$\2:B1VJ6Z:Da1PS]XF/ɶZ%[]IZDq%m(V?ҘC"FNc˄AB fJs%GEү 2-*b;ZTPKOѴB4ٵucLwt3ђ0C"ujAOi6(oYTZ 复nmWx o1ߧ- 53XĪW$UB7O7"#I^E`B+cDѺOR&rD@u=M [Et QE$hqH2 IlIb9uЧ P!EvZV_aDn0(m03ƹ8wy-'%$KL"=pjFCtS轶xvA8&Ls!6,غ){I>bYmIZ"<UeP<3 1\0^LZ,PNTR8iM?j]bG悡q/ҥґb \ډ>X|r0,@T/.d)3"#VQ"$U@h[2d*ھ(apꌫ+0X&"B ֯Iml6Q!*w(bzp*čq)FsI_г5q#Ob$SuWN?! Ps7ۭӲY҄D5[j?- *w^9aCi`-6v{bJ N-xto53"xB5q`r58\ŭz7ݤ֣;*d2הnP# *jJ!M(DcT]_+ɑ\N a%&\/cH))$\mʧP"PW*mOɢ3U߲j2De9lHʄZH¾n`fX$tAZ*t.㨩Ѡ!'HK;N@M>gС䊰ݢ9~_"C݄?Üο%pR̭~5VkvkM[1N1YwLv&WܝR8ORBDDR#,{IBEsϹ7sQ2Y2 s8noO"?"LTQG l$;/:h<>yhmFˆR#1cc BTџ4?4čL hsQ)8N8Ϡ9="$PJ1 Z UE3 ùpۧL)xLSߨ BxE67_7bgoJ^&Tb5Oelo=2f~ں\l\cOkmro^^z醲 tpmM Iw/U[Xe˙^^ݯHwtt`_LYɮֶڙ,Jy9~ZfC2{JO< 0< V/߇p\b S)@&ۛ 41PLQ?:wiG6 $rC`ݔrPCIt/{a3z ZehOMQʉZC)3".g )U&U@@ބzT1@R0Q̧F h܋NJ(CteھirnJey5*?P?_&.'[Yp-5wHa/#̺f_ˉb7]KEV@i#H "-`JL[B"#_Qu̖ӵ?כzG?OISV7䝨'&UxZ,(xV%܈U?s$n JH=%m:"brnJYVf=YFjsN{[jޒ,gce35XȪ͍0/Saz,wȃ%CZI|T`QDU!"5+3JhbQuϐYPf; Sm*>@y^&.Rpe A?1uRt" } `̠Bu,TbDP%k褠O:fXLu~];#3\02ˆ+mG4BEC,N#h*e=;[i.i.\K_1AW1>j*Vɜ^'p:WmlމZY/ f̉a:@k"2S/?F{at jUugEsD zYZ n@hbK>8cuIG[OӍCtfDUFCbcr``yI#/^(e"nO E=C5c!'9i̸=aOe5"ś/]l*n~d‹! #[7,H{Q%N \i: zD`zG#ʘrYҞ&LuIEkal< ROЦ(5bɀC+X&o0ŏjzRb+K',vҍۿ?gļs.`mǹ3eu;hޒsL`ft@U >g k2RhGθfBX 3Hn=!$?0@WdGX3I GPWJaۓ5WzS-.dYy\R~PE2;!9+ӝRwKY$9~ .[~lYΑ.]PAd4hi%{KP&ӿN?+ lYONdr==iϻ$)ʅpGt'˘II }wDAjDJWzUԙіjx aS"=kz/$z^rh &< yE;Ǒ-p}d,G@Zs|u.lPL\gd] I18Wpe]/"5F`v]NS}dLDeTV~AF׳']䩜8DP3 y+&Zc:UHdV$<RHpFX*eIIyH%"ij *W`@$h)Z9G)p31yBFwqp6{nU!w!R"xTXfa|b:l@ pUn(K}0I v6`?d٣yjxx<"\߅ 9[IO?U}DEdℷV\&ѯa~-b8olM--FQ~X1/x,T#U88X=LCo v$:O7%~(%sE},Ƭ5,, r9g!RV;/\ Uo+q`dy Qڂ%<8$ɒyIə$$3'2L$y$&L$$NI<$$d9$9$$I&y$2Ng&ry'I'<'2L$'$$I93!93$&Od9$II9'$Lɓ$$fNrL&I<&IdL$&I'2dI%I39I$ɓI$2Nd$'d2rI$K<>s$'&I99'L9&O?$fI$'3$?9&y9I2Lg$$d&yrI$̓'&~g9$癜|dII92NIəN~I&frffrrI$dϒNrLɟ3NLs999LIIrNNrI$'2s$s$L̓9y$̙$NddOL>s2LLI3$939I'I$ɓ39$9$'I&I9L$ϙ$sL̟2NfL&dO&I3&fNI̙ɓ2I&I$Lɜ$2I>fg2fL>g'2O&'O3O|'2L&I92L>O$Idə>L3&I&ffg̙$̙LI$&ILɒrfIL'2d2dffd2I<99$ɓ3$LfI's'L$ɒ~d̙&rd$s'$2fLLJL̙$Nuo`y'?t7OVjV$POs-$E d‚B³%m6t9K?Zgu@P)܄ɩT[/K2%LśgwvlfJEP2ox;k7AWXA8s0܂/ k_JȉB%)T(=F XTN$Qk`hURwlu&k6nk lkSӐ1v.o?T6I&XC,$ª3B*/VTVIH3Y¥N$G "cirɰ? C;뛁]~ΒVPOG"pne ˔;K` HlUEZ5^ Qm|e\w'κ8 溕)'!PD~0%Zqށ]\N yJ4BE^,f費"yuCpXsP,Mv._]GwKcVDQYLY\2;烋P9!eĥ Rpx y3] Dfpx!?uJ+JeA36:wc F 5*"lqXYvwU MQKqg )aON??`[X&W )Eoe0vHsjcu [~'?n\.r5ȕХ&MZ:%_H\,Y/v-@B۪7*y[/MTM"\3Qn{BXӔlj/p8' :ڣu͐1i=vIXC[DB:?U{rn²,cQL`sARd0=wh/$f5aj\X ;W틛xo;c A%Ǧ] mT`𖋢arp*lc A*EngD⹹ܟs*>TJܑӵ{9eUճB"ioѩy׊hB8(,zå ,E:?{S\ڂEM=ik-dIRI;&\e!~ Flq--D-kP M|F ]b?pQZ X2i-; ]low2[4&MpEig=rfAHgoQd e覰O+-  4G6ڶDZ Eε] i"k_q-{FBTd?'_G?RunW킪tj 9?UuGv?-$`+"(J]u "Xݝq{=F,pOnf%o> ZNGNyI19+hYb pm L.슃Q:Ҏj>Rܕf$O754V7@6Ϯ:wm\.& I٢#߈_ mu8 >u*F+-\ѕC"l4GQ%M.kv⢀e! h5FxXBH7aW7s2K{m0$/H+&_͢$sH?p[W.,yWbNBZhwлmv`^XHTQoHS3V$OH?`(Gzw5! dT"-Q1 YX4J8awYrJ _$E;[ 175.GS-l"8<ё!BC,k@dȔe|;v% &S6WCN'$=~wB5fz{ք4IJ|fWAN GT>g`I5>qA$WF[yFuna0%ѝ?jZOyGA;;F HM=GGӯYpQq[ʉVs],DrԕE-ljЂ}fYv^ȇ:$Hnq4=賞eG8uyD hO !=/ pJ9q_4Lԝ@- 0=(p7=zf7 "(aE35PVV+3_BTvQeUoU+ 8% RrOHpՖ̡GB;<VҫOQ-2eݫ<[}=h,ԙ9u)%R ͑k[Β]4'?zj%:ʮZy<D_ WHg 5S:TDYu~Ӎ6c& **?sV7-+NX' Yovao$+<}hyՕΛKՉEHUrUC}`JYŰe_6\ r1.9&fumczOk ~FGrrvIgxN_wb@o!njf]i=[KkkH@+; bkjІ*v eK?wgp5 }qLZOcn FI aV[o HXc0R.bOR%U|ܣ!zf"̄SH9Ĉ @žS{9خ p4Ô1zmdu} +s @oCZ č ͮ8FΩ9Q^ 9tcgC@d j[ mJ1ׯQ[~{߉>M+(ز[q5 w ܿl-Kn˲D9M>nPSeB.Y*`FdcoLFج dЧ~9ntRŸ(6I*k@UŒD*pT)9:Nr*h^H-قLя)3Poظ+G8),V#Q1cNqtDr5eѮXJY;B8xAƒj)5brVp"D᜔m,AT4Ah[pPTGL\\a aV/?rGP{Lk>PV($xIۚbO1F/KW38;m弓u<+k4\@Z/bMu0 X YM`ʕji!ep{cD' 1D*Wat[bRakhF5A:ƬS"WPш?4_ovȯZ~<9 X *b 'M|^/7?$5#"f!m{CBvTʬ7k: p<O,ɼ0a;G]{W h͚sK{l(6J(腜@G lci{@VwJ*71%9_K6Bǩ'Y/$H1NNl>JS+TS}b+aw͠Sz{)rBuc*8ƍb "%Q9Y815颷-b(KJYOrR:sͶs _y6N[= ދ{nG6n˫Ro(w2-)S`cn 5J,&ڏ 6&yvE9f4??!ySVQk&EtW7T4!6wmB  kxŊ*zC*%Gf t0K4kf(!sTЎ$} Հ]L$$qoO? :U$YCZB6h[NlEt[9YT2T(z/SZ )vli[fPK+Xو6I]O,>K[<#+˖`?|7Fݞ} u|9%ӳJ(XGmd_2g4!2?:cHW !S i(`[͔5]~R 6R >XHJ!ٔ ETBn* 0^sC`Cp$bOUn?0PZY4N5iJ6Z@ʃrdSR{tg=h4:,lUg7qUHK( ʴhԵ4Jqݿҳn "7vkp0]{9p;XdKQ$MjQڇa XN!<䟵Eu@1NCHQtDrHJhPt6x|-O37D]nWCWn%Jy):K.=7pr|Ih6L_#kS9 B Fl{Gbv8 gH`QU?lܗ8?[Dǜ3~$Iɓ'Irg&rd'2rNO̙&d2|I9ɞI2O&s&INNLI̙$2NI$33$ɓ3ɒI$9gNgI<$$2fg3&Is2I$̜&I3''fO3y'&d̓3$II2d3$NdyO$&rI&LfId̓99'g$dI̙2g2I$&L2ry'I̓I93ɒI|ɒd<$y'&Nd$>g2dL2fI>rs2|ə&s92LL'$?>LI2rO'I$rrI&I&LO9sI&y&C$&rdINI2g$$I$9d'L&I'&f|$93y9g2s$Iy$&dɜ9$̒d39̙9̓3$Ϟy'$̙$$&I$$'$$&yrs2NL䓒I?2g'Iɒs|II2I2II>NrI$fo2rffNs$$NL32fNI&fy2Ld$Nd$O&y<̓&IO'<9NI$s&I2IL2I9'''d3$$ɒI$9d'I2ry2d̓2IɜI'ɒdg$rg$$9$NNI&NI$drdId2|'$dI%?2I$I$ds92NL2fI̙I2I2sN|frI&dOI$d$LfrId䓜2IL̙2rL2fII9g̓9ddd$&fI̙<3du ٓ&3P% =Z)v`~c 8 \nr,E4wpbf;NXف!*l[ M3Q79WL!`0Y88{EQGͲtJ)doYYɴ^hd% ]tXfdiOp+{.T GiW_TU dTDc)pImwS@* Ũ &0q;u`),F:zt@b=gXOzSh+U34GLmCbaU!qE`AR] LvJ!WcIiG{osW[:wcuaDڙ:UHD! TaW|0p±#ikŗ1SE*v#zrCfLaX#2#js ݒ.0iPl2A7Bqmmzom=db꤫stdUK:) |M t %j@BZQu\oⲺ&óZw^eC,k1#GM-_ɫ c M9 bs11ZHC9ʐ]_$wl@\o,aoy؆-&q~&g8:W3cx$)?n18Ԗxɂ'k GIt1h'D6 ).уi/Q aBL|<6)Eds.K 4\wlkk`z;_ɷH"3g$2Bōz !G&x- USD|T uT=7Zov <֔@(R@*CI!bV_ߩ:zwMdqҫxKgߢVo!- ؜_7;8NP{L,)41m]){o]iw)c =B!1EЯt[ ᶻod_c>zɚc%IN)G512\n'BVܢ 4nu#(Ap7ǩ*S!S=8Rqyp"_N@6獉'K=&U|nhgǠaTKQ?4rjWD'6&

9/dʽA%cpl>@#<>|̱`k(ٯ׀Хꏦʼnb{%i S[(m`t$)6%y%ζ"O{VXAxӈs:)L]#}%@z;,dDBUKz.9K$v ~"S' (b\ҫWHwBqπdMQzuVa juwTΡK]nhR{{y'σ wxj\OdUuG)<,CAQlL%7Y i ԅ] 2{ZY(^L/~L`Ey /*s% (oB3`;?arZ (X'Ć1?&N EFܭBFV?A:*܋#-zaPٔ( SddC>ǁ$$uԽA#VPubȶDpxVeQr*{ڪVu|@gƛoL`m $f}>I-9m{)qɒ Dc _ke6Bєֆ'C:& ;>f9cN]_䮲XƋkG@xAT~2]7|8p /滹[2:wCH:'S.SoKuZR`tL}'V~:A,ؕ+3VS2rdPUA>OS0ݞ{@ۅs9Bm$dqt B=`QU6;X;(6ԛnUՑ rEv r]Ow`CKW ҮrTrq/VXΛK_ rGg48>;:_ǔBj&{(l[TP 8w&@XkTlգQEBݨŶT5|ͻ$F^/ qJ,KF@a@Yew,J3Ϙdīp&t`6r~l>8傗LܹDNZyMC\:vԋcb}vl2uMsD V$E +ZЙPձYzu7]$Ael?jvtBhQ ep(E ǪԸVlBƌMibg.9fҙv (#%rB~Xt2&>! ^vi;;/& S8&+!8G¨L[q 4^8E{xD<an?o9&'}hۙ{-nc᜔4ᨱ"s $Ŧ%D}*Tٍ5jD bsp6 ,"OLkuZ(sI (kx͝m qDGOI3^({A;j{=A`#I̾vJ}cUIix+1|!ga,U@xX,Xh:Q)kx,&uy >—Ӣ?EdWS-B]bQQKR!ROM%4`@=6tjMe8awgb~ 8^ ^O4˗"d}74d0v9nY /J-CxE7ڝ|/>Mx^ؘn}Dѧv\رV AnmR .: St2scJ<- 4_¯λm/Fz(4y*a7ƴݸ ΠTd1ķՐtxa ikm}xzÒe8 qHL*icut[ pic޹ѶU/toߚl^$xUqQ!-XIIh6Cg*ɠi#qqDy&'b+@ȧ 7K-S]߰<踹b^DZp #ʘ-LxnKp1<kĥ<LtM\=a\#*Qjʪ#.[p6Dgz@zGKκ fNTOlbH!p/0;ǦyAvA<ɠgZS0n% \'[) K:rs$ʌՉD4>}D=5߷m8Yo-f=dB~RTA"[6x3nh흚o.븮=Ov_t}˟7}4MIsF4 ğ)|5*f_Ds6g?mw` {-4H hHܟ,w]>ѨPebcCv4OZN-K3:Ы-#*4gi]sl9VmU@[Rkd"g$8=ec\ Ó].{T|;βS bg,\vke'J~п ;E>5'DcUZ5L].*AnAbxȵkssN|^cOuǢ7cKpy6 g.ڏKJjlYkҼ]B h5@Y$'ב <=ɐd#%7?~Jݟwxeb12ZR"hѻ! VsR3EoF-Ѽ4`|%"n|coV\ԉAcbn\PrXA  *xԫ,N3(1W|W7?DvkA^J(ۉnVBNžRrz#"ʞYP"_JMQ* L!;Lk5CӍOyhPss qo)g4cީA빍6&ׅ cu%SiH@SRqbW&?(DCOHpxTjYke<5tҹ (ІuoX^^yZ`QqR$a6 #8Kgy"_[ 5 5<.QRr5sj_rcU伻7 YvLc"A7\3R+hi[k[*L͚n%MֶֽEbu[BsW "ƋȠ%PtA.'6.L+EMTlzJIL[).~; :GHH D!\0)e%;3B ?p pL.< žw{G8!b9cM^R9`;mP{8%J\rxB?T5 e;fY4W1,pF7~ح_|F'x\x]s :ğlPkAlJҙҌNktܪq~wzFi4Ș=,p } 6i.^ƴպ&ݬO'ۏZ#mf"hX zmSa$7|&locLG)*fYd|8|XE gCttsr u?{ۇR?/y9y\X2v ̾F[3G0^\U~05@{1- :rB(ݗ˼9NZuP~:w^=,Q<ƂbY< "4 ԧk ubuĩ> [ wrԀU GퟣuA |CN/XRnWUz /tfUu(#_n77~5_ 4wzHH1Wx> '6Uk ic*˾"BA k1o#IT캥Jgw)jW Η!sNVU5W~g}E$v!s8`֊D;NC8C=Fdi"=PHWQfXsR"!5k-4h:V}BI6d{.ODh2O2 ~L-x_3zkTBw[Q~{kup,vA",N5z$h^ #W4zNĵ\12ՕMcXuS='9ZH8c_К*\5 }3~ A.LnhZVLF뚹NMmDxdP4'pVaNWgh ly5iEO+#D.=s6ɹ39\akC28b ;qk!4f$QɄO*2aSwo#XK{U͈'@ص3'n_f((M5ktQ'^+˷myk3[W>Ze Dc!yt# ۣ`Rxk k^CrAog'&0+GztWZ!qrDX*â9=ˇ e#X?c֋j!OH OGyJkj҃'ae膽̸rmt.لQ~AXRx)lIuh,4Z/.l{݄skD>%EwM>5YBXѨ7T*Xz2mDtQGg0F4޼,ٝJ~aw_bCE܀*߽*u$@Xn{(Ud%(bIzkHAsa2s` 1UK\R-MH:bt8Z,X"_%Z7XpҐr^_ #7(>|87,'!Λ&zk a-3QJ/z`HfKVM2h#AkcBZ+}x>*i>H4>پUxSR>0yB̼\MݵGİŕwvJM޹ G0d3+jMO^fZ>Ӄ\DtA嵎 gN`Yl;,X?N*< ; O7PI/7'*b\ye= yPUwJ ,^ j`_^(> ů8MMW'4M"e}v% fX*u&Br^CD0(͂ډQlƗkq?~nrn#}v sFR楣f2?nmP@IgvnMک;G!{mȋNr<~_s[qJ]Y+ VYZVq =V%$MVF5z X)v 1ܔoC~-.SVc] ͫa:!V W cS(6.Ykn[Sle`Ɗi-YPQ \4mKA ^b;3 K-F6.ugyL!y}Qd\T_j\OKwvkdr[*K騠a# BF4$9'Is`ʥj bK;fR_>2Z_ᡅ $ >|{aJQ3\]G9wI^ v룺NvY@ Z+@g  `_03Q[8xVhJpTE>% Xl ;^ؽ)%ɍ=L.'(r7T --LQs{5LZj¬GwHt%VS< J4~iwdÉB9l4跖Pt/KqoQSB86na- 4Dwx 0?[ă|Ɣp^:WwV֒߰-=Rg%S$XO$Jwp1L3|K^-{+]]~Du9L5,1)i>NrBY3)qg-qNȘDǞTE45 gb&׺?Qi YONy㙘fXXp =wUXfyalW򥯐t{Ea'/T¼>򣒦!lr">#łi*G3rg8΍.~ 93Dn_nح@+UP[:$zl?æs 5FpoF>IXeWo9 N&7l֫wU1Oщe^Oi]8?M4mAH"WFţ-#?}"xC"V`x㣻8Z&6q\ >@9cRwXp~hLW!ͷ*UZ"`~զxSA\>/ lJwqmUr~{MڧA->wϦΏϨ\eKqD BsĆ %61gqVfI\d&os[eJLp#5A^(]yX"{ [*{ :n01=?㤬fi4^ՉF,diݽN{QH4E/s,eR|kgɽyЇN<'k!G9xVVBKl.f| vwH[[0AE5zCiûHWa8'@5メXQr$xG~S4|/\Jxt3y8gYL-Cv̹S!$Q6)Ԣ&~!jBsZ2y0sI'*\q_^ۄyiU˺ k LlE6\PuƒI͚urEutÈo/LI@U{VX|c FY0j  m|_%ќRF plotxWS^&W6;z8rLQ Q=вpq!e@{"4icPPv & F<}KxPc]{${ g_4:u*5\nuHn coQ8/H\ |:gA^f5uR.HaoY&=y봥,D/=`B'=J 0\ AE4LG퐧bE2, g{Y 8.v?u?\:H,'eֳ&&xTGSo/ZQSf`!x =9 D-]׉6s@wꁜp,– TqџJZ-:h G4̉nͪ8/8 H*0d@YRc_B+ .L6F#diVؘA WP02Vx0瓊yF{t̝wrB[vBP´-dSD  TqemB~[u~ݽJXcMX{|~zCKt_&'f̃ǃBL>qcBs-?1q(3Giit/,e/#tWs GԼX aO~{<ѷEwyn)s%ߒ 9MMk:Mկa'kL_~O\s {BT|!QeE_6'btWt%ـn1tƂtX')đeG[4_t?Z$knn9rT`~ŃDJo.)wSw|_uA5N{v,/D!+s-kw4dZ` iwv`&wh=VYV3UX>/ "sgx?q]޶kΜ!$Pʯ@)lw1#e}c| } >6+{6 d-kAhSn[5Ίm2o"$qӽgQqم*V/AT|6q`lanYa7:K*\U*qޜs:ϝ|7(̂9wff/i9t''/T7lV&}@E.6{V7 Fyid_3SPT:uqoҩ>(pτqh0k!XS[LU/Bݣ:dc):ia J><3Q?8ʼSFƔ[K/g? &&7O%j$];[VF6Ty xRA(o|_Sv`EV*Zg]BCF+Į~Ju*73zZۭuin%>&o~_,q5#=,\q+>j|g<Ɛ*j$Nʩ4ҡ/V1!cYx[äZcjf:np^{wRRsy(%fp.C/>uRF4~"OY I<;^1&WVuy /b4Skhyԍ1G"^#M3](BkTnծC;ZVrT51$lxB'bW m;]4~Ȑ2i͖J8jbkZ &#]԰dms;4K2'4p:i0^~&\7afC׌sd nɕg߈; ÙtqkN-PV`3ǗɥO3)؏ &t`C_$;)" bՙX/Dϔ9]AxcfL Z/crER+ =j%N2!8m0ev #^2n_5ND"q`E_5.r!P[3bvH"%E+UeuSdibl*5MbvR) /Y`-}]*[ciߪ"G~ケdeBPT0< b/nFڐc'_^㰇̡/uWYWI!;XQ/|`Fs+}7.0@hiJUz/#ZIO>Dʮ쓡|`H%fPeLDs菉 6,uj۴nk`PoI6l\ 8ntWsrc)&Y'pKrkgT$Q9o<_\")I9K,e{(Lأe$]+F^ i̟h%fOn(ϲOc^J>FA`s(S;,"Fl fҰ?ʝIĀ ,"Z<|Y!BlY9;fpq:~&V?,!ɑDVPz^w{k1u3*7.ݕ񧬧}?9n7햧J_UPU/q1 XZ9.8TLuH.ְ1RѠ_ȳjp \Xkغ<ǎ"؜|Q};\2wqC]02rfH)=_mwVqWJ `P˩P};FsskUrf.yת YJQV5`kU}_``;:W`^|cZzNf+y,Eo>=txPMp?gX=WPT?fӼgZdᇻAzx6ɾP5= mڸ-zZ`Yx $ew:};0z"sZ65~dQb[;A&lIʤ9D}/SJ-8W;p/Gc=AT,14TD ;y~EM r)C=Yf`с*:@Car9D3J@fyuߨ,L!/.dD)tq`yPk+g{*6;e2kDn G#O)4faTf 暰X̥05qB%8Dl>q;$GB%2nJz# wb%&aW'7W6sERz1{ڡQlq'x1ט%sw Si!u 9tFWnvrX"Y}|0Ѵ];794O]s1 CA//"o:3+5[kxB43w &EV(j͖2& Q㚢$jm; ;. QoAcmUnlvѴ#əw# p S*سbm3(J=2ǔ`h=cy[TUeGJRМ޵2ߴoґ`v KD)Z3. `6먝ZI l)J(^S[. ش!O&*C-U(%s tT>|tt'{=SGdhc u>[c]2h9:aa.5kr<3r,IyyznЫn#fî)kP\ixDnS*C89 `#fh)Љ1OիRW2Du*m~ɡ={إ;0{7}T\.+wЁVƒc`]'/!^[yKDѥH{HtiS"É*4=&9i/3GI Nfῂs)rQi'(0WF喫!凇 *!:[]c̓l\]3#HDޮF_sj*A'yI\8[p(VsBM۰NSisa^~õㇳ?սԊQ{.## fA SŨBrrLJgECk. J]lEXB~3~x[\bY_{K_383|M%[h)]j^#3kSY? }H8 3g!chzݧabb_p[6 IQڣ;$auYW i{}}D< kcD~2]NtgZWmܧ:hJo`uRa4~yY{buj|s!RҎ'|DJ_jiX(¬܈@w FĻL`g=+4L2*/ Q:j61ͅ3VU l",f|Z%k]T/gR300(pJwHy٪xTU^$Φ/ԥWHm !ɪ5qeÅKtߠj=F&2qFͶnk_կ`W%qwM?<&v=0\ɏ&/P rXA?bn Z߾];[X<$#%׵ParuaK3u\} @Կ@+w45@5̻J7B(M ()hR8`It1W|-JũL:ITB[[E[gF1[%n6?vHS+|/_Ti:U^OEqiK 6/8F8gd}}W`d84 PYwA/(24?=8Z.1/ص%rkA`78Xd$֎ZtA=&kw]0)Qs=T(  C6L]/?0M͊,>]KUbY2H" +2^[@!5Բ^U?*"Rl;uRTb<*p񣬘#\wl kv9H: #-~w䒗ԼZ$ˠfy*0 BWis +SMe5wmrs%$ΝAyAN^]8M-w z~/9jP\2gIny8(y۩^L.eK ܒ6(,~[Y):ldҜ.7mXX7m@z Vui)=Uy̽hMd IWoY^*Qc-K1z8p9"{sׇ${+kMJ-p̒ǡPǁn@jFʥia.E9aӎT?f/;Q1eL׻<`%m~&>/]*d5;\];aJDM+E]ְ#BP9|m\z:B+qvSS PW*%z#AVYTR: PeJ{rRob*57ث+V֪څКRPQ,^9[MI@~[R>]5Si^~'A IAhLKq܋*aŚZR&v GY6w'O8Pp97/밡ќbN:!?N_n-ӱc7F U7s<xs tY&ԣHVGFI̤0&<πM0…*՞Ҍ6>'NSw:_T;7M(^[g_jGp?Ε%j6rXhS8>VBq!c|^ BnBzt B&(HNQFز2PnV\ųK(Svχ:[p偬7wKc n!&8|#D 8rQ\"Q|'q֜f+}_ḓ٫~x7^-yH7I)w , Ys=ݿ8r8/|  OL,W|`лmF ppeCN|ZU#a TTcC|PY~L1qnMQEjĨ¬DBM$Zwڿ]ǚos C(#6ĞauG+}w;,A{am7SZ/ٶ~:+|y4M=:k!*:OOsV:"'dIVlʕcNk&8fq,g#h9X4Ҭ;"w  vRn>zsKs+128['!="N;wG}EMz82ܱi\fae38ǎփVcţGí뢐<"Oa`1Iܓ-xC/.LrwrA77(X\[k#G\<bւfE?ACLLx}hzq4-bSM<V_LQ@u@#t¾ GaSBkX;ТwQ6.c‡JgdeH9YmY~Mwdl8:aԀhbFO< VGE,؁~9 ˵yq|;PB9uU=џ rri&:'GKrO:hغ|G&8#ݿ -D$WPI T´y q(w὿ewƹ/ _vWe )~Ajclu{ {o6lQzjt.$~򅏃SzY bR~\) x,>(™ld~t횅U%e()f1\P[=(=2l-}Y"jUuX@s'L|@+K$ř16EmMHҨSL6:騯[+8*Г>oÎ2i񌁰Ht@zZFGWwSR\B@;{W[M„h7TDsk$B)3'ɺx9IbY]&Y7,tAJwn BҰ*rڢog,I|0'4$m0u#cTbmȪ.^UB"nx*o?16Rntx;,#=df;fKX7.[s-/T qŮ1ϑIEL):^Li UDW8/i?cb~v\K5‹h3&4! vXu \yiO޲I)XE) RP5>i4 O$ JӺ@B7W0YZ [! ۣs"cvIrf<#:&( t@ !P" uJ^F:J8 w(lVej ^%DUWe]ī/XQĮ cQeVsʄo6'1@[sM!FwR33"m6;aqNfh{jT*v΋亸2=;J}g|Đec~ؼٸE.Ewչj#l}QJW=fvS-+G= ^c,Braz`)$pybf>ޮk.0(0:Ȱɀ:0WOzz /t%Ѽw̆B (~=3G- "p;S2_%wH)[k3I@7q&cpt%(?^JǨg}>L~z &=ș},[+9E*E1>Lv v/>H#ܝ=vܤvAȭ CgA3=V+eh-]U! :^Bܱ2&9a;RڷYYUuڠ]3/b.wQ>ܾk]kk%".bYGѷ&dt"z7/[) ܜ(s2UgC_ `'AqeY xOھ2 VTޚݫGe]PJ7[EW7J*5VO;8sh)ٯF[]`iT<]zL: Ѓ+oLɊ3_7[Ǖ E'-F$<3[nzzSRJۤ=0rɻ%$.DvM Է2e%˂G[ߵJ$]( DU#mbeA"6*5c?K<jtkF {uek}qj4` ]G6xPGȫ4|`p{ I&?Fp\hq2R!}Ii_I辤t̜nC#'EQu[M=T4ec`E:d͐y]<]?er2ɐ!N>#Wl:6n>={mmmuJAL'/0-7frrR/1g(:Y0DO߿d^s{R[ gK{03C Wkt!gb"1[1_S` zV xRjRlʁkLu>&lr,e3)$ C: ydxVUA]ى}ܟR1G9Q7v\z+pP2BC-hgD6֤D)$#j:# n .zOҏn>`Z}sP9T2.\WqPH?uiD$D@ʒ퉅ko:2(7B!Y@&y ~X Hv,,e'K(tדX#~,j*MII+^:xqnő b }e_7`\F 3gDg ! z:tL*ᇟڴKˋDž ڤ}8N;XHŇ3w\g O:X,/@ #@U\" z=Vd.Vk֕ܿe|/IC4`j||5L]C j&ĥ88[߽`MKd9N{+0Z) JtaTiނ{A;I >X s3@tWx_1bn lf8ˤOt ~ӽ%+벞; ̕ǷdjKͬo )="H*c9}_<*3Kk ?s0kLqR U$$]T=E̯)193ԑЏ1ɸ  J[J촚^?U6 G:}e]/Kؔ)S&a3P)u`0(sj|ũuBCw<T9^$|56 hQ$X/l3:rZ R٥]Sιt-oq%%-Z|O㶊m}a,S]{2H^ H{;)%"D8L:a4L@Z2ie&"ίnqRiRb; Uydؿ¨-q0"B ,g퉳]S]!le'6ѤrtO<v\"Alus_g"%Q3O(-ɻyTk&e4+J glJ3uMJPZMŷZ Ɇ.x5CaDpl{/U杭9D7aqdJrw-" Z rPT@䂟}! =xaf8{!v餝ր?q\G)'M>NA~s6v@O5=vQ1uW-ǒ&ǃo$"M,e >L+5eh5 Z[<:h68Usq/O+y0X '* ZZIYF](mb[ul2(#Ur \7.&yFj)_YvӉ5]6U xtPN(ϦHӃJ1OA9^JƜD4]&`:zaYrR݃?(L"doґlN#"Ql~ݚ ~.N#ߑ>\V&-Dh&"b̑9j$z؅ȃ s`zV/͟gay`9Fb{ҝS(!K. %v&oF Ʊ|(^5n_9°R.?sj@"Zr4KI-:^;ֳ ~#Gr\\ː¼IP +^4Ӎ^aTM@?o;Cmz26GNTGLYfKӝHuf^,KpXQJ+Gc>=}3cI`) kHS/o~׻)4%d(*S~.fRV1bdg&)`e!O,K3yGxJ-I5vcD*^2=H0gQgH|V){Q#+8ΪK֖%n vF%s: ˽%z^(/2O]=?97ĺޑ\,4ˀc▖ HIny{a}C>mS/})4jA.Ex3p?= &}K3>؂]'I+#RPhդ5j^++*֊ptY!HAR99>iHq7i;xn8Z1X\;Ҫȣ磴՘;Y5g"2m3%al'̷DmGCJ ;_Q ST4 SJL( !~Kr)M-w֜@? @K Z+tq mZC7p)&v$/0Sdi`U({sp'!Imߒ8 V3=E6F̔1 rtېS-`Uy{/<sYmS"Q=J8{[kW|=w ?JI[zʩcBC>ܶ׳Jd|Nh~ {oYcRŰýdˡD8V5|1!lm(&H:QI-'t\7ނmz -@+-0 Xbo++d 3b&v7.OWePT ԌRTP':~2mg"sٮ6A`QE ^>(脁zKͼ$MI0<*/` [7)S$J<#I~J;940 2EX6IG.C t/H:yS'3ciATu5)똉z8'XUNר$1 _[+@ᖴCկJX2"q=S;Rx_)P aE.-65c(p̮'WoWKM#tďkg ,3?9ScVS%ΘG̵ DZCmDpד(ad#._X,Z7Ԥ0}aSz*Tds( %EhaGBn.`Y.-{w/ꋷi߃.3 ۏ)"GUU߀H^4\XzzJd/aRay$OZWrmc{^t{Zפ<CPmeR_/nZu:CXt9,5!4# rߑp[r ѐ%}2R`HK«=ٯCX3i-q#TPdOKPi'*4L{OEѝUVo{VX3?~;UԸ!*dNxYl_usǰȥQlut.lD~`CKL&祺KxV c2#gwC3OBq۹B>3!+ּJͭ ݺ~Sמw/#9:r2$kA j}Ӳ`nÈ<0[Cͱ(#{VH\p[ /~Dў#?p.8:{FNv>eNS~LG '6مRxH`6M=&Ayi }tBO2:Mi~% U>XVU rO%;(C 7hţ?B ݺ& LuíZpʴ"^WԤ}_ "tضdlq ɽ-V"捧+YLx# /B {\҅ ŧԯ`k6E LS$ߝ8x ׍. WY[ȵ*A%cۻ6zA%He'OvgV1%wj6M}CG.ẻ/cח FuO޿wڝZ=?26gN[FM<p )+q8|-mj͖QĽKekn !9jqHi܇l{l I{x;Rk˃f49&h14g(x 5ܝzoQ!5FIc$pүmQ!)JM,Il&v[J0tO_zp{L9s]~pd+l=w*!IL#A Wiu7y~"ъ*|oO :CDr{'{|{e6Zꪧ+U<2%-.Е]\, Qa԰$ϟtfRU3g/R:b"Z*byˀWߒ뻴aV}s_۪B0:ZsVMg jK;]rh؏(90$ulYՌ rsWɺnw0 ݢT&'Tݣplݚf!K25CZf 8%».#6/%@;^6cJ,08h ݙ/rd8T]};@Hؘ!րӑH[ܾYG?/Ws'p7NU6s PnK>K x6 ~/, 5nNp .:OZҧ43w}ʿK 'U]X&eQ͒o}VyѻBh(}b"N]vQ =jOj~6ÆE-BkI_~{s%w<=&t`dlib(qJկXi"?JZ;}"HP B^a_|f3^w0fc#7PTsy&"nF&Ȕ 8{LƉ1QFr+b6_4e q&X\ 4, R!Fk|5F&> 3^ ܣ|Ju8?!{0<%=2JPoX2AFdG;.:>'uX]F"IA&̢37Tޏ8Bg'rLqtCf`'p짬yp{.0ӿ\XXt#W-ҵQiS8|0%)NGaMm1Y7Ǥ5l%Ka]Ye8/0G0sx0ܒփ X3tdV%&b  $3FH $2wvy/-V{_#&T%*}EYX=&&Ѧ cW=rǕE%4%@q٨e4y?-m|"BrdmwıV^\i]%]ޭtVݔn0R9*x{٧}@>۝t%!af>PO*:_>*3 -'. )r/^f4,W]v ZsӮ gWG3Y?r983'Bj03yEP}G~(dFvT<@H6$ afł8 @ >g{ᖔ;׺k ,"J9 5NL%W5x}z5&"¿\ܸȘ&,Pۇ}kz  Nq=3lck.Nč$-L+;JQVf ^jIET=X6I?,t{lChi*L\)![ff)Ѩ3^[Ecb 2_L?UWYthR#3Ewz; u(v JkDPqӖW_IJ&GZ,L'!F+VS R_!puw[o.&W쿢bߪ+=k#կbҧR]WWogB|A"tDMaL ܜbM瞒vVOf` JJ[yVS0́jrٞXᠠdmyC^YHWe²dL̢>j&"OUMuC#Rx@DY\Y7y12|I fު:Qz V#s1 0 1F C}Zz!C/ y Rqzc=:W 9S"S{q]iOBHp{,ft:NN)- O10AhL3WG35S\2eIQKMdR[G*ƬaX3}%bs +e69i%Iyd\m.+X@\zhZM3ى^SQ'̃I':X2|Du9;&9e CyY }iXo3BuGoP?@ &W jBޟ=l0W3>[e6[<`T3\{M)܋ݽtErLH}_QՠJ_wtub(,yVn\rUrO '(pr7)JM^˚-.?]S9{QK2MC^^.^77׷Ba4<` }>!Wvx*4G4W4ٖL 0NA55e~yU^\+^f%NCd"r zЖ8#S:0j&1^F83Rj~v{>3/ !5}1>kĨ>klhMn+{]l' ELF5@' $F33f]" dFr"צo -Fti^p{~5"aPO3a3#VSzJzS{G\ԉq5b'`ĥJ#^#C|t3Qgbqu-ܬqhDyP\atAsŔ}zBEZ=Ʀe=E }S|D:a-Kz&qm!zHԝ~,")`-2shq@p=B4~9YƆke"A:(R81Y#ż(Powڍ>UsvfE4_ *Ƶ@9ho*^(u<:Zv(XAYHCE& b*;Sl74zx[JZ qbɱu)"TI~ >k(@`m5)k[i[Zq2X" @{m1fcҪQbD,b&kPڳ\1zhNᆵ(e_s^Q=KyW&^Y' {ioh<n tct*> H@WdhDzP6\ 1şm4tAm _6 B~o4* 7'vk3jcZea4)]ٷgPgsA쬈S:^^ʦ"6U%tg<§=Q3b;Egw.d*]Fu5 wEFT#RCqgZ0ؼ9Q 4i@R02+:e{aB/M'} b%2dG2 o3V}mm箞6.KId%tϾ ߃Ŧ ,(p~Ijby% o%q ucy$|2(6i]1ia(mx[e"fOq)&|ObMb9Z 8_Y-5gzI`t @|'9Q8v.|Q$ 8TA<_̛DW'[ s kptN.N>%Acz8mn.4 ع(o>iy[Ж35AɸE+UԠv#JQIpԆlΰ=(D>_ FSB]"nI&0"0!{4FH|zj>Rc]7 `mS5ʖ斓̝XUggVP;IBUtq]BYz.Sg61"D}?C5BԫMhq9m1)˃e~^qZI p Pw<ݍhRIjϘ?*dN N=#7'*a4o yPbJaX^' JX3!,k +_ܥMc(we˃KVQog͑PKfan =3]nhbUE YxvqNdL͂CLX^zN Oz(dJhwv`.j~nW?MʹGt "#*R`:J|ʵoH) в@6S8V%Y^UN7_b0_?%@ ѯrKMb7YL-W5ᶪ삗r+sw1N|3ɢJa b暢ZO&/:ڕSs1ˁeDyBpiB~GecD]&ea,{!!0bŦa&pQg"<|69ٵa:d½TJtmW&_V|tcA7k&gцL]$ZQ 0@!1}><ǧKQ(Zښ&,[B W|Ԑvx }QRaͿ/!''i.4 ?y>C0֦+ NI"mbX'pr x'%"{ X}YI%u ݂!K %޵`?ML FK-8 9*9KuV29MQ螔m+ #;ϴ?c1X<|'`~v_[sFT! ˽C`;zYW^دאX[uk) b!/]ZKܜPOx@VXN YlnI~ypt*=A)_$"#_ K2pyܧYn#\*Ʉqp f*M14ƚ7?l nU~.ZaHk 肔{'C*Үք=svzR_\actXuRoLIFČ~ iOrD:o E1OeZ{bVaNdrϿo RM2C';eM \,|jb;u*N4Xl֓vmz[@6?VRL@/Zp!fRSaRx~ aeo_P[WVriIFHBr^DΌ붷iwsmR>`Jثבg۸&jeoGl]:D&eҔ'Ma6=@6Ӡ[E^%ש+aS|T6e9Z:CjbDzH~߾D/*hJCo.*{]zn~NXnS= 8ZKZEa`̋ܧfimaAnC:|M\iH-buq8}ʁd Oνd =0mB:ey5J5gU[lQa*>nGbp-9LU+nb#!C48Og!vӬ d冖g.n{>EN>l x]SBZ m7oώxMDFqCC,\fLW,caTf:T?o%L0I0W5~/vҪʜo/}V΄`Αҋw-o•( .eݨz#n81m,[ܩ Yy=[J|fj< @S,$ռaMHs9] ,js \W(7 *sn{.p?a)n/''#*p e;~HZ^*-' _(XM1_G.O:vj0@dWDtD}ȀW7Q;jWW6<1wԯ9^}[sO>Ied U/>kXܦ'Wq J9|+ٿ_$ \%& W^ he|N^/LάnDNNJ{~斅<4oC/$.b·Jg=r q du-!ԏƩl\D"7{ kn'K I6o6GƏ-:̛-^6:39$1W IRfkS+O,~vx޺%P`E !vU,|r:k# >`@Rؕ)cԱ>X4C`1=ByBpr)K"0Hǐ2f,ߧ/qm%,!(/޶s%lAHV6%DDAw[L_Xv]z =aPܖuְNw7t@$RV\| @`E(ʫ߽]; 8 a|((SGV])dzubw.aMM=D2vEb7ᛀB2{ S*ELM)֘. 8) P97Sud 8߅ i`0mFA:ac` =4U*3Z0SCtnp>D',a)K玓F`'HtF AG>GYXZ0l&sA֠nuДb$M6#e׬-oFjPքb[pP;HK>|ɗn 7L0Nokŭr88#* (.^uD;.p/kd!1#1X BH%g=|~z&8Z'Y&B½>r]yg0;O9 3H$a"؈8w,.LSE烕AF=" WN]%Z|WTGGs%c1 P$]yq5b{Cd L::&v+̊],CYIP hje܏԰0([1a-,mmQם;1Qǜ%qp5`@l˾Ps|I*މ:^] /~r̀pԛWiX_Fort)5ߝNe~o _q5`P o(R@?cK]zN;XJwmR{XV>N<9 6 _qI{'b&Ϧ*褒(J:" i–D:I-úw"t|dvn4JKnn0/iE8 \=Fϝ.'Gd2J1HT :*Ql i5BMVP%PȲ?ӭ3G2 j¬D3#nFXqCGJ`yjc՚7x5LD0g~rOvvw$ BpRp ѳzLn{mCwmգv"X%";DO(ͼrgQUE[kf,]٧1`5 5A9.1ho(N^ܚ>׈[fbX5/ʎpLԶoMIʵ2鮘4?'h TEs!{7 9Bb};~@K HH4˒JovݔLרAzSM5m\SS KJ HVʭFnu: 5IZڤ\yO3!dx2)Ik`7-b ыEݥI,1,aXR- 5} {afp,LcgSrT(gtJ%o^kBJ]*%G@`fPS/2H󭤋KhʯOu RcKQ 'GCr+_:YRL=cuE䑒bN\9_"@kt$Q%jǏ:)Ln(*)ZȢF bW`NA .eD3Ly_E*Ë!nZ7qiAs'XQ3mt/ T zvr)SqHms`lx}0t]4E 0(Mi⇤ηx7QZN"@$.ږo%H9ɗĄǞ{2ebe˪&%AvG®µ='pf8ag,|g+x ?nボiO r P\XQ KEo{"uzuUYbo:v:}*,-8k(#"U>QRNV=]vx"!y_MV3 ezEN9L+P@eo>>̫w!.g!**[ڎ _ ^FԺneTS7w y+YQDX@!f@KPZ_=jlFuBQU<VGH;UpҌb˳X$U&cB m)K0(BNX%䆓tJ;硆@&[!}B!OqsnV6Ag q SP)|JPe[@yBT!(Vz[` pAE,gγqХ~_`]ŨѥP9CNkx5~.t@65XϟV6_8&6yDAfO 槣~BܷnzG ,7D6vIʨoLQˆ*lXcЖRclG6L_5i?VkfE] z<F TtYu8g$8il}6#UzLK .Dϻ_i܋a4VxֻqžQZE*צ>{S:8, +RQ6":(e!UyҾfMsm#*90Ws'n;e3thG6@e5׈'(fДO?QA!>UIchqdsFuQ`Eو<37Xӊ"ɳֈf>}ݡ{ 45Y X eFEPJMpgNfVN9 P6QedžFLBRΘn2l)(*+]~v/ ْ? j}9HoA%5¾Gx$>5. ekT"Xp0Rkb"v&`P3&+;"!SJ#2&%ɚ+x1A{FwVe@ s I{pGQ)~\tz&R 㳕H_]WL MӒHύllV g(h )c-"-%5S[}(C mr0{΅5-aP,Lg7fUebIT ˘(Q8 U%y5@k$-">,Bax|ST cl[k{-5 4`q$ݢtO0z۩["FF4dP W Ek碓*"oRXy !G>ޣ=S+ʘ߁zU{H2;B3[V24dgRZʆI0uj'&tA46->ޕ@9Buv׳wzW=gHa=,o]ZW :rdyΒD7g6+;׮Oˆ1qwx]5Ilm};|cIpSՕnL\D bJ? [&<;dh'/l t|=o%S%̼2dPd/ E"88d[#ܹ V#0Hc 4/9 gϢfvW7>{Ws Q[%%H@jJiGNa";K}1$A):N͇@r￱ArpBfM= {Mo2~9lue0]gCu֊;J:y߿=<)pk2~Mp}';{{IʟlPb_S?\+"D7._xOu#?Tnץ̙j,$^fAD'nT,H{gbz),t 2첼֑xal^g[ʈ5ϵ дР; Lp#-8GE::ԴwxWZh_?xb&_k,x4ZITu ja6G9n}\,a9_߄U nq`_͹V"}gmf ibQOSKtP)B2?#:=TQ8*]PҺf()1Sn8 ?]GID~#U$R~uE."|Kt'`Y{g Zal| ե7nZ[2lcix= DzbVWJΑ bѓ;nԺᦨir{ߵ, هE3GpheKu]u Dv["zeB5Fg,w.;yJtu+I#'0D23EI-AS2T?٦$yN $ӷ )Y(~bqîr%dž:éix'eT Fï .h#\}L~=9˟YR`} +RZR,L}Y y.a3ToS!qsKo0وGAʙ_cI d B<VL=G\H2K8!w=z"(j=qަPPq((SuD҅$|l96Lp n/{VIza>a!XrZ:FLi-j 9 u$!bg{^E ;=*1 VpI|v%/Op]g}V~7?\ѓXFcF[x]RJTjJ }MĹj._fNΥ%qJaojꜙe 2V11, d HH六32O"(yf(ս]w)=APaדS0Ʈ_6k߫eX.p}~JS>4>l9J!_sԻlTsOQÛ6|/9&y TWf!*e`Hv$O.:u?4/:y\ɚP)Р!>d"CNrf8J3 d~i~G&U(sCPbiLNJR%n5<-ԺB1RF G6l.Zr+e{l\{BEum,}Ғ-BM߸dT8am]!#D|C+j?P4Â^E_]&0В|+Xv`/umkrBlhXCn05-)hPt8zsDc| a?m bUwysDg4>򛧫L&DkYm?e2 S(*|TlsYXFsd>zݔ뙓f~N`E)wGTx#T#|ҮÙgFSDN z˦ܰȵoH>ڏ2h2։GM'7'.}0@Thúҁ+c}jހZ\,(<>O";'ZON+43~`aP9F*w㿬M3^9U:Ƨf5MLWZh*8=zy5E;"snŎM!Ι:-OzIh{Dkr>=/h}dzFN" C}t4Qooɿ%5R9jX-ٲXeҠg>a0ɞ$tdm:>e3h3fvo|d3w܃|4ϗ 3lx=lhws_0>rnf 5 o1 WtCiUO]E^=&Ī~\mcxs.dIJ:6Er wei6/|Xe270y~N?`omi]%mc^8"<+ lˁ&O*hZ1>ae URC_z|"y[ʺJ_tT>7~tr֦@[_hwHB&H|KX=E=p]8'*sK$N rXXߵDѿHS;'rUHӕ%GvLyU-џzrb#Fv;Q q@=4'=6q]KG괒Dk8҉"sQݫ:~GU֔OTխ?𹳋W$fS g~W,OA9! Ʈh\$0n3R09;E҃$/pk*>½˫5Z'Ds4:X V)ė -BQ_OŲj2K] ANI ۚ߀iShg*(gn=q>"=Vè9M*'É8d23[伽:ͫFn@y3=Cw7E+tZ,h!U|F>Gk盏遪<#t y5&t*һaMʕΈoĚtv f sFeaMcAFU!Lu4&+ ~\%b X~P6W,>Q [,Wߧ\nMB1*u<ލq*׀GoxOK)݌$Pa1בֿʃ+_ñ1K^!ӮvZ1| 4.}GX,z |zWn1i  U`KLP!Dlv %OG=$3PHN͗N(3'SCm-kŰ| Gl^Q5!jt&'84 @ζg!S?8.x@Z*x:z$=Nv}3d?jggڼQYuf$v,O|ȼh8o Xڊc&atݪҔMREY~K=vG~>Qr3N׭һPjrzՆ|#+,=V1}r&vGh=G¦8 &IL]X ӑHP^'&9L~C%(bEuh8-T5q`%1I=o}3'lC>P^;# ʎ˦k|"ۋXyƲM'CJd:Q05ɷbtBxmtIZhݚ|پI ZիΔ7 kϊ /PI&6O? prӢ J6?G?fu2 ëL=hGfuh2pa"Cx@ʖ0:-?.BY>UҗJ!\]9^3 ٟ@XEJ<h(ֿ^\sK7^gNʖR ZVa' yobY;= {zG&spLfTcC<V{w# fKbXEoxYSOݚОRIW|ъtF?oQkM-1_(idx$>)Q )keeҖf (Z%^Vpv0 }l\? ?4lV籿ԖT;N،pϗL1A3R sڰ~ Xr,{ G`mgxrK4 VvۓVOnfZdrпx_ޒ\ӟN\GL{9?/tdS`<"0bKVE~!atQT-ߕT=6pitСVIzO9s8X"Kww1KcBm3C^a̴o|̀ E> blYIAwcr(kgQ3Uɜ,QЮ)t^(ژZ 4n5Baa 8cL@m%Ҍ&)?:Ѷj .1KzEP9hX ,$32;cT:F͟"u>7BuR8^TҁWjjVw }Gtγ&2c%[a0"Z/3;,C^ ivͩ,%O{´U*w#qW.b*Y$z*45J쵠Y ӈɡ˭5։J:ykZ$*rUdvyD%W)\[f8ʡ4BI#mJ757[%ٴT%= QYz^=DгGr;py=ю`5* tu]#~݋lTXrir<ftko60`%jNU{ŸYhhtzx,-hvxDK d*{W /kiQ\2V>K(<" ĜI1]=0IVAx  X~j0Ӿܐ4*lJ{(9Ij&mwolMm\-&urLƞ6/IY 7 \Yiʤ{~Xq*T6McKvQ1إ}X>]qvMf_{ygB?ر]W7󹤣_U$fl)#,Ն#Bp@O$vת5H~1zXꇀ6QW&+mVzA|C9s*byyuQ3J7@. " ">134:]? HXO[f-m;gh#}-Nj?uYAn@NSMi&أ$T* zLm,޶u"`\g-1.| X(1`6;lPsM߮QJ̻ː12#ypY0#Jm#g;F!qV/z)җӏ |UuBbL:keU2XfB Xǵ[9a KMPnvlMfS5$ŜϜχSFߺ: 9@%@fvuA03dC5d8\<%u$D Hoa\$wiRF7V}?(h)ZP_ᖩH:wh=v;Wty ~oƆbфFg% ]27@ :.>xRRVs#3hXMۛayl?YtHi'\~fD5ZRhR:Ble֦KoQb&wK vl TP} Z{kѱޠ*KU -0@S|1kn#{{:R5!Moyr/GdulZJ.fPкbE&`d}Hٛ_ݒŏ4W Mܜ4 Jڔ0(b!o>3樹aPӒy6؋[f@('?] sA؄?[WXufdWVspIu~˯=XRK7zY@e<9T='@& z99e9Ty9!9ˀq벧N!cTJwQdK(B'5Ks{ڋ"oEmxqtYj"7ugr&sˠo%CV$׏i|Pj^T{8/m`p* hFVQm#K ŮIUT ݳI={W4M%G^w΋Bk5[-%j|6"*} ˚Mn`3bڟ|P4\[6T${8!\CSQ@*O`V2.>0x\Dt𩅿z\^NHT4A W8,^չ xZuTjt{YK o6MI;T?'j8-D]ˑv}Fro33cjkE|&7⌍AxKK؁W83œ؍^{M4#toGUO.u+W܉QknM=U#{OlXȿn=z-jɵ ]7˲ng@!H^̏>P\5|:,QD$pg(a`85ؽZ yV"|U3!xYfMH/X9DQY/8I۾FEpƒLϠ3,82Sn C&Lxr\yƙ~tZGU1!o%p>ѝGÈ0jp ǦYp:ε.rP:x'N hW;|),moiHtB3B kX /sB)Q"rBZ䇘T},i9 N)[&@ݗ?'zxWU8$`7!s62ځ𫬨XŸ@7](m+EvBOokn'O/5~ܨ S2џzya'khѭ!;j˸ >wrΆ52D!9]mq[ *a$YfR[40ޗ෭p%{I)Np-Xȯ$A+7@W~SOFᴞtCIstL+_Skxإl!̆ ,Rr&eOD0l,(4=σV9LT JNۊ)os8YǏlowF*U$VB63*7jZs+)9;@,ަs}R7W8$~iʷ;:]MFd}ͤMhUKQ :h3Yb$L(GB2%v#/ 7YPm%Ja%4$&?P{•$YXaKrVA-\؆7Re''ga{)܋8/I Ԅ6uQn*Bh;85/Jb$dz {ZensǢx* ZzK}*(~<ʼ&aj 6_ &rtVJA_>Y*wz5;7wE%F`IlxCU?L:m㕍ܵ. Q 8FSd֟ZIl& 蛀;F+C8fH{aCX'uDPrm|pn< tv(^SH-Sx p46$1/_6U+$mDv* 9Ƕoo9Bk PNId6l.w, 'rN%Nz@޶?ۿL`ž.LAXEd:ظv DwCZ~OjT2 M\47 (]J;']JȂ2 |9ҁiJo3rS_5qǦP?ɭQTg!8SI5 7MqU|"%{yz@bXodNl]$ )Zu`7kj QNC$˞踛uEQl,UJO^$f-cQ iJ_Q+?_7l@+uV;Lyh':99.n;ҹ_=7jghxYwA u=];ò;H#Rs2Ne.~3/l> *ݒJ"?8 S'u8_d~o7~TRX<I􃒢IJRA y ߶|C殱bG)5*y)P3%|KUY %HE3B{2Ħ |eY1[r-Saet9R*\,MȦzFv;tQ٩z% KtYyOGQ [/D6e3@'iyb36)uB5XuͭKjUX?!3Vr:AY)&cSm[DZP0*gqck#VrMkSd&rCRi}&5l@Ƥܾ&! "2zN {=nFr>mx1?᠉6MN~ J!FUxFZ:"8m/y\ tv(iy< M[,^(|+5B2^p3/[,;7\Ka Ve 7$+h& F[jĀFlVܾi}lv.Uh7}4kZ1;jGM9Ug^3|?lǀ0ԩ|iFVY Ÿbd]q|: "q Zp)8F>oْc'P6h5Gq4 |5|b+Cf_IӰLkc<4}ҕcB;'MA(.("'ÌuM; a愿E~eMjx)z1}e7R7G}qtOLx=s#Й}u'b+e-uϺs5 5GOV赯u(j.(w.(}E%vhD&ǫ5kBir M?WX%-(&,pl0umrb SUC ӫkpO 4\0Jj!Y" 4̴1̓'go6 2ES X')D%1 λo.eQ_w() .NひBV2zTz}cZlx_A3tzяVédM:xm_Б)8bJw;-om=a2t8 ;Kwu'!6 ;ymx'J^޴hyz1H=zyXZgWwBݽR+b#Z=ޥؖbFD^&ӄdVs`~ȶW#Nɪc/9Ş%3; V v_jH`+]RT5Q0JNx!ĠW ߋRo$NH+ V4Bp|qDGVBTi8hR2[Q!K,R7i'lQösDgCaQpN~'Ae_=:cю$#Qd_$z貵=UȧvEn#Z(1b5M9hhh VOny'ɐ+e@CrrzldܺeoW* Xj $hWbG6n"p,CI@2͞eG2be+4Ć f P"H)b.kWp E >VĿ*XD ,,}=^r0w)r3\LHTkꜿxBBg69[{0O`<15t_=aa?~ Ӊi5:&Y 09N>[^ۡ8O` g6~~kJ5dxh:4.ѐ_}E qRl&CܠM=d;(مL k/n%8o8Lj5P$1#ͩ"4,6>!GuQ|Yw5`h~l*)lʲN2 GAy5\UF .M 4EQ,\S@EZrQZk`yb9,@kؕqeU1kraz&{CFA] u0pvH&$TѼVY%չڪOzȳ)5 WG_#xg:;.LbGRI|t ?ˢeΊg@Xj y}"6}Gw-/p , E>Y/`I(:9# vdD;]ޥiُ@Gnwн^S[2!-N#skڻ+% JN-ÖVϙe7J>-{TC1B)0RO'H,R#UM˃ <v bLZP g WF.{b /9Z3Gt45kn`-ռ}Txdw\F0u,4R Ը~~`GJ}`w\g`Z%Yޙ3a o& j!$?s >r-q;caAyAm۶ T/aÆrgyT [@{"ZdX H=d-=:01kR}Ib"fT[IR~*#,}HJz|e^=֮p AE,!}BwBφ"}fA-7 r/t#7B|V{V=sMP?ѵz FM1s_ZDm!4mj{XC{}d~[g <}LAYX %p>7}Zˏ餚u8\Bq gYYL,efJŦu$l(շpX]A ѤgwutFVYC.1u]?IlѲGt?|H~)o`!ՅRĒH`2m56@`񉿤?[}jZkޠ1VQ}/X&,05וqfz$xDtӦ7^dp Oj4{ʞ{{%Bnm?eNx'6J :{Kc+0 t9^#Qd`ơL!#HR~?tɛ Jr,hn$rq,&(~E-,`ڟ= …[| u[׈Tk ˌeskU΃Imb*/l,V'ɥVC8#̗+ )bL?()'42"#D$Pҡҫ9UQ4w2~<3(M]K 9._WĤo닳F?Ascg@$7A|,d,IN$ tDqr1q",w _L5"G6O]=C>=G4>JT.NPgeH2nDR,-ML >A,"J'ytQ9U~!uVwi#f{/|̙ZbieugK[,y I5V5:"Zj< gVd3-olnXAZ7dz;S G7?Uf^'8_eZzd1'6K}&YhGI@ŗFJK}N\;fhs;$k "Af43%HyC,-PP(b' V]#8s3f7yOkz`C>vGa\<΃̩?2 W25*BuŸJ1?+ lmV}#mܰl+3aiצ"T'؊ i)_(\@%bq<4if,_%1pK=)苸G|\֢M UpK۝iI/&ԭjZ½OtM?yʘX.= kb;鍪 }6l!gH)Ul8`n&G /1>R %+pIt-Z} S'jxVLg4(@rR]ֻḴMӞ{ԯ9e{ oFTB~1Bh-rq [L߂ ow&/F%:4;ݯH뵣חl(<zԵ}{z (C lXPx]S@X$N3q<|7Q<,g,[%-H`+{iٺE!hS:Δo H%d9+(&<|>3ZrT"ޅI&@ĎDIq,ۄo>SSQuD]bht0taMN$:@'jSNО٧$`ɤ n#/f`I$ á],v|d0iҩm_5_uo/&ìV:z·<%lhsW" v?\w:#(S&*[ $U!\oSSSmb] mmtG_s/a4D6!y d6{#+aI>3fs'V:mGǜo3U3ŨPޅ\6c\ދRBz@){Ic{-37sod9{3% LC&98orҥTԙr+UuǛrWdv$HsE*.(!-(gWiY3:TuTq3h`q^I0=s-U=k]aDL\4K>:4N1"x-_;J݇%oSu_g62|pN_TdA4 3jheN1Lj2339E8 @jFѲ/$7jG r'x+g~LY׻-`J(U; '}fx3%ЙH-(SfjȆA>G!dlCasuBi7Un jelʈfPc$@pD&iA@F '~ 2,}oMƌFy=3SmϭH\4D2ZǑ"@E 啾hCUwɳ(C3N{ zB 2 3Tt(&8 _&$C%aqܱWZ4iWIˁ m=ުf )r DM)3O+f/Qžd`I!ѩai3 Zx6xUUiʆruТ-fZa:>ЧO^k2 f fQSt0AWh('W=bu菄ŮX [+Dy+o{sp6s F+"E!& m5/΢" Wp=\M0:5T'ٕ\=L*P~\8z &`x 3a)tP;]nIq1uoLlТZ51C߀TYo5Nv ,!l #~O5F*9,Wȥzd2o{]߅48V[ϜG% m ;}5ַIOoDOϼeg@YrI BE}υ  BRĝz/4vk4h(xg8N,\QOt~1cb8IaD9A]o78Ww<ˍ>C]GU4bRmXՀ7?O֊9b4pK'h?HoCL/RX-pQ3,Mo̟bO9 4Ogd-o +qh}g3HsIyOc{ 5Pqְj'ZНq-2>L'[Ѭ^l($LU^4yiȟeB4G-L]5< #b@T^m"ʩ(Ym mz!na}EJ!F*X?XS Կ&?!iS eXKU6M2 ?43Y ZϑKeu!jRүް8";cdbUAih"aX /"3i'R*&ƹ\@(?~JkeҞyl(ep-=<sز\,Nd!5F3D'D*R[a]A֨I_ENhW,# I0i :N鯍E0BpL-zѵj2e@%`ᖈo5k y"-u9f7Hy?+,9IWb k$פ%~өFa+$H=דYz0Z4 !$֔riJt44*7FSi9je#ƃwg4-sJ 㴦ӽT9l3 @9w\w^ZtSKR%s(IMqft2IXF7iȼe6>3ۤ&46lA':F$.>rx6Y6v%jtNJQuNrt0A&:m<4(Qx_'2VUx"Лn>xwλw *J|/lvumG):qVGWtcgz.jNGrG=2C :2BdV}AIAlLDʊ RPV&2 xco@ºۍIdOZΗwjIWF452z@q\&I?#$MNaDb Zpz#NҒlC68U-bW1\n.yL%x] gznaJ/5HMe1TV0Q\[7"rU9S)|?du)Vp`u Ɵ1,=뼖i*\Y`!3w[G:=vI&ɊH&v_7dX9SFmFcV,pY@I#1${. ꘠52$F&E;;m ֫<"{hXX.˨U8J{Je] ~CbXVȴ[]\T{rkOE%6k::]>/ lG X# ׏D_,T|W }xYiE/":Yzml%6'|J} Rg°dvQFڥ51d`w]2הLdU&n}EAŎwz> X$pPgpVҟy8Ο 2ǞX׿+eߘ:vr9tVH6_wH_&9~Ҭ|>ΟuR׷ hZ~?X^7r &aC Ѻvmm:~QcWV &K}4Ѓ •xުwXT/.rj0Ȃ5kgqM OT~nOʗr&tp߬+܄%R,jύ}:}:wcb&Wle)(ÈOBE?G2pz W1'3fZ8)ɷ5y"Q)o  T* [˼tC[OY*qF0sm8uDQO>iehQTPޤ:h׀b_r"+w`FW9@_җX ̳#`YnCsfѠSbXz X<np1[D~ o=[}^U)^c\qۀqƗޢX3pF1\ ޾1 tI8s@cmIFY%g7mbТ wEcoȉ,(xdEibucA"WK=žєw] PůtO6:1cZ+ߝܪ6 I$[Y/AiC%‹zvfٷ=p<A{bFL[IЂBImKO S%ZA`X|5 pyڮ&IխT*G/M &~/^M8QT2٤u3; -y5u0_zwVTsrѤ*P95vƬvK;\1BL9F kώg&{`{Qz\Jo*盶?F5xoO60*:a+QCGXffX35|G_,͸n} w$i(4SJsz3aRo6p7w_p̞RNJH]Vˑ;i%tIf7GVf`ӏº%wٵ8Vc0gZ0zAT:7EG_~aWE,⼤|(SV>)Ѱ$rne="@v`QjF,Ed:ʃBGE%pӋ.v@rCփMe{,p?? MbԮ'I^8AxZĻ0LW- bwN=)0wroZ`NC8i6J47fFl\Gq& O=d"E"-D!AZzpNL\$\{Dk= |ʝyB ޔثT4ؚ1u!OH77/Z 2  Z m.tEnYM b&jDglr`"`('$Aҋ-1LRd& 0OX{Ⱦ)!ѿhk6ɛBRnszgﵡn],`!W/%]hta I)'Ҹ&YHQ9>k {+Spr6KQ\!2(e2vRdP!5(}%[6m٣?0~J|Ev oD1U`i: sqZ&W?Ў6]\<)&₊ T gS lM.65D4lri#Î֘٣|z݈+t%lƼ?Ė״Br{ vdbzlo' Nmh'Q+I|vsSLC>tr{TWrIVܘi$"Hegy.ؓojoe}6Yr`728X(?f}POWS *J>/$ їa}Oj3R#\{iFd@G揦.U_xV30GX*MFPI-|o*'?b(ꕹ?t|#ͩ+Hul[|Ci1 &귫/'}cB׽6 f|hoY{AeFseTV:jYvfg Dz2b&K#$#a-O OVrS|*Gf_RֿjC?mJ5]9ݳa"06m=n]o򙠱ؒy f.4ls1[\4o|CRR<4L51Fv0L❊jPE2nT1b&C$PHE4LI8c$2mz r7@s%7fi^h&"!:Ѭa uN- U%l-PV 4}qKä~VOě䐝N:@Dpe!S}-Vv!/'ꈸ1MubR#O6%H=f ni?bD{Q^ <33ШT _`XHbN`*dT? dnm<6@}w]ڲ!QGnȳ~gxs@G`Y:KoP{`v2qGQJX\=PD7UGuuv!w,܋ާJ7<&P~ol"ҟYT̳l&V&FL6Ȝ9IS;ld?ܼ*‚0 0|`_elL/o&l,$ޚ%'J>|sȢ/}?7C#uoA'Wƈ,YM7:[W+ɾ$UPv34_hJ_bZx@6s;gll'\0_ cz`RۏҦ637E_ܧiU:ɢ)ik#RMAA`:F]:Q:>2@hڇsa"YP674Ffpynxr~h1%gf隈)߱ۨڰsF%Od[5:#I:CJM\$vz>!x}k:VN_ L h4sG&htYG;S4=4 sM2bUݰe EQ Fۦ:X甶Ve WztuT"g.(Ϥ ~ڷԭ6şCД6b6gZWKEmӺ~{t%*43'1{9Xxʹө<}j*܆.ܶƾl٢hyH{Cw"+PKY7uεYslgrYY2Mo C$5nV5$wBaoew*zuq{Jiv`t5Ar#]VD,G λU2$lѥK/҃^ǼOC}  n&WR6ϵe_*6@am? %fjE#) O}{lUF>}Sj}kx+Pi֢tgzM}CW}6: Vƍ##[)!2 Lw٢&J"Z_FΝV g0=X> bš^ӂ(g1 `ވ?j,D/Nw%J"`:&LKzpN W˄oqY5. ]p]ѩN: 0d!_g|;0g|f>p |5K賕y^Ӵ8vQL$0yY2K:=o &qNF̀~tƪ>̲mxROCyfɣ_Isp;5WI"g!v(nhT%(g|KՃ,E"%oo@Z,dN$Rό{v"0Щ}u7ks~>&l ͷˮVu8(xl`x& XJ'<yJ< ^pl0ٓ\nud0V>uG@d9jbQ@H\ە`_8x=W_ ; 7煊*أ` Ds$gIY )2׌U m3hzA+H?HT02λJʕRvbgL8͟.`FFT*yw\pgC: Ɗ%Sp E g+ѝ}x^sMzG(X I~'ԽIl΁ & ?mn @D5X7@Hu@ˀMv~ "Y̤)-Y B=Ļ|Q/AB"3нVPXTq"D{Rk:nF*GA,JX:iJ#I_X;;6 ?6D;_fGU;GM/7^]_ʭ)qƌ/zRE 4G# {*3&dGxel"@X!ӗx2+_[]uӕV[KTޙ>am6Q9_SD=L;vO9q\n%}=z-2ک0iC}1Gc@sLE9}P1?Y{~ V)+TD oȇkE@Oy{ȷ wXNf~v^GCңS9`5r6]<S7rr:'Fvա¾a;>9&NmL}E%Gar;CK)1~|Bv{wtb12ءXRAY\P6ܾ@|FyZ!.w0<6ə__n'g̷5Es4т-۪9ݚ+~ڼpx9w0)Ic #fFՇmpCk,v+!rQ?ض 6g}]STBұ:bW|Walٗ)B05FþyhFB`. W]w3taF t^T|N񪂂&3ė|[ʡЖSؿ>T0j'TG۬ fvv+F>q4V|+$EMtpuxMD`Z )+;]KWoJ#:ړ#܉2ŅUNq (Np[ڥabWfWlMk ؚ,e9LWp q:e5P,Tf,o)Nh_ZZHe fB͒ky&谠|7WŬ=&t7InIm^0X92 +25ٽ5nZIs4I+(`xgM^ge4nӼrG,%_@OI5dgAϚ[7 ԆS:XO3#%p˱AJzO"'w4n̾OOXvOJ.UEpfxFno!~'px}:^2O->wQ=FH1o=]̾:$^aUsh,Q" !;@/guQD )tGT|ֱHb|";t0lR?!T p`D\#77;IsCFΪxQN0NP:f0KOXE<@po4|=Y89M4d)Yo%D[Y$T*nZP^8\#6ɵcʈ{NV `ĵ  V)鬕-L-=L$d &lTfɋ0?%q/a!t1q"$,D v[J϶yA=_\ #Zh:f3* -<͢2ĻQh7AUa0ݘER_ X&R9jfȚt`-/]'n/¢D `0 G& qzz m#6U#G-^' h Skp!doM>?lgal"8fL]S6f5b2ēéYA@s~5_>kq?I,;!r]b9Z~g%bq=zoIL"NȇQ]$!,g ?x/_ Ni[MD Z oeMAUπo?MKNDO өֆⰩ5@VWMi޻3WQqΌւ"(Y3%_Etލ.2r2>"CP]SL+ 8E"XQd:[.ۆZ+CKsS2HZp|$;I!u8q=.mbI*{ȼƶP8I7.PM VS2p&"ZtDӱggcĴGa) YOXRh ~)𧖚EQZgQ2/ j~yyTZ{{wd}+);w?̦;Z/#9 gO;mcrK' Ac,w}yhhlE.͂'ŠXw >ک|}` UBv6<7A j0@^m!C=ZY޺;ϩFWLmTN睼Xv'[#Guf]~%w! C j ``=GB]ʀq A2xpYEjR(p9 4^BiX8f9QFs"N+"bbd.HT-~M K$9vsja:zJ*{!bWUd-ؠ&e}vH-U\D+ITS'4H7HPB]L[~ĵP_$_a;r-MeGd0ǽ$bEI0g}&sK.ǞW JQ2/Ɍ\ f64 Ps{KJi܅M@'kjλ q=n$=?D-->6TQhp!ٵh2c`-rZ|s؏vĕ:7pͫAòJ8rPg8ͽܔ+Nt KSNhdrJmZIJhxR2J{ AL5L c*X8 vG+ENJ&Omq ds^k@BsY^Q6Hҽ]  lHA~iAĭd^Rz+'k I0NLmWl| 3]:-c Ҷ0/ǑGQnp8TbWac0s&I~Me/j#XFraC@ [$m~*?\A ERbW%Eq#B">JL/| y{їF;$Y4U*mSP}]C/ؼsI jZd}^6ƍf'!̗ixWE|7TҊ 6Tb(TH2B\(DY< MVD~@uatm8!#SΟ$WqҲj>q4kcmև$$tU`R9v2<75WܮVSqIsIu qp KY0i0 CSmw~N:j=s$h2Jg$)92;I$-8iMS^jB.R{M>TiS>> #3O!s<,ϡ㰳%ay@3;g7dmt>;~͌g!0?`v8c#tFD?<9>8 =+jFFե} c.D Y2 upܛw킿 P%TuSm(}r{+YSlңxMiEU9Jj-}mJ P-Gee%9߷sg{G<y*$71l1\gc𿏇[|C bJ5.ħ  ͿKJѽT^ݑjN OnR#^Ӥm5#v8 _ǝ3o63;" O\b{ }ymcv= nߖca4E@/?LQ|<ԐxUlZDnCO̖._bhnY8#T)g;JtU쾳!g[v[L2ܧDyM=Id`U.~-9.n*Z&6KcB%kr&h,Px0$l3c9eFzp N- wC֨-ۊ߮kXӯӅo;JH AOzx"b;:칙;/ D` R9!Qϧ,*4.TJE|%/oGu [-z?`#6][ʙ!WL\ QSZ/ȻMu1̛,H$ز/ű7N1L-rpyJ{v-KV=ISo{?' V=-Um}PsyT?oƹt5.eEaI5]p+ErI8\5HwvtstLO6ʇ9#Q˒b :V]Bv89QWPV^erRt %3ExF-:aU/ 6'$Y]C^oQ HoD(Onem-ydBY5YS Έ,A}t=$F 6w ,'Wx**^aG3u>+4kJCL[CZ.2z1 4d V pL&v?>ӭ;)Wb$Yy}}|bj\t t(7^JY,pLYP)*xWq ";ˌN N*γ\uT!ޗ$L97x0OoFyr9}x7s}nf&^S%-w ؏WU3f\Qo%8YN@}6A3K"s=gpӸ~]z/"H|KjCqY;yɉ1_i? U+gL,Id_j~4Q#Ibyf(?v` %:8(I6uI;gy!/UETl*$گδŰH@z-YB~"sUg/wnjH Y]Ziyuͼ?5:)(Bqڑ_q/1|Ya -X_GZ +[QAtfUn݇EW>^yR8F-D'9,P|<S4*L6 uʏ&\뻭!sf~ q"]ƿ9Mk# e@xY?DcbN3a|Xnڪ}WeuҦ9:P2٦> Ӡ=eͥl?땺R>]~TO$΢P! lx W%HH.GGAGz8er44aYj/YdVXNQ_٘鈾0oݧ:~"ܛ=LE5%32t G,]W98G@Simԭq\{4\q-U:ڢU "A2Į4@JN0ɧ|gW!R<$zN#CNI_}ju]rzxRivlVߎy+u@Wk3IXby clR-hYEsʹ^P2X}X;!oO7&jGgV!F::3Hj#Pe󊑞jz6=UǦK E 6#n9Q<ݵ] A-IAlLCDj<"%s &[ܰDxOu%x[H(9z~hOӢ]C#['ҫ}gfֶᅭJ&b`^loGOጚ%[tյN:вd Gjڃ,s>5ksGμb-gZP5C_R#JK%&SQ_ts-v,ϱƵh |B+BC)O[y*a9k^Tnձ[wξe%Sn定\Ψ{Y u+>Xz*/Ga?. N; Akʉd?|㜝u^Ju!XBij+o= |2!|ҭּl4܆y4ϟVĐa`ԒCcS_He6Zp7JD)r;H'[1{6('AU/eܡ*[Mxy}r c$N->i#_=|:'yQ@ 35& ]pDMx qI՜~Re Hhi1P]˕ KtBMA@jVHp TRCZKÜ&v[_x)GXbAtA2Op]o@ɝ }2-ؔL3zioWCɥV, >X2\2ar7L’2E:oGn5YgׅskX3"X\.n#ۿ,:v 6 ZDl;#{ͭ9j9ܔ6OQYw%x0֋J|is~REK?Vu;~iϐGbGlqBfi~\󄠁QrgsqnJ{E >(zE.n9ko} |ȷ .^!X>i^A,2i!tB4(:ECO,AС2v,>s.ƫCOPsª4oB? TގIiL8ޡ~}?Ld`~ A~hSMzJQǚI߂k..$?ԒT-3f"xeޠ؞\b~6?.߄W&AQTn;65!47&fT٬܇FוHċxM$r:o-;DAOZ]P[E]z٭W33o: Gh /UנFu/2e iFAj[Ca1Ju5 4B1\ qehSzc1Br82\ 嵖JDRJ)Tr-CC>3`Љ@qE9⣰D| x}.I )EO"_UOY bg\0 ";D` 7!wvMIWQZkԎhl>1Cz8@fKfln3g6}px[X2d<V(smN)&N d^s"+NGZIh:{;Ӷ/oqKD~w;ژ4SA8i N :e5@Nzt ܽ_VR6\!EʜW^'WҤUCT\{9VQqḌ> ԺfzYc/U]D F~ݞA~üK ¢Pzsh # O0[ƙFF~=hgזOS_{ن~2~s=[[TB(>6ՅM5I *LEKCĹɢ#:. ?9t^xqIyk){zPf1Bfa5bꛢ~j5Q^=V $)KPӻqK?i&$g$BPOH[dSTja*E( TV0FisZ']|xdb[`TA4`ԣ?.7x'0i(m v ɠ4|b&jvU8 \4CqT7 hDkh&CB@m="`޸Fޝ`LZƾ)ElwlUs5rP*i3/ea[z@CB| jueEyѼD#.YEhGd_X$ɣ446,_Do7ѠUM1zǂ&֕4/]~t[I,AY5N]qKq_>` W M}zYc[4ou֯[;Zm`#wޱ;`Ϫ2;^q2x ~BN[J64ɜf؍A]_8 ,A $&{75JRuZp&kHUo30t(7O,3dp{?N?C}y{LxsGt63=9x)&U1JcySп[WKLY𝢽ܪKF^gE]4R =qphGApxA"捞w %$x%xQ0k$*UO/ڥf9ytIKX9idd3'F.VKj,Cא?Uaf`0* @Fz3җ\ )`Ɛ %q׵pvu` ??7f}5J'-6)6n|B?C(4kxF(;,T>R+3~*g~ro' V(vA.6{ 9D&0#}De7BE{ htPoͬq5j,z ƯDLՋƈ&ǚeV{:@\#los,B/yMW3U{ϊ \`{)VtK_$ ܶzҠh*^dz89cv73+[6}X -!&"B.3Y5Am~Y ]ٷ(1SHtw.*K r-^BaFrQ*LY" )4ƺiw{R½&p~7jh_uꜸEh"=MI1%F]6 f;Ebtlfeeet V$Qܻ;Oڎ$ OwgϖxڢF(/"k:A:OCgZ~J'iMyFЄ5{[P薛7"l]͇W U=]fJ4wx (.a1s!xePqI-0F̂ 4i \" I ={G7R%*e05XǬuF.?Tu-3J[R,~ʞhiڣP?h>A~kb"gw]\>9ΩO?u]mI0S窾J.5uVηeCBT& \^*VnSa|hu|n:4 >k 02@/(F3}$l};CkEیFM\5!vȐHqJ*?!Me)r1\B`78bP V,C:-^ħc*ǵū!lGJH1S6.jX9lVU_^2myWMe^޸d&sl z$-}c5Q/6P^+l}i5?Q0db}{5z s_*r癈{Π ]r5fҹ5a']6aMl>r`#=::EJD΁O de ?eN]ݑ>gĞC I.FaBDG~API Re0#kyw(p b̑գDyTs(2WŚ3K',ùY4VF[, |]> ,,nВX|L]X7.U6ǖReQ%8Y Fyu'CA'DA,^C5 ǑtvX7[;="!_U]XezsrocoTpBfMSFm[*jCrF-+k G|c+j Hop67Th4s9Z?Wb4,a]_3v0W| O&ZCk S?q5tݚج*\O 6ki2תE; ڎ_ īaAPI١UTbTR۶/>BSDI3/gW7aմV/8GjS[+Cܫeݡn'$tU[g& ;fA^AE>8~83ny#3싃u֪)#Sco* Q]=*!Ĝ|)]ׅVIopvX/M6l*T(ϜA3 1j ^=i>4+ %q-k[ꯖG':LJ ".e&`bP6D8v}JyT0n9/v8v35B)d=|3aIĊ|4_>%{<׀OՊF;mސ.å;gf#6MV|hO:|ӟdwdV :#Zf?8cpVc>2A;y"nd>yމ@),Q^F2rWKCa X޻e| %=CVsͺa FYw#.Nr>+DE\w+O@/%\P!Lf h&dz B\ixwlY-xfpAн,\s.5l');Swow䂱FNuBCOOnHB=M3x/t EMT"_lax<@6i]ȿA#.$1]jLØZ5lMȞUcī +{Wh2Ks ê&+[9 ۧk<] q` )/eR6>7C+ s;+FO(vٷ{zPe^$B3_2j2p,DfzO˸WN$uwceȡGL$2A^Y;D =ӐB_ ,"@o94v0Z"U=cU1 |+Q ͥsrzM}Uq8zoD bN%消ɹҞl <8$wd<ͯl> аrHI-!VD҄F9壭fq"#.nr?\Y+G'\ܥyX*6~Z%.q<[=C]RpNY~V+I#\S0e3VKKk|x ;TP{ȤYb!y8d0VDC{Nb>1p|%EPP:z"ԚZlH*"t´nQ ZI}bdqGB`G1ut<9ΕBYM!4jDS1hZ@J`$L f0ΰH!csUYюX& 5VV@a t1tдS aQ2T] 5$ˑM)_DvK0 :UPgO•SRD¹yUldž*}_3t(8rm͑ 0!k(ۣN \ffh?ܞG{qxf4@n%_ /g:wdp+NQ8!?Dy~EFOcK;:Ue)B)imXE~j l`lܭ GsV[oSסչ} ۅ} W"Z>UK$/܋L o;Ps6F(8RQ$n:҆wUqM q-VecDݤJ3Tى&\#F'f1̙j!RH~uk<40uAt uۅV-{F%Tm1L: [G cGj=,UW/:''=t]:o{}gTWX~Ak|z8O{Vԑ?A:'һp7#ŗwneGO_v~~#956qU\фceZƅ9dN"2Ԭh- J+:6d^8 ^tlμ]&XkG%ltnPNbzZz~#$֬$ ӱl&K=9]&Wj0%O'(>vqcbK͎ȡH6]1lyc1c[ _] `3qzv]~<£qxsH2 ykXc-@Dph-Ve~}wqԑ0ŲV`јZ&LC!RFVV[XU dWؖZ3I.j7 v)`KFEKrYhx7 YHcãg7J8+fe$O 4|xt΄CƆZu?f AfnJL ɿY[h+;H+C1q6>w<Ê/H\b>ABPh;'Eu"z2+ -HmFHxtTet8_j7Z3ރ3o EI}ye͙Lf~-G`ܚ2$q߾F9% #I"ǍMoWZۋz-W˗̏';  Q%zX $Œ1Bkf^X?^ӶraWSx3J({+$)Yu\G ;fAnE4LW n9UGsGh}Jt9`(DC%Hi44EܛB(-Ü &O--PK͇U\**}4.x_g[co+w ITU`p/9 =\̽M& "Y1 6!h!RORnΑ+Ce!.xI ӶbE&g 63$>vĥAk$D9k-C}=v}޲q' Q˵DyY3Vtoujou[ PHW I͓K=ދr>m"!ٮ o\.W.k[$H;A  6PM0 Uc>”UWpr )umx"eB)3x]E; 0xp]Jۜ -z2;ߣ̥Jt3/;x-.dA󙯹+M ~~ jF$j"TfhTu ֊y_Z_r7,˜R $Ŵ"0ߚ0?ڊP,\VKdrrƦ82dA^t$؉ie+Юiba#z'{)2E!v/ ȊlXsǜ#ҕM KqLD|,4c6)>}"< u]mnϞ"ylBIcQfR/'NL$奣v&ĿѦSUįJӗȩGSk6^/yD)9.92Wkz9+̹0,!سM蓅&KB&wwւ[]gח X/tcg6=*tY-uxEg^d"DF8Pf `mY] guߪgf59z2!NڵSz۪+< C3 zBZ/rьq*\)[YToʦpbs0=Cx:x!kBFڎT>fj{3ɒj.E9$b U!Ɖ,DN4Sh$,_{z^ &ۧ!Q8^EY mg@j7ͣZfܦp 6Yfc!Hz:$3#Ծӛ\kUHާ>MHBMrkW;k}iWRZZ5t*q|b=zy^|v5Y@G#K;!mGIGXSriSdWSږm~Rgx -24 0ߝH4b&$bY!,x, NESk vuh]` Kȝ[(?ՎLayTdg!\|C?3L*R^ɥ/Uv&okg37RH5oXOtɱ(rr h0 T.`sr=ISWϝ#f#JUvΤ*0p'OTtG 70 2sSiQ4, 6tC|qjb{# NܼԿ~N(۳1x!t_+vIcP-Fݴ=m`))P_/|eO+|jm[w3@--wם$%P!c=a+ Eع?EcɼBRB1gAf5FQгEchİoVpBآDLlSQF96{4fΰ̀g Hi |@ýAn2t~MR@Ј4ckfcl|&m 6[ ?"$އroGT 9˶Ƭ;1 fN ^uc@+bStlq1pjݿ SNZP, ]߇uQԄŬeK<]px%mQ.*h ȽU/}X\B,,!f=cp\5;*m8B2f{[|0xq/<5w2 h{" JL9!=r?lӣO!fOi4h*%3V8WSbb9kN8t߶֓QH > aͨ: vZ~;˺TJ䨀QʔRI<C-l*3Y5 㟅W9Ո5ۍ0Z5oLPh5q9f=N`n`_Cg Zp7L4 r=F;VhCce' G)ph(֗F xX`M}}JsP2DBӔk}0n#%hRuTϗRT.n]n 3][S܆A, zG?>!VYOi5Vk aI9@Kxf 06RP j1;%I9=0 1{CMϠ-x0Axk0O/p UY7H_)3jGEfN:24-s G]`|މd4Hl9zP9{9+SGY޷^wZ9/Te^jeGAɎ8rtR-.up@+VE%߶7N67:fU)u/6wiS<>>= ? `$ݵ|d01|3UP_7RVS=Ǎ$ٰx:qΣz=\_NZÚFz쾾ʏIIdu5e) `D jb꼫4gkAIAhLCuTq$Xb/7LRZ5-6b{ddzT^VglWO=c5^>y5KY*{4Is4-5b094/Ma}nsVCZf9#c[Ħm>J/zw=LPX]W; h*r GvlPٚx-N*kD{iwNO`mvwݩ)wP~7xh+k&`mԂ1윉6EIO(bU":1hq[ː.YvJ01g=0ڔM h+-h[d)gOļȈ{7Hm#je\.tx3i-fs&u3J0r&qr}5Ʊy)qlVoAs~h3ݸ6{sUh4 g:ݭNe!qeSۘl2(}^hD2 ϓq42fD3:.i@іT~wg$uXt{)n\wֲfH[.9ήQZ0WoF̣P` lzF> e\pq*5ъAI@Vl:A'=ƄcG (sOKNNTtOX'7qp a}I#9vNP{ȩc%}MpLh=b,ɞY^G|WowQ2,ƢoV=:G;,Bbth+\Aዬe̴"[ :cCbDŷF͔n6B;f;Dt3YAm]L)W HX+ܧVB-lTf`tX*AʥgVUSSM6YneR1!\A]߫Wʦ9tWGqvN8Gr uѰݺD#S6'u. ,qOIvd?x0#m(cHv,&ߓO"M]rs;ϐH_ 8<̥㗾gHΆZ .Ws}IW-ܳĖEh/VY!OX@ q!h;߅rrHT 0w9$tb U#@ q yFJ/UOZ$d)RAcbӆ# HkX(DEFep9G}N RFH߆^P}s*2{L֩dR.0QN7PqiFWG/g8[GW"D;:W5Sc[1fh"׶sn I jiΫݱtV&湍'k_~,/KwHrNw $8)9 t@d雎; q Mh%@0=]ou0[eǞR.:A[Q]% %8+3z(?L$=,_X0 3qt3y~ݹ`sCWFUC%ד%Q&ڬૹܢu  _'< Fm^L< 5k>GR7,xD\zR!6=g6UB.UP23B+@k+:Yd"0c+^" ;#g:U&5G^Y}ۍ1W=$>~ksh DL3-'x?B*Eax$ o!:1sjNhSeك|v% 5!`!{co^Vg$|V'd#Nh<}: !r >eOˢA8VgD$d{PJz7z&T@)NYcɃaSOMpKW'#"Q -n5k96= v k`i=q&J\d:D@QkaKiٺ:vz/UsH˥t ˦Z-A(?#㫂ڙu-WXfl43QhψJ.&\3ܴ&eqEIP|LnZ}qHB0?ZY|q|ףTN;c2oIr`gW19=h4;̺|FN)5= 0x)mvj5}~RZX04#v12`? '&=G~V"CgnIzAᑶ7^`UYPNR5)M'YΔ,:9I ;_S?Dljb#Q8q鱆b(SF[O+_s|֊4ƥM+svk2L`%Zc*8j@X]Ǣ56䚝6dk"bkIPI t.0JgV{J͟0;#Yŭ5ʅw:(&xJCBE)@G `(~MK3e-[ +HS@)\P$?}q"X͢IcF2Rðg&CQR^Hi&)py~j 96vrUв 5,Rq,x`K(ӈKW`5Aqmma+ڦ+vI|Uz_==Sm9߯eWnv8|g}{7|wVrKh%|ZܲO &6xхi_~Cd mbֶIa9B8r0?3\!;r@c7>9Z|c^a: Qo)wm2IF~e dtFOeE-rn`}6L{5 Щc?8RBŒ#>/n&dqu͛%}H{k6 +L- "Sۉ/gMI?./7L[ \ dWx$ ɯpi dScc ${#t[@dϷ~?rk|2F[JgŅai5梏O\g4EvFEB=,T:`6O|82/1.IiB*I-  Iժx >|یClu!}% s  ) vqJlgxHKT f.(s @3Nt[:`wb?jo?ad4/֠9M.BC1wL(䳽޷0_؟%@9gv -g4%X&͍ { *K,/ohӅ{㿅ذW@ #㾺d90pazZ.1I.UYGn\Ɩ>~^H8ċ;y.bPԳ۫3<<2$|ޡ}bbNQKIub^Hx.oXMYM6#!""ǟ¹n5l8qy׻uf#d,hqˠQHr#u+PVܴ^j`fD$H\(_kɘٹxo0 ]ٌ̈}箯CrFQB7=XT]9 ~ʦa艢 pez[R9窫ICX"=|d) 5ka]pE .0~^&K w\[p % i9W1r"C$dk&cdqߓ:mYuW)ϥAԤ9W3;fdM2yA̡Wտ.b@y!l4 fyY>zuk+kuwZag45{91öi;~GUc쑹jLz[hP HU*w)s!V9ֳ {T-7W9]P]Ԁ.3^o/RS'E2sY]:g^c:/8nDwқ!CF"tGN A*ı Θybi6d?D@zԁQDSvƳgG)0(G3?Ya 'HdoGAZ3 k!'ФEv#[=!4 ekM|3\md3}AXTI븻RO?XSj2bu^8o,QΌT2+ XW>4[>1IFK#{:u {k1o2D4K`:,/Y&XVvG̠`[qsi7)g?3x`i(, }¬SJHh.v'x ˅)1Iqb&B䑯u~B/rc 5b?TxLAPSPWޭ 9ArL8q0C\6YهU4H* $V6]@Z`Xyviȧeփ^{/:VsP)`j;ӺҐ[nK'ĝ5= CA+\~1Dut2-xtw"fU)&=@'fH9P"޷y|c>'F58‘˫a̅r^R/rkjUUtWD X ɥORLbKɋ֛K't!DWq_A6 bεO :QuZ5vIA լ%s"XΎ@Ԡ!B!%{pԤ|g`gRb>B9z8 BҸC 3|"\exS;8@ p 63B>>IOt{'lj:>fAT! AE,gm8%D 劦!T,4&uF)@ YgRt'>sQϢ̍3$ݙS2Y9 6M:SVMvBʧ&4 !g ;JL ".hm ~$Bse24E 5rwt-k~;[eԲrz-z4Ul1%T:unT1݌%G-Χ06L$NW>\UN:-8H^oS[Kҝkw_ cZ۵AWiM^y7 -ƍa8";jTS8YdVzxco aBM5Nؗ`,"W LNTnvZ w3QՀʑ09VC/%yg1\t!E#`Lew o|∈mY:D&[-l}:y7un4MgϿipP|`Ϥ1{cd֟}8&#@SJי1MΧM&eU-=#QŠs&qe6)JsW_sK;"~L2a!7Z7XSdTD9m3(Arg-bfGc>DMCQe h|LύP"B_$PZs*%)w9#ͽ7[f$lM.7gD|tSF]jbҙ0ٯ>lTV[Y??QR #Xt4p"}0ZYێ v_i9K;.LDXΠrU0sy-ybtvEsl/wE^ZGQ#gGTA(?Ba^wȇ jwPJmA8Q{pigV(&kɺyBgo8,HC!V"긦fXugg徚w5flEJy"WL"<5B.{h7ٽv3C+,(:V^mB+,G7,ERy8ӿЊݩS.p* N$'Jkֳwbf!n1i̽ x u%5.%|?v?sel*ɠ܆ ~q& eܢ#v9vAA}6h0@:-ǯ3qZHD1igYq⿽1`Ԅ\EE6+r󫒇e6mrs6+ү(Iݑ Ga) C022֌0Z E`3v; py[Jҕ[fPin"v{C.qÊ]>D3aj:`lԕӰT> Jf1'8i#Drbf~NIl8!ot;kruV*5%&{KvL?!8/7`yq}GGM)%2UTpAsW]1Iܠ y+&%ܓv&l&+R'Gs(2rF 1AEtGnV'\ V %p$9hj&(ICN' N$O{ͩMp0p6)y^_%'|O|0(0,izRԠk8r/aü87AR)Zxg/|?%?DTo ks;JZG#¥5XQѵib0襎Tu%yk-d;&e"w Vq뾪M߹YÞm(1L4s>{igci9'˭px3[*/~ WlƎCZoor`yfUwɦ^wy, tAau^W&hI#uyHayvMKpLN ٙM 4 QwINQ ʽs%V J8˖a 2(bş /JZ, DxYpKxJР:gKhAŲTse]50Ἅ'i۝{oR#K"gRxf3$D' O6' Oײ:ĽZ/[M/ 3wXNsmӉ?P?(x}:YgŖ&`d+GP K( qgFwȡs d65$3zݶ*x5zwGB z9Y _pUHxLA$%#19xzGop&R0pn-'(G򨌟Kw/YTipȫG@*jZ8AO8ߙ=}lb*<8מj@1ќZHS.;pbyȋెC"@[\CA[1g!;+ΠF&% R2VB\U픀=wSMJ;`lntƅ+,:NFړk+r{peM&[{>cm+F(}8._N( Ityؙ1-{H%?޵ Q@pQW lqS~覻ԯm+,JfYqM 8)Q6Bc8%|@ᣴ^~,ؿ@pԯ/>k3ˀ(:j{QJ9\ oRUdidy f^wxv g[ɰⲜP&]mf?iA]o"Fa{@{`uuĭ %>E2㽹$-:<`C9 (V9qf9Ebs \?r`>JL7 Q!ᾖr~ń]sWq_ d{KBcvY5*e5'i)ޮz?|[XH0}ȧ ^9=aX|KK9j |yQnrBi}|H!׉Afi_K2^LP-+0ܴݕo2.' r`Y{2y>d Α?zOafbS˺$[D(z\wk[7ma<3$+S}Ssle0sZ9hu)Qg38q~^-SRRY' gX}W,E@ {1 j(Y5({ZklY6WmBڒ|v_h*`/7jUӓ6s3W)YfovE±HF2֡W:oI3+~IPE<36jMԀX,騅Xk(˻]{1n2tc{c|?MȊH:&+lըBB|P4&~|jBK,[\EKiCL]GoBrOe(ܝT065gt"FE53$7ɏ77rce QeS'xZB<^\Mn}]I ⶃ欙'L]`dݤj.uaᗍ~)xxKi?EQ&Ѕh˂ȞazÝp"Q's aᕆ,isEuSGQ.XC0A'^{2'bK\SyАgsv!s}1;Od u4hOѮ6e}lϗ/ atFR,` Љ("H?̅w(WJAw)$wǢW׈^tU5PY>KyieOX_($g)ڻ|4V~  2݌j@<+=\ G1rcu~:`; P1ƠE[=աFRmKӦZnT0!X )%C"qSq4si;LNg:=V{.zdꍴ4Xva py$WSGםм&[﷨,nQ0C}zHOI3s0 Fo_QoC[J׏Ttʌi}dH']JZ=)*hM)Rfxn5oVDqU#RcPTW~+;EÇ夞&ސwؾvvdyx{jTE!#3nտ 7$}>\浐 Gʅ>u+=VqE&ޑXnv5,cDjx{\*wq?S82F 6<1mf Ԥa>%KZG@̥W,y*]IpjU`~|7>0q~\b+{cZ`oak k^:kq6XJy)B69`yᝋ XJHӱn٣g`KhgΕG# V몮xfW"t+΄$|' i4:UήG~oS4n8"uufФ*`0U B_IRzǛXW7rfELyƗ-?opNV5kOr-%SԛZչǸ$է9}~/5W-@[XE C*s+ -U7u-UnfO>z;҅L|.- v&p>_(TVQ\.WB9a*uN9H OA^+nzuZu~|or4ֵQZvMJ[O3l,EE|EA1vS1cC60U*LzԞkb'!ܿS; 0IUq̀|`óOeBΫr9l͋BэOm% Ƈ>3i-`i36MKSBT)m }?lN =y{A~ٸ>|q%^i#*,ChN^±{W\w>_xt83Bt6ߛpꅨz v8BO2@ 2n.Uf"MAIAlLLGf(>Cu60`UybDG0h=*@ cv0}Mx\Ey76v]! vV)kۛwEfAUqKDFq~YyU_4’?j.[ =( }LySgtb]∓T(Zr҉lG]FFh*߯SG ddZ=* \o:V0$[?'#TzzZzc 3TNޞ5VŴRZvR[ᢹ$I¦ 4cjxD I[;KAs2!vy>p+]x`x cmp4$HPʏm '}EmDșM1"M:DXjX+}5 `(󡧭E&ӯVDstYua`0H 4U]G9^ہb'ʕqS2\|f؎vil}vʟY+3Κȟttչ~-Q bB#К؎e&䰐~2+6I;m2b??=딬*V:ЪU`(sOby=ơn%~c\JeNdzJ01?F5'}nx3BEH:m4O"y]%J׽ow:+熺]zn^T$ן;y'vtJUw7'fɤ5 ;#c5-qmҤJ<DŽadeM?];m ؀>IyI+]صK_m[{X.1zXs%CebzGJ]VZuV[~@%7хr҉r/ jCH(+bj7\{.cHM0eY<69#2{9/'kv*E(#7b$K@L*ʫm|`aH'2VqS"P3^/);n(R@OrPIڷV{Nm.AZ֨99/\/Y7W+;S>|.L=(e,-Z9/@ %fwE8(¤_v{b2=8thIJ"n8A``pw@v\?c. *] ? oAQk1`Y\Suit^:q, %%W.B)h)ak))R?HYU]*w0 JeV(~1a=x*'|iɎo/":z?HնlZ'{@"2=тf2>X^s]ƟՖ ~Mے nHL) M ,2Ek X7%XۋlȖx@P4XocmD^DN4nWt42yLBU5(Sc9{ZWsav^ 6iA`Y!`x׭n07 UNGa8(Ti`fn~plqePq:~j3Zuθ]Дaԛk䊴2;Y(zH+ (KqN?o$kFno`i& t~ %1C%c7jp7@eǧLUo9Ɔﱠyڢ/hy'" VC3%n.?*%^c7wlÖPhB|2 OR48~XrINB8^XAϽBM e_Nt6#O5V@AH MEYR*ztyfWfkDz9%/, vJa,mG5†NCDpc_V#{60`،}b҄~1'`r 09枚Imbh/Ⱥ(C]4d#R.qsaƻ1 TO(Ś5Zs֚il8=cukzDŽޟж$+r=C],՜<gZqwצIyWAuo-'^*۔=,}R:Bwhiuʌ^\Aza0, kj7A:FW6A.ۃTBx约w3Up<)2 Y2iS=j=f!كދ[$(p7 ttڹks{̰_噬`ԏ l&$~afߟ ez&l]t碪&Z$ d ݿybb|yI%+w@,I>ç|_żpy3tցB-}e?@gQ) ׶]"GkxQEԋGTJaN264uϙi*?($4 /c6wXR|-!/\s+U=,dYK Jn>$Wɉ,7pQ;LԺg4Q@g)&B)rH7& )@dž."&Vލ?CrLAz%.fhA~g'o8^W"K#5^#DeIrwԅϭt`.;gw?{tGD_ux-,K]-u֌5ÊV5yf¯(V rЀ_G@Sȶ8C$u7P9mF}yR:U0Z`Wx'Q:(v=fӾ̪w(ݯ+B-wqSYEٴl9|z4YXw>4$ b#*[4Ca,@+v-{]1Fz)nqw.)<54 8;.fnHi"3Bw9rێΣ @@V3^Κa0َL}}A)Csgf6)5O^$!ujlZ g=񓿱/YAo/9#¢8c$zp yadN&I7!"`1*\yzYEH# B 1F̔6V1՘z\W9LhFA{|EDeAآly:^`<񺖠_EFn<…L$v "]8OvcԖβ>9aŅH~9wtWïdu@lgkPnOe_X=@C\=p$qgݱZF;Pd"[$RM !N0?t,k%9j`іڛj}9ʞme(#_,JZpav["8|L]OOe[n'2wMBQU'5~oij]Z8"@*xX0uCl3&B*,_ q+ FN>.!'Ck:$ (bo'~)]Wq +wԤ>ߣ<-]4;>rbUMcq߻Ҏ9 5y{ L){QԂm<^MGa@\n,W]/lîɋWj&͔J(kk;j@MrK8$R WXzlM@%‚|Ri=:.BtR2j8Q (Q .r6^ wEg OnKZ~_8~^>lٓ0V5ftfI3t Yt6Si2{&L]D8MmC$CM|h|U3զIfi<lEf)IHIFł|ӌ/Ədƹ%O&"5Zy;V PS=r-Vh͠7(ҁ/3F*V㶽d)TO5-ӠrqMf;˔Z ~zy o/"9E@p6zדnҋs$S|("̽nM~.3Dy0 x"0K-HP}bn7Me[l M(L~mf?Om+/@Bz zlȏ}xh^ɮ.2-tLݨb:PFe)322&zYpA772S l/!DRV.ۊ|XKPlM{xظ6Y5oF@+_|er71ҕ}ٖ߱2O`"Iuk@ſ<9i~SDb#_i)8R8Kò1^nEWc JW|$Da):TEOP6Q$ܰi7qSXadZ}[4< 뺅!ѥ`"Gzfv+~˿$Sq둩S3:KC;XPj[mCauW-}><ǫ X[`C6iS_ze-D-ovJNLAFIr}:J˕3%jn.%+v4jΞNIan˙i pҩ [@VM87p}zjP.(cbC&YDTU^7w!I) әB=H 6.$G[os.7%kDB ""FUJ&UoէQ6{ k) &Nد58QKsb3]W ScS@E^|d2PCx]gd%ξo{F݊dV Ǚ.'`̭i\--'jGHX{O_xs9g oOa0P'?Q*y-Êu;wp"0K_̘~o?k ..^<MSEP9UuDO\ZmiV'-y>Ϡ;Pĭo@ir<;~L.Eaͪ## \ͱzɷl@c8mO -_B~Ψ1Wl kض_2## Hg|kTz fL ƪRa.Gs#B@7}:ղR#HroRlp6WSw: &:(4ZJ԰:Xg$حӡ}yN ִuLYB9,<ᘵi)Y~zAC)8i^qN®҈W™yx׼)aY5:j;5&I]Dnf vA -C`%P^#%1h@2ؾfJ5nzF[^ϴrt9:",  ;/ۿ.!)(ߝWgpMb1H?X/E Jߧ_YPVD2FzWV<gs@ǿ%b/4Y'FX>YM.%:jCf(tTdBV ,".l Ղ&7`sMNzNvC4j7ס|x%av(f3TvQ:Օ n7 p2 zqK]†Xr$_!˵ǣ<`1 =φdy=î؟GL;Qz~܁^+TB 3U25{ڋi3KaS*⭾SnR OH?j\o~!F?[ar3}rIf%yV24+;T%> Z Y Nn Ydxy ER[U"oNB:=wpTWD#XHlrdthed[ S jrh>tmP_@}ޟLP9w;Y `i@M/~e썳 ^5:ӑƄ̣+ `#s 0v`t>%tnG; lӇ;9>,R4 ($e1N{sqfiӺvVne?a. <$[¶K]HH2c*3"+UHe_}RM_[̶ RC.|!D>3?K2]Tu;xYI(L}kI#ԭYe07ERs ` \0 F8qj^NjmUǠ?*JiȆAfGlI2U{j5}Fr#_ Le"v I9|2#ZˆڒIlq$y(s!̲d+DyUR9L9kAZ{~^q|W}Rsb5 s&Le<t| fH5+D+)=^bDDr,u$dFDDž~y6 l8Ao|P{z qJ7\gϳ}[|>a͇odi.t:?=aIOVm!m?ۻ\}f"AI Re0!/ށ=d2k(-x;x)>^n02n&T`vū ~*2.2@d׮K$qajm66+XG:0¯oZ]gkmʲa 060(N*"&m{<K}G&^.nN4@yMdW؉ꬵsTxW̢&V,NZ\(?i}RZSp>!+ - Kc NvP7f9k&;UzS |L}uSO|so7xDۂ. g[`pPH.xy Hƫ| g0H% yHmjMF?+DQKRB"o1ݳLJ1+J` aZ~4-e[fPZL&L. Sl~Wl`λ|!ui+XCE6U b1歵_?xYʹ"Aj$ƷF@ĻܺG? "I9gj&E@ܥ͡6ӎ~7ee̝({Ym 2xƶy?ʎy~W60aa/%TT/hm(>7 z'kjM7zQܒӎxǤg@Xڧv-J%^M&=qOR\L ,59sP)<q'>2Pjm]B;GLɎmNR1z8"2 hQe?*SMt0gjw6z M-c_hO|q_!J:<[ .AUղ 2qqpmŻxy v*MX6DMd}7Q^a8u@,_ 2ۀ0ۻ5֭[zZJm^xVy՟#2]{ iT>Q7KԆGDB|"v {8&#Q^V'&p*sZ=DdevV%ǔY|ߥC6꒗wv^9>f7Ǽz]E@ ,&E#c4B7 *G Gd_L }e~Y6T&Zd `۟@S:.io啓wZyCr 420BP`e!i3BWG)pDDŽ_͓iٲ~@t &nB$bwi\ V :C'|a;dp 'MYQ"?.*]To7> ԰3I_G忴?2pLݜU_K?Td,٩+ՠ#״1]䋤7w{$Iٰr?tIq~e75R9E=yXuOFpi "csO&.uc~-IHLg˕ fNPL$2[m`U~/bҫ}e֨e7ՀMFrF,%Q5nrfjk,퍺qs  nEޣRCΎ2pMk8##˅XF$ ;B %UȖ5[`.I-ng . (YHi8thlc;}P%b|a(nv(8ULCS 9OWq_VxnWHXH%>“(wmZG Ι$(,8] ᙦ<Ahƕ; "1Ǯۊ +B(1\ ,Hzue0g;X[Vb0Zӣ0 L13˰0]]?b Q~B(Sl e+|uϒzOu]ncj:ԯc WohalMj3['] uzFaiLVCϊ4.y4NKHjA:k @e7IXҝZ*cn؝OjvŠ`*HbFK,$4zO!"} _l%XkDjBo L=\?6"DOmoN]&sM4}!)_Ap> bssS=ԿDDn۶ ЀU uˎ)dz4@)qY TaX }TEA<AN ? iWt+m#/DQ/UIh(91%{йadm.m}oY&2_o4L6 杣E`o6M-{̥y Z1#M|%^md˖iX-ڐe>)z^5)tUL xw֚QX`쟢 1ؚϒLCiQZ[Tv lpXc${osTp↖ <}+ ㍩tܓ|9t)WkJpRd?yYOPZ׸rZ>a;n,6\4L5Lwyc/P[ŵ:?(gO B.di~{Sx;RGT8OQ EnqK"?^tdaQ/*p-} 2;)ǯ _QZ6ui!fsr! %thHߥ < Fx;X! :NF60i΁f0 S>uR׽RɤJ`PKRDx{O),?i(5SK}MCLFr:~;(212t(4jظ]l ilB8@CtxON!5 h\R)BPEܨ6^1"LlWμ!ϟHg cQ ZDɀw;23 MlCa<0y/A-_T#y :?8ZbmH<`ϜBoS B$J yA?kЩSuL@|J#7e^9JHjL"evH;=ь&;8E y?v($c$T?>"Tas!=b(CA3Lq]>.|V9І;Q_!&1aVܳw8uZ ,Bp;V_VZn6"=?e)C =s|@Zl ?~^u ̮K94vߑپ-,o'sSY^Qw'('\? ZUSZn+w4]>/*lRFf’9Y\LW4{v{tiV=#-=VᕬChr0} 3˱73ss;A)=k 5T`>Ra\~z`c2BY/M`n?*Rm2XrW4ԓuY ;8i5 ƚ d(&buCW'裏}d;rx[6{$9LxgK9$Q2=Ό԰>دU_+CDV3"U1h( V"N%V #&&,.LAT $"ę/KAEp6}'Xx\uz%)z1C7O?xîa\̭܀< \ ) ̝2=,Ȕ0:'nMPUH,EtWR$I)GV^ٮjlIngՁ3K ut6va(uNdH)v(E508)Gk+goQǣ@dz6LYy1Tv!Mj !]3W&.3Bu-V [tPhw\:uxLݴQ35t뮂21L??{I 7}9sdqa>X^QVk4bk0To!_Z{\lZ9&2Ʒ=3< 51#Izv|+x W綄!.jn"5#>D-:ZGb)>KKx#qSGJ]N͸tث ^ɮE&@1RCKʰ` .1םK-!<ـB'2#H I֥vul/̨'>nۡ¯2,wҕ(⳧2C~& uT?(YJ)fC߶R xL AE4LW‹p[A|֡4 }l;'9A0+ aKN$/j-ITN=K{Mk+(lƣX(Ȍ! }5>rtvb):qy@_{K[juDԭkP^şru⸦R;_.}RD8'<@n,y' Zd`Z&M9b#fsAyTlxVeSK0J \Yl??`osV,s=Ȇ+p7/E(  :,ۣ#ǎM}$(hCO Ήs b"ݓ FD/wϯeџH;ڌ#@>ZG\D%I՞: LçL^u4gH MR GϪ+~3 <>#62]C +T{= ł <+jj|ə(~c˲n Vߍ&dF`fl?Kfg0&I|ܞ3ے ކT^St,)q)"qEJGrimXՕ`-^E?39ju*I.=a ri0Μ75QD;\6jv XnM]1V> r%LǮbU2Iα{\QQQZ;5 4bd.K#(5 *3d5"aqd;fYO/Hm|U7f9z( B$}]BG9a fwYYݩ5a?@NPi=+O5n#6\gIK -ڲhDPh`W&yor֪A-r{q+"Dc0C*N[Xta" "Y l]ok :6&d2CesW_e̡n$ʅ偤v|w"o]}5zBS[^z뎉4vBE鮖MlY5Dp納kԖtK$JG k jO0rW95s* /u蜗i Fo/ݮ;# .8NoOٖԽ>_al?6!Qu,;uR0K=pq7`*Ao $ UmӲ MyφbK$O482*P"q_Ffh2PW傡CEqlo?̡_D!xg)A)jȯQv<.xjAf j A~L֔\CubZʛQfwep#r,Ե = IXXQ?+TVe~Z= nbxD۷XY& Gn)k@ /p.7c D96S[cב6:4;DH U J;р\:^-,ܔ|*b"7;\ or; I^ݝU=&D\G04|y~lҏ4ery46$)FNK.@ >,$Fa`y| nmqKxz:@+ճDhWr8P"(>G3AYdjr2VU_2_Pn8; (QvoXSPAϵϝ^}͕;$ pH~5)* /T69D;=iJMFPY)[TYeb8uwzO-K)Q# V'wP.M)0n51lV raTq9sK@:O83 2} G_LFPx=P\(smZy)Br kg+"2873Kv{ <,  fWOW\-Z@̜ЬVlB3Ϣ;^owlKĉ/FHm|E>鈭ǐM{QT&w^K5fޏ{JDA*<_c7 x`asOw CEܵ0iC0$z(Ʌ'2bj71rwj߼M  W  !zbū=iف6|rחrFtkvOEgtO}NAJ?@ns' F :%ǖДmg$ X钏ٯM5H@d`f,_@PD^#Ks?ܬ+QO θ肦&V]y VE*XE `GLpm^\'-N2W~ɢK+ܘCC3P>SR4vQPE.FVF-I˽ #3!M<2n7f4hJYni_`9{:* ]㻯Z羪3N "]YZ1O38l>ekm⿯x.Kڕ1JdVqsH~ -Z4FiW < q'J˝ebl6hokJ U<\Țyxi2_WOZؘ3= TqyGǥ,;Uo)ьp83l9'8qT,OimǥG?~^l(cqOFjm!O@ fG"*e&Qgl͓6\3֭7tB^AyPυp6n yߵa/xPޏ,ؤ$!9i6@ c&\?d^.ʛG,얋 wyEI3i%F*'8L?;ԟz]]8~aV9L$a9D|{MgUy"j@3gS`u@V8X7q@"uƍHN-( ."ےuk3LxډתTy\4N&쮲 üls7 :Z^a[XFi3*F,U0"f5#trRIJ&RDĆ$1JUJ/?@uQov.@s p=Q[Ț" 6J!|U`AAEp'NWlm!Գ|uHQ\\ Wg{ 8e艺G!6H\qC=^T9%2$u9xePЭQ,6>5 $ίҤ߷;J|BnT$1a21{LjiΞ"j X/P>{:٧iz,`v N\\u9(RM'+X5kubS*̅@t--Η ̛MExAFRV3/or/{TD:i-ArB=3ŅRi"K(F:ITH`BO/}Xhrw}@8HAlpW8n)Ykz_HG'kH II .ê0Ǐ}ʀ;oJ"rIr)FP>k 71^ ֮ [*UK, wPM3z⸲^5LΗߕI<^*WuHqwd6H8O`P.wm-rvV+M*w=4c_Sᖟ_A5(%='$1r P/GQl_aISup1t&`3nw.pW' ;ǎ5js9 Z s E9 mm[F !Fb5 _d~; _ au[Z Mult[KZ NyUQ"hE0o]xݹf*[ YGh& Zv 臵}C ^UeLRNTAjFuop}˰t= O?U "mIEҵQAUd^E2PkAs46)Dv_V'rWHڮE+d 7(s!R!;Kj~F4q8BĿ [*\Ȍb`yvgrO݊eCth]ևPe)I tvge"^Q:OXqtoe]iOTհ~jIS1YlVxI[Su~5hyΉz;j> Ph.k"Haxh`B̞W {]#UGvc%ߚ E|T8i4h S :C~JGfȽo8CarSC͜0 EW٣{좺;#jEH{OBwkeile*Ae#Ͼ6DGVQVYr9S-)vtdlA&L#VXOѠmD2x7΅^Rc884 5OU8ᖧ1e]cM.+e* 7R2 ȳm"Wgfj@[*V++ai/vճs%xq:;u.eIho#W31ƛ"KZ}\Gx@kS]7@Lu{{:ż%A1f8-F]57*=EhܕKkՙ?{aM nSc͇SyNoq½?Lҳ*f~BkWQQNYĕs +4\>yfGDB{xCV9P+gywfuŰ\pg7uai1y,4_`9 # f9O_5c(υu2c0V i[K2Nac|o>hcf'C2RRg! :h;a$J~1p qGu䄓aO >hjə09}pպ)O,؋s])G GoSiq+A>IAhLKޮtg]o}Hucw#@ OH> e"QK_qLީ%VkIJSWTHE6߲QD#\r֒÷`Y e5vƖPT<)lw\p5f5A4;$QBlЌT8dpClP;,9RiůL  mI,;PLnfCH:L02z>"K}qq a͙`ᄦF˃%tuu,CuÓ?=avi]yQ ?3orI3<UX3DQIjrAG2!d}FUH__O;a;!/I2~(>M"ӯb6鏐ph&fg%MJXѣQ~ s4` ܄G o%hBϥ#5]xx8yLl@3̬y )!{,p?Aᣱd򞏖bìRf%Vb6zEg%{Y$?r痦r޼`խ(IQpM ;#I[2F*)@e$jHfyhoxvUsp׈ԉz)kW},lRKDז>~g'g8P~VXvcF)$){'C&%-0Dǐ$UQ!qNt m1uU'Jz{xZa%ۓ$O&D,eM|Weɹa JR̭,xOhI}) 2xPC>j?l1qv*9Hr- ifZgb ڰr5ѻJGm]lb-3!߱ iB{0C1ml!bw+`^e+ʖ́a>d;~QhM{)9iYW$5\Z_O*m 9=g=;%C}Ȩ@G'q0E0oYcVoJϵ |X#uK6; g>u{_pLZJ\d.f*3 o͛˝I*ՖXm#&[Ie$SFJ{FƈJvK XB8 ӅwnˈY<|CXjF)Av=e7̈́m5J buL^dVk# -;WBH5eCT>W02,-1"a/dA;9II lvybe.CuYyE[o[Ug>k+ y AW ́BDxlDݴ5|F8$/qjJhE\>ME6 9ԇtaj&ӤTb5Zi;Z%R ^I*dbs5h3x#H<,&{h "Yc:kB̤VixLDm):rn+7F1xVL=" I9A>bGu&ɤ݋K 4pqm| tCO:&+_Pgtپޓ RZb"r1l_jSz TR < ’L]3}:|[ ˆm~ a4ޡ5w3p׿ *GA{QkM-r _mօMRmH5)\o[٤akhL&K ԮK3y0dXr=B{9'7͆ (AcgvȉoiM\o'<[O]*L(Dda%q +h5 J0~)kk(˽>6B5nY~ E^P'c&(^JF{F@~4AI6":<_AYg慡51y]E ]q"ϒrt%£,[yj +"e"ok|L_NzK\iHf2'+o*v֝.( >nS N,\&9N.NHIS_SrWF2 ?+twf/Um?n&fk+JkM %|ۃ6e &쓮+ $a/ab3 ~"+_^ 6)&YZH n#zSҕ"҆t+U61)Ϡ#NyGw ,EgTxͦ͜5Zy>v~`5?3ssM, Qpe|HfLb])M`p _5o++Ppb0㮆,lq/'?ۿX'bu_ŵ{Cڼ'HIѨ$nY߾<*w{Zn$żMvG{Vm7:߅-à[e0t|Gi]՗X&KQnQ+ƕ 8 "YJ~Bx]J$E帞KEq$.u")7$Ejdb ЮMKǾ]"~9 ^3HSdi \8WR3sE.MŃF]j" 8f^M0:-ʪ;u+z)3q4e=tZ7E<(x@=dC.y&^>ccacl6%^SUf61%A0XbGD6&:%( >.|W Vtgu^ѨQOܱ _I|4AA:,imgq|Wd ñv#(vͿ N@{2vW^K]qZ䘏e,v|.R]'>0o NğR].0wb1U'LL-v[ 0*O %5(fSuuZݝemЪ hmsW es$4잂g) w0Җ|?IgZ4tδOpGp&dF%d\@*t 1+ aI*t2ۈb̾$}Rpq<Z0c[hΊ\ :ѷTPf (-=tZTv;$a!s?̫FƖ~v9Bg`u?By8\ЕUP6|(@udKs@&l $9!5(= 1?4Z+i&_*Pa_6V7uX*\*nE;[>N F}VqVF><:93++L2V;~&^yjDKwMJ1n>M9rwx*-I!D0Zv{L%)~e}1$|]O=|"!!}@J@ĉ1h_̷) p /:7uòR#rJoNnY|` ޚ6Ks{nkE?Y *X%C7%yO>ms/Z|"AY nVm+D{n-~`$6@3?D A\E,w_=T}pڴ+H & ߬VvCK%>EQT28 38opN2O=d?P^ՇSGݳR>)}]P?8F^;xvcIJ=E=EX+>bnM NN7MUC-9As!g_ >`P>-@ 2Er<>ϽPr;?":DǮ%h+(7yQ a]P=r u{)V֟O#[YIΎ\.+%E֟(~ءi'V{92}TkzX#˙F K#Ůghm&OA`CQמON›Piu@p vյZ]^d+/~;U$GšFv(s `\mi8dFM;gcݘyUAu Ӽ&lD X]TPWxfq8gl#@Y܍ ]k۶?ͅP0M7Gio 0dM\BYbelCK! t5Ѳ?  ߑY >s{Z/V$YUqӠ`cYr/,0w6,i#Z5h&وL{w ڕRQ2AI/N@~Ke0Ũ5 YҸQla߮ zf*J|7QX& a$T9ٮa1ya4#KBc+5 [U%&1djfݤLAaGR3h)Wȍmϊ#cG;d8YjHW ?qkz"JnF{TnW:΢)Xo&Xu3oSp5#?-Vk#s.$3W [X3?rq&x5>OBuڜe('ԥv]Q2CjV&@R#ɍA]zx uq@pna p`B\ ""r4QL1_oL6&sx،g.Ay4"tCШK3?)6L$-m Ӡds'?*x: V*D\ ˾eH=/mõ&;vpb `!İ$8> ưp<5"#.5uF#YAEZ[Xa}߁Ϙ "qNu4wWXX ;CPf|P m˙D=evїv b')P<%RrmJU[|WTl-dd 9!Oه4y{n[0q`!dյr,cn~8(UW˝RM'-ПCF^v&<Źg.1TJvv4eLެNGd:?+sal̅qhځ-;Q>bwK~%} @#QMӠM#*x):(|Ht`/y*wgGcHǶ4~ wC[aThfFRyVQ@Z]UEV9>FRI:h(GߍaN%{fgLDZWmR(M5w? yZ 0"YЛ7 ݷQ]/bziX! FOʻv=!W ^cboRY4L+Ѹҳ"ap늎c6uWn!`9mN֚ -=W&t+vR-@ SR#8`MɕZ gdZ?aax.tZm-9xS}g(6Wʇ==YFn?ȂFRG#(s?l]/8>~>ڇk",nv&*e1;Ednt!ЖF8'7q ra{4|H2mT^x.iLn|A/aJh_ɻG)kn3=\9L"||/9ַUqֱ%U[O:}_IwbPA\BCe:%Oe.k:耋0d$&;UǺb W COz<}eOLmѕ+Hb4`A&L`xGTI5@oeh!5OL_D&}$wD C{tB_x?;.g̣8D7_m&LJ5Sgp0&^B8N;֤*Ab['G4O8:V{+|w.g AbO8"Vh Er-U,V%Xh[$$%jjF$1(+pZ}} s}G S5U@LɗtR}.AuVZq$T@&Vy`ePjoe5·qn"]zi{mҔ27lRfÂ((sTSNK;@u9v6p>.I8N[ Q)1ݦ:#+!QIL\}cZYGS #h:.OO|1JT8Q6zpuؾNc=;4 3VOĐf/yҎ&?[7= Gj5L6zbB;#xjџr!|;|/)mo.)n`8)DfNp899~>_o%x+WФ:L?*[ᣤ>?W  .7&s]}gWCAmU]`՚+BvA2洎! p\ׇ#! hyQ\kI8`NwKAq߻eO5*wy`?2:\"[6L=o>K?B._Z$^y k[acТh2ߜ2 s R4P0 Ňj?<]/={hןjڔw48|' I Z O9#y%ɞ9[#٪! /yyH.4.;KD!LJOa܄;C_%o*ggx}~qG}Vݿ_n.:&=;dQٿO)?>:nZt|0+յ6 }jB|*Wn!t"KIr1kq >1K܊~M Z#*C:B'S%>V:մ ȕR5COˑ/@vtilF5Pȍޯ92&x\Tĥ'J86ՋRp VZ0iqpaHpu./8ŗscTPfƕM<*N*nL|>sP=b{OғzЅ:c&˻r8^r?h~m\oTY(|89̚0GYMSAihe$mkcmR0`F4=-H0ԍ5tCAwa^'@q]MO^qR48Cr Fx]߶; ZцpNbf ck+j}2 sWHe *|GZ%i]C}[x0JwE,=(0C> cq,}9Њ8-t!#vP|v_ '@ D켶,-Bm*s^2z`?ķ߳vqMxNAK&7y(B_l?J/,30t%xbz_#NC6y\pzp%q^fjߢg[k6ZF<G=w )kr`b[CU]/?nuJR*'[ %ƊH2$|v|Yh&|qr1ͭ??R90KR!{)A}@n&TO9)]ڍ54Iw6:& Ű)e~*!l]*] pQ_?]7}yz&4md)_zB q|Yx׃vt]Gj1tb_ Xg]MZmGp}t+!=BP{C3>]UkU=U'/;qF;lk9n%$>z~ENɞ-ݢB fq [Bz}mZ8N5ͣcW\.YazN?3yOOWE-Wr=>b:uGa!'ÁNX`-SS\>"ʘ'YpYqP$fK[(jA@a΄!-}p͌/eG"%U&JS;Dq0C.Hm# FS-%_DI:˃rtrTTc z+0-H]@{ Ȁ~oX#zFMl=-\xo Wb;1D^)Y#be[" owe J@+STix2l V[ovjIf]_[A+RkA#DaRDIĝ!) l<\j{ڕl;Joִͅ{ɩ TJ.ކ;@wwj}{Ԗ -q#B>N "iՊ_;} +$Ê8.moP /Y6)ohL&錜b-ЪRKP0p$)BG7֘V) 9S3*8Rt&dokK'Ghrh`Q,˲.|5M;7~qD{ƾ{%$G<h/S^c/B{ nu)q;ZdHT΀LBA@ jiy" E5N-H41uZyVl'To̯$vJt>mLe[,YmTYJYm.by \;@7RK:JXhU)FeZq:#Ն J>]bq_/C:HLunK0.8h<%D5&=>N2e9qXA"hoXm" `mKC42 ;YuVDZ>W\-~@(Ip vwެv:ؤ@1݊(uJlo!>*GABy9zִrքDAL90EC/7go γ*.\YTir͒?khBIt(1fi)%5)um9϶6ΜtTp 36n__eRS51\arpT"UqYU~7KE@B~ƖV親Yc5,[E6ej3F``dbL2~nAbIAlLC0z }Da@'{re5#DccޔNj_@v uf?I6Q#k? n?Q[DQwObˀ eωwH:Tm#Ï !*;{e՛"ӱߧ/v@|O@=wᱷHpQ,~8X&}rn1)=j+\$8 'U._<'ozF IZBc|ނ&mcnLUgvʱ#A\x>N VZ¾^GyL-|Pwm#i §!\K?F\nh7*@t/bɮQW-k\r,l7LK h|=V-~uIZ  "fN-&xZd+Z}TXTMD آlQEWzS!̠Mr꓇(}V`@pMZ} 1l>Y{]?éu0=#`׋k|'WRNXЊoJp~&,_D<*F`ΖF? N(L[9G"FEC[7dLs1&J(}[gpPgs0^n Ovi@5<'NpgS Ħe,"@/ 3qW$]ó$2AD 7bF%1 4v8erv՟ ɖFA`C:֛J|F3{[/!ߑ ؘ~B_:QO /xmq\k@`zbФy7@BYR>wIqw![(A](/6Jzڌ_9'(3OHG aA6j/2#pN^6 TXy#w*[U{ogPU^Oˌ6Ehĵ/dD}UZ];ԑt v~=3 \ ޯwq-{0v(\p8T`ʩq?zl{GG#ı v_$ldVuL:٥o:2}) Pplɉ)3\ E+ӌa ObEfv o;i[q ^]:7DNϓbVjd.YN^]z5PLk[l]:Gx ϗiq=nnFKr-~ɐ d0^1aUD>]_R7\ߋ-u솢jiOz-Pkʺ'AƟL`>Zŕ3o3D6]d`)jR}Rjθ:n9 "OjblyGb;UAlGKP]tJPej pn}AEŽvږ#z rS~^sHȩSf1{0NZ*yG.N9ZK{>Kekw## ]\<G[RB(Xf fN,&UDB!ueJ+%5gfe^vTю9 \`:Dic-^5igcrMow >8Id!b!N{_*3b׃rv[ RC#'nCU@zzOgK Ä^݁9_>c8l\yS[:]mf>\<$2H]5v ^U-63Bk]0OH>`Tя5K72`(y ̔*n(ZRrBew݃<{14Ut0YBXmAͅYµ]`FQ}j]8+?ags$_˝5&m8Dn]Ü X=,!mxY\o fW+3=@P\Y뙚̐U0/]ʺLmP%1r/l:x*]dπjV%W^ ̸e0ٙVP%فpaE֮ڧzrҿ_=,؛ww|&䍟PcAa݊UUg [뤪-WzʰAH _^0q 03zFԺ.jΊͧ|CPKvB@3Xƥ`g4_;Ư!J6oRP1я(7fIq*E^jfv>}Ei10XO o٨hUXN$Ir/ݞ*$.v|[#>擸 kV0{Ѫ#&wuvr#'~><<3,Ewly%50dukHɃZ5xSUAj*kŸW_PI?AYf9"{ⳛ9ʒ3Q\.]J[ $o#|.*Wbѐ}{bj1%u~oAnбDݛ`RPAI1 d7lwJvfn~aPJߦUj?.*6 o |l=9j1"׋1t;i uvh\{XAiAtTbv5oN,(~;Jm\-圇ssMhTL 4;4gxh`" 32P6d<Ô}xm-ʟ8ĿƢ-d@?0kjDSI܅Au:LyQ1l;OQ{^r>r6@Iʜk okT!x@T32Wlh^ҟ31N'L OFQSx̥,=n5~QjYh4t#0,_) nXS-Zrr^x#NA?FqF0v@7`rDiz\ow9#?[r#D Z)G*a_]ԑ!]79fI~w+ "ys=J@jxKњf-=H4VZb$*'m)`5^eBloVKq5_IߟgE@} J_1lNЦݳЃW Y7WX"ĪUeB|-A.;E'Y7ƈqu2C q#AentC퀱w`K"-vzUno߂/qL.mObUQ 4]t|h@7bD6C(5_~R}KB=Z+ zDHL릾S; c!)*,_}XDm q .H'\S>!enz3w[*38wbzi|7;XZaP>xA-@4󗦸s3rl$IK+ֆ*ϩ䘈L.&L+<%ڑ8@t(*Y5c=4 9e0 xߺW[]]GuN;лmDW@9Oә7FR*M+7к2 Bz6V%dq)Q*#7''u-0uwW{W䗧PXI|fTtpԞijT"2nv"T"Hg-('u)s4}.'J2eѧvffE.".8#ThȪ@RI(] xx;ZGަ0!5 sDX0~w +DLiWt]X=BfPoq#O**ǠA]JJ:<[c)~xF9|}xsjvr0fH&b0&nAi1t$z^%ߟe7C:ߗ_>"|b[e0ܥ<= @-c ?}Ҵ^aˉ`zo}]qܗ^C3= @+56$ѨSr˝TJ$!(VvC*k; M'6W/Fx} egQ.ϵYnFA0w\S3YdWQuri:mZ3G#yvVb9)*{g(`+昗x\Ȉl娛 L@ϲkYk3ڡԵQdPM0Pq1{U1#yB5z~ SZ=In,@DŽ4T$w|LtI<U*O8r&$zi6+D9X!)7 ewhfV8x3VJ9h&H$uv^fK4fǿRXƇ6a U*A-ǹb朕n!uR k3vWi$ނ*B҂<\lJ#FPQUf9Cy! LM"gޱU O\ "Jf3Ӝ`!Η$_&H1- R60IըNy1/ (Pg?t>'#B&%i {tB_tΈBC܋H zN??/^Ż &{ͰX(Alg%ֳc% "P:AER9Y9i x1,_Pgl ΋yưD985 F@V/']}^qV^dp7\xM Ҫ4MF 鶥RX\658IGGVq7%Tm3\Kk˲2k]I5`RF#XУӲ]Y|՝(-93~OD֛cp@MQY (9䥁kTzۂlDo qCklJ>CG\lZA1%PNAgR5D?c¼\*πL#aUX.Rc䉷CMа5;ym`g# jB#t>dgKF jEZH.1u`s&f7 D(m7kӁ8ɯLÁ]('_#"U6'u[\&GxQh]PbRq$,qP߰_IR{KIPk^3mvXU~$.Ɂ/n6J۱%go3"qOɨ׉VP1#'/pQlOم獐6|X0N@j Xg|ƆyȲ\[Z~٩i$Xz#;YCN6ttDBN'XcEFd2S%۴2m;Y$[H|Soa,f}U4Zp1x(Ȗj170S\͸id Zw%Ni}4kj WhS.q=DH|zh_))_{R^x\a.lOs/sQ5\IWo]CnփƙrOJm 9m]Z;K/5g8+P?#9lE%m;'IԮqåpͶ{F͘0c0uB6`e9SW8i ]ޠ`LX3sbwMl> g`yz{8Hr{w?h70"aW]%\&.P#H[e\ 5 ۆhD#>RU|tU$Jm֑E*{2L'z#׿sq,?aqKN T![/N2CglnwOx)qkl e4dSV;i[2>i 9 ㎩4 IC0jGECSܺv:',-6[.::U2YB_h҇R/.2$DAJ,`e$.t6h+Kre*8zߢ~܎'C$x솟Xs ÑxX)'i3R2F7D {JFG:󴥛=$atwqoZ5m l@_)CowyRP!)- zH" u_,hC?oeh^yHY`Q&OôShUsR:ԒZ+fsNZ7"YW56c}!R %2.MRD3tJJcHa\n<NNZd|ܛv(f $wfAQr@=(ěڋG?*kM-]8ɧ舢O_XtҗRPFax˘ERfbfdOz[5[EOVz'im͂k,C&'УO Wɵ۴̃(2/TfL.M.\4D4 FՔcaU*UÕ@z#t8O拂ק*`^Xҟ#3I ^{ jӕ08~3ut hE=@;X#fJl zJr^U| Plg\ =p(Ny,gk%QVˉPh+F#nt FŞjM׋łtA-&x3C±Ȳ ^D!`3⥫,V:*mjg_]-9DaZjQ4&Ȇʜq3`[QL׈F`Ѭqb-L;wیy/jp1$tj+^뗌-)H_dX[MP0 V8AIAlLC)3䑆0`2z{\;>:nm~y{YmḒӕ5+zXVXT"^xOٲ&o9:r[b;%=S'ALgup%bUE ]ү .ASW^oYH(UD;%G ھ*X ݐ\+z?5Drt>DWI<  Om~hӼv" Vˎ8Yb";Ҫ1dI#bvhsMrwT!tGQ>J# luǼ@I (⍗I0Ў';d>&@C@"_2+5Sj0c.XDH14E&%'vk6>Ş嬲Y LP 1ǤX0|.xOԩ*3jV6 .<*2x8R9C>2 OJMBr)nDw~a{kc( ~Jlҝt@V*<wzM]ԅ\f=Sa-M1u4*ha )yo3=siM5+O.aQSU7H8rOK]W6U屽뼺XuMHd^kkjyoA[ieLt$rhȹbtvziUhc+u/ {*HH^Kd_NBEܰsDDn!HH tܲh,^юW[R9Dzek_P}6$^WVt&bN< ', k݂ fmwY!N@F~RLQ5vwsv25o*N2]"e 4lǓaF-Xr"Ֆ 3M9OMO'x 6m|a9t, "0\ AZ){sx<Qs__A >7z+)]k1fZBBDIdC]H8MO睂X+ֳE\=Ec2rXݲ4L/&:53N!ќo9[JY q$n/"ӬRIk\9idRyVø?!M2- pbӘ{TɦSn3NR"38}-5,"Du>=mej=zN_/kɍo*j2È.P,L`XYKs#t Bosq5Cpfpx!uN܍[3OA:n˔AwNG\H+΄ A;)[9UК &r>҂#"9u5w3Z]\DW{ey=#k(wz,(KKΒ"L>N+^q5䫉 ;4@ul8` bG׮r޾S@-@u!Zm&zlo`6m&v"Hmz[{QAp35l?݌L\v+dEAAٮ~I!R{JPu Ƿ@~w_E&":ˈtEnVͨop+ e=s?c=^a8X Ǡ!+ngۡG}p\l znL&LHq)BRh۳ElIB6=_qkT4̦jG&Ϊ`[QR X%43[­^oQ sv36lٿf]r bd*ۧp%6]^ECPӦN[ˈcRaRhX+њB3LT0zlbZz Ie٤9Dn[=T] aSI{e6Ex7P6ɧ8a2v ~-rx;ͶLt9NΕ,@BXx3Fpjz qgԓ#W,UXSf{@ -ڢ%Dմ VT}o15HϬ4>>t.p! ƥ` mù;f (v1ǂ%å/M/B d *Tn^^oLk𪗧1@4X CmK~ qnQ|B*bvtz/LwECgh\c E0peOwa=G&m BOQ븨y{S6r-gp3] kJ<;%isrewv'X_a0#gR7*W bb Í(u$\N/Ph!a>j[oD1~\ܔTQpn Z nEyeg&|Mok8RBgLjqvʠ}1{\K9M̪-' Vq->סpoMm88Uf [E _W }阆SeDߧMҋTB|_+HFJ`i'>X,>&U*}?6`q=JlڱsE-~-T.gbl+f@ ;NgZ8ms Vm*FۨTw|-čƓ3kc[Ls5/8*߄-s?54?ہ)o1VJqH3``{Y V< .AE,wVH_V\X>gdXvҐ~Ri8K 4Yx*:Lim5ǎXcvfS d1 g{:WzY{q\;(+pHťYJΐ-7+CCupWC#dՌ{+3LOaD6?xOS:z>&%? ^}鮯7̀6plP$Ξ)Oֲ;};?][r`VzY5];*O v?,lF'gRFš5]ݬ$次"[.J!|_g'ZI 4pyG>WgeShd@dq7G0% KNC$#qbB 'GvdE}QFк8^p$1b',IG{PzS<*urʾp!53˛='U[)Q)5q\~Ќjى<ߺ}b՘zܓꙨ*$n[ZA:;;Jdܗq&Z`7ўD="WNS/d6= Ʌ|Zed/B"{U擬2ϜFǪ3xn L%5MY@R!4o0exM&n,3 o_C3u7DI=@./ 7Mڪ"1J @VfVK iy]w D*nrU`8hfuĉz* Ot z7.rl*IA֨%cZ@'#:&FS%|k] #`Æ%>x(M<~1DATw[m)e5O͔ u_ۉ ߾o[αf(w +tKBvI@r{ba1JILuI-m)ԔBDB-:@tIO@T;'o#|ij"w|ژ^j /SU$ł;JרAβg@rfbi,JmzG&{A". =c,uYOxd՝}I#1nW Bݘ7o]Ž1n(!ˠ^*!jo "cC&v 9jh?Ɠb!5_Ǹ,T9 0CUңT*90GNjVp4Z׈< `H8c bEH;9> |0bDͽ{ilUoӥ7O"irzX+Z5'nN}-/)GAbv鴸S `>fzYI<ǦNcL6"-6y?yY +UIoFB6?A/0L3Y3-Gԍ}x韙e\DBK\ 2hP}.xDuLk?6Z_'<>BrC5&"d},fE%}NW#з-ޣd}JlpyCv7K) 2 EE ͪyG=A}t]>4 |!+N'"׾e/cehgF MOɆ!IvW\N*aJ)ܕt}L;H\-R官xBJ,OX03}ٶ}-1 DECF6K DP,M}="#K։"['z!T>l !Z",J`.Cv[{xX)mf(Qx8u?OTZ>oTko" 9E]ۚ\v\ [, XJꙻGoX RVKy\EL4•԰W }K kPhaquDO?]ޏ[o ]&Ze#CE𿀮'˽؇=xDVz׺Rf(Jm G){3]ؒwfPM\/g,V1 9 O$k9G HNR] &UަD%_u U 0 +֬{~-Ͼ熍Վxd ԟ_ctaϳ Df6YCjjOcWb(=_x!(!!qN4Pt#X*ONo:<~m$X: wvO__rJakx R`].&6}JAu/>3\YXE(N˛g}mDպujхOTȇQTI}tl:1(?#s$Q5O/TH9$,bIbFP|2æđUoF͌nyba_M~ yx3hgKM,GhlSS f]im[AF k&D]fHg|5N@ έVs!!>5LrPp^zw*A -imK}B=F{`S9ZA Il3{ֈOl{5Y/5!.Q-)I\vKAD~ 컼ă|4s-P4$91WzЦ013{(f7Ǟɷ.N/Q g_]zB̒6sqpȵP3'97= ̭N2d˜.\FfaClu_J\ 闩LrpYQ ܇xV}aF7p̘ P CF?/KyX,My¯{J5Y ұ(u^5U"$ʥ% W)'.QqÑ&Ւ -ZQQL=]ɛpS20\7w'(7:gdoۗk(tΊb"˜EqߵlzwoY?o,(xr|!TYL,a& R;+oq} g9E(5pA a Fa|?0ZSz=C%f}a 'b@+ٞ&pS܃"ȫz֧IUMXO9^{zy2z7AxDUG*k"xVQjj ~߫&Be uPX9}D4Vcg&Uц;=m #Z&>͞fnKz{\*_Al=$},쫆E3OG. `rJ)n <ePz%`FAMpaYpQb*)́P9@+g4N:QSK:fd5Bl bQDqDFj=#R.\c[FPCWn%8gUƨTy8x pP2_j֠]iM-vJiRJh?U1ϗQ? b/EQxKtj DkNC*? >o:(wK}=DZ 4z˅{6n8S"':뙰 ^Y)s tq>#JgWWcHca[;Rfb@|@)eL ;$-S0*'!Svm Iur ﶏLhx腾.ID 8?),f9aK 'ML%Z0K~ឰUN1EAieSJ4gd&24ܵ8ƻ$⁷pBɚrVA_Dbh>l[M& Oڂԡ)i{?-]7YS' P1&~ˀpnd߿)kJ {{ְ|q]YQ}Ɂͩ1fL %F')n]hl*Ʀ2n:&#}ý?YW /?OF?c#'i@592e)OQmGWJ;K<_PUKMeBOVRb%9@j.T\eI6_ ܷpU I拉"nYUS8{4[.KW22#o\Fw}qg9 RM$J#OʼnA/mU\sWD'tt"):(qff(Mҥ7ހMJaI*ո'^rH +O4* jO%HjJFnpu2 `!v1̳UTV\jt`KCV;cīugF"aH×MyHј[]>#2-_ !m\'O>KjjiW:g䮤r²/YJ9Lj $%}?nV2up<_ 7Hz^'Di`nZ*c0"$ضD\gzbzMT;2AW 4RymRH[Q$W U^=1_4Lvw5mEV[/0L\P-FkC1@ 7|kw^{SYd]Zu SiejB;杍Y $3)w<"?G? %:Crjz$- IH w{ɓjB_KkۢT .n,hRj5z^#"EQ6 ny{$9d\)'n@\,=SF ")?{9ԦV)@^&F{pyY$ [,LGw%H%{)* vpҎ,DZ4I/ݗ{M%`7K1>!߫cԞ,GVZx?1ף}>j֮O dS, tҖ=5 W ܸt̛wݗ 9̃4(J0^뒾WDw)3Yf'u|W i S35=ؤqK|jcmWT a12D7\^.W֛eMS3͖`+D_~1B~qQFarW#Z~|2LA[RLlLP|--"'VU•j eVsڜj \Fvn|ܽXKGj`*acAfV`$b,Htui)>-Sd̙+xߐM)`Q,f7%]x.u΢Yn7٫e#ڼP93Lf_%->PKUW6nK0x*<JXt\Z*Ux_7t@>7d _l^>OKw;Uk)2\l06xb(Twwk`خ} [g;V~-e9ry9jCAt~O%]q<h@`8m҃=|%:wQr!OPAu>ր[%iWcʈ\ /]{Ykb`C 5X%VWM$M#ތNG=VqR%9BtmSp*cFAD<6@s^8\ȲL#T UK킜Ke6lp9Un {%\Yj m",eo͛1kڲ=1.i0ju ơL !^jɉLZFjjbLضQu۩`,4$\$-J:hF~ˬwM0WPC_\ʍ+[{Q Pf引6 A#nơhމm0giΔ>,f3g VkAnetmЫ Sh_ qpz(I"Ȍ],G!@Ui8Tf﷼a+Iټ!ZHu h=BڣťOaxty>-xl0[|-Hmkί%} ;oKLj`sOXX4wmE]{*,@L ᬉi;]GtoWsZu0˥~h *@)۽`ɰg^ *'W~s+NnWNCeJdTO8yL+GiH)0b̏^kn=ڬ\< {VJqD; ~G=x^ \pvlmlls& QJTa.G|4@ >F ӕWim5 Fm/Rꥈ\\Iq`^6]S2;s q}s5 \j"WQ;?QV I>NI%,wv4<5TEoE|y $.Rwe*[_Q,#e, J9J= A`?nk5~5 e^kI?,f KۖaRѸrϓ¯d"Ab?eQ.$eUᬢpBt8LOW&JK721dͦa1Ũ$AQ%FH}$/IMjܕLR_YI^v K<MKy[*Zz`:"9,+xLjZanje}:yOգ_AIAlLLwOWCR &aĝӑ;ĕ +jxPE=?tFW'r\R̓3)G$oCz2% bbNA,޽ EGas֦EA򦗉VP8\d(F ƥЬptJkNYMi7*zIf-ndC`$`C\>`smB -'$&,7!1c L2u 㝥H~~dF7utv VREژ8֯=׽Guc Ao֨YpXBz`1jSUi-:0!CKȣ{)ˬd@4 ]"_>&!t,G[(@L(aK(N']9fn恃yCuTc]UOsdsj<.@_H/'nG􇑵#rCWa-D_ 砂4R3{…;{Ȍ0YXAЏb,U$l`)ߘdlbooT ;:$ռ|q䖚]etr#S| 7Y]5Ԏ _UjaIfTۖ&1s&wSA譡RVLRPS]SC'W)dH/!20kJH y^L~cɲ(l/TPӧ):k7έyb Q8V u5xUEIu1/ 1p3Q(ŵbֳjq6\4 j^_]):QmX)[rwU]e[ t4gqg֫׭2CRޒ))\纜tā9|/F^#}ci7oyrwI@lfS>3{uEP BC£J\SAP3#הYRRBELv#;/ʁ|/ <eܯ0hk{2Ĕ[[g~r$rxb9~-óQlD3×pHSY%1[NjGGעk?HHK tӿHE]s#FQq&QJ {W,.<-m:|kjqEy8dxw}.ĦséqM(5 LkĿ[  Q/;`O[ahq MDǸ]'b2H+G2jdKmķ.8~C HM[V3[lӱv-1F}  F$ U@NJ ҐsAvȗq|8ոi%fj;TBu ׭N]Fz6 kLpBpAho/9<4FhSUPvNѯ1^G],шOU^a n| q& ln ZrYQ㹢rY0aXqwKlR HqHZ}(,j1^ZRM0h=,g?dh03at"Joݺ^ &rՁ>M!YE+˔@-[a 0DЀMճ24*l2+njI,Egk9\8o(m9}nV "F NLf*90sD@}'vx P[(hޢ2֋17M`4eօsU  c2纶[Nkw/҈IP/M&sX詜BO! c$ų8:& U`r?Q >ZYB2u{OӡZ8{CrX>9 LcԂX,u!hg;{!K xb_7e?Ѩ\U2qx(,wf2eRa{ ݙGyPEM2nGq͂l{K`D9O7sMGtl:1CשO9?ZѴbDHtsc:q%WB̟C|E3|EsE3/+ap~ 'L!d~)AM$1O`BV:TSv/D,*0_;HP 6h[|`U݃>9f LV._)>}FlyWNߺf {hXZ\;*Mu'O J`6:_W;q%b+[#?"Cz;nKf a[j˅`>vqS Xc3kqC*rIC>6q]rvnyTF0v,J^ShB BG9'MS)Y&KА#( b4>֙?~K#4ѻgIcGPu辮2:_=M,Å Ti*ҫ0X.M#-.GP^W OmD~Uq@p@Xq6差G|!TX7CwnFʪTJRrxh:Y&^>B~Dc*XOѺ{e0F@M\qߺyzc<~-WO^X&pb,@ M5Z6; lDrcz,7Y"1uZ^Y&Egg?w]:ٛY#8UI]Û@7(R SyihqBT̶;އZS(;9Kmw]Lq*XXc!9o$曛 ,+x13atȃnc:." CAav7zY4[gp1h[BӢJ:Ce-62(¯a71 ŭ~uffۦɚז `)?rқ5D,~oF ryPt=UO޽&O,2H3-IdJgLD *2ٮ`,)X{7 }zX^ /@"k OX;R2EsP]5H22ɟIkKer6KZn >)lw*2I !pCN^o`v ;8Z_$( JI'ݧ5I&xk}D#۸זbQFvDC,VjA$=xg*‰\2U x7>Qm*JF}uxu +gvU sh}!m /_Rh/<N|^ O*'vD0D m1Wɂw[ sIp}@d haTµǗEGWY{utpUeA ?BS$ԫˠ"9=H^x^gґVay`EE7|*j)O$V&girE9",eh-a@ !C ,"%jIG:̕)p?O``dOAJh?,v<_ž lUiDk8f=,ܲ yR;oPݎr_kU@rnIsm\EJ8s,5[ 8/֬'lJHu]}[]fZt~\B+3h宺耜:%=.-Ht#eJ&ܮfrԾǒP;?Z+6gPz:AbjoAfo3]:1ǥn˩im|P_XxHG8U`pqIE}kٱGzUY̝ 3B\F$IJkjj<^ DnRr}/(O֡)u3*(6*t1hvD,(*Ҕ.dX$>sIi[n Mg4e/^`2qY_9nʫ5Y Dh?=s v |SE,V2'}DD]\4._;mxIRCȰmG#DC|!4 ~ہ!F4Mޠu ^4GJψnzg9gڊL3'˻#MV8/X0}nUQgm_,2R;g]*K&K»O~3 sh;V{daP9+ GC \i77~.L@L_i 溨ȩ ZY 6{cu+`Bs`w#,lbzQztܕ=>@ z.`gv>gbXemPCx{@Çw]??D<~A|9F볆|i}͟E3m{/Z@n,ZՆ4)@m jB_|u|+ ?.`v#kQD89;z?mxy5DE~n`p۸>T=!S*E}ѣ)XZ['ƩJo2p a4k]ն;{ENۭ֦rVm~: ҥ* xԄʭakAe;1E=a1[H79 tƢ&a2R[1Ha˒"˔L:!JYkxGEKGP3D/!}MDӸfX@f4 P\DPJan~۠vMں@2kÌl!LMW)7`|Ql /gVs3蠡 bbe~ 8YX]t3yVUt<'Juܕ* Ax/lRI)j˖On+{G^ AW?C1ID WP*@=v.Wv1AQ@WQZOOO Bb |v=0Iwu,?!V[&`5:գԖqV.qn\( 8fr2 FOOЋ .ݲH_07VLBZREC#J g:ۿ;gf*70m>r_}Hs3c@cjʘ=^Y)BA]Ql=-+}H=JSw?T2lJ* }O~ˑ3OpXhLaW\Ƌ'XjݎAܫ* "a']셿W!]UxY \:s {;$P:I &u(<Ҽ(zݜpce8'_ bR]QQX[h1MjLi{pw{o)T: }zhSQgpI=K^,Ef>gMv9s롏6XTz)7$$ҠʮLĠ#F@PPLXW{b!y֢?%#4ty2NmEwHGj ,]^<^#ɟ(cM;*jwWCg`sjln :>jZXj> Ei0c FЫq6W矑H <54X 7ν0ė\h{@Vǀ A0l˄cf Tޢfr=Gv^И!({W+*ʝ"VP#tu> 'UrXC|GEx\Ur A8wOƱ/& jȲʲ4=RXBA;;QksҤb͝ڹ%c, 22rhf4uQ7a/- cg6T᪩$ Eb;bv߂UÿlUz-%Bg:2[  g}!E H'/ OG3cΰM8)RQ2kj\1n_&2xq|",GD@8/ݡb*y2\2vbό ybyE :'dw!@ <-ӣIĮ]hΝqr!| ɰ╠jlg\pٯjѸf9K| ueu-YRrN]kp;`S+F܋A%OMmp18AQQ]͡'xkA0pg6%5`8^s2SԱD8ُE}P*;0-ZPQ55*3jn!<_)/Nd7ۺ ?v=5MX]CuOu&(-I,Ӂ_Q-ȬHZa7xjA{k62]:W4(tX u|W|*.WQgkr䕄| &\蔏~=˴d\;# -J.xD1MyN8xS;qh9x2\T!y72^ju2PTVc^PENmBqnEB'NV 3f}eY=r{K+Jpˉg9g皇䣩}G<*/֏&cP6gWW*$?PQDg\DʿrxsSMD a70Plا&V; _@)n@W;0a8N!\7A I Re0!/F83"ǖc#n72H䘿 [I6SWPF'pqh(*΄zԇp0֙۴yd:bnt^r,_3*t1d']sA_gP&cb~{"¨p_vzF<NcPPi\ \b؇acQz:+bs垼in<dp6|a$zi~ /0_0s[/ ]̈`'#e$ˉ.!i3Ch\VZg/] pcWA˯~Ie5B//ãyv?P!qquMN36$dGZHR֏ZzaUTNf陞\B$Ӫhs6&0}#z8Qz]8j߆/J!_Ccmh{pk)|hfVPKi"%7D% ]RsJYiU'k$'9? 5$<CƔfQ,o[!=DzkˎfPնܦUe0Ż^ဇ(M-D>D+L~Kw^^Mڝ5|7@f *pUu>e_`I2 wc"CxL=nĐ:3=˨,NjmV2Jf.\j\){44p7$کLYy9+ Q2䚑*ais&W QI\h^lK4tmi +sAuytKXx*A{J9\ɠD&iP=k=gX8{/5p}a|5 1B}(xšb\= ^<=1dQvD~Ra'Sv{v%>ncOFsμnOnJq ˳fТԝT{lQD/8m!f[h)@C{i=[H%2-~H^^P*WMd`0I^Q4me3"Vyc hJq2]T5tmBB 쾼5!7]1=Qsg*k+f S3RgK/(*kub  | vʐ.W3ê0 Lf-5sQ3a>=HYȜ2ץF3k dB%9nxG؍yS#FU-;DQZ'(hEm#.-BYk^ywK5qR2*ȥ i{&Wj?e\W§Ei}[pF1:f׻RqGEۤ(gKo5h-Q u%PĔ]t5[EI%tkJ [gz%)u\̸VC-p}tS4T-3iK~*[z" 25ٳZ0O;s_Na>b&Q/;s4dweBkq\4ܲnH{s.@RM%qұ?os*w[QJZ^Cg%; .eI1J7{qzĩ*sA@[ÁBHdSߨѿ V'#/ҥ{AF`-rB8<%lQA{G/,Y7 梩bc`VyRX1z#0fϸ3,-W6{nO[Ta ox^& 3?p&˛a, 5y$|0&`ǩlDHΕTfI+yN g+=kUw!u߉ۯZU"=_읐=a-WNX^ 0oGnՊ׏l# c'ށGh\=JTkZY6g1 I[\bk&Q NE!|]ЛNi蚞3.,]yU:re128lú\۹=P޺եG6lW`$ѧyĹFz! .lH]\΋Q)Q.LKd=#֤JM߈=8<ܠd@Cǘ@-s`)CIΤH# G*e]Q{AYЍQb_ ,q7uSːdN +P%y$] {GD؁rGJU*`ͯ}6p0SiGsQǘK]xM0Ξ(X~(k(?9ڐѺ^B+G$8 4U LhK,SS'7*;h%7ous)LTBպ3%62R+=ṫ}OK)}(gth& 㹌%95Cԡ>_WP6MJŵofeرGO&N[Asߨ=Iv+YtiY]kfV0.ga@㐺M)t^K"(`[ Գ-HX;s̯|#,!= cE42WEE2RuOZF v`{\$`)x `kZrX8yjhVS)h֯YO:wi +dn81!dǛidG칷H@u./߾y%؉8ᅭOdL_'b4,\A{7! Nj1lf L2U_L#򣬞PtvH߃@`,+pщ$K ,X*b 0j5 v~ѿ𔿢A3$SMg}̢#8N<|9y_9ٌnă5i45`b,&n%!0,dS` BpQHG.6+Wx{s9O7td5vŝg@@'&=1aL\heXXɰL.>Ƞfo93mo\U(1cU)s mG)ïM0R{|Sw!føV=iP=jʌ1V17CEB܉Gtؽ RQ"" 6mӯٸh^} B0ΰv;ۡ)Sj-- )a#')T>Y t))ޠ`DEU'X`%O!„j:_G3@;]Aby>5JY1:rЯAX>" _pvŠ ( LN $njХ* l] f%ͯy9bBl^]\;O=JHJ:Wև:OލPE:nh}/۷ט((v-4nUK7PQmPz>Ϟdy3wXqW1L\w>&*RGd:?;<]'w`ΰ _q!{B\k{/=iv8vu%'^P%ɬ2Q#cw\ms'F kXR_k[<:SNbLMP+:gkke'qx=C|-qxtJ`  w!s^G>I<> %QZHi*s4'v^"SOL'isdwlh;e#C973{ϮjMq7݌q͡pe壻ymj&y4Oҏ[C 3-A%1F]ƇM cNtf,n6FwmEyu}7\mYwsC~α|83 ~z.mDG|:U KxG=~)aj) Y׀}\BHASTZ8oCbD@3 hP'=pl Pص|E)]FC;wg.Ea u˰;7V9hÒh\/%<7<"p0O$5S8ý:HZHCˋQ2K>3_glr1 z 7yÆZNS^AchuVtElrHRZ66K!B_LуsrJ 0NvDXǽFK×P<(cMTÊn9kGN+o39jpYH F)"9#H9{; IPVz՚Mf8^KRh#0MqSжQ ǧ9F3/QE7oy]dڷ1D>ճQRPNT<\:EapRHʩ12 hVhgbWAtq8-oɵb=)r]y" $ *@JZu,Sbȿ"\{Zoa xFr|TY*,x;07JdD/,TY kX<3:uGRr6~Q^5^6u"1q#zp,)(@H8|3@4Pf!+tuI^)X*>w5f.s)E+"碀M>F$m1qKDߟ݂fg "f~n8cXyGY1/CfoK2< hg6Yf|Mi,oiyD0p L6-]g)Bfq"aA|}?U[ Y|Z&[:69ZʿQa2%(*uk\ r*#%lАfu6Ʈφ_ VdԶ;ICUCf^/w!xmdމK1]'Oq_#KKio 6P&ߞQoyXБ0rDXOl 5K;d?s_%/LM#rlX<~/moyO1x2#0cJfyBSnUDM Lw5on ZRNMRXsd/Ow%wQQoiF 5[+MkAI$Bk] npF xJQJߜHop$pmFa=+R ʖJ֞!Mb܀(&$wB E7Hn,fq7ԂWBqjVEd/_y'HΜQhm$q@ADd "Sb7RiEf>7Ɵf "Hz}l $oHƥ%œL4aƖhǍx":@ BJk2S`pJԾJgɡzo c0s8hkn%Pa9tdsVjwNJY8Ϭ\ e1.l®̝'RȚ+Nj܈Q,9l_GGUn*7DA,]Jʐj9. ƨ73 TP%NI*WVlI͂Ή;$T3zvaYb\ NK yxah"^Cvfh7;A ܊dwvTAD`h2@ۊ9G2)Sk/Qs viEL'ag瓂TlTbI`8M}B 2ZfguqGW쒫 ,o|l1fDZGvp æxŸ@( .B~T+syјj ,?#`g09 &n9fSZvejAgDQX*bLήʖxM lvVS{Kq= Ȑ)7VWa7P70ɪ|CV %uFFD}WRu8 bqz.`奼.Zr/ 1_J?eRLe<AcM8:@2 sa%l_ ѸVA%o47P+SO @15r yGx_3vCjMsHrk\RCױpKIP{z琍?]F+|_ǂ_0k?ـ:A,|o f9[DzRz-4` JD.S.C, s#zSu`9+I@_]_}yϏ.*gZAw2 N92>]U7G /U-Fٮ.*l:MxY_&a8abe,mb,ш( ‘-g\suzh2ht+Ve'NqoRyȒx'Ǩܞ9ъW##ym$),l`\k8C_ Nv'w-C}]s LAEn<<&EOl.EFItB_`Noi(\[kĚtPMcͤPZ;I' ihXR-n.F&sxaX9"^Ter%jV.eK< ,9-ۘuidC_uY81 2vŤݓ8Pqnz(5u@b)&W+ $R75l e+JXjݣn`:ÖЙc;cehHfo.Jfc='֩R|c.=d*+&-,m834,|mO^8B_2YᒗXfS ;D;)1eǞM ]E U?ޅx_ $KjB_|xp+R"#1Ԧt>gpq>Zf5G*1z3Cc9wgt*VH + q@[.9[~\&:P&јkwZSM@yd;f.=Pꎾ=XY+2/ n/j˧ԧ81$gcj^`6b+G=7qjkiűFMTkb|@Oҿ \"*j:PU'#_"jAe8Oo+k^l\!V0PWΫJΩ_?|Cu݉ uUȱSEZ@jnuBWd6RNuc7IT0z?D)_xX\m'qW4]$ehfGߩJ}h&zcȵppæ&1L٠5in}IZc MI?^[-|D͊[*ya4jӳ\4F/Y ?mVg9%Ƙ+)2N eh'M Z+ݕ8G1X^)y"t?{ {ccq“RluSЛASkŋ$$^SԹv(0o5>~u*ؔ ,pr̽EyE O?l<ܜr U-Ϋʭkj3c۬jEWR9G+Uݙ;~5_·XRe76U|]%*ι M6UMߔ%*=wCfs!%dߚŲStկG FlEm|uy%ߕO%,=IRrY4C3K&SLDRؙ ;pߗwR-n!b黸޸HK-=Sry0(~̜o9)׫19(rvN{<ྒ<<\эJ( M59q&avH\VuUBM,qU??d?rc-1RsҸ:^@"bg4HgJ#D4R 6E~L7fL*e=Lg;jFB'' s+)5*Bn\n$ p%rQ@44^ {-,3lpN#ъs!(nօ|=CAa x],]%=^};ғ*s?@0欺wPgT{WfHy?38_oK䞘7"5u7Ԝ4 }O@Hz ;wg\fՐeWmh+=Ց,%h~H/CC; ʦUخMtu= E?jc:C2с0 oR[%r- ;^ކ_T<$#~29vWUvhQ,]j?0<%>ˑt;U4I=[˥GRg,rFEMX!3 1e[ l6dbIPEᾔyLcVAtm"PjC;Px(85 Ot>F;aS"PUWq\brZ)aRɄ;97LTLBS ~ YS=ݏE̝ڌVS^(FwO4{-CSB_Zv6 9G7߰F0NiYJRpWeZۚdǎYjȂSj/(6,@~XT-P=Q4ZVׄ?~Fv!BRǨ;,X//T>JTY9|W}B-L{8xVhvZLq.x'mB'ƴ { :N\B0J9(#:V,w(Cj_g:~!2]&U*(CQJN~+4Qulǀ΢uîPGz)E0ܔ~u,=XVVTY"v\Dl*yFg>C2җujX2V)1}OǠP΋:~!/S׻`1k>"Tv1^)J潎j#ZR߿׸OұWseuHщ\܍>Ni(9ᷡSbΙ)6I3:1Q[s3;AV9p2YtwϷi~LָړQz˼UoABE5xhb5g(⎙Do1n'jtm݋M Jоġ !~k+$I/ E[4]u8_I9 Wfe t>5742A&;Ͻ6e L.sY5TҽW"^H囬s$7k;s,JnWaΊi|?Ύ |@8mCĔmdbar<7[aqFuw'y*&/PUd)K _݋tڊS}&^X;JTLID9 iCdg&voN4=蚎ot6 h3qַ OoAPIAhL[}ǘ*͓pnM%jw}&tdi<KT 6`r8Kn2|u=wܧQ /.&?XR /a](KL3SmеC6fFAMA bjze G45<5a#D!e&xbrEp0ЙH [#9d׶?"lK@(nf'BȸݎS7S{~+gur;9{}ZPuc(j-_OF=#^)0!@~N'$pV;j*ɱN6˼N`A7UCZ)wdq,Bt-`[Ea o_UDV9' @U Vq3NCF@mzihD3ZQuQFfHXFA@;H'7<%yF^\Z-jP uBZU32S,)a'(Lnj݋ V8V7Svƀ:.YwpnBe.E _wD Ty|.OMeT-03 R?[Vz # ۀI凍YUՁ7%5֌MUҬ*.z'·S}ftxgOFgꇑ$棋n_yT ͗?.ZZA/ܠ`3x~~*E,y3I9Y#{҇ٺrZ=ԙAܚ?VcW$>$9x^#ʃY9$HK[@ Y\9tʘ:l!bwǩџ7FxJӉƥ=<<3[} -e.Z~Qݾ`-jB<YƮ<wNX700rI;a6hj9}Ĺ 5'obF{l1`}Tٺb3o0ƌtzQK)Ѹ/`\rщ.]aM9j+{,M̘ H-x»&| Y;2'.q?ײԧJQR+sOcUS+3O2%¦iVFŷ; tU14Z[:r:ӎFYVNAj;ЅiLɺ~ZXkC5RM:-;y? JF52i19hQx@ B< ئa?'}]ӥMh/Q\ܖ#kH9ki k=qԇ˫[cHMg"'wZI[G9Wz@ssɓ2)j쁍(jEVYSw0>tMqS2Zpt +OA&eU! B8>_ Z/aiVoq^) IػNR]*ޒ AE'lݭ>/}6Ap*swᲢnÔFc9i0I/^0lG?X+H l4QkhξB_„?FBDTVh3s<ZlW:18xA6DRÎ7ԏ\Yr_gD¡ ʺjDX6`Em>Mp!aJq4dFM}7+"q, ɷm,Sta%*7 Bmc'ٞ<^a /, 1n?zׂ,(&٣PDD zy0'S >T2M~BO_Q;*liQ#^$VnΗ7$D)ʻfγwBN`(0hDV0ёc,.yjS=Gb͇%iɻJ)U!˖+ +b]tZ vJLBEc v3oig܃q*=t`uX- xqCRT9ENR7T)K^r]G#]n>m,Wj5Z[<+#$ 0Љ@Uȶ1 DIaX Mҍ1wQJ:w 52 i9BO!-y',_'!Fתےh.oav$nJűOncV3p2N(k0yPd@`ReBtNu ⧂q@[ H 1YჄ3큆WDazg#^WM'Hs2:rxo;M ,`ex\G̣ڷ/4v҈>D]_HFn7GCE-k };99ɮ' +siB_-6}L8(; UcH?BC3X[,"(G;&|a6b8[4'qCk2aY"'I-k vRl ca/hբPBgSsgLj,f__ұ4Heb}Z'Cf MR7&[@HY<aK~ڧy*˖^i\I7iބYrC}lmx{j|=Ma} :ub \F0U])O6)9M4WkҏMjQD+_LdM2Eqcv!.$O3֘Teit@DAD#!\ l/A !#<,wхm@dƧN\Oå[NL`G8qq &2#g(tbCNo?- ӍT,w.=m*G_s6 Ƨ5w;̛,Aq{V*K멃ad540b3 îwc6DF`ljY80WY9\O*+ѵ\ՏUf &~/S~ҀF$ɉ$ H _y5נ$I%_#{G{+shW}uwu;iʔOg+ `KWPBpg#=gIHwN^j}xD| d4LJܑ tǖxY<{ѡ^6JC;upe8w'sACQZtUзJDWdR;:AP_]g쥯BVPJ"SJr@Ca/~g@1t} ;J Wi4̈́>T1cOe9Tx߂MJZg#C.5}1)`=)@n̷XFU"Zo )fSSb D<".f X%`рEf׻]BoM:YεSf)k'V,KtSnXXb!HfP9_mBŔWeUDl-{&5yZ4[FsK;< <eC{d¢;FJ5RN(+ݶWv"6mV{TN `{oJ; ?0=0+7hr'U}ɤ ͏Z.c99"RQ?FYAo~0&P;SID9hreaڊ+\ ~5wwH o Cakxs]{'ؤfRi`ьЯ-IUOSP P_B) jل  +Ч[{3zfS+ tGD:~Gpjp&ܤo)"ɴcPaEU9dվ|<8 9Z3xp9 l#0X@>8'5g:4B H[DoQ'|;Q%m93j5Ly{-H:JYuAW'.=Q6A ^4dfQjο== qlYK+]|x>T9e&l)/TP38z+LO< mޣ).Tm%/;mЭ>zӨOx[S7- !t$Kzo'P(ޘw٤3)I9x+~\ XӬMf7^ֿC 08d{GS(, ڗӿ)T0@|!l|rBN̒BtXU@. ?îIlt+|?\&lsZe#~=Sx3Td)Ͳ%wGD.=ߟ4Vt!X)(jF'zx.B'7%nj w{W".`{Xc1ԴN⽿9`zu]'VdOHAlcn 4^' y# ⚰f2Й0SfPl(+&~•t+rѬŢ9\A]R{o9GI\>@UϐgiQ e뙘RJL$k+zI!텎1!عnr1뤬JzV/Ĝ9ҧQk,-ԅ4_ xFL2~Zyu@Fos7W𬝯~wI($P*ۘ'87+39s$(3\;l,0Tf+6F 6wӸA;" h  4`bDqyԏ`c+8]zBpr>e/"XjɺQըZN%SVʂVLZEpZxg>=&N}j٣8_Ԝ}z@pgbC7&I;/z=\ >gB &WǹT EȢ+]݀oU{S욀mss:^â4~a0HM~9I\:q抔b5rtH8(< h]s{deQhMU ߀v*Ɯ}:X;Ҁ[8UOFܫ8%Y>CmMQz0hŨ>I$e/!ˡaϫe[M>!`dIc(.B5OH7|.ۋY;xp W<" [P@# 3f6jO.>d7v +Kq ^ u+Fx:]\F}2c4$þ?zCXvvvն'먺2Jb/O~/+"^RWX_P+af l$ V9p+ GPE Ub+JMjU5L!2=)̜ ’g#Q2e YvXdoIf|o1`r/P_ fD 5Xb8O~3 ^s=oWhX'0-99EL:ݖbRqv^E)Ƈh`Եg?`B~D5VYr|&Rq!x-ȴsE/wp;4`oS rB\)cgG _.g!ڨvWZmS Vn7$6ljKJ L}jfUIM=I̘yT9ڕ,[*Xm8(nvPݖqu$ѵ@ɬM;썵%_i~|S*} T^yi~>apů4&JW?N¯ua^M 'T7?}>ߑ0p,.^f9Lֵ]'0wKٗ"@뎰ў&럔:uX@80Еq=o~ ȉXײ~GoBJqc2XCVM[|c7# `X`G蠒}dvC?>BѲ8'qIEqqIG<ďeCZ키?ƍǃמ?fGµV#"Tf-DgodDnq&>}j +e }K7[3k14 d2Zf b0#ymrn$ӳUS5"$nuKhᗭ i˹` b_ݦ7`I_iv$IX,ػ(xX,K9n\ e?!}~B3M[\#oP)3#?6M2H5&0I@zW"СK͵a]'7R:AWHa6cQ31︒tMXB* I(1f\6g sh$±-innY N ΂݂缷 Ղ!0˩LԱZRI:@tzTEI3 ^En4zw%iļ\4e.j$AU$.b?ڲ<.%O @ϭ)1vR\԰8blܮ#YP>?V-v?烵^9C$3ʟZ$,Y)CFI v'iz#F+ ᜘I۲z!c/ 3萉i^誣p/i]ˮ%qM .V".Wj.ࡰsf]E_>pxhGi#29fZ9Z#ګÂqGe\Yx7M%c{?ObRl8a@A1U8K|p+}e4jz"=~Nw6-2>-tk#e+A9^ x~j,4R !1e s"[VA"l TFD/b-cY0'}k^~.Lq5)5[%Ӳ3N w&͏TZ:iHP+D]bDxnljIH -$*^fTxw3RHt dl6@vRxwMn!7nI^*i".#u,*9KO2qr!(seX/̙<ޱg⦈mfQ %mIJ5ދ |/8 ($hrEXwգogqO k"`="VaJ3 |9R?##A|fs!?<\EXdi[g;{@XR>sLUDҨ[~7b8,,lz2[6fi7%CrZ3:(D~ع]$$| DFEfÚ@O)w?97D{52P~ȽZT[L@ZX\KocbE<~f$v}b91R\|-`z:>(Yk6D+2;ƲG~n0 &\ %U"ɉ]g :|<)͐VIJ#(Cr0ja{G^hۺ;q)T8HЮK_}ߨ6w{u/)ᗻA0*(D%F2df}WX{]%`nv9H,═]/d M iݴV%ONy. |;1O!GWWH"D g1yɐ"Bw5)oC^D* 4ƃ܉z +f>p>@B9NZ7UPì6TgZh17ŋ:J N,&8M)HppilAP)~x[bw:g=EWH!K4|&URH_p `迮p? yu_dӝ3 O_;D{ x|48`Oh3rJ !1nlf 1^. 픐_V`=1s8fh[; {f7op^Q~ClUm㫠f[hDE8*j@΂J}=E "@%͌: %H+Bn(}耊|y)",b]ᨬ`I{^ )sYP(/^$* ӵ vR.RTFP>[sq88h){,=x9CSjW(+Ejaph`kב++40-˥n c&ҝ9;קٓf 7,BC!?4' ˴L1NX`jI@ ey4^JCdm=8p)Dާz`1V>gNvʗQG}MʮeAB\RV@to-FqWoĕZUjݦK"CoϚhgfi:Gœfue_UL9,}UR*CNB uuDp`JTh9~=TI&Z7^U6/֕9t RTd{r ;^5?11rgwu(xt?-5#_;+lrcip-No=K.EYnX14G1&`mfS:[#8 s<8Z}W@f/\! zp_8z`?b<XvwW:\F%~c!VsǬ#}:%ȕB:09*Eԛְe&B_ǍH*RP8gO >-i+vbkA' UQ[MfzGw hjP6 9e$.ڔ-'k*Ѧ+ʓdP˪ja BAޓ7ۆ׽0e0*VҶSR$0M: @X B5yuYT(v~Հk֍o;7^mq颺ߏ/9 WβfL0ei52C9XDc]c[?ܷ8EPs!ZܱF XN(@:?>_7O_>J}_9hޢҌ֏\a@`㚽L ro-%hKL?ZAJBi`#+C:B&wtLDv52L;,/f~$^9D_7dq1éH4"|%z"(Y2_'t8^F¤ 9E=I>1rȋםL&a-wX|q,@?%7Đy?q ّEoڜh8og{ ǻ .R&gvDvH$jS۴{M࿸ A uV|TE|x]k|1049g @҆~]Ciċv~T(]f,mZ+M|/=pڐ +g$kGG&5V.v'ζ^o`TF:uX 9JsyAi5B7'c?1s=®]Ò%ޅDw'-@ZQ$5Ys!1v$TKyɝ|$.{@592?CAB]Nl0,pmmSc7%aT17Ĩ2QevU6ļi+XWoay~0*ÙVqp/+1>',Gdhm/ğl8#xQ6'wfMq]B*z\b9 O g_ J1t9N|AapgQ=u @j'J'@0Ya+7nV/ bKқ4+rHTY>l"<ȪD{󡾊8 ]/r4C M! ,`D1, T-򲜍c'0vgg5FB8%)i(?䬨82Q4qeaqE$]uF=:=<XOaMzHOm{]&aa:io[Pu xƩDŽ1en"W-lz?~?R:xʙR{5`!_ 4U>#F%pd'>Iv\$g}b[8c zGGkZqg~H:7 |^clB@餇o֡Zaҿ9g%D|ScHmtSƒ*Y~[i}{~\yv4{;rt X܎GM6`?U@UM/YqdF ]r%ٴIgx|9thMU?]Uw)r$t䊘PNtQKJtjal2ҙ0K짩v3]w$66>Sk ?xFyE3 ^+<`vjL_!UI?M])ӎ8;1~ a*w2&"@/2pY*21~BU.:g*fQ KڦU.3Z{ĝlb O+c&Օ.,$ZoR~D'7aȔ x˵3Uψ DҦu b=#c_n#(a\9LTs5JLq5k\ʼiN`TK˜}B?² Ycssy ~bc= Ǭ䨟^T SZt*-H$*r0X/H?**k:gHgVTP\ƫeRi7Sj2&kkq܋0(0Ai3I" G`Hu穗:ᗥ>0QS5Pӣx98,`,6M7uNy d[R2;s Gn()V<^ȇ AjftЭt3zrЫ6G;Ҿ,e=S} 'M$V #fn[(N$&itt2/_V*U웉$k Kٛ njtc43IB%ІjNT@|a7O%?'p)es-VIۍƭ쭁4ʺ)fP *0Af1 J&Gv[&"#f5ʑkMG]- 㚂Qёǻtr+8H7i~Ig =cd0e&v$?`˸xIn2dX! 4IR'xrw"^<9=\E&sUzzgV.52Œ'LO# ̺: CKҖYYdWB0Y1=skY(n:ա2 !6xsV\Jd7V$FoB %bP֜PQY~Nj[fý( %a6v).X[npj ^yr]e @B^@Cb&UP+znh!_7f10m tFh!!zd ƽkr3Qr \ũE+c\#F1爃沄6L]S AVRI'F>cMD%>O~V-U[]/TGsBs6tR4'|?O߈Sפl6j.h2PhM3Pks&f(Tݠ*-X‘$kjm7-geQ骿LW:b8sOb(HKA_e3}DСÔ QW.6y6UCYGTc(xe; 1 6cìr4}6֍i!ۯI W\Eh S^ڬ6#llS+iJbG Qp Z@(C2Z/P !CbG}O&±(LB?mByPPF@Ot̷Hulu򅝴V3bUF[+$SPd9V\hfmË'jS-9n@}cm)!=L'4,&USfCm8kD`ThWC=g^Y_\n_rl㘷!SCkwƍFy>Z~pH Շ<|[ Qdvg7NfõR1E|3r*IEz;9!զ@!B췤PZjBx5şy ,4D&iM0EOOt-#]nbHqق]*: 5u5n/z-,L*ZB)fTI⚱+ͭ`c#yԚY=Ǿԥ ͓H ! #D o ˌm'GHq.< (r]Fy=kDJ2.YF/\Hs &m(C6,ΊYPs;QȌfw ܑe4 SWkX$6ki5[G;28Q}*~n{rQ2JRk <"43>raf-iSC%T"u&ۡy6wᬉ0+ʹ?=B(| } MEJ3C\MSSv6_QiӘ%f`qh;qO7"\j0~qÎ[XY*HP$uU뻮}%*I{u%kYjy2] so>Nqz!_(}B7Q4e4tW٥s6lhsKuE~lMV"fkZEKrw:(#L8ș'zc$F|8z8a RJ'H=;F%?QAIAlL[֦ S}(*el,wxMll!#BǦw>H?;/(+p^ם+z4B%žU-Gγ}̎G,7Tң 9͈'ewD+wPw[C y]_t5=e08 rU;v͸GW4p}Y-*W˒ Q/,FMJ](.*dh}>9;+gtl'sֲaV hmLhU4=Z}"+;^+}H5#׀{, -֎D8wq%⿷1KYoYIYɤQŽFF}nsїV~FNP'8cݭķmt3=amy)nH ƝȤ;nP n@1J- \2;I #a5WE*^CƁ\Z'!utkNJo!FrduW >ǧ:Y]S{,$U$\ .ؖ5lJXݑ0&wz{%Okۚ!،76yس;vC{ Zˇ2H>ł8Cx)fӃ&$v`ܺ?8%#D C*`Du s[mkJoHívy̮ZW-AhGN氬ċpQ-Ek STB B0 _ ; -u9 <,X( }1`v,rEvIQNeG~&nD& @[W|(QU6ФrOc h6فA! >5a * jZ! G&~Nwcc/?:A2ԻK'tcPs$SYI.rqP\1^,~px$sWe7CDǔ )VK80w<sN"9y)0zMB'zL9;W D 1rHe ,?>9%OX,&;Ch.6--cʯ_te&- /jtcꝪ:Ajխ^eTۭXr싎:_yc{Y쨻 "_aVI6}XX@In+D) j-V9Yc t  f-97OEqZR[&wN=:N^5'lɢii8EJ]m=pͶzUb JM(濽ȕᆵqsO&5sLH2s#z:ag˜>7۱}vV I3^d] Rp(Y*ˇZ,Ht䍞^׭4M ~6'B[0x)m"p9RJK#|ռ3I9< .`/M’V)!3TpxM2L@B2u@?}@Wۙ6(EUKF6>AC{=Nr/2qJ#(K6-^>ޞN MT;xxCݺ/鰹?cJ` o],ǟt"CK$,>C:3P,iRf>($EHХEA$.0p7TE5w]A1rdmw{,4Nҷ}`́S] l:СJ\Y;--T4on}|g*hMIjBPYFMphsW aۺUI]=Wd`mQ/>뉰-[Pr ە8ESFPeX;)JE%AkZȔ.-Yg E՞i\+$ƕ<5Z&=5Rt: ä=UtJ`ܧ;Nμ >? _xWAE,LW ҁo*X01fC>XJ_Wpd~F1N`o-AΊ ϤXԤx킒1.sJ4Q~b&¯6`A gm?]ԖZSG &fU'Iji,{9TR`S99P6={iW,Lݥݙfe-fT2h @{iժ\ ye9o53'p=VaG)m}UҨވE wpApNTJHmJmTGn U/ ٛwN,XrBX7 $͸OKҍ)f6:X5 e#edd&%L ;dԲeaE[a+imDl8 @iKa1DsP6`>!ׂrM+LeqFm:4"4ھ7M6u/:}n3??/3fWAGZ=2se{k劥p;-g"CIz mmV;`畅һQ_$sO8tMmJ)(=ޣޝޗ>sᄁ$wDޣ ;WBg:𜑴÷y:w:8Ьv%UK+8 pɶBŹ6FtqxR~`1dV`]Eݘ+qܒ^E^쟰inT _Y I$ p?RA!\"X]ɼz3336|Q?:Om4U`hDPRzp :֫_궃G?uR޸ "+1 أ2aS Ƚ*ꊄrxeDְAE,9&꺫C7o\Jȸ]JIv%؅]6C5Pep3%Q/J_o|aːQNӵϏ#6go@a))T F {iK͒9rmf&Ze-R!"|_'y/ȳYp\l#Vv_΁XfD&++6Ky6o+]ˈ5Mr7ac;,lR(_Xig<sv=GiL.N)(p(MKLs+ EKҭ&p!& \ ,A7pE `fX5KC6vmDp,CKe'ߴ8k v;rίVPCr?Kg.K@ rPR=ՃgFu07QkPM5qʳa?^ *w=idOs{uXC=-F/ziTЧ"nwE(Cڑ7  3{-߶I_1U:G'`dvs_~aut\ѽZjE d,v.dVfZH1 6<-G|iѭvhJeߢ "eFg'iߨ X#]x6lJub]SmHZk C2c2K^!.)^<7J>J\n!UC ¬߃3 沶.fJe&e 0{=8Z׃6RY6W|$?C30dkpyǜloS28GwzâEu6E=?ZZ0`I,X qT%UANJFfOaf}0ȶZo~К*?1:\~Ztމ2ƈYWթfYܒKwQF5 QogD )_}ybL3{X VEbH4PR|Cd@U0cQU4š}mqO%?\aל+XtGnͿ#&hq:kp:WKˆkH.8^^q!Ӭʅ8%PZy1ϭ.Ua VXqī0l%"iA9I1ڴ*_6^E ;h읺~djƕhxnXS8W_KL&$UqݏQ5_)YJvN>XgْZoS_R6z`&']u|EN5q}l##O^u͞EՎ߲R}BYr$'`/ Wt4Ahґޔ28y@E*ނg(F/my@v‘yR/ Ѷa"mb6#P2CYx8~F\s\ntsj-C$Lҩ|m3%"𾧞SvPvGO.?2 !Zf. \wjtϾ,GAg8LʊzjRs5E#t1h\@*r}R<> WQsy!Op=7v)|M%|N/;1uvU]yDjjZy'Vflf U#TRs) K4s:Hu?r}z2͠Nۮm߁ g7[ra*Ş8.67,7"ݺE&ӈD w磜ae< j+@-s`&<'-vgM9W+z=Jf+  Ō9/|NR#[&ߏ 7=Z;SMY/m+hހy[>oC)'쨦xq\/ԓA [ߥXq3^sJ[dg[rl>F]pF]sH(9!M'SkDɻ덶E|lŔ%2AA%qx,={z,T̙[VMBy&&y$ )}2zrL1EW42:#Km HD/#G.l:cɚ ?+% d1\#|z#L'`N첇hqa_sEեn 9n&ٸn{ũ9]a=ڂoG&Ԑ6PW(N( }KIeT dB}knՖU"dWhA?`@a$P)g.SC0,A V6E=!wH6aS:4rf Qfܝwh&T& X%DLY\CZgf&.9}q i?wk\rh1wH7]?ۻ+j{ hW<{\Tl*X3|rUu񒚙yJּ5ySYp:x;c1K&5GL&,|М:Y #{o ;2saFN >43g'r<9g6rތܹ0ϗnܛg݇w7äN}ssFg_w/6AIAlLL)-^wY&=XLlwejJ/!ltSK7uW =GJ,ip'hxW*%#!e1J sQ3!]_\b='=q֤'$,TOP-fpu,x׻Dxf3WX3T 9\FmZ !Z@Ld?4 PlԜ.`?@/m)\?SNjⲎ*Cqy>HhRxx+t԰rLkuMOl%ݒ\ i]qq:,_:qu8-u_K'PŃ^,l_{t@|4xy|vz|_ީAE}!/Csx񬖍tpϡSݴq#s:z7{֫U׉|MѴRCi,krjjZӱ^cW`rKhn؏B)Φ+-xYՃ!'aFݥc}*ݑ k8flQQY7s/߰ S4y .ZodBb.ΘKj0DQm_iynr@D4ZM0kew|( F#ڮyxѸd){jѕͷ$3hڕ_%6(5/L 6_/#Xs΋"6-ۿyCP p/_ꕦ` 7Qa5#}ETv,5ps\|ă}M&{Y$\Ѕ}M7e3-GKGLb̴ UռƼ,; zPbU櫼s$1!̺xk;"=މɇ\<OT,Cz*ʷA+\i ]þln}<,aqˑo"& rD)ju +z%A@d|=@z7?\[о/Bҹ>c;C|րSKwO=]Aj0yJl3>|4T+ݤpɏ4Ϙʦ 9K~rH[} npA A3 ?CGҬ+d8`Sn5 r4H.kGECx^, ;x9 mo|t>#^ ;{_gVdGr>ֹ ŰBTr|嫾cEUT ƃ |,!zӕgUW&JKi72!>a'蝊wnc6`j^4e%@6-qG{ɻ{i:YZ0OgI-|>L~FV1Y!]O%pOcSh)IOYd5Q kOamq$"+85r̂˔@Gd)8BtX,n܏_(7Q *j˞[^*H:=$_N_[}FyUow~ wwA ^x 0l2g fFDkكӬL,Bڢ)M/>`wԕKp}@Del;}(s~J9]4o%:Jp{ɪfq>CQ^u0` $R d$#O/!x\W3)hy]c;#b+]ڭD7.Tb7+Si*d Px_]Kt^ ,3,SMDg BgsLmeo] A/|dM 3 `8nZX%a,֥v)xJ`RZ^/mu%]?\q ܪHqz90TybclpnxL؞z/΀Ёy=kʅ7 LuV>^s8*OrwmXÒ|0:u&b}}1NV@jͩ @w$XJlKhK<+& n{:,|#w؞B P _Bӟ\b`t! ;_SgkŊ*&d.BwlU(>zC7Z% pԲ5jDXجܚXd0[$^܏y@z !< _BJ" ͇?H~瘰 t7_\%N*(E^h>|fwF@AkwCx7֤ X Q5Io14Y@OEk髏 ;AOY ,-z74&E5ʍ"* e.k;;.n+c'c3Bi=f>>xZ (A̪T}Cc1g3Sq|F6̎q1HyM_=kֳ4*PkCOT` ϐ9 ?1qǻz:#~%\GzT U aHCaYhp18OR>_#fz#2 Z!TnW"=x TE5خ 9w[mW gcLj}-0Cg'zV1XaT &AeAs{so'WUekGTU'ĐBjt ?tFkQ!As,IP;9WG/xJU6U_T2d-v#ђf&& 37~*5xߕW3(!{F&^n@vP s"-j)1֢ǙΌڊݩtzyAk fkd'vV5ء%a0ESI]F 6H'.mWr]MDc(ïkvy`?ݙe^^5~\]8ymT,[50PzLO$35xtfkFo(K-sᄙ||u!?nF:J-/a)#ęﵬɳ-%-I \O Au2Xm 8j[-uznWyOwYqѲV4kvu}hJmm[j.IQ92h% Gb:/jHEW pYj+]; ֗2HN{65J3EGq=ُS2 WY=B U2=+eߖ3[pf-|> Ueq"l߳icKED5nqnpH+AG=NM[- U3`pIGмF9v ALgl=Cʜ7e{iŵ-Zv/AvK{t((p(7`LʝFȀcEvܲ ȳؚ`qY ts=ά*\;Y) .4qt6~v vI*7H4qaV9t+} ~wy.|d5y-:t+cy; -l sMQ/V> w@m'IM훡yUq|Gg;3J[BQzKg905+J箉%hx=pbw36XLK~w=.h1űQ9bl}(q(8GXJPb!q_ %€`bΖ(@dՃq)M9D/AzͩSuz PjBqUl]#`W[\DϏXzk4_boȰ//ɪy?W8}PG?13VZ;YpE+iʓcϿ+šh&\N5(~ ˝I/|IZp-_-ʢF}9 H&~`Fc\'\Nv3Pclio, #y3Y|e:vu'º!0cqa-!o \J/K4DM Gĸ\ ?5&޷$# X*,i257J[#âDWܲοuaz@RZy&'t}`Ncddy^v1x{,Rf9_(Le+n6lo*!!J =9Ky)?|"dzVc+ ^>ܮO7Rat&M׹O!,u+aBcB!")zw"bKyF.l9t-x"W%jo'Q`E *)J7b7l[F(f3[\7=>WB>΋ިd.hfQ@nF0.vvm:恢oȃ<#nXaE*t,ypt@3T0u&eѽtŒc 3d>@t`>·aZW}#̘AҲ/jBx_"<_=bZ ƨX:>f/lD7GX!<3Q=Qgn4c#$H.uuȂ~@LSPR,[A[r3;:q[ 1\ sVs@V2Ct1ul>t*Zjм)L\nrMVQw O AI Re0!,\X-,%rf[{[,|72q7CJAUѬ-i%-:eV~$=M%^G_ m6kqjva)-)o/gAKuAD,*z~" g~b^U*1/v{m4-^_ Di>,$C,rhX5W8Ώ!bGjCTm4&6:Py՗ݘHa"Xe/0g!]E\gps$nm2)R]Ĭ9-,>2KڞP!frOeMP5]*Rlb㡸tm WxV#3\Bcaʼnpbd7x C+7TwoX+?[VבرRz9ҊP`\\F}rˮŐ?EvW.#`fR _Gl-Z6E%!I7˸2UWɠO(oGb\NiL2-a/mջC 4^-+b1@Ξ۬Y QSףo4]T@M)fyjS=Wƻ'fUÿ"̶qA\zaHCr^0⭓ >6_?ݠҰ]eۚp$J5ЗYc;F]R"PT\ L;9-.`a3sL/ޱajiEb6ƐW A]ݴ]Wq2T+I؄Z='0Y$0G1R1Īz(R=*Dk?\{j_J.z7?00WFLm3`1*\ϡn!#teʞ3/ER̵vS["l$@DOdL&"d81]VF}!d\yb=r`s(` >AFjP4?z?do'lﴬzC =A4{mn65=8^|fk7}=h+j%L\q4}*BEp:= ɼsX][pV[)V0S,˃mUaCF| ZTK aů?;^D^RKUwaᙟLPK4 "\mp2"E`[:dȀtiV'wЍ_s۸` ڂ9Ԣz0@8F8kPLC%ez&r]Ԩ yG?LgĪumoREݶ{hʾ#0' ;O[\d)3^~ԋ"ˉT\ҬW~b,z**+W,zy+>jE@̥N¯bUOYgF}vyPE.(?6Ya\H [G/6*OPŕၛ{"ym4z͐3c'<˾4 ]"P<1pxzPT%'q*DOe_PJMLu L.eb?dOEEl51DR MA2v%UHhPڧ0D7m֞:.Sf_:+1X2H bJ>0RҮϿ9_;R6mp$ A@jThyTZ- UJSmgprd*'v#]V8>qP zvpB7%fC!8'DVyw+Q%тxwy<"Gl[A co.ghG€yWHoY?GBĎhЖo!Ntj;ע:T&:0)b/V0~oFjdB\<u4רIe*A`&Ns/ AwO:GTFǞDw)x/|(Gq) ^zku`Aq/ vXA4fh{X"Cii d{},Dp +o<}Yљη2Y<-VHS]se9X4Rik ȉi}31j9w>YΜt=y毿r"4h@d+)<Ma}I$✩O W6-[f'ItTfq@b+~CxwΉ  :JiK5?Lx^eqB7nQ 8l#hTIrzݽR; #o[!ߝj7Q@ՉEۂ93U- %%y˅3EXq^C_(e>3 uD3hLl8K#7bOq"4̳눙cz/K}3;BDTByd(`[!^EOÒ)=Y{[ޖ#2ǃ+?bh!k T!w xeP k m>=RM8L}Qk p )7ث }c Rˍ90*_0[MGUy `#G"N^ZCu(G2\j\aq7.|+ ~BՐ;s8t@O7 e+%?2lfY^ܑ^srOQ] &?~a!y[[Zhnǯ4#GX8*_-'rw$`;(J>RHgFh$vJygzWCp_8`j0ڳ'8mPU 1HX` yd /Yd  w48s(V-w’#ͷg0 d!5 5`9X%Y_<*\f}*Hθ :+"9 &'/D$]OTɩIǗcݍ\Qn&iƍڅ$7jOz`2? D@ ~V<{lYONx/_G(+gYOZ^=SK?^E*,^w3O<@E(RX(tu(yz<AIM 㑕_i⾶o8vIBng#G y!NI:@umL,ӱsꥪ8Ҿ2 b#^xϟykSe{0 *lO+҈ H}<"q/H?2WT0c5:@vxeVR0M)ax~$˦ӈjb`u۟Ky; " {8Ťeo-9,˩ZDo,!N-=릉a7O櫶 3a0i3JN 1%5ua,z2>ڎO_rp |]\rI>j=^t-p}^#<AǡaH0ƥWaAwo0tqY95o^u<y~<;S.7B)+(PGq;iPJfYq"ςqdZm:k!GѹB;n=a΅mVlؠp8|?[34&-ESeFYr̰te7ׂ58??ӹ>o#=3v{ev [pC̊tmǧ;_Vjװs3vtMzp,4I{>Ԫ& S<gxͷ*猙Ȍj?geRǂÄ3yUFan}$ߤ^&0ӼڂN Aƭ-ݔ^'z.gli*Ž%iHgbR8W㲁?MR*hZB2."eĖ32$RHg>uE1$_N6pL'lWKv>{[ t@^#{(>j@`Y,O8p~ \{c>+,*l2\y:$pe#@;1e7 'b2ǎ 6,?D^%WU_ڼ9@]{y(kvVEd"e|)#T CaHUeݱgMO8VT+&g5Cfج"f{=!g{X[!K"0[P![L-~JCYnxPmBW>l7_fFvM\K:}h._6j ύe hbXׯmǮц?ұS4I;lJcqQChO].lALt0z@0-0z."hp&%!JvR9eU4*=/ Ĕ usxӆ1d2Ѐ'WtVAviT{8m 4rji׵O\~_B{˨S Ȏ LGmb q(4 @)-YVqýu' rHie_DPb6gtc,U@m;Zzw{ N41kښ> |EMW\c\A7eSV  CODS(Ik؄XA,|!]eF"OY暤PajWM\Tk(V,:xIEj5Ê^j|<][EDzn]"n7qȦR熁 RDwGTu;,wwo7YO, ~&w&rW[0{fWL| %ԟ(] CܽP~ù{D2Χ- s!ߓ0{ J@_/V &yd!AɊh3QZ?{ik†9qS`bqZJk`^ +uMf< -ݝF" c0jc;Rf<:T5;zYz4v? /<6J!σݭy , 8~D#0"yH.S*y*4@W_CG#k4m ue.QNp_RBݵujN6S)$|c,2DIBfR>\: r儓 }7{ ވ-+az6"H0#:rP$4˲ =r\US0T"$ [zfFV㗰 'fIqnl@3Eet w!WEBpeɃ@*٩65qBeP sChP%s]_pGБ-Kdm]KЖl"(eA b]OA1 az=.nT)0X,~ ,ɝxRJg~-7fG*]r?(?lL^ȦݷGV% leƼUYihbh,y_Ńl8 x%A>'RRi\~G=N]:ĕ N6uD ILg ~ :? ʼT~-p17}28Xt߹)^SR47ĵb:ˆ'>eAB,bN;]Dו\q9iʜJsI|H;b*Ȭ4҈У;aV_h?!<_`i1[ [F)JYC݇,}?j䯐*nA6浈]t VmA2v*aNFhd/:JVEb3Qp\ֹs^>sE6AdL+H8FG3̸[c=񙨖fy-*ɬBWpx{CXoŁ;`OdCmW.5X|t ohXI[U: 嫊2#RFr]O0ApW#(OR}f-(C/W8<( e)*F7~r ,|n^`D!(Iq],I&6>y|0$qKnσn*e{-QzDݾ$FZRxr|vwggqquh\}fsh i6Y6F8O-*Kc)ah"iWuAJY|~6P=S8s13}.p$F> J橡DQ!"V*f9BEGu?&FF9-R{bG$*j[ZZc7gjAmP:WAv~ʱ% 79azJ s-H fy廟шODIohېI 6|a ٿ963hɌ=tV&M +9f:ˁI€5 n0EM٭TUf֩dJ8 o WuY"BҍK>ہe~Hָ:Wh9\ / uޢ[3'D-$Tr_F_`66G,x7H]jg7U>UF)RZM?7]^(% C">Uz=[?GM锬e2 Z+f^eD{BOeO'5X? ^=l~è;%c=uC*sҥ2)tEI_XƊb=zܠ=8F!GqM-A O;zyKwjoHH|¹N9l:̴>]o-y-VN%/--˕A:xBS]1aӏtl>  >P׍pv _%Mַ8UZ$$^}Uv=x+Z/@j>EX.SF!ԿFFtk5K;:vOFKݍA5tTގUbc^GZi ҄< 'B6 -RI A 7jCLCwaï)g&')76# u+pO^M±nOr&!]`|\l ]l\6Ƚ<a-gFaa?ݑg~勤)`|`ȵ!I%Ih~~ѭ>v+٠O[:x$+PTtRz{|d+ sj9*u`x!}!aAʓڂC…U`2Ig[Owh #Aӄ$I@AX7PK(od&4OڐZ0O2\ 2#lE2hi}/ zYW.cJ 5C*#kWc|i6εKjIZnO7qp!+dJ7ˍ B#Ṇ̃fCs5u.r3vDZ^O|/xm[7d7m5#PȘ՜Eq &tQ .^IH%-<AVH2_{cZM_Sش~Sul#mpvG!-CNdzwyI2ѕx>9B~2lxQ8nMU^* Zji)-%ru߅t[k9u1\k^2q0Y;A1b϶{qb#Qx—Y@)Q˓Vpu,V.3KH8qPYMJad4|`G7(Nv4WB#%FjxO|_4ߩk Jղy4 NzPnLY*g|4ˌ ԠRO?: hdڳ ~{E=փRҪHypZ!"%'n@%@~AW I+SrSni i%ȼ#kFPFW𷲬1𦔥+vKRRxބ J2h+IK(\*ǿx)-,m m楆ܣB5(cڜc} f)]Ua3=!%V+ [)1)IEn76媫Zu5ѱ"i;qRuƗ9;?DNuAS? #lPG羋JTlC3ɉ) 1ϋ;4kd4L/@pu.1}CQiDŽsU>=7Hc.:+ue+ }TBcR'd1`# ;ۥ+ YV(h,^!&$bTJ66y,А]X Vá6^)ȱk`P Y XMg8;ǘi}Fk$k+f>bd̞?.r'Ԗ$*\KdfHᚢ[VΦeAXiRx}wd>67 ǧ&}RH^[UKz{h҇伓Ň3KE}D o9wGe{su]sHs/~^XG dã6p}lB9)o͓OE0.2' լd 7PR`ye!FH3tF=&%HĠV#9TYYLâ622Li:8d+΂#?O]X>zeM }-~i <(~A fPHThsZ%_''ry@X&܅1H{2i>A'*eV,T HDIzX錆P2Wml缨D`a chmix)4@PgPV)lK*#&)ֵ(_Y1aiHYJkag;xV4[wmRV,:5,oU/0Z痕|08L4]*?|:f|P>WFBKbۑW(8ɖ/7jRWˇ v w?檲w*Cn}-C!)þ&ݔ<:'G9KY՘ĴmHdr_DX#%@z?isfƂe'\.VWx(9U'W}rΛU>C=9a3L֠6KYjw.Py &=/J^ǹՙE%0NFV,ڱV(Oӧfg6/bϋW N1P\m=q3X HKEM;VJMP$4vcΣp ?U^#x ܗ-E GP^}\)< D[l"ąP91 A0%DkwWN29+ p꒥ʒ2ECD}O򚖘-j5SӋj]h/y6 5G19Xq5AQд1+hi(ƺ hwe:_S8G4t(sRmtCb ?@^񪄬 .l90xƦz'd3sC(f|C>vNpd& V%2j"QK NeO"*PA:I&S<5+gxd1&צL՝v^9 {=JNʏEiv*v|j[a J]+c6: \"#h ;^;R̜>E=ř ;-22ݦljfׇN ڱjP6O .}y5xEݷadD LJJi%T )c1e_LQ[/ۗ??Nջ"*{Mʇz7-&։5u>I ~jSPxKsJ@&@R؂%9>ñ\Tpw;̤>e3xUgQ"˶kb ?:/v1z18}F U002Ꮴv4Vc]SYƥaq7\IAj k, )gή0w M- bTCg߱$IE)\g"b;uc#CFQ A cxy2A{U2/J1cy[HA:bd0@GOBp__Lj RArYp*aWe]KBy<F]Yg">o-|& wJFtTyւ DC=s;^F5kY [%jmb0! ET3RJl 3g F_ąMZ&W8р\F .RIoQ;vC4@AD>< [fګ(ؚXF"fOgqs3`&Oat1l{0?$x.Jvg 2y;Ex'Г1T/aNTc,} _#z5!b>؍.P9x0*0˛_܎({֊=f9l'`$,RNꁋ0BgP ">ĹRh2ѦY˨^09hŎȼgN; v11*93æ >¿{x>tLb8_plS;Mi},B NZf)A1| Z{8u@)<~JLT6pBs:ZnpI1o$ {9-d'Ѳiz7,d|&nL.8 #fsmz&v\Mhn!kƇz|-RJ g NTu7_i@pޏ"iOb b`8fcGW`*T *R YHtv ҡ\OBRGjey_o`3 =}pWEO?e8$ `;&lRZM*G䨺)|6oIaS[_:oHV`A%X_>*t$Os-"Y(rVߘճyώ>Vl{bP-7?(H@lINu8uOsB@~'lg{5ViJ0 K1ӯ&%hЗ 6Vg.'asV9S'Z­=KY F2 q21ԍ*FwIeQ 2){N>wQnyV8|UebKF5VpW͍At'(P2 bBTHbȁ+ <J-IߙYo4ªR6>٤]-L{boOǟdܰm]Nd @ gTvsG-C|ڝarXbsM=6πl_4cilQԪj@2#.:b3!apX@WX1re׵Mw@nTV^a'С %v [sץWE wLaިաPg&ۓ RK3mX\$,jmE6( ;5KE %m}4Lܭft;1?v WC8ô#k3GިD&=d$c+LĐ;D@x(+GG2~V|#A0J)xVRPȍ']q .D_0 NqiA  c;%nI=_ң~IJ/>6ŬjQd}n?/f>-/OASH0O|A[-\P* }PUW ~-~V~nHP)גҍ'Q51g=|O빺}!!L+jZzс6ND (^ED\I5 `w~/{vhkk* .QNFfP[IЦYGq 03&_@oۢ7j" )r5ךMN " m9IR&lG*S0óxgͷ2JL}ZR۹V75D;'vDŒ5q.V>oGr$ aۖ_-#v"{\,lFW4hF<ӂ,^w7Go Vռo)U6Vbǀ{ۙF:! !HzTgZl% Ԋ]n@Q6xkr>ΕoQ^ud,9nli;TPNRS `z>6nP(*M\f>Qf_9Q\ZkRl`:ڭA[xU1'ȆNCᐮ0h*U̞#2[&i䫫HhR@ĺ׽aUZQeq/ePfin M@bۦ ׋"dȌ'^ļחT.+\ }vj:ʚ|9HK:5sboybQą@G{`.3;~\qp_F'+{`YS94L!sT(=׋RئNp< g&Gv,M$IC°fѹG"j P|M8EJ?c`hMGAU兣{+&^|af2& uQ[^VcxU{6e<Vx3cjvn3_a,c"B>^O7tY :?n 6$]%?AJ_ގK>Ľ|F *F83>zt4"@Y`nkJ Hxc?KU^ lw4q{Cc"Π\`.Sm>'^D(&`S*evk *?24>."[@''bs牅פlcUZ.Bǎg4F('/u+EP]. 7v0 sDADzb")ߘ .86 k L-T>KRdee8b[8 P$+%s_0QZ0ˎM]'K 4gqD7&`XLABMk~?͜+7H5B~0_HL_e9\t|?&^\?{@/ȅ٢7U3 Dŀ!n\K\ܯ.)`cyw]y٢^+P ¤M iaZVo0eY|܍$Đj2i8#\)pa~.Ordg)Y#b7HD&ʼn|E~u~9U%cׄ $V4}47Tݹėp_L;$.([hGtgCd7r!4gbАcdyR47Z$8sDG0GN|{Jm39ܖ;IQ(-4@1Υ:EOĸ3"l k9 }Fry *$G\|2p6B䈰ЧMbQg3rp(i/;菈[K.PI.pPXLºH^.k_7HR{jOX~_^zÂ~DR{uמաSd Sw0rд  覜tu|8lr獣*O*ZB4}j)dK/.}ָ"7JC`-T(542xho[1yj {daEgC9\[5R;)C\χx% \VVQM{zKoX}=|$eij|4fOl琁6=~'ƅPXϳe_e N&ОR?qr\A .l+Cht8>Q ]^u԰:Hk^͠kT@:d3PE:X 5N:U[y":P|]o2%l46.,{KrٴjW' oU8j=vX}9!^w4(Vx"{/9D @VBƾ%r|' v E:0#%X0=¿`?z[Ⴎ`5ghpƹ{lg/ xtWR nՌj[&ס&8Qi.NJ׽a5m`E(i)Ƴ84Z&lwª񎫈'tuv3/&9wee4WZ- G1t&pYx^]V݁R?bQ24Х8nzõ~NWJ35k˯Xu bl^KJn%܂>ኻߺÑJwfǔN h/&۪5_H&P$zW3s&6z4C̜ Y.5θ(zメWΥ#;>0cudvEfݠ[sau~SɅKi A@9$,Ͽ[Z$^W˫WI5'|,IDl뀓(a$׿ڀ]n%FA5|S>{y/&dW3aa lwv&|p$(,Ts}S#1,h>׼`(S)Ϸ O8S@`BՈc$E)Fk@6ԏe1: {+42b0 C2F>i^~.p YjA\q)*l(GA"LZc:[&xX5l" -=_J(ѐ+ae /P)/4!YbPղ4\w$Ū{3_^)CJ:k0~Q|'<SMfԲ3?ZuuZ?~3[ǘSFx!b{@l/]CEN&:= SƳ#@yG /2e2TbzX3_dv&^XrVXE9y]$$tC$-4e#nis?5w sIq%:k'Ohƺ39鮧u@W,'g{ZH xYt^ 3Tt"<1lޮ0# ys=X + Eety6[ br wWw(4NdTwճCyQ8?(MwR9ugi8yAB_9ipJϟr*֜sF.ݷ;9ia/G!WD56lBkxṰ9} ؗ1MF6ƋZ#|CTo|#uվ߬H,fg^-Dez|Ld& a]GI I "i7<\ p:!s3,"dِS)vc1YK(CH0SDD!ՀL0UqWTIkX<"ĕ F yFH㴤5rQ"ܒnMX!eǵX%K(S7X{5ZBɌER Kj'woBw5=kCV19W,P&,h #-@[VNU$c)҇֨Ro@WXku#vHl>< ̷<5Kt&RL|;Z-Mi?l8QgOmH¶ӵT c䱇!"þ8Rhr)lkI ڥ3&9dZε58S(E-;2y3T=k"8<3t*F]3 JtO?-4t,sAgSOFJOM j+yRr,Dz[ 拾Fd G[H#eKui 跛ŕW<;c❁Zrlq (hOx~xp],9| &kFsQ1E.Af*dq vߚ-v:]z@W*+Bjw$Z^2?y1`V9^%5'Z"_yJFu%%)WٯEΑr֙M%dN#on̕fdϘ' &xE#KlJ]^dVQ'I yVFeHC&7b'mCHEtat&'`QQq~~;qaxxOF6L+1! @r%j[ʰ2mQ_)<`eP^+[Jm&`G:7nkV?黎^޹t1QvJ 3Iհ9OsEQČ4߄.XY/e7;M2Mokl/84}.n+fSME XB4v;*N]_ @s`8ͻ(-3קXW괆m?inWFIιIRݤ;P9X3X:/[施ԆD`.6CժXn b,.X}̀~획D^ jLxj7:aޠJNN\{z]k{XAҚkj4$0hrE} ?,VG\san4?=$ބ.n$lo?a-4=4x~~ L51v7~:~ipQ\=մ5kAyKXhlx  ]ZqxI3 ȇF㱔JGuP9u=56l5 _񰳒:ח_& '`. '.!Y"kni˼blfmT% }:%;.l8|Іe= 44fۥ|߄*a?@z͢n乍w^n,Ѹa(ois^p,vAy&&8,b3h1諌VéaV9  a!ȨBA{Wy/ύ:ɬ|ekw%qG @eY$ʁ<+,=#nX(/])~sf]6K-rAʛNVZmw>gH !(عL-C*df ֍qRC,- qbېhcZP˾Z\)75׷-,qM\n-'B7#%yMu2-"@(mg,TxT(Y%aG&Dv3"AN<,/@3gd!VxaHlWwlYRX 'J/!юis23&ܗmOu(m~P~aҒPtuN5Qqd ?}[э< mWg˵<5o.-$ja DcC/R^93*62=`sRX/^T)t"^|FF䯏13|vvdbO`tkc]&SmݵeY rJEQ~DO 1ҏ9XR9{:`Bj^Sުm$]"K iv`[mɰڜ]ͣ|2x&=Zǜ/MW r3 C~a?|Ĝ⸴OMB8>*f%23S%>ͪ)2\I"n\؃M"Mg~#dsdLZ(!$y~MRAI3aBM͡p5FUuxQ-3DY1צDR^4O|CHtL{kD K>2i Z1+R0}m}N iCn5Bx3|OR}lATC>GƝARn|N#Pf@;&ƆF5Y)kBюJ|@@z)y8)t{46*iLO \}8œ01k61 Fcp& DC \7]?b5ǭ)}sp]cɧl6;gL`,hT1)y mxv_N;:5,7sEaxWX<ڔ-2=W[MC)u!e̗i"G*lfN!iu9t5mzϖβ!9V􏅲Cmx,"ȧKE^].htLH[G@LE)X4}--5|J؞ 00C=H:_+/-0ǸZ{ f"ɖƭW/8T6'7uqa45*` ̯Rla2"*);JCH=1U#Pi)gL[䝯'y*aS wr1|A8׌4Ko&!Wr:':!HS zv4u0.Vn/r u58@q+ۻ/ɤ~cM O c D 2 5|͋//ۡߐJvY_!3TɍU3>8BhzסZ}mɗ_/KL1w.TA$7`WfCX>BBcJ>H#bƁCuƩIHFV)$v Gdb5(ryrԶ,ΏM TUㄤ lo màt!p=6D?GƷ\Uv}--oB9;z z6nuwA9 ϣ˛ (j+|=&11hA)oP ۬rJ@5R@%P@/W˛roY!F{ d·᷇F~rIL&CCZylۍR1`q,.!7"ZLˍ1^$&ߊIr2>ւ%M[g=UqrtrSfn;~ϡ$tCZ]ҢrLg;b #_!byS}P}9A&?ϱ<dI(:gƙ tQb}&tz^ YE).ıQnfy~쟼Y$,U*m6 %4O&zR\hWqٷ t{iΖy`u," OLi%o2!l4L}0Jcѥ)J" FNwNAre#h-WQ@>G^a;"FJ._H-*8o%T#?__rnsl})R#e*KL7sTvUo2VrY|f:Su;EBq,PٵI=TYnI) _W5 ]ì.;(fSꗓUݢ/|M\3*IV;eT]aiP^78Ф-!% g)aC3g 5"YO:KgA<&ўN)\2 t9oXV,|C}r<1>ғ`?;`(u+Gy25lk|(iaw'&akPfE>'.;'4Ž};qkWOrU,7}=5VCW=8Xm]X VtV?lJL5PM Ĕ^w[+<'xX.ܙ…pIfWKaem0pg/>??[% ׮&k8ln.#a،a7vx~EA2K%wvžB5}n4^lyZN\uqn^7(E3_Ц{/ hsӧd`EXχ\k_[w^ jrYa,ʎ. ج&%764͛8#9,3s,(pΈ"JLb,y#Fl`uHtfHJ#C+/ )6;/sԴ0†͢q [ }z~J+^/62L#R΍R"fkxЪ#s|U1aV7_b/GX_ľ jL*eO86\2]D**O~mlb$jޙ[r2Q,iXҍ=.DXJeH~~EQQSн-KX昦gUgva޻!']5d$8ƽ7rg8,% `@" 2.c/w fFt$I h;2~EҌ4,A rwQO[܇KŢ'(a4>^ ϳ,.TYhu"7$h~Jm+;R "?*"G1_!hD^ݹܹKAH'mY̾Ezha\蓼{{5lտe3#tj%DOW~ n(8MyW)׹v+1S(zRYG֩h=G~,3TN2o \JcW`zוXv :ڻ=Q$ ,zdvW6e`2Ny))5iCUV%38AW޹?`3ŌU ?5]MDA3opYW!q[L5$.W:$~yݵ+!Tn87 ~OUdµM['.U2TC<-  X#m d^HOtTbA_a68.4mxſ͖AiAT߲SZk=1BƄu^L.JJT]:Wuqr~ͧ4ʭ6N\Pa__T5[ăb0{qAٛc ̚ h?SޮϵgbW׹;*'ͽW* O 7,: %P+ď{G-TX\,|ܓ|X.Ų,t3 0j7++O!F3 :Ai.~LWV0!y`gB-%:5D 푞ٗŔ4!!fvS*9!(ae2CЎgI m+ r{-D_n>T_{\]fbI`SCej'lHa$jT5 O{FmHt)r~הUH]i[p=TȔ&Nܳ~L_. pzeӯg _r\Sk0[ЋaK1 _3=$j6LWZJeOk9/R7ӯ!o,V0>=>-³ MPkmǝՂ+ԍKQ$sɀDLg*NvT_T1U,/-Z3dh˨D/R8l0D{!.DZ60ml ]IWl];/VE `ũvYK&EFkwkމÅKzX@[FxɌn6G ryy7$d*V!b%Jm9[~ĮH#^Y?[֟`ԙğ_A ޗ;B Ľx"XoKYG*gxMLos6*( D AjF2QUF>J]1L} J j 剌f;;-rA\ܩHzXܪ5k:]ރ 4Yb.W@..51 `+ˈUSKYRUk:aI`UJqVQhakp,wIl\r]Z9(vl*:)Es7)qx/ 15N]uNzDxig)!1E?wpDx7(/n=㶸[ w,^" |H笛Վ2Xrq^N΂Ԃ OZUb#±E|֪6Y#;J|5^3OMHDA`5JWJmv"#~cهpZ+gExj<P1˞lFdki|ĊiRpHRQ$.)Bޞ4hYG~@9H PmX=׳qNbIj/iw NB,/̷6)g\ ,UTt5#R{,KU*TD|@Y9F UkVH >\=WqT;15A^ < +n= ;}̼?"dƝO[ހYjSەPǿZ:c~m.G?}۞:̸@߭}H4EVRQF$/h' uCOfpP1W1r8ʜY\rNVykLb'mװ/f( Umea{DBWmknAG/]Xgc hHΦ$5]N:K^ @$kz`gu@sFnJTb]tz#>z v8T^yw{r051D*W fZՒ |,J%*hUU$V \G}h2:zֳ{[&^_1 j{=v2$0OQ1700&up|SƱyQk Fn@ a~ .1:(k񡫠!2o%7fx&GŻ PRlCKC!@0~]qAE|6ggӪQGQqay^)LqJ\b! /3A<А  peEφm#owtFiMaĔ,}hvC|sEBCٿpյ3]˝9CFH g2dAM\;cXBNi1Tq>Pg SX~bm\KMO3Ӏ*dxo&ʕ]¤G"TY\-cxétqlר ONp,`$ f$ܘ l9d[ A[L638Vr0{sklgzmHso5C`^\TўYG Z{njsϟAyf4rMÂMJ`&Ϯ~Q**TT|,@aRg&J^(/U"lԶ t ]ҕ]QK*PK%{-3&<6 0aJ (A8R1<&iWau>>Y݀"i c p!9'/RN|E"8׫R'$FTKl hpv*&S3M㑶] K:Ru] xQB*B:~F{w\ѲcfFD)=bp$%>rQԶ.5D\SIApL|a崻l'kDT!5VG˽9e50`}|PZ n)~ D423o Ʊz+*$d12>3S__t9hY>+g)mV>[zXl\v\NViYN5f< )XRbxrYb 9ijjel>޽/u7\^f#ϨG H1acvi{:#W዗-_A:GLP5.$FRD i3!I^S1L @*Do+!4E)u_i^sGwRo,ӟtsոblh4TL qU XhSȆ.QuB}g6/j-boa@}mpc:ɳ5~v'bY]?/[ʢ2=kb'4Z5pF:G/ل(ލ֪s+敯 ӠLea0r:e .@Q l49l ]|^!a>0Ñ;`:9V`lvgiBV9G;˘0'ȗ>8$W6nW=Y$RO5d;B{2")1P> A0nv1TOR,r5/4W1"2s%{԰Iq=$paM(.}=#p=dnǫ% 梍==KrQ lj UhW+78=<2o2Ŵ>2w ҺI(37]IҮZW/~eо;$*lHHD+;dɸ"9g&~轫s7z|)[ j~NZ)~q809S(7'H"mbC9!rS~< H<+ *{ˣ;fgcAP VN@>w!mcPrc21ԴylDD-쾵]R2 D B 簌88EAliXu5p$)-O\F-K>/u]Y)yOoFd =I.RHJ_;Կu)_ʃ5X8]MaPISA(μ=`x w5 -[:kr f1vLK ]}PH91Ci=|Ee4Q 3A'R6i7ٗV>3lJxbYh?gi ?/)?ڥ-ǂsQ6$ai2tZ5=6 g?EHۑ"7j 8Z?5L+9ev8\*BįgQa/%c&_VlP7V7}y9E0O`;UV(ngq e u^ę{y,Q.im:jز(59<`PE|Qǰ , TZzi_tP̓pJC_)*`+=G} ᡯnMFMxkCװ^->(,̩ ѕJøǓ9;W{v-#m%ym5ty9C R}5n$A۠vo .D;5G k#'K"ZZb-C^ܞ.o ;dq4S'b} oZ.aUS>s f>Z$>Q?2″}FjRyCNz7^\|SԔ6|86Ļ̀ cz%UP*2:(i,ml8Ȱ* h?`jJ#X*DA[6t sxE[|NJ&BL2`-)f?,fK *3c_Ltc\3-2XXГyݱdIe}LjwZQ`Y{J9ͅϥF@ܺm.StoU *tnlW[{y`L6~:phk?;W&??c)hy p*p"щ壝GhKjqN,.}2uHd# B6,,%uy'5[wG)Lmk(R#AFmHBЗ_f|鈤ਐ<>fQh(tôvEP4^k?r?1= Z %竘,gu$"OZٽ3&t}(1-ìΫ 7 ƈup#q{ia&7_3)([^&A2k¼"1 6lnK|hLjb*{hryUH5Dq5w>)PrpwΫ)ޗņM߻4~z0NjGbKͤoM ֦GN☢l^^2M|RSv~3<7u8 kqM"QϤfGܘǟ(;Vz62/8&#9JSV<{)3Vcb/.M>ƁzJB"ǍSy'M[g*PT,'.O.`>eZ>(f`pH(C]]A t!DCnl  F{CgmON͹cgś#m|!%&SuU2D( ! ' u묺GWim4plAܜ8+2՛H0ba7 cTP]FoP6?qݦ>$HbaܒOFr Q8MZ:Y4BNiMцWmB @6 x_NXCp]A/Hl23x4kbEi&|!&#c-63&7 Id>$`q6]TO= W?H!FrZ^G KJh֫.hx.H|9ӌAL#,C#~,&\ެ5 408 Ǫ;4sE@Gu$ƌ7~7 )'*a;[-,Mcc2#vjBeA9u@*/iZA}ER{hśׂAl`[v\uw5eɖoⷝe6|u1M$i*, tB%kqXMElHш>drlݓ<_K->/]W˄-0&H?fbkМ᰷߳Exx$51g.l`~b 4R'ߡn1PhYEuI(A~EYK)EwQ'Kӑ9K/,g/bF\fY{\^ʃ072gotni]@"`Rմv~L}۹˞u52xlE:%0qEXgM!7#Y [y^P ˲^ d/ flT#_4k'D&qy^RZ1 Z\ݭ#-+e ( NL@TnfPQ8!S!K4Ѱ$ѩdVb$萋ÏNdd RsN6%Ǥ-X ZԚܛm($ ҫ"˯p{OAN9jhC ɧ'(u3»݃HJFA\_DIqL8^B 53pFD "JXUF&3VcGVGxdF;e#p,O±j.4Z(dgr6f{8W2H5!;v/\-KaKIagE 1X]J!q-C|B `!= 6e*(|6X\-׮%y4摸y<$_ڐ m_8wFþNb0*9rZ|Pқnq.2ZzH192U-*t>=757_Z-\XF'kkf!5$7x(T1 Pt ru~kcs;MOooh[/:9:~>@8B,*I^\l}AJE DeJ~@iL~ŷzGνSa0yXFZI;˘-ln䍇psc9sSX[_Nl8"*8yL$'L G0d Е8>?o9TN&gHlPt; )~f$&1Bd{YتdG =V֑! [?xeB=xha_ kXN/4’͝`4m 4>Q[,qhOd u+fs} |n`柣QoLsq)@ ]10X;tE2~i0%KE`؏2}ҋ0R)ضs\,m *02x  ʥM7s9#5-ՉL< =|>[ ;uM;=rDHcMXoxG fhyG>[bǺ|4%nD*(u 9þnFHyy*=Rho^SKXysqoe" >ixTF8ٕY#MyV(=P* 7%a\("6WSߛ>"B98rޙp"7pͫ,ʭaA뒹\g~swNp<>OQ:>݂_N畏@׏Л\R9{: G1ߞ_]I8p̗.˵$}~-M#pƟϡ!W6P[A$mV\/j #c@$$Ѝw 3 j[o۵J |0K]S /-EiT,JY1>*MRgyV VT=k'm"Z_n LqN0ƚ*Bn=/v'mGG=6heDcYeQJ-2"`Pͳ6ɕeoOVSJ":H' jCnN86SgMm 7'2!&"R0:0]Z$ 7%3k0 ;~[|m2۾2S/9!Kk~X qoOF-Y?0,Y͒?2_U0OվK&>dDU,K6g&JM?Nj4n9jYGV#jh:koO:*yкC 깒OtuB@Qvi_6I1vno`Fqu8uM K&u`@'Ŷ8оᰳ[bMK aVCi6ɽI=B₝Qq" }gy坼 *xlkK|a& "8Vf&+1#VBCJN4 xQ%t3+g{q2 w^YVoKT,;G" FWcUyL%>) nO|iMNU5?N J8Ҩ=Txy_VVZnA~u5U pm׶rRC'&.'iu.[RrD͚5W :F+&7៍sH0ElG8OaU[͟tR(qGp9q2$YL 潛vj.HrDIgK-ݷFgweOpQ$3 By)o#0vSMЀcG=yDJ+# yN K;0?Ak͚h-y@QÒ7}8uxfȓE924PsO{MȪഷCׂfPN-Gg=vNU k Ka w[sNfN0=9F7ѳY̓0gب«-x?z }?Zj9'BH 朐ǀS{GuD8Ps&;i{K;Z[-%=TU_t'z6zsQvC7+@gӆ>vt`lp o1z( ': Q%d0@372M~?}"aqv6Kv y(yY\u|12l\m?b|EXƬTa5$-F bU%lb<}oAّs9S;%~^J-+p@-(/P&Ql`H``v2p7nsQH6v4ҟ[ "/ j*vh/C'KEͽHs(pd.arIۑrPDYY\1*ߒ*X-X _젒 d_qBiB8P$ 6<369xTz7z%\. 5JXC/6X5:[AηNU3`ٺb֭$g+` #n?:c(uЪAݛhWK4^9ʫ?-j3uw񥣢#nU=31W!Ԃ_:T<6mAC*wB>5FrP6~ h}'J}aΖn!㩇m$Yz{ T&bҧ$Tc`ŧS^;O|'&mˡJ g&FC=qpy5:Z219sUuc&)ZA8b.t*Tҫ|˘ڒ~ϣ3pd'i]k~{_Cǿ ;iZϲqv^LۨxP}e,e w5~~fxIEd~Gߤ Y#%wWPي>Uo"ι qvן%" 퓼+\&E>K#5r.F'K48Ijf0p7 X9}#RTg U ·aŻ,խ4EP-aNL_i-1[ms7@aY6'ߑxV+Rg6ZIZ1 qƙ?J6\x$NVM?*eXo5s(?_NCsjyԛ-^T OIuKV %UK}+0O/Y꼀{5erkslEPt8#LL6 '^5Pc0MȂXUuaX9Z: UAj+\ƥJVW3 VCƲe K<@ g:k#>'^ӯÜvs8nK~ޞ]M,2[=x.XjI! %2;(Pʷ)nvh^ܡJeLOj0lI)h]cẆ}5f\o$ fŊֶ>,i34:4Md_<zY x_,uAIAhLSv;Qڤcag͎wƆ-w4nf/=I~ޅ鐭PԱ e3ScJ-Imq#Cù1}4 XxoK?,rvHr̟_DH1X`MC:) @fkSh')/ N&0ts)[n6{Q~Z 265s9Z'5nX@3!yEPR EpY2]^6|UR %5S&S+ހقeBI 7k`GM<4w7Sv\zǻ`kl.?0[Eg *&_F`OשB, WWJ[qqZcY7/6we\Wp͂FztvzTzZk:3) 7-IOË R=I49]S=HRܔ^ؤ kPSA$.6-䴂k11rc9y4%5ݯms ׫2$'!|\]ȽHM.k#@}{:.ɕV,tcZ]'a0QiE`ž$&.n\ l?l2U]325\s"3\o@=y¡b9\ ӕ/ Yq2{ I{x솉)omYK.=2CrXumGl=dM'x9s*{).a.)yuHwB<ㄶ| [B§Ɩ }C|)GTf,{s,}\pC甽IYѲ/بCّ\;\pZΩR8yi+I~tB3Tb_g&<}A0ƎbcUȘx 倈i5H 7B"Ƶ(퀂o۠<#uO ]#c)P4MaȄТd$A{]շd7¥ dɼ F!# *ZdKS]&~tJb #FXԛQ1x!uUK?ͻmgdQ;\5t:zx m4[Q:d~ d^_$ wD5 Лj$ǫ+y漹_Uϕ kJynl%!TjIQ;:aj׾N6~WgAkOĥP˗J#z\dQl1wA~nݝ-~[՟%TCn`}=;e}oF~xZ4{osA(j,ׂhV{|\jAt{MYA isLБ՛}DE´5j vKkHI!)4x_zADC6dvJu٣iq$SkAl$ψu\^%@;| 5"N.+^/QfNoWˢV,F֕Dw)+&~T3I(Z RT#i<-njvT^g't~hIʍacG&[~Y{0UjwR ړ(;#n9sPsnJ|yƃV6CDV&|Ter/ -#]g@M>$ܵ{{[9 pxj4\Co0Do{JVEg~ zcX'Mhݝ1+eaX`:]~AGmlzZlbgj I{٢aIC0't`Wy<_'R UbV u59a?X+2߹l[KTEޤn{>]|m$4٤F5)0=3 z-8]ΕCзS`ጮ@L@{6ߜ{ H'<=YsܫThJz6.~Ć_-M$+ߞ]Z&jBB`^HƎǚ(Ir$/ȤWKk- ZI …uŎn 5 G Yf ~S^K9z)m_bJށ/CSaMM?I稞gHOԖLě,0iYoDWKW6h jO-u_ٛ3,, @=e0;ܩGl5VqwUxUZt+KE2j+nH#܉Ȩa,]$ǜymוG˟i~Z+C[rʶ^NT/ծV^1ʩ>.kvR;nCTD tm@ %X!ttPpjՐl?"vWFrH*,K&G$\ŗV}`T^T1#J罡bi۳!Hfx@n3^Oѯ.Yq&BEc y?m(9&UuXI.P FK+-5SW.1\QAqñcu'"nclo†Cd~aKK+a:NS^~UM ß3Na_mX&|-w:2 ) I*v!FB<{ &nLOtW̶Xh⬉dՆ9qC#@ #[㾑Eџi.ٍeUaeC;qrCv ϟ̛+L(XXХsDz@& $+2N(NJZy1\aғdW"LcM@Iu#SdsSTWtaȹaN --ml^/_$>Pjsz(9J?EY-:OLmkS]DʋoJfnpN8bS !d7swaj 8jE/ڻ~NݛJjEf}l5C=a&C/l%S#5m. QUa'gJ~l>k KC_5uUj63޺H- TȽ 0FOdMsȜQ^Ew@m`Nd͎k[Se@&w1Ufkc{vLɶ%W +۳"!yr<ˉߟi/|x5;騮ViJE*}fVD-*Ulf`&t3`O͟%u~IE]+o @3: NKSa>QEZq`Cc`Ҽu#{T*"1M {y* 8bYȜcWճU0#~6 sx\Lc@<'Meխ_ۋ8k TV_DVyXagAx_A0:Z 9.f JG&N_V56Jto v1JDMȋvx@1!S??|G7OHU0 [QeA X嵦ĥ2TWծ^M0ֈ9:}l3|,\/œOgzj XC,Y(/b9p5U#Zj\;'E)}YQ}5-Ii|rY^'HxyM/=Nk#_E-#ӊ,km1Uהvf`y!f 4ՠ-6B)I8lBd~VQdȴA-lPU9H&w !'n։r(F!TICW~`]k.b"rv&/5F]+“;J"G=qW+3yB`|~]M 0Wn3?=I03TH0ubv )_Qar@x;s3H{e $+0:nHmb*~mzby7R!uz`h31˛H"c~\>y[ sdW_ Ј1U #sd4|Je/[IikqހIc-?prRGg QYK߃Q:QPt2 zL39>3f YAdB&@2ТimV>hnvuV"R~۰f[h;.l@:Q0*1$̄z<K~ }c(Z/ۛ!\'CZt 6tg(|%/?!e4)IXkE|qz6*m ^M7Øoo#Gn\!E%fBzrBdjn/yuBgV5vtTzhJAsϒ̨0BG rL)]+te{:?奋EH5<dn5dO[JA/w(r{0-F5߹QÂr]ߓk̄XOk.Z\NW]Rs8cBq̧)R~܃²b$|NcO fa(zfPB : $v߲ X+k#ƣ1h:֟ #%>2a6@3T%PǾ`dJgCߤJ2Zvnw%稡'ݷOY:~mc ‚qme΅ZH8Ŭ=&w33RKuݨ%%AjHom&$זS£ i ̸< +NPOuzq#B(7]%MӴuS)jLH!7n=2j/{n'JzBA[~]rnL;A*w{7;/ "+n!Ciy_䌂f7K,P8?ooWTixͣdVqޫA\{ D[+Hn>i r*RHr*g2j39Uf"wׇh'~v]R4♖jWf8@JvŎc/@Cҩjv,pCGuؖQyͭ ='YQμ@|952MtS5 TKVlf)כlX?wnT&+S]!׳f5eєƕ`2h1d|OsZÎk郫Ijt}.4Ӓy|2I{Z,UB;I24mnZ$ʱE+&^Os Lt1]j~p9d0uƖՈZ%c9ƕ:rf/cPp s&\|c_s,_#CsIg҉.,GQƏe)8E38j/pv]YD7ř&~dc2yo17͟?e,7[ϠVRQ0H =RdV#7f!TkK[htM6$y!C/b|$;K_;Af,q֨FLjd+;($Ե,hV{6(1a.=je\ȝ Cl@#nǟ9MNߖxPݖz>%/`dTx}LwDoM<0^*\n7έ6@oF_zYBd!6=uƌI( 1!)y`UzCٙ}~sC?qԄrG¢x 1Y{-TQ&Xtx feQ%yڡ]%$˪ ,IX~WJU!Z ;@ `Cj@4!hn VO]`p>G1&.rxq"aXg M͈`/(uV̖.DCUx&ZLmC 1?qJ3{qeTwN\N{C<5O>| wc +nhxZ! n^cvD:>7c&JV-1k?vUڄBMLRsn\EofQlLno{ rTǮb~0d\m*o6\s3rA=r6E`k*eZz]A /XƝɗjBA\KGaNW}TXG5ƕWEg/XS9*).G@lK'{$ؖ7\~/b '@)*9Ƙy籂 p@ggHl@0`_jN~:uXd}ݽ1Ns|ز1+tC >B[Xg| QOt%k`=AVxIο0Pҟ[\> q$qzbb/v_+0dg_>o-[Nz{Uж,Q=e 옋-䠚s}0ޞ:5Tȵ T3'SBST?>B 1\gۤ/ C0~G zSIy(E|ɨ#=Ql4vMۚ-3k6J$)| H/Ҫ:l*ŠBa-٬{wS]"ÊPm>l1ޞ$Dn"*a-fxqtj1Ch?U}4$]+s:VVc @ x}c0[eG_,P]7Qμ@6cvx 9Ou0B(j Zv Ž3{˨FBN-`[($z; qLUQ0@+ෳ-<0PG8 ТtWVjU7Kv$ΓQ`M?TXP,E! P" m:=n) ~wնM\cT2Y\eDaR@?˾Q78K&bE z isaXo70u<'i.'yt:حG%. ?b,٣('H!j{и@}c"cg OE=f^-C3FS\#0\ !G,!Y;A$NԌҩ^]%6UMl^[4g[T2`Df!XUz]9 ? x7` =mrىz)\.$F[P8hSH:\S-Rv9vf^A T"䶵( Bnby9u٫~|,O+{#M;͓VXa]'9 )%+mA3@T(H|R-YmX]iE'8=AE,5yJaИxI!7:LT sl*MPnZGH V6Mu\\yO)*)(Rr#(&w׌wg8Ô>Rhy<]?ߒ쓲B׋/ . D)Pw}s?LhK1ß,y6ES"NlAyh|ODz(dܮZi?~=WCL攘;6B[EmH-j.ǧ)99ɃU/ =c^>Cn#e+r T uyAn$odYՖГ?A⹳"4s`\4_%P'VnEX/)CkAl vU68ٍCB WpĞlHF&p>/_mSjbj~}\q%<=1bw9gxcM_Wfa^0:+$=(pWSAy /3>A)U~3p˪ev-@Dt 1$z{(ވO\t4\Mpo -'ok(^*ʟvRfqUz)IHjД{Ռ{w,.;H@'VTXD.?!kV$iJZN~+OD!4OoLS0]ɳzA~7XB6;j(MIlF%q96gɆj hQ<_Iq S/${e:qA㵶eD柷1NwG)i͌"LF07_u& Sq`Ċ!8ekĬLu&ecߪzf,8 ѐ"w7dD 6Т(2Vkkcii5HbyI[c|gyc6a-:\;RXGOaY.Ut=)-j-9}7F5O@:kBX^L6z\Nj,rNrzAZz;5K>{ 7mB0yt+0eM#V@=xghVo?v3`@ ?|-n#tʈM0f}s$9$"6'ts7uV.M1AZKdA\JL11RN̸t4)df~̖5 o:R9E*˗fz5@b([y)\ܒ+Ɔ 9-_qssq4=<'z0ϫ!ɥ9͕Hon[JA-0]6L7?DH݋YQ k_xНV>7Am+()]I,y,=wBθԊ 5RF<0'<&Gd"@\e!' =yÛ Q#gEb&,Ę̪*,n <9>e˥") lUinV/TYJٷ$@T_lsLb `N![ v/߾:Su,*IùKJD@۹ Q -/ >Ng w*0wLVEy$\ yJuK!/'g*yP#1y1{m,vA(D|UL[u(Tv׈?FTfQ =YlfcTU¿2WW&Uop];Ơp L:fݙ ٯ9 AѾ_B4keWx}]W ޑhȲEMa 0ǵ!#v뱫vv!?b33 ,wbcPd- #\(`B?mSaj\ \E+H"JP{7NcM6/DJS}BWQ?**oB0W:?@U!fa|ށh"Hm`X6ó %1ŕw.2wv}_XصeBց#\x/•a =#ct!U/%Lq0t| >5$_Ǵ K>Տ0{.V&<%K>.;3*Ἣ֦q zF@Q|6f5JMOc߀E 2Ts[wu'`}!yuÝsH IݖRH,Mٝ6h 'CC"͖с'Ĩ [WꋗhŻhȔIW8"?%M UF CGI"F}R/̯ #NrQM8xiYpmβ]Ax֌"jpV1K?%W=eݗD=s1jV*Ya6#Ii]em٘Ju:@5<L].4Z:;̰ro9btDMHTRg:B~%ntЈv\ YFBBVɤ&*?fR( vdrt;8CHLK]4DYX5Iӓ PRuJw &SFp&IJ]M;4ta$隱׉\V$s (Ot+N7~ZmyNQ3t?$XP Ωc=O ;;th;O^vrCo >?a2 -h^q"t}J]tTt cr%W gE}%9Ë/2<5){{ !G|Jvz!b7kǬ j| ffa 3]TCPF9;ZsQrsv^M.'Xȥf֠@YyjJw =H|{p}YPH̻>_: s"Ivcyˢ7w߀ >4O2Í'DA3f6Qs2Ltm6瓈!(*K0 G{{1 `PI^A!IYL/{*S+72* J z?u3 lQ?yŻc%̣INϙ0'Z٨ks0h-sbx~l|CbF^{ 3@=ae+?IIsvLt.)-+VbYXGd94# UuY*K߶\V5KQ*q]FD3B6( cjІ$$6R4AZ"E:Ns^i+}BFL@(պ4Z l)^"ĢMk9/"Ҍ}-?jJ?u=c.] 쯰T;/ߏUwxT@&@d8׏`7 +JmV8'*\ 'bZDNN {/ tCJ6-?pӽ[L3ZGO4Ϊ[ڄěȷn1αS(Efu!J(˝}$r|Nviy_~6\i%D ] $|$??/j"UH:Dvf35yi<מw@CI鹂kƳ&=lQy<O}41V_N~|N{vĒs{ [؂jj9N ؽn${$o*D%|1 }Dx[h{g:?u];d*]Ss{l㑠܎I˭qJ)Xrb$p6esޅss6lGP,.秾eԘT<1k8NRR~`m4-6g7ߐ0M!rR,gSiP xiGJ F&m׻W _xqA y@dNyr<6!pIA wq8SgV1P|)o~ Z+R|O1y˷L3֥Y]X#x>Tyg\8 U=+cV[["ڌv"EShf[ TL`Ml1,!jt7 {{5IP MyjWE` @]:;JVnJ3gE̫@;nlWc#縵b:~haK3 ̭eK"ZNd44H^&-?hn͉G!{zh!dSړ-ŞzO;`Ӗ(u2f^Pieˊ x,_!q#ִV}!\\P?[>`W&&A `8փ@«Mb% EikjC6ya\) [ ^( yqD(+dm?oC:(25}=>pa JZ~2l~RPH45°s e$ܟ9hOB4I0g(j1S{$׳?$Mker 7p-QD|{3d2onwAQץ֓RT6-yaj~f&G>l+>6 b؈˖+"-;2sN/x;~rmĽ)[4K4H {h<Y֖_] X$F>׆E 6'‘$E%DZ`5ScxIA*^=;7HDov[h[߬&;yգ h!\犋<|KoWǡN-2ZN<=f% y"h˧kq?Wt23myÏMgॊ{,J6C,̧BW+@ #7pU}yZNuxa ᱔a_\-}e%.+S/2`-ohIb%l]ILMegl/yS+dI $j>oxzwv"GSɐvg?>ݢoYy^2:Ra$ezH@@WI(P&ƣ‡q=ۢLP9 (>x&Hej}Y9^q;, K% |q{"ҽKw3Υ{{X %7 vG#QzO;⼺R7g1SnݶAO'FA F*spk) vjuߪ)Ѝn@/¼7P跂?h 2r^H8E  ܵXsfb_ȅ]];HK7ݣq؇DI*9OBct߈Q | UhI6xjDHAHC4"ϰ {[ʏa#HC }agr*io@a 0f3])Q6H\ﰁEhʏ8Ӕ~U|זhBEglXH;&eh2*׃i\nU ѠcnjiwAU":E@(tC$tw f0{f+hFA-qV]03:6Um(v%Gڥ*L*0`҂FPz\PwSka$8q'k6G64''0鿷/-+У2_&RIM]zm;׏/IxX`uW;%`PI D 6d>AjC>s W,"Vq}Lяu2hs B/ b |{,ľ9=]윲Y2h͂ϛ* ^$9(vm#XHxaC, NG|ǥ8஀Y-sԖ4 \{jJ_x*CNe]m, r y;'*Iw^| /b颔=) ,Zrk%`ѿJ 7 #Mk8,%};ŰF٦Q"clo̫ղgopi8ЯNS !Iu lݭLF D ٧!k:Kޫ}ZZp^tivK&6DL8k#ow:^8E~W)p>-7,Xk8'ehƶ B}ޯ3wzy)Q)‹'> PeN.*SM[}3k^}[IRLJz?Pݰ!i.T /Ķ`PE(eK;%L9t$ByKҙԹ"Jp+/8 ىCeo8FC2viE=#g`D'Hod)r_];f%7!F51JE, Y3S,2.e|UF RhF>u$77p,]umhps0- jWS+rHiGUfЗe%T#:F'̆XoXVvA;c0m@6XjC_5@=ɶR\[2:tk <O+@-6u XM١2q&1`*XV 9gYYCHm^:SN=6rԑxiC'i0W?rۡc C}d0ʼn,?5x; HRwJUiYCj.^nS.n36(KiDDǕU9b\E ONZ6ۚ/(s`{(k.S-Y-ȉv3, =(/jTSl*=]8HjܙrV%f=4u^Õ3u1͈S= {R>8Y?` \-eOj݋LX5"Xo/nJ. "8߇">/t0 ?0qJ"~ӌlC>UO49sĥA폖>xbar:hfև7ĕ-09qvl97vGPbt5",)U/"E(ȃ}J~پ)"pGUxRWvۡo<}v7p1mÛ,fiىŤdYǃh՗%XI7uBȩ!}@hǦ6 5L9!)LuBj_M<+H0OY3R| /mPA?L0?*K "G|[fՔ=ԭa0ژf w8v9F6.@=Hkӊ}MaEdOH 8 f5vxOKGN4BfO?8Gh]4h2^s#}xG)rqXjW0Y]4=< K}(1$=~x膯YIʠV]̗8)䩺n=<2t+ڢt2Ϫm1 173!d710J9m^r'B=K7A}1{%CH&=#MRn &/[ʺ:G&8_EL0eg$G5π#S\qZPwVV̆˒lgw37x ;ك&= jGɹ}!!}/?}s lK(ɯK=WŒ5[:9Hנ@`eP|+SF9(E":֫ ꠭IS8ۖK><0prݣLZC [ jNb{fk+q#ֻJ=*X ^rݏT݉ŢG )ޥ@Гw ci=݁BoL&AԪZ} RyZ1ck!dcaJC 4/z 7?+Ity?_&s ]BÓ:!h̫(b:ԽBoy+ߵaV8Q(D{+rePxFn]z ީ}]yOy[&T\:"hV;o(Mm}nZ1+]E]9Qk0\Ocz06x6YH'9߳m1j{Vhca6ր<%tLXh> *l<-uz#VY(K, LKͦPcu^5Bfo(sEN!{:Z !J-Idh,1j0P:=Oš2R+V jޒ`ԃ`04OΣɾg'V7([ε7ͮ6/E3(j'$~p2Lb)6vz&f]XTY /L!bΚJR7sq@9*X՛ٝr6Tm ;;]LQƠ?,[lΊJ+u܇rF L.`mr/JwT`hC:%]1ᐢ߯%+7@zNM[Eمtb^_pmy5[7[t'9z#a4;]>dz?X.0 ek3˷nѩZ!ᳫ$>{_so?hB#Q%`%d802^^ 2xcgTW6x  *0FC ٘do 卭ہؙt IiW ;1e>8pD%M02?]DᄎquOk@}Ţ sh ݥ.v))+FcJ<6 ӽ7yɺ4l^FLa:Se/kkB]Ǽczy 6Pg{mNh [iҵ=8ŞHRrPt)GACЎ24mvGAW) X(LaBRK*:]|̽Z=ˋ J}E?k>MdJ[=h}VIap~C"E BcUjxGߵ@~v|V5BXI_^uW~H/@  MO8i:ҝse,5qm`M1 m-b,FlXKekķ|ٮuqpHI LY?u ~ hMrq m/5<&* ! 8T(f7.D,z3̓@6{=7jS;FSԻz H'2 /Z۫ȩ>*bی/A4\jϮ WaKsdnLqM}F+ӠVNCU.Ǚi׌gHtm͘MwlNL/tA?GMav*w*&8Ӕ|!(zA%H.xR |7y _;;ݐ| }e~lS$?K8{"/I UZuhϚ aɐuWЁ _"|WJ9P CtߏTqZjbEBRAJׅ:*O1c},Or.=F<8nŦeIqtzqׇd; 4ͦ`b}7ZH %:mړ8B؛QT.$EʣTe|f~ c2MZLZm3ɽS>߽I> 7f%pNl/P!SAKB[!>D_;;afO`vϾRlкdz\› $|o` ?M}GQW1!Z0F6h1z4!#{)V@$Zߩyga(wCD>}`QG.pڹ:ȊtLKz ͨ|e=эM,EJe~~ֲ\d-`cUM"F3Ko'opArd2h0PW_+ !ѮWW(W|%j@JTFֶzRY)K@y"O N;G./L$nZm4CJ`i20AN_X8Jq-w.pvBŌ՗F剼Ki V&j\vʂ٤:c0{ CV(G ߓWceOz_3 .ɜ-wi쾐SqBclH2KI&X@8j1Y!ղZvk9!)%΢&YbS^n\eycy*5eu {"G&e sq͗7wRu J^?j)*ݸ/ՖDzu+ͶTT8cY VbbV pVZMU㲩ePO(hsޅ3.^(cgT 2U'}0PQPGP{Q,=\L|8[r/8(4@Ҳ^f>^@4*fy8:dm-ZPYePIuqgu^7shc|+Mˣ y.Yrr` UGsU sf#$d4$ ( &]F88K~*EО6ozKOp$x~x;@{2ȌwEO#T&U(͊ rCR9N02p[a:׽}.&EPۍpdE-sI^ A8'Rftu%$B9B;M/dU<ЏH˞k),4#浂ګ9"UZ ћ7ڧpC D+ 7W@.Y7"~C?[+{O h.Nʇi> .HR.>IAIfg@ ,KdM DIϐ=/NN:%"UaYi(,#"l/5t^Q8ϢoK1tЀįi"M{ʖDG2$ w&=UIAFLFUdww !?/2,@Ss1g` К.Dӏ+g&ؖtjoJ9ŕR?p-', ׿f! AvPXg96D-;$DdM@UkQ3CY9ꕵX(7wvTvE/V*H"KS>icԖ( 0ze%\4n*WNb$f=4 i6;0Uk/U7 $dACB_Onp%H_ ϼGe5Jd&ef@2 SzXyP^:=SNw::#T˳7{ Bɓ>qOUN[_l)/6a勸Cpl>LQL+[S.(x-D{H61]h4cgۘ[j$s٦%\yc <'I% d1=$yu@b$3:Si0bnMk"ݑG̃r>;:/EyY+%2r$JNJOum}H`+ӿҐ.ذi{X8tӪ3H/@#f#]qIFȕHZ0/Zìvu>FXg||b޽bLЊ,,e}8̦qxCAfL`=0lQg&{v&Z8A0V\$<@x}W&NuD;Cw[er";#]uѝ6zdzGq2(H6}NJn\|7硟' puRjΫ DQTZTsI%7_?n|~uh̰֧tS9sn %wL~7C] ٝ6R&'WJm) 흉Ȩ[k y[4G d }0zIJVmϜ;bSG&%YD)5 k$3H! ejnDžÝeKg^xY:/\N%qM%RIQu{JpEuԜwp:"[⨐9Pܳӻ}3CNcd2N.U$7a}4VSK䧦e dƒ$ϴԹ!ܩI2,p[wL56%SJ1OK~EuM_ÝB,ofPͱd"]*1~Mؾ3+9ι+KPղ^n~Gs{XASN6qS py^1J/ )FmL\4YWϫ "@z~ $$MH7G!W5#^S={V۝eQidW%Į4's5f`vCoӣ201?rgϧQ +LI?T|8Cj}&8!NSfq^͙Q3d+ִ& :inM.8V"!k;G#-ۢwl;vi6z,Gmл/xvhrEXQ_td߯U)0P{^g,G/FU%)O|<'~.+M4/:P} y:}l>rfJ Z. s{\% gn^gz\h`*3Aj<3Ë .l,ZjhG͊ q x]r@1nFı7侏oK$gBZ.`.f1…U`b8MG:#J!Rb=EAX50@@ʧg1~fmMFBۼ1pϠ tau6N~!0g뒳.*VPM 6KIES+A8BVڪ?K8*D=be*U' OG.-ovl׌CGF/ra|IHw!1L3I(iwX9_ɛVT ok6amF1S(7( ?̶u_uWfaF(=X_@~yvoZÍں@C~m(Bb d"A tsoP|Ʃ|!DswJm˘l/qc ۙt:#Bum8*4iuXGJ*EJ"}xyJ!ʪEpw殮D}mԁa#{!Y~r#`ɩWܷ& ,ˆjͧזkNq }~FFO|M~Ou :+h7Qr e4!vW(0a@ߺ }"( #)b}==SE确rOǭzǷf&_&RU`Wv+eg^?lߋ P_CzLL Hyk*)5r c׫.)t4A4kR*Nbu -Sf{.>L`\DzP?>h .ՠ",? cR}Z㌓FaSLRg:o!/5A9 /,Ib{O2q9ah.o٥UhVH\=7 N"Wy&"XW~1^Iy\UNuSg %nyڧuVKPneZ8NO ",:n1N IWGW6 HX07`2xIߵr]ǦdGwOc0NکF F{R1z%$%Ӎh.Xo#azkWWWIIR|AE,5.Hh.Sr,?lcs6qgwrx|<%ȝf7 wI24 /z|TZ8qͺOOZ_ħ0Nw/!o76j\y<ܚZoAmd8Dݪ!EoZe]n"h5תF_fmcQFL@>D\n"N-#Xd<Өֺ7LЧZ~uվH.Xj"FMM<+*/CUj+ԆЏgC4WCΐlyc}ǝT eɝLS#=(oT6wNF}.+| +*= !r6mnƅY`}mUтπR>ߣX~:g3 +9-^{q4l0--,nTsҁ%]Ӗ9atLe?jɵ֌N)'_.;)ٹȢ|s1:^E}v֞2mUUaC@T<Ӡ)=C3xK͓AMS+a8EBq}h|Tz밻{/ >tw|Oz4+>V3~P3'LxpcȄ;\ +_2I):\,E5]t.`qO '+~X&a@)X0cftC|]ڢ7e*V$-!b92oq`"<4o߂$vii4;e/^M]~)sVX\P]bJKmOCmp^hV<21ΣhȢFF,oZ0Fp&:lC3m{}~X6؂q=-ׁGcos$º>];U2$JV4 zw;*;Hv@"n4t{7V@V3w9 wc֣ r6SU7QQ:ǩ1xG1u+zxZa3F+Pj ^],ei:JVF";S~} ĶϻUǢgFAf+mkSYu4-o_/΢@>( 7\[-kqX8yYۆ2O+[ 'L_!!%IOw v؁󧜴h3IV"7 ՟y}J#a0ׯcz\ҝ(xӛ N>Ϝ11/H@%'nJoHJTcT}p~`*s'nƼl}!ޅD)Ƃu@GxλN>w!{-Hy&DM.&NW0T-H?O[Լ~6!3ABg)z&T(1*Fb%,|);9ߍ91x E,6E?ZI%UWyܪ&v"f>ȔB +ۄNt_ځc J>L' ᜞U(v߮{&(Z  Q}%{BQlnvt.ZLOL.7u1|i2SXZT:=vT,~iw.|Mcԇu1=4S0̫w7M :/ `qcnwz&|j't,=z:b͹$PKt|n֭Q!%wN<{׬mv8q|"q,"uD*Ooon#da.<%LT뺀^38WCf^QA%G7X$qٹ?=p4MLz"VyV6;%(y|ēwpydmóa![sZ2c1:!b14pEH=O+%!&wy _7iEI0ƒ+r=wb|zm^0jDQ%5j]4<6ˤz=ƨ+]cgs6?0P v_Jɲ w՚-V]͍yC8-oֿ nEBmBͳ?iB%q֎%E ;`RՔ+fĥ htxBuA< % n7~آӗ(7ڋ YD- 6&I `3 ۹NDt OU'TqjQf/W EHx>ދ+ GgKT7@pN}"+O0FLZ0|1Pnҿ܀D# D3-c܊t%<3gA,V@^\ !S>=wO@WMKc 7P>RH'Zer`AٳrhՃٕb%aQv20ˮRZɑ6'u @wH`Y.oBMYr&x' u$L3)y~&.|ȑp.:nńnyRX5WDoj@o 4e;.9VD4G_݇F"p=}e ӸAlt^'uz ݥ~w/V E BqKY#{i+ Lq8=}xWljX>B,^OxUf W48W߿6j ^Y;1À"U\&F Nul7.Jph~ X|}Nmm@M+|eL/L!`*ņo(#(%_ҼF!UaA;˘@ }ϧ$0fPi9[e"] JZع" k Mjb">Ї}LlE:!۸{$ͤ[ yy.s?\7ftr!TB nvFNK Ђ2MDpzlUkhnqey7Æp|RPun3)qf;M\7,ȱ+: f5AbxV\EdW]׽¤ >X/߉ } Ky,עO_"j+y{q i qť2J"|X,͹%MǑioaQIJ|`uOvHg-NT2;&(Lsasq^d]kOH TuW(%MOZsVƓ )H$ ڱ,%хYԸ:У~KF9)Aa%Zkng\sj]]_:NuWYfO@UV$I;Qʂ +F!^Jhz )%&Rzyk^I$\l_o"%cOY pj9R.7iG`sJ6_;v7vFMs=:lME:МGfmඨXhH-hK}mp_ߎA~H~Xau=ТbLΝ䇎??y0N3lШ'pWԃ_G`AHjZ,bG0G/4‹46 d :MA)?_vq}M7jBK * Ν]]'2 h.B h~ -C }{wO# L]e-\nS^슞ChtI,=T!h['Y‰/fz_'AE]|AGF_wC$H|m˷EVKr8kZ5,w{O"MGtgkO??v^jo vhi斪b]EQb ݗ^ZT}5,4nlij/Agd!{%:*' b#3?^?bKw~a=Н_ײ}{@~^:t k Djq.=WB2)GmXiE !_Uq{_v~(ژ-"4b$C>>)-$ 5vŘ5b F-[Ws_<4[2> V n Xr@u&)!F%W6|>DW?ߚp~`*3'81Z_ 65t1PIz3z Lo}/GsI# $#LB_^VU'E62yxО/vu(h'v@+צK#선y Sݬl_= cz?W(Ӝ$P6{e4MnIԖ޿|!]v6 5xaֶma3s|](^E"<ܾ. $r K]ʨDr%2<3smڣjQҤn(׸8j ȶ_[DA="5P%p_á=6K"=\K5,:G}5xcaH_.~jExg-7$rTImНIt%:Aœ:E!aPib# p#[`0QA!eMLy֑$i&GZ/"NJyt݀nHqG(.C4e 坱\CJ3]r f 4$n+'1^i/cKkt`09HVw7hG 6uG >xQ72M7yɠ<.s2zV`Xxj>*GY{!<yOEPS Z)]oLTWjJy)ُrKKYjTsڷi0{l*! J"u5kfơImB Vl^0\x{K]rSx!viQ&CF&gYh.y?($z1B_}6@R 7֝=U\lXE_*0,F p( ^.@$̠SZD}O. L4QjL."̃6=RR 'BH/沆WbsZߓ‘ق`d [ewxJ uq]MTiHURZ[cCjHt?щ"JE|,1[e3y$ZJ3~: X282:6xv\30)~|G ֭qXO4${D{>c\xXۤ5a\-I3ۻ'K#A,B$hxډm0===JN}\կx81Q%m֙xěBx'5l ]|3ڋr9N[nHڷ|U_C򀄇yB&[;`]1`.OV~?X*eg1p'[& WO22NTw8@t}e-ᥳmίBYO1#f`2?i7,f<;`8NH9$CRcBA~:Tƺ1?VG<>]ұI <46XJpf^mqحJ/VEf!7~}f,96Z HK;@!nu֯.=EҚI_6Q%mߺA o?9i\w±7%/*A5Y%((߲ [òlS5HAZIQ#WY׬L=83!y(=\ٵ$WL5x{u((dα C'^C7Scd* >\|xjy[oY^3ܚzd$t*y*RzZӄ,$ ?wo7:W^H,~mxRg}оzm_('bY1+6J}#9y$ےsc:xΟMM d]{fnE"a]ǎD+;8BUh(1z&îELHyT9l3!J{uJ⪕Z3٤]IIVՂ7  Om}[ 5>'{F=gꏶOM1> -IŁ w%_!6$__ (0 26F&_>| -e%(͚_} %(_ΧK`L:/duj%7lB3uɓR H0-Y5A}OS3?0B2CL$]"~ q9+A+KB[!Ҁ=@!C iß\ dlf&@Jp=a<9Yr2I's0!E<2Sm߉ʚbmL8PջZ1ڍOMDrd!Yd"\(L1UJGA`mRDh8*rk0ߑD' Ia(.JAM{eQ(۵%QOE$p.5A^p3!Cǵbۨɚ_0CkĂ2~Iq_??}3}FNeeK/؃{T=qƙ!wu߻YLzH6}V<hHWo)% /ȑh[MeBE,[Cvrʂxį|J< 01ԕ "ou#ؠv#{֊괝]C rn W{\t}nxAyˣbJ<䣈Xc0O,}OqG)>.ؠ߶"8b!}ޤSbBX;,u^x<,>WEL7n׍l0/~pbGSCgP_K9Tx\3P7753H!\F+=zHpj`q3/,(l͂lήn MpXhD&hqJ&dpJ⼰ ^biy[ Ʊ<*\o@ھ p*>;IH"gNí{Ҍ3Rp't/0'hD(?_ ԁnb kI7qpMA~w|_&C6̐8jZ?̿2&gYײ=ߺeB!߹!صLń{ mk;sٺh'&/" J|-=J& kϕ]ߙ X8N 15n,Yf|%KmEsR@{@ \A/Rߘ?!َY  " r ]qЉf?/?o<,\G vu@Yfn+{?Sʞ.-F9Xz Xy`9b՟ ,vvDFγиN\j\ 3˳hԘ\ԃ؉\ZF2ſ)$~HfF'׷=ڱD4/?e_Ǩ(796ߏrNEb7UZΑ KlPNGݚ3%!tB~41;8N-YKͩ8s3oQ'cq bdVM{˲ClkKz[l~+t it^'C̀X  _hPRɿٜ7Z@<]u ;>84$lepR:+n@`C|f\ě'T+i -2(Uy٦KOpd QЯy*Гt!~p9~]8[ͱO4KZQcjA#%>c. V'gMeUDh+0cXIϞy$I#>=AJۂjK_)1aΓWRU`7?)^;^-\H|-΢2e1u 7Ym }߷C%9orZ2RxUG9mVd.yK,W)EИ tJ i7>o 8$²"h*Vڶ^JhY/o @{UӜtH%F^b݇6:UQ< * T A##(xr6zmgV[rT"\Hz? Flo񘃮UqAoa\(G:~oSu0<e7^`ZÚw T( *x[fO(P]{R Vwz_ ߦbiĮM[Z qD7k آ{b&J{%ֱx:ݖtnoPk7Dljp+ UQL] bvUz< X2ӂBk,-r$tXr!L;s7N,,~8!D[֭2(:/(O N0ۮ2s-W/kexB} l7|H塚]KWy8EŒZ.$&uA ` 7qo)/̒G>t9E;'hR,(Sϣ.oG?lC&hWلol;oɍc#O݅"_kd z};Y pDZPߎ:UU@Uqy2.<$rNJ4MX6 W}m>2EQgSkfKw&L=y:A~^guOǁV˯U]+OgstRd|pzD1IP +J?q<[UҬ|?~j)^M:V6S(O_"Zndl(ϘvD Hsks\@Y)7\CNJS巀cvny2u\e)<|{b zU`VW~T6&ǺtK}dGoݴf) H^1 6%PgB$iyΤOer 3=~`L[وXëLS_J2Z Ħ7luA& 'c$Պv N-Ƞ~;ྣ@R-bT$~㚌@Y(2NwUUm]=Qmgײ qLK$sMY!)Ec7-X>0c!v ߓN9{;(įΧ3#Y3sHS8ɍKCG 9_Z nH:_N*]ԹTa, I0~=Lɢ26 Aུ75 @DWa"5yuhGz`0$2[Z=h)&7'l$s2m vI|nnnxj23$\dq.>+Of-[haUh*HT]!iӦ2V1 [)HAIE,-䏟kW0 iFclz%7y9 0C-NC>rn绕mP6 sqXtƹDR:+)}rt% ~ZpBT0n'lk ;U0dRVPyd x ]/ˣIIH 5s];Ɠ=`JsqjQ]ȏCD%h:Y!P*s?:P o#~ٍ]XB7Ȣ2MP:xUZѕʶe5=ܮJ[k@f߇I8@e6 $^.]պ] RIso,Dҝݷ7؂wtwB)˔(7QZuE̕zi$lhZ$2q^ l% RßQ㰢 QQqS6eZRm?#ā^g ծٴ{R"]|Wp{+y5*3UyHF8 ʞb+@Yy0}7o- Z) Ƀ;0@ *>>4; g ?H׳,&0 Yq&oCٷ+Ό^O[:QvC_ 4gZ2T{Zzd +GmhK?FgEy嗧5Y}mё3\,T CGqw2tFҁ{: J 8b(x`C [p qK]. RuQe8?ޯє$̔af[WM-m&^Wk(ݢrLR?D.ULE1z:eԋ( UL0W&􍗸ɋ?3jpm5ڦa"2 !r{tt\hn2`̫]&X7CQqigҹg9אPlķz*F_aqGgu))8gk5n'AF:îoJ;.#̰7!ĕ(髴R]D86xP2bt#5%1"ͽj X C*:k;*^u_%.]Mۮ*oݖ,Kz(ݞUyzN%_&XsTπBn"+:6=K*3-2nrfY$Rٯ~ wkQBtw2Nb\p}سm+usikqDF"1g"u*Qa'%,ߓlV}iAf1r^ *[|^g91ܘ"Oi$ZSx!bp[D瓗})wFvMDfFp+p;6XK:U}ptv`fw\ 95n_U~"h踮M!D c iD=`w!2rF}Ԓ^t]լm]lB:P0;0ƿR be/L0,U(LReuΰnÖfhoJ}]?18nWI:H'3*{{+1ZHt1BQ饤8ڼU"n ǂJ-- e}p !R_ƛpHZ(Ԋ`W0gO[;Wz4cHőo-XsmNzmSzVrXeڂ"wApg8 5]SuC-P$x&aW%MK_LkyYoŋP yF ,x ~0V__+^!5x@ xYoǏ䒟exCQdt7҂,rO2dB8l:>c58D# ݎnRf yP}Ģ+- $ʲm>ۗ* \5Rdܗ2ՎWFih9pO؉:907F܏5<( uȨ.1&`}]H `}p]2WyW=Y7P,6/ӭ҃43&qAcǔKޠcywRD [ o~:8/zf,wi;`yMH6H'Uvh0W ܱ$^\q)vu"yr0 )VPx"F֦6ij_W(voҵf?YFXs>lDki:Xuakugt)wm:cܭ~B#_:+0Wg81>#D{JWŻė;}ZM'P ;t-2KxfȂJJV~[X3 T~K7Zgp&? &S);|<. ^4!)d> *5SNt'ZoèMd*H0qEËeA߼X%8L& vkϨzC 55Cö=5ރ6wyV2WxQ@p2`-0gc*qBi8%^Mذw^VnEUs"DyϛB@3?劌P(+bxtmYƈ[/nEJu{|I4i~_#P(~X9gѫA%gvu` E7ŭNd6#7N[.\^Xh$ճ]aEP90,;w5\R7r&W %/{:=xխzb)X+sg _߈_0+id ڎ+Zi&X0\!| 5MeYOF?9Dp(\͉Tۆ1 tAlޠ6Cr(Xj['P^D,o 8R䏒UچyL5C }*\n>+WkI``Jtsbw*/qfoƴήUx։#oF_ g ZK稌GBT,r /\!zEG cFR[UXX͹>a*!q,: \ldH\3N4\e=7bT) .9z~"B`{K̾$j"r\Lvzd، ΦWV7H",bG6/"JAg xɠzlI71 }p =L8,k\xcoǰVw{N3\eH5A8L1)g4 3_"C:V8Sf~(U~Ҥ̮NPWyCl t WtW9hmdL9U = ~cי*aJLr;vv`E9M-?] '.9)N%’잰 H|ׯ`&Pg )\y̒yI̘Z|xe+ÌУz\FZzw?s0-:L΢eqjfM n\Hx˵<~ ̴d=B@|k돱Mwf^_I!ag{0`Į&X]8l#YIsˡV;{֕uNadz'ްF"1ۤdJ?ڮh@"W[ZnԸ?j) KzT?J#l<_lxrs=wkK&Nͭb#;1fx"X_{|*G_)+S?Xm`9 \gvub#Bٳ>@ݿI"UʡQU@#adMX X(>gG)}h)u0;_(:;A\c^Ȭ QĎM ¹1/fSy`']R2ET棠ژ/\!|.F$54](SFr:|Tk{:%|d' z[1[߷.}J0b"29ip H WxxPHlm쪱vvi:?`dD?4CP଼WFϳC]Wp- m1T8*@>7M.r( ca-Sqۿ۪WOM8 g-> >x(B[+Z~R3)} eq{ cmmz7,x(̒42κQ}=_ҡ5Ͱxjky0,>N*w^`\z@l9P=f@nPkL7HUD-~Ӭ}DZyFIu3}EmAO2L2Y~RDotS@cMFɺąwP9Cf1dpt|lY*^OՁw+f 爵Uk9t>j q2yBGpEZutewLr7huTˀ<к`r!ý Y3Wna@zo!f=**Qһq ]ι8 [gLo">pHkk LQ` B?*^~*j=rb-%ic'f:-֧|KJׁͽ}gڅ`wE̋@J`;불>Pv*QX2XP_bUB! 6@Ux1P,mn󙸬9 c# ]ܬIyU\~n ;'Tȁ._*2ҮĄaSpLpoM3~R>~'m¦xoODƢ=ʀ^߮|ӕKeALNo* Dj}. ,IŢ IʟUtPgkk"כ<.9'_u+|FLݠ+G \V\),dR/Z ϻJ En.7^U7g]062wε4ʤgKU&IOaθYe^#0jF̹6REL&]qYp 7{"`Ū?OoMK'vBr_bV龼Z-kHio8wœC1[pqFoЕD[䠢?AHQDʋE8[Z@Tceo(1afԂBt?!t/d*#$ffZ0j Â+Dd}/rg}@6.u NpX)S7\DƦkK¡sMU#(7&N-0!-BCp66.l0R`h*Ftʙ꒪mGٓUҭ?bq[Ǣ`/M:}^:qxan )1Ej{w˪ܽa*FD^M ~eNb7sL/QZ`u|Qz_dc}C6WDуz|Z@\iܺ`%0XSE :|"+elg  aF t7(G-L-gZEpٿpx`V]oeFE-R K2`ف ;"jl0Yoni~anjχ{kH`Ɋ&VwNb1Nϓ;CY5+(7u%'YE82j[65c}lY\<9nrV#οVei2xY56A]/Hm(KB Fm p>J[;F+Ӈ+xõ: 1ὀ2(mvR3yXyJs09g- #ǀu wi1\M堎lJfTƠn'W*bSkl~&D]ZR Atڴ\"Z.[󅡶av v{__ b{N5>NYGTbh&$9;C~|JЮ9 6_Xu` u1^w+2CC,>}-0w!걮N!dE'I.U 2FN W26M RW%O~229eczVs7A|XґH9ug{bjb_F:΄`|rvK8q^eY-bjzpcD9Ĵhm`3y/;y+S9vkH 5d/QZvCӳpaQ ζ^~A@R]'l]앪{.ro1g Ji^ TZ+]Jt#(u z l%JGL(ew 9}\v5U;B 0!qj5{BL\~kljv#r<"Нȼq4 q袃 3TVcyE. /c?{ -MlӍ'xM }[Q62j8@/ ibMRqVty _Iԃ$8"ymA<ݶGӸ@#fLY\sG@0{p^t34|G;~BGF:JT%}$JWz͟9P~0NMC|ȶ*|{g4  O\=Ô9c)*_y,h4a@;ƃˊ˖;yS@P6;ǧ}yc[P۱Ҽ5%шveI3SZb |.qN Bq3XW6ϛNX̹!T~F$MYUu`:.d`Aɵ/o*Zo- 98ڷ*xc遪[{J4}}T:4#'p0$TE X3w}G[ Cਫ਼pjf;;la=ڱa.1>!̍%\M͂nj!YBjHWL͌KHOPn`csEiTly9D}M(3<L9f-%RUn{nx̫JnU.$nILʇgjӄNAZuINǖh-(vQ'*VAN2P!"ed:ܶ8˳7 iRwwݚ==>xV3^b=YMz*v4ծ4ܲC])bSpwp % %)ZcMѧ;vr>`vNjLRJ(]Z1NmBQGvۿ̩01$BRUPVAS`YZPAnIAlLK[ WR>ST#mK^:bU\K}qcNړQngBKSHӚaҿ/3.`ΘGGK(QʎG\(B[CSkLtC^4;Q16t esxgEH+ȱ _R2Z1eS4m| -&\oqp\@G҉.$eۜݤZ&:u5\R P_ 8-uݿz^xB dэ $vaGSb٦ #]٬J~r]Z>m6L0\`@=á; io!R+S4j=6{%|/ubs];PVD`t'@FqĐ0$\!ਲ਼ %:a6Ɗ7jip5SX.*GGXHj}PY b]Cl%ܗJڮ1W^" 3_s7X`8_}{o 5 <܇CS|'K 2 \"AbMX^p6VQylo Ԍ{E[\ޫM @Mm d-xj5dSפc!츼ӋuAs9{:pcz8w1ıǡ|],`tq%^oK7z|aZ+<$ݠ82(/˪nN?f\S5>5uJek>j&1_]9W:4F*i4"NyA?@s4|0ԓ0h8RVHSsOHKY&ᥭj`P nJ%0葪IGb@`*Lɤ ؈[~TA6F,k)Wle%CTey'L,D uj >uxf5=ӥ4d u> ,wW-&FC d_oZ'g) 6Ave=Gk*ٳ -2ge>t_&o9tn<9SOX^bN5lkuB +WBFĶRZ<-iue5M'J箾u0@.G@c-,5l4j';̂iO} R"M@3|`9|=CV\<7C͡b= 6t1b6ӓgBWg6y>J顿qJG ܮĘR Mg.UTY[t EʚƯ"lu~=K (5ڍRK!]YҔ vꇕ/m^1 fa^vN?ݐ_ &=x$N~uyElIA@h4 Z:=k%^iޭ'=b DY l v[lՕv Mreeph@~Q|+tѼ·;F`.OKX{C_+NfCBtyf3ބʜkX[ n=Mb.`c;uD H K+o8lp^coYA*1] !x<l%4w7/r*~$(ӫûw0ˍYQHkgێ^2ZXl\םrghF{AbƒnU.C3u|՗C,r6d˴p`łʱA&RrQqȽoTUVxd$;Y[N.+BV)v1?kM%d)+TlaO j},V oai\b%Ąci<.e¶1ˇ<UcSeZBaL뫹 tJ6M+0\[?1A?DL߃EMxuA8R tՉj|7-5%&m&ߵi&_66&ۊ`'WVkd  őSn sh'k92)W^Lt ; 9oN[&ALŨx# ]Kic2>UD@5"hC4q#_XJ7"`ejq(rJk[BaǴ܊q,|ߦp*5CM) O,.B@7Yg\@wqȭ@I55<-F?~3+9!Ryg՟ ji-(l(pIUF͍|f(/MK 3(1InCjyC-G M @exgԇtv嗝fGt$/DK%ȅs]dHszMͰ<ź|o(oe/^\JTZx"g6~p׺ؚjd)|1 uo#5I$]Q%p]_6;T Fk_zb"mMϳ[aRǣ1^7-I- /Y(=wd) D~Mܙ#9(&3{SD*>d͒y-7=EIuC즵JkcYt3| ,Aqy¶xD^Qo.' 7x[ c;+QtT]h( Nrl|>tnÎ~1!{k#ɞ3\Md5=g!,={{ ڊ%Y`RyhsJ0F;kFg$AԽ1{^~TPDjVj'>%l}qqA;DbV8&]o$I,{ wDrAi&(+bFNv=e6Jց ]~AM4uNowvb{~/@WzªWi\MD/EVpO|+!lvpTfm#aXu 6 LRqG:DϐIO"Jp&6bz讶$-BC 5ki<`A wWLЈ1CtƦsG(<@|Z(| rLL1pch$dVgw#Dh& F]nLs#L4Ka ~Q=č(~[9róE\F3xvz׈' lDp`Y:0 > /t(Yjn;zϿt˝.P _:=q˓;S~) GkQ=9qr5J&u1LuIQVtڋ< (gةgș *IPs&Oo.<]jl$GF:bg=n#,7w>CϗL$H{T,vY,gq7Ɏ' #O*Z5%=ڥJ9L:,;][UYْ[STDV,t<2\uW/AZPD&QT [. -s ZY<43SB/59ޫN{r+ql;Qx_hc@3ؤ€%];@,D|Կ |yF>W^$=ʯ;qģsrtI0Zğ?$Rӵ >}`}v|joi@ϰ?X2eAE,w_nym|nGrs-pTZKdoBZC۴]4&~㉲4*Ɨ6sL#mu+d]r@o b >t84xff2c%{"<$pL;Kʭh6"aSi|dJDk>1~o}gR%bqRr:=7˻OY^]1WfMvGJK<:XRSFP:bz\96 <_ /nr6{ZDJiD HVcrx`-$aƦr qTw\TV^">Bbn}aRXSKĢ?nzޮY7)!ӡ&ɋ'ί%~L!}EJd2¤u&0zT7ZucvBAxa:8`Y(*NcٵX\ݻ7ڸn 7Wr7m0Ωcч&J#̥2v:&bEhtJ鈉PX _4;d*G(=׹LCt'qG 0P ĔN6_ǽB$<:wgS7QZ6?:K]T03oP*x'ɯރ whC;8QL'K (Dw Nt;QfzE4g=^ɀ 6F_>H^Nquҿ?ssZ'Ӟ0] |^~F; O(Y/co 0b+qeD&u<1L# h4NRHaWV)fxɣTw4$`5@2PlջP)F#t^/Z&WnCoi{ E<@[ 5lҕ_\ ϱYG yq;K `bJ TKMM,?O!T2]2RX zɒ&Wq ~'(FcrBw:֗w+i|rvxk,)m"JOI?}[?: ˱J6k/D&qc%bIzvƊҸdu._žcğv@O0'F Xe5";q>\}a0{A, 4$YXFlaZ;?WK+Y[1:eѝHKTa#OTZ;Z_S(VE6y @X;HuaY :{{̷^#Bm9(A6o|a3r';9.>6{ ouv1f"*t Ko [݅nF,oúPh1N--IVEŕsב`&}Q#7xVuG$T9y3䌥F Qܵ-nȎ)[m/Xz]/*!8fekְ ]v1D|Q':MGB)6waw(WXtݣZΧRÆE!Ub4O=2j9ݩE^5dG>CUW(};w5!mYe' FW>-ޔEh6i5 |B1<4l\4"Q)8L~ |&5~Z`WI㐷Od5)e 4pg H噣y9 /.]ى3BF.C˦WpOʤ=RơdBy#j W3R Z^?yx`=TeĮPi$_6"2ˮrZ}4˂z!$:- CF%A[ꑐаA)j޹ρ1I1%p|79jgtF%P]5QpcԤ?`{;K]pO{-ݟKGeyml "1J?aTd^ 31DʬA9h_+J3խ`A<˷ T_x #i:R9LsotJ)[ y}6:(?Eh<^6kAP&B{2n%'GqB` AwO qCHCA>MdiivNbk=)+ڭKu)g3MKN=Z-'dX:p`p~ ٜh7&ƽ|`s@BS\‡ T>A>sj|XytߕP$/XY%Ws¯ rPg]swnvQt1x]O+74i}4;iذ&l֗.߯G@JVO~)ʍ[XrsUxR&dTLmrZ3\动I2 `׉ W,1b{b)y$^ x~Gmk~Bo4t L?:|/zXiS $2*e'KS:qUx'A'kqىH\uz%R+bk#4۰|Nܜ'y9G 2qur (ӕN wHX~ R<9XH|5.e5`O!jm ~+2z &t7e_ӎl! U$ےP4dT3n#rtǃ4LMpGǯO Oqp8]NTats}9l!jLRyQ̃2y 4ܒ@乶3Gc9i26 }8ۊ0q&Ƿ,q!38>!}3Jo1 jB_ Gr;6\)kll:W0Guj.@q(U9MJ1uywbD֮Į`>(l^h^GOGA)IwBH.GUC ԽjZ57Oyxj;\~5R~s- 1 )L<9P$ FSϪ=kn}mzRjEքJUHޒ$8u:=Ũ0 :\w${HP(΀|ڊ@ y~9 sW+WVP"0o>@!2(gm>%' 9Hpa,k*2y}T^H0 Ib5djVcb&5 k4PbW4!ve09 iyo_`s إrCCLرL\[în]9zXIAIAlL;%7;p \;Pa㢹@*15d哷pVՒDd!'cX/,W"9[ᬩ2y6OzPc.&|`G\v7wx6 X@.8*d%u.^qXfN(갬 Ԙi@/!<)q(Qv+8S!)sQy}Rj B*iQTl^by1HBY mH66CMGnL!җ~K3Kܺ\ ?*s* U9/;Yfzh;md{Ezp+,#FV~7˕Tf1 B2aU8>]n_|H䄍&y!ciKxUYJLG+e0v@%y+$&Hَƚ*-G7:A(C5Lrc[(eJK=piղ+xwowPG^޻AýR> Ē%e$[hOj ءiS\O =:jynj>+Py]B*$߀ x$oR򵗿\#5E#IzZNW y<>BN>pb²M'# e7N{IYNJoUAOƌk˜H(ބ ?>4Ԡ/nHGi5Qd+q;;g1^_ 6R;opcK$wjm?٭(0e.a Ԟ3#ҼlF;A鄮EJ1E--xT{l\3ȳE[*Sub N+yeH~IxaeY=2GAy5$S~lz#iϏS^c'JwDJ?pښsx$:: pH'GTJV9G; {,?ztMè6s6Qƿ0c *A.ϟ?bag1p1$?liMDߟ'3/NUN$R s${U)^ .@Ü[baD:!*"ૼ@Fs,9uVk5dmu t^Uln}7Kka}qUP:z6xg"P:p5W+3gn_H,z(fI8ĘAŊ;/#5D'm0yu +•|ym^Z䲝3{/oj"mOڇ&o/ d@KHrӋ)y] ˵ h)?b+ y0#P^z$Rs2/{;$:RՏ"$]kj5"ڈx/zdi:mxSo0q^[>"{I9^j3ų*A$yT™!ů+(j;%ßD}ȷs3zKK)ŒoWPR;\x0M|kWeto=09Mq1y KJj * 1\S0=ÝOYwݞqo9YڬךTBcUp9P'  Yڴ[,s;q(nw0P_t7u*jV,HWO(KLt[ Is䍬o*rl84 b]ڒ 4cv!uߋyA3dTР \J=H$\oZ.΍)aO H =XʾT|cQ9^ykd"ۇRqk;Akxm}X@W%4 ~qmnKg*0m#ٟ`.}rQ]ޛ\mVS2P83mQlh qPǷJ4 A]s9.•Хó3Uu&[0fQnGTS AW<(_s&@rK=$ַ0Oqro}\^.|4yL7Nqn- V-cf`HY}µEx(261VB$Ezk˗"b" lU{Q[7fЬٽSیnwa6,^%l &!>L4 5$XLBbH+PYX2>@qa Z45xI( m#9иYv>A`CþL~zUâe6 |ᜑ6gȣ)X]ٝpΛ,~L>o)Nd8eLX/#grW=w=$<䰡)>HO[~hG@Aa}:ވGN( `܀j!Yȴ &YVTfA%r~U54,TXU;U3ob0W`f)CdgbYL_$z{3VvX“B~G~[B~6k"[=yuO!64%@ShV9o-=N 2Vڏ)bO/b[5޸X@+PǕYA 6Ez#diz'@TwA-0NYeA"sDnj Qxp\c1mc`.{_wK';7Mkf _?!:[Y;OHl?WNzv31<]g<*a)k#iە 4RJ\]]q[2ڐg^㸉tةH KHV.NKM˿(F&@UUPLr-]P / 6yZ0ʆJ#هerT/:ʲ{4?qZ㨣oKfݥ~Z񡭲E)eg@>xFUa (cOl`l e_e/Fح`hن.ēS8 Z@cq]C]l1` ["Sw9:&@$&o]TlρI7oG%ꊁT jJ%~=9K=(KQ#6 Uc%I­:M_й35rx.Ooe_E(϶$!PXn\qPmZ0b<օmϰ ™wIWGc#Ago8!{WzR:Q>|=r2'6,6w'k-r/X!s mb=YfYR4@/{)9_淙A)A}e⃓S^ߗg\imb ;sKim]Ű!(ۍ x#<)G9/{M1~ֈ`kRyZA>3r@Qc xSoʴexW`-9P?v-6D>Aң /k≃6<$^G$[2ԥ7tl>V d0X,VI9^ 6NW37QF=%0?_l q(KC=VnjV7I`KMEW&ԉ_{TAb@8n0-1ޕ;͢M=%w a~fIl(t+fkIIB㓤C],'$cbVt !Ո!\s,+%<$I*aIe5/_1.y^.ޏ=.SAY{(qqddFL}dO_sf@y}g:.}W_1F苑Aǵ,8Wiy0YZg%ФPZafȚXoOkKXw!n{&kmZ9B+(;7-*_Y~wuJ݂RZv]E"aM"2 XHig*CѭUCٓS $0,C'T,P#nnrilc#VRLv\Ҡ\cƑ\z9@(?RJsIʗ8j PwnqYӀ#;۲\-eeFrns3n;YM!K&#w6!q!WAE,-~ˀQ̕-5(`Wom;,ΰ*FhOVR:>cP&LJOक़E[-'` "q'"߁@S1]6hed 3f9b?]ׂeTvy1J\yBa `ꢱ4]AGRT '^xxB%)$1e[Eg$j Vrsїk0:CSOѠeI>G^ #Y*s̆" EVZsI=%1;1?OGMSWMB 9|ek2{?kBoEdI8"Y]ܿk&2/11}:3kAiuf,ޝ8wRKz.=]x̿qd!(+P~{ QIqS#\ev0ŭ2 K"Pwjo@LҤ1C5* 3QR*ּR#zFyftnNSAx?P]+;RL/c-HN4 > jkvBfYVA 4 !>3P?>LBZGKL ݾ% U> k <x⎷] E*5ewǷ'g@5.AWtf)צamLxULMs']B6OLlr1_XXu *{!쭉׼n§M&(yup׊R_e6`m0Eŗ5)٫O到Ġq9p։ӑ]FRhp=%QL>oF@$sMs#4DLMf, eC >c}̘”{]I?Q9f'vD$s7۽?,\r Z'4KU}*%ēr(MrStvJu宊>HʸoHbjlwh;$~TxZUtFQVΕ@}Cۅ S++K(hRUcy%n)`'y=˺wMJ1BZ/ٹM2gj4K&'}xмxD5WCd(Oԭ!+zt=6}{>\9 >5QHPnt7ll\B<6vzg:uDF-ءh/͌xK$x! 6(.i&xJJ-ɴk@:y \~+U&@aw3"dn' !q&3;L[Kw$*XI>HK*FTLJO0A"#j<̔=6 h{Mq5lnKEpȡ DW (1LȂ; UzÊiZomJ96>(z9Dk/;)gЮHoC7% "RĪm;=;pvY*zw*0fHN$acO"\M 7?Bc!@MM+78C'"[7ڠlsf*I!Sf*ؓ{hq5̓f/z#n* Dd>E-t=2kyї[dy_>& #,ݟ:Q/w;g_+2,0ުo ( ~S'ul1xJDpXI5ytED|5ҽԼ|cݙ >X$NmU\Y<3mp;ǔW.-B^f[Mxѕ_sf<6AΦF*j4D/cc]4Z&W20&8lmQ$h>ёKQgͼ]1>+(X,2ޤ@T~h ࿹K⿿̹gKY1#LJsXC?[VW Z@tmsNfHlIٲKJ&ݫ !<. n{UV"1Ki; m=Rd'Wf#{}c-Fzx2:=b$pk޺y: Q+Fl7R(`VX3 PH5 8mݪ"suw$jI*o A.櫢"KHUR7_\R~%z1u=8PF 7О;Ύgxukg t:dd0Ꮡ%O::-2M-*P׺܏KhrO eCYӣe"F9v&u3{rHq#lKZBb_[_5K-HaOO vrїɹX6QπZ؞l+Սp1u1c$ׁZ4;E#5Y{ǥC>P| $>߫R'N+pT}a<,Ho:Pɏ&|dQq1Ce#-6]85>׬=\t ~E%r͍mrv3ZI(hX>DrK:lg`w ) ~WgOWM>#QY FY?$Tw6NKsbk;> #i?Sx" N[x䒘ᢔ.GLin1ű}5ys»ᙶzZ`X9T% UjoZἛN/gʜVW7RĽq[c@^HT<]9L1#3c$JL;c,8.Ú^LAƄ/8T=fxe3Mb7m3:B2`c~p$䲧9 >25:Cy@}p5_?Y}${^\fL ٽxKJKjox}Xm}m}{m}L?o ) jBY|, OOxSf6g+.}(-֯Az1iN?dJId:/=tj3%auϥαgu"EՂgXydG-tac 65o[S~gaZ9g:o`tʷcQn.mץǻoCJ0xPGЗtIhytP:ϴKU)%9Ԍ`h;(ql1)3p,>m;dO$#li7.齜#9]g#0> m4Sa: p'7?ڧx-$3μ&JzѨ*I,<2,9ե1#}ZX5P%79ۑ2P#@ A(4o̶lmxU^v:s'ol/]i jXʮ}m 0ﶍYw{Ms Ony>5F!ˊ%w.\ w> CؠoqѸͯ7ȗZc'L?NM|cNIH9)-{*c@51CF l$+'6??w@]gz W- JWv#I^)Y7j@<~)e$NEnR *Ca{[z`lTc(WCZt^M=LjUL\-?ăkJa* :ݬo}ثi ["DA/aq5sADw]gȫUcntS|=g -.hU'U{M>wgQ!g0{+'@2!L>7rIugR@oT6K3N_))65<OP26Mwn=k]D¤ZOYYbOup'vx3wGV4NE9ācndkCP))ISAVC~H %giKV9*CӞF%2o!n~:D6_]IԑױH B"c׋Nyc}B%P 0lȷApo VWL:">`WO$VL[mζ )V5]D.ҿ\nws[56 ӾhC&򠝓 -5Iqv9ScVwŎGWGKJH6eߝ tP=K|5|HR+v`Pl;:aH7e&&?d'{,po3(FgbV2=1vpW+ 茨=_w_Ġ3٤o+7@X~}oHoR$/85P=!IH6JcSa"1` ٬! 3aaf}Mi,w{EZ~]RȦ{=nǢR;SM33nZ#m7`5K]jl"(u#\_>h3buQȭr⊃UQ}^ 9\Te|)V؊O3CҀd2a `Ih۸SI5b2crw-,DJ*fɳ:/|^oN-ʶ_,ۯ=8 ҀLa6_T#pk{`.'T%u[&3.gu\CN,ܹyߚC$K6tޟK'߯GxH*}ӷu; G pA07 (oqa+E1ԇpȱup!R|zI/.##h?v>GA}:x73FK]@,1X.2/ 8܍'6 F>'X$ O'Q)?(P{n&d*_br#}"bAW&Ø<;Yʍc}xDi([)fKicGfWkױgb:8<1KzD3*x=(Ї!) S^5p7('91ؕrʍ᠇M duFs=d;-ed!ox rG$MicʠslTzuE"mʚHȆ[04hAK^"Wo?ǩiv*営ED.qe4NY%o}PottU`f6>j%\p!}]i [0U k6DP4ӏs,4kyR kzԎ۷MG!:/y`1i1՚*hL @5 ="?v芷'e>!L3o$ (\ & ^7f7l[2KP_&Š0A8:2jszu޶Y1&4@ 4JOׄ툡hCمp~ eԸAڡhB6+KTL (vNyvŢwF|&h,Iہmlj|:>-b'.ZZk?E L|<6E:ƞj<џ қ^jliWlZ,8zךqBؚ((~&d+ s Ɩ3K+]wIh~+ږ(Wi!j$4ưo@gl( ]2xDNzímz?ǎ-|C_?܆H3-pʭߛ?}{eic-IjR$&YB"/+SG+G&Z-VoŪiTjoXLoZ(^wuTkLC`Cp_02A ֏`}2NVIsX-cL!e5=aHZ3~%n +pYEf^Ll֎{5bqwOvnb*EvR'>C=荮>'EX͌3'/{0*&nR3[zh~(p;<^":?WԗBM$zLt,!` O Dn/M߳@_dLE$o@`0u/2<ƫ3"O U}]iƱ;#i߇4]-Ƥn.sջ@J0+#$Yu7y28 Wo?Wln5SC hL-'^Pj>Gk~ [O2Yd^ir[otM,Zˆ+yzWβ{NL:G%Q^Ix6ip}vtfW%γ< 68~Fg<`7 do3t~5|(bŏ! )j7׵.Ÿ-} <65co>K \?r{z\pp_^YH!DPѭMY,Q"ZQ8̭ZS!*Eu]VȝWBIL,Ϩ.=]}Lɍ_m ڡD'Fr[3@íD:SI'pwLǓPVftn#ƦbXƅz* )xa[+Д?J;Y g[{"DN66 PK+zB ZEN,(S 6 'k K9rv>*<6q? 1%=V%/|e٥O4tMj/ʩye]k^!R3J'Oli'#vVg^]Gژ?n-o\] E6F mLΟs.QI*URmJW EY' ,[8uEyӎ3f r$, [dk%I8 ËXci t:nl{ޏ7MZ(3o̾`f3 ԧ|,V=pnd~* ß"fE-lFBg'a :A ks@l<LjXMٸjnoÀp`uyS]|`sw;uhRɎ¼)\֔=d ^tEg89K*}fy.ɷ3{4fs֥r'"gK(GXd<ˣpTOY.,F yW1= aೆ"72bށL|Ne&jxOsoXP65ˆȭPC' 5cV$ׂ;j k^>ѻZ/}&HߗdYvo4*p#efd!s5'qv Q:%9ńiZi:=z DH}7>ݷ.2v5d, $Hra~stB:ԝ=wK0+S<DUhf57xY!(6 H 0Yg6}n/\Ō֣r[kÓt0"gtM H6QHm_zq'?UzOB ]gwxD /bKk T-&/XM()7pnNA&#܌XPe5wCϬ;zJ*z^1p$I~5-`.6+)(5h#kڷǦ8`>dAT B8C{Ø@ɽ?OZ0'U'5o95 &ia,gHF_K2gsc0&2='5LgHa?U*!VRI}.XVԄՔs&@e?&qjJ4ip-c8qo{FBk }@q8ž<XW_Ok{wgN r+E K8 4龉q2v ʀdr4OFH:r+:&]{o7&1Gbey97U3+/7vk]qbc~]i= A)MsH-Ј3bQS*kn&le\|Ԇ vr2t*itiRA\ j (0w1s ߇39WFh*" )+ 9DdT%;OJP3mh'zd?=a=ŢcH\ѯ֔5]ڹeZBcɶ{aYqÐK11$-{PRsN7f7Z1@A,no~ϡ);<)8N7X9I^[;.%ʇ4@`LYp3GG]fOf}L-jM;ͪ9 * e=D(?33H'+ZȘ˰>ɌZ1D//m`(\=Y6GTRݧ_f,bYV܉(~OuWuy|zmᐲ2Q9Ӛm+珰38%brd˨h1b|gն81"~LF8K/?% hM$F& !l?0G{$;T㫕WwAI Re0QRß@vݽa8'3L.qKP|AsY9\G=^mdI%mMެĄon.xFGM6v(F':rҧNhTuDYJ1p&⾜1n/gD.8qe!v;t?/c~Hh!?vt r$;5j:!”i2,q y-E,GDmH謥d^rݜ.ih`&#&wu׀f֒'3f{/WSJTbIOc \NHy4{6C–q{2;AdUHɺCZ{'󪄗3A^܊E *x,gf|om&:/Ny'DQKˠ*ԹYzcguۀBW|AS}'.?8tCCmczx ;N3Qb(u9,]6Tp F6oJzOi8{S3wEk]5DK_/8F37ۗye^* ]HW: 8HGl4>냫AEakGPdD"5#?<Н]:褹mx#RJGw0FN*TgDpx>0R>g]S5vrvƉ[' iW^ 4.%X~¨_(r?daZ[K'֬7C=0)9!M.V!v>L.d f. y*Q\\nVLSFִ?Ɍ8^(5mAG% ›=95ltω;Nn+ ā >K 1/ϗ#&p tТPۿzP` W䐆 ?OfD̽,J.TC=-ikZ6y.N6Fb(v^V(E{S/l4tw6lǭ ([/m;HqQ\;2(ap#[DqT* [PDSy5y:a%hcc(o0F"S$P);WvNluh{~bx_Cf;RpR9#Y%;np&=IXnt0#ߡfJ;Fiy#zJFRފ(artoe^u}Ja|? O߬jY2w7k_b IYbΥ,1|^mYKZʥBR$hNɳ@}$GvzCȪOos0YtHLvHL xpJR=]\ӸD[$7Iͮ(ɂ"(yV)f&!'@%JΑB mXucĝO`.~sC8+>"{1lv[&0c/u1qާ C\%Mc1??RO5H@1jŵ""ױ| R%&ZmPf7!3:!Q1_!ֿl* JW4`vozN-[l尞b.qA\n5y^Ьڿ9f{;E؁9JsE_%0 d$aCeȽ.g 1iRmY%0-31rKL`ϦO_Uy9y։mH=Nuq9 @EOgOIr(5|q&݄f}':.ӿKVGSأ@`.ÅUka:Ж' @jtͮԏIqR]!.$IHeͅ't %4 o /cD3C!LO{?1&jD($-s|ObԡHbd7so8rl vɀԾ:&ܱݝ J J^B\Y%g!yL@|%x9I9W@mI侷\wO 6?qyɽEN-5(JFMgIIb0^J%t#j %T r ?| 7_ >^qr`ٲcs^## XqN),]:tArW31q>CkntNa(6+>ϵdM`лʊh> DDT2JV2~s3 .#-j|4|гC6.z7~ ^6O%Ȳ*()ecC> /?i ;6 +`9>x6fok@)he6TrsZ^W`_W4{6>[.A11kd_O4-$HL^|b[gSM\P!x -OTY&>5Yu2fUT L63FdOl_\8zpg!#LcNO\qm6_f !P >cj,.EI7tJk1ԍ6&h4e2eBVHt ]Ʃ7\#RUl2t<\zU}MĆI̴Ffw]\kS%Tiy팻SO 8v.SY_I*HuVqj.v&W GPy _FfBlh"X'9ql/W`>]yq 7TFMѴi75+qѡgq}43jmw!{^C1?;G^I~)9 N:qƿ;֞v*C2'8'D{"$ӳ " tg춅o]䧿7,DB(K?פU@o<Ý_TVn-.RYw)[=ށLzv29EE-Ya4NqS_ȑ^ڟnc\7!Գ#3S0 Ѭnyy袩d#=YG<_r0@~{]F_Oe˥#Gp@c,_<1ܖ)8v!$$#1,j֥8D8yx2Yu4j[* EiD#m,"ro8 ZHꐄ^cd0Ll i WRO}W/+F0@ߟ9u013PPW]Y|;쎨g߲>MMy,IjSm$GHu }`HGGHJ?چ =UVR6\D-+Rfg&]m*$`HJPOFRe 4Ҫvٷjk}=zۿ{>{𡮙9:T ESO?>p*)#҆9CP71*#C8~$to^pA+q\߫ja^8Of/a@L3 ]V0h-١9Rzl>Az-"ڿ9`8ݕ[0^eLO֨A% X(N% Sc4mKuRAuLt'.]@W 'qԶ3b)ey`!N#J5PmoBtVzr{bϹkQ`⽴ T-2UWFj\gvT0B2DY80L`i`挈X1VSes. TܒS2\uSG.pdϤ.5_<@8fڏM:@V&;[;iz@'0gE& ?jI3D+;6R[UA`)Z΀4խ)5R4~4QH@u~앝~ :gohu+ZNãr_{)ʎ"y,r)1Oj.뜵6 GZYYK5|zKL߬ZmCb!4mOuc3@O$ZOd1Z4sp u ;X8o4W't‹/ɗ SÕ!de5ނsve 6jJu!5xq <[?jcn3ӟ;:R׽UM"nb׎m˳Q`$9ՙ6gVACK.) w"3vѲ͔Pk1+hJ-+K˘D3xG˻h_&'Kۯ]NqowpnbVrT]P"Pi=uTmsCk؄Dgj((0m@6J$))ɿ<sGoFӝɅB ~ImYt|0-٧ O5wJDUr(_*Ѯ(mM{yVw%Mrl @xz2CGM%hvu.o&d]9HU@Cu:PI-(pI+4o"/"( Rru}<%szɪUX#C D G?-zN {)m(Ip*^udb#^8ga%hSmt8IR)a\:-m3µgo'};UQU=h "qm9k5~sN"վ:'+GJ֍:[nPH7ꖚ)\-U;|-AeBZu7G2Zd m7;D !\MI'ZS ʾ=ip :ϡ %E}fK7 e`1yM؜1lzhN3*`6&-GfKcВ(j XIvF`~ JgSaܼt-ƙ]2`8t=X-+?-'L[&緞^:CѽO*+Z佧eI n[ͯ  DmE_:6-qbڏ%ZpH°5 ? ߺ7:`(k豰VE d WnJ5}@++4(V 6p ) !ˣd @P7MvsE[? Q+V[<$L-!UU/V@T'37Y7}lDcZED* *bG|CWfmmw*AUg0FOWZ݉S/?@ yVي?KoNT oؾ9®5YHȬod0Nym-0PU#ne{+sr_ "B@#)N(/;`7W]̓m>ǡ,#%HX2ن i%!bqn܆fV] GWވ˂IcN HP`EkYrY.{m{lLy*o$pZ<B  =TR[w٤@y }{R`0R!sh-%:skS .Cxml4B@Cbx" IcOo,'_cH jO:HK611G%F&Y4ӽwot.%*[2M9u/v/sLP7*GxNŅŏ:K1\֗_;%%1w{k슩[ebگfoO=6 KtYJq*3]#_P%UެI$h1<MxE~ƞ&:bN6 wJ#~gO >h̶]@HQA/ "p˽Ȋ") 236k_i Ί@idSm. Ʊ@DS! BH QH7l P(\2W+-HB +H%h[-ճ+fW F*G4)yW=`4+%+FH`ـU? Ǣ̲ XN@bl1٣≎i7dRXKj(]?f|2qBa+8֪! )'6=˫R <uY% J^MUX򤮅7'Zf >U`g~sc. `d6:ڵ~jQobVVNVj:QײaZ}x9GSr%J)v^~NO3WOo?ZOK$f:eŹv:Vyy"\~iGw(收o~M(sO!u>Su~kNQ빥%pWQ~u{$Po+欰>9r^)H\oؘp#}ޜ'͐8L8 j];NnW,#loLm짋ˑw?ɛeEx]ɏb"Ὓ j:&Q;hR@"}s@h9/P>Cl(Fux86C!GYGԌ/3jjl)/oM[‰gO-T(TL ˌ(YpPzUsfy~~cdJ⬅ZX*hw1tD \yOpFo3jC3G xVv&]9D*}zЕ1B;,Wd7{JY [S&?zӊlݶKZͧ``pNŚ)/yr K䏔PV'',`Ϳ4^7>O5=! WQ ,,}i 6]_ !AjWoIQK&4fpH6~3v ,}ʔqR9koOv15Yr/Svydt_o>|c0%\?휘mm )]HCPWS΂RczȂW|L8'CFC~zHѼAĺ7,:2SsYli*J< {PDTXF2Q' GpBlC.!ijUpN81y]O]މ@&ߗ򃒨nA)dܜRjIZ̽~nǏcsg:4#6w{Ӏ $bĴ^ӌ>@4BE4GmQ l;jOԥ\.dzO*,ao/M41I7+t>Xy0o{M Z9_ķaܙh#gxd= ar3!kis/?fV%XJUS_BCWXq+.{UƈaODJ "1rk6OvzdB.@jt FarDLF ƿ23N {CxU+@:joН,KBx4f J`R9ZVfE"7;bU2!i#i7PNwED<{c[@>Z"eJah> *߰ uzc  BĚnM}"+W[t~_As˶t.$B|5gDYGu-VJٻ2zhjj[]}ؓTޮ3JVrѤm@T/r{5WS,l@I5n*'Șg6gk94" FX69x4ˎ}ǟ|I+Ao֦y#9XYvֶɹ៭jx\*ϕXhzmIC_V*aGl!t=a6}1Wb j&[PuVݝjwKh6F[Ե35+&X'Xz50WbZ s~͗v~. L_hNQ/VOZZ**~ jK\܁g{۹C×sBvhUXHMN6VKXX<|+Fq&'D26>(JP8F3J|o=#pPhm<5NeZuLŽC;ʃ+ws9B@=A~^õo IyW]oXH:l%,Bh,_Pс)N߅i'^oM3dbuqK@)BYs'@j@phq&^Eam eҳ6v3܍{\[*y@}†) rZfA/;Յ#>;xqP5et(2 LZ%P^JׁR*RU3./emJs%f)"g,qC0Rۍ8iЮe|%r5N/D6/+uXq{QWFArcbmW9Uv{F%2C!ҡ|z=JRIXy\V  lZgY0hГ }C O7dwA\B#*E@6CΓҦsȳP0O$XzP )5]ֽ73 X(!#E7"4 C`X8ߓX[ feId(-Qc $?P'2cCi,uN0FYɇ ħ \K @'5W pz)م1NB'5u-JεSgЀ_Lj 0I>nnO7ٲ&;7~ z6iW%^~.i1B`EY~:3)cR2g6pLarv"ޥJc;HTGl,Rf>ײw{s% cn[(hwGi[:N!p1]{;A\ׁ?o C#=AcU=<[S^ 7DA}4}W]D1bd7jRwh]K{Æ.6|΢Q,pcu5 -vW\!<֎D'htV,%ޗ9J͵\^SS`Qe G pRktykdРA*=y=ĠndtG:w& $7?1^DlC31˄|o J1Uv}~0Ae%!c]pB]aN6k)VHl8$s(jN6J:`:Z4C-"\!Ҝ̒Z )ͨ+ ۻf#W^ ,Q"\ӻړd*Kv( |凾{njIb@)0z^'z6X֗`+W%L044*&Ɲb$1N#nP%*A*tͿѤHx ϸޱNpo6$ko[|5pJƉP ȄZ QS4Ef,K"%cصud;[(+2v9O`%tp4j]ekP\@\6g'+Y009R[ܿu]Rs2C7AfrW^qi++֠^rS[_LЎvOUf)˸d,j+uC(q7#הz;C8pgHT ϫeMT.,oΫ#Z mlus.#xE^ ʑ<9P-\pup/kf0'H/b}3{9r*6^fZ<$)s*y8Z7󑈴 %kIW'V[5zq5 Z,v1Oj4} ~,>^ֳѮ%ݤq}NEU:xw!JMm/ai,N3 }{*hXqk+L@,BW_*зusBvGDWnBqT\j"]퐪.uD}M:` eIb"bHxr Ea "erABA ~Y9n^~}@X|X0=T | ؓz0W;+)c<ȡ9^K@~~_eV ctY&8Ԧl~5o(ugFp F1R~$ fdɖn{_0+P43zg-OC\ʋ.UM b\@}f%DZ>RssPEJ8>7&ZGujs^ xkwe!r3&CZ5Ϛ J7ц[ b[,۹s;gJǔ8QH7Qh{jP1@~gحEm&՚xg pآË W;UvÚ',F]Ȋ զICp_QyOJ@ ?mщ@0u A%Yc*4*}_N6=gp!z̎YTb 5$#3T.b\W,7: 2AEdE~}B1=M)ݠ?AcU.$i#G#GZ}~}O ~VoĠ]؛`R )oȐ.&tQ3+7yNjd޿m#Q"@<#34[Guw 6sKfV|19sU% "QHޠMBϻ]J8ik!*e|:BM Yćv,')JS_~$s26o"oxH#q[=?AtQB3=o#)X .R|$IXz ƚ77㭓!قb.kfSmISŢiWxxp.&R Ce6*5d緬P)XSzh\B5R)r/lٸ-.&ZJ܂uR5rnbs;r#94ZJYaU̖ˋBsNR.g#qJl2;zUJnm5z?whK${:uq6EX언ϞeQYygu!p* ~Ru_! |nb;ZBA/ЃZ&?qy2M^#gvqD/LY磍ި&iHEԪ%L>w5|XC`㬀kGg,m=\W1aFz=0@yȷS9Y/uܴFr^Э5i:b7?]Q"%kЙҴe8T[1m}Huv`JYā9>4[A39;VFP^ LXsV 2Zzp;1v:^,XaWZ6Z.0ŐX0FtkeGґ7wǎ2*\)p>uy?x恧Թٱu$ci\ 3oc; sݩ3Ib|' 7t:ĐȋY~SyXfɪ;aꡐP&רއ JNDZeOz]X5Rh [8Wߡ<1nD7_[=WBF|/0-5Bb*q_>_ wRUERxJZ;L,,1߳>E;Z.m)S8WgƲ)n6ua`bRh|}M?:wÝi_حSfC3o"ƒ<Eo[q@2,7)x6'p>Xs4K\У(1,|^n'Ds ; ]b0`]:bS!wu,h0>Bn2?@ U'QhU8|oZnxӢT寋P4؋8U.Vy\OL s2 mD۽ի|N`oH?r/c5]JBPea+t8ThW΋ݽǪ ϲnm,*VZ_a9. n& ޞYD +**<=c|c }z; d{{C(ޛLj겿~ z1+MDT9+P@~o_\gdڸ\k*N; ZIbP*jOñӈ{vFmRW?ƈjH * 3!T*,Z5T4r!`nah8=y|Ni#JJzlAbA>_,2O;_]]t.zW&tCrtWհ ]g8$)A~Y4"GTAՍ& @Y `BCtpAVE<51U|ed38U_quٱJT%Ҏ$ b} mY[8s`&w:.i2vhtpaTP8$WLNq\er y$(S>YGM9PrncLI43J{;E]U@aru:e'YFG@:Klrq7lMN,'M doEfG G+~bɘqrmZ!Q QUxjs}1WmY47O[grvQA)E-5”MڝaS,}6g!]&ܻ1Av ȖņwGLpSI2_5~惽Cy<竻[hIi%ͽ[22 Pf sRh'P| uL;ώؤlb#3n$y VU%eVlqWX76 )),O 6М/({waJ~mdO'O.t.cQxzkM P\[kfE3jm Baf.0F6 h_S6d$)\'j6UD%#̔օ ,ջ7}"$ߴW^\!G9T59[F\C5@"BN55f=9lruA $u5 Iʙ {R e:h<#'pgjs$ d4fB{jԬ JtX4DS0r{[idPo -q I/2H(z/ݦqҹB\,~J@jlx<}T}j eh1 P\>yD8voYM",AšI 5DQJ+5 teazK]R"d xރyTB܅qo5l*yLr7@ފ%継E:XdBӐ6 +ԎXd]qvuI1_s*RO8}܍yCE@僓֪箞keرvEiNoy4 1/vf[uzm##;_=jy,^L3 7 Z:X]ixj+bܭ8L;mz]iG>.MLFpKhQh1K9;k?|VS8uOA>9{s/s].%ǭ*ë́3-Sn sPhƩ% gzdû C ]eF!+TyVuMd5C\4t hUs+Y=N G2. T-/-5s#zzacc(p G&ow`WGrt)^غR^ɪ&Zp~7[νKd103dB>4HSRU#k}mn$YD;F#FN"؁#[1|0b g;?&(-UN~.p!wlaJxh<8Av`m D]NqFxPM'1JMhvbr(=۰;Vq8YJF&B܄;1#I]:Q}aWEJ+Jtvq8]TV|m,o~kB.? K}ucclMȂ;7N[W4.P 1Т4u1F#.w]&KږjG.pzr, qb|(X|G 9>hLwQQ8j[O ؃lޣn n9>0U*1!eŵ۳5w?#Bv%4u7bbrJ'CK| dC m3@0!8,4R 1J GExg>^NƻVK@mlFz"#Ms\;;赙GT>(Z3Q{[t$cM-j^x :r RBQ:vB}ۺRbulkw\#Br9JW^=SNC|!ޖĞ9dhɚC4j.ˤL7@aI;+J}( eO,skl"M JƅDa?O}ѵ`#Й!E"Sx7+2;zU{z}-j\'މa(ΗӚDE2f!O@-^7b죸.);,):˝Gz`@|W-HI=Xm1 *H&Mm+uWbՎ4'W4 J{xP cΗ#Et^j>t+9 h L@cNG҇Yõ(2LE]h=KR Su; $b;́OpXKyjC[ l}0[LFtLwm'7gwJ= +:F%Kx/ʌj M~jF#6`:ߵllX0F8: *r'3}d&\CC~NᠷrӿSPdQq#δy(H@$JK'E*a%/kNIm /^ך=EDOAڞ~my 6 C-DB:* y&N-ݑm5GOC{Rs{|EM)Լ_z0hXq57K 4;Y0=v>Zzo~3g<-د8SZTMZJ(a;'hP;ނ5:5W?NmSe!߰rvmF^Y ?l 77 C!DҢ|j4W·$b~cI_l_ 雖bvFMEZ̲*7ZĩZ0ohq E&Y\*46! ɦ]斃ovdX0*H7vZNx' . wDz@ioq78 RݾئU5?9Yc.mSx`C|1uδE7f mxۇzҁxLnwq{/.srrGn%gP[;i ĩ~PSKDFLT8=M吲V{iܽaɐ^>D,"XS2ju֠Ki7ۑ\9X%X%UtWjkrhTg XégJ]t\Fѝf%A2ğtiH"P?J n\DLx1R9l#R=ԙ'XW/n."#B;-}}X4  \J>>.Z?v%2%J BJڥ*o֙R2|>ABR zie0]ܮ7)]fmhT-_yzQ1ߤxJ+*LL ]`jYJo^mCQl$]W*TksdH5܀BH%-!Wk wjC!j5\l?ϔkΘ9FJLA#t;U) ɑl(jQ ͎JĈf{8L`TLiYj>8}[~R78k4HT2tS6Pf]`Vn7+6PfnoT?Mj?YA;=F0!uS*m)'g97-i+TugB "9_H约A/`# c?-7YWvR>`Rhc׷ڜ #1/y|-'i?7[ e@M@; # 6uN]@$t(4.-XJ_! ^͊ ypC&vUFp- m= Ʌ@hƋ?v(¡)idO1âUdỳX?L7cJRpMvC*53$N7B#1Ŗ/[#W:XbD`=1N_v`>҄d019.Z P {u`Tt,ʃ+}5slb}_K#4XddИ=8Jͱf=JC87Ws#_9~S87jM W;]DN_udFdmoAkb4 z2GpHLş)]nʠXD<'A:zPV k?B)E(uo"u__HFމou)B̭@VH!W4?Jla:^To`_9܅_}0?;Zzu%x%0XPWT1lf2mܶs<7Ib%*o~oD 3-هk!Zs䒬/'ko0X&QWXKwiy> .$4;lFhFaD^z,p )sL WTTK gVie8yQ/-]_S3K8$n%~рSqM(3&QKLހeR5j7JXۃK]-PZIN7HnDDCk]̀hhpD}olz`{9n`[I;DVZžo)]0ln@yˍ,YζE؜Z=< nOC 2ɚ *JF_vk^/ &Xl2_Uɺ K_sC ПL [9[Z=q/pc#iLՙe5=; δ`NUJd Z\7g4uWU9=LՍslLr6fFX(wV:F tHW"d|8ɟ}(ao Y<6rob4"JH!0)K9u6Fm+#y6S?܌ 5ee]Oћoڳ$0s5Lẽ]K(d0PNvdh1ꤧl.~UV.0=KY6LY#湧a,d!#|U-FǍC֌%%{X!.9KşN:2H{PYSdvgdB'ը.kq8S|c3ukN+̳`gnfS8uWm$ t gdˮGt'SopDOYbN-ȱ鵾ơ D24Ο pbSx' SWա{1oA#`&[ISlְ *Z2#2> Gz(eΏP.˲K4?$8S*ʯ݇˥Q%`(, 17L}wL0V(]?^WJ&Pib|niŋ~1p]$6]GLDf,khd7HfE$W`Uv˾RnH_]"5 @X16D!"ƔA1\[e|AGq91a0ʱsH? l0KE(6MMlVX|8wꭡr[7G);V)ݻvc-)NoO&@Gȼ&ӁFW{eR̟ ` j-ECykZ%ctK4ݣЇ\~D> Uɓ: G ƪ兞@a-|ͽ|ἛL* `X|D!j|8z^y!_*[v}]U /hTq\5 rL,"]W",ׁXZ_]Nt,.0Z諄zHֈwz}i#@TFtނ̝4/Jd3_7d}Z&EH:CYw, 238&g}Z{-cBP$^0sjSYЗὡ#=a=A@{ͱ9*y-PA4P_9Y$%<(mX6B(dR#[{:u^OWحJo۠qN9,Tȗ RwM+b"GJGex2c5d2s&jT)(]EGoUevb[NjE]~xo)tzŒb 'Lx)2 o44=J7B:+ξ~a`KPEx1_?pb^]_o aXLaI"Xsu5bUd%ǚ `17Z,)`چMVJ5C?6`T7f8j[O Ώ3R~l(YbU.hfTM .CeKZ䠿?+._E9!}nlv6?/MUcd(~n%bpC'H ف7Xl(אd0nFvr#bB[ ќU% j;)6D b;nSS4by tMa_yV|4H HXB<BTkdߴ+5:v^|v7Q"A?H-v7>[d )Ly QV~?ftkDmQ*44\8F5O\[WGv,BC`SM"B1WcgF >0eˀҎo 3׊ N򷙣#'@)ņ1c6) HgOҪTi,CR,>Et$q7="B:Ca3i]pqKgkYF7IBPXz2 KCV- b=4ŷ #)5Cڐ$`ubh5vÇ^ca6|0+ݯSj6.w9*hxSʕiWCuOu<_KED _Ra31EAˁ!ţnۃ]⎡=vV*잂&wZS cȒL($xcqPlHcp8e!\Xvq>"{L1n0-\ZLc˼cNh{L# #6g'# rEGq誎9Daxf6d6dVIf,yw.kR 6=qˑgɂQyu/CKQ1u"ӎfR>ޖ[,7eo4 hE b/;kV%Wd(qKBMP]諺c4R썜@'NʞZuǼ-vuю(gqu̶-v DjC_ m__%݀"fifH07 [ ̻>f)"4lw(0nl,Ry+G#*>% r_p>pNƑE\4DVj|x$T' Uщ82}شZx~f.dIo!K1`/B gc_&"ʃ)Y^4YGYqs,ߝ^c)%&U3 PwBLS|혖m?dNUKiw՟-R#a(6H+ 5/ܗB(.;=N/ˣdNR>s2 _j(9sV=b鄆6@ɕ,e4p l>\)\Nqz>.ISsft`sغwҍ!2t48sK 1(p'<'Lŀ{w~WH㥱?B2 zތ@ƘʼnrƌpL ktKkA&Vs1q&0xI(D V=%vO%L) lGl #o=$p9\I=`b6 @v}&"?=hI@Eӑ?gKnm7"d酩tmWDlcwq@= (÷e` xX*~M`51zȕPwMsbQ[u^aU&ϽgM&I ྗ0N UoF5yM5}3qڠj EPl~fWdq0':j&RP9 auB|I# $DB7ŸBٙcZ Ͻ655Ʒ`*vY (c1s'Wܕ*[6}^![gƿٜZU(.iÝd\|_a>nPNIp)_^QɑoAӁ9re*mt[r XJtЙjM&{,mA~&ōHwR'*E[ 0XP:^Ӻ3is0ݢ<,k5W:<ʗ6ĔhW>U#u }'No9|߷{byaJnweиħ[67~}^F7Z5R2!7.ދ5F[`w]/s;$͙ɫl2>Ί^ڨRٖ5ŗ^/S͖]b(W*loSk7DeB?ha =(#<ݏHX3;q؋5N Xx˘NXZ+uSsZԣI"A4izN wKC,(XĴ-tr ?x ƅ jJ& $~OS9[=Ic:øUNݧ +TSqH6h[_ƫ5|PG)+w b|<8Vx'8862ŘB~RpIz<<v<Ɵ7lg[BӴ$uֱd,fB̲&hAȘ&^'D h*XFENPD2ҷۑR IDN\A镠W0ՓE)#r$q{H̞(*r84b'Npht&uQ8oy1bst'GxVr3f^ 6N:] O~, jn$ K@!gR~wfqҤ7ټiDj"z˩ZPʄ% zSnZ˞bVj 6f>0.Lk'LYߡ("z<ڶ¦g=0,P q<_, %OL'C$}˘f}9!m&:"X>"*67yU3ʮŴ%`4W}cIFró~Պ7NF:{&$7IH"(oonrQYf»AI Re0RxVWK8L30Ks:]<4Yel,7q'3c` }i0vbNuְY6lfRrxF@bRJEoa+.t`*!hTrKakLk1cyUNGF}# _5˛Bl7+Q6mR@"9s-Еh/U1ݚ zX[kHVz<<6lhڴ1]vfm3{~.?+8"bǦIL.`$gjZ   5qL5\Fԑqu?@Wx!} .CWNrB8.ѼȨxu`\Yѧ*oE%~MrҌkl,`[iܯž^pk}'pA|  qc˴WD1䀓UFC벁S, өƠE I$l2˩w50`ef8^R_QbjO=v/{&-fCU݈5P{:wj|Gp/W*.KN<]R TFM8kP2 n*8cν啄"JDݫ* |׀){`cgIQBRC3 n;=`W$y4DA}nEo,_% ęE?`dCIK8F03nu`̡B6Gd$nd Vom)ݪ;V'_t''FD`NԴ ~K4ÁBY|DVh(ҝk5LR,N?+ʫA)+S 3WNyS@KpGVKHᱮ#wrz,S52O1o*Fs؛Ȉbu"Ϟ D"yY1P6~o ߝjw) 7drfX1~_Ԅ{J+b">''BDmlO4:\ 簟@6ⱣGt`Nlލhh?Y8G"'z7]Kf Kx=lf9Q%GBay7`_> ]O)Aˬc#kuB 1G؊t48!-a_n{0@*/s#=af#(Y^ZIaݬ[UdVi–H-4r( >Q )8a1BjP$|`^>\Yt' rWΧh+7*YVt<+mJc|w^SIe]z[ Œdޘ/&" ٖg퀽)ol' ]hR S.Mi7E5cXϸ3xE!oyK%6C{$FT_gzDʼnk|YŭqIuTMm ngʋ\fw3bv>m5׮6L5D^V\ܫ }qJL{7?ӼQIq+~͹@[D8TMFIb:b ljĄq׍?iڅkǘ!Byg+l#9NJ΄A{v-1*:FaeYL,2} n}##>K6+py +"ucIMsS:^ע'`xu9 bۜ  m7N)T&YxmK둡&4xTUpYnN 7Ygqo ˄ƈȤ84u={ch \=5TlDF D=NGw`bQ\"8|_V6О/W-v=A);BqQi@7e8J"lv$ 䕬]ʱ@r|@г4!)[ 8 Sa9圙 ú4?u)(y? q'ie~Dž¶%XkcdoIjQDo7^ȟF?\I7Osx8<\"ن <U 6^)::nK/k?OB":@<7a$Xu%ҵJF?yޞ:.^sZT2?U,`65dtSWۖS.{BHfH+}2)GV3=Q̫Pb`A1+CH˸ó#>.\b g1-J E1΍!f|xZ5Hss9u5XmA# GrթԿgy4>dHf2LlfSfu4(y4=;_4ʑ_;{g)$(xCR;Vh}=4GrgFʥ'&k!Kx'mDKB.(0V*Z_Z2Lfb -exP䝋|Q|sxPz_EO/+䬠,ed:F5|U,;qaܦBx#䆟y*+zjS}*־hng-[KkA3&\U2.CK'3pOIE+p:]ҫ;(6F*)'eH:_C:\"NdXyW")ɳSs,N0Nً^>[F{BNISѭ42s6Urb—%΅ 0GQѐp\2VuGZ==tUƴ,&@ @@bmNqw`"eR=*#񩲋2pu+olLX/֛Nv6֚}(ܼ1G,c|UGVNn9<|>>q7<*EFdH+06kXZ{;%W򯺆;Îw # wR* .fUxe̾_Z0Eush]hff" tuM&MJfq&1%jK~fԝBMŪ*圃r a\X 輽LcJ0$\Q~vYR ~Ӛ=Nr~2;ZB̯~E٥=mkF JFX\t}220]BI@X$!H>e08ӧIu5"Uˆ@way*2PoHNF++%/Js*|N9>$N8&qO]8|ſv`?~Z+kmG.-䶇~jwPs J9Suvd ^MzTㄫ! _,@fF (l&i@NP!|j|a3R&ʢ6OWPW9q~eh`Eq":ʹq7 t BtB;_%m@]{{W0q8j5Ӄ$Wjʓ4.V9 t77EQt^j(_vA3hs$Tq:9 d3S #M}7@x>} z}ajTj"A<3"<`r.l iskHdl_rCmG\"SG3-Y_F:h2_ia};Js,֌g,:l]R)=L*"{_Ku07KH+.zYh?n5HF~Y=8N47[/N;ְ%نzCЈ,\'H<)06Z` ZbgT%<7Yhn D=7=$ Tڊ[#ަgg0KvhEZGXS2]ahͽq\>#YD}YYaBX:􍈐紂~ݝ|u}B GϢyƁP n! }CdB)$N$C^lj[ΝsPHB,l'CӳnJzHjoYw@,`X9\N0E0Qt1kD:U$JuEun^ fRHv ]w=c5i\[竵*D*ޤc)guBdxc̤)=p{$-G)hG:VXy[VZDG쮈99mk*CJSx=ek^G5\1;ew[]gkl J~i21$9b˼&I~*jWdqWqgcNx\̖:N'F Le)>ɒV/] [ԴdrtG;x1 d}Tp9*%I'3J|zu׍Rr[B*#!͓ne\e T^2p DQ"^R%IO^w;3^3ZWD[qGQo˿;֬Pz:=Cx(Ak^#|ӺȉԒ(kXJE)-6IT!b< rxƋ)$ص$Mg)8H 9X4ȩ~TF={!l @kk8$,jBg,#V[F([wX//] ,,x{!iV5 \^ c;Um_E@~6ҴO; t|p>Qi-'=5cȰؤE5 `|S9ȉh ͮI .zQm¦@aJ]U c#93'^4;m&~_Q`2h݂c]_Oϐ[R? {H8.Ộ)n;DލRtP+Rom?f_;=guWD;}4 ws75U2D8\laV`w:>=r|RM U2u$RC C xi=-?tQpCr6 jLKѢJNӕ[MzXZE8UXn X<Έl RC*8s$v8큚"Oي'*A ZfzCˮDDK4D8 G)|v fh :bF۲WL5:9 $Bv yF:NɎFLD ?&IC{n"GSwvLARkilŇߴ`ڗ̦{o+)ڡf?|j6Rvn _)ʉ<}:)(_^*uaE#9=0B}bQ/ (.k=xfbS NLT7yMBvd}LGЂP_vOxDpЃ8N>!6>߉4|-r 3ޚ~lܛń>j(7{PpODn4%逸b*c"]F HQوЛ iE[֓gnO8VT+~y*ďIZpmC^͔ŋsxQ}~.(P-f{( 1_$1HA]xdEf+!!B73g:+^CsuT N&8+!ҳ4=NM޾aڅ!L1i[$>qҞ=qPQkAWl<ݥ'n<`kjܒxAFl0~3AL,}Ŋs\ `iA?rp \O{䋊(!!ؑLޔG `5nPgn]qBh*ܖm'R8|HylC"gNU[CPC",!h9(+B" HB:Og[orVyⓍMح#O2Al~9ͷo$'E8l>-[泉% ixڝ֍LA/<Ktuvq!:;*SuKĮ(;h@*+IH%P|%mF]7d3(@/:&jݧ+^xeն\jr .YE.ׂ/n=хۨ3Wu .GҶEUn[&˒4Ip9#$(?SޢED3}2pZa j~Z/hcsP >+4`KK#ΔLhgG)in Q!&q%A~G?H'A+7WwGP\O'kѓ>cMlCL$!<1TO$8 әCWn]tQ2shŴv@;GveB@a'ηOx [AIҎ/YO]QQI+5il"}|"V*?jCۋ qW*#)h3[^`rYm0Hmea Ԏj/v?H0SBtJH?_2J8;8(YC:ҠYOȸ ֖Uw&+[)9rЂfG|gW'Nx<,jCنp0ڳp/h!Kޛ"TCPja6pS s8}V V/iXc`x@,y,R$w/dۮf^l}FJODo3p`vts=PJ0jpkE6tu C&H Iwu QWM7sm&VڨRV(xRu ;Mi PhIMi?!{FZ0~(*Ǣ;br# ~$! /j!/1ްԞ8SB@lנfV:c=U}HuBQ)>}q\RnmJW 䳍NRXE̩S lhG4K-Q2@f`:<@ɦx+jOMkMJ${%Nr! Y܋*KOwnڏ~]xAb<@Q|K),XjyF*jWGU36:$C\_}c {ݲvH>ʼnT%%ERܨ ?9Q/qo5[ny2Ӣ KrL0j,WK8{!]wT5.c"er$` y0"CQ@kd -a 94㙇wv Y~sN#F|AQ*^e܉0<בVsD3(~`#b_|/ƲȨ@B{5uN -P?A1_yXD]Tq~6Nsȏy W=_[0Dis\iҐYsr%qAracCN]3h+Ӑ  Rc!Ļ(5y?Me !z2ʣ-nTr98]Ւ1 o)ɢI{ wf !_2>ڦ2N]}HQRr!ļrI?<9vO`EuлIçą.YDx0 Dz$bfm)BK8CYaK 1,yWl"d-|꽾?E D=խWZԲQs%JNKz#Rn*4gV϶+rB4ux;Cä JL$k1XEgkvy b2ưmewVwkݼ2?gBv{,hD]?DR68JHA'\~)+ ! BAbbX)Vy:?q۳ D_) z0 ex/$Y>'J>*eRt*%9`ڿErNpL gF>A3"֌hhj1<_Vsj DbwpF_01/7"qչKؐU $)GQh >9&KXwuAPp6K40R5<>w''>OUE|ܦiy9P([y:Hэu^ t I(cpBOu{xl`(C)[XhcwMХo6 `,q2%vʴ$MѮ+@co!OD=1,eB!_.#y:N]FGe[ő 6ۦxTFjN_hm0}[F,O1hU"ڐo i7wu%`86 $*'f ee1yHHYEE%]Iy B4'$ѯO?/z￝Nj%)`K,/i2Ux [6Fپ<y@՘<]֞`c+xզ\T\;I0fgW.lf3_j9lvj:u.N%ӻL3G8}lN$'Ӏ{OѮb%Q> '\Ɋ{G{v˴!uIyMGq֋]Rbf,sugn W`f₹~Or:B 2^d\ nk/{rq9aB?vDp=^{?V@A|4j;`2Uf;4L "2h $ Jj% 6 hkݸ. wڿWؤ+"άǥVS}`kex^#!ha]zqqT=^j?/ EK lep@l uK{X5\@u1^Z G$qW? #w+"f{]Km6VK;05&c4ڳ]l#tS%< w1A`! أq!IGGIh}K˵"bZtˆHT NxQZ}RH#:MAM.-# os:Q`{׍knYa7O䒬#(ܧSY(my0r`_e&d+1Viw^|_I6|]W30y#mgY{! ,UW]z9IcSpv)z,ep \%& jQ2+ÀIoc/疗 xgo ٦htg~<{@*咽ȑZ:qNʾGKzT5$62TUl!5/5f.6~_ڟnsb }Nǣɸ^7R%nµ#oG%ȧֵ|9†|WOtFݬ.܌(-mSgƚa/vq~)G[a \wl,g' -̪{L /|5=`Гy!_b*>2V$z^}ql4!5|]Z,IRGI⢭'T;B6Q)LXӲ+!.N&7N4!8wx.nT SpPǗT! ٵ|#M< u;˔s#k6 C"F[öXɡՔ*-Z IĚBO)6)s-_0m5KQT 5?X IL, ?Y #pwJG\}B qbɏR zk6rtVfp4K K %'wf|6)$Q]T%ʊ w,,:# mk$(o%T ``8|hډnl=i/n+ֲa?SZB s<=v>!2`T9sJ:'þ>^;G:75Z4VɊ/3Q.I՚6fUۓ12S~^A`HDƅgkfޠ-d T#|g7_ML2F;PB>ݵd$Dd|#,]4i}B<&q7&С}[~2IYQ8$49@4,! :EI`H|&MҐ ч3]yapN?eP! m\,-pxmEz Y;?[uBVX[&'7r9Kf3p%r KJy]88O W(62{UUMZȦT٢&!K3I1 )${55 SGzI.J2'5W%zF,\9x0q2W-=y )P;J/-EXY?ǵfd5pJ3jAհwu "m3̈3C8_hN? . AhY#I@WSW\޸sdT%J]K>0JQ9dg ˼ָ0"Xͼlso. ^G@u¤|ѯm(vOat?AzXoMj9jl;FJ0K1p76%*|[WoQoRg+lA* ~[Ȯ,^Ch8 AI&S+oT+}*Jy (;km@"o(zZe]/s\)-{i~ɷm5jdY=n޲˭*HWTź;Xșr%JO6K#^~u]#4㲕xR%-f/ Q'4w٤6ҞY^Um9F@j-Y>zmDydIDYvNB7՜m[AU%}D׍= Sb7 h.8M`;M:JoY {xmƙ}0[ I/ *q=36sו\hh;@ڶL2kFpv ^]Wt̾#q 9H@=rX7B78xUŗud ų\SGu.#vG77"N4$6h /^`^65o~7)r^nM. t֎vzQ H5rɼ)`7}Ǥ  ӈs}KISm!'-)|JIie/??3<[wYRl(Jp֩[+l撻Xy#l"/mn#\Y*c xod *Lm*1Q좴^,nCP93{]ރ-,h)*'m/S|]f eݭbvGԙv/ _y+ۊt[\ZA0jl=[2^5yRwU"0Uovwc&02iYKeƖC}BCIF~ N#*"$c v GZQ'*ٿ>S@13`vnB602*GՍ^ͽwiǾ)^C?zsQo /SyX!4UNYX+OȉaؼYen4kZQ<&\lXLԏb ×᥵aE _/Έ /Q+TUT(#W:洼f+„޳>= hPh,A1pۜ( !RFZ^dU pL&jArS+a*u \TF[3Pc9| Z ('Z섽fD=EB3_D)=2LiH[RX\!\}ovHg3X@0 KT9xEaﶋU ïx!tZף WjX--<~9j x7HsGՉ#XT#Ugj#kTk-j|[xB" Ll\bJ /Z&KբuZ2{i}Ӝ.SyAۆACVa 7j5)hܤL+}Qހ+yŶT?ۜ)x(śWMx:!?&9Ih<MRIؤO3^yhkvJCmY˜ri\<#EaCh ((]8KeN ]BÎs㟭`A,0VϨ9abOr8Hzc,zBAֽ](Ao)TzJoAFI\S& .PKԾãYQ%-"{Et%cVp)ү0v\(g\pr; Q fKvK˪qMȔ4}q6:x.} l.xʫRW/>Dʣ.di>J(Tk%Z=&[_n. FnIrE=)̫Jc c36E7mv&s0]w<8%|dκj֯w y~h7@_t?$lUwz]Gu IAI&S3(%rkb/ :rvߙiZA-yMMTrÁ^2 /T2@=\80Ύn ù끝: DnH{ N"ipb\j#~^_hU-4]Eԛ+E jLՊAms e=DZWd.f\),uðrHoIM0ND5,R0>RYaJקY $ ʜ"&^q*O֎({ ؘ oNNOw"~z, 7.ܺIx Jt aq0Brt=_?q }⼋'tKw=35VjDS'^W.lhT}U!k *lIK j΢RQ?0h"+naTx eC K3B q.(Ga7zvM~LN=>2.O+L Z6KAL7fQ& bTm i=81MڄrHlF #RngI$ֿ>DLpo7٢;cQzҼ=x)$p;UrYd-mu@=wA={dBD<@s4C-"ĜX:3౲Ck=V%gu7Jw6r̰ۇt`O Kyg*01i{yyZ>\G[=wY۴4ښba0ҡ M(𿺄n;d.gYv#o,2@zy-Ԟa4224 7cޗŌRhSm1җ(lV 9$ȘGrL<[z5 ]/|4څa_Ⱦv5]h*P;:lfda"+jpJwAi,LJ'!)L1CHԝj0 4ZiqT7ikΜ^4/n^E];oU$B y|!s MM*ld F~W,қ11c4uIN=uD~d):ιwrAR">3JA9L}僜bOzWt.iS i{^R މ\{Ơ>IԮ YSV{R[Pkǥj>X1{7K'yk0566IOgP/q^s5'᪬'nqT`5jP@%YFwHbg"(b" [v ڊ_;0I|K#1(oE[ Y.,awt1N+ޱJn5ԕ~v/x1HS5]$ rG L6v%04]ʖEfxiJ{N/A\K3Mk8 gXWvY?6?xk X,jvĵ[Cp-E-ݕDgaPzL#uUrcE٧+ͫw;=HK,AK.1n zkⲝ.b1.V&6>ge}a]U?gRz_v]Εă;ٶ27$#eažNd]SӘ5?JH/SPᜊ&jRIhegN'xswi8ZN\mi:]@w6ص[E`)UmS,X=+>+;JY!4I۰C6/${vX IA;a kMKD`[#90B*UaGmFBKQ+>vR\x!ًߊ 7mqRxcQWh%&aP 8{в~f7TQ>+s*r# CbjMK_ #LL. ע-س7ks $L#Z"*PX_{J|xaQ/ðFKsكh+[B/Rd Ve C{~ϒuEѯMDgbBON L^)WXj=1^ktjV$tũy_w mI;Af}Rh`JOp5Df7*W{J&f%rKlh0;'"-YOc%{"ނ^ (Bl7Ɓ%F"g6M}%&I$|@tv8 (2 Tb/1k$5AƧw&=T txI'\\„2~'K|y[%Y%"\!eKQA J;ӍDkBŮ3-i/&`Uh4FXzvq R>.&SQb/Z'sOuC^ͱ dWW⁉;7:sI%pq MѢ$ŀEU1(dT@l*X1%I'% }MIkQUTe`qd/FXe-#ؾ渉>s^ ͒Ty6Z#54.k$!Rj{޴R2zMN"^x\E'n_p)dtmՂ$B-ib6F[,<tI}Bj!M V19t3s:Gca10ؘc 壀P9棤AaMtn 1:j Do)ևXf|)x!A "k_ﲣ NV8`?uP/2xVHMfj9idwDY&lwR6ٌqШ3nPb =*)4/,! [(ؖ/=|R> %_gHq&qC~knŕYH[хȉ蕔4S*@ =r.;x X9h/>[;qs2,Gb̸+戙XE 0( z l0cDs/y$Q?Ux~B` Vȓ3Q*vpaƻiOǞ#zst~D*/OӍ};(m>8 tN-3B6nRi迉/ޑj;ϙ0֍͊WR?Q6TUF5ݱ=?^0V0!Ͼ%JcHp!ϫ0@V@Pӕ c.fǂ:*/gR`8X;s#gQM~%iEWʟsMPEX e8o,d% IZk1~!ݹMaYb[a^aPG).R0"ފJ(_Q,F{-$|/>9#MΜMgT8LdI0V%WUP=ykpr7>*Itbik2 푠P!6M>8Nb iWjDyOCmwE1><;u#} k%'Z:SW+ṶFT!@UcR1 o깟 ǃ 0rk|.M" R,PYD'~kW" tr#-[ā#9 5 ,^s u}0CAMgaK:ޡȯfxsYJ4W=G2wO JG/Z.`)cġ{ <8u⯪ƬOGiza1wyu R!lmQs:19&nZ R|()&Šw(#; )D\t ULClcRcz@F#ɲ6 ;FWPA\2G=m&:Y8xr%~~r/hT @"d[r!67h\5 rSY0C ̈+3Ѐ9[jEldUvqTEƨ@||~־fT -B7+Unk(Ԗ}c1!V 2Vqn&0T+cM܃4'yt& cVuقc'pP2I^"Bbm<=%49:B[6լܖTBmܠosPtOa>yN>I~WA4`Э"+QrTdq/+N)@ehYZ,I.L0J3Jaf!dlye#3F1ZK-xz7M6ʾրs <">g킦3.s[!5?;%/YZR ݆u|B"TbMĒnиHO"RfA5)M!6Ν Q/OkӛpǙ1aUߊ|UŅ(Nz;q`ףҼS>cgi"N>PiG^j{m-T!$x|:߭`A/ Sǹ]"==:[;^I4/ MS4ICw Sb~eC `cS *gd:iRXݲ]q3^վ;V(1&|T.1L o> pF?]oC#B?Rz j{#dqF?}kp' gPݚѴҒa!<'G1RU{Upֆ_!9T>"[67d7/|XC ["V(\,'txEb?}}%}%I,&$1t'I^SDA\Ia`-L_ 2U[dywX):C+ARmZ1Řꤼ|p3_~]{3pǮ~z2.+ǵIOdVbWlՐй\ U/So[dZH\onV63QIpHqJK1J}t1! X &Qцb1p4"e9-߭^hXɅr[[bYnҎ-L)-L!vUSvItV.#\ʂWVoSe? .mI##eeh ٷ4$m}qYe " =K 'J {oA4!Jl<پ4>BjEsT$cgfLkýNCa-a&nHIoEm>XyN =.M/irEtVle=V VD}{%[*[%"ڰ& oeO٩xU3S6S ǙUbO<5\i:D Vʀz 7'Cpl\[VӦ?LP\}|ޡ:fyRئ~KsJsr?}kRm HCm6`mq{x@Rwß1V?`|?Q4fo\9B>oEU'nx,u#.s~I9O 1jiҐgƷA-R\Pqa\*t8b+JYuK2. Y(' :?c_ᄛTLI`pU"0 6x\w 2X(g{3Np&L,w!QQFH.$d"Q*Akc9Lva g'cW$v\:XRbЋo\o-\6@ 3ƟT幛%dYq\J+Hr*2nsk'ǧG?uo 汎ycGp5)f^so[o-ك',ý+Z[NjL8,lS{oVI KR2(ՒU74g*ZpB"gnw0cF[ ߰lUrac(ybFI(Keow0qUa4, Z&Z4$-7WZtd(]5٭߁;%kmPSdSd@qCGZkbF]AS$\8>؛?mC6=6mIĤh`mb Ĺe,i4X%\rሲMJ|`ؙk!Ba - l jfJ[Y*!K;L١E˪󬄽v AGI&S3RMthU!BMAzʭ\N-T fMfu"MO1Mw _mcŪ'亱~ ύA{ŽirHO&V'vx%VqͧqR1}8OǓwLWT'ѩn=DdoFm>%jjMGSiɂF:N>O9[ X-"!?HxXx}H?P;fŴV&P#,aZ/DαoqB{WkX$'pPtaBO,~J%SC)Cg0宅~JtGOS2;iec;?|GUǨ&/"(Eӷ`N뚝JV9 (Ƃ@? ͹Sϳ-#綘]oX6\^xKZ=$E' Sf2Y#v[ 3wY*m(z11o?z~ wؽB*{earo1@&A-&jYcH*n_$Nލ N[I0}Ypǖ8?*G&2`crI&Lj7%T=Ev|NO "6cd`wNw9,[1CV@y U.D" ~hi, ]/ԶRzKn~X5/lk1U/PlLDpwE1𵀏(+Df++)᎝fP#Q ӑZ G߃cK[+MWsy++,s&}+te>hU(~32c ɁDE`W!u  w|i*Y+h;I$2 г`f4辔DfH',f4^͙P46uoc/݆Ϟi5aqO:Wti061+jz^c 9];)..b;jT3쿖ܪY,I/7ēyyer$]6g:UWJn9yA$_kP)P& 4>AhXh4ԣF!xsa T4/`{1T6ՑȈ<"|UBU$+$,ĜWl1ck,[r<ԢUZ%r^78jJ0ce[GJVLP2 ]sXb2tvp)#hR,هayóI5Ҭ݌9m J{%FPUt$z\&ꥈ }3&|qy;4.lLd%1/y?ITpN<ɈgK]mVVTZԳ Ua\5aKcd*ώY^S|ʒ8R6ZM }Z :i;LhGcJ@a =-D#I^PvRhl (ۥ3J{JEyL*WppAt[d\RTI^K@頹Vv؈k$g.TyHN54A'TI\+M_f"ZAeŎt68znpbl@A+,Ϧ7)N "X]`8tWcj'\7%%_J$J8 %@G_:~/nʳ'{>( ~v =nRipL 9'"%GV0Ťij&[Lh(X|pѣMu S:jr9 ~X Ft-ظ։ZSZpAˢo8f'je y~ntOXCHrx(nR:ue#B&LmUrS2@mX7qru&c^eb̃sWѡAp,w[?.kqez)kh"-E8P> yU @{O8z/g32:83Pݶgsa|0@4VV̛2z!?A>%n$M`L4,rPč QiY Ȫm$]%Du.o|A{IHw"}WƩ 8ywilW–^RݡNTKWN)n RB8;AI(zX`[X .~:N`5jcx$Fk6~͟bk'DAboh XԹ%Lgw} ʷD]9멆Y-t KZG[O5)h<:AnVR4& w&\fbKl/Q  xjQ4ip\d{jt@t&tyCҿD,Z<4ۡ6o ]iyga޻Y4E>SYaS;CTD.O'y3\]9Ÿu=B4l&4VW'Г}Q=Xn?QfT TcgGD %2p(v2D﫨5 ] ZTas .m#.?m"rMb1r@0 p* Zڨ6ڟ6a ZbCPCt ю8$v[BU0嶵$+.eu`$f>RVnSn*+\Z.TNўsp4z9d9%+^;p78wWQƦu}ޗU*SJ?>,BME@h كfTܼzN!* Q*Ͷj\BKV8ߔfk xeީVק21%䛌P uTZA. C:=CtI}BB@LpשL鯙$ڒM#>Aƍ˞:ތ}Ght$%'F-?0 LwAeEC` :t݇-V$#&a8ץ~9 NTFfWz9Mɑבg{ D0i)%س|7Ll%y+ifT6ƛpɺa] *!@sZ.ˬW1ھS-^Εؾ:QCTiZ0%OHl VH']oY%hfW9 J_d=Hdi1e`10b>D,vҝgn}:IP e<ܐ~{%{)yg[7BHQ|ySg ,7^B 4#7Hf҅%ߨZ6z]oy6yX "}?H[fꃡ}G{Y̚x +8lH@0j<jCW>啂J/Qy#G7Y)a=i]qj2aUv*Mb Rߡ/p3.JxHXOWrbkȫ44j?ЃH &mRC hYB$EFn1X2ӮK`G23gG :ⱌ-`(oydw&R)/ܴaKj1{  $b[3A0Vgn^viA#;,"d2[Tag1>wE[?7ͧY%UH*,L[ P.f̰p V|-Zv$8=zXl}mQXeM#" ljc[1r Z4W_O4dġ6 Pjg:`N^.:ܓa 5=2y=䰴qֱǼI |p$Vtν J+ D. 1CB:'ɒ擿EcG+#)Ѽsݵ O&S{(9Av^\XLR3-`zE+*0@ʡ~Ռ(w2| zgĪp@H43&hifS2z4C1 `m6m,m p\p`+Wȥ@g !h 2rI7 dTM?)ʖ0r?+!>{@AߟƬJ'zd9>~*f`잯7 tfV` 9B{ xysնd- F-5.P#`B pw,{x ih 4?%HZO&դ;;N3>&5(|\UkYVī#q@Tveuҽ;>x[8~R9<#-H J$e]M%2b :.#ZTNxnO٨KpMʯz#K:#aEU*υʣl٫:d7wV{T},e#@ K߈jGaق0Uc 2pD .ĵU[B]? =}d Vp8{q]^]E3fX++Չ!`6wE\AdZ{>^od/.:Vv?H Ķn!X9t &!I-_s/i,Ɉ]RdUKtPؤP>Y*Yks4:TgܺV4\ZbZ.Z4ҞS i*Evjג`;W6UJA"puzaa@@ãj'\̰YFeajgWaKΣzEw4;2x(jʆ9uJCcڙLdNq"V~0Z dDtP`дִutFbjknIF"@ay~\ÇɃA&ɍjXϸl)6|2=iPn&)_Q4 '(>:$ɜ6k3dps<~ PenUaycgNE&7KbwbcuxWXR: <<b+®z܅"]5;V%~nASmF (ֶkk.RLs.]Z8qaJw4oش?K!Rx[Q/&"u:6ƭkھzg,Oa@Aޚg`c>:+{Nl]JS"{]K G(}mGW-r`u+d>R5K: 2:l!8" e*>ps>5@U!/\DYRHتLf Ƣĩ CǴ/ip4<0>z (A[.7gZE:Ji 9坏@al1B̉7)yN X,S; {tW|2D$̦,竤L\1:akFc d`ohazT) 3u'_fw[.  ꒺ !t0lVt-*% QnD/ 'B^:_7z/TpN>u;^7fz4$,Դ琤sB(}FJMzuI0?$"}S]SvGF98Ƕx߳:ֱ]/♩V;lqd2f'LJJ(ࣥ"8u6LGٙ9o^LCY]=$iҽE_B |+ACн{>uN6JR/=bu,!DUթTɿҲdgBnglQ 0ێ7eIe "(`PLBhFLa3)[nR@gxz?ic,̜6Z Ł &HfVw!`L#GHjFF=ݢ 960*uΨ"n Փ*8k-0Fo_л2*Əo }Evn4Ԅ#Q=W<)1{*pF=5bwYb#45EdIuQASF'q͆< َ=$5JRkA_mE:g{hً?>֦NJI߰j{1u3—K7y,ïpaf"1;kqllZKM_ E-&}f!4[T@%R\ؐ} +rHǿQ8IEWq![90<Ѝ4 :;,N:x2rXG3$V&| =`y=L 99Y)^"נz*Lq0QE u{bƁ,p[)z3"4~]7!pECczk |5sZ6{kd|#x`^lfK8QIiNcqx{ c3{|(Q^FKxW %Hճ}k#ڬ^W=82誚]KC̡'9ab훟N#r@QH/ɔA/Eu*֣wnm([ Tx#TL-.:ZV9lX V|wJ˾7:X;RIl5RXOAHͰN(;LMŶS$$dPX9mk7VE4,x儳NZc&@I\БPZby_4Hf /;Щd  mۥ3nh6tE:.6I !R~[VRBA+jWbsd}ldt@`c*>F@Pi-sh2,X:Xt~\%3mNAIAhLߡ>#s_ΐtbHH$C /`E/\\UqԐTCFרy@gӅQdvO2?CfO(U``Gu3'_G&HȦqQ ?oi/y@WG4,!4Mtu{Gc%AM%: PU΁xLeZ8T_IWLՑ Zdq`ыp7D]1k<ɶZ^McQ Kr%Jcm_#rT4mH J)ib>Px6MlcG'ֵ[C$HDsgy섄^`xeF nu܃8wII IV).+X:øz\HIeKB&w&j :O0QB:̰[."p*Ƭ6o, H&*|BTͦ6ϔAhmaF=1K^y.FưKFfvX%*Ƅ:.L9H4LG(>}QTQJ^Wg}qm_'(wocP),ake͖S 52 NvRnQq\\Hq/=1iy:T9 .dAݾuiOYiL*{b|!NÛVUvZuāw#.j*@A=Ыٞ),-=TC(-fNZ2gz7GqL }*,{S܆K]LfxD(U5!0V{R.F.hBxɄfXgsG8*(!#gϦ.U)sk< ]օouieҶDclqKAx ,ZdvRz-L$)Bq>鯊Yg)ؚMc7*@uVk;~?X΋$2WI~@[r`,ٷN’Um1\]+-5D! >4boElgw=jXVrsچ&e WGNT[s~:XxxZw%8|S\IUO $4uq ~FB/+SRScaϛK?ϒ;k8|:a½)E3q>7thI {NcTJ[]UC|đvU4x5q]f xmV;7RE=r;z$/5 rwAryv`@"4 r?Au?Wlj,ſĔhx^Bwjs-|rn-8ۭK'hZ#V _iysd߃_Eͪs_q"1ͨlƦ CN6{hu[l̙*|'9<5w~w^爻|Ej"sY" 1}ofgPط`S 7r9ŲoNRl ]C>F?DfH& *B(Ė4r̨U*v9Ŷfʻ,%jpJ {@3f(.sXLlK2)&b{+7d8?T/'Xo~ \.15Ҡ9m“׽p iٳWPl hjP?lUZbqtkM&+"8'5Y8ԁmq%G'iB@_w5ӗE!A-McN* H%حt2A\ K,LfcYKܬ-S5`ř:_AݾC 0b9q%m_[OϾʁŶpI#G=2nς~*hhu$dͭOw)`Gbߥf+k'l.57$edYt| |wYC ]XV>pXB(ʨt ¦O~eYnqj,|*N*J_]t- 9$H'Ƌs%n!5EjxΐPf5Q20ծ}oؗQAF:vM>[Bg.>ɚHVҭDw!zj-dW'EݧShX>'SQ޿=rP4sDr1O6\RwÊ" 1_= $|W_l.nAqwP+#S mtAi )`uŧ*oH*t.?RQ52~eU*Tnw :7b SHL+ηrBМ +/@K{ĈNlf4ʰȥ]rRy1`!kMac3bQxh4H#Scu"W?Ń%O_}!M#ѽy0I"fX]x<,&&٫,2'!̖TFyl3tw@F-Y #5K~\pg?t*q4/6=N iFaGϢDt1X~_l\BjH#Qxnq|sn ⹘T?_\; W>[s2I!,}95xҫh5@ ךk]$ujik9|ד8;NW5]s1%H_~:ݔG-Zaڃb7n|[!vߘF 8LVj;Wm̽i*7UdW'BoMj>,UIyZx|?0'6hPK *:q< ٚzURi.%Kƥ.KfbLgSWPP 6Ma|!,q#u,e3GKz"s. U=15UE^4ŗ?FzVFYƖ Ghk RbE6Tyj:z^fӤ"cQ? nfh hfBW׊q4t_ ?(9,Z%Z޲>ݝ2U_R~LBe$KL?>)L0b m=(@8Ǐr۔A=T==!I (%qal%F\kpw!#ЂNXF7-IQ+~ũ5i+E08*WSD;2`>ZdNB\0+ /RIP*O /Z" ˠ-. \9 +"IIUx,t@IlY^*0SA0H#g&Iigv+N^ 8E&)|x 9r8*f4}偏zU+1a51O2f)PeS1%u)<[*¦tZ}3IQP-x2;+'Oa.YMv 04  `R+l/`=2_#9~,w}EQ(=&"Q,j`ft3e ́QAuؿabBv]ۂ{[SXٝ1'wAĒ*f=xqֹU,{!^WuXdKj}?L5RJuo$>Ki}S ܹʢU);$qyוּPwb0;-GQ5^s>"ըU.8˸fVJH b6^Ht=^¯Bx$#!!ՌRZ %K `2-`{OՑ~L"UPyNLs,^&.FdWw K;^ÜeQ${8\9k#hA'·8Jde5EW;+ՅDǥաZp,d*x? ׸w'"Z"{N ԌK" `5$ew,n1M'7=%QHwC.p^胦J:[~=55mN OK+Mxw+RYF$*$-J7au0PXd U3BUНhA+Ŋ- W39%-0ib,JpI8^Uv%e^Ӄ,2 a:!%Elm<ԗF/PPS~_gAH m؃ K$)2 h؛* x.sh߻|..}]: ܺwlh,-9 |]#~a7QfC>jչ.F-9QΛ2}VQ;hs^ۛo1w7xkLq~,_ ™ŵf&<=.8#`\J2 kF0ҔJ!zc. !;^N5BWJ?^%`=8n?"- П=UX,cE¹l xv/]"pӫ ٦ƺLZIT~yN}zw$B=O=M<1{:Z&\yu06||]( +ZJ>**3z[L;$~b+؋.$:nP5洘* Ҷcΰ Cdo(좤YO֢zdL1uitn0մ/"~ۉ`" fXaM[UagzK|$]8 W?z^GEul4?:Z6I^U)q'aئ):^6ulԚU1&R;{U-MPֆ 3֭9uѧ8m8fi3>aq jsԴ Ԋ"t;Ѿ0Y¿8m"'UD 4&W 1 (%A\u% vOW9ql^^S+k~q:~` oCJ~K=Deb3ݙOib.Î\,3D\q'k8?zPƢ堋3?M )NBU]OԷT;H*vje8[#O&hy潄r[ WQwɼN7Km̑"%߮-iwf"JI粺jQ ]?ACy{>*l_zmBvI bkF.3U)ҏ:?R3(rc)@<^ IX&v'ѩ"@0OCՑMJ-6"rqg?(ftz@>+ú}TmmC#45D-} orB07U d}] cs}mELilhs{qIgJ50̀)faVsnnܠ ;ɱNQc>NjHǔq`^Dg 뗜@ژ_m9] cp̾qQrs͔bWY,DgZ'4܅5LڴeYܑGN<}6~7a{;zs_Ow= Y^l.3'Rlu!I:($R5d~C~ǭRi3 5ia0ylP:,2O@t27f&jJ~%7ǤV?IR~u%W5Փ/x '-vW ˸'C =v{cKD>3){~{]#76?%m>5<Ұ/ffAڶ\XM*WA]Ѷf|@iGs.8${0@{ C8z&2V 6-;OKb'~fݭPFxK#O/+%V IiG k'CL7HzޒBK"YJJAasGlrƍ,@QQX=^r"Ty+ /ʇV{K +CQ#BH?p;ZiTZH ]6 bʌTya"R'3[3 0/ dUrس._5?uUrX9/1!dFON659;+-]ɩ_v?l( tmc*71%0Τ368.Wwsq3K]G`WGt`¤@q <'@ F`k*]i[ֿ<8sZ-3ϑcYiowlG #qpJf|& Kڪ5@ gEf= XݪJEޟ^Q\_6`|؎D RH+{mSqKhF-QT1PT~F) s 5O̍`MLuq-{߶psuuҠKf[+wXX6\+i0"uKeni_ijh.&Ԧ=ꆈ:u}cwtVn6!VY W t|XrٳmN  9. J+{٘1 -[x_*7˓Y5W1Ӂo|< bCEA.o;6ze71hoEK6JEBƔ7ܒ7HsM(NiͥRi<_B?lc|'/PQ*8r7hi4Xg|6`o u/6/_g>rlA?iieGr;xmFTa6~Ng.,VRG\WD\"%´e^.+vh>*;18[)٘- m^s=ҡNsi.r;9&д{EE8)|(̫3Kl?(#GGx~.bdc/$('M,ܤJOgoj7:T !WY~!g5x=hi'-\oa@~:irߞd$d3)͕ |afҮGn a:i _X2SIWe ܚ@;E&nmscld|}\2\fxa^xz~VU՚LW,ϳwB :pbθ( YOYC_u'NUV ޚN(?c#2eo&ĨZ[r2^IǔNW5_p1UA~E~^eK-@ou| VvoDmŵH{e^ދ5%*ܖ#M"+ұ͡Jx @kK­Jqc*Tɡ>D@>gV&߈`bLi,KηkAڎ=_/˱K~̜/gAh@昢wmaۅA`I,kS9w VfNLzh 5?$jP| EiXF+Ai)&3)|1P9f&Y?%似Rq[Kd㋢Jj5w<4b '\[e0PCj(Gs4ӓSQ޵18fw\l;WCϥH&Z9:~{rAVF!߮A2w α 庁sZԴpYi!xbZxmjV1ֺy4NP"ANH*vK;Wl $=+b =d1Z(X,-tFGjg!Wҥ+GA#lD~V0th'W Ih5\ |J} ł:&q[rdgaG^y|+)%7f5;NrrdG'hhF3@Өk? 8P'nP4LIwJ[u$LBWgKbcg=mw2 CY!afY-cz]A2#W/"萑N^!NmHLP\b4q[c^G*lC2|Q,}oemAkp }eŃLt/t})mߊ"]ងohmCuC;b~ @PINV i\RXw ݱT| 6>;+H $OM/1GDDi.9qeC_NQKa"*yQ, r LO5h^"Pr `-D}1~z49p\H۷;YW+@߬8t'}5wBec4hRkB1!xp GD_?}R dʺM#)]ozz FX8֜v%|7+" (G˞[c ]YDzd':l@8/yXտ 2ǎ6y]%m60KJ~9ZRΊ+ %ujmiw‹c.Mڠ,vm HPRq߷J(G*!~ " @5ڡul>j8a 2q0;2~ӿ)&IA emC-er+a>҄QA萅^a@CxC ak\Kld)^6Q˥ #"#iRA]bmfcBf]=fs݆_OgZginfDB,RDWq\Y*is B ̼)}F\t}1ؒ7(JB`TOPj踖@s|ݝL}o YY݋|. +ֺË=tH>gzX<`(-ظj+C6`0-b-~wKJss85'JU Pk꛾U=yro U^w tvYO\!|aB~9wfrPC<7J`a¸BA1w1xQ 8p߅ĂgN/t}\WE|m& 6,ʇ%GZ+,ĻnI$b_198P-!(BKK5F ];ـκCU\.k$|7ٶI_23ۧ`RYyMh"rN<%z]\ɸ q+:D-D f#>[f=zΣ|ulk'I9s!:^!yRJ] EtζݑXl՞s0PCj ٦'PnI )E VŁr[z ߲lZgM"|vt5w%F&b_TWVo@lig<{QHSaإc Ⱥ&+4WKkD-o)n:LnDQlrDv,2/ 4iׅn/2_-1>%O35|3b0fVgP'9vhiePCaʰ~w}"X͖F͘=.8/q/ xw88˽O#"dzLc͔yR"@vg1J*ӛ0Ta&8iRZfMQY~z&@F ``CZ!yw%5,bѭCW>4BZV5od%V.XX=-x L 3pw+;d)H(@P 8*k hJi5 QY vΉ~<"7WHM*>G efɧnzK 'U,81aL}4 bj3:ņy=f4r5UN$9sJ) n ·xû.i/R{ඒ5ϪY5<"Yw:?Jdؾ>B 0}K淫weO>;&P9U$ HAu73=?[$ܔYDضCy$DWf8!Yd( )Mѫ}E]f d!%Au Ӝ[ L[_YŅ! Rf5e(ʜ .ޅEdwEJjx!u v7UTAŪ.!ڕL b &2+>!s ȷTR,oB}$`/AĆ jd7슎:痰mM.olX]تAAxz*#B] ̳LKZxt=x My%%Yn,&L7Npo'JAh>>{ ެ]:7w_OŘwu 9mCZ>|n ._oEpThY$ X|h0m\P̥<5M~}qZt;S=Y{PyN_R1wyŶnn8À9djE\A:?lobQabf49 ~J̟d#V^cԙUVâGqŋZ{C_hW+=LX\p~UU灿MLYQM;Pq9KlLn1D2BwRD%BE+$^({\pKڼj=F4!k[3(<,!Wb!ȶGL tLJ,LjźM/#U & n/kHCA.D!$J< t8BԬXK )6JYScc]Q =Bp(%2@L-`4QuR͇]-j!21hGYc`AJW*9>sYYnMͷQ;|]^oz2o輏^;ThʽN#A,bp4cjI8I9ߧhc_sNFӈ[r&{Q L XNNC#$Зz:C!k3 }-H_ւEpsucаM8OΟS| EzDգTb3Fti3{[wa' ,5|":3Q+df ލ5~/+uO]ezb2mS:,W` t2LE cG`nk_#vBgI,p6%j+q'zLdK>=t5$^ԉǪ&10F32f5qugߠ f}{(z'y(¯y9$N2 "%%sXWd\ [X'd;a5P)XD\Y`Tbhr;tןEnάQDDRYр q, kDk&;5;4O`6?{_}[:x3ŏd$?'Icq-kIB r>WX"'Ԗ˘kܱ`6rbE,l{qĐjtJ rƿPį\D* pj*SHPC']K/Vba㡑3QfT^Ia̗*4!yj't\ Clw XF~d\9XaQIdqvVJF.&q$Śηg:[sX5NN8ek%"[vwlkV⻷R ]ɴp|\4ֱrX| uPׄLe΀LbeU"Sx8 f ǿ>u!mCGdmIRo!ZU]odR{]qԉ /I)zDR'8eH5YbjFRcġ$BB}n4("MD&2F`-Rt0zE US(x8ƇRy*E"] ?\i?N$#Q!_2ꨖW3kO:.dĩC;K/>sw~'ڍڃq}68gl?6&\.yMSS¦0/WbMiXZ'xKf)xubˣjF!O\fSߊ[ qBcx!t]%Z_=!hlaF^ ;fC!0?$#o7"cQ݉|T}w(Z4 9< Kz}!aڲ\3LҡQ"Sh(,"\De|}!p^xsnm/cS^09U<3p WH龩S7:̖jElp=,v0: 6rKQ FִT-#=~{%M+gV8]>@ Tn-%Sy?&E!]\qK׾f#0ːVD5BS0p_7;ى?BW "S|=ߕ'0" 3smR D .1>M,',sTمvߪM`&,{G.E\t*e\OOÎ*sxlp24L}dI"3 uJDȈKv{^~ @HKqaLTȞJ 5 >Tt`y2a)U^#0MVId?!@AuB@~:cqꏐ\;Jj RuvSlUq58Euaށ;fY(O | U@iy1vƌӤȈl6`ڞ-HD{ɇ:a&Q/Ώ(u <Iܣ&ji|d. KVr$4}ifmE J*6۬6ZQ'DɃŊ9idT(v{UMR@5Be;YmJ{;BYI 'Mד6`F%J)X37ƚi<j;YL1{!˘e|!;|!T>w_"~880R--Erƥmb8xӚ eJJBCAgIAhLαʹguz1!(bk 6fσ[nvuDX(Z8OH2M*d/@=D nm[ht7#1>rFwQeJ̯وlפ2"fNMq'':w@*=niL%튀]VXm_=A"Z$5o: ֨7,$[AMznb +MGy5+Gn*poѵRvKDzk "8lH kf &¥b?K]4ƣ,kc|jc8ψ,#Y;pL{ 4n([:nƛ7YUMhkiSbw"4 cf8xV Du>N[fϸXg(I#CC{pՈ(p5{<E>{)7s=cj *±Qrqn[sь/ ! ѡ&nu!3+LzEznX%?R2Q ޺nPB9>2sxO M߭z$:G}T2>@}єZ"ȉo5Շ|zYz4LXu)i{FM;:U: Qt |+("ᓽ,OÃ6 RNŸ0cCz?ڎ=S64j)6DC{ +#ݗ͉6TU!S58}M?s.k+n._{ްA/H$KbP|/Fehб!5P Mw;KSIAAtVwqO\ 2,;o54&]7ݧoNg7}m}#Xp8r#'pcd zI7E)pdF9IRZ)kL:S乩YE~|T5͠+wՁu[iչ&5ޔY\u}t+(N=26=Lj|Hu#X>76EXJ)r8?ATIiT)fd}yHzql.q`A2w( ;yEQQk%tZ}8P؄NGE=Hm ~# L*YBJ)ε@ {Y(5i |Dz4j9GT,`hu7'~+񓱞KS# 7ދa@BF 5霾)%9Qctrً YDf!xsqUnR~RZS:I) 1D_ĨOqһN!ھ1w/5 XQ13Q>"&pE-iqgozG[A\VY=g<̆IWSJ]BlNvWݧ? kl+3q@HL zwDa?- 7)lB^3⎧%8wst(VQָB{ 4u՗P@aC:D'~ZNhab7ZP|+T,06TIЄ6ĪjWQE6$.4W:LDPJSQc {qpG KT4s/=IVs-i4~mfo!}FՋ$̂t( QOOn,b^& B˥YTˢ8XHƤvYJq䌑&]"a(7*pRG Le.>}?\dPFyĖ!)/M t.yZ }lAAO!mEwX 6r/ڊ=N5եE5v>ݦEvE, עmR=zf06Dw~\iV%EbYB )o;ib»lkQ0XVl4OP~J` 1y(^ʒ+":,T=?^]%43Wo{a13 @)S۞)[G~E})e )杮$04XOl$++ =6P-ϱxY%W mZ#] Z_kEN/JD-ȦTFsf+!ɄZٖ-zz})cH8B4sNҪuu~Az?T~uG/ XX::8XR"30‡[,2(Q嚀R9,FA% Z:9hT˒UU_Y. 0j9 V^C2Nl:[}: '_z?}0]0J}[<"_R[܇YF˞ $7!f^1X鳁X;:\k8n)lJ3<'%3t`{kHRH$sR%O!42ZG_WjlyN3  ]3ag,_*\JTsY|j AE,gU>2|owJeݑ&{)nH= m 4u 2f_{zŤ 2;kw3/ Y=a cAoѱ ` ˶NsD @z+SVJFѕ)al.y9yp ʑTaR 1;͈ǐq!n+Lu J~ v &.YJ 9->f#3Zg%m &pfj" Ӛu߱ ܫv"C=?ӕ s>G{?b]Yn&E]b䴜}53AE ;EDvhD!b8}-z4dQ1B#O,hqcVEj{o,_4ZM'-da5?_Jl+LqFJ=GC&Q ߥT.XݼiɆ/Ԩຕ,p ucIH|p2A_J zןl7Ld-? YuQXՐڢYV?~̖hox,lEp^-P,Ě*v qMIbO[8xXxS>^-RVa~=7~>|7 >@lCGj& a/~hlv~+Cï'+SHmGe@=Un.ĥ.O[bЗeb3SmV_'dF܄ƍ;M i!Zئ9 fLLG1Rf`B8QyBNl8: TQ0A&A}kq+M[͠\8!ǢpGz){[@c\6 3Pپq[jzk ؾtϹM)x*a{gj`]ҷaeK5,9F%>t@np $ PZ{;G,縉^~)JoGί%Bg4KopxPɽ%zR9dF{o:}wKg+KU䌜o;pgbW'=gF( -p֞k|^Zq|;y#Ǥ1&D/c^tՃGWЪ`QD$Ũ}${.yY^9;!J=IGЗ|.|TJ\F*&ATqP ي+N @1_xY?uTZzʻR/j]h?A@>fTy(d/\80*ptEoseJ*_dm")"9hСLJjԊgF/|Ň2⎈76{Ju6et Es$ 9gw &{CwV ͚(^ L {Eg;b-BĖ* ζj1#oK~1 1Hi̖p"z5Qrsc.w 1B,,, 8#gc#^: l%KG FNH W%_vtn~ lχLY1A9p ^%L>B0RPZwg/. $pZh=iDS t~@Q6mۦ7;g|{7H*1h1 p?(bDd;0b&7BKHe[l~ݒ j~%bDuۂ#27غ `nl`e58 OEDdk!d؄̝,fR(s"dPj0-Aɞ%UjDwaA~hU_ٍ'vDm II=M)ۼolN.Qr[g]Cm抭NsQfM|#xngű"6Qepv+:{=yc-MZMU6u0{@wB LZWcD>}3Nx"ꏴUXޔFF*xkύ3UX=T*lF|c?%gЇ?ov+\zr(m. ,e~@ p 5` |xz~ZzcdҚ8j"JͩxJ  2j]怈o1 ,3~_kѡ?=/)R|$+ʨ0)O ^9A5&|[~ikWQ a}NDɓˀ=\зZX^,wʸ GKjVug*Ux=Z|ټ`T^J_*`.bur8Qa= *g6 2,DE\k!I wC§F5I #0b44z2cꮴ| f%QBP~pP{5 ㊠|#pX,!?2ؒǵZFM;7i*v`EPΏF,:dVǸar4瞧1zr{#??rg N R0x"McZJ%~!>G4~xh-]X2xANm#Vo1Ե6>7f3abwL9LBo\kӎWTjUĬQ,?l[c^𹹌R5ðUЂiQG5 %J/QC:3Sbu͗%=4XStw;("^z ݈Xqy^Ə7>hb r />}4OHe Ё:t86K1Ear(|YÉI.2YV5BsC.t[ʕ U(6`#O*x"CӫED z<πh l9˨5Qs`5h6egiR Whh0S$)gZIH` xCӠo=mq@~iwyN c&(+&>@e5ǗDyO_XsKq;o6Y~EIԃ=sչYc SaUGKu}K(U"ưvҠ< l9}NzA/KURO(q*2t_@w5 opi}`@B<ћbP*ZO'Hiou8XK1(.! 8dY{c3pژzIRRs ߤfC4l~~\oJt͞'?&+j$mO^ Qj>~N,kL@MӺSdM6`HD Wx6R'g~f],[qDJ옴 ZNSP w9'LȜpQA~hRr.a#h jƞ*8:5 6 \)2Q OCgj5~l?Zka89{:$(I+7ʸ:狮aLj75U$g%>;Jxv0ӡAΫۍ5Ƙ%l~Y;+5][?!1*nJ8٥**:칾w3ئ ,V.XUf3 +tTwr98|d0P7Ocsp)u%g-ۆ.*?"g2b=kiZjI7(Kp*sja<𸺴AIAlLҥIp]TDçcq|}`\8^l8Q=_lc7} 6lCQ H k iZ:"I_sv 6^u4M\L=^Tt.=7Hr Zp5|IB(3 5I>eP5EL#\qx{༽Pjc?t۔txg7ޞRy:jl̩,NT!;^ eE?C/5Gٻ"3n5' .D$9SȳUsȼI|YӢz,1)L12۾NeUÖFzVU |a; j4#,*=%9\0b38ϳLjH Y5aXcpr׵->R!tA7J`:XM{VRXj.D WNV*-RYv^ś-ReڌϦR~bo½ϸ,a0P}2 g4ud4?*rۍ&PR`I;P#t510 y90bV0ZK`d!N/ ]Q qZ޷n34z`Eoq9وW=ZM %$PK2ӏ<-#8JEpF&20\D.aSE/5 ^ۉasLJ^97A_u.0ÛnǬδj} 5n @rYILiNj @VӣM{jmn k 6w+:T(QE>ADIW] 0 ZW ZѨ6YP3 GJIjӍX~a-;D]0<|XIOo_l@k"6d0'@PKVH?p x,T .8|om¶ uI8\ʁ 9EpP9Fռڕ?XaLP?a!y X_۩[|-o}G>Q"3ģث]%4&(FZ[̟3KV'0)E@&t˘Ćgs:$\fR|K)x3\\*Nl*S4#sQS[۔n'%=S0L>Ymd ?1UrRR1y䯛׬2'FWEBZmswA&v(rY'jq5¸u؅8LCJlgwA^+3T`A ]ANfrulav 69ώқwq-#DĚ(z'[Օ`@V`Ui7s{ 2{|-UqXuuB-f}o5P.h9C.D@^]PJ1ېdcѡh'xgyL^vEr''I?Ph~Tu s0KN3߾>iUȦ_xmX^U;17O=5ߚ[*}ճu^JT =.vmK! mWk!IzX ܂ z]EhgھqV71QkE{!k(;PoXߙ Egڇmߎn=%"56pNL瓓c( + qOepesG8sd}[.F]J~l6kv5oĔy-jH`yYo$7 . > N١lq 26ɒWsevI$Y u Ȏ*7dTm.5?kbqnaxuVX;i(Lm`ħmiRh~0 TF_~JDw[p1YDrr.'ڶaqjb5fQt/H{C߹QA$0vs A@QZfh ͓Ki\r~,8˳gn=A|o>oHe drw @& :vʡ')E pU{0zOeB#Q<۰ ؾ&vppBS\ n(m/jƁZ H=Zﲀ:|N+5^J43۫{xEf?ڀ@ c5=At)@BY~/TqL޾`\@yyB cT ܽzu4N L6K9yxjJr 5C+w XO?.5By8-N2яakr*{~3;i޵BnX6W^&9l!gJߕ:7-38Զ65 wb~9ע^lK:ISա¸=@GG8B9Z#mгSWiŸdANM=``& HɀVю)V4ж*njYo)b(2EQ9YX}i39i܊ W>DVe@ZjD'%qbNwJa'4]y!?jZ*%1JCe ]C:vMP>NQV xё5k`hxom񍆪dh5F=D).Kw܏  .##}yX9* U8[߶FUuT8yE.\됷3Hi/"u ZanqM K7l9 n}9[=gדByʗ6?AE,g2[ +z$`Prӑy;޳ɨ+aEӌnt- ;&;9# lS .ϝW"CХШqOS8 7,]qn}x9U\_NYP50oí겷~s]o.#ί U$d^U|6%, 0mf9Ow4 -7 =>\7t!5*gGZ0wEːrg? \O_yA /"wsDWvƧAļ_qs,aUcKנmt L(EXGtųW3d+r"'&B2q s-%y,Cɭ̘jϦ+ywx;d-a !Yf&X%>g1CPez6[P1$.>& T<ؐ}VUi!px[pq|߼M͌ z0)!/n'5qؠ-]. ƫ2ؾNw KՕ&F R6c Mwt7? 4GHͿLҩ']n@7$s~|*>~)nں E6oK>ɉdJRױG[/ܭ [mYB4kDƸ먵zi.H`[NĕES[3X^5 4\GfoE8,},8l0H$չbv% Xjv]+(*b2a`Ya R?8'k^ %1?N97"WZ[qvpv"d/0cHܤ;\AkPnSYejdaZTNGw z҉]p٤0& aoXΧwקl . 2PviQg*AXr\㬠IZf=S%Khq)pyϸu!}1v(t^z}wiiN"uDy-_c<6h"S>`3>vKs\9r dc$4w0gNSC|uS4cZI]ނa/g}mhlڻ*P$pqL4qG.՘"z8q`yiknɁT+_(M@~ b]EȲt. !#1.@yMmG M+% G`*zrZJ }xړ%F'o  Tzz(o]r"xsq3wng@WKh[x@Z_!3p^^T ?ِ , $ ;6.;`:N ۤN πԌNJ B^oєE%bvc%f[kcu Q$x (oX?EH:Y8L 4^|I-u"mY;g.IFY`zSmg7eo[vppzU3ENs9Np()tg3f4Ll${p(إ N_Q\SaUQ\`kjU#' Lν(ҍi7eCvE-3yi?) { eXP4mh)`l9fe7'$?uDB{]fFaiP?~{B$W ;z&scݴ3E.+eN2Nti_cܠOιDxn!WJ zI1 9DY&e F"5m_<ڊmBu ^]sfd/ګqKַ~{ߧC/cE8wTj<C/ٿbhG-zJ8&a<8-xJ>DڒOu X=̽"y^!e-K#Š(<ZzIZ$< . "FUta#)I(c=c{o#!!7mCҸtΙ ?~[AWxpS8ԒB`,eOҶ'dZJqK#h[ڬ>u< 4i T{y\)1ND@B\MƶH3iE8}@X@7mͺiN3 ,mFrAg``%rCH@~=oY(avnKZ3v؛F\8AIAlLyJoey,4ZQ܎BlS$ + uGl_DF&CTnZ:>Aw<6/f(YeV/%9-};TR֫Vyuvv@H|S@OӿվHBZ7m޵Q @:cͬ \H$"L=CI*vJj:loQKZcᒡ!i2)ޔHZIg dc]-`-[yqEtmy/y۸xmf>n"UtVG񇥗;b\ɾ-`>x"9T4SXy_w>UǢlo<)h=*G~э}069@u}}+j]apƯ39 *(7|ǒnE',qFXb Q"':̶.(\aA)GW; )66ivD$~x׿I]!HJ0!JFK\&,4xiFVK\o/(=I-tL8)X j$$IvUr-p-]l[@]gv&ºyAC*.xkNܳU> KwG(((ܙq:p4@ƹRK8Ȍ*ŭ(Ð#S36Tg13*~iı!&>Y774} `T5 %z-$ZmRb \bvmZcSː1_Ռ`x>%) ,)3pnRZ9k@c{i+|:5Ui | R~r4/o/>9b`Nj:0#zQH_~ŭYi;,*qHHGdD?p^!O,&d~O}D?i/mƈ x ؛ H%d^Z 2{#*gt{߻%!ߩ1N!z]6lp#έB-k7o <`]=G Pv1 sH"RxI2öDF$@*Whhϔ=j=T6/֤}ZB?cVemמlNԑ8Q]`ary+Sc|;4ŗ]wc3 Vcz7m{"Y|B-qsHgl|MǢwWYl3ۭyɫ֝JA,|rlo5PSh'53RJYu rV=[mY q~l.\A/{jG˔ *iX`4/E\нz`>ÇF|IǓ̘c/^pf]5ٱ[b&&pV3By ҩ1xrBAM j|حu w€Clx6GFn1H&',>BNsDR m)ݝ/Zl Ha$xPSL\b`n9j^Odʘ(P16bѱO p_DlӊpJ?dWB*'NheLNxS7c>g{4(rh, ]?|حkyA!a䓉 Kɲ5$A^OT*2p&ˀx񫔧W ~f[fk`(V~\bܿ ?جtϺ6X>3#A5}clK[= {݄(kH8?6{VrE`m+ Uv> 1̩fj8W2^SyL~K̙e.3kjn~K0s+N݅3ac|o23kuDsd[& .0^PN-,W9,̎@ FDzVJ U461Oخ'bm |arwhdu[[/@EoP  q>1c룰f4B  ؆nŘ~Y'mk¡G`QL{5˝$3u-~R@cpɩsy2I@\2ZyV20s]ha~Zӿu3ܿq7JuySO? }/F7:糫Q/2Db #%ElԶ*v~UE+R#UvV=f2%P5ڠgFqC)֟bX2E+ŕ}PQ;睚Em#:X.:9N9ɘMH|3o(܁Jn%\׼r*v)]e )JzQ8;[V n3 Q_]XX+X۪L~3l{$;-~?6N9D+FV @ h0)z!(׆)}. @e7Z'c]Qy[\_6h3Ԫc3 hg|1\ {삂zΚa̝KdĝfJvݷzq /,Z0) A_ d6u;ܗ9hَO^`WvKsNDG >)!UҘb(sQFv!C(v5Z-ܓdnL@{~C3lM}O= "nOe9,hޤiQGnlG_%\iA@d{ '⼅;A{5N^ ,jiU&ܐT"0#(2%v4[' t(m'XOG4!dK=';)~CX s"0UUG{2g&}0,XS> >ޘ>6bmk4:+ykj_]8j7?ޥ>qݠEǓ^~<7#47M.b#T1ĒL8E=GSn) GT/qa9XSo]!9Bt3gԬ\ϫe<%G,_=Wcp|l-3Y{/Zdk966B~4wʖ\mY >{;Җr+4o}3rg5+<~Ůtmn܏DetBR4p 6õa>)ѡnиm*$a&&^H݌j+ Z7EAakSFBWyj /Ⱥ<#4;DKQEDixB4Mt[K-,Q2i>է,;]QqX02uoKH4Uj$ O2I\,3ve杹LDsxG<_}#ł沐imvg>םˊ*(Y˨);} %_lV LTwԏ:S&T#Aϔ/i9h[|Jl9wstwq .j|WJM !aMi$fdi3A E,gguv `VId=JAz&`R'TP* »=_Y)Q ??RǮ߉\& SPu[qk7f^SJlI{z(E@=0k$d;l@)zu=R@ -ڴz[toJ*1ƒ!mҕ)5tKj]Naxc5o*3E!"QLcOr^ Ӧ?s0Q._7|D tY/$q,oMPei⨪OkO13R iݕ*l(EphB"S1呌zc0r 1oDG7Ii{|e25v||Z="4$c4x<? A!`5鋐k3ՐRR#SUA<5jiTGb,%.;eAlr7%bfUnZO#Hd%^nf1MBaW%˃{C8a{hRgϟ4*papsB!]M)A{/܄h78]Vzm|` _SdHN;41CT]\SN rS݀_8U?v'- .>%oWN3ˋn}u!~l7S/OvHi-,'cq9{Yl)V:L ą.кG7p`M}h& V+fF= ݭ;D_(bqqlbS5U֍!>w Z9QE1+т-TF0o3!7G5Y-xE7zYګ=&^C$co"'\B+F΍ҠP= IepWEgc;͗u2܏ܡK|H0.iAn` c=7٢uF0ERC>BNoro8 CQ9;Łz`f@ GoziQMΜ^Kl>U') 9@\f'~l!׻̴PA&(E*SX,7I(pf62s[bFn'/'\:mb)MgbH&g#@̎IG0cϞV*f$F7MX|wF[,vLjk{v)ۣD4DJs̄ȈZW( Ƨ)J f\f靅2t#]^s/$خg=fܷ၀\YN9C^;-[JёW:A XZVb:D7#@D":/g/sYKF_"G9ms/ߓ\"Px~,܀lZ`N:&ܨc$d$fsxdVBg]D6jfK cS@|xxCP3K K\IG֯t1޽îyG|9_iSKj.}HZ(&lC]ۃ z;8$'tҷ,Afd¬-{5iK՚ԏid`FxR au1G[+=6{\_I1 f~ŝ9[#-';.|zϏc}3ƈ5lr xQuww͑_p ~VɄ~ G8#GװYA|,; 5iU)(˧rj\5OO~Iy=@OQzh$ ۽HYu1=4A}YPC/+68>@z9 6ZM9!1%%+lu30D<`5i8#v FI:כ`(^k zФ[컹KPVk&Rr(N7iB#4yҸ-mǸ ʢSM 8m&wSg ҭ<`/$ \! U5Z` g=}v҄Bj7Wf +U}_l4ɼRѭK]8 5WP(l8'8=~[yΨi]F NH8}%hXФpV- &}*Zn0ghxJυ[yΑ*.WѐJ_BzQr,l q8c듧12f]U'/\;zblfO/~Y*\)FA3= Ȃk%>NApLjj+!TY|d󉥓TD\jL=4:,kc(z-0lZwg mA Vt8A|q}I5aD!, (˔M|zȢ9xb[8:x[#37%ݩ Pu2-`l2:g$yVUH#d*C_Y<ȃ1"GĆDΕ\(_--X`VO[V!ʟa)^KfWFV0ihbHHp=I.Wc5L^&^\`k;]ۨurK)^1/Je gpƽpZL@B>#5\ܗgtfI-3AC+%LoF3Zi‘\]{QiۊT[Q o4c5UtRJ.'50p* R'0I{&{κyUydWB[>a\@7N҂ҲkRnnڍTvs k\ t>QafO*=G+] c-U{/`\#y2mt]^uNzPLm@HT']&z{0Oۮ>^,SdM-wԍ#℟3}FF'%^ziGTtƪ1?Dezޥ>qd&O.M$^vin;8rHt$ ??en"l}F"d*Jf8OX7ZpYL&#]YuKZ: ЗtKvr'j>ϛ4^a{*7ao dMR<=21ћh&:E筜sK_Zxik!^r܂?J=cof,x7*Co z%m^O@d8m~biD gnlͨ+*\rLb:Y~"JE6tT&Z X?H;iDEwUQ${*uUYP&OExbPUn3G/m<0ք1BJ"nUSŻ7Os  o@l6u9Q.̯T~:Y)vXM .İ!-z&Mclpj3!ryC̲( *b~o}-MxL ##f#̫O9Mi/mŦw+R8+F.w{sEl%/?7&EKB<@l+V]l'qQ}`'qruNCo;jθRv>LOUj~{ TM˂M/g Wu`jjX-JYԤL'r?56vLØn1' pRBrR&)"IakXQ lmGy)L9Q<6ˏW.>kL3j8Sk@AZj883:C1Ub0#'>/Rq0+a'Jby^畷{P Ed=Tb7g/?D"R +tGw԰ݗ~4ta&1Nӽ?:n'ґj㠻e{ 2 MhQÿȁd"nq2Jrofdc}tdBnUჩ+>AGKSd;թݢDLc "I]Ĩ{Q|7UǭTKFW]X)̈,)TՄvUjzc+b^'{G- 3h 9RqnP~8>}?]ct&f'vDUzV_6f)ڠmy2mفJ 5W8y/ɠ#mF'b9&8qZw~-p8!,JٺXtØDžx!CH;a˚>0% {iWUpΌfOcKˊ]^% jظi%Xʱ"ܹ&u283xy, z4+yb Zg,pHJUo ow>Mj:ZH-!/v]E%= k@[!7Ęz᷇=?q^V8 g82ŷTUN여/I:Suu˪ σf*J(LfT艴R@kO|Uߴ, nj03D첎Km;1#S\scJ'h樾€;װijESFv@kgx`rJ: 2䚵%eqshMᒉ<;ˉ0y!CG|"h tGWE1%4:=ծѥB-œCE;-\J}Ejɟ`pUJ(LKS<1Kƌ"b"dg)PiXIzٚ~$ypr Autm4u5OwPۨ>G'ԧ~lOz5UJR 6\dMHxG#NKH+ F.z!3L˂ E1H2CWQO ?MjCKO>R \_y޿hy#%0[O=EڔTc 0 7&N *m/dι%U<%J1Q-$!$ ]<F[ 1}"cĢ3.nyS/ :j-VU"i{ms>;mhbP\7N!ͮt"G"6Blq2 m&"޹@^'p%x1IM|UېGSb@DKBᅦ T#6xπ&Z; #3x>B"JUWN8l rXS1apWOi4/Q)gV2u%9=gvV,?rp9 !n<_$?P{Zg+cYL;@\9P|`ùnW ۗ*63}oB&529Lߒ6>16I ꆙdb@Vhe >ÃrjvW fnmIAa˖~foثhRT65`vCM`a=yބ.{`q5B Д h.5:IBJ fѰA[jN W5PB}ٵeDW>( )m@ \!D#l./0T' ]]^kO{Ih[Zq1,^pf M}N,C]'8ںtBWk_mrHWx>fN_ZIpwŔ5_'|{Au7W퐅myDU b}wth*"! 4[J-C'ꦷRR Xo%c" j$<bnK8$dwoy.&P-W)c}E<X[nW5OGtdh ge2d`J+a!5KHIr plcK@ -EحҪHv-jFj43\ooꉻ/kCRL @79`]H?ZExEi qρmړB(#&]Zɔ9Ŵy`:u!+ 4C믫?{vwm9;x!}l:,7_XwՌ?h AwiUУTs%( r>v΄y0`>]x kW[Xjv`bclѡp֢?{'w+zZt.uЛH'9.Uڕ߆yx-sr Ƽ#kF&blk k{QTJ7@]ŦI!Pk":6trz7} c;gLL4FX(\Uu2&z.䍃V@E%N`n0]tv3\f U4=6}7I2aYfxo`ʭѱvL!Fy@+a~^P6鐢VY/T0G.I}ɪwA\LZƵf()y7y2eh&caޱlH+UT33C8!/}NۑJF+NuR,`s^nj`u -KjB)=gto /4]+-%y&! g }MZX#죤۾ F.wu?@?9j:RX.i]l*;TUXV`|esOnH0L=  ڥ\Og^Sqlb ,adh>M蕸TEqDW0YNY @DzL{Y9(P*gm >-Dq#&m+??3<$EU0\Dc)*Sb:R.ޘPJP]3œ#O'0Dp S /.hPr^KmÞ Ż`bG˂3Ǵ GW4[S>c.PXd`.HL G><@W&ܶ2e5h%):U>i ă>:cD;h(y9lzpudhgd١ւ飊sDnk4e;A.B!DedRցêđ'G(k%!~ ޤ:]8JXMqt뱭>%eE"'V[4BE&S$ƞe*~|P4/ݩ]D !1B٧pz4swP+4\LogN:Br]xG?l:v0qj9h+ORbVps/r쮦iT$ۊP*0ff0;wF`[yO[`< A5QIe0kyIUiHpA @8}sdpE ^P_Gx0)7Q=Hb+u:98ÄÉJu5rfX/a,Lat 63Su{pcHt:xp%A0IAlLLGO@@IEN|f@LtԠt"IW9e0+u>~AdÀ?ޔp*'oːo6$Ǿh7E$O|{"@ƃªd}]P*BWwE^ 6D6%z+Oen}N̲@k)9E1vȃ2^ZeXIU fp_Hjysr",x>5֊G. Q`"):YJXZ /qr!+D 8B*TuR:dQ^z7l6ltHL!9w_9Ց1Nt!,#1+TP{Eb HMcfP_S楼]K~] nJ̷^4G`>* Bd@G?kLc>r)u=@NO;NzKPbkI]=ƍg%A!7ӸU(Mg^Sa};5 *t= 6< 5Qc1L{ּ" xyuv J;A@L> dmZă'L%34Y<t"%%-z4c[aOy34GsJ*dA0[+&*n{J 2Bñ!Q$z {k8NIzܵ(8䔟)vLme-Vt1jr\Kv 9M,`{C/evH;q悧;Pt:+gԄR"Cr¦< pp>܍||/@)$`WZX <~K#ʠfe7'wƊ/֨ncu-80rթ vȷ~}xȳR2!f*O {[a<-I-K\%Lm"F5eU ^so\(3Aͺ]JVjKcӊygni!/y;䐈LrJJ8@V̚U}sHiv\fs"Zߦa/YU3rR)aP5R`57u;r⸊7g_NU6L}P(t]B50;m(8pBFBjYkb_Y|R&|{;U*5G6 c7 MZo! W1f,+fiF&Hh3;o,xf&[bґͫ+ B415ThDjAuqfh\ o'ZNwlꠋ Mc&$Lĥrhcd%giwC˧@W8`b 0 aa< c*qޛ֍?4s\ ̊PGުt9Q8Fx ;m$(fƪ>@p[Nzffӓo (j\&ٍ%[^Fݯӂ>?{4O۔}1:LXIKSlPZ_ x'pKIcb!JE:/hR;bK?sCAMi<'LHtk :.9 |GqR 67/fö龣*x5NdxiVȦ֍9qe 7 +"Ǹtcx,M#\:5p1\f;| ⓕvi Aмycyq0FŊ h'unsn=b bU9حB '9dZݦ$!'%%QX#V>MJeXe?o<29 8 |WeSܠuip 1ٓH4rIJG ~ڸ նESČ݌wEN÷請\PٺSG {1}A|U\˱?Vո3XᒥT4[pa/]i@iM6'jnXb?Վ˧C(r+#Z*T)fJF< ɷgJ+EB=R%,fX[*[U?%!A*H32 Wˉ[u -HUڏK$}`s+: * η*\65u |+:_u2bF0Ot LJ٦«llAU 7lhJFT_ur mCE亍`S\u}dDkĦk֪>@Ӟ˝|7+$ }ߝ??$\.{&D#":Z,zgndg]Uwh &.Vцa1K.ǩ 5YsSXqn:Ϊ -1AJiivp]4ѷat.u}ի9N4mCˠ3hJqٰJ_`s.ZɹZmT5y^}i @^z5%p j4UHOŅP\)Qd'eЅeԻk3tMc7΋ۖU j[Q HnڕgŦ+TU6(rƺO 7 if 9q'*>t{8~]r@KpܸHg+{novx&_G!2oʫ5٦ ,|))2{D<ٶ X_p;zb 0NkʃLS]=GYI0sj0-$ޫk :F$mќ5C? /GjhDN} n-R9,!*MRurߨ`'+& vmȴahz0CaLџ>ֺ:)y"K}Tfa-I%ah ނ\3!/K'm`&Lp oobhai5tɵR!I4TAr #GgaNutgM\7=ߣ*U|LI[\~pw T(7{\?\{W4ݞ*<@H_+4侕g3.ߨI=J+GkN4= go`&m'Hĵ2V]r 5L[ݯ!_7+M)msG.9 K`?GU>t o=/_Zܶ*avY~og^1fN56VL>`ȺήMrژ$߹^iyidUZ6":ۀکj*5NJRHbwHSV7?5PSY+vIkCt4SGh|~:ݳC,DM%&#`foB\˱xj5HZ`c,%A W>DZ^ T'\q]!UⳎt"\;pA{qRB l9"$$KVN+$ UKsKJ6TGa$f; Ck40ݼWY(Yg472_hwz{G>ij@B,0?ùL˺~sp΃4 ˞V"s&oG ԤA4 S' |4H580ql,B!e6B?+f0 ,׃'nҀ|rOjESm*uϓ6@R%kԬfnS5 4ZJLJF iq3 p; vk,[ b)64s^v_P~#fP}/xߔԃ+ư@ϚoVMcQ5x[@e OcU|A$ '~'Óݦ9Dk};2,r>.`lq[4]F*^s/xk<5GD:Vџi:Z:r 4/Jy~S]ގH&!t #<)-tvxU{)v o>7YS/X3!d"QdvA94upUak,J}F m :asHq^[i~9{KCX븩AtN]#PS{0Vװ,rRUOt=$ZDMi:) (IAprK kJ m2[؀^OQ97Ql!qBz!4K6r[޳^iZB3O<o:?iͧ9K B>l核~7mTv Q &cj,T.o]ltv>7%\66i=4;헏]k,E}^ $#P5oО pn2{UۑȜ6 M93T0ЫRGͪ`wF.xݔV$CVI谁XSa= ar^3Vc\ZHp*U9kӢ-zHK ?"\]E"J]dkN4Ɛ9-{jsʌCh`<+jRd/Y0niEӁDV@~8m:e˿>d%usUn:I9bLًNV2cJ!.Vڤh% 1E?U%qߵJTׂ≤kp\oׇ2"eLyl3; Vlc}QBWJ:B{p"aA;ˣ( @'HeȾ7WrvsVW|%iJ߄@\߳fׂ0 B 6<0.)^o_0SG]Z` 9I9wJD6Ov˂2'3 UKccrz ]h}[EW궒vu?yxLݡYq<¥w%@>@8}M  -=&e*[ lIf2ݹ8!l%_24cad$<'T7p,VEUOV%n2gs2AޫT$ pgI]>[bWBE3RHRM]jCۣ }$ǞpDw~Ci&@z1áS!_2$ӼPz |yt!ygħfgLL"o!,Ʀ By|/#g/~O瑓|.f93%V{z ˒U\r$j.|0?߈qM&Vꆞ^}dzLM-Az%VQcQ5̀p;P!iWşU`<$Jh(ʰ `!`^ilsQ0-uVւ2FDZ5!կ`$1!7xy"Y'ԈcKe9Ԥb Ј! ݡ+}^{θ/5YEېxX'T\qC0UiHr@-h9Ud>q"¤T y:!)~1/fZa\:c^)f.80 Or7AŁnsٞ6gTc3\"@O&'zG%siPSk#: Nq}d@<YB ދe)2@U H:8䆚e<[aH<0$,$}H'!Ҡ]סV@a;;K[eV"s|NYh|zmFomk…# 7Ƈԁ@k0-7O1=I഑eTjLjJ95m[ㄓJisC ^]6=h'w2M|=aj"1c_~ZwwO#){p %)9Pc*J}q$8iepu.~sDս4+cDg(K&x`UB%A‰F|0,ďh6z* W߳نDmh D3W>N1kM99aF!`̄Wn4KU )[ _3j~%@1:b+UAi벎luW۟zp57 _].QաA|kl͈knZuTH6ptcaVjj; %agXW'nkt5@iܞB[z[ޝcxY5WH Y"B46c wnSƧx2IbS:!(}KeHQ&I5_F7PɍUAx{"i,OMv{oig␼>3xHuD>6$*GSfVVj8M3=^- 1P12qu~w#&; uzU0ёJiqo iVk)o|6k.o> Brȕ_/nQش)Px5o hayB[dR%kС VsՕlo״-]v'og9ߘ63m刈d]U&s̊2EۙoUu!яvu 0_͆(oAKؾeg=^S.]9L^".i6N2B-]_ [|,lfmXF?M1v'^qtw)+!R=r_ e;컜ǂXLN0j{vR_|ٱQ[7)-}- F /~³r,lǐ?D{.є d<N”T躍ǝ;!2@SdL: ; 0WiH=;k3E  luqhЛ_Hk[{>sڛՀ: }% bq <ԥnYs" Dx* Ȥ%144$ ROi2&պ۲\ ͆ӄ#:3VAd0cqdw⢔At:C?U;2.L \p)[Zh H>S}ދ%IAlH|sX/OSt6zN\Qh%a: љFfKƛg o;"uCW)Ÿ0e[$zZ$WclYrJ5Fk4V"(yNdT[4 ;r:z`*Do=9Yth3JoXD z3MԘX3Ԇ eؑR8R] /Է`mŤ-yqGƧ?0B7j6t@$w A"߫r!C܍8| FA,=h՜#`tl94)kNLMe)`Ee{?`2gZ@+fMsnBW%;BV+p3o^5Ba# ~U-6LWy47;pJ3gꊏⲂ=+:u%1,sJ maO"-eӨؙ]mId9 վx^\[`ÖJA4##{KݬeVت{g^R;4#f6 ];dp,T?u1+4PEmjF?..=qe"jW4`75t@hyhH;ssD̀J_wHL)} $\5!*~4;hV<16aOnY܈2GPU-Rw3R}hߧn"LpI>àBPx=&hxNY%]f: Y!9)-͚D!k x:ɱWV;f?4q_oёg'x*6Sݺ&AZ@)b8@ `MmAYjQ{_弴ҕ_@;rzVHJBlNOSI, A<-:a bz׫q6<5٘d8LW(xoY78!NBfG9I1Jٱ[wB'd-TVZ,<")g?JO慗t]2&w=_u j}:+;7oqmS,B?r\>f pM|2ⰎE0-î,^BZ~^7@ 4ؓ⺜^bF=O!ic#'ZKH}O3_Se%;aDw\CeNTd r lҀzB:k_FŽav,->*rig[2aԝWT6O͖vڒ; ة;H>ચj>+aQ964xsR{b 系/)[l8O˝h;+,BG)Rzj[lh3'dHi"`]%O&P-jR5~PFmVT'h`f+q%Lf\or_55K5/)n`S٢ `CKNdc Nh%{x #"}ȇ2@cn6$K ²͇(XSgmGiϑI5P2o>끕9c+7PjCNH,tɏq7rj9H 5Oo3ur޷rUʕi5EJd<:aB^٧+?2$;z RF¦R: څ:K]jxP!]Pb OeNxN}.KF̺? ӦBlY ?/ |/1ISGT*Fy=),twjv\%clF}ܙl[ɜ L%b 3,bK@6@7 BϳDG[s@`AqE4Lgp2@`پ7 S g<ùQV"_l=(DAs+4FGO 썀n9h*$"K^}|ʖjLtM`B,>7"H=ȆȖpsҤdvҹN Ga@o =SB"PQ^c>;&Mg-;c{RZܘG,ri9PKa@(kwc@PK0S Y2"腈q!;+m"%~Aipܨ˝ #N6E >d(fj @6R a6)&wBs jFn+D%Qu ;*l3pW,9dXd{ ̯3pf1f )ir=$QO t?^1e)YnܱՀ?jb]CՇ b>eg}c.ZآǦz, >e }HY".}r6bʺ9(PzV86wt&# npERܖV2a _]CؐT /BhBoOBgE(My4LƔ?@H#/MmzeI.%@B{mdu*Δq.^"Y~BYn-"2#uyJͥuq 99u[5ӧ[ 4D$Rfх\6+,  M,zRUZp~JT!-mE[ 6t N;e;kBX]<\'\90LnGT6smKԘ7:R4{a&)G%Taf<>/E}( W%7|^Չ2_g_GVW9(rwIP U(l}\axM 1>;Zaپ;&-"cr}>5T{IAYȮ&d&S#)v2SI0ybB)4Cy@h=*OV) } м&i+JNLǒw%#g&q 0K7WgYÜ" Ia gRt&H7 s߼u?^H*A$Շ>74,l1`v_}Ҭ$YVuC |ggb:[ɞ\>yy.}&mlI?ӅjxF^b޶XPδ )LNy ^gc,;oۆ=mU\!|rJcCeG:5p!Z /!90#Z긿d{_!\dX3d"`ExE~8 S`#=;zzˠVTt@9ꎸ>Bfbh;3a4c !V GZ`D,5 ZGt0bDXs9 td^(ue7]P%>:װy wf P8S[ BZ w2XYZ) U(V E)&m|tڧ0b>-E'Q/W~n΂S>Zci4ɟi՚RQe";1mT)S\ JWSJ s(R&6\D~ywW܈'Iw7Y&Ϲ||+2۷im_ .?$]J> uT)BA*ZIδ F(cAb9zC*F굞j*8ݒU֙ws/I#O3ly虽tqV" N{+m,K)tDO9J-kA Uv0SfxݽR=٤hD(4[ej W%g*M64Tk-Lw&?53 Cg V)}Y蔉H&MյêpʝAQiguoe΃ߪ3(eYb5ÿk_ ŊEaif4)g7AIAhLX{3o 5*n}P$`#HbPu4eNa$pqְ>zb߂y2+^N%> M! r9/QI,*>#u /_ ^ )`oA~w/o>mK҉eRF̐NMT.`"uX*TskHiOp-\ʝ2֎O".N lXxkA= +dJxV?jdtf"qyBtm6&^iQgYbxL$JB$>P+aÐTݯ ^bZCoj G'TZvWf ^Zy!g t(wþ5,3o%b% @h ,”2 Kεp) ͷœL*̨d~?NUtiR9zԶ[Ln7JqD,"+"A7aC*|hŢV~g}B˽>*W O xa`oЈ BwGk2I~B [ĭwAzOY{RmOK@:1ˋLRzcH.L|aQS%$|Weu/Eo;(yK&>!|k`0"*ՓON-i}0S\eSS.TD}bVpk KHٝot, 2']Ń*yɋ{g,]1:'yMԣ U3W0 9Wءc&mLwetr1r$ͲRx]O󰨵e:IeMg[9{&0!'"n -qo9bTY i{x%*ظHtj.q.Y>v} Lo7w3?UQaħͿ+7i#z!p,&r`j؆+ G/Q n^{T',dO9~wrmYЈ)ٚ@|%Q2+1wh'NyOE zŸ'y Ҙ} ڽu7 ӡR4]S?0]K1D'Ki흸å1B:g6D܆i##>ӻc|5_k Bu#6 PъUqo ~ a`㵍5y3[\'`"Sl>b&IiU#Sn2$G)wtu\ki\e贕.[vC6 *m08@$Mo-AX;*8#?z9:6CN50ѸN4txLh^[gwԀ[LV1k4T*/_*z0 ZL t1%A2Q[Fbuc~~\Cʨ;?V0Y4qƒԿ$URުޡ j\@%Vu-SlIH'G2H~fkꃈZKsL/,X t!$p3IbCjXi1!Jf^Ƣ1-8XnP喝߮*)!aL3Tn%wyxtK_lfYVBnh66bȺ F(SW]6L:WZ8+@^.T4asR.5{hdUIڌ\k.uL$=ȥbbGn1t-O"Z3;F@ɑEhG5Z0b"d~)ߢ\t}.38gV>}(xPhH%sAF*]1{k0/ _vVA-a"!VGМr6 yI> !`ceYZ B{vk:0չ. ez;FJ!-$(= ՜턌%Uz^OsgÅFnlꮳ7414t,ۈi5\3H%TUX 6Aw7<^%UeҬ@p/.{MZH7T ӪWVrmjׂ.tN07BU lHkhdf!i>?k;9ܰluD&ف }X7%%VZH`Fh>oQO DVG2ģjnt&-.KM{+6P~MG0  PX\1Aw"ҌiuedsO>ͷ+P .sXL !L gKLj->^{m_ )<z ǘ.6>{ƾϢpVж5{/-`n/Y@$$j1&< Uaffwul O6|9Wq0Qvh؟:]UA=? w[~ ^v E1ێQ[/^j *ia4>  M"z:}g9|B~>;>QL]вąg: 21^lD}˫4qR`11֋YHǙl<(X9*~^vEWFvګahq4F0$@@?'2!qV.!BK} [N8_3kV'7ys<{)^[S3fqsw╘2jHtWgPn`5J>d-jA(@S}\SgNN[?cЬJFw⪻%,?1=Ap)i|_j9{3(EC@Xq3mÊ$ 8^~˥FDܻh=Rbya#1ϧe}EY6`AB1,6B9VDHMu4e}}v j)A `oM˯d4wRvK5oF[tkcgD*-m,]-`W׼>؃%4+ɁeltYNvÍs .i_YC~tw+avguOLWtzxYڰPԊ߀AI Re0"99j #ZYaH ه&!r~eWJ *Pp sSh{]XrYPT= T~#?lnh6*'ʓ`ן1ư_.}~@iu;ʹMIG$$fxSK ^Z1 奨K1@yMS semlZ7/4F4Kigw}w~ǭ?S<02`sP}Ef^`b-AvFX*^$-d4.J$K \i  סfhu S6Gӝw1H.80W0q׬{;# %NǂrK3+K(.Osxy1 NͼcdLߤ2ug^fp^D{"T|Z3[} mM"Opf[8+a6FEhh7t%XANr#xE&T9/.H;XNN=V*Z[ctg쉐bĖn0cAwz8atj>@({DD3'dQ{ ClV| @C8USsmr;4lu"@8Z?f/o'd뼫h=jx&{>Lծb鮁s[ O ҧ_cd7cp bC$v`N]l+1]ВKV \O\ޅ7d`З}5r̛·6 ? D .XkIVAYE$R4N}lB ƋiQ9hA$Yև Li_ޅ:\Җ0aiKj/\^VmHh4#lWъTn[og_3 [x_ !dѻ9 (_Gg@NM, բ=z&_A\҃t*\ۖF4ô.7rdǶ7vs֤64D-IxkРpע' %Yl-sXbx=f?k%pUFrt_ðhsN=5)=َJur*zP94.4ó L…H?ϫIN}RavvNt-x6Ļ<iBp;VgNQ͙Rv8:و1)Df%N{xiau2,8^ѓ;ֶ%5\S-Y*9 ՞xKEIX׫))ƇNoKЯݯ{;7 htM:s`ZV N"_&ٌXp~G<ODфŸtƠ-m34I T7 .b).Jj&[$`"5\e8 >Ё nfWg&I$=}x/9ABj#DVGs#!(6^6dUgKz2#cCaNigV^ϋ&fT{'Q7qm@aӕ=-p}BM:\[4E;^TﳬB lK}}R@o*ӵ23xyJjh+f)j8:?I7c_,џ({[9_wo;o_985-zhMo+a~سS'|x p64w T,ݝCTE kTA}ՓS0߰fM/C0KnPCW₞3|'nZw%FԔw/ML8Ȁg"Wyda*b4YSB~G4^_gw6M !ߘ_D"GMsĞ}n=&TdX~i-L]pb0&r Or9Z(~eN SP?HJ@"!.BvISVa%gD/ 0u挈Cs(pjUFoUzEU1wT{ݫўNr`@ٸ*kNq/!ʩG "@Lɘ k@eghFdlLIۢGbN kZd-Fxw_H:h ȔJ9HX\'E ^0ZlQU9>_Q(y2֒S5ءs] oBRQ wG$wlshCƧo=ѣ(it`9O9۱^/I]bi{7{Y}%Ai Y(sEW7fr P_R:y"ўsX$v(/)["1P;Qb-Gqҁqӂx\LDOPd8ʗU̦_o}0sf=ctdRW6sN`#eUV0bKgu(ೞyҲV /tAf~xGFHP:5~0]6Eil x_Εh< yP jī6y$҅?_v1Q7.MtIۆY8`7J#FbȹnV::ӠϽrN6|YZҕ3&qt€f`xWQҎ}`p'`&j JPфQmޏXf(찹7F0ɿʡr$a5UV[?|Hq'o?b*OF(. gh+Kqwqkdva\&Gz_s+&J; ȥ^L09")E(/%AU 75e!ʞQEPNwVW̡Xa]WTYD/=>P]/5Azc,oP+>.:P T5`SZQ$OVf -%eWAk:/ۘfa*V* !(%z:]^RE4v-Q,m/v®U#3zćytl'Ö`l'/PASjYdQ]uELJ"T*\UKiWs̀8 us;ygܨ"l4h`:\/nЩM_ǂ;Ϗlj* CjhYS_=ߨ}G뿴5͸:M+$]e%K?]=/V$QG$iðH0R 1 u4߄}Ua]LkM\<0 #L~˻6>k7 V^=߷`(5wIપDmzTQtxz+BGHAIA V͊50ʷ'_\y_ nSaӵktvKZF3R>.<[5?޽kFbJAV} +á Z(S{އsNf'8(UDA?ttC`xl (C*%l`?|iʨl/,j߶ ؂lButYuBn|: u9X}sB_$4D_NmvX}H(-~փo"7 UΎ8aPjCN;>m%TdK:eoԷB*tiTل1/Dc^_Ǥ@_Dgf*0kTwaہ%avԋGk|dA)ynzRMi ADz^HR(1>T@1gf|fVy=c&$%j "pFSﻖ2m{;@2ԘNC#03EkCў:&&m~m-dI*r !Q";k%']u8>蠁re[nCMǙmk'6](Y~eoYE ίt )E[4 -s8>c"cN 8~+*C'"u vPR=q[Dd)qOհ {/:9TqMS{t" C%r 2̦/kfbm-ɕ۞,—/" URWj6(}y3ϠQg'}<"؅4QC;*eCML{ԛFt Z457?o 'TYa;_(Ԓ ~E}:].[eE耜v>'9 J&OZŝ~g\, ҧ#]s aO7%mCu|S{]BtB]w@<, Ɩѽ1Hq)kQajg8]7@ M~!OoROyrFؽȧA2/`h)!&0:1~v Uj\> d^ݚ1ڕFl"\y] UY&̻D1'4Րf*;<#(L9 SՉDv܀hI?Ȗ*Wx> 2c[tj%.0+~7:g M0P 2t*\:pR?ab ]>~ 1cex1[Bϖm"'{¥M`< k.++cEGE[U}Mmz_P/2Ay3%oҹe2Sё[XJ/bn|誧Q-)=[ڔ==R!fLJ*ܠreB!Wi_<1bP!FBJ۪Q~|TN֟io>(Ñ."UUdK"wlV>8*q$\ yc*<by+Q)I:F7?'’(~+T7=PW3 ; )y▄NmXuoZ-Wl-K;C3)+e gv>d̻\$Ay BXzr^FuuMdFҺ9Ȋ=_-ѠFzBLK(7Ny<:IԚ_7~ yTN{+@ow,Ks*X)[rKPz:3!oX4=[vyC?\%h8l^j,1$fQ̟dIjW8eR>v)z {KEc`A TPCvGCw-@/ *d VҖ^ŚdX0Ir}m4uD{,[?B0hSȵ, sEXAGaz0|v[ zr]JbsdGItItDSpa!ܮjUtУRxEB[1: `2Ĥ5cubMR#d<=K|J %h!MFzby_lCLS7TFTȡ˙3r@:^JǃhNZ?D=rj:WU`vgn3_nMeG*LY'Ϛ5ɔJj)D`W*T:7PSғw-{Y۴.qt )} ݄ߩ-L&U`/pŭ6485n>o)qJ|zTcugI[S&:uRHGnspm]{Nj7 N=t?bgY/ ~`bl05v:򢩺!̫xB0/rV`O$pvCdDΝr̉hA-өP߻͵'5resչl/S}~CxaM0@Lrׂjn9z6L˟jה@6lJ v;| 3m&jJӳ?r,m Ǽ^Uዳ{9.+} 1Mge~" ]+*nBIvq5>+j"<Ycfj%']~XN|ZƁ+%M`y#npT :)kY?Ɨݜv 8=%s\sOnvwOL`"F:Qi8l_ ^`MByvs֕t': 05fj"dNQw=t5 1Jw'!^0(f*\ONb0Ą8uZxZjwVA"eISPsd W%`d}J8zXLIAke%Z?$*e GGV T[x8t/-_7ц\QW: (.< HεrWkL-b(6~$4Su&KQkRu^|KMmVuS?M>RgCVFgJԾ֋o9WȊ8/V=7NjU8hrdg#[@餟$ZV`'3DC_zzu:!_p# okuoX N^8颋[-ʡ aiIL;p~7s02x@lY!!-Z:8%iZAkGM]RblS>~d2ŌX͌eK>jPI5:FRk2p(ie JVi0.uмp6ҐC~_7Fy ] vc, {e!lU:z'(ͦZ$=.PkdQGMϒ24Tscv%1wkfGoqBqZiTpU&*WHlVK7[yokrTLRi=_wwVv\k"\eB7t!,oy0V"XʙȮDTog;X0Nv)m~u7"Y-!=}6vOetv-WĴNUEpjIŇG_P'otl(\(c66kﴎn,\}nwJy=/ifu˻XsFhs"[ TwX5ךf# u**y5.K#&! .dƸ U#1B60"YWmW؄WITBlL4l% ΃{[`W5f*jŗ-AEB.-bPKMNRO1WwU+gP0< ; OPDtzǧ4LxFzw$ޢ35zɌx@$%"n<=wH8(2Maw=+2ߦ-v-j1>di6z Hwvtdmb&z?a$:wSF<#NqjG?xG܌xVg6#- yЛut@Kmtl0TbĚ)(+*&͙KFW:NpSHK/\MڛjHx{3tyOSM8('AHHܖ?{^4 Дd`=үVY\di=!Ns-N/bWcF4hnL"e'ӽm)cz$eϷ2k%P$Bn90EK4~Lmd+d $<aGp0P gg̎[L8wEXhkTi/N.cFe 5ػBrĎ>d7v5X3 LpHI!Rr-prcChR^==*H_~aý!Ƿf+OǙqFwE&Ou#/za3.! J-窙?bh 3gfTe<  t,b2ȹAWr/!H 7BNq{jݴ倅c.2 eᇊ<udc5/E-tM`\aVi :ϙ+hՏ >*$Vש Ꜵe`2G3vVT x*Ubp4?ڥ=v"Gzn p?"W#bgA8?STS*gp:"t2ι4Խ2FN i4E= Cp#aF/!?i[po(0ꙫuБ"8!eFruQ2IkH$:/,|9 DPԁ]$.f{L.,pb j3L؋:q4e|0Lʋz7 2$^$8'M)'ӓU:PaYD0wi'_cW 3ߒo~2^'I҂tp)rp 6"@~Ls1:Yc['A s’d2l0RXuV Ds\5ӆKbeCʁebiܕh_}wqz;G&Vq$vi?+;9ipD31ڈJ‹{,s)*{%Iu<(؈*Ujʐݶ_6=$g< `jUe WJ~6J8=f{-Y+C0)=#=hɭF @ bZu}_l)F+FZ0AYidv19As&/z#KO7Bg3p/OfӹcRt5M;#asqYvpDC|wV5.zqI)eHJ&e Ż*RyXFK%LS˥QWfuP*|> OYz)|A;$NӪfhQB44T/qVn8_XM(" C̳ z6P4AQ6jJT<1@YK9(@HigʃV/j,el#tFc]ĖނĭRG\ !Zts/h%C-[+ F!U2L-𪜧 }U)xn\/}IR:X8o1+E9S˟+d5X.BdBBLk5 ~^̂qu@b +!lo8Z-]"To(J6xoiZv|ݥ[EC Bh<+b#(v߄DuUaA4n͎EL&x'ڠF^9z ¿r|]&먹RMem6t9\H.{qJ$~As}z` ʞDjx8i Qr 0V,\҉YG2G]37]SJyp  ZaFmXsvMJ$pL+x'C"^<< K \8Xw'2ϻ<?0.9WXb0Oqh,-77!_ambعl=803ڭZ%-iyU+ඪ4U=G{4H$ǡ2uQI 3J ]Uy5샚:tItD":88%4,xmfBC*gZv: { M#Jޯ~)EX:d|_%v3Gw'4>0%H]bI1Mdb8GHgVSk7nگaG ${uɷsgb݋#f,% II0KQ o +[RdFaWp'TsFa?+|6f,is='(Ƣ݅s9U Td (-a *k1N(-Eb)V t ܨL캀۴MiuK̕YH+9!eTA*bcND5XϿG5{NLߢqYT=uO!qfdEH<pylת@qR~<V$ ?z 7LIEϑFG26_Z` *3x]D.\#hMssQA\pEu%Վ' hΥU_7VX`|ڱ eZ3OJ${R^gPWj7v">x\4/eZ1/_ɺlrCvڇ,%{~(HFc3UX9"KEsZUmMv`i>)_՚QaM4y뀥槑2&JzpJ]APTn/iPIV WZ YO WJHQf\6-Ew)5 g8jas4vU[p yFDSJ򺣜t1vbUP'r˓NTw&]s#.h ,^uL<1Nʉutb}$ l@?arގ4PKͩW1)bKreۧbyXrZ8_M -$*KrV-Nl)nŐb =:[1圹$ΰ J*A:-հ**JDjF㬙HlBe_dIޚiy_I.#+|fK]]nƼ(\jn&.֯y61u^'9\?C˜r< M&ztmgŅ骴ǹڜu:E ^!GlN\ Hᱼ,flyC,$c&c 4q#L4okLE-_0xf0QS1¸LzUԫd* L:eYH}/%8>L P-uR QB-3mʀ+Uea*](g?އuW֢ӛo S*DlU0$4cp:AqD|"A@vhB9Ld~f5{T¸ǓxՂ>ȇS'(6TFU2ȡ,(9t3, ]D{lLYk((cAIAhL rq p$l 1$_MX$?\0adPycb4ZU~*+ӄ%T"}sLzI٘{[(jcz8N12'9C}5)uvg|uqk{q%ZY$HFB" RU]jc&{kxzJ7ufS뢏S}ps^֕Qi:?nO .1EztK?|}OLi7U:Ð f7O W~G+'s/fCNF kiKSJԾvMZ.dϬKZO* F?jKj TKal&gmŏj˫ %P>{LJތG{vhY lwTRLqTI;8R==0u7{Jc` $#XSMz%O@uk3%›ݡ4O2!{ԘhUnc2Iv #|c2U<.};x>ef^sz(WUSғ愳t.30; x}k:rVRH&_ɝep)Qr168KF׾*fVq,J ݴ76ËKf,X+}qm:%+4ߑM]Qɢ%U@_ =5LլRiv r P6+V;mp(nISQ疙8j?BCq 2|;)i7W#;.u ~vPpG#2arغ&OHµZ0& $cR堨+hq`e0RI.RܪN 8(mz^sEOl@+ Er'WUE"O+gC)=.S.]MZ@!%W/Ṍ#BHޏf/>Ez`D'(:9X֟ns+rtPɲ'/Ke`UifQ5VI|:NwlAB[0ӡd:!9^p tIڜr g{L%eۀz #sDwI4聪>2W2w*n*%ÓD#vYx:+E(R+}UoFmmOoce> |%fDܘ7`͌b.ƄŌ[tzS<Җ UbBiHVȜ]z]=MӴ ƿ_W!= 74Р(#}so,JѲ@Ȗ U[:T$$ዸ<6DRI]ziu߷!l>8 u>,~6ŚIAfD{O2mߵV73K4tTf:1D5P(LťxdΔ\8WiM]faDrdʹ;Q3 /G^c "i݁SP6_e so||֕i۵,[]'LFv>@^ZMΚaGʭAXy _Y3C$N)?[<@I PAN'|&# j_1ڞ8E& ` @%-T#!tR4.أ3Kء!oBp2 _&ئuƬ (*01/Xƒ &#ugbLuı2)-BӖL`:/&Px[ W_%e&t$x$TZaCD:w2[6 ň?"0SI1:͂/к 62Ln,bzOjJO_1XgH+=rZ4C.aR=CO5ad; 3'x%Sz_,XG֞5]ZJ5Ʈh۠J.Vuoy #e6Nq+MRԨ_[`i{%~}|r{9Az~ vF:+v VteSUḳ5עTy"3qG, mm/kb.O}FG@=" =@ iBu K0W}wb]0jlSAstZ'oWHI !ЯFڻ}|Jٌ݅n :KI+ *[b~e@:Ok'Vӆ xؤ𒾗MljºawYA'-snͭrABYXZA]s`@iD) 9'dMX5DiS0Q5OR?&L#AM - dSv**m kZ(|#4tdN+X]mhu2#̌j׀٧] r-^B\m/lmW&1fПs(pos|-X EvCukFɱ>UpʼnWචa.Z[Oi FE>"+o-z35p.)yOaoEMHzХGBD,?Ay3/D+0Ҷ *a4#ˈ7YO ߑA 6ޔ kEC/ţq@ڝv:aWiJbvb%(˟_+a7v޶o`_߼xA1W07U{6Ԉ;UgE3!+_fE8Z8o,-itgXR! ]l ȧݛ`揋X4|9yp75jnbt X&vc4tR( ?5yGO$0B? vEjL U((?bԭ:j+>O@j0Odni͋bݹKS=ze'HTzXXC;ܝ ŏfWTHv㺫am06cH42DZ\J@q8u+uC\ϭӟQJ(Phwif%&niTƽ 8`~aA;E,gOyP 5cv+ߨur$ +XpE IԆg[~]ʴm~٧`DFiVbe" V"W>H4K+5 uExéY=! Y,rΦ_]ыX+ӍJ7 tYⴟȺG1CXs5I,%0~G7!˘,W,Ue% :G]Cr&: Sت+䛷yuJkM2Rj$9zݻ\l7tyQvq4ȹuHmDVMmuyk}AFD]r+C;3V0%:YQk] TUc*ƄSemN2! z.[%!X0i =8xSsٔQP#Xg5s6/0Su!R9,Wøb sC~}v@ [Tך1f0\TveIq5G|ߧI$wsV?L{ e=1M] /L%Fp0aF3%0GKQ2nZ~~BBsoƝE=K.=(Y3۫^^8qerbBp~! <$ؓE >K.yԯ!#/@^coC%a>\)aVMUKesT<*(ʽ)55*?Kx@R]rLe>n&BVA6[i0ҡ6!+*  aWZ̼݄ye+AGkbBcp5HC^OڎP (Au~ӝۤRl 6*'_KR*QKv4bR$h:lX~W Sˈ%~*pudmjqj:?$MAMc3B/s=R|<]AB[1vjg;Z.RUy߮Vd??ꍅp5_a]ZS1e }X̯˟*RW &3JP M.J|3 y(^E1#0C\LԨARHȦ){l^9jC%Un^%[]o^umE̾yeg`NƷqL s. 6$xO')+[o.`B0&G[ʺ nCqhbYxD󅝾n*c>V K4yW0iZTip%*{XԎV,qPuϔـCt$v dfv>_\9%3OnCژR3;>fPކ =#'%Yn |Y$풭N+nZtEItV9iLPI7WOK{KTW{UVhu5 U 7ӑ1X^z,JۚGZ_4~jWfJ}k!bԯH̡ 7=XER9{3*;q5~|NzquRg[LUaAqt'kQ 6_T$$B wwZN2zuoRbfh75s_TW|gVB@&&0mMeۺ!#F_:e3;ئ[ߴGx6{cqnhfa)B!3@Ȩ;#Q3J,{9۳q̩ I^$-ZIZ֤[PPa242#i)@+TXtwS|F{# ؃(nd5q2)m9yFW}-aTdC&OLye,!rs&.79BBx]Z:) _8 )\-5hi5mħwGՌǮ ܨt"}4ȏ|$lw#m>nG␵R9#+$60)xl';'X?Z4 "[k[ЙN 5ܗjwe_y *} ۔ V%KRF\vJ?$ٜnӰǹ43-TOzx7_`FHe3~5'eOGtyUrψ6QBU%d2y]WR'_rǜvIGov~'fyߣuKHf:|p_ݎ/Itvm`( O6=8UsBk1 K*jq.cFmaK|SSDQӋoV{ ׉H OvAV|'|T53 \Cjߒ9)3gLoYCalV0ijXK *ʚ(\w.TG ?. XpTHs׷֗u _ XU+D_ġME[#k7kZ}OnT@,^k^>oh$.Ш߄1QxଥpAu u4Nv<@XSjpeZ{1ކ-<཈{<&Ƞ4TLJgb$VHh<VxX:!$5e I #!ÏYcݧg"$,1fq04u5'B9"-j8mѠ,gσq "ZZd>|].B ˖#I:lNxƎ-i0[tvҩa^YL#)E@n=+Yۧ95]ȆF3L_ 1b>EdwGmĬbfx1x>{/:Zt& A3!*Sqvm216mlҳCXldF}g%ZwK ,!C"ofj|wP]W [$Z JŽFgr&>2 2٘vxguS;2ԷA6 6P#`ZEr| O7i0{,ey$A@IAlLXbv;yv&55Py^=`C ;6].@rMIOVA Gp4͌ 팩Iu;"J2t:;vaJ> WqZ;q6$@)%Nkv܏IL*<d&R9L'FhIt 4{L4W-eo`PKnc>TU=TgOe tb"6e@V=?{PX^6_-xH%WPT'=G'3 Gq24^M/mCJ?UJjݷIa lA1<Z3fEGkrjKś\uDsưSioT]p0WQ0n`l{ @ٍ[Ǜ!p P?.ˮ'`Fb;M#J3YAS9yaGw(O/Gmsqv%PNf&d!1Q cw O_-ai:mo0dA߉1_VUQO ڎU7Vl^G}Qbdn$zp ;iVC}p[ebcA~! .@ǬiyN N%3.ߠ' }w#^`س.n2Mlf"A). oq3V`@PVrvaM+! CEM◨+SaZKp/2[[gZU5q00} -~!tL$YGx2n^H/00yZ# q׎vƩp6w%y2lH'G1UT,+6&6X?;fZzr x,i+F-2&]/,)wgYZ^-վn}L3'f@T9EBqT>̏XsuPC"NWL63N+'.4]Eg8N$Ϭ L9O Fcjp&MM1]z>)_/WL*N#م9$5?ڔմ"3<ä)`[7C'͙%LU fwMʛ lF=~roB7lA0! ֧7HrW499o( ֙%V4S^W~3"C"?8t)31*0'tVPR R=65e4Avb햏u#oP!pW,+5߆*-'^w$Qf MBN{!N@/'gg{y p ೙j)i{9˰(ew,}~mcs$aKT)ֆ6t Gײ*9;93Sx %# .SnqմL]uuˆi?]`o{Uhl.M9f+8Ӏ=W (XRȦ3'F4~JpA; QG_ CmuM1íwo|#d5Ɨj iW nY:U WDĵq.y8 -C=H A=:1A4)E M$#AYˋ;esR^Oyo<_ \ jngb ~{*6} ][ nPrO;Z$.; +@q"3ԺW DbΒi)Bc[1(J(v|V'5ǤN_pe0J>b:ccl7>'$o),Eq [5)7g{y7ѓYLZ36X-U1Ƌ5kxʥ'Z+-"LÝyMIa?ܫ!ANs+ݩ/K>*Aaj@dM7sT"?lf[Aհ;zSzjVk>š?*5 }&)t sT(, + W̙8K*rK j /~$^ S̸be_b;Q^W ^j4^nkY 9\Y ^Xk@g}?Ui XN7I6"J>- ?~%&R .g<^xhDYG&.b>m^Y #︤ڑNV\*8X*1})! ؋5p޶N.OKEB%+9AI o A \|WjN!R,$qB`^Z#=M/ؒVA*ģ[85+/B:bCx?^}jIlnq:fQ?jU.LF G!Fh{_ i rtٕEuDQQkwQ}V38xk2;aA h[J|AC`Kw`A J'g -d`:[o4aNo{Ԝ_܅ue?ʓATn kD;H pO{0gCI6s#U\zfe$GU^ (m##0?h՞ '=_~̧uM)P7L~PBH:17 o؊9AcUspPbݏa2Z+UdtCWpMzq5'n'!\NAk@-z,-/hIO B p+ebkLOCp㧺W*rMHONj0>cL@J7-P!J.ZIaV?o0'-/D&Lhz n03w(^Mda'lK=3b  T!3 9E4)hk 1A:b W 4k}RM^Kݩr>\~i$<(zoV_E;GZ_dT6,!N>3]SU /n%Y? ϓaΠQj2"~"5-uOe_kwQX9/^3dSyNyѬHT18[e{r.`+і\_J7 ,%nD]ur0]ӥ74}ĻT h@`НOgcŋVeѾa[)]ХQ^ A;auNFH=!+Q]MjSh~r2Ĵt\AZcP8O̗2S@wrKb͛usj`LWwD@)5m6XE0,% (YTL$Hk50<b#8zT/^$nبUBVu9`>MYS Cu1|ؖ) 7bԨpT[@28I=7T]AN5PYDN` g L d~_|T[Z.. UHMϑ~9J|n}cƇ^3Py廋]!D῾3)NqyFxp ^/֠ !S{B`Ͻ T} nKm 0/ާhD.!8 ?υE~Rq#˷| `yyZTiJN܇8O?\8m?3{}\zpu`ont,WH;=//Hϕ|z|6 ]i'wRdX-}l ޭ֟&JgN16yqssb<(s[5y͞f,.?|i/T|ڠcGToM/Edt8-_zPKxap塅X޷XbknVeZ;+hU!O"A a)鎶E |^7>Ttq*_M׏祺uxpc ?v RZ!q`2yJH2x`׊1q闵vP9E뤹r׊ $ ]WpG/3+T]\R .IM5(5{luGK:L˩Y$@,(mc#/[QNCbL%"'G 'b)IZ"er / g4F2;->ʓT^k-;seTj fFQ}I5[3kXGPrhDFͨ(΢I"IU=8J{\Bœ[^ 3 ou."^[ -ޔ# dd7[u{]@:Ig*RëW.[IwAl|HiItFmP3w|Ei5B 8 :5~GwPrQ[iԴUa4"XoyČl Z_1 Z&<|↌pp޹' O1@ nHu0^&$mj1(!^zf1bUŦ{ n 'T7Yfwo3d>DIdS4?k˞RbMyB`C{G;:]q3=gk۶ Z@uh@Hi9_W֦lauG53 (^g#O^8Η\2Z)L%:xD,y-l9@dd~I @tŹnq{,O0 0&rZ,K@]Esx^4\#OF:xl/ >S2wX&hݮӞfSlW8#( Hq˲Q(la,}OiP0ڵ@3Yz:gm~3g̰[ #~ZDjm`vb.PέiWS^Km o6m"ahqv#ÿ179=p*$a.'ݟP_;F'Ig5 N%8M=V.T7 s O{8Usfv8d1G3~4S G#=ŽY}/t%ns1.PlUF(WXW.&S5 (cHVTm5S m^MD#}xEM+J0{ܚzD/q0ot۵mУyMkmlsMT + nb_ pqѿaf;Yi.O=eq]aC*Jo8.t24 wb@US ޫI'`q1h YV2>mqQJPi'hp newL!npI5N6QSmDN532; Ӑv+q;kK[\%sr% "V1{>T =3#Զun)^*mpք1( Юc1BAj6ShQs4B_Uyt%qo\YrkApSVh]r[Ø<0Nҿ~zKdT> y|VkИ$щti]QI\oqcQ}*i\{=xK -_Z?arfK:O델ɖ;oTX726 ^3B|οh|Y 0h[yё>m >dmNOg=s!mY ͜ r 2Xm;Fy;͘ I[WՎjEOQkAAO R{.5GC ,O,Ϸ*<*JNU{ZMVaFv(hAՐm%›A;%T TLKjeJUH_yq7q# 8OzyZz ZDcHycB= pl$֞aEqUe\fW"k_Ǿ i5)vE7 Gr *iƈ$/:Ԫ9@ādbWǙsoZ(C X袋::^e:]:.)S.Gr"a\cǨ~If9K{Oc9m6F꜈`N\l-c;fXNjPQy;d /G=o2<_D^z#UkWZSQ=h|wee#0A?SVj iNu\U\u?iѓ1< *sQQh^`-0@B>Du ^|-m H4ݲ1 3  J7Zf?sUEZ0DDyG]_@Hն1WcĉmGz-V!S-\B9F{IT"f["8眕f! ]M ƣC%-Pc_4KZ}:pH00iL&߭JI"\0#* bt% /fжPNA}VBw<|9]isU!\ŌÈ㳇O`fЉkvW ; }06݃lڒ]sc˔z Lhi;ڢM@tmtYZc0W NOҍ {N>18q@K_cXl WIIdjrxy6#W5fQj&qTrﲝ*Gh˙# j꘱&Krѝ<#,8s:C s(:)7)KQϴAF8ULI+"҆@@.vA[Z o:c7=$hV{#;DCk<`@f0s;E谜ĽBdeo H7@?Ǭ͞<Խc%amxְyð;TN`W1 8}xvS3*k:qs+z0Q3b˧& tg*fǑX-֋EQH_k\"m*gQ4G;'atʛO@p{oL =w8CR9gY=]-mKLMT1vȽq}؅ j,b.ȸo X+t"OQEgyf(ю5;C63R !Ux\f D=@A@9 6@עNEq8\6GM4kk,g(auGLm|ޔp ZL~4 J 1T9hFeIWWU$Κ74 +R{(st3a N\1KQDqJw_.ڴۜSЪ6*c&&XIr^ lE8F g"]>rҎAꪰhtGcA9-P֢_l|-g/șmIP/1$.N0퉃4|fWh0;6:r\)^C7Y`2-9ɷt?vё> NeBv@ | AIAlLLpB˦~ 6m`1+8TЬS8_+wUO^_7w%r.!Y#:eYIn7 h6T@O*ŽL-;e{$-*AK_U?]øh3r`]d`Tה>n"ތuEQO mʴ{n?y`PP L}./Rz3\3' Ǐ[ҁVpxrɢ ޶$~<ڣewM}طxIf9t%K[$US9 tTe9.x⫼/b7ő5IDВv'pgAsZXTu I԰?YH9jvDNx~d4]a"#1%B*T#g?G[W@4/}!}Oʖ^R-ecH!nT\ l~āF~;17_cbGfh5bk Fa9OF[J@(ې֔ivȼmFQQTIFZs:`U:|w{eJ43SH]tu6%#o lN2`0k)sN߲@؇)cG$b_ΕÉOJn46}[~ A & T&O:80jbJpOQSvz?$4"%ty$}7 I"|ڏn>☷#$tx(*Ń1I~Eត Xzmn x\avdL8xC̼%]MjG]3 KQ_Yj}+ d8 >pxV(4UGvC_^bqIܙBu8Jfo)8Snj1wp5l)upmr0 >g!mll$"^D.] ڑi~fSh:wcdme}iH|O!_z l sI4o^~Xlxe^wwk"V5EcQp7Z]?*71 %/2- m.ZU ۞~ƠԈ 'q7%jy$'KB#i cK׈Q}~:-?rJEϡG%$oY B!3q2-E34&):'5Eb  y(NML[x+>H]Tvu S@`I |mtxI{T!ҭTk*u=hc֦l.ӫW='1 .S&G Lj =)/ DXhxt%t/P>-[xqJ<浦K.kA[@\5\=G0;徴uO~Iwd+݌wY7^`@TNϖӁgQ:<.o<^-?!L3-#lSDq=v[A!G6(JǞ ȗ3{ON:,r:-r5ɔxx l= x GOzw]mEb b#/m9aL805„cJ` -/ʪwdZŬQ#;*A7DJwu-HfHky}W %{*߹õ@X{@g*C;G]WN@LAˈ$Eh҆YEh@G\lԲѣq[ f *hHA&MagpaǁucnןM,jvitbO3U ?*夆<M uݶϟ4qQ&O&Ich=};RĆ2hh(u{|ȂɝŝNIZc*}; Xl:,lu$&g'V9-|}U5 8*둢/r!L. 'de,إyIfԪ !DF "BU9 #4*-> Y(ɝ7$n_uE31cA(\sVG ě@2mdVGYR wM3*Eĵ$b\SiSEEj\Z)O׌ufCWeC؊$FT"|ܱS b,:,k=Ú"Қk O\8;"蒨BQjZ{I/w}X؇r doW 6SsPᕺ!*/;C&!1e{bs/̈́Q942L_SRg3|p!B>k3oO r4c{Xv9|E;?~6_T 7?|"[Ы[ָŇcΚ]s#y9DԖPHI!sY'?O~ z؁BLUYYHhE_ m{lFѡLE#k qwQI -*?k/YXnS5xJTB,oN~Hueu5# uz0>yT#TB$*6= ЊA+@oD$QW豜 bדS] wzUeK+S1kSc׋e 겊V%#AT=}xJKi  Ll>n穔@:G+hlqB>z8fyϡ\~nl sizԎȬ7n5 ̽qd ;}= -Ԍmy RG sdXP7G, mbn@P{߬$EjIirxCҶ @K<_-c~ִ&t#tu9']C9yq>TbrwC`Ѓ“sJ+:TG"\ex\'tU$ 4 &(WG<7zB8!=vt>LzwIP98$ ɪxoV>nژ̕5RKUFe/Y֋a ,4erV&mQȻ6|5 I'y4RkHL@$ ~kB# J=~pD ?7<[uxG&l$C0a NMf Nc=ŏBw uTd exE#sfR$ Xe3ל&s@3gt7OAl@ԙ*?dc,OzZ# WBUOL`jFvUDw|b|V^|F3R e 8$3_HI9:\B0)8 N @%pdsunJE{>& ܕKU9WQ@fH>$Bf+p*9RJ>|ƱqOh"6lXH9϶nN(fUT8|Y\G^iDZ݇#":hX7vЍpź;N%ų_Y5omK9A١ǭZp഼aפa*O0U \<11z,[NVl{"S6;ϞôW>ebG?&k(c}VLbb!iTX2ԾDZʆeD,x.B*ċ+gUh߸/gULSH:qN.]Qo93Lw"S2ޟ!Ȫ鎻-bkqH1IVﴑ7U`)Vyh/zWQmT&T"9k( Tq1ҙgY:kn׍x 2)0p;c;MM7g81 sA4% TAQ$۟߀h]ei JCԫfLN7MTs|~\=`r Vu嫓` 0.XJG9êL]<͝ ~W' :dpKTZ,3K_i{ⵙKIShɺuxΫXk`lf0σr0(=`ք [Am nwMu <> 1"X:FEK[X=AR'44|ceup9=ɽ^;Q` 'R.d4=5KGOj2)?|hssŦpC+jN<sI1ke~ uǜ9YS.ʕh gǴoXB@΍dK,i {.KeQ#z>2kV,F/2XJ>t ݽ&4O~+Pw-A"f/ɿ@慎o{(P'O2tlsTz GǤ4:&4xƈee'Y8('-us,Db"hpBpTrX<~C xiU@yЋ6E% cPfR9F c+ &E׷ޣ'MEkN}G76̆L3x#8]KFcdeBP6ecZUM̓#HKj\R&H(EQ}oeʫT[> !o7M)yU$<;@@s^fEC0mB(EeG<=b(嗋w$+D=N{o T"_ Io!@Yl=˵1?4I{ExNl@䁜\Qܨo~wl:\̕sF}K%g>nv5>hQd*ޡueZB_$:_MrȯTI6 o -z3~yz/Btp3%WJ߲I=xU|3v냐֪֕XE}6sZ8 cw=T9 g[:BGK6+ϓDHggLtKו\pk! uvaG'k_@rm )/C0KAmŒxG[Uւ~E֤)'ՙ_<E=0@L[~;;zpFѿ)i5%&""ׂg'6Rs0vpTϚk%i5{_M5 LWy dLtP#O-XxA^+b@ S@7%63,L k^8oP#fyC#?n]r[EWy?|qlt(\xj"KCf>.#9Y'}D+ wNq nn8{TB7EVRW;ӟ'E{3yY }Bݰ hXhi$';oA^k3owPo[ռp-4uw:vZ)Q87xnlz{rg0clR V0ytI-{x׮t+usn4.۠zAvBn$;e`=^h΂ %ʪ1p;L":1wב0*؜1,Lx5Rm}E X>GMKlčIPfׄCMNX.LLPÌNk%J9>2PPBp/aGdh R]!ͰVi荣st&rrIi1w]p ?-K%J; 'uB #/U8EE0ydX`06;|*Web2 i'|/pq1bColhܭmr"cgT?t` fYRw#C/>e6Q2}\D'Ez7Pt)SۜF5"iݑlɡw&" @l1Oeԙw1)sQ-?lE)ȩ`}x8Ť>?oiڌKoaٿD\DE'%Nd[H?3W1*΄ᦆ6wTͳyX=MU$P,^\'`M; .tʈu.@WKeГZY|zı$m$VHj-E X/8?Tt}Jսo@z1] W&)~GfW%iATt]ݲoK+ߤ\˕ݙs~bx\uL =M"lJ8#K?W[@VlO)Qp`vJ~!9w?,RxG jL!BYFX[V=b:~`܇jeNXn >W36^KNRp.kR%L20T]gnay?$'y1U\㜕i\Nc":tW$F=Ob1^\@΅t_wQҎVK dۤ:VbE] Mq:'EP|Jsb,A}_:wtuսG TH&WZʥd[ΏC@D80uNȼ2{\=gaLq܂kFQ豽Հ vɠƃ/ϏrWonNykQlPm؞phzٟdt@8ҟK,FA8?aK[ZTR0fNbUV $ Ӿ}V#HI-)6c(ủ3 }8<82xKR rH+m;\.=ң;bi`Pݛ. F<7ݰO[؎pMT~u1%2v͇. &PYU b7a=١vUS $ H,O}ʆdDA:0L%o пZi2Ľ+^T_+D I[bhagH#k!Ç1Xә78x5X -'Б!1WQF@laˉUݝFP$Y¢#7|U{V[_4:m\ Lg#KQtܪI8OR 7|$i8 os`ϛA L=DV Oxitg{V1F0cy׵BՈ% ^Zl֘/$UEM@a,<& `!j%R~ޡ0KI!#U(Aai1x֩'4<F*XG 3(;&:qqgzdF# œ!/ڃV"{𡊋݌ɝ48K{pj YmMIVlz:*߰D@0ҽ>t1TWlf 6EM-lm)tT0#݌ o8a /Q`r9eXܴ;=`4qH"fUA3F^c TZD)o\eʂVh%s\L?wxwU^x2õ6xx('_J5F7̂Y÷\QÆKq*髅)/[' Q?${f]5&?|QұVWRXwk#c7AU=rp>0#K[qB$sQ,8J5RLطEYS'-4km!e3:j~\hܴ<̠_jukTA4SoiB_Y\g+DV8m*Xs޻L*fj.wШt[XyؕVjN<1&/R3. Ks_M՘t, -knn0`tH|;S:=c3Tn.n%b)=KIs/KK_1^^k)(P1)'ƽYc0TWr5Q4Fp^JpnpQ4CQ1DLO?GK ==;i{WDGr?aEG[93n`fA/(\kz9f@No>WH?gfb^ [Fkyb|)ud1ے{aܮ+y3_:E8AbxU yQbuGט s EϽ꧄;%{ȷZe9r3ܡi׬"sw^6# aڂuزbUki(%B+mDU(d2hq0,ApP; I]7d18u/%Yzw0lscÇH)ק= ,V$ 'yX?])a]}eJ eJKSiB]{\ѮQF =W)r-vyz"k1RX[LmLfLFXܤVpn0kQUʊگ݀Yo: \S\PY<%4_vgS'UnNG4#,Z\^ctvWQ Znxl}w m@L? ^J`Ț8Zf1upaj|%}&KƏĈ~tGƹː8PHUNߩY|R6tzx_6|ӷH1c͗:c/(c]{7(lb؛ Qu[g{zz4Դl8M8D\IVn>M(D o^zY:>P;@d}~󗓦AW6#ٌhW7?} g`tӧ*zǯӂ?\@ 4^w."$_s2[yM׍elKAs 0@}#} ܊-]E7r7!b]DbB92R9|;TҸysj*ZE2\,S-vG;V@k{޴ΪY卟8T3fʨSQM~ئbxʑ)HCD 1/r]}*J{;;pp ؐPerJ}2P+ 0#%կcakb|߻_~gɒcqFKoЙR|yr#+=W#[AmY&;Vj|'*<P9: N@jUڧ}nkuVUYPnޓI M+׽O *V_h9{E Uwt{R9n?G)z\5<ŒfKc]4`G=?F;]hnxhsoY)PSCS0` Xb#d`"mŊ3V>8, t(=j2s+܋1Im2brXw--_g}z^t،#Y.L2̰(sc;y$ju`GЯFH|-FL) EƔck,ןME.r:U=^y696doGnJ;=zJQXGa; EqOüBjwъ-s٭bs8 en3#I=ZVrjo+rZRg#/&tAQPj?&lPF+< `k7[﷩[- т?ۚW="]#ҧ#N.2i&yws"V,<'?ՒmݮKyl<)=Z`D 1UeJ (c"/FCǴז5zN>i]/KLAwlL~D~E)S=o0aZ= >W@TV pb/@Ta"b !yWʻGL9x77eq>~1ș~Q?ݠ7n2 Ax)i\ׇ̙{'/ԮrѾS+Z7~beq̳0kjسkaScx`x(1Tobj*<`4L"'e xCA< Ldtܛ`P'"D0m^V\XsK](mUOPgq u^F\zA 8IFzDP#k-Dci"~ n5ieP"B9cSZ/o"1)ק<"sԼwmer'Y=[F"\~H&7ߛ8#vz~E)[Dr&eU6eqnyPR:IMʨ5NTadE=) (Q%%Q&e1 UĻ7˭CZ ]HDڵV;Ii?x]/ Ħ>PY' .GgyfgK!mS(bH+3kކs,یěa { TFߢzT8~SY뒴MZΞG~֐5 gtf4a&PPv6\7@EHՍ6rU2k/yb2hJA9R9h8&*UԏҲUB7WuG%T00uޫ<6(Jq0f)b-x˟$. ~ |^^qBaoWyDv`6  f6f~Z]|wUe2g:v(C|{``ph2WS)mK*I) w)Aż^)ȅ+ohF%z\3!+24@oq 1㗜&v4VGg*¥A΋\.q\"d7-ktFO¿2$& tFTTw9߰Ca3.s|ȫHΔUlva@g>ym:v y&?ׇ7q]apKU R6)iP0؁bCs`q_?M)P9f$d$Hu+ZWUΊw] xw5v69W(05@P!Y,![u YYYۣ=5HA OcNLtAq q$.仦^g@iHRG1x:D#L}IT7pъ[m_'x*F%0CWQԞK(xNŅj+!lYX#ޏuD=1[l;}j;ټ$|]'`9_ʋS39HS ƣNtr6Xe2%3#^W5KZ֩B=Qprȅ7* kkN){7I u{U"XKPevy)fɛpɅa)>gv={cNVq1ӧY`CppL4R&vk,A( $U7=2mWBK6:Mr 㧀ov> 7Q:m$n틺xSl8PO])$Bg,Q! }s>ٺ[YU\)jj"1MY.6?pay-!v1K1OQcDn&/i9K,Qm3՘gy443pDsS~U^{x r1{\&tNNJ\L9_sH6Z6 \tdjN+ٚZhyu:]TGmussu.SQ*]I~B;r\z\g-T bCg>9HڄZIJYTWz_[GsD^0EDd܀s`ˍm9A"V xS)W/^1yc{`ozD S pyZ ̈́Nz$BE.v[A62?U䷷>^$LJCk#k6)xL=Q+tvߧ ,]WËlMBw t| Y׮`RN <t.'L$jHOYhj@k*RiB;GloS܀NU#3ېu0,*]a X EtkbWUdH{Z X{DzHCH[w6)]gG.X_d? nMޘe5D0ز+.ubBj$IksɚZ~+nްpU`Q6i $Rז sV6zib~ڣ72;|kV `2M>6K lƆ>3H*䜊 ]%uj4'/?ఋw$8Ρo*`ufTdm@8TlkCda`L%Z)"%8xy%}lxq- 3QE6؎'8A<ΠX簡K'2͈Jk Bkxk3UqY븸%mҹ:ͫDK{ sg{U$F3^/M8 #DOS tg(M8fPu,e!U4iOKC~?=X47a#RʰuNK5G f 3)=3ԃɁgwڍ Vb2<\!4Stq`ORa)+]Ny5䋞'l#, ӍL0P,eɇ/-R3er \E J{޹nx@H>֪āyy+"T\l%ΒPI1@D';AIAhLC_dS1Cuc\ ~.yq_˥>2D׃ if1Q>|x X'>ւ}L=flS'S"ƜKv4^q V΋Mh_Jjh~?lL{w#k׫Kz<֋r*^xl%,q5gwr4dX6 N`pSk9'{'@su"傚@˰3C^+0$Ad_+7؇ qxPK]k#n%A7{,/jNkʐtd|֢Bf1ëJ FyA\ RQ <{;m߫Q&SUn9q{zW),?0_DE!a((/66 7~Ҿ"zޛ0 iNOL|>P+8j<54kY uy+9dRM\zOO ǁQSa4X\, f;o6cP`!(/H( * fJgX0U_q2 ,*MFqJdirw|0+ l8:jPH%qTVH'Wώ2Oė%KXw 6_f`m AN\=)*]Ƥ"m7~=<ƻPz:BϹ՗ُ!:[;&.M; Xl|dky7aZCθ"==6[SLj2^Ir|A\EZ=ѩ3[,{L=ďK!0De쟑NH_HerkBR~p-S6=>kJy(l 2~:6Vu#rXgOkEX khwmK;G!c5-Ol 5SL-1{,a2xᾠ6]qJ,1 [KȾL`]`'qG4cw 쨋+f" eGToOnz zh8]V1ˀtrs^oAj0e e*C2O+C[=dw. +n ha\* @{JC^@}P"tzi7Y%6|7`jl97'bFɾ ٟk*ҜNÛ\8(Y/nO2H`_'(:,Ng)) (P УTW*@ U\nh(NN3<߲,Kŷ'OCx¢Rj֮ IKlom+{ Ң]F+7ғ_}M|m K!Ce- /mJ" ȓ9oio 4lwsn*?L/!TxȽp{$9- EjvD -@d$Hq^)b] Da2"n bC+)..sS&fO |jC;tH90RKzFN&Ɂx` K?dl$S=co\s9 ^ٶOQo+8JjjAglbBSalH;yʋo\_g4}P*= ZJk+ISV2(gYv>o0< GْQ.tbnWΎq3|sǏv?FQ i,@+Ne dB>и_e.Qx xG#{)eXo'fޮornM8S7cAKBM8ld;Ms/ ~1VKf<>pc֐ >a/T%-Z \.ǹM\EI^ ANi4bGRhÿ%q[dyk(CfVbVe!h&1 w~0L X]1R*jn?fR'"g 4r;(M(6Qq7ֲ~i`IJ+5REGVQNhƌXlI gYPjbF?Be;Go_~0S+壿:-aO[a0$bʀj}N @o'KI8C,,|D{S;1k@jEРgBū[pTcЩ"vp.mij9HU؀?KugD/ޯgtGz P3A-[&$IǗd^$ݶ.xE_H%k"}4|!+Dta& UIl!n1c@}8fXhWX!,YWxC[ /QEos7?fԢ5J̥ XvQi[[Yy3z 4t|BqpG}ppX=dqk/_o-+l]ݢEmNljmF&RmeQ<6Jop}߿# }zWdug P|ZOJNrD/e ` nϔ`8Kiw&D,̓ڶ1q$ۄt܅s#MQE(zMBľ]ZKM31 I4ȏMz2̥~hy`vNP~–f[is˘IqM4.* ̄o uf#~̲9 #>ѱ^˷U6wb-Y7U:50|ImA2"@fѮ2O7*P`Vʻb^Y%5=,U+ܰ|a)jC Mٰ)U, "&`m+Cd&+ۧs8\=:Re)k]PqGO/L ׾LGՑmX_67S D1+,݉l 5&኏tFf(qMjHhvͣVHm֕),:r纒)uHvC۟#TrcG {HB<]ϓ雭ˉ7 ._hڃ]CTL){2/b~6/ h* BQQ>tMe3-;[tkLXޅ-$k'sķ+S7vic+<N\)>"6C_mY>|Ǔ=̩^͜0( Ca7v'wÇu<|lCT$$Že3QL6R"""vhAw_p̍ ZT S F3PP~=x,e~:I@MB)e,򔻂5SXpJQ:ʋ}*D='嵳o&ha^t{>I8OQzt1ߵ^l(_죸x$ܬkJwv.@*?.%bk8eF/rQ?*5(V `qqԴEd&8g U֓*rVK#ܻbXKD9TXĝ! L{ᒱ=c }1 @.s)>ɟ+ 6qS tqSvi˿Խ]_`nX0fE)/ Щ FJ?\К/lLJ6 y=F͏ɌMuԠ ~UZ1J(mnaf&1ՊY*Bߴ ,qr@~ˡhjeR)G'Da'LjɛAR0;[-P!7?Y[@P S  gxy3D7rQ[w (YnY>)Ew`~v~U*WJVY+F D$֑*oQ:n'o?;3;Fbh`cA#]]ѰΡјdOϠn@$<|%b댠7Ҋ!?¬PEK(c\葲W5g3 LР9l~sF%'-ebߣZdULY'JdKl4nV$vo=4ǠIaru4`ght^,G^ JF1zʩƐր9yiG4f!bs?sH6Z.Kj"պd:Vp"~fhq,u7`nd\83#1neEta8E .粥[]:i޳#[mIB[bݔJ^^Fjǔgezw&wGM d NCp/gzYW(‹E~ht'4fk*IWg^TԖƫ8[o:)>/$οTۊK&$3C| gň3ϼ(ot :O] u̯.kUs)+N]PCz}"U&B +&t >,siu5qG͜tKlHJxP0$7! Ӵ4L𕼫f ޾`UN"CfmSfŞAjl,G( &j\ݰ7zjs[ pP籠dڇ:z.y-ןL}Aظ !@șUtݛcPLWBX._h8AeM!Fn 0Ryߟ㸀P³ex'>Vl17ȵXZ2:U8=HUr,5(#DzBE>cCvԓ Cܬ0gwW LB-L p = SJfֆVw\nd`~J˧y UV4oji8O϶NA Ηc7Ab &JpqڐCWId1 yK[Xޢ+J)6 պ|I [W.,܁A`}}wtxg%7p江T+Owń ;TƶX鎬\InOw)Œ˃oH͘V|j$RkAT$}u!:b$Nted լulĸF|b{{O2HiC~E>"|gcoB$.C䴑cg% ld%?.-%A]=X@6" "|Dh2z.pǕ=:rD>\ Wףk|&yϔq;B ec(mk[xl8~ 2ШUqxzi,}TU FIOK;1:w)* ,+&nu!/.  '\Tx;d_"IvSDb+W2g~ͺ~Q!`]iq):\͠/Aj\Esj(=w†7]]Q&j=5|vb]BȏIf KTeuIiǹP^,t}_UF5\#!@GgT$ ~2bn-Dqr6@sO6s )|v|wC-&!47Oc3g (^9d$@ snX<)+>u\I 0pF71<%~3۽:_1) l%ETJq=G'8{81/1q@}4v k_'MMe9^#K(w'n% _ V$ZCE%-x)*D u%xfQn9Y0 {lWO}@,j`l@'=.VX-W=v^ŶE}t.ى,s0&75aRTB\>)lh&zec(Չm/..O˃Xwݻ̭tMh,c+ pϾⷈd\"y-:\h)LdZ*}2z@&5㬦Oc3 wLy>T1nsOYl_Б,LҬB8^sW6c#:pCɴ>CS<FK) Ku}CK1/S:sSTplYRWRog,…p?yz(MYH(tCSO^;'!)2XqxEo MV KdNn.n\~ox zb+w$K^[T2Tbw[cT+C%W/uDZV۲-y&\^ U)c%o1 o9omFB*0ݧMn~X݇O)l B(Uʻs/'|IQ3uW l2L[ IBtE'\7B1% 5=m znvpe 4}Ĵ-h0YmFxp&Z8( 3Y:q/ u#LqEs:B57B_Ϟe2%fえn oNLʍQ)/9[.=t2\kAA{FS/ϱo[4 `?ɒ۴d?~IύUڰ ` ă`y|&@2S?eK 1:@Hx(Q_ XŚ2806 #{ƚ'u(DǕQģC9˟oDO}u8>MCeq '!=p?ȡ?N$P 7Ui ZaM.q'芻=쁖"JʕcXIo!$ҎqJw$&>1&SP݃_ÉԀ*#$1OM¸A^u )1AH Cn3T>ņӈÔ*+ɨhٗle—hOo=r1[( )`r HSKJzKAu~?L\~<r>zV>?tJy9cR `Wv^SqnCf1Y_S} wt %cu; |2.D)3쓼Q|KռpQ( 45+BwԚz!l8_* ?U ? D&G{!&5WS?|?2@t,)̒w}P_Ln<ĦRНkΓKWǏ_W0M#a; %1 c@ n1EfRۛ}#u@RpKp`G߳B<5g뤷 hivqWQ\% oI 񓥂-Ķ Et 6eg*4gqg\Z_&ЋJ`/'EawWwXz>>,JT=*&ff9,.MFkQ)oU$ 8r~>LS 3q &C Wl/rc~y,t+utyxlQ 3DdwJv] JLJdX7ngabi؞JziV}'Qm'Z!E"Pm57Ց2&즤8)=5@jܕ|cF>o.`, ipH$~:#-4l[hq NJ9(%E^=PXF |M= PUHk'&FFDcԶ=mRϴ"-FvK>nRc\KZ?w/C6LY)/ ?Q`XAԴjma./69kX{塚2͏0kzbEcK_$ju . >-ﵘu"RcTPgrIA\J%=l1P&u98#+? j|Tvemëe9e/^sۨWgm+ *8U}6(;}Qcjc.uk8.goe>60wIB ݡNḠځF9+d*qܭf智Ȼʜ8dĒPyb.vMSR$OvJL*\YdL/`3u/pذ0/@9]766@@fD( l4VdZ,% p (k[jt7%>R0q͟ W!뵂 E|1gZbVX"KO|";TL|rIwΔ>Z?~2D>ӆHe7 ⢷PW$&IWb Mf /I0\ᵸ$?rhoQ j,-w]ߪvb5lTHI=C Cg=yP/@2ߊ'#Sx&q2%FmZ+2% qM?ن'|>h[FHj. `hD%$K2"M!{`|9ֵM#q1*䝤 WEHґQ?βŮ . !( QnFZ)*inTGG'A32 8\Ue|*:kncl뎡y:9U.;ڸdZ;Y*ۺC_ *A HgyխyZ`h%kB5h(MJzz&-?#! 0:iğ=yKb Y {jm)dPKOT-@@;{LNMJxz7㴆b.R rDv'|"o(9@IE"]w)YxQM,+H6ݵy Q2"fJMNZPwI1'pڮ>0?iEhq)o@pw@Bzw%ke-WUHDdך ,e+ FVU5O#z&XU5UVd:܏n-? `E`%6akfm[kqo|\7_4u]1BTd$ccoqlVvn'}W֗Qe5ccZd5饨 +fHS]^AU'4WZ efldjXuj; -ATo[Jݗ\f.Lo&! tf0_f/m6@MlioyEܚ,%^;@!< 450<ُV7) kپvc2x$FGtg~+0;[ZN(t~wR3Kפ |ro#HT=- ۏ5v&xlNr}QI0wbQGjJZz5"bR$<7GO5{s]ZJ!R?8Ky?b2`Z8gmB6W#DZHa#N;m߭A9r馐"Z+t-Bk(cV\šoM J< $Bb+ V7d9p->q^ǞϬ|V/ZLTh~&LdBe2ZgmDaH`[bx#?)|x<+E3"a]yŋtg,*OD81o ZYxSt&:j6 9_pSXOo &1ל$;fiv=ۄV=(OWc:Q} {[xF&tψ 0f~i)jB9CcEΣ8Ӎ]ܓ3n"y* AwF2' 4$ȁ&^Ln #!yrj&Wћ3MDp@콿zgw!`,{>΍ NBfۅ%~s"#mDKh{NA/@ O)D=g28~e{F8lɫM<صr! |b}ũ'$RZbu6a -ewZf@w[r >k,4T}`@`cE(ot1Bd["LR47J^a+W|H>}90r`XODޡ; 3@ Ⱦ#Yž(s z[!q!ajH5Eڌ4mb87Y~mua ;D`zV[v:op̀IOτmz >^W}b_eb!)M4W@ cJj%_a"x0`iLu(\mǝO V2!~T>b>o}euˢZ z1oeeR"klڽU%a^ւ .fQI PI7|sTD ԅotXdӲɟ8X(9{F= X*u<& 6i!VsE{uFaݯ Ȋ 2y#pMl=ltFXc*rkG' 6 F*83@!^]lM(;rBmLoS(S7s1=sUI-om4u )U%5*KFɺ#QK$(bb~L('lXӦG0% ^,K#3^i q# ^ dG@gט-M IJ%`"r84Tѭa9V1̷j<:&lgͷt2nYF]X=2 k̙BP-\vvF8qruӦU]oRkOGsf} / m ZrϪiHᄐ 3cHV皴B%crlX$œk -ࡦI :mE(QV@8SAw^5 cYkR55dw&*٣q|os4YG@VuF!Il -UKz'jR(X=B|i?pxie$I@a×P/T>9vv~~ A[Qwc'l}V)?)Gav˫Q/(_sYO ԂӸ! ndRR1T˗nQlJ.?kb ^{8q|U؉<ZEd?xrlWIU~>xTڜbj_йw!EN 0UU: 7*0H4-A_,섦= EON:,僙~)ǿǸ+;<¨翗)P`^g{) p~ YBGowM*cA,RG't2MOnE]'::),EH=̜@YÌ3y #OY?y =7_oxwyF!DMsLND~vF}]t됣; (}!AzZ F~4VF彘v=82KD)/-E1u^7qbG<`|r2謳BJ&V96D=X{μfiy7*BM˫jTh_!^i?WVe[Ǭ6q gKE7ųyIIP)C6-WH ˎ3a_U3Q\Ī ߔⲕyO//TϮ-M\\h X I8ؐb+j#uq um9 6hbJ R"x uf[L3}>|z€m` }y0J; }lA+IAlLKW<;$h0QxFjc@+)4 3֊-W.!\f/"$A<=w-(RurW1_4Ynk~:zZ/&{2oTm!C7?g_W=™xMڃw4uA*ؕ oF긥Xg߄kHYUÚulE]G> T:> vSa“.8*{Tz| D:x?i:-k bsyuޡGk ֯*] AD`m$؇l'ehӻ62tDjy&銞Z!9K13tGy_Fsy\UXp=Fub+/-n K%\` w| 0e+= lZ󛂏7AWA4(nqVS#QM>i7.U5Kށ#c;'C.nnڐX4B~Jwo $M$rw2Ҝ)%;}06ŒK2}U9Yvc3\L?0N{Lm2.:2ji?:肏 ʴ22[sI84m˛Hg`(<'*BуLFWADn] ϕb Zƣ߀Ϻ{XkS 8gqV2NQ Xqs=}_W1 +f̦ ŵs&(23AN0_xT_la 㝒m`N+aE_OߟVH[@BC)H7+WԥѰeY9pyޓrXDU9*qMdP&kCk1Wfݓ ߿i8!Td ۭ'r;3KȑP\*7-p[)-̶laV5uR6hR$XkB$ֶ* RiAb;X+Mм-f$ggHJ,Q`AKeoyPM3t9\%M@(Y21j}>9enTS$k/2Z5˅4\P:W2>f W2%!uspAU>pm<1D =Mwc> 1ߘ^i@q1=ƨM5Vdw#|Q_C{,"By={.˃G`h2?W UG=gxɮ m+ @pVQlݤ시z:*љdȣsp6U%8~FPuRlѓshXǥyRDU_wnzb$wsqΌh{)`*bXBU9$yoB3L$| ^k~.A}$A΋y$)|tڑ}Vا&5u 3C켘 'z&gW͖ŗ8Yl\Lw1,GdمklnCT[IӬS}oQn׮t1wҥO g1hBc%E'O=)Q66@cޯ㔎o3prXetl߾y==0ƛDdy2,jCx{%(LIa'O" (#HG3RjSbS':?))Pyi׏PP Ic1co8S]L5u_~ň*m>XjePmw`8\@ۿc"vPoXG7Kw5J0f˅!2yS݇7G.3:0#1J"i 98RWXKAԠtLԎExRpہqq]9/κ5YxoYdw CЪւ'2;33Aj_.1 &ꨚ#C`m+b} Y/Xpy̟ā~EDhpWCXN5$r.4HpdΫ^^NL:$}2c!Sc^8Y*jp\LtȜ.)Lu!UE)Cqr4B@FdH|#paEDP+~>u¯r_yWJJ&P˺|KbR{fa1̹H@!,ZYZlDK=#-*uZ~ XjOw=GX~`@OnNZ.jH{mNP37]D֊8w,Ȇ,FZpUյ ^φa{,A OR~L$ ˾{;3a4ykHUp1S+ޝfm,߲#AmҡwW@wkBZi K:pxc%_: g3:LKuI)UMtT¸* 8DGej۝'UUab+/kA/Ijp-g=X>A~M^Px5wzJl4so%@ַQlz^]3!~-Wm5O֝0$/)[1BeOwf> .ȕ4WS u[2L=DEm Vaiv$70+3ؙ` 8H,X=@~:zŘ3쫛Pe=v{ɪI+@/lcB41]=Yrt-!̧t ҳ;Tuŕ{[As$f1ײMq;O^V|XP_Jf<`5=qwi:K0r W1h?$r4i9+7\E,^%f#QhrUBQAtVS"M:㮿t-la .xC_CY9ւ0 TTIM_'i;Q= ˚Xw+*bhmu⎅.&iƂ wB }uQķAYm !X$H%'F`O O9AMI Re0QRŸ~BXCӃW,X9~u9X,xH۔Q+ qi_ls.2G'Le,{Pqv j^=MZf2V5}aU&7:5Ͻ'A1C;ZAiv>,W|=:IKҁQlULX-Ec`ǺY%b|՝;%W ,FIBTTzǘM/'SO`.=f^ ~9^{:KBl~14}K u3J;A[I&Tu혻 4]/BQo|T4u@`=`cCUYef`l2u@0PÖưyU;W۠g6S%'G]'?7}UBMcBӝOLDp\l4B#)z#hEwH-l6J-yy-NU#v[W:w7UwW-+ qn>Zۤ*"Ds'CS?4V0u3lqlCKq;KFtﲫ6E>!._Y9+y&[k=\YpN fϬsJNB E_aԇp<D"*kA{;Bxl !6gd^TQ8yeZ>hs#Q|1FBوJ&;aQ~)%?x-2xh? r&ֳLizۄ:t I qp&m@~/h7xG}KB u<5ȿ J%@&dy;_U 5LY8N嵗'xب {Yx& V0zUJG84ȧs 3Ȅ١|];ެ1$>@I{.j63%VF~-C󨓖F \<#8xm\Ĵ?t[4ج.{Oo-E`:(gw9ڃ[$9 E HY^ 1$j {6%4UdU`蘦ؓ@b}IEa%fl@T !sn 1ɰ!P:?8"7) Hl5 -Nqv1:b,qm>>W]:hgKcǴ=Ke>=(\'1c)Sw=red̏q_sG),jJ1Nv9=q5IhNJ:g&_}#]qFȰ%w{@Un~@#E/䴯/ڤJQCՎ& a1uN z\'>0\ȀL />b,c<`N&*t#",$$ٰM^dRwud7@PncT5`p(z浸O-Ezf+:D2hl,2 q/li7vA"e^RkR/~,`QH@o CUۀ/ ~h}EeA,Oa(pa[bxf Eiŧ/ه"թGs1?+O^aU~ps6&MCFn Ê&8I 酰nM(k)ijJ_CLkT?mًLv8f@YnVVtW"cue-@rEʎ(Ӊ`-NPфHȪh$,f\"C(p;'[]pnv%x,uw v$&9?W>"{tXl⃀laJAXoFOfN6/ /%}Q0dk'NKF_q,~eB$fQ4I}rns $ώ.gCÕt#+K9N&ܙM=Zr!_aC&'Mz~,I0ٻ).l&@>!/P/\,bE8C AhK"8/&F,2!>{F[׮t JArL-&svo}lnVuUK*n撈Ax-%r(WKYFㄷV쑡dK_WjKAfJ"T9KLgA[/Մ?75\dtWJ;Z9TISNߵ81$^5mVUt p&#FL:{8pYjyc-1 ТvJ#u⾭E&Aj\v h3=u=g;PeG#t5( !sA ld_ P躗6#i_D,@jaOnUo3o\9hV⫏<x;&8&&]̚g`<pQx{}ȶq([ej` |%1=lU~oprIĩ cNȳ:Z}5_I}sB^|$ɏ T^ru}`Ӻ4˳W螙3 HnH(jcbuwTwa2GHM@ǽǨf؛b[#NÉ}UitD@OS@'^փOVE<@0|W8J@8 狀vAoIDvAue6~)'ѯ*/ϙpQHdh9n_sD Kڮxl#F?Nc/':iu69xKzRjc}ڍ $эݞdCoUGo@'Yj3ŌZ#6]Y0vbliQΝMLVXyR=p>x#ҁH7)Ik5Fw?ؔB5ލ0qP]h'6zJow~cY_ZAw |jy@61yzgQ7i67/1 -.c,NuUNۤ`>EԪwkjwJ:#y\2bO91JФA,{AZ^sbw(W9QBkr?( Մٲ5 [/~'& qĜIB|%Zx2$9HhU[HC|lidۂ/ t叿vlp[:+.1c盭((@)dbRDíCY6idvʿAB7}H] «{sr%hksBuLA {!Ju2 @;Bu#uob6deZY׃M<+ & u hGx6@d('?66srsN&ƙjhZKV+@p 0-*Z58dODA%\501܅e,RG[9zlxd`_UGZFMygٰ4E֌&fH)5n/-uqU+ѭ8lه6UH}6c:m0m-%r0JϚMv[sqʤ޺f#a o:I#E?P\w %pVwY=S mJ7yxYŔz0x3$ EQo(PKl1eLSFrCdQȠ(E7qnذG,:*;ӪEka?i42b5WaJaòA`zKGQ(PFpPaea{wPGVLJ ^=!IF1MjWŇ YAI@yN y~. [,XY}hAlR`"\ǫ2XjqH2֥ФiuDȑYڋUjBܚs/@'d. }e\?9Dg4t#xg ~OnӋk%a̼+6d'͐ HpŴw?s,|e!\0=WC[͟hᕟx4qt։ͺLٯ8 1ٹ`z!m;ۯF|`A j*<<~PW^0LNk? =)")d*ț:}!7ƭ~y)x]Bݝʩftb tMHys^+kC#h}RӀNvPY3#`JR:Q->TCQaTHd&ێ+FwLd9c1frY%' }ܛ 3ȋ P"*b:TN#AxB;_2\K뿟RMQr2#G+ojWI'{1'Q*Sʁ"kț@dsYq:x^ x'{9[V:cmi+&V-U<yM (ݦʕ4 C90_@Vi`Jz%m;n$' b}3)äUp%B2:WyKL3?O$v25^-C{N"KWoO*!0h;W$d45Wp6g_J>Z-z6JčH)i9L97;P-OT)r nc3G<$9⸷-TZ HfD `1/z>y)[_q=#ޓ%#߬s_3;,ؔh:5٭h lQ*Y~(HbsA `X 6{t*>td}I ȳNoK1L9&mXʟrd💼_-^X\g@:]E~ uFM7AL8ϞJA[-go&5w҈e#?Bˡ{]m*⊥Q(VrnT'TMb48;ehCmu7d=)c>h <-VI*a=KNGtO۷,lVI?,kA#_OY"SM0 Qu5tR:8=.Báut\<opK(0U%Z6KcmMbN654>a6qЦ^wSqc´6P܄'>{^ [ <?$Wˋkd2 `fC-:B/"Hs|S5,ax -Hk:fko訓DPS}\i! ίX"R&y$D\"RaM.OlHlP||J^>h񱞫8G;vF7KL ۂGQ3[MX/ wQѷ_ms1g4\q95(@/R1@b6,)GKZbܟH9_F[:<{}Ș3L'`.Yq-U)CTQwyHs"'vݝ|Q1Ɛ(jL6GlD}4dq8D [1Q( La`~"}G.!|  }t&]Ge$]dE9xYgbSؘ>ٺWZFI Ao9#I xUH꣘B:l73osǴv8+F3ZjƜ"Y ȃb5`52uUD0|iYLg~ҒWejNYzQە GYѠzgF#"ju!^N:؝Cc_4S'ǜ,+NfvAI,EPQ;hl*A"/>;>}e&-8w; #;6}澲wZz![ \ eYj}QC>bq!N1*/|8.,cۚ~kͳ8n5\_o&dަtAZzP==9͑U:U]%xf=}(벤aRAR U3Eձ"3gc+ Dж' #!R93!JD@ڹԛ;Ҹܵe|.57$oݤm/m!fޏ8#҈+g+lN=?H}LO֋EK9QAR#vyJb{_4OyIB]{:&Ϯ_[ŏMX8Pws1 (%]kHFKa> < rJ{RG͙@Րut&%tnF798&rBn9.-9юIAQ9ϲ @.LRPoO!J_ X $p qjC_ 0E߸*} cϣ5gzOI+LV -U݌p]654ˢp,\nɊMgR`&PEcg=w`εyַeKvj%0?a-zW+Z3>\b/ Wnw/ 1ka߫!1戥'#Ή5๝7'f}m k+m rS.rB!ML3jNWFKS2 %RPnJE|)G ~HuQ Ln K]!,"_T`%Id-5O6WG&h#i5S7LZUj@oޣAןǘ)4Z|PwDG7QqOkQL^*}0G+ַ@&TrĊb4+"t "CP4)O¿K]V$V/pi@&2+1*aKn^mHOW ,IWΜHF ]2*u37 [C8簃uRgsQOq7gv0Wg^.~'oʦSJ.lT(^=oUzaP-XfiYSeIw$!\ᔤ ?3 >=RBjp/TؒҔI7T[i]XV_(3@J<9nofE6Ea>W)0@oH, vd'1mɊ Hlؓn%'$dT<ec:?x.|W#Pw"s⅘OOL`Fnr=!g"9 #Z;<Ѯ<5QPl:\2:ۦ5i:"L \~]7nv,n*=B#q7y)2Nz S)?*]1e-pO@m0'FXF^%+M֟:5;ɑ+umӲ ;Z/1͉Bv=׹rɕ g^|.=eZbx0[cm GAjcE|b,n@oyW kdx~W5`|F,%P MF~V=9Ageԁ7*!~.4OiiqEkKi WO!}:ID`}*O9*}c&nExD+]DG:ml~c,_xT8>6 ˄>6s\Nqu8Rlp<;X"Q-aKGy6eI<#*GNKnbDzt"8,?Cq :t ;M 0hAy*#6js @ט(M26FJZ D0T-6Ԑ$CWuOu]ETBF,N f?s(rL57( dB`+@Vm45D|l⍱^g*i=$wÍ3 %4hrp$W'WyDē.*)H*%uisɤ 呮k3P|6R½T:?1WQ(a`c&xja`hF)|NSƢ_œ5"e`<93 ZM~oϻ2qrI78j^%U/UReǠ1H=.yA WA:bך}NnNru1 n59$Z=>lYC+hQS J nz0(^z "8櫷8MABW nf{Re_{yp (`X' s}FY !#]/yWN'. |rG1Mnñ(6oZ8[%d63Zp ԾPMjP5:h$⾄'{?mi}֗a>lDdD`4v6mt*7km2 5xRkCrn*1Bu/69CƝ;,?W\A>D=% Hs3[!hhޘ3/wq|X3[5D`q`}CBpUOI 8`moC`+@Pd'`-HA1jX:ׇzˇkنv68]wlcPP/ň0WXZfaKEաƿl>Z-tݪ@ש?s9 }%{!WJeb`΄}<| \vB8t}é]8Ѧt);{Z{i5pz/gқMFe|,2۝, W5 702%p~=_h0a,(R5)"uߺ[(w=XUUMyhN8*2ta&ɒb.Ͱ^x*h<HZaLE/=4d"6Bnu?DZF` +z{r0H˕۪wҝ12-V=s`B1FZ]QBm 7 1P1>֑9} eO}9XertñZȽHo񹰧3`ǣ"fv=A-2ͭX K9I5 {"Y@\yzYn;uEև"4B2|zR_3.ͺ@&WsC2U W" DYoצ1 ġ^A kp pC47}1G\yǎ߃5ݛ6N-m?MYVן04zf,Z牂,za,=W֚{ 3p}ZT# ~U˓olYdj/ +ѷi!wnm, s=l \}Ψh}) :C|ˏF)tua5DڬN52yI-{y @2#|߃h f^\)?2Ui)ȗmTef62hjs'Hz}}gPe~>vJ uȋey#0٪2Ie_,3I)n[ n7pjc5'IB5>[E?E L< 쟇Jd`6rFv  u2VGF낶=+H /) NFyu\ɿjEQ84 fI7|x٣u&8HEcpif{lKTݬ_<1tp|{f !1qBHiCt6C!G~bl硔hVQ.H`V؅6ǹ|KpR4[S'vR=2R. X6 Ӄ5P^*f `KzeJ21DIS^O{;s9UaF~ͥ>eP/밌A,kY:2;#g]\ikEүP-üH-*0 *(2I&@,[*.[팰8b!abelVWsB؟=D/w>{v2G) ĪM ăP4qwTv>}ag'W6pL܅_^vh|cl// Z!H2d- rs/0ml]t<( ±*9m]׊UAg]j@D۱mRD7$N >([R`&x|q<00xٙoJpٺQM͚Ec}vO[?q&. J+*G.?Пi`u?0>.ťu^ ]-rH)Ӛz~|Qdiţ5Y%uĨ| Cǐ89%C nVJ! @{f@;NP?Xb$_$Ib e`Wi-9Y5]MBaXeyx:{>/"#|LVXYIPVp}^rc'+ʵ1ܔf(|^0ږ" pwi[=zs_ѡ ܼqq l\+8%0FcHHF[Ivv-]a(̷Xyee(0U| Fm/Hs㎛ aNދ9|水Zl<(¢# 놫F %n/J&~V1 [#G_0a_㑍_qeO̍4P!t $=Fz]\@3]DrM|FX|BxL IH*js>c86-\1?k~x)kPsSJ+ nAힲfbVI  $@iia+e==n("qޖ1嘌 X A&x vO&Ov"Tj{UJkyt b72sVb= qoĨp. 9'_|liN8/zMzFxZj#f $d5trn0_g 5j['m۟*eئ+KvڠDIg Eך>^q]-n KC]59i3e5ג qf=W~mt/v47&<{F{[? UAɁ+xN BwUHa9&pK| 吏&"8/Du{os]aI %Y> zug7 ?q*XTmw#= phCEWb4[[ej\6#9c. K{cMܕ6c/ٳO [ %8wuS"$,b?7 tǿ>{K VQn_W0xLߕua ?=>eP3E>g!$N]#Z~~xt""%uώ9 쯲̜'P99IZ'h> +ϋ#+}l!v|k!B(2gsU?vb:Q -malw&A4tmIx' d>Ƹ m'? *Ł]|( ]=2]HaԫQ=*#L YO9UBUSՕʜa^|iYmA.HR|(qI0lZА5TN@5ę D$ `T:845c˶4'OxͱPo87, 6֙B,k|xq~1{^[JEKNdk2?1. ct?w/eIms̾WGO{<c-("ޢhɼ!;V?dN%(Hqh;-\L;/xUQ/Z܇PY$u`{h .p t!u^nbmDJ2\$WZ*6k,w}E;mZ^Kđ ξTL\D2ba S:I4<+y\;W3{4 Q%7I/!'8/R"0u9gdIU4`2P㮈T$3#; nv֐є@Eϖ't?BLR$Tp(EYr=˽[ !;ʶOn$[YwsMLv- X6u );к똟$5pav.$'4]}GT 'l6m.mWǯ17L7pPteh'J2BH[F|/#)Yd9HS츋ǴS.kBPPemo7 V­[%gG9qи62)?+7Zf{,g٫ ]-g/)gCC,aR uyDq#tnsS91LE~ 9>3vjԊ{L}+CUewܶ1_#ϣf+ o]rbW#+(Mu$Cy\ٚe&بg># Gދ[<1kr:\ӟD,X ,}G͡h6yLizP{o{dn߶{!|2.g bD;u 5W& /Ŗ 5a{rR;M+aF+@(yj* @9U#PA+SRmuwZRQcF>.d:fm/ne},  RhEʱf@*A!LiTXPtj>e#J .ZW|#NCB{|ION<_pgg쯰kx'm@dm .4çO? ϧn=#=]̑^&"(q" Q&AEj!%>xIQmOy;bk AI&S&mcݫZҽFUظ"؄wwvk3bZ9cDG_\fVGGܜM!a-%-OmgQrFV˻zdumP"L(Zk#|fg|gQٷ CA;TQbM"CԊ|ċ6e=5]j#/|bhZW kkv߳*2J&-Ȓa8*c{_sF b:~Åk{[xF?G7a+:ܙZqˇYic ԆW|YpKG|djF>4k͏GFGߘMQ?' & "O%)Y] eG=-hERR[=ϔ0NS u$s~peAuQ+1@8+5T_ocH(d4=wMJ 0xfaAB8+5 B BUPLuGOr7SPW]bo㾺,Ma@qhFW%gS'n^[>}YB 5^pk9Ot8KM"Lpe'ޜ%:.ۿ4BX$]1r/&# 0Q2`|{ . ǑY Hxtcφm6FeDq',w!7Z "Aƥ(1R GP 4U8u>'J6CaN9 ra߿Uޤ8QTו[@G5YHfb(I~ P#S6} >J^Tf+0u2D. .Ys;J>CZ0Re@$M~Rw ڠjA`hVI3DT 0 oOpXryס%{*?4؅֮` DWOJ'O\"_S2<ٱE|w++٫Tsr:L*;` 'b3(g Gv%+Imٯ T@ql#d#+/w  Ab1'vդfyyG0\}j]< E1w1/ݏ%ˋqlзE& ٮ<kdęeI> -Q=?SҎ9yP#Ab~VljOn7 '. #O?ztS'c?):zdh7]o{ wBob P r >q,T4i+rxX\)̛7pտfdmR Dh8 H)I&iTdBlRRd R=7١峞UQl2/ h֢;hٛ,}ݒL@wd7!=iYnwOj©%_QK/Eh˗VIjQZEGnD8D-09❦.\z>O c9oMb9`'-"!@=fo~!t)mʚ7lWEw_(AJJ?ŐEfS1:b[ ih$2"vL [歘IYiðTWɫ>3$;Degnyu@2}BB>ZϨ#ӄuo!w kn{`i_MѵW.jեڿAh.`R }P|F֙p{hCoE2(?RL%vE;4N7H@H0g ׽_$/9X9(z%ø2`o sP36{C;٣%rQ!IzaU.!3ֱ~rZD;)]ef2hoL8!Q|]_Bo)u|> Vq͔ff؊@pE Ղ3x֖16mcTwwYB4+zvo\+7\P7Vr3Em\^q*)*hv9ͭŠ %U6({#(Y+,&Kpb dYdžl_sU4^hiվ W88-jn1%dCX~|t!:*pCt^[ !WFHHIRn%R_yP?}~S AҤ#*#@h!FUGxwSud[skm{%o<Ȭ#R ?L?.K2wS .7J4jJ#" Z %!I$t@rS4F"ͦHxK_ %:KuJ4nW)Ir5&T׸ф`''M̅wh2_lCqE@.?&%l޵74O;a#=K짢Yo> ֡MKHYUR} 1/ Oe84IDݬ2R~wJ`OlAI&S;BzGrMJ%Q7-:`:MwTr қ |?wRyw.,:4={#ވ"v O @pR偁0ԺS%yoHޢ64v]@AVJ,Uic28yFSrz#D#,r# ||/:b+ycd.s1Kby\<$zF0.ٞ/ˡO9R,"D?ḱ\p4!) Ly.ڧݷwl+A"JGAQl'wo_eknU,`Dy3F&: Jn /k(a gq= P}mNdF6o @;m- MJٔVaE`󬑧 z$4(BF@rBW4qzMfU ߴ53bTW۶+j-OxDL,?B nE$ßL}vnuNE7%M7z@\)z#u1z\HB2 Z|qaH9:z/rQ14/m\9?wN'i*B%yƟeΡ]4hCM-ՌQdUHjAJ }ܿu'|zu_WN JǸ0n`\ _ݝ$/uGN̽~GI 07rh#c_ t&L0㏝yo|}WH@PM0/h.v|OBwK.Md2ݧQhvL@"VGbr}%:\|!5@qsIckM6;WUioMѵG?mD ˤѲ?"-b2?)bN=3AW>ltUKCyBX˥l7{H(_-K&y/;д ul绔̃`/Dڵg? ign:*g{gjy>4= 5B-@易zAg4.`hB Hٴ Dn7plK&͆$[ne6cP]xFlO,).)YR هt}xm Y>1e$'9'U7ITeB˼Ƥ11#*zRpNd(Q7݆nFaJ5#! "*.R*j-Zz7Ry NZmhr0#jWuzi&l|L<9ߌAKAͻi,2 ,7բ U+]+8%0d0`mB} 8+6:w,4o'" eT Q\ف&tOTuNf)^KN8[*П@qk*"Ve*Z×mD9F:g(m-U>Wiy0ޥxP޸[ʯ-q{A=9< V:pwC@ۘZ{(} N(T5$ ŷ§EPn{{*E')Zw6Js0Κ{ʯǭC.dD!X `r{10-ܕ쐟FxLgOň@ޣG=a4pU~V\__K~R ^Tjd g^x{F[EYOdN\6{kh ƐFBj|vt>R[!UӢiƬʗ2$AHCqP~-li}BMT@ʜb֡"RHMB&7[|-^JP;j |' T,dcR:K;N5V}OU0A6;#U7&e }.̀XGqѴeGaVQ@؞ňF{guV%AJPmU;MiadYm( `5S7J |'OR%?Wqp{R VsE4w,Г$D-˂Y~4PEdB ԦejmI9|PPt<3:uylکz>w Ks,p.Ih0oW3B;v"ûIkۍ*\O{Яi 2ga^vX:תh-G3TW*LQrɤPd3-~ddH!#sx6h!n!VΒ--C+,g'#E I~{AـVbW֚n?F)JZv7H7wzoyFi"6QfDhz*gʫ"^HɻTݠMt> lɥbb_WKAyڿy kS ^'M>1bá"&J0{0WMLO8 .6rcb~tÌ>M,^1 /VΤtp2&O֋@֝\ 3*I6 lę9RPCB]I?b-<Hiyj)*lў{@52ДJ"?GkV>ő+4{rLLw~20R5EV!1#?D9<1BcMQS!Bw,FqnVs6|30ƍ c95RAo谊Veeɒtj#q}uY@m{M,o]u%E8RU2Fqȴق"X3rPYa烎L\&m:u5qnZt2w AP r)Se0pHވ/&a S$, I 䉮53$\[YѼe>@K s ]X`4 Ԗ2%DE JqmtBZbz]t<γڙ {K6Sc s̬t7z(I'j#̼u3j(2Ɨ˴%_ACD2H]Vj|Ⱦ_ u._,O3*I Irګض(+A2Ww`޽G Wz꼻NBCsx;NCS}6QbKX%!C4! E1L9dFEANg湓yj7/M$deET_wy~,#(@0[#ৌ,|aXJ ! Y˖Xo1ٷT'N=2t5霺(eE?2+OV&@ JTrDCB^{e@aV AI&S IAi058~K1_}9zvc'\vb+Ts?luJ]i@vbn?zx*{ &x27,x 4‚8 &iP"Q&$ 6VH =7FIIp5ZA%C,Vԥk\^7LeWA6f?ˬarbEY]TN d=DrW9(ѳlptͦ#)3{- tvz>΀W= t(]{Kr^ TCTdx̽ax>1H`4ԐxfpT;3~:ň^,ᇭmIXNҕ!K~ ɕ%tg8_8a0flXC9j[%RX*b&g+l0@t, cT_X9jQ5GLQ΅=7T&T =/.B}'7X .h?J(ouz',t4ɯ|] b|ؽ_K{ږaJ$jČ~*rL-yޠym̙  /F*=.gs<ҭ)wX_1[KhljfYl*Fz)>u)xYj_kr1m_)3?qmoX5Yr0G k*m,xD6=.+6r N"#.UlVF2NjVPj+X\brQ2t9*&:6UsIj|t$_HM. ~VM%&Soo6e/gʥޡv/J@G)ۈ-r vCv(HУjkg}ߋ:3]NRTA])1 h(ٯy ~mQŏ:Bi ]?5rKV!g6w]]c6s3k)K&x[T`diXC($1s,kA"ڽ["0Ĵ9]H8M%!NG4[Ł@dAc̨I0~eI,5G"V/hbI\wVoHc}yp~ιW8p1:FlcwT*٬k4?P|ttWsßaU}in >X-yi3/1|Pj sxO7琱=+-0+046>讞Z*1ok֝}lCL)9&6vȭUMe'×Ջ :nڜbgvBGџgk]I3!8̼}d_1z5ueEԞ-m~{ޛDXv)? Px ڱX4)9άPm]Ԯ;kh/,_P .JEpC)8@UŠwrOTcVs!v]@"pgυN1.w0`qme%)7h 60aILRɲM?Q[ JVŕuhg#=1=w:7 31/_b'J(mYGOЩ WVDwt_P9q!j5ul6@Xp&AdY\,J&gV5J6[rJ5+#$ ?%EM;b4s-m8rM~ BP@Tӣ1`Ǹe|"մcDɼz ,lVk vsk&ixRGXֱ!/H2|{+BkSvRBЅ@Ӫ^*jZ,M{>׼qmKʵ>biߒ -Qd\LS lt{~0ʮ1()B Gщ߶O".%~xJYjQW45*E\Hc\hXA M҈g&) .hAN4AR b2u.AXʑʠk_>H. m3^(vVdU%IפwC+>FXGoAa463!JPޞYqO4 k[f*LZw B\('E,8,B1.БxRqL9O?8yʹjФo-iHh/.0=FYՆ|6ևd`7EvD4@ Q@NRa9*o1$=е?@Z9#a+=9u&萫&St]jtigA--#BsXbCcqzeiK5΀њkpߎeyf1 -5Ă^\*₁&C,'/Tk)Yj/Z+U$uN-L2}m0{sQ7ݧ̸3Û?6ej_yH6r̕XbjaZ z- j/pE` I;0oѐݧbЀ5\&Ol4jGBdcl@M6w k>E'm4Ѷk4\9omH+[QiuNEfҽśbBDZ9_K6g3x:]meIÈj@N944#Xu_{{߶}gEvVqSP"&B(>'8՝"[B ls34 dWFw)5 (|z'k^/UMK&R-v`tAlVu-V,/lϋ N$z,j+&:_coZa(xbZ1ŁS1k;]J[Mj ]ocHTyܶ`mㇲ+b+r RiTiiθZ{l\c/A6I&S*U' ,=$Udm+w:2QD#JX"iB%ù2UZdҔ,җҪEf xްGro%2>n`uXɈ"s閕a*CtSþJRj`^ =\6L"@LάĒEoXA,SwC:MTRKqeVrKє,iQF@)ΪV3(,YAjQґJ. ؊#B6TNPcy_M.3@?8r t?\,c~k|oQ#{: eMFp; #gn'x*$:[6z@T31FZj#͟`POqd*:s ~gAU67} .K1M o+8}+i@.,ǹ&@lJg*(>&j !;$?sE6! T|,x~% %ˋfi;(位 Ʉq2%D$_kN$~#k-77δm RІ%PI3FУ,D`؞>kW╈`K$LJsg#֬;"7RmɄcD>s^$`aQU#Tjuա Ny(u.4{n:sߒGLmIl.ن]K#+k337'-F}րD3s0l@{kZda Ye"$SK4A׮04OLt eKP qG"oε_ۆW/N0"5!% *ɪ1GؑwT+=p7O*:#= 3%FVNʗ7ѿ-\5FӬu5"]\=ΓvJVcP{|%?%E'iRq]8r8}A\(!ficdۗK4`SbtR^.նdYc*^jLla>a]'Fh+`H*W*ӝ'Ceu![^=A&V9^! Ȩ gWi/0Q4d@Q'7?coW'UsT^THPt 걤T"E .!=40>Ym-O,!p:DN2taȂh"S.Szª3Tb5oWc zL@qy!ϧ||2Q0y>NF!wy=QJrFαB+}]kTWE|]ڀҮLPS YL`״-wpA|HjfxW& S7.v5c%㓨V3d@x\UE!՛f4TCI28Go9Y^@xdq h1Z 7ey%1xqc]>eT#3Bs`ø! \1 RnFyϗn(M"G϶z0 80~nʮS٨\%ʈhs{__&i/dIh Y"{ؘ\+C IY@Nf?@(cf>aͅ5 Jrul ΄a4%h\t@ {E7Sn> ώPӯkpƳK C\?*=>7Gq&R]4Șl/ij/JMVD5.pDDףC6'1 T--?\qw Q'^XaT z#+H :BD}N9T^Sf&Zs?E`뱹nptGIU36[!1MJ#$$o43Jq&O?FJYt5kqqlj#巑ק|oϿCX~P@}Zm e?S c) ݡj u>?(o;gF}"zWq},q7- 97S*C4CɞbVFЪxP"/z]@6pST$ )+ѕ\)x4op?+uqW*u7ḇY:5Y.,Mc4Ԩn甥g)h(I͹{o9ΝiN;v=Z۹Ú|ܲ烚KMbĒbHcT b*浴I O7Ј13VxF'0NC4T.V[XԜj jq.N7X>Gv\AJ4mnC KVeAߝql\sA64|mj}(v> @+`)PSANAvK*uUޚB7;8!U@^7^;M E;hYV*cUJciYWWYhcEyz1:֪CG3ȝ7o=[SK=-uqE(2]Y?TՊ1`_+?RFn/%&8 ]IkDQ}wDUc}LN=|X,-r^~r*Ӛ6[ z-Z#}B~cC)9Ap9h*'IRUUK)V$_UUR̕HS񜎏0#֪6䷎\TΈjQ~rv<"(zcc |0\Hk38IoLcxmm^pm 0;#Cշ? B|~k^v@m{?%w.J= }g- }{Hs|DpAWI&S;:l{~$ҕ1QSbr7)9[@`=qJZ7֭2Q}FknwBl& !~^̭]A-Ufc}=,1pzDƌ(< 64ZO@G8p=!vq㰓EzsZKrk?LKFa.DD>~]b׉"n rQyf!FuFʂRT/4v~R- |Ӡq 5L~ : rZh] G#.j 0W@?ɢ0 V<ݚq7eW^G"2koxCDGPx{ӫFW]QTx`I8p~CpYZY˄ +Us(C<]F{=#Z0ӻJDTe*v v([b6p_8R⌓"ψG~W) bS䛦y~ƱO+M!Om+9v!Pךp ؽisz*G5^qp;pRт ݰӋ1GvSzۯ`jFL[ԦRNOZn$y,*DJ:4ur]@h~$^tB@-7/ޗ/v !,!)DN/aѓNh/h 雦'd둸z)KDQpIIdyV<[WSO5]ә)`|н"WY]EO>CC0K*"P-əC3C !s:?-Ql,Zp^* :)*?XFpwrRILa_4~FL vjړ6 VRgFe Jx[OFSK}(v!sy * w؟N;&#O.:hvن?;NdSbp"+rtkp$7jmUh F+ʢ~UxC(-b24w&l`ЛocNixJBr,?q^vg:&5Nɀ snr$ Ӎ(Mϯr qS DUÜT,63)7"݂;J1rWdδ1k"+fv1c|"$ֲ!F7?!u?~FaZJg RϡqrlKy2ISZo%rPOuw(0>Roӣ|*^VL\Yrd @ 5S@b7:a0/ɓW%Nտ&L@tQ uYzʆbu*-=?ܔx]uyRey)!ɫ- Q&;b4Amq٧R94FRWʑB{lp//6E%sV"AΪ lgQ:.-:jUZP(?Tm0аFΰg#Y4%;ʹ[ְdzLo|K߂f+*=@縋.ϙՐ]|nSBerMZ_jDë;?՟=ת*!}(_|tz. xi ފVlܠu7&8mv,ŬLt?/+/et)]eY3NT"5J ȶ:tPn\ȄվNW㞝HUdO`Y= ,%8R$CΗ'e$LWM6 ^¶ȉdn~g\O 18=/i!G`Wk-&Z/ x?*_-%y* ̆]T|}5x1đTmF ZLMTJu=1&M/tBEDbel@:TV^4<GDGX=<, {wWq:[S{z$6Bj1\*XiH %?tZ-;cxsĎ`UK\w|$f@\]ЊFy7?\!A/PUrb ͍3wfk| 0;I[&SΆkD3]@Bx4p(,B1̧%Ou& khĈբʭxFkIW_$7Pa75~ *iڔm2,>?rh ހxRhq]d!DJdC c׽L#ZEG kɢ m)r>D1=O1?s^]hಔH-vpD^S;]a&kjr!Bad8OOl}s[nn_5՞w R{#e씕 +;(o< EXxȚ +5Sp0ڂ*Eͥf$W(ԫVWcM_yw+V#Ax~rvmVѧ.l#4C! ϿB4K)ϫ6mlLߩ8Ǔ3:~lսK^X~) 2 "NvV mCJJ$0be# IpG+[eϷϰ!Id B4`립QPd< O9-mY}|-VhػJ?}V@腅Vaˆme[^qLqyt)aO``h:WWE H=5g=1"/8-B˧6Boqfm_aՋ;ΛV8OYqF\mkòx0Bnq0/CsEmS۞k^Ϧ9+7SN}bZ~*\v(IdGl\ W-Z1/4Z|Eһ \HMNsդ-a5tj53U6Y'oQX#}gUS_f%#EYhIUqryKê,]ԯ9LuHo ZvA(-Gu=ZYP"0\׌Usīޫ)i#T[y,U$ߡL”ÏX,\sTc` gtdhxw\9Uaj,ɂ!M>Lϊޚ&?: 73GTVY#_z]; 6eW4S4t"dөSM%0#wh}tawT WV,]6ŁO((f^E¹S+h=6 k'zDrJB YJ*4zPdx᪩/&jsc6g;",E9vj>o?:!ǜs'C_$ԃ8AxI&Su%)kjB#L`&]ت:D7k׵6J4uWYIVlS`b=N^c 0GAe`i!7s!U؂%2V꛹[|2p>(lb޺<6m_fuı* n Iaos~\L'J5!Bl.s{ى"4;?-SSqy~%x4D%'Di 2h8V}TPk^ (jX[ '8 Q1h$?.Λ/f<0+rOqqb w`=HKKC k*B1qgBW!=xI @LQMxPK1rSm<9$fqo>I0;[,#YҞRh'V Xr2N+3gQhgiP%~^P[X\jR}^UW3U< N=̕muFg&T5mh @c_ Msu}*Ɉ Q݃|_gJ+;y(ZM da"ތћd"]Q"'Ob&u蔙wv B@Ksrmng Q8r\h7 s,9@ȣӚIa;tYfX9H7i;È<锲H]pERƛ`tі9eL;Zp|]*qEĦr8cUoU;pM#Bmv=n4::ǶSvHeZu9̽#{mcYN-}_wH^LU@hp=dy-B=jE]TR& )!l>Y!Vv<+FzS&TwpnS"n墆y^f;QIc]6u_᥯Ϗ>&v%SILUkW=m-En$8}p&#ߘ,óP$ȹ &5SS:aV}b.9^T;Pn.w"xQ l/k<zX0PFײd!dr*Wg$h?aisU9#te< k; k%S9 S)xVb!B!l' N".ROUUх!rv3X* $N:Sq罏9/ HN/W[݌~!d7_U|? %Pu;a-[D?/{xqa뿚tFoƃx3MjUZP@ ׫osj'?`x|l[ /ߌ0 πv} Tztビ2sDcsq23(wr񕭿&w2:2&,n̦3>x',L|%9r~-fl DN驃/gC_(vpe܅e=gn{e;n+ İ)«LULIK,1J*I۟#ug80ENz8UH(EaYt|${ʕW)irl/*`+w< I& (0l8nY$<'A%_9@E@lsE@ ۪ٷ!h&ľ F-J+HAxM`b &2oRa%JA;Rh%kZEC9J|Jo%iJwKc̡W(pOfiz>2.(jӆC8rOFimW)0;ȱ¯k.3T7"xlLK^zq:k@aFi|A5{wE'&-(jo_bhp=mIun{w9T|Vy-Ep?j@]aEy^DQ23Ģ #7O+czKpԥe?ڶ n A$Xc_;9m ub7򎫘ٹAh e[l-X9m b;5JRPW a vH9hmv @J +7 {alP4LRY/_N//ڮߧ=q5Jښk~>>x4z5!HrE|݂9W b&Jy{&'pV>?XtL3` Tl[G >KW9 $M(~Z'hVJG ⹳vr\Oh'?y:yM,o4|yoAG跼&:V>qo֣!xW;z&a9Zz]EC.iLxLRg7rѳ|@|\,!^cgz<^& iy;0ށDlQW.w6AƛYiYn3ѧƛO#U(w)dy8Rb5m{@ozK㽘לxU> {/;AI&Sy XÀP/ڝ捂g[qA ͵'^o#,a#,YΣoj뚮˓*GdF(Zᬿx( ײJdp0^9 [Y#H{:#HKPE..ȦL]F8O}DA.^;0o Si Q2 tֆyA~|QTn8y҉}NӸ~.r^-/tb(έŜ<p+=Es!`w=iCb*Mx]qak 0VE˯Xq3roϯŴṴnX}\,N cc )#ț9_\ł- &OkdRGJ TC@M2in` ݿ:yƙ,qs68ڧCT!hj 8ۨ(QRZ5Pl$/ xfMlpt8y",W>|"J+ePV^<_hfR{p^44g[nI ҽ X#r V|/4+܌XD`K6ѐkb(g} nsY0έHZl$2KRuv~g\Yyz'|{xCMMү1M2ORҝhيc4o-&tnrvxsgL;8#IvS?^$_YR€E WlS:E˓n2gbHNNLG *:YVHo@ye2Yea p-O_|@z`Ǧ!=o X5pJ-~y(@`ڗ'hVіY?*oU5bP .:6ѿFoOϒ|Df:k *pD.6v$wm wiO,ڌP Mo%tߍ@ $B<SQs9Y*hl9epL=)mF度9P,UK7:\GQzC''@SV98GP.&s G~ѩ%2L",iYV0f骹?gIBϘ$yR :pCm\jl21{ oQx7ŝ1T?<؂ɜ$;ۃnc>23r6W,xkBSgݷE{yb[Ne;"0T r흥 Ov. z㰟7c"h"+ s/ INܬnL[i6fH E Й!E$*0ćk>ߤYQg`́Szሄ  (Wyxjn&'"g?uI3YQRwiq4\OLF@QUZʷIذmʸuB5[eIa\IiE_:IЅG-e$ "[ʼn:icRϙ}ﷁq&VA?R*J^ Ү$2O?Qb@,='uEsޙwҘ&p`k?ryWx U=哒_gݯ$V";PӍVaGw\#r.xV2: NBf[3Ū8(@H Ȣst ^Oѻ.vOdٗtK(Ce֚|WQ)Т7  /U3 w5~Sx y1-K M$nI$ ߏRr\t kʞjXjdx!P0~ tWoőFa*#ԺӂL}t\:D†ftr/3ROp$ O6F x؃]7uo2Md2Z{#Mv # !|ies&c?9+HYj_>32W9=&uL~ cc"PoBm ')ܥRBbu$$9aw 1>-0?Q­>#\YU]I8 l.Jmt\X|C=͉nfXqh rx&+X 4ZUfG]f Fb w*6z@=nym)KN"Gk_v߈9' }s܎*1Z:͡Pv(תFE9\QQհX8Q+N}wΡK2Ɖ]C7 kaww Bn.#Q>X6sBSNL9ɷ 92蔨W^]*=d-VD8{m\O/ 1_wՁr3\F>Ņ{zZ&?SR~p_PNيǒƾ:l؜$490B3=σx0hXrɶMar4)Mŀ¿D}]C%Ƣ>m[_D)cjx۩xo$\Qi7iSuq1~5^cš35Z2VUoÛ4b(l G;yyޮU27Z-~ 31Ӻ#{*AAiw Q~c9xT.$G\RtNJp#b7Dzg\0/o"/$=\/CYL-@ |,VQYRy ?ӗDPI T1K> q!l[}dg š(q;7ݰS{ӗ~N.'$n Įk!U%lwcxah]iJ/Ky[Ĺuc?ci y "Luk˲ {_($FC>TzBo<߾ 7՛FE ɈxWh`| noZ0YK+aEI¨憎NƆ>8#)h'9B9Fe؊:j؇쉻CLIP+'eK=oJ#%2w J/èy#|ȽSyQpdlʠA&:#_pۄП?(ܜNUQ~x 7M755`DAY'.$AS#R{NRI1r^_ =JVA7kf)>|N6CD7I֓9lL5m̛)Rcj?9=B!)ԯpwscL\&cDn s¢ؒ?_{TL`>r9Q`*})YQiCWϽ_Are7okF;g=\Q_@xyџe$ދi2AIȜ /BE~41LTV{ 7ٔsLh/iB׋Q`mZpM|({pn`ʹUU%BPk[ XKyp=9<*hvQ&U_V >IK¶ j߈:E\׭g0+Yk 1 fu EpG;$C:KF}MPA%z{bxJ;R"cSI @a9~p&bD;px"UjaW3&Z*T {ӌsfGwe~F&rF~?= DMD*2(RVZYF9ED~$X+4tD_IWnhaC)H]" .8bhh]?8vPlsL2Hb Un/ڤQXQIpDOejD$kZ)*n}){/&i#kCaT6?~CZnϑ$?l\FZ6ampu!^\iJݤjEUMx#>z<PMK!ZҖ=oO_|/'c !f--r_țPEnGB%b9A3N־wW(6ak޸9jv=t .&+}! qܛ(MN"^3Ozzq`s=-FuK)uu iaѯֺOn֓,!@Oౕ_HH/m>y# h: qZrILJ 4ZqvuYBBi_MEe֯MqMk= y'M $ϩ!#nrַ.AI&S<1Bxsp)ܔ<9{Wdlg[mX[9'$L)d*f)jYgd HVO9o?6Q<̗ Nkqu h޴S5RT&j&@to/:r(P1Ѹݯ:2AQxS_q ft̴kM$:N{g9sȭJ}lꢹqy/5wtCwA |pS~h"8 Qr,/Ҩ?bEv}R(.HUrKXҔʿ"%$ |[EzJ )*!|-4"~f?vf›w38O龹?{YT4t3(Q#Nq~\. zZ@ty 'ٮ%@@IekG+.Ι)H>W,Eg\Ł(p'}G)iOl_h W i_,O]EQ0 >v ݺr˱RzÐ>hNn +jXie1!0Z ͙•R X'+\a*ff#ڢ:oaT=Tʒ²G8(ݦ{/hkJ_bDCCĔTF*/4~2&&eDo%51(U\Rݴ.Rf,hmY {@2zV mOklR4Ous1HyK2z%~<J@Zzת Y!_o~sYap~"0"} +1scÖU|Wª%q*ߐhDT1Jn})M<8z T*@aD5XvX EGtײ͖GÈ%'=d:AOE0f\V%5iO\ 4L} UH{9CLcE`dؼDh7nS2lwuI=TIKڠߧDkxf"斮X9,pc  &*gCҷ}[ZgnVd[@vŹqnKSTۛ.t{cOD8gN(ka^W UB}nZs5N?nBG ,W ˒Tn)S<٨9R+SE bytݍ'l֊+}zѧ iEQZ<+4u%G;*ACT.U,WR& >ElMug4KQJJS&5!a3#EQiRݥs[اYO2t*f?XN9tƘ 펼2 bED _zmhGcb[۱yf ~P(orPjf!=Z1&DEBcEoT'S)gT=ULiL]7"(f }wc?t]2j۪ޝ>6Ϣx#eFbRm-<JyꟂ%j[Z7A7Mխ:'ݟvg&ѬUԃ({^SPOkNPN5ec0(dֽeB+~z#pS>l讇NE/1Gc{6QV$?(ۧwǨFӓObJ9/c=w*3==pEo7~/q1淿!w鯙tgߨL* S@S^S0@[Nwc({#tWa"!eHE r 47<%LA7N5qhBnpq =2F^Ua{ -M!kSaM&qIgYdf4'B6#1ϨkLa; A~t;1 Ms7s@}-(G=&^KU.:3TVHDQt?aX{HHR񍳗_LL^j}LH_T}n-Uپ `mRcfϣMbL$!>Ynf{^n h$ SQf1ۈI-Hݠq]ϧ+B%Bk ǽ0c9fku"wJh㰇+;]2^h"$[&.Vܧ-~c Z聜ODoMN0Cjq9tkq|GJF!Tyfh;2,J$;h+0Dk>m6JV| fI2] ^/E;NF&FXWGG:ܴvA||}փ,Goah盪/Tq1!0ijj)n>wJ]j85+"O>5 :QPu eV90aMq?sUx؄ ɓq͍硏,XZG41x؍ i g(OޮXYTCh}oA e/l4=g^']Z֚k/RXvz 5$Q%u{t*jp||H#hX&(U]sBV~fMBzs< ܸ])VR@ 1>K_{3QS6a!|HnHOy3QW2)ԯ `}&pB9%sfx'+X"OGUlG9 iVd: C.7wF߮56skhWi%Ҕk<-\Ŀ'7֜r y`08s~O .#ww5BD}ăc* Up`|:ۖ&`y^&Wv%V.+݈i5]!EV_ÜYnD_^uF69k\{KQ.a.}N{y[yhr|xdU농6ֿ]:2/T+u>jM7G-7_=j>71 $![.к,:ضU蒸Rj|4NyD o#Ji٤>C\=1aLfdֽuIf^ 2ܦ%'  d2>E0hQRL&$"<ۏ]̽tPb&z>9GJ©bJ"28B~WP+bk$nKlǀ1P&[>˲ix4Y֨2[i\s { &3VKKϻK5o;~E*{p6+(dv%bQ\ bO6NDZ[?BD z"tZ0bj(Dhj셑'XJGnQ0vX,-z;*Kɑ/ciGU0gnPhuTc>҅/'#,ֻ_ ^V#S._3.LlR%u-=hŌ(\*w[!A'4h+[*"=M=bx8`8 ތsyoTJvZmn^օ%vKf4h`ڻ)I*8J}5 \f E|v)xs ^ae)uیjz 6ުgĽ1 LxltbM]\CÿSG w7oɖ{<#F#;6N\=LGe +}:@q ۍ`CE j ;5K+! l4 ~mJf$Ps Ԥswyc%&q$Tj+}ۮ46&L%T!z(=w-[_?CKXA2rQJPl+ 5rRqO }-LQ smq\,W(dHV'}OL5^M.ѥ-/iZRs,k fp- .9b0V0y{|zͻG5U 8v-qu%oZԇ,\H4.`O"MPl38YPsځM(U"q8 Z26M3q(HT'O>&b('|Pn:Q`%=\.b50,؃or|q>,*pFt'/]{pjX_vBG- \Z.J{)2`/ {i+L53U}πܾ/(}%t/B'&! F"K}%fɩSs٭sgz |* դrfgOvd ~=}M5p59 :;J<m2rx~b8,aw^՛G!gK S huS"r;LW\Ew)^x:k~şa`ScV,-$lr۫ZREH"!/dϺh 2)(8$ nWSEE5oCi%iw׼DƷq~rwNPt%^˷zHQ?\'!0a0g3cf7u3F}/evdY0hJ<Z-޹-Fh.{ApM[t*A/wG,.򤵤)7^6EA"Kz";([4լl{Y[k̩Xx܌\Ki[#ĺl,F58Dtӕd~`,l M0)q3 V).ڟq6s>.a.DG ltATyo;lsj\ <5,?W-ZY3-VbMeiKpjre}1eԘjU4~-7p,Α|>l1AErk0wBChb]Jg%yQȓu@;fIBEB CQMe[At)gvG[uكM;׋3”A3|h%[\ jlBR&6te%}@s3x[fmQsKL+FL3|4sDSIVAdHuvmKs\$=Ĭц1i# RB*/-~m7zɥV{޼(w(~afi'Slm["@:Do{CjK_ A`[7ּ#_ԚkrlIg{F8 p8F.'jMw~e8b]S7D]3NOʺ)ѧe>|+N NR`GWcc4W/JAYRbݬd0MLՔ 3\u$SgnmMӟ_Rb{ýOWgZ92$#n'i;-cߖfwDuup>8!:  /–==gţ 3$BVBaw?!/1pX9*nZoRR^RU3Wy7.XR]9aK22.D6Hڶ E$Ԗ Rl ?jL)j\(*{G` {˺?k?U:jkiz{h $Ӑ\YsQ煵xwu+Ms$%fMDnd't .~mJp+i!"KvH?/[(r.hIyԒ*S6*Yƙ.pǨle jK2H2g  ԡ09_*|a#gf>sdha0ѕ?7<&*RQAFU9 h(6n60=, LgAZFF'/x"@Pc831M-]!W ۂɹ@\NQqܹnF˅ʗ,? VEU 5VFAt PHXXtҝk>\Fs$ zة_iKWArX\E:6Gi]yfTAn$ 頿$WK]1y^59Nf:\@IDJi7K?/i'K@W%)ܼ7ڛүĝ0 LV7;H̸⃳-۴P3R'FjE4j Ҽ*xq?t[^`Bͽ B#fGn{OWb-aJ_ gSU&zX7ȂX< '͡hvLA#u8 UV]˂'LFòTQHv5{4'i)SoÒ&}P'WbAD4(Yko.1~~6Wq6{eοvN^xid ua-Ls؞&U#qڎW6x'L0 V >&8VAh rD=ȕ׎(#Z3HP JJdؘw};{kEJ&۩&33]D[.~M@\1G}{HZ-^$XVr-.kqW.zV/sVvPTC7gfl.B<^mu_d[KN'p[sshَ>$8eLq9/~<:/R-;9jP!~ 9LJ49=鷺u^*x p~-`7كLbۥI7$Z6- CϼiN(F" 8N ;ÐJNMvh]:<~8"B9)l~2`7{s@@n9[}]0+63 4C_'{:B4c_;•>.";T-ªEW;Қ&8|b0rVB >> S!7''nsȻ,+i#.P$v&<'.cs~FH3o^ɗ^7OaC}{%vjEn olї~GQ:loB/4c%aovh8_k\k!E3+X<Giѹ4C{cB;FwئOh5w-Eply{e '!\r,+ n2UH[z)6)qϡi*Tҥ'9Gw>F4ӻq6s`$QӓlR6FZ G:3_#{}GW cv8 },rr F(exS$%nycx\~܍P ,R5⛌ZtEc Dlj1 gEB@Q 8xqZ񽶤%{DWQ]K nI^IxwP\ݭ {^&OWw⯃hJNvnl_x7hiSfhR0!eԣia<' nl=g_/ϙs<<h ydY"j>=K<\PU+.?UXām3eu2 NUL\} auҾ.qNJ7}mvG\M Ngu&+ N[2mou4q=ˇhEj+:IP b,TKYJ4~Ao3F2s _HLXW%Ahˑv^=+ _y6#s _W#Y0W~#Ρח;wFѯ6]9ռfK4 p 9w6V4{bPJ$`c]E ?[6v^M7#g;Q@ӹADT$F =k>7>4i #/̏/C,F̌b5-C/|Wg!r )fy+a38W؛ªmK* 1+:b"w`-ԧCJ|%OFkJ(9ϙ ǐÄGr#1rk!Zz̓,K֫!U`)Ij1J.k\ȡ?- TVx:t\--⽝`Ӷ_z=>o`^@@Q> K?m~R9ZuX 4,oEǡ&ŋE-6uC4t Tn^DQ[`9We9ٖ!R#֐^a%9K&*Y!఩^0LtB]9Y\eAd%WǬfn~Kv8^m{ =b/C0!G\uE(f9 ̎W}QH;2B]g.6K뒌 Cf)?f.Xwysiv5Э6ʢ!᳅LcĵqagQU:ĽAFS`Ug [}H`s wP AHj$iP$8?g6i;jih98D朴3乜[M4/u-DřQ,;#xyJvLJ|` Iqk'G)Z GGs\O)x t8#4+~E&Zz( Ί"NM Δ_R.1I6,'K T,Ђ4[˳//3\7fWK@(oؕGU @r%I/a|=~qDS &Z3<6_@OO5Xa& 6MۼNy#R{aT^k~=by{F,ʹ?MK>zcn^T|W.F'>,r?(qh;i]ۺh㼛\lHsӸӀ o z>ts"@TYN@=OS|UX*Iy Kr6ƿm} ͬ%T}fpL]9b_kSqHjbjI9Ҥ4?t4f0 sGlk.V7^{`-#XY>ۜM|8a \#(^!WX7_z%km1jp 76wLvPu1co b h$8hrKѐ'>k;i`8巯AZEȍZ?1n/u7[F?G졧ϑXnPj 9^ߣk_X͒3w;0&z| 8=%M$ vk#Q1f1u%?$e_U/#Cyi|p*rwJw4J^F׃{hj%2 QxiEL1u+cs#|G&щ\oWHՆe `Go}rq-sԭTK<  35J4ls0MIթ U9mZ+ Htt{W,m 4-+K4=Օw wy ;™l1h$r:DܝCc:-Z(<~|MYtϮR'/b49O`F.-쐭Rje[70o@c4!桠^ -KO.f񅿈<.J?6oٯ-{I̡e¦hoȥ7D?Ȁ¾J%,uW {LJ(ùƦ*V3IVn;b_ۑCSKgձ=xj?9eU/[s8u+cbKfڈcEEkF=ܶ/W 4.WO %ґ%z.Kw!Eڒ6d09\tc"oe(fV4:K*]c61D}iS ᇙhƺv"NE^D}8 91usߓ:nH%mMϷr'gȳl^<(Rx[=yTf,0܀ j|J JmT}4+>Hݯys.Aw_ZrUf4Pֹˈum-&2. "yCD2E@Z g,Q :$T;f`jp 2}FVj}?j_f]h1M঍?Ϧ|_ǀb h͸?b$7Ƌ0˷٣Yl߃=SnyonY2lnmy DёnLoXȱFB`G'bwAh/e/^jjhC쒼VV:3?f["B44Ϲc[z9(QGfns7nc4U_Q4Ծ%+a(BdPb4\&U s[lw5$ݐtTAI&S8ʀSէ̿. qU'Q NN,!ٛ:GQ{h/$uKH,󍯛jyvE7+~ǫI 5AA051rPݪK@=Mc5`<;M $h%$ٌ+er79l@kו(D#M&FGvGw:xm+ClM^7ԏNX쬡WGF=,_ViOSqET䔠30H ?(GZ%z<{PI3MCD &AX.~d {^_Dh@&vH4![o=:C pP9*$k m"d!9fvD=)U!щOHv-gIw4PFl<7j!f>ę/dg1%)F݅ٗh^iRFTW'ϴɬ G\ST`@p7nhR`J/tW"I>CY(OGޓ'X6˹/~s+gYt畨 nAȵ61/fs؋&Rq},1yKAQy8?amlvN}VQw^˟OTHv[8 {O,$ʉdX>b {2P;l*zMfz&p`>b:ށj;e3cqg=z?ȍnw<^Ҽ gVVޝNFw?DYCofJr;HKj-Z-zj vNѣU{SiU#4O[#7!Z_b3auP7? mF%ƈx˫#X>j u78Ͽ$2 HHr sys?IH;(NA'eQ/U~bZypxe[7DEvB$$ިFwhNhM9^o 7ʗl4\;׳!˵ζi AE}ӗ^lt\RIǾO~s~,dk_)w(^#@(S.t߱}p1T"+~5h'gleRא,;04{qT Wo 8]t0v@ܫ݅ˆl'lmJArKܽ饼zB7GXMQmm @UilGM9c)acP.IJ'C{x"&&EGQǃ^a: E^%9W땐-zmR^E!d8@A(%Rg+}KPwBA4XVar)Yf(DqAk(Ҽ b7Gh@cR79S VbAJ%2D{?k0h9t*wc˾ ss#\x|]_aHڡYvjݔ㽡۵?倿Wn3|$=n<%l xҸ*P%\sa) @@#䔐X]?`+GoS*| hq`HDt2*spe 0MD/decmnZ[T,X <6u2W W!lB% eUhCe񏀒P_#,H| ٨ÕNzP a9b+K Qɷׅ`DWX@F]ӛ /Qunw^m8x#VJΖ&_d=Ilx |%kzjNjY'5öRjMYL~s}rOڷ4@TI{+i>a/k!$?InVx&Y^Am@o G l 9t\2 ,,+Hvd{KݓlOQY%SDu#ZN3폞V<3Q "'"oT5}hD鋆kV Fӑ 7bN1z1τÍ{b3 (?Ÿ54л?La8{̙+ߏC_$7h㫅k8<ɰK>1+V1W٤)e e/,zwzn#K9whWBٛ3&Xъ%IRWfQ .@2^vN{ avPμtW& ~4g\ 螕):5ZCUTvD_Z`$BHH&Jx|e1kWnS/;sF跛~XZ.~swW.ЗGWhعɻämc6\02cΆ5qnqO M|0;'n,\[ڲb6_}5}qxXIpA79SReu {fpae6|ג^  V7nbኹx,G?<4e@ٷ4bIp=eMv資,sä7TiJC Y1dяa`/nb5ZbP]BCQ$Kލ Xc`#jteu&(T\FT'8~-EKt7"Ե4 uW0hBŇb5Ѿ]/ [1Z_ bYXv0G~WbtiдjφEֲ|h[ao 7~+V-qMР_CEAk3ė{t)mrfrּM]IvS|?^{$RUf/#DeuF2k }&rn50hFo1ؙ(")_gVPUw^޵%]9fzlrܜRvi@9,_Xmbl eokvzQ6NwgX A3F 9cG|$(}1#ُbyQy*{ax@L5!w}ޝ% 9DPMpғd1'Jd-}#K]{ }p" *,/XOjTn, rXZ;>lt<Ԩ_eQ>$ַe4x.:^8RXJwC TDNK.%Y ?ݮ=Y9m%Nsߡ8󄙝*%@wyk؎ o>|bK.|P0 qHMLw= zI٠I-vlc 5zJ`.F87DY*zP8 "j-Iu*yޥ̚RT͏pwxՄs*2#gbC"lRa4/`?;=v=>.7ePHhD ptctϾh.eB%eg-ưՀ8ATo쯬*gU}򘍎|e.C}CR"aʲ+ZsZQ.řO5йcX0N0w<.#FJ֯ƭm_TDpRaʼZp/GAE<90FK*qXe;@=ҞR#*ZcFP}t^@#@}ht3uVڔUĎD1U}Zΐ' 2y˹ $@\a(nxnsFD";\CE͹0}wsy̠/"D;EK2a2\8蹨 fb2G_ ^_^?FcdՀ?jCX+\_/pE d?$03!*;A4}|Xv/Ǹúi=QLW۟r'11 ܀ߠmh=]h$lѶ&{g)G}`:PkQMw0:NU^/2-se3dc22cֲ9qJޖ @3jkd"\P3 2>Q" { ݑ%9S{*ڿf9zXY&Y6;PiN0H 3<)12}X%b ("Ce_ un{֏<>hbW]Q8SϮT SlͻЧ*W]YRS3X1w#sxM+&G̀#!|LR HNiVim!IΨw:~%l &`5kwKߥMb,+ƸiAͭ7qֈ<_d,%4{V܇ @%š0t9[b($ȫhe#yJpC$utEsB+?;Y-Q6$ve{Fҥrq.rsm=Onk3Rq$/yclIXU,|C²_(@GҠtSu2Qd/Y/~fIY뤍ÖPcc].XmI4>ИUsr8Bn:MʣZʝVA8HH[T)}eqS SX7֜VBr53q33zpEJRԎ\-dSfۆE]U=0>Ys#Wcmd.~W}'|+ҔzMQK +}zϳ4>y-w| GP׉6/2#lRBX~UU KZ\ah .Y{)&߾d;R7S\VU`cg4&P^2HVեL(|AQU1Td;!j'6[,Ѵ.*Y)_1d6e.Gn~eӐQpR~B5SV pBaOF PՄw5뉱44X(e1jxi͌> RYCof){<[pGbMzuZa\9e##J5QZgS3q`캻݄q-L]"JK?) }r R]mSi e/ɧ,u( D5RĠ# I`>qH}N'}G|$wf{#wwf'}%71 ~fq7dG5RJ6ͧ5 $ !K4iڗ0>oY:7m2m!Rvr(c^Oav_LZ܆Z;0esoHӛņ8|cA<$z!GZvB-r:tHDx|X)CP>G(2V(٫ѵj-jOⶆ$r\}lz:n'%Z)D _5dmCƇIj*ˣZFkRʁ3 4%eB`ySK'OLb-AsºM/,fpS4:0UVVׁ,^} УBV_ b+N ߟU.ч杚Yg Hi::0uݢ'[S;P$Σ8HTGy/O mU@ZaDWOδ8M%!b&nm"[f?JDX,,:p8 ڧw0ؘj/6CQD>@}Laѭa /aљ*{kg<9m>d/P68ƭ74'ҧh'qZ̟p^:z:5?$Joa6|bhc*]<^;%+p5B&tȲNxꂏ:߂r] 2v4S *ל 9 $%TgDOIVTaOJ}ώe9@fӧ Hs[QqUZko)mBGv ,q|lOk[>'eobVa#Jo(iNF‡٬>M Ǎ=Od hHTL.l1^TǕ8<Op.Z,|%5~ 6)0`9b]*M.o Hb&ls_{N#؁崊 }-j  3NVMGUstY7tЀu_^?=>l#_}4bĦv`g()9n^Ug&>J^&RySUaλŴi;dҙ=,eI (jLH!anQw1!ڊFٸs1mOc]bp{>Q 6{e/g>~oEHx_ ;{ፁTc"h(6T*shԏR`: ;3rꤕGuv[;A(HIEŧDc?az`nD_ᔮmJײ\<AgZ`buD`VH!h<hzH65B ]HMń.jl8ԭ8* d"( ~_h8$qؕ ΝdP5>.{ mw\;?yW/21}Ҍ^TTz>m!(M 2㒪RqOyp׾t೚jITѸNg`RPcܨ9q-+zAB&K5KdA%Nt^tO OSrZsFDkƙ'>>[:\Ԟo䞭HX0Ԕ7Hp*K-Wss% Q#5FE/ujG}EwnE,6-du)>X8`x3m?_3ԄɶT〖 Ԯ&sEpaaܣTP(.Η{nX[w`*E#W@YSc {kNEΫ- oZ0d|UԪ$QX:M>" 1!Mz ]$U=`֦Jb~lph / 7PαJyuxe~ýE_?G b䑈>*R ?>+OŋwBb_$x6l(+@p \|܄u'hJՇ鑦>la\jb`yU}W@'ojͼ|T ~\ $HxVOݑf`o1g+p݌gcb{P9P1RpK)o'4 2UhX^6fX|}]5%6uqD Jc:'ҐAf|iEVa,B_{Up ?"1VڒGGԛ#o~4mԣ5( -k~E.7^=`gW׺2 6qK*Q8<'5W'.`D֤m篞kqYGaUP:?m֦ٺV^K>۟})E4P}#|h Ķ{CfᾬSL1LLqY܆"K|ZպJI9̾IY_y-C~ LmdmNI?7NJ|2EIwrl*ޗH0UCęYh7OX(&zfUR±y^*4SP )9G0/XZJԽx~Xl@`i`rAL6Fjl7Ƨs5. Ѧ!WL n6lu~wFNRLRz"cr@{̎ucܙ*;{+K͇ :3#&P 1`cqpy ywȢso~AjB_3"^[omT+5oR<ݥo,R$O߼P\ONۛyAQy-0=3_itmj~OcT`Ƒ6ug[ AC#̡ڃp̐fF^U*e29Y5ls4rߘG</AOIg/7 9L6 U[l`SG}J}^s'BRu?nYM^&v0G ߾w,6wj͒P_Fj(b@D ޻9Brװ.#T*^t|usg9Lpr5W=̔Em8aU}V[I>Dp-"S{Paf|l,%ssL0BZ E':(O#$L- =Y *w@|̧:|cg7 % (Sd,#=-g;< ûhNoOv~Z+qJ͛d/&ҹʨ[ ĔxJ᫔+YT ;?, zfZc?~e\ (\cb̟є&.INU3lO_#aFHo%>>6Դ?P׬C5e0IB|ȇ`El,-*2@YI*| Ȅ esiq"Xe(WqjtyoBL0a3@"%*PWa'=a wPuF dZJif.ȇoK.+abdΔp{DYλXÝf_Ѭt~nഁfR@D˜>P <b~A^$a۷ψ6^W6y!yFb0TJv{*cpUH$v6?FpEETM7;'wМR0UJ8!޼.RJ,#tɐdj^qGl\\G5Bc)['1cHU)9&Im1Qs?Q]/T0UzNi]:݃v[,ofTvusb.Ⱥ5t0M$Q)t!y"$Pme'Ow)F(k>U1gu ͫFIzqh_TF7^ ǒ_r$@ Sބ~}<-bՕAQ #5tXlוžolno-Dr;fz?9 T5_ZuqDb *Pk+BEa=H|'Ɇ.km*FxNTp]ǍudeR[k[hL>Z G6cHnđO{~R0phEvjCtIzI71S S,S+u3\vַ(Lavdj+] yM~Qqk/zWyчm9U%>?YU+M#is̍;8fv<;Kыv(҈IS,P&)}sUl EMnv6/۾y2"&z a$*{,KH`K&Yz4){rv8?j"rM%\&= |-g0Aԕܛ{gLR" g+&`zM$"y?~immf옐@wTGp|U$^92YMmeU.ꤋ"M su:/=׊a2W+?#j䧬1X&$N#X^:6g)KBij +fWe) `Rc3%%Colr;걺&,1JtEAZڵwh:0R%yJ)ek:/|TXG_p!g]ڟyѾaC)T;b.g)FA<px2V4un-⥚dE_zq8b[MlIcUM\mMM GV.~EKqGk% A>2b?=rx$Z2Tc%O 4sjq 2CRתl"BケK !}2E $*{w`i!6)3VuG5L"98} MzgnUMPF>3Ws7 y;{Rbw%8o#/z(IF-}Z>r7uP2=A=!7^kj菼?BJq-PK քoPXm2j+E@ky$߶kհBFS y5~|gw6y3 ؿ7;Jꍉ~O nDo0w^WFoje(ZJ%EKʉ!(z^" :e}fѧi9>&{,JzȽ'i0;<=c})zmSyNJ&r>-J︷黠!P`HuN堷?7&QRZTULS^i/dbqCŅjv+-Ӷ,5Mx?縭 VJ"}B`E': $aT{i-4\RΥ5!E+@Q#3u~ܛ3-펬 WRmxFo#(Ԃ:Ü:%i;ЂTt2Uts ؂jٿ9/Ab}`$Ac,;ӕM2g#\L-zn*]5GShڮЎ)*'.BF5[@XaFוiF,s˶z5$o7c<:M#Ib:3Ѥ!3;%NlNYhX̢ZR gX2SmWpFv\i," ne׬{6۫i,+c/+ԦܢVW>%U;l1^.ym麟)lG2 OF|?)1% ")ZOoN޵CĠӜ{ke HF2hYarHڞ2Irh;QYzAw?HcѬSQh_Qqj)3dL o^`ajW'dvTOd(j݋1L7ICPv氛q;~gaNljr{@P{Mc 3[Hs{T]]$%aZd Ԣ$ brnUָF[ F5Zʀ䈤ڴ-T@".`f L3$C$vY%sْoj~ ϑ@>%ph^b/ifxb`Hz }ec)FP~3 _ÒԲbˆIͲŗI^/y$՞Eg)KGjEg_gFE/vؽŹ<Ŷ Z{)ޔ+ Mg[C*ٶ0qq| QmHmIҖ 9#QOR?ߩNazc)C6r^U$YxnxxFј"Nvn 51H^`!2Nga"uVBQձ}/!Aw;dM(+\ZJ2'#YZpa,fYD=[Ԙ{#cGU8+vj}wɠrTurbVq/)(9<$Eڏvɴ"zTS) 1HI뿈|O;'#-fn3ggp"aUQd18Yy"0IL99{~jg>zBl,y!9A͕҃iݑy,1߼!nS]~&LOFzrcc\G1qp >~\ ϭ~Z+t|g#Tnf< \vqm!XH0h'OwOHOKsrEYoŀQY(K2!$jIAj Ɋ1vH5!0 y1bTl}+)J;y8} \,pQM\Hk%W9c|)jΚpK"z@}%y% 1Wtx4ފZSɞO@ӰȅPlSa 9H[-wn@eEfI;):V%_R`<^_H .{lp)UJ-5]W<2J!*r9=tdK[[$N1[-a:^87=/xo0Y-f\6g~Ot+u=;lI˂K.Z& ~NUEj5_d Bp&C-% )QwHB0:gk?~0]gwE)B|glHYr;l W(҆S#( 0hxe4%mbMD5+,t{ǫ΋2ح!tHA;m\SZ²GL{ߒ+4 D&wtr.ksq)<_u&QNM5@¤ yJ)V@. f .UU܋̋=VM~$˃4rAF:c<٨ F3X%Vs>Cφ=si!!i|KOEu_CbiI8vч5ic!]y^u N 2'5Wxh0\?c2\7LhPw+Ƃ?LUŔwpfJk^-dfip_H*-4 B}u j. EUSե&m H e\Ft-U[l;wJaY!"(ݛȥ`s;dmAF=POJBJ^NBoν%Y@AfBwk+KUq 9 Y$ۄNǃ]5e0HZ\HCx=6z$?C"UQ2:)pqd-"(\Fۼ2 xZ;M $LgE5PWXtgX'{Uw\iH߸4'A秦^c{:Eu3WeÍ 3|A[`^ΐ8EṆ -y۞G7-˿-opnq~pb'tZ+D$J0dc(S ebjBOԔ1QC}?æ ʸF5@0Hό jj'cR]|uh%WvbZi-$trgF8q06 3IhNh+o:l*(&J"v8@cnڇ_࢓䭣 @G#b}/6GTlsjsHAOf.Z?s}ߢM'UH<TJ$Jr<9-9N4 r鴉Н7N[6GAsrʻʳƤnLJc DvȲ&d'IAhmeC<95Myd~&8죁 ``7H#G\w êj$F/ w UJ_l>"%եT*hfݯHڡiJ *hF6bIJ{+*oavO) R:I mT'Y&g,A gZJ-b +@ s$,OI|=eYFϕ'L 1P|/vdžGM;9[>*Śo)zgϧb_#;Ji([*bvxA 3Vk -_. dcNNzaN akUcگ;:׏1 ŧ>{YaS>5)YG~OT$\)F~0x` ,PZ9#R3gmE:3-"[n Q7`|h'6gͧǀnSZ VTxknjz-MCDŽ m*E ^k>C%~Q0շ9+ 1&)sI0+Ԕy+Zo* 24_5Y}&Jed{%قD!۴q$_yŌvΑG_#%<;I/ Xu]Vǚz%$vZAoTGV]R䧕~f[@xSXh\-"! a[lJTCԈG=\RxW)!$E>4jHt`ey2} Ӻo[GWk,') MB%WSU:\]G͉^O'%g7`HdZbǑsbAcʓ(Q5dX@#òL[@ *gĀJ6E+D :`s]ecsQ o=@#;DcXEmѲCWԟ6́CH){4K=W|u;TYa":vD$!P'4Q_Xq4ŋLW&Gf1ƪHAb7U[rwO̅ri\tr1.%V܈7>\;T|agSe^zgOq3@XT0椾'XZR#︽ */عG>q݋?CQmޅ 8dl`]tij%FOIVkDSq`cZ;3ւ=aqH+me01):ko*q|{ xBe *T𤻫ÉguqF!T3o,_|f_@_+5UXsWtˆMw)wPmv27;8 :!c)K>Eg=#׍9['Qvř9N"I(8ˏ<2s'RzRb_[s ǽfF(-'!L6lY")aReZɉ[MHivͦ!US4-WARc\PQoGNp.5uV*7t"J/zQ2c@ۘI`, GnҦ;KSKx&H}fP;{2EhdgtQYisC'l]תQ\Dk5U-2PlQ@ɐŎY dG#5.SNb!!$`s}A@@ǃTNFe/tL  \`K@fn4b֑?4el`{/ӖPJ5,st>>H1* JLg#ou6q\U!6g'O)㇦t=5SO< < uz}$M[+\[_yFF`0Wk l>V<۸2F 8t*daCfl6x2b2hYLo;~mZ"#`1/;t p!'wVZ/ @983]vEQZ\ìE9Lf\x4F=t pkD[-0/u(=`FK 5vuLhZ A33Փ BaZQ'`5q$4xV^xm64t=GD8\(1 f-xtEs絟ts85f52$lzȄh/Fr'GK@$7ӵst4uiK#uєW3RxG/c摺F`Q8Ih,8#[.UL/!m 5G%c&j:tڱ0ʷ,Q ܝstU2%g8$ u֑dٮFF!V-. X?PnFWi[M(sm6H}VmX,hPWbt`ZY-Y[c"z$ tOBmX HJE#6\x[@nvJuF'J د0A:Uv_(a?!ȉĤEqrlp¦K& UJu* +.?ܝA)!WVû+0_`:ƼL;q]tc@~Κ¯݇ux/óó û'݂Nǧz0GPLvtՉUta0Iӎ QAE[=g:qشT6Z3)? _Sx*M2g\oENi|u|H1 -F%sv|uST=6_$I\ `_T kl+}*[renEU=w N&J*Z:FKsԚUK!{ҾbAݝФA:69ol(hFB]s@7:4ؗÆvɅ:F#_JKf@#ȥ6h&@+C3=I(#@| &Dyϟ7 1'+\DELj>>)ppUl8?*Ρ00#`t}Kꗁ&{Uj /X\Z`<2Ӓ옳~iۺJ~keQ٩I *3cҽB<a#*~ٷXƿI`l{,zjV],7E|ӿ07%rؼZp}$ᙞI}7zv465!$ >WU=/vJEy;ݸ~ѓ kj} ޴dLՕ`8"XN#PƎ{5,q1ivj{19wZ[WCnLV+# `0s6pa*ԢkQca|%U6A;gԵqV:\auJT3:p%\}*ٔQk>ͮь>w[%IDk:uC5#ݑQHΕ6'Ti;B\SqK(n_nuϽ j 4 &S>άhQ7t {T~VUcwq/PrGdo"m\,Xct ?0,<j/x.%ǝqSM~<Y:RF3P-{^$Dh=GV㴈-gHͩH ymAIvJC!UtjyƼsT{ޯjʴkcz49y֭a6 #cY&bȩ;eCoHYy հ뙭@!ywGuENAf !W:4 lJ="7GLA{4苆Ws^F}1}N~Y}trB[PqձjP9ch9&A5KDEUU]].nJ4ٔbfQ2h暱p>В)P5/>KwL0]w¼vDȡl$E8勰 XNWGGHks4 i~XcHIx*Kx'qTe[IqP)\Ύi VE^Y3' iEȒ0u:· ؕ<LcJ] {9j0Q1 ;07kjFt;S&(1ϔ|R.aL>`'Na.qw,z f:Q /+5V9dQD@5) gg1k0el9P#$m{ǯ2rsˬIqeԙwF;6ٜr2wl)a)WK>$G{Jz3ׁvˌj{P! B:{fU.xzY*],M$// Q ZWC@_ť:uP\J6úSǝs/v'?zu?Ip ~{~IT[8qgΊX>ʑ9eQճvߟOh=W˹AKBZ$ESlkL|'&I.+c8wz)IMЎQ6{2HhxVmG Sjc8Y om/@ZYL[1I 30R[%^c10n \.Jek,RR-;xpj¦ ,"5 Y&.f7 n64TSo M_ỬX{| gS߫BE?kѼ"=%Ȑoř|@T CqJjo#оUcBsD@tn[ 4w4M{4bؓFC"So"A0;WzaPRAˀ2Uau+sQ P O_YnA?}΢4eg~͕inێ7keFG'#.MGX"%a 'F?˔җR\d|,\WܯFxb-= @?bn+De:J AYyN:G=bҶcL19#-QH&C2ש ^yb! SQ(s)2yyo3hMD{ w(ÖlH_~SC_ *jɶ#c.-iROeעߜ&}/7hOS~BL9ʨ+ j9 "9,K)Wz*D!ZViQNܮrE96o:.T6~$(/?x7 }֯W܏l"fX4l-)ݩHWTgBABؔrwe[; OJE ToZG30 H-Ze`[>iRC(Iw_Y5pw-E bn9V؏ħlU Xl^F/u;[~~Pݮ͊fj$"'בqèA ,cO_C3Y .;K鈰=LA JwC[ BOQ)JG܅m#\EP|Z"_hm͆JJnv S6 0Կ)\!<DE4yYpp?P(CQK6y@9MDo#GؕE:O?|ʀK޳G-4|ҵq XQzE4;r.+!" D0K"5gr5~6#w #=?IǜX4ȯM덉 heOM+w)O` klԖ7sUA}پA+S~ Os'^jo"HL[C&g!RyMkOZ]FWDNY-Mj<[(;ȥ]Gۥ=FӾb'* *ޛ=s ΣpW\쑪Ie@Z٠^e,Qӱqd*Ӏ{z/`U@T L+c@ =,5X >W(^Ǟ?ZeEِ؋/J6׾4 'CKaox ͔3f hݔH;]@Aq#\g0с3YNb4 Dt^QDDf˅z<3; ʃ-E;,ǎ˞5fF_ jmaaC8]@#l\(kN:?QTWՕ]`^!|FJY r/I83MND)%ю7|r_nNV2}mPq@ZKy0q V};Y#gтڿ_IĘפF]D?6lo^QUÇvm-b z?^(ӊDbJDp9j"0 -ToC{8qs'D8ǯ=(؏a "8$-}rV{?2718>a}|KcH91}2(˼hh~[ž"2Έ/ʺ)=K1x-%nzM#jr$'͒m:&%3XD>L7wrVd ΗK%`tCü}*l,4!n\ >OyE.̎g|Jkԡ}<0(b(wk?xijDY_)z}KYy\7%\SM)]mr w%H;{!Bz'"Àp[n6מB{?m Yf.H5+fMu#fK(yopv,(<)rmY!礤[;S?+t#wZEݰͪ !S;Yi,1KS@NAs@qWL?L` l|l,Gk/ ,[#[ox`p"MO"J(+IPڄartxYAPQs4|te<5pSĶB"ͧgCaqP xN;{>,UX\Ty(؜̆_U_j>Ze{/jʬ*(gk/Eܣ^ns9>Ɨ[*U.|'&8%r?!aC({ce!+Goˡ75쌵ek_k/ rjL_Ty&Snyѻx:0*mDSX"Ia%3|AQ*(@0ɿǂ91cmJg;a^f雫nEa}59>}n*4 9T7Nj$jn8g=d ׭bs' &Wa=t%0݂Zdw- / ףh(UxB%Mf)r(Y^)Ly*x`7%~o7 jtz+&E6>澾{P5h!ͼw"RDŽ.D/J0ԘtocT.塚ЍdKf?gmlvCZaOtWC LA#Ë́!8h[hݯU &\5OB% B(=E7(MR_+GҰq D}.&֍뗋,tbF˥-)f:b62n `3ב5+.e;X!{h/h(Pn iKؼGt@?QH=le+vLF49fH'Ix1`C*U67M.8J0yhCs ϧktWnlG<:\1^qtQ PLWL@%Or}h76>;TwQNN ^Ȣz{/l7#!%ó ~]hF3Ys`jÑ\vT atZIO̻$\Tڱc>-祇[f=f7oCªE aFBGn@HY% IR6iݟSV@UJ2ɂs>+erëR75 3R Iف,mN:=z/LƿL`A#=d&Z͍&x $c/oJJ>QZGeMliRr;Mw3m oLlS# e'p؎ gq8[#ʻR/۩k J$]f0fCbt]Z)➹ nڐsWO5, nr3bZ[ڜy;KԔx0Is`Z:Kc$V,]4-lOC`|t wW+l$Z("}bUbؖ\Z~'{AyǢ1RnGS5iTаc+~JPn~P j.̴c;]r{ {5|R`B`f=媬-w9q.CvD=sz9a#N#+P 85Y+o[c{٘0=03BWjg/l紭͜tB}#A 1jorrߣ= i,&9MafNiw/8; O=utc28\;^:a&ԃV=QOHdG⍰M2kKN ό܇cԹ,6"y(92u̻FIYcA$ڱHMWb;PDnl X<1}τJZPmJyny/3y0ahyOSiD?ǧwS:,twճ|o}_u=K&(9>lVjcihal m܉೦9^5K$T4>58'l7̄m`!AP<_Q?Y8%;3_ZRɼf5*ܔ3n3)"zCp$~Pk:MzeuB|ek#a⴮(1ƈ92@14"ixTfֺ#LcZ=_s\p(ߧ`[YSY̓\<{5d1>}׷xKPEK2KeSwCE@+3bk?53f g>A)/OXrcI|7-_'%^߮i+.ÿlAH7"}c +K2G侺9`5s/j.8ߙ㆓Efċ`側{! <30^$m/uh8iq9K\ O7؍+uǙT%dTji<e _D`/vSs(+dRt :BXo r`g t8g~}mw %Ps7kM>zoVh!c)؞8 6{fx>1 _>U=h""*"U9^pʭ;u@7xw:;vg( h^&2?G҈06Ȟ}Zއ񹖗'Q9]znlu͢!zÄA& }& H!Up9L _nVxD>T^r8YE6aʴDIb,ҧy +7!嘁Mf'h#xü;6Vbїh%ܾ sX40ӳސ\7VUk- ɘM_{R2&Læc}~ۋxx-)4e8BNjq-,<#&˺z :bxݭШ^yduXv&"M-UN jZ> U"ep+YxUD+r~pZBEl,{@X;h!F2@>Fl ܲ\2\TC}!p9,p XNYՑ*WAKB<F$@D#0xko{$.lT29}f0gr(%mW%kqWL8c4'}k 9:EU5|$3ZBt$s}jc0(*0c%U(l_b~c$ʤ*`D1ab&/|308(lkK_{=JrO^4[!kq.饮bγJ}Wihd|&v KwZ廀O ,`7qT}6%e~1m=Bˣa@5'=ZmҜ'TpiyZ+GlL5qXB:8ZܜG)cv*JR^tҹ%Z5 峞{`&Y 6ζÉ!.+xN[!c9kќcݾ⩪KzEhn{lg+#{+ r]񦠦T*"3x#5QOBa__#ͷ,Np5);P8šoQBkK76Dr2f3f'_*Ed0Sbk&RJpJ7֙h9(O^;h-~emްJxn8cF0{致0Bkݶ̾he^j~.⢔?\V濌k~?6Ds<(@k K\# iVQ&9kǥ 1ؒP{w=`}ԶfcB$@ ig8j)AcӴ+) #)Uk2 QZJi3& gWWrAg8#KT&4*Gt,=g ؎:NkJ7#Lz]K6ph#sWs.nX?4_ȴV0ҫFINb9YqE!;ɼzÄ栟ǶRfyg[]*QtlJX&\k~~A4 kDOeW0%Z>j!fHN۬U6$_'xsWF/O?^]/PZ_8=I7R HVbz"ʹOloB͢*߭VT9ux:5措˱ᓎPm,l6}(ͫ0rۅf"OHSq+Z7RndOZͥ2^I,쌤[H8Qya0s1HeU,VӼ- zvUv4 N˳p&*zB+_Ӱi MŐQm )a^,=$s:GqQWPI: jv (Z˹,/iůƚflu+g8I'fZ(i{swk{.^,Pn4<#g7P\Q3D@I$"h Y߈\8)z´) 7 Z(W WRߵ`0̷ϺVKyG8i@;u$@xte^mGU8#S8È/[2dI]OvLfjǵer okA|!j?H۴ο!Efcf_U46.Y1'N!Ufp@<~ PO4ዝ [6VU*Iݞ5E'"{- %8PUUOMBaYB.[eP[Kt?|Pn L b+˦S):qܫ4T:)5|hSP[,M1ZAV|(.K>]l+ UWf|=_څHnYq^DwpG=(m|^b)B5D\NYJ՟H܃1*Z(t9Lah֐Q"L srD,ۙ,&-LO;G轾Pyc%ϬŊui@w >A$F=X+Zwb?33$Z'2{06j"ԍ< ;PЍX$6k4·k=Jt2|O+,?Fr*5k;HcNk9y^WTJHjɩ҉;5%@Nr6x`yMj] QKYq7m}_2yUHq!;&^I7\9^(|R:"QtPG`[fΆ߻\7. 4wڋ!v6F  `kV:runhn3P2~a_aTi63[-cMZ %nKw}XSvE#{g ˮ6^K,K/~gr .D.gm9I4 Pxy4t L//^YZHHites6Ryu,.9[m"5';6OtWnBD{ZZCo .>:aQO$4`YgYOf:lx4o~phλӀK.c8p.3ӝJZ5hY#q氁? m!ECgx^_,y:&k%?w`q_0ozc"Geyů΍WgDCXdKd(/ D`"QGP^lYw 9l$˚/2b>?UlXZZXiUG0ڃc@z+tȱ0>{72{xd跱I0SRSbEfgI`JSCL#$c#~ƒKФ ^=gQeXj# v)ytZ{6z!FUmS^R橊[Y>% z>SHJ WQ4 k&T>(-1FKp3Jb{dHGӯ)CRKQr~μM*e mv:V63I094"ѡeڭXF5Pԧ>3 &Ahj<'Q/_zZЏ< 1f_{stȢDz:U$BF <_BɂDo˜Im2S꠯un˴<) wZ R5+H[!CsulTR0k'un S%Ppmp}OeKF)8aewt52:gmEӀuPiX-%f JCdU y4ka$gGP-ĉw"ߪG 0~ }/uW1bTqT9J~Ă[iPuq( ikaN #ZQ9+o̧;Iq[ oNXZ ; +ˀ^(XETrWk^5tlzx/c(1NsA"NC ,jTUMw&o8&>B`RQβt eAX@O-3DDKMF'nMV?%_Y% { Y4l=:NkkOM#ϖ#f8Mr%:XDͻh NAug;8$sN)ECw\ 2DG/IQ:juΟ9M-BiA\k6RK"$`٭)s~V$8-aq9=M[H%D1_ÞO%>:b0T. )Iss bfu ]+N[z Y?ydXNWt߼|C%KR '9*$h G~pOl| 7CSK#9',1G͏EvO؟]N=ۙT~(iE`P}lEx$C@ /D׾#9X 48S#cm JMx?Ս_{\9R7%ZFX$ڼ{W>: -Ίm~=a:*r<#ӛWdK/,-GiB"Bx;o&xÅUKՐ8vZRFO'Co-GrrĀq3I/,= l[N / 66̧^Aݒ'Ւ- geZyusYd^Wԥh TD=Rsmmp?imetG׮w}P+7.b)F !D^#Y}J1 y |~≬..cib` V$1N}ςGP!2];)l{c*\ln>\+]`({ =["O^D-26BŴ7ֽt_dF@c,j3/H*se+aEO=D' [推.t3пLXnczBoKa2ص3⽞g`M^KTc uGK ӑIqkR!ׇJ` KgzJ\'1{OqL^- -}|6b%%)F]0M~B3ـ$'8-uscإOZ>uA9jEghV-vlaacLbe?bHKGI*'])hS{ȞPѭlCR-#/JM7U\ r5UhQ{7 38RԹz^=@FP)?{6b2o{Vske@ ]dO"LՐ\[wFwھ/ɘ=U^*Y0=ir$$HUIHYD^_y4=lq.MU$>` !@1(d$5W7p#&^m+wP|p4-VV#P|#Lj7k- DXN{[E'gb\T+{ߋEY ak(1W $9a"ѷ,VEk""CȜW![CfHRFRm%ȧ[nq|t[T]zv3]L'NQ颉0%eN0c#z7v)ho6ZIv򲐛UѴtQ0iZ A:JΕ#9kA> 54FT5*v8wj%$*|sJ\} pfh=&ȞW&N3Xw"^DQuLX7o?07Jӎ%y0:4ē8uhЅGOz^Ԑ?fZ.I ⪹x\vUԎ:P*%BhfԽ";r4gYf4H}R}@w'ޓ5gx\6w(m Q[t5%dG-䐧"cOJ_M3[-n UqMKt6_ƅT uwiV((v|.*@y/޳mf3ig(F7oX'iA;j&_%ð̮ Ʌ<+J~_ØJipV= ȓ)/F˼8TT\1G|N+{4q춝L-#~MHW] _GRvJ>J!^E;(qqLy Mي$kYG>K[C7֭?'DĎ0 ր"Ywofe˟ "w μHA:H2 ЈLCc9JCl`*Y+h[[KCj J稿Neu9K{A˿;wF@|Oh $+mʫ(A5ܠZotE7gjw+Fd;ťgi'5!=EFYqGL[Z+z ɛ+% bg$ޢ?Ep,ڤgXfa1@l_Im𤩮&Msmdo;y_$p arlh8:On*͇{e[dMlㅑ?lnz`h&$|EU=>2qBnQ=4 ,Qz>I%S$QZ]q"`ʛ}e◤#il fW_!E!d.'Ʀ!V5s8f/-2C%i/W+;#UpW]4j*8=,C:}[my`{k GlUSMKXYuq sZϸ3jبQUS 7;ήch@Tt'd\b}qc ".z*~h婸'| EpaB|s .N/g!GlBKG+w^2KJ{Xq׽Od2ˏl!r>`ѯ }rqjvm(:Hu%ԃR<0u刽.l3|t˪vwv_Aрj>h U€͜JA{eH0\{ױ$"]cxA9M؂ϑa_cS㩲u䤑&EU4~t03p oO \Xy+!rs)M!"APnvǺc#G d{O08ܙzrx^К?>ԣ@n\,'r9~.]-ƯG[U^ Ϩq>~(u@J+3vt`ʬK,缚^cĀm NJoE"X]&- %h7UbHxICdG>Peύ %8+3K_ѭI^~RVZ6dCm"?gU?zr wbB=]|4Z3@ 1yj (..$EV5nc;`b18\ڔ|%$NUԚ3ɉLgH < 5"+A53з?ʫ;3uʡ&T% q)J2UVIjb,: ".`9(RwI᭩hʦ55RZ5Mm{8 Ap 3Y^3TKLtA64ʭ tR@AO1.4O\Rlj"6ۧ"5;KFX0f k=5OٲOtxs1]U?=˴ (O#L'ٗ)u^F証 DO@"‚k.mSI( WLE:c%j.c{%Mآ48*9<: G aF_a%qCͧkZk7ivr/pww%sI؜ll uQ޷w u 4z/\SJk4hm`g1A즌4T8Xܽ'p]ӮP驀!~JB tz.z=-aVYo}|YYd,+:ab=qC2a٩|ϐ~Or7r07 ΗxdӶ 3G}j[M O*-kBު϶*VΫw;=&.}gv|_[7m dr/ǡ 9ֱmqK8"k:vJ2?ܗB_{(ۋ* Om_6Kd[q2ݢQ!ڤ? ~YT%&#ק?./AQCQ>7`l(jwcl)S1fհioD2i]E̎-^mѝr[0BwS8?xAƑQp7;N >^xAgш#ϛ ϭVUCoG2)ẅVlc̈́LN_RB&\< iiW!92j_v=DR2+`Bz=7cy{t]ǯ!nOIUXP*a^w{H}A+,i1KbY:i=Fj!+ |mQf!o>̔Dl*}2MyU֕gܐ҇-Hl!Ve1ѦG&F{zGo@9,X~k猭Uu7/W"w2eF4J@Rc}[evM6pߗt7"k{⾙HĺS%D_$ (I0TM8IUHΛ̍;Wh145n hv1Hhǣ lP08sdNVʣ% Ψ_3Aϗvͥ>٘C3>f K- |`|%$Fo0)(Yl0 :=t0o9AE4L9B}}f\-nsmF4ޡ=T[Q`I`cH䩒f%es h#ES!i)џч/.AVz!7> XOX4jz@;(6P@SVPdnt&ϸT : ^{'tϏSfc*ԆB~}!P2-\vRj^i۪GR`#.S~W5ŻV(~LJwgH|A^(~ז^[$]i :,.8ȡ΀- |V @昕e+:)bm9v37 YT75V>-x[/8zRȃ/u\3ž  l0]sr477g2ȥ`x} ʌգ%Po~6@Jg`뫗N)jKΦ 4sjX cK#j{gvgvQٺЬlتyP˻]-%_fCP\ ^G^cVFMǔ䱴׾/r8CYl@TՐZCUK_R9˿gX?N=E[;2cX\ a_cN8t~٥WI6] Uk:oy_"AfX?/S{N>FI+7K=`_˰e:@\:+EUnֱ˝:X*ŎILG,)4,6R tE8is劰v=6[I Mߴ\a7PWJI UXNm"'r@:yΔIwц 5g\սS'FI$7¤p'DIj'mw ZddpwI/U䱬0=](*)=L8 #8,Y-~V@IE EOסmWZPe=P\»<8Iuf&`eT"{a1=^zЋ6Δ/V.P9*v|T@'?w]fw(lsELx=;qrViCX1loy\2_3j}+4I"yR,<;k QLMay8lt9$ &&JI9xKNTL0< [=\Ws\vc ])*q)7D(q`tDWwd&8کet0?2zَb0 K65u0uOA*܋&~,O>mhowz,i]dWNhhXiΨ/l qTm B&)AWgbjpӈ dD' ^YN"UF1d zy*G=?/йlĒ] bHY:C^/m&Lzv˥؄*M YO]X!=XT Oi0,6P;Ͳ?½Q b0Mv}Vrt5$`) ~4^LBwBx){򩊚-3Y0뭰'i=]D6<>4 sM18͠kMZ~oZK^&='h>0"7(U(^~RQ hn 06QFyh6z>*Kj͔{ Ynٰ,]C9:.}hKx.uh y=" G[;BO <89ncX`sj- DK{N\0i?0~aYpaWb[7 L8d j˗mU'y(IЭy!TwfZY%6 AW]'?N+FRUf,apoq2+VT<|KßUڙW1 \dX8ҷvFxt^nO &my`v<ׁrD f}܎[eQJY̏4Ё2{>SRɍz9Z*'y BLvGylȪo2C1',^+8Ǖ;/lVCR~mv[b ќPX43Fzup/`xeTu"sypQKI unBF5n<ɸ T J|(噈t:6s_ᵛ;%mf$U d?2HM5+t.ZK"*jnǦnj SdF/cLю' 6#^ ~zA@J0[H;W}{ EA#{k\d!_I"I=VmA-+h^|d#/yHC3>=md2JgzXMat:.Kj /8Vr6 ~bnt #񶑅\"^uG7b7A2e Fp^ߛ۶ޘlrsS}dr9~!amVr W~HE8]j,( NlG܈TDg2ׄ]smEm8JQ Xa}'/m5%, \ *%EHI4Y0Ӧӂ4 539:N&x-Tg^+#f͍`{ ^IL5 "B3Z F_2-'w)!O+{~m!D iUL<!ځc,9xZ [<8dF|m@^pnS?4b!̎^Py4IBF +EV2v6j4`h*e'x^& HxlbpDo|$ &Syk*F2c_k1h:/{R>qp|8=٪h)\G7%95g2),yXV9 A~eө뙗57|.˼e^!/h$4n5ߋ蔴XE]ׁ*.,5yRhag85L;x*ߜ*C8E;p Ӿ=dz^";;yqBHoJ|7J ]2_}4stP쌈 :45.<"9q:9 <7sը^p^Jn2KiCf}=ģQt̐:;<i-:zhi׀  jC_"yaUULFg7j[NL˞ap;DҐ4]x2Q=O2/05JNo*]IG>.Qy^ KL^ԫZU* W#F.7m {!d聴 4/1_Q怤6{XRBKx/|CwwFJ==m^+Ǒ{VY4 #EZ,D }T)^Lq-+1Aegm$TKݿҺ) @bymr%s1 r3F+C 54v)M>7xt`>J]b۬&<$˝7Lv&NTr/4)PR<"sNP >#/tHPo}B*qpE[.T,~ 3`'wG׶!Œe1!몗mqeaX]~ݴ{xK4H޳aE8Iwkw+N=ϋhAJ(AVX$4x]!Em]8]JWbᔯl6.ArJl_z8:)>,jԘ \Wj`lygRN?6(Խ1n5H-Յ`ҚBA^=1v>:T@3OɼO&UC񩕮qQ6w-<0 ^OeTˈ(MsblPz·Z@u8Z^~G[z _|7vL%IijTl nb62_#=iZ^' LTy%Y@aZ?Z&lIw xeo?_H4]yѵ%Oqß+JIYv܁\5E?>:wm7%dE29/ +.zۗ\BbL:Cg℆ ppAH0}=)vr)SgE9Y,P~C&UWizf6;1uB K&wZin~8pdKL)'8ǐ >kjȦ_. .BG?~~MA!k&,('cށ:H?Q6šLV@gquGaL-e-IOjRqY@L&QokrWs 1 .diNjI֨rX6$CAAppu=nh [/ >iW~7˲vwbXH {nhyzXم K^H4⸂kѣ$#^cMС(k\^ꮩ,r@9- i,;ܼSxDńMP-ےz2IbN2'G񄘵,U)F-}ձ)0fziRr{M~BAt_s@V_0{ >mjhK:rW7(VEfA)7}j]ՇIn WmaMڊӟa'<;O!cyl6>0Y0qPfȿ_G>cs0GuEGt@†tm^[L lqGL, V jQxSTVv?w\EaY71%dgߎ=%{j,3x-[8=g*\MJՏŭU/F}JήÓt qm?S.VLYw[zԾ"\2%%44_xt Sǖ,&cjas^z;4cCAxw0ۂ_{lo.ɡ+lǨ<9lJRzϵsǿ귎ĹdHh/oe_cRI:Rы1DA ^6tC2tŰwSnU %=HTUv\?iibqa;+ʖ]\DžUiɹ0fȹPs/ F2nj!UT[esfoyLUT5)nRzUj#p)t;0gІ!C1y> x|@z S(fPmeaOɩ@tG{$AKBZ!C!r+QGr4͸o3-" t01E>S%*ca; rEa|j[Z(72lzVBbf/6EVԑ(#ϞGΎՈFk;ھrFbXJ V:0T+ߑj 1gվ,/ӈM{3 L!{6ᇵ b;6=K9|*rtd ?AKrCHݲFS|]y_PbEŲ>rp}*~V~/zY)1'D hj7ӟ6RF,bM|lcȡx9F,E1ᱜl3¯kԆF!&\}/-^ɶxg|J{o. Cs<jy#\ 8R J?y!MMI^C:8L.+6Jm2]GoI5q^]$1xGGX@g= CX W̱ʻڻpٸ {OEh4.݈m+"t<O{lr|#r>0™o Cqj4:!%{.YP;aI;}1ZΥMeS{?GXǀsf5gck@م'%'{o{޺pEV(}zJ Bӳ_-wPZeZUmP8-ɿzKP2J+KEJĔ R}Jy !Oо<"}9hA$ VznNse~CR [+йOH,@)ɼ|YJSx^Lhvdo`qs>t'|HEG}~BB I-ZЖ~DYhWLfԍlvBmUs;tg ?Cir†U/a V!k=YPpD׳jܖDayu1`PO)^y:tެKG6C> L^k-cjU ]|AFT8{hKvʶS~: w bkeϨ`Cq*F%:J**kV/"ud_bHEZbR]yz fn VboK?H=doEM%l uI"~s(eqzO. *xn0E~1պ!eb׬f}g-kW*!N8^ٌ2izW`S9-LtOvpԚN&,K@9lT$f6Afʈ :HXq=I)(0-ZC?X"<ݰ~5!\ "xL[dWƧ9a}r Zv )@]~6 A00gvia!D]u[Aאq֪c~b׹<"KKij) UyIYZZ^CP˟KM5R+1 X(Ngt aylH`V d;:$B5ƒ~\q`|brrl78J;R2n<˳c. hs(&rj8 xW6BQK`<3`I@s1);[_S6`)]SCû'6v)V% aT\=5. ߽C[$ Qem t~gMgmĽ#].JƻHT!LYQlp 9vYkf˙h4نXupj8`I|9@pq;N9o${m)_41MtQyh3#oH.2m$2xJ˜|<ڞ;CoA9i_c*n->l /]!BUi|mlTٗƗq,j,Х41~;ǻj!X1҃(j)3]K\J4sA&)R!c ^\ѼI*ղke!R?AX&4iHLFsZ)&?YGe;4W 6+3WW^qj"J;NUo:̋U]1ȗsGJ;?[oM8q9U]Q-2>5(n&k@kَq>|r'_Rd<L쌅!C̅I7ddu߲`mmd z>nTu1 b֜yC٢~̴D> f_"e±JO`z't4.՞n>:\XkK^m@RWOgWAǚUVy(8P8PlL ҐDa7<~/&W?Π ~V$kp~OX&/XN"tGo5g0k2g1j :{F!E)B+'Z*p я,/phVKz?M(YYօ ="en<8e=c4і.@/I6(YaWlC>a 7M@>mJ`,mP13 PSV@]րųT6}S=-8!GHKk56Q{urEä[ӵf8IJ [I$P]Pɺx[Ъ*8}Iy1;bzkrIv$r)0bn*Ŏ݌C' eKS>ہ0܂Yڭ=dQ.qaG)<`ޒqL-b{ˆLv6 ओed\_mvoWm1SחS:շiJ=7(#ACޝuspQ.8G=I^.GbDd.X< 3s\iݫ 덛dC<-5T#7@ )ea_E Jmo I0Z/Su0lN5a҇-̓i.N(rb \_F2u-=%"WB.fB([=ŝ{o' Rmccr~I5h ,i?]^L9jtM/Qs1r'SMDEŨMUH0_WB6SeSE5UQb.tU3aҫucpc Bِ7T98b`:0ҿ'sC]}1O*Pc`y>P EE ufmWW`Qk2+!"#7H|jԓ+^"9nnTgaǣ>iHL_V0xH.!7*lTLEi"őwc =~+!'"fo\Z$9=[4X䖓A=N R9_v7_U3R=X޿h܍hѬ}9Ea2 ڌ7T 5,FJpen K3傽ى풠Z6)?f%;AA)rW=Zoⷅj$M[As`αp6BȷA αzrNX}ZӃݮ}xgȐzvB}%"T_+FAI(=<lMnuH9{'PN_@d8)[d2.ZH!`|,_*BORL~Q"f퐪ilD~eUc#x^T΢6\X7_X#\-wY>I5T 4vIYH0-ƍh–w~ +};a@}cT@_'`xlI:]m졨=Gp! XRz]!@mqi7cc KL<`/f_%~6#WĆRPsIXzcRM#^/fp)Tq]ѧi9 \kS2RɈ"7?h^OYquO|[nZ~ܥP;d VPAo 42~NXN<u&uTlTѼ+S/Wct X ^v= d͗8&\ZP0`3}O2?ÂWldsC]0<;C ƺٞ\Kf"5*"Ph~]lk B)h_R*;qUC`zqch<-=˗~nZɧ4jF|ӕ|)vM{֜fYL&7Xp-(՛&W _VIv PB?%Dzw}chD *'nK W? BۼY K5te6fQkY|$ē텊3 Se!nr,ΝN8lb9ɝLjU/b) f>+O%?tNۈ y{Ibw+cyNd/ ojVƔp9WKU9%a"%lpg 󾣤5:V-S5(tɏu^zz38]IM$!S}_:[Z,mت&iiQ`sJ]\+4Yģ5d !6mEv4,|=LB@5cˈQ(/CTki訟lY}cս-(S*_-숨#ǸeINkzJѢ+qOtFլkӈ!^i!вgsq##R\^To i`_AfSpETTŰG􇠔-Ew?}ኽdk4{ J ᡃrT!Rqk!e^OrS97'HΨ ec\hLpL@7ZyW;^aJ񀚌?]ؘW6xMr#6| 1bǀu6CNTS?(VdLŐnvo:ȋL؎PϣUysM1JD}pϋ諾\k299OƋ1hRPkJF!@H7iʃ&<=;>)A&Z2JV ">}޺W7T5LZz3e_f5)^#Lx7jQ3?P}cu3QE":kbԪ}iSmۢH',ܟ1*Zl4jnm$u}`G-YnsxG3v)6|ZZk[z,-{zu˘pgyiq7ݣ?EZҲʷ L?n@eK͡y_Ě6ڕI)2ZЂ)bsl3mgд3XUIv1Z!֥QYsZ9aUEd;[0* p6%SeXCmwmw6hl]@F',9 W`z|T o8L#) Ȳ.oy[Z'4DQRML.|̞ ;dUUЛb#?8wyQ5S>-mR;rF6%bbM-0r*J׍QlHb%1}#^Z8ʗnAGfL*9rۤ9 ut#]n~9b;OC&pBU"BD:u'8i6!p +?S+#WjLEr:.V_/8o%Vg $)'q]qnM2N>8 iM \z̸Ο-rz}{GV#2"H20Hb (pk#@J/Z9pƆtӔ2LUcHC1jH6m&qVj;3Aw8l2%(& =E4y MH27ە|]WKĺ@1Yz\Y*+H^\{:YܥFu'J7^|@?[KM\  q$F8E@̲#hX l#?:GwfՐžU>V`c)Ÿ'mpFl90>uq-J %“UN ,O~ b>ڔ5,ZrρO|?]_tn-VG3`skGS 05/Z&w l=JʊJg+;V*61Iwh12l6 s칷=LX jk6H-Qo=7m>WY*NK`xN ކF_=p#2ҌZUZ3NYݏg0R|7 ?nݐڎ<)j)\5s'W53-ǁ]a^##iOe֛&d)_Xׂ:,Uy֮ "*H^g4O0;#:ja9+K~cV4]]P- lW4P{NJ]y΅R*2P&-[k} W2/Ġ]Qc#&rN8PLc3SI :E޷i yIrbh@`JيTDpY2l\Ϩ15{O%T٘ìL1Э\jSsijlDQ4Jr=RBaƫNve2vxN,@,3yW[3ɊVq**wtS{E;B~oIKG!|/|a$ĻΥbKc/0n]{m'ѩPBLװ_j6IÉ̝NPl.xZO>>A ` ~5?U~NJ=o]׹F@\ \8#_Hq}ǵ&%V14Y*rxSE"Ǧ _3\(\޼O4-tI0\LlJRe,U'` j cPEor.PJc> Oߥ֏i_p^wȅ^M68i6tr:0h)DbW y$մݵ27,5uox&}D3YZ_5ċd\ngb/`o6>.n)#Pj 2ݒitf? Ʀk#C|A`INcۖ= !*|,vi$T3[L.}:aL%fl5' vF!oP (Skg07[1|兒x#`° YacfFw^6oߛkTXרNSoxodvBErIf(\ -h!yU̠pN $z+膶"*UF4JeW^ⶉ8Ah٤R8wM$@R4bP7zFnrebu05xqPYDSZ#/Iuq}BK}njMW4Tcd=<ЏoĚXA^9T;/#(yidۭ\djek*W1Հne Qj( j欝l o"1>!>QW9NK^IvOm yCf%"m~! >_o?ZFS' 0/}6B_Mѡm7؄>m$ao|a >сӼ PA/E,-E2otuY&k%mX⢪ŹZtU0>';mm1FR}iKyd~xIfhlk )/\:(Pdia295HPFsFI"~d+u 1!Hz^^<#MQX!mEnװA/ )AXoUx=8;p(#3DB+iQ T} \q) %!0q6m&OUw]g#qt\Ys`Jq7:6hdGrN^H'ֲ߯j#S$vQ;ap&GaIzwZm;sVKbkT,+^)y)_Ҝfwɜ7/U$ J7˗썗>z&f,R@RNȑWjC`;T85a6,t^R{;)eV{+GE~l(HF7#dI%䈫R% '}C-GEMF F?zQ"sr:n8XǵF\qzY&6I 'ū`ԄHbr?W,t}(fkgZiV]\ܴ ۡ 5eq+֧_{Z`z/Vh?>oFrEF4Eڋd20/1n}Z}0T |6+ؗY,oU{Fh,7⇆# Hzp6\hinS33η2~зc2seeJ5v| [oeywLzwu7[ fH 1<^/T._%H"?>h|p<9)9[*˿fMb:۽9WQɨ9 '```lWҮ+xe߰`"!gh^dHX<Yb ҁXp(G{.}t=t-t2ʍzO;4! O+̪)\>J'E@ٗf1{M,ZV.DmPYK'ULNG 'の$N^k E,r~c -dd(mvn{Kg=IsWY`ڂAlb6g"hhm]-~KH}o:O~=?xid_5Eo s^KZ]QH:۸[^6׬cHO5p@>ߞPk㛈dA}RtJ`4pck&yvr!D>Ĕ:0~|}ݴHtPЊw2=\ L)rw̔n2-[7U.{eFfq˲Hj77X3!6c+wd|"xzE(s77$&oЅN_uDl](c$wCei?gckɬ/f"19A(i%k#^4K2¢po#Vytm;4$]ӄRua(𘌺zQGB쟕Ջy9Qv]s/ OjX X+.LRrLhɧ[oRf i CF)J24`~fXZ&2جy:VҦzuuQeqiѢM#gePSoV_ \xcY<=ʳՓPP|id C%#%bѾO #91/SCi r<&]3B/[zBh1ʮN\Ilqk$(i@F)%T_#? nC˨~`UsYfp0Aո-a^8%rtEm=Gdƽ@`&72BҢfQ;1+FRVgc|ٰ%pM/ e+OZervHM,f L EU~j:i5~3cN6õݵBmczҮvh'vڍ{xRWJ|L8g8'.+8 ?#4[+G{F+ jVn+@#f960%~t=W[/}o%։R)V2?@snU|,*HC[ dbnGn5P,8'l!hw a)r(='q9#UN-l{FaPp;KA:_ z WL'n;\0r-} 0d|.0/!C'{Uկ RBJn}Lz5xB?ZE!@b!&z$K8z6v}thb`5R܁ﴭs.;2s13efCΰ\rbZyl9>blb{mD892QErV<4,?i@[k"lwc*q(wԅǺuU ֔XuU(/s!Q}f,mAOv:0PF^^5Ϋ>[MCvbdMPyax3"rc3$.KZ|;\P+wljQ˕K:/^ ga9.tۢ/seaGu(_ʅc@"g1)LZ2Qx{q:ժݬ$;mod Zr&®ni[! iom̸L-%^=2'A\<ZF$gxBBY~ypp'R]8ftz 9q"sP%kBC ~=&(diw=Pb[K NǖE8q}`aMÊHoL#/21_X(i֚ k.wcq!(DWX*r"3/M>P07TV#k>WBoG1 a.çFfN:nLnV@fӪ;41اIJ9q,3mѐ^z[d]ʎ{ڣcኧxE5 '|_cסfM4Ud~ͧHdX˙5sct&[1ڥW-,XkKH#V,ЎGRMvINj{?y8`"lz`Jh55yslH(ƝjO]0Nي駃#X/&o@ǜOf(~r|hi`" 2<*D?݀m=ps~7V< aRĵ$BAHlo0&:mubK79hfeG7m}~ K[ uZۇCe!\gH2> 3e0$7,ܡ ÷KD]AԦ>-O =Hix_^3O Ƕ=9E}sDž͞v x~ٟ˘ 3 ׾@%{Ў}]sb}A洀Dԏ+g |SVFJv~LIbsxoUl~RaSi s ~79Vc Ξ_1Z)K /DKSUXV6aN9p5 3"E6҅w $W/#ėIv]G7+yǷM"#WFՖIa=ވyٸ"lT FZ b>LAxuTM># b#*zuI~1CEF& 92JʹFYv ʻ޷o:Ʌ,MPZ3:FG|//<"t^f}bXƏUO!D@vL 0+ ǿN '| jSU|)C*~ɢ؇+UPLϞI{ueU%p WY̯Q㠷.GM#]dW8kdF7h*_N Y.m?J6s\O9;8UaURc)xзJ >{(9ѲS`dѫ|DZȂc@.'R`\^:iaJBk"Eo[N`#- #g,PB;ȖYu4=ϡ#c1$~͓!Yx{,G3xIWH'o#iY7t"+<(_ۉ.5[vD^U"+SAd^9@u9]#p9Qq 2뻅:lk)t n9{ÒpEw6.YqݓZEU9W03nlAtF?f_ 0dr!m(qG׹׷W샇䞀b;W_ۭv;lCkP5Q%gu |(Tꄥ!ؔAIKފL&~lC܃uL*Ox%ZD)ž ~,Ħ:˽2Ts5)>R4,VS3rJ%(%_\.ٿq7]<=U1Wb}) J}Vf`wM}bs]D׻+h թ1PnV i V텢yĽfOm"'S3F!d>2HF l9OܗR=IN+"QЙ5QT1XZ47=kg\<Ǡ'LOzi.јJlz-ؼ ;(q%l d }e]t!@9 !,PwF\c1,',D6VTЀrSw"v᠉o;5?f‡4 Bs03xw&xT1sɵNuխCA G~;f&oy<X<152]Ԝ9yڒIe2`DPpJ+[3U&a$o$Zk*)J8ړ&ym zP{5}Ӱin$Q hUq10"}=ʵ4 l_L?eZɆY ˸L5*w+;nO 'lfr#7,ݦkiQ>A[Oatǿn+ԫf{<2G3)J!-V4WbNh/5'@d8gq%or(44&nʆyI=6V|W2{%HX#fѿlg\:93&I'oromyw-pKNnV@N&OWN,)E]4uX2I/:UEZhi׼ZꏥhwT؎8a4 D*IRZ(m=չIqI>h3I2׎v38[JV%Q29ף FaXEw`X?-g ٕ)"PxAV{Ԩ š}(kV#qW&xn }Цs"Y. !NtC_(D,'HZ qfkƄ_ Ihh"X`HdܚN vEcGdSY}=aGs;Sɾ^'4,#/TM_n'TTCm*APԶpi'V!6hA4bQ ;m~K)\("#.$f )g>~:WΊȝA45_e:iS62^󝢝H0!,?"??Ѳ #LiP8;FzӥގYi˄m;}izZֆȃ7yu9oqZ` ,J4<47*18^Vu p4h}bթV5C)WL9N7LdžU{Xu\g5 gB5cS9`?Ү ӌ QF6ulj]%~dbzǵV%<*߳ub`̴cɥx䣅y-ћg2K^U?29JNަ*_y#Q·Cq{[Z t'Rƒlj+k'md&ӵt1{`9҉ֽry.:#18fFUvG^l6Vh5Q=f@2|_AS2i }a5Q0Ke憆:p9lg<ջE7bKBEOq7I f;k(SV/!+x#\R@CSOtz{&Y.x\pܵ|lw2LnN˹}7֔x]zH/0c!f>%yl EHENjOj%$ȭZsڡO!^אXWX^ %zS-*N@QȉzͮKRX0Qi@|n h\C5>4= 6EC< Z<+{ ۇ7vlԀ& UyO//ngYa=Ȫ44<ϕE.iāH/> o#sii@]=Q6x""ZSrxaLJ,iv8v$ql$p{0v7"ߨӣzRBRHG@ܗ7Kzi +@}hy0pHN2PA&hh u:JUiˎ7M0^"'gz$anq!y{@B7^{OrFyz SNl%j!۾4C~,% UQ ڦ> س;&9g ?7١=jg- єS}#&Q5z>I4*GG'"1l뒆Ctqa>J?$ hV ̗['ڊ>^n^~WɝtÈW獣1Q^S c~sqWq)I)GcM5`r;5>24;yGO7aR |*AP'8+ms3$z_HF9pgh+M G:r "D ȁĠLꘙUo@\ퟅP[j]ƷTF*շ"k(_<80Pzi([?yx\e^Y n Vd.OMjYړ2WeT@u'7,8ݷ6svwuHGh\v7u=,pŷIMʾfZ{;\2B8sa Y3PߋJmZDc7C2#%?#/-ghKL 3k;@]rHhNyT& ;3z;9'G z2Bp-Ǣ6+ȆQ㔥S1G>]]4ڦ A@t,:%-ƇI݅_6a !^&O O?Qe~9ph+ !~<̱fa oR"*w4,h&o-뤭i:yVFR VCfιnJIc ~V㘷MtK›;J1}L*Sae^9oD< Lx9Rr~3Ɉb`T芍Ӯ&$,=<Q 2P\xs!̦||!ٕ>4QĂGhgpP05ˆ MyScY$F :Hcr%@bxY#uq:˕u IJ,̐E \Pd^,TM%_ 3uKurWlu{$Ƒs^v˜ip]7M`ۯt1^=d1! ĹMCzJ0ESGo3ai/13p$.9?y xio- =*K~__)R{^p|x4%ƾm23ֿ63"k-5ޛa֦BG Baj'9uGM$M>x_$[9HC:˄ }NFy61r|OMw8/>iUl5ޱ |#r,tgSr+ |C]_ lzHV3r:좓Dǘګ1俖yB$+m;63 b$RoH;aZ|- x^eO= ꨑE1TMWۗ")i?hD ?N,Zn9 {`$f C}\Ts'+Vr]4IMsM͛;t+ߕ.QE]AҶ;Adjj9 <٨tE ~+\;Ԓ{>^?[-뻭;t%aw)\9l¥]w7y*]gk/8~ou8]FQA0PC,-STR.:d /귞w$~_ C/59u%%(c"1:ٺclik(1P$+Ύ>vńكj$i}R,~0g+Wv/XŝI/F8UUթ]>^_uL쾸@=Zzj!b^e}w_' <)- h:鮠GOPjC_<7Z2ʡ-׈+l =GE H=Mfr?יOsf\v4ہi䭑hIfhl.gypʼ@e]Hd\6^"v 2q ط&Z1ܴ-݉ <LUKڞzUX9D#%e*#RwS$%VZT(]ôJRsAq:\8k֩*w漯ͯ|><!}7.+7sk^RU\店 uw2gOnmSM6(8"8I*d,o@ 5=`:UGk:}ޅ#pS |ըl]>fgV@_/Far|;4HrK@hd{Ó6~SATIAlLC~uEXD:'`Rꆒ 5Б23, ϦseHA>R<>tSIg(VCd,KbȬ ?wb9I$ra΀kf]p)B?odҋW]qlM:ז#B/D[c e o2ij},Q0MrX1OJc~O3Y6gtlCJ+Pìl$D \klਤּ/$#1WOnK:'襖x:\w!jîo_ga[1tkעhZxhY AyZ̗_#'$dC1l^fC7 /$[i}/21O&W>劤1L3(ZÚ&HK LD~2Yޓ6dbiUncfx z߄j0 ҰmMI;u9n{>dR#%v.&Afm?0^k?61{o-̎ia`hͦUQJ>tll9d闱ZLc u,)X@Hc7 :$S3jG<,4HnD[0(X).S gy0D$XPٽ".#N8 t#fK)BA!}UX.c5m`ӈal!UBEWWF:иJ9~T<|l*6]qRw32)pjwigu6eYbx-fev B`07lH@=,GT/US@Vv|t?cb71l]/A:uCW0yӲ_Ѐ*L'(ԳY|tm킄1cTڛ :T.n7aZ2(#sڇG9{Z7&^tSb#ՍK!b~|F}@V 'dCܬ 2Е~`| u]03AρkHbBe{vJ .#oPA}Ǐt>E_-7 w ̐$AH;5~aI>bl9:&R'a\3+Kv9VpZ ϊS$C|A=+>I3?1qܐ %| dd 'i1~23&lD83bD+W" y>:^_Gs@^Qq Rxwzo@3OʹFoa}f_?:;2i m pf&-A/,<#6qt+P|WɢPPxP7z<|>Ə/ ;Oω nY#~gC aTYo0'!$ذCF|[Lg?ﲿiK.x$[ f Sp?2E 763Iv k i]U)9QoL  ?4/ToKYYe 2YɠTq/{L͊.۔MTf%ٸkpM$rsV4T alh:fY[u x/b{LPVwM6 $W8ʼ< ڟZC.#l&G'&/? ZX-*a0UD#eh/M&9w: Nn0(\.*FV^z&U-N!:%v?UOgk{{y5W6L\&]E(cl2xarDmg>H:Uo}`Z|s_GxЗ]veTʾN]X^EyeUF,w!T%my%P`M`3u$XƑ9s:ꋙ4ͧU)xl_wXw|ȳ2w$Yfi }Pe )#eʀШ(>AnVQ4 m a獫06Qt|9 *#q41/x6 w@Ss/80F*\y"g3`*7DL9fڍwOBt~c(=K R l}gĦ= hHx! &-Z/NTwUYGΜ(P̝ͿE"[̉\C;F %bU6ѫb @@JE5S"|nT5R}WYu 'mG Ɣ1ZHC޻`BZCZer XhXqUEJRDlphSb볓(`qӂٻ"25ˆ%J_Sd*b7^~+ ݳ.QHkrbMh+Ƿ݂2*#lUR:O|X, tTfU9JP&֋ǔB{.TJUXn% m萜mPk\&`|F/D@!^ډZxgY+7o3H*'J<%eWZB:wlPl{?D)y\NYᎊ^eՎl6r\2${;xCR /ԞSsA@xc^1ɍȬoP <~RҒF0CE[bRe9T>+LlD҇#=8]:W˃nc%U[gM > Qҵ1vLhu8V L%jjV}kLe`C2C1Cwg='}w,͒r:䐈Z^#"YHN5G2fR,=JK"(m4F᱒ɉi[N{ڳI(TRG@?K@BՓ3ػ>5/ſEmH~Q&Vt XcB𬤓4OIFܡ) R]ݷTw#lp!YK{M~e3t-r mftˮ1V6Etw51{ 齠T]YOdbʨ?MT#2OO-5:C;>x"0Jls1>կ5CLV'FSSpb̊jSo-Ge,,άP$8z랱7Oi3*4 ^"`)FʜyعQ~Q[s(6 ʖ&f>-Rkl-G< p |:\4g9{fbicW ؖ8' 'kbm|6YW nYxEw&~ɚ؟sk9ށ>L'81z-u%>3 ;#TCXAƄIK0\̍>e@a~# {;=V%*7Kg!= +αm ,?G2kM=%'0asIB)DlZ>;%ΪJ_h;&Z'tH+T_D{!hh78߬.G @M7/^9Ri`Et-^ƒoOD`(7u OG w{a=\5%S-y1->>acvdwW  p?=?YhH'g)TS0c˿X!IkV3Jğa RLtdޙ>b16荐6QI:#lp| ʅ!*70 G\"0sjL?p"Zvq ڑfqq33/р f\7En[;A=6+" $-} F~o\qv~.%UjCVR(Z.d@XS#[ L]Ӌ hH0R#Fz"uF AˑoǃjNO% j'}Wp |0Rt"V3ݰ^<ҲvxLāt_D#`rܜvo% *XKxkFeX9|#sa&EJ\O. 6YgI0RE(;"qBw[jп9Œ&R ױjو:Rs4EGț:1aDCݛ'Y`WH2bJʥJ| s 8r *qH7:ki{ׂmN ._HK:eQ$-604 l^ɔ>/Oo#R{=cqaxdAKj`ϾhڠJZcnVucoeSK[r2곾)hyLZpo 6ʟ*nR cR\jV|N b\p6bNO:˨YԄ:VnY}/Ƒ|#=5LU -#=!Iy] )PK *Sā^OD̲vy2;7y:~T[]8YE;."OLԄRJJԃE 4$_NրAL~4ɿd~߮ wfP5\62#= p). E'TsNS@L؆%9<yp.қLfFegqo:My(F_H;Z/DSiMJR'z+X(*|J'3dDB85EpﯬEO},H>xO׆I09jdaV|sS|fU=2R.pdOT 5[Mtn-+R.<>y )mjo;&{/٠s8-=Ap*27EZ)UaS^V\`OvS;j0S޿8_dE`?#Gx E&f;tfv/GuEJ㑶WʘG51H=/r2[VX knHܑBFA^͐Nl?E8bSB[aZ㭴z7~~M X1 $>PjBQ[x9Dbΐߢ1U/HT}@6fF+#`)OJøilxFM&j!Ì RF&Hh,(L8!`pf8흳 ]P/"dRB00Kq#gRT`jPهʿvx6J- odGo <0,9:^ >ЖhR\bOck~/VWpvOGZý 5V|PG `-QBUݖ M7xp*Iwe :ܴ$ G:y Jݵ;izZ틀=/qW6ԥ-F^bpAؿLhW#-b/()wE`6}r)]-wmdN|QfS;.{)Q*5|NFb2Y ("ױORVt;S>t%tߣ3; 9QFusI Zi+$\ =妙rh9W"6[׺J!l(UyerYۖ܇ߙ[&Tlj' W";uRX:Jm_FUwP"<,{aZjbL+fz\aI>٫c0SyR3R,B̤*Yj +İyC&sxk9@PokDÙrT6>撖PaQ"3 @3?S[âTtmMvfYS؇R\a&\Zddz/j0 0h< Q៏{PD(DMM-ȕ0BEFs5A +P@x3X!mnZ343EW' 3N<[Ięq#twd~@_mu0<" xz}bPf1nST8{<u )EfPQ{`V~|ɒi +JPBL[i0ĉܚo!J趢J ۻ5yHӸ43F0#~mTzoV^DK|xW$=&e -M1*Er=n,[X5R/ RF HQ6iS57?daq-ioJ:BԲ& JqcLk4|YyBϽyAtҽD} ^CJ5̢]A$Ō!f,4;֏?ۆuW8c]( ,k\^IzFFwSKPEyA{@\7I1F+P/V9PfRgr\玼U =B/em~ I 4Q\[Ɇr%յK=P?lۈr8t2.&a2ȶuԣ,$Mx!ЮKD _Om^\n"W6*O֯_^^*Ї*)bF̈́r5fiAKe)is$Lnz%[$\BS^R ̺Mi&6vVͻzT1xN[^6b2G&Ap¿L$jH.7H }LC%ɚ^Ӑr%)=J}w,z %߅(`n\jr0 ι(f{dȻ> w8~+|OC! ?CnZ)kDZogúARWA)ʨ1gI]ͯDvcJK/m)F H",I&La?Vͫc:GɨFw[Aca9lalrkn{nc ua BV=7YOj~)FM+fD؏Z6%E~r#l=0X[Qc&?Wax'g%K!R ֍k<9D\\-;&_5T Q bZc~PUL ^ڝ^i|0c{U8U'u6"HgVg1eR_b:ҺLRArG(_G^l'#\TǮC7H80> Sܡp!@*"=% |R4%s4C""N 08lb3SÑt/7"T#ڃSI10T<,Q\OjlύxFRa`yJ-.\b12ALpr8bctk7h= ׺p>lAxA/© hpy)Չza$oas|ps_7tO [4 .ҁXBZjv \ k1χqI@4~|CuT؏5_C]OhXjccvH3tl1&N)k s/9ʆ3D\4E-UPno7#*?i3Ji64Su'uDcKci±kWM4:7Sb1$$,SJVL GA|Hnt\ȥ*s$a0 xCVpUfJ< nԭ__Rւ$g!6,s4rNYmx֒|i88s0Ѩ<%W9y_hO̹glkx4 tmke"[5*紜S5̲UpzۨD6YhHRw~Z:&KcX""\ͽ1Y<$櫫5t=w}sqhzkkI etƫ3dcgiS7:gkqMY\q5aUw&Pjur)J|M+% GR*+5Pt!&#\-' %oM^ږ Q~AwY;X \ڠuךryBam4֕^&+#bn@2hIٯ/tqޯSMO}yp?ύջZk_ J#"R?ż<>2ehkXee<>@4I:.D0e˽ItnڶzLan}XtΆp{)cA7 ZMJ- F𰚈/xLמl dNM?m3]2 TLtc'ql]̻.:/Ӡǽ8\KT˵ߟ. ABz3 %!j ~ce tVe\͐BB\J]XëD^HB )hXPޥ@OUՅgzF0EF6ZϏ&lZ !'@ jB(7f/nnq͍0DLACbdr[#z?"5$|lt4ńEp ,!K BRb 18[ eV/Xy!BA6_D{@QXdC!Ӄ]U{Q|,"q˗!Yyh):hV5d[!s5T =2(NG ΔǞc0.!L J' 1X XR=/0Ow)`[}=ΝKNM++]Ր}ySpl #ϵ/;7Nf'&~ߺb>ow{Gw鼛]Fzkc5Hp7  ut%Flx8e<1QFfeHx|YZlf4Kdo!d%v7xGqShuŒg(e#h+OCmm@igdEޡ%>yU&+]Z9.(>HJex 8@s}q hB8fFm 3{nȂtɫ<79yrgq+򬑠 Y7g)zd#Kn!x,ӯy52Ht 콐g@aN\K0v[=kN&aD^?ϸQRVPͮ,{+Qvc::{H:ftH;x>d(HՋmwON kh@Sj^`ǀEךe8jxUo8ŷCcDάC׉`t2o =YI<ѐ])}._>ٽu\=,PKGg7YJB|Q!N P IGJ^ 03:Mґ. HLi wo*c/O- n/iu9Q ,Dy(CVQP]yvz6i_&5j2!;r-T70>m鱞SGwx襙*2գhv]l|>!o~cӏ2iD#g/;Gt$xfd=H/%A 2 DiL=🠥"[U>- *Q:$ 󛼿^ nޚ-¿xV8vemc2j*s,R5gr{-ē+:k?a7I^p׆$jVo1əv0Q'}|U/0C}]p6\r㽅dT&kO|=uz+lx0rXIC,ðdsq9$@ǥG0Lov&R l jp#y7}=whX|F3bU_QBe13pdͺ^Kr;廣L!k3Lbpv.:$\t.ncF$)a:\\ ߭'^ϯ Q`Mugug61T[}<xftS'Z)7;qM#S7}27N+PIm@` z&&JTTx18 t[u/"?U4=`}$nE%yGv#,*#r`L4#ר?Z 9zQ'.i^j3 Aw835Zµm*.UuSv omX6+h)c#vzo'ϘSG:J8\PO_27g|ΙQ(M?IVG>U *t. a>kA$U)]4u%?J!|Yz(KÈ#A %P=ZNd|:L 4ۡa"BVs6k^fo) 3m?B"P}MB9AIAlLu+5YwցZ_4o5,6.YP sb& m#1Ԡu^(G:y?8 e&FF3dtL X/ '27 /ҢNflJ3qR^gIS'׈DћwؘOPt/۝/˱ pC^J6v`HqHx:U}"3]  aCƸ< zp ?al|uUL1&^,q[:B֯9|qXm01+vY-%GF|d|Yq:iC]Ј E f$:#n꿅~q&JIj׏~A}n"YaO`mfW5?K bQ&,~;3(9M"~F!k3\VY#0M QoFJ>k(K a51$b̳b UPiMx`s6`uO ZU)6Iʶ{`!"Xcҟc4x, , gH>cqL5zZ LyNQ@/~1~yÇ&!Eجj e,) 8jJ7Vz\ 7nx^T>Vl1V?7:lr'NL.ŅZXe/mfڲ@%}ܮa ^KFikZagR`u}-7 SSWR'#|5<%qeC3@waw*dAұxn|0PE'Q{w9-k?X랙8. KntKU.$b@ ;d()X[9*I\]'.>j"{bMeU|:gkz9lҹ׽­o JJ4})dZPU?q"%tkSOJ~Zz%yEV BA+nW >)|L42ꗺd͎_* ,J7az F kuӬ?*N`1K E10ěFN|ԣ8gqsz'W[ ."iqݳAs51pDۓH5\s۩TV0ǖC͋-ktFH,d N8 甜g(K|XKbJAs@v.ͶC݂wzixz1(%\7N7w+ kMi/9 @m ^B)?@ml \tLڍlЇ3zݛ3˒Q7)qꋫܗ7Q = /[ৌHifX&\ %F&yɀz0Ũ%6zT-…[/mCt)<@aھKs":o7e2o8X#M :VĔԂ}wvq$Q xAa oxf} ӏ5K 8Ar2WC=7<YÑ"Ì3Fň$xԊu{ڹ .7{KxH3j!&O+׺Qơh8jK`6TH x#rW{90Ԙ &."&Iht]V(kV\kMl;MFt@O>Epm,PAt+D=2^9W {w)G|6".|f8D]Vl,ҵ'2R$Bw{TW'Ѩ2BOM~>%]"鵧vO.)f >dCqovOəg^9Y?% vxkj#ʼBOY]50xvZopa\8r$Fr$ /;.fiQ}4@?3э*"pyüYjYdyW2]Yը`ӝ "+)hQ ǠwO`,KȈFQ Ȯk0o5Pl:J{h9q ZPMw]]MYqέe qK̇9Րkn6W"Z& RCA@9$w`Sx/B'x;1r.ޜ;}<UL[>y#'JP'B׆|hy|%` _+(7HŽ%OTͻ9Ă/N>vc-Ut `EnmЁ%/5 R}vs*ǐ=smL<Ǘ&]aKdOJ!mEݫ9Mnv3)/ v^⻒+al`F䒲Z`2"Tbm0(Dn][nq hH8׺wp7i<#%^qм҅P9ğX*=n tb8Zh%=F`D$'%R/'֏!Ȫ8בu+.*B"wAFo'>hՙrrkueaED? ?%nñ+aQ,ֳFkfo0Z3:99=Rt_N'U1:9[(yF$bB]>ò "wdc6TlZ\y!_E7V9Qr3߶FG;=g+R G_fzCdiCZ>ں5 laʊM<臃aYݒ0>uTvd 9w7;?5/t2,1ƒ{o.@ߐhu dcv JO@e¡Ϯ0 xD-ܺVSuMӇGOM/&YdtrpB?ڟM=pp,ue t)f+6$' :qN #;6 @GQ &U!o'6qZC* AoG\IW8DgC*E HS/2cy!QN ?6=jdq*JcV2rͭ)z2mP%M"pnink;47oK$Ѳ1s^2xr/R7]Џt"InӐ3Y, F977<|zwJQw6upb GczUI ^pA>b,Θ[ #%f;;gOujS%rk\` 5|RvCJ2f8D 瑬7\=ZgŤ\' 7h*j =8+⷏Y !0&.C@͓CQcg[-f]Nnm<ѿo˃xkSlE#Q]956d% f$Eiȁ8FCK3{x~TK@]2RL9]j'Du1ƲQŹ%OHPB?^u6P/o'|2bjwjE 弮쓫LɁ>>-N2۷#Dv*h!Q8Mȸ2YmT~嘆AY^rK)n`C6 `qLG.3m;Dha> y~L9gNW> "39Js P*YZ\Ԥs&f0sJqwLS|u YorreaDŽuBH)u@JYYa?UE=7~iLj&Yb.d?2: }{YƧm] rHC':Į"$1&Αj-N K_-<p 2(B?zyjny|YR{Dw#59o39XR9 mј*?ض< )VjGacZ Yu=p[{@J5L.Vf%nDtZPb;(o_x1EuA4~K=U2f jҙ1{p-nmg#4=W)Ra^XR=g"rRq3)Kt9h,bR.q0&?drJ 1 r!`}o*Z"uotHdð$xUg˄;h%)@&Z!Bg۠ٝ˕tO_#Qw5`-SH\r-Pk{zRo`Vkx׌2S^I 8!^+B4%2G˻mdBӋs[JE.WB(g4,̇\C@"M1Sy'LP;hsV1w"Pl7?e`.Hs]aa~ʘca{)qϒ QဆO~7[v?B^͠Jc8! {+w~KcykA(-QPwˏDf\p#v2Q tA:+S(er6v3IU]%]sWhAH. I5ד 1۴P =,j)t38J rm1΋DE-h (*pAŔcV y`-y!M&u?[;D-Wb-%o}5]\ziv&mQt.doo} &XH;۸ p RcLV}EG˺bco;&mAA$yWӘB,kVV]~b6,dRYf3%軠KYGHlxCPqU~ <8}"m3ƒ,K&zO]/hTmѾ9Ѯ !r}jh`?}hR;ƶbek#\ {[I~ .DXdkz3j juH0d[%E#m #ҀC8W}f;ήoi9)v4`c)V^~t]DqbQlAH>"\{\;68xf0WH멃'“36QP7J k0 SVxHZ}z4] 6;+l Y+- ۫Wc!}"dbӥ9W4~d2"k6(-̎KYCd7.sY"A܋51~쉳k}m^B@;4{=/Mjv+nʓF8Ԩ|beӖ(닁ooVDJ$鸙4XnXj;SxvF\Np~|`wBDDa{1{)0.f5mĆݥp[סn ƱM6Cn '=/w>l[G:<+)(b(A;bZ+O%dz(߻:KNHAd5B,&G(avRS1#k u.D_6q9hc.NC=#__Te٭_A?q(ri/ ֏eӻj>R"P|/piS> 'Ͳ4Kb&f(9MŅ:$fmDYfwVӠs 69R$Pw8* EqXK zg@KmU@FG9!TEd:xb F {2u5=THfp#?L %1E!]>bC/]F4ZMk*bWEa#۠aؘAt^V犨QR%- VBwbC a`$- bм/}¼Ѱc*&Y}ڵ;T 8Hk_PJ;7(ܫGR+WRhR߀^WߊZǃꣃ?zO<^> bPMZpN8$UL$7?Hoss<'pn;Kfm;m:j^#&&U~_phї Q}T>u\8t{9 j=*m$V3hV}@OПiFk}DlFfKzomr ؖ }B(YW;7Xxq˪{,5 qHoXv%o#⯱ oB{0A˩c.[ y}sG&+R$t$7ݵf=Gq18~p| i39Ou9 <`Xz|'=wNdfﶅwd|Ic,|=ks ʬWlHށOh3λ?nថAjS B 3sNDx^ L9aLH~C ٯIxfRĞ;9uq@Opǽ #YP2)=?f@" 6@!Ia~3Pøs[ԅ'Cfm{SjFI:%~g"% LLv#صQͤ t j(u1;vj q9NMuomg|Le=79\1P2@Z]Clw/wJ%{X p=q/+>(]T|i*cciaC%4nx/ څj`f kwv`P~՗PvB0,T\Upkw8(D|K")+OтWj:ūD'{-q3z$8~gC&HS#ǚOub;o %ƪSoY̓o@q| I'f&̆Ƙ>3?[χ%a[5ٱ`'}9[E|> Gqlfygu7|v1AAadh]~J0]-ZHN$5M3jɩ(~@Svojsfg#uC@-y)S9wGfF@U;ox%MǩGw/&~-(^GW5)5kTvD}Fsu'ՕNKRk[Q܎)r 9 ""n{Zqi!dpjP3Lп VVѷoD;( (Ii AB2=}zFr)/ 8m#vZj:[A$š&cN5’1 I4VaMW%0'G99Y|Z? W3<lV̞+W/GFY&x q[1;MN[nhk ީX&ol+0yP"+[9xS(>pWF%5V~; O8_ʬ|NاMl5;`ioȊq_ZbeŬ"?ez)<(z{>X9*", FTYWx{swkS{Һ:;k.M_kѝ , u ɦ-zVY̐߫ a G֓h)# _AǷ_ ~@v嶀+ +N-^^%?LDmOdɡ*=lE;ȩ 0->_9֔R -?=P@ȘAip Ϙ_XjZ@F r#|>PhFy*60 PHAIޡ!N#v`w" nnڌ7Gb9H ~CSV$).7ߠPaww~V"Aob"GgP=eANG/l瘇+1vs:Ŷ<[TF7z16!{31j8j O ݙ=Bu_5|)?܀VK_'HLhkj.$,D{>]ЗdjCOӂ;*.{S#ŽV(CO>' w2"HAEnD6R ?E{i!2 /BM skHLXAM-mĢπO9t`I9wKŽt30bޛxyK}8ɵ.\w_S+^,*OGru޶6ƿ9jԣ; s#Dhj>c<#Ų-(WХ[2w- CXԈճu^6 gKҀWW) ho cNn*N)=͹tPc`HP#dRY3oS\L@E;Mp.9?/b>T,A3kFK܃e33+~v7PװG~; h.k*6Р܌v?5 v0JR\D|D@Zc0y fBOd%\0pN"._̜?HX/>>?}1w(I'( %Ftݡ!msZ  OVb^V,TRaCI6[Z( ǽ{1rW '{q>2mL`7x cX溪Y5aUDM?(EW, IH.p=7/=5QiLE38';6UI7Sx+k8JT1H²R@/Nqό4\j NdaypOra37Bt7Cr'YՃv$\2H3ulcwSKBRp-̈́ Iထ7YjN1,҂ 9vzRECWcUsϔI>ZUs,Z;ל+|/_7fеX&~pBB=I\n6A͘p3q6nƹ%W iIJRNͅ{N+ܘ(?j[M4$<02 _zSŢ">l$ pLnD0ŅKAken[SK}R}}n &9fSCKI^iGgR}@ڰm  <e8ފk ;3Xjn恔/dr"ΆP >PQ?Y nJu?\ARE1bcOxgɻ]:f\[k9 dF'_+ ~D>wE]#j3*r?}3XmEUսLWfI[H~L-?Eao6ŒwdEsk .Ұɫ6a\7^amj#v fNB{i\Q& }dg|ҔڳBi핿ֹ/6(,rYwY|n3i2ELmb]o ao+ >4eH:7J8nI#فvdOa|TQ$oeeFrg1ǎcٟ`&RPYyUvgԜZAkU!{̜Hu[ |kmK\bBVܰ,ɿ0Y~^R%m:HѤuW-Y/=:VڞY*Y͹r7 տˍI&06KCKzgXUC3fCՕeX%  !u9 apz {e-W {5`fdJޡDCFk0i 4b:AmFo& WɈvi=dJ"eK$/%3| Um}f6$>VVpQB=pȱPS~ήꮎ!c_T YѺ_9hƼd[M-=V@h{jw!y (D(ţ*~nTƢJמ;U[ݣcgє427Xd6Ш*ߢQ5%PXÊ> %^WZ&!}uyJpC<^n=M1 Wy]F5bAlq0Wnd՚M,mb眆+O0>)$ggj6g>ˑQgo? PiʊoXɥ;xFl}&DC:!֔xɰϵG-MDd!%\_;3%<[Hu\eYC0ѕaG(2CY40w/ @k] >s.=2'lJ7{B|%0z L9f& q6: ˒5}i`yHOY_$g6'n[z"paVňSwC٤nBXee&ZdlJ" ?@wj2{zcFPJU`q[8sWg<ԁtu?_;0*f {*NBiGv}o}(ȓ/ \x?Yy$?wK{/N;Az F9E( S)i:L'o&Ǭ/_I';TʁX: NƒvmXȐ&IgB0$ B(|x*q[A0 'fLεENlpʬU(K yE~Y۵Oy4^po霢~ 9tڃh' tgeNMkn7:?4[CAJ۱ 'w݄>e2q`")9p_{W:hc 4hrpNKXyZ!}魗g ?5Ee³9!7ɱ $ogεпL0RvfP֯@AvIH"VX(^ =}LW>*Mr Ep/y6N,>^|l2?!0 ̒ϩJ!m7yz~TF[g#cBof.9l0/mu2^|yll֜& ]/s* mˆ{VPoK G M0UOV;<Ģh`f.qͻ~f-K9~!" ϶G ~%9x)hs,>p4"p8`yW DuPznKb8*ÏJiTLC'2"|?wLAHF@ wU&Τ9R==c:c eb El܆'oh5tIQE "x.ħvWj񇒮֕Nǚ{YIkJdؑRu Br(9$G|K;N8$ 0ݭbB>ۇާkW]6~8}ɰ!V'20nxpZ1$2.\/Ak)mYpE RrƩ >U0ByR63}$7d׳H{)Gq"5^Fc^(I&gҥDܲ&7"o )؅VNm)"T}Jrq$8Ѭ<{ LPhn&?$8y`Rb;ZYԸ:)+3GC;ҜRGl8RPZl& >{zܓ%awK6eF y pDw5ᩑC~nr Jj|3{f/&05oL'kf[,/x{U{io'Yo@8^cr 3g#}PONur"-50 㖵&x (ԓOjP3kaME}9ͫ!N~Pf?,$$xjY? ,;\k!*6Ǘϧ9d^hnhg6?p}<+.14_ej^;oXs=|fky.}PnҐ`iL;KLm޲^y:uį0]&S63t.Gef p؍TG+;e1wo4"׭q,of+IIѴX@DeDnS`9 (PdH93O[K.!J/.b ^hqBjeh m;%tIs:tk-(;N=a" :h ki4ϴ6w>"NAkB9=@a^k{a\nRco~+%z<-p)'_*z,B>5ՃQjԓ_tS u J[Ts ksSWքCZa0$NC.(77;q߮a5Bycȹz&Z] ٫Rhu !'uxj&JD&Nq9J >Tϰ9aX"x^9t#]%hMR:S8q?!% Y `bkoY83 y%U-"Ƕ, I<<,q [/ۧ6V4v.f2qL1nUe𥇸);BE>(9,K+Vϰ0 u)>ˁ oہ7)}q0_` <0 pIap> ./*nߑwꁠNDH9]rR}75T񲪰su{D[j}+0SZKKsT|j0 owMx!xJe5HE>9\{tV !!0XOl~U*o@%֦(5PE]Rwm,"> lt! .$&[?^"­K;#Pڲ2FPԗ8A )@ΤzH+#, A/OMht-^cQ&9)oC:2GV Xڈ&nB!6gH!L8h4Ƥjy]ΌC)u BA\ NMۄ': V#ilL8TbLB',,)r[D$.]tx!=-zLwKEY'Jc\1ѦmfwpίH:k <ՌO-fi&A"NkwQm,8{}) X=@(8w-b* ЀsK\dZDQly3U Dvn-= u N8h]1\qK!8\\p{Pe /_ăm'i{P,{hF(dt4oڋ8\r2mY*D^}ysK>6zoYF{ɚ]3 i@nV@9Mf$x[OŦNR|hgV`fr5+|ih:#1ծll+ P}b/`EfMxvIsmOͳSbg)KSCoYT~g=̄v K9}?T=v>M[WdM ZCaU91Ax@Qs y|ގ IX/B.u[Zl2O[ }CȪK(=k.>vXkׯ8C}Pa\R]kLMonZrR[fo.<1H#Q~vrC\ѾɿA9QA@aJq;#v"JԦ,K\"}i~8FiR&]&:%hLq4/o[3c>J)lK![N_77YGS1ԗa޼BLx-ܫer,}i RQs(nFjʃh'[Ruz;P1'ڿ&|CeA3ު~},kFEsatK K,]X+"~Fl*#I kQ^#4\2%Sa g{#~BK$_qY %h(n8KbPV2ًH{ҩ#=2LcLhT})ө̔ar,&sDx7t=#/\5od%Yѝ] 0nbi+b;?F 7+|}=};ƒis.wVKۻAܛ(:;qEA[Iy!LFi}4hpeCk=v F6\;!°'움.w`{N~/~ꅗ_yt?CdiA8Z{\Oxc,b/v9VC:w7 F:h/fkh./(^}Ͻ9ϣ.Y&Q Jsedכ%"R8~D 5*7 4Y/)- ٱjAD WqD\Iz(!IL) :'<%L R>"Քu/E]^yPfH;?/ Lb.|iOK;1сD.,X(q g ӝcOwY?.dP,wxC>Ɵݷfߎ@TuFsKY6<\s#e X/6%WԫK%+@hH5k? gqV~<݇Y\_0ڲv_fʉ©aaER_:1@ sCAơNf^ϩ߽|EvU`ylW(y\̢ NN)s[$.͘cjbT/pP[֩`.UxD-Wg^SƬIjar …4#AKJJ|=e?.J A"ec; 2g!Wq65>X$ k |("G38 <`G6iJK+sD pt{U3.b UWWt<3Lvf{ 8xA~IDŽm@g_h1.#~N[]~s7z*VWN yu盡{=f0'ԑs_ U9,h~Kn81M^ŝOgis!C!p$K3t%PG@_Zt k; D^IfAdKà[oX0^n5|^ h$ 颗 %ɔ!-DCL8 .Gl C^EK7fF#]q96I(>/Yc FjYrf9jt6n) >#LE LÍBr+],j7 ؅ yAQiC s X}4Yzn2. wny#XJ,="|h b55osBĘ0Ǿ| \`#Y,*C+" :Wg0:B'ttoRC.g_<е= / 0T뒣HRh;][b7, #Y& i˴UV4dQ||,A 4di/Q)5Mq>;KDK6A,adBRT*aJĎУ}(uǁ6q9T-ofA ē/ |C{[ ,+buxbW6+H,}*iIi%Zʺ¯STÒ. NE.U yu$SUvάgMLɧV{`Vgyǔ]4TGMh*QGPX&1abQ˘UEI֚Q !Tt\-JtgSƧ|YlȘ j>F&+~/1inCCa+P?:vLNxd?PfU9Ɠ_ oվnw ؾD֤-\wZd+eɽ ũ(Ǘ "-ĸc̣`oe `|udGH86{y:X/"2`)޴M?]=ȜJѾKZ9hUmL <ˡ57ංRvJ! OIJnE<:O>(]~)־x5I)w躚ACaJKn0ӈ,32,[k]=y g\n̫L2@:(M)L 85Vkk I~f9L2# J9_~|kUZ>ƹI*Z&<&ZV`3Y9 qS1"3n(@|)9! L-#x"N jA!v'Z؇'B^nN]ƒR66˫PdP=f0rP1Qb"0Q^ N,Hؠ;A#/F<"ዠGԉ}YՃ:"wku]`UX,0(GjF O|ú2@<‚daM'#@E 37#~259_Hۖgzs% M&٢M|O WGϗmR7dByR^,ǚEJn t4.dUHACh_2kvDwJn`%8\jBI}^}wqF9{3(߉_o͒i^jZ^J\A?(`E[;1YhUYmtf4&zjr0WQ}@G_[CI8B%e Ouؖ[z6YPuMWb$\Eb]S!;Edlm#ӝGƩm1~3_=x"jF h*EjWMᷭ.!ھ1UΦ}L1GTkŪ yW/rg:'͒oT!ښGZ‘*޺OAI&S#8V2YQSKJ,@˭YNy{5ձc@)̇|HhJnU5)L-En1 eyB>舁">!u:Ÿ7V4xBȫ'N#[s14J% :4}%\,8O @@#o4 i[.] d̪) ߟ%#Dg\L.qS7pQKhKxrXC j]F!RzXGPLTC%@_،|u3Oc*'Q't)aҶsh?oТރkB6ŇkWe #]Ó)+gZ-.>E`fKH}H5FȠ^)$nISu+fvl)a0Xc\#|{[ws|I11{~ PkJҝN?:qaF_7hCc. [;|دy A:>X>Udl`2pAl`Ɂּ`=iƍ E8;v'Tp;pT0,('&/Lݝyzs+O`'!>̞W&p,)(K^^ L!J#@ՌL^Y/l:SRq*Day=[G &lsh:iƱjX@o+Μ4Pa&$~8qm|IܜQ<O7?oWL*cvOaSoҗSt o6ր^Fk]`n8|S>l֊D\=PwpE J؂LPmy 9NA79'9PbIrxv#.sΤB& 3Qvt'QIzڧCm蒂{Y縞}dRuA )u4Ne$Ĝu [15@#а鮦aqVr>Kμ!vRHkFX6>oc?R- 4sGYgC>~dK4w;|(4㕇j>SY[UuO ]i9׋] tǃ((=ıU0NZ jH3 88xXBC6gC!x1/^X{+{>r %ςvV@(6OԢS1w~B31e!bo'd~R^`[?M',u{U %h֠) ͷp+#6"[Iw%x@!Y|tF~ao*MKJ"&W_H`"ͻ gu]S$|$ڂ.V闗]o[/b\ʖ͞0&K?ѤK,TWt@ i]74!Y\uVf7[1aN'k؈ F80T1 * N㓙ZSHKg΀^):>w8ϣZp>ov6` Vw׊wu'* o4Y.T IJƅ0tbG|zg}㊟=xIjƱ]Sh;'mp1J#Z ]1C ʋA ۽lOd-.Rq`q)]ehv͗(6ZF_R\رQ'.S'o氤P3T)2]!xX"lBwX?.дY|6@M9E6 +n? lXo~a-efEzW1AHjc!"bǠWch G}+2B,kkU6Ͳ~jsD/˥phƂGL4=Ke؏\aCȪGV*_EGq97; e%V\dz8`EsYZ]&i8y]ؾi@^e}jբ#钭VޱڦnV*AƄ$LJ?yl5;ܺg7H`w 4+Y*CSgi'ND Lv?Q|ep҇-*j6,W3رJ8J]2)LIL-dȿ.,ŞN>PqQKI$02&]Ye7qbڒtB2x?(N&# POٽ;1>ۛd 3#b蟿N]:>pJ.zk#4"P;eӆx'Rt~wVV(h>~gTV>&!갅nKJ !%dy*4-n盒?$.a'F/vUeJn lbZ$$5nׇc5ԀZ޳!^AkG#R7kV e &S)Kh3DrbmZV I2sb럔]8P?cn; BRik5w@WH )QI8 ەRWc~ě&uUjB`e]kۯxV]L |}Sl9iS[D%~4+“Ɔ9dǷn1Ćwy|7G3YK83d͒7@7r5V1UOZr5"| wЕTUIĥGhb0$|!Smkg)k3fݧot p#ՀsʭV~kJj웪:T)XoT(76$uuljtB_Dm9\lp b|햚wϝU* V aI:cQ`3,TѤݵ`JV}#[@Kfv+Ě~SڝKB9/5'TGzd[aFoD{i,Mn7|nx@݀803CXl5ջ8yMF7^B~8KQej1ѼS)z2]XVъ'Z]<4n3cBk í9<8 n:NKk!c`Kx![,o8X,d1nȨ#-HBA-DN?M#j-!zqhzR}~nn}(ns+uU2%r Tnl:t9mqq!e1I aѐgbZgDcFظZ`fEx]B7Ş9 ]\n !t^$sXPG:7:54Ԯs nLX.ޞ6Z9 ~[2;W!| `!(2|R(Ba?2*I"@;諨K,l)a`x=BmrN@G|Q/x٩wd45O-#ߴkI{J :6gfJh`JADY0(lpInUK{Vـ_H! ۡK^%F( !IemTA~͘bdC҂@TbCQfQ-Fo\Tyu HDc^K(rϬFC$b&v҃Ʃk l'j;W I.%YFPjJt¢/ 8Qkω B[QyQ)z4<-%)ёjp\ҏQF?2C$xǝzҟd)54qn\&,C1X`"R87ĕ_Oir2F36@8AzNVmI,eeot Jv-2bZoYǙ}\4q_4sA[4pK?.@R{b>`',5EG{ZtbPVRDuʡ(<ݾ˼I#@# Nʠwa;-Arznﷇm 'Mھ/=:NFztsNzD?_BB8|T ؛6[nn|@tYVV>ϑ58J a\ɚr?xd q!.NlhNb9kTm  );BQ s^ 4i^ZDI|\|$ck 6w4BvԸD!"NϦvّg}P P}2dO3 fx5^QЃ[yȘP9+&h#!H[E&|7\R^jW T 5`#"b|$upӍGsIXV@W98|(e49Jd<QH̔ʦl*kȖkUֳWJHCdv_[XLF&q'}1:?UDQis[D>O*ҮRRV:];$9ϖ$eCdDH9@EOxSpPjb,i̬2^o5;ˋ3K\xaTDB)LKB"-&A1) rVg\hӋyl.4ji22bxDtSVcg҆!Y&u9'a6j^;Ksv=&t_gU$Yhڌle x- &~F:fP;nM`pw"Nr_2<_]\':)^A9eM5Ej*%xh_]IjnV3bV=2BB`ALxs(<(ɥmSz!$ҹR;j#x۸ӥܶ1n]QR^) YtN`q)ڧS:_-&c0K>ї.6i>mѵ4w(J@u܈ci 6X(tWYTT`?( CjV%iYڗm0("Zk7LadAH J-LˀyPה|⻓ b1ȾǛc "@t9UعI& 3+gx7FfxuDAzNa#fv[zpg X 1EMnoA5TZԦ GZk/,m ]Ď=Wz}hRgW>&kj>B ЪVT3&SIX-FPwlחbA8R{Ẍ9cw5Lg-z}WD.Xc>[$I=&j vh$d,COǷᶭ[*nF6uйOk5OO*lCz뗥oHYo֙R@ω¬#IڐmUB·kUAּj_.uZ\3 jw,T NטtCpܣ"bmE6.[; Cy1q9굙4CeJqI7ؽ!Iҧz!uٙhV^TRya3(ڬS !;(T0^H\,<Yxls?_zNqi]ԼUh;\Y_X7datP*cܶ+BJNzE[M:g0tqFtK![NψG;F8d؎mtz]  \dqFl⇇U"s ^ 2}kde/KIV爿N%rzj246SPJ8NC:e䁗AB~Ho&2Eл>(,ó5q8"n|w񤆌ܑ_9 w8`I /_yUfdF7>~h*Ki86mJY<}Ii=t@WC8&Ux uy~_ץ_zktÖ"Yq8N\خg";+رz\qJHXvd(,EJ;AP2xϥ@|X,Za-ǷPWL6E[cB& Ε݁j'_'o=!A3IXc\g qi +IAA3(6}Rɜn53؆9n9!etllk(o_尫"7:|H= _댊Q:|, c%6f 7֨{|*@?Bz^H֚"Gѳ$f YG'>*PUܩF=L|QCQ[%$9`V|.l%O}K)#hș+KF:ݏvj^N@tC8X;S,22AZaI:}MP6oo8`U2D>0PWZHjщ*qTZz'\qVEPU&tw Ͱq2c?Y01@_Pk*EH.8>`rOg!K*(HzMp\v[4d8~sB] $bm){()} 0]Wc89LGԚ^%O2cRU c퐲f]"y<'CԞT-$,&N&>JL4`O#`Kr#[ӽ͑;pNux~QzQ03gl8¿dE)ؠ~=oCOsɲv mSG~$θWf:"X7̑O Nkv+j:\YmnQ@QFEma?'`@=>kU-F|% zWWD# '8G.qI.dş =|gwi Q)މ#j=w1m $׹M!W MxyuH2cӸR :cN QP]㰧ШdRtxtܟʥ+n{@7|<@a,Bӂs69q6~7hvfKRRlC qcHlptk~E|.qЄbr6&9;jBa鑤&g3OkH\؄ C4Kޝ}I[jEtGF|ǴkT'k)6t6 1"g5 r%l|Ԃ‡H2ϕ\(Em<,Q]Q>vƕfshMNyϫ<UQXFri* tRA~P[x>jDNX5ͫ{s3-G$>7FbSzpώQ)K; v dmCԿW}?0S`R5*a?daʽޢDo%HZ.8F/porCیtFʟ 'QdS`Qjo-̡􎰺l8ܤ*Ia #[WH׹JӪPᔪwx ȣdP틚U (E ^wL{b;4\W 6JOo6:ok@=0X,py:UZU.Qpcz&V M CI+yCT9޾vw|[_EoTl?UooBu!=$ǝ4 _fEyʤE l+7N]N׆wyS~ɼGЦOR @<3Jxqs풵4#7G!rq=sY`"@G[{uxFVyG*Q1!5e.Q y2DNH pmzbW_ՏClp,:Oi*=۝8]=/ro`&`aY_aJwvVA a(VŵA긱~CM^ܱВ/C֜{tA ^j'L?d@Q4KwI\WW8 ;Q`C{8J[Œ/WݵJZSx60s KCR:?Yg^O-±hrg&IL!>b1eιkƮ#moUsEĘ}}eArg#YJ 9j +SJG}C]%( S$niH161{^YEE:i.y?{|FɸX氶_I#IzTJ9b`% \d  r/eEH6hND5Q[N_N|܇[S;DTPCJO~F/H1`BTeuڕ,N;@Bc-0O9GnmՙEiwsHA}{: Y7`+|{FV_Yc J$pܲ :|A) }Z8ݽ[c toށV%{מ5Xg_kj 1mXdԵD?QM5-e/h:MRlgeM/k[ҥ;s\^w_o-?[k|?/s0,5 V9\T.Wcjfy[! &,8n:Tю[axxz`H,X?F'PKAle2S5ŸK:crD8j##džQcʂ|ƀEkw-#7ixϋф?)lbRf.۹{K`{<(csG ڑTl {U)8ʚ_zßu6JfQ ;1 L}/iZ;?yy^򾝞~MJ/yr4L})3fZQKelmѵ_!cm+7ڒDSGtG|R O^`,% لXQW CW<9Y[vdDo{M[AZhptn3rc=37ViZ3%v!0K`0j*#c3Y]#򜑰'M$1x_,ps׼t%uDNP ?+wcCS7P3eZsb]34TFr k:gR%UDɘ< YzSa#JaKF񏓜ߓ(E X+7i־}u.sۿkڔ%GR=6)>S gfC%JW.xI=e &KhX6@6ڡ5 an }XygDpzar 'h)C[jDRR)"c'Q4\[ma3O+1Q39qt)Mm̹/R|g(([+nҥ}}`H( rJ[ƪ%c2A˪%d7fC4ل&], {<ݸS|$ݐGb(O#*uB">?5xpsJMw7h=Jۥ *w.TzjXcRBL WCD}~CduޔGm(DYX^)GM51Dgpvw;yɲʐF*L\{,fEdM@O:++Cb0]o賙4KS~rYzMTK쵾6*MGnm.U^++v-3けC.nfQlJ?Fi|G!?}˴]񣯴t Aam8;YaєG8#|?x }+˄%%y^V%Y?6"R15/ + pCȕ"virѿwm&op-&4n5bH+ yh=O(0Qg|?V˕W9 Qb)Pߊ RQM΃"^6rL9eMZw=(d,$6J9hL?B!*qM"A+-"W>=U\2KT`2:xھ`yf^m@mGyVfԍ7NZa `!O0k76 ` _Oۖ(r%u#o "aԹnC n.hd(l%n8iUj9DMNm!VI2،#|`XqOdk!G}Vus8zF~Osz8",cUR{ԙ𽔧0eQK/F Os{ŖB4L(SjM,ԝB,}/kX Z#fV巭d xsD6cQ.jyCok|0pi?6k΅-i6XNv>q %#8(-0`z\@_9ⱌjIY g>p!\qIMHa~{@*I>8Fy&2QEAI[aAAMpbB|3" oDiW Wd  :H'yw_D[SW) ]Bn>iV>GTi]t@r䔶VvZ`)G/mۉN 4yh豱c(]dwlXULJ;9>p?ѥ2f01(th__*ypH0NˋLBH~*hs4G?/v@نٻe@W7Ii#Y LkǮ-"&{ Z9{N.3JՄ A*ÒgV YiyCӏ89Xb$T'3AqSҴhm!K21Z}n>'m}6~HuAs5&vmD I(0. ]B+ܥ>ű we! [A6$XM5ze6ϻfT (GivTĘ*7 D}׵ul 8A~.3PišիzBO4\:m]]Y#^M6xF+mvO5 joA"mC EY Pf!] 2{7_O[z^GN L/99I8;'lq!_e;ԩjZ]oe5% sT)ep_l2/W̑ŀew9$ݑ 6?+e npێF<)dž^xOZWr. p& -rN# hcdp\>?fwʧbEuWb_S.-T"G.A\"I41g: 683޾i$1mSȞ͐N%R&*+}FW;%?H>(|Sh9Tu+OF<~xd&4`m) zǴPNw2l^ K`)3` X Js#eKglb%ېG a&_E)R6S 72|AMnɟqnTȺ94=s.|cSwf#0ėf`F,,-B ֥h:HFEE^%>>$WXhxO.fB{Ly2Y\rD&&~[a+ JQ MŃ筹Ő<'=jjo+ W~+Cs.*29X<ɱ7n]z~h|lSL;t):1dTfkgW{aKl]'t#v@mn H7aEm*~&hy|1dvmK)ܗ̌1AfzCl??vk^UF>*8|M7Z7f ȧ粴ZC;}w4AR`yPTQբwA!//1xzF 9^冫U#O]ZmwCXa-;OT=|WP,NX *WXE{pcp)AXmQ5M(tk5C3v3{kFty,jD()₍ˣGM1k|MY= K6 l:ifr~+:4;HjW*yA(^rʆ>^czpĬ?5v4uɈYFMuD%Aw?47->ia6 .sZ(jm>6w45c'V}MgO#=w`:>U ?pv _^=tReCnJ>^ll +~|us%.ZD7\PZ IY<2LtV1 @Zn E|js̷?|0DPGCì^*w0s O܁XRXZl xϴs2;C{6rX3t2}~ f 0IL6al?!,(BX]-|#}jE5Ty^0{%vK-m8 [ӼM~jquԙw*Gg ֙{&+/u@gԮUءZܾXߟv B8H~2.Qeܴ]^\阜(zE 7_bh`Z^RwiϣQ~,S[Dg9Ay$YEZTy5trC]gSg ]wcS|94~(@ E5L^$I@6{s/9ƔWi(*nvJ(~@C>+:qYq߹-Ȭmx|Gq^>}MݪpiR8hMң6e0!Ra[0_g{X+YM?MC8BHe"ձ]hv1ˀ,\ <0K`'ofi4Ջd [ p`]tt>2T p_P5˚ <0jVBTj4Xg; z螌9LN3  ?a~w!&u'tfCN#;u}C}Ra6Ս3q~^_wWдjq߳FߵE_aJz,'gt=/:RGgk!ğ,0Ua N6gF>עJHF̶f{34BNey/%CU!uM'3𯆶Z >U#zRsf~|\͏Ŝ(hoTK!Oy$d_&8=yvCr\M[Yʈ ;JE.֨}pz?ίsdn^Jg%\#")rz Yu ~ydÃ~R6p|ӥHNAP|bgX Qx=W߃(J3*q: p~@2)8J坭 Lh[ V\ߦ(h\²3ܣ+q^F\f!3V^/X^{1DBD mJA7j̖|_xu8_/QV'Zi]VD0qįNZrE ([, nkkڣG*Y dۣSD)Ȩ;`$SaYrgbt @wUrdJ0Ohm~ .38Zasה.ZKfb:rZ9w/+Q: * S0/H=x>Z4^J7 +#Z>N:ϱ}Kh{9bC l9pӡ6Ϛ_L ՙTc7ѣ.K{='@\̿4 !$͒٬J$ob]?erk|" 9 |#S@DmxR"֜yx/>G>Q HߩdaYM\F܁gFؖh{BQVrB̔}T V*K-WC# |T;"3W4s=GڣV# DNj%,[I˒{^9%EBs~J/:#3x=[g{qO_o@WH]fG w l$vtv1wm&}u3><S?!f24d<-0ľB/ʫ9~X^ ׻Բ҈#|U'|WNrj.y)XxE#'M`b@ʿ&{}G@fχ#os8#N۩ElXYG1SQ r t0CM} X[ۋsgK0|؃\NDt.@V/,si\( s@+W33brԐ :7!*t>8D[+C,ɎsjKggxRE(ro-' n0RHdqtrM(ЯHHu P7{fq>W^E ۾d-Uxg?(,"7 I1CE {^^$4)nYg}"L|rt{:R}GtYHV߁d"aZ_Ice8g$ b#GJ3+in%:G6\rۆHZZ<ߔ,mlg {W;& R~ű/ E * !ĆA!< wVV5̒E?R>!-Q HO Vh"[@aP87P'~7!mgtVa XF3 BWp!DfYgm, J|COi]vԜ(LJEt'RX-Lv9jZN,jV/j|N->Պ;߂io;7[_"Vt/ab|nڬ=+PC|@8+bܒ lf#%Ur}Y6dX15X8 @+f\NfNJ&z<wBrh94"WTDʄ6i &Qy7Km8gc_v5vH]*-S@Ҝj}~sHJWO^=,|s{iRzQCy3+UhoEJBdKf|+ IMXs:ź<k_nwś,?$$䤋 b{T,bWU Wo=ʊ2kH2&O"\p2&lV_ya&X[N[R3Lxے4_`E\_5 5k[ƥv,>_q8G c'ơ+X8e"F¾9dل#6M'+F>5,~O(۸ꊣ5CB˒\:GVbG#dO ">9Bi+H՗J ;c >^|bH|FH&IXdf*1O;SL keU% ƳP{gxԪCxREƢYaN7|t6kT0m.+Zb ͹͢y[Y4iObĩCF@2P7'|2GrF6-{U}$̷yt~Tr6A'ϨAc*)W޷?q8Kη Wױ(sI~xhBvrkuA&2*;q^Lŵsi&oUX_71,"V^r5r3@4Wqun}[>̖<=$=!y"̀Mwc> Va`.vOg ~& yӮpFJ\^MʷFof "w=UjCW'ڞnc&Pՠ )L6&4~Ma:nnR>{xU|&[ãN#; JD]7ThY rh,{`bԍGv6J=Qg HfՈz{o k?ņǥs= \9-Bu=$?a.Ç&j`sqQ  y1/&r܀6=RosndQ,{g{ԖC)cS@ZrSBc tیiyOI2j9AV3qm9%,ɷGk= Zn*U$-``^W9*RԼ7"@wdVBN?Ww.{3tYhݳXo]R؝Qr::Hٯ 3)V:Cgt^8&|1_i@MپƯ,&=o9{Qx:XUx% JmUyHpK~ oʷ2)rDrr鬧h$ r >\!0BY#lg$}],4[)y,]/]u4q$| xNر))<'e=7$-Зc) r3wu#R7m@ye?ӳ9:@dӧ.Not}*b4kUCIj"씆f0Σ֎cK3, Dl7k1s,OR& 9tOlOxLi1JrYŜoc8ZYI Qpb6Uudگ "$~7F1JUmfwj 9Ά<ҖQ \AE"h Lpܻt\M  מnk*-KYOVlm^CLjnHnÀ>)X/j< 9(5Ҿ 0?h\zaXJM<;q#&R.N欝Vpu,H"x0A##WT ;+: l7ZGBO X$'ᰇ= #D= g^iaGB7Q#N~:\a|t6N8PpEqkL48y}Q=rAM+(h:qF3`7d)uI Bύ1sw/+ݥ_(-M,kıһff`*AӰIv>veEز Ur p 9+Hچ*GzmO$Y¨rv2+up-/;)CNQIdZ*﬇Ř:_GF]5C Qm mRPf[zeQR*za<JTMTΡ n-:+eF;7h-.~s!뛚9@ fJ|9p3t NlOz xoŒAn 1-rwS ԰ߊ_TTR%6 - Cg`T9NhHUO7V[A6ȗ쟯N%p>ܰ'w6/&I*!(?[-SiPՀ^RX(hKGxݣxQe{S4Wp9T+ DBڕW:ouW$dRJfIX $Bd^5g \!tiL@:tb֎*JIte= ɁCC$ WgkFg _ #=B]-6|;Fw2z8c烌4\Zkp a1;VN\ DG mQtw ++Q*2MJ,B^}Ps'<<|<)r"[%q.do$ ?'9:wtEKA69xbBvMxf2\ ͍ӘأkqQ-NJsqE}r~Uk$ ӸVo% +U8iJװk5$:w9:zQVjq6 hBJdBVϑHbs[X>WJ+Qh-dL!)PC%Ȍ~5 yFSlmݜi˟yxyY6d὚[aadl5 -dFVSxؙ 卒'לf([f mss9TLt -ʤ߮n 0bQzs76ཫ)Up>t S VD>)Bʲ|l2u3jIf׭WTDVXN~fv 0Lo8YR#BJ]d8~zAN3.ǟ:xd |:?  yOԪϯc?Ajr{#V)Ԩ+!Mx<$zDfUR$W4]K7U鑛 e7ڛqU͑wsd:Z*zpRo8[EԮQ/ ~fK\kq:Ūd^Y@cNLp$Ќ*iY"4T Jnq+ɑI"}}_݆4A~UUQ7K%H/`@Vє &n$ )h9F>`S;0K}W: ȂNvz ͵Ipf m=1,)?|?qbr&fUN˵h㦑Szoc~.ɾ&19g[̛,,&)ߕD7ա}VL{)m6]\ưk@XO(8{{z TB}0Jd"ÅbR}6VWJғ_& 4$dOuEU.-nmV=WFmv.!=+Zܵ9LHw?5| J4+ M`kIJL6c~؀)NiQU=ǂd-wh3.g;g%2:ͲahȔW=l%{ɠZV'sxEɇ;3`q{{:s5dsiw~'}U2:}x+Ŝ4zhNͨ2R3򭴁Et*Ll0z V>il 7秖_㧨)m%!Dľ@,ʴl-BMTYי(-_hSs :SeZ\Oh $^@ˍ;㋲h987Pq7 =J#d:LW*A?&TOQ l9h+ "(2_뻯dުUw 8ȩ<+\C--}u0v>Fo_cĩigZ«܋b`9ђT^U&V@ RK`*V/3=4k%P9S3fq(FC9 U)!ǧhO@_ Tt\*f5 oRoYMՕ)O/DZRKCjnaIx#1~ ]D]4W^w&\zjE mEu9;M 5X82RB2;:٥O "e露/j:G<nmo6G*IB^05O1cbIs7SX(@9÷]d9h<#'Ǐ;ޫm~}U!^켺],wn`34`r= ff̌pfv,[vO?;YHBWnqDkq:ˉiht!ibҭ8%rĠS;0`\W `haN SӶR!1d.*mGԾ-30wW* 0m "j`& <إ l_@߀=Iia*?8K?AIAhL f9mR8.wn9)Y9}358kF&:贕>1y))rA{ *K6abKkT K768A&.P{g*T6E ޶%mE[3I˒ֹIEV:7~΢U,*`ClL%U z<@S\:ٳQj$У0VgO4)..a!2(G]-"f]:ܟЀ{f  K-Ivi|.~]A]$ be{fW fsȐtﮕˠ~0h8<*T<Wړj:(`|\+j-1$ʵYlIqb9RAF@r5Djy~x>v&4>h"t܎~ 7&ǝu=y= EG(NV=)&ɬ{z‚`԰tRmu& ͹))c%= r;lVLA^'L1Smo{<#ݘ Z>F-o L V̷(#R+=kv2λsH XS*O9 R)STD1 !@lqRV K:"MY2;psf4^ę̐[xXxXJ:q%V}%U:ŬNJ 8X8y4NL1p!L4>wAr|K"|7~kh68q ֡KcAֈ!|&ߢ[|41DkUtcE=̏Ň6tՅǴ O]t6*[0QJaJKұ6 O$qb6tNF5*WIb/2߮Ơ/6Wa-5Sif7mHO4$gďGP[px5CS;$4Oh^H Ҫzi #9BwnIE9VfHe/Um6m~.N>)rx7:@k:Yu$#q/'o&17r~8.V*@"e< 9凾~k"fGt}~$KO^R]].J/O7OjPֶyUsdԻI¾E&ׇB2\߿4,\@9onOAe >ڳ*WRJ׳Ea:ڃ6Ŏk@3WqbF๯ +aSS>h9`."RcqlY]7~iA/FzKW0Ewv\i'`/3wvQ;3;?f(BA(sqs“gFGku :]NN bo\-=@Y*?8MIҮV/ " ;Da, DWKðuזEl?/e*=Fs_DTSx[DrpߋAy:t6?_t_eR]H|!0D8zɹg *c>7!>_şg1VVϼ@WS[,GA+(=7񆍮Wj4ߢc-RI\ {9.FN(\ ȼYN%`|*`8>Q Yr)Jء46r7T)U(xȱDrH*<P,ٽ\3CDnVFִʹ CK@'2v,۟-> uoU_KWAOO3[@K&؇8N.C8nx.̈́yp^7͌4zBԉe*OlgL~Dղ7QBF?';کuf$"lZ yQkDm-_ 9 &hQ|i7O1TنEEcnx+@OiwmbJ> }Ne:(KYZ?!WSBE}c2/nJqm`r]l6u[Ƭ8oQ3jvz< R'-ˢP(WP+$٭V"n,\NVao|>`vdSJ8byV\% Z֥HIhGco0>zWBc"q71'Y~>nпϹՀ&2=!OKb3}ąr1\|C<.=e5M.B*ժB@_3{B,,zMƌ,zy`s'kp XLi\hppG`N9UL kl@_ݒnH(Y\eǐ<(`aA8,4*0^w@[>hk6]j.燛*t|=Du^Ȍ2K|DC[\0=sz'#T@Q Hh6_5'<)Ӆ레4i-Qjwdw$pkxX-0*6 'Qv'I""H5ff!vc0F9dY'$$cMk.ˏ5Rۋ+~&ι{ܔ%aT'(LPr[xib/21ݐK"WlQߪY Pxog"DQN mp?i<;,!I *D|Hx>O7 U 6aiَH،_m`YbD,'d9D"Y?'2ٱ 4D:uA>p dUMJ$U8]W!L QDX$=%e}<]^;:v(׬Uħtñ%pszz1 QïySV'sr OdźZ#{ۡՅW)*;ucNn'e}wZRYlaZʺp*sVj^Wd!iF|̘HI7GSԮR _%96.ՉLb}lbum؟x2sVVž}aH-wE"0vgFCc[Ŭ/bX,-CqgeG/p[$ט Y'u^<`{ kj(g'~PYIJ_<(!?OCשuP2X I pގtQ %6QGUL+!UApcKi ¾-"AyJ~TnӠ@+}v\faY'>]-.=5a[c=:yӢSM7DVKGfrXLwz8 [ߡص`Ϧb!9 d8QbMNSynĜVՌ̨P!MgljgbiVfRm{j1QcT7_q\oK Is 볇ď(HdF,Z-e@K %iM7}8>b-W]&ٓ!S1XgOclXf"UUEg[@RZrTj(ou1"R$vþ\(AH'bJ͕3 .ucC5PGibΟ3}0㽸]{I~&BT3v -wr$AD~oPgQ;g{ ky!b`/0MU|oTOuW'2Ћbv 7}q6AC<#'fq_(G $$pYXpmD7uI[0^Zc I::Y̏{%ܟZ.LF5 /n/)"w,Ѐ:kPݱ=sL;Iʟ1>TwOXQ95b(dԥLZ\k}z:Э / v5|Rd)R5MCO]O7o\>?RwaP* uAБn@0G'F9 " G3Cm@VP0gxeIowp<=(7(ϓTX$I/Y~Sz(k  邌k9 r*H'׀}Zּpj)EΛN;NAez 6ǃA~, P³*Ś6@ 0GKfw$XOPF*k1!5ߵb?D U:@(ky;YpgKE>*TveLяK|ۀSFUQyvURҚsvX[gx ]vzZĤ5%VrdPVP5F\&'0dT< Pp?O:3'=.(JeW\w{0?/[Dr4bwC;a d'tCwfE2Y՜3DIiJnqJY>a Ѥ_@kK $H 5g8>I F%E:43Hdjwsb!>,UqE*t91r6?K!h_'gk(c \,8ĬœDY=C<(![ӕb9|X}N}3Ǟ~݄7Wc|M66րW&kZ"uwAih9l*% Sj_{qqu+T-W H 8tS 3G6ȎO7 ~14|jm5Lc :hj=Ԭgz9p 6fWS~5!PcrcA.iR1"K'{irQGE+ץD I-M04dxԺ.5D%&I>ޅ |8h .:`a|w1YWܦ6{Aw7v\E&wy-f$_kZ6RnЕpͲ3WUtBgGaqEܻ~{F)/`7 ڜ9ѯͩ3ѣ)]4簛 "MG,(LfQ R[/H+"%ahdrj Bhal9`7K)HrtA>m̴ˬ{1{-Q2.TsaGD#4JY2D LAD4)!M`CC DŽ֡ɵAL]F:nv0RJǑr ~`!<;A$3at?gfPD^Roj-[CG1bu)i?5S8Wj,W[4.k#H\e4j L1; S _2LlJ9ħAZ`6qs~L8j#lrhY&p^F|,64L{@"9*&qk|D J/n+V*eBy{.2#^D5س2gd4I7(5Q?gxh}EQ!KӅpݺ%8,f5xτQ'wz>__20v%ƳTIƗwsg3ǰ@423B c#*ɎUyB_'Pgi^{}(\ jMr)_X'H/ ^1H Js0LsOo4%E' B:[R%v ymqd@R#% #b]_Y, nu@qH OVh'>[6$ ^Okƕ5 𕠚XS?!uiΕ}I)z5j^źU4S 3p< w4XĸMzO Mڸ^^AUlWŏ1fV)DTlb|,}ڬ^thzaa3oeP I0`q9RG!@DO2?Pڿ6`.%c%Au]y7ard*&UL,\/9QM3ݪ 1٤ MZs -ڢHu7p:#y$< c+1c(QliOU|NFZuƨUMGLpŊU:L4Qю֣p=ӆ=H+yʮ0MGNLF=+rDPnj^d0F4֒L3wDV .w̡JNOΣ1dD~5 yg,lL;?$ MnۓkX] 4H:6GBZ)DHv~Nr䡮hcC ĸ/p9 ĂC)5r.;q^hBd ]~$:1.V|t?@:4TZA B-ڥq#etU^RXef"^5;ȉtFgj鸭TFXp- X<]D2QnqyQ-Mc$,{D%#Ėg񧀔-/hods8T99;IE C*p9$ L5^{ʻ3sweEMnIJkAOCJH;q ]-m 99zQ!<@o Ћ6=:HXb)@^ ]$P&GCVɴb@6v>i~Gqk`=h"deQ(HׁV+><HK-X|Sd=K;|Нb}JgX(0M;KxWQD*cV'cڃ"Y$0o9D~W_Mv2UC ^]&gԵp95٘W,#=@m'4J^x_{,3'').ՉԃYُbU =@@I?XKwK'=CC"EjmӞٜ% | (xQ펖Yr~4g<ߴx R {|w+Fr*V)eO(jvp\=¾yխ9޿$xֹ%G bR5nY'neAa14tCEU!tn.?x < $XrM x}t80٫[eFBA)#`fLۨgfasS3DEݤ(T 6;vPx:N yd#R/~u-? eM/aU5THɋ OE&RO~Ȟ".Y˧ KjD\yJ`;I/X́7^Dk5l4˲7\E3U~dlrfre5:TeLBik7EPR PLTcq.BwD:uؤ͟+A1|@t0;|55iqqW[ kcPMy'u8n<ߪ]X< #-d,EMmS 0d"I{!oԯH `J93hDN>'vTod}XߟP9<+ >?!⛊`b=uG~e-^p{ukZt13NY{r֝᫵vU nF\L0cpb9fJ$dqS&w䙖p @mzZ;$N GE z6H - #w9 ]i \DHsU߶(^ tZ0)bYp`9%(ԃYUotk HpV /] ""WhnzngZՅV)f_;g1-8^H7/o{Fp+we?+jGKww#AWn9]&jU;pK96H QV9WjF0^נ+OL)ପZ5-gzd'|)-aR"IO|sƁeb(k|cuRlQQBVf jjĢ@obLтb3%h<7ޠ[);1\{a1Ȣ$$ :Ŭ~K,'/EW%vA @9~:I%Qվgo^J lx@K^{VcfFS앑zi? Qv& ^(+,q$= _;*q$#= 2?)w*p^du /F YMZ q?{slxtrOj]Z'$QWj,270%,g6 RSbF_Ef~cآ>Hg nI }S4!HB^ۨBoPnڱʵgL:bf^ݿE!߹1D`|s_a>edBk<8"X]Pɼ@|Fi@QLB]^"#s67EXGSx]aPWH݇576YUyVλ|Eh(5 I /+ *i] $4BG9اoYMi~}G(@vlBDuB7TiS4@kʗRhb祧hM;n ^ʁ v&Q^#'=2mawyaO}o_ȇ0mc(]ɷJx_pBQ "ljeu)G:S;,g-jGd6؇D,Kȭ} ?9ina/YnQyJ~X)y'O8:hcb|2CAOIhg^X3ނ-56.?cՋH8X{TUg.0%ae1Z=pǪb=%i%pɖekC F L f8,) 99e YcT6Film\6)X { g:O UF,ehiYXu5P6 wYr9P )G8&z!~IBQsS vǮZ-n#:'~$~Ƨ\: 3*_HGbIv*n0ASLWufMHz]s;v0qyuBӼ&4"_Iϙ?miC<;0( b 2VlN75_;s!:,K,7nu'憹akYVzKsR d/"0w{QGh0SvrA&l@✖(m'I[Eλ',~Qlu7W ާ=7Y g\^8[j&񪦅g4瑿+etcN|:ǣF/er0,{T XT߫"j2f&]lB(yZ^\|nȠI]DoAIAlL ?~ZZg )S%kpK|kw_=d#FS_~WȯK|ڵ%p*vqK/ljh&!/XNJ^ʂiJm %Uor[Ӵdun]Z 1 ]j 32 (̢rN"IcnpP+7d&&X!afCN̲0 %LH.Hlrq՝ͶA$elKD&Dzhaxb(F64ޒ߰Qt^WX̉0mȐUyc 5u3Ç:GuCڈfA6Al1ESM'd;cGg3yֲ7<Пkm醄%&GPMV7$/P;=v+MNz_yM:Ö)=Dкǵ "p^ k;kHbǕ`"} _339585e| |w$k=(h޸@ C0Qa.Y Ey/PTwIUjn,CJf9ʘBܧڳe騤K=b*U=2 7ͩA2