pocketsphinx-5prealpha/0000775000175000017500000000000012771610005012456 500000000000000pocketsphinx-5prealpha/install-sh0000755000175000017500000003325512771605157014424 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: pocketsphinx-5prealpha/test/0000775000175000017500000000000012771610005013435 500000000000000pocketsphinx-5prealpha/test/testfuncs.sh.in0000664000175000017500000000234112771605033016341 00000000000000# Utility functions and parameters for regression tests # Predefined directories you may need # Stupid broken CMU Facilities autoconf doesn't do @abs_top_srcdir@ builddir=../"@top_builddir@" sourcedir=../"@top_srcdir@" tests=$sourcedir/test data=$sourcedir/test/data model=$sourcedir/model programs="$builddir/src/programs" # Automatically report failures on exit failures="" trap "report_failures" 0 run_program() { program="$1" shift $builddir/libtool --mode=execute "$programs/$program" $@ } debug_program() { program="$1" shift $builddir/libtool --mode=execute gdb --args "$programs/$program" $@ } memcheck_program() { program="$1" shift $builddir/libtool --mode=execute valgrind --leak-check=full "$programs/$program" $@ } pass() { title="$1" echo "$title PASSED" } fail() { title="$1" echo "$title FAILED" failures="$failures,$title" } compare_table() { title="$1" shift if perl "$tests/compare_table.pl" $@ | grep SUCCESS >/dev/null 2>&1; then pass "$title" else fail "$title" fi } report_failures() { if test x"$failures" = x; then echo "All sub-tests passed" exit 0 else echo "Sub-tests failed:$failures" | sed -e 's/,/ /g' exit 1 fi } pocketsphinx-5prealpha/test/data/0000775000175000017500000000000012771610005014346 500000000000000pocketsphinx-5prealpha/test/data/mllr_matrices0000664000175000017500000003531312771605033017060 000000000000001 1 39 1.658844 0.456454 1.697177 -0.140170 -1.700637 -0.023275 -1.618604 0.143187 1.817362 6.739734 -3.744134 -1.678599 -12.395658 0.245658 -0.151918 0.458138 -0.981924 0.450302 -2.627365 3.946000 -4.309544 1.837908 0.327204 0.787412 -3.232846 1.324975 0.133191 0.793986 1.133545 -1.545364 -3.121740 -0.863377 -0.434769 -0.928298 3.488096 2.691280 -2.483173 -1.783346 -6.756420 -0.056027 1.176386 0.287641 -0.144802 0.284521 -0.260954 0.484907 -1.122646 -0.724231 -0.584845 1.147784 3.406667 1.377668 0.024459 0.192060 0.141111 0.120268 0.121169 -0.196597 -0.271003 0.502137 -0.859280 0.553784 -0.707492 0.662394 0.025228 -0.009339 -0.119899 0.173480 0.000935 0.648955 -0.452886 0.226763 -1.066551 -0.963266 0.070098 -0.017840 2.503832 0.047010 0.157176 0.311378 1.142777 0.518243 -0.308155 0.591694 -0.954232 1.302290 -0.268517 0.653788 -0.876877 0.563312 0.197567 -0.012782 -0.072142 0.083440 -0.027713 0.016758 0.117524 -0.213995 -0.104074 -0.517449 0.273125 -0.318904 0.487765 -0.665461 0.071675 0.074136 0.096246 0.391998 -0.225113 0.213461 -1.019168 1.130729 -0.857623 1.251452 -0.813337 0.123039 0.358284 -0.009870 0.063006 0.068939 1.141810 0.065757 -0.071102 0.132762 0.309100 -0.285600 0.562503 -0.822244 -0.564703 0.450190 0.022129 0.034101 -0.152727 -0.091824 0.409105 0.009798 0.127542 0.336276 -0.375199 0.006714 -0.150307 0.110288 -0.046956 -0.063795 0.037174 0.066769 0.093408 -0.285599 -0.378855 0.037653 -0.347682 -0.304429 0.023166 -0.280691 -0.295873 0.253954 0.096691 0.071534 0.081377 0.316997 1.291658 0.457334 0.026353 0.613723 -0.285063 0.252387 1.141488 0.064244 1.154555 -0.018644 0.028998 0.078629 -0.047668 -0.251977 0.001076 -0.317420 0.314838 -0.167854 -0.025921 -0.412723 0.364250 0.125104 0.042674 -0.021141 -0.027400 0.132932 0.309999 0.146450 -0.000990 0.301781 -0.218383 0.187151 0.100916 0.472391 0.111725 0.088015 0.155177 0.258313 0.056165 0.181952 0.887670 0.498853 -0.297063 -0.014585 -0.312201 -0.206012 0.796352 0.707932 -0.020120 -0.019185 -0.020694 0.110800 -0.065325 0.264592 -0.554074 0.069683 -0.654455 0.317734 -0.439290 0.476467 -0.459004 0.018910 -0.006805 0.031230 -0.046219 0.088665 0.055855 -0.104331 0.260519 -0.556230 0.151885 -0.702465 0.561127 0.249457 -0.137819 -0.231923 -0.197729 -0.194776 0.122926 -0.150293 0.749721 -0.406542 0.304467 -0.209206 -0.248758 -0.638003 -0.016376 0.032551 0.035189 0.055405 0.266370 -0.059256 0.279764 -0.115782 0.382164 -0.219417 0.238123 -0.332204 0.667383 -0.009459 -0.011395 -0.026611 -0.188893 -0.084391 0.144474 0.094070 0.262133 -0.291623 0.424523 -0.377022 0.259694 -0.561517 0.128962 -0.061064 -0.061182 -0.017095 0.050781 -0.224141 -0.412514 -0.260257 0.695635 -0.079232 -0.770023 0.338447 -1.536034 0.287502 -0.010852 0.002075 -0.058794 -0.190029 -0.039416 0.034664 0.147390 -0.031168 0.357937 -0.623754 0.330012 -0.355721 0.064675 -0.046165 0.000264 0.043420 0.228470 -0.082547 -0.231811 -0.122882 0.048155 -0.039603 -0.039212 0.415449 -0.688465 0.133058 -0.003032 -0.014400 -0.037674 -0.043037 -0.018392 0.030165 0.556859 -0.605938 1.072558 0.228369 0.115062 -0.155795 -0.487637 -0.019087 -0.025801 -0.173997 0.058212 0.000590 0.092779 -0.116813 -0.104109 -0.104660 0.039615 0.146968 0.049248 -0.245417 -0.030001 -0.058387 -0.032793 -0.144267 0.006351 -0.096749 0.413932 -0.566461 0.518134 -0.483914 0.359838 -0.310722 -0.278555 -0.012348 -0.097663 -0.149738 -0.077464 0.077950 0.462498 -0.155035 0.051336 -0.410632 0.748241 -0.101878 0.499367 -0.245713 -0.005551 -0.058125 -0.022186 0.205425 0.046191 0.211724 -0.296004 -0.010559 -0.040271 0.140500 0.438024 0.174090 -0.304542 0.028655 0.009264 -0.009535 -0.012617 0.114086 0.173844 0.349742 -0.097473 0.236008 -0.239408 0.092980 -0.160397 0.500132 -0.044784 -0.008477 -0.030726 0.057671 0.064954 -0.129124 -0.182460 0.085469 -0.090365 0.537509 0.451381 0.612787 -0.223201 0.013729 0.050173 0.018528 -0.125921 0.041814 -0.074566 0.266291 0.153607 0.533429 -0.359322 0.198747 -0.303807 0.373594 0.001919 0.017933 -0.005163 0.005718 0.234966 0.054941 0.087671 0.080058 -0.142029 0.237429 -0.095788 0.448079 -0.060138 -0.036070 0.015476 -0.186694 0.056422 -0.499497 0.364247 -0.058622 0.162852 -0.199013 -0.075247 -0.883502 0.483471 -0.285353 -0.020073 -0.029303 -0.069133 0.024901 0.028249 -0.004290 0.003234 -0.104477 0.266427 -0.144023 0.361343 -0.159755 -0.069092 -0.031605 -0.013498 -0.140111 0.094955 -0.308054 0.374155 -0.263782 0.299926 -0.309477 0.054591 -0.602868 -0.216990 -0.211422 -0.062189 -0.148736 -0.077555 -0.124126 0.033966 -0.385758 0.005879 -0.143885 -0.064713 -0.685989 0.296506 -0.565712 1.413813 0.001049 -0.005909 -0.029308 0.033646 -0.047543 0.152966 -0.060242 0.286026 -0.076611 -0.076424 -0.076999 -0.140283 -0.020257 -0.015917 -0.064759 -0.048091 0.014858 0.027096 -0.111285 0.127549 -0.133909 0.037310 -0.516408 0.402077 -0.338134 0.349384 0.133129 0.269681 1.253587 -0.054055 0.784806 -0.615812 1.725658 -2.254685 4.248352 -1.900488 3.812829 -1.918648 1.751673 0.797139 -0.151473 -0.202890 -0.321107 -1.614048 -2.057842 -0.214852 -2.380584 1.066966 -1.570130 2.748646 -3.400929 0.706512 -0.023138 -0.258856 1.372326 -0.386137 -0.328617 0.403584 2.345619 -4.924479 5.709802 -3.780240 2.635981 -3.205473 1.769191 0.018613 -0.014085 -0.247080 -0.103040 0.153980 0.388362 -0.205164 0.929807 -0.240945 -0.233319 -0.146365 -0.972308 -0.224435 -0.057767 0.983281 -0.558570 -0.343202 0.367569 -0.303745 0.720323 0.236601 0.922577 -1.403979 1.815979 -1.101758 0.819431 0.058025 -0.004031 0.090215 -0.019406 0.782604 -0.521679 0.011197 0.616386 -0.793517 0.452908 -0.296984 -0.626865 -0.092686 -0.116787 -0.047567 -0.221766 -0.046645 -0.353559 -0.239288 -0.234680 -0.157800 -0.456136 -0.052018 -0.196223 0.392076 -0.354371 0.040327 0.127095 1.009632 0.161981 -0.167650 0.130169 0.072246 -0.368206 0.304671 -0.539048 0.548237 -0.003537 -0.190645 -0.056439 -0.002045 -0.293110 -0.225561 -0.139074 0.236966 0.029825 -0.046754 -0.032776 -0.673517 0.322955 -0.114249 -0.051597 -0.021566 0.000855 0.058337 0.044372 -0.172670 0.077764 0.002605 -0.576961 0.203122 -0.024469 -0.125687 0.149244 0.043963 -0.052529 -0.019201 0.054239 0.854287 -0.020642 -0.192258 0.003495 -0.319712 0.665003 0.018705 -0.336917 -0.299837 -0.350214 0.039694 0.242123 0.058790 0.071467 -0.191944 0.404781 -0.245940 0.292330 -0.056709 0.321804 -0.149767 0.781747 -0.140832 -0.029177 -0.019709 -0.184637 -0.002423 -0.124163 0.302331 -0.051260 -0.022701 -0.685012 -0.182996 -0.039504 0.217396 -0.208887 -0.029531 0.011133 0.141651 0.054636 0.797289 -0.101021 -0.501432 0.147775 -0.461355 0.110514 0.407255 -0.023801 -0.083513 -0.009017 0.054667 -0.032869 -0.185954 -0.109339 0.044033 0.202460 0.081428 -0.187204 -0.318626 -0.049387 -0.117656 0.085127 0.004130 0.012382 0.122078 -0.007934 -0.241201 -0.072283 -0.187125 0.254390 -0.102644 0.526936 -0.746722 -0.091997 -0.318561 -0.004714 0.005820 -0.072693 -0.084527 -0.002701 0.623441 0.370243 -0.787661 0.523045 -0.720008 0.380031 -0.246744 -0.551057 0.014878 -0.032792 0.152815 0.159857 -0.052355 0.245827 -0.079613 0.076532 -0.015456 0.386173 -0.380545 -0.028127 0.002698 -0.015072 -0.007300 -0.098144 0.098511 0.004972 0.181316 -0.445109 -0.027712 -0.501541 0.564003 -0.239253 0.896539 -0.360179 -0.025958 -0.068164 0.050476 -0.034411 0.049004 0.415898 0.391744 0.600179 -0.934427 0.777278 -1.219482 0.632834 0.328995 -0.011732 0.017151 -0.053173 -0.002244 0.027801 -0.331883 -0.430612 0.214908 -0.594459 0.287152 -0.276513 0.946524 -0.478948 0.011709 -0.007112 0.006323 0.033501 0.166296 0.029688 0.111156 -0.124134 0.028571 0.007739 0.368002 -0.010987 0.009470 -0.005658 -0.082734 0.104629 0.031506 -0.039696 -0.184571 -0.228453 0.519967 0.075820 -0.553832 0.232887 -0.179355 -0.162728 0.021892 0.032479 -0.045895 0.088237 -0.170252 0.354847 0.020513 0.025312 0.493983 -0.280034 0.472434 -0.112454 -0.127079 -0.036699 -0.046744 0.030719 -0.086129 -0.197626 -0.223000 -0.184554 -0.207568 -0.059400 -0.213607 -0.291453 -0.321076 -0.060157 0.011848 0.038780 -0.099840 0.029576 0.008287 0.027634 0.231594 0.145058 0.961724 0.201564 -0.040114 -0.082093 -0.087597 -0.053927 -0.062295 -0.069087 0.125518 -0.294582 -0.001219 -0.535369 -0.112926 -0.568997 0.260614 -0.448750 -0.019417 -0.538661 -0.007950 -0.008586 0.145537 0.017333 -0.413017 -0.209247 -0.092618 0.045430 0.253439 0.225701 -0.359848 0.319011 -0.055129 0.029992 -0.061040 -0.054026 -0.137615 0.024252 0.495445 -0.247186 0.470647 -0.691693 0.952482 -0.221612 0.402299 -0.380769 0.007435 -0.050894 0.088012 -0.062145 0.023713 -0.261900 0.090293 -0.234853 0.051203 0.022886 0.370102 0.286874 0.042971 0.030304 0.000218 -0.059965 0.063906 0.072211 0.279799 -0.143078 0.239103 0.026399 -0.052605 -0.086270 -0.121709 0.303559 -0.035408 -0.062444 -0.080890 -0.066495 0.054973 -0.380096 0.079696 -0.269730 0.225087 0.034493 0.636769 -0.061852 -0.057913 0.025820 0.029016 0.053541 0.153253 0.021461 0.229639 -0.153829 0.245487 0.264525 -0.026602 -0.022839 0.303334 0.255775 -0.035553 -0.041412 -0.040367 -0.117226 -0.239726 -0.104981 -0.201733 0.160727 -0.296662 -0.013688 -0.622147 -0.085211 -0.363013 0.019419 0.018462 0.026725 -0.039181 -0.012317 -0.063800 0.319258 -0.247614 0.345329 -0.232750 0.064547 0.869014 -0.086943 -0.048542 -0.053584 -0.120923 -0.079666 -0.280694 -0.056879 -0.284637 0.297171 -0.099356 -0.151459 -0.282217 -0.287162 -0.215486 -0.023662 -0.015440 -0.042136 0.065535 -0.138219 0.029795 -0.069289 -0.086721 -0.039166 0.158163 -0.416983 0.229478 -0.226047 -0.014494 -0.031429 0.039644 0.093255 0.030768 0.161998 -0.251491 0.330786 -0.243659 0.246869 -0.253409 0.024932 1.322383 -0.016098 0.025729 -0.024872 -0.021048 -0.110262 -0.178055 -0.049962 0.085858 0.062212 0.034642 -0.313303 0.207449 -0.294935 0.380709 0.058545 0.590253 -0.485902 1.042622 0.240110 1.861171 0.100722 2.220522 -2.438559 2.765880 -2.628387 2.491592 0.056799 0.197311 0.746412 0.082195 -0.103251 -0.367900 -1.403242 1.251800 -0.464374 0.835054 1.698438 1.728460 0.073902 1.163803 -0.084921 0.700205 -0.773078 -0.004000 0.151872 0.081733 -1.129506 2.546977 -4.397213 3.404705 -3.605930 2.217201 -0.020139 -0.014877 -0.102761 0.069916 -0.091534 -0.080901 0.090621 0.355390 0.464411 -0.392265 0.128245 -0.655977 0.764595 -0.075259 -0.006990 -0.364470 -0.162991 -0.212946 0.161711 -0.082095 -0.021508 -0.131691 -0.271059 -0.478735 0.167899 -0.400739 -0.143816 0.795654 -0.635486 0.511617 -0.130459 0.269092 0.119763 0.787763 -0.143337 -0.331297 0.431448 -1.325655 1.137234 0.034900 0.037774 -0.028967 0.134512 0.138837 0.387994 -0.023791 -0.067366 -0.067673 0.141305 -0.096417 0.242421 -0.164624 0.012871 0.056478 -0.158241 0.151622 -0.025851 0.305490 -0.052050 0.538325 -0.398635 0.532101 -0.939270 0.427962 0.349032 0.102762 0.249983 0.908036 0.427035 0.082546 0.641014 -0.081009 0.276673 -0.217745 0.390875 0.205885 0.838000 -0.629418 0.138930 0.031560 0.020222 0.021441 0.344794 0.574766 0.218822 0.209067 -0.205533 0.310942 -0.015196 0.519464 0.170715 -0.024707 -0.107696 0.048248 0.025135 -0.401447 0.083332 -0.008776 -0.512124 0.846685 -0.854990 0.958565 -0.845788 0.098258 0.186490 0.105755 0.215912 0.687839 0.337114 0.755144 0.062967 0.530109 0.504595 0.239987 0.048304 0.133416 0.059518 -0.026002 0.011772 0.165729 -0.076717 -0.083119 -0.507973 0.052171 -0.411401 0.155695 -0.028555 0.400701 -0.012164 -0.335066 0.033087 0.029259 -0.046459 0.139595 0.139040 0.192380 0.229429 -0.064506 0.270827 -0.052240 0.352482 0.058424 0.213317 -0.008772 0.127075 0.331023 0.014032 0.550002 -0.419428 -0.219983 0.090561 -0.527783 0.228068 0.358638 -0.259885 0.328953 -0.032383 0.002755 0.085088 -0.073435 -0.098399 -0.545326 0.120251 -0.215987 0.426236 -0.125388 0.377588 -0.745462 -0.130919 -0.028214 -0.026560 -0.248934 -0.085767 0.043476 -0.068295 0.038343 0.202672 -0.452467 0.082953 -0.342896 -0.277320 -0.012207 -0.047535 0.025103 0.020587 0.034297 -0.286195 0.097474 0.448829 -0.901263 1.091759 -0.750993 0.806753 -0.832668 -0.323517 -0.045190 -0.008598 -0.137601 0.113753 -0.244757 0.364187 -0.521724 0.385257 -0.918832 0.456303 -1.055420 0.786424 -0.438010 -0.005645 -0.043635 -0.023289 -0.001956 -0.007401 0.150847 0.092639 -0.181448 0.518822 -0.211836 0.244094 -0.619038 -0.071002 -0.097653 -0.094909 -0.093968 -0.009526 -0.176213 0.383592 -0.202526 0.815275 -1.773647 1.285963 -1.661858 1.254459 -0.672293 0.032978 -0.016136 -0.015776 0.087449 -0.098656 0.358922 0.007861 -0.165943 -0.055905 0.022891 -0.212962 0.648178 0.026518 0.003560 -0.000037 0.027865 0.028668 -0.005475 -0.050780 -0.146955 0.125315 -0.614813 0.406390 -0.510886 0.419329 0.017939 0.050398 -0.039417 0.075586 -0.135161 0.018204 0.064242 0.198210 0.299810 0.350333 -0.729255 0.242265 0.076701 0.150063 -0.028340 -0.013182 -0.080058 0.023062 -0.101221 0.081993 -0.203020 0.115732 -0.325958 0.227942 -0.148425 0.304771 0.171976 0.030170 0.057498 0.143975 -0.057096 0.150692 -0.149773 0.319401 -0.048349 0.303607 -0.087335 0.234304 -0.157731 0.624590 -0.017136 0.010075 -0.112238 -0.028520 -0.082552 -0.068455 -0.106426 0.066185 0.635726 0.536498 -0.539102 0.410995 0.058188 -0.042453 -0.009399 0.088182 -0.042313 -0.118277 -0.395909 -0.080116 0.073265 0.288671 0.074380 -0.320571 -0.536042 -0.348979 -0.023787 0.011560 -0.068480 -0.011475 -0.073933 -0.038489 -0.046897 0.142294 -0.363389 0.456289 -0.956072 -0.061846 -0.142285 -0.059334 -0.078546 -0.048081 -0.119949 -0.217278 0.061175 -0.439031 0.452399 -0.595118 1.064058 -0.749515 0.091278 -0.773006 -0.005908 -0.049554 -0.061334 -0.075070 0.078620 -0.141722 -0.040196 0.127271 -0.008270 -0.137200 0.029007 -0.576643 -0.160469 -0.015077 -0.038365 -0.103861 -0.045791 0.108800 -0.024450 -0.028920 -0.052439 -0.372533 0.050836 -0.051437 -0.006959 -0.139741 -0.039275 -0.111173 -0.067715 0.050168 0.003648 -0.355491 -0.324795 0.111460 -0.106547 0.086532 0.898573 -0.422368 -0.200272 0.011846 0.001367 0.091165 -0.130810 0.300025 -0.407578 0.280725 -0.236661 0.371773 -0.240932 0.818204 -0.276554 0.572698 0.029758 0.051064 0.067927 0.016974 0.080807 -0.022943 0.014399 0.028465 -0.463056 0.491361 -0.377016 0.274130 0.159051 0.025733 -0.002275 0.046967 -0.231509 0.368737 -0.585830 0.655725 -0.533738 0.608929 -0.429466 1.065442 0.581402 0.640512 -0.008257 0.026729 -0.031176 0.006308 -0.026405 0.107034 -0.059219 0.057648 -0.250326 0.315452 -0.314817 0.277868 -0.455505 -0.007349 -0.037678 -0.018395 0.037553 -0.035913 0.110593 -0.073643 -0.199658 0.198619 -0.066135 0.192864 0.186765 -0.228186 -0.017311 0.013699 0.067465 -0.003809 0.051932 -0.005442 -0.218120 0.208365 -0.270185 0.510547 -0.390618 0.450523 0.656758 0.482476 0.266383 0.003580 -0.172869 -0.075446 0.040862 -0.042699 -0.043709 0.022595 0.013537 -0.011808 0.013841 -0.036404 -0.138828 0.020497 0.058613 -0.008249 0.003356 0.024817 0.002530 -0.010627 0.000429 0.004809 -0.008194 0.023744 -0.006621 -0.154593 -0.050488 -0.048530 -0.010591 -0.002977 -0.010965 0.018653 -0.007979 0.022647 -0.008024 -0.003117 0.010804 0.031790 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 pocketsphinx-5prealpha/test/data/numbers.raw0000664000175000017500000037334612771605033016501 00000000000000;i~[jM{=CU[@ !5GA^a;6sZ8 : 2gg} 3[& ^ " W  B|Hyoq/ba9qd`SKX{e9"RQPUOe+. ^J2[,-HN1Yp0Y WX>Oe)$Q C{2Hh'#j&*ih/"=n7S<cei~&5zLJ b hrOBg ood~FYmbvsYcDrhw5%A}_v[*gB  dbRs9C!pPqXAi Y*V YxQJ*;UY>*L\MNlt }. p~9;+#7Z*6ne-K/m%WBYnI{?]qU:-uI @pl<:\Yfa5.VA '/^ trj i 2j=WBv1VI;Esnxe9SBLm77e'Wb?i`kS1S-)L&RP{^z5W;A12ziKkE+y_$^=u TJ9o1ro` Dc q0=Czv \ Um \SG*sxqv%wZ|^%`-ZFiF#q=.0z.3Uy^xo3H-[Tz'YC1$l p!>RO<C?M1{yE7`vAOl~XeW( |F\0{1U()aSkXa}U<Ky4 HzO}zGs, r%/w*gf|\N [ J],[xmPF6#@*&AN.KYA^cx]1Ko8d~ \<><(X3MN^> #V)l{Ei/C%R oXPp#AsdXCj$ UxB}h"*C;`kcsDxiHo%Q@U)d8R M1cw3N lXiH WwVdL,E^1&xg#12s| ZpqgbS/9<Ll#_Z%rqO;%% YL%Iu+RH!DW + ['b#4SK^N=:`DG|,N\zLK TIBe,%YB E/Fk0 l2$FcG$SFDAM,C3r2<|8[ "(Iu^q>4N9O?I@& >|pE]D_>YL&\_{KGx l^ zCs([OnNj:!xh 2A\3 (bRLv]6B'<sp`V=x BDJB=[p  ChGFY )NhRKOw[%?V{,&d?`-kNuuxd; WKgBn`}m9^1Dlp)T( #~lTm\X -^l4q */5 y3W"zQr@=gqZzE Bzcbbx~?uP$@UfMY\60BG!m[ o:Gys*lXpl(< D.|;TiVn]h&H8}{&  m~jN%"H80K0xO:a[ RwNDKyvFL"O;%L+:JLMAYP` u<T-%cLZd+3B/5uo3ny^M`j4 o=q`>Z7(gR!24 te%EFz\*1(%0k*n{5e  LyfW%~h)ri 5#zJ//8+"" g/;~L/9 UzI.Ef[1Ml/ShO6 $\CgwSGI;-|:3c\R o,3aKpMKVN~m8)OEyO0LPsnD1-zE+Mx#a6 s!Q"x3?}o!!!I:@!VaqcT,< #cx($<KDU7#dULHgAp8Ug{]bNS019PxzFFA%YmX$_x&6@ >`7>H"ovh|9=|n!Ub-,yBew".BVNMd/1#@#S`!$"\gm?7BK0G~5 (/4g6++xPj6/[vpns`l8 mapd~ROE*P[uhX5adq xYDCNp ~{QNO}] 78*9dx)H~cpgwdExawU11=B6 f}yyQ5C0^D4D1ycLsQ 4UW7626?83yX 6B**\xL!0+&35,YJ4hA*=&FA4'2# .1AUVLC 9*2gFC:)EG_sD/Q4V5 (8/1 (J , st! )M%4-:1 $PI-! bl#5*=O4^l;_}=YqwsqvO.KA<K;XlTpyc{q13<`FQM9Sayyve^?hsB(#^d 7XU/P]p`rsE$  & -72Zj/<zWdJ:YF&Ybkp2 1EZ5SqZUA)*-B !"/*G5"/#&)I@ E<):o9% )% -B++iiwOFhLWqgC#,4 *NE/BN'%^n >Y`JG4,-5!591# .$ 7I"/2Mg]S5%#-* ?5; !6MH!. +0>  iGa/Qz~x;yRZd';0sF !XaZ; bBqWr^Y=ydznfXv%=($ TGDW|8.'*, &;)> 46+ !D:#^cLP_L`hPno`91QL/!@nyldB@PhT7VVdruUriymuhcL:7XQW;,2NLbf.# J`9$A;G# $,~uVo^+OjbyT5KTXr| ~~ & 65&;  A5   ]NCX^emz{nqp>S`zK,7#((9@WgEFnT ," <Wb`Z_gncKQ@;Tlvv|qX)2G:)0=/ FJJm%!_OCHL8j]|9.'-7+  0H3 _L$A[ us,($r'KJefg6m'~='_9cx ]8<550B4J8" =~SNP`kpvUoY9=1&CF#5D);*Eau|ZOw[R]bh{yZmth+&;7Jz_h{]@lw^jB+[}vwevuQ;HI44 )U7 /.V^#8"&23E-@?:Oea4P+'":U.H(   #&&R47ipP29SQ@7k}<NZ0 !=*:  ,~DUtmxG\[i}[mejF$D}Vqbe~pxok\OjxiQ~bl)@h]YE8HLPP]X7=KP56-RoR' AK)S (;&8*"<|J!)3$#,S>3)=)?*! +xvyDV8XL3.AU2#+A# M+SSw@g02y'2pZ_ncI` Hd|^U}2m-w~^3h,0Y*+44DYQ:d1qV_]c';"QOg:36oS2}ws4S8|J4qLFo;zg]Zo*,f![';0msPQiGdr?(OfG4 fH*yqm>`C$ k%GGFq^J3_ j a1 fv FdLh~ L~`uJMZ'cef[62S,~=f_ROv -^- *LVMy7SJB>+XqvsNgRm_jK.*qM*NYV @-?#l<= y L? vDoBYd>ioT8+5%o,T|q9`U e| SD*Wr+ c  x  !3 L vupd3?J$ve(q7pp: mqB__+(w#z X8G6 tN&U&X;CH{&FS4T BZ V&?NT_6} u  J  6 PX}$ ݵ۵<|<%&->"!&&%" 4AQk!,sjm4  } I?  c =cflX2/9 <|B!r=8o3M6VGt.3$E{A"[!<,5U#ClmP/  , PC  !;$ e<, {Q7u u^-^ ER>Wߘ߹g'<#Wd(-$XKFnIx 4lE6o%dk ` M 1 jV;g]Y #[ Z  F1P[Ob+M:M%Qb1/@ -UR _)k)W v. [(I& X+6dL@a : 6   p Q2 $% j | u `Yo2Q}RaIp*F|eX>x3s3dvG$&Q!}"x"L"P{OE,YjWKmmK )D  58 y  fb` -|OT @o88~P&s*o1jdp1$7,+ <!3!l~Dw!V$s!TA 6m:tgalN?/(u $! n ^ dt x%vVlI:DA75~M3ER= n,r]_w(Mi4u_ , j#"G&%fjU6.E}XzD9"u%0/ h 8 + ( _ J;0&v f:&?7cGCKqy @Mhd~a @q;$ Z \ #.!A+f2<{~PE S + ?Tz  ]gW ZH1&W4J~$5EFkM'7|#MtLxwv 2 C!6 ^ &5  t ZIf< M$0Y0 |`PD] I ~ % "s IE0{-Dmg@30 NIs%w~ &md| 8 aFYX H*/ a B(< kM'"[ D"E{  e ! $UF S >i44CKIT&[tW=/  W bV> n  xk|K6vrTXtXwtlZJ2n:Yb@ _2 8bvC3vDXdc\' |t^Rxi%Q~9z4mU   @[ ? wb93$ nj'rz2y??G 0{,@@dtE62+Wr>de2O\!Q:f5Hycx G  @/^z}ShUdOf 7 CIJ!R qPjKVbHTm (~' ^%!STHhJ+-21ahsoZnmJ\|v[ > ' am @  2 C aWd!&#!+=[FpLGY  =r w KI9 wvo"vt$@;FJoyAVvA'' e1 jaR F6 !\m#v#qJ14I{C .   5$OK  , M//2C(D={ GksOx>y C` oBa  xz)6f=n-x-zb O ' z ; >q z '7 - h55YY@u2 Q,SKAXcH 4%S Uz' N L y B4>D7ahg=~c 6 | @  D0 ym#UK+i1l^"rLRW'X% 0 Lj  a r  L!Kv$1<*z)CDc.0d< & W5 'kl ( \.:-H e*AE`GCbDAS / 1t v o p 9P  0(i3I?~"6gP&E/xe )   ]IE  o r]|b^SkQI\&"LT}_:l  a" r pn N 7Uru]r9V s*`9O=[( T x MK D [ V moYl%ExrS*lWIIYaWWwUbZ %> u m == 4    K ^N1SS4UZIyjwU $0 ~~ S+  7 P  5:soHlFw='!: `C, N KGD d ;[Pa4$PopEzv\ec O/e  T  J(3t{}#JW{VR 7%3(!B,8  o   qIAH[*NmG iWD b=2!Fq v2Y(.rNk< z& ]  -k)>1E6~cZ7$#M*+y,RZINw "Z>+ ANB/fl+ qiT-kcwH/q~(mtKrc># Limm)Qw:}]-r]+!%^yIIht@!`AV,3ag 4 )w`l5r-FD7uv*`B 81`D@8q>+]>WZy`u(zXb!<]^pR*F&!y3@~,-"VgRD( z P1Sh C31">(d&1tA/\7D20aU{3T|mHzdWRtZI8LJ-g3n)gy$ijC <SvkMn&YR\NbF|oK& prE|`/T{fdpOiy?7>IUr{x$)F8dw>*  &^%&#vWU& !m <&!I LOIE dxb'G``tO ~q5wG}MWn@d\J)}T/qduRFP RNg?8Dw~D]pTh{BbH*eUcjPmxsBQriPZ5 bG'au|?\agKV d(j*Tha6c]0w7\![uw?H 3WveN{4<3c6Z)gvjw`m ?5L|jx@4ZM1_BR:.#;h3 M96<? %sm}KArd-}n/ 66y+ZK/3cT)tb/P@+]3koV-_YgTaz?(=q Rhgw^_}w ?Hn^l31ha+ ',GaU^WrCd#\Etc(]`6ld7mBCXTu3B}G[' f |!O9E; F~aq3"Sd   yl#I\&zTqN(2hW/-)C4S4Xq!* dS8C8s*,~D\!nH4++%s)[R!z3b1S9Z\L'w*'l[p{<FMA23+^+2ON! TiE575!=1Si*Ty(>wfu7uX<$]K[nz5n0a`2v^vf] iU{p-i>u{d u8{$^0p'qz 31lG>upxn cyUia]Rkkobc: fy FY.Or  [RI%n  ~n]a#$)LL>#:( pzX mc32\nK#IM=dGwDM]c2_d:.N,.bv}h* / vr\(vGj8o:Q|ykR}yt @fW/7):A6Q@c>2P_e% QW9g' B=.VVk Yumlw>+;,:r[#ALy@m fd'~LeXfUby4=]%J;s*[mK p= >b/?~RoFjl=$mTx.%\=x(-s{` q?g,[|g5Eg / n1!B!f,HRTCFWCC-AnhOyOb1r4zwFP~e3?VQ%t WP):ZE*2f ' b & r J / ^tpf":H uQ/XB\-s(Pe lHt-  I~\' # VzvG@ 2<_~w'cE+]<qI D} _i#"r9$ E*0 Az6l! : ~ r zr@\\L_'s   t2Y U I ^ U~-#kb$"%1 : r4k}uj   bmm 3 Rb b # |Lv6)FowW}Y$rQ 6 * db%&q!  F{OV=rj9 ::,Pl  f * < ; {[ K  -.cK *<qv  :" CI}3VXF6,#dbHk~vL\t[*   $5$$yCot_Il#+W( 2 }jC G 6v p  A  ~S51T@MNbX43p^mxABY pSJ{/ k1U$0+4k + / >!'(#(y I^ Z  y*1c5P N 7rf9_ " / ^ C wf .u\\1  J  -7v | A z) 20@ucm^:<QK &)>$#V50@M >D ! * |{ !E qq9_UZ4 _ZzEpe*Dq N87)h&Y D9,0M*E-%>} }l [[i5dL8(N 4+ <`i   <3$=%) YbL\;m?jiZ8Pl* We3@\$Y-&q o) el`V (W" 2 8 & j v  X A opS@-ygW6q5WZvyOed+| #lGG p b bQH!$*n!Ny $mR WSG 9 f)6=9/'@ v N  =@X  B . " {,eJ.FwC[0)IUzi|V i~ 1JnN$$EI r#S&x w l (|@1S#_feq [ &    J 3 t<No tX;OmVvTRbW AVCUqg |> uYnZ  Co7lGZ n N~` P     FT c @clU^;BILsuN4=g7pbqdLpF< _ _N/,I  , PeC@mt%t v)r0`U:A B 0 B ) <   d ;e0d}~Jtc`y,wN}53H^N{ld%Qby#-S % m ~ nx*+k6y:Tcr3 ?IK,$ ; +6 %uH lY=x ? [Q ( A"b 'QnYruMn,` wP(Aya/y$\UXj 44I0D h_eZ431~t Pbat# fBX s k ?%UWnrvfP(9702F[ u ;MeJ EF~j ' nAT}J] 1;c  HJ_e'*p_}Ce5}:s*IU- ,   V T43am=8= B%[Ucy*_>nx W  lQ d : m - _< Rs@Z*Okeq$&5  &  `q fZYE k w4;HpfF:iwmF0.`G:  "(*e w9as {5w =H}i[`? fAT@G$S *   o B N\g >\N3Rw Xijp~\34C>Oj7ai-nr?A XAyh.B r = r8^RW G :t#]"i9&XF~alPr*k?$f\ } 5x B v 34 =JlYHRh!\T@yv}..tWB38)['4 B   *1oS kZhWF Vyc2Z55dkxwZut ;  vf) EfcKq*}&fco-Xa =3TLmC>$@ ./ &+ l 7 n6x\4"?^9Da:xkc    ]+  =:^ <iq S ~ 5 I [ A $~K& $1` zn4 R@; 0 h S 9 D' h (8 H !BoCJF .59 |_l.OK[nSKGo@@ U&5 F) i m # l t} ! GGh(W=;Xr<x}x]a xbA ^{!dT@>c7f SJ$ O8` +rXl~ 0s45CEOT-4l;H) % (1 < 29C*zp!G`_:8&e^X YW Xl+mN]dZ:9=s@d./l&AV%S$'Uyb8Izb'yi#=5$PIz/5d8=+ R7X_7 .TPN?uC1pQ]gG"SX8&b*D4H &Qla)N3 @Ur2EK$R<Ru<-i# ln`rY!TcSlI,"N|&A99at{?\ I4c Ql` ?4FBfa$;nH% ]l}d!rvV0-;<]by)fmI WV |y uw2)!=7?/GGrli O]PJ*N{nRj4<l[q )LXCVo&d_U,$50u{U.-VEtawO|wHnq r;f<x!c ?tG4O& =6*L&xq:p=36il-CSEN:eL.t%>R]{yFs<-cn kG*vn8!X@TpS?z/:Tn MKV [44c/)=L9s3GhB@Er?^~z  3 u`D2'J&'P 2@DK->RPR\_fBXMZ:Hi4_ja59TS)|Jik hjR9}p*"&^R3*  A\ ?-%;O%" }9" .%Q|O|Xf;[9<9"u>}Ak(/0)d)|e DUW 1Y)n}pn-nm@*mz%ggJtC3V\3L=J:olc,#?IJb -d4d/ oGtK(p4g.RuR-^O+eGt EosWWVl`FGh i;t:5T%4 ?EZ-!tou[z `"`Lr .}I#7G6=Q>41;ZwSI`q:T$2 w'qM?S;[n(8>Ij}j G X6/oJEN_5;##:?g< `&stAx 0Z 9xicsQdu,n+MbJj5j at4./4^;PMT50%>j|UuOzSf{`"F[tphal/|Th|kkZ X+VfQP_]xaqIS}C<Ze[hl"Hw!tLODZkdI(KeZe|x-t]7=^kr}*f"r,]LvqlR&{:zQwi^o> 2 _i!CqRissZveg 0,>gY=omgXPUT\(|[ ]4-1YxCZsR^]^6f[RFu 3 -v! t r_U!mI2r<Ine:/=` 8vV! 3  ;   - 6#k!H#A`Kk[rD+w:|I*} #rb I a I(A8wuTxT,~ '  yav^j+.qW;+.$Ogt  Q O1S< G U^UI CpSyxOP[4^7DP X'4!$$!q e` W~WboiIA   w e  \raa$h, / 7R  /k85~]0s{([<6pn `BtHt0oemb jl!7$A$C!uo0 ]tH&V 9Ly, / : J  K   8 )f""qA; +~  :/If]C D*xywQX|j)za)U}; }4} rG!{#"!%3P0tj8Ou    " X f  ( A- 1$M*J!x@ f 6Ls{Jd($ I^z0k2xX2(J-?B;g`cTft #5 #"4 `" QKR4,g) = n - "  yXHrQmN2 /a27 87-I|t\pwY<?<cVNt|.),PCa1~E "!cW, !qFCq#E _ N  X #2{=;;}9 rFpG , |v<"`SW[4p6baAT.:Y8t,o  ;b &8!/ uGW6 .X] q n  ) - WU^Z*j1j ;  j   K O LP.shrND3Eff<}LPjRDprykIEXh, ,0f ^_ W:uThy5nIKr   m  }UpRK > u  k -%WM=|M?w?[gZ+~'+ry3> "zej@u 3Y .!enW87Qy ` a O s q  e &Sxt%Ty^c3\ `    6  0qEY$^Wu )S> ;[Lt{n,;Z-O;,Fja J~% f) ?baX+ - j 7 i  | o00_gna *`  S  0 @L,c!uVK=|a [ 8,L>yYOZ~ 6yYlfnF> 0KW F (/ T6bP_`0 C 8   Z G A  l>PQ p[;E P g})J j M .L@A9-x`u<aH]EiwMA}na:pe8,+ug G ^o5 !N _WBM;'m8\y ( N ' .J e$%QNV,~(a[ H n e  .<Q S@1_~xP>[Y=lh-DBY?T1[{`ta7G ? E"!m i@NJ^bL - Q  q  /6 ^N4+p6E  4 ~ K "y,ch(rnB/ nMhuY^f^hNo3 8 $#T 'gt;+yFJ ? + m V   q 1Trd3 - 8 j D7 Kk#)mq~ .\\+t\~2zV~mG{ #~aPO #D$ pC& `  O O-p $ d 5 EXZbQ\>` V F|P y4 4 }  EI KNnK; s &wPcHDS5 > d_!h l<^U |Y ~d0 _  {EWI0@i ~ C? , e :dGCEdMKC k{9V>S6hqvBB? b onP{)C`ZP`+0? ) 6 jO D_/y+ U (n Y a ^A4" \A7)E3^(;j> nuaiQu1daG` ~U"" k<Nr G5  l[O4 r / f ]{ #=xHA^9:]ef2 x;-c^hz]#$&z$!.UH d90`C[C[~+3 G&!K\ (7T/EP-^% s j  y   ZuLos9ra*t-\|5*Xf( t#))%g!x 69pwV+M; a '^*B)7xnHf= ) !q 2 m  & P / Owx ~.yzgnNyQ*'kZ';M.G&h*/%:b S#)+*<'#*B9:Pt@w ,Sben&R Ai;T-d L P mcvGMW K @ }6p2 q0b!uPMeEEQ_M"y ; (.-&,R' .Y@wA~Ng tt z2 % j, p r: BMII n B As7nYoj`QM^|{0*QRfqX\ku %")+(j#5} $ac8g5U]LBh^ {JiT'^k &8 o!>h WXd# 7 T @< Yx)\{Y53E9#bDmlzVzFpav 9oAEh T%*l+("6Md\[;#bBb  ]0) v' V Igfy  ;z EDG^"f]@ K!/UkL SH){C\[,6JqP =Z^c.cb~0 -8 k')( #OC\ZHW7|lVZ#.m8 2MO~wW} lhD aB '@ W o 'i ;NL7;fO#Ts`s\H !#o+-*$ EmWVXlMU  !1]HF %m&Bg$ e!k s&;Y2f5{ v ? \7lKN:6r- @`I}u9GB&F',-(!! :S?vJ^K;bpc  OS Rt7 tx O7w|U0i\W,fSF=W< ^yi[jeKo);fGD]`'#u2o '+G*K$E}1y7s";"% ACq|qiCe]C / +dW y i-WP*Ea\`:lYq"?:&FU& $))%3? H s}om7\D0;FP] T?#|k+)  0   hf$,"TC6+a)CMyT> 0R8f!A #y)*'  yq3Gy1.  BLP _ Hi;3 y ' ( ^ eL f.:hY j jw,r i9w9,iJ&40|T;~"P%z*L*%2 [AsX_/xox,"8 3K: j[`u59Ai_ h 6 i *i+8  S W[9@MNR4]/!VV Z ryiNt@E}[kQ4%),)u$PSZ]^M!c5<-qt RK ,!< qI$_Nbs5Vb  2  G'vY W() o 2JMx# x 6e\ ;c>tsSUKbZ_"()Q&i  U6cK7"l(sl Vm1yu_#'&!]J) gX[E:|v8Am\ g ; R  v* z]cf*p l 9 q.oe%E a w[ \06|V'oz2L'gs;c# omkrq "!Z\ED isMjp]YpnH9 2 E3(0' r g # @%v=C 4 jNN 5w,` Qc2^Sj'g?n07kO #D"3 H:(=- V@4%  u *3| 3 (4 0z167+u`W7$ ib - K_X"&eMA#CE|wbgI F5iH#=hm`Xdx+ \V="#  :D K <wDooN.KI8>t 4/ ow}mPJ < ]>\{o h /0b@ 'twx|VubpE 05 r*8 c  )dw \ / s, ] rZ)iE n %M ;   mK>B5 cx$w5 !CVH,}"{r9@C{0i68VXPM aEIOb`nUIC'E  O ; S trk5h-<1'>Qe]P]  u SfA9~%dsBTy/q&xIVRD 1EhL9s{E %S' pE4 "}.g*e[ p {  k++:p VUBR? . Y &>:'GmB@`PaR|:"`'epK1"s}_|]W]* NI J| H  l.duujLJTq\f v I { \e0(& ] w"J" [ f  x~[rGbUv`*AS.y6<5 >O>LOO$vTZc D H xc"H pL.j[[=CeVCY  _8YRNtBPN y3. [ QQ/%4<:aUhwfNGvHGoy(8i6RNli0= V+Q qSQ}UU<0p,U|d R $u{K"]\/(a"3 oESXI , &P/=w>\^ns|[[SEI\vYm 3 a adX0 Z"tG 8{[EMoi.q{7'Nv(/zp icSaYpmzp wxPjL&Vq]%MBt@Uye5" , tdsMvkr11 hf9J~mnlO-{I MXyE,&(p Y>xvQn"~h:JV"jnErW/6#)##   >(Iu"H)g.q\u   ^8Ya5*\5N[/&-NO:S-RRFi4`H-g-Wj}B'Xd-, 4 6 |B!N"g22D5(,60 ) 6GyX]WVvk#[)C`6wX,%M9c:2'!IX][A2>hDfWA^uH5wm74N m `? % *Ua5mG,Q an U  @[b_g8/!DL%gmG'hoW-x  z?b@j7>K$#YBTM`^H:XgkpK\y5Z7 LN  Hm n MSQY*a n!HIe;  y qU~}+%Z/0-:57 <T7Y !fch D;AB* 8K * P&1N3|"aCmIx@ 142  *  H vwXGt4kNs + 5 opLS+P_u-b} |=J= | > g>@a?C jQ V(l2`PnvKSA8-O*_.% [+ Z 7  uj<M&fCo}du:' +\"+/ &Y%D  ~8H[t9"K$ I%y}d$F/I=`EdsT,u50GH[f 6 = ~p33 o%+6_&tz^2SJlZ62HlBS3o  (K#EEBm@P.LFcdv5=Gg39D!>  XoSe Y f  \|)lo\E :`JSLmU/>>@_jrMmU 5FkYh ^m4iqH^!;YjG J>`{rT=@jZC$L*qF.[IXe%z9lMSSta{h9j$qG7v;OR~2NQKk 5FB%PD58ae 0 GMme5QUw &Xp-:M-pFeF,],9/KRmd BCTjfx\D_^< # y "dJBB`CxPRw+Svl6|hV=7jv`{XZ<^Qg93_!M\x&S4y $vF?^B^f}!qO9 T*sVqsc}DTH 00w:-3LRrYi:,W,Xzv K.xM0)86%]}: XUqrH+20@]EnSVV7JI7K> g0%\gV!fR,QIT>6*?D-_y\;x(=,X"^=!CxbjNq9:,;NBH?q[QZkI9,_!9)/Q7{o( Dr{&PPu;Ej-5x u7uQ)~VmJ&novf)Jz|TaB$E~yN ^kUo#jc e>_B* k|\ Z vKHGz-b Hy:;r6Uv_*v +Eu?RfF$ 8lVR<uK^II /ZNn-f ?$ c 2 oJ(KSo 1 SxTm~KVhg X lG#D{qM^T 7Vy3q_FMC{+ QR& bv+%i"mO+eZI4aOV = xg`$0rU ! RR^pzLP[jV:=EkhOR;NBzl~m_lg E2Q,[:7 ]! C'YH`^Q%nw3iqNVP ,:jPYqbUm>l&CrS->E sz@ #wxh7$m p1. c  e * $vVQz[e9" :p)Z_ (um[$`z<tw u !*/ JP =Ne;K;g^lG2` g@pV*vZAK+Xp3)# 9eYx"Q } C  W oT3R E^ d |]O8=.!MxqHjF%z5# QV5%T7f4q&L$ QK kh gf *c [M!E[~r_n6\L?D0pQa"Ue *[ [ x 7}< `W"P _TbZsm[vg~.< _Ha a) Qz\<1 u/Kl+C LH, eF==xz .}s?c4Vts1Tg ?/Yty O}"W*I*jY 6 mxk  d[S@v]wO@5&m|Sk { dQ>c jf8KcQx},>JZ{HN0OIcW`x]JNH8V [tVBs TCKc7f #HLkPx;h#vMg?$-B we J$ SZwc f(i&UglPdC`(v)E O 89g!4rg="S%I;;h[<>{`:,ZgGZ-nW.*PI /_g`(!D ED><Hs >%ioqsL |MWvEINf~}s[//^(!t.>pL93SQ :<I%J)(G6kmlcF qt% DKriSIe{D]g  BV(.iwUbc[ts jvk B`*|`Kq,&J3?2_ 4S1a>_M+Gfh|aV %Sf5!;x! (WT%KC=d@XK_aethwYP0W5`0zPAZM/5xKx c5J$U!BNUX%veyIwN0OE; K0u V cUz+AE$QqcKVA ?#R**~ 1 Q\PAY A$y O S,ERH8Y, Y ++UX Ek>oa_Yxgg_=TsbrF~} f wU?T\K ? enT]E n]MyW#$ =t isWs0)F~ gu4-D;8i4r :>CO whu8H& )%.>HOK ixwy6 I:l! F x @ os+Hcl~;:?;/LL-[xW)Y2z;Cp1(C kjlEz44F(VcwxbYSedSYk>8_&c-5(u^w+O6N0  G';B_IxmP4X )t nAG_ r5^52K'hv~Kl"Yso}q5 sal 1F8F @C\[Q&[e_V*> g Wp|Ij0Dd \* i ; 8 Iot*)=YE,7N6 c  twoAp/A>*"p1 H \ wI]16@ bFT7  h Ik f q sOifw5V f_(N$2 `#%D))JM sR,r  [!5 $I =7M%`*|19j\ ]\M! < w{M #y " lO  O=opB%FB@#q1AqIh"5j33- e f#i x A hZz{v](H! W o]Y]?O:riTTBPaNw!xBRBz;~%?giQS 5S" 4-]BP YpR= gqxs yy/./QWp`>%zLrPv-EtOCA"FBb1u=z<*TGiaY>^l@"[XV$a':}'2Rl'&Dp. +Bo}g{pux7dmu}Oc~UCA"'Km~f.5EX+0RkOOgT+tP:H_Ds${L /$>4Cchc-N*LJt.'~B?>]  $$2{UZpU2Sd (2'93-LK'5 Fa98 .A:J+!  %FDP  : zl'6)EYhZfZMbuE1h7:I]CYPCP-:p_/ /5VoO1j~fneC@shMX7;)&fK) YUvtD6IS.3O ;])CC7 IhenE \O Km-a+ w0M rqnyvbGE ! # xycAqPt[14hyj*p{(Ju4/^C'EqTRFrU#D=d YVZ/q6I=,SYdv GT@LTgWQu^D./6!;' K\vwLV(8IZ;WLkm" ,: ! *K"2tBa\}G o} 9b0F *Bah!P # w gzilb(@ $84"{H]D; ]0<c^6Kr;Z* Dhq;j"O9P(?12*5^Jw8 AE0+9t"Y0kD`[ | coH,P= rj {+W 6 /0Mp|:dx  F  eX fP;rj:,t3}z T { AmSJ(+Cޅ|{## \ n V9%hm ag Z T U? T)Sn|[KnaOD2z)V.)W  7 MH9 scQF ,PPk iB <,')Ad,I P \m(+ {V =q  zkG  +/ ^q*  eZ  Q /fb]R| fB.N?zdL+, 'c. [&lK Ov PpoD  TV c $ {p{KRa^i^@7=  C"- :te 1gxWV89(~T Ls1m=x3@T9 EAX{Lg Y0  ;c Z *BEH&H_gRHpxTh^"t8. nU'X u^ ~g \ 2i4=N$ kkCBK }P>).%Q d I1ZGFhj{ `/tg(0'hr:r23Cer~eKkag2]2_6MF-vQTwZC;O x/T~4k_R)J%>$v>xI~6en^r+oI 8TO kGMRCY>:Jd 9 #se8j.Py77MvC)w6g@ ==JAp ])=UuunpwsDV&3mTt%\iG[9g*OrVQd}. S0 hH@9"HJhd,LW.b$tcbUPXh0D,@oi"~EU4!K\_:NIj.0bpGp8 ^/Z}DD|^:]G-k$q^TR L1:zyN8d& rr-l7| BhXcz }GF0 ?($jQGKH_{v$ngk 3SK T.? WS,M?uz@h1WG?pCW(LfYqH]b H9s2uc^~TF.=l+4acOH r|`u&rp6 ~c*6*<RX}9>G47 ,Ve GGV G  9 !JVxi=yP?#.%|LawzE]#h- X/k Q/^'):V usIi1 Wl)9hB:2K+6 y  Y  Y H e )EwD  I" wZu,D\T)2@e@s}5u+w?4kt K'wL@"jN8~ 20  ^Q2VM_'J/6}C24 ii1K >3qQWxo8_.~ai q04"rp1+H . UT  s na=z PW0F~9t7}hQwd B \jy8&v ~ri&y S QN5h C.{q@;j47?k0Y6 ZXk7jG!p?7IVsG8 Ln* W_ p y'h=)MX sGJx n l Pkw4(~:`X0Yp* *O k*BJd*rQ;@HT7.o'M?-9Zgn| JT d5  L,NI 4!_dc@8M $ _ J=TH8t{G_'mwa&#  aqFJIMs!3gI9',@e*]ES/+fYN9fO6ss{& j}i   8j5Bd5xPI,F n  4hA|j<']\`J ps W  Q #6I#6OX hbS 8 k!^ 639'mNUO'% Ro 2:Z,D6S4)kpRg{HNk A a Wkd Zvg8:59GBINu' W@ y O [f aI 9kF"/>uL/&?zMX`TVgdRot@b LJk %lo } Qf\7|8k.yer/_t{uubp  #ShEnwjV0jg  'E Zun{I^%AC}/  Cmix_-3[E&n q ) 9SAs.I)AG4#3n[\  RBjPx$;>zj:d  P H G  FiJipN?cX7g{xEF1Ish3|hiLKx* U % . @ 3h%/!0sC: %;i&%UGt1O b,09_I2vz sa72B/ Fc}IVAp>,d[ibB=oDuI6~d-U]Rl -  \EGwd<9Ifgzfqx<zWCvM. g;-U#(b{skq1O(z}V$g*|M6  nN H'ef]^LQ=F7v6V0''*./1-^V;1/.m[\oC CX"aH"m-&k,hO$ yd~ M|2[.UC-  l G  ?Z5'R_%ADJ zfwbI*sH8P P<)K5$d: OW8y@]R#JwJPODZ\)yheV3C{_L}ysiN6{6.w>+` >'2]L'NJ.Ais?hJx~iVZ[Z`?H0L"'*f2=??L@ (MO^ilo> 1\gJI,/}XX;;84=q{KL"rNBO'4mpzN1 /a *q x@f|hfhsm[?sY}3?sW"~y#} = ZkTgg^Z`, 1-\9#y%6oU%6 x _:'QGLMg!w`CiO=9@qC*hrB|I/+!@cYvO~I_-Dh<s i 1  _t?i x7]cm +PH;D\)6Mf1O9t!n2c-) .AvzL/D%yAW 73H08Hl-l" nPAzRZCx D CHGb=?vm]MZcq-(V=[Sj>5P2(E_S>=zg;5T"l*9=0l@R_x\ zH0CS6/Fx 3Kggrpmc(bP2!&rmj G#i'jLb2j5Q5/bx` qJ^/ wbl[9*@40H/"G>t)?t W%wjn?0,1Jo{ /L3$3< )% 5KXCThm_`SeculWh&^Yod\sjRku=G}ju@1{i].@)#E2Q\EE_la ">09i&9_mV9t{Pr|slvZx^a*lX2h0 ,(%/ iU8grpJ]g[RakOKeVAO4>9*L_`VIJK2MI-$.19BBUVF "<65++,Mfthou]e}x^\qamw|A-ogrj7/dr\918LE`c16bK1B)",hvQHcrWAtgI]YJP*"* ,/15.D)Kb]_Rs|dO>;GTqgrtw_-?SD.EKC.(..63&$' j@ K{@JyGS>,9lulfma~;J%M_zZ!| X E walX[&r/ Ry "z w? jGZP2K q%^A UFv l_5j/= pZ IHyYR carqQ^IoN @ %+ oXq MXJ@%Jl 59Ow 441  I-  45 CB5Ua j ]:P 4 2 VM  / Os: 1U:VcXu*c$Si$ L urCCK H-09C :0F& N {" b OF k  :mx+ YV `z!^[ 0G+dUPy 8 c| qZf ob_>sG/w5  D*iYu&)@@ 9 wag[ D=_DJcYFG$  IF  iaC J)5 d| /;"uvk < L)~e|~JX|H`* VnH' <kq &4fbb& ?>^/,GFj X/Sl E3?Y ]6K34/Vy;i|jr, q R7A|EdPQ| EuBA?VQQ=gX:b2HY#1o8%A:[KJcVVU6htSLx !*SJHniQ sPl~  HS{ p Fh Y]S!hs 7_2yY[^d'%Pws3 KtAP@LZO}.H[X+>% OikG) ODkC,:k` 1R5A]vy[}t,<.c3(5 h_H3qj|TC&n * +~JHN1v#UaW$>+ ?eIA3SkX)i^g. [ S1'#tF.[\THt/p+ |@n+D'dhu+`/ 0Oz4[rz5K[**dRelQg-B?,^gE~4Q0Kc|_%:SU8g 1kl8^[9ojrGl4r/}w\Q4h:H{z"I',k]Tn,@=`Smz" pg*PcP1<>UwBBlre+9&@Uy*j;h0}4Qf/.yx5 F'K f3>}yurpi  r9O#Fj47# *n cVS!63,g#6%iic? @tRin6j~ B2 j{B8;7e~`,|;R}8x{N"yYK'("]zzw-`#Vi*Uw46Aa1D$DQm{Bj/5m9EseUSlYmVf93_H7 H{vGH`OQ^(MYGS_@D f t5 vy^r YYu0R,dk0$4G*@`UVb[uz &R MO{dnpF9 vU +  z zo#.tOR7~81UR {!YRPfKetMY%g"b4z]Y3#2 zG{cU.[JGa@A;  ] 6 zNK\F\:p]OYf;?V=Kb,| %b- | -Wq ~+nY1 j oB>vFo}'M%CYSj;lE_OF` V &5||e{,Dk4] zAY+{, atI3Z 7&z 6&`sjQ[u1i'%;Ab;pUhO n c6 orSC!\MA*vE*-, y<dbgss;p5+$|3(EX~B/y(=`^Y .s`awk.u   WC-s %9I(0 M#=_akUo g>~mQ Vu;$:gvx:>sm8~fNJtx]3'nyy2F>t8gdd6 7 k z4 iJ}"W|A<~C#f*+s 3+Uu 77#<&L2]7IQaVPwRO5@E#]D}UG0(XnuoiS!4^L\U T h r8 4tP_Pt* ##lcC. Yhy>" u.q1H)DR-E/:Po(#~IVx= k_K_l BNV5D&j TM  ^U< }  DC/eL{=;pN)*T0b+{ =N|~P<)]#jrx<0:/;91wj/u[=WHU/[sG7Wpb%`3 /Ua v.c=1rY(~%+AV >O$I05!x KW?s\dU - i\Y.}`p@)~Zn0y8 .DS i><=nnMEP fW1c'J  l h ; l qS4Gx>{tJe$:P .$b(D}@GDTi+x3ZU0}*U'..} kX+D 2 4 d H 8 &h "]&11F\U{-7,o0~pE [$sh(b=HFah}+q'_ hQMt?h-> p1.pU-Tx8 g w  3 /:^-k/V`o3>SY38z$EF]=BmiBUVOY`qjR8H+54@-H+L< +9$1 CY4kC~%O06$N LJ '  FA:/z\!fDcco %uK!?^)$$ ,>_=AzdXs0u$-g-n=w:6JO ejs7co15d2kr O7E< ; ;q?  vY9?O| {YO cdhP-KW m02u-:5-CQQ>Gsn~r[ Qvs}`kW2:{Z\-]MZmAF  `q6PQ)%S2L^lS85g6Pgd,G|V eS :e2P*&eM!tfgFcm7B/rncWaf-RL: @t6hH$U_f#S6a(t"XeSf( ]aKolkf[jN~WXm:49Vr| V p M43=D_lzO)8312gjGo, df Hv4x@)XB!.|[2,t_'H{TPn(gQtv`G1<JT`E|tve"Vx}M7E7^X^x1 dEt- ] #C^'h 9n%r\=Oj ?"Q vvl/-*rGdn:={MSqthPX1mM?@n$[4XU!BR:=k{?t>VMtKvE7AKk2>*7  (cWt_9y>|zM/ juReRebO: WZ7i`!Z )F'p}m@r;sPWszUp4Rt.x{=.-#5_[*7Gq#: vLydf>^)HhxVt6JHsh]@YS0~gfh S"  :xvZ@kYV)i?K4t#F]Vzm&t-!EbJCQ^E5z/IDZKKoY TG{2zb_lHi&%H @x2*^t=$=m)YC~nkO}!j%\3CT*N0O!,hV:aB Bj+wx!#AfbYvk0l+J5Qp>HD ,QO+K/qz<3Z<-3r{gS gfQGPV&<GND>M;0/q3FC+tma}&R82pQcIukY!f$iU&75OF 4Z=p&Mwi5uR5zCV5mhRhX"{[4 |85bP;5@nvF&qX;[{}Y4~,x}fV@ G }^.55Hc?DbXWnO3k > eE==Q'Oc\og}jT)p`_kU'[{[{3zf$$6gy`@P[+syjKj)8|/0*dK*U?IhKjEX Ps@k>`cJ7F'=Mmz"!S@e~L#L#SXBD_W5h_auP:1'=kty4k+xTo?cr`>91:UTH_;wM\hg> k%2SG@ `9@)'3l{jZI eOUng"a\x@gs@G~ZQ7k:E S/HBHgn:RiUcV:{mynKxgD\uP8A& B:AE"g}=i"c"z)/d'u^HFmdz3V2@ *AYq96x%'`7m@Q#]V fx\j9JyQmBGoP#s>WA P5<ld" [ >| n*6tOaqZnD**B(:B9om$' XxzK96f)x:[qTg23VmNaKtS6j)Srj<7i? &5jB@&t-2b5(;a=3I3Y^"a^<w,tkI P;#-RrD;\MOl$vjoS j4duu& bR$ 9 &E'K&df7UGVn\SaB":y[%XZdOWsC#=;9+pZt(_v#C|SG'VlVF` Q*@ ^M@:} @&}Te;Nbw;=rJ_`#%%AivJ`g\xDO&>VH,Isn]8!b 'f\**^,`JtNhO QIzolml0}O>r ."TWLtl8E6(y|Lth*$ &i-M_hB}zH:RN?|{FF3'; QSA(?P0w}}!o h|4 2a +  *WJ.D3r?8r>3?cwjfln tvWNwt8:;68lL8p|v_1 2^pTmL<>8Pna y8VrkEgwqyu_PLqtM -toG:,U 0}U1AK^MD2&m{_.%w]"7TUV9%,Jr l]V6&  !S4}p!=. -q:+L:Gsv^T\tc/Qj#I: 2uv(J- z}Ea|q*38)>MPXkw%@,=oVag$?gT^bMR?tX/Cvtfxrcze|LtvK[>15U[1N XDO$']ztY5/Y*+.;8+ )D&6<!1^VDE0[aJO ZBa[iEC]_O?]I+P58CC9B(\XQK[j)/ GOlqpqzbD7BWy_Htijc;t(  0SYQB^3!ip)<|hwr^Lkn4'So{jM;GTq 9+%VTO3 yx3]y;C7, f5'!tux{kT?=esU'28Wc?3^R(bmq{ JHR" -())    7qyxzbd!D=&RA5K85J7%8CWuvj} 4 zV\6?--;8J[u]-kLNk|R yG $5>=tJ8'1.<1  WtjLIWIENME*   j;1!anh, 8GvR e{)88%.7C@-bnj=4)&2-BbaHE7% ^oMEUXWG3L2LoM:1L4)ZZsU_F<'n=UJqjnqq~mbbM[cA?.bUQff:0'&:5+ Y~zng -102W^cqo 8kw2m2EdR_n^Ys 1Witu/L|wt6'+!Wzxm pA6hPCSIP(4URczqw|cg~sZErUA * kroR]zokI(YBNH>lTZr=D.GtzrJm %%*(:9MaU[Td~aZu=6 !::04& :8C-!9*9B(55%fVB18lFIip~fSYyvqSB*,8xQ)EWYlsm5E~i{{``#ubI]jSQ"+P0?X)5%}ghP}m\`9 %.C;FMjrqbIK02OA=! gO^J9+3+t{@AZRQfqmznF`pIQ~Ko}ifgr2*;5"<34-=5M_x_wt`vzoL^zckir" /0 G.<"22! *h~\ol`gDC$)j`vUz{K%XG-]Tjwh&U[c`d|l) pht^G[rb}ZXH !#'1 {&1L+.E<IXF>z`[SDK7JJ>   /psyTlukdwu*#=t]GREFbV-4##A$>DVj  2?GJIKr}M"&G=*5.C8/hz 30L)+5C=_Y[9/SY}xchA<i}8!'#@%%.6oxzndfL?"6)vPK^%"I$7:QKKRAJ ezr|~|dTTgkziO8#;>_utL~kN15D0>@AD!94,1A67=*:13#0D -F(-ARNHmcirN^b|UKMIk?MfI949TXal6N` .J^T3Ku}dw}psxpZm~~b`'C ctwcC9)/B=@Yj~|v>E._Nts~`hx9FpJYP]y~}o_TIJp L(;I 0?=86!,* bwflxu :=2S66 @;ZUW`_`cxoqEPX+:r{fsW+=VW]RE9  ;I'2--G? !5   ,D?S^C,G^{ox^U:Qrh_XOK5p3!; mxz\{Xi~ey{icQCvou}notlr^v~emMA{g|dRaUK4C/L2QJgdOE@OpzglnIGb~`e<"&% &mw_Vs d_T+`zk~Uo>Gcg`UYQD<>$4Pn]HVae,Sxts~sk:E27]`Q%'Kfvujp{XQ[afv|pftmaMO2?\cc}yhkOw$,5Iidm\kK)E2+@@9#   &5\kTOF4-1#$(.E.0HgV\Ph[h+"nzlg*2b3/QP^goYL`MAKXoiubDT]TcUdlDAB?QPZY3ES-#'CN5IF)7"QbKiz~rM0]jb_AA>>+?[>JYvl,.21(=V44O%." # 9.4*C&! $C<*6unve,HU?NHE6NT ~~`pkb]Rbfmz|bT7C_J2[VPxeDQ>6Y/.]WS7>_elI[}RptzyliVG^uV |hhk~)( $'kya|ti}XQgU]yxeu^kX9!Nd\~ch%84&%=!( qLV{_TfXlliRW\5?37a;!Af~dgo</1)/'' #"7;(+& 5R<"L\HEjczqsbE2+!H>WOJUKTfhmY,HE94<9 ;!-  LhteL?fkB!(DbzcVPN9)K@*)GKXVC]jxh<8AW^drN+6\Q*5<(  AJA@530-:OW=AI.&6'F]C56aT0 "  39.&  <*0.  0(*^VE9CC/XqMJc`{xhpb0@Th# <-IF)!?xoxysdz}{ztyosxwk}w{ceG41  ") /@/%!*OGJC;__cfmfNd\8k|ybYmF@_f`\t8>?> #J07HVnzr~HadbwqobQ25!3-;=H]}jq~jbctQ@Igrk=*L< 8,~k5Lmv}s^Offc^ .0%Swc8yKE^hZY}`Vf`LM:KI7ITYN089[^ +=>I+ $=U2O{dakB WvW45YS]aAG?EEOd\P]UytSTCCN@F_q%  1)%;/ B5Yf>A*!3 1f]qlZ`so:>&&I9Eq&TGVQ`g<35*6-GOESgww8<V'O8 6 )OQ@8FwvdZNNG/'=; 94@7jOLLkpp6 =J}|^Zjs  ./3T; 'R<FFDG=J 4*$ #E*oiEIFEY_rek.P?..UF%'++##42#rl)5@IQ<?]8V01*)NC57Tpo  #   $ZW* }  '8PF3;(.:%CO|K$5E?0)dvqxk7 MaLX4  " /& &xl~bG]psX&]sjP"83-@-zoAA!O+,=-&(<X_\LL`:*0?c0' y~av}`ariyqxwst~{qYW}m|c`aJ>Ebu][DNML~waHYZ[OdjOW\any_d\pw?^{gZuuV@('[hdb$%,'%"4E@% 8),JK*+F. Wdd|[[W1,! !,-Q4C>:qmgu`@fyju|DD5,x{hkxvxr`iR`E   D&/:1&8^Z]ISzbTdRizQ6L#&GViV4]a">E=aB^:#:7MI8?B*TJ&,Oc6 "+G3XgoJh|midvvvqxywvls|Y[]ee`;-`O@$&+#V[  )&")+ #&S?0<NG`b}r6L37/;dohruqTLPOlu\Zf`U}xtAibXcroskm~)1 |yoQN26BD+,90:99:493 +%.& r|~ke]g(4*s)WOHT8$J:8<-O@567Hq_RO,LJ4C%) + y|mT}sUt! 918?>9tgw`Fnmggm|t]UQag`pDTRiS`v~MO104>_   ( ,.,E $# 2 )3(G)?) 098(0"-$@[E  @(2  -5vdgQNVVdQ8EhqxVav}}p~oJA6A`Zu{:NWwqcdbeh{l}rT^m~x>*<%+&&0 +!!++:<B!7CqhfhwxdebL]w[_tqW\Ewl $B.Pdjdf^H$#+ qrzKD]`Y#!/ 12!7$ LN9C>FQ+JPH]3."Iezjh\EBTYWE0[wi`r622Teyjq\MIMWWDWZ\vvmra\I^jzs{rwa2?"8_G(*vsoh=<K9F(*0)AZRN^t]qaQSWQb|tr[{8A<(, =I-& ,#).&$)/&I<)di=FlseYbzo[WplI?TQ/#)$)JZ^jpC,'HbK{qqz}ry|}skv>RaW9IZXUC---%1{wpwr$y C}th-}oEX^Ip(1K@n8>QuT1_b@1RX49|CF K_N@dR8S;iwn[oNX~[-~G|JO@U>iZK )'sx&@0M4 (1.%Q".HJ6?ZS1,)X[<M>>N-$2  7 x`yg.EXznw}WxzxsotY{`Rrjpoqiywx}rO{{WWLRO?PJEMj^tALF=GCgO>>/)UK >>7"43<GA6!;TX7HOE:GXVIL[AG78 2233) bh/F=/5. ! 7CI*9?% @N'B4B;0+'<(#.+7,U,J<cAietTJyu)n K*qEf{}^(3&tXLM iL@xbF,bbFf@&/`:a]!7=&("sYlLZE\&UrYNwsWrFUe#"-2`>ubmr_}z{eu/&1<2-mo25"4-~Lf"^ 9/ ")==)d[BfV?/Pp|@$Zs6~}yD br$/j\hgDQv[7H(l';rx80Z D$rJ]qA\}Raba +#]pocketsphinx-5prealpha/test/data/unreachable.lat0000664000175000017500000000056312771605033017252 00000000000000# getcwd: /this/is/bogus # -logbase 1.000100e+00 # Frames 10 # Nodes 6 (NODEID WORD STARTFRAME FIRST-ENDFRAME LAST-ENDFRAME) 0 10 8 8 1 test 8 5 5 2 unreachable 6 4 4 3 unreachable-from 4 2 2 4 unreachable-to 8 6 6 5 0 5 5 # Initial 5 Final 0 # BestSegAscr 0 (NODEID ENDFRAME ASCORE) # Edges (FROM-NODEID TO-NODEID ASCORE) 1 0 -10 4 3 -10 3 2 -10 5 1 -10 End pocketsphinx-5prealpha/test/data/an4_ci_cont/0000775000175000017500000000000012771610005016526 500000000000000pocketsphinx-5prealpha/test/data/an4_ci_cont/noisedict0000664000175000017500000000007412771605033020360 00000000000000 SIL SIL SIL pocketsphinx-5prealpha/test/data/an4_ci_cont/means0000664000175000017500000003715412771605033017513 00000000000000s3 version 1.0 chksum0 yes endhdr D3"f'׈`'jb<ԇ>=ͲλSlͼ% lj9z{B=~ۘ<=g< >W>81տab=sդ<6_ ==J=_=yM =9Q?6^>f}pus l;ZY={<QD&`!v;L}@L?AǾ{"9> u<%E^ɰ=^={eg?>,`콂X"=RL=<H7~(=MļPg~e=:v=7<>]7@?U7:]="} =7n''=%ƻ=üLRH#=x 9݄>^j==KK=S]<xU͒< 1յҥ<> =j=|/=P^=1*+x%мuf*==&=cKޱ{c<s=[2=_(ONpO=ܘ=)7 ;eAbOUI=+=>iՓ=>= ='q9=6ͮڽ'='=R<0<5>pX=#=آSal4;<(ka= rI =">=]>{7> {_ҽP^=6i=\E'@e>Dd> ν8q|4[\~h}"aa)]Y7T>"H=T=6)v<&=d"=HLF7t[N:Ev̼y =S!i84=X˩:} Ҋݼ=SXZ=ƎX<\Ka&<>F5@24?ȍ>2ҾԱ۽Ҳs-=0e5I?%>6'.>>R\]X7RU=_ս EL< +Z͵L膻eG<~s3?9>J=u±=bu%CJʭ<9x*]>+=t<;^ŕ==??-=6ؾEn뾟2hh<~ =Ӕo<=Ⱦ>ش>K4g%|<^>2= cF` &=Q=v=&[= J%98_!>q=恽o(ƽV@o?7tF:K -xȽDݽ뻼%>oe(D=„p90 OcSW>f=6>p=1>>x=׷$v>ټ\ϽETa==̩H_S=q:%X=r==B=B΅=#b n=PH=0=zi<;<˚>g2Nn_<.ϻVfpu4$uu=k;.&@=)D=e{O:/ =rM>0>Ρ=p%V=Fu05=1o=g_V<-=>4=կ=%@]ʍȼ5<ޓ;;,Y]= ='bJ'K>(>=|>==ds=/=t== F)===PJ[f=3I=6#7o="U=%=<;v;<H>SԐ>k>(>'e=k<_Y=%d=Q=Q<,-@'3=Ww½ )=Gqxn pd7~aȽݫl?N(E8=6>%L,=&;t<0FCVZog@d(%? r搙I?>GW<>Z- ^5=ҕd% >%0>=*?^],fl3\q 1*uѦ?ݿzm =]WS==Xe=<==cR=6<@FcȆ&_>?(^=`<}zB4<=H %;Ö6=r'zƻ<;}f[kлj*T;.;KRG<M=Fd"z#>>=A=O=J==W<&tC߼q2Kc;]b;:<;FU >;`>3P=2>f=@S= D=|~<,<*b<~^K=pM=u=L=iB=K=D}=*=8=@M2G0<Ӆ̦:ڌ8DӼuL>Eg)F^=% *4=9=噥<-=,}<&j!e =@<˓@Z >?|?b> ὚#gG.GNŊ]?m>9>B>O ;;#J!Ye CM^=TV=W<<1$<:=slR@fZ>ƾu=;~g. [ۼl=B b0qIsN?0-=~=(>B&*W<ˡ<|=hnn<:)/%}W<=Yc=!=V;A2#Fļr;!ۻ?7湾ؚ<$ꉽMMV<}=t<`?׼9;#C=̈́<^m .= ܜnJ=2߽ҸbC;;s!6 mׂ<%I@8gp&0>o<I90V©S>1 G><٢?m-h=rl>Ka =.U_Z=}(>+&C =z~"={<7t'@Pʣ?3 :1 >1>RHӾY¾4=F |*b;T^Nzt=;8=)b=!ѡ:!g} >C=uht<=N?:Ej>ZQn4"tD>U+U 7;1?BE `'<7<3?5Q>}=踕*:;9;|f8tl? `6e6p㽾0`8μEԻxվ qy=)=E<=w=~;Aw}Z0E =. :F=0q;%C]Y BƇ?=O>@?rgHN^:]#)#L6gͽBdQ,/'0>@6^>G>\=m=a=њ="=7 1=J=;f=8=<=&<<[ּQ.;IWSn,1q%ٹ,h4!t3C=m@O=AІ=:d< ==КC5d ` /aޟ<.x3Fy//b;6S ?R|.=p =mڣ;PA*=I5oH0r`?P;"PeR02 <=Yk>23py];,4Ľ7oI*=Ι&?=.=4;!мV֢xJ /9<@5KSb=r?0 =[=;d;1ͻr9T6?`0:W<#>ow=ZؽQMüPctM;+P?L~>~Uy=ɽ+DŽbAO>]sV=|2V@@ 3 *?X?^rYl=[˛(]' ~=иMqΜ/xW4>\>@>l)>b== d030<r=h=y=8=$={<;Cg=#^=,G]>AloB==Hb=!<޴Ok^<2"zg">):?eK>>I*U֡(='=bAG=H6>+_g ;2,=ԙ[22WZJtk?q ?Wb=F C a =]<δ4ڤW?IY_ٖw;'e=V=Yv`=#<>A=";;d=\?%?c<>O}ռ $zȽ5e-G{?>e7>cH}1ДsĴKֽ.ƺGM?ơz+@>T^<݉>=,޽[lI'~ɽ?_"oq'K??!Rs?(~G_[S_C^=ݼ՚n=U =̉<%E@l?ʻ?Ee!꽣ӳ{X-wYһk>@=6؝><,=)=%vY<;g{=-^E#;#>.F>P>#H/>=< >r6Ej>>S+=iS(=F<%{l/)M?W?>T=> ?2^; =!Ix Z;B=,h甼hW};D{<\Gs =$ >A=(2=lMU?=t=,`h½ɔÿ4s^Ⱦ[<ѕ =$En<6a4 ;T <9 *D<8;ä;7_r.<~U=Q7azR>xS'>j=}N=H=mA=Ί]Ԥkl<9=+ૼ- ;8^=ݟ=s0=7%w:Ew8u*oλH}"K;[f?>h|>>>qH<&'0=Y㺈&XxoIS7=?=S>,>>̻Ͻ@i„}`q=1>.y?(g;np::`#Ct(}мU^>Ѐ >5G>eicw=<":TC뻬"V p>6ݾ>{>>=<+>ח==ޜ=Vn>:e+_cB4ݽ< >cU;m9>`4=b3>.=r=*=Z< *=:=A=#=h?hQ:gGϙ2&=:=IXu۸=(`^|ҽ,][>C%&a?zW̙ 3.=&=}!.'<ȁz =V<4sʪ:=Cy@9D>4p|Z`<ɗN'=5*5A;B7NJE"?x>=a$:u>=My=.F6߸+=todh@#?%̾YվCto=\'< s>H=RJ w>l_>'Vs)|z>[>޼_a$ˊ=ӎ=w Z=>E=*m63z =5=?bi_bq=-=\@=~?G>i)k) S`0=⑽ddV=YZC<<=Ž<=ʰժ{d=)?yJ(=,=YVQ(ϝ== b,R>ޗ=Ĝb"<3D>}=J= ؼ<0<<;a*Һ_|j@g>:g={&>]q G^==w'< ={x[ٞPᄈR=C.D=SЋd>C<ޏs>UN>k>#<%HpdϹ=s<oڽhk1>炂>-3> <#=wI>+1vԺ>>9><<;j=>=%hJ.L<н =<[< R;|;on!=k8Y#;L 'i<>Ԩ9=V=v ;=X??нa>鸤9ZDx{< Rs\Wb<5<>@=>A#b{=H>HlSǼ<3mϾa]&=лf=Ҽi=%)=̽˅=% 6:<z)ᇾ ?>/7b>a>0[*=|S>@ kiݽʼ<@.>`ʢ=phjI=:IJ==[=w2;?U>?۽69%6n /#B] gm,?C=q<:<ͤvڻ]J<]<: &f b?$?M>.X%mͽH >v'׈sԼ3%H=٠aay=\b==V$=}=_=̼ i<'=[=x<8=)=P@*Eо.>[Y;-J=7Pm&c=Io=k 1 g!E^@Q8Pڛ=8 mc@=g.<:¼-\T;:숖=;>WYt>)W<=y E=yݼ*G?)!;>n=/>ǐ=.A<\b:= (=<[n[?K̯?4h@=$J>:ݽ>`j<<$?>΋Kd==sн[8<`=Gjj2:Z >n\Y>>˧;z99=`=ט;kK5 "?7? +>\0w>⸾W=8=@1Ƽr<`ͷ[ž2>42>\ҽ3'=H=~;qI YQ-HN>%9>ja_>i^5=_<؄J=:|?6Q?7侍(50׽Z>_\y,>i==h>Z>Ы4ʰ=05=u蠾U"Z>734 ?@j>ī5>@1޽)1=z=`ȼ=y$q?!> =U*v`>+=ችv+.Bh#1-=zo=9!Q=D>=Dl=h<="@=5h(<OD;N;K ț$; ;N\:Ja\>0:*=?n^}׼hu30 lnbׁMd!4=r?(@>"==OP=<䚭=(% EF==ƿF?:6Ɠ>;ܻiw]Ľjw1:% ;4B>ԒK?' >sB<Oz-P~ddQ;Nè˟ b\~);'g=0q=N=s=Z=f=p<<*= Ļ+A ZV<4O:s; ;; oe=ē޻<<>U8W4q;Y77< th>S;9̺0p#Լ>GPo>J=2=6=>>R=dF=>X=ɟպ#-`a=O=EJ={=p==c=?y,Dn%. "{JsH>;^=e:*ZBQ=̓Yl=B>+=_=t<==K=R==T@</׽36h}mnJɼ!μ:Ww @OҾ$vo=4=oԠiŧ*<^F Χ cd@kz}U?jA=< A= 7u*V=6=:d=L\='z=>=#<<ҏ=S+6>PFtڼbBCa<[I(NH=2#tkv'0z^{MR?]1T;>ۼ )ý4$h u;|?>ăx6vr>= -&[`b)<"qq/&X:>)?ۧ½jq>4q> i(UT#? NA?be̾."pлw %;Dj=U. ]x5?Cc>:3IR\OpE])=Ya=(=g^ɰ= =1L=ULt?"?St>if>ý;1-]&;&̔7㽷6FM> >i} >= d>+=]= ϽS =:>=茽c^5Ej%pμ} 7.=##._z=M=<{<;.==A?_/L=x >6>0&><Rͽ~!`=7B/wy>>=Z=J0>y >DR={.x=1G=%:>/=V8؆( R:3cC>>h˽*:>X>>2>j='<=\.=@19߾:?VӑI)R.<==:5=؝ =(=G=d#={0;PWhBOw'ǼPfBe<Əv<* ?8l"R=8;0XB.&6孁 !n?f?R;?4=Z&"Tݼ?Q]rWSǻLWb@_?F>K=;&<0^;RC:ă"?!&;b|$:==8Iֽk,þi7=v=vPMP==߿埾2}b)kUq>xv>f=36$詼7%<=Ӌ\=y/@:?p ξz(2-3{u>RDu0㽱v>=}ď>"==Gq,=T=Ue=kFT&-=R> ~y> ;Ik@( =>g!=ɐ9OȽzx5G>;>mf6Z== ;{cU)w'Ҽ҇>[[=03>#WGȒ<&]; p;&E3nS:3eD>=-S񼱎2Z łc ؼKP:;h n?^8<=aHR<=5$f:UG=2SKn@Y=<ƽ{[ <=]f$Ɛ@K?Sn>q> R_`>kO=[> [aν@;ִ,=oW=1=$G D"B>K.<[ؑ= >g@P3= >V>_===<m=+< :{ܺfb>$="|$d=RYN|<9ZO)7\9B;e߻'>0:Hř; -WaѽS[# Ǽ/>.> >vFL=='=„p= t=Pؗ<4a=:r<ᬄN$<=m{=&#+;=5=kך<3K'<$&N(> bF2m;8 ?/bmW\T=A)?EQY>Ӥ>4a>n===R=r=m-=?<<:D<>*'>a==Kt=[l=y= ==X7=,4=@!7?fo>J7>$> ===[=e==~|=рs=1@TV>>/=NK=<*=YQ=P =<^=W>=Fu=?1=Yw9=\#=O=F<C4>F;==^c=0=)d6=CV =8z=v== =(?>=ﮭ= a==3*====<=N<{%>j==5=<:=~=|b$=^Jt=7==E$=^=4>#o=@=O<[h-=vv<~(=hP<=~<ۡ< <D@ 1=|>S<|z=iA=!= %<<~4=i# <<_=[q@j >/e>~a=n=1=ס=ڴ< ==}>0>Kٰ==5~]=n$==<爹<"<<<A9 ?w/>ߎ2>>6 ==vtc=:=_f0==== A?il>^>K>= =s=&,=l=W=RT="L=1=W*@1D>7=n >=p-h=yvP=]#=g =* =:>){=h]>e==~T=@={%=5=#== H@*> >=E;= == =y=d=^7/=A&==@PU'>$)=R=2Yn=ѷM=q%=<|==@<<6L=" =s<m ">== a=k=7T=w?=au,=\4=;<$<=*"@xO?X>C==%=5l=19=A=.(H==+=q#=}?x=we==\9~=Fy==W=y<'< << <+?< ?-F>0='>Ώ=`=T,=U#<+$=<<ҵ<v?JH? ->=e=p ==W=><#(=^<<9=]?[=qd==-|=fް=y-=f=X K==K==r=&>\'=}=W|=A= 2]=a =R=j:<@=-=YA=nO=>Va=c=_=5=je==|\+==0==-=_K=t@?N>!U> U=ɛ=%NU=rA=C=4#={`=:$=M<*<:4A\F>6>=y#>=w=^R=-N=j={T=B==|2A- ?)>ZN=.>o=Q=ʛ==e=u=>K={4=.?@>]>*=܍=@g0=e>= = =Y='}=/= %<"X5?wY=3=oI=3=</<`*<]R<Ŵ ='==t%<@<^<$=!=nM=== ==J9=7<к<b >=I=g=K=U|u=K=~$==&== =@>7>=>(=Aۂ=f==8%= =OBapM>>-|===3Q=^=YdS=Ր==}$=8x@uYL? >e>^^>e=&=̇===,==%G=FD= ?,===Ȑ=t"=#$=&G=d =&<Ȇ<=M<l>2=.=eH=eM<43=$=<{<_{#u=xr=4|C=,=&C==Y<=m< <<==*=)e<<`<q<<'=Ң==8<<<Nj<ɨ<<z3 =YJ=_Pn=X6=@=F<ݼ<>M=@=C=_O=i*==B =P=zN=<=-?p>Jw=n==⊓7Z>F>F=kv=UN=I==)=<*<%>E>==*7=Cz= =5f=1=X:=J_@>|R=>_=v==<^<g> >======)c==="<) =I$A ?>>=~=w=y==t=O=-=/=[?/b>=#=3,=W<<)$<<@{>->=ǿ=(=,<==<<<< Af-W?̠>ln>?>N=Lf=tH=K=R==?=G=?>j>ώ=+=C/=u=4= =KA= <<<1\<ڷ<;>.>W=_=^8=v==<׮>u=E5/==;0=:A=:1===`===o,>l=y!=9=W<N<<}Ȳ=Ҡ=D=Ta={e==I<f<5<8=n==]H\= >=/0=.'=1==Z= B={@@0e>>D+>p˅=:F==Y<L<5<><界<x"c>O.>4=i=Y:6=429==A<ö,sh>& >H=L=X{=me=עg=`A=5=L=WA ?).>}>=6=1=<̛<<(Bz> ==T=O==Co=Tl=|> >^J==z=;=E=&F=(]+=59=@l> =>$A=VL= =<]J<->=P=wh=^=Ә-=gm=8=N)>{ >[= =sj=E=o>=T/=3=s, ==A>v&>p`>6l=P}t=aW=k.0=4=7=0,<*<'<)/An ?jQ>f?>C,==/=h=ؑ:=)= == =ѵaAIQ?>P>>!=G=6=u=`*]=G=5=K8=Ƨ?b>T=(=== _=y$=+1=[C=VG=`2=.x<2o^=5m=q =M= 2=@e<+> ==i=tp=0=PA=Κ=}g=={A ?DS? ?>Wn>V= == =Ǥ=k=RR=bu=G??6=q|==N =*7=b8C=̳< m<<}>J=V=?=:9=}== =G= =z8= Az,@L> (>D[>n='=G=p=>ϲG=V=Z===J=Y1X=={=7\=i<м<4<M<{<;H?">v>e==1sg=H=@R==Q<<<޹< A3>pE >ܾ+>==e=g= Z<<<œ<3#>99>=1ƍ=t=39==;=<<5>B=x==W}= L=@A=?6==}=?U,=H{=6þ==<#=V&w,m=#<=P=C~=Ω=1P=+=֓=V<5p<z=x<${& >ґS>u=sa=:=̹=<8=3=8<<[X(>p'>=A‡=Pj=<=6F=|M=-8 =W=t=q@C>=}= ={<<ߔ?~>>x:w=V-=O6={^ =5=AP=A=5=Jc=_=L?=+K=9==x$==?>9&==,= U=,8=~<W.=T=V=MJ*=$=6?=h`=G=|A=pH<^<@ A?=G=y=֭<{|NE==|!=#==mA= =K<'p=j<@'?->=t>䤏=~=qK=A C=<=g4&=%&=S =t@[>='=`0=t<<&3{m=aY=Ј=7p=y_k==w=m=cG=S*+==='=C(=%=J=X@ ?@t_>nˌ==#C=L=c=M<;M=B1.>=="'x=A=@^=Ծ<ͯ<m>Ҏ=>"=)=h=2W==oD=]@ˏ>> >Vcb=R=#A= `>]g>(~=՟=_e=ܮ=Ж==9< )=bs8>Q>~ҏ=*o=|=C="===Y)=( >@=$=@=EN= O=)===!j<O<<-k#>6Ӳ==Ɂw=Sa=IM=A=&=.b=d==7@>@=G=04= =4=n<'<==*">>==\=u=I= =( =<9E<æg@ ?Mc>T/>R><=g=eǕ=k=4E=n'=3=&= @8|>S=E[=|g==b>.:=Ic=\8=b=:=D=A= =<#<?q>k>F==.V=c#Z=X\=k=/p?=$= = =F@/?="="9=3=Ñ=-lT>Ǣ= *w=Bv=&g=&=D%=<!< T<{@wF?Z>T5>>=Jۤ==b=UUn=}=;=B)=I = ?ݨ> >="==<8=0<<}<6<<0@-?F>|/> =Tu=[=w=a==l>f˟=a=i=fr=1=.2= ==` =?2>1=w3= wx==* =F=< =s< <KR>@J>x=d=]Q=P=/l%=9=<<< Z@}=?>r>`=̡=ّ=Q=5z=sS=o=l=Ј%=~D@u>7=DW>Pz=6=&u=K<<.<<9<8<<&@U/?c@>z>q=ҁ=`=M3=eI=)X= = <+D)=:@i+#?C>ĩ>}=u=Sw=f(D=Q=NN=mx+==e=? >D=̎=Jz=o'=w=9=捶=\=R = =<m*> >|ׯ=uP=ίI=;*=Z<='=vj=^~=DT=0=`)<~2\=6M7= =U<6< <)R<H<@5g=uyG=+=A<%<<]S<ԉ<$==G@=c:<6D=C=5M=/=<5D<b->== uk=y3='7=BW=v = =E=i*=.=*<< <6=N=x=<6>#>c=ф=mM=.=EP0==/]=Z<(g!=c==4?͸=2fi=D =2=(v<Y<<[ >=~>B=7=,=+=(= ==#>>(4c=I==u=;O=cC=2p>]H>4@=='=Q=҅L=AЋ=<< =A ?+>m<>b==P=h=Ȩ=͎=8=3=C=?E>==ym=h>k3K>Ή=T="=g=1=T0= <<)hH>G=v=S=zq=i=ni= 3-=1N$=U&=@>N>%>$=-=h5=<< <>Ʉq==+W= I=q=g<<{<`< <1A=m?&>=8>= =/!=n=-}X=/;=>s&=M=="?!>N= >|]==z=l<\=P<<-<:<#-?⢔=F=>=&=9< tD->y=0=\=_=E=$=V>?;=(#>%t=>@=U;= )=|=QZ=X?>=>=G=$~=EnW=O=U=hP+==W@<>'fY>w=3>==}=oQ=Ʒ==Sj=اF= @:>ަ=uf=J=s=).=/V= R=< }<[Z=2 =Vܮ=j4\=.M=C =..=OV!=H#=N?;>Z=Q==M=s4= =!=ڒ=Hw=^=]=*L?m6>M=O=N=+A=#@9=VnF=T=io=G=V=(sJ=@H==`=H=Q=ck1=='L=g=Q=f#=a==??s >k=J=Mv= @= =%+=&=څm=9?=6 =W =٥?:> -=/ڲ=õ=3X=#=E=I%=iSY=1=05='=9@>C==Pe=B=X=<.=9=D=K<]H>A>Ӷ===l۔=hm=X==H=e=>k@<>J>\>>=q=.==B=59-= ,,=T=j?=/=z=/;=e&=3==<:=H<|=߬=>b=&=r=0='=bg=[3=Ч=f-=d =N@vT>=Lh= @=6&=w=P3>~7==I{=k=]=Xy=d)==z:=>|=uj@{>3eO>ā>y=fh=l==Đ=HH=Ȁ.=5=."=jA'>}>> p=;=uU=f+==t!=U<K&>ˆ=6 =QmF=oB_=(4=>C=AG==?=Y=A)?]]>;=d>뫁==yv=v=9a=ݜC=5=4=}?L >>ݚ=fg=m3=VF=Y=+W%= b=<2<ޱ!=Vn=(<_<<&l6=n=< >0=Ƅ=me= =*{ =48=5=;~>7==M9=>==B ==(=h=<İ?8K>==V=T=B=:*=n@=3,=0=XL(=u=w@ >M==?C="-=>=x=k=lV=<,>6>x=2ea= v=O 5=l(=*=7=Ѝ =o=aAMP>5=}z=4Z`=ٷ=[=;d=v=\<<+<Ԃ>G==]ۙ=2=Y=\=<+=?0="%=ͪ=j@Ch>}U=>7=F0=<~<Ы<ʌ==g=J"==|=`G = )>jx1>=N==z=gY=w=?=Z)=j=`@$*> 9>>>=L==}=%V= =e=2<ȧ1>R>[=l=y=k=(-=`K=R0= =_=?=u=@=ȫ=sF=-=2=);==h?s$>d=>$=,=x=ĸ= == =)<ԩ{b=y=+=Vq=׺k=xB==8=k===n<)?A>R= =Dx=Js=CV=Nz=q =="=<M% >t>=== ~=> =R==@q>WD>C>==AƠ=p!=J#.=MO=\6$==x8>>G=|=?=q=W,V=q=S=N=e=,,@LQ?=>UY=,=#=<<<.<Φ,>$=O= a=.=A=2=v<i>ۘ==#:='^=OQ=;=X.=55==o?De>y= ==C=P= y=k =9'=$t=3===+Y==O<G(=A =<.q=V=P=<=l=?=v`=}%=dz=;<<<Ƒ>=iS='= =ߺ=u)=T=3= =mMB=a=|iO={/== =L>ؤ==9sp=4V=G=X3='d=Y===n }=E =a0<</<@<妷 =k=5$==kq=u:S=A> w=4= =<$<>%O==t=ȠJ=A=gC==i=p =BZAb,?1>'>{>wz=N==>{=w=^I=M=G4=%.@ Bf>=q=Q=iL>:=-=g=#E=3=@C.=j=]==e?'5>O>"=m(R=(<݃<&>ĭ=)D=sD=}=JX=j0>G>8=?=u,~=T=-_=-/=+=$=?x@>=K='K=v<̤<@+=*q=3=`?-==_*>i=~y=N=F=-=HO,=0-==u=.=?>S===ye>=]i=;=)=M =V<R>===Z@=D_=K=SV=ޡN=-=r@2?]=C=1="@=<з)= <Ǟ<=<ר=+>YGG>=Q|=i=/=cN5=>4= #=i<@Wi?Խ>L>=_;=Ƞ=y=`=Z=N=sj3=nZ'=.?`E>.B=ښ=hm=v<~K=«>b=\g=0=%=B=]=>N==/%=,u=d===}3=:=2==q??w>==H=/$=)=<=<-7<.<%=>c=[^,=Q==2-<6y<3< <E</==P=sU =Z=W<w =+4==#=w:=?3= =;:L= >=K=VD=1`=30=(=G{L=t<*m=Qzf>=3֐=|=Q=`=_G=(B=\s.=)= =,@X0(>==-=I<=_ =< < Q<<)<ڎ?Е>*M>Ч=h=?+=QL=4=!>g==H=_=02=&/2==ԕ= JV=;'=7=r-=6=\%X=(=P7"=+=$μ==m=0=c j=6=L===߰=|2@8>W=7B=HQ=v0<զ1== a==[=@3=F=sL= =}o =-@vɢ>e^ >.=Q===Bk<}W,>`=M>-D=w`= "=#)=$=7<=\>%==v=c2=q=>i=2=-n==[=m?3===ˊ=M=y#=~=X<'<7<<<Œ=.x===-=5=<=* =߃=>@|=R=S=tO=Wf=zG=q 6=L=vX=2=o?====J== =c ==<<ڽ<%ZF?(}{=H=kN=1n=/=VM=,==i%={7=)=x=$=O4+=+y=Iy@>|>lR>u:==F===<~>\>Ǚ=oo=V8==ls==`s->}>==~S=$3=l^=`<==Z =~=~?=M=$G=PTM=3a =<揥<<='=Ϸ<y=A`=óI=i=+=X<< d<-kj=\S9={!=%K?=*=8&=F<<<8t=1ʷ=Vg6=u8=~>>#=Z===ĭ<։<<,<$n=I'=:.Q=76=5=3=$='=4=@={=?>>="=J=ll=9)G==<<I-T>g= =)??=3=='=:<=Ln==e=so=$R=O?=p&=|=%e={=3=r6=>=@K<<_w&=w<u >T=*=XI=yL=I&= =<<Д<<hpocketsphinx-5prealpha/test/data/test.lmctl0000664000175000017500000000011212771605033016301 00000000000000../data/tidigits/lm/tidigits.lm.bin tidigits ../data/turtle.lm.bin turtle pocketsphinx-5prealpha/test/data/goforward.mfc0000664000175000017500000003264412771605033016765 00000000000000h 8AJK߉7@ @`Q_F?%#A@H8i%lA xBsh@?@e>-9?241@{<™?AZAOmAsH?@W?|B>E)?im@CAGT8F{|=57w?v>ʠ?2@4A4qG]ž v.@d# m @=@%A#I)@UAZe@M@$zS2.Z@xAeM;h /ezc@@ @f@~ 1 ۖA#˥paL2k/8@8`eKS@^A)@0A 8^(Y)R3 2AlKYAZ@^H@/l'@bA:oF7#!>??/AN@]J`@x@@ AQj>4>00>K@oA5%@Z2?A:@ 7A!?\ ?@dTA?CAWt~@D@d;A A%EҔ_K_ѾFF'ަ/@e@A0ؼ`fEReMjw@x?NAH$"I8?]A'vZAxx>A^>ݢ^ASNA#ٶA+HF?&Ş?֦cv@&AZ@@ijAARASAY)*{ @NrAA=?Y$Nhb@v;p>_0BhD vApAaٔA[i4.@ A5BMK+1AXŴA<%A\nna@A8@$+NLAAܰ@lAy>RAOA~BAE(@X *??$ d?r!"o#Aȁ AtA5n>+GfR ?U?\=@PbA'΀5A@_ 2 ~b@W@ggI A"8I;?683h,^Z@P@:qVݿ4AOAs %YMA(A3@a@Eb@v:1@ @0A0%I!jAeA9@D8W &m@>cA;9ATu >kԿjJO=+AAIs@"z{j?AvA{i?{A?dKe@hO@u x@6>ɾۻ;5@@gAI{2@l= @$=V[Al8)úrc=p@^BA ?_6M^7OOAvؓbA֘Ao@(\z9ThJ; ?j@@ @Aʽ/@qږ`g.@@Z>A"@aA85A1۾Airzxퟃ@AA@:+>?A:AQsA l?Z3?ksfA"PA A\? /baeu@'CA:dat?A@>:AۘAFA@w JȽ?AAyDqw?K?M/LG@@]i=?s#S> pUѽA[q?LZ6^>'=Y\C{@A[A8 hQ?\b$A@RU>Yuun ArAAn6-F@AU@sGο/{?~AA$}?>\̋@C?}3 P?#7w{@`AyuVp;@n&ͻG Ap@;?V_ @/@D@b A_/$wAyQ+I?QwjU@@1LA%>hIWa@r>>÷XB.2*5@pxHAc0J?J#A>BڬiG3bfA4B@Ů(A׌nh(edB>Fk%q3@vAABjA= ? A1sBvA C@SA6A`Qݨ%ըM@I89bAHzBAg@ԿTz@|(.C„>$S793 BzBAF6@{@,2„j_wXV>AZی2J}BDABT@3v?? Asa1MZ_@Aށ^5~B졪Aa!`8@G:3@D@RiQGW FskAO$xBArd@t/@uۼݦd@tփ*%JFA _rBAt@K[@Z@H(?qg!ϋi\zA`=qBiA@➓@Y?U@b+c13„ACmBuAhA9Ȇ@2@Ңd@ẀG^@+ N@edBA`@uB@|yYƖ A&QA]Q\1 n@7XgB Aέ@NR@}}æJAm@xVvwՄksp)mbB7@Q@ @+^b{W@4D'YGRBk'?eq@ ~@z@?FAP@ '@neMByl>^+AՇ@"\Yqlz0nľup@9MBj^W~!Aun䃾34w?0&v_ƫGBE>~[BA_~b"?[-kORu^skAB1/eu tA%*׿G~|CAbFB}Pk /1_@p b P:t?ncZHBb$5'\@x!ľ[P2В-A8|O@GBfTIB3@]v@@m@Nk@jER?A\FBǙ6@|I1@ .η-;5kd@tZ A2UB ]&?wv@!=ە>'_^@s?@Ϙ :~bB$4P@R=}N@&@$^O,@w@dBJhzc9K{ktj$-FA ,A` _B{5_Y_#bR1$7N?@Yan@CÚKO5>AB 6@ Z@I@nJ>@ɑ@/AYA9k\h"VU6CBFArAe@dpnL@{A3'tArbA:j?BhBmB <"Aw&@X"¥S@bbA PcaCAst#A/ hrBB!B@@"D#@CAMS@ӿ W\AprBKB p@l@a8ޞ汳A =Q|Ar¹gA BB0%AȓABGUS@.z_#?>BnA?:_A?v6꿬\~A[°>@Dm+BıA>o@P<@`O?#? 0Bk?ՅA(zB'ڎ?u-BogAW@K*-1-@K@SAH/5cAϱF4B׉Af @eJ1@:>X2:ARGAU¦8EBWA6SQc @*?XeA7XPOP@xXҮ:bD?bGBAi٣Qş@&wAp&AʩmT?!JoPlAqLBLAw^Vv@BA(As=@No^.ANBAϚpx;AA AA¬i#@4|A:PBrOAB(]A A@ 2>0u7_oARB1A,)SA@D@?R5v#ASitEA%URBApAf@ꝿ“ˆu+Y@?i8APBA{S{E\BL:@6^4¾(ID7Az:?d)0ASNB)Ak/BBV>9,xZO<*@f;l=AVKBيA:=b'B?[Rf>At)H#[ A;EB[Amlw@5Bf@gnE_A+S@;BTA.* u@^MB8A($;?o@CjAgG:/BCۛA!z@B@5x Rr*@MPAHdA@)@@qAAIح?w?ZAsMd?"yA ?:AGC@AAx A/@1A4S|MA7L_@u?P\7AA@?a~,AXԿ:zAw{?@~ l$@&@K\@/AZ*A)ZB?=A?׿uW\L?t2AA*@q@?\&9A B͙z@4,Ak-A-qYA̿?@~@"Bzo@,AAK9>(W@B)Aak@;>L1AAg@bs,F](⿮,?YA/@ A|3@ h@ ێ@yKp2Ǟ{>hA`9?{A#@=AL@hl:@xBy jF?ftAs @;?h@>C0A?U~m]BM6 \AIA&#%4AEAd,@Qt>@k>YSB]&7A@Z[@G=Z AH;,AX@ lUB7CL1@͉ eZ@QL?@2ACοVDvBы@;-=2K@m]AN_@buB6AW!AzL4s>IJAA@mBAA"Z*)amp>@{@ A̝@BD$Am"A?rvGи/AAJ'"”?j/̉Bf7AQG)Ar(+#M@?A @XY gAn\NkB>dAe FBf@mz@p;@A@@U&CB=An AUAy@A9a&B3cAaA{'4BzAD,¦Ԭ@>AAV|;?хA F/BBApt?]-A\5$BAOܬ?魼W,BxAVAx@5BAS+*@UA#A+q/B=uAAT1BB2A) U@N]A6<:Ab ' /BzA`A.BwA4+w@UAle &(A:"b4B[A؆ANf$BoA2e@AػNEV2A\J@n6B|`AKA{BAAbAQAV Ax@l9BkALAB]AATA1eA4\gU5#A^P@ 29BSAA-B3A@ЬAAMcqA:@n4;&=B4KAlyAeBK[A}>'A"A'rRAO+@?JB_+A[@AviADl#A+ƎAq ;RA͉A6DȑCBj]0A7+AAـAd'^?Ak@Yb]x[<AHEA8 N>B4EAsABA.܆@ >w˭PHBA>FI>BQ,A;FAڣBAtIb|@H? 0ĮAzGJB}$A@QLAXAy>#Hc|R[Wܪ?J̰AY?O]BJЋ@@`BBZ{?+&Hο/@})YB@UʍzB0QA&+&ARVB;(#BYAV 'kƯq?ɦ"GDQR?3?6B)9+BA*<@2 O֯ͶA }_ھFAB|Qdӎж x~z}@ ITB=@"APη>UIބz9o?KB`@pQƆ@_A#l[% xE\t_? A1BAw"AivAki-N< U?8:1NrA{/BA1!A5E BS@Q %?D;A.Hop.Af .B[ABa?Bj_GsktxA㔞>@w-BÒAڍD˿BQR#´Q|A|M‰P!@(*B/0AП@$XBEš:7rAK&;)@+B1BAJd>NBWzbO¯>@.@j4D@0BA^@GB7?ʺ!9ϸ@@: A+.B^AUAAg)?uȮӼǤ  SgA'*B$gAUA A#GNnL@@K¯7eA4&B@Ax{kA BHS\P?N9-AO"B!8@umAW)BBbr߷AV%AwBh'@bN`AT!B4HaCڟ@M rrAB.IEY!BqBؔ?dA(c@D`T@!B@KN.BVA7fhy?%W ͨ?8JA};B[ _AspA`xA$0A\#@/,ݱϔ?f?EBBKšiA Ag>A'ȗ@6!#؛@DB{WA@ZVѩAA4&?nD &е@EBd§مAv~A`t:\dALʉA?*WvD?CBZ~° ^A1QAD6@KS8A}t@@ ƾl@GBFxxA~\Dп %3AF A,>@W SH`LBTN²ƣAy.[JqACoAW9Ą4?|NKBJwAmW^AO7*@v@`&(҉@NBI7A_0Z@zdAqe@qn2p=a*u@]A NB*QMAom}@`C@c5c@B 7A u@@ wPBQTLAy#Ag@-A 0@#@/A/1x ?$LBȀS6>AD x'@r@k>̇@a#K@OBmB=A1}@@ ^@-;AR)ac AVB>7¿c@/?uc?CRtgA7A[XdB:.@&魄AEw @8BAKn@<β[BR})!@\V$Asys>BH°IAw+AAOѼAqSAG)/F!¾-BblE@Tp<WAt돵@+οA7EM#Bñ3@m? j@PĿJdl@lj&eBU!?w!kYxv9ARZH[?A]OLƔBr.Gз<[-A3= ? 1?-OW@N}Q\IHB?߸?̔A-`@uAC/AL A^ޏ?Ǫ͋@[6@Bœ۫'AQ]@Br AinABKAAž A7)fg@AJA_[ 5V FA\`G@ ?l[*TS?Q7RAn*>4}K?, ?:;?`g@ei%c?)?A)J :@^?]gܿ"@$Hu A $>Z>A]!vi@1AM@Gþ#AI@CA/P罿@1[Ͽf Qw߄JE' ?q ?XA#E>(@4O?>@N}_$;g1@9A3?N@tz@O4 rv{ ;YrPA3y}??s¿@@Pa@ŰqQ?"$?Ģ?A?0<a@| Ao! ?@#ACA>t1@?@C2Am;71~w\ZAbAg7B#?@8@V@wU@@#@SwE1^@G@AmvWоhe?ӆ>l@ ཞ#̰>J=@\AJq@@!U@CAy0@ȿζrDx@HDA-ǿOD?8Ah A?ݬ@НA AÚ/A}AAB@2@O_?_??6@a/A? f!^GA,.A4A_A.y`@ls>(L$@1@=@z˺@ ^A[A`jASAv@)]@ۭ ?'%@i6A ABAʹo@/A]AM$A@ e$׿*4A A??0!ˇ@A)@Z@;Xa@kV=A=AR|NqMu6?qk Al@}T?bjܚ Am_@ޚ<iS` !#AÒACwR~@C@q?fAKoAn@*X,AEAۮAH@E6JA(Q?V&A}?(%B?G?f@SAPlA@ e@1:Aw$@qW*5APAA>IA]2@$>ym@>ԋ@ @8A{A+A= A^ .ѸWA@'?XH>y%O@҆@hAiAM?3Bp?lWAXѾi$A!HFA9AI68A'aTӣ|@/߾oA>@Bs?9ˀ@3ȯA@.@R"*?k@`EA= RA Alt?@@DAB mA@VZ@ot1)Կ6AMIAA&!A9? [l@R%4@X@2e^@uȚ?RR?Aۻ7AI l@?Ui'A +Av1A˹@oSy1@p@@QDAtuu@:?HAL>@0{R|/?Xw)@(*A&A_[@rPAX?=Az@vl 96@Qf@e2>G@/Y@F AT@(AذHA9J~@@A~3*@?2?j@Ȥ@K>AG-A&.?B |@<@̿1L*pA?@ڙA+6A2_nR@KdOAA]@6A M@AxA!=AN&>p 0}A[A?@+ۛ?"+A@NAQә@!*xοYA@ ޺?)@`@߫A;pr2A;:̜/AN@!Aُ?x@tՔAR!A_ #c@@lIh8|XҿS@0ASA.~Q@>,?kK0?(R?r @#??<27K6<?4?[,>Ϋ?h?>?0D?HqY? E?%bA=٪?d??!??do+?b%=Q>ni?[L^>d?P=,>GS>#>=?pO>L׿X`Y?8?RL?*?xhoXּH>}7>w1??>D$?Nx>i>H?T9@BC&?@0Aj>,?\ѿ2=)@ Y74@iD? -=\?.q{=&+ ? LO>Zi?̋C}?lT;?p> ?D,?H1??>E?&?v=R3@V6PԌ?t?L?>Ou?|>S+??@? /e?"s?^ؓ? =TM?@>Yy >?Hƽ@A?>P}>ը? 8>A?c;#?e?h?a<? ?b@ O.J?r>[>>??ɕY??q>x-b?]If>a?Go=ӾJ??Q?Q1>^>Z>_V 3|?y|IXv|M.\vGX6>KU?r ?iVw>Sg֎=q D?~K@ E?Ac>۪?ai>J?^?x]?$?/=Ё>~@ ?+>?;4wg>r?(>7?PR?Cm'+:s?sP?za>EϞv=P;?DИ?Tҿ>># ?2é?W@PŪ?vץ?:4?J/?ji?q4=:? @)U(>Whiz>q>?$Y>>a;>i[<h+?BhI?w>P?">!$?3>> ?Bn>ؽ*߾ >n?gUjI? =G ?"> F?3>>&>T=Z>@`?H?=k @ZD/?O>??I'?*?L>1@ ȿ[¿䟿,[nv4C?/>d>>>~@JC?-iF?n?>V?8?Dh>>?I>IA[0ƺVc?WZ>=7>+>zR?TF?ɿ:AT?ܔ =\: ^z>P2?Rr??VlAe$=>T> ޒ f>Xs>AпIS-AAT@U?N׼ɷd'?bM/>ZRd.?;q>苿*/p?>[>9C5?&"5I>:>A>?V&g?w7=T?=?Szb?x?\+[˿.l?Z >E?%N??o@T$pF>>h|hK=v>?NN?P?u?_>ًY?/? ^j4h?/\> ?Rp>)=N>!X?!U@E?W%~">$}?1s>=?CD@Sf%pZ/4?O ? !1r<>>}B0=GC?*?@sK1mſk@>K$?F;?e?yv[?">F@>咦?I>>φj>@8/(ؠ??nF2?l׎?n?D? d>Or@ YLk?X? +>)(>!x=| W;v=+?:@7s?92?~??8n%?|??h>&Yx>4?h?r?ު?H?? >>MXųXώ|D@|(?Q?R><{n5&ido>!EɿC=0 @\+]?k ? ?z"{R뾣?>.s)t-=/?ﻠgs)@X^?Z?3?O)P=b׾G,>=>q+g@ݿN:.ɿj>AH_=Yʾmh?㔿?Q߿+Wֿƿhc&@/i}@? ?~-?۾ '󾄼=x*=q?FAkM:???>xN>)<)>U=j? E>i>ACX?*?祾"~ֿY9(Qfy> AqHl@ v@?8\7yl\|D=@lDA@/?Q?p_"Z~yps?EM&= ;@^ o ?l??>h=> Θ >xz>?>}po @x@s">U‡dpo>g*SO>4ؽt=4a&@dS?@1>!!i-Ǿ??;×>@.@6}>±0V۽?nz? >TS>l>t>`?)y!1>84?J#Gaa? ?.< {=&@HEʱ@Jb(@?H\?&Hnqs{?j@翀?Cmt?^ŧY?gm{>I=Q5tEh%l?tF"?:uBg??C?$a>L>> q?R9Y?4D{?i>T_>꯾'|mZN @'a>)? ?H}Je:"k>YOi5=>O=@C9՗?P?4=6E`rX >]5==<B?*?%2?En?7?#P-fg!k>>𽪺ھ}Q u?ռ0」?ƒ>۾(9>?.K!?`?g>%T?ѾXR>ۉ?]%>]v>i\>7#;ҽ«A^k?n\?3@?O>Fz&"j<,>\bV?]>(A@ @b8@ޙ>F&*8M~a'PqJ?9`ȅ>6AثAf@@1Y~οQپ$k Q/JtB,@A@"f}@JE<$R]/. Bk@c@*{@7 ܆}C"qcJ?agHyN+ſѡB%p@z>@ @YBcP^>9[dA%'^BB@u@ʼ@ۯ%[o]߀?).<|NB@@_@f"HWAa|?&ݿ!$UB;@@@9^C`J? ¶PDzR"`B!@@@oGThM!e}>L.Ⱦ*ecB%7@muF?@HLT/ko> ؜6dBs ּD-Bot%A+UbV?ؿ>=8;ϽM-ᨿKLBpD#WȲþJнƸ80 .o)ܽ| EpcBqG$?=rZ>\L=5&{#nC}tBq+QkDy3=f߭>ͧd;>x'#9۾Ϳg腿iBBr.n>0s>HH? H>"򧿳>=W?,ۿDV?#'|ÿSÿD,/[2BsX2rP?X9 ?9Dn?%tM6M[#}2EIBtۆ3?[R/?@.|?i_O:%WBu 4>+?HϾ^?<0i4?% $v;)!no&BuGaP}A?b&yx??M.>Ɇ[7;w򽖕A_Bv_:nɭf?[?8yhe>1Hҧ>"5wBvm?Z?Eڨ>{9]szob,?M?Yz>N4QZm:1m8yBtc ?Y=?W/R?yϋI2IͿ7.пL3Br qa?0!X?5?ag˿7!ClK,/>&dBnzm%;>XzCX?P?o_@)ɿܿm>ZBj($[ǿ-??RgB:^>3BdxV59Ⱦᾫ h?(\? $T[Ύ%?]BT@zu <9&?X>/\"F?9?7t;->B8t@v?[@dL 6Y䕝.5n-B5@>YV@n髿GN7FSī3B3@g>@?edKh /#D DGQ"%HB2}@(h>A@쩣g <)- 迉v fB1P^@1=eY@(q߾n*F^vCD1{Y[ɿy1B1?@*;>…@gk1ׄ+ݖ#?@EB/GN@BVW=@, su{j,4ɿ6Hֿf/B1@,m>f`@vbs^` ʐgk*δ>ۿ4TwB1X@j>a4@ dZֿ*%d>ÿжB3-@>vA\?O2zE'$(>犿ӿȖB?C/?щ=j@28́(.fQ&ֽBBaҿM-?調:i*=:(HUhH n#Bg`ո>/+ݕ L>Ɵ?+.$>UPPBj>>+D=: ? n8m꽡ZBjfA? N =Ҿ0>ό&6 EfKrl Bj`K2?+7=r>،V5xe!m[BjFkc,?.d >)o4>@*|7\=pNBj[+zͫ?W>`? #\vOBi<<4>vT>oq>~ 7ᄐ}N瘿vBgM>\>4ֿY>o 9κR^e/Bh]Ԣ>qq>E >_8:aQς hIBhƿ$hͨ?3.q 5>@?3+V O"oBj$1 ?rFD= 6n">f?OC*8iBjF?Ka1Dp>5nf?:+:̈́#U}1kBi[ڠU?h=LA>{H@ yqBjsab?S.Bq>Z=(t>?rHpT濾}@hBj&Vr:?CH=>[lƮQJRܾ/:i*Bi/*Z r\>ez~> ?'MS>~Y7ݾҨcBf-q!/E>@@> ?TR A.D@|ËٻyDBc18Y>(]e&??|]' deEQ=9fB`WX.i|fW=4{?i#?xOyR|x>gB\G0~>Ő*zc?~?yJNgmuAG9>\vBUv<Ȭ%>W>B?\ֿ5I<~!BG^=H?.+l?qϿ  4_B/v@?=k@rjQٴi-hLHhJs#B-r@?{@Y[+IC>п$_Ѻ"B)bT@3 @@p(]i?zֿuL>Y2jB#Z@zD@ ^@p qؿe>ni?^Y> B @@@ $进_~u?t^ І>n B@E@DQ@G6 ?0E<} C BO@ @A$L@^{^T?Z;:?JOAVUA @e-@Xr**6R[?CY `Q1#i}GBy&@J@?q@0?0q{=F1+l!HTB]?@O@y|?ő#,I?Ȋgػg8rqAoO?W@JJ?C2q`͋𸞾Yz=W?#>G䎿^rA녿?4?@9>9AHL#=tg޿Y>Ihp?}cb8>?ɈA>jwrF{72>Ё>f=kt> S?ZؿL ?:-Ai!X| =~T?_&?=?:?g%?A=>ax ?!lo-T?)>? пc?^Amq a>%Y]/W?q>A0>Ms>y?x>?`#7AӨ;4˿|PHNp?pu>_y@c?J?'Aׂ1bп!?? 俞vgd?B=Z?wП{?WM ASXE?u6?>C쾫k@!e?d$)>mA#Ϳٙ¿l?a3'%@uc\?R?ՇA[cA_R= ?l`<?Nmm@ ƵZ?voBDV~?6>p NWUkGGn(O>膷[SBJ ?{Kߥ-j\9ҿIw3I1'^=K/ο翁BX@:gvٿE>%(f$7ӫ(潑b:0$BYa?Fi0opNQ>?20oQzӛoBYS#?*ܿ] N Ӿ?C?ȿJD$>zaLWB^:;Nh׀Q{"? y>CPհ6<)ۿ[-nxBjn.VJֿ 0m?=m>ye >/=2@vBn!3Ed?* n}?vh=bo ʲ;1hɾOÿ>Bn Q1vc!'Ӏ#>ʨ>">3#&|a~Bl5 86?kJ.fBijٿ+B}=e(B_yh,8np>e=0>ѻAE'D_? ſܼBK?&YQky>SƏ=>~(۩ĵ?Jl !B9j?'@? Pl5A 0/{ӿ[m?HhB-E?5f^@(^@D῁{Aiο]?h TB#_?B@R8pGۍhN-+a\Iy?bX^B@ ICC@5@|'3%7P}=L>nӳJBe@*>MD@!^@nc7Hƾl>׍kB% n@Z?6@u!1ÿħ)!~>ܿ>8l_B$ޒ@lKi@@5?כ%c?R*>0wĿoB"B@N@O@cOοɑ׊C*r?˿R 6%rB )@@@b/H&5H3~?,S_(8?|ɻnFBGw@<0@:@C49r0?0O=x]iB@a@V@TῸ:a'?}M? !U࿝BbAL@:@*f[pdJ?>~ o<}jGiRAA @@܏ FJ?;.X=bڿA>@ /@uz@2?5f8꾇Smļ6>Aa@-/@d@?>mi K[Ҁ?誷9#B(kt?dHAGH)B澴Sc$3>4B#;!Bc_ݼQm>*ɿ#?k֜Hg>B'D\@2.plSzt轃SJZ̿-nBN(=? NbJzQ~ҿֱX>B&'/G>NFBK?>QR>a59wp>$g>^~B+[B\?@U}6YD?#)dQ"c?/3|>똥pXBuX&@ADL[߾u >Ȣ?%X>>@h@?ZJ8@>- =c޾vM3>&gBI@ /<6?cyfϤ?Zʿ +.j%6^?&|BH=@&A7%?42T?PeWњ oY5/=ϿRBH@l|?M:s?lѿctȱֿYo\dFBH @_?չC~޳p?'`*xӊ`m>ὠBJyY@6Vtۿ?Djɿ+?9]>cuEBOn)@qp$?@?3^i<>>ǁBS0@sj< {>P"n>r>s>w;BU~?&@:?wOc@=u!qɂ>,?}տ-{_BX,_[$-9?{ڥT?ILϴM?'n3?!﮾BW;@(U}cT>w<%?[yjK? aeBU#kS?J@3c5:Y\\Ro?Z}+j~?G侼sBT S`@S@0$-LY2Hd?Goh?[⾯BP1,@ M@I:0hQe&Q?DͿWr?weBN0@@wSSo%=0?ỾO?j+BH7>?\g@o\80q} N?+y6>9?Z \B>@y?e_@>7zz==>>=n?Z翵 B2@G6>5e?q?'av +S? +Ѿ! I?ڴyB#ƍAG>}=N?aEC_"Q?JDW,?ӝ?]0B /?sIB A:z@A\:?"Ri;> J?Q?Xw]BGAUK@\xn!hN5?YEu=?!>JOeAA^@kwcrr?hp Vu>?\>JtE?A AO@q(As2T? D΄KG>;?~M#}AAGE:@]C"B?a*za`О?60>upB7A5v.@<@-辎W?go5}:Ik>^>Q> B A.@F Y? Pݾ? />>BA%L@AR"yV?z^ῌ ??9^B"vA͝*X;G>x:? -> Z?P>Q"B5)M@4w 2<VA?@ '1=8}B;)@9R$* |@?eJzĿܿiLj? EeaB;@vC!˿A@7;?Q!*?j#өN6>шBC˅@Lf@- (50ȷ^ۧ\jܾv BP2>A56+Uuo*?@bտ̗?o [ؿb5AݾABB)@?~n&'?Y?bsp?W+]̻+͑=軀BHZ?߿iFI?u?i#龺?rɔo>/BKDu?Q̹?iW8> >>b? 㿜QV^L>9Y^BQ{$Ld?̽>>'?[M/pM>Kn+BO6dd?ǿ#>ّ?O?崋ٿ%KQ?YBN޿Pӧ?+#9>nR?j?kɿ<ݾȋBId:+@h\==?[k?hAvǀ9A.FEBE3>8mq@bcWQP,?!?Fl>ÿCb?/B:4@kXD?ս@ ?Sފz(@c(WB3/?Ԛjc><{ C*?p;? ˗Y8{}Ŀԥ1jYwoBg@MiC؃@-o^:iW?g쾖t#'Yk־+qB s@Nsl C@T4!?rMv)=󐸿I? BI@?Aӿ@.>8Fƿ4>Tyq]`?$]}N96At@ڣ@Gn@ᯊbwξsϱ^z_彋d Aܨ@f@y@HX-"Kir˿m￟6AّG@ g@.AࠣnA@(@Akѿ>߿R`MBᾠe-P`r{Aȏ @g@xA޿er|_{fg;o ˿ W𿜦Ab@5G@rAK@?NW;`6ÿ?MԿ~ A@+C@A!GQ>o>~.I==ɿu8A@@&@A~9>?Z9 FE=Pܿ A_ֽY#@ml9@[ ?p%=g(HO2_#A{/?gy@%30:wz >>)Ae࠽Z@\W=VAr?<>4@&i ?kI@˷1?Pt¿apYk %%n? @Ewh)?@Wn &_8?I>@>f@*?s@woӈ?A*[|f!bkYڱ۱?Q@=?.>@@1)?kϿ0>8?gp[> *o}>X^@q?.?@dP?pѿr?h?2]O=C@+3KS@Z?_nK>riE!ĕ?Eھ@j0d LVWx@Z'#?j9?Y%S?kL"?N=D>=T9KJT>]@,~?%?I:? n?W?bFľK?K+?cHh?/T5?3ۆb@\?Z^@?o>?>W???BZ>w@ ,? X?_ >t?n?>f>0?> ??\-:1@O?mB'?kf>K?>?d??5Xr?c?2 g>Cܮ@,Ų?fE???"?O/?~?v?j d?W?xT>@9(?%@g}@ >H?^)??5?8?n?>T>j, ?I?9?P?q3#>?>`?b?-N?x >4p fS?E54pw}>?[?b>?t`>I;??Ba?<=?[e?J?ʿ?T?Tf>^_@B?$b'l>By?M9>}?<?>p> Zo?y?P>F> ?(P???y>4+?1>>0@=?f?=_>/>]6?Nu?,H=>4;!@P@>>?fW><?%>8?,D0Qwn?>> F?'87??hs?cD?D?\?.}>@uye>{>,?NZ>Иj`=Ԛ??ʦ??i*T?(?UA?tx?G>p忽=?!e1?{??f=I=Z2@,2^???6@ ??^ >UM>8? r?Z6Ᾰm=pocketsphinx-5prealpha/test/data/tidigits/man.ah.o789a.mfc0000664000175000017500000002177012771605033020621 00000000000000@Qg3cxk"P><5>C#9;@@YS^n>ۯ[ʽLOb>:LD?2>*D^v>w O>@D>~ 0[y?>?o>a==?%">7s@/?c߾ws>0?#?E>Zh&怿jWKVX?n?y?GD&J þg?>0;>zۦ?g6_&@D"{Q?:1{Tj$B?PQ? S?eпƾ%>@3P,T8@"%?4E(=)!>K?Զ?GP> >׾R_ @-RLE?ƿu#EGC>/t?EOm=5?-ڤ?1h? ,>I(@P?P>SOy?yM2?(>?!o?1?>>"*=jm6@n@7>.M7R?/??.? >?3@;?>s> &4K@8`e?{?[>KVT > =??f?O?.]@׉ ???a?)?<,H?.w !^'?S?Ga?[J%/ɏ?A=?'@\i?5>s8>v=?%є?W,?{/>N[@>b$?!+@o?Pῇ?#ul ? SU?*?`Rd?L" ;>?JA?m)?q>>%\C?!0xٕ> @jP ?x]f?*?[ "&>m"?3SҰg>>@ʝ9i?)ֿ>y~>Sx?b0?r==e@\?b/Q vゥC'~?>8>T=꽐@9k?5#ܴx?!N h>@q?\>SŽ?V%@l[(?UΗ龥?>/ο? ;?>b?!jf>Aik51'HÝ:?Y߄@*_?xN6{>D|ACs>9ri"-?(?:>;>ɖ,?˸; 5i-FAe>-J?ȿ$'@b6?%?@b@I_?G^[5 Ag@N@2>ٿ> d>!>^B*\1@bj> 0o1eaE׾e̔?,>YG110EBE@C&?tk=|O6~Ӿ:F@.Sֿ_BI_@8T?o2?ZLxNm@/мx)8BJ0(@.@ owC?*Qp@+hQ!߿@BMI7@+??1Vxh@&=8&L`BI@;@ mK|wB@`@y@*ɠP?\arYֿh9@."12>9B=@@) 3?S@yiN(??(I>8d*(B;q@p@^5Y@F@̈́p ??5m!?[&BB=@@_Y`?I-!)`?gl>?V(B=@@B'!U ?\Pbj(j(?1>d}`?צdBA@?Q8#><)Qd?X? g?jBAԊ@''?h?N/U?(*]D.]T?^$f>! BB@IW??;Zz O/?b$N-?o=KB>@0M4@?ؿ/?.,J2y ` B+~@=.@S=>˂!?s>&7o>*@?,11r?"ɼB ʞ`@z?dt??BNx?X?$pS|UL2Aب3@U??ݧ?9"y?=a??+l<>ōA*O:n@ ^?Y?D;?2  ?>wl`j?c&AQQ@zyTn?&\-p2k?s?9?cSrLA*+[@to݂?QD߿V@>`d>p֥>\)=BAuCffv@V֖5y@C"?nD>ɒ2?> A[*[P@`6%?{ӿZ|`>?xY{!>?Z=D^A6TE?'>|y> M7h?⻿_*$M?5>,BʹS(?Xu?ň}¥&?3i>B~?5u?jB Mn<X?z]?s >Až'qWx?z]vB6F ?Dv?}^F>4Pe>ʣ>Bz@&@;b+* >>5?? >_>bœ>\ĿpAV )@G>fƜ!ݿ\?/c?3ӊ>,b?՞]>B7cz@?=ӟLd?H>?8vᕽ>ܛB= p?KT?^?AATC1=x?? (jHػ->hXB]C> -?鞿=#Rr><,?Y?5L>?B`3>p'?efOj>u??3X>mJ?8Ba@.>4w:;?u1̿&[)???)>]?Bc1?X_>ͬ[?3?꺐?yq =v?$7Bd?7eUa*\2ЛԿ?L.??E?ya?0Bd"?Hi@Na濯?2PX@?(H?:וB`E?_Ob?E:zſN>#?&?!D [?!-BZ2@9d?{6 p9 =[?T?5v,,&>ABR@tG6Do7L=_b?g?9?HֿU>BBZU@o9 N hZ0JȿU?6?K? S[p;[B2^U@%ؿ ,eæe>~K?xؿ4uB'@vi)^? |Tyᇿ7ѰfZ`<@A?lN1TB%@þj ?e?x >?E\P7B& n@QN? ¿>DDwI>?jYB-@&F>?¿``hB7@!,.b#:~>$cn?:=տ,MBCM@ HSU?+B?$X*>ݿLBE؝@QX>(6q:=Ԡ?t>`dƮVtB>@Bbȷ?S-=״eE L9?=ᾤٿNmB7I@5$?Ғ?uۿGO?1>KVS>@ B85@} ??BքOt>ͅ=1^>rB;8o@) ?p?bR/>y,>%>Ǿw~>LBAn@61?3 fܾ&?uIo@>BBJ];@Dj[?n8_z~b %?H5?4wy տBM>VBPy/?@ÿ~?ǐ~,6???hpZ(>BSO?pie?p!8W@"?:οiRp;J4<8BQq?gnF@ rOk@*?R1ؾ􄶿>iR0ɫBQn>ڿ @bʿa1)}@ ?b6CJe#>Y BP>Kr@5+3rQ@?=Ux?N>ԇ BPZHʳ@T34Wٿ8_@x>JX<ߣ50?*%LBMI=t>Be@`?5\Vg/BMԆ0C>@{R>BOm@ "$I pžH?%X!GbBI?\@68UD4e?5|X3? HBDؿ?w@tm3Cp.@uc4>?%?rBAYpN@@>`6cH@s(ʪ>)[/+X?ۿB=3]?@?@,D[Ty,߈SC?ʿ >ozm>yu0B5<@>@=A0hq_@/u$=b :ɽ#.!B&l xR?@<7"wL\??.X=;*UGB?6t>ӄ@@^f `?M `2!Ͽ D?UbA4y@O@/]@~[?r b 5?@4)Na?$T?0YAN@N@%@?7em[oH3;B MA+/@wA@u:'@ ^a>4ÿ}](>%>9@ERA=h@{A@l?"i~Wy!< prHl4P>A@@>@v>K>a?p=W A̿Se?$Ad@1!@x/@Az)Q*?4-Uȿ6LͿ_@"vB?@~@?;%>HIin7$Nmv0@7B?\W@+[@ >r0 ) Gճ!Ͼ7E#:Iw?AB?: @P @4.I>d=w@gzj>{/Ř࿄(?½B"@?ᕵ@%)?%¯䋿Y>82^d=^?pB(@?@L?[B~#%2e?꿊+5?>B5@5??4~xRQ=>I~XDzZ?XgBB6@)kژ?w?=z??fI@Uȫ>|BCx"@A {?M?$`:()??@00ۿU+gB9Y@aE=r!?]Bч=I@ ʕ@ KM,(i3>^#B5@582L?HAa/d6?т-@.V@cT >YRB5z'@[R<1>.c)3?Ș2@fLݿGklױB6E"@W6T ~?2M0K?O@GIbm. yEiB;@5x|?](࿂ 0?.&@we !߃BC@_RQ ީ>\  ?PJ@#X˾#>BAb@c;l >o)q#z?:do?*~W""oB=@\u/>꾐& ??^p@P3aο$f7B<@Bmÿ=럟 K?E? @ԿBr' >;9B?J@S$!!&6jAZo7?k @E=I bv>)BAo@d"iZ-pU˄?Ph@/ Q`XyB?߫@`X42H>y]媉? K@2wMb=%>}BB9|@\p~YEU? d.?Ft@*TGJVoB9@]t;/>! O?4@9wrJĿ"1B@>:@D31|ơ>@,J? @!hx_,ֿ#pB89`@vWf?[?ސJ?@B?93_'^7B0@9k ?\>Ӓb|?@#׋xw-wzp3w$B8@ d ?G>@/ ,L?a@yg)`\ԿpbzB8@@u'e)~?U?v1tԾҩUB-`@ K@2ѽPIn?:?rпҀ>l3>_G'&B2-l?E@#>?K?ȋ>ș/?~Sj->qB?@ė@B4?G"Z>_>Yn?mK>B@!H6@0Z@qۿ R,FJ%K>LBbU@wl@@@A_,e\E=ݾ)S?B9@? +@@ o {U⿈{{˿&{_z?EÚBa@v_L? L@@?59=pj>\ LBS}5>lB:@N" #@!?C˅F܋нivJ >qB @?B@z?>迶6>舿+Xȿ;k*??A]@?Q|@4?R'ÿ":$,2@0`?91A߷ @6Y?q@[?s{㻦>U0J ToG>xGAX@N@E@F@zĿ8Bѿ~=>忊 GsH?AE?@oX{@I @ ZILт na/J? A,`@@@[8? P??U#T>_ : >TA^?@ }@?aZ>2=?E'>o쾫̽? A@? @WG@@ϸҿx#?{/ܿ?J%>?AQ#d?Do@[?m>?u t=Aqn&?ie@AoF>*?FU@p c?.-?O =&eU$C>a^Am>Qzq@m O>s>: ?і")ƶ>>,At(?]N=M@># 9>Fg go9$ҾAYC?ńݿ[ֿS?i>?/?&vAe=6?5Z$C&۝*8? N)ֿu>?W!AIʵ^>+?"7Sߴ==/#{j>Zt*A6\RT?K=mz>V>=ٽh2'VAݿz?\<%>(S'=;?I>? &\“??A,="M?r?L<$~s?h ?P {t` A8)?,e?vM (^>NSy?1/ߙA/Z/{'Wc?zl>L`N>l?r$-:qO8#ԹA.n18%.^?٪;?Ȫh <>ҾLrʇ1?A3k^?Ow?Ƌ_? H/gg=+? ŽX$_;Ӿ\A  F?o??i R=?&fR?@ؖAU=Ӵ,=t[>3>Xf#ڽ$o*fc3= j+>́A ͑T?L_a??:\?5g5>ҍ^jT?\A7^2Xɿݦw?6̿ Ծ``>[ADc7_?>پ7ڹA4&?~ݾ'\k= $K>^A x:@k?<֤O?߿J>ZE]K="w>d>A21'^?%?ܽ\{ȿS=n> ⾮>!@l"?D?>7l>Zp><>O>2'>A㿺]?~MV?L?඿\e+_?M>>fQ?h?OA XZ?|>כֿ<. B5j[?f(d@=I>/#@LO??A>'V;qH?=2}=XAZ1>0?tW?}1,~̦>і[=J$hy>ҿ n@{?>oP蛥'DC?k?M>>>R@ݑ1E?>J ?D'6>N "fN>޿X~ >ʝ@պ7@x?7MvV<5{>f>>!߳Q=s@4?G9>x>ԽmӾ.@*iU_^^pocketsphinx-5prealpha/test/data/tidigits/woman.ak.84983a.mfc0000664000175000017500000004225412771605033021163 00000000000000*?)? >HG:"">>k?5=??a>&> o(B`=YV3p>O\=8=b53>[ ->?>ڊוC'?Jv?]_Z>e?tn>v?哿QS?+?pνT=#0l>˾A?9Z8̎>ݿST?IL?)GQ?=cr??KQ?ﵿ7<61=T?=pE\?|k??f2㾳A??f>3=Ά>@t>E>S?y=Pֵ>ܴ?c>u>&>:=S??A?rIdy?%H >v?b ?> ?->1E?mt@8*J>=L}u>0F>> _/?鏽 I=Ot@04@t򏾇u?$>?H S>74@{ C@~ѼToo࿠_!?ruWw w:oA* @pO;d43<?3.x}D2?e@f 7@9u?;ɿP3.>e1x3>h?ÄDK?b>*?,T%=v> "Z>c U?q!m??#?37y?to><-\h?@a?yܸљ?i-H?@?O=>l? -?~me?>2>><_? #&>쎛sy>d=tl>>?/?#>?R@`>H)rB?Fx2? @>?OѼ?->>]ƿa?#ʓ[r*t?_?M:T?r>`@Tɾžj%t??#?/?E`#=.Lt2us5@]DA@lؾ\07?mݣ\"^?NJ?! ?8?>Y?=@9}@>?P??j,A?P$>aI?*D?KQ3|U?M>a>r?A=??nҽ]?` l? l?"pAiQ?\y?'*o?=ʁU:>YI<սu*@P`?/?)I?T??&D?>=2?s?'t?=?)?> 8?L>c ;?OE>?>0?oo?b> A`);T?nP@ f;?ml?l>l>?c>$`B$x;6ԧ_L>a9@^:~Y>EmNVs㦾 6@)l__?b^ ?>4= ?^BzQ`տ]pJ=?MYu^ 7WB39BB@E܎Y~?KQV(p/_#BTH=m?;=o$9$4'BIjwԋ8=?,)>wM%#,ɾ BI &̿[Oc?lǿv6E|㨿G?PU<Ba_{<ίX bS>JUL=w"޿mC`R6ZByhd+if{X!9_qW.&H]Bu8ٿʫ ǐ!"7oeQLc(=,ٿUfZ:HUv7Bnɿu]W ۆҿ3iʿ꿝׿ ~Bk5"䰾걿gο /˿fBk޿+)?d0Hq!'H~ >0CԾz9.Bi:ȿ{?ԕq&eq禦b>s>q?.~Y,Bf;[@,!%R>m lȿ }RhBfa@^v \92')tUT={[BBg@ob ȸ,cP?jґt8;Ba @u9Ή> 檿C ^˿ɿBZ*@¸]Z/ 6\^`^[BTaCW@{<;[AQ>Q]mA+񅿒5@BEKV@ܿ8øF8$*}B,O@O>C1Q2k V7JՐl/wKBQ>@@72HޢPf?4p?38=޹> kA? O@"?$"|LMr}>LB3\e;@ xAI迧@Y|? {5+P?й@=i|@’>H@:>_ᑴ F5?0?&~? ??@j:V@.ĽZdX@0fwҿ*>??>>W?ޔoci@r?[׿S#+>x12?W?a?[? @Jq?I!? *ys!?!2h>˾:Ӿu?akپAf ד>h@'?rMyo -?R7'i?BP~>)?Aܼ!?Ϲ:@Roh_GeދMsGe}P<ղ=%[|Aֵ?)?@5>-g{3u &vlWA6.?@6{?k9=m(&>>ʬAj!x?m13">=Mڄr`!gRPA"> ?-g-?k:?O?l?b"'?bVqA?o6@A=Q~I=$?#=߾˭>)/A;d@?JƳ>%;<~>nAZ J_z>d˾Xf? ,~>mUR>m>t2>Ӎ)AA?̸@3`>?ݾ.>V4+|>(A)wa3&?)>66s) >@=O=?j*nA6'۾˒?uP=S?dK>aE@?T3?\ؾ ˾+A$hy?tbl6#+:>Z>[>s???>8>|AL9Tm?4%{;lUƿ8? ?^>>dB\B;79H:x>&>꒽pK [=?KB4pM7?Ms1?&D?F?6,|?`B"@A5?an`yk1N︿ xo쾾BZ_B>@ &T)P>=ZqW3#޿̑BF @J>v?_1^>?JzkrۿKX=5NBDA/>c1 >3⽊᭿SH BBAh?E= >2:Ds[<\̠B?hAz?V8 9=4vqmPoE B=AN@,$Oֿ#|14I`B7eA"W@7;T޿<>ʿ"GͿiv/ (SB:AY@+ D|d}~@EmeݵMF(B?&Aq@BPܿ-ΠEګZaYBDXAg??^/;'=q6[8*BH|A?ɾ_F܆GBȅ+*)EV]rlJ3cy|F<|Z>hTBU#@,uI"%)3wV>7Zs?ҿtBX@;ҿYpSھ=^ż>ީƝ?zBZv@Q?0=无ZDy>ھ'? %5RB[k @YM7Q 51Upa19~=M'>-BY@ hrL*,1\d[@D6ٍBZw@~\I|5EVPfu_IÓ~jXj,bxB]#@ǔhV\r)J/p_\2dysc7+B`@';QN(\TJٿ0>p̀(~MBbz@l,w$߁U8X係? ?YNBed@d""9v.dW?3'GRIoBi@C޿d1m,lYN.?0EVlQyBjp@zѢWK* _DzLE>^3?= Bk@zA9RDbP>YPd0<>'x*'O]x(Bj@JNU񿘪=忭su9GQeg1\[Bmsw@0٩ >Q>꾁wN]#߾^(V>Bl=]@lf+ڒSkrGpwu$Xy(Bjc@m^o^斾aN=I0-Bk@Qka? ? o/ȓ/տX:Bl@LLPþ?\?^˦zOBV)Bh`?ZKAaǚ?x= *ο6*߿Bhh*@?D*?o?xx6Կ}'eTBde?'?{) ?>ILA0i<(9B^ӫ?Ê@_.|t>܆!Oy, rBS ?M?z-i@b{.BV/NiT5,(_WB;@@ p#@8=bXE*)^.>Z<)sB(@>@'f6L,ZgL_?M(%־W3iB)jN@??=Q@)"$g B+a@ܻ?@,#8=C"o;,L>o.3?05οd3SB+D@"?š@SPc30Uwh1x>l ?N|ۿlB,?@:?c;@nAt8AtX?>i /?߿7AB*@V?B@]pN X\=h[)T>NnP&P˳B+ @m?@v$>a5]mj?'J|>S}GPB+_@>,$@i_E7T?>AXZ#b B-0@D}>3A@^'>qc<>ycU םB/U@? ]#@n( #?ſ?$B6@?@fs{' r6B?3hCBI@9uj>@H .)t p*"utw=Thj BqU>ZHz(u/|ʿm>0Q0H [5(ys%ǥBzͿ8.Z@u = :K< ۶ +~2B}?-/ؿ)'>SοD֢b!B}nu<6"c`K=ۿ#F%شMlVH;͆^BcRgrS@EV[3$`no쇵18¿XB{߱kL-絈ѿ#ǿV9FB~㨿Fx <=3>03x#ضٿXc7E'ȾB}F:uWD>[tJ?:t - B{0g|࿸X G=o1hĂzt7PBy0fjN޶V=p%P^:ڿjwBzٿ!IĿF~?ڼ7M3ѿ4ן)}j!|Byo^E۾j>νO >zL\&Bx̆fs`Q>6Ff'6 aQ[οʺL*\Bzk1⿗(>i7>9ĿaU6ܿ?ykB{tjΌc>O?Bʿ:KrL^NtC$UOlByHHV#ֿO o*>Jo }<S3 qнn>OPktKTTBB:~?8{h~=!ؿ(bz$B0 cܾV8,ߒ2nVh蠾\PrԾˌQB95(DH;=/:;j->B1I==ǿ#~3zdͦ}"%B8DGwܿjZ5oc/NĢ~N}B (E d>=ɿ~v?#I-:ӿŃB~FG>P=}J?0ˮff#ECrHBB|=I>?YF,1?y.^пB{@f0>?H1 ?bk~u1l~}-BBzk,ZZ}> H?M ο[DsBx";z<,A ? Ya$:i54 BvY2}\p%1Yy\>E65hοRiۇ$Bsh%H* <ﺛ(;&?C7%%9Bq#]@kN>lޯe @BqI=A?.ƨ=N?w]5fӮƿ(}BmupwMd?.B*u>&[EQ3?d%Bknm"?k?38W> X(d PFӉ=&PBjW+U<@,aqئ} ?{Vg>˿ Be`?aEW~)̅U$N޿TBbB?8NLSkÿ4'mQQBWU??zXA࿏ؿ!)(2[k6 B@@.:@NhEΘg>ſ{ ?,q"]B;p3@q_>H6@$m ŔP>w(F>e%@@B<@U֘Ea>7>= +B:@$@?? @//s"70RkY?*l>=@B4-@+=h@ ~ E *{'?O (=>@;̿B(w@m&>6# @(` u¯?=SBaA@Ҳ?: @:tg6?:RSp>- ^(B C @ M@u3@2#ew/ rAiٿ<侾͐B53"D?UG??^?5P=Ik/}(?SB4n7X">IyBEN|Ж2H=:?OL?`˿@t>$t?w P>)BF;x m0 w?T'@U<7S?%yA ?oޢ(?[μ "@d^?Z: b4J f@n%As??HD9;@$ j>}?fz7mQ<**@ wQA-t2@R:>8F?x?B#Ò ?T$A8A@JX>ôr/rG? ?x*GDL?dMA 1@1P?un???kz?(y`>n>K?B*|@ῂ~?Kb?ɯ@2>c?T?? >dBxɌ uu?,O?"OL>*,-?-Bki&*4& ?A@_d>%_I_S| ?\Bd?Ž;au?Tn? L^2h >8sHBkի>g8O?龸 }KK =9ByhbRT+*(@)m?>qV)׿h¾BgrI\ >?va ; ſ\%B¿@E[Bihٔ%Ⱦ ?29ÁB]EŒ:TBn2Yھ b?i->zlBsT5~׽s%w? >H迎T򡾮Bv<~{E3T8$>߿> }]KaR߽B%m<>J Ԗx!뿔>2FF{DkatxB~?:'qWмr_߿8AI=8{I1R$1-B{}?ྜ&лS8=OW&+^ BvfXŇ?ع>&6JZmm=et]uBqy1_@>G)deP>Bh4>)w>x=BiP\G@;>ehKZ)c$zHӾ>>&Y>BKBc N@]>+$@G)==e>t>$k;BaL@>%{{>[@νn>Z>@lNZcB_ m@n=nJ<F'E8=5˿nyaBZ%m@}?C㷿ݱ#p-Ήs$@<_%>I|pBRHe@l*?{EC)"׎3[>F῔YBJIYvF@j1?)?ɬ2&!9[.Xy6j>Xp忦mBDP:!@B?)j [[89I lf>̿B>;ߟ@贀?n6^O-;yxP:f>aB6//A@@l#Ҿ(=w>9- 03$?]kGGB% 2t@@=4^>4 K#>PK?BZbB>ny@yDd@2[GkaэlLR`B g?@X-@n8?\oA"@3@[@wuӔ$Y};qy2=7 @>@-?NFv̿fbPVe1Y?A>JMwEl@'޿@ 6? >a ȿTھLn}>v>NC=@ ѪN&1*?V??O ?. ?4?d>&>@d?7~+?9?a?P?Wk? Y?I>Ȟ>kq9b?d?2}3>iY?i>y?l>n>@L>N[n@cQ>?@wJ?=<5?Ds? n*?W?%D>8 @ޘ+hi?6?>wu>=J1>^?h?dՏ?;]n?'?M?Fܫ?b>b#W?z=4¨AҷUJϭy>ϸ?Hy8ҿU/=^m/L> kbAYp1;w>X5>3p.!!^~wFiȿ )A6Ϳ}? ?L4G>4lqT`@ſP? ּHE>A!e@-3Z=x8;> >pDXEvپQ?M ={>PA0܌@ @U?nf?J#~/?T*}x,,]<>A~X'?~?P ?硿XԔ&F>+vba lFYAhw;q|tCOb>BB=-s?UuAt7TA<@ˈ><۬>Lr̾5C! M ΂ľUA؀뿂 ?q&>}>>].7?05GS̽\}|WvB6'Vȿ!?R{?7?n=Dn5>MOs=u&B'y0>òC>ò%<)in=?O/"˾)B9ܼ'??)DܿOyonv#=0?!-S{G BT@1Nn>3F]h ý&ZL؉.`%9B^ @SnV?gT}Կο AZ BIv?,t?Rt@+Rx=P%X=DNF4J#RnhB>oCm02@ ߭Կă, #`=BU{@ (r@aou G4$ؽֹQ}#R:BVK<@wk@14{=X%<Ʈmza|B[ɕ@Jo4?FoeSSJDʺ:ľ7nB[@R?Oe1ê~.¾,1mG=sBZ@Yw>hAߍCzPt8ǿ9ЌK^1?ss=B[@=@κ{? uK>>ڻe#ݿB^ @;UYV?!af>/>3B>Mjp]B_%@<|!?ꄛwN>=PҌy=I+!Bab@0U> {CZ*X;bBgKX@&U>t'48$]uHC>pnBkS@hӐrg=?2g~<׿:RʿvGB=b/_Bmw@A?7}! 9>ȿ+yQ6ڿNBpȱ?{?S4JPx?؁RV2˿<Ԋ YBs>‰5?UM? \]>|n>ѵNBs VDۙ?eI?>b Tí>FZ+BrZ`=տuX?Gx=~ " Ծ0V0"Bp>x9?TE|+aͿMM &YBo@C?C"?C hӿc&> ѾK KBm|9?7>v|;LsnϿF$ 3 3硾ZUBm"eq@ a>^DFa0y!6W>nüq@=Bk1 ^*@4>F&a?Ͳ!L6>Y__bK>BjKD@#>/ĈN$Ś\f>I>CӾ>#BgdOn@˿0r~o"2^l+ݾƼc[Bhʯ@B>j6X?ꎤ>Έ>H7Kd> Bd@K9L@־H'TJ$ɿڌӿ_6&5:fϾBc R_<@!K)FfR 鎿y%K' B`1bg@IH\N-oi- n[3B_2 u@diY4cGL3 B<(Q+m딿S QB]{U\/ @Ҡ׀&"0 ;/,픠=%/jBZt+c@K:01:F"~meBؿ+BX=q?@}EfTe M:_yZuBU_Z:@ƥi Uh>gEQe x4!>bhdb$ÿk.vbBMV@Q MUl .s.>VۿBIIT@ڝ~M1pr"#i*k3⿐e1BD-)m@ޅ=7B ?U-E8$P *B>jOM@ގq=>Mְ68ƣ lB6;O@7Vx=ҿE]ű݄B/p{҅@0cvcs*ؗd5^>HV!0DB* 迋g@Rxٻ&6C,Hmb@*˿  B#˿"պ@I?+U0뿀L9lCB6? ArՀ%1$j9 -LC#Bg1B_?AH]fU>=O/l ==.ݿ ^xNB@0u@ֿFW9 *(mT|g0B @A?fdm~f @\v!4ÿ)̙A|:@ȁA5@?$KsL3hyW"z8<ӱjAK@1-RA"<@^3x5{֧(BvT%:RA@A(%@JB ;?;iq; A @}"1y?.gUcq/4)on۾ܐEAڹ;T"A 6@$Y@"˿ZԶq>, A\T@@,xr@9Wvϸ3'Q\?q? Aś@;u?o^?>S5HPJU-2e ?ŏA,?ˤ1S@7Ch?+>8AY?1|d~0@I(2X><> ۿd?U?CAKJ>?b>@ 2m?s#x@aV@ ?sAQ??+om@?Sz cDw>|=*s+{?A0[Ag`*? ?6ؗG?f}>L|?mD>vha?A}"tI?@%?CH?lPX?w'!~?᰽'yAg +?C@.eN?>>?a(vװ?nAZ#C?o<@FS=>c>l=)9&.= 8 ?d?A_g;>K?`?t??vVvjK?h?A+B>5?혾R?X?x`>꾝aS>A6VT?Lf?="?P:o>5 ־ GW,Aپ=@'_@2poB3>@5(?,Sq?DDG¾ >y@l>@y@'?[=fQx>F?k"?2%7;>7ZJ@/X?T@E@2D?ۿ_yq=`>$D>+=c?5@I?y@i?W>@>?0~5pgC!bz~?@!w$K>b|?@B@7?VOE??). +>͒=~GHQ>PоF@zAQ@ 72???= ?٧>+־:<½$ǟq@iI@Zz@I???CnͱPVJGL>n@Uy@2?_G?1>|? =SȾ+{I>(E?@n(X?1 ?F%莾y>;>Dߛ?$3?%?N?+?t?Wm?~>Նs\>">ZzfR?b >w?yY?Q6@Cx?Q>(ceU<ް?Ң?6~lN>2s>b?5 nP@+%r?f?? ><@p?,]b?4 8??U=>+@.Y"@*B?c?2? ?W?>t=s ?:&g?TW(@?~?]r>W=.?w?k=??X]>Q[?!L~?/?KX?y~R*?k2??>~u? 0!?R ?&4}=3??&eg?:?[(C ?:?1?4,?>>?"@8?O0⽿>1b\>ʾ=Ͽm' ?Q>ҏ?Ƹ%$a@]x>L>p[>>-?>\>Qh?@@TU ?>?|> >~>_?P!ۥ(>z? pocketsphinx-5prealpha/test/data/tidigits/woman.ak.6728za.mfc0000664000175000017500000003763012771605033021266 00000000000000?-@ex?A>iD>n>>Ä?g>]P?k?=ƾT?8?[?.,?!>ˬEx?"#=SOh?u=? ?gY=>.? W??S{?umg(w=7.>G?A>bE>FXnj\?k ?d )#?ef ܑ?J3>5q>?3p@<?SNi>̹`>ﭵ>S[࿂=Ϳa+?ty1T@ >lҙ>>h=?QbEƭP2RW¿.M>j@+?3$>O.>?fL羊>><6u?>Zv4?f?uR> wP?V>RH?6?=v_t]8>> ?=bվl?xDs@x[dUFʿB 'ѾW'qt?w o?H>g?\W0o?.>h<;>Y>6E?"wѾ?(?0;.>?r?Z.?;)>i? = &r?H?*RW>xn-=c??=t?]N> I?&H>?/<=_y?TR?(=o>~=X1?FH(?,??}?t?$>?dp²o/=Z@dC=?q?s?I3?`A?y? >HFM>9c>R?:h@ v?Ɍ?M?G"?vi>FT@> ?W`_?x? ~t@Id?@?cQfFD>>G@uU؅/??}?؇>b}7{@) %{=uK.J>8?nm?U0ft@5t?^?.K=Tk;?p`T>ܺ>=E?X`N?P8?Dž6?/B>[,???U>\t=h??2 ƾ[g?r?NB,q>y?1A>? ?ɼ?,O!q?IQ%?8,Zu ?G>1?fe?}?@J?97F*@y Az?_F>8?[cw?eſ?uʾ,,ӞHPO<>G@kv?==Y? GJN@aCH?=9@{n@>?<>f>K4>>TGA=ô @8,*dZ\Z>ϾE|? >[>%=X`Aս{mJ@ ѿb翔ς+l?[Waz?|>K%Ay_C@{?9=Yx {ҿ[Ԅ?V>T@s-@P_>1YO';俻H&h>i>1>Ms@1  1q?=ҿ xw?HlԿ(j2g? ?<@ P{m/ CK1Oo}<`kT???_@0>儿L> ?D>hTX9)> ?yϛv?וSУ?B?8?h1 >7y)>s?K>L}>?T:`>]?A ?K `߿XAnvF?5>؋>|G?\j7? w?|?ѿc=F>p?a??_j`č8Mn@Q?Wb?8jn?? ??{@Lb=> s?? ?^ֿs?Bk??ZT?UH>~q@ 7?W??owL߿_PM>K?1W!?y>=>tQ?k?i n?ŽLS?MlϾ?U>.܅?~tb?[gG>_Ҫ=nc55w-?Dr7>>?kbb_@X+* ?뢾Ԧ>dM??%>[\mɿ>( ԞA*_0U=1?yY5>8z>b~@>R5>y>>n8A&RRᖭ?h> ?'?Z N>w? ZA?w_?ȿ$:1{>K}"> >J߿'? Aggj??C>Cn>X0?f6}=TAD?8[}򿁍h ?L?*?^0?Anc.?}?6>WĖ?,DATRQ?2-A?;>?l?U>. ?Z?- ")?|:> > C?<쿂7ξ4A׀d@J?!>= &?|lżƸ?Bf?O%l>֡A'&?>Y?= b>xh?5cw4֣0A "?0?>ő?RaȂ]ƿ) ? dq6L=AȽz?fo?#ֻ$>>m,?;Ώ>rֽVI>a>/Ai,q?k?Uҽjau>Q=PQ=E ?AM:fS3_Aԗx??WFp>=5?Zȿ0 g=7=9NAϩ2Hi`Ap>R>ϣB?^0>u< >?ӿd>#!A*j?V!<6t>Ri=  UA>t>%?€Ay?+">L>̤ͼJ;\9?M>>;Bx T?C`>c >:b]b?>X@!I&ʽuBܖI?;??(TԿ>>?[ZxlPi~B/Th@FͿ lY&: &BGqlu?'bA,?H5B[yEdk>%}iO"]M}:>! iοfBl3GɿG[Y<-o #qmb,^-1(@Z5BwaDʿ`x^ ] 8Ii~B~HVZ%A>OI>񿄋o4M;BGtĂ6?+ H.?M>b28P=P%ϡ!nBy\NE@nA> ="V=͛ PN%} Bsz?HM̶A?9U?K$nĿLUgB_x5YD?auH?S(??A#W` BB3쿧|?g@GVsxr?|}?h*տ YAo@v@$@W RZ}=hZ?Wf{4nZAow@f@ٹJ@z:Bܸ#|FVڿ6S(Wƿe}1$7Կ餿Qw@ @>>QU龡Cs"ce< =Ox?.>^xB ?ſcG ?};?YS>}&?R7?$> "?1GB@Cze*?~^m?I?O6?>GTֿخ?WB)o2ɰ=&" @JgxXo?V> {I)>O?VB# ?n\@[Eֿz.?;?"X?.8,`B,"P=?@=AͿy@䄾R!T0?}l>kB^s?u?ҿ.xM@ ˿&/P5?a64>T;Bށ@?=\=?XX?&K>U?֭Bx??P-0?[{?3M=L;$<3su=0A>=?l>??K:B]:Uҷ8>mB)>FroH>H?'>@3X> L(=I>TA/n?&=B?d ?? 5`>>՟rӿs|?_A9AZz6?)[>UΧ>ÿ`? 2>o#x?+A 8_??98Q1 ?7P%?wu>k>q?vAZ>w>4ѿ[?G*>u>NU>B= >RBLK? q?q.Q_}E?t45h"=/^>ZBnw??6kMm?.f8>%8޾ ?KnCBb?| J4>NgX>Đ?#z>@2~BeP(@IQ9} 딿(deK:?!?mB*\|?@2esT#j>&l*?5>BR;@1mERoJ O0}o?.~CBe3?89㾥\'Q<9q>\X>ǹ=?`F|ÿBlU=>?&15EH 0FX;j(5QBqٿsh=G5>Uk LlLB|>)18#?z̾ j~@~Ѐ1k}BuK'l|D?W;L880 muTGSBHeT+=͈g >BTJf@DL࿉kBB;d뜛5=B/Ѿ`rB0 nEAb>0h?-?ZBk{ ̳$.ο8F?jӿ`z(罒6Q2<'BQ 5Q?RGf&fy!,5B<uĿ0'G?Fi7<ܾ*]'ѿ+h>B}Ϳ/IIX=?U61d>^ #$_Be9?w`^wZD W;>E/%6n BK?3c>鿲 Eg>zՓʷ3>R5B8B?;?(c>R;-J8ľQN?1OB,@ȿ0h@?u+^<`oᅡmk? $Ŀ*B)j?]@ Lp>N>uV'h?G}s>\B+?:1S @&M<4?MYw8߯g9P-DB??韱@_俙$W ῆ7~ zBM?J@ =7$!~p֨¿zпe3~"Q>ֿikhǭLy TBb5^y1{@?Gx$.nj$x64p]CB_u?Q5ςQb?IӖ +'(6*GgúBU[*QL)?B W?: .A[]Nt%B@?r%@s@7D?!{>>(*=Oe ʿB4@}'?D'R@#YTXm?bi%Cu?,cpmߺB3@?@pj9BP=job'?n9?0Fm6zB0@(?b@Y\bT^\?:~4?LYm^!B,)@p?D@J힎6ul?\K.>?a˲B"@? Q@ %Xb?rl>tbABA@-C@gTS Nb@k8OѢBA,u@_@"0zXOk?ajoPmBrA$@%@) NN 3>09j2dA?A,@!@/l*f! >r1ZcXw࿈AtKAE=@@MY;,b, 4 53ڿmG4MgaA@@z@14ab߿Ft3I>*f=+@NU@ؽ@e2?c2LZ ^* CwX˿nf$?8@[=@2?5'o?:阿$iB =>?_'@#B>,5=ޏ[ &ݿOy=0y_ɜB%_>0o?.ȲawV)}4<ؾd)B8ϋe"_羓ܿAA|u7x76$=!E?EB  @s?'k㵣7ֿ`E>:cX>.Ͼ8?B"!@H9r? ܒؾXtX?g<:?֕>=9B+n^?:Tz?a=jPT5U?U?i9P>迯ﰿ1Bʤ@ƒaa?6h?%IifȾwd>-B$6",@YN9q?<4? `5 l?<5=]?g½3?n,B!}9L@opc˱^( C"mڅe?H>jB*N(@B(6sJ ]?\c?UbA?yB-(F@6 ?2.{dC|?-C~9?!/ ?8B#bѢ@_1%%I?b,>Vr>>.௾m2>hB+:@6?}ۇ'7n+mkH޾o @p={\ vtG)xwwM$ۿCj`>sSBLl@O:gſšKF֋>aۿwϿ6|"PBUs?V@?4⿟4-+m*cQ"~BX }&??#N IͿO򵌿{p|BWd>?c={Lb/QX5'%,CB\iQd@T?a⿤'q|پ_ޟ<TsB^Hʖ@7;?йr? ˺8,owˤ&= UB\jKΒ@?e‘jQ35 /d>=+B[w??t\a&9g2H*7W$B[W??8(Np\>y= ;4?+BZcJ??NJΌp>=!s޽]*IudBXcM5?Š?U>`$Cp׼2NBTzi=U?@6'8 JI-;Yݸ1r BQo?S{>ucsLACANz߿ʿ !?BL(@{pq"M:f?i%@>>jB?f@R ˿xws(wF${A?ԿҒ S?6HCBR:>:ž?]9D[ĸx? >>!?ʢMlBR,Y@3mPr@ Z>4a@֨B>~WUcB>P-v^+G@'?:u?N4IQBEB,qMW2`ZU}=r q@)",K?G>+$+A唤?Ǯ?4ܿȦ @@Q@K'>D?%fE pA%?a &vvͮ@@FX@ZK@&rzP>HOkݾa!]Au{UE?.JKWi@Ok@%@>C޾?E^BDW~3F,>xv)@.Ҿ Ծu>7q=BxSYh=Z0:ɿ@YS +7ԴIi>I៾^BBh I>yg-ؼ@:vԺp"ǿ0>SBn A9U@ӫ@UmÿAxJ3 !@B}BKfMۿfg'?D;fmZfQfLB })a:}U$?TV S{A{_&p^BVJeۿ$0q?u.h=\n3`}BDsK[,f_ ?pmֿpT`F鿈;ѽBn`$u3пP?վҾi&ֿE{u{LgB2h?e}d>?T8J"꿦YcFBqٿJO=LMG?4l~rTb[vB=c忭a1PBz($۾J%Yɭ:P>R>xnq~WzlÎBuΔBk|ݽOٿ5n-<j~ar̶9*Bq/>>⿭r:jA>XH`®v uBks)?Tl?b+Ka>UWþ?8=7ɼBi@:W?}e c?6kd>>V>񏉾̿eBcwH@V?*׭&|&N? >?2/> SB__ @Kg?\ Ќ;t5.u>~>eG?7=ܭABW~x~@?H72=>8?3>?3>jIBI@1@?}/|[&1N8s?\Z{JB=/@?KxX% CHz,?-IJ?S?;G\B%$?mxv@b@.۞\aN? D\g??9A<8B-^[?@/@:alοԱvV16HP>"XB @N@ӀY#=^ҿ Omv{>9,"[>{B n@@*&t?K\?SҿWӥ>hA?@@@^.-8?-濦]ƿ]r> /DZ'?A?ח@#@Qݿt?h/>f >nxB0fA@h@U8c@zݤTq9? +gHN>4{uڿ)AR@]$]@f@e2X?ǠYka89?e? H=BG@@N@nď%)i?F5>^ Q? n B @e]@x@Cοj|>I)2ʸYohB?_g@@fT8$I>׾}Ͽѿ^k˿>rAQA%?V?̸<Z='͌ǿ"h΀P5j)5)AׁAA @{n@y>2 ֿD "ſ2r!ӿ ?A.(r@6@Z>?ع>a(F{Epk翈㾬A^W@vl@?҃>>ĿHР{rA&@?X{?&>>`bIVlh8ˢQA=I?0=;J>,>&>5?7Aa0 >?y*?x>1?o)^?g?[ >lU=zAc(.>r >xy?>=>t>?(x>>AA0g @=@?nc4%$*aR? yBÒ@hh>Dk?W?qɿMžIL6sBPgc@d>\?B#>H?W#5Z>z׾'kB'㰿C=@?!&+ lnb! Q0OxcpB@+?@f?ɇ~#CCn== ƿ\hBKc?z@J>M :+ :~TdBSc?*@8"?Wb:)[4+a=vX>鿌lBY[6>R@c>iy.%?k f>ce{{?R|BZ*UOBYH@kX$?0^lӾrBXr6?@gD߃^>#򿲄?$>%dBV o?4$@i{JU7<,t=C*t@ G#dBS?@dq>zM]"J NټCcBT H@@tGX?`mI {=~a%em &BP9@GZ@=?~rL,j$Mؿ>3LhN>FjZ:BL@??|,F9xʿ%? @:µ>I}qBI@,o~/?^:'Dzs=\ѿǿ))?(u?3)RBEA\?y*w :Z=dfϾU%><%^w>)BGrA' <ܹmXa>QVD*cпh?=8򾭞BN_@L-~ί>>^i?Y-*6ABU@°g {`=Py>iʿ+GZ=(>k򿤶5?SGBW׍@&ӿ0>&Q >Oÿ p\+Lu? ;s BZQY@E?[Ⱦi;SSs>>`C3cB^;@B!ؒ ?x{>4FH%=_^Bc@/fxP{E?>%OgῨ$DeBg1@=O>h =4$? >PL4Q>hBj@.x~?d .`XK?I?% i׶|ο&Bl}Q@ >6,!\?>r_ #a Bo@\PZаe;I??Aӿ+H&;pYbrBm@OX=Q/'=?]?*m`Z9 >7Bp@ [ڣm/Ȥ?Ah? ſN㖿_1FiRBr?tEݿ?ʢD? ])އ/.L~pS= J]>)Bs뺽n@`'D׿[??{r';dR=ɾ!3 Bq3>P.#?Ȑh?TaA}@rRgPBnDz?Dbv$ %Кn?E>ܒKb,K=+g@+kFBmg?~fc&##:OW?כ?J}i껽þ.̾BgI@P &ԚQ?3?Aj >J3X Beۗ@%P=|.9ܿ?f?>X>|p;BgX2?qUiYM_O:?#/?(悿=e+ kBh9?y%0Kdڭs?$t?J\Q٦μQ>|տ\ BeT[?w>?RY5: ??0ٷmݿH^Jj7BgL?CQEռ$ST?T>=Vj¤GwBd62?!Hlۓ,>W/ BaT8?h# n\HHS?q辸9BY,@J-- C??Z>r?E1!Bྗ lBS@tB/;̑/xdG1? ?L>䓿?>yf*BMv@䷿. C>A>s>zkuܿиqDBDK@B;A=O =/A?$">hؿKB8f@qy;T:߸Y9B-@@;s@V 뿴4>:wO?(;0=N?p=oRB!@?>Rz.O$;N>rBgl?^BС@T@,过1*EY4 =>S<ϣ>stNBB@쒝?m?{GDF*-= $FB @ [>T@ @iݿ=Nỿ6'?څAi@v}@4@߯>E+/=8nZF%'?/NA@1@2O?/?. QyÑ1>4VnDA;z?,aN@;w?jȿ*W> K5X>5PrA<$@.h? > DMk~ ?jxû>)փ?< vlA+\&@h?0??̿m?(0?]=9CAa]=?UD@"5jyV-Y?;a&?얡 A`7k?@k5Q P!(?Ͽ&?->׆AQp^T@tP??!оrO?u;!n??꡾ݪAm?y$->X@{O>os?ҹ?D3ֿ"_?tq?[I6uAs?H~@o?m >-T>mWj?zK?4l †AJh?:?ۯ@b-??Es֑>R9?(>,wmAE.?Y?6@7iu>=`VM>G>g#=rA7;N.??僿|>ӿ?#~`?c?¾E??;}>A%?H?n\?&>?F>s>?6-?Ȅε>sJ-?Y?p@H@-@l >/"[ʿFAT? @8-Z?QCn?2?Z>2GY*R^D~wkX@@=@w@~> ?5Ŀ >AV`>?SҾٱ` lqM=@Ԍ?@*??|.>=< ?4;;>WZt=ؚK@4?~.@Fi??ߪ?6?#5??#,?a/m_@\?A@@!Y?E[?g?js?[>t4[>M3 @}>#@z@0?o?=Q4@p[@x???OH?ӿ4'i?*a)#@tkDS@t?ƒN?<>`>?MȾJAtm?m?j`=Ow@fRd@[???"R=V=v?* ??j>=r>:0>?Uϑ>JK?+]@9W@^Y?b@E?Ҭ@??g?몾>)t9?5q{@0 ?Q?$?:.?:U?N?:m >v? C@?w?@ Ϣ>d>*>޽}<>$ၾ?+@1:?JS?ߖ?|?qjh== `>?︿C?B?#?r?? >??rU>Ȧ??vLH= @6r?$?@L8?O??i >묥=!?xs-@K.?@N?>"?>?s>~&$$v@пMd@|x|?ݍ??)?-?j;!8Z?9>?j@UM@P ?'?P:L?ׁ?>&=;?8?Y >B\+g? eh?0*?:?o>1? P<͕bJP>c?v?]Spocketsphinx-5prealpha/test/data/tidigits/dhd.2934z.raw0000664000175000017500000022600012771605033020157 00000000000000  # '057,36>07/3C@>1+0//4%-@30"3.+,16'==#""  #.*#($ #"! %.$ "*&#"15;)%/.00>+$$"-*1,07='-@10&4/27A<:<B;66L@@MbVFPS"DBCD0=Kd\]PHGA8CJ=4?ND@9:CCF4<5<9;7L9DXMTA<GMJMNOP\]QWYC@F6=$;FKLJGLGLLMLF:<Dgf^JDBCCISJ==I?@7ANHRIHHJTINLPEUUXVVNKDMGIFMFNf: ,OSRSSWUG7;E>9778D@>?=I@??5A=7,,9+03/4-'>PKA<525.'909G>D68>?1TW>MKN>:BOG=CBCBJOFEVXX5"')-'* !/*.-;C+%) #%!$    szivlSml#"5/-,@@2/&%('976253-;;';A7(7;,&55.4D''# !"(*&0&0+1)$1',,2,)1>8,;COAFG:<B:,&"-1+6.!+)447:6>;$*NFN8)<8EKNPMNS__SY_aPNegc]hmgdSV]P[iPNQVUZaPSUIJL9:GB#8N`KLQUHCO9<JF;BG49;ACR<8<??("/0192/ -!'35+=@B4"(2/C[@@CH@F8A8-.9,/1=%*.94?0:>==E@DI@>.4HN=M.?UEAXQPMI>9CGB5?8<24FA(6303-56E?;>=KMD=@47921/9=GK@38@;9):;'*#8&-2$%127"+((2>44+&%%((''$".?5))-3#*;*)90.!1+/-!1827H<3KI,.,/)( *"$7D 2=.(67:FKI600--:>J@%+! 2-.9;(#4 #-&&$,))92FH6:<?.8--9J!FV42L<EBKLKHB?L_VWJUa[CI^OIKPe^>KZ]O=T[BSSNIHMJB9;@>6'* ,;<22011692,45.21KH4A@/.22/94(CKA0#,3/5-& !)"-$4-4'.+$6! tk~z  !   **%&#&0*3 # #            *0.)'43#0G874.<3BD@8:ITMHJFSXWU- " .RKJTfPAQMOIHWS>LHBG=:B..-2. 0H628CJBOZXLMB?F@=::N:'ROPRO+51'9/9JHOPD5273,>=KR;NI634F@GW[BAER[agb`Ygne^`ldgijegQZe@[qkmibk`NWb]OLV]Vade_`RgnnM8KY\X[XbMD7BE7:86A=KQNYQD?B<11-"$+)6,-$#'"%  #  .2       ~|      '  &"*$/4.@>E@1=?;62!(('1:6&)://*&8//%')%#4$$*..,("$"&*)'/-%'#1./,# 2<52*"'"1!%% #'!&09;=/5,',01@C7>@DOF>748;33*-;3,,&!" 7%0?1,%$!#/"':28--;:4:9=8&;.(%1*'$$*)2408@E1)<D>;22@(  1)$+>DD=*#%&(%  )%)9VXV\QSU`_IDDB@:9 $-3./27>IDJV]ETVO#((1,%87-'())-;86=51>$8I4)58(06<<BC=<6=>643,$1&'+$&'BB9@@<9EC<12D>C4D==8DQWKAPdYR]WMJQV^VQVPJQVJA'5C@+.6<);;%?.26,))(-28406>E9/A<(26:8-/)%  %,* &$(;8/.1A!#:.'21=15;,(3E:09> :2'2>%,''& ($% $.*!# "(8#(3("%$7".&/"-     ~o   >&Y1G@\6Rpw<Xq:aBQ@ AKHd.JkEc"]'UfiK_I8V@dp@uC@Cm`n9[AuqTsavV[Kq5GR+|Y4%]p#<rH@RYv;$&+\3HmY9a| & ??^b+ UY'@Or-1 ^u,(4'>q0>E 4'z9~GP\&p<S[-w /LDOGF"# si -B~W] -268'n%X8aS @ T0'Nh=S LWVs7&P?:"xfZ-k@wv2CY4ynkW  F? {K4MWd^JI, *},mHrCK,TU]~PPt;)Z@w1 5k[Q7 !1}Y'/QeCkI{Cc+\&8_W`CepIUT"gc2'8=s+ <gM,c+z%^%XA7*Q]#/^[;nv;*IRn-/z&\t1^<B42Y"ux x:u,Ms8aw4`n-Lvm gftA>DeNO"[pWmoew%bw* CW1 zXW"PF z8x$ON$F]e^!k_zJ)Jn;c^-6![L Z?D-U;(>Iu ` sd &os\)K^) Oe2Kp)2\xp`NPq[6$/V <b( V! Qu c^< Mc[ V2 S  >  +G]C D P B W "uuu.B@zz){N $ + 2ZJ >  Dk5LD' 0 F  D G0 ! Q %S 12_dD8}yPr$ K =nm <R 1eLTIi} (VF[4 \ N %4e ;  p , 01I.S>8:bJjByIb W F L!@ 9N; rCW1 > = ] f $ (T!a%M w W ; -l3xLF${956  `, YJEAPo\KxYsuQ=p2C  ;mO D f ^ .J =Y/>~qu1wR2^ w<e  ?" _>^se ?|!t1I _d$ s| l8%}B.z=JVE_1 sqWZ LO[eFs~ @ 5" X -\ -Q.w fyh'# -EaQ7w% wRN3gK-BI L+ TV& c =Spu7,2@bYk R @ /-Q & : .i ">EovJB%z$Uc($lK & * d _ )E}K S%.{+^S[~V=::dD3I? 6Ksj O E )*s*>H17IK e \ _ >wfZx ]Dc4[[f8dt4_[gh@4x c  Zl D;~JI;>+G <c U/ A;g&/| /e04M=z#% u iH :]Uk1 yLY Y   v  8D^Ro V.#d%fR E^ CO F FL ; Gckd|q.'PRg pef /pr`,==50Pn@Khn>1S.W$  o & ih$,+LW[^L- :3^QZ3oK?S[NjZ /M&}hgz.S!Ho.~E{5gId? -0CkhMW .zjb3Y0  O  @ M <Uq6y7Ysf.WK/ie]U!Nl5}zO XtMPXh= J % M n 6 D 6FP>bYnF_ YZ: f2 ;}CUt$j,b;'gjw_ d ; - r wRL #Fh $Nol $s   V'.n/?FR0"9xHne   .W$   l H aE f%rZkq7EG[ 2 h u B W T*tFDW/5 V2y F &M  A0EMZ=NIHS6D0 \a tM, _) &.@v ":290',' #6;; !&( OE3 j  }Dg!1 9*#t8W{Z ~ B K!amGtCr ,  MM : , IEe xy_0!.I{E ueqzO!D~ 9 ? #)1v)[- fi$ C &]=* G"#Rlu RM #5Qu b?`O ؋ݵ3k/=,O @iD    !$W,7_yέ e  #| M! t*)%Q$Y4j KZ$pBdu5R)  !2{=/ ~y (X! y cVĂ5\;'i+JLda,0-<>^FH +7 u cH ZEdA9=0ڕFYx+-m>?x"Ko"# \f@` M,wʬm?Z+ 5   %SH $"-1"jyuަ܄>& ,,wY_rr G:ee+=899_B/ k' 2z΍yos4CN yr .OL!'/ K0r *_Wm(* Zw~t+|wގ><#/r9|0h!=:=2  2 sq9sD|ѧ6iip>:% wc gk}|Xj Ov=A]Y/!" 3T PH\ NyئڹmSBX#-47`& BH AEs c8bE yJP-8 ~.KB  8ff 9V\Sk?q3%DEڕ 1 B/:(z8) 7IJP m'׌۷8k-v p , XO AX"@w  YA z@6n~4 "ZI%N43bE,|-"%:;; ` G,fsD A "" y=(}T 'Y :J (p W SBJn[a0ٙ0>n/?/0Wqm"o\! CY#' "> "Vp<&C t $E %L< l1"h]OsOi'k'ߧANmD %93O53 5 ag6m, /f 9r~ &*LXB~l U%U\ & & {Zz. rd<nr oT8yeeKa9@~M.M5!4?Ro[ ] L e`dh`M^O * 9  j[/l wm6@Ceh% a j f & */b bX:w_ LhM  De~6 n3HU*P R3QX )SjV^2oۭx| r $30 R$-( &a 8Gio9  & 0yHEh ?. ?w=J=::4*{Bmh$rD) 7]Ah v) Z Ps?)b.UEXS%6` c  /2)ZJd/c=M#K*ecHqX5@ 7 5 > 5>  G ~ty7||=y4qo8 uSV9 n S 9 N Q V!+D@1\oT"5d3>9. z b  S " ,4+@.j3I,u PKm=,e"Mm~ Q#Ai1# o :  rC)iwv=ep<c9YZcc5I\E& D   ux n F ehRs(z9xL8#8e9'tC;1 G Z  Dy>`zK`1e4OYOkn *@'2, ? + / 2 LK%v;l"-t%`SI  H  q X +5 \[( m _?[LebbS:*QfL 4 3  @ 6rF=mFF_5f-U4J(af6l&},32+m] **Y1{ FHGEBF d uck+,8x }z(STp**i w8xEh L2s3fT~YvYn@9EI1rq[f!XU+Ae'nkHGTecEc*8 A>m <2o-o#"2UhM3 @-8^)gP{+ng~];Mc$omkM/ wH>&Qa^wcZ-+A5vma5% LLIxo$`bSxg{cJ+c>ox.AZ&dUU ~9:J xX+' $Y^;^G<=.F&!'f\rAJBS{POf%4_\6= 2twt P r`u*Ko{HFpKD]m%Yg95@O#$2:e0>X`{)28 "\]g\ V'7/S@m/Uw]V.`@4?9('6R}//uCd`]L|6},xr S6e'R +r.r<PI{9'9Al p>?& :n=Ww6O2/H>(^25D,=j "N. smtnU|Vf wei&dh:|nTeh+x/@Noq^V/{#-Q?Gr; 4*%JatKAAywhg5$tE'NE6n%}~p";>9eo G#4:m|:,ras?IBD4bG@ v:,Wfsfp,oK4{2|Ew Xlzi?& 5KF|KP-ebr#6~ fTeh[X>J_Z%ASK+v)g}9=;N>q T?]6I-pyTS >/Ct<>8=TkEt0m5sPFrW]}E(}Ng/$?k5*9}: wcPY7b[<wQH,<H-aR/W# V:7HL[:dNijc"3z,&ZeOc*P0elOrL{zROGF+qO\!`,K~;4vGG:U;_/\S:F W]qp(Cp\0  9 5u_xr65h'yq7Yj7K|Ci)H?QATJB2Z+pB*v\qI'^[x=.1N[7Q?W|F  X LN$rL aTJRL Fc5n{.>#ZA>VR&8/?eH4|ZL$Z-m 3 :_ + <H)ZUP 74{  :8 _X3vGo_@] vi.`}m1o( wdh g\<# 0r w&8>Rifo^)]S+(`2 v} pFu ' D p E*)?rF2JG4 NhLNM !Two?{+[i'  ? <I&}T\MBOc|vcf-] MSF M % y,3p =k 3)lq>=WsMi`G? RZ Xr&(Itd lztb .69?] v s  y n X x H @ &t mPL /!0Xceh[Ang1[t*@\b?c5u1Z! 7Q BpK">v5"gM"!2X|0]x/n ,  )  y \ g r_uDrY mLkk fyyF+c=1]g ]]q/a $e=^ \j -FbcnUs81>i f j  %D lVpp'phW& OL? ;w.3^bu|}4 C t o  y S>gBS[:JP8 *]sV <3 %(  }*Y R+tq`%28-dK=Fok  ?M. qz 'sVm{r u K  <<'ywh3pG)6Jg@f  QD<S K 8H, l2u|;2W3f:"MAp  f%~s~ T .u ` $ T1) fZPRaGhA<{uOYBE[@_J&  OJ uAFfu{LY%2  1C J a F bv Lp}MU/!m| o,wc{ Zne0 [ [3PQ  ^~3txi 3tN"Wrd h J  M Fg V  e S3RCqy0ijLRm6q`WS%Ps~   o  ^ 0 = G `R ]!R _ZZK;_gI md@PZnP05?qJ b : k EI HLK+3L"9igsTE #  o J vlU + +{shkF9$) 6 \ANk@t [BN h9vBfgp_!> T Ulq0 ? V5h8\y5G+*'*&y*@HY>||EDB5h8>Cy'bNC=_Ji c(kcU9 ~  ][9Rqfk?Z:D%<IVV :we(9[1q,j/JjuEx<_/IE PUC%m8<1uoe#^c;!e| hj'b/,fhZ,:*P:U% l5V, mI_A0CXT=%Jw=n4aH`v4c}j*| ,[;>|)\kId.3z\}s/)O%0p=rSxYpK5hKn}<)1*CEC(_WH(|6"}Kn&c#iT,FWfEe)7_ l z]q2{ .*w] vd[6~:sY+ h-gJ\zCwYQxNCx2#Ljk '[/&a7HI t$|zh=>o#*~}WgU{mTzr3C`SKCTxcFRZ[ Dfv&*j0TkS,}!Si_^xbOafO@ |`v@2U!:fmqagxF9?:lXG^k^y.-I8Pe\ny=_ r$2`OrHo[CZXP[2>8gEiIY~cqY8'~wr@]VawvL@vqVu0iH0,r*k3 )z\=)@9ZUsCO6IX\C -o9=/3c2_82dGu%qg.uT em;:u![Ah5f C/v8V %wRc)' Fa/^nJ", LTT{nu%^>jQH,  TMY#K&N\(U@y x* -X (R1|urH1!qcGQ!5;dM a:hY-KY8=~"G4vv#K`^gfix-HmkVI7>$)U$RR(wN;yobjXic&/ {X($E 0eG+QJr3v;g.AXJuWCecXY$e%"T'#1[2"| [ #g-Cl$YSj[:(%dye8tc Tz\bop2x<x?  ]16J%sVu`a`i H8 p=^p+ -C =S2Zexw-   2 V^>h>$ A X 9 e w`.Kc9XR]gvj'bUu "^%& %skb~MYq:T~ gJ 9$1I :~ G QBb5 !cZ'6? EG(vY0) X*!#"'q*G+&Ts \Z,;W%b `q L1]M)~5< &IVxH b <*@) &z; { 2 |^k61?$iAxts $ 3!&*w.22,K!U ZߪaR fSOY9 kh3 WTv  <Rxx } utfW} ` .) ;I6 eJޞۆ& 'P/-22L4`4 0%QdeRKCi0"3vm | !nvk5pSPZ.g!H \c W .  S2s  KjT2Uo$jZ vX7 9!U\O ۧREu" M%p/t31.~+E)$ YS IN*@ Q  n Y| N L3h& +,b8 } gUtu  dHEg>8kG4u1.j :(0l1-)&"2K{q=S;wegY,  Q3Z/ :)#*&O %  r ,o]>g >f` aE'L ~ WWD/E*VGBfLK*{ #B&/2N.I&.;UZAr>! U; 3#N!v W#Rb%{*P~ G ,FL iRJ`M(Oe & v ^LMd#S-l%Zp8( x#+.) )M =9j[|g-W mBE9El2be2@j= 1n|  "xGL$ K/H Q f S ! xJw'vzjs[-KSFUo- a?L%! %-^/(VjXe Zdxz]e<I C\g_?D2$93/ E_>ykY ~ 6 #0d; [ w _ sI&2 xQK\*'W  }AS%) '; 0q#o\ y3_ ^ d.OOb 2!S <Fx X &$bqz7=0% |  wIJFa6F  !)+L%u$mYTQ#<9L ;0 aLj R ^r5}a7!5& "p"!fF\65v? 3 i k>qN;~_)CB &,n*p! Y ]h4ߊQVW#mG) D   u Iy( s8nv L*!e!U] vFf(c j@0.5 4,lq{(<8 }%+_(! \.k zC2y* '= T)eB|? @zw W RKoo#&A*T({ t#lv8 htq7,$$qu UH rS '#f +Gg9,s D5cf + 4 A v+ _ 4 R   d Vy:'@CG>)(V`?G/B; r]1'( { \dE9 I1 KWx9z`)f*Co/ `  Uw{>+ R  ? *TO9{*L.mIP};X&ta' tId Z C. .2 #F" 84| lR\K)_.\0sgW2Q} r8i< h 3 V$  `SMkR+g3O! & 6g4\:Oi.*`Ae3uob.Ul 4&6*=)3QIJ*Ftg$I  X r i PsXiUxqEIodi@.-F) j .xG2T5q3!lP&pkl@/kq"]6=2B+{L ,8$nTAA.wV-Yn*-}K}?^`V-S @0uz qY9CHKp$dJ[5XddI;R?8UPcKsZ xU(3JW<-2A,=w2r-&2#>:tL>2^F.aI3qpD P- ;6C39- d{E 7 )<U QS]8nD A?D > V v Xf t !F N;GZ" 0{C_ fNS/evo-,9`gc .!kAvg CB{W ;0/LHcN < 9{7[F'yd}geA G$A  2 _3z<[-dZ br0 w+ / &K-,p tQZ`+bI9/qX AN:, "}GC!v3\ Lg<J 4yTZ!w h PK@X $ t; * O2/L@[H&eDS\D e+Tt60b2utJ ]Z x  / ;M3) l 7 Bm8 $gC E^bv>s, Bq Kwj$ iaag(M OFK3@/ ( Ph |/.6 z/pZ  s/e #{ajMG*cy\D :l5u @4XSEl=xKsEwK* . DTx$U:zH%q5kx3-~2|M^&OF\F=1A)q|5@g {8C wSfG+.XP_9#{! o&cwd[&pEh5|Q ?xEf1 u~'t|G)\U876n If;iK}ik #a*rO/C<q:l# f,4Pf X.&)/j|}D#.8N L M^B Jj|xvGA0&[jyJ!|3 ?J |U iz `  Z`W #Lja xT?Ks|GMX WWtk \coDcQ((NH*s' J&qZitz`o jW[>Hav! 0F 0 64+4wacr#I1`N[s DO`]x)y)g|)=Ce3"Gs+lT9(0/ d{EjrOy-OD(3] eD5UkB"o -$! :xO~VGnDK]qi9H V ; f : XT^ 2<alvV/y;z^&1D8RMIRo*M)+Vf ]79okY@ ?x ? { W#wjY'Z>u(=ghyV p !B8[ \*B0s}p k WHed4'Rb_RgYPjm<>E25xx {? X+ * IWun;/Y0-<; y(y  re8 C ,Vop:o+SQ"a]}c88$Nft"EfK3n d|t ^[Z  `Prg ]:,k:?Ce &Nh kuL+"vBlZ    h a y cc7p4F+iDqptCK) }  *kSe] t , n?2cuqM?"  E < kc\g>?(3z] C; I ~d 5ug(^1:c z9R8Z 0 # %L l# 82'EQAj" Q G-<'C' 'g\d R G| 2  88 F [H;vTk0=: nC]Kz'=>U b1Z5` #!+ f v *n ~$(d=l-@Apaw` z i E 4G&>?HT,<uG<9 ]w}_+zUK*_UY3%g c :v^5#H\[K6 sNw \{*Mu8mb & o) - kR;: PsM*q5RRrOqRAD~ > 3Fl <r265%C/IypO V t w &f @Sg/=aZB ^7_ j#Xx4Pxk* 54Gx}"Jm#STj}[dMx `?F vSgF1?Ll t  v  t a C`({{<Tm.G dmNq X Ez+6)"ahDs@xXdHt?ix{{TGY3Jyr\ e` R 4S b'Zf>xTu.?i  Pk N KEJC6.  z n D ) +T | ZRK ->.A xc"T? }{`Phc h\`  D   vo4{A9E 5 ,_IYq9,FX & 0 % {w>6$ypF}1_iv TO|6x%Cq2dq6C-t Gw dFhuZPEhRO$  23%Tggh5b*)^  Y J n RL/-S xe` DQJl x&/`g5@#xDm}?a[cL,5 =.-svV  K h ?'cCQeOf)(OIAxF " > h 5{vU!#fm1 <8h p2Y{lRMaWGhzL + & F-{D&Vm"#FfbLA#3 }I>f}IUHT AtrX6m|Mas @m?8=jUe PXYcG.8>/Bc"p 65W ~jKDb X  c-m&4y  @ l@2  ke8UgJj2aHfmt`ol8 ZNK W>} c|S^j/^  S  4i SB    . @ ?7DX1"##Be8=6WEe M/0fK.ba39_HgWHG :o (Roq"'E _ uyFd;Eum. # 0 3WlPAMO 3 5&P#(PBnNaHS!#j}$dfUw' DSzP`b+  ]]4EL)T O , d'R[J+VapgY1 $u_' Z N 5Sh<zV=y{8_9t-t `$ XL#p.j%e Y  `C8 A"siU IR{ J w7k]p>dt}\DUt0A2W O 6 Q # , C4BG(r_~xG7xxV,Qg":{G/ZR'"++H{aE Wz*GQjZ i  : |({}&}#{'&x$S.Vey;sq$ >  sSfy%8)*QpBQ~ b ?is[)0hRt"I*Fd%6T=1)E9Yv = wnR70Ro.@6Ef\mm@_`nVk  1 F ICy.hGG/k_1dDY~9y{&;SDtkK&@FX$$ ) #`U 0 Po]}gOuy!w< +^3" fw m )I4;3N8\ yhS3X6h9xw]8!?v89mN-4$0 =55 3^d4"\$ ^6V,@ ?1+]ZL"!qN ?<Q z : =33e,Ba}D~yQ1=4HO,8)ad rKF^$IMp+  S(v_X#Rv0 Q}m!pRVi$|5'{UScIK3GN(/LP [A$V#\"lg8VC*"M)2 )N rm@.P]!R y +m&jF QL(!pv(DxRZvZf lu@pWv%O!Bl2yH& C4 jAXP):r^E?k&L;S0!|6Z( fCfk*C6nW(-pZN"uIJ8%/lR]vIW-ql:-\KZCUG>IoX|1uA|:,(mOWre1Ezw7mVuR{Xm)/q u-]FOR_A=M q\>+H+[)?Wn850?zpg_f?rF$!&|@! * (tn%:]2=jXa F$ ]T]\ mP{H1Bld:&mfg88lCwN"&D!>^}/gker`oC.j 2y"=1eJDB T>) J4Lr_*i9gUq2N Za2.$"VXz6ZZO&M j(MP)*}~UFQR YXt~}H TfVf@CaBmr}nCn(^[uCF<!.O3z2V4g}nY}/h'sPspf:?d_`AC+!HOTL5538I+Xx}-)r?(yG\W -50+5\3Afu?N~'v~cm9rLK90-^8,5BUyN&ONH{ MyM~Fw\qqE  U0q<R4G?N];4[')=|yCF__GJTTpbdidGIPo(z7" O:?`+u`j~}c?pSB=8Xf'0kQQIov2qflC~rf-7'5829;EzOZ5#$94e2[E[z=]mR1,DI\Bj60>>uqjN.;E[|X!"hOtJRZW5]_ &49ZA y(]{Or:/`ES,-S~/4>B\ZB,/]fF (-4B9G=" .g~gPo5!P9ojH7x=DGfmbN) /RTzpw}xwXMMotz_<BF>LLE9FFapoNHq t22:1#6KqvgVheRRQQ7GY<,{ @ofP:@I88.- 5CD8;X[J<-# 4ORH=?@,youtlcHh~u{Xtq}{nlkX[piynf_lZTdmp}ssmql{~yg[SV=/! Z`C4`wztnhaqkskfifoiddW?:IK5' D2Naqvp_Uakws}swfkjkoe[_fV.0AOjeR9,-vm}|qppytrudkm_krxokk{{yYprlqwohgfohovu}qqyot}xqVE@>*#AXz{|ygpg`eabceXXhoesgdQa`vrm !06GQFRYN=>/12,"   (5'1/(  5, "        w     !  (9!,),10+:RVQRBLHP;$FBPE><8! -.;<A;?>>;4>D>42:4%.&))&!%%$'$-116E@ (8:3;;($"#!&"%*7;BJ>IK>OS>83=?<99AK\_ZdZ`RHLIOR[\VNusj\nYNMD8@>Md;AFJ@-D304%<KLOJYXf\]`ekrz{}qow|kmrpvw}i]|mrX[PTbA1."0pvtosW}mv]ibveUYDMHP{}wprxgg~npjjhZiga^]qsf8M9 X[U`Z[PWE?@<JKQYXCGMQUP>?I><BB>5:=6?HXTENXGEDTHGNF.%*9+$5,3+"$9B5+$  +2;,#)2(  #% # #" # %% !#      +"}  "# (!! )*#/+15.BHAA>:=((FH9;1<2>?=B?F98A>EID7;1+3DELSD7@2,(3+:+ 0((,??72+!05/18??:3;;BTOI;8;??B;0BLFF5>1-83(!""+>I7:L<7:2,3)41&*(;83C+*&& %/4B;2630:?2@BL>7LC=/7PA2:+273A(  % 3!%&36(FIAD56/+@DB:32," '#)23=:F>D;-*151?:EMHVdfYVVPN#2FDX[OgA +)5' TMQLRT[ZW`g^dXd[SJSZdgis]_g`NTmibf^a{lmaM :>C=KLUN>C=C?PD<35>C46- #*%1:+#*,4-3&)34>2>=<924134,-7,&" *9365=A:@9=G=5 888FLIQI<HLLB=8@@LC57()5.03-1/772!18(,-8"7C<+(&*$#"!    -!$             %%,%!,$%!73'5B3=:0;379@)/B9H3*26IWB%-!/$$  ! $'$"*.#+" 6A?6?J2.;3=;;OZF@=LVP$E')ZTRFFDUW\PMNNKUVE?:@=2731?FANEJF5:=M@=3::A[J;OOHJH[P6;+ ,&6.+/)%# ( ! 255*,6$..#)&36-$.&.7'"! #"*7'((&&/477J:NCS7=F>JH9/(,/% 59184E65C:IL?2KOKKPM^ga`RPPTEJNQ[QXlkPRLU<7[@AUMO5.>D4+5%+?7#/8DC=5:66.2+'+)93:8)B?2,7EJ>KQTNNHJ/O'YKbb^d]LDESP[WWNORh^ORQP=D]P5>@DEIA;%4489:3=;6-+ '64,.5H>7E;67803,59(0/&%*      n{zzxzxwzQ^Rv~~g~_hTlg   !!(&0&  "%"#,      %$    (!%($$*" !)#%53:/18+0 0% $$   $#%   $      " '  % &)/!>B:688,&*2(1*(+'21-&7*%"+##&,  &$,%&))"""+(,%              !#             !  "%#"%1*&(,)5+++%#(#(".'-"$*%""#-       ,'  23-.4558-,<,AJE=130)'":E6D:+5)*-4-&*"  '+-$#-//,+!#'++&"1A3+-12.&,(%('&*,0"/=F>*<I%25.9BGPOC>B69EBLNFKALORIWI% @CVOZTNNHUL>+>8F3039,'-8&AB2'+*89" +#*#+&20 &!# )+:2+&!+2-793;@6:>LVOBEEK@JQNJRLI6B=MMGCDVPUI;EPHCKD<.4J99<655',3*?RM>*#>>/3C<CRUX``VXHEOF@TPDHAbebkkdWUdbRA:K?1BA68>30IBH@+/;2* *61/%1,I>B;;D79>?6<G!97GE11;64,.&,("(05")08+"28$!,?*($#! :1&#,239CHJAIJ<(>D%740!.*)(% %"$(*% "(445%JJ:I>>A3AWEE=/68HOJ>/7..'&8'%:-(.:1& #(#'*$'(6.'15 +-&6@7:>/14-'*(#'"#-842($$#41%0*366+8C?7773(;6#2=-00A3'935/"<1*.3(, ##,2 #*+0)%*-9,( "#*88().11-,#"',EJ41)6TQE<D;AC988-;-=MH;ALB +FAQPNNZcXJEJCCD<>B5$;.3"0>J@KM3'SFHKF?>EC63::.0# =)41:<;;34%+,*"&& %!$#! #"!!,E3$!*! #$)$$'  }yxvw{~      )!$22'+,. 9:/->9=HCGGQN0+1OOKOIELRNI9<HLKE@?2=72=<:.,)7/-'5C?;@C>2-87.3 8)>N> 784;/.84=<.&!**' ',,0-'32(0/$((, FM?,"5<2'*' ! 0*$'&20#"&)(02,* &%&0*458'      "." "&!         %#, ""3+ #   $'   %$  !        $$!+&':>G;8B?3-51:?19?DSRG<@W@>5=A>H:<@5<6HM878?LJECH2MGKGGNC>6:@O0!eaB28GKG6/-6@;1%$"+=2/6!$'845$-"## &"%*,)#-=4#%(216)')0'6D8BB>J@A;=:8G::41DC>4$,"#( %& $1%%.$%02'              !                    "(        ( "+# &      # !   !       # -- &-.6,-%     %   !', )  #'*)*   )"3"'#( ' '&/"2  "     &% +*%++",!#))'%&"4(C>8*/3/**  $%  '$.:(&)%"%$,"+#/+4"69B8C?12%4"#%)%#% "!  .6"      %,'$" 1('8968=/'/.-E<"=+&3,23'@H<E<4JK?8LOE5/<G3<BHF349-$&)+)+%)$#'1)#)$     ##    ,     !#&"' $   #-,- 0!"2+&!,(/"*%$    $$         & # ',$" )  30%%!$   !>*21;<B9=TLG*8+$$#372&)!(&,&'(3.2,)08=8)+85)9E0+39=6?G3!-/(047<3.-."6C)1>?E #$05F>HA4<?A><S!0U;B8=9;?G>NTMUXS]XKFKSP]QY]XNUP_pgkjfgkfhc\YPOU_eTOa}lcaV?B?IKKKQ\eNOXQVKBE21  +62<BB>25?4887A=DH<;<HHDM`\PZQFO;HRQYVQU\K8 DS>@ABNYTXLRTS]RWb^U_jkh[\mk_fRMJROWWaatpxwz~yifTXbT\PMXNWPGBM38>6FDM0%'247&"+*IM_ssjYgwc_qgZ_ed`L^gTekT\QR\_\njja^d`ZTY%TP=`WW[bc_Y[[\^PX]di^^]QJRcUDZdohY\ke^bhlmy{vlkqiVKVGA@MS;+#5ZbPG\NSOAA  *$P=J\RHCIHB@?AAHHB<5DK8/:211%# $!(" " #,.1,4/'!$- !(&$# #'(,$ %  $'4 !#   xxo  '*%* ) !% $*0.   0#%,-@.$6/6270+29=F;:.-;D=;BA@FY_VI=;<:>@N)1?GRB;86:4#7'83@JDB2Q=nRLJ3uq#fV3i g7jU")S9K2<4.7&;)L?:: #.4"7=+D .&% %*  $(  )"'  , ! /#1&'1$,2"%"        .               #    %+' &'!.(* $      %     %+&)"!%!.          & "  ""+! #& }~w|pocketsphinx-5prealpha/test/data/tidigits/woman.ak.334a.mfc0000664000175000017500000002626412771605033021000 00000000000000 ,#tO?0]N?(п6N#??^0>;>ߓX=NsbP?{?%C?H;r?8W?u%j? @l>=W)I^>S$?0Wv>?O~>o>?l?">?E`=uA쓾{?$i@>ml?#,(?F?&Ӧ?4.?T?2>??>7????)?2 s^?rM?1V>|?Al?z]l?ɰ>?6>︂>U>T?ks?+pQ?s=qC?j?l=F?VC>?>/ ?CI?ki>ح?.X\c? ?⋝>]> $3O??eU 2+>>FYߎ&?%>&BC 궿,N>M' >T%>׀>=?t"?_O>[>x??q> ?B׭?L?ξ>^ǒ?6_u`M@ 2>=?G>>??%"> J>ET ?1 IZ@f/CѾ?i/ >Z ?_>:b> >Y>.u?@?z}Ͽ?.=r>>]n#/? W4?~?i)>K:>yX3f;?3>1? y ?+<=!B7@?y6Y> >~{?>i.?D;`^j`E??Q4=p?j?+-?`?7N?Φ>UߺS>/>?p?3?+??.!?JEuK?|Ҿs?>sԾhq%? -??2=V? Q@aZ>^r>d>̹> R1=د?gu<|>N̓? W?????wJttL??o?:?=j>&?,?J??lƞ>>u?R>do?V?q>1F,7?Z?Tǟ翔;?H?R9㉔>+P?l?*@??5b>}@a=8?2v>S_??vm?Hp>낾NĿv? a??W?D?)'?yf?j?һ?B?,:?7EB? \o?%j?=?վ"?t?˓/Ab=9G>߾jD>ks@d#R5>;5?ާ羯>$>ɽ >?yx?cT>}?1A&S8Y s@ik?K.m?_=;:%B?)@M?@H ?Q+??9e? ؍?"=*Qz?i=q ?<:?M8?M?&|žr/? Zc@ z?s?p?Cd? ??]tGC<2b (E@6@8?"c"~U-n>;>AS꫿Dþc? ???ᾣ;*.P_#/>}ry?x&>Ț@ @Q%?֟? Q{̩OEܿ cPbZ>uU@o"4fc@L?<\>)|@l26)>?F^T>8D>Qkm?*phM@?=#n?43x%c?! ;R 3jپ)=T?Hƨ?DY\T? >*?>>Hp>,I?aP??[>Zt"?3?ؔ?+>b~0{E=N\?I>HLõ?O>D-s>^>$?Ϥ>E>]w?t=JWU?>>*?x?>}{?7< ן?`?>1z>e1:> `?$?2c?+=? ?lW>,>Dh=N(?98B ?"z>=AF>ⶳ=㬾֫=r>]o?K >@-!z`@Va,?"n7>qA>P>zC|B?k?s=.f>kd>R?Z>5?%>$>i@"p•>mm>u??>8/r>?ՠ>E]>mA|M9'G-9D_>KQmZ->ʽƐBjie?;+a5> dNCwS@z=3!AA63JUֿ>m8v{?E=J]? ?4g4Qb1A.&?,O~=Dݾ?^pS>|Bs=\s>4nw-s䙿I쬿eʿ>B5Vv4t?I7||ҾEx?Ao.pRyB5BYވ??Kz,a3lrO@B?=%ӿ*?D> 6[g}sB@|~@pּ?"3Dܿ$^ͿAf`JhVBT~@\9Q?`AF%/`$=ƿ`"<4ݿ7 B^4@a ?-*8J-⽓X tf>LtgȾdBd2 @R?X<8c6b7'2BmR@C!ߋ>bl+K9o>#|쾣2]s`Bpp@7?Hy_<)ybBtT@bk=g Q>(s5ƾqnԾ<+CByr?hvr >j|># H>$uz|<]Bz`?.nTmpV8>ܮ|n ? BzfX%AX׭7kn̿ZkbBſ/(B{Z ?=>NT%1!%Mp$zW:By=~>bbr7#=$x)+`ҿUBug ?j /0^\Uʾ.U^:4V꿲Bp-څ?. ^Lcݿң'Bm^@+%> 5ޞοCBh,p.@jps'!=?^"׿ 0$xBBf@|@/!q3w\L/.+2dBdDb@bߋO tD߿<&@}5ƿZBa X@o=L0:rv[& _qB];p@aP |''ob,ȿW.ƿlJ2BV lN@>ذWɿ-ſQf mʿBIv>Q@#?w3"OI,:뽿ͯMۻf BB3J@Q@ ?2C;{+X"vB# 0B0@g @6?+dM]%ggʿ?BFBA1 f _0鋿sῨK 5l>dA6? >b>A|Q?⃿L[>oA+ A>6a[?[kҾV,>$E6m{M?wAv]i E|?j9n@cز=v`=T*>Q :?ҖB#A۾Oe?*ƾ봅?ws?־;ֻ轮=(p>R??pBT?)??4?%K??I_'=m ҿ>BB [MT@|???:d?wL>;~-|,>L?0qB@/k%V )/?+Z8¼?s3Ha'HP?AԾB2d=ߒ|6GTӾȱ>' IL;̿4ZBK?F?4W]kH_JJQT '%áB\?|,=˾MHݐsv\2,;B?q?_%??J^ǻwD>ʾսτj!lJKB?!5b?x?LBU?T?$_?Hj9JZ|Nd K !ۿD7Bd@ g??m> ƿI`п~jBBh5@K_j>.De)u>ͯ r- tBnm @*׀3ſྵŭ?H_Q>񞿋[A-ῄBr@ P3ͦ[Dy>$= 1ɑҿBr?eb ޿+ 5DsE~tQ S5DBt?}>Ⱦ(עjYZvtLjBt>FR=ڹ _>+ˎie E:b[BrSHX8>/zF>&|,VPAEMܿ`vBqWu>?DyC?/jf>ING`2i?7*ڿZzS}Ω~Çrv N }5FSBeuk@2 ˿^<lG&o  #K"VBcIyL@v0HHHϿu=8@ڿ&N0޿{B^)@xP_S},`(g;-Na¿BYʃ@j['Y"l4ldpfAտ3 A=BTI@CCRSPֿ/5KzBN@:@7=$#U3.7n'd %S9A= mW5B4Q>a@"?m^8%kI0N#¥4B B?en@>@EifH #TO80ȿB eg@P@u6vBS=snQҿȀ@O6B!q;??6T@ӽlOξ)Un\r4?wWG!fB L@ #@pX==q% ?- ~[A¿ 꾪Ւ%B )@>¿:gA ?[>uVPwB pDž?҉ <*0h?sX?ͫԾme$AEIԮ? >)8ג^BO\? ,T7gh>ǔTA \B? ?L"d翫T7>bH hۿ6O0A ()2?<{" Iy*e?Yf;7DCAݗەˠ?$>jI;-{ojFc>Q>ƅ>1AG> >Ǿ,#n;)-Me9j͠A 8 iſ#j\IC<`!A6 d>?;??|{տM1|  `ޜAOHd3 >K`C־a:>tAvK=@?iPV%IrľWgJ:_? >1oA0t>?W?O)k~_WP >Y>3?D? B.oPƾ鍾I#,󆿊[=߿ οt>_s1WԿܾڿ >QD%B^)@q?J߿'w/>־?U"hiB\@U/ǟ%?V!7H'?>\?ɿBWF@Ӿpܦw%(? s>(>?BSnA?6?w6Gu?2?e?}BK@?N;>|!|$iފ8D*=.`u?IBFXA ?虸,B><ؾ.6K!琾ER?NޙBCDA#@-b3G>ItJdMIh`F~?aힿ/fBAv#A[@"rE> Gӣȿ!>v>XB?bA a@4 ہ.$3Hޮ1 :1= s.B?bA\i@=KL'v=7H¿ξ#5z=?>+H)B=Aƨ@:7[0}eVnȿ7ɗ ;1B<OA @5Ods(PW\\aUg P\ZxB!AR@YqxTξn's󬕾&/*p>,%} B@A@- H .4CmBYBBEB'A!@^GoɿAnо^1>gο`BLA?D;|?7M\>r$I>K?dgBRM6@YŷG #!1>b?PmւTBY@d3c?tH :>?єBa@F0`/7?mDCD>?' W?j׿BcҊ@Z63}B>lr|K6|y=ŌK?Q #Be@UyHT >OcH??S+ ?^CBf@vcR(~/@%J?;dPIMBm'@Sd[pz%#?[9j Bpi@_; 򿸋ɿ􁾰gƿ?%@h! QKBq@]@#qmʿVm>Oſf?bV$n촾'Brh@JǭXgf*>*d?#&wǾž.qBq@ :v>al^ݾlz$I7 9`ܿ&E$Bo?Hex?4BU><&3 "-f%#Ŀ UBlu=?= \<-[c>Tdn~!+8"C@֜Bku.@2Q|>Nr?yr?9o0yϿD#ξn%Be$q@* > > DS9r߿CXB`@@cݽ>?@r>Կ} :3;BS$@V.Ǣ6\ ?sDȊ NM!]3BG@d"M m?MQ}B.B@=rB$?)ƿ.XlX(ߤ?Qn>/B$ @UAe?ui52^Hs+2p-νyAYƜB@:'D@:=zyO'Z4I?ziBS@3@'Gys}mx/ <_˰+A|B (@\%@?ĻWWH*~I+ BS?Ѱ@A$?is[ꏽt>x<>S A*?>Zo@.>tssF.M?(!OHVA8/{@kV= =߆f'_j9 ^sE>Q UfA۱!8@H/=KDA|y [D&) j=(A ڼ@@?4?h?NNG?B߿D>w? iA.@??lq??r?_'riWAQ,>xIA>F#?R?ÝTr [zJ1*?kAm?n?TOw?};vc(Q!>ؿB6 Acq @ b?DI?4㿾 Dݝ̇KU>ya>cAhCwdp?!A?45>KP>;A>?ȋqr@9P<ёF=ʔ벾3 A;MWB@#o>H8??`{=-Da.\>j2A{&>mKg@ 8!?c@=Psտq{>8-U\AV>>{<>TA9f ?+:@@ae ň?A?d?j@?B;}>VɊA"\?z@ @D?aɿ3n0?>?Է>p&)pEl`¾IA)?Z@@͓?Lbg?F`?:O,2?%_>dH<!A!@#@,@?z='=)?>C2/!>XoA ,?_I@ @Ki?›=O?gF?N~l>g>sA*? @ ?1?#?mqrZ>=ws Sn@"X?mI@}WI@y3ܷ+?]V>b!@i?z@g-@@D?I?w>vJ=ܪ> T?>0>>S@?qs@9t@/>T$=:A>w\>NTW;57\Ǯs?&>TƗ @C@ @@&??wZQ?>> ^I@f-֭@2b@ % B8<>Х?F*kCN>$s8@b'?'@?]??x+L>w? >-@y@c@D@W?J?}H??"=@P=uH@ =?v@e۬?H?S?с?\b>8`4>$^1o@>*~@*@_??/0 ?V=abǂ=v?? @~P@h)?@V@7T?H?;R??w)> ?Do@J?4??Zk>b?I?j?"OO>g>-O@ZGLE@ '?±>ϘX>S?(?>%l>ƾ龆K>@tu_}@S??o?Ĉ>yO?>?7=qxp9;@1@@!E@?$ ?_T>gOp5?I%d>T4@Hk@'ud@@?Ks< #Vw??eJZ@ȟW?n=]?%AE X>wѝFu$R>}-epocketsphinx-5prealpha/test/data/tidigits/man.ah.588zza.mfc0000664000175000017500000002652012771605033021021 00000000000000 S@ d?qm?{]U?8+Q N0Ϳq>`@ƿ6u<7?:F>C?5?Gu%$c·mD@O#?G2?hu??W?) 2>5ʾ@`PE?Bտ?!y:!?̃?WP̾#@=>@<\"?SZʿ=@Z?{?q~>Z?J>P?+?bDM9u>?i?+?eO>bJ@[#5?К꽔Ȋs!>;?ta=VP0?vھV>H@Y|>ؿ0>Z%|8~G?">fX?AR>iɼ@OsC@>?>G6?z>?px?e/ ޯ?%QL̽#@t#jx>J>J>m@ L<#R??A4Tq<@'>>k<mȾPK>F>)`+># >d߽c 9._@~Dj?JOI,\#`=D2l\?>3P軽|7sj?4>C=gl?'=>=8 |@bYǿ-݌8l41K>p+?r?f>Wv?8>7z;E@0E=D>>f^;>-辎Q>-P>a? |<>.3#@f?aH??h¾!=?T?>&d|?W @Q:?~[?ygYpҶ?ĨQ?grH?ֹc> *=? L>+?mid?tH?Q==>A@O?C?9>.>7&?ő?Z}z>FT6>{>P@oY8?? z g^ֿh>-@IL?dh?;z@|;?:?i>ƿ4p?!@1iV=:P>\)<@o >?hpԾ>t&>z>᳾׸>)@Vtee>m̿׬I#k?,R5>?]Ab00Q%?_?п`(U3(?sgK? ۃ>=I A;x%jw+?>ޣ@̱N>]A8ܿ{E?Uh\ӮcJ>AٿY%пUz/׽˔ ^?>q>Ծ狾Q-ZB =OV>kT{?ƾW?@M?A=w>tB@# ?t>Ś=-fs?b>=|BB @zK8; I $KS?'Ok>\??F{އBN@j=?jUy?Q?(]?,QQ3 ?v? =Sq\]ABV@o TEf?%ֿd?<῅*?d>cWvOI/BTk@pgx7+;? XBh?YnK?.4C=dJBRM@v_=k~?'|f@d?f+X%?=;_%>BS@R6!'R? 7@?BT@0#7 [н?J[yh?AbN?iOy ? BWI@L@=1?ѿM?FɾӁ~?虾刔k?'`zBYF?#t??/6?!?!WB[?ܿǿPq??ۿp??}>E?jih?/Be=PSjeDtOs@'>՜??JBaw?+Xi:%?eٮփ?m$B_e?l%X Ϳ ?@>_?ERE?6PB]C?"@տ=¿z#?pJ&yI@ ߩ? ?aɀ?p_BV#? {:,M@??ufL $g?(cBQd@'5#=S}}?2>ZQ&`L?t3>;0?@n>Q?RLKB5C@<ֿ~? ?NB2k>0;Ο?l??I1p?0B$@P ?z?|]`{?E|?bv>B]@-[<8?7.? QV>f?AmK =b B$@>>j?Cl?F>)a;MQ?%1>?a|ra{=PJB @,>ڸ?O?o˿kZ?+?f*>AմB*@sR>p?*V?@˩ e!=^n>>_ul>)B7@RK? !=^h_t>9#>ǣ1?V=x&F>BA;@+^(?Mn ^m ??+Q>&>?2>rnBJ{?*>?Y_N"p}?},?8 {>GZ=Sɽ>.BK.]?@M>?]/:?]>?>B>>c>BBLn?^){,?m\D\R@ ->u>+>?2?8"^BL^?\Ҿ9? suK3u'@ ?>s&>t?7"S?NUоj\BS= HQ, >~? 3?FKɽBP >n;1>=?M yBK?US>@#^LITW?Ӿz>? c? BK? Nn?M@6S`TNF(?EBN.?"?$ ?ZBK!=R?k@G`U=!8?kp???Fz?6XTBMhJ?n@cNXc"iY4-?%?yIr?"j#?#BC9>QT?%@>~n.g G?ב|??>?aDqB?>c?[@>%`?qjN?KG>x?AT]އB9O> ?׺@MY_0e[?z?e*>2e?.W/PB0+?K?%[@>nּk@?e!x?p>=V8?'FBu?*H?1@nC.la?6>7=>0LA㩰@}@}AG]#c>0ƾy(A<@@Rn@ώ̿e;"D>0w2=P>->^MA@@=@ٿف)񵿷п`*.Af>^<=|Aҙe@@t)@خ|D^gVB @gmS@O6@'ِHX[ !?xE&<[>sB)1@?@?ZHB>ެ=W?z oB9B+?O?[@:mtj?k?Xal?ooᾜB?Zw?8l?;@h\&?qR?=d?MɾBCja?@},Q ;!?fF?:Y6?N ]!BA*x@"@}3z|w7m>n?D*9?>?_bXBA۾`b@K'@dʎlbC0NP?->:I?z ? ?CQ'hBB$@A@_XLG6?Bj?^w>ܷ?]inBCw쾕?@:@^]DnX{(?h?>Օ?L¿BF^@ @xN%O`?vE ?>qr?lBDFѿS@\?@~LdIM?]?0=?/ pBD{z@,|@bCTi~Wݿ!?7п?n>-[|?! ynBF{zG@w9@7:L,X\?x p?p? C@BFiĿ7-@/_\@6HU5>>柿b?н?BEE:n@W@`5d聿gc>p"?a~>BC+@j@.7^x}=C#@:?uxl8>?=B>ếs@5@AC}(>1J?>>#=B8꿛<@@<=7SCp=O?X/>*=/B.԰(@N@Oy?%===eEyB [=L@@m@BC? %|>e=>A02@@c'@ܾi˿y^=N}=) ?8A*@A@K?uTH seHH"تtdĿ(A8@LI@@@>^g%oǿRnlW1Ҿ A2?wW@߽@1\@,Xi)>ȟ4?=ğľ> |e@o?@j@hv@> r>^O?6٫4W&4;;}3Z1@">K @|w@AF?x=>?Q̽ԩ>Z/+*;-@p.k@@ ?˛?d?7?Bc>?De[vJ?$ @ V@ce?H(?v?Yn8>+>7>Y>-iϽ\? @Q2@p>? ? Z>7t(=>?!43ki@ng}]@ =IeC?h?5 >޻=99>jK=!=oA7NB7ٿ6PȄž}$YMۢSA>رI>Uj(i`=AX%!Tf?)?|Szr8?F?ߢ>I>V?'LA+߉@&X?rn>}>䁤?`>?ΡM?E0xAY@̦3?@"?,Ycm?>?f>y>w)&A/@@,@pE?I8?===nY<𾾘umA@@g@r$I?l.!a?>j>=FɄʿ\PAԔru9A A@"@ =@Cb?x{=5^4ȚA B % GAe@Luc>|s<:h=˯? XY&B [@|@{V܃I7C"pV=!<{ >ZfBB*E@@ZmG.?0V]ο?g!==]pB)h]`@]@C$AݿدI9>gIU?hU#>B1D>Sz@R@#0R f: kgI?f>4AB5Q?Ÿ@ @1ֿ|>p۾6?T5{>3B:W?a?{@(&ӿ4>Z"YK?v3BBl @=@Y~ (?(p=掾|g?:BBR@:hqv@26=B?>o17B?O (BCnO@X#-@"*>LBP1 l?3z>S4lH)?쐿wBBY@t }?s? 󁿵b?ʀ>nྍ߾?S:'BA@q? ? _BР?E{?!kIM?%BB@=6?09?'S??7u`?GBB8@7XE@?]?*]ڿ"Á ? >tF=#8?7DZ BB@*Rr?lB>s῭O6?>>P>Ȕྴ?:BB @s@=#C9?ec3g?b=ZՉ?.QvtBC4 @ox@ Q˿v?5qN?|:?#Cf]ZBCRa@Mc;n@|6B>i98?Nj`>qI(BC'@s@&s@ amٳ2]?V*C>ߧ@"BDK@j1?stV}愿$}@+˝>S7`XBE#@2Kx=?ud1fۿ{A@ f.ue=`BDݙ@[>X?P ÿŶYS}2@/D+ýa>mBB-@%?J?3/.@Qkn@#XS~>@BAD0?I?[?avBYYD&A'L@ =g>RB>Fp?;??~[P h_?,7+u@c$d:<̾?rB:=@ !M??f3tֳ2FFF qFJ@ u&+?-B3~@m@ ?/M`>wT30@yыNZ?CB*>@#|@!K@[S>ts @&b"bo@ H?nBb@@pH@ ˿_M7>y o@GH?}@ =y?fIB?@L?=x>EN]0nU<3)@tk%>?;MyBܾs@(?W\?Ka?ּ_h?X?pP˾>5!A8;9CAB@2|?b? uL>>N?N7?o}jAHADA$x@[Þ?>C!vN>k󽉵==S+>\L?9AAKv@d$E@ &?0Zt[̾ӒVk?¿@^?>A۽TA@w_>7?ܽ,>Mο072Y>E?1FA3 HA6;@?7><?YN"~>K'??vA:A c@Dlڿ-/#(?*<>o/?BjV@U@a$yо/d< ?C-$?<@`R@޿`%vcV)>v$?\B p>g ?x5B6)>m&> @0líkŵ'>8O>g˿y>H?]֐B<?40@A I^ȾN=\c>`v[>?F)B@? F@菿o]H>5>8B>ӑ>KBBS?w @SRbFu>h=U>Y?>YBB?) @_ޚ?>OMI>po?9'>\I7B@?@C @l2O?ށ>~%"?0uHTB<@Y.Q:@GQ3?T+>T=tei?kB<_@`(p.^x@ve΄{?tU>$$j4?B=:@o)@T >P/KGm?E?R{J"1?(B<*@ξA%@1p?=:QaF>?wuʀR?!kARB7@vlVxg@?rl-G>*? {?Pf B6f@yoX@ 4?;6O;U>?Û)KG?gB2z@)9f\?G?n`Tr>0?M~?MhB2@g ??IR01h>~<,?,\? \kB2@̚Bx3?W ?(ڿ-4q>-?v$<%s4?dש5B5q@8y?Kd>fA>=z,?B%>ӿKK?MLAB3@F?I[jR?>?!ߣ>bj(J>q>hD?-8KIBFVB0M@ x^`X?{|Wd>mt>?ܛ\eY p]B4T@yϳ=EUiHn?S> `z B0k@|DUg%9GC!wl?PQ>=4d7B)@E9Hٳʡ.~`>X@?p!#Ӎ*4;)?w ?68ЊB#\@"uwQ>?Cؼ]?޹?Y~+ſ,BG@BǾZ$Ad[9?T?=u>}??:m޿9Bp@?=A\cO> ?h&>ㅾ? 7XBSMA~>NMMj-?,?s<2.sz?ҿBڎ@+?; M#<;َ?W?g{2Q&q ?$&cA^eAL>86GM1 Ne.9H>mj>I?o>=)k8羨}CA݁@k=]?1:#[?;?˾>Q0нE! Ŀ?mUNyA@ޠT@:?A X?]=>?Oj>u75A@yT? ?H?Æ?Ѕ?]?C!5>=*PJ= @vA@"t?6?*>*#??;?B= G>YiA80@-%~>?$?e;?;?]q?>hܿ\>h:AI@@C\һ>FJ@1>n?QA>cоXԕ>5WA<@ =XgvF8?@?8S>?/߾^,:l1A7@ J9"׿ԯ>? n>3AsQE?-V%覾ަ>ᾈ:n>+Їh`>]eAq+rnV:*'-?V\|epz SӾ+@p>nA?5&1t5dտπS>x]A09ȿkҽ1ԭ>ߘAk(Z.@y@?tTbMQ>DPrAX[Zoy3N@0>>`>IL==#'AP6?-濒+ɝ0AO俶aX) ?axF>Jh>tP>?%b+=!AR?bK??a??<1FfF>Ac<H|@A?(:%晾>=]3Q/¾XAPYplpaE@6z?XH ?FnTZRֿU>\i0>LAiٶ>m ,@?p@~;&.=JYfD6[ܿoZ?iAg vك?]۾]?IQƾÒ?> >AVPClE@d?&>V q?tſ7;g <A>-_@m?rOge3Pt?ge0UmԿ;:LA8^[I-?́=:必]ؿmnl=>ra6{z>{sAEQZTs@?n2ֿхo#?$wF ; ܃^A$>F>>C?@v!ZiٺP>VA j=2?4?#C,Qu<9@-TؿEBNw>6>02 A,w4>??ֿaֿ~NI<>4yͿfFY'IC>ݝeA). =;?~? JO9x&4K/ѿ-=8?JAA3?aw3>]>0R*!=2h=>/AGꛢ`?1?5ȤQN\eֿl+;p]7em= @6L{??w>W=w?E>F\ڿ~W$>Pr?4A,#K_? >qJؿ 7>j>{ztVFfj?S@-:S>fb>u>s1>M?Xgr>W?BA2?.=k[/C'—>pqA !Iإ?#?69?1Fr*̼z?Y Jm# >A 1??&ksOq> >Q=ֿ?, pocketsphinx-5prealpha/test/data/tidigits/man.ah.9b.mfc0000664000175000017500000001236012771605033020257 00000000000000;@Yf?>t6?# ǀ?" ?+&Oju?XfVq@8&?ݾ8NZ[?e=gl & F>sa@XaU? F?$E=8/PξW>#>=͍@3?$zZ=ۍ>?΄C>C>X=@NAh u ?M9@`?M87?/*u@%2(7?͑?HZ>>8e9''?Q_NI8TGd? @vgd>vLpg\">p?>>.>ǜ>AHԿ2?ĻͿ?E. ?0U?뿂6Ӗ 绂?_"?c`j?[A p&οα>o?Z>*fC??c?g@@lQ{>Z>Z??"45 /]????rr?T =@?L'?H|0=G?? WUy6=?r@(O@->t:>>8???>>7?iG@}>^UZ?=?X>.>FxSb= ?J??(:>> @U7>V GK?`*?]>=?n?n>Msn??P,?Bf@F$ ??>;ŸBs待t>@>??>È0@w k?z-?lk>i辚={=?u'?v?> "=&W>8@HKw?>*>޿5>͓>??H8a?G?DJ?wl?4q@k?/@⸾<䍿>Gm?=?6P?!=<>Y@}6Ev?L>Ɲ?5),bS=4<\?_?c?2i?<'>lg@9$>_??[?q,? c?=s??tcMi>e=RA@w>x:?E?⩪?>y>V%0KT>۾cw >c@<?K L?O?Rc?.Ⱦ`>K?տ5054D@ཿ@?%@8 U?.s=Q>|=G?Oܾ)(>R.A RS#@YJ@ O?/Y?3?]Jo)+$>hA뾱MC@t)w@}@y?>s?wWU;6?H?AG@ c@q@dB?>U?gG`>LO|<>XwAHK@ԗ@@}C?[DBa>_蚿޿B=2= >RA@¦3?}@?C4rn|08:?KzF?i[B[@@E2?+?n26-6W61;L?VyB@@\?ُ?is"`W~ľ=ᅴLpUf?R^Bg@8@@ W??mU޿t)º)=KGsj\?B@Ԗ@cF>1?X> UG?~B+@e?ImX+޿Zd#@<?|wi=) +y'B/@o"??2s񿬎tR7'@u@ > _4tXB/@`!?̫h{aW< D@ۻ?KѿjwqM\+B3 {@ cMB-`@ln>2%K>z}?a?V ~% ‹0B. @ ҥTJ?^| ?<@/cBoAf4 B+f@vK: tqpY?+?Z?ǧ?Ԍ*)7-B,K@_ʉ>U?կi>]{كLB1+(@ ?\ DRŘ>࿝:?*?̺>AeA B2u@d?)濹 >6A~?8K?ѩ玾\8q |B6@p ¾DK >?-?r@KAſC64~`B7W@^! پOQ1I .?a?ϑ@eL AB@{'@XR]x>P>Fۻ?~?s2D$BGU@|2TJH$W@@m?&`VBIlm?֨( ә- @$? Yk,ʿ BB\g?m?J>+rU@!{?¿Ma_9GB`j?i#8}@1'>ЀQ[K<95jB7`&??/mD?{kJš@3>*Q B]a>IPeB1۠@,~?%Ac? ,KU@$}>'r}V?g{eeB3W??c?)TeHǿX@Dx'=?C:iֱB0?@?+?9bxP"P@ONVj>HA? Xr B*4@ Zj?Si@q/@?Ͽ,$>i(>链,B@X?!&@#?v<%?C2{I>%0Z?B.@i?٣@aP6?%-V~>k=:?FLB#@1?8AW@N?8 ?y@s(?|^E%"h ?OAs=@??O@XO?N>Ԟ?j>p?dA @>?^@n?zH{jʇ?%FE>vb?i1pAL@v?o`@'?RxT?ӻ*E>I?\AU@C?&@[y?G4FPϿ e?f >>=6?>bA%@$y@**??ƖPCVkǣ,?,r>k=JI=>փAA7@@O ?񿓰]eƒ?w?Y`= 9AuA;@@@$@ oa ȅ?? >ZT>AJA3g@0@xsp@]> ?&#>G@D񾛖Aw@[@J@u?[3ĿS9?9>3߾6O>AAG@P@u@3?E>k>jӏ,O?*A&9@|@@@\?|?G7ڗ>%>>UA@@u;v@v@w@?G>+ &S?༇a1`>FD>A >^@U D@N@F?Sm4?5}>%^?G=2*Ci޿i`%>TT/ᾯ<&ɲ=!@˦Z??}?D>R? ;,=g>]@3 ?̵?T?uI>rٿ ;?> =o,@Y{?R0??H>}xU:z?4Ga}yy@dd?@L?~>}=3@?JxxҿNH?8H@>BO??0=G!ۅl>J?F>>p@ǿ@ ??N5<Џ>ե+9Ѿj?&aa>X&@ѱbN;?˹? þݿ:M<>=ػ5> a{_Ad@?i>E> ⿌w?Mk?#>H>þ@J[@?Kv)Zǿ5 ?vԭ>*_>S>->*P>d-@(A@@B?SI=`s(?9*?>ҿGڿ=j@FG3?~?+=i/> >R?7Ǽ,hd۾(!>J@kZ>M%xfZ >@^o 羬~1#m}=J@6R>uZ?";*?1lA4Yd w>L[?Z ?{?m? ].?f>#>R:Pտ{oTu@}zt/?H?x=-u>>&>A?0>El_>? )@O(z?Δ=WG>͚nw5G?_=,u@ym>D?9>3w>Vsྔ@7>.>Mo?b>#pocketsphinx-5prealpha/test/data/tidigits/woman.ak.75a.mfc0000664000175000017500000002263012771605033020713 00000000000000 e>^3>??tn>1z??N??6p??}E>?1>9qkW@Z?Y?f龛 4? ?a"?>(??E m?{irN >H?,??)ZA෿<=>M$]>M$??A~?N=Hÿoí>?L6?L'>x;?/>0?g0i`T?=(>+ •>h2=Kb?Y?ۤ?#>Ϳ`a!@7?W?m??>3?ӧ(?e:}>>8J?!d^:a?n8?"?(,?$p>$(漧޳@ _?PЛ>ϻr)/h?X9> 4`?D{?C(? >3>rQy?_>=1}8@h?^ȼ/=e}???$ ?mF.rV>n?{ Z??6>XZ=>Z??uH=PZ ?;p?$؊=>?">84>V_;8? ?V??׌?#? ?I7?&>|?YU?Ko>7jqh/q@?tY?=O ?.w??a?NK?>m?s>i%>vE=_`=V?ZF?}SV<3?y>@?ja?9>i>>ȋ>SY?2C? ޟ?@X@ 1??`u?pu?b?ah???kG?!>>x@0C??V?K>|.?C'?\?7*??hSh>=CQ֝?龚>?ꮼ~><\??*?[eĤ_Еr?}?c=дM2 ?C?Dxܾ>a7>TjE( ?qN?h(?>*">C?<?Wj>,?f>Č ?N!`#@C ?(\+f&? !?W@?)`?wrn>{Ŀ ??sr?02?`+>:rZ=Nrs?t ?>@> >`5?/9R>g?/>f>?C(?U?d?7?*E?<^>^8cV >ݦi?y>_^=^?4_?E?ʏ?-`<S>6L>^ >v?LԽgUnD?>==1?IM=!>N;t L>w?? ?QS?T?/T->3i>oiAj'e>{l?>&sT==ӆ>g=>AZOw> ?̳>U6ɾrm4:/_>Aw&vf?ǤWH;-!<6= ʿk?KT> >SA9+@A8?/yZoTn(l>_B>mg?0A:^=@ u>DM ._T-?o?i[>O?-+AaQ>@Us)=oIuED>? ?^>9??f?J?n>+3???E?y?N?\)?%xN=z?ݍ@(mC?XS?.3x?? ?p??Kl0>'X7>?BF?˅>HF>> >>eQ?BY?Ͼh<>T@!4>R?ȿ?=I]?ݻ?ltf?E?5K>V)t>g/9?f,?)o¿%%r?X?!?:???>ǦC>Ȋ-?Y?1QO?e>I? *?_+? B=8?9>O>>>]>-pU?>??h ??kV?D; ?0=?w?T۽Bv.&Az=͋߁<4? i@IՅ?> vM@y?(f}?}jl?ڿ]Q>"gAY;@6{-?yD` ?_俥y>W19H? |AFZ|G@(>v{/uW?gU'?=9E K A˿ۢ9 )tnU;M8m=ٜcX>fkBOro#aӾ 7u&H=>>nA ? P rpf=IG,ze(?C_v>2Ao=?۽J8=28*ȿ!g|jfuzXp/ 0ZX4\?2m?apu> A͘u?R\< Vʲ?=/>rt?t?4?d*A]0 cx>>ѿP_S=%xS>)!?+6AN???F> N> u?Q?;ՄAp !)>^?>g@>uE?c7 ?>t?t{ٻ?B &Aܞ-::[#B>?9?:EW?9J9Q>ښBRA |<.u&?4D=[?M?[iX >>'?rB<0<[ p*&76ހ>J>%6>?n>n?vB/Q뾻?޿a@y>N/M=c?=]|I=̩Bgԫ,*~ܯnʾϿR 8>EXr+7BtO!Sȿ:]c>sKMANJ^16zPBFAN58t1YBnZ 6_6 >|>Έ®,=~vtuP^B m:jY>>۽ =凿t0B T%> >5pǭX P dVB=!=o?g>$HԽTR-_:nB&=le Y9f>C>nXG0BgWwBt؇?āV}pY >C+c` k9oBPE@sA?y CgByz>V +>lbB;U@@%?9!~^M8iR?n]B4h@<ڿ.>?ƣ߾j]/66ɿJ$?$:B1o@"&?T꒍ZN K-hӃ>aZ= B4?~@̾yBlпɿvnX?B=?ؿߦ@BsjŇ2KܿWM>#[F^BMp?&?jEE!K" z>̂?Nп 'B_+?Ӎa?Bw{Q5%>OX`}ʿCqBh?VSM%>>iOm?IZʿ4Ͼ7#7` 9.bBd\?էK?Qk9ۊ_-ʄY8xvֿ`4+ٿ rB4,@ջ("N-@Vk S1?q 9 >u %jJB3N@Pj@J<EJkw*?-J1>v:lCOB4!Q@ɦ`@AqQ=ozO?! [r?+\0;tgB2lp@/!@K <|f?WF`?"I$%(B1.@Pv? *h@[!<#_Ppu?'XEwJ=x㺠B,%@?v@f89Oxh?Y;H>!B&VAo?7@RW叀EL~?4 L >T꿩yBAZ@@ @0x%7KIk@\d*ÿB{A0@Z\o@?9)vqyLhl?ƥ|P 4Pa<#6BNA%[@F@P(i9IaF3>^&Az"B `@Үs@1c@Y2454#VzEB}XaR A(@)@V3@9?`ۿR(տa3>=4տgpAR@/@` ?{ʺA g@ᾛ6p>eA7/n?mGK%AfuV<?g=f-=О(ӱ4<{u6?9c N0AƁ(-{[=7n> q>_cA Ћ?7V% ,>,>ҟ FuWB'+@L ?MH=<Э? (>7G>R&>x B \m>*$>A>ɗt(= <=> ҽB34@: JDֿ?(Pn ɿИLW>k"//!>oBBvr= Gy]Կx4>ʱ>mO:=pkBzu~]P<.?>leQBq0;F.Q1|>k?90KK̸>Bm8$4+Vn#=t$i?%tNA)>vyBJT&ܭ7BoΙJm>c4NEBz70H & ]>Ű=¾ l'B8:vD)>@ T =>̿9ȾuBIK_7>kf/r!>п˭ =EhBA/>? c>GB0? ' >_ B} qS=!?]o??HC?JwBV* n^R?`>4ki?Mu7g?-mBy ?H>A .?]Ɖϝ?.BSyAS?Q?=ȼy?Žx&K ?C3B~3So?b>ڕiȡ?8lk4.?h2BJD#x ?$?Ր(`F?,L<6 ?i>{B??HÍʿR9?B Hם?|߿jsB'TCi,D?? w݊A?( 4?^1d}B+كժ?θ?+&Ӿ^P?4Kݾb?a\AB#m)!??Z?'y4?VTFs?BV)#?a?4!4?NH o>@?c~78BHdN%F6v??(Eリ(ٿI?W)A m=[r4?B?miϿfOB~[[?x>n=FP!> ->??!mIB{ZzՆf&?Y>>ؿȁ>->,6?gDw\Bu Z>mD?`=>==>?0+xMBum bPC?*>L?㜿X;?M-'e?d?wƃBrp敌 M[<+w?6[(4?$)?.W*0BsN9$ἾǥQ\BsiNa3LS?տUz.F%\?G:>MBsX"`蒿4Q(@ }v`%,>k?~>*wl,Bp=Q XOٿaE@RJ19ʁ1>…2Bn7#2%@`$mA>~+[Bjݕ$twf->U[@ ڽP_> LʾBcοAtlڿp?zE w+>ý.ԯBU[?7(=KJ*\?wh}_>ݡ">+վ B9@jn ?Hʺ3:?}ɿ  >ܿ =%=%Bm@c@p=̢v27L$">8vvᾳ?]Ͽ!A@v@)?$? 2˧# W<{Hޮ A˫@@@/ ?]Ahmr5L /KA?g@J@Kwq?HB~,2*_)VMl !CAPZi{M@/b?T׿{³}=r\nA48䠣/[0>bTe>Cܿ!AIw=>d)ɄA ˌ@?j G`־_hm_T>+dUAZ2_جCn㽓XPcK>S EA  }:?"'bο)^羯]'ͧ*?w?y7>r3b%AC9`,94EeokXTdUw?-x3FAݎ_-nMLȿtn;o˾ŴAݿ 8?j>>=mAwTq>guN^6?[Be5p_6/,>>%tA}~^?<ߞ!?s9?ўis> ?Ul?Op?x15AizWeisO=W o:>gjQ}z> VS?6h??A1'/LG>0=:PA>y?Jzs\??P)?*@z{?3>>?> FA'E̾@=}?3-Crľ3ߠ 9>?&&b@?2u@B?<3悪&C)@A 12W>L>`@J<@*?N'm>ME>7>":<\?"@@k+?=0>%h+gW>ొ>\ [׾H##>V?7+yY?n\>(?,I>=jrwȃ>D4q~l?̇Z9?/>_?{߾ŋ?Xyx>]>с]y?>Ȥ@Z<-?yǶN?3>>o@?}(>_Hգ&? ?*@s?>=?X@I@8>8y1Ǿ?)?@ks=@t?xH?Gq忁$`\w!O?f0Q@"[ax?3??AE׿+n>2q'ZYq3f?\ ?ч3?O?޾q?U@4J>s ???%L? ˀ?ȃ?.)K<?M?3S>Y>3%.=hvl? X3? =<?x2l,>B"#QA>; ??y?9V>B_>;?eN>a? ?A<#L 4<@$¶>>3>f>9R==mj >'0?{׽?VR}^@$A?(T=>+&?M p=QH>=?LH??'?@>|z?>>]??>3>8B==E"*|?uA? >Ux)>>҅? `=.?l>,K>S=|=Gz? 徫{ȿ澾>㾠>F>&H:Z=O?HFI?oU>b='ֶ>ݫϽp>2?Xj?UQ%?K0?UQi?.'?y>C>?}l-*?MbP?y:?,{?Ч?%p> =J{T ?>?,?,>ھԖU;h=@k?VK?lپh^?_m=??C@>r_)?0Zv?/?`?->O?mQO>!>})?1RJ>>?7>ӿ `>>03?)i?Re4g>wI>˫?ͥG?>>Ė>s>wa@ >E6p>9H?`_?Ix?`? ?F?N?#>i?aW?12>_7lv>I?Y">vi>3? ><>^?=ױw>5>P0L)?Ph>N='UB>0Qpocketsphinx-5prealpha/test/data/tidigits/tidigits.ctl0000664000175000017500000000064012771605033020437 00000000000000man.ah.111a man.ah.1b man.ah.2934za man.ah.35oa man.ah.3oa man.ah.4625a man.ah.588zza man.ah.63a man.ah.6o838a man.ah.75913a man.ah.844o1a man.ah.8b man.ah.9b man.ah.o789a man.ah.z4548a man.ah.zb woman.ak.1b woman.ak.276317oa woman.ak.334a woman.ak.3z3z9a woman.ak.48z66zza woman.ak.532a woman.ak.5z874a woman.ak.6728za woman.ak.75a woman.ak.84983a woman.ak.8a woman.ak.99731a woman.ak.o69a woman.ak.ooa woman.ak.za pocketsphinx-5prealpha/test/data/tidigits/woman.ak.48z66zza.mfc0000664000175000017500000005276012771605033021654 00000000000000{?h Zd=*/RH_]C???+1?fu?L>v$@z+v?7Žrrt?,?(6?>0@;?ÿ7r}M?l ?P+?F?f@G<>J>X\̿JT> t>⽹ܼ&>$@D> ?ٿ?$fO?f?C>=?V\?_^w> >|>>AH? t? >;&TW???SF>$=í 26?/M=7>?)8?L?R?Gֽ鸩>ğ="&N>K?>e5H?'1*?T??ξc=6_=d?N ?׽;{?H?>t.>S?e ?/i?o9?,.?9` A`M.7?\Ko>7ND[?y|>?pڙ?t?Q?9 .>Vs= >-=K?82>`I??Jֺ>>g־8R?'?5 ?$x?G ?پ2 ,/5HF(538ad>?=Q!-žQ@Mu=B8lX?,?ID T@!)?1?m?U[,5WJ?}F>t{?#˘=/Ǽ8?|H^>=+>?8?v4>5?Sb$>,>˾ХQ `>KXO@7a>qk???f?>?>Đg?i=?)=W>K|> h?>D $%>JB}?;HZ?>iNo=vy>=1? SREx?r(>*S+?SbA1?5?r ?l޿GON]?&Z>'hM>]&=+̩?Oss@!?3+$⿴ep&>J?U?= >SI=2?BlǢ?*n>ƽ`>L ?JP=/>NA@lj?%??8u:)>$UxDY=n#u>@G>;,?@?<eA?$?;$?&/=R ?o3^>5W]?"R?lXAE*5h>໿u1" =lk'>׶fm=$AQ25?~h\?T>.z0#TO?Wxྵb=v> @Zx@Z?!H=[G=F<>zyǿ X>c>u(?#?*@п.O>zزpp$? mA%Zx={[ͿFw9vV7=`[">@OW>[?\?աT>C>?]P1Ϳ2j,>°A:{`a0d3 ȹ*㲿xZ>[>u5A?77]#E{;M8?0I?w,)y/0LA@WWˌvyMYvi> x@'@M5?w5fvAp"s2ɀ;.P4M?[??'j~zMDA hֿC'??MY>NdB46`@@T@YпS g*=)=9=Ԩ׾<뾆1 BY@ >A;}տ${unƿr QĔB?kjCA;þ?;{hG)BSr@ֿױU{g>H/"ܿjm9*Jh'f)yq >Iؒ)BPA `"EAr~?E?}㢿! 5η;6=%U. BKG A'af v^gL?F }NA,{ BHwAV^ÝԤ;?l&-ǿ@gpb:;BK6AYj?t14#>BF=A-˿׾CԾ?H]Rj-IC~ NEip !BJ5A {ƛ4\q?]?ѿ%쿬Zȷ>7 BIA8Ӿx3 5?-;?NHĿ̿~>t9BIAe[GoY>ž?s9>tAD06BLYAW39?`#?i,D$AmBǿz>XmBKS@ٞF~P+">6e{hZ BLBP@-eE1Ȩ+ӾFiZ[Ri#BX @,F^x>'>]Ŀt?˿ҽVA B_r@zk&woG?%iB"?;5 DBdA@9 aMV-8޿p/CڿH? p4G(NlBe@(@;{PL>_ݾi4=!t@$RBe/@4evt(S:F$Ǣ%sW|qF}Bj?@-HmpPE羿؉D|V>l,($GOV[䳿$Bm;@3e0^>EI|?ةqt#ƾ0Bj?K2^O?F87Ċo.kdh]Bk ?|&PcB?N;R);`Bk?+ƪj" ,?iӱT߿J pKeBXO¾;9 &L@!X}̼mB2k?xJZ@R?uh>#>{$iYA@ eٺoawظ@@H Ϳ??^AN@ `\/X>@@'I=܂?ν?WA0D?i`VNj}? ˮ@"@Z?'4%>c?z}?{@}F(ZB_M%?>xPQ?!?L@V=&D>^#)¿D?]@ ?X]?F?hm>2"?;?,(&XB?q;?ya=>8A+=нp>}?U>'?t3?q1\ ?>=9J<ΰr?e>??{I?pz?}v:g%=m!?Ay>9x>ҋ=*@++?*?3?z#?@>C?#X??Oṳi;9b?ξ宿ޢ/\>ˇB$>OED>1T@OLj7㐿}Nk# ?l B4߾'>H쾸hiܿes0>mN ^z23B>k -#tؿ^?{V #)_q?oC?,>BKӎ'EN6K@*'N' /ҿ_o+?R}B<ȠJw_\\?¾)/$_ſ*>,B ,<4h?ƿ5ѾٺS.཰B/*%?/<hw5=\P=Bj0 LM1Α?u=kAk Sb<.BŅj?ݿ_ȩO?>'m>Cٿ4Tay>.BVƓBғ,2Q?!@:Y+SB~[NiԢ̿=iܿ$1 ޕ־mBzmo:@я;ʿ.Yӿq,};슿CMBv7a4KOj߿W2Ì~E\߮BvH8ZI9%~~qv4<d޿s(4l?BtGћy|RD=zkdhڋsⒾ|٭BpQ0FI0- }UG3徿]տ&Blz8>R{< ? @Jhנ= +&wz?BiN7.?ψ>ʟc6@ >MAk)ʿJBdS@ &>^^V e>޹ȿaom; Bb} N@a>?ҋ rU?:msVѩd:HBd0% 0@c?@ݧ.bB ?^ECqzRl}M{B`@l6隲#!U P;5EB]*_\#@>È_Ӝoӯ"j~!>mNʫ%GBVWlj@]?$A{F/?4`>=NGBFq@?Xfe" |?:x> >޿^?^B)CSګ@`?NCʇ71LJ? s6?c7uLrBw?+p@@;)8>?h_q?ܕ<@B.?Z@sgY@r-v쿐L2L!?3:?E!?!-7>B N[>@['@Cs)dpKV>K @!#7cHAԪ@:ZG@FvH7[N b ;b>m-eCAYKDz@E@UӿM|=vnBX k>?<ǚ@?g@g }> ҉ �e!!>>9?UF?)@0?~>x@0.m??[7sToI뛿;y> %>V?L?Mg??"GZ?b/>!:ׁ0{Mg>?(X>[?K>?9%s*?{{?U\;TU?KS?;>7v>{?@&>=f3=N*G>#>?"Ax@? >Kr+@dó=l>+= ׿{#JlA^@>?MLN? h𔿨L?g>#?w oN㧿ǐAxAV?x@?8cG>nt>Myӿ#(jA޺A%?@}G_?4c+=?T>Ljw`dAA*%?A!@X꿩Zk>?P9=}>) 8AOA/ @GTa@/ܮ3>ݼT,*+~>bֿjB J@r1@"H??2if࿦*'pҨmӿ񼫿`BND?/`?> ?lZs̝Nw`o7XOA?m}@@-,G>XDϿی &?ɾ pҿ8AP?@k@EZ`0dgi#/]s,VL/BѾS`@@b>{ao B*:C_<ѿ1bB Or@@j͡>Mֿq՗u<ьԿX`6mB-m@F@H?+-9A6T,ZBô0 @4@&?+b ,2VB%힭@n?₪dB?@ڿlccL]\*B#>3@r?_ſΨQ6ӿ3ɨ wB+1+@{@ 辜-,==!oB3x?D@{b8?(Nj+ܿV烖= ^D,kB@o?J@76?P FJ[pa@\ƿMοiKBI?Q@?Ix"p <{7a ;<ɷmBR\? ?T'?\؋/fAԪ>  =YOĿVwBWJ>q?nar?>بj;o@ L">/zSM{BZg>+q?U?H/-L:dD--4F^D4~;aB]/?J=V D`eOZqg6 ~IB_6]z?>,6] UIy徥Ͽ]GPBa´ͥ?́?ŦS9!Pb3;?~uiSG/^Bc]ƤfQ ǾөBd>ͦ]?ăizDE`:˱󫿄k,E3Bf.sx>^@C61T>)du??Nо>Ro{lLBd{ >*%I3@]r? ֿ@#f?heB> Z>`cMB_p?`u>6@bz,))wM*{>u!=9uMB`@4M.@ *UW>nFA'?>1@gK?BSB`=@qe??3 Uֿ7lA?Q{?:apBaa@@?>)d$ѧ{9L+?BJ]BfkS@D:*>ɿ+;޿hkڼ߿|4*?+GyBj \@* =Υfuܿ=NK=k-ҿ?ql +Bld??^ݙ%44HO ʴv>BpY>qOa >j1BvQ?ӗ/?*^ G8?P>ϾI0ȯ? /=mBx?^J5>Ln&,E`?޻x}:R=Au&QBz[Djq޿ET΋.?~cC ?N|.B~3DOGb?CB$``%B a`MOpoң?wZuIlB*"X[pvIHK?s*vy5ӋaBu \Y}0_n?dh ҡWk( >B}6 -vG]hb?\?=Mqҿ-.q:$B)b꿖L?sDEῸ|BZOMoῪ,P?ZnrxBB-S)i[?ɪ< ޾92G!oB~6:JRh@n[s(z?y潹zc}3d/^By1S"^Ib`0JT?=YśW\0yBu`?ΝBQzD?aÿ?,ÿ hCurBrlp<`WN6>?[T[ֿF~wVBnu]z!=~> gb"? C jѿeMܽQ?:BjH/4绿r>0Bjjc>\-pK81>G;޾Bby>\U&>r6@(DѾ(#[࿩%o>꿒nsXBY?龖{b2> D=6=俬BN:@~?|H+kK]b$>1 >BC@4[#@:0C4Ϳ A T3vbB=K?q@>ChL? ƑNCS[B)=?7@*si\va36*-kwO!mBmox@>m>'gс?R)ދC}CǽMT@=k?ٿZg%;xEO>A= r? >t|?=?r>v?N:\?~At5v>֮6?1o)> X>W?T?(>U7?3A&:Uk=X?07%@KtG>oL>!?>=Aܮ8|JA+JsU>#z@zZC)龱Y?"|?=D]?CA!W;0@5?O>?c?9X?]AS&%yT`MП?~;Γ=>śh?J9`t>m|A{5G8?~c>K;?S?U3?lQ9?[]u?>>A?<dZ?s>jD?s_3>?ht|?D>5>2A3d%0X O=D2>EO4Ah?JE>5?´l?>޴ W=&? ak>UBf~I?ؿ_B!𑾆E.?V5T%?뱿8=BFa?ɑ>:=u?= O>Ls,?B+ H@_۾ŒRtzfzQ uȿrҽ޿&=4BK(>=?.LGu(dY!oͿͿ4 c.žB\+ jjŒ 3H\9fῃBc0z濜'p kǢhiQ t#[nMBk ^>u?#w*G(?ul?/6Yyu0O7BnA$>h> t <]>,c?)4U̹tN_Bn\N?G{>%^? f?gZ &AFA8Bi.?¶?DL#?O 4?lЭ!tNEBb$ߕ?p?+gM?U(P-?̠$:bƿr)iBPI'v?0?DpuF=ku7?]8޿tڿLB2!se@-@SN 3?odqJ?Nul,V.Ak?K @W@hĚ?dž?M> ƿD!H־˗Abd@m@@?"|DʳѺh俠-4_S>Ň@@C@}?v7 [9 Tc"̿e@=?J>@Qv>܋;v rο,y`$?} >Ӱ@"QҊ@LN$@OzH>I.?Qp>MN'>)a?XN?"fJup?"ֿ6?|t#?"t?]?n6|?ݙ-ly@:@?t?tle?;?d{?>6? @>R<.A?>\o;?;?W52>5,HͦB(HhFL>~En-?hyF ?>~R>3B@f ̴;>T5r?ʓ9;?"@FG>>钏B$72@y ?i?Fa.?jE?=?sj> @ н%??g Կ /?Ⱦ^Aah@? 15?>/>D ?i):yA<!>?I3=r?m} ?$nĿ )AÂKk?̀>??_^?x$>>OG3?|w q}1A96@>aY?>)" @-q":Bվ%z Aӳ/?>ƶJ?C5?k]ڌ=qï>-W>aAb ?ݦ q=H?"|Ok?(H?0j>w (?b@A ?1LƾPI?>3,[?s?+eo?Z>,?>AN?KFQ>*ޜ?|2=/#=6=؀;>< =V>5uA%v?'Wֽ-Y>qW;?/[|җ?.?->YN[?4YA?8W>`?E=E>3 >^>? 3? Avs?־V?K(D=%>H~s? AD.?ɻ5~BG?D)>>ky>~>h0ľha5?7MAٞ@9/=Gpl>Z>4BTSc=?w?eE.T?{ta>k??GBk q?=X>2?W=kV>>8 )?🿪0w>PB"@?V>@ + $̽|?DB??I?o>EZNv`hhO)2BRPk??_->G+Ft pԓ8*HCB\?:?<̾na,=%؆1L+vg^%B`=Ӻ\35/<3y迿`вr: ZBb>/g<IU쿯hǹh:iGfBeЌ?yu=:I*| fO[?kRS>Sz 92BlNۿe&÷Eo>|{^n&eBpq(-C#pƞbY=, v>#M>һn1+=Boa8hd>YWF?_?>w6F(@#i=6Bjh>D(žMs6?ArB>c.ҿhh;Bbk5I# ?Do՜e?#0;>r߿d%,+)BSl⿂a?7fC??ŭ?`Ӟ8 > {ľBKM7W>"4?ЅA?oM4>L|hXCB;?39@!1?G5d@? f>jRaοA??3@.DD>y+?/X?M?l'c= *|SA#<>9?X>Gyc `?oS?36?_̟?ݱ@>@ 5 > &@??+@?Z?@jS p?@>ocL{#!c:|z?R@%?{w?^,@Gr?*?́5~Oș=?i?;B?`-'>@ As9?y6?gEVHL>]$?3G??{? 6>?ټ-?A憎1˿A[>}?0[?]?C? xI?~_?I?Ү#S>4o>WZw?4\?o?e>Y>z2=@ ?*?kQ3,?Ej?=[?|>"uG=*?`>E??e>@?;?3>Fy>kZ#n>?/+>?WB[y w?A?l> ǽJ$?,#?9': B)_&>rKv@0c? ?C% ??-:BM ;俣@~@K>?G??ߍ?> ]~A".h>'>F}?~4? >迱:>>A< | 6>ǿjE:?L?u?2P>y9D?A0t>㢸? QQSA?):>IM=NNHb=DAO >?'JϿ9o?@o>=QMFT>ĝ#>SA$Wy+)\2N?^R>A>6 4>~6?2C>x?hJ?q/>@QAefaSeoi>Yj9?m\> ޾|>i?ƻ$ A$ >UD;V?w|>P?q?S+?o<뙾WAh , ;>Eܳ=}{?2NjD>oii}?7-N&A[^>frL#Iw>8E?%88=ʑy[P=#k/A5g ā> ܛ<`K??٤??N~>HE?݇>NC\RA~==E>S?*:?0 ?߿Z@A%|L?5*>n??.> ?-@?J .?ƍ?rGyA@kkʿX^?x?"NZ=@?N214t$KAk/y?P> T~ >@?JH?9> ?Mv>RXDuA|?#~9 )>*?W'^2??A)?R>+ `A%u?z_ҽ*-X$?6G?Y>=Z|P>DA`?_ܰ? ~@+|ྥp#pX.{Adt@}E?>1qd32}R N2#B??5@"&>ĿDtae!ؿv@|Mp4Զ{@@BU>{?\7P?,Zu =9r"8=o }v7%B[>?]s|#/-,3̾:guiKBaۿz?FZ>`%qukGX>0x7`5=#%;c]BbV?d|Z>ףgտ"pʾ䚿wix3Klҿ#;+wVㆿHriBe+Vn8?9?z{Hc.鿢)x6?̿4Bd Q?K?ጶWtof= a P:BerF?L?&f"sݾG8qvףBb<5>`?@CH]8Oζ^~˿^Bd+ZW@&kPj>IXp9ZFKdCPbBb?9w@C v?g 7LA? \!(qأB]+@31yA@<^V>?j/[r>a) XגBX@{Z9?z=Ϳm>@Fp9>Ǿ1z.BZE[@_V?]!vϜ!Rtvcr? Qo8?9:, B[*@bw?BKU&9 G?FFԿ?$B\+@?/;Ɇ=+ `{??鹿DuBd\@M:?]á-ғLS> bE?IBg@_N>>=3>}d#ǿbvm?R;YZBkt@-wl>s4 >Oy6ϰ>L~+Bp@:M?uM9F? ,oۿn>bULABtj?F>k?D.=.& By^ =j s%p?U22+@@B{Q}=ľ:/x?IK7G*Q#q?Q_cBz0S4e_?EzB{]ΉͿBw %V=a{QZf?aؿgpGK(BtaĿs{!JSh>Xο5m^-*oޝ3Bq\6 U&%%].>5?8?󿹿Bp >-3osJk=CPBf?':G qy)s>"៿i>kѿM>׏^BNiB_ ??\Ǿkɿ<>OrTBWU@!?%Qd(ӿuۋJ?)a;BOB>@"?7{#,=ޡl5W?=;񖈿 BD@D~@ ?z/ye(W!?4v "B4@U@J>8V $Z;YN"NEt ⿱UuB'@@ ?2``tN进64>x}%x>o*zBE@P @=?gќ<*/S|e>mr6B@(@#@ZVX5=.vTv>Ͽ*tB'b@؞@ŧd@ Cls#??v/<?Br?@@rZ˾؂@վO@zk?C8#ɘB?ľ@.@Cx 5i>JI2|IP 9Y⿫l{A?[@^q@)?Ftu8wӺO :{B?>@׃@+>[e{2)E#~dhw B?@;?[\/?ܿCIel # jB(v?ݑ@N?wg>Z2_%38>!bB><@<'@;vʧABM}@S @$@_P>Г ο w>hɋB]a=@L;PpZC0{R0׿F=>ngB^?%@Zl]>> "> Z>q?K4B[L?q@0ͼ7l4Y\ gQ G- B]ak?/? ?DGK˿c'>/z/ Կ?6ɾ^𒽮C()UHB[3??D?6z>%>t߽#]whF}B\@->D(?j ?,*#>Xe>J"SE=$&\B[@:D??'?H,tH >/|<6B+B]@ڿ?_/? !4?28u=ѣ[B^`U@ '?-?ˁ>a(>b3B^kE@4X[?,f<Ϣ=ɿ@AH>l\B_@H>?>ti*>O X&aV>vX QBa,@Wb?M>톾} '%w>-`Bd@HqA?p.w?%٦@v>3pBhS@q)u?+2=.H?HF2FF6rc>Z3?Bk@_uȮu>= 3G?P =rIy׿x >t=Bo@}>*9?#?;^ܿu?>9Br?О7< /5{?>螿/uf=H+ŀ>Bu?6<Ѩ?DV?>Igȿr.L=:(HBwS>ϩ־Q5=?>SO{V|A fBxz<&ʘEa0;(H?"P)qľeBx#o뤿"y ?8IȿY.آBzߗƒ`%s Q?ʍA[5"+֌-EB|u}ӿ^.iڇ?ľ!0N:پI|ƤҲ)B|D':qC j2g*?閾̊C\eyB}:_ߨYÿ`?ʱ-˿C,QSw/sB|ꖿL=wLR?؈X"[CS}YB{̓X"ۿ?CTzs .[)Bz㿿3f%EQB'ƿ^N+DVh?aW;:x/ɿkk+9鼀BXe?-o5{;"Sw?wC8K|]@UIĿBQ ?h$n%[/?>XQI";j-/BE\@-T'=q¿߼N-?crƿkTz'ʿ $B:@]qu[c7?Ee#Izh,B,@N__ iba9 >+ɿ flɿ`E$Br@e? >G=JٗɅwԿa%LaBN@N?ݐ@"ʿ+v4/y Up}e AM@?%K\@Wuޡ~!v u[PzK-Ah@lѿ5@SΔ?f腿 e5aQ*W[rA!?VOƿ֌@w?6vkq F>^ AbA Ii5k޿7.W#>*fA>5@$8@ ?vuֿ?쾵Vw캤ł=ϵAR3d@I?ã>¿b,0xF3,l۾?Ϭ?A)jD F@{>O>Nr=xN?!>JAZ໿qh$5@:?4φ~{L4"P4|?2?.> A.z]>ch@V> '>8տ.}?EV>AV 3>RAnd>-?n f1b޿;z ?V7X?M@r?f?n "?Z ?L?{+?:>=lBH?I?O@L?+Hb?MX??A=?$ֽXjOjwVۼ>>?Ы3@S?M}j>, |k;Ʒ?0>>?\f@B?Ûj?>?c>_J&?91?s>H?G}?@\1ʿ@A Q?g?G?UsH?==>/8@&?:*d?h?؀?_?kK\ؿTkb4@@Ѩh}W@?Qt??9?-0>6>A. iFQ>ȁD@p~Ԁ@S??F?%|?`a?~?L|@ @D??*?Wn=?A?S ?a??w>t*?@9@/5?Z?~H?kW?ζ?An> >W@ྻwh?%k@L@M]] 1?J?i3?n>W\>Z[e?p?7k>?ړ>k?\?G?e?T ?>T?'}->Ɲ?l{?H?p?? ?2ȘE+0>+>Wf9>Zk? ?sJ0<׼!hux=?)j??  GfN???Ap5>t?w'*>@]?y2<>#>S>w?*n>3P`?>^??>?f?J>8?8q?@>Gj?-??G?/žҏcX?6?dL??&?2r>G?p7># ?S?I;?6?J?0b">`#>4>=c'=åVQ?Ǵv?i?^B>>_%F<%^k7gȥk Yݿ+j?_oc\===?"?ݾ\2>>?{>ښ?9N=В+=I@>_?cO45<=>p>>{?n6@(JK? ?2,'=$O> =J>?/7zc@ c?"k>l4v?p>< >A1)>s-B?v?{n9c?h{?.辇|N?x>>xGܿ@,F??܁?taN<>?>x?G =>v?"> ~{?)>>?^Y6>UJ8P?-aվc~=yb?NP?b>y=?zvf"?ʁ<=?c?? |Q>!(> ^>pocketsphinx-5prealpha/test/data/tidigits/man.ah.z4548a.mfc0000664000175000017500000003155012771605033020706 00000000000000 @!no@;C>=þ. >>م@4?l?qd=(>'q@nP& ?4E;5|$9 Ͼ{=?ds?3? t>5@@@hl-5p>H%;kc<"= w>*@WJ@f]S0:>3_;?)?;-?R?(@NDsG]>G,!FlX>{0>@;>ǿ ?[ǿ->?A ?q}1ɾl@f?g IEC>ƾb:u ?>>W >-[?Uc@w)q >q~>~?h?o`B?1 >7@8]?1=ϽO>?H?9*?"?%?81p@1N?֣?1oV> N?CF>Hާ?p??zX1?C>@x?Z>>S?C?I4j} ??>/?@VED?kL$A+v=Y=xސ?;4>C??>@p*Q >ľ ?'tξrb4g?)ޝ?1 ?B>>`@H=L?#myMUES=+:N?*?b™?/?>@:A?3m?` ?|=/L>>j?so >} ;…?+>(@p4l:>Jh>\^?$lP>="=ѭ??\z>޷>6Y>~-@Ǿ<{{?XJٿ4<|<[>+%??i(?,0=ʕK@`ē;e?;h?>uy>K_qr>u??=iv> ?H`_@Ƹ@Y?(}S>Ywn ?HX?<?(?Q"?" N=@d@2??|`cb=G?x?Qq?@H^.s@v?^<]˻<ĝ7|?uŒ=6vΓ?}@<(@JM>Mb=?vi>,=R&?>B~A*@?Û4? 34N??$dſ~ek>w?Ay=2E@h7??>ݿp]A̿,??O;?dþ,?8>|Ao@@I?;?¼>|?t?9Eb?!@cA 93A4@|?i6@6F>?r-:п<*AinoA u@?5@$7?VV >,Aјף5A%b@y@G?vH꿗P?Ga8ЉZ>%AwA.u@EC?t?&c=ZJWQ=>7q?zmAaA@>cłAXU=>V;,?=AgA@?j,< 23?B?Կ >H=A s@@~ޖ>V jĿU >?:Bl@䩚@5>QsH#>#>Ȋ$Y=X?|B uq!@Ɓ@?0`_Q>MV{K>?a>B%}@@z6>$hzWEEIH?H3?,Bn@B@S?.|S<оWJwI%gc?pD>bBNH@|W@[Mȿܰ!ix@Q ?3 ?=:B"ؿJ@cQ[@<5:"%-`L1,(+>%?jB*J7@N7@,.2DL9b =%e%^?>dB,h?d@ E11@8>nGk?G>B2>%h?@{dK<,'=(d@?_J>SB6?1$s @& G=S > -*U?D>rB9A?ƿ @d/B3>^9 ?D>NB; @3@Y[w>aվ*S oN?hB?@S?2@ܿJICRCY>0cITR?P?mRjBC8@WS6@ -ɩM#f>$}>7ퟨ7?EBBb@P݊@K=ֿo>F?-oo}=?ue"B@@sz@P>Ei°>j?H=q:y;.>3?Mj*ȏ^NJ?߿T|MB?V@W@2? j6\?t3+?)wB@@S$@ L>5G=Ȅ?js!-?Ҍ9KBBA@ۛD?0|>)ʿD2 ?G6<|V?*BAW@2p?@>`2* _?,\>i>8?AikǾ>??EP>~?8~B@I@vW?{C6&;>FE?$s>ϛ?d*BA2@5~>&c>auB??K~?-ǿeBA@x>Fd9=^?aWQ?ъ?o>lĿ̍qBAV6@KGb>pԿ|?`.@?Q>ۃDBBs@S*Q4#>M>aП@? =5I㿩PBC3@{[lr2C%= K(o`$@!? >I|w[~BC@d#j~}K/Vپ eě%W@=j?">B2叿Nx;;"w@tD??YT}rB>Q@?y'Q-jbb6#?[?+'>eNB8V@B?VUslj5'N??;^?l(=B5@E@?qo뽿_/r 4ڿR5u >Ӝ>GB0T@] ?2b}<)>`q>W.P?!y=?/n?3jB/:@~r@{! (j>ej{,lsϿ>1? ?9B@@@{s[ LK>;ؿ&dNzi=Z$!Y>i?.qBaAf@]C03QǾ>&L>܉rL>ѳj>,A@@a? VT>it=5M~>]o?p>E> A>c@0f@? ?-M?>a >=n>=Aw? @oE>}>$>G?fG,<= *vDAA?P,7?C Q>n?֔+>FXC >?E.AԳJ-q ۿba>$?DuGDAxZpVf*#kW&U0 ľE9$h> $<>YZ>R)c gA]o#>~66^< >;)E>s>6/4A^,=l>(?OX=%御F=IB$79 QA-(=w>m?r/kQa>N>14=+LAGcAap>H,t>Q ?B ? ;I'!m>ߋ?vJN=AQ# t@KbP >?6 Ĕ1{LA "%ֿ!?:>1?%&|>!<'l0AH@?C\m,=?x?4?L?h ޽>uA@X@?p濴h?b>Hֿ5Wn0=M k?rCWBc@z>@?k9P?r齣W>X b>6>EB@kN@龓ݭп> ^=b?J߱>>Hp>ABa@2@Ul >I&aaా'ˣ=/<^9>s>`m>B]@ե@Tba/3Zk<Ҿg~>I cp7>rB'@@tҙ a(.>2!? O?(=&B.c@@>Hm={>;? ?pnn>G>_sB7@0-@Uj[X >>`r?OR9 >`? uB<.@?֌*.>m>jL?5AP>ߙ>B?@>9^d\ɱ?/ ?dƿA>ת(? >.>BA5@L .8g>ص?<{f1n#??Y.]BD@5yYjkR>BR?W!˿~?g?Ͽ3+BD@<ȴiY!SϽX?/ªqvv?ф?fBC=@׿'DȾb?*DQf ??tYB>j@h9|bhP/a:?L]P8M? a@S)B>Y@|/01>d?N]T4J??u@d=B:~@33>9k?L\cfc>f@1 ۴B.AԶ)δ-Z? ^?t!$)(H%?y@ ȈBoAt]"?|_/0?=h)pa>c@V&BAl7?@T?1ܿ?H*>8ܵ?B1/@A?@#@2@Gvf@HE><]><=*&ܾ.[?bYAD&@0ې@y>?,?i?<.߾]2VAi>@߽񣠽3vya>Nl=Z2A$`I&?j>hg?`j>b,>,K?">ʜ?+A3V)"??JV_=G*~>=N1ϼ|=8>eAW^?W?aU?_J?&?={;E@CCa?!,AH7I2?n~&>{=?"R?> 0>>>]AJUp`_?^ zx*>r?d?>þ2ƿ3?j5A)v@@: N?'11?O?.'>O8> J\/AoV@+.> >>=J>ӽ`z?4A4k ?0?hF?b>_=M8?> [sq>pXAK$R>˥??a?H<}>tL?My?Pt+KmB=@םE>xҿO{=z4͆iP'SCg?DlC$gBO@[{+>cN>mR{? N?"sjBX[@%>(m|>%- ?O?p eھ\CB^ם?5Wjbs:k? D>J''??#yB^?[-l0BU>J>29??z%콻B^P?%]-f 7?G>V?^??c6&Ҽ}1B^)?N">̾? q2??6 nѽH.B^?s4,G=$* ?Bd?xo?ņ׼B^?S M + ?*/=7?QD?!7`T=D*8B]? 2fȽΔUl?sU=?1?*;=XB^?.ҿ"?z0%=?M>. =qB^߼?ަ㠿QE}'?q>]?$T>* =bOB]?Г!}eWMJE1?>?d>-\mʱB[E? ܿ8kBD ?ri'?E?l?+v?L^?BYk?qZggw_'?S??(G?%`Y,BUJ@F9Az-[Z񿴕u-@ ? ?z?!?wBQK@!,W4U˿7[͈(F>?p!>D?D뿱}BK@E rFP[? _濤ƽB?V@k௿Z>>I̿N 3`-?_??TOGѽ4#B$l@@^>k>\ǽB\&>>O*?lMRB~:@Jُl?[_?|>G,(e>N? 4 "A@|<@4b>?2> 6ƿ5>JvؽL?kX>?ҿIPA@h@Zv@%@[o/@BO(&t=-?Kտ19AM@!@@E?>W{Dɾڱ$4+>Ik>AK?F@P9?X?s>?$=[:gҥ<-=<,:AqK @bV?¾&>T8?5?2?:A[? >m2A) ?zm>E?iRk???*@ j7%ETھpAd[) O뿄I񏾊d>@A2QD?-?S=PR=MA~.>[?3aAG%u{:?  OD&?<>ℶ>>';A/cLF6ZJT:?= HB=W?;BG? .AD$oɾ~{?McϿ ? ?_? ?AgݿJrnpϻ;6j>y?tCd? Jֽ6AP`u?\f⾿ο]򾘺?9>?_=?MTAwչ<,>XN.ɿVϟߩ|.>?>EAcg=]>{16x ii =޹>>;W>nAx\)@C@V?bs@?2>\,#=LU>Zh?>WB&gA Dm@j;X/>v=GeN?= 5>#rB,u@Ϯ@ӿhD^Z?>IB.@Š@(+F}*.;,>C>p%m >>6bB/@P@m1:j<҂>8Y_L> >9\>B.;@@ 徭᪄d(;b=>^>ɓg>>cB.3@@D|Aw׫K>9>Im? +>p> B(g@Α/@Xrt?>$j">7X"P>?oIB&ۖ@@i>jfQm~

u?J?пTBk?y ?B)f@ݣ@ >Ƥۧ d ;(|60?1Zx/-?1?[B,@@ ͽ$rF?vKԬ?< i?aH>gB.@Y?Q>!SѿɄ>O>R k?+,9?P&rB2 4@S߾L.?k>zL^?c!~@oBB5=Au>묿U? n?;?/e9@ zIzB4A>]Vѿ ?n?+Cv@)ʃB2zZA-- ~"d09,@D])Z@r'3B2A.2֎ ip>dM>N>ȿI@$:N2@fB5A%Q^~>/n>ek]: S@/$@ JB:]A.mz.?rNRGv2>Mˠ@?O@ sQ'BɛN>|սг@$X2]?ڽ=B@@,=~~Bb|=>q@V㿆l>^N?+BD@@sȭ\?>pJ)O (>>@Ɵ>x%u>4BH @"gx?~0`3n?Mâ?2=$wBL@M@ ⿿ t1?=->X+#?=U>>i6BO@`tI@äsa?<>G?Pၾ7I>E:BP-@ yp@ҿאYYaH?{?q? 3=V@BQK?ľ<ܽ 6 @]_'b0?ՂU?o>YR>NBN>K<4@F]d*4I3;%??>=>ݽVBO*Bhhdt\@H9*53?Е:Sd>ʾHevBK=uP@-'27?7=>d> @>5¾jBB]?_e@M_,96,%?oXJb? <#?6B<9C[V@]$4?; >dz?>*(OB?@Cy5ǿ? @U~>K?5>5 ;/B=Ʃ>@KU$aJ%ft?(' V>A? ]F>JXLwB/. -?L@xv!r E? fY>w?KF>gj>oB&y`?՛@̲Sw7 ?T:? X?X?Y#>/TB#Z> Y?@YRiy2jK?+C>%>ڟ%>AZ!?X@3I@ 'KI>5?9>pY?;e>[A @vK@nAǿ Bf? D-*xK>> >m?Z`Ao@|@i@Jf?fd{wf#ݿ"%۾jʨ>9|;@s AEE@qM@(@@w?.'cBZ1Vv ACd@Bk@ @.@13ھ>{?#K?=FX멾#7l@i#?s?f@!?6坿>}%>\->KS@F@)2>¿4!Mn ?GH>yp>v?>H>Ѧ\l@!+m@J?#w:d>q?'=} >>.Z@}Bk??G'ƿ/3@ !>:!2?=i2~6!@:T@.ݙ?i ~_UѾ8?q?-f ?̀>LBD&A&lZ?(:t<Ϳ#>1< c <>%TԽׅ4BDcp?.쾦+>KidM2=>?>4BJ'rR3 "?K2Y? p?q?ɧ4cB 7v?ä@ İ|!?d)qN>"߂/?J>AI!h =@a>RE{ ?>5]$߈fjAZٍA@пE7P?Ѳ9=``߿b?*M?BA}<@MqE,?'J(Q\?a4'>A[~Z?TL4M?jk?sk٘a>ßA?A)?9 -+؊}?+?@>_Կ-VĽS(>3.AC IA>L ??G0>+?67?lB x4=/\?P&A_?!u_@&><}rW> @7=+ oA?߿Q??Z' ?Ok> ?[,f>Ѥ;*ƶA4@x.8a??z?d?`5'@t}@: /ք|A@Ox R?@*> ?_=?o𿯅,GS6:A@ٱ;?џ@A?CLH?g>Y?`#?&x->-eAw?\OY@-@Eܟ?:>ĽK;>Wgc!-7cƒ6Aa8?F^?@??t?5k>q1ӿ<AT ? =??1?-?{?vk=QO?SC=he[[>A.K>[*n=@R??5z>F>K>MFPBA!|R?,[? h?#H?Qn>=+&. EAپpM?Dj?=!?RlF>>`-->#$A[:MlHAAo> >,?S8t?,=-?l6N:W$\mrپAY?nBU>~?ˋ?X=>HA?&?e"g}Ծ/TZwA ۡ)>5? >&>>6?'x>3Š6-D-\?\?Yľ׹>m>(>?C 6@[ѿ?{?Ɣ>F,?;G>>A"1OI迍i?8@Pg}>*d=1>8i?=*D@0@š^{TWʊ>Vmk#?1-=l=;5z@Zڿp?QO?Y;>5t!oHP?F>?g@ g??.>t>6t"6=?r(k H5A} Ͻe뾃>t#?2ř?E 647u> \Ap@nf2MKG􆷿9k@rݿ?V@r?Y׿#=cĊBH?wJy>AY=@(!a\==E?rğ?2Z>4E߿ ZW >!@%!?q?No>05$6?&[,?!R> Y>$@5οC!@oʿP?p=lDfE'1>I>ꕼ@Jп?"s==˿\7=8>u:&_R<Ӎ"jc@L$?>==>/6?p?f>fKrvt;@??_y?>c>>Ѱ?6eh$Epocketsphinx-5prealpha/test/data/tidigits/man.ah.844o1a.mfc0000664000175000017500000002611412771605033020667 00000000000000 A~BN( @Dtf@#@4V )*i>FPWAoXVi? m@ >@~O>.ɿP>l?.tAq2?h9Kÿ?L@Vx?%r@;뾜>gⱾoAe-kď*ˤ@<l?.!@&Gm>?441rHAt/(@L"[?K<@Y¾҉?tGxAsSP3s?9+,>?>m%пm:7&A"0~?x3?$@V4X/K?/ܿh濎@YG?%>5 >?Q>u-?]>'c{30p@)4A=!?a(#gN>G}>1|Ⱦi@y>Tɿ1dX>튾>_A>@$o/#>CK;'"_=3忬+b>Y?Eb?b{= !@L;E?^=<>IL>5t=ޡ>??5?$_U@$(̞? {IF.>SĿ(ۿ y?m%8?~m=T<>UY@C:?Oݾ|[9徰TC8+>Pf@Vgu>m?td7?)9}6?5l>0>WĠ@3v̫?ʿS3FG>=X?T p=$p>j>Pl@P@,;WZ?ĿJ;o*?!h?TQ@a4@u>u> Y?Q<{>Q??a{,.>Ċ@ W>@f?Mʍ?(e>?$>sl5?3|o@Ȇxҝ?]]?_n?h&=W*?>|?W.}@kiG?OJ>rU ?"Gb?W?rv3??aEgC? F@*?@?K =+??_߽~\R?v@?Cr?㞿A#G&?? NK!:)?8+?"2?6 ?OJ=ț ?f%=jAF6"@C>iQ2/?չm(?P{>ѫο 5R?;"ؕA\j@ @\V;?X?G?I[n>&o=AK@-"@^- >':?bN+9 )$w>ج"23B-PĿD[?}$R@-c-V?ܢԾ?9>g>?4tB8Y@Y@um*?XTR>!?v` L$k BJb;@< @p ʲ%D^>lsϿ2?zd?Qʰ=ÿ;JBQ\E@@pz$Y!>#'uY?V?>м BBP@y@[~M J?=(y+1?u>4M>?B3 >>w@U@u՛:>b?؜m!96Q?]D=p;O=6RB6ݾl@@}t?s5paj? t B8C^@@'(ndSؾ׃>V6C?4>MǮB?8A@@%r?ɿ`tjw>f%>{=":BC)@.s@biv^I "!?/1(G>)Q>BTBD?aw@q@U g|48D2S8T?0=s>Kn3B;Md@B@'JPZt>iU?:2> >u(fB)v)@b#@o/ٿpf+?13=?|,~>8A^@)h@!@z̿qֿ2=(<",= C?]6!A@ @&%4@WA>_c=O35駟>As1@WO@\@̾& M>e{i>28< ¿Q>ޭA=SL? d@@u?(?Цr|P}]3BAW@V@W-ͽ⻽_D= ?;R"¿pY AE1UL'@R3=@j+ ypB>?>ʿ0Nu>hA:)jH?==O7>S%>=hJɾAppH?#㿹h>-."}Vg ?/x虁AڪR~@mv?Qyӿ?{M.>d> {=rlAW\1@?<$߾wh?r?>f9.lhAOlV/gE?Zv9űӿ38(I=>t?8^ƁAGm^AkHgN?{ǿ" nLr>%,{?4& A~ K ?7F|r T-?LtAʙkA3`k_6 >?ƓI=Rͽ쾥5A3*˿8XhVMpA.Bc!wỈL)?@,`>@8AOJ/u>ʜ>:=ԿZc穾 e><`>?%2RAusY K>o׿Bc? "=>^Ă>)xA?4yu b%h>4xo?i.>>y?cA̳O>Ͽ+͑=QmR{Ox{5>?U+>SBu#=C @ ]׾&)Nq@ɎA׫{zt ;f38&!cv?!g0>^s>gag$>A1zcеi?pûi8h?7~?T>Mf>OIPA9v?Q!x Zl Ge?ȣ?;>Pj=gZMAi?5C>6>f>>MȄ?O'?l?M_=WAnA8@dH=SzUE0ӽ>#$>tEO>n=pB"#@@. p=?n ?Uˎ3?B,xS@3?ǿ#-{? ]6?~(b?f?BB-@!@R>Ν ?|?VQ?zț<=B/J0@J@uO+k>?t-?f?yWJT0B/@H(? ja>?/?ġ?MoB0u@ڿ9?\~\O??f??eZŗB/@?I34%?%?p LI?|l?x\Yf7?h9MNB19@2?ƪ>??:>q?NفB1j@?  VD>c?7(>Qi.?c+-8YB1Q@ c?naQT>?I?<@=:}=B?0bHB29:@=??"5[ȿaV>?z8/ >ԝ?߿iB3EAʧ?puYC쿸 ]6@ IxMI?Ia?促B2A >pY׾˶@#x =SŴ?\?^bB1͑Ai&WuP!4@!}+?u?7 B0KA0!ІdC8@=??S>B)APri`zڅοIym?￘IX?S?&HBsAqs=EGe2kϿ9U?>9x0șg@x?}PBB:RAK`?t>u%xFb'?C5"/?->/MA>e@Co@(V@"?|=?_e?&v>״]F*P*&A>l(>e@G? ?\?8Q?ت>aHj?%9<ཋI=/8A8l:?پdQ"ѿYſcE>?L#rAoKc_q>Kqp '>*;:A?^?vͣܝtsSG ?"r?#E?qA7<]y;?)g?>>?՛>AcA| L;Cs +쿵`?]?A=5>D =JI>9Ag5ʍN?!K"B>l]?/?4?^ԕ鱽NA `ꁿڇ;?7鿜*Z-1>>:;?=`i>AFSdw?d 裿l`;X_~=ć?;>"ArP\>1İ?v=óx>t=QAq,>5ݚ?HD?i+(|B(?|<?#;?<,A3p=:#?c?=>S=)Ǣ?# i>E3I?fAX骾势[3ʿU>g^?>ݿ0;???$A:?v@>!&???=C?9 0FܰfA^KvK'BA;N@HFUC0m?p߿?I=~D? 5B(@N^@/ Z#xJm?2+?F#Z9?eCa B+@m@7 k9vz=ӌ?/ݿ?>hd?0=+B-@Ǜ@=; TѽQz?hϜ?:WU?7`nB/N@X@)ptn.h0??Tu?=wB/J@d@B#V=.?C4?D?@\$tB2 @6@ۿپ <?_g?v?km7B2@?+̾$> Rq? ?kKz[?8ԕB13@?2h>l ##@d?n.?> ?\1TyB4@7?k) />Z?Y|o>ǚ?I?+dB6@֥=97r"Q)6?u?ȫ^?#qۛB6@A<$K5ol,",XF?-Kÿ??6?( B6@B`ދs4?l޿U>v?<@ÇB7A j)!w=,E{?wZ>x&?H*@4eB7WA'fL4q8>h@k"?g? >JL@.=)B5}A9޿$KW? K?{ܽń?0ǘ=lxv@&+迸B3*A R߿i?ܿC?c|X(?*`/?ؼ4?YB3*$A ; Fq5a?\??? ?NJ Cg`?fxB4;A ztj? xQ?N# 3;?ځx?뿐B6A ޿-x?n?ʦ^?ډ{>?ӿB=:@wQ/p&Hq?n-U?ϨIJ|?d*?zA?1UZ?#? >~ƨFBE7~@Q ~>=@5?ٿs 5?Sc?<ڿsBG@3b`$P>J 0?ȿ>??`SBFK@h:i?g?a˚@0?P>!D)BH"N@߿> -j>LG0&=VE?Z?G Z BE@w8?*> mhRuLì@ ?€BD@i)?Q4b=r#@?d`@BC@B8Ky>) Kc@?7,蝩ŮBB@EнL*a|~煿/@?¾~ڿʺB@,@Ul?I.<é+@?>zAB>]d@]?L3>=g oMs?~?}ֺB:@C?0Z >|̽u???m? 5B8@I?af?K8 d>6..?5?0N?tOʿB4s@X?c⿹Ɨ?W-&`>J0c@t?F#WB2@@Fwdt?(Կ)>t9)y?OJ?=9@B0@v@3vοňc>Ób>! =?g?q>|B+dG@@nf >>n&W?I1?>Դ|B'@&@6㿳r>k">8?qJw?ZX>HB%=@b@[$=%:xq>D'_?:X(?>B!]@n@ޮc"ь0IaH>bӿˠW??{>Xq?B*@@l'þ9tX>l?W>먄>"BY*@p@(h,[Q(>k?p@/;>>& B@|@IV>88L#p_B+?T>)-/B I@@?4ˎ$K޺"@?"E-?7žB*iA @Q?HH#^zY?B -P>uXBhZA)Z@Z?uo@R:$1:? ]-U?DOBbAL@?==[=-U0gp>J N?.7=B3@@ɨ?tI>2K꾶 !,H>"A΋>Wk>ٴB e9@@U=G=ܿS}\Df¿ ?>fB @`@:RZznſwN ;?1?-,_B@h@U4 ?ˉz >Z.t?Q?_@B@T@tEM?Sm&MLEu?1?&B"C@u@GDN?^E='nM?`rh?gy-B$S@Н@yɰ&a?3>=tl󾼵>F? O?B$sN@*:@EE1C=v@?y:߃\?VgDA(H=G?Hv9B*4@w@3]8@_i ?3J~O> >@&|B/@@w@^%q?沾F3h?`eB3u@ |@a@Lm ?CĤOe?4 ࿿gB7>@?h*@T >Ҿ_Ń?p77B:C@p>`xC8@R!4> Ἕ=l?BAeB;@*o=ˬN(`@O3; ?H8=u?v1B:c@ÿ w[(@Czq?., `d>?]$pOB9@v]0m@&BT#>?p>bT>?~?ě&!B4# @ en @=?>?'j0?wտ|˹B3@a(g=G{;$cv?L 21??p?9aB1x@o+(ISҿ:ބ?!>?(?a>ݿĿB*&@uZ6?05F?G͛=ů/?d=쿞>B@S!>9b:X%=Å>?U>õѿͿlB @>bJ v?R? r?beTBb@??B?X|;½ݩT8>2`s=)>$ >z0BXA@q?j @P?_.,Ѿ;?, '? !8Qv=LsdA@z?P@7?ȿÀu08x?pP#>Q̦-I;>@Ag@=$j? <@O ?cp=8d?b>=/BB@>O@_٩?]A6Ug]%>̛?8Z=)B{@?@:U?܁ Ⱦ},?xF>TE_>XwA@?ls@Y?;<=# ?z @=n^<_A5@cV?@h_?). ,?A>/I7q0|6eAE@ěC@@C?o=>5&G?u{ L忑S>0>GAfJ@@!@S@ma?˿>..V>SE=AV@?1@@@2*=g=Jk p?Ja{q>;>Mk9A@3@J1.@?㤨Q1 ?X3\A@{@$@@@" Y@;XN?X 9?-AxZ?\@di@m@ 1Qn>WcY?X ?.>Y>y0>S AEZs@-@wWq@>b eJu~?å?F O>AYu?@(?H־V\"$h?׼J{3K>9?Az6/a@n@ȾGJ?V>B>6]Aw8 @G^>Ԃڿi;m ?? s/Q>vCA,X=]0?L0OYcA?-xf?#>L>eAM?5 @KIe3`^-\?Z?5O#J?z=AAx?K*?J HLA> xOADRZ?)@:?N*9H]P>`U}S־K>=Ao־(&?[ 0ɸ;>?i,0$R?{,@0 3 )?E ͜ſz? a t%{?4(A bBv?o$?Ѷ,&F#'>MFؿK2IA W?/Q?ȵ9ї򿋧Zg5+꾃]>?3{@x%?L?LH's@>6M5|WH3w s/0xt@?=,>(J a$^8V8(VV{N@ϻX>P???Tҿc>8DX(U>O{a֓B2=>M=ԍ>>M̵@?e%?+>N>A???y=%88#A6~=h>y0׾`翓3qzE>zAT !?K>8? lOe{,j>?~>TZ@@#?I>-ǾL"(>ݴ>-C>~a>-!H@x@o@)> 2>U#?4쾕sZq={y=@r˚?)?T>.𾤙S>6z9n2aU@{-M0?8$E?tO$>о =zv⾾AY@x??B? Ͼ۾>؉aw8 ?> 8 澘#A_!?Pz>_r?1=((cDT?@*V?:1>v=ݿW>=@%Ji?~>?c\UY?>my?\=¥>|=n@m@?,"pwp<>"n>b?彩mk @G6>?Y= >Ԍ3?]?C>l??J>C?Y83?ō>¾OEC?>Z6?my@G>WQ?Q?p?J-b>?]? u8??!ێ>٨`@g???f,?$;N=;5??o]?H>lO>|t?@6I@? o?4?<@@?J?ѫ?&w[>C>p ?L?ܓ?g>>;@?ik<?S?voh>Ϳ7)@:5?ՓcO= \?1~> >F^>=A_T;AJKڔVd k tgjo=ш˼@Ɔ%??!ᤳ߽?s=I_zEq?? TN@ןw@֮~s?!7:B@ǁ4=zf_L <5>H>я?@6@ "? v?u>=!V'n?$i@ ('^,@ ??o X>8g>g>M5>?\xR? ``пxeR[@>9Q?M5f+>+?@(>?e<.?-?J@?gOp??4O>9?os?hs>2??W="-H>@^?^l??ߏ??q ?d)p>MR?p{?Oľx?3>?N>?g>?> I_?-̿zc?㠽NH>Rv@>1C¿_>メm>{-?!% QF>\k>^V??QzUL?t|?)>W?׾m]? A>ƾ|?![C!c;?d5_N>y?j.4>l-?#?jx?X@T>), [?p>*=N">>ܿ;rP?f$?f?0"T>Ԝ=F?'W=7?>??7kb?"?𾙐0j>Ba ?dm?|1e>:>>f?0i>Ǹ? >k>S|> >#e@y龻.?M4>f>??&>=#>H?)?·?.U鲽>]?>Ā??72?d9?=1=>׾?7>(>-?]?Z>۽fAs$B>?9??`?l\??> >KܼqkA*G}?@A91.% [(?{<2l-Aܿ?@D@MͿA5 =>n?#З-GſA*@ne@_x@IVzp)ٿ?O?? [ԃ1BQ@2@?rPI %>h?{⥠d>c >)M̿0B @{@C?= Z#Զ>>laIBN@@ʜ?TοˆjHԿ˾T5%:_ ˿B@̸@̤4?ܹN;]/%yA?I??eT迈~B @;@@w>LB)z/.R9zf>0B44@O+@@Oy>=qԿ1y#=o߆Bd?@;@QB 1xm9ÿ-~>T8o%B 8i?%b@@!IU$V2`%a>,񪿿9cB?= @pO@&E#~ ʬ31hV?4O}BB&> @@8;sK.-]=_ň=[ܿB8c@e=M@W#FfЇeȸˌQ>s6o-BK)Y@1@mp|:&?.+(\=, $dBU&?UA@SCDKK*#>k̾LB[e@e;?;<؛5-#RE⿱שG B^0@Ų?+K@+) ̈́ V{BBaȄ;@jN??&/Ӻ+kc O^ٿ*ݿ8MBe?G@Vz?Y'%  >q7/y>vf+ᄄ=Bgm@5@I~ u>9Qp6^uL你Y ޭB`j?T@C<]72҅翆Cо>y@!aB[F@,Gõ@A:c -H_ܿDdPG;BY@m@O?)~>MJۄ_Q$|~0PrAB_Ϊ@-W?KԿLs#~m'>[-Bbgp@yZ?ŏ$=lZR^͌Xֽv ?H TBg@+m!?.y0Z 毿Nݿݓˋ ?%AyBl@C<*W2i3<7Nu>T¿"Bp@T&?F?2RU>S>I꯿@­y?1_Bq`?j&urN43Q>ˍȿYy ꩾ}L8%Bu?&㐾&QX ?q_r5v0zʻ<BzfO>:.ln9?u mQ ,@jB}]kO_}&gf?'yɿUտJ:Bჿ ׿{TѢ%W? .=g%&9M0KQ}GBYB;Ԁ:u!?A4؜s<ՅoɸBv "ɭCDeQ׷?TV=ʭTB?l`EW1?g>mDd侻ʟ1[I>B°6}R;i_?/i뉐˖!LB9u ~?i o:.?=BTa[ "B0q^7#SS?8:O־⿤IBtU2}u.?'|7gP пK % B Tr*ٲg?i(!abQ, &Q;{BDzB;vV?(ؾѪ+N;!5,S;VB_Nڿht労?~g.YslrF&T)B<5?Tڿȃ}?'+c?~p!|6BX :H%Ϳ&?-xFJjc=gBZ%hzf?ҌLiIRGB(Fahrph? C v'jB~JcS࿰{ L?bƹO5,Ͽ0'']ᅬB{M|ݦi TzO ;v?7)( 0mrQBv~bbm8c?`?S|p ̄O9BsK`H Gy1~6?$vCV4Fg LhۇBm+$Ys9;C_>ݰq,ZT`JBj=kM`Ft~c>qBJs'ieT8{Bg1?Qܸ6>׬sysxaT?/(tH3\ o⿴B`M?Ul>Ccͼ{<]ʾ.BR?%BZB2@VtH>ԋqQe&aN>1VAC} `pB@@0k>b1,`Ʒ>MN7gSNHȿY\B5@F?!ˀ C}?G濫Dh Ҽhf" B*Wm@.>uxff>࿌rz 8R$/B@?M?q*j?8A;@sY>Khzwzup$CtnAu@Xv@`?g'Y1tͼẼAE[?󑎾{?}?v`>}WO() ȿm=n\KUoAοD]J2?x@,/?^`ح>,,= AB_su>E@ F)𿉸IۿaM@?)cA`}2"'P?Ϳ>¿9(v9HEQA>E3?>$H)=`J?d:[wF?>Ê ASz:@ ?Jÿƞ?t8to>urzξ0I>=>CA? z/D?J?뿀lLr>fo &>Aa=7WAmL[?+I@}s4 ^m >i-At%XnHB@8z?𮿥(o0 %?] ؊Va AY)m?ޖ?Pe>\>=Ŀ|??|AYÿ:"@ ?G?,1vvh,>8󔿉!?U>D4A3F(K@l@)xs@`\>ӒBd1>K\{?KAg:?4@-`&dCaFN..> (=-TA(?y@b濙r>%>cJ$?7<6>:A5ܿ?f3@.!*BC&Y4Av?*$;Ψawj>@フdk@m_?\@ ? >}Hڿ㩿ͿL?1@J]@]^V@G@ ?>{>B>\.Ͼ\T>Ȇ￉?ܿ@Lˎ@?>/4?ժ ?3u4@?j=>4翎Y@&Rv@.s?e@?`?z^?N?"H?9>]Rֿ?~'[@mp?x?7???V3?>'+Tz2煉@"*Cߒ@A@@?jg??yǾ?1O>D>D>e@.'V ?P}?9?(>8? 쿲>'>?1d>*@*?ͳ?ߪ?~?L<&s>>vE?HB?"R@=Q=y?d?"e_>O|?t4> > >@I?L?L^?[? >݄?>=?p^a? ?Z>\>u??|z?Q9??Qw>?M?)?M2?2t>f?,>\?X2?o{ >1?Cd?0G>ꠙ??^*>?(s?-?u?t¿Yܕb>m?$e>EX#%gYn;?uIvKb>q=t^>2dD,{L?!r! bb_?gPc=?>5%?GF?kC?>>=ROC=g!lӣ? t?AB?ف??-??II= |ؾE4>g_?n?@_?d=?l?iK?"?8b>U<|H?c??̏F?X0 ?$?q3?澽+;j>H1?4GP?&?>"w?[j3=*=fz&?^]?iVU===>K>XW,?|>(??Q?&R?'?*?z?!Lf>Eg?ߡ_?[?H>i>ɪ??4V>?3)?AZ>4kpocketsphinx-5prealpha/test/data/tidigits/lm/0000775000175000017500000000000012771610005016576 500000000000000pocketsphinx-5prealpha/test/data/tidigits/lm/tidigits.lm.bin0000664000175000017500000100045112771605033021445 00000000000000Trie Language Model@* (# *# fffffffffffttDohzeroonetwothreefourfivesixseveneightninepocketsphinx-5prealpha/test/data/tidigits/lm/tidigits.dic0000664000175000017500000000045312771605033021026 00000000000000eight EY_eight T_eight five F_five AY_five V_five four F_four OW_four R_four nine N_nine AY_nine N_nine_2 oh OW_oh one W_one AX_one N_one seven S_seven EH_seven V_seven E_seven N_seven six S_six I_six K_six S_six_2 three TH_three R_three II_three two T_two OO_two zero Z_zero II_zero R_zero OW_zero pocketsphinx-5prealpha/test/data/tidigits/lm/tidigits.fsg0000664000175000017500000000156712771605033021055 00000000000000FSG_BEGIN digits NUM_STATES 24 START_STATE 0 FINAL_STATE 23 # Transitions TRANSITION 0 1 0.0909 TRANSITION 0 2 0.0909 TRANSITION 0 3 0.0909 TRANSITION 0 4 0.0909 TRANSITION 0 5 0.0909 TRANSITION 0 6 0.0909 TRANSITION 0 7 0.0909 TRANSITION 0 8 0.0909 TRANSITION 0 9 0.0909 TRANSITION 0 10 0.0909 TRANSITION 0 11 0.0909 TRANSITION 1 12 1.0 one TRANSITION 2 13 1.0 two TRANSITION 3 14 1.0 three TRANSITION 4 15 1.0 four TRANSITION 5 16 1.0 five TRANSITION 6 17 1.0 six TRANSITION 7 18 1.0 seven TRANSITION 8 19 1.0 eight TRANSITION 9 20 1.0 nine TRANSITION 10 21 1.0 oh TRANSITION 11 22 1.0 zero TRANSITION 12 23 0.0909 TRANSITION 13 23 0.0909 TRANSITION 14 23 0.0909 TRANSITION 15 23 0.0909 TRANSITION 16 23 0.0909 TRANSITION 17 23 0.0909 TRANSITION 18 23 0.0909 TRANSITION 19 23 0.0909 TRANSITION 20 23 0.0909 TRANSITION 21 23 0.0909 TRANSITION 22 23 0.0909 TRANSITION 23 0 1.0 FSG_END pocketsphinx-5prealpha/test/data/tidigits/woman.ak.8a.mfc0000664000175000017500000001532412771605033020631 00000000000000?ܙf??oo?se?=#?:>o ?DA>J?T?9;}J0?DuL>֋? />W]>F>4?>35D5x>6>A?zcRu?]?+龗2;A>=?il~@|?Xل>).>]??ͺ?U>=IJ?)>į??I?c灻i? ;֌"MÔ)?|k}?>,v>"ݨF>i?6>l?'?[ϼX>o?O 0a'_(?q?J Z>nϽ5ל?8?t?/T>dž<2~>\n?7?ZJm? ?'>v@>?&z`g?(Կ >A8mJ :?d,?9?9[?1|3-?'?R>>gQs?>^ >hs?g9p>?#?0?Ux@??=>l|X=$W>Q? gF>> c? >*?[PVF? ~? >?8_Y~о7F҇M>{>-?րWe? :?E)X?.>r>8Z>ξZ>C={> >~D>z@k>u?}>>k?>Cb>['λF0o=?d??M*߾C>>2)U?j.?>VO1>f>?m=(q? >@c>n6q=X?u?i=kN>>_I>@-?$?<>F徼?#F?{oR?T}??!>׽ A?@?+*?>>P=-e?`?:>U>k?K;m4?6ҿ\r>?cy? >Vv?}?8>#>Y @3%?dǾ=lȾ>?2NO?&;>-ؾ5ό>6>[nb?$?~u?h?-?>Ŀ?iAD?!>c`X=:gf?A?d`?ʾ7!ydQ?A.'=>?9.? d9@`r?(:=\{>:1m>7Q_>HH?z@I`ݾ蛾~?6?#+>.>Ze>3h>W?x ?5˿#t>=#;Ⱦ稾;UOe?Q$Z5q?1s>M1 `0 ]W>ؠ?@>H=ߕ?x,@=t?\??5۽l58>{>tp =%?4L 7@Vah?'?*ɽ~ʿ&D>L?'?F5? E ?Q/ ?ϻF;:?De>jQ9ؾ=N> CA@3?fO?v>0j=[}>n82?PHr>d>We?ѫJX;@=E?>4M'P?Z:>?r2>Z>g>okf@5?li?B>R?cR>>Ӽ?J >l='@ޫ@!?N>{?X2??%s7=3Z"o@ֵ_j?i>x#Ž>/]>?6>̷='y>VBj>t=?+?@?s(>?mxӤ?$"ܻ??iJ?h;?m@ ?;l>?:SM?cQ>&2>0? ?# >n=&?up>Ѽ=>oZ?>˒>"1XX>=)ἥ?6s>ˤ>.X/?-<5%o>gyVi>Vɖ>:=.> _;Zy>?h?^lE4e3ɿ>~?A>w?F(Y<۽>>79F?>IzC ?#? m/=d>l<=@9 @ ?A[=>?K?޲?,>7('&v@kf?M6> w~Cq0A}4>̚C, s50LR?.?7p>-~?\8R?p=~>#>? =:$j?KW? >?:Z@@Y ?(]>Z?GG>տ>_f> pX'Q?#vAAM?ؾvT+;? ?qN>_??@Ծ?:R>_@Y1@Y?)A?(>\89??N??i9>R?3BD>c/?=t?9=΀a0Y| ?J?) :(??ЪؿG=gW>_? > շQ|Ov?T[@Ī@ ;Qg Ia)?,}G?ţM":>=4?!A@H?ݕɿv}?D?/>G@O>}fJt.{/?1A*P7?\"qm?`?z@t=[4r)?N@$рȽW(ӿy?6$?X@ ?E_d>@C=@{o5iha>c#?)+4@)qn??ɓb?zA~9?`>^?Ml?wXG~^?tm?Z>ʹ?܈>?2#>IP>k??͒==l,?Ǧ??Ջ,:?C?>?N?c8;>,u?M]>4@Dƒ?,??u%>>T?Cd?6!D??=KB$8^ؿ|?N?*1B y3|ii?|@L>Y>)$/"* H>ϤiBvܮ?C~ r?5.?2E*u0c?'E4>:?aϿ6t3 ͳYS Bzt"kſ~?>YLdXs\ypBzgNfv>ɐ>>¾sӾYR IBz_x׿l俼r =&>)RYZkZRkB{"3?.S(>eeyt]迈;Bz{Q#|+җ͑*G?Ӿ>nlrve\ W6ݿ4 NBx_(>8vA}k-Ox~:XȿZ?2KBuk.)>0 bMfVI=0kT 'oeBr.h=?lZBFiF!h%ۿ~u#PBs2[?b9dυ!l7_Ez-]ɿNjÿAtJ5BrG?z;ڿh⿧rǽp \пT뽄Il0BslUf@GW iĜ#HZ=;V>kBr U@GT8xLʹоF ̾ =lfBq@BUݿ;)s <C> \_BoF¸@OqBá3H;D}>P/?|K׮Bm`*/@hyھD2x  %S۪>?$6V2Biy|@CC)Q&5] `= > e? 5?k_[rBf>uY@,%9ڵ>7Rn#>>?B?|ErB`fffa@+NeX{w=\J?F?@:<{ /j>袽P4u> ? _roB[Dz@]R 3jh]<@>d4WBY)@]r27^"=k>Wo>i.DBVi@!Z}>MFQ_BQLw@|yX_O:~|U6Y!ٚjBMl^@劆WN𓿬PRſBxp|T -BF j@~s>IWvYr͗@ˎ>0+mN !B97Ӛ@ >S=b}J`u9пq=&YB%@?ki@eɺvܾ2.1>RʄB29p@?l:pf;lxr=.>HB zA?q(*~yrmIOF2?)(>B?$J@߼@,qþјqC`k?s<>w=Aw@{U@3@%34>@V)?+2>li?'/@U?;@J?1  !%A] rϾNVeP @Q>tL@G=?n*+)ŏƿ11s=@jQQWx?6?X?׿-6`@\I >3G&n>>>zؼ?J!?g O?3q?PK5x7.>뗽ρj>7>?^T=|%4??VܽGzվZz>V˩??g*Z =xbT?؋>{,?;%?`48?E>>qj?GF4x>r?dD?F?ZY@6,D*?Ʊ?>.>%;3>>?3?^Ң? >g'Al?5־"(ݾ =y?HӼb>>ŧQ)?.C?\P=B>K$!=ͫ>2"A yl?( >sN>꾡6 6`k> ?7?~~?/~|=GL>y*<=>՛A%5Կ,@;>!;8Y'r'K>ďAL+^?u@Lp? +)E~:K鄿u@-x }x@?V>M5 gzƇpֿ?B6Q^1x@Gz@9@8?i<RCcF9?&$>5[%Ad@9@=?*﹠.HrjLK˿G?ɒ྄V@[C ?t>R#pf87ep9?Ni@ZX)>ch?0?u}ۿb'?,޾?V>0ː@P옠??b)?v^쿨g?uh\]m?{?(m@zQ>R??Jܛ/:B=7]p?:->֫`@b@h>=7A??v<>2?%$@ @P@?c=A:ſ`1Ϳ+v=_D>F>8Ce>Uۭ@4@;6@?`70xjِ=M9== @~(@F2C@)l?8=w}g _v?GFwI>Ǵ>? W@@,> ~sB@[f9 ?e/? ?tr2*?h< m,==o?'d?y85>!? c?&_?B>ց>x~4żH_H8>U>cm@Zoqxu?ϼS??(ÿF ?{p>~J?0Q=x 2k@qPI'?e (@ ߾f}?yt?:ġ, >o'A=??>}=b>؅o=0?J?6B+>f;>:>>?w??܃?0r>hڂ?h=>>O+վD/?2?)>"P>:>e?Tξ'$}b;% X?ܵ'?;?&|e?z>?M?;>t>C3=?MG/?>e.?*=k1 !?o>6.u8h;sV?ԩZV?>n?>>>(`>[?3vX>@?.(]?1z(>W=A?zϾ=~>a?-?r?"[Kpocketsphinx-5prealpha/test/data/tidigits/test-tidigits-fsg.match0000664000175000017500000000231012771605033022477 00000000000000one one one (man.ah.111a -23836) one (man.ah.1b -16020) two nine three four zero (man.ah.2934za -29903) three five oh (man.ah.35oa -21384) three oh (man.ah.3oa -15858) four six two five (man.ah.4625a -27355) five eight eight zero zero (man.ah.588zza -28085) six three (man.ah.63a -19220) six oh one three eight (man.ah.6o838a -29624) seven five nine one three (man.ah.75913a -37448) eight four four oh one (man.ah.844o1a -29307) eight (man.ah.8b -18143) nine (man.ah.9b -14690) oh seven eight nine (man.ah.o789a -24922) zero four five four eight (man.ah.z4548a -32667) zero (man.ah.zb -16776) one (woman.ak.1b -17828) two seven six three one seven oh (woman.ak.276317oa -48411) three three four (woman.ak.334a -27875) three zero three zero nine (woman.ak.3z3z9a -36785) four eight zero six six zero zero (woman.ak.48z66zza -49491) five three two (woman.ak.532a -28221) five zero eight seven four (woman.ak.5z874a -41182) six seven two eight zero (woman.ak.6728za -38245) seven five (woman.ak.75a -22517) eight four nine eight three (woman.ak.84983a -39414) eight (woman.ak.8a -17320) nine nine seven three one (woman.ak.99731a -34736) oh six nine (woman.ak.o69a -31297) oh oh (woman.ak.ooa -20626) zero (woman.ak.za -17055) pocketsphinx-5prealpha/test/data/tidigits/man.ah.6o838a.mfc0000664000175000017500000002441412771605033020700 00000000000000 B@63N>TI?ٿ¾JHG?d?m8aV>x?x@ yg?^>i?V>ᾅ?B?f?4 n>><@1-?辆^?L^˾~ZI=+>HZD??3?8> Z@fC-|?JzĿedû{z=T>'r?*KI>p>@?X=gr>䂿>ڢ???*\?-a.jS<@6C@3>Q=A>hq>>vr>dKO&>? @Js?GFL?jE9?2vWl>;62= Eh?1 @S5<5?P"w@?!>i&烾z5q>yU=o}vA?VF%@+8ER?zȿ{~?>5?>=?{@ܓ?'.+[/h >=\?ƾO?!>yp@4i-8@1>Uqr>[ >3!?Wk >7@:I^:?dD X.d⿒+z>Cd>>ת?=21@ k8d?a!нD߾ ?!6(E=J̾/H3@>pf?靿+ ?3ѿ1¾Ba?&>s?>L? F?C;@ ?s>w>ܾ)>?z?>W*Z?yP@x7?+꥿ȃU>>^?u?o=p=p>v@HUM??JtM=oI??=/? >֣m/|@<^?w>ny%' R@H{lJ>BVC@"dw>!{?p¾Eʪots?Q6?&L>sE=K=~>*@U?Kx>*ƿsaed??_ ?g>.Ҿ@E@.F>C??`8>*=Fe?e>)B>e!>z8?qg>̽r6"? o?>->Ϗ@eW ???Mž$cEC(/A,Q-?⯌?>'1&L?!V?-Y>IW>!1>f{Aw%[@ @!A?ZY>ޫ7#?l"4?ߔ?1?M> AaYu@)@CX?#%{?>º?m>?/">A?*?\WA@6Y@܋@?`q ?FJA5?p5>Zf?okA@@;r>?sGD> =?=[oG6D=*MA±q@r<@RD[??26??>Hr>A;Ḁ?Z@I}@>&">ԯ+q?3d>ܾݿU=V4A`'m4@?jH?Lο?>Q?Iʿ@QAjH@>@??;Vb?Z5>W4㾝hAAІ'R3@~-C? Ss)?DZ>>ȥ)>C߰~A@7e@oz\/{=<-%*(]?n2j Oƙ&GAC@l9_ZN (W?=E;񷿥?޾{գA:BϘ@r"먾I= =q~W^ t>^A;@1=}S13ꊎ>L ?7%s> >4\A>y@v=@1fy 4? }+3(QYs?%>WiA!=@aa̾b=+홿տ09 mߘ@RLAO“@2!㺿錾g:վS=kx<wApBp@\#[niuV?7?A?qZGJAN@vw:;|>?ʒ(?2͕?{Ao<˼@^辒οѬ%z>ͭ?tAb[=Bx =%V @]@ݿ3&;Ŀp>mK?uȅd?+R>N!BB:?T?B?a L2?~̣?鿪?pK?Q-B[]d??>gB?\ܘ X?՞Z?R?kBYn,]!\?H#?RS̿4I?\]t?ſ)>??BY*iz Z??Ŀ-;G@ 뗿7?j8L>h?E)dBS=9c?:J@"l$,@-T?u·>8G?""BC"6?4@q>#>LTB@L'7?[F~l>m06B#@\?@W?!zt@@1&>pp>>R澺AD@l>H@?·k;.@&hH?{FEA;d@BJ@(@@ ֈnF ?iG?(A>[4A9]@e@ ?ݠժ?F>7? øABN>K@*fZ?$տGo޿Υk>ƻ>6? >}@?>c>5Aq[#DA'#vo7?m"[g/"~?T-?Ͽ2<>QBH?# 菿#Gv ?oy= ?љ}>h>ɒBU|,?Bm?ě, ?4t??U2.W>?.B ]?N̾8R?FC Y>[B4O@I?v>Jyֿo?׾]ޘ.s>X.B`HY$??K?)} go-?$o1Pӿ?\.x?^BlK$@H0?rL?;&?zI>}x?$vf>2BMI@ezW?h4= ?i#=V G?1G?p\B0g?{@?>&hx>m?A ?@{"?ZԾ_Bu[Z@Q >-b}$ #ALv?{GYj>Rd8B&mL@.?!?egj?fpkO?^? TB?$?˃*֬v@?{#;K>׿s'>:?OMB ?|@Y?˶>~v\OP?޾a? ) >? BDn?Q??&b_L?mp5?ѾeJD?BY>]P>'II;?厾(@Y=CT?BZ>&?XRY??>t@ ῜_n>(nB?BX=.>1k$>uk Yǿޤ}?a?}H?#蘽Qn/?#BW?վFFg`3FD?HX?A? U(?BUr?EꝿEl!J>x N?K?Q;?A=1!>-BS?Ϙt8T1C? ls>Cx?eu?Q@P=OlBRml@T?׈e'?\V׿j?1@ 3؎ =ZUBN8/@6HC>W 7?P{?[?&>]UݾfBJ(W@Om{?dH>֍RΦr??l _ BG}@t?$%>`2aI?ۭ?2WVBCp@K?v *>xIg4?seɿMCU?H?>x/.dB;K@ð?ʷ7) _;$>ucz'%O??T>ɇ|B7 8@ @k&=~ٹ>ڷ6係 I??>#>)B6G@@U>ED9ԿuÿJ??;6>kI> B7@@u.1>gٿm=??H0N>S>v,tB;N@??ˆ }>H2P ???N3=4BAt@-?.0SVX?>AZ1?o?_i-ʔBF:@Ĥ> +S> (P@ s?ֻ8is2-BT?+ܿ\O;> Z$q_?l*?8N?1> ''?WBU?>?kڿS'x?)>؈>/.>i>$??XfBR?*=S:@ҿю3H @"ؾ_<>hb??ھ\-BP9=mS> @+ j9mlaX@ Rp<> >P)hnBP>@@^'rWi@:?㳿 >O>>q@£BOͻ|>@pX4w?;)>&">P>j?*BMPо?@+K@eD?%>d>bh>k۾BK. j?ܳ@+' =R?Q7|>>->C>=B;q@?92@cgGnwb>2=Ϋ>>0>B$o b@U@d&2V]5FZ#;<(|?%>^?.GAp@0M@ClJ@ر: 쿙=zg?T0~=*9SdA_@^n@R>@?VgM^>0xP>*hp{>={耾LA @W@;@ls5@ .~l)i龉޾x{#,;LN3侒4@s?U@n?c!?}?w>䃮/km/G)7K@>#@&%V?Os? &SsD]/;>h>S ?'r@]V19@5J??bݿ3Et݄>>LUj@&?1Z? ]l?RQ0e>+5?>,{>vYDž&58>@J??e?H?NӾ~tB?~?g[̾=W>A5Ƹ,PF>_kkp=ِ=>QтI=U=kѽ (A'WFqNֿ#:=s־d!!#1ALw@&)@˿óvn ?A9qv"??"6+^A7d@@?ml^?KĿLr?>c?7̤?5[>Hq AR@@7?V+'?E~>nQ<1?EA*8@U?hrݽA ?AHV?~@>|S>(A@Iw@OlY=U=ҿ>x???A!@LC?54?Im?\+z?Ao&JȺ@N oI?socs>.>l?W1>H)]?rBI@AbIG?MՔ/do>7+?BDBh@1>|U#_>?p^⹿!?55Ac?&@?"Pి"??A@ AP)Y*Oc?BcU?8c?)οݽgAP#=̾͘"?@?Bѿ pp>Z?3'? >4SοV$;BAhK@a_@R :F*>S>$GȾr>Oj=h_B!A ȯ7u@d?9"-FaZu?*>tS?^2=-B)CJA N@q?#J= =2?^!u*?S'B/@F\F@R?lB>߮ W s?d_>-B4@:V֬@E?=P't>PoK>g:5?8:>"PB7@6J@HS [ >;XCy?grB;W@'5[@UJ1*a+?zTS>>=axB>z@G('r@ՈzW1%?(?e-)i>c>X>B>@f=@V)H#@=V|?>dPAMB@?y&-x@0RYF@)Uȿ@>>r>KB>Q??@p|?sU'cZ=)>5I1>B>=?@]C1?MBؽ->z>IB?O@ S@R<"𢡄?·I4~/=>B=u@U6@fD`q[?ނj<>Ƶ>m6*|BAW@7[9@Vߟ ESό?3Z>D <> &l>ptBB~i@(@ɢNƒfc?I> jv>2>BD¿?@'Nm@»w++K=Z?T>R/>/>/{u>/>=alBF~4C?@Fh3h/=4?4>,>I>BJ=?@;te$>*?tE @?<>>`Y>y/BLFy?N*@XCg[u1l??YS>p>FlBP:XF+>G@QShgXϽ> ?ſ?4> j>҂z[BRҟ$OU>@y]Bt.|5A@?ӿ?to?>7}BV:^>@FN8`?牿> ?M?J>=BWO44@= =-mF?@?Jv?>],ޏBUǾ3`J@TM=9<a@ʎ?T?>{NQBStXs\Y@[g%Tk*@'ǩ ?4ii>8>o}BSM|f@\E|+ &e\`?R%&?lqa=>fiXmBUNmlxu@P&YgV ?y><Ӂ=݅p`BS4 F|@G1v8FF?辳 ~>z=>䭽ǞJnBKLmb@SwG(1{?É_?%y>u>^iEBH:uO*&{@x(YL?ԝ?)O>Y>|BKBThS@BE?ouH5?F >9$>BBDg@8>s@@61wzg9?b>B?3<gjuB5wvZ9?R@:l cN/c=+ٿ>eT?R> =B8a*?i@D@u`q >DqH>0>ȵ+>>mBB7b?Q@ϴx]LUb?/H'+?S=?Zk=pB 9@@d_;*:', y8 >u?a[?=?VA.p@j ^@&+숿g:8>ά?:w?j?|AMD.@C@@?5a5U*m/g? T>׫=R<=: AHb+@ٿ2@]>$?=ҾLp=@>:_"8`ZD.5@PN7T- ?[85޿AT>7?c?5C|G> =ħ@׿]@@L?Z?d?Sv?U4?,?O?ss ο>0[)@ 8?$ȁ̾ dtfo? ?^>=:>A@FοUqJkj?1P&HRay.>A͇@Ȁu>Rꟿo;V? ׿xw+Ϳ ڿ?14Acn@/ ?O?mj>i h@yM6c-tޤ+X?A+5?e?[>_,I=x?P-&p3C>S@,J[?T[>N?K}?'v=#48|@>?)󀾳?3X=f?@(08j?s=)=>Q?;D?e5>?/>>='@yB?!A|տA'> F? >C?'Y0ٿpb@!۽g/#ܽ˖6zR=>䎌?? E2A>Ճox@ @?븊nNLm D?H>uh  A￶`??>g3='o<,?Xz !2=RA*?r8?d=^>ǃ\b{9=ߩlc 3 A=]\??( ?5Kuݽ=y$+=dA} #?^u?Bƍ?-a0r?$d >Aiѿ61L??}x>wT-C>)P?<3D=CA@? ?%>oXH?' ?%f>NAK>(:J>%Ӿ俷>](>~:"wz A?d>h?T/ۿEzS^Kqֿ)LA'??2?&>n0rem@ɿ@0O>U2žݖA(B>ν˶>reF7\ hz? ?ͮ?pL?>;A##s~>d¿}5?K%?IbrY>A-Grr]>o>㹽>=t*[U'/?f ?A]'3OY?g>T">->=8x|JB\<@X)?bAM\?W) )=?8u]e?f79?=A=IWOv> hAuyF&> ?nDЀL?&iC_f@ՐYl/Ai#ޢ6 ?}Jդ?:ڟ@>)*V֪fAX⿹ 6e>)+>UeVNu+>U'>NUrAskܾϿŇ?f?ikU +]t?>7-%ow!忝-Aq76 !?j?J'ξϢc86?5F'>pocketsphinx-5prealpha/test/data/tidigits/woman.ak.532a.mfc0000664000175000017500000002635012771605033020774 00000000000000 9>9Sů>|??_?2;?1 S>Gϭ- :>/1?>>0O?lD?L=g|>A.?_>}t_??|? >Xp >z>K#>ڜ9?I>=-+z>f"R>>Ҿ` = >=@Md?`?ꑿ'm$>|>@?kŜF_п J׻S>^.==?ye?Fl@ ?&Y-7?3O?w̔>1[>0/uW=Dͽ\l>whW??w#^?Ez?? >&>I?W}?w?RQ1gEn?& >]?>Hľ@>>ϥ?1?P>?ژ3?)?c?׈?he>% >2T?=K?Cc>>T? (>(þDx@??2;>Ե%9Ҿ??i)?\?Z 0>h? >n:d">@3"?x@P?M3>_w?ˊ?^˾>?ߴAnǢ9}@8[ 6E> Sޔ>?a> d@%Y >>@$1>Ϋ@w D_t=<"04 >!?ZB'@=??=??JTg>^0@>>@aeD?S?9?/*x='w>йK> Y?ɽe-@:4H?If?yVaDRԾտҿ=` >X2.@@ٿ&7@ZŦ ^꿜1T?40HƎAk\@xG?[FCO͖=֩uiO?^"{@݋x>J @mvֹ=QE?bt?WhC?Ӿ ?|@,?w>r>,N?- $?U>϶rj>m>;4>jr >\Ҿc<?;Tp?j_?΀">[]?Ҭv>=b[O?X*?93/?ʹ>[>RG=c@?l@~?sJ>7Ҿ] ۺV>qG?;g>*%?JC4?C`@G=0BfoJD޿p^>xA_ͭa~9N6k$=w/6>b!==AtnA$;Oӿ\=zqۿE-νL@I?x}?࿄@@u,Vo ^x3")@:OY?qV?"X?&|>P濞8$>C>е?>"@kR:;@:?$?i?+IVB9?=~= ?@>A|W;3 .yc.Md!e(Zݾ=AVs9A Z?XֽK&㝿h QuT{8=^'К?*8{@ (?R|>ɵ>'8]iLпXX>+.0=o?{@"??F۾&N? g ?m}?2c?Z>{?31??ؾ4b>?` O?w?FzFd>7?;>Spvu>S?eͲ?? N?Ζ?O ?%u?ukv@+qt ?} ?e?e?n> (>/?]?>?C &>ep>v?}с??=*c;=?<>?-Q? 9?]оN9xo=Hu?L?++1>H 9^?I>U?m=͛= >L4`??T >J?5?>Va?zD?0ZJ@"0>܆>yK?pu?H2?T?Q>Ҁz?lw?A?Zd@`o? "? &>e=*>c`?w?JdZS^9A?6 ?"?y \?_%>>O#>hz>g?M?1?=>5?X n1?Y=j_?z~v>{?&6?`I?E~??J w迂>T֞x?bdƯhph۽x?cV?8?zE>?ϝ>3/>e#e ? ?1?,>?>4?ga??e~r{->{>ʿ^%>">h@&>>~A#xv!P?`X&:Կϓ,> b1/mg(>hl@mW?y?|?\j>,.?9b?@e?}$m iA=2t=??A;_[.7*L}澫_;1e=B$5B*E}0_UX̄Կοq ݽ0Gtip>@F/TνɪB3 3nC:Ὶ}G>K z<:`&|oBA0@pX`^4">*0ؘG>G_5=(`Bbh5@ͭƱrXa.M?By$=^G0><■pBk?E[ٶomꢿIοB?^RZ>3Bp/>m/37 >K_?Xօ=a>"M=>g|Br)#5KC=S;S7X> Ԫ kxs=m%Bt;أ )T޿>ҽ$s>e׿sn=U3؉RBu+s ӿ喨.>r t>Un`=I _.BsܫX [ +>űV1>>:SտaLh4!BuCb { ǿƾ)>s]JYQ> 氿K'Bu ,">Q=3@'c8 GqBw5~u &=ߛq A쁿v/ QB{-ݿS> ?3L>̈́ȿ(> ʲ%ByJ`8?vaZ>!ԾpQm,V֎?RXBzl62zەc<rwOr?Bzܒ2/ EzZ\+z;߅A^ vݾ&B}҉Cq9TTпa>'(}Ϳ.ZSTM@vBŪ^b?9彉VxYؿxEb=LՓB|@`9^sCTTOc7?"C]mܿBǧ3lH=.>]~*. SB>xiN.>2 ad>T΋˿ mB*%?@WT-_J?vn˿Qik=u0`B|om̉? 3*@(I3IFmT=ꤾ8VYBxG༻݂[N92#`@u0Ͽ/ǿ^;퇿5gyBt5ޓ_$ɮ@ ׿WX+y ܿ𾿛Q/Bno ju%?"=۴`=]~)Ba)?PA/?=O Կކ~n;ؿj6BHR@@5?E^{? H/,*u7jiJB'x@Aq?@F Tdia,+=!m" RPA>@@t?(ٿ2ſɌ*t:A4^@,@Sk?m *+TB(p?ăEWAӗo>Bh@VAx->hݿVh(񶦾΍QF]Y7TAliJ?`=˿aJ9D\l皉={1>ԼA}o[> ;>yLM>ӕ>[2I2<>A,LN=[`p>/>??d>NԿ"þdAgm?~ ?ӵ??jS?o|l?mf*>2:A>A -r?+rX?A׾)?? ݢ?%!h?Iƽ슿vo?#ax@, ?I+"z>?(s=^ ?&n?7?/>{F>?xaP?&Ⱦ48rD7ko2o>*< O=1@gX2YX>{ƒĹ,geɿ`Bx?As??u?SL ( S>B(Bc 껛-qb?+?^?4@?i>eB/@Q?(Q MG3"?@޿?+ȿG⿫B]8KUIޅS;пiR8:s=-K;#tWB^QpOo GTDJM*uYWc(>IBV=$CH#?8q+2|">q? rh0>-1?:Z&|B+=֮c @Gf;l̿c >3gMCNhB34>3a@097ۿo3f0kv/N9u>BN(@WP~?)F"S1lx:=vi TBW6b@3< >܎KQn=1@LX=tо{BWF@k1Jőey#5|6|BW'Z@rn~>&lW ş?-㿋~omm ^FBWq@,Լ=1~el>=X汿L]P^yBYe@I\V">[gzu"4>¡G#}+6TkBZ@?CXz"uk,7>Dfe<8>ڽQB\~?H@s?e: G'=T'Sb}b ?:.;#-*B\>~-? :Žj[ym?'!X~ a} B[VJ)]@2IM5L>ڰfRv)>t>=ozBYbP?@ iBȣ/5AM?%S=p>_P+BV7?w@Y QiJ#⺷?'ܭ?>#D7kBS^@z@v\ TEi >Þ?^> PeBNR@7?T^GV+HO>?KA{>_![BGGP9@?y>-0 @ݿS&>)T?3?>iB>)@6? k0uN{>>8?lſmB8f@B@*S\.|n?RLXB44@@ 6%)l']&2j>3?C ٿB1V^A Ȇ@#e/!|t;7?? 9YOzB(2A`A@ ӿn3B($r׾d?>>x, Bc.WA5?ij6ABX>[.(mc>+v0Oo,A3>8Aӭ@ 4 f=*=ѿҽJͿ,KAJ?]A3@,?zƼc%Ro>>[># iJA@+3@m@a> q/l IH?=>|>柘@Nϑ@*~hu ۜf`sD>P^?<> ?@ݿ|@:>e(<:;6@?G>m?%=$m 5@,<@n?޽uzx],;?zT?>>>6x>y}v?8nYU[_?o>?#j>ȗ%?Fse, >,B@?xJ>h^= >o?LBq?0>c>)ԾE̟?@'?y???w>[i>%e$6?ɾ K=>n?y?TX?;>/>/oD=$Q>ؾ1_?k%>wB + z3vUP敾Nྃzr> K":=Bx?E*:oO=&غ>(4>i[0>o΍B_r?&] ?ݿw @[d? wuC<5>QzݾkBB'Aաt@uR,?q> HU?%U<(>া'>zQ?}g{?&Ջψ#B˛+]2@X?M>=<{?|̾*ao-BcZ:+@, I?۾և>}&̴%7"?#C>jB4@Y ^s<,?N=\b[=΂5b:#>UoBy @ueOݾ=4EnzQ>eB&_.AHJ>MTXſ9 G1b濯Û'Fސ̾A ~B;F|S@?0F? 6',Tcglڿ[$Wd@BT>Y@zy?u^> <>k B>BJBU9cw@@ @?J¿?>->|j PBTb @~?$c e$W=\|-gc!ȝ4TBS᭿@@u ZV~s>\6>D> ;1BQ @؇?*Qvw$;?S'_9YBOb{@@! hu݉: >K>d<(FkBNsb@m@'Ö@A<~C?|GR1,BL\k?T@t¦@)~.=/z~:? ؼfR>BBH@|g%@Ƭ.t9 ~?$XxL%QPJ\BB?CJ@OsvruQb"=5mM)B8y@@&r@Zƴ*+=l{ eB45@@r@8 @3v|#ѿؾj+>Jׄ0B-6@f ??gyA& rNxl翛HB*"@Ii@ d?sF)b7j?dN쿙Ϳߛ+B,+@ @0[?N\E֬,72!8NB*?d@H?Ia4O.]b螿T= )B'=$?S@NX?zKտKum% t8 #B#k?^U@Yp?D_^lb%,!,&!)E;uBs?@}?uJg[ɿҠ iIU߭EW M{B@ `@l?K),  ܿlN~"qSқPm2BrL@Td@G?ƅJIe<4MPS8B @t@?4/;wA`.*jΖ1p,BMK@Ǻ?:R? `޿i S3οn5)AM>@ᔗ@"(?ܿ?mT'2 dA7@켨@is?S?_5_u?.aAOA@š? B? ?I?oX(>^!L YxA'@qhzp=@Mɂ@ ܿq:>5~+ʾ8j.Jq#AX@=Ǯ@\?=6klp?|9?n~+lf悽UB \?h4֕@|s︿pdؾ ?@^¿,?ZH AeI@?@Y>uw@YZ뿊֗?㽼"{?S¿*ӟA?@v@+S@i7zӗ-?ZT;?- ſQξ[?mƿAt=??Z@PE??Z>u敿"{?ƿ6%IT9$6?[V?xH?xAPGx>?k@(??篾eKeՌ?E9&@XϾ̿A,F&q@?@a?܇MLtϿHӈ?tA5#ȿ}@Ɩ+?I$>G.,?]$< @h"f AZr^t>@b?۽>->*@ƲB?M=?E UA ˿@w?J?!=*LSi=B|H[!>icC?~A[Vv>bnt@(l eb0Ǿr* Kt?RfAJF߾5@?>p澿mIn>VupR?S?̿JhA>/ @-p? `2>i<ɨ?#}+U\=?ѿ!qA𦿬r.@Qp>~ K#F?@?!*"C?QqjAH H7`@y?>v3>@:ĿM%>ϋA.#E@ׄ?>ސ??k⾚?9Ũ@?ξ@q)?Y6>:E?>|u>O XUws?w=L@>YYi@崿o#n<׭>JOᏼ5?ȿq BAA?@/??=Zcdm` 8iP?ԇr@DP?|@u'?Bف?X?5 ?F]Ht?F{'V@H(>.@@|?+ U?TǾ?~?@:]@/B? : Z$xw@><@T > @nsA?JEL?B~?JMz$B6=:R?ꔛ1@)>@gq?TR0W M=( t^qt?ijtH@6q@0!@(?cY>>85vgT @?u@0t?Z@0fb?#Q_2xվ?;@j0q?@>ˇCB]>yx[>s=(N`=mџ>&u@8?@?B]>}>J>u|= Ͽ0[?e@V]\?@t1@ -?4?k.>bY=?Lq='@]q|@pO@)IQ@*?n->ی?0R> ?Qc>n=h6@}?)g@;%>ky>:myّ0>YA51=@d@z? ?'[Q=> ¾qNR̫?B޿GK@Ahz>|P@*?VX(?&>b)|O.t?V+-@Fn`:@ ?E?R?w Ŝ=U}x8s?NT@&'I?I~@F?}?3?-^?BzR=q>T=?(p?)>A`> 3ǾZ?=>5>ʾ>*T>Ҍ[>@]o.? @5l3;>Ѹg@%>r*j>!I>Mc@??>xo?Hnd?mf =>>=B0pocketsphinx-5prealpha/test/data/tidigits/hmm/0000775000175000017500000000000012771610005016747 500000000000000pocketsphinx-5prealpha/test/data/tidigits/hmm/means0000664000175000017500000014611212771605033017727 00000000000000s3 version 1.0 chksum0 yes endhdr D3"  3?1?@W{?60?Ij2Z(wSM=Lf>>t>_>-`>@>?Ƀ?a$P5;>HJ> [ut@fg#@n^@@p??y?#s?B?^ ?I_U>u &=(ASS@Fkꗧ{?`?>>"ܩ"0V>ϟ>e/)?F?B?[?X??$"?A陿?ҿ(M(?]3)<5Psgݵ? r@!?W~;>]>=0=:aR=>->@}b?6E@K@'|?>tw>A>l+>?P>@q|Ǡ:"C-YZ?=V7;Cֵε&9Ac?! /R9 ?zK;>RN?稾KF~!|%Q??6?1?p?]>6>;M,>l(? @a>iƈ>&+h0?̠?*W]P@ ?=a)$=?uC?_"?;>$߽ @фO־3d?R쿗(?'>cܾp4y=-NE1c@1Bz?,F?+?G?{ ?>2+.G Hǝ?xe%?W?R?N@b`>}M?t>FA)@=.ѐ?A>:ٞ=bǾX"@,žw>?f>?;>Z>==>(A(@{O=D u>?@};*]֒@?d0@\>5-п MpI?J?k?f?T@$ؿ6@RK$>i>;)!T=@O).J~f=NM*?!7?Ŀby,S7@>%j{@PC>?ܘD?:׾>??v>*8@f{?I^?|ֿ\䠙70 Y`<}zA4T@2^>X?MR>ҿp5",>hGN&Sr>@>q/@?~yЭM'S?>+j>Iuн b# p=܂^/'_r8!4ъZ$+> >"?~?!2?E)5>ZI׽/>s=޿j >]_CO"{@Ŗ@g;m??!=²>_<,H>#:>A]WuT@gd u̡E?'-/Ɓ?Gn>h ƾ>}8d1>l:@9'fLz%G": ߾Ԓ6?Е? D0?X'@OٌO"*P@{?Nu?!Q(u?տ&-0]>V!Ay>a60e4n@^ >W>]Z?hG>X>$6?,?{d[>/I>.b?MпZ F4+ ?<˲=0?>ߟ 8@c@(@8??5?g>h<_0?ϣ@)2& FFu?H=_|?Z!?jM>ēVr?tEf @U>Z??>m? j?>V? ?y{?>>@A=俸>F[?ZWo>V>|>~<>jx﴿o_KE?9+p"f5& c7}l@F;?h@ 9W>>E UF?_DWB_>MqǾy 9bXdj?}~ ?'>=r0Xyń@%??U?L>̍>x >?r{>S!aQ?H?T>S߾?A&<7>t]c?Em?s?@? ??9/?e>ۨ>&B>_>ت>>m>rD"_=:2?NV  >9Ѿ?u[6q1@=\#@@( ?讠?aFO>h?{I>>r>>@ f?^J9i|?ă(4?<wT' > A$q@@@ CzQ=LΑ=QRH헼@q>p 8?п04x?./g9?է ?9@Æ1@bM5':/Op潆3?Yi>7 >$C־@ԏ5j>r?z> > >g;`|?o@6?+@/ϲCDu6>)JS[y=S0C@?{-@Ckytӿi,?E\ӾǾ~?va)V?> @u!y?jǿS>Y:>i[yoPo}?, <|!]d1?dv?ZǾ72Q>N0b7b?m@@*fh?ވÿ]?y0 LǍ l@c28D?6 |u>,[>gX3n?ˏI7B> EI|os?`ܠ?1>?!=7";?=;>y=>r@C>]>?>DZT-;{>JD@5y> TZK?O>?O>&TÓʾ>h ?=Oi%>[:k>0F>>.,@(?? hF:/AlI1Ln@ȃSS*=:se>k6ڿAZ>)?cs?/mbfA ?c) A@^'@&?˾דѼ>H=|@H ;K޿8b>>Uad_Ѿ&l~??^?I۹Qɡ%οo?YEÿe=ƿ5#Wkf@FPnMsX ?ƾ)LU>Tv&=@':|[>@j@֗?/?g ?Z ?`>Yz>U>`q>@U?A:POس?CW ?ou?_mȹ=_Zf>*-Adl?N>TQ>;?3bc?JI @?>V)'=t>CX|M]Жvӽ(_<X?Q?u>9=U>c?y!?R?=ӧ>xH>?l?f_7p.fF9ҾOٿ<6}J @Bmb3>PœA8B?5,?S¿؏?ˡ%=kɸ?w>=`q?㭈>߾>2 krP@ADpg>1$6G4򴿌߽RN?#f?ni>//ϴaо]~?V9!@5@پ㚿!x?k0@20@Vh6G}?@0>rIY)>ը>ix@S:{J@K3t(v>k-KC?5,9fU@N\?[˾3>E+r?e>/>U>;?H@"A^1k*n4@H>@d>DCT?>P2>὾C;!? |\B?;>' >G'x>jAVI4[ _ߟ>?o @@k; {@SпՂH9V?r>>2?>ʋvh??0I(>?#>>$?H>|>y@@Y8-s?<`W##?Hƾoƥi(> j띿д;J@$B¿ȈT>/r$\>'?kվsHԾP;!¾Y?yz?yIC⻿f.汾 7fοҾSuTտi˹.|^UU>~>›?Ņ>`X@0?_>u8P=?Ʋ*?›>!ԗ@M?n?@?>/;S&Wݾ5A(5_d񩎾"''?H3+~>?#/WɿX@٪@JJ"Mkᾮz{}?#.@ K}KC~T<7 @h|yz!K`> @_???`hH?7??׈?lk?W`.[? {>/ @P?2L?04=?MD?!?4.1? ?O+?:@>@j?)>=,?h1@=>yz5[{{?3 &b;8b?0=Cog>x??3?\у?t o>S?~e*?ByH? A2V@dإ<|?UEN!ֿ :D>>?>NAq2D^@E;YE?WyT>xǾeG@??4n?欿% 5=`N>7k]?.f?>w?Q?9g>"dnƾ[t-5<ѿTVNo>~ '?+`?k>#={ʽv ?>x> @m?0x@2^bB#?sL? ?M߽N=T@&W?+:P?$N64r1v?I@0oܾ??R?m|-?>d>DqK =7M+f?~@p.9>k,> H U>S1>Y={| Ё솿An :??҈?̬>$m?e[d˿v H?|G?7F;cW\?X?a?]=?>Oӡ><}>??|i>??)b@*>@卿Ֆd?F羆jD=<ń#ɿ-P^??=Pj>LKP?u>Mi>>'>i? ed֚b?uP?> >C68XR=s>'7@ /?yW?4[?>(}>>-<=}&>ց:CP>cg>'e=ۀ><>*r<]0>l\˿֙^>?~"G?o?=]?lO??v>@??:M>Y.3(Y?Ɂ>ܻg>zW ?A󾋮TCf ?*?4?a?K~;?C>o(A(}/?:Ǿki>=//@ ?ct?ܾ<@b@ ROd>A% >=?ͮ?R.i8AAL+@dRA$Q¾#?h4t%}+mFݾ-?,=%3}?`*!1?uA?]B>1F>>|>>å>c8T@9@DͲRrN[0?}3>3:׼JdB @? ?U5?,a?O\?؆?/X?L?8?<>B3@$_{ o!? x?k>잉"x>~k@?^?u970ijοHͿeU3D:?K6'O?QoUf?,8>=z8OQ᤾=@Æ46@'Eؿ70o>R>?+ >?O 5@rZ?ᾝ?G\1> ?+~g|?e?+F+44j??,2 >o=3>>u ?%?Co??%{V?c>l?~dW>|z?mdZ`@@%@U?])[~%}Lmܓ:60 AQ[?ȿ+FQ.+ZI.˖i^n &@gA>Zl>e[?Ƥ?FW~ep콚ħ9w_@mHĜ E?(?gG*Xr}JoAAs%܌?>q*?`l)ˮ(I=D}&z{;y=:>>L >>z]%@U?>D`?*7wY?p?$?H>ܴ?ҵ?o%H̿,2Yw? &2@R?֌п*vE>ub@>p@?B_z-վ>wdҦ=?@桶b|ǿ ?B ?mC!>۱A+J*?FԾ̿U?_?%?rd=s=msY>D'<>%;=?e}uj>>p^> B ?IK>@0@r'@1͝?Q> $~N[\!8=@B6I?*@@?d>k^m>oby2 jK>?mM@͵?9=)4߿.lIkt0> >'1>@岞˦fͿ#>C?7&>:6vצ"a>|bE@42ϝ{>>L2ؽngؿL)d;9UA8QV@egXĶ]>s> ?N>oSX} >?>^>7?ٴ?B@S>{}>\R= >\t/@<7azV? OOr[-=-%Ӿߧ#C@աx@{@eI?f?Y_#?j??te$?a'?4>T@^aY?@Lпy>(eS?vIV[7@?ª>gujӾϖ/eXg%>#ܿLYg@BG@yfR+(]"־z"E?8S }?;t3 K%@|>+/@ϩ>?ew9R2\ý8F @*>:n՟?~J?h?P~?-m;i??qKҿc?9S@i?U(?\^?08?o?? p@t?žƀĿ6KʿC:?=?>2>f V@v;i.Oj?ߚ?"( ? >)hb`uǰ@C';V6? }o?H@?5=l(*j @_R(??ϝ`!>xoо%~>7@a?G@6^8uNyկHK`m@1nix?>%=S?>*9>K>i5?C>> P@t:ǃ/@[W>,y2=Hq@KZ4>vcWZ >>>{m>ēe>=?@@r:\[?#A'L (7ܲi?@6y-@ Q?t"<ն?>*Ͽyu?X ½YjYſN??&}>P)?X##Am@Uȿ((z1UPq΂'ZF[{V< Aӎ?b0>qq?ߟɳKȾ J=xV0$??hיA߿ @>?Ƥ?yY¾!S%>?<=x{j=$Oy̼Sҽ{/>!Ջ0->?ۜ<>ֿw? ?)БP=yGоH=7$Z>G>k @?_@ m??K>v >3C .*ݏLY+W|S?I?f?]>p?b>uy>=r>>>k>y>Io?WA^B컓K툽?Kg?V ڿAUO?5N>nКJ!4ɿSԢ.Q.@q @jLx:%?ޓoT-ýo(>cf?<- @{@3@o$ YU;W+V?q Aql@?à*Hd"ОԪ̾?߃oW~@&;،>k?Ԇ&#T?vg?"v= <{L?]@g>h=%@>J>#`?>=mJ?GW>=+ZX>`MǾIX?5?Vs?7?w`q>c>8-=jS/>fq?h ?"Cp??Q=>ȗ? r\> e@2Ŀ66d2?R۾^2NV=?&'Ss4j@0п >Έ?mkMlCt| ?+?5\ܾPݢzgq=>lAٯW2C?MaY>9Z2+D3* ?@,?dS?>n?4?[?H>+>?҇s?BL?> ?h_C?-^!??-J>s>n>j>L@"!'M#?ѳj@;A"?^Q |cmqdG}u5k?`3?A=H?I>gyԽSߙ?浅>>>ɥkow?>`?ct?":?Q?в?? ?z~?!`?:F$@@s>>=?m.f댿0־S&$>&f@;?U?])?.P=>QJ>H=>|>ArF?\g92?ZϿ]X=Fk>~=Q8@!n>\@P?9VͿZ̾Hu>=K5'%s*?z?u#>Kl>>L~>E>\|>>$ٿ4J]=@BC=W+?Ϙ>{B "j>b> @ =z?'N ~\0A=gc>!s);4u@wD¾)bΑ*V=ufn27UN;k>D??N6?+ü$f=$=о=@jD,?'?~)YK?^>1ۿ+wV=>*?&C?ؠf?2g?i_?o0?#4?12?T`?h?"ڽT?Sf>䤆=q>>ET@X*AM@GyB@c?? <#?Chcӽ>)@C.@Ծ?UD>'><#m?a>i>&@o=cߐna5 ֿ(ڹ>Ab>/ҋ{>@8i@O+&Ay>Al(G;=@#2@n]@W@A#?n%=,qS13m@~? q:@9?4T[?HԿFG٫?dq ?;뾐K@|@?y=(| ԿR܄N-M?(?K+@?C?? GV?>ټ:?>2rJ>'@_@}B@I@!J_׿盳@($⪷?@?=~#%>?cw?dֿ"̏)?k~>bU?zE @'p@?yp?_Q?_=W>k1>;{C?Ѿ>h>Ǧ-??K1@-@Ξ?l??j?J?ڦn?KA?n%V@|ߠ ?>2>V2<6y6=)AU4wῈ1?*t̾>XU?7";刺R? ,?TI;8ZĽP;F!?XQɾ!9ұ 69S? ?7?9>+!?A)??+"?H?]?A? _Jo^=f?dIm?F?!8-A[{ʽINLSw#=үe?7wWP_4#k;)e>3O>?)"?{iq? ?-4?>i?Q>>R?$A@#ԿB'׾>ݱtPMK#ɿH@t/@&R@A@T%>}dN1ƿ5s! @u[?SE#=wS9w3">>@w? .V?i-p?k>=nW>>Ȣ>@5@_@YHU;?/& g)>eF#"Ӿ d ?R%@>KzX?@?" ^l{"+n⪾~$V@W5?> Ӹ? ]?KX>>=$A1?t?DmhUF#K@) 7@վ=?.=t?*?a?3?hOy@^㜿O>4@ ¿:眾V?od?ï>-=?Li@Mҿ]o@(yoSH?,ؚx>`ɽ!p>~$@E:D͜?n?=?ȾEZ<>r=<4qWµ@Or<' I>\? ?ƽ:d.="$?*?b=mžcm`D?&n>?9s=Hh=7쿃l?zp;?=THu;Ս?̓?!2>i@":$1 q@=|~!?M?@~I>@%Ǡ'`"}@Qÿ?m ?b3R"<$|>ע$nBZ>q"<.#<> T>ċy?WT$QS<>>Gb ÿqWw>?j?``eԿ85Q? ?6]%t~>n?i?y&VMu? #?#ҳ_Y@ps>@U8ވO&@>b_d=@>L>=g3A>v@|)쿫`>Ѿ=ʉ>\r9<AoOmSّs> QLś<޿kb*AڒٲyIl͂?ZDYPQ7˿Ħ7[vG)/b?P`P=9l?NX?o?y??X?h?XtwnVKa?:b?4??#l?Ct,)|,?`Ƭ?1bQd?)=>mǪ7|c?}}>f>^7>P>&>">(>uj- @tz=,|z?q>;{J>=m>W?c??{?T!l`ŕ>g?ʿ@Ђs8uf&?x.??lQ@ПP@ b 奿Dd4?կ?UO() i?/ ^?R.@f?@?6zB 5?}>D=WGv5@9STI@Ç@TޣszN!{?%=6>p(i*uՊ?ڑ6Q?=v >q!H=>ȼ;=<=7C=?B@n5?TB k>0>SF>>h=,>^GFܾ5X/5,NZ=R\>~>C;>$H> >ʉ?;_?yWp?.^?4>(T>/s^>QԽጽ?@@}@@T.!42!XEҀ>;;>zl=磡F:=@a@"7@(4-SսB>>=>q?w4X?rH|?/V%&)> _? sv:!?3 S@,YZտ?w[?}W8k >}?ĵ[ƽ|3?*{?L@8<@/>>6=fGzhQ?/~<@@L>?p==d8ږ?'wZ;E5C{Ho4K?r?[h>+>Jĭ>`?HH =Y (1?g?mG> /?Ysv ?_? \?|8NKј?I>#Pz>@1>&ľH=>tOQX>%Ѿ@^u>ac}>R> 3T|=l5>JQ,${>l-юfxs?#݈?O?rS"&=Z?>@FExg@CѢ?g?>q>㽎{?w珠=J>= @?Oп2??yJƾ:9`?V=6z>>g.y>F$ ?KB?V?{$?=ؾ>iFe>.#>8V@.rڿv?pH?I~Cv?hq B~K?a >9>? N?@/?->մ16>?k?ʯ?t +?@f3?@?$ӾC?.AaZ?/?t?\]?qo??vDMc®=Z>Wo>'9?>д=Nѽ[,m=r@W77۾7.>=?>Bn\#:%< =k=^3zƿsP->Ii?~? T%߽O=8+=6n?пeMG?ѿm1ɿ>CvJ?ֽ0>5E>gA.Yi9@ &涿5)P9i?7Z=>RYp='P>b l>t?HC>H) >俾!㾊 1Frt>:g_K>k?>]>6Qx@׿ST: ޷˿Y?[sP>8M*A-'7e޿ >|?&> Hq5b~=u+=9߻=~}=εSY˽M5u#Ӳ=.3]GH7=>m=1&qv'ƽE:ܽR`@:H?a>E*H|d?s[?|Bw㕾'>{c@WU]<@>X!??ۿ}#= ?0>s?]>y<7>k fp$Y>OS|^@H۲y %&_4o>~0/AN*Y@ԙI͝@=>8,?.??󀢿N>z `A?,@\o7~$(D?s?O7"?Nt迈)=U( 9@?@@*@>iIE_>;s?.> T?ʁѽwm@V@ H@gV@>:G>B?@,n+s?/.7>?}>=-=HY<6>{?d=?S?\S?GK?>H>u=B= ?[@gʢ>x,G>v6_־% No\i 2>"X>էn?>1ξ^\;GA( v@C@+%9Y4@!W?'O'?A>V@1@f{.|e@g?+;!?䀾?։I???ܮ?D=?#@ ?@Dw?s!b맽޾<9??W\@*w@?9YJ!?tgr57wư= $fme$O9";že cxlj="sAWٿf9yz8;imquS+39{=6A>x ?ex5;Ѭ= >Z.>=[ETA>>Aھ@ڢN[ɉ=dK>nUT׹Tf=>7.v?-?>C 郿9W-?*~=2BW=^ȵ=a]@?DI5n?3=*Uc?g">`X =?>8@ď_Ki Z<J805_4ts\ X{@~=ϾphտX{15s?0"Q,f!uk@Sҽ5=ʨk>Z>Xk>,W$#!޾P.f%:z=[8>+f>JE>VX?uI?>>}DYlk=>ԙn8@I?" ?3??C7 \Xp SJU>?,d !2]пW?,@j[?ޞ=\TVM>0>ԷdjƑi/\?\<@Qry?|>|⃿$vھh>b;fj+",?=Z?a)?M?=K0p>1>2>D%>4W?-@(?[?*4>"α<־,J=Cw#= p@k|?. @l`?Lwt=<,> ?}@@+}T o7V1)=%?8P>oj?G 1?U@cݻF2E%xGMQ~?,>C?ҺRJ5BR!@խ?Q7+>?_d̾>|V=pi<Ѹ,@@J~>!@z? ?B=&>=Ծ???_?7NؽHo>s8=x^@oǽQ>f?q@?7Mŵ=>=rYҾ Ž>r9T@7?&?AzeV?#IqAbZP?oD"=>ҟ*->ϕ@}Z@o"@z֞@CiSqCBH?+3>W>FNWc>:\?Kő͌e\<kV㐿3o? ??1?(l?{>+?K ?.=?hۭ?_?*@?y?p?B@F@-?ȬTvpX?W?xĻܚ3,DD>@0@(6@hiR*E>}?OYn.jG fvས%(=́<->0>H>:m>7=4@LRk(a:Z뿣sN$r&o^BgXL5llk @dH@P?C?bվ]S<r?!F>HU>7@@eB@ @?:p?>={>_;,>@fGP@;Џ}>^w>`Thy?!d==nuǶ@N%L%?>Ǔ?^O-{\?o @%? ?,؟>`/tL9<#"VJ?@@?dz+?Ve%оܡP=>=L9̀$h>%Q?T5=z?3Bdo>K-ѽM\>N>ؿk~mV?ý2@D|>4X?~91U?E7??+%s> X>>m_@sYX@"7c@A>Iv>k; ? 48H@֧a=O&fAοgT ־w>z?_?b/>iŻS@!:[>48Z 3&6 ?6G??>0s(u<:hx>N=]>C>[>#l->/42|忈)̵9li=O>Io>J4?2J3w@Mw60nq;zs>Hu=>W>=滷=ٷȷ/mj;cx=9?>W>e?!>%|==FH㿱P)?=?Bվh ?[?^\";)^9@n?Lpb4?1/?Oپ6.mEhr#? ??a?0?!΢D5$(OpEd?ۿ?@޺?qva? *=ݟr ZR@0>КQ2=p>&C65"S3:gR(AG?FZ;<{fb7Z=O ;$ľnk| l"]y>ūn?Pѿ:@Nb>.㠾$>V\ xUb\_?Ca@;:># ^,`>.>7,?|򊾗A=2?~VE>=D?,%>gQ?|$?k:Q=?Ä9'??p>&G њ?n-,A,&-?Ԓ>XCAjHn]Ah?Cm@ɼ~+)ѾB>Nx=!g,?K3Ƀ 2rսJe\6ڽ/WY;ɿ/rG?Vwԍx]),\^㽊7[ݿu1~7mPF۳ ξϾ3fX+ Q DA׵Nd h?<>Zjh?8s}N>\>388 >H"<l@?lcCRܿO?HNsUVn?>:Ui=6T@BՐ?M?b?0?~T?:? >`?i@o@?@?z=>uſ?(P?C&^CY?ʈⴿ<=W?j@??ρР 63 >IQ;R?A @L@?>R%HKV=^"@@t#?1w>z?3K?=vpb?dФ@d?|^>j?BִDm?1'Y%?󿯟>@8=1X?2m>pW>=gaI==Zn@>fTo?zi>Xih(%=b*E> @5>??uLg=>P< M?5@s>2N?+@5=Iʲ&0>b ?w= J=<_.ʿEoI:(;=?k>G?M.?F>:܆ӿ5ڿAҪi(=>]W?i???'?C?F>{L!>r>'VPkU ]E>K><>??f?Y>tmؾP>U~>υdW4;a>=>_F>>_>Qq>gǼBC, rD;۞??Ǜ-?Jg?,>>[yq%!bh+:Ҩ@!D3@A!?tQ-?Z^Nl >5ؾN?ɩWu@͟@֎?663҅?¿;d?bu>'?Ā9C?g@|O?%?@>1?U(>?4&>xZF@ol?fT@]?ל?o|r;M?z>kÊ??6dj5'?Ym?Ee8D\s2=?D<(b(@ @_Lvֿ5{?k?jva=0?␰Kp#@O@=`G1icb?<6>r>49d H"7k@@J?- =!P=Y?#E㈡??G=;컾r{>>|}˫)F!>7?s@l1@ u.>IsN#>&?徰Ċ>;?Hu?o=Y?zy>X =>A݁H@>H== ?>e,7 m>^@v\?7'>0Pv<>>l?1(?x%i@|w?T=ZO?i꾴;<> rȾ@=XA{?v?pZtJ> \;J?ź>l=@\?3?ҽѾm]> H^R=8U=^?c?>X?]p_?~&O>>!>J~K '!@K>K3e?U=㋿6B*?9Y>3~准@(>9Vþ2l@笿,#2x?#M>J>>&l=uʴ>š?^GƝT?/H>E C?,B=Cϖ==!=fPX?^CJ?a?>MDpW$i>g4Ah?'sw@=}A>.s?cDN<+a>?e$"'Y@%;ѿ1h@\>Q8>5?t4T򣾑o?-k1@۲n@Hf?ɟ8ei+?S¾R>@r6V>@n>d@@;?b׶p°>{5^mb,Ѿe=\?"@@H^He{?y 4>&T?j>8@{@'a@e/x*e+[@D+>Ͽ?U>ؾ`qAI;@xOj⠾_#gi% 5AP5@MwkVm<`0 Uh._wN~ W>ӄ>m>b<>wo>j>,>k==LSbEzP> q?$?(0?۪?L!?_>?.*?z?1ry%?ڪ~=IX:@>zξ\̺@d7G@LHӿ{A>4׾?{"(B`?1k@0AN?z?/===]Ct><@p@8{ .K@??X㿮>>+=Q>m2A (V@d豾m5hsGA>Oc'↾|>@Apٿ@EGO>B;\=w >KU,?r?a&`?ŻY?'3@?b?Z>&>,Ͼ>H8>d>$i>x=ɥK>9?aK>P>g> s>A>qR>m_>C!;>ڛ=j=`?J<>a?~?۾$?Pž>޽$u= >H @ld@T@. $xw?35cİ>sX%>_av=G?]<حc?;rlO>c6?;jUQ8@k?t>(=3@0>+ֲ?Zw> ?(?X+ov?2v1?2H??}?y8?.<#?D>>2IF`tR@Ւs?6?#,@,=?MN#?kU?D>"Y??0 hin??ꃾК̾>M>^CAV>ʤ>5:?hɾo?ѾN7?>>J>#?E-̢?>@ l>6Qm,BlEЍOK2gMo{h@P??sMV44<߿9h}:j6 %Wݜd=U > >H?>%>= D]=^H<>s晽 =o)>{>6? ?> I>=_!0bD?a*? >JAw@qjS\!U?v>6>?[v?P?$徃К^Ek1>-J@=!9? #Z?9S >2=݅Aѡ+?^+@7>u7G@S>=={=%@8@K?>^@K?=Hg?eo->? =;$@3@@G>4jB?8 ?x>O?S3ɰ@z @?"ՇY}WbSEɈdØ)A5 ?S[?1R [^nA3Z%\P.Q? ?|? ?@>&辣tw#,Q0tk?\G @A?Ѓ?>Xc57E@!ȾR%ܐ#@пb4??Lꆭ=K3&?I뽼T>+iB>C_@tÿؾH?@ܾC>*?X6>o> _NAOJ="?6?H$5?p?; ?>+DMfvᄑ%H>c?8??0PW?F?#h-?zU@@ >!?ťN>#1h>e‘J@֬k@l3?;5s?o}Ҳrt>pa>WKS??T ;b7?P+=jIp>2?}Ҿ5߿* @@ZC,?c>ƶ?tԾ$d?xQ-L?%Y?P?K> >A> n;[@8.N>? S~?z?58BW?L}3G?'n4 .^=?>99=//[4=_G= G hW4=#h>~>*n> r>e=Rs8f;ʿNf1?]?=f-e J?e7?ѾC%:O'84?A@=!x?Kf?[ap0@@5>%^>;=>Kٽ0=#=MN)='>b=;@!&?>>A?, RSt@<*}'?F>E@eLUa@v,àz(p?̤仟>z@fQ@H??*u̾b~˅*|k6l 0|AL@#0?*՗Ez\ƿdL姿ٍE>csu?? E? >V"OǾh>A&?}}m?>)'?L.?ĺ?;w>y3,ܾt?*z?)հ?h?f>Tڽ/vXp=Y¬s;t<8=n7;JA+>\;Ͻ(<ɼjU=뾒/;?8u>= /=e{=4j>bԿ{oĿ h=??f>4y=4>'R=E|>ෛѥC?">T?@V?W=>EN{?+Yl?!q> 5݉AS@L?i?6DJ?FY?c6??dGG?zdxa:CK>Cy>TS?)Q?/Oq q[1ژX?3jԞmd`?F=+9??[bqJ¾z w$?i o>ڒ?p?W?(gHNҔ?<|G$?|3@rοT?!/5nvC?wC$AAz]? >𿱗Ϳk߿sϿs¿Ŀ;;pRDy1A0?n/S9B&ֿDҿcܿoȿR, A_>p== }ͽ+r+9_pǽ|F=;e*P\̽vni3??/ o=V?'Λ(5ym>A;?21 1>(@?:k> @~?NL >v%?h4qi>Q@?;?r.?%3v?Pɦ[xO>?Qi>@\@@py? ^?i̕c ƦZ>0Z?\r ?_ #0@s?fVw(ӝ>?Y `>g>ьcc@f?ݿ+>wұ?G˿E?f>y`͔L[M7?LZe]=>w&@וI=|1"? > g)@kNP@V&c1?1>2 |:U?ؾfg1?(un?˾H͝>`ݿ9_?;bHq@9 =D(C}?$\)^/j-?;p@y;х>:I@NK??r/hD[׾쭾N|@z4R@? ?l?`?6ǝ#L`땿o ]?RC}?V?o=7U{ټs=9@zq쬱W::wUb6?h N(k {Em?>c9?V???b??m:??{>0v=Y0=轖(?Eǫ??@?ך?&}?>z>oҾu%7-?8p!?#&E>*>(os]?Fd=.mn)lB@?-?ս5XU?’>&AiD:~>gMW.uU>ʡ/ZkgE2Ao(MM; &H6>.nͿP\@޿9{wz?6@]>ƿF@>+>]?(1Ծb>H@@F?v迥O>>?ՕK?v_ged>?hgF_ ȿp>jO?L=yxʟ=> >fר?6۽@޿C?:?V%=ӚJ>">_=@Jvl9?T@,(ǿ07m?|)y?ҁ_m<\?;B">ķFCb?Nu@Q S?h?EѥÞ)It?U>Ծɿ>ȸ?R?}>lwH ؽ֫>B+?(>o>+:Rd??S??O$'^+>/K?x>u>T1x̿ݿT>F?qCpXͿz# )=?_8?yH?X>*>NI>7r%I;CԹ?Voi6?N >dic=0L=q#2/7@e @E7u޾F>Zn>'PNJX@s @O@$@~Q>f˼?W[>ns-Im?$l&@^]?Ŵɿخ>=?m Uk4^b=@qc,;?Ax@?g,>>X>I'a|Jx>S^tM}\./>+2?]:?,O?^>Y10Yr^뮿Mj7&?+i?E2?tzR?c>nok%5e?ҾaA?T.>Y?5+JB=!>F7ډ_`8?!d>G@M`a+I->|6'r]R?a> 8h/ ?O>v̌%Ɠ>,v>r??GN?{>п)B׾n?d>9H%?1/?ki>zX Mi>V>h@>w_p=V^.XI ?\@>辤v5sr>.?>Ȁ=_??-]=> C׽hq?N>$@B?@9Mhe_ >1>slm!@?pL?]R?JoL@騼X@ʬ=1J??$i?5A>bgA@J)qO@cK?W?2@W@mlK7*?F@=c1 @$9C@U@ӻ&= =Z;e)P?+_GM??Դ=\jEo*qwC2;xcT^Z־Z?(?T?ҝd>\t1hד9?0??÷?驤?w?\aZ? (,g^}U?g7?Ȩ?1?j???7?&?/ @O??X?e#?mE?>?F?{?h?p#.@v?L?@~@??=h?C??X?h@kS9?(?hq?c΃df?"셽ί}?z[do@` @@-@Ⱦ+4 |uݑ?]d(>60?@6ɾ*R3 sGGRHq5 A\8-=H.6G/8Ak]@ 9E>#=h<_991>xF=u9 >8A}aF?x7 k>۠r߿x߶=pё@MVM> C"@>}"?/Qoh=GR&'?E>>">P͏?>>D7>?lc d>?ֈ1>`d?*>޴ ?z;/>'@wф:H/@<Ӂv?2e>?(/D =Q=+@)ݿr`bU{>?^>?eG<0<1ܳ<Ϳk?l?[?3???@]v?B?d?݃P1ӆSP@H@Q@ @L??W??g?X&!yV)Q+ AOIyɾknԽň\ǾھcN奄ϊF?|pm 8=5>>?4v?>> N>oտ W'=2>P  =x==J=@>j@ -оN@> :> 5.gA z@񌉿B"Mϥ> >=? =Y=E+>s<*.;R7=M99ri<<<Ҳ>߽=ob>`=};=Iv=tG=mu@ ?僚?@ A]ٽU#ij?A._=>Ui"\>f0?ȾW"?>bt=G>P(z&??򜇿<܃?A\>-aڼVh?j}Qn?<X?;Tl> .Y> 2zX@zdUq?<%~#J?u?Sm-J?GHD@o?,8%?qUѣ<>(=> m\>֐>?me?M??]C=0/?% >+f%>L>?/? l>=-[(>2Y=Q>s]B=|ؽ??S>UG9ν+ D???n>_= #EM%>X>-?p@O8A3#=ޚ?? ^6sI';S-44[T? @2=̑1M?Rm>OW`Np!@u8@†%>?i9U?@)> f5ON5=>~D? @"?1?>>*? '"?C@-?-I?\z=P>C ?>]K@50?w?w>>T?D>^">(>J=Z=&?f@? ??>5?cs?R?Ta>8>>i=@S\G A>?gP>[ͥu< @5&Vcy>,d>#Yz3lR?ÝJ/@^A2->[#(o^@8t@l;yty?O׿@U?wz>?.|#DKD:?ɓ.iMa?&?sl|7>-W7 i?\ҏ6?'?Ha4> (*@ڢ?Dqd!7?>2о? ?_2Uͫɕ@tp@+̍@}>~ g ާ?)G?2[p8>V- h?_>t4?H}2OO>VsP\? x'>n ??b1M,熥>v An@@)ӺȿI{ ɾ+Q}8>&AB ?ģ@jE`ؾʦJ >DN$@?)% ?J#M)?Rսnx=/`>4@4@suPH?%6شu{p?t='>Fq+@Q} ZUݾ #>@]c}K#VlM@S׮[ou@q&q Ͽd묿̿?4@Y?@?kӬ?Ks=>!b[@/?{@N @#j+ΗU+z=[21>Q4?X?Y>>>>8>h=w;:=e77=t"@7?8>.?b?U,?O>[`=PZhiھք=i >ߓf?1=bXRwtt?*ÛuN߾_i6>֯`?Ğl?ugJb`?hývU>*ʷ|,!5?v+N?AR>5v><.ʽX*>c>'SH?1s?>s@>YO >==;3>}έ>FT@.l?/wr'?1,J>+W?c@TyQ7B{?5 տ? ɍ,l>?=)M._??lJ>>/??ꇂOQ>A>1]?,@`6J?_?8龝B<4?6"?1p@#;O4@K%޿E<?0x־[> G@4"oF@(9q=.?6*=+F,>=-@Mo?RBa?_e>V=H>E8=Fc+?D^nhA9@uWvI㽾c>: f"ؾN Ã~>im@oq?SNy?CW ?&J?dp2YD,?>^;製2>8ʾ2 %@N!@dwE?Ɏ]G@v?hPm/= >g>Eo(@*@?UÓ4@0oa?uVT->/?R>?# 0Md'@;?o?g? 9? ? =">{o>"|[C>r߼? \?y>?C?1?!#?>b=1-cLk5̍?`>!e> 7?w=DRuCHY"7vSUAO?S=o=0 AXir!ct:H}Q#li݂UAJUd,,AſK;(eH%J-Z[(+IjH >O"?mA?mC(?|7?$?VCRgr"-(\?s@?WI?p/?~M?[I?U @݌=}տ!?b?^ags8Yd?y>&V;OEE!?}@=/8 @t= @bZB˿i?0$?l=?eK ><(l @ @v?l>0D?ڌ?#T?u??"Ua?C?gB@qB@O@-?fb?g?i?׎?q?&?8[?>0>r>T=>>c9>0?$+?=>=?I? >N?vq>ʭ=͞>om>O?}Sd\?w1V>zeg@`7?-a?(P?~6He?cо)1'!?oXaȭMl?R9\?>ڽd >=> >%:aK;@7 e-?>>{te>>,@>?S-='UJYz?)J?P?wp?p ?G>AM=>>l U 쿆?"?}?ʃ?I?F"?>K?K?D#@Ƙ?Bx?ywf?ɉ?җ?vi?C=0Zs@e@$#@d/?n23?݊K?E志і?2>V@`?Н5k?4X?9mTs?*پl>`*>4[=@O@JvE??оlN޾T+ <==@k?SE? ?m =GPMD|&CDžoJi@4> T?K>S>> F@j l(>@?`?%K׾i?]4>%9>˾?[>.?iA) )@ac@76k?x>M+%?Ȥ?HӾ%XP*~ٿf *hP=OC=?;==\h=#o t:|'W>u>>ٶ>PW>3>@`>j~>ο =AE@@DعN>b=>Oƾ(>Ͻ\QI>~:{n]E,>s3?Pk@D? >DJ='=<.ٽ‰-f;̪,pG">W>'\Pk }2n/)'?kd@Ü@}4=6?.?BV;OW݉:?ģj?W"@|m@L>$Z?r+? Rѝ7A?*BA2@@S#E@LaqjZ_yzo2B]DHA@ @k1 >*hB?{> `<jY!Ծ !68|? r>*߾j'Z%:+[^mTP .?,?Ә&?A?N?$n>l?c3?>>e*>>QWv>J>s`>>_>yy>>=Z=GT@T?1?9?὿1>\06? ?C׾ ;?H@j`@0@v?]]G=%4>}5|?Tn?P7S AX*տ{eC?ogzсᆰT?1ez;n3AM$3C@᤽4t?ARv)#AHl?nz?ѷe5E rCknz替ÿPgA >F?zCZ* h~Ua>ԿIuh;~? ?4>}M?nP=R&??\)>G>-? r3@.?5ӿÿ?̬x=ڥ& R?L?՘H>?o u?(@E<u8?>=y\u>蔾}@}꾵Q{@y%>;?W}lL>(?I?A;>?i>V5K#?V$?3j|>ș?G ?(=Wp&?r~U>U-@#[wL5jſvWżnD\<6i5@GgݿME KR"ӿežQοIpNվG4>-F&?S꿅k۽!MLro@- ?PFdֹྦྷT ?C *?ҍG{E Ac?-b?8&HmWz=x{y׽qAT?*~?6>3+W!v6VƿgbkL`@˲??k 5U?Ӽ)>H>*j:&7@zP@?*?< >*?&zɂ@?t-@5b>ue?j?R?]q?"( @?@?J>b>@v>m=?;?8 ?s?FW>U@`?-ݼIy>#սaH?>e¹0g@+s< !@e->?Ҥw^V>=Gy?-> =2?˜>O[>Cw>Zl> ӿ񬿴Z @dm?8(>̾? e?=S>Ӫ?#*?vY??mB? 5(?>B;n h¾`.i}ҾVە? @Y?$?>mEY&yqԾ ۾b@z{9"@8>E?b@6>:$9Y>>Ψ}j Xz@6&Uk@7>Q@g5>|H1>>MP=#pEb=|@l?~A?!$>?TɈJ>P}LˊfDΜ@8w?9I?>@?V'?7&q @7@F?rݥ? I?'>I>\?Ct54@@@?r S@)0nZ>?`W?Ga;N?¿ʲ*gڿ ٚzo>dCө俿fPՐ-c٨ճi1Ai?@7*WR=uM)kؾNo=?[G>QcIv[>>~ N>W>g:埿@?g$Ң55??J >X>wC%=bH>ʿmD?v]ͨ?6"+>'7=F6>F;_*?,XBV?]EY?*m%>>p7>{$@i"D@wCT\|V?<1>s>@:R>W0ARuGd@ <L^)?ӂ?_QFC>fc0'Pyn>I?4 ??wv?F6>w>Hl|: --J?7?a S?>Io>t -?=>NL>qs@8o?@0@e?PHrR>AYwk<[5@)\L|?^@7'Jț? އ=+>=\"='P?@x?%ͭ*u8>P?>MǼ;$@@~)@К>6s!2=G?<?˜¾ 3C.]Y,M`6?;%5?b:S8'?<ϿYRnDpnZ 7g~HʿtO?/ T?۟ \>4 G>Dil>]>$;L?#?h.ƆT>^><{p">rMy@`@o-@C?cE ?T^E?s?0S@ѕ?`9@?I5?".??>^?\FAs\b@ <;Uc?dhC>8+=?ʺA@@ܿ*$)=3mJ?;>=g?sK?97on?~r?COMF>{v?4>ԉ>h?tѿ??״>[>e>s>h>f>ߍ>3MU>;>1^=h<+8 ^o^hdb#%*+C̾ vKrbk>5>f?d@㿭`"8i$?=Q?z2Pȝn?Ŀ=L@ob@\p<7T)?~鐘\e?=#>#:=Xƣ@` ̾6͚>څ 8?,fD?l6:>53Y=OR?#~>uH>::3LJr>n=%0>&:C㶽?>.1U>7(>4=5>>>,h~6>Q>^5E?m?qɽ%AŦ@a>?{$?>%88=+nB5LϿ߳gg@B$'@ Db>4&@ÿmDb_?ő7(=j`/@5@9t`D.AIwQA%n@ғeLMјAHz?q|yDmQ>ADžI"x|_#?M|y1Q>7A@{u?7vyQ>Bҏ@F?yQ>0,6 Q0ABKA\t=r=0)< AF&BzS@@i ѿ5A2:An@ O7A6L @\ѾAo@3Io EAIU@AA5A A ABS˫%{@y@N0AwAKBA ;Ap`nFuA} B@ݛ|:At=r=0)܅-B"?CQoA.!*OHTxAp-?@W2KA_@?CA"AQ?@ g;At=r=0)AΞA;"':&AA?>ICAzBUn<\<*l|@zA<\<< BEA,#9 AqxH*(/A/>%5f@A~ApxA=SA J‰4@˅$<\<<\<Ɩ 5<\<<Ahh? ?A_*(@A(*@Bs(aA*/@ؿ>@eAA<\<<B$w1BjP7B0\?ȂA}U@&,6~kM#B^a_6;Af>@ U`A@&7@A8z翻A*@3 Bʘ@x@FAA od=*eB/Կ .-NOAQ BK%Ae@AU-b@*A B#/fDy<\<<@=AAg8@>ƊAwA%޿^'BAQA0>0a!AiAX$`A̢!YA|?~5?mA:q?@Be A<BԤ>AA<\<'0>O>?QE>s>u_>mV>>>p=+@ CbjX@h,n=>5H#?;T e)=L<3ɺMu&?N?MX?RM7?W>,p$nP5@Ʈ?Ȯ >^>ͼ> U?kM=/= d<@o@[?q?7RԿ!Py<\*r^>}6?A~?!n?r >xc>Buj> buUR @GfS?c}+>@^(=իp=:y@$j@j5q5>~>Ft>,u,5癿#"88>l͔?J?sKXza *-?> meF,iy+2+[h¾ɾFJԿǿ=˿Nk<˿ fֿic^@4ڸ]Noװ?d?>=ill=Fy =S#=~p@5>\=>9зսv=ۉ(=򘼘Q=> @)@ez?l!?Z?Z?(>PRZ>>S,Ϳ?,-?N]>^'ј:=&AO>9@b]BBr=2P>>A=Ļ}?v)?;?7PN=f(܉2G"􀾱X@/?Lc?19?# >׾q>!X>Y+?X}9> 9sj?((?ZY_?KѾo#v>of ͽwR=?b+>ܳ?B?>_?`:?c ?EJ?(?Ǖ??jg@mѿV?s>%6VQ>Hɍjw?Qh؁>F=XC~ 5G5nDp?ݩS)ċ?= H=rr4>.A^@CVw` X>/?V?MI?UZ=Ģi~@㼗?uTݿԾ[?^G>?*?B>.> )??lO[>:g?p^>%W)S (J>#>>@Ң?!?ϊ?k?T?sy?n?l?Z?+F?Kj/?((?>R?ՙ}>q?q墿E>㩉?;澿]?@9?mw?8?@_l?8o8=-= K=̤>kgqbϮn˽{8?A?Z6?8>&G= ==w-P?+>5PqHM>傮>@0X->Ip:9D @fh@i@Nz7 >7+>}i=>ҁg?#]?/0?@9߿$y9Z?.@/M0 >=CA]`y=i$~@G7/Ƚ];$d.5;wb??I\?Px>Ii>3Žx!<66=L<5#?ٲw>+P>Ԉ$=z6?3g?Ծ.><;߽~5׋O& =p?#=^U=P>%*hGvݽ疿va:㭔Ԅ&sNeU6=b>n=?[ɾ 7? q3>=>̾d5=6`>ԿtJ6?Po>>վ =>u>yUh߂3>?b?=?ܟ&?>d=SŽ>L@sɷ9 ?W'>wmMl>T>S:?-@ @@>?DU휿ئ di?n>6S>T=1@R?h? =@ƨ?>?1?֩>?.{??py?ن<t?8?- '¾T?J?'dKk/Wj>3g>)@8m @Z.?\&Ey>-A?Ѹ>Ģ#> {ҷkVھ2_׿޵s׺"Wp>>/.?>+ GӬ? (@U9@??Tb?t>RwO+5ZQ@3?n?5=Ҵ0])w4Xfv8>\q$ά39%[YK"@7Os?Q%?C>R =?敼?k?XP+S(y<_ P>m>? @@s>}N>&?=Q;ޫ><<Ͼ t-0??4?<?cF4ӾԽS1">0>>+=>U*>,?>Mn>fǎ>M>u@ڌ/@%@w?#]>9A,*O1Ⱦ;Ajn׉>f?";9]' `) >*?#->e"? . o;=>rQڿe@%H7@7 Ywt~_?ha!RbY?Qv7?#]?/Gc>w>#z=V? #b?KZ=d?}?(>???ǫ>$>Y>m~@"@G??!p>#w,f?q ?`⢽}2ֳ?">mK?E=nd׽@1!9#?[Iw>xÊrh/m>'ν,_钾s=Kwp9V?Yح'=7?ȧ@.♭I@ujz?:iZ<@Ҿ2W?a=p"=6;!=&?Xt>>t=q ^C?ŵG?~ߧ>v?Du,¾?ú0fJ>|=9Y?Iz- ? j>҄>0=<[<|P=@M@tS?~>]wz9? Y?].#jQ]@>.±s>ҽ>ى=潊>{x,N)>:>W>_N?KL?z>dKdv@B>$&?ˁ>Qt?kD?>)N \S?Aa>3gB}?2->;W=#'c Vj;?AR?x>Ⱦ"5f=7OWxzמּ*>r5 ?? G?Y?>3>F= 8ԸG,??_LG?',*K?ȓq<0=qd??M?Ѳ.?g,?ݡ?5L?K>>$9>x>>}[/r5ލ>>(?]G?e>z>n=@Gx@6 @O?ISy.;u&q<<޾P>j??M>>>1>Lw>??~&@?Q_LO?_O?X*>ŲH?ϔ<ր@ž{? }2ʥ>E `U>&:>q= 'I=湾{_hK?1??xg=>,Ԉzi.|2j#P/}辩ؾپ}YA)?հ1 C"3Lx[=*O';ۇ# &Y?#p63=d©;w> <5>=юO?{ Us^?#?A?G> M&*z?_*@B@ Y?/w??Վ>ް?X?i@Zq$?><[ ]G, >s5>ӫn"o>N/LJ:f?D٤?4k.U>4>fӾ& >7¿BȽH;?[@dP?U %G x q0>>۠>KiտnV=(R,b]- ߯ @IdXg$=)>' >0=s$o z$?=FX!տp/CUjȇ8& ;A׀?B'>qR?=eYTu={>mG>=6Y>M?Y>8?H2k >ig?4Fpn?>S @cO?F?)?`o>اp\ӼY."?X>׿O8@VѾa@KM??>8r>#pO>?$)%?F€ؾ?"?<i޿Թ@?0?/?6 ,B?>[Ǽ>!C8Po>?>^|2St#W>B?@(?al?y?}G?3>?T>zj: W} ڂ*9ȡ?t?u˿?F8ޫgU>[>G=y>Wvȥ?:%?wH;=f9ͿYAҾt>B"w>y[W̻< ^ꕾ >]?w?3Λ?Ɂ>86ƾrG*@u:7?(2i[<*j[,>tk>l=O;=i<,>>}n8?yuBI?;P>ke]M(?m&~>; CɾNV w0alp}w>%#ӿ{m1߾2>OS?A> li=Y? F@|@HWn,e)Gbg|@85(<\ $A࿥ULc7 *C?A3= _[>F'?b?)i>oW,A*@8Y@TD?<1>> %^> >4==6@"@ʗ? >ξyſnQA/FJ*3C)gͩӊ*E_ҋ !0p徙#v}ʰŽe5?P+>5<)w;>OΉ=/uK2Ȭƽ>/:">LDƾ?վ>\ >Ay =@<7ڄ_@)v¾3?;0?gG,D=a+<>f>x>w? ?@s_>m sA>.>o#G=?,@MoA?]l'=@??z˾OɁHU?M> i>o*E}WpY`=a?Ӓ_>q>ފ>x=<)`< ;u>a&3DQ<\&< ?>Xb=:=<2@?,>mT@.?{!:=]>b7>>TJ*?ݲ>aa? $?o? ?!|X?>͘Z b:=퟉=(=;v>OӾջտžE#!?5? `?>=l?ʾ;?"1bT>fc>韾&=\ m{3AДg"???kR`?>lZrǾ=zR> =9?oժ7qs[L?*?K>IO/þmGF`ܿa¿2E?µ?$>իxiL/?"?k}7) Й+ ֿ'|?%<\?j 役<|^=Qļd[A@ Si,o=*ľE2ꋾ#da1<&gL0zd꿛:>d{>6~U>C:/2=?Ä>՞H@x?&YտfU>W7?20?>Ͼ~U?ew? Oο[ 1Z?6?y3~D粈=S.d?aa??BS>3O!ֽ;V=~Y?h"<'Ur?y= q?d%>S&>>?޿?8s>`羫n>kO=z e=[uGh~X.l[H= F?fM?牽Y$SW%K*2yT">?|?y?Ͷ*?Iɕu)eNC%e@Z@T@2=HhhǾsܾ7! b̈"y5?T𡍽{?~mE?PS3a=n>~)=LJ}e@dUjJ ?sB>IR1>>\e;( *=yc?X@yo> ?뢽8O1>D>V?L޼6~? >I=M?O?K?m?r>>$@f v@`CX@W @?E>۝vNʈ5Lw{<@'?< ??S?z?>/:/0J!vzr㾩弾!p`[쿽lf>6N?*#?;=R`}# ?0\j?΅96@c>P>_+>7Smc%@X nE? >L>@~tO>׆G>8_zN @ @y?2?m?x??d?Ҳ??'?썇?U?Ƅ0( +#D?-?_>x>j @6pe_>6./%s=hb{wr?>\= k:!+z3J2 ?d>&YiY0AZ>'!@'>B,ؿ5vݵ<=/^=?I\=>@ǽunk= ,?o??ѳ?|>?U@4Z=ѽ+,ik >*><>=m}r 81P?qWl?kܾ?v>dN$qP4>H=b>>V? @@> $?N?,>-;a˄w!=ێ>9M?,;*cOz渾 ?%?R?1N?I?><)?MBQ? I ?>5NM=(c??VA2DX| K !ž)39)z@2E?N?-|? v={ޙB?xI>=y>oNW>~>X>倿8!> J=bb>8<\ _|ܚ?~2Q@}&9+?D )?}f=Ps> != >`>0=OD?l=>)g>u~:>@|>/S&.鄼?> þ>!q=]ƾU{@7f@fe?Mw>}׽>X?Xdy[dC,{JrY^MF=:;9@8)^2@Yrd 6>!Y=/Ѿ=uw}}> ? xÈ @ ?tcP?r.ˬ>CAI=ߑ40?)??@?O`???yD?-?l7?Ws?8tq.?->ؾ=L sO㿱>17Z??>֧6>q*>>=64\>krU??@̡?@Ǯ׷qW?.߽|d@'S?P?mݲaN?bo?J'ƍSa?? L 즿Fѿx } ;\׺}#X4E(z7?¿CB@J2=<&=>?t?¿e#ƾwcAz=k>L?ߠ?mC?g?J>moy?\?;??U?FU>"M]><>ԯR=?g%o%XDKa/? g?>oa>x>Ԇcl=Hg yI>G? &P>?wgU>c^>^=G??zs??ȨX>l?4?Do"?x ?ς/>")w=,?=羣?P?*$>zҾq>ɨ>4 ?cL-:?[>[T8?"' ?&=i涿j = |ҾNk^5=(N:vl9@IA,P^=>N>?+#?"A2Tk>6ĽQ;>NuXEۘ5 0.޾aUmpu>Bb\"?-'?0ܿE)ch_==;&(l>@W@@}Se<ڇ?C?7<=_{=;xT>RQ>@[5ʿ;in7򼘧>kUj>!ZHK`[K>E>?V?>?>E^">yP>Az?@3?H:c@9k?XO:>^]>sNn d}@@6?>n>#>v> }?O|?">>>mAC5s G>11m9Zy:dvRbƾ_GH7z(V~??.?XQ?9I?<{?{????á>E]),?ĝ?z8?>R~>h=vn@g@M@X:>g$??B?v3??uFz {gG`[D=>7n={t^<6 mZ??y?'?B#??? *\?@ ɸ?딿6dǽ[)]1r(cxM'>>>@"'@ -e\?>{'cjsc=-h@<l@G&>՘i?@n @cY u>>xP(=ƾ>>\6>'9@@?.? x?GF?k?y6g?"?7?@c@1?#_??i@Y?> I>eĽᒾπO>`፾>a9>* >Tn>d9=Wi m ?Sfsq=.?U ? >p`:x>Ϝ==d> >?n-, T??/R>W/ +5C=Bȁ?J>4?`@?ǘ8B=`n=j\=ff2pA?!.?t7>y>`ʿ!:q?M?;G>>>?(%@,@>U?]?(>8=??GP?^e>o@!?=^>Q> t~rھc>>Rk@ @>R>@24DY=v>d=g>m=⪾/S??B?S^n?>K:>>`0?ja?Y?ݿ6þR ?WO?cr?!t\>!A61 ?)<~ᅧF$Z8:)ؿdjO>?rZ.?m2?T]?a:~@{*?"_)9ɧ>IT=A=9 ggpoBEc?o>=}͛v;+?,>͇>fҽY^Z=;w*>o q60t?w?).?g-?|Y)T)<}>ʡy>7M>Sv 5@g 0{?/?տey?dss=35><>AG~=Gd`@?"?hEdI 07z>=*;=<;?ӵzL,KG>by?N??x9,?1>a, j9T@ew>#>+=>Z c>=׷8 @C@Aڢ>ť\\ĞC?3~>So >ݰTg? Nj?n4@縝>j~  CB=!P>E: >1`-v>u>y??S? ?-(?'?;?>T7 ~q?SI@^| ? ?Yͽ>A\лL3="[hm?rq{>E>=V>`j~>Z#>g=LMA?b}?#.կDKz`,]1OcXS @I?M>ַڢ?>h>ns &L&>{Ai(!W ji?!u+[fiw>CXľao@V?Dm@l=2T=Py$0F?+">qw#oٿ")6<͈'?*?:>> >E?t@+|?%fR?74>q>->e䘼3#,>uM@ȱ?/ pT&yՕɫW$ u>a9ewgIJt>`hejS<"=u??kCQ8k?>iրX=F? >N1X?oK`@꾿<:?4??iD [Z>rKDzd?ۿm@d&b>ֽP<=~?=GٽߩP;?6@?<|ż`g15>֢1>NNãp@r?'VYf>R>>a;¾*5cpocketsphinx-5prealpha/test/data/tidigits/hmm/transition_matrices0000664000175000017500000001005212771605033022676 00000000000000s3 version 1.0 chksum0 yes endhdr D3""& 'FkEr?.F5(E1DAF>DKDJEn>kDR FbD*FR9DDF8C.D٩FB%E@ F(vCDVF6EmF8KSEnCetF|AE͑Cf2FVEA!@p'FwE9D FdE@EәjEX@IEЙjE P5:EjE'<6dEjEx=o`EjE/F6gEQDE!dERNE>8F9D}DenF-U1DDR FE F/bEջB0EJbE?ţ@pdE[EqoC"E*DE3EDȳFX^hEF=VET^hEM n:+E_hE*8쉏E_hEd+9E_hEpjF*1Ef#fD?)}F1E63<EkE):φEjE@z!EjERFؘiE/gAaE^"E`tDPgE>DDZlEDH%En%FnDEhE겾<>EEODTF4E@xFeEʀTB^F^eEE_jE;9JÌEOjE?EiD!E FNA!\D3֒FE\F@iE@^FhESȉARFaLiE-; EJEږCHE*JE)!FYDDED̸C"FHKEB<FhE7&EhE&FgEA|EFb5EFD]E4EcBE DD[%FEF[,E~DFE6.ChFNEӤ C!FDnEɘF"5DEbENeC_|E D$EClEC3C4D_EBrEEDFmE%D!-F,Dw}hC,*FPVEB=,GAlE"F!dEɑBeEEDN,E#E"PD"9DVE DIxEFroD׮IFiE"AV FxD!EE!FBՇDE*|CEZFFtDOFUEACEUEl<5 FiEOLA*FCD"DVFAD^?F9EDJF D'D^;FQУBpEEZADl@F$EDG>F`LFG5DޣEuGP5Fs E!FHE`uFkHrFs̕E,DsEGEKCUD mwEdDLDE:DAC^FGLE%EH D]ZE1ED7A!OE&PD@Ex*FBD~F E hFٍdEEB~bEDDE]D$bCnCEqVCGDEFbD8a|F~jE\=FhjE?$EhbE:BEbEE;FjE~FjgE@?Ɲ F\dEABVEdEM?gFǚD+ EFDvFkEB>s FkE79^FkE1#6FkE )AMFkEPF_hE <ӱE!hEw@vWEj hEb?MEUDRD2FD E\E'dC.a-F[ET4A F+jE;{EseEBzfFseEB@F~7DHDvE0D)UCUFQEڃB x F^gE8A3F0 kEED=eDxEMD6DE1DStEFAgDFE1$pocketsphinx-5prealpha/test/data/tidigits/hmm/feat.params0000664000175000017500000000025112771605033021016 00000000000000-dither yes -lowerf 1 -upperf 4000 -nfilt 20 -transform dct -round_filters no -remove_dc yes -wlen 0.025 -feat s2_4x -agc none -cmn current -cmninit 63,-1,1 -varnorm no pocketsphinx-5prealpha/test/data/tidigits/hmm/sendump0000664000175000017500000123712612771605033020306 00000000000000BEGIN FILE FORMAT DESCRIPTION0(int32) (including trailing 0) (including trailing 0)3... preceding 2 items repeated any number of times3(int32) 0 (length(string)=0 terminates the header)cluster_count centroidsBcluster index array (feature_count x mixture_count x model_count)4... preceding 2 items repeated codebook_count timesEND FILE FORMAT DESCRIPTIONfeature_count 4codebook_count 1mixture_count 256model_count 670cluster_count 15cluster_bits 4logbase 1.0001mixw_shift 10Nb1x%>"r'""+fwW)MgzyR@I{Ф'YK}]pP@ժW "" dwٲp{&'" ]Y [uGT}IKp%"Vuw"r'""+fwW)Uwt'*k*w@ZЕP'PPI&"z&rGwA }Mz qb[Puz]*GpM EWMF tקyYMV ԺwEUu ""IpJ '"""rBG&@"*"jg"wwt$r@""""{UZupgr""uPpjp]}{m&Grp}@U]@wY wwtz] QMwGfWٙU%"@U[]YYv& uwzwuP{ @Bz'w}{tt"T%"z"rpwrt b)""@tPi"""] rGwBw d'iw'*uP{ ww}ttpj"wrzw}wttwt""""""&'"Y]"*"wgJ'"BwWG"+w "Ft&jrpuw)rY&"+""r'"bw)""ww@twpM&&"Gr"R""B"JZy *frzwpv'G&""ru @}jzPwpU"w{uwqpwwpw""pzwww}G+"Vf}{Yiwzw"B""""@  z""""""""*M"""mp-""""rwwb""" ""M"*bz """"} @Zp]]ս"P z%"r"Ҡ}"""""""*M$"""""+R]UM& w-"""""" +mrPY+"-"wwe """b"+""E"&""bb`+ ""b"PD""""""'""F'""@utG'"""""""""""'"""r-"P""""+b'zu""""" uwpPZt}wW}WMGzԩ ڙYP k""rtw@ ݕE@"""*rwY-"rUVPDZ""""""rwmvg{zJ*p&z& mRM"۽*"GFqd"+ %"r ""Y*bz-"""" ]@ {T D@t$j{-&vu" {zJ*wG w&f""gBM&] """""""by*rPE"r$kGVzj*"df"""f*jf*""g-r""""W*PEb"""""B*"bWD'""ѕՉ])rk&k""+"w"""+"g&"KpMD"""b+vw'tDU""""PJYtwttT}p{GtJڅp}Uwttպ""zWt@wpwGzG&+&WM &vYWzz""""""rw-r""""""""'U&"+"YR}"e"b"]""""r%"""$""U"'" "r """"RUZ]"ە $"r)"r"M$"""""""'Y"&"b"RUU* }""""""k""m*T &"V-" EpTu% ""b"""""""" """""'&rU"""""&'T}""""""b"""Jt'""U]UUPU "&""""""w""""""&""''"EP""""""""b*tup"""""U AYZpEYYWUUTUՕ]՗ՙ*""b UU]""""""W)"r [R""""""-t"yr+&"""'ڷf"Zm"[""""""""r""+"*""*"WPM UZ""mW"rp""$"""f"w*"""wz +"yr+&"""""$""b*g}k&"&"""+""[&""""""""""""""""""""'""b"""""""""b""*br&""+*j""""""k""'""""""j*&br*'BWPwD"P}zG }EzqD"e"" qPx$-v"+""*"v"""''""""""""" """"""""""""""&"&""b+z"""B"rKBr&r"""k""""""w{f{w'"+r&""""{z+J{z'ԷrG}R@uwp'k vp MWw%""D&m "**"u @]X{UUqԉ%"W'}J"{z+J{z'ptGԽg"wJ w *D}u{zt"{p-t٦u w`g G Q]}*D]ٕypZ uUG{YIYwz"ubIU%""wwzzp$b+""""+]""fb"Q*J}b"b{ Y *""qݠ+qYPݐrjM wԴMtwGUrzUP GKzݙX )"WDP{t}v*&+"R}E}w@"b+""""{w*M""f& }u" %""M"rM@"+KK"-"" "'{]d""""qݪ GPp"W] 'G " U&Ҵ"b+""""{w*wWD'b"""bfGp'uwu"""""""%I]""$"t{p$""""r"'"z*rE"*""r]"&pJ e"""""""r'""ZP-""GMԵp@*"""""""t""b+""{wrE-"rPY""br"r{* zG@&""""EMwydwT}wwezv zupTYUU @g""rw]DU pw"r"zw@t " U]"""""rDdwY קw*"M [}"f)b"B*"r'+++ g*'" J'"rTwrwuAvr" "b{w"'$b*ZJ*"Y קw*"פV@wTݰ'b*"+&"""&"""""""""" &g"-w""r"""""r]}z'*"bk""""+*rw&"""""+r+ r&""&j'"rMwzYUxpwYMMuJ "r"+rr v-"&+j&rrw+wW+ r&'&"""""'" b"""""""-r*fr'g&ww"""bwb""""ٙ""r"W+b"""'"`v'"r+"""B""b""""vg+$fb"""+"""""'$b""""&"tg""""GDzM%[""+br+"""""""B*""""rj"Ր!""B""b""""v'""k"*"tb&&"+"+""&"""&"&""""""""""""rB"&""""""""&""k""&"""""$"B"""""""""""""""""&"b"B*""J +D"z"'JF{{WPPuD"&""d """"""""-""""r"""""""&""""""""""""""""""""""v""""{""""""""'""""""r""""""rj"bEM(""b"""""*""'b& rzjYxqr]r+}M@pwA]*""`&&j{GI""zk"'"gb ]DG'r'j""*""'b& zppM"+f{*'gYQUZI*wU+*"'%r$G }&} 'ww{pw`vuD*&Vbzt'r+rqGGp'*g+""mfk""&"""b*""""'"""m*""""rr"@r]'*bw$""*r"b&"&""*'K{+"""""$"+b&'"v&"*"r"bb@}uЩw kpj{ pMwwת''r""B&"""'"&""r*+b"""""""""U+*f+"UU"re"""p""""r-b" "bY&"{-""""ݐUUיY]%" ]$"۩"}"Ҥ """""""U+UYif'""UU*U Yՠ""""""+"btY &"R-" G}wG}*"""""""""""""""""'& """"*"m-bu""""""""w'"bUUYY%bk""""&"w"""""+"'$"f]ݲ"""""*'*wMp"""""]@ՙ}PUUw]Tٕ@P] U&""b] D"""&tU"@wwrzw"""""" PD'{"" "'"B$bzErtzkrG[{wWK$ZJp@qt+"&* mԗqtr "b'""bfWwrkk'b" "'"B$bzwtUQ"Gg"+&j"'Gdf[p{&+"'"w)zxDwg{g&r'U@v}+td+*bwr*bvfz&${B]{tp$kzr'+v+"&`jr&"r+""&'"zEG""bb'"b'&""&wW $-'B}wzJ*+ +"+"""b{+'""""""""+g'*r -&"&zYPנ{K@b'"+wq׶"'wrk+"r&w++z*b"fz*""+"ErGWק]@rw+wtrD"ҥwvUrԺ'Z Ud-b"ՠ+w}*&jGT uzGYMGuyuyw *R'"ErGWקTݝGbwrwwwD'wGtt""""""&"' UW{G`]`w}""rwtP*"&ttz'&&riR"b} )Y"+"r+"p]-b"PM@gzv-*w'&b*"bw"{t"""wbK$]зbzGuzwWz٥tvw zwEݐtwGDU""zWIGz@]wv{w]Yyw -{{r""""@Up%w" y'b"wp++z'"b+"""*Rt rk"j'"T}p@j"ur""'""з"F"+z}&"" y'b"zkgw&' b+"G&"'B"""""""*"""""+rb""+"""B""&*"ҕ '" *r *""b++d"r""'+g&"""$""&rK'"{۷*MMPy t+zpWZzr&$'ڢJ*z'z ''+'kr&r Z"+""+*"""""b"&'"""""""""w"*m'"j&'j"""+Grb"""+bt""z}*zr"""*"&"""r"&"""""+""""'rGtk+jDv@G' jrjKpz *b""'zb&p""wJ +v'"$gDwGGjw""z'&""+""""'rGMt}p{{"`j w G}wkuGJtkqtb Zdrb"G*''p'+" k{vgJz`zr-ffr'+b"} b+"""""b+w"&"&+"'"v+b*""""*&+" b"" '""gv *+*"+fG'"""&"b&"*jr+"+ zpwDzw {`rfw""kgv{}+*"&wbww'"+&"t'U@rw'@Et" %"Gՠz*wi]")"b-+""$Tw I }zp`q{ "Rt*"t'DUUpG"wwrD tUdDWuGw""""""'""$*PM"b{$+J]-Zk'"z{"*"'"""{d'Y&"z*%rI""&"""*"b%"bUUUITEzz& &w'"*r+"'"w$+bz'p ""BupUywtzppЙ'F ڑuM] @z""jwwU wwb"wҫQq{%ZKz}""""""DTD$v"g"&z*pwzT+w"zڷrp"t{ Dt@Kp`pݧGw w{@'fKw"*""ww@w+קGw"g"&z*pztg{Gս"g"zg"r'""zrwv"k+"d*w 'BZD w+JU @@p{ttwڧtGk+wԧtMGG+pbGz} utGwwz"zzzb Ԥkw"wEw{+wzgtj++ vrtb&'rrf'"+""*"f"*b""""""""&b*+&+'vg"wwwwwBrB*"wGuG&bjDwzwt@wr*}$z"""+"" T'+zw*зwjbq*+P"@PMW*v& "" "*r """"YUGQMi ]]'*F-"B"u"+"" T'ե }%++"wGw+w}wwj""&b"I"{$%rw t'"zv&j"z*z]'"&'rt"zdw$w&"""&"&"{}*""UWGU@ """b""""""*""+"w"ww"""B""k -Gw """""wTPUEPwy]P DGIp }@]@&}WUP ٙw"r"+&ktw "B K zz""""""BUUuzPj"""""""v`"*&"*""*"*"""&""*"""""""pP)b""+""r""B$"""F"b++b""b"-"ٝ!""j"""""""v"b-"+"""zb"""'"*"""""'""+""""r"""""b++b""*""""j{&""""+""&"""""""""""""""""""""b"k&"Jzr""vrrf{rzg@wPZy""&"Gwu"&&""k"""&""+""""""""" "b""""""""""""""""""+"@"""""*""&""*""""""b+"""""-"]]!"+b""""&'"""br +rt]pp}]@TMI'Up]U]U] U%""ErPJW'brK} `b]@] D]-" ]t&'"""br Up++"G] '@Z w}EZUY  ]YwDtۑtқTU'"p]U]UEUwYBUUqPGPUEԙ$""Yrz-"""j'*"`%"gJ "ҩ-"""''+PYwvrtu"&}ZG*'%b+  {Zb" """b%wPU}M]ptݭ}UYwU "]$J U J$" շUղ"$"ҽz"*xBRwz+"bf*" ""b$""""k{""G &""&&wD ""{rz&r ""{+"j+""gwG)""xBRwz+"bb+kzp""&"Pr """""""""""""" """""'"b"&""b"wt'""'+b+""""&b""b""&""b""+"""+""+&b++fwDvzz+M @w}ZGWtqת&vҶ"Gp"$"""*"g"''"*""$""+b """"""""""""&*&z"b*"&"&""b+&"""""{jJ"""wr r [)"+"""""zzzw&"tFpb"z""Bf&++*t f*rk"gԧ&RK "Myr++""z{"&"Tg{+"zzzw&"[ytwjf'&""jwH""*""z""""""""""'*z+k+"dfr""""" }'&"k+"{*""b""+gk"bk""kB"'ZmJgR{&RY G՗Y]YYzz*ٲ{Z@@*$bb"T"+""b+"*""""j&"*"""""""""jvzg*"z"""brzvj'j""""GUu"+{{{zrjdz{"'"""&"""""""U&w""""'Bw*"j""""Ԉ'"""r"'"z"+"" """"$""""rwU]uK 'bGT "r ""t$"""""""U&tJwg"b""""B@w"pww*"""""""""+b{f&"-"B(gg+""""""""""""""""""*""w"""""'&"""""""*"""g&""pp G$""""""""""""""""""" ""b+g""""""""'Jz"""""ZwTJEڔMzGE} } U}rtp@]G"""+pwzwGG]""""bb$"${br"""""""r t'vtb"B*"b"")w+vwwGPwfjvBt w """${u"ֺ"""rwGWMw]z'KW'"{"B*"b"")w{w$+j""kw{ztwz+wz}vGw}wMzxgfGz WPP@ww"ttw}twwwwwG]}wwwwwzۭ{w{wrWz'""wzt{*"""""""""&*"kg{Z rz""""""k{T%zjj+"+""IZuwZyti@ zz'}z שzDDWzWUE}}p{"w"w}tw'"{ @ pwB{g""y"B*""""JZ-t&{G$trz u&W*Ktݠwp *""D"*y"V'"""rwGDWMt w "vt"B*""""JZ-Dz{'&+&jwDwwww+wzwwz* ] ] QgrDzzzfwrpuݠd+jz@rww wPvwj+g"zՠ"+""z{'""""""""&"*'"rjb"vjw""""+"f+)rKw"*""e۰J@wiYEG} Jzpj۫ Gwתk}w`]]pwDwzwUb"w'"vk wwG&f*""p"z"trwwJ ԷG' 'zBtDWdڵb ""&$j k f+"&wZݪUwWP) f"g"z"trwwJ@Dtz" www+}P@w'"+*&+"} J{'+DW}Jpwp'"z+z*"wU '*&rwMU"B"wRPb"b&""{wb*$""Q}'f""&"'"p""b""bg&b&r ""fwU%}TMb"b"wwMЧzڪUwPEgpzIJzq}WwwTwzwY+bGUUDUbr"'vw԰f{J{g&"""""r }Խrb-"JG&{"*"v"" BkJ* bb'""G G`ڪj$t &"j+"t"w&b"k+"-"bDtjbb z+v+""""""""""""zr"b'""+R"""r""{"+Fz&&"'*mB ""&"r&+j{b*b*"""""&vg'""wzb{wwpp}p*+ `b&'""+w*rקw'e"rFB"&"&++""""""r*++"""""""r""{'rz+Gw"""rr{fBb""*bb"v*+"{+kp'+"'r""bb+"""""'"""G}t{""&Bi+"zJgbb&""K *&+""B "*"""bJ &PBb"""""'"""Gݭwwн{J+"rb"""*"b&] wz"&""X*""*+j&w&pwkb'G{k"r&k""++&'"&FtPڲ+"v""""'b*r"b"Ҵ+*'"-"""z""""""""""""$""""`]a"&R"""&"""-""""'"""""""""""""""""*r""t"&""'""D]u m$&"Bb"'""&r+""v{kv"&"""""z{{wiUtvg@{}z MwIZP}yJz "" Jw pk"bME@Qyz]wtziU"z{{wi]utK&wp U] M@""{B"'{GvU wwtpyGgZUp]EwJEYmK } gzwpMI'v' M$""MUP@w {{*D'*"*zW+{E}"""r+zw'w}Gf+"UUwEwMYuGJ'z[zК]EP]ݙwvvGTUUYwzzDzztGGM]Ui}G֗W z++b@]t""'""bWYg@kb*"RY"Bw "{հ"B"-"G"$"'g"g""" אWU"KEI@+rBt"Ҡ ""'""bWYgwpDk*fb"]*ݕY""""""*"" {Kwpw' wP-t *&""jkj"""""+tt"""""" *uG""""&"'wb"""""b*"zp'"wwwtDMu$bb&'"w&*""*"""$"ywJ""""""'r'zztz&b+"bWGYUrt}IYwZPДU Gw@Yл"""DMw @F+"""+WBKvGw""""""'$r"H{Y{zЕp{wDt"uvG"prQjZ-'b ""]UwjG{w'PwZk }}t"֥w t ww*J H{Y{zа] pGKzwzJGt""""""""bv]gp$r@ 'zj""rwE++"w]]z"+*G-BE"+"g[Z'""+""fb&tW'""PzUՔ+"wz+r*{"g"b++zF}bb{D{'pww '[+jbںmzbb'k{pZuwwpD""bZ՝{zzzwpwjMwt w'zrzzdw"*+&BjGz """+"""bz*Pd+ B'K'"+{ptݲ{ k dt" ""M"'" "b""rwyp@zwwiKА!J "w"ru""+"""bz*te*&&* p"Gw'fb*pgG٢ Yp"GGE]-"""&*"+zG"'+rr+G"" w""""""*" ""WwuPz """"""""""""""&bw$"B """"""*v)pw""&""tTQwwpwwD}ppzwGzwtwwwwzw{w@MJtP&p]t "r"$vwUMP$"vv""""""BwwEuz]PڒgM+" DDE+bt"b'""g"z+++z++'*bp}k$"'wur$B'"r{w"G+" p G'w &"PڒgM+" "B`gp"tT"""fw"+rt"""""""""""+b{""r&""rb&"""U+'""r""$&r+""""j+g"""B""*r&""k&*""r&kpҧGWqwp Gp{"zrt"wz֦'"""j&"J"rrW""""'" """"'""""""""r$r"&'&j*g{&ww""b"b{"r+"""{pz&"'b G'{*rtrK"*+ez"k""""""""""" "+j)r"""bErb+U""R""&mMrf""'**t"""""r'"b"""""rjb"{k"""" b""""""" "+r"+vzp""'*''*"""""""bQնB*"A+R%"w"+&k"{"t""'"*"""b""""&&""+"+""EbRb* """"rf""r$"""""+"$""+"'*"b"w&""""""""*"" t'""""+r("" "r"""""""*&"""b"""""""""b""""""""""rd'}++""""*""" v*++"""""""""""b""r*r"+R""""+iԀ-bՙ[Ypkr+kgDDpuTwp'"" w}w@d wr""f {zp JwGw+"+iԀ-b{ԐٙU'"fz+g"$k""+"+"""j*z{M@t*w"Y}`*w{]m'+wwݷtj* &rj"*&b+'r"*k'""f{}[uzf'{'rJ"t" wr+"++$'ww Dr" &b"*"&""+r'v'r""""b""z&+vjb-"f"@pkvGvvgwGz" gwGw*b+rb"b*km""*"""w$"kF'rxwr&wwWEgIyP EQ-k+zMy  ״zzz "R "jT*Xd@ Zrw$"kF'rxGt}fYqww'r'+"ww{Kw {y`zz%Yt }yKWՇPEDw U]I'}Y U' UIQQE}$k+EJ{w{{$w {XEw( 'rvݺEA {pM ]zzR'"+"")zW@ b"""""$JpGw'fw]z pb"UzdgתwwJMuZ"w"""""""B&""""G'rz* """w"""r"GJ"'""w"""t"B$""""BGIٗ]}WD$Հ "$"z"BMi"""""""B&Էz'""""""rzw"*"""""'"b-ww "-"{w{T''"""""""""""w""""""'"wz""r'$ "w"""""""'""""j'""wzGz*""""""""+""""""""" ""rg"""""""bB'bk{"""""}TqG u Twu нU}}IGwzywwwpt"""@EZMT Ј""""bzJ$"*""rr*"""""""r@Mk""&"""bۙ*ݧ&&" rG'Bwpb+&w"{&r'"t"'""p+*z"""""rKЗԕb %"B&B}"Be""&"""bۙ*[Gzbb"D"wwtwG'""""" ""grp}'i"zw}g'*"""""""gw"+"""+rww""""k"'rw""""""*""zw'""zw Gw'&""'"z&&""""""z*"wz""""""&"+wzw+""""DwwIytu uMP]@EJw *""]yUG "b"&"pwT&BBrJ""""""rkDwm]"""""""RU&""""'""rp""]""ztw"""""'"B"$""j"""b"*""""rwGy]]Ptt*" G*"'"""q"""""""RU&*'+""""""b`'"*"*"*"""""""""bb*"dr '"%"G'+wg"'""""""""b""""""""f""g""""""&&"g-"""""""'""b""$""{wf""""""""""""""""""""""""+""""""""'"r+""""""GwwZ UuWWYUrG ]]ٺ'z'ww"""wwwt{""""""*B'""+"""""""""rryEw`b {"j+""֫&}"[""*"+""v"&kbjk" DPqݙQK"""R&B"b*"""r+r+$"&+G}'&"`b {"j+"""%f+"rJ+"*"rr$""["""""b""""""{""""""k'""&b"rb&"f*j"rb""f+"""""*-+"*"b"r"pr'* %Zq%U"]YYAJr b'"uW*$"&r"+"""%"""" """""""+"*""""""""""""""""F+"*""{"+g"j"""""{*&{"""++G j}tz'"""&"""""""""""""""$D'"d""Ѣbp"""r"'"z"r' "+"*@'""""rzUXT'"{U'"r "rp"RE(""""""""Gp -""""""R Mt"}tt'"""""""""'"&"-*vPwp''"""""""""&"wt""""""'""w""""""'*"w""""""b$"""z'@$""""""""'"""""""""''""z r"""""rҲ+ tw"""""MXU]MEyZٝݧ"""Gw@PU]z"""""&G$"rtrw""""""BYY%J""&'""$""j"{*"""""Yb"&"JBwzkkQU'""+"""&"r""""*"b'"""""zPp"+"""""""""&'""$""zg"bKwE"""""""&"""""U]r$& B"""))m"g+kzj"tt+w"k*t*"j{t{'b"r""b&r"YYU""'"&'""'""""""""""""+"""""+&""""*"&""""""""&""+"&"" ""*r"""""""r"+"$"""""+""""""""""""b"""wםw'B""'"""ݴ+"""&"""""b""""""""""""&"""""*Fp pfjm "*ջ&w"BY&J&r*b"*b"יzjv yzK"j"bw'vGIkj"F'"*Fp ګwWUJk&+rfݻ"bڠ"""""""""""z{"Pkrk*bb"b""GI"&""&&"""$'""""+"**r"-*&"""""'z*b"FfUY*wjzb*"b"""rrb*"+""k*jz R"b"b*""""*'{"*"""""""'B"b'g*''*'""zzw@brF zqJ+*"j+rr"""""b&""B*"b"Jg+j"G*'trW& tGtrק"{IIyT'"" wD*&K'""zr}+{ "w MJg+j"G*'{w**"w"r+&+"rvbb"+*Z'"wD'{}*YkwQQtJ]{tDu'{zzwmGٔ'"w*b&""""&"g"wwrpz!"&"rkE}rgBtzb"*zz'r+$""*w{ """"""""+r'zzg*r*r}bwwMDPDBg+"ww}+ "wWz}ԤTkrgz*{""+&""""[*"""")"R""}rPG""""r$rJ" """&"p"r$""""B P YP'"}'")"rp"t-"+&""""[*}Wd"&""""Y""""""+f""ydwz+"'' at *"""""""""""-u"""""'"tt""""B$''"""""""r*""w}'""UP %b""""""""""""""""'-"G""""""""*rGw"""""Pp@GUUU]՝@W}]UљM} w"""z] Gtw"""kbGP)"rgwvJz""""""rp$Gb"b'""r)bU Mz{zz[yF}ztuD'""}`Bt{''wzr""*"bJ*wM`Yw{*$""b'""r)bUGYФgfv'+"'&f%"r""k*K'{Q`DJ-d&rj'+b{p$+*w&ft"{*' })bgr &r ''""F$t+"mg"+*zgw'""r*" "*'"""b "K''*W}rr+"m +&+""""b"&'b""""""b{ &Bb'bb*"wZF'Gw"wݙUzbbjw{*""""""++׷d""b$""""b*"b""W$ݶ"Yu+W}&"vEP{&[uU" ""Y"'"Z%""""ҐQՕU٭ )"Y"yI"b*"b""W$ @ݽ"+{*z**Uu""*"""J+zar }g"R)jWՐѵ$"*&&"*{A"+"y+BY'"rwI- """"""Rm&"rW'""U]]]%"+"""""t""b"""rE!"B@"""""rvJ)]PQ"""""YНUՙzYYUUYQT]+r{WE@@"r"zz)"EYwIU"b""""R@t"j*" -ժGgYuEbTM'[٫KTyZ -"+${ݲVb&"]]UEPw]U}v}wZ%" +"j*" -M}'&''{YUU'U]E""""wEZ]zKy@TQI+ *'w{'+k ՕjJz"y %RՕz&k*bۧ*rw-"TUz$"r"&""t"+"*'"+{ & }"""""*ݩ]WE*fk""P y@P YPUz׭zBw P]UUЧbPЙ ww ]%" ՝b""""p k"*""bf G'+vgUuRu"We""G"B٪բrP E@U"J%"" "- UbPu""""HY]W KwTUE"]p'P%"ו+}J"*""bf G'GD M b*"+Gp ]']@ u"""""bj*{%UU&"r$" U%"k"zf"'""{@*BY+BpwU""""""&"P]%""Dut """"b""""'""zzY%&Kٝ""b&RrryVW'""""UEwYe{gw]W+{vvzwY]yU}UUUt""ݕ]UY Mw"bwMUUI%" TWUk*&""r }wzbzzvP$ "qA*p&U"t]ur*ZVeU"F-"" "۵"""]YUQU}}Z)"kRubzzvP$twr+z*YQA""'""g&v}B]@kR%BE@Pu'frww*"v*z**'*Ez]U+"bGyrU&"b"+r '"z$""pP@z*z"++w""r"""+-"vDM""b""rf'ZP{+""" }@} @ՙUzqpWtPY U TՙUw{wYU]Tww*b@])"p Zuj"""Ruw]"""""""+"""" tg" t""YrM]""" "r-"B-"b"'D"$""""UY$"PY'"-" "RI"""""""+TY-"""""" MM}"]]Mwwg""""""{"w%+w'"%'Euu)'""""""""*pu"""b""w"]""""$"G """"""r$""wZ$"b]P] """"""""d"""""""rbp "bwwpb""""r%{Gw"""""ՕYAYY EE]t"""rUٕYUw"b"b]P$"}Jݧ""""""zQyGzg&Gp""`gG+"v'"""b"""rbG&"rw"'"j&+&" @ +PFu"Xg"b"""""*"b""""*k"""""g&Gp""-*r&&+"z""""&w"""""""""""""""""""""" "'vd"""""""vww"""""""g$"""&"+"""*r"""&&r"b"""""""r"""+"zr+װFB&g'"&u }+&""b"""+"QW&'"T'u""""&""""""""""""""""""""'"+"*"""""&""""""b"""""""MU`""&"k"""""""""""""""""""""j"""""+"""+"rv*&"Z""j w"QA]ذT$""j"-Kw"+*"rFj'&""F&tG" "zMj"""""+"""f'"""&""g)"'"""r&"bbr&wz"'"""+p']U"zGUPy&XuD&z+{zDpJu G'"""&r""""b"""z']"""j+"zpz-һr"""+"wjrr*""*r"+"$""'"{b&"""""""""+""$-*"+&r""zGGw{r'k""jzw+* "zpGwUwt*&rz'w{"*z "w'"kp&wB"wv*Bw"@wtۭm{ pM ""rJ" ""t{ *vڑ*k'"z "w'"k`-'+fk"* "'rw''$""w"r"""*b"B$*"Br+*t'ԫ wzw{ wtGD{}{z &՗'pJUg{wy*zpzwwQUՙQZQEEGTZ%pJ Mzפw۪ "*g&kRjb'"&""%"g+ """""""""'w*+' '*w'"kG*&t{v%z'"bzr Y***ڙa{Kvwj{b"j$"""""'"""r * j] q"vw{p*""$$+"J *"jrG*B+"" *GYrݴ$"&Fbjb""'"""r *urpUzrk*gB*u]Y g+b' q*{++ww'bj{ $j'"'r{"rb&+ *rqrYשwR +r&""'z """""""'"""""'&"""""&"b+"""""&"w*+"r""&Bv""'&""*"ۢ"&""""+"b"""%""b"*+*"*wttbgb"{w utgk{ '"&+""b-+k&""fg+k"+[ZE'v&{+pP""""r*rI{+r*z"u+rYMWp*"+@z GBb @j"zM*" d} bB+*[ZE'v&wz}}wuUֺ""""""""""""GZz+"+"G"B+b*"rzt"*"'+""""''w"&vw" `r"""""b"""rZWtu+rTzMUwwFvҢM*F+**w[ zw{"*u"T+bJ & '""@"b+""""rЧ}QPI}jf""rGV """T""۷} z {z*""+""""+""Wy]&""k"ba"+""g"rG*+BDd"&*"+""d*R Zp+"&pvrk*$""*kw"bz*"԰*wt{""Wy]&""r++fb+""*&z""+br""""""""""""zb""r&"w"b*"""t$ b""&&"""""'"''"""""&{"""""""""""&&d*R+b+ P fWzvzKtk"*wrwz w&Kb'+&"bW"*"""+"'""""+b$"""""""""{""'*"bb*f'""&bb""'"""Dմ""'*w{k{K"rB"'&*"""F"""""*""K$ԧvZ""wzwrwp+yyuw*"+" w''"gv"-"&zGtftgbzwp U*""K$wz`}g&!+kb"r&""wzrwVGj}dfv{'ww UZ&QٝXzXQ*wDwGQ*{wwwtzMMWz*"++f{b"k""""r+D""*"{Dz!Bkz+"r}`Irpwr""`r "+""$[" """""b""'vrggjB*bwt wp{z&btwGz{gbzwwwww pwz&weUT""b%"b"r bw@ww'&f zHr J*Ktz Kp*f&@dd PЗ'fBJ&"j""kgwkwPzjz""b%"b"r bww}wtwDG}g"r&"*&"""f }wzjk"B*b׍$אKgKwwwjаWgpgfrfg+*{"rwwGr'"v*f&bv+"&"+{&"*"+"bk" "b"+fb{Mwt %ww" }p&rw&*"""&""f'*""""""""*"+b{+'*jrwwzkzvr+&ft]t+++zjj"b" +z+Jzkfk'""*Kڪz']YIfr"*vFMttfR $J''&p*""]Y GwuzJ"t@+`Q*gzk'"*Kڪz'W UIzd*Bp'"&"'"""""""""""bwmDG'b"""&&"''FK&+"b* '"*""`+V&] *&"rB*$r+""T JYUYYI}ڠIAZm""b"&'""&"*""++-"rvt}[["'""*""""r"g{j$r""*"bb"*ֶd&&&}pkB{ "rљ'""&+g'"r""fb `"'"""""'"""g+Dprvwt&+urJgp}]@}'""`"'"bTK""rgK* d"G{b@'"rM""'"""g+t{pww"gw"pK"r'"UHAm"b['pp TupD&PMtwww }TDGGzڦD$ڧ}t]YPe'w'""-bG"j"""""""&w"""&&"&"bw'r"""""F])bw*""-"Ҵ"'"*'[{$"""$"z"'&{&F""] }zv "r* @PME'"&+**{k+"rww w&{-"*+z$"w}r""""Jk"[צ'+Bp'k`rt+""*&*+eup"B{"bK""J'b"ffD "&{-"*+z$"wwwVgw"wp*"b*""""&"""&"'"b"""""M*"b(umz"r"""""r@zzg+"rjbb'"+++{'''"&r"'w" &"b$'b&""'r"b"""""""" "+bg{"+""&'+"""zwR]{ٙ%e"XVw""*v"'"&""""b"+ """""""&'"-rr$b""""k"fbKb'"""fw"" +b"**&z@f"r"&""""""""""R*Y""*"mRGw"F}""r" I""""r-""r-""Y"'T"v-""""Q$"WY'"F-"rI"E"""""""R*Ui&""""UP&] Iwtw""""""""$b}'")'p '""""b""" ME"""b""w"r]@""""& "y""""""$""BT'""A U'""""""""'""""""& "r """""b"'zwM """""YYEYYЙYQt&""zUw""""@U "rqPFG""""""R U%GUpG'"wG'"wgrGpb"""+"bv{"{wGd{t*"J q"Xw'r"+""fbw"׷w$'"pG'"wG'"wgJ'fz*+"w'"+&j*"&""""""b"+"""g&""-m'rj""zzzwr*"w'"Gkgd"&j}*b*֦"{*rrg'*"zjv+{&@w{Zggez"&"GW!b&'uw"""*""""{"r""+"""""""""-" r&&&&"f"r"grw"B'"""{uwv"*&wr&Kg*b""&b""ftzD׷p{+Jt}"ҵG@bw]r Z+%B]*b%b"zТJMf*ח GU ubJwwD}&Ҡ'ftzD׷ T] ptwGBGpUwwww}""""""+""'$r]UY+z$v%$+"z +"&UU*"&+$""b"pjt%rk""""+"{ -b"twGU ]դ@*$'G*r"bbgbr'"J ""&b{$pWtkBJ}зYzw qrpwwWQ@]Qu]]]""{wYG}wzwJGtPYֵw{{zz"""""r@Tt z"g&vgwujkjt'x{*&tpprtfZ*B &B-""W`Tv-&{"+ DWpGtG@W m jr" $g&vgwujTБQUyFwww*w }z""'"&f&{M`BGgGפG*"rv w"+"k&w]W*""f+'r}@""b"'}+""""" ""}z-""wzt Uwz&*&*&b'+"fbr+K""&r"+fv'tb'wwG[uwMz{@pwWGz@wGР&{PJM&"*r}tjrZwJ"""&"rҫDGzG""$"*rdrIp]wr{w[]yH+MGEY }M$"+{M% TW'{ru&R'"bw w+ {Ԥ[B"$"*rdrIէ gbEzw'+r'wj RkBq*+b)DPwTEtYtpzyp]uIGU&{uWuGzz$ByׄUR'"+ztb'kzgWշwb"'%b"*"gbm 'fBuE{zײB*"+""!*"'b"""""r"+t'ݒ**K+R"w]zwwvp-"" w{{wrgkR-U"J*`w@$b]}&Z"z"tb]+RD dMzjB]YyUGz"]rr" ""tfW"+FZqz&'"*`w@$b])ۭy+&"uf"'f"z"""""""""B"*rzK'ֵ""+"U} fBj*b$""* v"&*"'{Z&*ggrr*jBuP}'UQQՕdtyڹr-Kf'z"]פ{"w*+"*Ex""b"b'""""*"j" """""""""rfWm+'"kw]"b"wֺrrr*b"qbj"ZqvB"b"+kk"""+$""""""""""r "&""""F*"""+""'k{B&f" k"'"""""*""""""rg{t F*rMt{&"'"""""""""""r "+&""""""""""bb$*""""""""""""r+zz$"-"r "z&"r"'""""+"b"&""""""{"b "b"""""j""""""""""""'""""b""""""""""""""""""""""b"""""""""""z """"""""" ٷw*UJ'wp"rfbv &'j'v""r}wK+Btk""""""g"B""""""""""""""""rGeUv @upp'"JpGwKgb&"'&w*+GJw'GJgFJ*"[pwP'yK"'""&z"G*"tzww$kk&"v @upp'"JGzwwgtw +ft+"&b&""""""r""""grzbK`jpr"""rG+G*$$w*&v$@vk"$]&vFbwk*&*"[ ۧJz{wzwwv '}w}F'"*"' fbYHJZHUpRf"bb"-""""Rb*r"'&""""""""dbdb+"""b"wJGB{{""btwg{b""zwwrkd+"b&j"j""*&"""atyF}TpGw*Fw$udt djjfM@Рwv M}B &'"btw`UttG&atyFUwwWU@p {Jpww"w'"+"r"""" *vw `JR++"Gg"p}t'g*@'"-Ҷ+'j&t$'fj"fvjf ZrtwpڽppwwUr*'v+trbbU`+gY$"w] +v-&"""{&-fb$b"""""""zJ'&Bwkwgjz+rbv{zFvwՕd&+KKvb{kr{'"Tww&"}jbb"b&"""""K"*r'r"k rwPqR'"u}yB* """t+" dwG-'"Tww&"+%rkWKDЧ&"b&w"+""""""""""""+kb'"""""$"b'"""rww*zf+'"{'""+""*+"*"'"""B"g{"g{j{wwugUUWUU݁G+ Ѳ+b X-'Rw%b"u"Rח"w"&*"'""+"'k" """"""""&bb*++++{""""rrw+"""z@t*"""wMKwwjz@]'"*'"""""""b' """i"[ ""Mrt""" "r-"r"U"*"Ik-"""" Mݕ m"Z}*')"R"pE""""b'uP &&""+"Y&""""""z"bq"Gp""$* }GDw''""""""""+bt""""""'"rEG""""*m"D""""""B""rww"TU-"""""""""""""""b"("w@Gr"""KG ET"""""PMPu}U DWtjUWIEѝUUY+""{Uݝ  wz"r""{%"RzG }""""""pM$G]K{"k""b +r""""""""+ "rr"&k"""""" B&"z{'&Ԓ"Zt"f"" ""+&""*""Uwrz"""""{"k""b-'"*"""+""""+*"""""""""""""""""j""b "'+'"&"+""b+"b"""""b"""""&""""&"""""-""bf`r"b *"""z&j"'"&*BrBwk+uzwww*"*""k"""Qxw&&""+E""""+""""""""" """""""""'""""""+""""bb"""'r*r"""""""UuwF"""vz""j&"""b""""""""""""""r"""""F'&j 'W"*}GPTpJuT$""w"'B}"Zj""*"rwIDDFY$-  " P*"r"""""F'zbwz-&+"&+Fw"ڠvzw'zUAQ"+"zF]ywp"zgv pGIw& UDgvzv@dҴw"'mrJYr{w ""*rww'"""""b'w""""+"B]*z'"""""b{%B&"""pz%YwpwKBz+v}dU wftpkkpUD ""r"}wyM$" tTM'"""Iu{wwt'QujW""B{}vrv+p׭@W '"{]]Pfw{"B'""԰vP"w$tD{D"{wwt'Q՛%J"+w""'&"""""&"+"""$rw`W-g*ww]w KJ jz٪*wd&Z٭Zdz'"{zzZ]ݕYXyעJ%ݲWPj}ѵK zzk}z'v """"'b"""""""" {@`j{"z@"bۧvwg{"tGבUW+z`G{ }}w$v{k "b"-&v%zwMppwwQjEpzWppW* "" &$}bP$b""DPwZuvw Gqt] w )"{G}"-&v%P}}*wptD'}}wwjztwyr{vY]A{g}zpY {BwEzvwpIuZYk"b*" "JP""WD@Pw-""bb"D"""&*""brw"{Gw"b"zU%wwG"+""P@}tzzYuww{G}wwpwTwG z YQ@@wwwvЙQ)"{rzzw**""pUէ{k+&""&"bk"+"""b""r"&bK"f"b""&&+*&"w+bKg')" *r""""""""""B""&""&$d"""{k+&""""""""""v&"""&"""""""""""""""""'"""""'b"$b+""""&"+""""&+"&"br""b"""j"+&""'""""""""{+*"&"w"g'""""""bbk++rzFg*"'"F"""tGw$""""""""""""""""""""""""""""""""""""""""""""&&"" """""b"""""""&b"-+"bb"$+&*&""""""""tpjMz'r`ФPkڰz +]WА UtPwP@yG]tzJy*ҩPpUJU$}UQt]QMtpjMz'r`{MХQyyaf'bw&Һ'{+Wjuzp{]BZUPPG]w]uW uw}pU{m MMpwYץYtGIw}gPEz׺ *rt"M]I-[IurbFGKDtdw g$*'""Jt!r""'b+""v* ԴwIxw}w]UrtTUTMw"ݧYYww}t]ՙYY @]J"""+"""+ t"YIR}" "$rt +"vm]"-"""*"-""""  WtPt*Iw" %"BY+R'""+"""+ QA"&w' *՝$}""""""k*%rU*+@"M e$"{+{"'"*"&"&"w'r""{' %r""""""v+"r{W$""MEP%""""b""w"""&""'d&zME"""""""$W """""XpUy}u}Z juGrww}EYtw*"rwYYG'b"P-"BP"r""""EE-w"b"%B'jyY@u WttG !"DWu @J}{j"@`kr U'Bp"B$""p{*Dzzt"b"%B'jyY$K]Gyu@{G'*+{wݫ$v"F*``+@bںwJ]wQUtg{Ч@v* I@" v'* ]"r [IK@P+v{j"mvp  pwD`zխ"$k"{+bb+""+b"'*' b*""Purz"Br'&"""'+$""$"""""""""z}*"B"wPpg+GFvgv"u' `G{r+rGzK*$r""vwA' UB"kb"B""+$v+B'"bg"W@M "Hw$B " uJ"+kY`ԕr*"vwA'[} UU]"t*"++w"r'""""""""""" bg"*"z+"zbb""*"rЙM&"""*jw*""""k'Bvz""""""{zҭ"r"*"""""kFg"p@gwP]D ҭbBb"*yrp $ww%"r""*vz"r w$wZm" f""zk-b""""b""r}ڷJ]uv""&tE{b"jYE"" Е$vr*""++'b"r+'"b"""'""rwwutzw w"IGU&וb*Z*%P+b"UggvWm+* JWYKMT+Aԥgtywr"R$""'""rww] QMjKwww}pGww"""""""'ҕdzTerp]u&"bbk"'"""gU&"""-' ]"""'k$}v&""""b""G"uzTGr+""*"w+&b"""+"r''"{JT "b*"r'"{-WIy&wmP@zz}WIKP[]QZ}wwGGU""uYGtGG "+KfwWywrt{Kj""""""rmrD"""*"r'"p "G+rK$+*v$j+f@+""pJ&"Bb+'fv{bb""zGYz*W""D'"""*"r'"[w"+wz"w"JYQGGr% AzJ*"B{rIkkrbt'"""j'""*+" gB&rud*"r""""+""$bv$"bg"'f+ "fg""r"&""""""""""""+""""&zrb&+"*"""""r"'""+"""&""''"'""j+wgwGb&wU {v**fK""""GB""" &*""r'J&"b"wK$e+bQ@"@z{+"'bz'"v+$& ' p$"vMz&ww G`rg"b G"b@}zk@b{$"wK$e+bYQ]J"z*`MGv'v+"""""&&""*"{G"w"bG&""vf"&""z"*"*"`-w"""m"+G{+vkf""rZGw'"vՙG{{jwG*rg& '"QjfzgWtK-({krJzwKfB$g-+bvdKg+""""""G vGetЧwp""w M zk&`""}zk-{KB{v""+"jbv$"""""&""""$+`g+"b"wTzB&P*" R]g&&}r"D"'k'"""""r"b"""""gM"" *+""w""&""""$+v&j*׻bIj{&"g"b"+"&""XEg-JvG'd""&v"uek Jf"f+B"""+&f""+""""w"Z" zG"+"r""+B{""""""Ff'j"""'*""&Gr"""""""""""&"'*""""*)""'"r"r*"f""&b""""""""""""""""f&"&""&"&d{"bb&"""Bk`r&""k+""""kjgpF"jJ'+kk""""""BW$f""""rjk"w&"Z"rrfGp"*""J"*b "+""""rwW@t z'"+" '""p"҉""""""BW$b"&+""""""fk++dr+k""b"""+&w{t"gr&a"%"m-&&w"k&'& wf'&&"+B$z}'+j'r""""""fE&""*"""gzB+""""""""'""""""""W""b""""""""""F%"z"""""")pTwz%U GGDwV{ۥһtP{zw"""v}D{pKj"""wdG+""r&rrw""""""}׈r ԧw+D&"pG"v-"""r"k""-*")"rP{p&""*PzWD{uW@Gb "k krE&r*r ԧw+ zwGw"&"*BwwMzGZ}wt""""""'""+&&u""*"xkrgb'"""f""""&""&""""'+b"""r+"%rD""""""""b)"rpzp]ݤ&"'fbbw'&]gdr*{G'tZPk""w @pdwGpuw"*+kwwG wGpDpw ""{wG@ }"""+""GM'kr%Yw '"""""bv{'"zgb&k`'"""'"""+"{&"b"""""""""b"""""""+"t'f+ +u$"&br"""""""""R"f"""f""""$k"""zgb&k`'""""B'"""""""""""+g"""""b"""""""""""+"""""+"""*"""""""""""""""""""""""""""""""""""*b""""""&""B' +f"*""""""vr'jZ*b""+""""ѡYr'""A"j""""&"""""""""""""""""""""""""""""""""]"""*"""b""""""f"+""""""""" +"""j"f""""""""""*gG!]XxDJJ Zw{*q'"`+ &g" ++""r"BB''{bb{w@{wzyz '"*gG!T`rY* Gt+b*bJ+& "b"B""R- uw""" &"}&""+ &b""" - +v*"+""'"B"D`"bj"+"b""&'&""-vr{}{g }{`z*'b*"+b"""r"""+"""""&*&b""$yrr*""""*""""&-"$r""+&"""b &"""{z"fwpdz+twrgkvt Gg""'' z'"rB֧b"  "F*"b"""-"r&bm ] U]ݭDUP)٤*uЕpD}U$"" d@}pVK Y*zzJB {@D}pDкz""-"r&bm udjP ]*{tPD{ZMv}WDPUMz}vڻҭjzGJ{ UWmU`G*w t{MP+J{ytIrfw$""MW{ d'&+F$`b""v*B$f"""%"Dr" tz*+'} d"r &"b"pGmҺJ@pM Pw@GD PԵwwtDgj@֭R'*rݫp}"'"$"""'"} ]""B"wڢѲr"" wg`&"" DgrBm'b++"*""B" "&""*b$""$"""'"}EP*"@"Х*""""""&$""{t'"*"*"-('"[k"kr@&@M'"jb{ԤD{"bkFkk"kz"} &"+""%"""""*""r'"*+$" bd'"b"""b"w"f*&'""vz"&"r"b""""""+f*""""""""""b"" "&+"r"""pW}}Fer'""uw""&+""+"""'""""b`'b"""zvwGG*j""wD"R-"b҉yp" +vm"%b"p*g$GT(b&"+[GT u tZ 'zdfr"r+"zvwGG*tݭ&b+"twt*D]}G""""""*""*{""*+JD*""""j*"*"}+""'@+"&"j'-Ґ""""""r+"""E%b"Mww'&&b"*"t""""&"""{Jtw$*vz@W-"f"tukw}]w"z@Mw@PD pGw""z pJw"zvBdfr%Zzz&"""""zwz'"+bwz "J JwBz'"b"+"*M}GFz+bg-$]}qr""*""gb["+{Uݷg+"+bwz "JDuwPPD}'"b {w""""b"""""b""""""g"{(rMrr"rvkGMpt*$ g'Md&w"gKk'zr"'"'*b+bgtk&{jv']zp"*""&"- "" ]pezؗG"rb"*""""b"""*"""""""""+"*r$+*"b"+"""v{"J]z"'"ݷ+*bz*+z&"'&"""""+"*"eyxwrwKUWQ&"F'GK "`g "K*"rr+'fbB""'""j&r{jէgjbz{+"""+"*"eT)PqJw'w'f+"'"{KptzZ Bbv+-rr y+ze""Kk+rGrug&"+{JbJk""j-&"""&+'" "{"յzG'&r"&"" "r+r'F}z -" """rr""""""""&""""K""""'Jrb+""*"b"""""&"'b""""""""bg"""""+&"vgP&w"*"U}{'""*gjbbbrv"{w*r&""""b ""b www+""r"Pr]Y"zGtM@`"""j$&ZW' ""k""""b"GK"]kFb"""b ""b wp$ @G}&""""""{"uzv'k$+"""" Z%*r+fgzwtpg*$jݧgu""'j+"&rUJEZb*"""""$r"""'+}"&z*"rf"+ "'""*""""*"r"K"fU-K&""}p""r""&"""'""""""""""""""""'"""&"b"tpg+**b """]}'++"kF+""&b"""""""v+r"b&@yB@еGgٷ@p"GT+z@ mMU "] WPwwפb @ݪ]pv$+&@yB@еGuGE@}g&}{}zGMwJpp&"&"B""ww+Jut{r{'b"p {`"t*g}Mrz+"+"zbeGJYGUpm{zu "PTP]]AJ۫+JթY"brvw'z*bU%׷G[ p Zwv-fb[pm'&bb"MZuwpw]"kvDZwt[t*vbG]ݠRwvv-"'r&zw$"""""""""*&bg """"""GP "P+"D{rf"p`"""*"+"b""""rb""""""bg bb}wk+""tv"""""""*&b""+&B"p""""+""""""""YUzp"*""rdz"{J"w"g&gf*&"fbr"&""f"""""w'Gw"'urb"""b""""""b""+"'""""""""z"""""""""""""*""""&r)""&"""+""""&"""""""""""""""""""""""""k]z"""*""wG"'+b"r+""&"""""r$'""v'bbzk"*+}+rGp@wRjw}"""r+GGw] W(""M+ݭ""'bB-RrP@pbW] +'"K@vzk"*+{r'&*""wtMtw'g{w"""""$ p'QM'""*"BW}Gw+zwwGWבZwԑJr'{Jw(""}w]zG'**"bB@$+"k؁Yy%"r"٥w$R]*"r"&*")"")ݪ "'"j""r'FgM} Рw"fvwTP""r"WU wtw'"]WYWtKFg&zv+"&jf"k"r""$"b""kf"f{gbb"b"&bJpzDzj]B""P"r*""+""b"" &"" bpw*""g&zv+""*brb"+"j&"&"f""""r"""""""""""&""""&"f&""""*+*'tk"""+&"&"*"""""""fb"&""++"""+vj+"{$-jzz$t"fzw@YPu '"B*f""XXgqW"u&""$"e"br""""""""""*"""""""""&""+"&"r"b"""" ""`b"&bb""""""vJw"""bj}jF{wzz*"""""""""+""""'"t"*""""kGrrrf"tJBg k"""*"""+"rbr""""&"b""+"""Db"""b"j"""+""""'"+"" &"""&"""""&""kw w'""G*-g&Jkpkw"DG*k+bw ggg""frb++r"wڧF"wuZ"+""""'""""""""""""*""""""&""""g""""""""""""""w'"*""&!"""b""""&""&""&"""""''""&"""&""""""""wApGM"""br"{j&""""""""b"""""""b''b"""r'"'{W-Uw'}pww+Pu""W"rw{kPjeF"%""]&v]"K-""""RQ U PYխ" -"KY" t"r'"'{W-]UХr+zwDw' Dpwww""*""""vtT'"r%"WpW] ""+*"K {f'" " *ҙU&-""""""rg&"{ "" }]'""b""p"""""+r{$"BYI"""""b* {G"""""U yttt}YY py YUU]b"Bב}@"r"{wp "KtY]]bb"""" }tzzR$g""m+[ *{"b'""b"&""$br*r""*"BQIu T"wrK" ""wk"j'+b]rGub&&"zR$g""&%b{"""kE""&+"+r"{"""""""""""b++K"""&b*""""""bt"b""+"""z&"&b"* """b""""*brb""&"""""'"r$%+$Yu}aGd&""Gz-'"y&""k+rר"&rr&$""""'"+j" """"""""b+Bb"'w+'"++""kr"""+U}-"""rGu+Jr"k+"b+kk&"""+"""""&""""t+"b""URe"B%""p"bM }""""r-b""GBK"*P$z """"RY}M "ەy*"r%"rE"Rp'""&""""t+]Q)""""&"UPU+]e""""""+""$'E""'"p }*'"""""""""""M""""""$"b@""""+"''"Mp"""""""""wtGBKUٕ$"""""""""""""""b'-"By"""""f"'wEM"""""}}TMM}JwtDDGgU@]YQ"""PU UYw{""""b+W%"rtUP{z""""""pU$rw"""&""""'"&""URԥ"i""EQy"""["rub"e"FY"*jt%""""RU՝Qg&A'"r-"rY"}-""&""""'!""&&""UUU* Itݥ""""""""'&"R$+E]ԕI$'""""b"""& """""'"rYE"r"++p-"""""""r+""rd"FYQ U """""""""""'"""v"-"r r"""rJ&'zWI"""""XuM}ٚXPݤU uE@QQUw++"rwYYw"""&&w$"rYUZY"""""" B"kd+*w'rXE Rpjwf[+MZZEE]DՉY'"&}}KPgww "`"+@vvkd+*w'rXڭt]d"U {kw'jf&+d*"*BQ`{)hrZg@WU'Uup }UEwTשk pTypzUY %z'"&eEz+&v[@+G]rQ"zRR-z*rrD"EQejz]}z{K۽ &""&`{Wzw-""""""'%wBEt}krk"UFEWvjk"UYב]+zg@vkr{Wwwk&%ֲ{r&""""" "+"z'"""""""""r"""k&kb""&"JQ r""r"""""""""bvr"+"""""*z%""r&"""""""%""""{"+"&"wbb&""*"""&""""""""""""""""'"""&""""b&*""""'""*"r"+"""""""""+"""""""""'""{%b"[WGYUYvҵ&""%W"-{"""""'"r+'"""""&""""""""""""""""""""""""""+""r""""*"""r+""""""""""""""*zzv{g} wU%"""""""+z{pw't"@Bw"F)"w"pw"""r)U"e"fD%""" GWtGu{tЕbJt' ur "D*"+z{pw'U+Jw+Btp*wDtww""""""""g'"b{'b wwWt&"""g"""""b""""'""""')UQ""""""""e"fU]ٙ k"""D""B""'g "wYb+"b$Y"""p]MGpJGw uwvwpw{wwMDuwEMՙt+""vGtUT tww""*urW]zw""""""BP'Jz"p{k"+"mfFwr{ 'kK" pz@ zMqEw"kmJ+R "bںr *Ujfԑw"p{k"+"r%&+b+&t@ *e*w'$"B'r"*vk"'Gb"+t*TZDG}wwEMDpwG@ۻ+ wMZkgPYz{}W+wJJzfMww@tD[&{{wzjgprWwr-&+-w"'+&'"")"Kf'"""""&"""r"++J[zb*w bWEJ F"k[w&jjfQQA}w{v'$""gf'"""&""&""""""r""br""+""""k""""Kt'""+rb""""""""V"""""+"'"""""gf'""""r&"b"""" @*""""j"""""""""""""""""+"""""'""&'""""""""r"""""""""&"""""""b""'"""""""""""{vw""r&""""rb+"v"""Brj"$'zw*""b""+"""}w'"*+"""r"""""""""""""""""""""""""""""""""+U""""b""""+""""""""""""'""""""""&"""""""+""""{&""z*"zkrG$"Jײjק"X{yIG]$"zkeJz$&*v"+"" {k{GG+ww'z Y@{&""z*"zbd&+"j"w(" "+"r+""zr*zb$""*Jz}*U+zUww ݍI*Hw&zKG YpЕ}uw *"*wz*w&"+Ftgt*bDGuG՚(j""w"{Kb"j{'&"+""-"Kb+"""""""""*&*'++w"+ лwwwJ{{rr "z&fw'zD }hEYUtv{+w`J"*v wzw ЪpGMtQTզ*W& DwwZי& %""t@zUT+b"bQ٠ID UU%Vytv wzw Mz Хgw wttD]W}pQ""jr"b'Kwr]mrerpZ yMttttץGQwJݺ{EuI{I+b""'b۴rY%""zMݠT'Kb"""+f"Dz]y$[Y]"bj{t- ]ݺ"&" ݭwt Y B@kGp MYEUpp@"۔YU] G++ vEUU)}WPYw *pUwGzwyzty`ݤ}ppEwE+Wq{]*wv d[ir+vԤ{PDj '*Д]pKpYUufIt kڭ wyzty`z Yy}PGtwU@}wwE""*"""++vUwڥBP}wuE'r} b*z'+*ju""աYk+""+"*z}vtGzw}wp{kf&W&&+'bk{r"Y"fw@'DЙDprGPGwuwz}PqW{p}r{w}wYPU"zPݕtDwjJzDP] PJWf&&r]v""$""r'DzGtb+"fUT{* @F EpM]U ""+&&*r *"r'Fp+ "k Wp&Wp*"@k"$""r'pwzw"{D'"b+""*""f}Pzgڑ "R)x  ۪Gz&հJ vupwJ wZvVFU UT-'""'""""""""""f""b*"*""R'"*"""wKW!e"p""mrbz'"'""}z[ڧ """"""+*-**z+"GwDMz@}m""]]K *""r*+Ҧ g*"r]'&zw*"k&b+r MB&z&wGrM z&}wK}t۽mj@{ Pۭ*wzjF"'""z+{ dbEtzzw*"k&bzr+*""w@"}"$b++"z"b&&+"k'b+ +zw$פgRZ {www+DzGԧggDwPz]**]Mz"wW"wUՅjwEקzKjvwtՙ}pvXQw%k*WUZp E]Z%ݪz"-&r+"&"""{t*""""""""" kwgzZ&w "u{rvb"wwP*$dbMytzwzF+v"k&ڷzhBYUGzGKwMP ڰEwgpuy@ $"& ЭpB D dpwJk D YM]}Dץk&ڷzhBYwDy}tqtzw*pr{vzpՠ [twzMwtM wUygwסKzڷt}' berJB w'"&pTw@  w]w'M%[eE{*Dr""bb@&Ymzp@B zF-"""jterb"*"brbݷҤp{k]zpD}@v } yWt]}zGGGD yuwV }UevMwv}w** E"}"ButjG$P&-"PGڪw&{WwWWz EE"@tw`{{ $r`*Mwv}w*w@wp"ww]twE"""""""""'jrWK'K**X'{{gj+"zDww*"*'g+bz 't@"b"zfg-B bb""b*"&T-"tG w +'w{-'"*+z*"zF"wzw{'tDuzkbwwJ]wzk}w}gg{z}WԫG]uw}]""fzWtwkzzWtd{{%w wB""""&z ""&'""jZywtKg`קUj&G+$"'+'""g{{W$p'zGKtG@tJp]prt*&"&'""jZQ]ywwwzzwKw{{""'""k"g"tMv}z[rzg&"b"+&""dp+*"""'- {w"f""""`+rw$""+"""vDz'""Gwwv"fB*+@*'r&+"j+r*""rf&'""$ +!{vJ" wrJ*zB' &"b{r*{brzprwpptww+zp}vt""eWpr rvzb""zzj"'"f"zppzzzMj}}Rtp"}*+z+wдMzTd{b)rUGP}*""VPݪZuwPwEbPշ+$kw&Bg+zppzzzJEg+*vwEw}'Е}Gwp""""""w"]ЧrMۗwg"{$p zUzg"+һuwtGwEB"b&""bj*rWY)rE Uեwrjgr b}z'PYIrkrw%}yק""kw]PE@M uzbjv{}wWqEuuMwwwUD"" pԔpw"{{zJw'kwu]wW""""br{ 'b"{Ddww{ ]D }wE"Z+w'Qr]T "%"KJ]Zu""""PP{wpbPٷ)"+k{Ddww{ }ݵ+d+@zwwY-DTpwwE""b"""*vw$Y+rwbuKY] $w*۪лD' * J `B{tu B """"""d&v%"wwzݵ"j""b"P""'*"z  +YMP"rb*v[]I]'"""DPեjf@]PYz*vwf{{p GUPTw "b]] @wk *wzЙ@UE!"}PGGM]bv""""rEmf"'""""w'zpjrJu+ *Z+pYݕ]I ""tb @"pb&"rGtJzzwzM@z$"vPBp"'""""w'{twpt$ww&JzFD Y@YuBtQq }w"PMI@uUuЗYtԪԠW WЧGk&zbtEG"ݪ-""rzzz*"+""*M"""&"" Gݪ'BJp@"""""*w'Wzz+k""'JD"wgbrwwr"*KguwfwwwtݧzwTppJwttkWuw@}w$"v BTEwz&"rwpzzwkJ$U+w' yq"׭+"j{ypZ*-]"r%b"UzPu"""bW]putUuUuzw-"{"}$wkJ$ Y++b"zwM'U]q""""""t"" ݝG"BWWG'"g*b+{Ef'"&r*U&"""w"E%B """"""B+"r{-b"E UUյz*&""*Gb"'""rw+z Y b""b*}'{-G '"""&]tPtG}zЙuwg u zzzUEY]PUw""GwUU]]w'{zW-"{%T}E"""""DM-rD"gݕ'""UK&tf"B*"J""rtkk{Ekv+B*bGfb$"bTWt ՠg&k-qwB " ""]G"+$tEw"&"gݕ'""]]]]ջj"`wPr""""""""""""'"p"$""G&r""rUt""k+"zj&"""" &{""""*bwr+""+"""""$"bJv"]U] MUg&bw&]&r"r""zvzTu [""gvzfbgj& b"""bz-b""""b""b%ҶbrEe&*G""&F {"d"mz"*JtE'&Bf{d""&"&fwb&"""v*"tG Uvww+pR@"r*t*zQ}r F-v"B-""лJ]"ڽ&"""YwDPYp"U-G*ҭgv*"tG @@@i"kK'w@G-PE@t"""""""&B-ݕ]*BEKT}'"zkg"z'F+"kb*BU"""bt]mr""""""r'&Z]P-""G@ pTj+j"k"w""r*""wJBе&tYU""""r*r$[W k"""" YЩww]@XE bBGrK}UYw""rGYYPY]Uէw*bzwwM GWZ]"r""""z-w&"b+T*+"x"r""u"W]t"k""$@"b$""P+*M"v'""""KWUYYUm"Vq'"if"B}-&"b+T*}p *w""*x"""""""""ww}*"R'zյzt`$""""k"+""""}w""""""m+t@""""'m*w""""""+""b{}'""z}G@)+"b"&&""""""""-)"}""""""f"'Jzww"""""MUY}ZUPzZ ٝwu f""" ZGwww"""""fw]if { zu""""""rd@$r""@wwG}G']jF+}uRq"e"w&{Mwbw W*)r"r%""к׹""""U]W ]YYbU*g%'$Rp$"@wwG}G' *j&fBtU'pM}q"""""""-UUU&"{gtwTWw+"b+gz*"*zUUf'"&+M+Y"b""}%rY""""""Bg""FU%""tGt wz"z"""t"""*"z"ҙy"""{zj'ڕY+"""t]uw] wjF G{z}}]@wՕYG""zGUYY p"B"zw%'uT ]]""""" U 'vt"""-"r""%rUxzG{{TpX"wBTg `zD@M*k" br{+"zv*r'b"fjG`zYGGwפ'"""-"r""%rYy"YGw+rJ'&b"{}iE"rj`BJ+ u+"w'&GdUw*k"ZDw-&kr&wv+ &{&a"Gp%+'"j'k"vj*r+f&'{k z''b'+"""{b"""'""""""" '"""""+r""*'&""&"fd"'b""*&""""bf&"bf**"g"gJTpg@G"v&zwYuG+`Dwb"K"v*Gup"j'"""&b+"b"{WttfbU}RհfW{{}W+kz$r"+Jb$"f""}} wԝ] }r"}'&b+"b"{WtUEzgb&fUUU'U]Uݰ""+"&*w"{E*{Gpu'b""{"*"j+dU*""r&`${}P"dE%PW+"+&"b"rwG$r"YU]z-"f""&+**"**"*j}w%z} """bk"*'{t"b&""wMGuupwwt}TGgz}zzzEA wM]]zUP@TM{'&rzUr}TT""""""Bխ r"tjk*"&b&jf"*z'"{"b$bk"'bk&&j&"{{wwzr""w{zzF"$""z {""f+pp*"tjk*"&b+jf+"rf&""g"zw"""""{""""""b"""*b"&"+&"}"r"" ""fj"b"+"'f"&"""r+b"&b""&"&"r&b*"{*W{zJԻvvwwzzjr"PDM'"b'"r*&""'""&""" r$"""""""""jb"&zg+j"w"""kkB"{'"b+*"b+tRTKzr{zw*"gb*"""P )w* uzkI& "&&"""+{yk{*g"@*RMvv&"qrw"$""Dd"z@+Yw&"P )w* }WzwrP'"fz"$+" """""""""""+jb"+"b"rb"b'"Pw"&"$+b'""""`-*wr"'"'{""f"""&""r"ZG*RUYqw@@JRp"*+xbWTzw`'"*d&kg"["'""'"+""+"-$&"""""""bG{'ztkp*+""rgvb"b"bYY""'&&Brr&"""**bb"+""""B"""""DvG$B"vK+""b*G"Ggbtt++'ДuEpWr&f*rbr"'"""G"r+b"fi$"B"""""b+$""+&wt" "G*"+""+bv"&rb""z"*"""rt*bvjr$r'"fv*' +$*F"'"'jf""*bb"""'"bkr"turw"Gr w"mzgg}k""J p}& t*k@"b"gb"'+"r""+""""'"&B+""""""""""""""""'*t"""bwf'{ 'rk""&{*"f"""fZUYթ"*J'""""""""""+p""f"t'Bw'"rw""""pb"v"g"t"" "" "&t"$""""BJ]]UЕ $"r$""i"""""""+wwt'"&""b&Bw@ww"tJww'""""""""*wzw'")" Mwwp$*""r"""""*ft""""""g+w""bb"'"wg""""""&""zu ""pGtw '""&"""""*"""""""" "wzt""""""""b& vw"""""UԤUUQٚUQ]]YАzwWUE"""jU""""""w$"z ۢw{"""""" U-M""*""""-b&}+"bb+bYPU"Zz+tV ۴Gpp$""'""+ "r{""+&b&"&"*kzQd}z*""bbj"""*""""-b& bWU*"k"bb"&"b+"by}YW&"$"Z*gr{kt{kvk&խ''"ej`re* "B&bK"*&r@p"'З"'""""$+""""&"""""b"""*r""""%""""""""b"""E "+"")""+&+"r+"*""+""+&""""'"""""""+"""'"b*"+w}eB""bwWg"'"**""""""+""""&+""'*"""""""""P'vb"է"۵""D"I٢"[+rEP"-"""*"J)""""R]Y @PU$Tu'")"Y"R}"""""""P'Y"&$"v*U+Qݧ"""""""f %rI+"B$"D $""r""+"""*"""b"Y""zj-"Y """"""p*""W$"")""""""""g"""*"""rb'*Bt u"""""rr """"" Y@MMwݕgMJtw}UuP]]@*$"rGUUYYww"b""pUQ%"YYڐ[P""""""E zt++]]$"ZUZ}{J"*"zG&BUjJ'wz"b'"PYp Jwtyqvw"Bm"bM{"p*df'"+]]$"Z]vէk"*""$b*"""""""""""rv"J-wzb"+b"rUz**"'ggJ'"+B{''t+{"r"""g+r*"*"""""*'"Jv}UٕUu`wݝ}ZR ""'r'rj%'{+ertzG+'""""rt-""""""b`brdfkfzMb"BB&wGb&k*""b&+""'{z+{k'"""+k'""v$zw{*+rwpW"yyw*+&D{Tw*"*rJ"j""F@+puwwKM+k'""v$wfwgjwh""++r+"kpZ wtzMM'"&wz'wu*t+ЈUQGzP*jp@X+{w uj{*+j{*r+"&""{pdz+b "@pz!r*z""r{wpErb"pw"bzv bb""""'"wb"*""""""""'&wj*rj g"zzp wGwr""w{]UwzwwGwwzwwz$T &z+%"Z% ] JK+ `W wgwt zgtd'аKmw{{"BfzzgWTݷGm*"+%"Z% ] fFj"""'"*""Һ v`Jpwfff@]t*g'{wjjr*m{*Fd+b 'yfE)"jB$"r'd'%Jpۭp } {} "$""'rj&k &M-+"}''""t]{+""'"+"""" "" *b"'{+"r&w*bwp{k{Kw "zgfww&bG'Pݷ'rrpG+bDU'""*"""b*"gp$"wrT'z"&Db-" &J}Ҡ*"&@`K%X-Ggfrr""*"""+PTftg+"+"b*"gp$"w]'"Z@"G "$"'""'""& G"*"+"""u&"bR!R`r'"rF֤*D}'+''"]&w۽'ub""zu׫*{W*]@G'k*"&mz&"-*b"++j@"{"ik)m""&vrw)$"yt""""'""""+""""'""""""""""b""rb*"j"""w 'rwr-&'"UGuDw*&"ft"z$""&+"&"""+"""""""""""z""""+z&"""Q""zG"""r"""""""+""D""""b'""""rvGuQK *"rP+"+""&" )""""""""r&rg+""""""k"gkg&""""""""""+"'"F*"%")gF'* """""""""""*$""""""&""""""""""""""+"""""""""""&&*""' """""""""""""""""""'"""+"""""""""+"B""""""ztJWEu&'+{gtM"""""gv ]k""""""+j+""""""""""""""rby-""""""""[$z""YuR"Eb"UT"Zr)P" ""Q"'k"%""""R]YUU*W g%"BY""""""""[$Yyv&r*RUU']] """"""*b-rU$&R%jZ@UՕ- "&"""b*{ """'&"w*r""""jp-bUA""""""r*""vW'""YU)&"""""b"t""""""'*$"uP"""""""'G E"""""YQIUEM PUzݔW]UՙZUY]U *"wUQYpw&"jD%"BUY]VU""""""yE%zz'""rw]@{'tBGFzz"+ww {Kw׷zv&F'""pkgb'""""FwPWpWyawz}K&yz'""rwPJ[uw {"wBGww*wzG""++F+w}G'R"zwwtt+{z+tww*wD{wz'vwp"vfwgt*Euf""f"""w'""Dwwpww'fbff"&"t&*""'" gG"w"b"&f+{-tww""""bwpY E GwYWYu]wwwwTy wEwMppMwוbJDuYwwwt&{"zwwGpKK ""+"""RwUyz """""""r'&r}jBz"r'& py%"""%ٶP}&'"B''JzںtFP'G-"WE{"""""""r'wr{*"+""*קk{&''b"zupX$Ԣg+*wmRWw"w TMw}tݔzz@HUMwz*tjzv]{Q ""&'rb'""""br'U"""+""}@xzeA{'""""bz!M[ gkr""'*{*'"+- {J*b""*"""'wg+wJ['tQ]Gtqp""wkQ մ-"WPDW]+" awwwgv{*bppwW]"Z{'w"Mz@VE%zu{zٕIU֪jmwB$B$"" J t +IzMwwgv{*bptwwweku R'b"+k&'&-*g+k'zrp'zZ]@pU}JZի@j+&YեGw&"zz[P]Pt{tJp wzWPj{TZ@+p"wEjyz r"vzrtR"+" "" "w&' """"""""b**}*Rg+wPpzrzr-""{ U@**{xHpv'WF"EwUw%r'wGUM @y+JjUJPtMJ!>@ِ@ pjwjt}D*BzpM]Y$ wUutEwUw%r'z{wwwgTguU `@'"fb"*+rkp"יKݔ tGWwzw תJw }Jѕu+"vwKz!&GGMGP}w}z'kkҷײ}P} WPbvzzI} ]GvFgJw$*'""ztwW "'b""vZGQux wWz Րݗt}+KM}wUY] Krzwby Kk@w+"G@}+w"&v$"+t"dz'`gtwtTMQzBgzBw*-"JGD'@FЧ xj"y Kk@w+"bJ{ԧ*"'"qr'""*"&"""b"b"" "'"+Bw bֶ&b{bw}{{{+&+g"*"k +"`j"gbg+{ wwt{w'] tMwww]]z'{rz"T-w'+""z"rf$"'""k"-""""""""r+rb+*j"g{J{+v""jJz"""FЧGDTwwEU]hb$v+""w*mtt""$DBG`b{'"""*""""&`bb*&+"j"D׭ В"Y'"r"""""bf""&"'v}$*""w*mtt""'r "rp" "t&""b+w""&""""""""""""""&"""+"**"""b""pf""&"++bg+"""+'+""'"&""*b"""b"&b""r*'"j"G'+pwzz{t+z]VJ%{& """MWkFI-""y*Uq""b"'""""+""""""""""""""&"+bb&*"*"b"""""brrr"bb"""wMw&"""{}"j""*'zw""""""""""*""ԝ$*b+"qyBtkYfKUM&[")"r'""&'"w" """"RTYWUUԕW"R!"Ru-""*""ԝ$ @ u*&""'y""""" +bIBtwe]} *"'"+""*Ib""+"*U""""g%]&"""""B*""zw'"" D)k&"""""G""""""""b'$"pwG"""""""r{'W@"""""wՔIpWٔ]Րw ]WW]Y@Gݕk""zP]ttUp*&"bbz]!ҽ y""""""BUU-v"""""""""D""""w*&"""I""ww$"""r""&{"b'""w""""*""""rzwG TD '"K}-"*"bj"r)""""""""v'""""""rzz"w&""""""b""+bzz*"$"rw''*"""b""""""""""""""&""""""*"b""""""""*"""b&'""ww+""""""""""""""""""''""z"""""""""r{"""""DzYJ}}Y}wpp{pjrK w w"""wpZGvG]""""""z{'"b&"bf""""""""w}'Y"&+"+""&Q D&f`w'Tp'b+ԭ`pP "b٤w&{G f'&p׷vנ@w+ '"&+"+""&טUEP bzj Kw+{`&""+"""' vuzwr@wbR&}&""&vf++"&wf`"*{iu"r**} ]gԴ{ִ""]'"bwEup{wt`gg*}& b{"ҷ-FU*!}krr{w'+&*"Mrp'&""'""""GY}tDzz{ ]uJZrpB*{"b@w+'V b"b*w *'"""J]WՑq$"{zw&ڵ""b&"{"K{*&Jzv'{"'" ׽zkprr"b'""zJ"J*G{pj+"J]WՑq$"{w{tgj{w+""]"z+""""""""""""k+"'"'bf"b"rU@+*b+'w'"b'jr"vg&++*]Rfr"{b&f""r+'"wwzGw}DDp}twgW]}'*gײvQ]]zg[w${G&*"r*"""""bk""'"b"""""""*r""rb&&j{D"""vz&&" p"&vp'rj""v&&"z*"g+""" '"G r*TBtwP{eDBygDuuYUZ}-""J Uy{Zp'urz&R "&Pt{P'['" t '"G r grzj+b"MUj+w*Jr*t+wr*{ww}wrWF$'ppV }TEwPIwwYIPy@E'U՝ }tU$zЊZP-""wtwr+k'pp'Ury"PuY)R'gvrwבEZwwR*wk['&+""jwz'"""""j"""mGmwWtf]*zG}W} qt"݉tt'"KP}נwt'"Gjm"tqwD+"pzwgb[""B&"F"r&"B'v*`"&" }Tu+B"b*""*K"Jg"UdwDw&Fg""tqwD+" Ujz g{ww&""&U""'"""""""""""""'"j"b$"*k""b"b""rЪ"""*+'""+'*"r"vr"" +{b"""""&""b"g*"җתrzWtJKg+jWrV "r""+ٲ"bںzPR"+""b*"&""r"bf"'&""""""""jvb"vwk*"""kt"b{F*r"""U]@b""wDwb*"b"+""k+B"""""""zJwDwzw'Mwj"}uWtA"["ft"] w+-"("׀K *"fTzuv "ՠ&wztzQ&JG*zJwDwzw'J@tuj&rwyGUw }wA""""""*"jwbY]U+bF'r{W *"ww+*"*} +"&"b}y""""wM"""""br+"r("]DEyww++kz"r*bw `'ځ"Bfz b'Ww٪"+bv Q Zywr'j} EQ EPݤ}G""{PTUW]E"KrgzkwtzqPj"+"&rB{w'B{""""""""*+"&" gw*b p"""wp""""re""" "*"r'""""rGYUP%&[I("%"w"R"""""""*M M-*+""b"RD@w&twww*"""""*{" Pp'"!"zy[t +""b"b"""""E""""""'*ru"b'g$""""""g""w"" PpG'"b""""""z"""""""" "BG""""""""z'tw"""""]TUPpPQT yUw @w}t"&"] zz]""""w "w'rrg""""""B ]]e{"""""""T'Uf&+UpRg" e"""up ""+[' uP"'b""*b"-""""U tW]`b] "-""} """""""T'E ٽ"&++UU'UU g"""""b&-JP&"-"PUm'""b""*"&"jUU"'"""m&P"rwgm rY""""""'""ww'b"-""""""""""""""b**w&w}p""""""**z }]E"""""UYMupMt@M]@jwGGwt@Mpww]&""ԙUUU]"""""w$"EZ """"""Bw -K""z' "z*"{z }RD w*K*RշJw]z%"""m }+&'"Bt}`V@Tpr]g-"p"z' "z*wJ-"&"+ p'Gp kz"bwwuMtpzpb"U}ۗQUMtWgGwtw UU٭ݐIT] @T QYPz{wwwzU %""p -b""""G U""jk"w}wX% @""rr] br""חz kf!pv"}" խpwuԷ "{WYT]ywfzrQ}-"ݑק'"puzz tk}&][P$"-bp"}b"+ M"b ""GJP-"&"g@GW@wwz Eg"}jD@}zv&r z tkUW G}k ԻU U$""""""j"bgI" 'ڧ{ *"+g"""""Eb*""br-'rD""b"+zb"""""b&""v ""Ցqwz &"'"w+fz""r'&B-$"GW"+bkwrz-iD"b"rGjw}t}@wwwwwz{zz u @zYGw""k{pP wJ" "+tupzv-Pr{""*"""rvzw$""""b"vG &b&&`ԭ$w""w"rtUK&P`I"R """' " """"rtWt Z}pPݴ$d-"U"R"""b"vG pwwp$b+""fbR & uGЭ""$"""}Y"twt'"r'"GMU-"J&b"*"g{ з+"jrgG"*{Q%wG""&""}+"+w'""pz}'"""""""w""""""vU!"R m"""""rz%u"""""UUwtwwpw z wTuzwu]} z"]upJ"B"z] "}Q Pb"&&""RYYrwzw**}*rzgMEҷ@"Z"""rdzGЭ"("bdPDYu"""[u+ҽrY@"D`+D-r+rrwzw**z uG+g""wutU$pZG@""""""***%U +"*"MvW w"rv'`zGg"{ MTBUf{w zYu""""'&F("bD$dvz +r"Y""'"P ZU*ёB"By{-UU'"""zg+'""@p"r+"""vtJ YIyD""JDJ] w+"Bt]p]p-r EIG+"""rzwwgb"b'"*bҩtzGwwBpuUt+G} p{z}'""D}zJ ""r{*@bb zUPGKWEpw "b'"*bҩYzt@twwwtw' wWWךD@tzwQ'ZErG}zwDէw{y}w{w}jw{kw{'E'r yY$kK*""tw "" "-ҷ*G-b-"+bUK&w""""&""$'bb ""'Z"r**'""j "+""""{'*R'*+'&wUEН yw`"Bztpwg"bvtvw{k+rD@zPZi]*bMv"$E*"""&"z"B&&r {g'r&""*"rw@v' {y""'""*b"k+"""b""PZi]*bzu*GuD*" ""&P""$r"""""""""""b""b"'"kb""''"ԕ"'"z+b'"""f'*""&"'"**r'""""""""""""*"rKrfJww}$""+z{V'"""&b""}dr-&j&-"b`KW"&"b"*"&""""""'"""""""""r""*"'""""+f"""b"""""'r%"" """"""""""""&&"""""""zխ*""ttD""(K"bf""k"v"$Bd"'""zRЙ-}}-"$yrb"b*"dF"&&""'vpD$ ""zխ*""+r{GprG+""f""b""K""""""""""""+"&"&"k'""+"""d@ r""*"""""""*"*$"""""""b""*k*k"++wRpv UU twQ]V'&{+&Pr{r}E'b"b'""BB"""""+""""""++"'"""""""-r"""*r&""+f """""""""b"""]""&rpD&+b@"&&"*G*"r"""""""""""""dfBj"f""k&""'"*w&"$"k+{+B&"+}mz )D"""""""""""""""""w*""z*b""!"""""""""""b "+b&"+"*"&""""""""b"j""""""""r"rg""Ҳb r$b"&'f"{&""+{"&"b""""$"+&""""b"""*"RJ"''[m" ""rrjzb$ו'uWwUb"""""-"-"+"""*""""""" """"""""""""+"""""""""""""""""""""&"""""'dzk""&"""""""+rg{""""b""*ggw Y!"""""""b$"w*U{}M}[z}+T!"""w@}bWڵ{U")"jݺuZ%"r+* ݝ[y{GUU bU'DuGw"Bkb$"w*Uյww&+wKz ݷt}""*"""J*B$Y""*rt WP@w'""kk{+"z'z]'"ujrY"&wյYU""""""r")"jTpPET*v""""B"*"TZ}%"ҁ"rrwg$ P""r]U ij pMYzjvwzbKyW ]UP w]"rwt ݐ w"B"קp]uGwIQݐU"""&"Bwt x @$r@MEpW+t"rzpd ]z w$""Օpp@}t "Bu"y@ЫtM ppIzDp"x @$r@]էGTu twuj+"t"""b""""""$jF{GGrw{b-'DG U+ZwImDz+tw* Bw*{B*wt$""wM ]TwUqٻ'$r'Dg}vv z-""""{t%B"""""""eTM I@DݶBzzwW{&py@J+wpIr{wvp {{'b""""""""'""r&YY"T""M"Bp ""b "B"g"""*b"%""""} G [MUu"PG )""Ҡ"""""""'ww $"""""gYU+U"""""b 'ye"Gu+"$"GZ]d'"&""""""{"w"+"""b+uU""p"p """"""""rzGg""]YU-"""""""""""""""b)"rz}"""""bZ) """""]GWw}tww]]tGtk[U}ww TiuZ]]wY*""vG]Y}wt""*{%"tJ tp&"""""ݴURyw*"bkgww*{+"B&""""K'+r}b"b$"+"BgkM '"k"B'""*kr"f""Dpz*""Ryw*"b""g&&"'w""'+&'"""""""""""""$""""""t"r"""""wMw''"+""&+"&"""""b """""""rb"""""&"&&"rbgkҪz'}GupGt zZ"&Zw&{{++kb+"{"vz""""+'"""" bv"'"""""""""'rb"*m'*"""+b"""+bb*+b""""JpGt"" "`k rbrw+J**"""""""" "r$bwrEMwGzrwJU Bxz+zGK} ++D%`rW}$BJ&*rbWwP+{tzz b" "r$bwr @ tD]pzY}wvJ{''bgwfbr+"&T {zzwpwtK w'wt**vjr rdju'rhwtezR'jf*+}Etz'r@GP}g ui) b'""}v'""*"""""G$*"ugg"b"}wKr'&*""*"bb'b"$""r""{z-֒f"r+{g"wUJZzzw"bw yw"{tg"r{+rzw-g"""*""""*b+-&fbb*+D%'zj"pz'w """""*"BB""""'&"&"$""Gbut'"""""*""""*b+'"tPE"kb"b"&+"+r"+Qwzrr'bQ"p&r+g"'+"p**bj{&'bv"rjr&"j*-r"tw&P"@wu"*""""""""""""r""b"""""&"""""w""""""""""""+"'"""$!""&""""+""+"b&""""" """""+"""""""r"""tyw""w""b]w vpFw+d""""""""""b"*""j*"b""""br'zkrvٺ&"&tЪ+w&]]p ""'"-v"ڧ**"rw'rbf Dw "'"JUF"b""""br'gwg"*"g*"&r&"&&zJwwp@wjr*j{}gITU]"{DU @E]XEwwՅD}@*w׻zwQvw'""k$&"&"""""{'M"""+&"{DruJ$vv+"""""bj ewz""$G&v*"'"&$kz*""+"f""j'b+ b&"w{@pzwzu*""wuwp'"J'w{w+"-+G""""""*p&"+*w Btg&W""]"rp@"fJ+v`{" ""t"'v"'""""rwQUEUp$w'v'"D"ґ""""""*׻wz'"+""rwww"pttpg""+"""&zW"Mw "%"GMwWtg$"""b"+bvjw*"bbw&u""zv' """"""r""{ -""pwvttG+""""""""""""""+"r'" j"""""""rB rK"""""UPՙY]]EPِuTAwDMppw"" Gpwww""jwwww'"Krrp"""""" و""*""""'jKb*D'r" b"+rwtb"j[+r%'"r'"""+"" "b""rGUY]P]P)vE!"{%"rD"%""*""""'P*+$zwpw"wwG"""""&w"' &"w}t''"""b"'"+"jy"*""""'*r]A"b"r&"'*r""""""bd""k'""}wpw """"""""j"""""""""*"b""""""&&z'wG""&""שQzP}Q}]Q@@U E]tw}{{ww}}@]"+" tYUwt@"""&rkwG'"rj{rk""""""rD`{U&"Gzz*"r&pw" %""w"wp"*t%]")""j{kݹ"""" ]uvtbm+'-"E"B*"Gzz* -"&""'jrw}@*tT}ww""""""""']E""r'"P}Tw'"""bvb'"g+@'*"""wrU]"""bJ%r """"""R*""%""}M@p"*b"""""r*""zwr"RT٢""&BKr-M+"""bMqtMpz"vz}pqY]@Gww]""{wpݕYpf"r"{-"@JwJ""""""Gp$r"""'""""*ww!"f""ۉdU""wrj$+'eu'+"&d "b""br+"b*"""BrtFBp'"p""'""""*w$"ww"+b""""*bbUXJz*+@V%"Fzg""w*"""$""b"k"""b"*$"bU"Uw"*B"+""bb"""""r""&"+""'+""&""""""""""""""*""""*(""+"{""&""""&"b"*""""""""""""""""""""rID"" ""B E@{ "++'"""""r&" rg""bk'""b' խ w"""*bf"+a"f"r*""""r++B"""r'"rgvRP}J""yv{""&""jkr""*+"w&'""" խ w"""B"z'"""f&""'"bb+""f""""""""""""t""""""*"""*"""BP&""""""""&""""'''g"""""""&r""v$&-""rrgvR{ G'yMw[gb`&" r{r EG*g"' "+"{""""b"""""""'b*"""""""""""'&*bj*&+"w""""""&""""""w'"""&&&"rr"""""b"+""""""""&jrv+tj+"" mRTi"B-""@"w@"""F-"b-bU&$BT&{ """"[P GPU*+r *rI"w'"&jrv+tGw&""& ui""""""k""'PU""$" pG '+""""*""""""t""""r" &""""+'r """"""+""-bM YuUd""""""""""""""p$"r]}"&""bk'w""""wݧ@] }]tW@ }wzwwG]pA@t@UYG""zT@]"""M *rPrw""""""rww$rw""r&""""K$&{upp}""" Gr@YtѲ%""b """'"By @ ]}p$-"W"r&""""K$ }$++"*w{ w'W}Dp"br*&wDPW'"-" Yqwp"wz}zP ]twww}E DzE""+*"qj"p-"" D """"rK'""""""{{ * """""rrJ!}+"r""T {@G{`{zk}IUwЭP }ww"vYէt""WYq}-"}Q[r{-&"Yzt""b"""&+twJ""b'""""@"&"`bZptQ MUyԲ"" FBz"b ""z" *"&K g""t""b"""w*kbb'@w*"""b""""b""&"bK""+""r*"r+B""""bҷ+$jb"b"*""'+"b"""-{bb"&rkz+'&@%{zt[ $GY}w{z}w wwpEQvg& {W+-J"Re'b"+"`"rb+'&"""*"+fr """""""""&b"+f**J'b"&r+ " r&""b&" "&tWҺjgw"""&"""rmQյ""" ""Ga"r*"""rw""bg""b+"""&zDt+"""}rr"*""wrbj&"}j&"""rmQյ"""'r+""&w+w"""{""""""""""""""B+"w'"""&""""G+"""""""""""""+""k""""""&{"""""""""""br"&Ҳ"f+ Pp'""'z*bz""""JBw wr*jb""**"g"""r"+""+'""+"""kg'"""""""""t""Jw"*j"g""+rr+bb"""" G*""{+&+bf"rr&"""""""r"""""b%"rw!rt}]twBwUPE gԪ"E zJM*b"rG*{{ frwbfz}wzY + wb%"rw!rW*}tDtupww'*wIzyAZz{{zWppF*rGPڭw ݭ@pG zzwv{zgwuv}MJu'+{+b"J{pԪz*zwg'"m"]"rjb"b""{+&+wj**{r'r"$"""+*g'r"b"""""w"+w"zz]wW@wKjwv@pt Pg`+rFwp wzmzG*zqz-rwzwww"ֽ"{RYwФtU+-"Gw@GyGWw&"k t bTypzzp$d+zqz-G} pwbwwf{w'{{w""""""'""+*K+** r{b"wUw'p}G+wvz Dײv zt Z&"&"b"+by}-"JwzDtwwwwz*"D kַzgz*'vvwBDGUz$EQwztzzp+""zzw%"""""bYyzzp"K ]wwzjzzjwwz'VG+"&"f}gf"{""""*+G+zwG*zDX+&v"zw"zR]ݠ  " ""D"'{ b '"j+&rGtrwJzw 'zJ$"Bת{{""""*+z$*"*wwz "*zK*KYbb'w'{up׵wzbvEZUݧ}V{{zJz `"b"+"v}"u$""G*+"""""t"&"+*"rw+r """b"k'-D"b"Jf'b'w*"&*"kb"&B+"pzgwPFw]p w}jkj"r"dzj'"Bzzw{]w{j'jTtD}"""""""Q"p""""&""{""""w`"""r""'"K""&""""""$""""r ݁YWJ$"K*"$""+"p%"""""""Q"k ''""""""B+"+"*"j"""""""&"""+"f'"-"rWb"+"""""""""""*d"""""""""'r"""""&*"+-"""""""+""""*"""ת""""""""""""""""""""&"""+""""""""'""{"""""wuZp[Mw'$zr DGG"""fptzzGT""""""kr$""'""b"""""""""rtU"WGhi z*""k"$Zh""r"""b"z'"D"b""+""wTpZv@&""& r""'""*b"b""Jd"+""WGhi z*"" "f*+fkz*""""&b"""""""""""""$""""&"w"""""""bGK&'"j""**""""""&+"""""""""*"b"""""""""""bw{g]]pptw'bzG&"""r&"zwp{+-""+'""b""bp"""""'"""""""f"'"""""""""""&"'""r""&""""""br"""""tm""$"`"r""&+"j""b"""""ztj}DM {qM@`ݦJJmwu{' WIG "rU՝EWWDjfMGt +e+IU' zp"ztj}DM {q׽ztwttiԲ`&"{""*+&fzrv]GpVGT@Mzpp pU*Gw v t}}KGzpJgw۰ڠ-"rYTuy@uTMUqqfu%J {rJzYJw]WtftpڧRb[-k'+"jGP%*""""bMIqpw*zbr{G TWקw"t@TYTpzzzK}wtzzvr$r"&@{ww*"+z+&W"+'""f{&+Gpf $YWuJjbwrk"*"" "+"zjwM &"@{ww*"e{k"""fwEb&""""+"""""+gK"b""*bfg"r"b""{w+j**bf"b"kwb&'" +""*r"QݭzWpԠת{z wԑYWJz{" ]wg w'""&Jz""r"&"""""&r'"b"""""""$'kk""""zr*"""w"b"wwեtr}MT$"*"&"""mU*" &[j"i""r$"""" &*B@*""g"Jtr]Y mUתf"K"r""*""*kF"'"']y@'&"mU*"'-"f+&bkխ&""b+"+"""""""""""b""$bF"""""`"B""b""@ " f-b"+'r+"""f'+"""&bb""'"&""""r&"&$BvrD]UQՙwzPUyr*""]W}-r{"""j&""'"""""""""'""""""""""r""rj''""r"bk@"""+rrrr""""ww""""]ybr+g"kw+"""+"""" '}Y fFf&&w&גd@$ԫ$'"MT`ujB " ""D` "rJ+tb"+"" ']]-wUrp+"&j"& +&""+""*"""""r+" z{k"BB"y' ""&- '&&Btw%+j&w"+"'&kb*'"""br&'"e]ppg gz[}G ""*`" k$b&+'+"r ]Wz"-{ """"rb'&& """"""""" Kj**"&""""&&b"we{""&*k'""&+&""""+"""+k"++b""zwzw B"wbfwM"Э j+MUG}Z jt*"{{&B ""b@b@M " bd"+k"++b""zw+ww*"m"{*"r$"""rwbbrgk"w+&"&fv'J $B{JJۭ{*zw p[{{ڢ"+bw*"b"+k"wrkUGzz[&zzKb" +z"GJ*"`]j*A&V*F""-"r""+"*"" &wbR*""""""""""""&" "@"bfzpPprr}+b"k{{+""*bttHw-*""+""b"""tvbkk"'"""""""&z$"j"{kb+&&"f@U%R""""r""r"""&""""r*+"""""&]!+"+""b""""`&$"+B&"+"jz""""""""""""&"+b""""""bG""rb&r+r+k""k*+b'b+"b""&"""""+"""+"""""""kb&"*&b+"gFZpWU Y""k"&"p%ri""""""""""""'""""""""""""&"+""""""""""""""""b"'&"""r"'"""bb""""j*""""""&b`IM!""+"""vXUIH&+fj*'pk"*"&"rz**rE+r* {r*$" f"jpvG"b$""wjb$"pf$tj"+"vXUIH&"&&"&""d"""*&""""""-"""""z""k"""rr+"""wY*"""""&z"'""""* p"""+f'+*w+""b'"'"""w'"vvzptpwշ*gp t''fj"*Bt z{v"ggrvk&v "+&"*""""*&$$"""""""""z&"*'bF*j"""r"+J+"""'k"+r '*&G"rB"'"*b""r&"""{ttP%ݧww'Yw"K}j'zt}rt'+-ջz-"PT" " QYYp"Twz}z Y֩g{ttP%Gvgww}u}ww"""""b&r VyWMw]}'"rwDw'"*U׫+&&"&}U@"""wbթE jk"'r''G "@ Uu}z'b*'j" B`"{""b"b"+f*}wwJ*+"uUq}pw Az}wwG YYYՑYb"rD]ݝW}zgwpz ]T]"+ҧЕ)zwf]u'"""""bzIw"*""j"J+&"t&r+*"G"'"rJF+ """+@rB{"+""wt"d*"@K$&@"r""]u'"""r&j""""""+" &w""""""""""""z""""&""&+""""&d*b""""&"'""""'""""""+'bm""""""r""""v+'"r"'GJwz}}'""vb""b"& r e'v""'M""""*b""'""""&"f"*"""""""""Kr""j{g"v&""""zbr+"""""pp*""p$'&'k"r """"""b"r""""""r'"vk{'U*rj}tpj""bFvwq" %"" "-v"P%""""qݭW v UuPU} )"+yz"r'"vk{'WUeg""w@wp* Tu@wp""'+"'Jy"Y*"r fTpAi&*{d wzz'rrQ """"b"m""z%""]uD@-"+""""U"""""{J{%*R"""b"{ )UQU"""""u]@}Euz}P]P}Բ{wzzzu@tPPՕ@UwKPUՕ w" "pGY)"u JE*&""Bqwzwb+&""jjK]'*v*+@yR@u"""Y"fMb+"B%b]"-""U*GW" "b""ՐUb'+BfB"R} b+&""jjK]'Uչ'"'u@Du"""""""""'r*"%bM@m*""kv"*"'""""""w+B""""v" y""""""*"rrTT'""Eݕ{{""""w""""""'Bj$""""b""k""'KM""&"uQ} EMݙYzZqDtI] UD+""+՝ٙ՗MG""""rtРfBU""""""-v"&y@*zw&kwt" "+brG'frXj{*K'fb ""Gtwwjgw &b`""w"jw@g*"&y@*{zzwڷ'wjf""'z{t""""""$"""""JF""&wt"k""+"rwuw&"+"'z*""'rG""+"''ڠw&+b++"""b& ""JZWpWywW+'wں{*Ң*$r&*Mrzzrzw{+*Jzgvz'""""&"fvk """""""bKp ww""""{Jwjbbd*wwgzb' -bz "'"*"r"r+"""Y'""wЧ""bziG"b&"""""'b@fb""""jb$"b J z@t*""*t{"$&"kG"BJ$"@&Gt+"""Y'""bB"t*""""+v"""G"""""""""""&+b"b*""b-"B"""""bk`j""+"""""""""""&""""""*r++"""*""""""-'"brr u'"k kk'""+"""rrt }Dgzr""*}""B"""""'"+"""""J"'""""""""&rb""*"+"+t""""+br"""}G'f""v"G*+zK""$'"&"""""""""""*"""""""b "kf*fb""+"""+z+"&g""b""" ]AU%""""""f""""""""r&&"++""!""*"""""""b"%"&"&"f&"'"&"""""""&""""w""""""""b*b&""tgbbr'*""b"b"+&""&"+""&""&""""b""""+"rgwr"" Rpdw]TYU]B""+"-"'B""R"""""""*""r""+"""""""""""""""""""""""""""'""""&"' f*&"b"""""&j""""""PڠjD!""""""""b*"""'-ݪv{pwjYDVp ]B}]w@ y """'yPzz+"rz'Rm"KYDIJ$bGwG["b*"""'-н*+w& rG ݐ UA}Pٷ*J$IjGE DDP}P]"}wGt}]IpDuI zzwwԧwקP'}wRe'""*Jz"f'""""+rG'w"&"*'"k{*rr{&""""*"V-*rw""jmb$""!Zf-b"&"Gr"+wg-gJpJݐ tw"trwQu$bGjbvztrtz""Y""'""""*B*g{w+ ՒyBdP"wҠwpD{Y+""g d'*b"""" +"""Bb]JbP *bf&""'""""*B*p+wwwj+"*"*rEpwRG "b'D+wwww"}vw'zzwzrpw+vb{*&&rב'"r"""d"bb&""+r*"K++"'g"'""{r&""""""*"""P-"+"m)""+r""*"""-"+"+""""""""*"""+"""""b }g &b-"" ]]M*"'bfkb"&&+"b"b"R *{jb"w'"z'""'$r""""""B""" +"bt+* &"""J*&"ѧr"""""""Bjf""j"+"&"*""w'"z'""gG+"+"""w{+"""""""""""""""""""""" """"!b-"""""""b{*"""""*'"r""j&"&r*-""""""bjr&br+&"&""*"""""&b""+"' rw"'""""""""]p'*""!}"""""*""""""""""""""""""+''"""+"b""*""'+"b"*"""""P""+""+""&""""f""""""'""""""*"b"{'+rKjtgwj""w"EM"""&r%v"w"&u"&"G" """"GT]UPJUIi"%* -"r"'""*"b"{'Uy] &+""vwww&t}wj"""""r+v-bW*"r'"]qZ *""""b"+"""kw"&""""$*rYY"""'$@u""""""w""{tw"&IGGw'"""""""""""""""""w'"rz@""""bkkV'EG"""""@@]UPIUwWkGWQ ԕݙGGzW@]k""b Uttw"r""rw-"rrrj""""""r  w""'"*&z}pwDE[D pzGW M{dTgWUdmBfYpGr[+ZА}ZAwU]gU}DIwFY*"'"*&z}Y @}JzGUНuDG &"*""'"}$TDzt{@zWU}$" {"`"+pY]'"+$ԥ&rj %UJg"&""""]`BfY]uww'P''r*gb'G}g*wuw""&"K-] pTuZwEYqGw{zzzyUPWU@Yr&vDU] wwG$kw IwFuY U"""'r-""&"""""ҝ+]k""" Bw'bҰ"brЈ}""""r-""$""**"J"B'""""BzםPYU)"y)&!"ҭ"Ҡ "&"""""ҝ+ U""""R"Gwww'"""""*j""Iвw+"V-' xzI$"""""b"""""*""""""'+r}""""&"$'b}""""""r'""pp$""ww''""""*"g"""""""""*'"bz"""""b"B'wGwt"""""WwP٧ ׄu]pEtt pUY"""&T}Gwwԙ""&@!"%{rw""""""r-z"MRR'w*b&Ztf&A&"&fk"+w"*r${+b""&WpZI`Bb+"*fr +$""v@""+b'wtGz*""MRR'w*bb%+jb"zEg&&f"w*b""""""""""""*"kb&+r'"rb*""rk &"""'"""""""""""""+" v+b"kb*&"r**WpZ ]*XYٝPr""g$'""bd"""r"*b" "'""+"'*"$"""""""""+bb"b*"*"f" """bbbz"+""r*&"&"wtbGrp*wz+"""""""Prw""e& +"P&["""""""+z&+B*b&+ -TG'"tfr'+""KBw"""GwwDGG&"Prw""b!"+f+"v""&"pE"r+"["""""""""""+""b""""g"r"""GDj"""b"+&""b"*""'""""'r[bb$g-vWԙUTY KQ" ww{k+F$""}"zJ"'""*"$""*""b+"""""""""+b"'z+b"" """brr'"""""r{"b"wwwJwvwtJw'"-f&"""*'"j{DY {wGGrwjptD GpzZUtJIwGb+IGwwzj+{zGTjzUpGEttpw{}׵j*'"j{DMuE }kwwtwtt*wwj*MJ pwGGpp}twwwvgtgvy]UDzR}xФ{v` Dzdvgr@Wb+WPkk{k+''j"*kB{+JbbbwftwJvzwttpPjjb&z]J]e"f{pMz tԧwGA]@wwzpzzw}ww{$kG{wb+gJe&*u{m{]uwzJ*epz"}tjB"{*`r@ " ""PEF[{D'$ J bbtwj"rwuKB}" '*u{m{TڕYZww{GzG""'""""""JET&'G+bv*""]}"""""jGw{&"""&-'r}"*""$b' ݠv """"""""$$""T Y]EDt$&&*+r"""kbBf""[{&b*"{$*" v{+z}B'k{-""Br*kw%zbb+bb"FR*pttJwj+"""bww zjwU'&DB {ww""""vzע br"qr+&+"""r ""&{'"""'""""&r"""&""""""bJwPY w r""*"&"*"""""""+"""r&u""qr+&+"""r""-"""""vz+""*"kw"""""""""""""""""B""""""b"'"""""""""+f"""""""""""""""""""""""""b"""""&{k+"k$zG+zz {גTwTI]ub"Bt$""e{"R`"""'""+"&"""""'""""'""""""""""""""""""""""""""""+"""""*""""""r&w"wfw ]Y)"$b"""""""""""+@+"""m]$"rd""bw""""'"""'"bM"+""r'""""r{W'"B'"B%"r}"!"""""""+wMw$&*"b""RUPY& E $"""""""""g'"w@t&")*viGw$+"""""""""&"t""""""'""ww""""""d'""""""+""vw'"btu}wD "b"""""""""""""""' "bpJb"""""""b'Bwww"""""@'TݗD@YwtZPEQw"""""DD T w"""""fG%"rttwrww""""""Bgٕ-"""*""+"DP$JwjjݥR}$Tx&]&JEwٲrGjԹ"r "" "$vU"%"b""RTUpT]jWU-$[%"BU"R""*""+"DP$Ygj$g]*I}""$""bw" P%rgkeTtPѩ$bfbK&'"t+"'"+ "u*Y""g """"""Bw+ w ""-+b""""""p""b*&"&rr"GUU"""""{%""&""@EwuD}tDWIU] зpDG{w TWUEjb{z UYP]"B"+MU%"B@@ZW""""""pխ {wvww$b&p*BԠ'r*$"b""@*z}T M%""wP f"{zwwp& "jb*k}'+{wvww$b&j""D j"w*'{""""""r+""++}} w""&"" w{jzzw-EDjDKG}UR zww@YwF"kzw Ҳt%""zzwJz{&w+"}bwKy I- Dbv׊U)WxWPj&+zײw'"*""- """""br""-G'zҷbf"b zt"k&T{*'{Gw*+btgr+""+ "rwK}$ g{tpt" "G"}"&j !B"rt}+'bd!"""&@ FMQPw'ir "$"+ "rwK}$ Dt&G w*p ww""""""j"w'+{$] MU}G*""&'z&+""*"+{}'BX"""")""""""rD""vQtDDWDww'g""b"""G""""&""bgg"v ""br} """b"DԤQIt}wI{E G@QНTPU"pMWEpwzw"B"'wzzQirWJ zڥ""""""Mmv """"""""rw+"""սR")""w"t"""R"rEf"f-bY"&&+ -""""RPQtEztP '+y'"r-"rY"M'"""""""rw+)""'"""R Y+Pwp""""""""'ۍ""r'"MPy)'""""""""""" "&""""'"""B"' $b""""""+""]T'bUIU$""""""""*"""*"""*"j'"rIQѢ"""""""* u""""" DUupt@ YtGkwwwG{wwu DQY w"*"rDYzz"""""zu$"rIYY[""""""Iu Bw""""""""'+k"""x wgr+W+"RՠwpJp*z""'v`"""'r"b"""+"p +"w G{"""""""'+r""*'Kb+*"'""+""""؍zJb'kpw&r"rut@ J"U ׫tzzww"rGKzvkj"""FE"'z""+wb"""b"""""+&"BfpB+bbb""""""""''"b""+{ ""*""+"&""+""""""""""""""""""""+r""{wTY &bb*+""M׺+ k+"g"'wvgk"*tz"bwvz'P"wgwgb[`*k[p"+KjK-r "r ""&'+pb%+""Wקw@p]@- `&"'*"bwvz'pMU}k"z{wwww&}pwwg"&"&"k+fU}jU @t '"b"+&*""wp'++ *r"&""'%rW""""""B*"+@ ""yPz}z'&""""+"t"""""*"b"vrzb"""v{P-uYU""""zwzT}w ݭfwtw}wD}pwk ]} G}G"{++rzwp`&-{MGZ+"""""ww'b"wb"+&&"G-+{w+w"b"""&j"twb*$w Gёe&&pf"rd*B&""z""""wd*"wb"+&&"Gr%""'""w+"'"zgr&""'r""'"""""*"""b+"b*v z{j'kr+r"f""""j{+" F""'rjz])wM$Dz{zvwGuGّWVTk+"UwW*I"{'""mb'k"dr"*""'"" "&""+""""""""""r""&'*&r""w""'"""""bjv+""""w]GQtp}uDt'**"""jw'wG$"kzg {B'wvgr w"Y Y  P'"kJt'grzJw r""* {G'w$"IJbjw'wG$"kf'''*@&r+"+r"wbvjj+b"'g"w*p'pWYg@ݔ}GQՅ$FQصMQg w wDM'"z&b&"rԶ*gT"E{՚!R{++r"Bbpz rB'{r&'{z$+"-""$"wz r""&"&""""r$*$gg""kwwGDKwg"wwv w}j`'"תa@w@}*{g 'bf"+""bGw*D+"""-bRd""r}M"""r"$"t"$""E"+""'""""BW@z u Wu'"-"rt"B}$"+""bGw*@Dt'&*""""Q]""""""*""q-b&"r**M-*"""""""""""w""""b"'"p""""*d "w""""""r*"""p*""DJGGw'"""""""""""""""""g$"b"""""""$[wt"""""yU Mw@}]E pwtwww}wwwp{ttTMw""{wwtw"b"""zא$"r$wrBrz""""""g}t-zt"rPJGuz`MrJ'p}p"֭"bw"G]}rwwW ) ]")"b]t(+""T]{rtu ݧ+wE+B@$rPJGuz`GG԰'"trz}M]}w""""""'""$*f]WD*"v'rRPt'"wzz*"$w٧'"*b{grU""rZi &"+"""r*""z)"bPW]UPyww* +r+r""'rw'+TW +zGD*w""D}kww E"r'frfv]GEY@GTpwww""zGUtww&zwۺg]@w ww׷""""BzG-Kt&ݺpp*"&z&Bt$"z"vk+wb{+}zzwztF}w`"bzu'"qK{zKw"*""{b$+@p@&+"ݺpp*"&gr'K+"""D@'" " k*""z"""""""+"*"$$"r'g@r[brzzw{zgwG`+wڻJ"b@tpj''rwvwtGJ}K `"b}"v+w G[]Zy yI)W*gKvљ%vq"+gvbr'""""""&*"""""""""'*$"r+"bvzBBBG*"KUY]*k*+@wսw{EG`bb+k&"""Էv'UMUЧ+wTrtz'}pDpETpuQ'"bMeP]V'uzB"R&""zwKJ+z[GwDt@Էv'U @g*"Yww r+*"w"v&j`+r+'f{)Kwҗzfvzpzp['UwGGtt{&DD}v&BUՐuJ'"bGЪz {z}QMY Q)v&*"ۙw%"b}Rb*"""")b&+&"""""""""'ݚjgB"wۧv ""w}P'{'JwwwKe{{wjwF}GJ"vK{wdw $j{k"UqUq'ڭ"& "wbbT*۽"B%""+zkT%""""R]uPW]UU "T]M'wW%vW]"EvK{wdw $p@-f"+&RUYUgYUq""'"""g&u-"}*b rM@tԠk"bkk&""$rv+""Er"+wեbM""""""B "rڙ%""@T}T *&&"b"D"""""ww{Eh*բ""b&pr-UY"""""Ք@MpywpՕv[utzPWխUPUYM]""rKUP]U@UPw"Brz}U]%vWp@]Y&"""""Rzٕm@vU wu]u+"pr"$Pf"'"*"w++rp{''w t-"RYMD}j"A{KG+$""קz"F*" wwr+"vU wu]u+"[pzGw"*"וfr*f""""""""""+&G{""""z"+"""rzzg*"j"'w$"""r'gwz"z&zgrwv`GB$"BWw-"RPuP`pՕw "K&'XwUutK{gdק&BZ{g{$r*""""'$b""&""""bzw&d ug*z"""Kpw{k&""ФF""ww'{v kr""*"'"""r+"""Ԡ{UM{w$pp ww*[uw&zw wک{v%""]}pt&"j]u{z tbG J}Ԡ{UM jwGwpw@wpwww""'""+'dkUU'zgwwJWPz"twWw'*wwww*ruU"{{յR&b'k"z %""TU Pzwk*&ݦkB&"kvԧ'Tf"} Ukb+]uIuzj*w MTw'zr&z tyڙ Ew""zJGYDG{p[uZwYJuJwwGrg+*"Bݕ"""""""F'tf"Y """zwrb"[*u" ""'P"%""""RUpTEJwPg$ug"%""u'"""""""F'E""'&v+*UY """"""G""-]@+"r'pוQ%'""B""""&j "'""&rU"r"{'$rY """"""w*""W$"!""""""""t""""""&$Dp-rp}I""""""t ]]"""""Y t}tD UGpkGwww{wwMMPPWݝw&$"UؙYww+b""]-"YU"""""" y-Bw"""*"b"rG*'&"URխ'׭""M" ""&v%P" "" &$"D"Z%""""@T aWE *Z)&D"m""*"b"rG*pԕ'"k"R]UU+UYݭ""'""+w"{I] *"$@P@-*""""k"""""pb+""v"+rE""""-""""""rw"""w-""MGWw@-"""""+"p"""""""""'$"rGD"""""bg-Z"""""Dp M@wG]@WMw@ @DEwGEfF"wP}PD"r"&rPU%&wvJ wt""""""rj ԭzf"'"" $"mݢzz"r"fV'"[{&"r*+K{*G+""`$$VTҁ$uk"b ""D+w@d"t"bw&"b+""'"" $"'Vz "'"+"*+""'""f-z"R-"'"&"Y""bz(gb+""""r&z*&"'"b'"rj+p*""zr""b""G]wwJrr "r+""""b*"+"""b*'+b'*"r""&""""""r$kU%%*""HRg&""""'""""rb"-$""""""""" r"+"*""""gK*B Br"*"+"Gwuv+"+"bw""*+"b"""""""*r&""""""""""Y"D""""G*r*""" "G"""r"b'"""$""p"&"K"r$""""rzuQx *"F *"r$"b"ҥa"""""""Y" tz'""""""rwt"www*"""""""""k'"*" *rT!gG'''"""""""""""'""""""+"bkz""""""'""+'"""""""+""bgb ""z{@{w*""""""""*"""""""""*'""& """""""r'r b{"""""wpwGupqwW zWtPU z"""bw[Dg""""""Jw$"b+"r""""""""kIf""+"""" "" ''"r"&"&uTB*T""`v"b&""k*+"B""""r$"""""""r@""ժ"""bbBb""+"""" ""{&b g"G""'+&&&"""""r&Qr'"+B%"fb'ff{"u}"bj"vFj""&+""""b"&"+"IRU"j]W"+"r"""+""'""""&"bb&"+'"''""""r"""""""""&"""E-""""$@(""-"""""""""""""&b"""""""""""""b"""b""ve&'+"""*"""{zg**""&""""""b+&""b+"" ""b"""+""""'+z*B+udrkp"PrDpUתU'""*b*"ww""'{`"rj"v+rbp q+"brpt""+""""'+**wzj+k"vr"'*"KgbYG&v 'rWEz"wpD pwzG]@ZukwK]{rwUU"-G*""jv"""""""*""""""br"M""""""""&" J""gz'""$"r""&""$'K"+*"""'"""z""""f""kB""b@wpkۭ"+t}U`+"b*+bf&k+'""r$t w"""""""*t""'r"""Ru&DbzQMZ%""t" rE"W`""*"B`' bzJ]'*$"[Yw"""""""*w*"""""zpj"'z""bk"rwt"uw+""*"Ug ١ z"wIwK UGwKu{""'*rr @%"" *wz'""""""r']""""""rzIg D"""""$w)r&"""mw{"g*b$"''wT +b""+"j""+w+w&wwGjwz"]up'&{"b" "[uYt{F*j&"}ٕ{G{ "t r$k'{b"{۪rڤ" qy-"b{wYt*jvrK &$""Gwע M*wu$&G Fղ{ "t r$z*j++""wb'&&b"'{fr"kZ-r*wM*Y@QGwQjwQMIg{wWW MժUI'"b֫rv*"'""BB*++"G [!{+r"rBeUByzf''rz[+++""gj{$"""&"""""$ rr{w "W wrdtf"wwPwjw$&GGzTaE}GUq mkwgebk"+"b"r'+rzt}zM' $]r]Yu$""@"-Gz]*"rg }RdD@E $y$""+"b"r'"תm"*""GGDw*GR rwM JwPwejqzyb@RP ]Y]bw ]QpEGwtWԷ]UԷwKQ{UJ'""'zp'"""""r Pb"bgg"z%R W&r"r*&UҵGk k""tJv"'")P%r" " `" zu'ww[p]tp]rtDB"w$"yGYQp+" ""+""""r*Y"bb" R"%""t"rw"""{""""*{P"%""""RIYUtWMDpPm"T}' %"r"R""+""""r*UU%""""&&P@*uG@""""""m"f]""B'"}UU'""""""f""P"""bbwY""gt """"""r'""ZU""]@u*""""""""w"""*""b{r "rݙY"""""r{g-D""""" jpw t U}GdKtz wJ UuUU+""BG] ww"r"*tY%"rZPU""""""rU`rwj&"&"""b+"rz&""Тtrw"ryٵ]*"+$GJ{{""Bk"B+""z@ "I" pt&"&"""b+"&fw"!"*""""+""zGV{Jtbk'"&K'wy*"zYYwXQtIwGq"wf P{Ev{+"&+z&br""r"""$G&""'"Jfwv$r"b""jtbk"w+""jvr""""" "K&""""""""""+""*j+&f"r&"wwMwwfr-+""wz@ѕ$*"* wG}w&rz'G{"*U}T'{U"kI"B$rж"w*'rQ&v* r"$""p "'%{ t $"bD+"B'Y"*"*U}T'{pK{WuIz+bkf+""""""""""*"p "m+"z"Bk""""rzջ""""jzr'""b"*'b}t"""""z'Bzf %""""""gz$""ֺt'"pjT*R"r&"&B }ڽݴv"" *rRgvw'"""'vKk$"""b""dҲ""tdg}"""b" pWf*b'"&"& Y'jrb""+""b""*b"""{'"ww'M+bKBw""w tzjzסW"t-""t" rfe""""qwtrtuw$)"{ &Bz"{'"ww'wz'f*""DzwpD*wwww""+"tw"}GU+"r'@ח] -f"jgGjU"vv}Q+rrIUEYrY"&""""t""wW-""ptwwGG'""""""b" """"""{{}$+wu"""{z- y&""""wwww`tzzwwwv"r{vv}pJ}pwwDww"fJwU tw"Bbw)"{WBw tb+"""rwGwz""""""""""""Y` "%""t"t""""e"W"b@rF"+"T' -""""RQYpUDM-" '"r%"B"M """""""")""""""RU&UY """"""*""'bTQ""B'"[@ԕY%'"""""""""""u""""""'"""""&"''"@""""""b*"""wGrFѕY-""""""""*"""""""""*$"ryPqr"""""""'zt"""""mptt]{}MGwg@pwtMMP """ՐّYz"""""jwW-"BUT["""""" $"[zyy++prw""b"B u w۴)"rt D}m"zw fr`b"WI"׭'&zDr+"[zyy++w{zwgz""wwfp}wm{""""""+"""""p{*"v+"D{+"www*' zG'"epb{fmp}z""+'w)"rwutpMp { w pG*'P K wJt@Y{$M{&wpjr "**"*"w k"b""""""wt*wq Gt""rW۪w"+&GwG*wz$tFzww+b*&"bb{"+""&"""&"""K "*"""*"""'"""""b*&""""""m Ԣ""""r&""""""r""b&""""`")"""""&"""K""%"""""v""""+""""""""""""""""b"B""""""b+*"""+b"r""b"""""b"""""""""""""""""""""&Ҧ" -"{"zrrwPu]}ИU}+w""* }"*-"""""*"r+*"+"""""""*"""""""""""""""""""""""F"""" &"""k"+b"""""""b"""""""`""}`Wu}]Y)"*b""""fg] "F +"w" ""b"" *+""B"$""$""&J{-"""&Dv &bdbJzD" '"$p"*fg] "k"&W]}}""wkk gJ"""""""""""*}v"""&""b"+""""&}"&"+"&*""""""+"{K"""""+-"""""""""* $""rw}Ww""p""""""+"""rpb&r{{z"&jg"""bB-k@ "*""kB"b""r+krf-dwvw"""Wr&zf"""K ""'* Pvb"$""""""""gB+r'""""""""*]"b""a"R-"" Bԙ@""""r-"G"$"U"*"M' """"]UYQ$"y*"R!" "M)"""""""*pP%+"""&"&""""""+""y'"TUu"" $J @ '"""""""""""E""""""'"b """""*''p""""""r*""bp'"TՕP%""""""""w"""""""""$%"wpwr""b""rr'V}}u"""""ЭTPEէ@XtQ@"""b]  w"""""JW!"ҧE@""""""r-J"'B"r&"""wd {+&z'"b"$"*z""b&bt+"+&& hY%Vgb"R""b"""&"""""B`""""Bz (""'B"r&"""w$"{k"+"b*"w"b""""""""b"""""""r*'""""f&""&r{+"'""&"""b""""f*""""""+"E%GT%whrj" Z}kYYyM "'"+") i&***kg"""{&&"%"""""""""""&&+""""""""""""""""*""""b"Ч+"&"b+""""v+&k"""BzԕuGJAU]!""&"""""v*"""k'w+{pgr{W""{rt}rYW%"""% "]"&&"B $`tݪw-"Gg v"v*"""k'wg*+""wz&w{""rzww+y G+"'g@[QywEw"wtII٠EYYYpfjvG yU%""w{{*""""bb+U""""""ڠ J%tub""bbJew)rtpK+bb""%DW}$ "-Tzgk"*"{"'wdzwzwttڷDw"Z Gpk'w+rf tէ-"GtGwwv{*++"թyڲz+r*" q{dr+K- *y+"${W&k +$"+"@G{rkr tv+"tDjKbZFYj'"+r*" { DYG+gB{G&"&"""+""*""""rb`"""" b"rww"+"+$*"""'*r&+"'""-&"t "&&"&"""'&&"'vv}}Gwt"+"r"""+rrr""'"+""**+b""' BJ""""+*""""'"'b"""b""r"Bf""g"@k"fk"+""j+z&r]Q}'"bkY'"r"b""*"j'"""""*""k"z'j"UyR}"B%""@rrPM"bb["{ib"-"bY"*P"z%""""t UY+y$+[)" U"u'""*""k"z'!"+r"&RUՙ'EP }""""""+"bd'b""$' T '*""b"&r""""""z"t"rY""b&*}%"""""""r'""{W'"bYYYY)""""""""w"""+""+ "rMQb""""""r'D""""bU}YypwtU } tUЙ]Uj*"wՕQt""& Y)" EYT]]""""""-vw"WxZw}ݗzw""jrr'}bkw}d*}@J*"" Uн KG`u"r+""DzKיWuw*"WxZwW*Wݭwywww&w""""""""""+"r&-w'&*r""bYw'bGtݧ$+' ur+`b*v+""k"B}$rgb&r&&*""[KMwWUUUIMw }'"z'tr&brrUp{'r'"D}VZr*b"+&"""&"'"*"""""""""ۢ rr'z"+zw j"vJvwvBrYmbjWu*"b+rjfgdz&""""'"brtz*z+rGt$t U j kR}]{DQpUz-""w"-zբ*"{JMVwDpMQ -"wݠP"'"brtz*"'k*""wDw t"WVztp@Ukw&]YEJD+wD p@wYpPYP z{zGKZAKU'""wzDr'"""""'T""+g"Z%Ub"j@!Y{"U ] "*&)}]zgrb"d"wd ЧwbT׭pwtUpz yz"wBku "wWE U {g*"YPw'Y}W*ԫ*w" zWrMz*MP}MuGp} b'}UyTP[}wtFt"B'""Pwz*GpJbPw'Y@pbyz"Dvr&'"w"""""&"*w%פr'wzUpMݤtz ugpUpgww{*wTuץwwW[*BMT t۴$b'ztt }pU Ew%׻'p{BwtPe$&է pGb v*K'""""{t'"""""""""-ptd*FwPjwwz -t&"wDGW+׺wJgzwk w*""k*"r{rwG'ݷb&"եr'"rB b&[&K)rP"$""Q"'&"[ """"RTU tWzGU W )!"@"R"k*"r{rwG'tDEP}jv"f"ҕYU*Y"""""dw+@Uwz"r 'TEe'"""+b""Uݲ&"&v+*r&"""w U""""""R""kwG$""]U)""""""""w""""""+" "w"""""b{Z$]TD"""""pUwptwww G D}zwtt@tIItGWWY"w UpMPM"B" !"w JJ""""""BUE {r'"""+'+vG*b"KWk"&'"QqqT-"&k&- {f*++jv &r+""K&wD"k'"w]}b'"""+'$&+"&w!""f+"&""jb-r{&zbg"&+jrp"QY"YwzՐ]YPu+Qtwy*"{{۷ E$"&""""+"" &]"""k"zE)rfv""&"+vrj"'r* "*""++J+"""""""""*b++""r+b"ҧB+d""fw&'"wwiUW]WI"r' v"w{@t*b&zw} "G`""""t"}wGzztbGapPفPդ"b'Jww '-bzGw*"pMJG wbw{@t*b&+fwwj'yMR'""G+"&"+*'r'+MWz&"""rJ'Zz{wzzzzpz"vwzzzwzgp "&JfzfUaptwW*Uw `&zGd֧JTuzZ "*z&Zz*"v'DVk*"$""m"g'b"b""*""r'rkg-@wkwt{wwwwwwg"&"ҪpfzJGuU wwwwJwz'""G ' G'tBw"ib" bk*{!r]"r%""MjW("&"*VwWTu{tY]Db w$ץvp"Ҵ*"G ' Mpw+fztBwww*w@www""""""d&wՙ&z r Pz*"bbz++"{"zz*+"r'w'r"""w%BQ""""""r""Y-""M]@w{*f+"*"t""r""rg""wy*&bz F$}"b"bGtW}zpTJWYuwrwGJzGYpM}ԝtwD"wDU@wwwt"B"*zzwvz{vvwg&"""""rt${""""""""&w""""G'rz*"w""""zTj"""B"r*"K"b'""t&"""b'""""rzG]ٕqUU*"v@]'"r$"r"@e"""""""&r'""""""rwwGw"wz*"""""""""+*bw'")"Geg'++"""""""""""'""""""'"r""""""k+bj"""""""*""w*""ztzt*"&"""""""""""""""+-""kk{"""""""""""Jrv"""""@w}EYt qWQ {'ԭUUUz""""wtwtJ]Pw""""""g'"r*bkf""""""rG Pw*r"" """"-'""zj"b"%"bg@` }*`$ {w"$$vvK {w bB D'D@&w*r"" """"Z+"J"""""k"B+{*"&"Y[WXٝT٢ "Ѫkbf+"j@*p@W pr`"pEwJM}v*gr*b"'bB кgjgr]jB'&"" ""&+" ַ&VZ&kd""u'&-"*'bw'BBB+w۫*v'g""""""""r$rjj"*rgp}zz+"f"F"jwWvmD' "wj"Mb jzg"+&&"*"""""")"" t*"""" +""""p+ $Ҥ$"' " "v"$ WD$ PwUMvB'z&&"""$b&*"+"""$@*"""""")"""}bZ`@'"r"""""""""Aym" "rb"""""-""rzB-""B""""W ""&""b'br""" "$"""""""""""-"""*"""""v"""*"""d""""$B*""Ҳ""""'}-%rz)Z""$""r"br"""g"'+"b"*"""""""bb"""& """"""+"""g""""r"'""""""""""""- $K "r+*"'w"w+"bw"g"w`""rt *GpzMFmG"-kw U]-+FGgp'"D"pRM"'w"w+"bwG{J }""M}tz"GG"b"""z**""Jr'b"rk""rwe wzz+Wup-ҷ Bpr}tFtE+'z&z]bzGumG"D"""b&"z$'zz'Kz׹+}JTvrv]]U} ղrk}p & zjty*")&"-WpP}w&*w"+" KI]P"" rDYuק"ztbrvp{"&RpQtwwwzw"r uMwW"V " tE"*B tw}-vTYPM Pwy ] wU]Y tuUUuz TTPtwwwzw"rY yGtwUz"b]]"Z @p""D-"@wP'p*"+{wIwp uU zw ٧D}׻ wwW ݷKGW PwYYwWED@]ptJP&GGWwqz' }zݭ]yz}DJpu}@DtGwww{bYU DG'"t Y]U}"YPTf]YpzpPJ}TّGMtY&"""$""""+"""FDd""Rڧ"$"*w +bt "$}"b+k""b+"'"*"B"zbf"bw&"GD$"r&"t*"K`""B&"""$""""""""""""""+*"$D&+""""+&r+{+"@J("*K"r&"""rb'"t""r"""""""-"dRv"&""""db""@Z} -&"B*"""b+-v&+""""""""""""""""""""&*"&""""""""""'y""&"""v""r"""+*"+"""""+b"r"""'"+""""GG"&B""""""+"""t*""'&""Ҳ+k"""""""" w$Jw}w&yuWM@" Եt+zy@t@WU]ݤ u@יI T uttGEMG }֪p@Ww$Jw}w&UU]wW* M"}wJpת{+rU]{IDwDGWmGJYIT]]U]Y}]]YtՐE]GZ{PIYu@UU E Ww pw'rw]]GwmT'we]UGGMPPE']M rzWuUupMWGwmtwt}Y]]UzDt]UwDwv&zפ}} ztw ttzwEUMT p}g "m@'PJz"pzݭU]պuUUGJ Jw}Mwtp ]upw}g "YىU`k wGt`M'{K` @ rkU' WZU ڧwvwWW W]TUMUUT{۝G WMpuU}EzuiYMUQr+UE}%ppptgww{GG}wk{*kw]pt pwww] z"פjww}tEp{WJ YWUuwWtzw"""""""rp-&"""""r""A$"&"T'*""""""&"B"*"""'"+"""br""b"+вrP"B B"B""rj"&u"""""""rp%""MM-""`"""""&""""r""b"*"""""""""DB b"""U%'b'"""""""""""""""""""""""""""""+"""""""""""B" ""bk "r'""""""""""""""""""""""""$"""""""""""""""""b"""""""""+&""j+""׭{}[d-""r"""zU"""BBb""D]"""""""""r""""fz""""""b"+"&"""""kzG b" r bt{+"""v""""""""*""$"""""r""*"B"b&"Gbpd"b"'brР&+&"""""kzG*" ""&b+&gpx""'""b*"'+&""*k" ""*b"'b*r""""""""""&""""""b""""""""""""""zp+-&"'"""&"k""M"UhBK""""""""""""""""""""""""""""""""""'"""" """*&""""""*"+&"b""" mrb' +bv""wG"+vwb"&"" "+""""'br"Zעzr&+"""&""""""""""""$""e"""Р'"""m$K""e "-""$"'B" """"r"rq"&[}b ""%"Ҥ)""""""""""}r'** +""-"""fv"""b"""u$ڥz""""&'"""w """"'gTU"""'Q%}]&'GBUԑ)Rpu""""""+W-""w&b"""""""""&t""""""rt'" ק"""""Rw$uu"""""הp"%q""*""""""brvUWv"&zwYp"""""rUQ-" *'"'w"-"b"[%׵Y""$vv"rr"edwF"KD"*D'G@k BWMu'{+} {fp@v }Kww{}GM@ Rз@tz"$vv"rr"ڠ""H&Kzk'gwtk""r""$"brwDD Btrp[tzMk+'*P"+ttݙt'Эt$'wg"bb&B$ ڤ{+Et {w{mf""""kw""{""rk"{''"GP"j&*"*v-"'*{ jзv*UڰrwwGww}jwbuFG"-rw wt]M&'+@GpGG"p""bwз էyvw@ptz"Jzwpz*+@"bvjE""JMp""{}TM@kEtMWKM$E}'GWp Ez]}Gݲz"B{wz*+@"bGM@w{F[t"bّE{"z{+"G{'&"Tt+"GD tw WԕDt" *MG'wJ'wGR%vt"r"rGbpmەYUKw ]K'rJb""r *&rM"f ցwBp{tPIwGU}G vz''GGMpP]wwtt]GU"v" ]y"BrէGwFU+rzwzw "`{Wڭ""p P"@*F` r*$W-pPeڑE"QДݺKD״DtMTpwD]AEJz"`{Wڭ""GWt w @""Mt*IET[*"b+'{ bKr{ IR*"+ wZ{[wY] +zMD**&"m]ge(PxUE" ]UTzWE]]ZHZW'׺ptmH$* zUmq"++BfҧB"wzݫzp zey zMMz"tg"PJgMt*z"zt$ײY$аݥQQ}wDM+'rzz"""""*""""""bkr$FP"""b b "z+}B$ Tz$ *""'"""h+B"Gb"+d$"Jݤ"bb"pbB"""""*"""b"""""""""&""w M""" '@& +"B*X' !"""""""b""*v*+""&"r+"""+"rҲv""-"*"Rb"t]-&r'"bz$ "gr* """""F"""""""""""""""""w{$""""""""""")""b""""r""b"r""""*"&"r""+"k""+&-'"""""rJwJzB'*""""&&"*"r"%Yb"'k׷ +"r"""K'wzf"t@p"" *"vWٰ`JDvUU{J&D MzwwwׅݭbtPU}+Kz٧'wzf"wwJGקz }w{"r}Dt"w}z+W Bwr"bG}M-{r׷+zBpWy]b TUdppuҕWРuu&z* vGrJ&wwG+wzj w&gpj+RWG$" +"z&u@jD} wwKz ٰxtJ]pG}w"$bv"wE ЧbJwww @ P"rZ]yP}+Kz{wv ݻkwzwwz"kuwwzrWY+wp){ FwuTp'GW{twwuw@t yJYUYU pwY{t@ukwzwwz"k]UwwwzwU"wU+wwwzwJ+*rY btWGGw@zwv'"rzwwwY{wGzzzwzuwwwwwg"wwY}w U@Dtwt&{pw"b"zջ' jm"*tzz YpUtp]UݙE ՙ ww}W՝@*w*wY۩}@T pwwwzj EPr-"""b""wP"t"@rp""+UD{w'ՠu`Է+'"fj ][$"""pM@ DD+@" RM$R r-"""b""wJj"*rU Ъ""w"F +fGf"""b"D '""ZE{{gw""""W}Z'թ+t+"{p]r'*"g&+"r v'"f}w{"""{+"jݭrXuIurZpm"W}wz*wJG""""j&'{zwE@нBrWpkJp{p'wGp-w 'z"Up&Btpj}w&b"uM}t-R{f[kz""""UYYq@ݺ" &{)&pppG Pt+PEzP+w v}t UPU]I }} } *jwpG]M GԪU]zpw" &{)&ppG}w tBrupwРPJ+}wק']-wՔФ"z`UTwDwE tմY[YPݧvЕpݱpdF pTWTeUu}}єU}ppPU&-+{""R]Y"""&&Bw[v'{U {rwTdGq՝UPpz tp]E]t*G ]{*B ZU]zmeѫzwwww{+w@ JMZ'rw"w""p] "B*"wk$b+"BtDMe*rPuZt"-&*YY} "DwGwF@ @w"PU**jZ'rw"w""E`U @&""wrb"+rG""+""""{"""DGԖ$b"""w{]WkjEy*׵T&'z*d$ w*&b"DwU ]} &W{w+rb""bpUyQԭw wuG"K'g{{"kfwj{z$kw"-eGpװw'wzw"{wM% ""pW]uyݰw+ Tr"w""""rWpw+y"Ҳ&-"""@ +}"$ "bk"- w@ MG"*"jB{tw@'"{G "@]vy"Ҳ&-"""f*'Bf*"{"w*w"{B "ڥ{]"rJ@*"F&b"$vrv'"'"grԧ"r'rVrG'z*"" ""fb&b -'w+}{+"" %"+"bR+"""Ң-wB'" """"""+"&"+&g Gbw""tҺk"*"b""rrb*""z fw`׻Jw wpw&""&"v"""""wD ""*r"zUZ%$ *g"gGA""Mup"Bp"q"W-R'}%P} uY}I"t@uYUP Brҽpw@u]"gGA""@ VՍU t {""JpD J"!rw+""""bв{r+U{b]G" "" U%uzwJqwբ}]PUrD{"pd]uY]r-"w]wI"RMM v&]YUtbtr"rP"zٵ' "+*Uיqݑ*U)*} &rJ U&gk" @}j& k&"'rDp +"W&z"Gtw t""IE"BM pZU*dG`"E}}}+W-G"&twgw-BUM]M GMMZKG u @ p@ !]qЭ*dG`"]YpR-'w"@tw+zGz]&@z]+Ru ry$bKww'r{'P"& @pP"B]R @w]Y*D `z}'"$WUwGJUEvBm b"M""rf["&rM'"grg"r']MPJw{Dz Rz t "{wt}b]pB+w}Bg tr"Y mЍ!%- "'*{MuygzGJG'vu+{ D z}+ yG*zTP}ZݝW G @ MzwzptЗ]]MYY}@Й wqGutJG'vu+{UՐ@utDDM]G{G]}w+pM}}uԪ+-ֺw$GUUtwGFgPMTwٙwZPt{Z{}wz}zkwGT$`} @ wMEpt} @kGu*w@MugG*w{'$Gwu-@wUGr}} w uyѕQYEwGtp] UՅtMpGwЪyG}]vGՠw*v}uUuGw@[}M"" uW*"Jj"J G"Bu-}mZTW P}j@ݝp PpED MBvjpGp M@[}M"" zwڧPwub"jv"P'v""Jry$"TrP*J"Z +KY zW]TJ  UUGGw] ]tUbgGb'{}jWG&G"Vwu} ԭ ِT}Dr"rBZpE@- K)R%PUMpW mkGFGpwK E Tt'}g׶{"P}DD׻" +"jrwz{}*b"zw" t P+&m*BMtw[MЪp"r"''""""e""fj&DK"U-""vkGPMPp$z%&w br$'GGJD K@dbBVw'z *p"r"''""""ڻ""""bb{+&Bp{"$"gQ[EEq  G""*" Xkrb"{r"+zKz@WuwDv& @rg }z}r'w$ZB]Qr-'z"""""""{ vw+fr{y"{J}tr"& %%Zb"&Grr*w@w`*Vt{M"+''rvg {W+@U }} b"fݙw]ww"tw"&+r'+{Jy "bjGJ+kEYU{Uٲuw}Ի etG wGWu]EA&MY RwpU YYyK]`y٘bjGJ+kUUPDWYYPUuWYU TPYв }t*r*"zW@GKPFwD}נ '"gzw zw]բw}wz}buYPwwEFU]wKpt " @UA&Gw ٕPpw{u""rg""""bݕm'w"'v"b+U}G w TwЕ@UwUYG u]Tr]YUYz*Gk*Uݕՠ "&""]yyAՑUU]KM }wY*]pqG""]ԚI"I"pvByuJ)GWPVU]}}] V wzwYP  U}EUt a y Y*]pqG""UYUgzWT@YD"]Н"uprWG{" jj'W+wT%"wByt bI uU D yUiY U٠]`"BP}]]UzguG ݧ '&Rpz"""ՙJ -Bk"-U pwWPUշ D]@Q"}utM"UU}z*U'*YE+"R"}bTU a)'p-mk[QMwԭtА"*"+""۽pG{rr'f"$rw&G+r'&trg""Vj*bj{{EPJTr@ԉ*bKԭ} "*"+""۽p+rDi{bp{dj{b+Jz&r+z"*&*""-"" bYzyb&ku]i b"z{*"w{w$"g"""rvF"'b""""G*t'"b+""""""bprf{zMwФ"v${"""b""+""""bf'Dfk""""""b&"b"Er"rkk'{'U vU]u Wۭ gP@YY+"FzK `Fvݙ"&"*"gKp&{E]""`խwM*j+{w+IpzwtwrKtXiJw Ez{MpwTDbIwzUTtGtDGwwwMtG t]vw"Bt*j+{w+YQzwz{zKwwzwr&"j"+""]ځ%{twݥWWu*v"d+BWwzK+KytwEG] gvG+`r&"{wWDb} Gyzt""vz"""b{rtbw$'rJv"&g]EEGpDK+{Dvww}zwtpwJG}w{Gwwpՙj Gb$"wM wMUfw"'"{"{Gw"BwWuj+Ԥz&"&"r""YgRJTpWu}Jt+ j&KK@z"UJKf bk "GJ rJzT@z]p zR]Bpp&"&"r""YzMw'buv}@`p*r"''z"jk[zwUMЧDB Wir'{k"bbfbj&b*b&"ftw'b'*&zb'Jz"YUUzwvppz}vvb*"J"""{g&&+k&""{ "r +Mw'""""{mgwwG*]MY}g]p]*zJG]z{wUp'{R"zR TЕPJ*"+ zwvgGUٙ@@""q]ZE"y"})[DyK%vT]]YEYpuzUpR@J pEQב@TGRDyyZvgGUٙ@@""fG TUYG"bG"w""bMuK$ԑtZ -"+G%uyZwu"PqI yzBqAYzD '"vtz UU wj&wr""&yw}-"'""'p Pw&$pD+WwWytDPr* * Xq'p""p"[})uuQu*֡{tGY""*"r+(wMԠz"Bv&"}"dY-F"+B*"w"trkw"""{wpvGGUT@Ҡ]@d٠""*"r+(wG%vK zz""w@vb"+"+"""""""֪''ZJ* ՕR-""p {w+r"r j+""""D&{b"'"""+"*"b+"""""Bvw"@wJzGwz"gbzbbg"*""""g'b"kf""""B"rrv+"" +t+"z"v" y {ڧrp}&r""@zwJ"p& +" dW}Zvz&"u{G""""""""`""""" D"%""""Ruj'$Y"Yu"%"r+- " ""''rrI%{""bVk" ""b]+rprZ G""""""""ڲ+"""""""Bz'"'BB"""+"rXPYy"""""U&B'"""D""UU"""RW@y +'QR Y w""""b"jUU%"r-W'+"*""" U"""*"zw +Z*"""""rwb%"'""rr"R P*+")b{t""b""""""""*f&*"U{"""DD p}*"""""WU u+r%"*B"""rr'+&w[z"-"b""'""""bD""""'"" M "b*"& `b+b+ 'b ""'*&"t$&v$*fb"""F"vKJ "*t+""@$""-"b""'"""""""+"B"""""""""{""b"&"gr'"rpd" "&"""""f"в"&f" """'""b"""+"&'"f"Z"""B*""dB ""'""f'r'+-""r-'""""""""""""""""$b""r"""""""j"BG"""`"&r"""""""+"bb""""""""""""+""""'jGpB+ "+""""+""'r"""kt+"""""&"*}D """""""+wzzG"" Mwp"t&QJ"*v}mT uUZuw&MPDqDPWՐםuY@{ ] }z}wZ +wzzG"" wP Dtw@pwz"rPpt{&ٙw&v f{פ bwXڰwV"wחGMzw wwz p}D}T ݷyw z }w&p]M {zGDw}G}{ $ҲGzWtwjzw-wP@D]U}tww w י u+qwg]]wDwg*z]]] "wKէ]}zuwrw{wwvUT"""""""rx@$r""r+"""B$җi"""+""""""""""""D""""""g""'"&"""""+R" D""+"""B+&"z"""""""rx-""+$""'"""" """"""""""&"""""r""""D"}&"""rP'r+""b""""""""""""""""""""""""""""&""""""""""""""" &"tr+""&""""""""""""""""""""""""""""""""""B"&"r"b"""""""+""""""""&*"&"zrJ""""+""""""rb""""""""r"""""B""""rk""""""*""""" """"""`F}*""" """bM&&R'@$+r"@*"&g]z *""&rwK"+frtgkkE'Xj$Bd """"""-Bb" rt'"v"""jb"+""r+"&""""""-*""""d"v+*r+"""U]pg""@M """r""&"+"r"""-"r'"v*"&${r""*bb" uVWҵ'*+rr'gbB ""'""w""b"*""b"&"*"'""""k"rwrjWM'tD{f'"{&"kb'"'""&Xw"'X{""""*""""'&w'rw{"u@wJ " $PM%Jk"KupFYGz}ݝ}tpZYUYpGEt*t}Pw'rw{"]Tz"Y$KD+P@D]jrբ&TW@ J'pm'z @Yb{gЕ[YYUP'@{YY wt@]PYz UzzZttz]b"If&Tԗ''zU){bUU"wTGw ת ݕYXVY *wwtzDJTUYUGDww UI"]rWwUY*tE-'wwzww wPpUYw'Bk$g*bD'r wWK]y{w+wp bp e j`vW P'b* wW]WEzp} WwvzjwGpw'Bk$g*bGg'""g+  wu]uw@fbr"pW+ZwBٕwrwGt} tG"+*{w"+F{Gzu*z{iw&*f'"r]UmDwGUw&""r*"&b"rw''"vJk'" B"*b}u"֪g]uGzYUuzzw p]z@wtpG&zr"*rWj'ubupwJzww&pWpw""+""""&""Mf"Bg*"""J bf""" kp*" j"J&"" "KݥMP`"wk"r"{ *+@"U+"d"Bzf""+""""&""ժt""+b"tvg"""*+"""+r """""""&"f&""wb&""""""+{'fr'&kjb&"{ *""w'*"""rb"bb""j+"""Wzp""b""""""*dU*rڙU&g+"b}I u&r*ݻw""-J+g"""K""v""{'fbkfJg@'bj"*"KjvD"" ٠Y'{&""+"br"""&""rrJb'"r&b'f"rp'zw* {"u׵$D]@}Pw}vk 'T]p }@uwGGD pwTEbMW'"r&b'f"r}G{&f@wwzGJzw*yZQtg}uE}'*"{QwJf{ " F DPG}@$TUGzJ z'w+] wvW}y Q}vkuջ{{+bbr+T@Բյ[r Bwjw+"** gm z T{gjvwtgJJG}pz Zp*u pEGMw wzwUUU]UGtw""]WէD]M bbtG w@Fw'tzwtJ+EDwѲ "Gj+PG@trpqWjJ{}tDjp'PUQ}@AzwZAgy* ԗUw'tzwtJ+EUGz {JtgP""rb"w"J'"U}rK uZD@zgG"rgKtBtGrUG%vgb*r+"-ەY{M]ݫ{zzGMw"f$]''""& *""wg"fJZE"*w{Y x@]]MPYP'Jw} DzYDwwzgחUQD*Tr"*ZYy* zBMz ]GwUU"+b&vw-JzGD}b $jD*rzb*z*&w"ݵKrb' K*"{GG z${zwtGfGr&bt&]J`"+b&vw-JpwG}w${GzzwJt}+b*b+""""""z'z+BJF{twr*"bz+"bgr""+"Gvjf'&"""z"w*"&&"""kf{tw"ppw]PWZm"*' ""b""g""""wj"*"*&"r""""v"*&'*jb&+wg"k{w{zjzwwjzztf&+" @wzg"""""*t&UY*zjbGz w GwzW'}""D@@bt"@Mz'r'M V]MDݺ]t@v@v*Q@@ U] wDtG}z mG GwzW'}""zptDP @"v Gw"}״ k""b"ZM'z"wr+Ptw +" -[wtpYyDp"*Tݔ}"zb"'U tYݤ)r{fwWժj vtG]QUUPVװ"rPMMUٽԧe""B&kҷ"z'bR@"&{]t PUՕ Mِ ]EpwGw{'p]wGt&JpU@""Mm+wrrݪb'"p@w@'"""'"br "bЈj֦ "+"p"W'*B"f*""" ""r"""'"{B"bfBpݦ@$f"@"&'"""'"br+M "" " *b"zj+b&"k*""w++' z "'r"W]%w[Bb'""""b'"b"""&&{"""""""'"b +'*Bb$""*&""UDx p`""""""""""""""""""""K"""*r""""""""B+ "r""+""&"b"+"""+"**"b"r'{+b*۷M+bz bF"b&bw""""""'*rBzgբrk*+"b""+br*{ &" tv A"@uw} }'tTtIאuw}Gk twUUЙEw@ڙR۹+[Еr*{ &"zp G@g"]D"zjbjp"r""rwg{k ۧ@T@zz'"+r*pw'pٲFwKD&z{ѧp{wBp{Qw$""ҚY}wYYYv PwwuG"*w&"v+ &""Uz"'*"+Q@wpzE*  zݕ]TIM@UB GB@'gPՙUIp"U""Wٹ+[yy}uW W@`j}ppו&Bkgwp""@]""Iv$r &RM*B`*T Put M Kt}jG[ wJMD@ xrJrYՠM Ԡ&Bkgwp""w FGPuЫ""@Ԧ"UP{z '&""""wM{"b"դ"k`"v+""Dݩv ]]Ъ]&pDt"'"t Pr-""T[}$Ktrzp"*rzwDѭݑP u "Rpm] '$r+ժvtErw+'Gtr&rpG pD"wGMt" M@*"*z$"'rww+G"UKU"De Fb*"b"Gz'""r'"""R%K p" Jj"`}w%bP}] &uRM-J"pp"pKt@ @*B"+x'""r'"""RpJ "+*@"PP w""&&&*ݧE&z'pZ""*zU"b"ХR}z{PRjPwע""bjt yRU}Gwm&"""z """"m""""rzz""""BB*"&"$ 'W%p"@GDp &{Dw{+"{j-}GMD"jr"wwJ @pt&&"t""FD@+*-wG mr(&JpP+z "" w "Z"zwi"zrG} *W@Iםz GfzUYՙY] gtZЫwJik Rpu+z ""}pа{{G"U"z"wwb{*"&*'ww`u{*"&wzwYrwMFYtJwڢ*Yz'{vwPT]G{wG"F""**f*rJ"*kj QR}TYݙU YBYYYt&w'gMUUU ݢrb "ikeעzf+"Ұ}wէ"""""""ru'b+&M"VQ-&"Wy+' ٲUY")r*W zp$f"BwzE@"t&DJbYD+rMz"""""""rUEzg""bG"tGwzp""b"Z]Pup"j""zGjr+"b{k"bzDPДT"""ZWW j]GD PG"""z{Q]U)rIPUwr'""" """bTY׻"Rwwez"kv"z$**rb&z+JP@U{UtKGpj""+"&``GK{Ыwf" UwwpK"f"ڐ]pwD+r'rBJ&brw  }wԢ@%""v""uH$"B"Ep"+kpt* ՠ '׷ `"-НTP "}@Mp@ ABD@I pGMݢ@%""v""tTzZM} Db""pww"G vbw"""""pW-wJWVwb""" ' D UZ "r]EpעF&"'"]wg+*b$'&&G `"pbbҢwWQQPzGuk"Ywpٕ-ui'Z)[f@g*'"w&"jԧv @g'z"} @&k "p{Dp{"zJ"}'pGpETuf rzYW"-"'""}նpz"$""$+""'t $r"&"""`+"'rDwP]M)Gw{""r"""+K'" """"B"-"'""y}e ef w"''""*'""+z """""""""'J""r"JW&""b"""{"""&"K"$&&""""'b+"*'""""""""+""" "+"""rb+"b"B""""b""""D+p"ptb%r&$"r&Gr"B'PY] F m p""+r'"""""""""""r""""+""""""""r"+"+G"F""""""-r{@""{"'g""b"""{"""'b"`m""""`&*W{mw{""zz}"ڠ"w-r"+pzu$F] zUzzM +M EG@ФKٹRTW{mw{""Gz{w]w"GUu"[Pڤ"{"w"'"GWwzB+"&Jwq  YM tE'"tzt+pժP]zzGT "pҴbgUԁJUِ*RgGw׻+m Up@ JwwGM}wwgWG}Gu}z} Ut&w}tbvP Ev@KׁM] YBQ$*""RUtPw"v)"+jG+"wzH*"+"}G "&p"'t$p*] ""zХ V'"DGBРwtrp{&G@` }+"v)"+jG+"`vFkg׈v"""j{&""jRp"kw&"r"""@Ҫb+b" '"UMwp'""yBBX@z""wJ"r"""""{"}"-+ $""{fw'{FzG Uݝu*&)rr'B+b&)+wtv"J+rJb "&++$r""'k"FzG}{Gt*gեrw{'+t*"+rG'&zb"t "` Jfzr""""rg -r""$'BRMwM&B&T")'zj &b'rb@ "DtfrDk{&+DwGGfjzKG+B@pzz'"rPpG@"$'BRMwMu Wh@ w&"zk"{-b"v+""""&U*rrpt$b"j*"*""br{r+"b"&'z{"b"""r"""f"""kr " 'w "r`KzGwb+v*b++"&r"""""b$+"F"'"""z{} gB''"jҷ"b{""r{*bg{+bj&Fbzz}ԧp"""Gw{pDw{w{"'"+&G*"rmGG WvJ""@pDz'KrgzB'"tDpM"Ұ"b&JGM$dTUJ՝GJuՕ]w'+DGGwZ Pm+MJE@z'KrgzB'"UzٻJGpJt WG""]"xrr-b]]-fIz[`wz "&GUٝUr WUMUxI`נ w'ЭPGJZ]jrjv&׹U'rdw}%&IFM Y%MuY}zrb-TdpweРJ]{w@d{{rMU g'ٙy pwrղ+]ݝd+*  p'rGե@}t"R!"{"w""u"b'"G'@@}+A'pf@rtp"uy[""F vzM DBt j rMU`rI}"R!"{"w"" j Yw"z""&`j{""b"""""" }"rtZ]pr"""K J+zd"""@{w{""'" " &""'" 'B''bt"W utr&k"M mwҙ}*w$נ'B"'"+* +"b"'&+$ "*-g "&rwmg''$}`t D{ "Bw*z&U}"}m$rMM]Uvd&"rwipwfwzz GWMw]{}g!zpwtԤjy{`WzvjНwT}UUPw[Y@{YI[٢fwzz GY]wtW]ڐUzg*"""+ug[}VzZUu!"rzw}t'BGww'v"vw{wkg{"&Uptfr+"vtUUՑ PUqwzw""v&w"""ut+'+""&JGwg{ U}BwwtrvpYtY]E]Ypww'*GYݕyJw+j"u{ՙUYWD *+Y]r+"f""""yj }G"*&}b'b*"BPGp*B p T" ""i"y-ڭ"GGMD @" *vP " Y&RE'r+"f""""UYKw'wz ""w"&Kۥ*brkk"+b&F"""uG` +{"""Gw]TpнDp+W+ڧݠg'- z"""R+} ""U"&+&&"""RU'@YBu%WwtgrZIQQY[բ*bz&j]t@zJ-tf"&&f'&+{zK@PG* z&tg+{} ""ED}$Yݪg "b+""""ҝWtw"`"b""-"""" """"&""v B"b'"%fwf&j+B 'b""r""'b""k"b"rG$""*"'$'""`"b""-""""""""""""""+""""k&""""""b"{-['fr"D "{b&"""rGppU"b"B""&br"&+*"'"rb""*"+ ++B b"+B'bv '"'""'&t"+b"""""""""""zmr"+""""""""'"z"""""b"""""*"""*"""""""r""v"""+""""zwz r"""""" "-""""*"""$"b"'"rK*"&"""""G*r&&"bb""}zE"W@"Z $""B]t@`+vzTQ%m*yٔH "''z DU]wDbۑ*T}WPG*r&&"bb"" wwrJJZt"r]u"+{ZB[Wk"@}"+""Eз'&""vTU &w'WU}RJPՋY 'pz""[z]-IU%]в*r**&""RTgrM' Dpz'pM"rr՗WppQtuGPוTww&**w u]w@wG@"kGU]}*TY- Yuvwr'M]]+"B"-f"r}[dr}pp@U"wt)wUBUUYwPj B"TD zzw wD@Br'dr q+"B"-f"rT wݦ"+E&JG{z"G{-j*z&"'Tu*rJ{G$t WQP@"Bt[ݐ"*@} Y*@+b'r'''{j}PjtW'b{"d*wfҺ"""+"""B{""+""""*+}wEZp"jzGz{j}{[J*rpFdwwGwbz }DD'{"wr""vb dr'zqzJԉy*wgrtpw*KGw k MgbEz}zխWYDPZGD yzТ}GzZ@}]w]] B׭ztpw*K'vtww"pkbkKgbbT YJ+VQ]Q׫UpR}w]UII[[pvFbrrwڧ+"z"wwpr'*tZfG*{KwwDgDrbrJ"&bzw')+$v"'&d}z-w'dg+tr{Wwb"M p}}WEf}Iww {UEWк*&G "'r"v׭wvuMݕ]k*'*wM"&'"r"J w&+rB"e"y*zb "bD"$bD +"m+K"*ڧ""rG۰Gz& "ry"&'"r"J խPYYUpgr{+"JzB""""'"""""vX&'fuY)'""b&"j"" f"""""&"""""&"+$"$""""r"kv +"p*w pMB]e"k&k"""""+"""""rB+v"""&b"b"""r{}*r*""vggrgkeJp&wzG{DwzjRvz p"""pЧpM""R+Rw'"r uVUEzK'"+Uװ b&R&v ZwkuBUUjwywwеwpTwUEGMwW}[UYTYDU DZU'V+b&R&vY ЙDu']U *v]YwB{q{+qg}""RUvWwwW}ה*gw'rtٲG}z{Ufz}MzvU wG"*"QU@GM []+mw"'"'B*z+""FTYE$b}vt""[UUgyI$U٥ DUM wUU{ wG@zrWUUY*@ $pUU՝Ewղr"+"Z+uwTEgWtwY""""b"*f"'B&'"V"״""EgP"֥b"`*dKբ٥rwz[DZubZb""rEu""""b"*f"Twzjw*&"drU"buzw""&b""{w$'*"{@Yd{'wp"{gGYU"&rG}ٹU]+WBTuYM]""+"bru'ҧ]Yb"pzbf$""""'"+"" *Gy'" w""rb"y+%{]Uzz*)}YYXwv'&+ &rwzYTUw"fgzZ"""&{] "r-kmzjGIYMpUw""$"""z{vp"Ip" $Bt*"$ p% B @ `uM$z""dD GGwGtkF@r"v%ݱGG""$"""zw'r`'gGpz"D p""v b" fW*"Kw"D"J`"BrB&""ҫR@"r z m w ""wr*+wp+Pֽ ]w'}p"ҵ&'G""p"""-ݽ"'r """rb'"BV "*rpzF'wGww"`'{bg{"J-zz &"'kw{$""""&"z%*"{"r &z wG'""""*""Y &&t[+ۙ%&"@ppz$FUb]EUby -j""pwGEWPt*]+ ubu"M u'""""*""QEp*""`bU U+'+ַ$ Qbj"r  Gv{ww"bJWpTYY""&MYdRWw}Uյ U&""GږyIQuf""rg""rb"bvФ'"{Dנ"*"w-w+"*qWWUwzMypW{r*"&GpU YPU &'@]Q w"}"&{{EPUp"%g{ z K ׭@u]G"""""""rG DGq"g+"g*$'p&r&""`$"&"]-+"b""b"""Frw&ZJ"r{"" "B+"""""""r+"B@$v@ppDt *q"""++""""""&G"""rBJr$pw*+""'f"&""""r*r"b""""" "'"""""" ""*+"""""""""+&"zUY w%&"bb"k""k""""""""""+"+""""""""" &""""'"+'+"r"'"""'"+"+t*Uu-+}p""""wp{"r+"k""""""Rj+"U z"""+r""r""""""*w&B""bw{"f k""BwjR!rY" "rb& $"-'"g{"{"jrG""B*"r%"&"r""""""*F*'j"""$"bv*'*""*"""*j'K'ruK&""{"+X""&wWwU""& {EawT+B] -Ղz"""""*"Bu b&[@'m"""""" """"""""z+""{""+"""""""+&v"" }+*+"*zf""'b'""r""+r"r""&*"f"B"*zwwp{ *"""{""""b *"r**"&-G"E ]""""""w}]&b@ДXp"KG" tug*Jxww %U MP Up]۠UMU @Gp DpD  Dw}]&b}p W tUy} z{"Gr"" ]qwwU y PR-"'WU%tK}WPE rWY BGjM}UېYհ Gt] Jr+RWYED]MݕUtEG"{rЧ٥D%+B V ]]Arw']-*zwPBjMקIpuТJz z"Mp @}U &{wbKvp"p 'p }Yup*w@GJE"""""""g"$b"* g'-w׭"{"B $""B$" $+""*"""""R""*"B"""$""r$Ur"p+""""""""""g"""" +""&*"} p*"""'"""""'"""'j""rw*'"z&v*""rbd """"""""""""""""""" "*"""""*k+*"""""$"""-rbr&""""""""""""""""""""""""""""""""""""%""""&"""""""""""""""""&"r&'&"&""b"w"v'Т"b""jU"'""""**""[v&v""""""""b""""zKw`w "UMzww u*J]t }Gz MUwG z DZtpu[] TPY P]YBp}]zKw`w " Y{wwWU]"@UP{wzrF ׶z'bUUzET}}pTtgvw@wvgwwtU ZWJzY &wwzzDT zUpuw}z+pwJ*"+wYuJ'{'K"{'Y w{ qG Ew DM@Gw DuPY]ݑEu]Upbt"vz}y} Qݕէg{] t'pwuwZ&up pDuZ$ G@$wzWF}P @}PMzV PUY]AwpԕRg %WMUt'pwuwZ&]UUwzpzwM"p]Mr&wpjz&bzP٧u@[p@DzGgbzr&wt'Btղ{pzpTzGER}ww"}wYJp*"d W]@pPUUU Gwt M&r*r"""yw-'"B"ەMݠZ A&U]u]YUDPGWrّGK{'GՕYUY "r"]bZ %WIuUG}еpG]"ըZ&u""t]yg""B`'$BJ%tݽ+ p" Y@` DЫGM w@p"v@ע`װ"ըZ&u""w{ W]UG}jw+"" *" @m&g""""" FzBrI+]wv'""TT $TU}u*DkT}g"""-z"e$"դ tp"}"+@{׷ @]E " "BBFdUٝ-w'r'z`P $*"gw '"W kp"j*{&&"pf Gt""{*++'v +pw*"j&"`d`"rwp+"Rڧpp""'*kg""Gk""f&r`& &`*R pkJ'"d vp"*JJtz+B$vwp$ t@"Exd k""'*kg""+kr z'Y*&""{"z pۻ"*""bb"f"`"ڢ*r"&""U{'+ UpJ"gMw""*'"dW]b&צ-*'"b"rJG}TUUՔPryE"r$"&p"v"""$"'""*bb*""t+""&Bfjw"Kz'p K"`"gtg'"&z} vr""YQ@" Gx+{'""'-""""++j*&r&""""-T'U{"wZywp Ф k t p*Gp{ z@zJ Mԕr" ] M}w&r&""""֑PUP ""pKwG }{''TEEUݛUw*rwۢTKT{gwzz} zw+kWWWp{-twjt] *+"}j}]zz]QّXEEt'"" @vr{*vbtjz-"wzb"Ҳ*Jg-Puwrmgwק&R Pzw{z-t}WuUPK MGz ]YYptW"g"J}p wK{MڽGw}׭wzw"w!&""]EtMj"j"M $+׭zw-RD g@+KF f"p] U%GrF{@v@{kBb zM}t"w!&""]PG}DGWdbr""{r"%Хbjk"r"""J@b@rݪw TR+""P  z Uwwz"kJ w&j"+"*rJz+Bu"wjZ*wZ'f"tr"zzrvv[g]Y qb"Uz`wHI@!!P]UYA'pwִ*"&v&' "G "rF G **&+''ԧg pݻG+&"J@K}"b Jm"@'zjݢr]w$"ҭ t" &W%""mt@"+" 'G""$&@-$w$dFF@"$@pvݥxGWwGD@Dv "M*"wdB " &W%""e pIwKjr""k&""U k&""b"""wr"r$""KbTB+""""t'wg{Dڧt$K""bKp*""v"+F"{""*"$ڽ"Br"" bv+Gev-"r"+G ]`m%r%U wtE"*'-"krf&&*w"*z** k"+}"""m"Ы` t'J+g""""wvw""ִtB"r+"wG-"F""dfk""B F z rz"kb"rt"w"p}{"&G 'TMT}@r WQt'p DwG}wDTGDKp{}Zwz rz"kb"@Izg"Gwz j"r}@pww"rWJw"vwWԷ'bb@@z{&"b]WwG&WZ ҧ Zwzz z&"}PUUՙrّwuDe'""RPw{՝Vm}zrכ'y} Mw@'$KEwk{UDtGgKmkJJwWtGTtGGDW@wtwM"Tեp{UwYJҺ]{wwڪzw""$bk"f upKzY`WUp"pp]{Gyוץ"Emw"@TPT U]Yא]Mg[)"]UV""$bk"f ]}]wwwvtU]YYU]`"wB"" ''UY'G}@TU%{"wGk&wJ@wKYwww{wڠwUY'*&B+*&Dٕ"WYp{zZ'""-@'{""*ug*"{EEb+b+wIp$+U]}z* Y YIw UvMTEpWMTU{vTUU]Gtе]UMt ]z" )"mEUwUWUյ+v-T @ Uz+TUYXWu""]E"}"& ҧjr %}pyw B] UQM gb Kp}qU@} z+TUYXWu"" rՔUUT ""WG"ak{+"&""w"}&b"w"[ "&@%ҰMr}"z)MMZբK"T) Q "$TzywK@ݲ"RYY] UJ"&jr"""%"*""'[ EP"tGU{&G]g]&tdKJ PTGf"&U"'" Mԭ" " *V"W pqUP $}r Eugzd{ k"{rg+]GDUZU* %"@G]PP]TG٭zf]E kзP]]Upِpt'pUuuk"{rg+EUUJD]]UWUU*UYݕUR]]"*r T}]՝Uݚ)"}yw w }E] {]ڪתUGG&WYi{٪zfMUTUUYGU zGݻUw E]tbZ+wv&z}K{e{DW UE]UݥD }UUU upY] jjwwvU'p}UוTtwG*ZU{p+&""+"+"w"""tE{fu$RjA۷Bg$$UYU&Kz{D+k'kgrgg * 'zG$pJ{p+&"""r"f*""B&v ""r{r"f*b"""Jr'""BWgVuw'"" ݤz{+k'ww}r"zbwW"J"gb"" *'+rw]jtz}'$*"Dw"'j"b"&W Uwمu+rR'']ڧW-G-jk"+-*+"' "*&*"&kb'"ff$&"fbb+""$'z"fv&w&{p&ۦ'r"*rkrbԵ""r'zGUw rt+"""BJ֤}wvt"r+"""k""Dr]g&r*"p+b""z@'MWpf ""kQy P j*"wwG  "D"QQd& "r+"""k""{ "Uzwb+"z{""tpk&""+r"zf"&""]Ҫw r""""ݝF$}E+P]׫KzPgz `bd+b"ۧjppлZG'""z&pv"'++ݷ}@X q]Arrz'" }[!}$K{ "{++Wgwҧj M'G }&}{-gwz"bP}G w+K ""ѷG}Qp`K""f""""I"z @ b""`"Էzp"j"Kw""""j% GF}@ M- MmT$"jwڪ  Dbr+K+" p@JKz @ b""b"""""}ww"Bwv"j&b"&"""""B'"""{vt"{Rm""t 'w'G"K' Ggbr-Z'+*K "Wp"kr]- ֢T ""*"R m*bg"""} ]!f-"""' E"+"+v%$w""&j"z-Jk'{b*jGb ""v&"z""""r+"&""-b}wzK'B{jݴB""'""""e"{"z"[ """b*m  b E"T%II$YJ""f"rzԭb{ԧ$vF$"w DMwݴB""'""""Gyk""+"" "rjw"""rE]tD{}""""F rfҶGM"F W}wа""R}wݷBi${{*"""r r]ҙUY-ItRP'r """"%t-+ݒpaM`Mһ}r&$"b&"gz'+*B}p+"""+&"r+""Jvg{t"'}U@wg"Br Uݠz "wYRrpmu}gWK'wu""wE "Bp"` &"$dz`$KP D q$Y U +dJ  Gt"tB B$Mm twu""zk"wwy {"" "` u"""""{а"*j"BBt$&B*""w[t&zGE} "Rr}w"m+""+GMpG'RUM%""MKq pG""R ]]YQzљ]""" q`x$+""mаMD'"G-bd{w""'F vw w'zw*ztۧp""k"&rg"F""""d" MU)ݲf{m""&"}"r*u׭""`Pd""E """-+'BԤ$' p&'PK$"V @@K`K@ M$"b@zI$D@`rJD"r*u׭""  B]UJ@ ""gKv"pIv""""""wڦr-""Ҳ"["w""$""DwZ{' }pw{"*׶K""""&kݥ"{"*"""M'p&"tK""B}ݔPݐI״Yq"wv*r"r"E$wG""$"ҲK)b "''rGr"b"'rp"G{v}J """+'"+b Kw"v"Е"W"b@$DP$+B"B"""*rjG*"z&j'ktpנUPGz 'w@ugt+p]{wzFJv*zw ztwGt ݷ{ *"z&j'ktpr PU}}pvwrzz"J""pz@z{w*J BwUtw{ wpԧz&b{Gz"""'w tu''k{wu J]՝*{zbzf{'"""zpw**r"+&{d''"wz{wtw'wGtzAptKGwp'tT w"gj"ww wJPtv{"&"wJ wUE""Qw"t"p%Ҫ*e`ru%[]G}`UY IpPuwDD @ M"KMٕUE""w&zM@qww"bGwz"yUEe""Tݐ""Y&ApD "kU)qy&[eMוѧq"t't@uYP%fpp Gw"]ՙU[t "p"נYYG'"r${Uw}G] pjt* pt@wYIP]DMp}"M}tpw""e*$JwM*"ԐgPr"ٕ]'jt ktW ryz%r""*&$""B@$"" g "Zz p+-bp H@-"j{zG*zJJ @$Bݲt+'Bzryz%r""&vr"+"$j+@"""+r"&brj""k"r"BD"""+pT"g'"""r zТ"+*"v"''"++"ҥr[t]] b"װ"$'b"""REw-'JmuK"'xMhr-&"" w+r"r&"jb+"gwp+$*Ҡ"+b"k"r"`""* $F"&""F`"'v]"F"'b}" t+'d$+"T&""rv{k ")u׺Yw"b Yd+B*"u%*} z @}"pMpU@YGDw MF {gPBDpRm P")u׺Yw"bPPКשb}{@b+"z{&"TJҢw""""""KPWrGz} wu"Gj@ } ztvEKz]Pt`*Tװ-vuդ"]w}@vFW{p&jfr"'B"r"fz Pyzq&% {XԪ&w'wzrwUzmG ""g+kd"w}Mg""+ }U"JB"*b+{pGpRM "&}& wU{zwwpww""upGwIbA"z%r+`rwpGM'FP@UD@puupzpyzzQTu} UrpPE{zwwpww""]UY{tpGwtw]"&]G"pBw"r"""&wwԐݪwJ*"&Fwt-[pIv uwwGE@]w@Gp D@p-"wvtY}UU{t}pzwGtzצ+vGzv""jrQtwg` J"B'٧w*٥PDQgEwٚrUUEwG+Чg*יU  "w۲wvW"TYIwzww&fR}PDw"rk+)""bPJ*"PPt"zpp W}'[FA+*"m DԻDzM@bP mr@{ Kw"rk+)""b +g"& kzb@&"@Ի- *ՕK)"Ww-p*"D]Wէ[EPfpҐj "*]YWaD J*[ZհDV'wg-b''g"""BDa{" """"B""*&{D"d$'ze w{w}{&f ݠ]"&"g++ݢp"p{p'd"""'+'f%{Fzzrk*"vgkt+rw{{+Wm 'pw* pwk{dG w{pk@{@"b$"FwpzzTMppz rzrk*"vgktjwj+""w{Jwztvz+zҷҧ&w*"}vնzr w[{z r*&j ywKzD}kzwbww""j"'"wvt**w"gdgZ`{'w{{{*bb"EzJ b"K"&"vfvuK`*r"+"ݦ$"F"b kw{g"jfjKwg*z @}w}wz{wtPpK wpwֻ"wz@yufz""kp"if+׷""pҁ'"r""w"*""By ygG* ] +r` WW}t +rGKfڷGrJ "M]*+``'+"if+׷"""-jw f -"r"""rj"""tJ+w""""""k+r"""J $y &""Ywg{G"ftw""v]"{"""""'""}r%mdr +r" Р u{+$ezzrt!]- G"w"+"r"&"*f&"""*&+*bkb""u'"rzjpb+pj'"+rr'b' ""Ty"k*+M'G""{g"""v'g""""""""""r'""r"r"""""b""""&"b"""""""""""J&""""""""""""B""""""B"w""""""""""$+"""""""""""""'"" """"+""""w""""""""""""""""""&"""""++""""""+"""""""""""""""""""""""""""""""""""""""""""""'b"rv$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""zG"""""""""""""b""""""""""""bQq}""""""""*"""&"b""&""pb&q"I"{ e{"'zt@' ]EUu{@$` Ft+"+@UYptEgMBvDq"rpp y&"b""&""Gww*"fQw"rG"'b+t]Z*rY'rGW -۫{@D"fuuPU""*Kp$RUY'MyrYY"+fr{*B]Yu{D pJ{db"+-""*"+r׭B 'FUE"bڲtJw**Օ""UgYQXUXPTM@kwzbTd&pwՑIG"G"gDq"rd{wG{vwwwk ] Yz{}GtՐzZYb G U%}׭wz%Y @G }pMUGwt{GwWMJD]U  ץ@ @uu{}GtՐzuZYUzz"{GtEt+B "GtUPUwzٗ%ݙ GpTu'vJ@wfw"' tQR''uD}z tzJUupw ]wwwJקz"v{۽Эw%J"{*}w}tGw' zztwRwv}DwYGUIyDGpuwEMUpDKW{w"}@ էwwwwYw+bҰ٥zYB'*""z&""`""""""*""""'""b"b $&""&*"""""&"" 'PZX$ע"F""""""B"&"r"w""b"""$*B"B'*""z&"""]%"""""""""""&br""""""""""""""""""r"""&"b""""""b""""""""'""""""""""""""""""""""b""""r&"&""""""""""""r$"*""""""r"F+""W mP!w*r "rEr-*""" """""&""""""""""""""""""""""""""+"""""B"""""'w""""""++"""""+b""&""'""""rB""b""""+""""*'bv'r'""""'"eb""& "$"&"b'""""B""""""b""&"b""f+"Qf'x""&brK&B ""+""""*""jmd'""fw"""wK"""""""""""*"+""'""""}"Y&&"b"W[)&""}+b"""""*"""+"""+""""""""""+"v""""""""""""""k""b +"""""""""""""""""""""""""""""""""""""&"b"""""*""""""""+""+"&"]@@zGzip'"""""Ub&"bv""""t"&""""b"+br"""F`r"""""""Z*bGUDuD""yWE"y"zR{rEmG %{PWM p}Q۵w[z pP P Z uW}uZGUDuD""QKuM}UUYG"Pw"tww"g""W+*WvUfP-"{pݰDEFpDݫwpDջ}Tzru!Qշ BvwGtQۗbwwy@pzz}+kKw{""w"ٙYi+'""B'Wp WR@f٠Dz*Йw+TuuGUrYuT pg`WYyM"J*{{"WYuWU%-@ }v'w GP]w{wggw&"w{]uGr"]!*p'PwGp wz Eptr*vGtpGpttpE pPp}w}Gw{wggw&"TwvwwwkUwz+zzwt" YzwdUbpbj z}w*"jM }w }WGfv IT'{kg"tKDwwuUd}zw wzMwvYU wTKy rwrjYt@w*+"DMw*bwdp{MKww}Gw}wwwGGw@խwG@wA p]*z gw}wK-Gwr}I$j+w GjG""""""""" "b"""Ҳ"+""""rP'p&"YH"'"" "'"*"""'r"y@""ҷ"DZ""'" "[D*G"""""""""Ҳ'&"""""&"{w{""u+b"""b""rKwW*"""""ub""$ wtf"""xXY"""rgqTp+*By%p""""""R]"BG'""ZwB"""""""""b'w""b"""VwD*" ""&"""rb"*jb"""r"eU*Gk"-P[ """"*""""""+rew"""rvptf`pT""""bJGMu'"-""""&"""b"""&'pzt"+"""""""""&b""wbK"-""""r'[ b]"Tu]E"R%""D&$rz"*""&"rfrb&vd"*""'"B{G'+"""""""""wg+"*"""&"rw&gkb""""ٕ(PY}y"""""y"kjP""bkrgPM]"""ru]]'kUMaVt@"""""+T%""g@GG"*""""""+t""""""$'*"rv""""""""*"'g""b"")BAg{*rKFbb"*"""""k""*g"z}ub"""W{*'""b""{uw'"Bj+bkJ&""zf 'D w"{}qwp""t V"G@"J "ҤD% Vpp@tvBI*%uG}w pMdM@dwMԠF{}qwp""{M{r t`u}"rpJD"YMT&"&B[UP!"M K"*ZD%"zP'RptղRw"PZD}J{"%GIr db'zwݤw RIYEwGw&w"&+Bj"""" YQ%" """&v }Y"ZZr'" r""wzw@WU wJv"Kp+"k*p]ݪ**"T &K"B"Mԭ&""'&GEf'+-Gv{Bzw+A UR]fpM"-z}wX-@]tpWgw`PEU}G"&@PUUU@P z%GQQIBzw+@]P]U]Т*UUfwzwt*{""w+ҢpY}-btp'{{W ݭw&bvw@W&Բw"$"Utw&rwr'' zw`p YUUpwwPU]YRPYmp z'Kr Y]D'R*]ݷ{$bBIe'}rEtם]v]MYU Z y]]ݙYY@Ew-f]դUpw}t U%GYUMU{w{"[ՉATp*ww""@GGJIWI"z&{y}GgP @@Ыu}ptw]ՙБ}JwۙtRک*uU*ww""Y]zMGtYp"{]G"yb$M{"rT zirwzwzF'++r'v} {t}wuwѷuZtpGrwיUwtw'"j]UЫUYYt{[}zwItb+I+&Rwz"""fљ}"mr"bkY JwM$yZUJDTYU&TuJ@r}P{{$wG**WٙU t"YB"["٥* wtzUPJ% M@T]""""""" +""""*"""""*!"""*b&""""""""""""""""""""&"""""B"""""""y""$"B""+""""""" &"" `*+""""""""""""""""""""""""""""""""""""ڻR'r'""&*"""""""""""""""""""""""""""""""""""""""""""""""""r""""""""""""""""""""""""""""""""""""""""""b"""""""""B"""""""""b""""'++&ڒ""""""pp""""""""""""Y"""""""""""""B+"""""""""r""*'""""&"&"m*k" b"F b"&pj$bT[}+jpwPttKBM[]*t['zWt"з""Mн'""""&"&"Tv*"'"""&w+*"+"++*"F}Xԩw &b wbbrwG"r+ZMM""*wpPR kfu}՝**v& uud[&f+"""""&+"f"""d""r$kJ+B"Bek)'dKJG v-jۚW *UtM'+ "&*rjש"'"zI p{"*""{է""""+"fpu'pZ׭лb!"""j""t ""r"b*""M""'k*z*& $""gptKt""""r*r+&fzDgKt& '@t+g+b!"""j""""j**{kb""""kg'""b"r"+""b""fk""r$"PPEt""")zbk*{""bz"r""""""""+*R&+"$""g"+&"r*b}wpW}&r" r'&p"")"r-K'""""*+"""'&""""&&+"r"{rB*+ '&+** t+"'b+&'"& W-"'@r&r{kk"b"""{'"""+"""rx$vw +rk""r+"x'"*$Y$rjB+"&"""b&"t*&"""&""""b""+b}"'+&&rKRe""+"""rx" z'w"k"&"'+zk"""+""+""""""""w"BBz-*""'""""Bk""""""""+""""""""""'""""""""""""b"b&" "gwz+""""r"""""+"""""r"""R"""+""""""""b"""""--"*"+"""""""+"&+'*Kt}f٦&bb"u]w""""}zK'""k""""+&&r UwW T"""jU-"B*++"""@Jzբ*%rf"y YvTt{Gu-I-&ww ]]]ݠU Uwr M'tM}T]"B*++"""}Ԥ{tWU"zU]U*{tUVr]U"g&"@Jgbz+"GQ"{'EyEbU]{]J{GU]Pwwu+""R]wrDGKrQj&J UUr pפ"'Wb{wzTPptYW PP]w'{ptUWUpWװUu YQ uww"zrz WMp]M'tu$t}}ruww{Z  W]"*""b""+"" rwj$"r&"Upjk""bRItBwpw " + }urڥvr{FU]&Jt" W"kP'"r VU}"*""b""+""WTwp***"w{"""{'b"`P]%"&w'"k&""&՝B'rfrj'"* պ*jbw}w'tw'zErkZjzg""'"וr`t$"@tw""""k'&"r+"j-}{- rrQ+d+""wGuhYYUM]jj'QUUP")ԥy+"r$+"&"G`w{j{z""jv*zwzE P""b uY}J*"r*bt"rk"Y]z&""&&"r&}r"P"y"pu@*vrUIvgzK}yg"'R]՝U pwWw["T@&""&&"r&]PGw&"Y"ՐU"-bb-׫ RU-r{ Ww` [Gww$""zwՕb'[DҙuGrDBY*+*"WQPAvtz{wwg"")""""rwz&"vU&""pqU''Wݕw&R}"G MYM YUU ݻ{ ]UYD@wg@w}Uyz"Т"*"w{BpMwYEt$w wKp +""J}'"+" v""RD]` QYE{ww`Mktyz ]]JwTGp"tz{DpwKp +"" wvvdbG""g""P{Z{wzjb'""uMz*K`+wGݭ jںU[XQTyqRw z*"tx"]Mwwzrz+rPMUtT]Muvrrzu tD ` Wt FuwTP@Yڧ&+'&bp{z}ggr uJGzwDwz"bFzzz {@"grMtUק"""`v k"z""KE%+R&r}-DJ*rJ}`bg@ tYeZ}wwf++&*wK"'b eK$*{@pGt"""t"[ Qwb""+"z"'"r """""""rfTT"e"'[*J"R+"" &{*" b`{&}"-kJ&vr+"""&+$*"%}+"Ff'z`bwzz"*r*r*@w}'"{" &P]% "&R-rrUu'""'"b"b"&rb"&v+b"""""""v*w&*""r""""bk&}&"*W"'G&" +*{W-"t"""-w''"w"wG`w'"'&@'+"bG*pfg&"++$"d "p+dkBڷDk&$rtbu$KwJdKv&T`brbF'"'&@'+"b$'r+z"b"'b+*{""kb"" u"rRU P"B"rFkrgtk$j*& ""&""Bf*""'"+"""'"+"bk+"+Bڷgzk {"&*b"""""+"""""""ftk """"""""$bI'VGb*"&""B"b"+"+$'bkbbw+"& +d"r+fb U@uK """Բ"*""r'r'"+$&"bp *"""+p* wtqv"" Ut"E"j)J)M V U ݉GI tGPyz U]UEU zTzRdڝi[ ԝ* wtqv""ݰBtIgPU"W"}budkK"bRU{&RDAU"wu$@Tb{ٽEfTpU GIRIV" ]www}$"-UЉG]*YQywb}"+ҷz""""]$F"'+""' }@"P ]Ы@TWUUUU"wpg{JZ"U]U@Pbr'w+'pUUՕw"B"*rV"Ei[u--y{-Y G GW "Rz'-""" j"D"@g"J@$+"bkj"% pt-}Mٴ"b tKGt J `w"Dw @@J"Rz'-"""+m""rb- pw"wr@&"rk*J'& """p{"""&"rbt"U"z}vEb'ݴbzr wD-Db{ J'k"Rbrp -`rvgi+&+R٩]P-"@%u"""w "$F""*`-"z"*B%+"gpz`"kgzvgr" -z "j& {׻vp`f'wf"w*"""b"jBw"tw M++v"*wݠJ"r G{r{z*Zw@} t]Pם+PuGYgt`tpGpDw]u תf]GWEUPw{q{EzwGr{z*ZwwMJDwTGz@@uGUu] t+TxT*+ wu{Jg Dw'GwYpG}Pww}@"F{WWrt@"y UEDWG@Iw'vwwupDwT]Y]U }zwgGw+'r' """Bwݝz'&'""+"{ u+Z{ ''pvw]rݵwMDwQX]EDpw UU ]t}  ]}'wvt"q{utT@]]p {wfwwwrwDr+""""""""$"b""*"br"J""""Dd"&"{y"Kq)"Z&"" "$yj +b&"*+"rM"*rB""Ju""+""""gr+""""""""+""""""&""b""+&bB"{b""rRf""""""""*JD&"""*&"""""{x'"""Rp* +$'Ak{d"Bb*"""r"+fbr"""+z{"""""""" """"""B{T"f" "rbb+"$'w""f" *umG"t ""b"$""""""$"""" K"""""rvj`{"r[mz""""kk&b+"""&"""""""""""Wjw+""'"b""p' '*P$K""u+BdF+"K ""$w """"B@@DGGPu ׵ -*""'"b""p'} t "*p "P}$b""'"b"F+"R ZՙQ%*""}g*+g"+&b""}z"v""""-""""&"+ j""R '""gp}tw-""f+*r*Bݭ۰bz&'"Kj""""" 'w"ur@w'GYٙ}HpwGpUw '" `@++Ы[%UU""""Bz+tk*jt""} uWu}"U}}w&rYF BԔu }MMUЧJW*{T@ Н}tZUеJT 'ptk*jt"" ]wt@ PwU"w"T] F"r"W@}g"jpj ""@GT JWMwPQUzv Uwyt* G}w]epj]}DwwwDP@ݕuwuJu*B{vU'}{ ۺ+w*'ZMժtG{ պd{ }wMGgPDE PYU} zg I UtMjzrU] UյJT}}w}ukwz"r'Tuuwz+{wpJ& Dw}rZBG%" DEwݠ Up UUtwuw}t[w}FUUUUU]EwDrԥWդ pz+{wpJ&Yu@tt]"]UU]PBKJ{{wj+"rPݢ*b@TtPup wYpzZk]DUњ}byUYtf''zwEuwY@uwzDtzfzb&B$k&"&I]z*F+'B"'ZTjjy*uWY]@Y]U]TMEWFYzGwUU"" Pb]WPڥ@zDw*kҴ }t""wrBjB&ۙwMp &P+ zԦMG]F"EtDvU}bUGTYE@] GZRjU+UDw""wrBjB&ۑU+q DG] P &p}v*w*Z'"ZIPr[ {T@ݰp"&gdp}'Bt] GzzB+EҕM+zg{U "U@GZ uffD""w""w"B+'" "++"T"jWT'VjI' yZzҽYupwMwԧ{ UU{wGg UUY] }"Ur"+WU+UYEI@wwz Ebr'&&""""&+w"k" 'b""W J'WB "'b&@PE *k"{w g*Pz*{ "BYw*w{GEbr'&&""""g+&""{ww"r}z""b["w }zw"&""zpw&"`p{ "X]"b&YTPGyMTqg["""rr"eBEww'bUE+&"""rz' +K+rp٫+p rw{۽z-ttz&{ZwGu}wwzj{f+"b+'*KݚTw]z{v"w}]}u}P """GWUUww*w*+z f&{wZMYzG'""'" `RvPVw+IP!K]W ٧Wrz-jb z&&ugvt MDptKз"VݻPEd'""'" EgW""ekG}}Uy} j+&'q*]ՂUzzt{tRuݐ"**`ruMU"b*{{QMUgwtgY]Mwv*$r{*bMu}rzՑ u'""""*z+&b&"""+"""""&&&"fgbRwfg*vЪkJ "zJнpjzvgfjj{jwK}M{wpՕQz Tt"}"""gݻҺ$ PMzYݵ"Kvbw{GҠ"ezt}W "]" Mו]TU@Pp MEP$BgDT pD t] ]zEYwGҠ"PPfvvwzzpp"I]]w*"rY* -t T%w] PuF UUUEzk'uTRGu t zP'TKKGpUtzڧP "bJrpк'+&+E"D{ֶ't}rGzpGTGt wEUGwwDw} U֠*bZprwEYw]*D{ٽ'jrtpv"""""""zP}P%BZڵ"""" "+r+r""$'""'""P-"k&"""""""FdTFWI&@rq+**"Ra%"""""""zP}$rUU)"bd+*׺-'ݵ"""*""*"""""r""-"{ "'!+""z+b""""B&"""""""" ""f"B"""$"+""""""""b""B"&"" r Uu%"""""""g""""""r"""""""&"""""b"+"+"""""'-"f+" """{z"&*** z GeQY*g&wUYt&"""MJ$w "w+""r""w+"{W@"r&""bQ!]"wwu{"bypwAq" u'f[uUWMZU UTpGy}E]}y@wWUY ItUTRw*w]]Pwwu{"bUYG YwwG"Zw"JrfUw W*brPwpbUWuY*w*]r Aup]ջIujٰQYwp+JwrvwUyTU{w եGU$u tMW k&JUJuzjԐY"T {GzYѤIUVU]*}}pW"TQDw@% WY "vwUw U *w} z ]UzpUU D+tuy"" "D"$b+r'+R - p`zG` +D+vpzd@ @j$rtkrzpQt D+tuy""wr `pyG"B{{t"p$b+r""""""zG"v"w"'" "bԪ$" Z"B$vz"%""w'JJGxTG-"zf'G"pвfҔUE PP""*b""BE*ݩ%w"+"""r wb@r{&B'"r{ p""++JW]Y&tjzZ+ }J`+&'"""+rw@"&" *frF"rMpQtݭ't"""b"rrz"r"""'"} $ Ut"+Y + } ] *"ݠ]yԠBG"{t }Gp U p zTխ E"r"""'" ]M-KzZp}$" }z ]}W "b&"}z +Z[}&""YIWpz ItPBwFu +"*+"Mjb-&u'*"v T }`j]Y Att'rݢwmRUзKv%-pu*t$w`$ "uwzrtmwwpw{U UEW@ pMݤ Zfz՗u" PzWBM""""} Up +' *""E"R&z" k"zk"""z g MKMJJ]er-U QZ*"BzЫJ +{MGwz"f+gkM ' *""Tq*""""k+wg"+g*+""rrb"rgz"r"}w&""pvr **rw''p*+{ְrrj'z*Jvk"*B"+"Tթ]mrݦ%m""""RU]-W]"vpPT۲"gg*"rz++ p%+'r j'Z*"+"""g"b'rGf{&vjftdzgz"$rw""&&""+*gk"rgbzupr++f""b""""""Bg"r""fr'""b'&'""rt$r!U"]y"$r$"'{"'""""rrKj"d"""r&bM""{"& '&&"b""""""B"$"&""""'"b*&"wf""b"""""""}uu-ۥwbr"""GG""""wI"""'Jי}]"""V iw+fp!'r"""""""w$r$jzp"*"&"""""*"""""""*&""rr*"""""""r"""""""+""""*r**+r""vb"+b""+"""""""""""""""r*tb""&"+"g""""r"""Jb &{"*"b""""'"zwg"&&"b"*&]G}""}UE۷""@t""&! K -zpp жTp ]U D t{pK@@GD*p`tMJT*&]G}""TMЧVWTw"fzz"rm*""Ҳ !"bp`bRr'"{BbwJ vM@b }" 'zMu'wtP $$жWJr+PUEp@tJwQ'"br""fK -beB"b)Ur+ -kF"'F pM"+B"tpww'Bp"*"*{wGz"r"&r"t`z&rp"" G]JGGU"r""+"&""`&btz*U%b"rt*J ppקUgvjM кԺ+b+{tDwJ}GQF۴}*w'"r""+"&""{G&f"""Fgkwpgz*tQ&}էT"*"wY K kr' ץGw{}*G{r' {*FjbgrPzj"WkQzgvjڦr *""tUzwUw&rgfD"b'"&""w"&g vwrwDw&ں{F'w{zj׫ v{gD@ &p@Yp`+GgGEG+zG}t"Kb&b"ryGrv"'"r""b` -r$"Wxkw+''f@&&"*vD" &K""{'"k+rzwkwzpfV""Uz'"r""b`uzzZ ""G"rGzUwwwk*&"+f"""{rzrk&WG`p""*""""""""bbr""{b* k&"rb'"""dJ" E ]Mp """"++"""""""""""rr*"""""""""""fw""r &gz""*k+wzJp*wz קGk&"+k}׷]""""bJ*"'wz{D]YwVФ'"'KwЫ"""""""""" """"*""""""""rm"J"I"y"$""*"""J*"""&"A]"+b+""WE""*""bҕ-""""""""""R&"""""""""r{"""'"b"""R""Ww r*b+"""""w&""""b'G"""$!""" $'+ղ{f+"d"""b"'J`&"""g"""""""""""&f""""""b+"b"""""""$r${""""b"!X D")[Tb"r"*+""""+""""j"""""BpE"reD """"zMev*"+""""""""b"""V}eQb'rDr"Byj'V+TTv"zIM@$wוYUWvI՝ mUG@]UgP]PI' u'rDr"BTw}kZp'bYDG+wpVGtwRUUU m'ԭZ`wt`&g T@UrfjWUIURIEy֙j*j{KJZ-YvQUJ kv"{p)P+"w' *ٙYYbFPx% ՑpڦT]]ٗYw'եНEGz-dyVY]fpG]ݝY P"ݲ* DE'DrW Du GjM}wp"&" ""r`r@w"KY% "u(Fݲ}ݧ׽R$rw$@*"-JGMtzp[r"P'uGt"&" ""rw'pj&в""*wt+ w ww"+F"*GYe`IUU)"ZGg{Y@""Kԭ"b'F @WRGw]+ }w{rw$"RMZGR՝]׷F b+*D""+""b&*r""" rw*jB"r""""g"Rڢ*p+&Pww G"gtvKjz&GK+g+p{Gjww +""w"k"PGP'*""wbrvwU*{F w"""""""H$rr"&""r"")"*"P"b"""""""""b""""""""""""""'" "RZ" "B+}""""W'"*g"""""""H$"pw '""g*""wp*"&"*""""""""""""""""'"""""]%"""+b""""""""""""""""""""""""""""""""""""""""""b""w"" $"+"""""""""""""""""""""""""""""""""""""""""*'""""""""""""""""""kg""""""z{""""$w"&"""ݧ"""""""""""WKbb"""""k+"+Fw%"K ""My}"B"pg"'k RM*wG&ݹ*@YTڠv"" M{}pbGrDDqr ty B@Fw%"K ""wתPMuwGr"" "f&*v+""""wKbf*r{۠mw """}T $R Ww"* ת"w'+"G+Df"++в%"v!Tй* t" FwUUJFZ}t""W{p +""J j'+"ҭ"-**t"*"'ַtJvwj*fu}zJ}ww&&w +"'ptD*@{g"j"$tUwի'""G' JDw"KBv"dwvwM" W'"-[p-PP]T yp"d*gr}нz@`w M*"uUw"KBv"wtprw{jkwM+JTח"DP-"$"ڧ] pu"BڲE-wKp"]"Kru"jrv Z"zD PE%"+۽UGPTK ZyzKg"zfBw""&""""""עk-'b"*"""" Gy&wV-"+{۫PDB'}{@W]"rz"ttfzwײ'wdJw"""pb"P"W@u)QbeWU]u+{ w}{ٻ$"" {G"'""p)'b{{ r @+{g-"ҴGՑݐA$vw "v$ p $rr{j+B }{ٻ$""IMjw{$r+""*zv"j"r&"""""Krr"f{z+""Kb Grvk *M" r֢&""w&J'$"* ]]Pu]-"Ҳbb'rtb*B"Vyt@&kmK+} E) !'V%p Drm 'p) "&bf'"'vd"f*krk'g"""$gkJjtb""p[*'[ "{W"jkG&"g+-"B'uw""Kzj$p-zm""upG"Y"-z"U@J@$ѝYPmJWMkgp]]UPUwUG} EԐ-zm""PUUt{@wpt]U"UTU]" YT&r"]"'"P&K{'"]{P W]ݶgwwV}pG}+Eyw&Z}JuUmJWUU{ ݴ[}U}wJU{%Vw 'Pw'g'M{תMJMYY{pԐ]U-U@EzrPUUuJ }G"@K]M}mtwr}T +&r"*&rw)d"W twg-'"P'p`&&J@" *b""*"''r{fzm{@ @JZ"BD&B w+&r"*&rwQi""M&Jww}wdvb*b$r"*KwtKp{r bbZeW@z"""'""mw""k"z*rT+"+""""""*'"$J"pA-"""""""""""""b"""""j"""""""""""M"rr"$"w-kfkb$bem&+Kk"vB*rw pGkgG @t{pU""""J+pGG&B*JwKMMYV{+'"Mjz+wwwGw""}DwMW"&peڲ'B@$WTYАUu׫}@]pwywGpuYՐ YQQ}pFUrGuGuZP}+wwwGw""T]wGpwGwtY"TU&}Mu}bJ'bTM-{"zwtJ$"k{wWTu]IuUPPYwu P@YwP}EEY}׫]Uz{w}pwGw wU- P&ҲwDUz*ww++'wwW ]Y U Q'qMYU]Pt{gwD Uuw"G{DuGupArkY@}TP]w"r""*"*""kbt&"ݙ "KD MtW`K%M$` ppt"%wz w{f{pJ*{VQ@&B@w*"'{t*"r""*"*"Ug&"""&vgbvM+"&"DI& IUYw bk+"J@z"j"KzD{zwWtM"b"ZZMpGR tKE wtrrGky'wWdK%۫Pr`&B*""""&f"f&"bf'""rWԤj{""&"d*J{'r@[r+֢zwzwzb&b"brw"Jg`&&+Uz""" "+ڻtDw*"+*t+"b'jrwz}p% z{rb"r""*""""""""w"Mt"M$""""{G"t%BM"pg"-ҙ$e @j""'&Bkv""p$*B""*"Dzw"r""*""""""-'b""""""r{g"ҠGw'"""""r$ "'""""w$""$PU"""F-ַp"""} $ Gݽ}wbfb"""rr[+"U-ҙg[k'B """" uU""""Z`*""ZB b$Ҳ"''""&"rb"""&%&""b$*krҲk""&"""""""""" k+G """tzb"$m"""""&*&"*" &"fB`bbkrEbg{zrw*'*z&gzmVкԫK]pz]pMwEt&ZpwvywG]tfzGZ Ez ڭ+R]M*'*z&gzUMuz ݺ}}GWg&Wz'UM wٗu}wvwt{wqp{wGEp}twGwwjtw}u+"r'FWpwwwvUYݙwwGwww"gGgj{'rzg*'&GDGfrjBr`}jjiWEg]'T}w} uEzz zptUUG`ztY՝] P]&"vw U+REW PPg'}ԧB'+""}g*rr@z"tMe"vԠ$[vUY + t TP " %Kw G p{ rdp"vpGGzԧB'+""Mwwtk+""w@zz"J"" wWkrPWUv*bJ ԪVpt""]YY"'TQUqTI Y} r"br}UUtp]Mբz """*"{""Ҫ-W*&"}UE-"'W&"+*v "P- p}w{'DUtwzj'r&""Gvz}Ww ktUp "z"+rwkwp"v'{wdwwwt wj{gRXAup""$pZZ"K""B*"$"%)DTK[PݭMTM I%D p p $D@ P BPRXAup"""wzwzEJ@j"D" -""{""""""D+""KB*Af*"W%"`B %`{eG")pB]E-۲M)J +u&"KzԠMT{ P " RI WEP*"Gu"" bEm!z' ""B+{rDY"J "e B""' v+ "B"*"BM@*trjG"&+&J"p"""R"P '"""**&ۤB&Dpբuw{T""MUx}W"Bp"r"' @Tgu@p YM+Q z{}`)BDvҩ I]Eyruw{T""M+UTw ""{"W%b'*"""""}t+ r"Kk"rz+""ڴZ- -wGWUt"*}w"'&"'+wUy* }b$"*&p b""rG՝BwWr""Eٽq'""&[tzbBJ+p%&rgwr""jFPݲw WKР+"j"&"*BpGp""Pg""{ $I]*&BkrYyv'"Bvtz M"GPE""$@M["p"&$r"+*& ' Kmwuubp@* kpg @vB wmvrz"GPE"" t"@Դe""@@w"M -""r'"""""v`"'"bp&" ""`['r*tYw 'Ч{"%""t$wtwPPU-"+GwubԢ'@'w""R"q' """"&ҥװ gA'"k"bwr"&r&ppb`FTb Jw*"+"$"grt"r"t'KbW"@ w-"ղ"}r""{vzvwG" &'""rz*"""&""BpUEWݤT*]M pw'}}vзJ bP@&J'TPG" &'""wtrG"'r*""""""zpv"gk*""q һz"FD{*zZՕPuЪz$IGjw)}%rb$)UquW*wr"rr&g""ڭMTmU]ٵR`jw*+`$ ]zzw wW Fgt-"+'" "bzvpp+"" @zwz`uzpJ"U@ &Jw&z"""zw}QE}P۫"("w"{D&&D {'"B*" "g}b' K-*J*` " WZm"+pw{bwj tzBwW'u'{*@}"("w"{D&&z wTлrv"""+t""gzb+"""""+*rg+ pwB"""ygrjuZ""" @pZ"{"""'"Drr""Bbd+J$`w` ""wrJv*ZpIB-p%{"rbҺm y'&)*p&+"g"*'"fkw""'w k{" wv'''"'vwGbUw׻"'{PMzkw"b""rE`ݧ*'gwr"bEY]wb u&mz"[!uG ]T]EI t}EzWUU @@]UZUR*r) *'gwr"bUYDWM ugPU" Pw&`I kե' ""RUv'Rwtzzr '{w{J-wU"rm׷`GKZP"zUpIЭ[-"'] ]YMw Iwpw`}" ""rg+"""ruT"" r"'""*WPMWpZ*]DGpUR*}P@wUE]b}vR"WU]Up]r@*'Y u"U"&bK"WՅ)ۭ- GYQYY-J+""""""""Md"""Fg"""p +""!"bm"%ҙ"i&"$"ҧJAW{`}"b)"rDMa+""""""""ի' '"" " j""G "*""ݝ-ґQ{&""bZ'R%"-d w+"""'t"""rVUi+gґy)""""""r*Ґ!"bB״""""""""$""&""brY$*Yy""""" 'QUf"B""UۭGXu E֗qj$&""*Ҵ% zQZz' Y{QY}w""""+B)"ҹ-B]"*br{*tuJfJ&""""""""}""""i""Bd"""""Kw'-"""ת}$"%""%"%[XB$""""rBIdv""BR+DT"*"B-"&J&""""""""GVig+""""""Wf""u'r"""""b&b&f&""""tw"*"""""""""" """rE$'jkuvp&B"+"""rr"U&yY-""gי"+""""""P$"""" ("yU""" Tr* """"""B&`'f+"!$rg"""""""""""*" ""r*""*{pK){""""} U}r+"B%%%"""*"""""""**&"vk+&rw*"g "b&"r$G"b}*bK"RDpJp$"$ ] Kp&"b$wwz$z$jzG t`G Y@$Jvk+&rw*"$"kt &kr""k""""'vg """"""DgDr$ "֧"f&+$""""UMuZg 'pJGr"r" w"r""'"&m&Tr-*""+F+"'"b""r@ݧ}][p"E%"{rr "E{rf&b"""b{*"Fbp+"""br"r"""g& }Fw*"{f **w"'r'`&brY""w""k"&@""""-zg $"zr'DGp]pw{ptwz'*$PDw Wt"H"Bk*{K*jpGtzGP { zzMK]wt$"zr'DGp}[qww]]M pzmGz" ""+pzwwBR WMizGz+BKwv*"wz"+v"`"} p'@'""z{zWt"UH@zz*kg""b""b"b""j@g"g"*&"""""r{pz$"zwzwz+GJptKݤzG MM+'fw PנwG]$&"V @KdUWݙJ@'t"wzJw+""""""rt+"& p&t""K ""b"B&+v"++"*"r""*"JB"B$*bW{@B+&{rDmD+""""""rt*+zj&""*bbb}p++*z&d""-'"""m$r"+" {+r*"Z'+v{k-""b"&"""""""""b""*""""""""&""""*""""&r"&"@d*"""""+*r"""*"""""""&gr""&""""""+b"'""" ""&""b"""ҷ"$"*b&"uM] ' M'"bbwY""{w """]л""br"bb&{r֢G{vG+""&+EE*`p""+"B"%""M"""""""""""""B""+"r"$'"""""""""&"B*"P$(""""""""""K""""w"*F"""&f""""+"B"%"""'R"b$""*"""""""""""" &"""""""""""""""$"r""""b""""rb"b" """'"""""""""""+"""""""""""""&""""""b""""r"""""b"""""""""$w""""""""""""""""]'-%&{r"-"""b""""""""""""""""""""""""""""""""'""""""""""""rB""""$""""""r"""""""+"+""b"""""G[Ep""TuD{t"UaQ+` E)pPP}qp pw yJI G@ z@@G pDGwG[Ep""Ф[wUMwpGGv"Um "RҐv" {p]%"wymWGUUխWf}y{r"*]qRgJw]wݠt@'] JPDpzr""B'r"""rze)w'""*"{Mв +]*RGzzpu r"@p@z  mUzdg"B'"JuG*'B}pwj}zw""""r+" @Em&]@P@wr}tPwz z-j P"ս{"Jz+"zD}@G"K@+Ru*z]""""r+" @yZtmqkUpt p@k++""v"v'"wY*KwjuZvj*'"$"G"wrp"+w*}+Mwע'"+&r""DT"]UPW еf"*'"bb""E"&"rk"+"+""*""**Wvzz]}GpJڧ@ @zFGzGt]]z "&"jGptwG{k""" E}*' YUk"wdvU+"""""""""""""e"RF"bP$""""rU$"""e"%""$" bP$""""rbrq""rZG"P""-"pWU%+"""""""""@t**&&""""RTb""YY+""""""uz%@@p"""""W+*"""""b"""*U"""rgTU "*FQ%R """""""ٙ-""wg"""""""""'P""""""r%E'" """"REP%Vyp"""""{t*"!XJ""b""""""""$&f'BIYrK"""& ݭ{yW""""{Q$"-''r{"""r'%Y"%ID&"YqE"I"E+mw)M%ז@U٭MupRu+QQP U}rUDq E%ID&"UYUUWYUUG""P"UUpGz"b""Mfy+{U{@R]%"m[-BPu-"ڥuUu{ bwE$"{GDڔUUժF M Чub"kr"""+EUY)B*br""&T ]}qZ"Yy$VWR}rUUYYv uzv"U}z"'U'*Y UUE@"K"G"Rq%`}лU}G "+*++r"vMz{QF&{]++wG *UPUU&zr}$ W}k"k]]ݕ trd[u"REQ"+*++r"vDUw"]&tQP&*b"t k]*" Uкrw}du}M{wb"*GYU" * @VYY*{UiYU"+"""*"*r]r] {zGpw'"" """+r* ''"wWE"r'"+ "'{GYݺ&r&Q qYUvu'J D]UYg}pYUUAtw"zB"+НUu"R Ftu zzv -UuD]""+""""tt'j+'+"b""$ H$""P*Bd"&""""*"""f&"""""""'""b"*iB"+[Eg"K" *@u""+""""t+"Bww*""" "p"""""b&"""*""""""&""@J""b+Z-r'&"tp+"""""&"""&"""&""""""""""""&"&*"""b""""""*"&f&"&""""""""""""""""""""""""""""""""""""+"r"""""""&*"""&""-g"G{*"b"gY&&""bb"""]YD{"+""""J"""{vr"""""'w$ՈAԽ""-"Bg"" Rm*R!$b)%]}A EХ]UA B`@@`w"M "'t!E@$ՈAԽ"" "]Bpr""gF"Q%""z"""""r""զ"B"F"g&u-"%B-'!"(w*r"r(`'"+*rz@""y]ՙګ ""*"""")'Q-'+ """'Bp]zUr""p"&v""+gr"@"`+-"r"t@'Br""]K"*+MнM-"""r""P""t!P "z""r uۢ-brzD'& +"DWIz""PWpb&BMg+ gvwP$f*DpFjp"b+bzzKt wݺw] F}@p'D'& +""r'b'+Ktt{""תk"Gq *"{+"}zu'`"t& UpԷ+"+Hw[GPEm@""w"{+""wGzkwv **`$f*{ vzwpWz۪ZҴdg"br'ڦV+ &'""R K'""b' rp{wbw&zmwtupPw{gwUЧ}z}z++J w@p'"۰pWrwv"r""bF ֶb݅ش"" WWd"B$"-"G%*$'k%)PPMUpG$pv} @r$z'" F-pGD@vTb݅ش""pJ"BwQwUpurG""r@p""]-"""""""""w{T"Arv+"[)""z-r-mPr"g!t' Mre ""!}UU $"z"Gw@G"&R ]Mz u&$ҫ*B""-+-UU)&'b""B" m bf"$&"gp""vB+w"""br"GG ""&""*$@M{D""""R"}zG""z""+{'"{{ U'w@D""IW"GJ"Az ""i$vm-[PtZ`@ݭ@p"wՐ u@w@tpbrBGpd MF 'w@D"" zRG Ytpu"r& B"Yhz ""r"B"Kײr)+"FbW"R+"[]UGK{zz[u}bjp@K[ҫ*pw]{Pub'"k Gp"r{r"RuEDUM YYzW+r"rb{-[ "$b*R VUGPHZ z-bpw"b+} pt"Bg "K"fUk+"+rwg"'"rM"{j[""j"+"ruGzdkrGpp"Vzr""$wD"KG"M"rG- DM`@GEjTgByG Jtv@p"K p} p"Vzr""*J"wr$t}}K" w"e t" *Ҳ { )"w*)'{"Rg"p % }"Ru "g GbAz"'t-""rдj@zԪ*ڗ ՗Gwzb"&"*r"""zwY )B"&"""*u&Z ""wR""vr} U$ @" GKgr*-{Gwg"""""ڧ `$+'$B w*G "GavwZ&"Dw"B" z'"' jvI% eJpfDGuwfpDz@wZ}puwԶ  wB}"GavwZ&"wzpxwD""zw"Uy@'"""ww{"+rPfyGW "*y{pTw" JW"+"g&wp{-+J{gФf}л{GpDwGYGwZ{ "rzwwuٺ'z'p* Twwjfrp+{$ rjz@BB+twzpDz}+}wG@wUw'"'wtwww &M{}"Kԧ]zBzJ+w"" G@ w$"rbr'"r&[ fTT*G${&'At kwkDv{YFb+wk"'vwzpGzpwKG"B*}ww$"rbr'"r&[wzJ G'"FjЙD@wU**&""f{+z+*GDwjrrDwrvwwwz""d+z}"j+&vzrwwG&pw"*"+"z"bbGv{YUU ""++""""b&"*""b j"b+"&"""zw&r{bg'{ڤwwJ*k}Gzzwwv}}wJppwwwwppfB""""b{Ч*ggzpW{Zz}e"{wzw)"r""*"""p*"""rMJ"rM*b"""pb!r"]U"{ }$ vJ''&"*'zwpkvB&b++&""Kp&"j[w)"r""*"""[&`w{g"""""bk"ww$"""&""F"[+kz"&""" '+""ru""v׭U"""ppTJ'ڥpy`@""""rvz"rtuB ww{K""""+ """"""k'G'""rB+w'r""r""+"""rb"r%+""fb"gr"g&Bb"b&b""""++"g"*""p{wv""""""""vp&"'*zbkbkZh+g{v""f"""""''v"ҫ"ҙ ""Fzpj'zY Y&r{A+ Yפ"pKvFDff@ w]@K*P-"D@$j""f"""""׷t'""}bww""]{""""ݭIwy "bjBMp bt}XYU"&f Yx`p}YIխP b&bttEYYr{P&"""@eM$`ҒwհVEUzBt(w]}zM*&zGwjz"ݭpJU&"""f' zK'F]P wG ׵TzG}JrJr"pZ u "p'Zڪrpt׻ 'j&+pww@&Eu"R *w%v"*r w}*P }UPytbEzMDq{w&kِ@ ]YvUw]еG٥pww@&ww@wJPUw""UW@*wJDwzwg'"WY b'"pGWzwr*""MTwPwT}Ыr]Gup+ѷ&p}wYytb Y zzz}zE}wM*۝zwGw@wt$wgFwGuz}tzPT]}թ [QYUM`&GwUUY}Bv]yuGQBGԪf""PYq]zz{wwwUDTrwuDuw wzwWzwuФGupU}t V]rtGW UQTwQJFywMwݫz{w@]P]zyw@PUG wUrtwzruw'{+zW]GtPwwpZYyWzwrw]YwwGjG{UݧwwM"pp&zwr'tՙwp] UU ttwwwrv"vG+"""wPw'"'"&WU@u*GzUx*yJwUp]Xw EU@DYUPБUtw@ݙЕzD{"'&qwIDPPPtwwwMbG "`"w+""$"Bbx'"""$"""""d" z&"+"R"{"r"*K*"vDkrpz+"&"r b"}bG "`"w+r!{"p """"B""&""B""""'"""""""""wB[)""*-$""*v++"""r""*"""""r """""+"""""""-"""r""""""'"bG Z""r"+K"""r"""""""""""&b'""""""""""+'rb"""""""*""""'"r"{"*"}jrb"""&&""f+{dG&"rw""w&wzݢ"""b""&"r"""" wݢ*&""b"""wGiWuw"IR""Dp}*g@ JݧTuGGm@@PEq& GTUTuDJUz P@+[@]GiWuw"Y]Q@pEzJ@"Dw"ҧr"pwz"Dקzq tUWMjtz{@ym DbwDYw}GEWwZz] u"wr ]Y}GGw'y`bwM'RB*""EJYM!JyWU"{'@gp gtGYuMppGz G@p]UU{wk*wUG}U"" W+[}fzwz`Gw U" " $w""tGUUpb "*"d-]]m}"YP"ZDzpw]P ק@}Zivg" " $w""k+ {wzTUe}pz&v @p)Fuf&'u z""""JfBT+t* Tpݚ{F')&f"PZКY("WMt}"TgUY]UuTD "'Ҷ-"*v& -[-"ZU'*zbrrb"+*v'wT-I pyEUK'z"'"z"k"%"U"J}Z%Ub&*wj"v*mfwb*"RfF%"r"r uDDI"TUTM" -t (vݢЭM}Gu{F"pd"QFGpGzwz +gry p*"RfF%"r"r]Fp*M$KpGt"pԠp" z$q$Z+{wJ$JG-' } p""+jgrU}P"*B MRp{Zt}ZjRkwzG" w}Gݝ UwwVYyp""*'p""""r"v"""wM""+""&""""z@&Ukp"wKע&}zwGG zwwBGwwwzbvw@j"Т""gr gzp}twwi&zګz" &"""rD+$vz'G*r{+"P&"U +&Ҵ +& *D""$"d""*"r p'ZUKQ -'Rq" &"""rD+"rG "wwzt"f+""&""""""-b"vge"RzdYY!+""}G`+&"b*"f""""b+""""*"%{""b"$ "&rڰ""jrw} &"""k*bf+""""Z+b""&"""""{*J&"""m &G{*"k"'Mbg&z& ]yաu"JpwU+++ }"Mp@wJ"-j UUvB&"""kщ(wrWjt'W""]@"Ҥ"GG 'F}ww @Ymw}M ݝUyGWפGpGT P{]-zt rWjt'W""EНY@y ""]}Jv"PTuvd"r"""pzw rbwwv*""]y tGYY fugwf]Gw'r}Wb@GW`wE v}FGY`ՑWY]٭ Ruru]]]UU)Z UЕwԪzz'*bMwztzwP wtJU-UMwݭj@'"W}w}Uw]p]QfJ z@{zrzt{&b"R}]p&+&r*uPi׷Ч{$T&)*t&r$v"'rk"E" b""{zGG ԫf{'gjp uD&+&r*umv EUUiz}{zv]wztP{ &&r"`&""""jbkBBg"q%"z""b"rfv"*"""+bg{""""""""kr*"*+*""++"" {fЙYU zvt'*""&""b"""""'&+'k"""""b*&" "+'"""'"G{&]ttw}&zYk&&+twjw+"r"jjpz{JQP' {}%zk"''&"""}vwt+"G$&"rW"B}zy ""&M ""b ]]խzէ&QY+-k"''&"""wkvwGw@@+"wDzz"אԝzw'r-tw"k""W{uR+""""DUuGzw*yPJrmW z"k"}Ayfݭp'""uкpkff*""b+ݧѥ vmBWzGj%-G"b*"}ZzPDezwGE]PWM)uYUٕPнvTwwWwu}wbwYzZ]YWG+&j""r&U "w@Et""M UbY"QpigE-wu RP}Pu}tMYEpZU]MAՙYUYMI B }yՑuuw@Et""pWݐ QYUU"НYU"APMujt*r"U&pz&PrW t '""WMqZTtݶBDYYIuz}$UQԉ !vUu]U}}t]QݐݙMzuE]"rbIuYհtd'+F'Uu{К} pw@ҧ YZwYPYP] Ppw*w+Y ug"WݪG"YyՑY'Uwp+&Pp[]w"'{ fz"Eu t"`"p}p*+PY KGݪ]GuGjwDPTYqJwGWZt@t }"[U"'{ fz"E]w}w@w"bDTt׶"zr"t"&+""] BpԷz]+B{ww}UpݦwIеZUդuFڵZu+vvzrGWY}Gjիkww{zk t+g*j-+Myw J gtY twե q ЧPtzJt}gf $kGd]]]w+*ݙpM"{"ZUG p"Ҡw FGDս+UUUG]]uU]&" Pٝwt"[wi P PuYYQ] }P WEwtpyJU]}@uזd@pG]]uU]&"]@ݩzz"JGGz"UM""" GPzUz' }p)+zٹ GD zg} ]Az"}}pQ &zz YwGwDQՕUU++K-""" 'D w'"v'wDp]z"wtzw'zJPPUQ"}JwtJ `է'&gptڭ'&YG"+z"w'kMwUY]tzmG{wݙ"k)"w(""@ݥp*""Ig""+$+ Rw*tg"$ TTEI Gg FK "J'{ppr"k)"w("""{ Tw} r"""""*Br" P 'K """""k"K "BbbtB"""P K"J{}""""Gw"+'""+"*'"{-b&"rzg"vBjp""w tYFzyP"""Bb+@bq -@&% t՝ttK"g*"+"&r""'"""&Bj+'"+'"Զ"rz "*"+"+*gv@""v"`"f'{pP'w"$vݷ*""b"r+"krXԐx""m}"{+"Gd""R+%%ڶK`'B'@ݭMIP)"@wD{*wGb *Gr`z$zWrXԐx""d] bMu*"G*""&""b""""""*vBD&"""Y*&+T-""Z-ffj u"$zfwt+"'-W"-&rݲK`'B"Kj"+ҽ&wMНE}bږ"""}%G )w *"'b"rK"k"j%"rJ"""&ҪbwGwۧrb"+"+ "B"$r""""rF""z"zT""'ww'"K"""&g""w{KtU"""""*""""$""""+""PT-z""$"t'jr""""} "df""&"$"p*"rk&"b"r""@jb""tt""+""b"""""*""""""""""""""+""" """"""-*K WuҢ(""J"""r g&v"""""v""""""""""" """"""&"""-r*'"""""""d""*r"*""""""""""""""""""""b'f&*"""""""""""I"""*"""""""""""+"""""""r'"""*"""""""p&} '@""""+"""""""""tt""""""""r"b""""&""""+""""""" F++J@ۅ""*"-"'"&r+Bb"j"v+"""Pm+"b"r"*""B"B${F "r* "" ""+"""""""'"b @@-rD*g """"""""""""""""r"""-"+""'"""""$"&"b""""""+""""""*""r*""""""""""$""pbUTpBZ%+"j"bb**"b""""""""+"'""""""""""'*"""*"""'""""r"b b"r&{"'*&bk}+"b'"ww@""""jrjr"""k"+"""""+"+P [""""+v*&`j"wb"Ddg`p" "G &""{{{D@G m" +jGЦt&rwWpE +fu"Bw w`j"wb"pwgkk"z@w"@Gw"k*"""r"" b""*kvwְ"r"*zMjj&zjww-z$zKzzt"v&{"jr Em"p D""b*"""b+""&B &K""wz"'Gj+'g}fwPEzk "'"-bwpwGtл"fTp]Gt ""w tw"Bw+rt*ҧt@www"""""""" "+ """*&""" `{"" jtj+"]$"ri"yJM"BB+w""T @[t"F ""t@&r""""""""w&&'"" """[+"b"""r""""K&"""&"b"""" r+&"'"""""jwTz'+*"zKr*"'b**j&"""""R&U]w*"rP"+"b""""d'd"bIQ%pdr q*r$*d"*""""({`vwr"""&&""""""-b" *v+ "&+` {!v w"" U}$&""t}&"b+""""B**b+t"""""""""""*u"w"r $"""" g ""W}"%"""-b$""""rr٠M""Vp&]p&"'"]t""""""""" vg """"+RPF""I FF"""r""r +@g""""y&R*b""k"""gWu]G"""Bz*Bz"zU-rkz"""r"P&]P%""u"'""""""b+U"""""" ("]]""b" Wzr-q J""""")U }"!Fup"""""""+&"grjr}Zr+"r}Pt GeG@z"""rWxG'"ҽJ"""- ""b"WUW G{f"""""""""+B+"M"V"`""& Pjt"U"-"""'"p`&+j*rGUIkFjA" "rzJwf"""""""""w*+'""""R"bAg""""""z{v*"bѻr*bwMU"`ّU"""vWX!]Y+'B Xwu""""""R"ZUu ""t׽+"&""""""'t"""""R$z'"}w"""""{E*'zקMf"-Gݙ }t"%wQP r+""&fr-rj*+"wYw ݁ """"}p'"r -&}+vwzg {www"""""""-B"YGb*"+&G" z"B""&"b &""`{"&""""*"'"r"b$"r"z]"B+"b"K" K+"""""""&"r '""*b u&`]*r&"+"""""'r"""*br$""M *r"*""""""&""""""""""""""""""""b"""""""""""""b]uз&""*b&B"""+""""""""""""""""""""""" ""r"+"""'"""""""+' """"b"kd&+&& ""k"jz}U"""&*"b""""*"b""r"F"+Ҙ ݫ"+"-r&""""""""""p&"""M"bY """ G '"!"!""-"%"y"""wDYT] PE BԠb"i"wz"""""""""v'k""" "U]}""Y}D""""""** 'Yՙ@*""rp$Rb{{}g"""+z'ו"""{'"&Gr!Y""""""'+!""zuPb"""""""""$""""""$wz*""""""r"*"Н*"*"eP'}PP I &tPw r""YU +"{wYwU p{""""WpUi"-''b'zrww+rwM&{J""")r'""$wtww"]G&" R -PW q׭U]y+T""u G +dp&wDdBMpj-+KJ""")r'""rr"r'&rJ}w"J{zfw"e K]g" *R}vw$Km" "U &V"'" G}df VIZB"w+&%"""ZbW{PX!+fr'f׭ WT'&Bd""""&-Y){++"+""rz%"RWr&""rptb""m-{ PkpyJmdrb++&JdzF*"b""wj-%G""""""""-kKt'"""""""""E&""m"*"r *"""ְt ""{" "%B%" mz&"*vvu׷&ҔD&vWp" *ҠT'"""""""""Z *&+""+"}"bu'rb"""B""r*g-w"""b K'R'"""&"&""bjwyu}"""V ҧpwuy p"""rr"R]Y-B}а""""*"""'""""T"z}""vb+ (X]ug"bd҈p}uw(EF"r""""*"&%rkGf"k'wWwzwСpЧ"""fW*`*}'""*PdpT Mt"" M}"}" DW *rtG -KTTUPI}Y P GY}dUUTU]Y}IK]KuW E ]T Mt"" ] pMMФw"r]Uw"U}pMr*BWY{"@wTptW'"QwU ZY{{}YYMGPgUUYIzWVgwݙ Y DݦBzpTUGtzy׫z"b u% &+w JVBpdwURGM]UUUݪ]E}]BUUYU wpgD]]+GbJgJW"WYuWrUuJd MuZ"'q׊&!""]w d"*""D'"r$"$-zDD&J`" pM]ZGGG"b'f$"@jr+J b vk+B@{G"'q׊&!""۫vV`[y "B""*rv"" e""w"""""""z""G" {f"""rgw+" rz@}+"'"Vb"'"""""j "e*"+"+׶"W+*"+G`ktz"d+ z*G'""Z- m" -Z%z+&"%ҥUx&'"b'""""b"""+K""+f"&+"""""vMk$ *k"K"""""`z"&"d"g&j+B%""*"}{t&"r"vwp*r""""b"B$""{Mz"ri֠"{*ԍ!U" "Bet $-Bf'{"g'rKDJpkbZY"J"F uggp*r""""b"B'*p""" "pwp*ק "*"br݅]]f *"W" ""*{UP"""BKyW*+T}{שG""""""rrTpitPW j g""" """"""gFj""B%j"""r""&"+w+rv" gԫjwr"z*b&"""""""* b p@'' ՙUU t *kr""""r '"'"zjjrZu"k"w'""""""""M"EbWw&rQ%""gzU rb"V!}*EY+}"'tGAZ{+b D""BMНy'""""""""ww gw""+ZUM"vpzz&""""zU Ub+"rWu*'k{p @""rwZ݅""" ]iՙ**)ݙ"""""R@-RU]! ]Urdrk""""-""K"" u$%YE""'""U"'"Mw*B{"y[}Eyt-MZTYg'"b"r'r" YP{&t@ԑ@ }D """G YU"B'b"k+"wjUUGP{g"" `"Gg"J """ } ] ]ukr}jYUg&+{ Gݠۭ DzG]]k]ggudR P{g""WU{*kjg]ݠk"rwDdG"fr*gb"F"p """"p` v"&"} @wM*Y]GKwyPeWI}kpw*z"ZҧY YUukr T]vkb"YYuEtUAQAZ}[ U]yzwpfgMZpWZz'gjwwtwGzK*{zw'tںa]] GggיEtwr+"+R ]] v" "r&r*wJ}wG }]Wr+$G}'V}@ @z"UJ@rzDZD{}wW}zp իj" "r&r*wFz$Gpwwdp}-rw[w+w+zhJ{+BrGrW r$"&ݧwfҢ wrkvbp ׺"`'""@r{vfz- Zx z"PU}grw ]@RMGh}*"{wzp++k")"+"b -z+*{z`r{{kһ}-}j'zJgww wzz w{ݪG] 'w" "}+w % ]Ygw-rbv"wkk+{]{w]}Z+ݵ'Kyzݺ wPwupէGmfUw &JwUMTMwQtWwJw зRv"wkk+{pGuTkww ЧGyw+zJ@t -'vUU+ztۗ}ݭv'kwwwwMUww+Pww{"+Ewzw'JwwwEmf ppwzwDz{wzww+r{j*Bk&uwGk"k}*UMzutGWY}GwwGGGYUYݭY@PM}pGwwUEpuw{rw w]]KwGvb"r]mzk"*Grpu}""GDDZp"BM" b "$"g+V@- @Э M"p}p w@` @GMtD$ڰMmpwD"*Grpu}""r`z"zwwtDu}D""J@"u '& b"b+""ݧ"+B"rbz-+"`@vݧ+wzYZbV {)"r"Z]۷!"wGTM"`Ы BY''{"&"ԫM) wb*"+"'ttp'йY"&&rbf'z PU"@ubT*pw@v+'"'"b z*""t"v""ԷM *"++}gw**"mvwJG"""+&"r"rt'rkk"yG&fw $U"Ky{' r*@*"* ]]٤DIG+I"rwu"""+&"r"rGtpkG*""*vQQ ""$""' 'rYwdbv zUt"""bjFU"wGBp!""b""rf"-By{G r{w'+""'""&"&r+z*"v""'""R}"'p"rb -E UUUPUՕQ}w"z{tGDה GwwUUyw+ע""bWA"r-wkz u K]pw*MGwwUwr{Gt" Mwj"t"@w"&tWEvwMp jzvڝpEY}j'wםZI@tЕzV٘[m"rMD} r{Gt"}MMtz  "M}D{"bk&B*""wut'bJwUtת&rwtz ytt`*KytrPw'W{pwJ@u"vr"BZ]vw p'f'r+''+WYYw vT]"T]շvre}-W١GYqGz[zgzK{"wp}PYww*PUUP݀"zK"jEm"rMקJf&T}wMrbg ]W+u-wpGvY]նPp' twuz*rEW  Y]M MEJG}rbgww ] P@UU]wpP]Y݈+UTuYIG+t*+U'krwdTYYF'jgzG]@ww"uZu "zk&m'EwpPyG%ץwp'twzP՝w]] Wէw w'y"r"խppww'+r"'r"TIUg"u*׺rGТz}ЧUUQQP]PtP@w*tP}t]wp"G }T׺r""BzU[zG{"+"""""z'p"j"k'"""bze&"w}pbT-w*Y{+"brw{uVj"+ZvgZF$"zu{G{"+"""""Z+""*"wrre""P*f"""k""z""{&z""""w@+++fb""&wJe w""JpK+*դdw"z""" F" gvU-wb*""""wjjY]ZYyuגQEJ"""&++d'&'"""&'""+&*"{b*z&{w` "rkww}+*$"z+br"$+'""Ruvb*""+""""r*$v*""b"""+")"""U"$"+"$"""""""""""""$"""""+B*&+"J" " rq*$$"ԫ%!""+""""r*""Mz'""`""""""""+""""""""""""""""""""""MY-b"""'"""""""*"""""""" """""""""""""""""""""""""""-""&&"""""""""""""""""""""b"""""""""""""""""B"""""'*"""""*""""k"*""&"""""'+"&""&"{j }"""" + &""w'b""" ""+"r}{"r"""""՝-+bJp+*MYu Y"VQ"yr$pz -GWWtuu}}QzVuEڷU}ݑu}VMJDWIt UJp+*P]tUp]"bP"Trzp"r"&Y'J" תP}YwJT "BGp $rww[Iwt"rzGwwG"$}Zr$rzwWPEzwYUYU zjrG"bYI mwz'+&r'Yt}JW$Yy$}wwՙWzE ZUP{UYwj{Ч'+[UU}Kкt"YDWy r@FGw"}EtݕUwg{Dtpw +pGtwY]'teG{ zDMp]wG]w E Yw}v @@Gw}zgUY ݕYtJ{wywpwg{Dtpw +՝} wwzDwYz ]]' {vw{ +rU]YvGPPEEwvztwݕUrwwwwtUtWԤ }Uպz{w@UpvUU@GtMw{JkkrG$f'p]zv+G"EwG{vGwQ{wԕٕ] PD]}y UYUUU]twIw+w{bZPzPy]]GGwG@YyTwb-""""JPuj"B"rf"*}wD& JE$GkG t"}  "r'"GKtJK@{M $Bub-""""JK&j "{ Uw"f"" k"kr+"""b"j&w' Bgw{$&""GzJUur"""wG"+b"-"vz'"t" '["'$t"*rkr tvJ}w}'t"b"p-MKз$""'R"v""w"r&"+kw"&FBfr*jvpw]tM} G{t'Ԡ"v{pzb{zgQYw"Ч *Bk"b""""zwp%wz+"""""""{'Bw{ݶf&"*"'bJv*Ff"*"bdr""k"d"+{""j"B" ft& w"jK""BT*B*"""""""+"tJF'""tgkbYHj*+"&"'+"b"bb"j"B"r"&"uJP rt&'r"""r""D+""""""""r"""&""""" ""*z+"b*"br""  Yx]Ui"''"+"""""""""Bb""*"&""""""b"'"&br "&b*""&*"""' "+bfpww*Uk&""&pww"""""""kG"+"""B"B"vY@]zK"'+"bb"&"""""""dF'B""'b"""+"!"""+"&"&"""b"""""&""&"""""""""++&"""rBj &b{dB-i"""""""d""Gt'""$""""*"""++"""""""&"""""""""""""P%+"""+"""""""""""""""&""""b"""""+"""""""""""""""""*""&}*&&""""r""""""""""""r"""""""""""""""&"""""""'+"""""'"""""j"&"""""'{&'f&gR"""""t'""""t"'"&"Gp'+""""*"b*zz"""""t "+b]urkt"" @ ""tM)*GwE%P@Mdt`zppUݙGD@ڽzpJG@JGM@Rwb]urkt""TDWp"t&""bJҷ"wKpZ &B"W TH}twGZ[j""wU{p p]ݦ}jfdD"}{pYvEYt}}`z pw*wvB&ջU QjYZGRzU WU%T-$M{pD%vr һ ְT"{Ffw+&wwzw@GwG p} ׷trJ*"GP*rp{ "U@pKzww$UutfwzzKM Q$tJ}GJjw@}MwGpb*"zwzwp P]wMu}YyKzww$wzWAD`fPUwpwwf{pwGzzvg" r"zDz[pZX'""tpwv P}{www&GwJG"G*+"+rw*` ww{w{zЪ {kWwPWGD' חwwtjF*'Ъz+" *wwbwwrp tu}PTMԩywwЈU}G+wWЪGrwG}YU]}g&"zb&""&"""""d&r*+p""$&"""{&wpbp}"z " &* @w&&"FP]+ z+"jj"vJfwb&""&""""" g"&+"b"ҭGv""wt{""fr""f&b&b"""+""vk+"r"'wJw""&Kt'v 'urG{t*w'k"b"rrw$zw "Gp""""""bv&"+&k+r{K}}"@{w"vz{'tw{kb""*JpwMy"% ]Yr""-""'&""{"wW{{z+"rvGB۩""r"kפ`j"vg'j"""&"Gu}wz""""""rѐ-tt+v ""'"!"&"U*""""""""""""*f""""""""K B &B"rD+" "Ҕ-""""""r-"U%""@Ggrk""$+w """"""""""""r""y""b""Y%r+""&""""""+""""""""""+""""""""""&"""""""""""""g""Wb"pw '"r&""""""""*""""""""""""""b"""""""b"+""""%-"V+"" """M" "&&"""R * +"{ D"""" b b"+""bb" +""rUYUv""B"-"Uk""*++RݥR zrKX}w*g"Ty$b"kkf''w -k&*W+pw{wzMT]Gںr@"B+]zk""*++Ru-w"u*krG"&rfj&W+'"rwWr&uz """*"bf"gb&"*&&b*"++bb"+"k'j'"&$b"""bw mkpWe"b+*$b**""r""b""""""*&""&r""""ru*ۺbj"+{bbGb"g'wD v]ДfҠzJ ' tЪTj&&K """""z +&}WUzW`*'"zrz}""$&v""%֧jzw{""+"!+"+Ұ*""&"p+"TgD"""""Bw pwtPU&pzQz R@ryu""$&v""krU)bb}"rz+ `w{b"""&"""""""&*"R+"+(r+"" +"{+""""""" "+b"b"""*"&+"&&"""""""mz+"pbwUzJb"vk*B""B""r'v""""""""""*"B+"""" "{$""j"r"]&w&D'z"ppf*GpUU&"""zw&wE gwB" p Rj{ہv ""&U)wUwg"r""&"""b$+"z$"%B@""ugk rD" KpdK *+B"'rrBwz"Bdb"bG"r}w&"&""g"r""&"""bG b""zb""J*r& +&$bJ"""&"ZrڑQYU]"$"Ywvb""{w@@""BJz"""p{pGBB**@vd{""""rRb-*KpBz+b*B"" +p""""""""""+&z""""""""""""+{"'vJrbr+tf'""""""""B"""+""&""""b+UtGt """"B{Prgw&"""b"b"$J׷'"""&"""""&""""-""""$"""$"b""z" -"Pp+ {-&*"j+ "b*$"rpBz""""B ""ݠ&"'B+"""&""""*"""""""" b"r*j"""&"j"]q Ԫ""&""'+""&G""f{Z """ i$e* r"bB' { {[kb"""""b"&""""""""&w""""+b"rj%'R-""B+r$ҫ"'b"p"''"""""""""-""r&+}""""bp}jz} '"""b"&Pݭק&"""d"b"+"GDzp'"+v""G}׷""Dٝp"GG"Qw &"Rp$V]Ykw] jkTwݕ pQMMUppguG}׷""GwDz]GWwIGz"rttwF"QYuTJ*B"}m""Gz'w+ {*"&GDMDwuwpuݘTy'pp}Ye Xz} kGzDzvwGJw]QQTQ"uMYTMMٰ$J-WWFEtEݠwY zpITE*MuuGtԦ M}w{yMFUt@v]PY DMppGwbv{G'bfz}+g'""b }jt')zz+r y@YwUyGzEMGp{eDQ p@PwtWժr @{Dw}}+g'""b}PvpfkpwvFUww'GMUU{"G@Mѷzw@$W] u[YQIUU}wWTUtYݕyGz]Uzt pz{u]jp&@*+G}z rEJ*'gwwZF հuYrU]WX twgJw}w{rt ]YwwwzwIٝYTz"wwwPY{*{zzwwwwD}E zjzwgz"" }G]"R "Y%"$BppKy А PpIzgUP}fw&QYP ]u'AUr Iݩjzwgz"" DM}ww]""]ԕ"ٝT w'r"]@"*B" Izw*""]w TEpѕb YՅMҰ$wg i{GDսzgGw@{tЧWUt@Yu"YwTpw 'r'Ujvgb{[pdYu @z UGUrّUUtw"t &tY]Uw"{DUtWrWYuzr wz""R]U}ڕ{"b&"""""+vD&"&"WJ""""RGu'&" Eڵ-*""*"wٱڝ+g*"r&`bB+"J@@"֑*"Դ&"b&""""""bbb"Gtj&""rkf*""z"rb{kr""b""""" uTwB'""""""br{Z) &&WIz w"ej""""&rb!"z+""vw""""""""rw*t{Q['bz"RpwuQٵk"{P] T &Zw@+&b{-""'""""+"{ &"""D revWt""+WQ z+"r"۷"r"++"""UYv'"r""+""""*+"""""j""*"P"bw$-}tP`bd$+j"$+r ""&B""+Bb""* *'"r""+""""w"""rb"""""+"""&++"""k]XPi"%"fywbb"G}" {Rݪjw"&B@P@B&r*b *g{Bעd&}W+-ݫdbd-Ң""'""bbb"""b""F'""""++@jr"&""*&""+rJb 'vR۷b"W]{&b"""""""*"""""`"""""bUK """"++{"ڴ"""z""""+g Mw%'r""-"&*d""r'"Bz"K'""" @'$""w @t'"rJG{ۺgr@ dBݰ*"-"&*d""&p"k{&""wd" {g+"""Kv"""`[uGr ""zJ" طt"F{r}+{"+'"++{&REb$-B'""Jwjײ*bvk]P UYzy$RRB@pVF$%p"' Dw"" **b*+"&"""'&`*jz'z & %"v'zbpw""*+p]te"JgBݧk"z'"""t+*rw`UGwzjGpMrddzUGw }W}p@w۠M{*+З]]]QTݠDeDpWݷ*rw`]]]Eн{ptYQjGgr&p+B+""W]t*WKFV PEw$rwg*"{kKk-rK*k ڷzbvbd"Mw{zr""rF TtpGuGMjwwwwb"+""""v }+wzr"r&םGBIA+YTyWtGpQU@]PU@TU]D{ՐUpw* PW]UY&b&ZUeDYUGwzkGgUW]b&""zt` zKv`bwuw'ҽ@+'$J""T`@{FG"+ ЫpKPKR }z" db&""ztr]G gt$+w{bb)&%""R"}v{&vWwwthB'""Eս+{F +k"""rk"rb""+"v '"{*-m+J""@{GUu%+vw$JF""rrt++*&r"'b+F&p$"+G-+׭"r$"Rz" pwkMuMijpbppMU*Gb"pZ[۴& w'fr"K" TUb"""juE-t+rDTwY""u՗Iu"Vu" u&'K)ҐP ]E]UI@}YPWUIGYE p{]UE]}IyАUrDTwY""]Uw G]Yw"bݕUz"M }+ """b"WUuw`rDJ@gZ ""ZWYyGEGWٕݙEUtJPUwWky{`YwUEU{RU}MIYwUJP+r }Ww)+peDP{םU pUUgwpw@YݝUDkpԷjjwwPUU""@Y*E}YQzuEwk p] wW"WzM"P "YAJW}UpWzpMW} }Y E}PYMYU]@U *YD wW"w UTwE}"}@"YpJU'"RtXtU۷U ]Z*wwwErzt}bKGM zEwK"}@@UK}} $"tvpWMvwQ pGp}ҫpb"Rz*"""F uuEe{&'"r+W]tPG{I&UKwPrKY}Q] K]UY[]UpDеm]U*""+rW"Z}'*pнYY}-{ """"$"""w*""b{gr`De"@'" pk"""bgFgD""""`""" "bb&"b"@kfRշbK""bb`"B""""$"""w"r""""""+"&'"}f"&"'`' f*bt"j( rT!$z""zg {kװw"r""""""""""""""+"""&"&bw f{$"r"""*Fg rz &""&""""""""""""""""""""""p"""""""""""!""""+""b""""""K' '""""""rz f"j"kb&"+b"y]Kv"r""&@""""""bbbb""Ԣbbk"+k"""""""""""""""J&r""y""bG*""""vg+bU"Z-W "r)""'" B"-""""rzGYAbjy"b"")"һEi""""""""""rt'k"""'"w"" """"""z$bz""""bGy*r$"W""+"{*Z]"""brIP"&ru M""""""Bg&Jݐ)""+ww{""""""""""'""""""r'Kp'"R """""W"-P"""""(ut Ut ""'"b"z"YQw"b""wpK}u"""""%"''""+'+*"&ײUJQ+brg&+&K"""Tfb"mz'{p"ݺx t"*G@+g@"wv"&"zw z dbppԷ'Kp$Bbrg&+&K""z'rgb&"""JU*""k&*&+&+"Wֵ'p-mYզG{ 'b]Jmb'*rxww{j p+֪d""&"Bzw"""""+"&v*"{" '[&"+GGb""""rvGZBgv"'+k+"b""p"""&""{bwg'b"&*+"Һ"grb"z"*- k"+vwU+$%"bf*"}{"{'*ztݵB"{'Kp-"G+"""&Gt{krWi&y"["" @"@"Mvp"'Bpbp'U '{ @`U]۠&r*b }zDtGw tFyztzwX PU rWi&y"[""T Yzw"""{}g*F'""""}g*r"T'F-p{w&""U]${K ]uptw"b"z ""z"'"w @j& W$' bGװztk&zWwQUHRUd"TWUG]'$"Z{Mj""֦j+{*&'wG "gpzw}z}{z}Dbw''{vzwz"ڧ PUE] tK} &"Pu]wwҽ}F" E}wv *@w}Pzwt  ݷTG{} ]D$YD]}}Mp jR`W  wwwҽ}F" Y] tgxgwpzJtz*&w*"r"]g{z@JP` rwݰKMpW UM}wu@ ']W]z*bPUG{YUzpJ{*G*G*"f]I J-rբ""$DIUW*ѽwD{jZt]GWpװ w ww pDT]Ԫ{r{G}]}M"U"rmutp{ ]wGwwzpMtpv" } [}Zw{ut]J+ptpM p]EDUE תpvYD]y M ]U *v]GE ]Mtpv" zzP kէuwww+WwwGwt tTuy-׷WTKrGW zժ}pwwWU ԵT ׍ݐ@ٝ z tpE+EWpqW]]]UJGڐ٤{gzMD *&g&*""JMz$"e"*'zzugpu-}JTwGP EAuTwz}w}t{W}JwtwztMUEUE br""w'wtUGAww UEw""""""""""*+'"z" p+"""Bzt+""J { " "" "YV'"*"`z{JVMkD t&G "Rp]J*RPw""""""""""pv{"+"J{wb""}w`vr""&br+Ҳg"g""""Gv&"+""""""r {++"׽G}'Kz-z*j+"""+[д&w'""utt""""""""]$w*&*TU"w[" ZUqz{""'Dդd f!uz&kf" ""-'"{-FJwmw z&"z FG @W"""Mw]&'"'"'"bb"PGF"" """"b'r$+vM"r""&"*"""G"$""""""""'&""""&""""""r""B""""{""+"&""""rE""&"" """"b'"""d'$""""G$""""t"""""""""""""""j""""""$ $""""'"""""*"+"""""""""""""""""""b""""""""""""""d+"pZb'""&"f"""""+"""""""""""""&"""""""""b""""""""""""""""" +"""&""""b"""+""'"""""{'""""""""""""&&""""+""""r"RBQҲ""""""""+"b'tBB*zz"yqdr*"PMMY&"tIGЭwJ }EZ]wGPD tD @z Ur'p'Ҡ@b'tBB*zz"PTUQzww Jv"wwb"Ettr-W&"""TUe"Bz֤R m' {zԪպzԻIu{MpP "Ru} W yTpp Vۭ{+"gJMz*B"+b+Jp]&g"]$)WU]zx u GDtzzG""p*pJ M j$"+@@TUU"{B"fp}Mt'Kݭ"r w*tw t w pz]}""I EDѶQ"@GuW{'e} FGTpywMEuUt{Z [YUQPywZy%EpZw pz]}""U[UD&KP"W "J"""PwwZGP$"twGgҧrݧz}{wYwtwzmYEgzB*"ו@]]UU{zV]UUݥwpw{w&&r*r'""pt"'r"B+uZ 'Y` @JYU]G Gvٙwzw'tYA"r+zrz"ZYy%I zpzp ww ]@Dו]r$*$"""*"rw"""+"" '""b'"'J*tB +F@*B -FgE+""r"F`"""+" D&bBt b$*""]r$*$""""B+""""""w'""""""b""""+Rr&`""}bp"""v"rr"*"r& ""*{""w"B""+"""* r&"r"""+"Һ""r$r+B" "'r-"""" ݲ""""&G"""""Uw-v"-"""'"w"+"" b"+"""*""+""""""""""""""""""""rb$p"b"""&"+""*$""" b"""&bg}bԢ'b"""""""tf'* "{JwwФ wzM+T&Wy p w r*'E'GzzpJPG}KW+ tr@tf'* "{JzwzKk} { תtzzw{*{vrY]BuZjrz U wgwJ}jvGGz gz}+KrDBd++բD]{B*"r{@w@@ ]}{w*jwb""&&r"""br] & """B x"Ztr$*נ{wJ"z JtPWUT @GtUG зvp{"&b"Ztr'۷{Ztp'fg{'rz*r""&"""}+r&tI"M"r `+"{Wz$JQb}"!rz}'""g'w]UwDT'W}&B []*r""&"""wuj+""gBUG"RqPt""+""w Tjbt&"w}+wv}wD""w@TՀY"&*۔Y$]D'M- """rr$ҕ!rz]PB'{'*+""Bv-""{b"rE-+Զ"'""-pGG*"rv"yIYMIuww՝z"g tzG@WٕU]zw"wwyUpGԭ@z"{""JYUTp&B"rzj{Ի}Y""*'"VeUUڤbvGvbbq$gP%fwB+fz"wtbB"WG+"zzGB}GD'rdw`BED}""*'"VeUEW}U]){Mjz{"fzwzwvj""""&"""""K&w[JzgYV%&"+++bv{+"*b*"Dw&+*v""&"j"""kb"""*{"jz"w wz$ v*"g""+"b"""brpt"r*"rk"""""wu"'""*" "v'w+}ttJwVG*Yw'"""gGwz{&+""ww`B wzw@ w*$zw@WЧ"**"b"$&""@""""""""""""&""""* """"""""""$""""" $$[]-"""$""""""""""&""""""""Br""**"b"$&""" R""'""""""""""""""""""""""""""""""b"""""""""""""""""""""""""""b"""""""""""""""""""r ""&""""""""""""""""""""-"*b&+"p""""""-""&""I`% ҧ" """""""""'""""""""""""""""""""""""""""""""""""""'bb"""""""""""""""""""""""""""""+r"""}*rj" I םW "]y }Tvu"z+e*wrw]K p&"B t }wGft Yprd"E}*rj" I] PEz{z]I t{]"" r" "+Rp"$X*ҕpw@tPw"+ yzw"""bЪJEr*+r{f"&@"+'"""&r+w*wrwU wBYՕU$"'*gw"&r""r$&{r""e+"* bm"`-r gzjdZw{ww-VJMKzwzu J"T&"'PtYk"+@KK{B@Q "'bK'td"']Yv"'ԠPwGwdp`zD{pwWPu]U`  dЕ@UIt]uD@Mt]]ݠt' wUYY@ݕ ] ХkݠVݰwGwdp`zEM}@j*W Www]}ԕuz}dYWP٧ p@}GM}j+&[ yP YYU}w@TٙYݗY}EYْpGwpww@}uW]U}uD@՝DwG"bG EUrJRMצ[WwwMWppuJwr@mM wm UGZ]KP @P P Tېt[}PPkt ygfwUt&&"""""rP-r""pWtzz&"g"dt"& "+J"F"*P$kvDb&+&"rwҐ FGJ}"RE""$"rPu *&&"""""rM@wUuD-b"'"w{]'@uzUt"""""r""vw{"g"r&"JI&rWtw"b"+"b+M""""rwr+b"*{w""""""+""r${"*}}UUuG&"""+"""""+"v"""bקb""""r"""'{wgkb""%UiGbfyb& $z$ GUY ""b" PV WE&"b"&br" $"r'*RJrrw"zbDw""b{Jt"$K{*B@wDD`w$"w@M-@p}Gtpw'DDDtw+rGFGDG@wpDDJtgw'pJ$*DDtDJDDw""b{Jt"ggG""F""w@Dt'"BtwpFw*GGwwBGpvzG""{t {D'""r@z}]pwwDGIDwDtEgFty'rv$JwrzD@wpw"rt"v""B"""br w&+B"vrFgwrrzrJ"rtrktwrw"wdtzD'pwG JwD@MDwF'Gr$wjtGDDGvJw$vdtw"*Bvw""'{tGpG$*Dp " `wtwpG'K@DD Е'EXwvtzDfw'qrgkzjtJ*Y@tUEWGTIy"BGwwGvW$wwGJtD Е'wG R Yلu'-Gw'zwDU ׍{zvJr '"vy'w`K"&+{wz++w}dwwwz"zGz*+{v""YYt"@tz"G+RU ]uzJ{}""!zzG%b{Dt "tz""w+g'"wwz{zvw+p&"""v+"wG'$'zB""uM fgrzw"bg{G"kw' zv"+"""""&"u""b+t"Ҫ"G$""""m*"&z"$""*KGbJ """"TJF" &rU"""z "b "B`'"+"""""&"UUPw$"""""r wv""Эzz""""""wvBtGD"""""ЦBz-'"""""*&ww}M"+"rw'kwt'rM""""""*kzwG$"Y E"""""""j"'""""""z{"Gwt""""*tgp׭"""""&zw*k*b+ ۤ"b""""'wwwwwU}b&""WUU-""""""wzw "bmԲG""""""B{pM`k{"Dw""b{Jt"$K{*B@wDD`w$"w@M-@p}Gtpw'DDDtw+rGFGDG@wpDDJtgw'pJ$*DDtDJDDw""b{Jt"ggG""F""w@Dt'"BtwpFw*GGwwBGpvzG""{t {D'""r@z}]pwwDGIDwDtEgFty'rv$JwrzD@wpw"rt"v""B"""br w&+B"vrFgwrrzrJ"rtrktwrw"wdtzD'pwG JwD@MDwF'Gr$wjtGDDGvJw$vdtw"*Bvw""'{tGpG$*Dp " `wtwpG'K@D"""""""r*]'b""'pJ"""UJ"$"t"B b"U&'Bb -""""}AK Iw"W]&fK-"rzVH"""""""r*M U)g'""&"R՝w"p""""""r&"rPUE*"r+"PQhz{"b" "' """+t'U+vw-M""""""+""tM'b"ԕU$""""""t""""""""Fb*" U""""+'"& PU"""""wYhTpw{H{&J{"+ТMDww""wUА]@vk""+G]-"r ] z{j&ҷQ wDw""b{Jt"$K{*B@wDD`w$"w@M-@p}Gtpw'DDDtw+rGFGDG@wpDDJtgw'pJ$*DDtDJDDw""b{Jt"ggG""F""w@Dt'"BtwpFw*GGwwBGpvzG""{t {D'""r@z}]pwwDGIDwDtEgFty'rv$JwrzD@wpw"rt"v""B"""br w&+B"vrFgwrrzrJ"rtrktwrw"wdtzD'pwG JwD@MDwF'Gr$wjtGDDGvJw$vdtw"*Bvw""'{tGpG$*Dp " `wtwpG'K@Dr&"w""B$"M*{Q*Yp)"r*bxG$JQq"&KpZّYIpTUIw*w!"URyr&"w""B$"G@uw'b"Qz"Qp{w&Z}I]""{+w PqWw+""rY Yu]]YpY"f"z wwxGTW+ ""+Q"+uMv"B"@ Y'b$]DUYYPUQ}TQD QY} DwG]]]Uzww"rbwב!"ۙ]UU}}*"}QwDw""b{Jt"$K{*B@wDD`w$"w@M-@p}Gtpw'DDDtw+rGFGDG@wpDDJtgw'pJ$*DDtDJDDw""b{Jt"ggG""F""w@Dt'"BtwpFw*GGwwBGpvzG""{t {D'""r@z}]pwwDGIDwDtEgFty'rv$JwrzD@wpw"rt"v""B"""br w&+B"vrFgwrrzrJ"rtrktwrw"wdtzD'pwG JwD@MDwF'Gr$wjtGDDGvJw$vdtw"*Bvw""'{tGpG$*Dp " `wtwpG'K@D"r$"""""""}""'t"G&w """vp'"dzpJ"$r""*z bw$""""DW Jv"w"r "" """r*"r$"""""""pЪ'"""""zBwG"" JG&""+""rw+{p""""kwBr $""""r"*jww"$""{$rvzrr]E""""""*"rwwG r"}"""""""b"&'""b"*"gt+k"wEtG"""""rg+g*Gw"""""&w z$&**wup"""bzwgMtk""&] "&"""'r'K ""'gDDr """"""rrvw""B "r"""""'r{z*""b""z""""""""rj'&&"G&b+g+*F ""+""""""""""b"W'*R%""""""B "r"""""wr'f"""*""""""""+"""""w'+J{v"v*"""""")""""""""""z'b""jk'w'""kf'"&b""&"""""&br"p'r$""+b+*{w""""'"""*z""r{ wf+g""""rpwbw$'"""""""""""""""*b""""""""b""j*"+""v"""z]q"'""+""w}t"""{+R%+""""""""""""""""""Aw GGw}pD'zP` KYMY}]}@}MXy}נpr w U p}tpZGAw GGw%w@JywpGBzGUtUН[X"{f"b"* E ԧp@YTZ+љMַwWMىy}@}wPbwjwpQYw{j'UqP]iw z@ Љ״@zq`Rt@wwwwwGt '"j״J UgЛ"'rJtxtwtpDtUwfzw"j{'wGG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B""""""""""""""""""""""""""""""""""tqMGpj"$twzzG"WgRErw "Mwzg*P٧DtydWGwg"Brz z{G'Jzy$&dtqMGpj"Fz frw@GHbvzw*{wzw }ywzwKp*"""{u&U$w""&""""'w{w& dtzz'B"zzwr&jvrb"z PUW-gbDtGw"fjw}tUuי]yzJJwpb"+T{izGt-"rt{wp"G""+j"gw*r"wjzfv*k+"""v*wwG gr'r"&rp{wYyw+"yp}"""+bb&"""*"""""""&"ff""u"R}&G)""ruA*"W"zIw"w%&u&*rT%""""TwpJ*Y*""v%"gg"""""""&"UY&"++&"ݕw""P Tw&b"&"""r'p""b++W[A}''""""*"w'zPq"+"rgr $rKw{$r""""""'+"r$&UYrw""""""""""""b{+"bJY""""+B*"*+q"""""p*}dzwtwtPwwjwjz{ prww*"''՝YU'"""""+I "Yݍwtwzk"""@wzwf"""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""@twP{pZt}twyGD}ڐYЕY}@UUYUРPP wQЕIMPWY@twP{U pj' QQG ՕёUTDGwwDtї ]$ZzYٙY] M]ّ]MFG@GוYՅY]G{@kpRuGwwTY]YUM @uWtUP] Ր]A[tp]ՕPt}Utׁ u ]UW I yYuG}@٭]"r$*""&""dDb+""""f""""rj""Bb+"+""""d"p--V""""""r"""*"bKWwF"b+j""""""r$*""&""wr "+"$ "v""""""""&"k""%"zr"&""""""""B)&""""""""" """"*'+"""+"'"{**"""""r""""r"'+r&"""""pztk""""""&r'k'"reb'""'""%""""B%"" """""""+""""""""""""""'""""b&"g"r&"""*"pzw]%Jrr"$"`""P ""&+j&""""""""""""""""""""GRd" *"}dv" w`'"J*]@'"RYMyPIz`wG}jwr'z'tWttP E $'I*R@*GRd" *" %rd b+&wYzww"Gаwz`KT@UQU]Ef""u tBwb*"""""PI]EtpݱgW YݽҷM]VwԷkbgwzwmwG ]d&z*""UvMPYUrkvbDQv'wrbrJw)%rtwg@M Up-"J@{p] UWP+ v "{t]tw$IpKb'++"""r" j"w wwtzg@rzrIg)rwGrwj{&"*GwGAw'kwzwd"BzJz"rb'z""GGzw wwtzg' Y]I+"jjb+z{++zr*"+"r*""z"w'r"r{rwG"&b$rw'{g*"*r"b"f""""r""w{zw r$"GwGWw"pgzzwzb{'rg"b"b"'""zwrw'"&'"""@pwG"rb'***j*rb&{j*zrr+*J""""b""ww{+"b*rb"{wwt*&"""f"""'"{t{K{zG"+zv"""""""""" """"}"Rz"""$""""r}"t"""F"B-b"" ""M"*b$ """"rwPkrw""rWG""Z$""b ""@"R$+""""""""""WE]'"+""""BPw""G{"""""""""b""" p"""""'rJJG''""""""""""@""""""$"r}v""""r" 'Tw""""""""""r&"" Gu{p"""""""""'""""""""b""""w]"""""""""u"""""w}"Uw%"g&"w{w'r"""""""""""'"wGZ]wwB""""b]] ep""""""""" '""gwGb"""""r-]t$b""""""""b""U+"""*Rw&"$""""" +""G"r-b""'""U"+r"*'""""TU}b u""-""$""R-'"""""""b""WU)b*""""@PP"}uww&""""""""""tw"""""Z-Uݤ "*b""""""+t}""""""$"r "bbb"`*Bu""""""""""zw'""Y]MPU """"""""*"""""""""""""""""""""vw"""""iu"I%b]@mr""&""""'""w@]pUz""""bwU] }"""""""b" p'""-w ww"r"""rgY-bv""""""""B"""$*RwT'"""Vq "]'WE" "u& T ""'"rGZ}PPKP&W "v+M$"""""""B"UU$"&"""J ݪ"UХw@w"""""֤ w pp""b+bw ݷ-""""" *-y"$"rzpMt+֧BY%t""""""ڥbw$"UUw*""""b""""""$jݵ ' tP""r"z}dD""r""M w`'f{@@upz"" fb-pGPY @p'+U@ԕս'j+""wwYG "v]]"+""BpMG"ѷBw*DzQ{Wuvvx+DAvKKM"Z+&)'{ tjzv *uuv"rwzzwwdJDgGwt"rzTwwѷBw*Dz YtxwwUGvא&&fB"wb+&$r" BtjGb{vwK"*" FI""""w{{y&"&r""&{""r'"&+B+'+ t՝wB@pijw&"&"r'"b""$+"g'bbf"g'b"RWg"Jr'jwwjg'rrvwt zv+""$+zjtz* vGr"rwDUw"'"+jt"r+"wGwDvx"+wwwK""""""""""""""]'G*""*""""b& """" """*""U"""J"'""""rf" ""[+"W]-""$"" """""""""""GЙ)"""""" וG" *""""""""""*"r""""""jr@$""""""""""z""""""*""w"""""""r'"""""""+"""r*""YU@y]Y'""""""""+""""""""b'""""*""""""""&*'"F+"""""Q &w'""""*Է'"""""""""&"w"&'"""g]U]U"""""""d$"'zWrKP""""""bu'"""k*""q'U rjp]t"q ]EEY bנr]$} pb$jrwU]QE 'W%"Qk*""q'U]uD-""՝p+Q]rg+ݷ۽tTuGw*gUۘ "r` WٝP" "MݒpW IM"&&&jtBKEtrM]Tyw@""+F'""r"'rGMZ@zr"*wG p}w'Ff*IUI YU]U ItMUt* }P]]G "r"'KM%"ԑQyzpٝ"""""""Bw$'j""tBw""w"+G{""p"Jg*"*""]**jr+""'"rGvwr{vw}D"*"$"wzrj"""""""Bw$}DpU'"*&"{w+www"""""&""+j"+"r'" bwwgz"b"""+z""""b{*v&+bf"w*r""""""&""*{*""wi+r""""b"{""""""""*""z"+"b"r"""+'+''""r""'w'k+"r'wt""&w"B"*&w*r'&wtwwG""rG{M"b""b'w'"'zrvww{"bF&"rrww'+""""""""""+"""$"b""""""""""r""""""""""""""W"""""""""""""b"""""""bw""z$"""""""""""""""""""""""U)b*"""""""jt""""""""""""""""""""""""""*"""""'"""""""""""""""""""""""""""""""""""""""""""""""""""w"DU)""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""b"ww""""""{wvGw""""""""""""""""""""""""""""""""""]IY }B ّ@]tTu uv'}U}Y@ѩ]]Yy*r ՔY HtyyG]IY }BP%V}xwu JUwT]P%JGXPg brz'&`IPwՅٔjDY]ݧwPvrY@wY kBup ЕrgAvՑGҐt}Ppҧ E UTp]uj&Wzݙdw{'P"+wUpEt} ztDgqw%wwG""""&""{Tw""vצF}&"z*"{+KJ+&""b&&+"""bb$"b"""""+b""r&b+fb"@"rw&b""r*k""""&""{t$ivg'"b"fzwm*"gbJ}"""""'""""r"""j""b" gvJ""+"""+"+"""""&&+b""""b"""r"""""""""""""""bb}wYUw """""b""""&"b"""+""""""""&""""+"""+""&+""++"+""""+"f&""b"""""r"""&"ptJzb"""twr{ww"&""""""r"""kzb*&*b"""""""r'@'r"jRww"""r']w"'K " "@+$ J""""rGא G }B t"bD "rP """""""r'}zGt'""'"Mݧ& wwb"'""tr"r""ݽ*"B+"GpV]}JJ""'"bwtM"&"t}D"wB{@%""""""""""Jw "pDDG"""""+""b""""""""rM""""""+&'@+""""z]] tkPy wGtw +w w" Dtwb"""+Bz "r }V]Uwvں չzk"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B""""""""""""""""""""""""""""""""""""""""""b"-""{rBt""b"""""*z""""""""""""""""""""""""r"r"*""""P"rDq"""&"rg"*"""""""""b"+&%""+""+t g"d"t""""""""""""""&""""r""{w'"k{""""""""""""""""""""""""""""""""""""""""""""""""w")"""""""""""""""""""""""""""""""""""""&"""""'+"v+""""""{"*"""""""""""""""""""wY """"Gwrzw""""""""""+"+b""{z{""""+"**"""""""""""""I"""*""$"""")&D"* &׭ "R$"e"* " """"G+r`"kP frP""" "@"r'"""""""""" z$"""""B }""pt """"""rpx}"""""brtt *"""""'"*u }"+"rrM-{] "rtmu*R}$""""""r"rw*"Y "f""""""b"'""""""*gu$-pW""""r& A-"""""&wڪ'*"""$Gw""""r""*"$duGUԫ"+&"w ՙ &"""""rGp "PK""""""rw"G"b "&""+"&"J M+R@*]-"""BWM "r@ Y"-K"pv-b&""}pY}jWUݫ" )"&}'b "&""+"-"""p"ME*&+]JWE """"tp@m""""r"}GWG Q"$+Gz uYY }VY"&""ww@ $KY]+"""""rw'}""rk-@wD W""r+zG-ݭP"f"""jZ]ݽuw' pzgzJ]ITIWEU Gzbw PU]P Eg""rMWu%"M]KzWjf"&""@U}Gw"""""b""b&"E""B'*R+{-"""V"Bt*P"[%bjy" B-""&"WЧנvzp QU"]%"z &}g""""b""b&"]Tz$"""""tU'"UU+"*""zYMuXU""+"bU{ Rm-""""Bd Q&'"KJiٷ p)}""""""ڹ]-bj]]{{"""""""""""""]u ٕ"""@TYՙUE""b""]t'zuۭG wjv"rrgzqHYy zwpbU]T] "j"""zWU]Y%"zM]תT}*""""J@wB"""""r'"E*" &R Y(""Fu&ZGY؅"z{M*׀G h""bI@@UQpjGPU&)"K`MB"""""r'"@ @"*"""KYf"p&]}w ""*jTwp'"""w w+k@@pw}rb""{&gK{} ]PzG"rv"""y"f"'tww{׈"dF"kw&""f*@]ptGwDwpMDU{t]@ DQ]ԧ{kwUYpI`""z@@)"K]UMW"""B pG F'"z"fFg"M*r @$Bt]*"rrp}* ]udJzM* u]z'r{B}pw @}P g$"M*rz'F'"z"fFg"%t'"""zw "tG wk*]TM]fz""w+G WrJ{+r"""*Y}PWIpMe ]RdDwP Rr"&fJGWհzdJz]wj"'""&r-"rҪ']EUuur*"B"JgՕr'zrj+{jw}$trwwFzfr } tD$"wpwGw}tz-&rw&Yr$"@]w&"&"rDwzw"vv$+"*B}wTpw$&"*zgݴРu'Gp{wdwp@wg'KGWP E yzZE@t-bдJ'vv$+"*@pw+"ԧ{}zЧ}tE{Upbwz&wG*v*{Тdb"w@z@U`zg""gkIp" &pݻwzz'b''*vrz t{wYАЧ}w""*t""r+bv׷"r "***z+''wz{bk$Kppp{Ezvv{jwp@ g twzw PZם+"$KF bW D{"v"J"rr*""""&j&G+w$"""$"rjGpw" fu+p '""""TJ}"v }jWG"$"p&B rr*""""]Wm+&""zvb"ՠ}{G+v"&"{&pwv""""z Mr p b&""B"j"wwM"'"*rt'w{zKJzd]p"&"b&"**+{ fUYժ{"""+&"""*bw'f"rjr""+v+j-w"""""'{E wGb""wRwr""b&wr'z@pwwwY]]}wG""'rj{D'"`*zvw""""""pM "w Utw`wwz`w rD}pmw*p$tDK$* DTDpd* pYM'"r&z+"M'GDrKw Utw$P]}w'"*'"r"w}pbbb&""Gw&{w""rwkr &"z'z}f{"r*""{""}Ju[r{['-"GTpzG"Y yGpwG jbrz"""z{p r'b"Qt""j""""'*k+b"b{'rr"+b""""b""TW+&"'vr"b&G'"j&+Gw"$*brfJv"&rrG"""""""""" """"'"r"""&""""R$"'""""rG"$"""""@""""""w+""+""""r """w*""f""""""""""""""W{&"""""""rr+"""*&'"""""""""u'+*)"""""""E"""&'"""""""""""'w+""""b"'&k""J **"}w+""""""e$""""Wzg"'"""""""""""""""""*+-"'"+"R"""""""&'me&"""""""r"b""""""""'""""""""&""+r'r&brW""""""zR}'""""""b$b{+""""v&"br"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B""""""""""""""""""""""""""""""""""JtwEztP TwwGE]XyzIP] եM}Dywww ]UUG]pA T}*PJtwYYu@PY@zGGM]pPwz Gw @fw p}wt]zpXEһUGzGٝQ[wpgTjgz@rwСW ٕ Tղ*zDz$׷@tԭrr p GڷIpwADwwGw}wpUPuE yW Qp W+GEMU{pww{tR"-tpEP}*G פ @AYXUPuw""""""""""u"""" "r&"'""""b'"D"""""-""'bbI""""b'""""B"+""P'"Z"""r """r'"""""""""""G+""""""Ҧ """{g+&""""""+"""*Jwv"""""v"Bp """"""""""""""""b"&&"Wz""""+"""""""""""Gz*bbGUU"""""""""""""""""&"&""kwu}"""""""""++Jw"""""{Gu+"""""z+""""""""&++{"{}R]'{""""*{}WФYU!+"""""""$+Bp+""Wr""""""rG'"""""""""""""u"""+$"B""T'""""'"""""Jt"R*""%"'{*""""{{"*"b *"BT"""'"t"'&""""""""""u'""""""""$""""""""r`'g*"""""q"rw+"""""b"""r&M"""rw'}ں"rD*"Wj'""""""q**z"""Օ]w""""""""F""""""""*wwA+$""""'r"`qz{'""""""kr+*""""*j'"""""b""*"*'@m 'r{Tb""&"GQ tpY*""""""rtzw*"$"rB""""""+k'"f"+"&"}]B{t@}*" Py]"rpU @ J}j*FwVWwPuwW %"BJu+"&"}]M]M"WDgYUב"${"'zUt"Yqr"$rz P"**wJ Pw]T D{[U b"""'b "rpTrpݐ]UMG""+ 'p""B""bgzڢfB]r"""*k*+$UukkWDqwWwzUw]}]w UwwPw]gkr"'Bg%"BUWzJpx]zzGwMDt}MGx @Tu'{ pr w*XEYuݕ @}MtYUq]wgIw{I]t Uՙ [zGwMDt}G%tDuDtu ՙ-T%'pp'"'ZX] GGxQYҪG YYקw]{r}u]]Iw @} P{ GpG"+wVyMtЗ]јYrd"[К}ٕUyzwpwD}Wp@uwqrW]tww }MZp} '&zwtwYՕ]}MԤ]'UYYyzww'ҝd p"""""""""")"""" "b*""""""""""r"""""""""""""&""""""""""""r"""&"&""K "$w"""""""""""""""""""""&"*!"""""""" """"*"""""""""""""""""""""*""""b"""r""""""""""""""""""""""""""""""""""""""""""""""""*""!"+""""""""""""""""""""""""""""""""""""""""""""""""""""""b"&"""""*"""""""""""""v&G"""""r+""rw""""""""""""""""""""""""""""""""""""""""""""*""m"w$"F)""""%'E""""")""}rvq""""%""""Pr "&'"+Z"""%""u&R """""""""""{""''""R&""Ttw'$"""""b"""bz"""""[rRw'*"""""""""""}"""""""""@"b"b{++"q""""""""""fwwrvAb"""""""""&""""""""""""mI"""b""b""j" """""}**""wT"b"&&"'""b"""UK"""+"DT!""""""""+" '"" IEwBb""""ٕ "b"""&&"b`{v}+""r*Ԫ"""'r""B"*j"'+p$Z b++B"&&bj"FbJpK"D+""""""&&"bw-++w+׷""""""'+"*"F)*r+&"r*""""rr w*"""""""bGk+v*"k"+&'r"+""""*r""+vk`Egr'""j"'zt"+f"b"Bw'b{y{-k""`"""{%bw$&"b+"$""r"""*"+"&"r"b""*+wzr*+'"""*DwЕ)Gj{"$ՙ f"""bD'"""b""""""""b""""""wtppw{} DzGwtDwt[}ztMy פ-wM P}m] P"rzzw ]ݠ-ZwwQwzwwtppw{G-ztP{gwwDwzwztwurjwrzr *"&{GէG{b{Zu +yyzz"zJyzd["bwpzpwwz{W`"wMD"է z}}pwtZ{zyb""ZZtiF wzu'rkp uw&"w'{f{www{z{kr"""kkW]TWz"brj pT}wקgwwQw{wg*{wzjz'{vwwz""""""""""d"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""M"""""B""+$""""r"M"""{"b$"K""$""E""""$'""""Gtr""rG""T*"""'""@"'+"""""""""" @'"+""""wv""pzgr"""""""""""" wD"""""w* J''""""""""""""""""&"btK""""b"*+"wG"""""""""""t+""Wݥ"""""""""+"""""""""""""w}"""""B""""r"""""gD"G'"*j"b&B'""""""""""'"w[@wB"""""{ Wt Dj"""""""""vw'""ggVKJzb"""""w'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B""""""""""""""""""""""""""""""""""""""""b&""""&u"R}+G%"""bruM+"DTjwu@W"%"u"'rT{-"+""RUGMzw d+JWU*"B-"rdҭ'""""""b&"U}$"""""bpUw"P]Pw+""+""ww"r&rY""""&Ww t*"*""b"`+*P "'"kr'rU +rvۧG'b""""""'"brwU "Ur{""+"""rb"G""b"""r+&Y٢""r"'rk"zgZU """"gpzDww" Dtkwztwק{UUpw+j"rwtՕYU+"""""'zpW "rE}PVvp"+""B}U zw"z t G&"'ptg&bjb{ "p+Rub+&vg*+&w wtwp*vzw*"k"Fb"f""BKj'B}z+&bz t G&"rt'"rڧD wp&"*b""""f{kw}g׫w*""b "U'z"""b"&"fGw'"""Gi'*'"b""""""ztzp{z &" wtv"wwwG׷wwzz{w"""kwZp-rw'"bwzw""v""&"""&-{"""""&&"*f"b"++"""""pPm'b*r""""{zZwwDj+'"zj""""bfb"""""bb*""""""""""@K'"""+"r """"`$}""""+v""DbK"+"F"B """"B z-'""{"""r "b +d+""""""""""}t""$'""rD""@G+"""""""""""G w""""" FBvM'+""""""""&"p"""""""bPp""rr"&"@}"""""""""""DGbK в"""""""""*""""""""""""wt@""""""""" "p"""""z}j'"w&M]"""'*"""+"v"WU{K"""""wGU """"""""""G}'"bD wЫwRbr""""rt""tD wUGwwGtwTKPEtwMtupwM׹-PQ} EY׊Qtդrwww]G]tvMtpqwtD wTUYPqtwwwwDwwzwwU{w{DB " U@wtpwKUyz{wwwtp`wwMwpG*t}x+]""TyGIWQ]www p GԠM}wpvw׷ygݕqJ]vwwzEQMvrwjf{wwwtwrzwww}ywGtwzzwwf"+{tPt{&{$tҧ wwY] Jg@wwwww-w؉wwg{www""""""""""p""""'"r'""r$"""""g"p""""""'"""'"""""r""$""""Dz" """'""B*"""$""g"r$"""""""""""{p*""""""b"r"""b'r""""""""""""""G+G"""""r&G*""""""""""""&+"""""""""jr"""""""""k"""""""""""$""" $b"""""""""""""""""""""""$""""""""""""r"-""""""'"r'""""""'-'""""""""""""""Bw&"""""""Gw}p'""""""""""$""'"r""""""""""v' """""""""""""""""t'""""""""R%""""z"br$""""u""-""""""""r+"'""B b"*""J$"k"*"""""""""""E """"""jwg"*+*""""""""b&"""%""""""""U""z*'""""b"""r"+wz""""""'&""""b"B""r&""""""""%""""""""UUYzt'"""""""""""""""&"%""&""""""""""&$&&""""""'*""""""""""z*$&"""""""""&"Z+'rGt z""f""p]]w""""""g+$"+"r""""""r"j'"""""""$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""*"""""""""""""$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""'r+"B"""""%"p"""j"r&"g""""""b*""""""b&vj"+""vd""T ""+"""*"""""""""""]%""""""BzG"'&+"""""""""" b""""""""[""}J*'""""""""r""+"""""""'""+""""""g"r+&"""""""'""""""""UUE """""""""""""""""'""""""""""""""*+""""""""g"&""""""{''&"""""""""*""'*ՠ@w+""""] wM}"""""""*&+""+r"b""""""r"*"""tzwttpGtYW׭{zrpGvd׺- z}GDg+GJRG}w*"r"{T'ں G`ztzwttpG@'wY]w+"zwݻjz׻zrfb"R+""wzptkwfvwt@z*$&'&f*w"rR+""R""{vjrgV+)"{GD@wp"pwPYYw{*kr&bbf'"""{{g r+"utw"bf&b*"*+k*"j"+v"""&b"G *f}rbbrGb'"{+&׺ z&**vzw &kr{zb+'t"Fd""u"bt'"r&""""K {" *VD+%"*"bErG` R*"""bBrj'" WG@z&t-rr"$+b+'t"Fd""mg""""Fw*r""'bz&b-"uT&""P*"""""԰w+"""'&""""r*$"]"'"bjk)K@tv"&**"""""r+"-'*b'"bЙ+b"""$B'w""-rbb-""I"-"B"B}%"&'$y""""&"b&f'j'*"""r&g"""b+ "Gp-W'"&k &zUww@w"@w"$r-G'rr&"rr&"""""""" *"""*""""'"*bjp*p*D-"""brM* 'rzJw}z" r""jzJ$""""w pf }+ZU"$""+'"*""""'"]]'*""Fww"ppw*'"+bprrPGD""""&פp "'""r"'&&zwp"+"'vz'{ t{rJjwrE""""""*""GW'r"UT Yw'""""""'"""'"w+w+"{t}"""r""rb+++zGp"""""w]W wwkb}w}{"kbb&k'UEpz""{YYU]u"""'+p$""'PGw"""""k ]r"t@dvppXGJFMzDkwM'q mzj UUPDpuUyDеPw&B Dw z٪WѷGtttdt@dv-GU ]u w{GDՕuAvwz]"vt'`""Gzw@jw@ }pڽ&zݪf ""U]U}Uݧ&PD} "t*UtwDW]Wp{{Gb+"!{٤*B]Ku*z׺z*zj%w wGwwwp{Z*g*"&+{gtPT v'b'rz `+Gtwvj"v+ z"&z&`zt*""""""b"Mu*"rr"'"ib*rW'""+" ""r""P%""""br""'&b"rr"$""""B p""""r'"*""""""b"u"G)w""""wx'"'bw"""""""""""r"""p"b&&""&{'vG]w""""""+r+"""""""'""""""""*"""""""""""""""r""kBUEDP)""""""""""""""""""&"""""""""""""*"""'"rb""b""'""""""{r" """"""""""""""""*"w+}""""GҢ"rקtp""""""""""r""r"zk"R''"&'b"""""""""""[%r""ݫp"B"&"""*B *""""""""""'""""r""""r"r&-"""p"X"""'" g"""""""""""'"]U%""'"""B]*"p""""""""""""""b""""+""@*fz'"""""""""""""""""""""""""""b'"""""""""""""""" bmK+""""""""""""""""""""""""""""""""$"""*""""++"R$+"&"b"BR"'"""""+""""""""""'"pz""""E]Rbr"""""""""$*"""r" w{bb""'"{'""{'"'"z+"E+`pfw*$"*+rG"U]]թkT wGu{u v*vwD}+P%v+r'{'"'"z+"Puz*""z  wzf@zw*жDu'PMEZ ""}Tzr *&"""ַ WpIY kkWI٩ }ٕzMEkb*kFzwuP'wGٕTG'&""$} "bڧzUWwb٦wwutu b"+k+Fw}{w*}zзYE%rgp]w qTZuvJj" Z-vw JBJ}k""""Bwݰz"""""""""""-"++*""""{ """""*"+""J*`$"""" "'{eP+"""""&r&""'"""R ""r}'"&"b""""""""""""V`b""""+""k'"""bf""""""**"{ $eg*"""""""rb"""""""""k* &'"rbz*'b*G+'+b """""b""e'B*"""""""""""rB&+"""*"b+Jg*bg"*"b"r") r""""""""k"""&""""""""'"""""""'"+w'+"&b""b""UYt}B""""""ukv'"+""""""""""""+""""B'&"'ݴBpwwRP} ""*v]u']Kw'v'G} j' Д zZP U f%"r]'B'&"' Muk"w Wݧ'I]}" ]* KEJE""bwUUPսw'"""JgUU"*& פFUUw]wzGWݦ$b'f *{BvUݕЪJ""f{'p""&*ݪзv"}F"++צ+g'Ppv"+)ZpUz+UE {{{gG pMе }ЕMUЪ@KYUU @+&"קP%"rհݝUv"ҢuPw"{w*rGw׭" vqguz`r*Q GqppXPyzG{U] Uy`]mbѩp{w*rGw׭"Gw@+wWMf uDY]qGU&w  zw+""ZXP@Aw НQYy[ {ww]ّqpp J{{g""ՁzG @}ԔU w{tPwYPшԝTU WؕQ@P] PUPj$z@+Vweb׈Muuu*fwQ}"''g""&"db+"Fr"""+@r""rdG'"$&"&+g$zk"""bBr&" "@bwwwB'rf+""""''g""&"$$&"v"&""bg& "G"*"r"b""r+""""r $w+"""+"""""B" &"d"'""&*"%"**""""*}"""""&''&*"""&ЫBz&"+'*K+"r'b'"b'""`"+"rbr'"'*'+"&"""*"&&'+&+""b&r&`"b""b+&{+""+g wGw'r }V"'rwwj{f*""'tB'r&""""b""""""+""""*"""*" '@$+ס٤rb""vp Ufp&}"t'r JGw""g&rgwG @T @!*['"Ju*"""*" 'ݥ }@ 'Jrw{P*t}zP"*""w"r&bT""'&(b wUGUU"bk+ gw"+"zw B+GpwP{zU-V{&""""""rB''r]E} '""+G""r""rb z+""b"r&'rz"'`*'r'"rf"*GB`wpk`p pJKk+****}G] Օ"+ w}jr]vzpD"r"+rD'"b wIp{rGfw{׷Uw"""""""r'm""zArzprv""z&T+ Gb""*+j"b*""*&+"""*"vzBw"w*"B*" g"""""""r'}tq-'*"rw$wkwpb""""dv"b""Bkb"*"g"K"bwwװp""""bf{j{"&""bk+&"{"""+v&b""""""&""&b*"" z{v*"""b"""""""""r""""&"""b"+b+""*k++"""'bv'*+"&zb"k"r"+&f&r*"]Gw""jrw{P&""b&*"+{rwbr{w'k"""""""b+""""&M+p*BG ""b"rg """z@"$"""*{"B-""&"Bw fҰb p'b$""J "r"Bm+"""""""b+"%"""""bPt*"w*"""""*"B'pr"""&"{vUTm """"r"&"'wݧ"""""r&Bt"&rw$ """"""+"Mw*""U{+""""""""'""""""*"r* *TP"""b"""&"jt-""b""MjGW'+++"R&"b&""*'"tBwGYw'v"""{t]Бxt"""""vG'"rWzzG""""""rzM b""&"""""']'"wwG""g"rPw"dצڭ " r&]*$rвK""""rD[ZXG IvWp"w-"BpA"&"""""'u} $""*ݐw+UUwv"'""wv"r+fBU*"r&"uBJJ""" "GM"+"]*w z%[ G""""""*"bGw$r&MԐ]v"""""""b"""&"r"""rE""""+*"+'PY+""""ݫؔwwf pvG}D&'tUPT wb"b"'rJW-"BmtZJvzjj qGԺzzGv}U wwwzJ rwjwzwGշtdm kKvw]ew Jvz*wG"vw{Kݷwq@{w*{G wzzGv}YY%UYE p{zz}{G++kvb*""wqwwzwzww T+$g&f`&kr""R""kbf&'+vw]ղU]UUd&Gkv+&r&&"b""v'r r'bbrw"fb'j+*jgfzvwwG+k""&gbwz W{*{ErwBwpw" wwkw*ۻkwwjJwww+{gwz"""""""b""""""u+Rw+" """"rp"Y""" " "b """''b """"BtԙebdP""T'""v$"&R%+"""""""b""ZM-"""""" Ww"yww+""""""""r"+"@"""""'wU-"""""""""" p""""""*"r@G"b"rbt$rMp""""""""""{ *""]wu@+""""""""'"""""""""&"{PB"""""""""+ p"""""*])w"PQY-"&" ""j""z"WUDw""""DPU }w""""""vkp'"dҐUb+"&""rYE)"""""""""&*b"" B """""""" "G""+""*"d""""""""""""""""vw&r*"b"r" %""B&"rK'r """"""""&w{a*""&"'Е+ """""""""""""""""""" ""JJw$""+"""""""b"""""""""""""""""""r""""""""""""b"""" GY!"""""""""""""""""""""""b"""""""""""""+"""""t'"r'"+""B"v'""""""""""+"b""rwjYUMD"""'DJ&"""""""+""r*wzB""b""""w'"""""""""""""t'""e"Rg'bv)""""")+E"""R""i"bB""b")""""Xr-&&'"$T"""%"" +$+""""""""""""''""R f"" twk'""""""""'"""""RE +""""""""+"by"""""b"""p"""r*'"q""""""""""+WwB""""""""""+""""""""""" x""""""""'"Z"""""k+)$"b&bP"""+&"""b""r"B"""$"@(""""""""k+G'""ٕR""""T "k""""""""j r"" Z}""""&b&P{""""&"b"""""*"b"""d""+"rBf""bw"Ryx""b'"rԤm+"""""""jYy@-""'"ݕ @]}""""""""""""b""*"k"vh""Wי%fw""""""""r"""""""""&b"""""""&b+""""""""""""""&""pYk{+"""""""""""b"""""""k""""""""""""""-&""")*"'ff""VZj"""""""b"""""f&+Yww""""]UUz{"""""""*"r v"W]"rbj'"]$"xU QzU]Wz@{}zݥAzח e) UuZ؅i&r G Bw]pGQqZxU Qzב)Quwz{JYQ{rr*"wMzvPKwۭz]GwGq&Z}ZfbD""]ױ[ f&wkXYYYPutw++"QHz!r{UѺ]wbzzu$rwqzڥ"""FwPM'&g+ҧbt fGtv!Q yGgGz '""""ubrd"*W'"+B$"r}UWu%$wpթ]$r'fbBw"]zwP{+W-Gp"g+ '""""Zi$&""MGb"w*"ר-yqPM"&"r"ԩz+r"*"""""z}ԩww"Zy})pgwIz }+""+'{ס]pwt$wpUG*'"""'t"wIW[}WpPb'{ yU Itr"wb&f"r '&*vgb""pgzU}E -"+tzwwqE*z"{wE wP Gwڢrz'&+""""zrgk""""""""""f)r""r]rw""b"""""{"r """"""""""b""*""""""""b"rv" """"Wp"dt""+"{*""""""""""fgb*UU)""'""""wPe'+"ww""""""""""""""&""""'""w*fz""""""""""""""""""""""""""""&""""""""""""""b""&vi{'""""""""""""""b"""""""""""""""""'"""*""""&+"r'&"""r"r" """"""""""""""""""wwYz""""GGBbGw"*"""""""&*"""r"zwz""""*"*""""""""""""" """""g"b{-""""-"""bF"b""$"y"""+$""""Yԫrd"bF*"*W$"" """R'+""""""""""g""&"""Gt""E Jb"""""""""$Mz""""""D '""""""&"+"w"""""b"+ @"br&+$bGy""""""""""fw'"Yqbd"""""""""+""""""""&""t """"""""+"wp"""""g*W-'"g""'Gb""""""+b"*MgZ]]w{"""'&rz Y!$"""""""+Ju'""m}DPrbb""""WG'""w""""kzM W&"vwv"'"hv'{ ""$"d""re"+&br"g*""r'bR P"BwY*&"BrG'w""""kz wwe""Gwxj"'z"""b"""""""r&"&}"r&jw""{{'vW"""&"'b""""""gb""""""'"+""""""""""&"rtwr ݕ)"*""""""""r+"""""'"""""""+&"+"**""+r"&""'&*"&*r"gbb&b"&&""""""'bzpP"""&pBrrz]r"""r""&"B""""wwwrp{wg"*'""""""""" q{'" pw""""""w+'br "+""&""&"""-"""""""""bB"" """" "%Uf"""""j"k""""""""""b*!F*w""""j"'"w""""""""""""""""""r"}""""g"b""""""'&""""""""""""""""""""k""""""""""""""*"y{ """"""""""""""""""""""""""""""""""""*+"""""""*""""""fr" """""""""&"""""""""+""""ER""RE+"""""""b&""""r"br"v""""""&+""tg+w gխBtPyKTQzGfz MwIU "פF@-p}T'utjpGPGݑ׸+G tg+w gUUp"DwJttGPQ{+ &pkzJ}wd]]Y'r{wGw}g&wAPR'}z*"&"zv[G'F@UU U]&"+B$b"&&r}t r" +$mBZ{z {RGzwFtuuu Uwwz$pZ*&pw}Y{kp{vw݈j" @w+TpyդT ݽwJtWpUݧykwg*+wJYb]""w*Irw'"*wwK++wzt'Tק'{"r'"GUz{jw'&f'ykwg*+F'vrzGzj"&"zb*b{]Ww """r$w'B""""""bvQz'gjz&zgt$z'B"* "+r""zwGwpww{`'"ztww"z"ww{w@wзKYvv"""DY-r]*"rzzr"bJ"""&"&"'+"gkkvg+wr**g*"""r+wUPer+zr"'ww*"b"w""""""bv"*"f"g"b"&"&rx "kwj"i z"g+ "B]%KtbK"'"+BGFz[T]"D} jv*"Rpg"b"&"&rxI ]UEע)vj{qr""+""r""""r+""&r&z"wzZ{B"&"+F"""""&r+v"r&b&'Z""""""""""&b"BrU]'""""&{""""*"r""'b*""""b&+""'"'**t+r+*r"'g *'ۦBwb"zB{+""+""'@UPU""""tMbBr WtY@r"+F"*"R"&rbr D "%{'rz*"r"+"+`+r{* ]+"r&rpg"t w" $"t Wg"+g+BzBwfWIM+w*"YD&B+*"r"+"PZ%**""$* w"z'*"g&& Etuff""g"G w{rJ*b""""tz}-"vzEer'wMtrwzҦk"""""rw w֤ *pTU+""&"""pgw"r+{Gu}+"rk{Gt gv&r"w'"''b*wjrfb"p++wwg}'"wzwUY@wwp$&bk"rGwr*"Ywz"+""""@bv+"""""""""""""""""""""""""""p""""""""""""""""""""""""""""""""""""""""""B""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""'"j""`"*B'p ݵbB Uוw] ]KE`M] M"&BRUTqwt]w*!" U'"j""`" нz*"{"Yp{& @}wUY{+*dWQt'v"wUMGw}RYwDPչF"b&+bwK]YKE{@'z""*r 'E"+B"'D]J ]]v"&dp*b*$UQYUٙYWuptTQUYYwwGP]]w}""{U!"UYٙYM@df XYYYj""""ݧb{-)PAw"by EI"$ w$}t"r UWUG iН "U@Buj""""UE}w'r" Y"}A" "Pڧw]r'"'ݐww+zAUpݪm"P] EwPݙp@eRp"""+frr׭$ wU]YT}@w"""B$""""B}rwrr"' zE$zB'+k*WzuV}EU wYW}{Gp׵ڵWg'GUݑ D]zt ' +"}QUG$"ׅIUUԻp'+r{}Pp Uw""""""""""""""""""""""""""b"""""""""""""""""""""""""""""""""""""""""""D""""""*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""&""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""""""""""""""""*""""""""""""""""""""""+"""""""E""u"p*w%""&"rt&""@{Z"zru&'b-""""Yz{&*""r "Aj}g"+""""""" ""*+*"]wb"TI*"""""*+r'zWG""b""G'+"""+"w'wu"+"b'r }* zz'U}""""""g&"rP׷r {t""""""r"w""b"""""{fg"zE"""""r"*+u"""""AwRUDyzj+z*wwWU]GG'+"*+wDYDm'"""""""G}$"UUz@vzf""Uuzwf""""""""""I""""+B&"t """"B-" ""W" "r$"""*rb@-""""Bж bT&rU"""K%" "m&""""""""""Pw$""&"""rzwk*"wt*&"""""bp*v'BGp""""""W@m'"""""+"z+t E"""bB'pM"tu -UE""""""'"GG'""Yyg""""""r&"*""""""rwz&wpU""""'Yp"""""zw}+&&'w}wuf"""""*pMppיtv*&""אYU]%"""""""wZ$"pT]rwT""""""r@`"""""""""&*""T""+""""b"""$""&""""b""'""""rzURmBt"]%""r$"BR%*"""""""& w Y'""+"Bp@+uU""""""""""""vf"""+")"b!""b"""""""r""""""&"r@b""""'"k+"""""""""""f"""E P-"b""""""""""""""b""""{*"""""""""""z$""""""U-""B+ݽ""""r"""-'kGt""bgەPU&""""""r"w'"B'GKBr""""Y)b"wup'"jwtj"jb{D{"kD&V&" k&v&"MKGp*{Kzj"r*"+bb+"bK g**v-""bb+wup'"'rzwG &"&"""&"f{zt t+""FdbU *r"""""""Ի+b+&""z+*+r""vb""""b""pwwpKd*"K""ww{TvGz"kg"""Gw['wg*"""v"""""""-""+b"b&b+"bb&"+""""""fG-""+bbݥ+"""v-&k"""""bb"""""+"j"""$"""""""}""b*@"w+" """"Bm" "" +r"$""e"+r "$""""DP@"rP$"P]""" ""@" &""$"""""""Wz'"""""tb"tz'+""""""k"'"rz """""&zM}'""""""*"'"t}"'""""*$r *"'' @""""""+"""z@w'""Eu""""""""""j""""""&"v"""r{u}""""""b+" "twp"""""'"t'"*"" "&&"b"'"+*T """""tE]]]%""""""""*v}$""-ڪB""""""r'}$""G@Gwwww*zt pqwvrMKtww'rwkw{ &$}@wtt`{wgzwzgrwJGpbwPwWtKwz{G@Gwwww*zw'{Uywkw"תz GtwwwB&r"{""{wzRQ*w'{"wJ"*$w'"r+"""fB""]wwwu'pzrz"wtwzw" TUzwtwwz֠" "e&"K@F%r"'-+"www&w++''rg{Jvwprw ''w*"""'zwww'{"'rJuGUz'j"+vwzj"*"B+{vb*{gr] YQ@ww DuzzGצDW{dpwKgg  u`Y@]X"Bww pfzPIW uwMUpw{J] YQ@wwz@ YY@Tw{wzwG٘{zwz{wvW'"z]AtUPݻ"vtgbG pwwZ'YIEpwwwDt&pww"z{GUUupdw DwG"[UQѝE @}trupb+"Tqݹ wpwprUUٲrwfwwww'rzwtwJ}zzzr*""+"w]Q ${*"rIP@zwgMUD-vgtpwwwzw+rzG""""""""""%""{+rg""""""""&"b"""""""""""""V*""""""""""""r""&"+"" "r Q"""""""""*""""""""""""""PU%""*""""r&"&"Fg"""""""""""""""""""""m"""""""b""""""""""""""""""""""""""""""""""""""""""""""""""bY-r'"""""""""""""""""""""""""""""""""""""""""""""b'""""""""""""""'"""""""""""""b""""J""Y""""""""""""""""""b"b"""""""""'b"""""""""""'b""{r w""""""""& """"""""""""""""""""""""bv{"*"""ݻ"rp""b+"B+*""""""""""&jqz'""&"+w]*&w"""""+"""""b""""""""r`""zJz "&"""""""""""""""""""&"""""""""b"&"""""""""""""""""!""""""""""""""""""""""""""""""""""""""&"""""'*"F+"""""r&*""""""b"""""""""+]@ݻ""""www{W *"""""""&++"""Jzr"""""""+""""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"Gw'""JKkBt""{" G "ptutd'z]gzww ePw${"r-KbG{Gwg{'a &b&!"Gw'""r{-rr'@DfbDJ'wwwwM"""'" zҶ"""""""$z'$]'GgG'r"wwbjr""'{ wt}%'gzw&Gw"r"**$""tz}PjE]DywWp}""*wbU ut-"r'Jr"bW""+"`&%z+" {""f"{r+*""fzzwUPB'K{"*b*DAt&'a}բ""""""""z"&b&&""""""r " +"r$u+R}*w%""Z"r Y")b&E"-rU)""f"W]}ZYYz"Y)"{+E'"""""r "W{-"*"""GRz+"ՙuw*'"&{pI[Q""+"z M@$ """"BtM&'"zQuYMRQU"""f" )b&Uw""&"""BG*"bbf"+љ tYb""v"YU} ""b&"W]U}ww-GuwZ t"{f{QYUA Y zwt UUUPw""""wݕ)"{I]w'&"""z}pw""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B%""""""""""""""""""""""""""""""""R""""""""""""""""""""""B$"""z""""""""""""""""""""""""WU)""""""""*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""UU%"b""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" F""""""""""""g""""""""""""""""""""""""""""""""""""""""""&"M"+"'"r&""""d&"b&& p"B+"j"+ "$""&"rz{&r`" FrI+"&'" "g*""""""""&"՗ """+"rrzwb"'"z"""""'jR+"""""IfBw++"""""++R'}uw"+"rr'"G+&B'"""""""'f&"jUG*'""""""v"+""""""'kk+uK""""rb*tw ""b""++'&+""+v`""""""'"'k԰z`{pz"k$"wptt{Pp$'""""}u}'" z{{v""""""bf{w&z""*"""""r'U$"{+ٺе""jbw"t"t)B&U*Pe""""RTwGyd "B)"BM"*"""""r']]g$""+Yݻ"кr"'""r+'B+"&&Ppԕѭw'v"""$GוY"*"rwRYY{GPz)RY""""""`&rT-B&UUڕ{""""}"""""f׶b""r"'rg"*'&""""y'qUGrDwtzwwzDvUYw&*'{Dwb"" zwY)"ByU]WG*"pq++"r""@'r+k{w&"""v w$&w'f"gb" +j&""""rwF{"K pEw' b&g*++"r""zww'""wg& w"&"J"&Fb'"""bpGb*&""r"'+j"wwt"'""'jwzb+g$к*"&"&"++&'gb"U{w+""+&+z""+"bk*""z*"r""r+""&+'&f"""""++r$d"b"zB'"""f"+z$kz}@wzfU[zwwr""** b++ r"""b"b"gw'r"}Ww}@@}PyAwJzxPPWֈI}K }xvtzת*- Ѐu uYזuQ"BJ@zDD{M]IG}Ww}@@}PP)wtg{wG P}@wwp {w*"ԗp{ {{Zuwv"k$ v{zzJ+{{j"+[""tw %""tg pMpb"r'bMEJY)r ku+bXEbrzתM Byuw wJ"p*"*+rjwP'Ҫ" '*jv{J+" tUGWԔA wJ[z """""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""gwk*&Kۧݰrwdp]"vU'B@PYYu{ppMPݭ$z]НU٠WtԹ"]}ۙ}gwk*&Kۧ}""wYYGfUٝYppJP[Pի+rkw]P]U}t'&"B"wPuU*MtUMYpWTUAY]&rUU u{pUUk p""rw$E"&M]@۶+e[׺ժJyGEYݪwYUW]MUU P ]UЪt}GYݕp@twk+"}JPt" uPPU]wRuٕ]kr+"&"bvj*}*{'RշDY)""jr t*PUYfiwu*)"'"RU wUY}]ժ"z!"Kշkr+"&"bvj*MG{*""wUr"YUUU j{+@ժpԙ""&w@ח+""r"}YuQ&'@w}Y k""}{riwu]z{"rw""&r*y""r"&"Mww]r"b"WP'ХU"r""+@ UU}YEЧWTwwwW yY UU]wzzPUEw""r"JPp!"KP]wtk*&"zt} ݺ""""""""""}""""*"r"""""""R$"$""" "vzt"&""M""m"+""""{&"$""FF*"BEJ"""w*""+&""""""""""U׭$""""""rrg"""jk'""""""""r*++%Zkk&"""""E"b""""""""""r"g׷"""bb*"r rG+"{'""""""&&b"""tݧ" """"""b""""""""&e"**&b""""&"'u'""""""&""""""&f' +"""""""+"+k {'r""""JZIwpwG*""""""rwkz*"*r"r""""""&j+""r"""&{t"k$r-$@ Pj""WMwwjpT"'z*p Pb&$"rwBwp{}{ @MJ p'"@rtr"""&{t"Uu+*$"rwG"Gwz@{"*"}ME&"r*ztGrGwwjb"mWp-"JwtEIҺzp}UzZItzj"""""bw۽'z]]}z""" *""r""zէjurb+` WE {*fB""wwrw}wwW}w{jvݫdu۷w}wt]tw@}w*t""WQuv'"Wp@Gw{w"+"tww""'""""""""b*@"'@ """" }+ "Dzwpw"w """'rв """"@PG tj ]"rT"" "" "}*""'""""""]EW &"""" "" }G'+"*""r'&""""зMM """"" *t+wt"'"*"{z'rDMtrrwzd """"""'""b$""UU ղw"""""""""w""""""'{*""Pb""""r"-*tGM"""""jb "+Twwv""zk{}'rTU]D"""+wpYUe""""r"r*w $""`-{bb""""B}}{"zr*+z+{'"M'rItT+"rrw}d" QuuPwwM*}yԙz prBupZDzGGMPM' X$" *G*zr*+z+{'"G%Bz'"""wtwpw'+w wGtw$PYYP%f""w*G}Bw*b"""*PWEwwݭҴD}wz`fj{JU]yJww Pt*z*""kP]FYErg""WקՔՙu{' g*{bw})rvt{zfzwBw  "wPwzttU}tW ""r@ v$" t*gw+"&"r]kwJ"twtyw [tp[WwAwwWѝxJJYMy@ MwgwGw] ]w е+ Ptwtyw}@ tku@W]зUUzwJwGzKu}utww xBb ՙUPwTݕ}]Gw[}v}zwv@@}U }"+rtv'VBuEGrp[תVJw'pwpwvwtU ݑ MUїYUMz}TYQ GD]נ PU"-TpU+ G]@ tuU""""""""""""""@+w*F'""""r)' """ "r"B*"""&b "{$""""rwGt"r*""W`+"$""{'"b "-&""""""""""Й%""""""wt*"E}pww*"""""*"+r{Gg"""""rTt$ """"b"""r"}""""""'*rz"rbb''rj""""""r`""&zz*""]IJy+""""""""*""""""+"'++**zMb""""""g+r'"""""ppw{'""""rww*"""""""&'+P@wۙp+"""FpUwut"""""bwww'"b}wt""""""jw$"""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""wwzzwk"QDg""r-b׻"w'"&"Re"+"b""*KzD""bwz+"r"""""B"bWjb&j"wb" -""wwzzwk"&xGt&"""""""""׶b+"+"""""""zwky"b""""""""""&"'""""""&"*"""b""""""r""'&*b*&"+'"zz'"pMP*++&"""""""*"""v&g*""""*"""pww""""""""""""""""""b*""""""""""""""""+{W&""*"""""*f&"""""wb"""""""{"""+%""""""""b"""""""" "*'"""""r"""""""""""&$"""" "+d-R""""""""""""bB""Ҥ""g+$""""""b"""""""" '"""""*"{""""""""""""""r$"v&'&+v"""""""{!"""""""""""b"&k""**"""""+"'"""z*""+""}""""""""-*""""""pz"""""""""{"""" ""++u""'"+"""+"ff)}"b"""""""""""""""""""""""""""""*"*"v*""""""b""]pGk"r"'""""""z"*"r"$""""""""""""""""""""""""""""""zri+""B*""""""&r&"&"""""""""r""R """"""""""""b""""""""v"" """"""f""""""""""""z&""wz!"""""""""r""""""""""""""""""rk"g""""""""""""""""""""""""""""""""""""""""""""""""""""r""&"""wabw-""""""""""""""""""""""""""""""""+"""""""""""""""""""""""""""""""""""""b"""""+"{"""""+b""Bm""""""""""""""""""""""""""""""w{ww׭EpGWԔДyuutZ WIwէ]}ׄJ]E@}} $pWYPGt @U f WPpw{ww׭Uн]U@pwtwJ]Mu ں ڻR}"[WGpzG Att"JTv]Z۷wwg +zzwwwRpwjJ]@ڕ]YU*'DrpЫ jRz{&Er'@zw Bf}''K@r'Z]ۥywy TPJtїM]WgU'"g tz*M +UDIb-wv f rwtYWp$uJ""""&""'"ٲ"*y'}gK)""+bqw"IT"J) " )"""bݗ]wuzwJz"")"BYgu""""&""'"T ""*""Ywg"wg"*""p'Kt"""fwM'b"""rbwgw"*"{tRGz]@)B""""""'+)"b""""r&}""""""'W""r"v zpQ""""&PP]ypwDw]Ptw+wwwppwpTUUQ+w&"b"k{Y)"BّYw&+" }ww""""""""""}"""""B&""$""""r "w""" " "r*""""b"v'""""BwG"*""'"bT$""$""p"r'"""""""""""Ttw'""""""B{z+""t """"""""$"b+}r *""""""rvDw&'"""""""""'$""""""-'pM""'")*'"""""""""zw*""z *"""""""""""""""""+''"*{ """""""'''v@'"""""{w}""""""kvz'+"""""""""-$przpBU$z"""""]M t-`""""""''w'""'FbBK""""""B*w'""""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""Jgwdp"@ w]"wݧw*&ut wwDw} PP{'Gtbr wwJp]`E$bjjjJgwdp"%zD{zwjwwM{*UwJz'"&"z'}zwrvb"b"+"$ Gwtpa*wwpw-r+J w}vpz'"bzw}pwڽ'wDw']b*}""wrw}P{Zwup}u"""Vݩ wPw%gzrDb&bkk-G'rwwzrgwr*"b{zztwPPuE{gb*"pwjZDUw@r$bwzw&k+r"b+"w*f"""""""*"Y""+I+R}Jw-""+"ry""׶ztT"{-b "'r׷w """"АYw}zיz""F%"rYu"""""""*"Y'""*""UGk" wr"*""w$wwrW]""""Z]]Y'b"&"""++'tE"+"jj'rwKww """"""+"v bUz&"""""r"""""""*wg'zIUB"""z*wp"""""uutDKPAUz+zz+}JYGWw*wtYUj"""""fwwT -"rYDYkwgj*"Rݙy}wj""""""""""p""""+"r+""" """""$" """""'"b"" "" """b""$""""Bw"*"""K'"""""$""$"B+"""""""""""{}Gr*""""""b""""G"'r""""""""""""""&"""""B"r+ """"""""""""""'"""""""""ww"""""""""+"""""""""""'""'''""""""""""""""""""""""""""+""""""""""""&B""""""'"r""""""+B"z"""""""""""""""J '""""""w& w """""""""""'""'"b"+"""""""""Bj""""""""t""*"&"$D+DBp'""'rGwpb@G@t@M" **@*$pB@'"""rzDGGtt 'D $"{@Gt""""t""*"t b+"+"""@B@tt"TtGG""""rW'{w""r"wDpw}Jr&"@twttwrDw@}GgGBDJ%rw""""""ק"ptp**Kw&'"""rr*p""""""' ww"""""D'Gpw"""" tzvpttwww{pGt}MwtzMpw'wԤGz*w@ GJk'+*w"&@Wp$"{WG@Gtwg+"pzwJppz"""""""B{**"""-RT"'"""Q"f"""'k@"b$"""*" ""+"BGZjRmrrAp"P]-"" "BRi*"""""""B{*}Y)'""""B}"}utU"""""b""""+{K""*"%r!f""""""FGM"""""*"rww""kb+"+pt""""""""""+v'""]U-"""""""w"""""""""""F"j"""""""&'+{-""""I' T-""B'Yp""r&+r"""Y@Gw""Y] """""" '@ $"B ZPBU""r""rU)k"""""""""""r""""r*b"""""""""r&"""""""""""""""[ """"""""""""r"""'""""BK"r """"""""""""""""""""""""GVP)r""""""""""""""""""""""""""""""""""g""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""՝)K-""""""""""""""""""""""""""""""""""""""""""""""""""""""""'""""""""""""""""""""&p""""zwr""B"""""""""""""""""""""""""""""""""""&&""""rj&*b"&E&Rt%""*"Bu*"@׶J]"z-+ +'FT-"+""RД]GMz'Y"f-"UjR'"&&""""rj&PE$'""&bНG"yDw"*z"r*z """"Tې '""b" +t't]"*"{w*U`Bzvw%Y""""""'"rw +U]Yw+f"""bb""""""kB*b E"""+"j*WYE""""}kzww"}Gfz {t*{WUUUM{"'tYUU"""{U-"}]TPUWzz"k""Yw""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""&""""*"ujb +REK h""zB EwE+wѝ"za* M!""bpIDԑJY"k!"v 'p&""""*" G"*+"&{Y"Ր]b&Bwۺׄ&"'Ptwg&"""EW+kztkwVtb"&b"jriEݝP p"w"""+}""r"""z ڷwG""r"Jۺ+"""&*ptw w{twpwU{ݧ@@GXUpP+gD YYP`&""+{)"vQGwzw+"""tMtwM""""b"""""Zr+"KGJBG""""""'K'"J""+"""""$"""""""""rB"`""bu"%""*""t*"*""""b"""""UPY%"""&Gt"'"DG""""""""""""""""""j*y""k}&"{wb"""""$+"""""""&""""""""""f*'""""""""""+""""dz" '"""""""""""""""""""""""""""""""""""+""""""" b"""""z""""""*"&"+"&"+""*pUw""""PEU"bb"r"*"""&z*"""""rGf{"b"""&"*$r"""""""""""""**"r""""""""j"ft+w$"*"" "+z`[*""""zB&*"kvK+Iw""&u*"J"b+"""""""""""Z*""""""v"""'""""""""rzgZ*j&"""""A+r+"""""&+'v*@"*"rrw'{עw*"&+""""""**w"""{""&"""""{"+""""""'ztл+bb""*"w'yt{j""""""b+"'+"""&g**""""""*"+*w'z*z*&"*"TYw@z{&"""""utw{{*"JBvbbv""""""""&+"""""""""ҷ"&"r 'U}Um""" YpUUY"%u+-WUzս""*"КUY]UДy}t+z%"Vpy""""""ҷ"PUmf&"""UY"YYU}"$""M]`Wu]ZIG&"r+PWսz*"r]Y "twUՒUwWpWYQ!P""""""mJUP%Uzw'z"""Br+""b""rwUE%TWErr"B"U }]G+"""uWUYUIWYUݝݻ}EGݤwQZyGՙQwGt]M'wk"r"w%"VPPّUз'"@ Y Yw""""""""""""r*'"""zU&"""'+g"w*tGG"$"""$Kr$""&"brgb "{zD*A"" '"wj"r+""""""""""Dpr*"""""bw"""{w*b&"""'*"r]y['+""*"yB"'"""""r{v'w&'"rJd'rw wtz w+B'*"""b"{g *""tGGw*b""""""B"""b+""ypb""B{'tUzۺ""b"""k"j'*+"+&`&"""{"bwtgw'bz{j"wpzrz"""""bZw@{z'"w{{""""""""G"'"*"b"""""+"$"'u"R}*{U!""&֥ "B{q" fE"m!""" ]uwU* Yz")"K *}$b"""""+"PYW`" """zUUz""UT*"b"FIw""b"k]VP} """""zGw"j"tG B"""bf"m'{fՕUJz""b"""ku"bb"*Zdb"&"חkw""""+Pywwpww{kwwzpP ИY]Uz{"PYY]Y}g"""jGwD)"KїJJgz*"""BpEzG""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""%"""b"+""""""""&"""""""""""""""""""""""""""""""""""t&"+""""""""""""""""""""""""])"""""""+*""+"+""""""""""""""""""""bk""""b*""""""""""""""""""""""""""""""""""""""""""""""""""++""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""z""""""rb""v""""""""""""""""""""""""""""""""""""""""""""""""F*"""""""""""'""""""""""""""""U"""""""""""""&""""""rD""r%"""""""""""""""""""""*v)""""""b*""""""b"""""""""""""""""""""r""""""""""""""""""""""""""""""""""""""""""""""""""""""""""UдU%"""""""""""""""""""""""""""""""""""""""""""""+""""""""""""""""""""""""""""""rgDw$"""""+wwJ MU""""""""""""""""""""""""""""""""""""""""""r"*'"*-R}r*"""BbB&&p " ""Y&$Fpzv'""'"rwZջRrKԔy}b]p+jW "ݫҠ'"""""""r"UU)"'"'"RPM"UM }"""""r&&r'Rtwg""*" w-bb+"B"+"-}"+""bj"z}U-Э""""""v$"r t$""UUPY-&"""""@""""""+"B '"}t"r"B"&"*''wDt$""r""YU -**"B}"r"w"*M "]ҭt Yww"& А]Egk"r"wu]$"@ "r""r-z"ETttw'"r$u*"""'""*bww")""""""""""" jwݪ""Bz'""""""""""'""bRd"&"r-""ETttw'"r""Bww""""""r""""""b"'"bb""""""""{w'""""""""""" """"""""b""""""&""""""""""""""*+b'""++"ww"*"g"rGwyJwyr+r""""""""*"""B"+*""""'"""Mwz"""""""""""""""""""""""""""""""""""""""r{b""""""""""+tb""""""&"""""""""r"""%"""""""wwMGWE@ YGpG]WwMtE@{uPwmiwT uׇXuwfrЙPЧwKDTY Gt* НwwMGWE@Iw]wxw}pDDGPwwwRt wrpB-"}WDwPz}J ڔQMwbT٧{MMQZ'zwWtk*T&*zzz rwwk]٪@pzMMz-Jw K&r'ttFt)rzgMjuYwwp@TtսKW]tIT}Gr W&"'{@ՕwtwpUY"-wzwJp* ׭{pEYXGd+""z""r*y` ]"v-" y rDb " " $B*)&JG+gwzBwB "TU&r Wg"r$*d+""z""r*$TGw f"r bT]"""""""""B'"""+ ""bw'B]D"""+" """"k"f'""""*"+& """"""{"""r+""B*utfBYUU$""""&z""""b'"r"""j"""b"&rf&""+* "}rv{"B+' '"+&R+-"""b*"+""&"pvIU&b""zw"ҔpwJ" """bd"r*"" ڷrRr'"+z-rbDw+wt}"MKpG}'btr@թ*YEqYPG]p}MM]{*uG{BWt Y MI $&u@KwDw+wt}"% zft uMg@ww}}*UWMW]]W-"F*w TRz+&$XYPwpygWѝR'Ywdkjp M wupUUGwװ""wuU{ wTuMUB'"@R`Z]}zRwrJGD}wYK T JtwtVpt{M*&GwYU ݠ@Zw Y$[Uy{$&Tww G 'wdGwwpr$xp dvzw@zw 'gJJ*$DtP`$ UQ("+vww'vG`" p"xGgwzrprv$&R] &`+w{brtwMMpt+r{K"""{q+zw""rt*&MB+"wdw"+{v'""zz""@p FwK$+"tPPrG""RՍA Gp}w"+"""Uqz-Dg}""]"""b"rz'bwwJ{g{{v"k+""""r+bwGf"""&zr""j'pz'&"&&xG$b"''""wt{wwz*grvbwrۤ$w'""" d""""""{""*"R-"""""""""""t*bBtv&""rF"""""""""""""r`"""r"W""""""rۤ$w'""""""wKv+""""""""""""""*""r"""""""""+""""""""""""""""""""""""""""""""""""""""""+$"w""*&""&""b"""" ""w bB"+B+"b""""""+"""r""r'"""""""""gD*"+""""""""""+""""""""""""""""""""""""""""B"*"""""""""""F@&"""""W""""""""""""""""""""""GW@pUxgAt&wwGA &{'w*+Wjtw*AzyDw@dYYPe"B{wvH&' qzz'{{GW@pUx{w'ՐMbdrw$zwGtUx wGvzr}'"Gq"Y*zv"*"""Uw*&tg{j"{z+'krb"GYYЙxKtv"wyD{ww"zgUUPQt@k{vקb""p@@`zzDGe"z UUbbbw++gw'r"zgzzk""""r+"wW '+b&r""r}G'rwwv'*+&$rzk"fw'zjr""""&""B P$r"kxҗKD""&Brkb"$&$$F@B"+$"r E{]fP $ "G""""&""B Mpyw$b"'vz'}}wr"+b"p@"+*Kfk-"i"IrPy "r"*bvtGw "+" g{@%ݧk""""""'+rgrK & ڕyw """"B+""b""b+fb"}rb""" +'-w'*B""GZ`@PT{zwk d f}z&+rz]ݠ T]@t*"&TJ "kt[wvDpz} p""""""""b"""""- '""""""""u"J"""K"b""k""&""""b""b"""""F"r+""bvu"Z])""*"rt"r*"""""""""b"wt!"&""""r P"w`'""""""""""&b""""""""R'""$""""""""""ֶ""""""+"&"""""""*"*"""""""""""r"""DY!"""""""""""""""""b+"""""""""""""&+&"+"""""g"g*""""b*w&+"""""""""""""""{wwYէ""GЙ"""""""z++"r'rBv""""""rw*"""k"b"+""raխ +DFڙvGҦ"*gG"{`"F+Bz]- `vFv+&gb'wwtvwDT]]"G}y['" @puk"b"+""raս] v* zGiwvW"&r"z"r"k"+m*"z}v"GwW@]+r"*bJD""""wr*{* "g׷+"""""""&"{++BzB]P*"""r&""r""*"""eb&"""$bk&" &"br&*'{r'd+'gt{wr Gzbw b*'"' Y]Ub"kurrKPwr"*k{'""vywrw w w'KUwF'""bF'"*ۭu"R@T-"*rPtu}"]}UAwwE&uYr'rwTw}z*ZY%bw*$F'""bF'"I*""ڕ wb"Y}DDYQIP@E"b"EWwuz*""""[ՕYQUْYUXQRwbbwzzIEQwwՕP &bk"""RP &vvwwQ ]Pr"WpUU]*wr** uDeWP}wwZQّwTGwYQUPuUtzw{"r ՝%bw J}*"""Rݧ D"'{"b}* `rD'ptUuwbrG Uip]YUץK }WT M"+vRp؉Ptt*P!& U ڙث'{"b}*E@""Jw"YYpK{j{TWtYw'*wDZѐY)k"rbw]IY+WוUZu]Uy YQ*bwzFU٥KPwK@""*r*"&r"$"}PztwWvb"M{t*j'Tt  DQ@PYݐY]DtwP]G}zGt"r"](& E]YYpGՑUDJ@ w}QxDJKHvypB w T+%E@MAp }UDԠGw*rt  DPpTwzDJDJ@ wPM%wUGt {WwwGuֺr"R"&Y*ԠtJz{{wt{"gР}{twyZfvkbb*""twwݷtwww&Mut wpK}}t{wz v"r*bݗE)B"w +"M zD}*Fwwrwt}m pwGpvGP '`*"+&{z}]t'wҢ+r{'b&wPwz+bJwDG zzw*wwڪ """"""""""}"""""$""$""""""""r""$" ""'""m""bB"$""""wf""$" ]+"""'"""B$""""""""""" w'""""""r'{r""}k'b""""""""""""JwG"""""J+r{ @-&"""""""""""z""""""""bw""""""+'"G}"""""""""""J{*""peb""""""""""""""""""b"""bt"""""""""*"zD""""" "z'"&""*w"""""""&"""*"Jww """""wpE%*"""""""""w'""'*rֲzr""""""rkw """Gwwwq}t YUy@wqz(QXU ՝wGW}шQYY pݐgTQXGwwwq }wwtt+pYTՔ@U]WUtw@Qw]i& YYwXXXTwY ] WUݝ@wڧGp+wRZzMzQPБ}UPلJZzԝTp]Y}wtppMY]ՁYxݕp tP}՗t@VԙYgTQx@HIUYI"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""r""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""r""b"""""%""r """"R""""r"""" *F*$"R'""-"d}Қ&"""""rb""""B+"p""@$r""""""r""b"""""TR-"""""""""&"""""*"""""!+@*)'*]'""""""w!""b""""""""rk*w"' &""'*'b"j$z&"'*" """""""") B*"&'""W+""""""""+""ej "e"'"""rruD"w!ѫ"""""""""""+""""""""""""""j"kk'{+""pr""""MbB")"""""]b *r&""""""""""""""""""""&"""""""-""'+"b""KI""""&"&""'K-$"V&"" "jw '"""""rb""&"G"&IP""B*&""""&"""""""WR%"""""""z"*"""bb&"""""-"wagd *""""""a""r""""""""bzr-*'"rbw*'r`W"+++@"""""b"r-r*"&""""""""""r{z"bb"gtq "'&r"rG&wp JB"""""""f""+""""&b"""+""""b"bbw-w*""wW&""&&tGz""""""bpWy"rr++r""b""""""""{"&""""TQxgrWzwGw[r-$twTKm%MHg]h&zwwpKT&ڐqtApwzKTQxgrw$'R݀p{{zvwzGwpvDw{Gr'"zx*py{"'"wwwwww'wЕwy"w"bzqbbuPpJ}HKG"w+ҝ wpwwzzwtb+"H{wtpwbمrwvrzwww'rw}pװwwzw*w""+"{*]٪*+b+""uבG**zA-'"'Gw}wtzw$'rGGJwtG@GDww]+rڷR zM-+H@}tMM} u"r wZwwGrDYmڤIzHgtJwtG@-vtj{wקwwwGEDy@א`""}+ՠ "&b"*"+qGwzpdkwtVkwwgRrz}@WY]ztMdTݲg'p jG UEDwՕT ]U+"ZU ]a{z[w@rPrpw$rwwwDw֧zwzt*"vzvPPw{-Z"*zWYpwtzHy*+'z*"*brP* vwrb""""'"]$B*kЧ{'""&b{P''b&JbKk"b+$d{k "+""BDWTEbJE[@"k$"rкFu+b""""'"E p'""ww*@}uz@"+""zG"++r""b"u ]P v'b""*"&zp"+"**pz*+p wp""""""*""r*zb+GUP """"&d""""""&""$"""""""&Jt"""" gU%wM&]Zխ b&{f'p'{t@D@UMt"&]]Pp"""*r"{p$"r* @TGwff"v"}w"pUPIzMM@pWUYpНyw@GqWAyE] YIU@]p{yJP ٝ@QWpUPIz]%pD Iy@w]U]Y]PMݙwt٦GQkՉՠJէEX٧wT rUQI@]]z JԭE]QQQBdP]T]YPUy [wUI@QQUY@Zpз+z UwԽ[kwzՑY MIupYHDyGYtՙ""""""""""""""p"D""r-""""t" """" fw""$"" ""b&" """"rtD "R ""B'"" $"" ""P"-"""""""""""wr@-""""""rDw""wp t"""""""*"""+"W """""K'B '"""""""""""}""""""&"@{"""*"''""""""""""Mt&"" }}Jp+""""""""+""""""""b"""br$""""""""""E"""""Х*}w'"""r}'"""""""""""z "twwww"""""jp w}p""""""b"r$""$wr[ ݲ"""""rݭ-""""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""@$rr""""""""""z""""""+"f""""""""b"""""""""r'"b""""""ې!""""""b"b""""""""""""w)""""""`rD"w+*br""""""""""""""""""""R+""'"""""""""""""""""""&""*"""""""+""+"""""""""""""""""U{ '""""""""""""""""""+""""r""""""""""""""""""""*'""""""""""r"""""""""""""""""""tj"""""jP""""""""""&"""""b""""""""""*&"""""&""""*" ""r'"& $""b g"rU* y"W ""y" Z B] ""+"rw "VTpgPb"U%"z}"Bp'"&""""*" """""wM}""g'&+*&]qw""*" rvB{w%*""""rzwIu+'" )U}YJ٧t"""r"WRpwW'""Y]'r""""""+w"bbk"wYyG}""{gWwYuy}"""""{D@j$'-r'{*""""qvIq% wpB{+Y]Y*"&b""D-"zW] bzG+"""""Drw+g"wfg$ PbrB*'rwW(vw"t&"$*ZrwM+'wR *{w"rzzwzF"zTGJ$wg"& wwfg$z'zPAk*""{v'P&"""k""""'"+rp"w'"b prWU""+"'rt{""""{r"b""""""k{""{"b"z+k"r'+"ZrwMDt$*z+"&"r&"""" """rdr'b"&**"""ՠww"r"''g&''rgr"zrG'&""""bJ"'wB"rwwDwb+"""&"""'*Тwzw"+w'r""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" *""""""""""""""""""""""""""""""""""""r*""""k""D""{t$"BDKp$""&"t+w+"BtzMt'"t$"g"@tFD$"""""r@JJwbtGtzwGv" G'"b"p "r*""""k""p'&""""GDgb""GptK""t*ptww{$bp""b"Br'r"""""""B GtGw""WGt rMtDJw'+""""Br"p''rwg'"g$G}z"r""""""rK'D""rbw@p pr""rr r"w Mr""""""rprw*bt$*rz$b"@"G{Gwp$pg" w*rwwGww$wr $"kw""rJ'tz'"bj} """"""""rm"t"pEpty{}@u@@G ]P@wyJ@pIqPyIٔ@]@}}u}]P p&rwwp{YХA P`MpEpty{ U%DY@Tww}GtwGW }@v z}KP tWZMX}}AMy{}t@X*Hpw [kb@TG}]TUvww[Y jDMGWww G r'"}JPgwy r{Drwwwwp} wT@pwWwW zGJ++jwwMUװMwEVwjrwtW}Mpp ` wGwtw z""""""""""td*""vrw""""""z{R$j"+""""{"""""*"""""""""""BB"B """@"ҽ&""'""&"$""""""""""""wtw@'""""bbj+"'"ww""""""""""""""""""'E"""''""""br"*"""'F+"""""""""""""""""""g'"""""""""""""""""-z"p'""""""""""""""""""""""""""""""""""""""""""""r$""""""&g"""""&""&&"""b"""*'D"&""IR"rRY""""""""G&""""r""""""""""""'""b"*""""frPj"TY ZYJK'"j{ջJ"+w+z- DJ'gzwWpuvGv&RE r "TQ g*""""fr}GUUi"&wrU}Yj"+"v""+*t"rA*bGIк"*""ק""""*r+'"**tg"""+""""'&z]}WEGW'"+"f+""""*"""}bb""r"&B*" j{r${w% z"jWvr{f&zdz+ '+{$݈&""" V{@k"'r"w "'*vݙ{"iz"""""""B)`""ԘB"" +*G"""'&'"&"b$&rb"""'"rjBҷf"}& '"Pdw"""""""B)GI-" "jpT)]"""""`r"""r&"" ""z"" Wzw"""""""""b"*&r"""b+'J"""""""""""r&""&"bMt{ +"""b"""b""b""r"""'b'"""b"*""""+b+**"r""%J''"+w""rb$+""R+"fj"YG""b"EpwzWj"""w'""ҢU]vzjw$w"'""""&"""'}"D*%""" u "G] uT]"{%&"'{T%""""RPzEU+F]U""%"F+ "'""""&"U'"+"""zwb"Mt*"&+""{wkz'vY""""PwRTݧ """"r"twוY"$& t+zzB TpeYY""""b"zjbWU%&UY""b"""*""b"""zwgkgP""r"{zw'շU"""""wwuzwgwdgMW@z&zw}pPDGY]Up"wDPYUUU]Y-"""b"jzzY-"FT֢""""rսw"{r'"""""""wB *"+ ""r"B'g$"rp- "*brp"teW*"++"Bg*k"ۤt+[*I`"*{r'"""""" +"""''"wg"""w'+"w*+אMyMV-&*""'"yrv"*"""""wM@wzpt-"z}ekg}עz*&""""brbt}-z*br T $"""""""rzt"rrwg ty Gb""ڷuvwyUk""""w&"'++"*v*"bkb""""kr"zwjw "P wY }-"""ՀzT{{*IK["'""""""""r"'"*""""""z@]Z"" JU"b*"w'['T'"""'"""""-"k"bB+"'&"Btb"r]"ҵEz"*" `*""""""z@uw{UU)w'%"r+]`dU""""""""""""b&"rw"u""peTzb"""""*r*""""b""*""r"""""""rg""""""""""""""""} vYYIT "&""+""""""r"""""*"&"""""&r"+"*+"+"rb" bbr'k+""+{"'""f"""b++"""+"'bwYTU""""W R[b"""r"z+"""@wpzp`"*z$b""""""&"+"&E"y+rG)""KBruz+"Tf@y"F%"&tBPb)"""b}yt}Jdw""+%"$Ҡb""""""&"tDG""*+"bRٕD"" T]+"""""r&"B&*F""$$WGD}u +""""+"p*K "+"*{tr"{w """"""+*&rp-"pGW""*"""b""""r"""BK "J Y""""b""''E""""&tw* w wG@zТ'wjzzYwf&+'+wwTUM """"""BzPY%"Mw G""""Ptݻ@YM'"*x""+"+"ww"R"+""""""""BDtw*&r Gw'"B"""""""""r'"&ڠ"rq""+b"@YM'"bw*"Bww*+"&""""""b+$r"""""v"""rw'"+"""""""""z"""""&""b"&""""""""""""""""""wqqv'b*r*""BDtwb"r"rwEWGxwzwww+r&""""'"""zgv*b""'"""Gptw"""""""""""b"""""b""b"""""""""""""""""bzzb"""""""""'rZ*"""""rq+"""""""""""*"""""""""""""""""""" z'"&""""" """"r'""r+""""rd"r"""""r*J}"B'""Kj")""$"r"r """""""""""}W!""""""tp"uݽw'""""""""""'""""""*"@t """"""""r"&""""""'"g"b""""r'"""""""$"""++"" Y'""""""""&""""""""r """"r*""""""""+$j"b""""""}"G*""""r'פd*"""""""&"'"pb'$ YU""Q """""""pw$"r'{Tz""""""w$"""wB+zBy @UJw+}JԭЅty&WJie&KrG)Dw GTw+v"KDG @Dz' Dw֤&[ UwB+zByYUP{! twGUEwp{P"&'r"wr"v"+xRѧDJbZPr"${wAw"+"fwwpA*jFf'ww&*b&"" b&Bzp'rG BEY'"br'"&""rg&v+""+"v+r* "e'fBuRz`*z{p'zGKwtpwvw'{"jW&"'vݤ՝r&bD BZ}@K"'Z&gIp{*'׷ PT"""""""""k)r""vYrB""b""b"" "{ """""""""""""*"""""b"""""r"'"""""r"""""vw*'""""""""""k'"YU)""'"b*"w%d*"G"""""""""""b"""&""&" ""Gg" """"""""b""""""""""""""""""""b""""""""""""""""""g{ibv'""""""""""""""""""""""""""""""""+""&&""""+""r+"""""rr"'""""""""""""""""""DpYzz""""wwRb"&"""""""+""+""wzzw"r"""'"kw'"""zz}bE{ Q*u`r+R xD щ]X{zzڧZY]u] Ad]!ٵuzz}b ytz++Xz"YuGِM]Eؙz &w@A@+"&GwՋYQU{wP@ ]xDEPK"vb&RJ[J] ZzpPwQUQQ QQYuxUYwWMP@{KPt+V (ԑYw@yuU`jէ"""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""bK'U'++rrr""" ЪMt+@"K*b] gtJ""$"rwrwJ t%+ '"RDg""""""bK'UUM-r'rwF*twwP""""t"r&*'b+'"B-zWpGz"r&*'g@'K"'"b-f ײ-R+""""""*+"r *bUPe """f"G""""j"v'""+"r""*f''*"B""Gr''zg"MTgpr{t"R& +'*pt]M]"*Fww BTקpw""&vtpr'"RbGvFG{rv+"{ w'wf+"&"z""+e"ZuK{+"+ Tp"z"'&+w+ ${kf*&"{wۗ@y JybEٲ "rTt*+"&"z""+K@UYe"p+tF]ݭ uUu""*b"B"""Br""pb"pZ-K}z"&&b"w"+""r*b'{"+b'"*'*wt-&"""""""*bw+JPw+""""" ""b"""*"v"""b+"b""r"""""'jb"$Kg%z""v""g" 'z`Uw""+"] KbkB"'&@ "r -ڝTTrzK+"$%Zr""""""""'"U"'""$zgr+""""Rq*bB"M&z"B*"""*b+""&"r@" "WmGbY'"*'"p"r +"""""""'"YU%"&"'""rpGt"}wwg"""""r'&B'iR+"""""tpu b"+""""R'pt"*"+"*r"GKG+ *Vw'"""""" ""'w*""Up'""""""""""""""$"-""{z""""""*- M}z*""b""}"$""""r*Mm """"""'*"]z Y +wp""[QYYw Uuw"""r"w}{$"ҧGzJz"""b""kz} &"&""""""rvq]u"" vbb&"'b['ZԷ"f""++'"""T bb"fr+"$"+rwB&"P"Ҡu"+"Vdd&""""""rvquwMv"-"*a'&g"""""*"""""""m"r}"u""wzTepr""""b*"*"""""""&""""r""+&B&""""""""""""""@wrYyp*""""""""""""""+"*""""b""b"+"+"+""B"" &"B''b'b"+ r'"""""""R&""+"wY""""ݤzZb"""r""+""r"]Բv '"' w"+"""""u"*b"'-Ry Ф"""rUDwUZ " &U+ t`""*"TЗ]]@*fW%"R@ y"+"""""u"T]Uij'b"&rT "YY]y"*"" ' ' *"B*"WEDہYww""'fJeWP"'"{ RDUנ]@)""""""'rpp &]Umj{"""b"p""b"""ww'FtZr"r"&v+ }}Mw&""" UMХ@ EwuQ @wGZt{ }p}p'*G}Pw}G""+v]MT%"RYP wzt$"zٕyYw""""""""""w""""w"B""r'""""""+"""$"K""+"""""b"" """"GGJ'""J""rw$"""'""t"B'+""""""""""wzJw'b"""""r{ww""wj`""""""""""""bGg"""""r*rKzwg*"*""""""""'k""""""*"wG""""""*""w`"""""""""""bk+""Gw *""""""""&""""""""""""""&"""""""""""ҽ"""""'j"'"""""ww'b""""""""&"'""kJGj}w""""""zwwwwG'"""""""""+""'"rv"""""""b*pw'""fkkJf*vMz { Mfg&*wK@+ڷ+$gzvdwzz*zGw{KP rezKf dJwfkkJf*vK}wjGM&fv&{"&"rz""vfpY+bwjfkB"*kk}wp"'+wz{%r{&r*"+jG&"w*v*+r+vz ]}}pp+"jw&b+"'bvk""G+bzr'r"k*''"r'rwrgg&jRg{wt}w+'"* }{Y '"GtRbRYvJb''tzf*+rr׺ Bv&"-zgwv"""""""&""""*I&Rp+ %""""rgY"b"zP"-"b "'$%""""QvJ @g'""v-"Y+*"""""""&"-""+""RUtf"UUI w+b""""{'*rgGrPE"""""zVUY'""""r"&"'w]E"""""r*BY"r"rzw-Y""""""r&"]U'"bQzu+"""""""g""""""""vg$'}MBb"b""&"zWUy"""""Quy'j*VU"{gb"p'*T{PUD״z+"+wtՕyw"""""bzW "Y"+""Rݑ {"""""""""""""r'$"B"*"b""g&"B+G "R'""e"$yr$""""wFw*+"DT״+P""f "w"r&""""""""""{ """""wJt""ww$*"""&""}`g""&""qf{{**""""b*'* }"'"Bz-}wG]tp*]'""""""mrwG+""M"""""""@"*""""""kDuqp* z{""r' bUM """"""J+*'"&"*r'j"""" & b@'wTj"&ݍu wY*""""" Ez'"w`{ z"z""""""rwg"f""""""""b""$j"Bt""""""z-"b"K+b+""r""*'"k""""""rwҶ}""B}E$k" "b+rd*"""""""b""}rM'""&"'z+G$"t"""""""""""""""g""g+"&"""&"""'k"*""""b'"+""""""'&p**""""""""""$"'"" w'""""""B""""""""r"""""&""""""""""""""""""""" f*"b"R-J"""""""b"&""r'"r'ppw"*""PU" R""*"""f'"b""""""""""$ 'r"r""""""+"Ej"'u"y*rt!""{rryz &" pq"{ib"GB@)"""pyt@Db""&)" dҠr""""""+"@DYtw""''&rRYYw""Д*"""""B+B+r""''Gt w &""""j"}*J"j"wkr"wJפ'""""""*&&rDeb}w""f""""b'""r"""{G${&tb""" "`*""""+uDdzw@FwzDwGtwݢjpw{wgb++GY@-""""""rtQ%"YY]wz """B ݧzDbv+bG"fg"}* 'MP "r'r}*rYQIUw}*pb+w Q@TIJ'-"Wٰҕ}bv+bG"fg"׭wj*b"ZY]w"@ MJp&UX] J""w"GYYw+""rPU UtY}PՕQYY!"""vQԩw}P]ww+{""+P$Y"r+ڕYٝWDJ"+Յqw'rj*Ww DyZԝGztuGI}ՕQUjwYY]Uw Dw"Ҷ-"W] gk*+R]U z"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$""""""""""""""""""""""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B'+J"'""b$"rr*""*'r+"rwt'-b*fjMM"++rb"rkb'" wtP"T''"b+"B'+J"'""])j""+"z@"k""*+'"*"W(*'++Z"""rb!w*r""+"""""z*zw"{&*) "uK"+[""""*vzbD'&&'fjpН*k*"""'R&"K""'""[Ay{Eaѫ+"'"bb+'&*"&+"'"b""z'Mwz''""k$bwwtGvG ")""U*{G'&"b""""""""b*""""""""""k"&""+U*Rgb ""f"rE*"" "v"$""U"$B+r-""""WYeFu"`""w "rj*"""""""k"MGY)"+"""RPz"UE@g"""""+""t""b&"Wq%"&""r"&"+v} """""g&rU"r&rgbw'r u""""""r""{G$""UPU'""""""r"""""""+"B++" p}"""""&'&wUu"""""`YU-k"RpQY&"&vj"*"wwp}Uww+""}U]]}Mb"""""rJ "rr&""" )"+*""+"+з]" RGD*"}*F tzDgt"K @tj"'"rҐ GzEK[ "Qѥ+*""+"+зp ev"- p wyJ"$b"@"B*kpzj"ҧbDUx]}Ԣr"*tww"&"{z{ 'vbkDd t""""&""bz* ԙ@*"""'""r""r*&{""tK"""*&'+-}p&r"" Gq]p'GTAJ pEz gwקwwwUp$fjW@Еk"*Bg "Һwr Z }ww"]z"""""""""""""" "B"""b$""""'"@"""""'"""$"" ""bB""$""""Bt"B*"""+""G""""'"""$""""""""""" Pf*"""""""""""$""""""""""""""B"""""{"rrb+"""""""""""""""""""&"'w"""""""*" }"""""""""""&'""}@-"""""""""""""""""""""""""'"""""""""""""""""'"r"&"+"""$wf""""""""""&"""v}*""""""rj@w G """"""""""$+""*"v"'r"""""""*""""'"r"""""'r"+"""""Fk""""rb"""bF+"+" """$"-m"""""""r"""""&"ڪ ""J"&r*""""""'"r"""""zB'""""$"""""""""&"""""{ "v&*"""""""""!&""""""""""r""""*w """"*"'"++'"""""{"""""bb"g+r""""""Jw"&"""""""r*&""%"*""-""%"*"""rrd"&%b"""""""""""""""""""""""""""""""*"+""""{+""""]"gr"-"""""g&"&"&r*"""""""""""""""""""""""""""""""""""r """"""""""v"""""""""""""""""""""""""""""""t""r%""""""b""""""""""""""kk)""""""b&"p""kb"""""""""""""""""""""r*""f++'""""""""""""""""""""""""""""""""""""""""""""""""""" t&M-""""""""""""""""""""""""""""""""""""""""""""k&"fb+"""""""""""""""""""""""""{"pww""""""wwwrz"""""""""""""""""b+"""""""""""""" QzmAqzfzw g(w+x+tr+*pWyM dQWi"Bww}"$ufXzw QzwY '$jk{bvzwpzTt{+"bJy"z{"b{*kzb+&"KJggw"bw+""v{"" EJJG{'*"WyUzw" +IYUDpwvw"r`b""yJ)r}k'"bPp"kz""bv'z*"w{{'zrw"""""r&"jwT{*"""B""bzu{'+"&+BXz""'&jwzv*$vjz"""""""r'$r""җ}vz"""rz"*bBgj"b*b"]*+vb'""*"rw֝pVyv{vQwbZuf"z "rG y"""""""r'ptzU$""'"rwG*uw}""+""r"""z*'"r*"ױ+r{J"""'""JG"""+"w'zz"&z$K""""""""""z*b"}}JWYfr""""""""""""""""Gw""""+"+"&*p'""""pU)@twt]yvf{b{"w+fv{www"+]U]zf+"&r{"G "r GrzKzjbuavwj"K+""""+"y""r d"z&K*"b"rW$"GU']" b&"r] +""rwD "pݶ"%"{@"r*"K+""""+"y'"""""rt""p&g+* q Dwg""&"wuJrr'"""""tp"'"[p)}wM}ttk"""r"Rt'b&+r""""""BGw"rrwuyM{ }""{ק qw"""""rw't+''{k&"" "KEA -rT]pww+QYPyڧ$+b"wGw'"{wT&"""""wz"r{t*G*j&"+J"""*" b"fw"u""""v""""b"" rfgJG'$trgr""b""""""""F*& "$"""""r{t*G*j&"b'"{GwvJ """""""""""*'b"""""""bv'Y'""""""""""z"""&""""b""&""""b""""""""""""'bwf'"r*""rfg'"+"fbz*b`z+w*r wv$""""" """Jr*""v&'"""+w&+'"""""""""'"""""""""""""""""""""""""""p%'"""""""'}p-"""""$"""""""""""""&"""""""""""""""""u"""&t"{*P """"R)""+"ۤw"'"""+"W """"rwG"r*"+Z "YP+""w$"t"r$'""""""""""Ew'"""""bzw{""M k'*"""""r'kRtg""""""GGw'*"""""*"B+wut"&""m'z"rzrD''@`"""""""bjw'""Ut"""""""""*"""""""**'z"""b"" yM$"""""$t{&&"""ww&""""r""*"'gРw Upt""""Y d*"""""rwtwww$"@{r""""""*t*"K"b""""&"}""B p+wwJ'"""Mp"rD`Py"W$t"uvPd""$"DpptPPpDի& "Wkrwb""""&"Wuw$"""""rGz"Dwwww"*"" u Yі}t""*"rDwwg""""Bwuw-" utwWEu Rw""""""GK}G'tUTz&"+"""r+p"""" Iսzwz""{"Gu zG&"B""@}ppZ}wpbrtwUEwpݕwztMP Z++""J "W }g"+""rDwGw"""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""-"w&""pzK`kzgT ""w+Rw*"R}Gg''{w-ZP'*"r B"Kw{GPvm$'""&-"w&""-zr+w+t fkbkz'g+]wutקGd"""r"U)z'Bb"&"""""U-zwp{g*w*ww'F&G w{'r""+ pG%'b'{wj@b{"+ ""vp+T]WwTG}""+zf[ {Uu-"+zb"""b+"'"-{*"'"""gbwvw+w'""fz{wGUpwKB"'"+Ԉqu*f'w"&"""""""z""""f"j"ff+tٔ`FxB"re+''rgکz"*"'$rij"{ 'kjr"wTk'wtJ&BG'z+j"ff+*zqTD fk"'b """""r""""'""Wry"w&"""rjrGr"&"*bw""""+'"r"""+"&"'J""@&""" """+""ru brpe"""+z""""'""""*"""b*Bk*b""*++"ppv{"+k"** *"*&g+'"b"vJ-" """""rw+"&+B""rzzJ"'"""g"J&+"""+wrvr*""'rbwפtzڷ zP հT]}w'vPGQu+UQItyG@YYYw wwGwYUW] UհV]wפtzڷE@pw+*PKMU}@y QTUIz {wbuuww+&&wYQUwU݉Y}YYI[t{JtTGIY yG@U`z""z]uw{YԕU]Zww@ٕyPzrwwYUڝЩђ]]@} Iصw@]pYqݝMU-rוt*[w؝ ]UJy} **]wP """"""""""""""$ +""""""""I"@""""""+""""""""""""&"""""z"r'""bBy*"V!"""&"""B*"""""""""""{)""""""Bgz]D"pz+""""""""""""""""""""$""P'"""""""""""b""""""""""'"""""""""bB&""""""""""""""""Uݷ$""""""""""""""""""""""""""""""""""""+"""""]'"pz "&""""Kzv'"""""""""""'""""@'Ywr""""*U"""""""""&*"""""br}""""""""p*""""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""&"b"r""b"DIt'"zBp""b'"'U*r$"z"z"r "$$Rr&%"+"b"rK+"+{r*b'"""G"'t""fz"&"b"r""b"r'wiDtw""""{r'"'"p""""""b""""b"""v"rR"G""""k"bwB"""""$"w"""""""$"""""""""'""*""""&"r"""Rr&g"YP-""""f""""""'"b""""""""""""""""+&"""""r"""*''&"""r"'b"""""+"*+"r&""""gb""""gr""rzF}v"'"""'"t""""""r"{rr&+"*'rb"G*"G +rw`rwpPf*uDwtPEtddF`}PB$wGr'Bw{wDwz@wWAMW$"DwG*"G +]]e}t"wvwp*twzwp"m"D $bkR'@tWrwvz r}qJAwDzm&zDmB&wTxzzBk""&"jrwtbݰ'gFPU{קww""'`""+K}vw'kI*"r"f )Zpy$r Drw$z*wtwwwG{D w j{d{J+"wwwpt] }pErwvkU$R"@w t$"tDp w wBw*&fzwwzDujp*}wpwJz'p YrM"[@pt ttp}ѭPz$wzr} tzD wEww*r'Dujp*)zzv' zwr{pgvwwxYJ}pwM"" %$Ҫ"'""""UР}GwpwwW@%*w}vJjtz""ww}QttpGPw+D}"vzY {yZG **pYI$rrGBz*vW{gwk ڴ{wzp{Z} I "'JgDБKgR" rzwwrwzz*{zf"""rwzb""""""""""Z&"""'*"""""""""w"""b""""B"""""P"""""""""""rrzt"'"""""R("""'"""*"""""""""""&rU%"+""""r v]w" w*""""""""""""b"""""""R)""tw'"""""""""""b"""""""""&"""""""""$'""""""""""""""""pz@UU-""""""""""""""""""""""""""""""""""""""+""""" '"J'""""""Gb'""""""""""""""""rz+YE"b""""]]VTJ"""""""""''"""*"w"""""""w*"""'""""""r&pu $"r"r "'A"r$ ""+"$'"Ҳ"@-"b""fr"+*"r+'"""{"'Pf"&"bBz "'""""""r&E+w)J{@"b"v{'"*"z"""""""""""r*"""r$"G"""b*wTb"""""+""""""""'""""""""""""z""""""""""""Ҳ""DGDW%"""""b""b""""""""""""""""""b""""*""+""r"""+*"""""r"'"""""""""""+""""""zwW""""bj"Bb"rw@U"+"""""&"b""""B{&zbrw ""'rb"'""""""ebr -'"r+Y&"{"rj*"r@}@} T'F"@UW B'+"r{r{f{ww}v*$r"r&'""""""R)b+++"вwb""zw'j+*&u xM}f*"'"שjr"&"""""G }ugwm& z}p- G]Jd&""+*{M}z'F`W v+"+""&pw"KU }yuI+grbRpp Y{"t"""wb**k'{'kkb&+vvw{tw `E "bGPgrzwwwt{+ibbv" YYwz'rwwڲ*"+""""Gf&"""""""""+"+"""RD$z)""""rgI"bb{"uFq"*J)""""[{'"v*""r%"+*""""""""+"ת""'*""Rݙ""UE$"""""r+&r"""""{VP '"""""""+z"+"*"+*"zwg'b""""""*""ztFQw""""""""g""""""++*&"t"""r"r"w*q"""""@QE'fwUTIv"j*f"&gGzJ&""&'zwq&""""""jW "QQ] pb"""Yu""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""Dr'"{&J&""MfB +"{*D""r"ݺw*"t`G f*{zp&tp-J+j"r*fr"wrzwpr+y*x'""Dr'"{&J&""@R%"+"" "*""fz'v*"wj'JwGzw $""""'"Э{r"""""""Dzzt* +{gww-r&zwpwrrkR"""+bkrpw-&'{z r&"f*""+w"zw zzttu"""r"r{wvw}$+b+f"w""b"&+"'z*""*""""g"ww'*""kw{bzwuwB'{ &$""w"r PYw+r*xgGB"+""f"""""w"""""+"""""r+"&"""+ukwe""&"BEz"fE P"{%bb "'rWz%"""" wyzG $"br%"ry"+"""""r+"U%"*""""Y"]Xwk""""j'r*r&"b""TWЙq'+"""'"z'wPI"+"+"'Y'J{{w-r""""""*""rW bbUّGE'"b"""""w""""""""zv+UB""r""r""&gUI"""""YH`QwtwzՕXpzw{&ptբYЪ**&wYUU`b""""+bzzW-"rEYvwg+"uwwj+"""""r* g"zI "r%"wrg)"{'"`*bf)"+jw&w{brJBb&Kgp'bk"r-tj+"""""r*٤'P{y&brwG"'ڔ""""""""b""B$""Y"rz'w&"vvb""""{""""kd"r""""""'++"z"""""""*""bf@M U PU%"&"""""r""b""""""g"""""&r"&"&"*&"b}gB{&rg"b$*+"++tr"b""+{b*"["""*w@W&b"*Ggr"vק]B"+"""k"""""zrz `"" rr""""""""""E"""&*""""""""'"'""b "pKg"'""%"*r-Z*"""""+w"""'"F""""" "b'""+"""""""""""+"""""b"g"""+*""""""+"$%je&""""""}"r"'&"""""""""W"""b'${&Jt+z'*"w+""""""r$r&"B"""Tt""""""""rr"""""""""w*"""""r"*"$eywz+"""""""+""""""+""""'"""""""'"j*z F+"b &"""""TItt'""""""r$"b*"""""""""""""*""""+"""b""b"Tw'"Zrt""b*"+}+r' g"""*"'*"Ҳ"%"""""r"""r&b'""b" "r'w &"j"bG+"+"""b""b"Ttr+t!wp""""rv"*"wt"""""""""""b""""ҷ"w""""&zw"""""'""""""""+""r"""""""&B"&&""""""""""Ҳ"'v"EJ!"""""b"""""""""""""""""""""""""""&""'*""""""++"""""r"'"""""""""""""r""""""""""r""rzp"+""""fj"b""""G"fb&*"+b*""w gtt{'rKuwwz GpW''My kztPФetPttw M}uPpw'z{tr@M{}UP]Mw tjrw gtt{'rWG{k*TwwwzwwvDpKIgA dvM"b{rФgrwf"+ںww ww}w wyעww*"wwڠwytzptw՝vwpt"wRu}jz}{wp"'wpEa -vwww'B}wB}tk'JwRwwwKzpw zUpmQ-b'gpGUݝw}b FGZmG{Jw{rww{""*brwwwwp+"""frtM *" D vm"wJe"$"'b{rz]Ek+ Gw"gg"BwvrKۦP"zM*'"rݽwp+"""frtjwPz"rfA""""b"""b"*r"'&r$p*"{[Jղ"""*r&}"""" rb&F"bb""""g"B"""""""""&"zrz]wvUPU-" ""+""""*"""""-""""""'*r"*"' ""p'rv&'{br'+{k"''wbr"*gj"*""+'rjT"""'zwvWpYYr"&""jK*"r"""kMwYrt""J'wwr""""""""" iF""p""+""*"R& '""""""&""""$"""""r"""""r"'""""W}"B%v""&"v+g""""""""""'"ח!&$"""b{zyg"+"p"""""""""""""""""""e"""bz+ Ч"""""""""""""""""""""""""""r""""""""""""""""""rY """"""""""""""""""""""""""""""""&"""'""""""""*""""""rr"'""""""""""""""""""w'z""""GGGR""]}+g"""""""*""""r"{"J"r"""'"&'"""""""""""""""""""""""""""""""""""""r"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""b""I""b++R+b%""""!fE"W+ ]"B-"&"*]BP%""""PUj jD'+"" %""ҽ'"""""""b""G'"""""RPM+"Uխ+"""""kw*r}"""""bUE'"""""$&w*wY"*""B%r&r*P%ҙy""""""r"btU "& """""""""g""""""*w'%yE""""W'I"""""@UUj'f+MYz"r"{"+bUՙPw ""kUe*"""""bGT "PTGM""""""ҭ@u&z""""""""""""""&"""B"""B""""""B """Br"J"" """"""""""""""""""rBg"$"bF"r"B""D"""*"B"""$&"""""""""""""""""""b"""b"""$""""""""""""""""" """""""""""""""""""""" """B"""""r" """"""""" ""&"""""""""""""""""" "b"""""""""""""""""""""""""""""""""""""""""""""""""""F&"""""" """"""""'"""""&"""r""" """"""""@G"""""""""r""B"""""""""""""""" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""w+rf" rwuTU{xv٩B]ݙI]MM G] U{gpw{ ]YQD@"UQTw+rf"ݥ@p`rbwWّ+Ypzp*U]TY}gwZ]Y"GUGEYUtQUy@Ktz*p U@ ]pMMuUMGG""mU'rVYUTA}}{Z{RdU]UۤuTwwwUYQUQم }Yp]UGt@MTmv *ҲtQ"YMy}tqݔX"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""uwGw }pAD* GpTmJY+}QQu Pp ptx@Et*rA]DQe}tEIзuwGw D%w{}rgptw}wwpUXXuz{J&Эpg""'QuwwQ}uV [t]Vrz}Dptp p]jwwPUvjWzt@ZD@z[wrTpD wRIpDt wz}wWP}GUg"zW}zYut`]"*zEupwtEt kttg"'R V w{"R$]fPy֔ "GuJD"GBw]-ptD'g+ W]wZ "{"R$}]Mb`v @YgMpG"'& rg}&q*y{]w]TP*" Kw"*"wPDT'w }g"&""'bkrz'Bw  ]]M"""rJ'@"&r"&rgw g+}Fb"r+$r*J{r"WwG}EuwEZW]Pzgw]'"}וY*Fj@JWvTٺr"'{tp "FtZJYYP$}W"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""GzpZjMpGwGZw w{z}}] wzTUP@ tu]PuzwY]]ЕYYMtMPU}tu]GzpZj]U]@ MwtWUU w]]w@ DMէpM TUUpWG tpzwwwwD }D]UGG ]]D]UtդWUY@}Yw@T GEP]t]UՕ}GwGuI]JzݤDTTFW@UGzڪEWITuWYwwpWtYyMWp} ݕYY UT]Pw]Y]]UptwwpPUY}wGwG@]um] ם ppWPUtpwUP}wM @U GPUPU }GUE]]uwt]՝ݕU] ԕUUEwU tpwU]UU}}UU Ut]QEYY]]uU]wtTE M w@ }UwРumPPM]Р@RM@}GU]UUUU]zpGMtPMuwt$U]wp[DI }pYwKG}էP@]YUY]UUUUYUT T]UUYD]YY]]PUUp@]UEw}EPUUUpW]UUP tp{{twUyP@tttEGݗUD]M}ԕE uw@P]PUP YPMUD}wG]]Mttp{{tw]PU]wGMDDw@@@Gtםٕ@UGwWU]]]tpT @WTTp]w@@ @YUUM]TZu @R@P}y@TMUU wM {w GUuU WTPvMU}XUPPw}uY Ew]GEuw@GEWwp U@ UUU]]tUEwtwP}wGw WPP]}]T EDGwpGwU}pD] Ptw pDT]@UU]UuUWU] wGW]]ݕUU PU uzDYّ]MpGwTU]U wwMWUP pU] קPtԧvUTUMJp TUP}pwGtPPEEUwpT]UpP@EEUwZRwuYu]UY]ݰWYu } Z}ِwrWP p tuե{wtUw@ EGYU ]P UUUUQU]UUU@w@ WUUU]]P pPuzDYU]Q]]]PPDpPtUPWwY}UMpwwM PTWEP]]@W] Y@pUPUU ՕuPUݐpD UTUPPDpPtUUU uUU]]w]]UU}yUGUugwG ]]wwT PE @] UG Uz@UTpUG UuWGP]M PMMJU@W]UIGU}Pt ]ݻz pխytwPUw]]P}ݙTPU UUUuEM]Uw}UU@}G@UUM] utzD]}p wpP]UTu }]T]նv"{""E]$r@Yt$&"A@  rwWduwU&{"]' ]wWuj&"bwїG]]]{ayr+uv"{""EtTU}w b"tw}GY$""+*+tb{Q`BUPj" @P]I}$bvwG"++'wU" "+z}gBU*r&ryBY&+"""KWU"M ]Ut+"" *]'br *$"WYUtwb"zgztw$@Uݧf""fUupw wt}UEpq ٙY{GpYUQPfJgrוur]] U׻b"r+DYw"""+""% rb'yRG vT*[pPbw`p "%rk$u{`""MM]F]@}-"WU}"""+""%wwp}p ""'vY'UuwG &"z rpD@u{ Gyp"wA-+V -w it"&""""]U)rkp}UW{w-"" 'U""Bj"U$Dp"r+yD&"+*y E G@q]PU}G}ww]U]՝EUfwPTu@ݧr"]-"WWY{+"B EPP}E ]Jz PP w}Y ]]wWu uP]P]]YU@ G]MG M}]T]P}E ]Jz U]p] wUpMtD]uGpUWp]WWuwPPUUuP]tPU]wMJ] ]UwGMp Uݕ]Uݐ@pTUUݐUUUUYMg@tEYPՕuEpzzTTpTM PEJPuDPU׽G] ]UUzJW]]] DwpuGM] TG]@'DM u wwDU]}]]WUUpw+G+Wݴt{t tW}zuz" YDzwPYکwEPUtUM*$DW ݐU]Y G]IuPJU@Zٙpw+G+WݴݙEvG@ GwU}@}w*v*tАAۑY٧'RpEԗurzwDpבU"wUR՝GwyUy[ U&*gZd ҔU UUYuww'"BF{rB`Kvu]mWՙ v{{WYwwYPԴB{IY ٙTpGWy Y wDT]՝U{pYUJuPUDpwGw*}YyYwzt[u pzu[PEէWt]U UYPuDwՠE]UWEwzWUU]UU W eZ@wzt[u @pzwWW՝U]]U]DTtz]]zwFTU}zEwU@U]p&{YYY UPu]u]UPUY}]wZ@YUYuDw U ݽwZ EUwz}tW]ٕYYUzGUPwG]YUtwڪwTMMMW]UG՝ UUUU]JDUUTYU]wUp]U }J]PeUE@E Utj]UPG""+"f""ru"P r&[%vZ`""Du٢+"Kv"b&&{vp""""rw]yZPוEݙ%)bRU&Rue""+"f""ru"}ե-""wjR GUսz%""+*"r"rТE }&"R*J]GQYE'"{v"*"&" "&""r'+bguҠG""""&"v"b*G}b&tw]Te&&""&*p""r*&"*+v''"z@b"B*k{'wwG+""""%Zp Й}w Qppzwt tTק) p ՙUJwzYM}U"r"'rwz%bRԙ]U""""ҰYY-+UEUWWG] UUT]MݕU@ՠ]U] Е]UUU]]YEUU ] P Up]UU UEUWWGUU MUUEU]Uԕ]ԗDw@W]Yu T J P]]U]TPMpPU}G}z u UUPYUMWDtpЕE U]U]U]YUYY} tZ]]UՕ DM UՕUTP @  UZPu EU{}]U] p@p}M]Y]٥UU@wG]UUUPWUUUUT}M {wb*fvZu zRwI]@}]vyQ]QݷudEU YJ'B PU ]}@Pu&GUT{wb*fvZu@ EzWUUЙ-UUEwGpIGr @W]RY]&vِՕyuMԕ]YYY@]z' wvWԑPuPYppt@$"]MbGpUP@Wurb{ۤYYy Tժt*$yեME@ tPUPwDpPU] U]]}PwUDYMT ] @pwՕu@WUu&GMZՙuUIwPUUw ]pUtW]YW]UDppy} }UTWMPUE]t ѕM נU Up}DG ]pUtWՕYݝ}]]UDUyM}ԧ'pDpDGM] J]}wU{Y%GwWuw eYz{] twpu@YytrtMPt qwuU]E MdKkFPYTUw{D p ]TztUZPTUU]wMݤwtM]MzDDpwp D Mw}vp G}DuD}p @]]}pwנ ]y wUpYPPp@}M]} GPwPwUzG T t{GP ]]@@TU }GpW@}pwנ U]Uwwp]]]IUr{wz"}л׷U GPݷrGwzwt}}Uz+wMҕսw{GwU٪jGJ WTzG@UT{j w pzTwٺG'G]}JMDupt]@ztWw݅upwzUDwUDDPUDpwpUU]p{G'P]}Gu]MGpzzU PY}DT]@YWP zyw ԕ ՝Y]UEQEUPEMY] @ }G G}]UP pU]] PY}DuD@IED@ PYِdդwpݠp٤WPY TDp@ ]YP  MGtݕYUWQPP PUEDMwMQUUYYY] WU@wMwz]Uu wPwUԔpբ}pwGWp G]p W {G@{tG G PYU'DP pw GwUUUEU] ݕ Pw{zwZ[ }wJu[ ժww}]]wzUpUԧץww }PTuwwWYYݙYUU U}]j ]ժw{zwZ[ U@ uwTWUU}U]UU upj]t WUխ ywUuwtw'zttM]UDpwPp[YYGݗEDv էwz{G}zUUwwPD]wzw g'{Нwtt}U v}}W]t PUzwwpեtT} YY MUUW]U uDp]UW w*E]եj՝]]tG{[P]] @}fw+f{wz`UpWԤJuzGYpY@pwuvTdM]ٝ D'w WUWuGםPU @t{ wWup@}fw+f{wz-k]W pUupPztUJP wt@WUY}vG]MwM QYpp'w tݕ@ WGuYEwrzKpw}PuvTy@w'" ݤ {MT}yYupXE}GR UEDEU@trzՔUUY}DMwY uwpwzw@UE@@YU]t]YttwwwDwY{ՐwwzzzzWDUuwwP@}EGM@TT@ @tGwtM]P] WMw UYuwu]M ]M uM}wIP@}EG}PD@tDuME D}@ pDJDDubKPP@wtpGp@uttPuM PUUM@ UtwD] wW ]UyG]}]@wD }@WU]P]UUU@WU*ҭ}uE YХ z YwWE GrMG ]G$wG ]ЪwUz ׷ @twpP]]GUwPpwI$ }MP]p Tu@P@ @I{w}W w tYM @Wu@ uPP ]M]]MՕU wP]M GG  @ MUTPu@P@ @I{ww }קG ptP]J+{WPqtUtMtT]}w uW} PTPp]w tGGP]U UUTekTt]]TGwTUUUYEEu*֕u]]Jp}%WpI Wpmp]ںzD] w{w@pE @D}GD EJ@@@}wݕG}ztw}@tTEDTUGT]Uս]MtYw ݗtUYM}@yp}WTPu]U Y]}@t}]PUM  @ݔ}}ս]MtYw }UM}]@@PUU]Yuդt w]Дt Mw}TE wuWU ЛU}tgPtEGuuz UU}אY]}GtMw]UP DY]UU Yw קj{G@y Фzpuz] AחGMjpWUUJp wYU @UDDԝM]YM}t@ ]}w zz}`T M P @ p]w PWwwU] wWݝU]]]]@EUP Wuw P UG Mp ]@ p]w]P]Uq@ wG w qP@K@՝@ pwED] ԝQtT pY]]Y]EUP WwEtՕ @t ׽@ED]G DDPUuw@WUUPUUugrwJ ]up}йTpUw д@M GMUUTU wGMUUuGD  @]}z@tpT MtzwwMݕ]UݙwwwwtwwW$M A@Ip ]ww{w՝G P wԭpM@ pzwp Gw]]U Mup]UZUwwwwtwwW$  }wtt@ G tEp{'TMԕB@wyww}IP]zGI @WYqpU}DՐ]@ PMpDwwzGG W}p@ TpGwwwpzG U ]Ap @WJG]WtMwp}tUTUP@]PYՕU]UUUp t  @@D ]t]U׺ @ݧ PGU]٠Z@YUU'{'"jZ@wMZYt]IuwwP}]wKWwMP}]Ezէp WzywtYY]]UUY w P@rDuW]u'{'"jZ@YU]}P]ppWUݤUݕ]t U]z]TwwW Uwvwwkt{}'GUzw'wPrUYЧ֔tGYUD@zGYEz Y }wwjwGDwwzz @MwvwYY{bwzwGWpwpYwGwpzwGDPU]UztPP]]UUUUGY]P}wPYYU]wwY]pUUE@]YM TUrDuu@ZwwGwwW]}@PM@]wpppgzԴ} }UPuPUէw]wptPՐUwP{wU}MЕt ]]U]UUUUUUU}tuWUWUpppgzԴYUݭ{@WUUU UUUYutzٕTUUU}Z}]E]U}rww@w{M MYptkwZURUzYUVUPzw PRUU{wYYUUY@JUG{ 'zW׷M*Y՝wzzY pYPPJKwzU U@]UUP]P]UY]YU]YU ]UUU PUU]ݕ KwGY]uWM @UUYQUեgW@Y]U}Y pDw YT *M wpqM@ Y}wT}pG }wڕ } Zyz}t}Y pDw ݐUD wpM*GP$db BU pwp@wZ U{Gmpwp u]zwzݠTww{wpupww]Kp+wzPԝpGM M@IDDpD@ёwYt{"Gp}DD zmp-p]Y&ݭDG]]kG U]pMwDG*wzUw UzgBwzwwwwJztwWuEwU]])r@]՚GJG@gMdpWUG& - @Tt Y}pYPt]D UyI@GDpGDt B@j ])rpJ]P]I{DtG@tgUՠG '"B"b{wUudzb$"RԠ $wtGv'Ruwz`g"۠UUU-*jg%wYP pGWY]UYE ""{׷`UYiu$K'& vG]UQr+$Gw B"$* pGpz"*[bv @ k"ջ*kj}w*"p*k"z&"MJ E } &zZG tEKI}DPM MttwM]ݗ G U YQuGM}]UMU}ww}w} W]ZG tEKYwP@pwu pp@@]]w  w$-wuUDGIwzT]]p ݧ@Gw }P p׭ twU wI}WԐ}wWUWW]U GU@TUUUUUU}GMWAUuIPUU) mTT]Pw}}}PDUGwMU]]Ug u]Up wwwwUwwMMtwP}w e}zgU wpwU]wyGzGKuu[wtwDw}wWwWwwtUp Ppz PM} @w wW@D wp}wpGMtwyGzGKMwEwqGt}wwGwwtwwG{w b vMwwuw}w uzrwtrwtQUw}w[AR ]{MpՇ teFPGpzM]G `z} w ۭMպ{Wwtם} wwDp{ wWwwPw}Wup wwwwwqTДTtM@}tG@pwp wG@T@wM׷zG}wzuwtJJwGPMwGwb"""*""{jrb$}zwD*&z]DIg"Vf* Ivdb"BD G }JGUTG-&]wݷb"""*""{wzԭ'f"'FGp'@ݭzzw++*"[ٙWJ tpbwJ U D"DwGIUwwd&uٙV ّ[p`p""bYvuwpfYDYmz*""r*"""rm*Zuw"Fz@TWw&&r++ @Pp״Dmt}Upz'zzz@tݥpz]]wwGU]k]@GppwrbU &חTG]@wzvz&bGUz TٙpvWtztgu wR%wtpMwPDU GG ԈEtzGwG B p G TٙpvMpp}}uz{{{tgU't'b+v{pq'UrGwMw*Mww mBgg}]uD p{DЦpBg{EtՕE-"ԧbGڤGЦZ]Y]U]Pw}p "r wY-r+R'{wp@]B "zk{G"`zwtzw"&w"b"www@b"]j""D@tG}G"r D'+pb'{ }Dtw{Gz WEpwpwz Up pUtpMwwP@U]tPUWEw]ե P]uwwGT@ @TPww Uut WEpwpwzU] wz]W@pWtEGpv@Dg@w]twzwY tWWpJUUzwG wUUp+D RU٠z}uRDwwzt UuUEw]] U}GUtJy@Рw$TUM M} UUYwGzpttP]AwAG@TDD ԙݭ UPU]tEP]U]՝Y@@pwU w YTu wUuGDwGwpjwd{} u@}@twT@U  }U}pupP}up@TTpY]}ww]Gwpjwd{} T@uwp  ]G@t}wم] E U]}y@ETW]M JW w]@pPPg@ tDwDtp R}PzwuEUMyU}pu@M wwMGzp ۧ]t]M@JJuz UQPU]X}@wu GDWWyG}YY@J{]@TpwYUGIM]] pG}@tt]}ww@@tMtPU p]M+"+"bv"PgG'% Gj{t+&r yI] wG D "{ "k*wFW&+*BTՖ]T]yJP]U Wm"rM+"+"bv"}K'"zttwU}tzGj''zw*JwGb-t]u%"wgz'"`KpB*z׷pwu"""+"gw "kP]p'"""r*t*"r+j"+''*pbb&BbzJiPuץj"+mQZPMkمW VuyJWqp}pE}]wwU ]UU""K] g"zwJpJڲb"rwupG@tכ @ՙTUԐ՝}JP]}՝ם@ٝtw] З}G${]]]UUUUНP]PppG@tכݝy ZՕݙIU]UU]ԶDvQw٧W vUEZyݷ]YIPuG`ِٗt$FZ @ZQ] w]U]UݕizZ{Yw  W{ך}UTwDr} W]]E ]t}M] DYUՙUUUU UU]P]TU} YPYЧPUtZYIw]YYՐwY՝w ]]G w@ zWEpG@]MUT UUUYYԐY @ @ p }w] G ]Y՝wUUTݕqD pzGG @w]]u}w GG@@wUwt}t@pUUՙUսWDUu] p@D}T ԔpMUUUtPpPGDtWU]UUUU]U@Pp}ԠBEpTYUiu%RmUE UGtpw pDD pGPZJd@M tM] pM M tGUuz* M] G}'wKPY]TEwU JZ @wzuR]UG}ݝYEUYGuԧM]uzWYUYݕUU ]}M}PՕW]  JZ D@}wWWUUԕ-UUMwu ] p]MUuzDypWEPg Q Y]ՕytP]T[UUUP wJwG tGY]}ԧDP]yU[]ՙPUU۲t[ՙ}]wpzwP@P@p]ݙWU YUPUU]U] UU@D TU]tww]Et}PPݙZ]]UP]IYy+Gw{M tUvb%+EtT DMYDT]jKD] IDDvGwD@p$wI D]IYy+W]pwv'Ug$"b*RBrDYe'Vb BۭZ P*W j"۵K E+g'RyjBUUPE$"*BGTtpw ՝U]U"w"""'۷U)w'j"*-bUq"'frw*b'KFw zt}"'*r"jpw "& *f"+rg{'*t*b"'*{'I@-b}"BvwbDQ] }b{}WtzJ@pzWGt} tT@ w@p Q @pDGD@w D@DMw@ DQ] }b{Q }u@twvw GGu**r Kרw{DjdRD}w-wwwwנtDuFKwBM-"wwJzww @GWU՝ PM Ԡt'r"r'{JuaI@%*% Wк"{ְw@B&t GDD+GJv"dr'w' + @DdwD*PGw"kwp' }"J DMקKzwp}tWpJw U]upU]@Wu}Tuԝ] UPYٙY]tDPPUU}G uMpE]]]}tWpJw PpTUUUE]U]GG]UEUuUwTtppUGY}]@W]uwGPU٩MP@YUG }UU]YDu]Py Q]M wY  XTP֔wUpYЭDgT IGWpzGUִP@U]UYw@ WBPUUM wwtGppM] WGMpEMpYpwwP]PP]www}pGYW@]W]]ݝup]E Е]՝ Y]@}]IUY P] U]ՐuG U]Mwww}pG]pP]]yU]u]]p]ݻ MתYUJ ]@ZpWPUUIM}MU՝] ٙEEpVM@W YUUP@}DM ]]yD@TUuEGPYZYFpU{YYUw@wI@pP{TEPU]U ]z@UUYP]]UtU]]]TU] YЕUwG շDGU]PpwQUЕGwJ@wU@YuW}UUww K}]zU]UUUGuGtUMUwt@wWUUUUUUE]PU]p ]uwUYTwJ@wUՙU Gtp UUwUU}uDUTMP]UuwװtWUUZUwUUw WP@Z]]YyU՝YwwwDMEwM]PuGt]]UUUݥGzwMU{g}{]PU]]] p ۠ ]Y tUUpGtwUQ U}UUYUM ٝYYYYUPU}]YUUYG ]] @WY]UwWpUUuwU} YUYYWUP]UwzGwWpG}w ]wpTQٝYP}w}]uzpwwWUU U MYMM]}PTPݧwzGwWp@p@DMwt] PP]Y]wYY]MMGPJvKPzpwGMP]"U YPQ]w ]@u]twJ]w}ttzzuM}w E DptwDMM]zt{M]D @  YU]PէwwwTu Uup PUwwU]Uw TpP]U t@UDDU ] tpYM}PM} QxtW@P]ݷm"pu Gw]ժtut}@D} GTwuw*DuwU@pPGץ{+{W ]]pwDwtT@}m"p]]UuwpT]ݧ]UUU]rKb PUY]wKDTMDtMzrzЙݢGU*w&wG{ҕJBtwU*"zt'vtYYuw]UYpttw w{pw ڦ{uwFK@GzG%]]T{ M]UGw]W]]U]t՝@t]]]U zGzw{G]MtQ)zjTUwETzwwwwwtPpztwJ ]PEwU ]]Pu }IGuT]@]]G]M EWPD}TPU]]]UUYGUTtM ttwJ PUUtW]UU UDДA]}} E ]ЗpTEwwzMuzwuJ@Up } ]UuEuMZ]gwTUTMMU]G} TpW }wG}@zJwTPUuY} GEu]PpP@GtGGUU PUGDuUUP]]]UYw@@@] ]]U } @MUDD] Utٙ}{wW]UTtEwWtDGw p MM wT{ԫr  pwMMݧw}Ww@p D]UA PMGwww]U @ @twt]EGu]T{ԫr]tPwU p U wGWjкJ}zGzE zpwKGvw קuGwz]@׷ ק@zzfPe+]]AwP +Ҋzݝ wGEwJ-WUttwwt+UEwW]W'pPGwUDuMWrT]MpwwwwG U}JݕwJwwT]EG z@yw]p b{Wpݥ@PUw]uMGp}tG]Pp }EuzWUU] UUUEUUMGG tp b{Wp] ]Uy{DPUU@UUUUwpWPP zBYUWtT t}ww wwwtwGWUUt}ZUUM@GzupMU]w}]Pp utW]]MGyuwG VJTv]wp}TUUGz{zPM @U]DpPU]UUUUUݕYUtGwPUUUUU]]Dp tGUU@w Y}zWGGYu@]Mt@] tww uptGWEuwwM}wzG]wPTGGGMTT@uwwwpWY]YݙY]UMUtEzzMTpww P]UGGwTYU@}]]UUԧptw @]DMTUww}yEU}zwwwzwtwTUUwwGMw UwEG}TDwUYwztz @}]GG]]]}GpwE@@}GPUwt{tUU}w wz}]Uwwww TuMPUYYPU]UUU]G@ GEWU]Օ UGwwwwPUEzzETwGwU] w**b+++RpUJzwYݗUpJ]E} GGTwUժd}PWukz[ ]]UU]UUYTprpWEp**b+++RpU]PE`vwU }YYpk{wUJUPUDjPEݠr {wwDtwDUU*եUUFpyuUUgvzZ]Uժt]U]@GdbbtzzYz @wzMYUwWEt wMUUFWGUPEYY@zUP]]GݕYIUUՕUP P PUݝUtUz]pwgWrpuMMTWwz GtGtTG WwWݠzWwwut@u PttTG@GTGUzztZ uwwpUUUUU]UUUYWP@pEZG DP@u WwW]TM}G WYUpUUU wwzt wz[ݕUGw TWuEݭKtwtwvtGUUwwgtttKUw{w@p UwzwwwJDUUzzU pG{ pE}Gwwpww*YYUw ЭzUUwww wE]]YVUPٕUUwUPY] UYUUPD@wpGPUUY ]pw UEZGpP p{JzJtp]}GUwzwzjwZwG@Yٛ] Mקzu WU wYp@t uwwz Y]U] ԕPtеwU@T zwzjwZ twwUUU @zwww]uB] t}JwPW w}+@G @zzwpUw zE}ҕ٪w z pUwU UUytJKpݧJ{wWu]yKww}tMPٷzwYQIYU]UY YQА]U]UЕ]]UUM ]W]@UUwGMwP]Uw]]]DtpT UPPtpwzwzTwU]G Y@wwp ]MJPUU]U UE @ U wtwY ݙYYu Uהu@ P tpwzwzTwUUUPuUUа]ݕ] Uٔp@zzw U pwEPpwzD@zDMUtР]Ww YMPYMZU ]GwyWUUM PUUUE MMztzzU} TUwwp}ut}zzY}MwUuMWYUݕYPUP]pU]wݙ@wpݕYUU GGYJ]u@ ut}Օy}WԝPwGtzwwWGpW wGpUEMP T@UD]pEGw}] W}wwpYݙYU@pUWwEp}tEwGtzwwWGUU@M twwխPUUEw]PUw DԤBvt}UWpWUwwp@wmwPUgG pGzUUTwG]UY@wwWU@jtJpНGwUP uzwWDݙUYUG'wwYUЙU}wwT PUwww@UTՙYJ }UUU pMttwpPYU]UwUzw+GEpսիGzwpzwT DUtwk zp WwUuwUtڗ ]UUwwMYДuGwzTUU]]]UUUUАEz} YP}wk pWUUpU wzwEUݠRP]Uww@ PuJ]פJtGwDUywMwt]UM] uwU m tWz}Y]]ww T DD@W]pYwY]DQYYwJz rW}YGP wDzGT@]UUtU]]UU] U]UUwUU]@ ]M]PGU}Ez}U]zzutGwYU@Pw"""**rBuK}W'&@}p٧YIr+%VU$*W]ХzD]M]}UJA"y I'"""**rBpwMP]iwMPwUx EG"b"DTB}@pbrDGBq }w ww z'"Y-}MRG]}Mz'"zwrU'ZE Ԡr+}]Y]%""ҝ ""r"RUETu]w"pYEt*J"+} WץDwEwww{w }ԝE]PMGY U]W pzUUrww"tz Yw'{}My@zb'rd"+durݴt{Y'{PkyWEEP{pwGyG+G j$}zMij&ݑݕU]դGw[v }y'rd"+dur]@D b@YUw ]U'"b'&vt&$rUP&wUTUQ}'Gw"+fj"GU+"wrw'BU*z&r}})Bj+"++pBW U jM PMpt$"+rj*vr+w**UBwKz$PUf"+kE U ZM]]U]UwAw}]UYUtGwDpِY]Y ݙ@{zz'zv EUDEzbrb+ݙUtf'""&{w&P'w'P! eKtG}}@{wkz@+ "U+Jttr'{wMwZpDGtxBD)РݪJppf'""&{w&@G}}z'&+{w}@ݠ{pekb+z}dwwDpw'{zd{KEtgbwwj{wt+bһJrGwkwpwpk+" wtw"UUU dk*"""&*G&vrw}'w p &bzGu@z'wrUzwwwwywwwwz@pwpwwwt]Dwtw&}p}wD"wT]פ}]@PԺz*w Gpw tp@pzG w G}DGDMT uJu] G MUYwx Pp @DխM W tp@pzG Up p]pwtw }$Pv*z Mz}DDGP ЗEtz UyG}]GGt]tP  zpWI UU G M]pwpYYUU uP[tWIUpt}JKxGGpMJ}M]z@ M]]UUp UM]T ww@w ]@]twPP ݠMխ E}wt]wWT W}zg GJG Z]t@twMսwݗT}@D G pMEPMGTpGIptY TY Dw}p}WwW}zg GJGUPP}ԪEwwGGt}wGMKGKՠuU]{y}IU@Tu{zzw ]I]@ pMk} E@}tGGpR TPpMu}pG@] wwݤ@pDzuU}ڤDJ@UYWU JuPݙq}ww wDwwy@@wwpwwY EM D pU ]MDGDt tuGwWP}puwwwwwwZ}uwwUYQyJzpY DYUwuUp pTYUD@UUIGDzpw@@K z@pZt}UUYQyJz@MwzWYuqppppwzy y bzp{ UzzgzqztZUp]]@wzDyGzZEpw JygrwwYU%kYp WYU GtpzYU٥M " guwzYнrmۭJJ]UՙwwwwrGwDG z{r'GwGww+ppt'KGwzzYU Eww"}* ++{ Y]U }wGuz tGp WUUM@UYD ]EPU P} T }PYUM WYPUUMUWGuwGT Guz tGpU]]]pUUU]]U@M}wZT]UuM}pUw@U MUUW uU]}WG UU}PаpMPU} T TU U} EwtwwtJEKUUYYyEyJGu}WUuYДpWt UuWPU}PUUUPU U TZPUPD pU]MԧwMMw}wGUtPz@}GUU]]j '"j'wՠPDW]wJT@tIu@@Dէ}ս З]}ktwDW]GwTWtu Utj '"j'wY]zzE] www{JwwJG DJp]zDrwGw@wGEЧ}+]tGݵMDtK}}ZGjvښzME}IQ] еݷGzЫDw Ew٭ݔEywFwwpPGUywpDz]]PpwwwQU]G ]tЧwG]]TݝݧxGtWu ptzGM GpwWMTwwwd{ Gt Kt}w}zpg{wwWw}Y] E@]pwtU$}]T]p+w{ WUtW}ww]ݔGX}A }wwd{ GUEUIw'wzDww wtפww}{Gbw@w wwwwp֙MUTԧёXMPgYy@MUD JKWwTէ pMpwtEUUUut'"ݷw pUUUDG{WUY u rp IP}twwGGMpwwwwwzzz]} PU@ GGUU wp GwЭ WE@tJgG}wwEjdtZ ] @]}Pw]PppW }ET]@ zpխ}`JPW}UUU T wG@]EjdtZ ] UU}uY Еw yw pD WpY Dr]Uv}Uw@'[ M}u`w z} prppZ}tu zpU]UUU]]egzڪR}ڷ*MwJr wwFEwDpt] WPYw@Y]]@WuQ}TW UUUU]UY]U]ԙ @puK@]U] wGp @GW ]MuuWJUUWMW] JMMp T]UU@Y Yy]UYݙ]UE ] tuG TuuWJ]]UYDUu}Ut}]U]UU}v ` W@p Mt}t }w@P pupE@]TtwppMDM]Y]}T]T] ]]U]]Uz}GpGg]J}]]MwՙuPEtP}MWUPՐP}UYYzp}PTUUUUUDp@TDՐUE t GwwTuGݧGU]DYwU]ztv GwJդGtwTtPywu wwzzIwywJt yzwpPUUP UUY}UYw{yp٪[ztv GwJ]uw{wDw@YtKG&@UٕwZPP pvwwwzw]z+wwtG{u @Uw{t}wtvYUywJ}Gdw}] pI' +wUUE} DG]YwwMDtU UGD UYYUUYUTU]ՕUY}w} U]UYUwzwWUypU ]z{KzUtpww@zg יpt wE ]]UUU]@uD PP wppTUUPTUUYMDM Pu ]]tpww@zgUU]@M@tpYUU@P]Ut ppU}]wGPYPpp}GPԙ]}@P@P]uP]՝QU]U]]ЙUUpUpJW uPYuD]UU MPDEww w}W]G}@W׭w Uu}]UUpG@ @]pT]U D]]UUUYUU]WY TD@PtwUUM]}tzuוyUMPՕ wW]ݐ]Uz GpGwJ ݠЧ]w @M @MM t@}pM pz GpGwJW }@p @@zDЧy] YM[]݅z wKPGM@wzMzpDp DGpڥjwGzpDW} ]u{ G T@zutpp@TpwGz{׭ {@wGEE PаJ}GPpWPw{Z}uGGkGpDMz Gݙuw p}twYwE} pT  wJ]P GpYUQQQM{}]U]t@GTtWp ]@P ] P٤PuЙ D}wpwMGG @UWYUQQQM{wPUu GD@Gw tGEۥgzrwZ@G}MwU wEuWT]PP[ww@YI@pMM]wIpEMGUT'  Pz}]U]UY Gt}"B׭EpGuJ*r'z}UYw*wM {zw{D"tttrwzMvw]rG@wpp]WGM{"w@'' wzUY]}ww]GIGPA{G@M }D}z@ }@@ Е]݇EP@M PMt Ep wp]GIGPA{GDM tz@wD@MWGtP]w}MMGPp]ڽwGMMwMG zT wM}w]ԩU@Pp@ZDtDzD Mp׭}Er}ݥyUW}XU zзpWtp@{DU @ݲGpG}G@p tG @Gp}t]wt pjp t wMmf GWUU]UYE{GM]]@w@@GTPtPE@wpEU@MPYPՙ }@@ @JDGWդP ]W]UYE{GMtWDw @tG]U ԷBG"tUAUtGEJPEGPUPuZwpM] ]WppՕwp p}UYWI{GDwԗYUYUYٝ T+ԻG }UY wW-{DMYY@"Mw K{w@w@pM"wGz @{GDtGtppwDwUEww"{P  D} ]U] PwU J}jwwJU}wYt]YG EutM GTDUzUPuwGWUUUUY UDTU]}pZ J}jwwJUUU JW}YUו]UzwwwGwWDwBPUUtzZGT@Up pGUpt@}YJ}p}֕wkJwK@G @Uz]]]U Эw@pխpWgTU}] }pUPwJ{wt@yTU]]PMYUUY@ PUUYY Dwp ]YUUYww}{GDUMZ]]P GzGwD@] W}@]GJ tMww@Du }YPP]PUt wYuTEUwPPUU PU]UMGT]UW}@]GJUP UMy]DW]U} 'PۧvP]]}wDT}w]J@PuMTw]ԝ M]@W K]PwpM׭ p]UwY]U]UYuwwW@wwwPU E@uԙ-J$WUUEpwW KP ]ק}tPYP]UP}]zUUUUUU} PU]UGWGt@w{]GeQzTUU@DW]UUGpGwJٙ ]tWI}PT]TPG] ]]PEGpty]UU UU}w w]TMEѐGpGwJ]UU] P }]wM]UDP T}]}נRPU]MwpMtPGtF PЩpG]tD ]] M UEPMGwz zuw@]]M ] PETMMtU{p]MzԝUYwVTUUtGח]u}UZpUUU] ]UP]MwwwMwUUP pMuz+]TMDzGՕE@P ]P@ pEw p wէMwJz} Ԕ@ ՔI@pݕppMGD]]UT U Mp]}p} ]P@ pEw]]tt pg@Wݧ@T}} Fw{W]ttwGPppG TWw]з @wwGԪuwDDYՑI+Dzw@p@]}PUUU]UJtz"wyMU }Et$F$ZTzDWptTU UUUU ]DT+U ] gwwEwG Ъ}}p`vww w]U *ReU{{uER UG*vEե]Mж%Gwݰ W pff'pUUU]MG upQ-"]t} *Re PEbW] ]TUw+@MݥݭbwI{ [p "vppTՙgJty wpWU}BEkz}TT%GwMM d"rwg]&f'rWGT] UPprfFug gfvb{PTEtG}wU]w U UUUUZՕYД ]] ptG@ ]P@@]w U@U-"}P GDzw'"Pw{k&+yuvr[ݔWY*&u K@ٽ Qj*P-Y* MY]}]WYUG٠Ye"ٰ{k&+y@ ])z'[U] ݔ"j"W]r brzYrPD @pp@yW +]]}wQ]tBMr'"{rm]]*@]] ]%""TU& t"BTu'ZG"$T @yTE*+p@P ]ݐ]YwtvG]ِTՔPU GUwݙTU]]utMrWE]e"ԭ zz*"r׶zJ{zwzWpw{}pT]ttW@w Y UYGԵGG}T ]@{wDD  DЗ }D]P @zJ{zwzWDt}w@D]w@wGpkY YPr@MEwMwt  Hp]՛ ]tpB wpK@M{GGDDpwwzzJwպ{zwPE ]t]K{ DAWGwwzzpwp}wD@wP} @pD G JMW GwpGYY tpDt]w wMнPGwMU[TMwwKwptG G UWMwpM]}{P]PtJ] UP@@wypWUUUUUMPz T}wwKwptG@UݝpU]]}]U]Gz@ DtTzU]t UZwwWYu]tp]Y@t]UYtpUUt{}]]]UJ E YU]]yWUEwEgtYwz]]@ItW tUP tw]} U P] UUUU]UYYYUUGMDt@ ] ]UJ DݺWUz]t @T] wg"W ݭ{zpEpZYYIWw wrpEUZ)z]QukzW]UU]YUuUչt]e]UEg"W M-zUDݝU]Ywz"MYE}r]YzuGM Wpwww"rwpP@p@U YwGPWUuUfz ]!zP@]UD-+FGm+ 'J % ԺD]YUP'vw ݕ]UE@MUPU ]UMPݕYPUUUTU]wUݧ]]MUPݕEݙGW U]e U}ejTUUUG"*""&VqbT`rwY'T""z@}MI"Z'P"e+*W%"""Bwє@]T@{WUiҹr"R}"*""&VqbGE-b"wYw{pGY'""kk"wb -rJ+" U t'"zw""&""w]"'"+@ rU"{"pU""""""rzWe+p w@]u*"""++"r*f$* ''"{ZD}b""{Gt'W""""+@wٙWՔwpDݕ}аGE ]Y JGzYP}MYB-wr ЗEWfb"""-t])ZYI"r]EtbzpG}zݪ)'-ФWuQ@KTD{U AD"D&w"-D"@" yGd}MrF])ZYI"rлwr{WPtJpg"$j G{GUݴr*w*""r"ww٭r%""&Rp}fwP &vWb"RI Je'b"RwYu$ B{"fKTBtr D]U}׷+"w'BY)G'""-"*}PUѐr"""* vtb"r&b"tGw"""""r zr"""""+ d*"""$"""" yG""bf"{Ewm""r{wypztנ EMZw@t pww}{tp}PT wMww pDMT@p{zw@ @ w zTpt@twypztנ  w @z{qwtGM@wwzgz ۥr@TwGzMGpM}wwtJ@]]zfwGKyU$v]MMԧww}'rt}Mww W ppt{p@wvpv@`JfvGԠpJWWz' wwPu@Dt}wwG] @GtPWzpp}M}PGw@p @G]pvgDTpzתJ{twWtGGwMYYI  ]wGPypTUP YP MY@uP] pKy M }WMYYI  ]p՝Yu@@wwDpU {)շv]M @py{pUY t]UUU%w@ w]I]KTt]E]J٠UQy& P@}YP@ GYUYUUQuwG&uGMIY @ Mg'MYYYdGPG Rgw @] էt KJ+]MppwtwDz@MMMpWpP }'GpM -d UU TGwWЕwtDMpMנ]Y tupU Uww@ ՝UU]} ]wYwTU]UGU}wMUWP]wtDMpMנ]Mut]UwpUYPU GPWpw}GMՔPיYI UY]GY]UYT UU E]]՗yt]T}@ Mt@EEYDg MWT ]]Tw}wuG}tGWGݙGՕUvtpP ]Up@}wwGU Ut@]PE}wm z@wUYUUuWPYU]"@]՗DJKdz KtUz)ME@ЧJuQt]t ]qDGpK@'}t{@" w'} K ]"tݭT՝]}y wt wzUհ }"""KwY'Bjyr'VԤ$p @հBbr{j"vgJ`e"&qrYUM "vk&pҰ ]UU]Uf'wB" 'ٙt-"''rrUAr*"&"{"{'twG@}b"+brBM""*w'&&G{"'+`""""r` ww+&w"b}v]`` +t""""""rE"T$r*!)BD""t} + "z{&K "&+ Gp'""+"rwD Mz vT%z-"Uk""""""rE"DpJ]*""RPp"E{)""&+"k+Bw$Dz+"B'{PJ'"++"*"&"wp""""B&rwp*r"g*r+"""""z'} "&E]M]խ+*""b"'w""&"'*u'$&wtz""&EJw'GJw"""" G]@DDk-DMwzD@wgzz%@wwG@P ժwwUpKM}pU"r&'B$"ՔPWbf""B"Etw+zwgzW}Uzu} וUWpWpDYu]UwPuw@U}}YٕwpGGTI @MY u W pzwgzW}U U԰zwWw@Pw]@E@JwGJUZYYYuzpw ]}MttzEYU}PUUZUUDMԕUyVUzzGzTݐ uw@U] pzz UGztppZ]UِyYutzwQTPyw wtyYUYYqww]QUy@ @}w{DGYQU]UDUwUYUU@GUt]Uu U  wZPUI ww{ww w@[UpUG P]]]U]Mpp PEwpwwZUPU]UU} UНuwwՕ] w{ww wUPU@@}}@]UUа]]UUUp]Օ՝pwDT]UP}DpАT } P*TPUPu]]wP]zY@tUUpIK UPMpY@tDwwݭppyJ]z}YIwp}MUu]YtwwWpw} TTUTݕ]]U]U ]]] tP]U wp}tDU Yy}pTUuwwEPJUYE]]@""""""}'r{zru$&zprG@*@wM$ڧ""$ wrw"+""J mTwGBvE$"GWry+""""""Eb{www'""{ wwwJ{""r""r w"t{Ab{w*WײB'Gmzv*"zG''zuJ{{'}B"""W]*gt""`bpGf '""B&""w""'w"Bj""rrK '"""ZwPdg'%W}-""r GڗpvzGp"t@u@pw}{Yp$"GrUUb""ww{"Ut} wt} wM]Y@JMwUtwupG}UZUMY P] U] pw]G @MwtwyGD uTUt} wt} wUPu D pt@twYyptGRR PEw]wzݕUUUuWuDYITڦ]p @UtD w PP%b} p}YU]]YUQ}IUTղGM}W@uTw K}wG @t+ wGGv JG &wGzrzJG] @D{wzJ}}zGwݕu {p"zt  drQ] ]D]Y Y] UUw@GUЕYWpUՙU U UY ՕUU]P]P pP ]wPUT]Y Y]]UU wG@@tGUU]tj T]Yu}UwPWUU]PݙYUU]] @ Dp ԝUJuGM UYP@TUU]UUYUGE٭t@pPYUGE]ETUUYWzݠTZG]]@t M}pwp]]D PpzU}Gtdz@]U} wՕ]UwT]UvM PZ@Pݕ tGtTK]PUU]tUGtUUWGwE UUPUYU EUTMu UU vMUU }u@]խ]UUM@@PPGPEMwZ]]UU@wTMW@pwwz]]y ]UMtU]tMZUI]Y]ZgzWPMu}ZUG]MJ{wWUԺJIYUtw]EwG]UEP G}TUUptWpTGYIEUK U]UUPMT@UUU]UMDMUU]U@qФWUu P}EGXՙY]ݕ@pwwzzPw@G[EGMGD} @@pݕ@U uw] WYݕU}D]Pt}p]@pwwzzPwUU pD}}TUUн]UUG]}z up@[WUPtDT }J@}ttwDW D@}GzU@GDpG]pzM@tz}DDuЕUMwtWUUU wyEtwEGM]EzzuGwGPUwpՠ] ݙptP UUUG]TJT]UUPJtGDwU]G pwppJEZ P]Yt D{wz+g+T Uptzy]y]@{ T ]DzG]pP]gWG}TY}jvT]UPuUݩpegUU{wz+g+T UՕDdwZUQYPydM] Օp`JMZ ]uptjwvw ]Рt*խRtzUTUuW@*&{ruzB]UݥG]UUYuz-gr U*"{'{ TI-Yw"&]ԥIgFjwYU p} p]UW pp]@UG}P]YUwU]D ]]ݙv۪GpYUmgUQ]P+ @U b&"*&{W'U'vuG @*k ]@t TMG&ڰ* Tf*'BGWZ}PI P W $ZGUpb&"*&{W'yTug""jwM]wu}uzgz PzYp} }r D]@uDG"JtWp׭Dww&JzG z@w{pYt&&""+GIvзU@]m*bb*}""*kwE$`{ݥ"""{DױTUukr"+uPtM}YEMw M GP]KpYUpGD]ЕYp"ڲww $Z} ZJwJz WPUUwzJj"+{twtdBw wzvW${w pwp}f]$D}Z"jGW] Ez@ {T]uw tv EtzJj"+{twpzwwzdbbzwwpwww"+{"{KuJwztgwzw} G"p+ zwէzwwzUuGzb&vfvpGw wUTеz`""rt&pr{zgDrrZ I{w'mwp+&j)WKPWzztݚ uK{zkf}԰yuwpp]MDGPאUTw{wwz*}GtvpН{W}UGf&Fm}upGGTpww D} wt tDz}p@p w U@ Gt]Mtzt wzwtuPGTpwwD@wptp w'w w Jwk@zrGp@GGMJwwKMwwzW-wJw wu M WwWwחz}pWU YDDw zڕUUUUUwF"rgtPUy kpjT@{DI GzEM pzw Urzp" pwwGgt ]} }wtzgww@wt t{Tz{tp]کp{W E wUwYuutytPMzWGEGPժw MWEw{WUUU]YUEUpDUWJUw M کp{W tPYuwpWUUw]UzywԤ*wzTUWJGE p{z@YzzgtUwjpw]t'ztGK www-wvUUݪw]] ]zzwwwDW@EG}GGWUzzGJ WUPtwG}]pPPUYw ]UUUTwUUUUwGtw@TGUMrGPUUwE{T{wZG{ z@tPM}GЪJz}E@G @ywpD}GGDMp p }w@}MI@Twt@p tTDU EGwyW @JzEwGwUuwtp@@ @@@{K zz VwAtݧw{}wtzwtwwwjT}DrDwww R}MԧwW@w@@]pw}p @DPzwWEwDGY{}ҶMGDz] tww'@w ttUyw}}GPP@pG*@@]UtUp@]EtwtwwwGWPTY@@qwJ+ yGGpTztwGt]utwtpwzw M}@P}pM]GwMp}PP]w] MYUYEz@tGWUE]MU pU G Ptwtpwzw] MUGw]MUT IjgzPY]utwPt}zTw]]yPt]IUPT UwU]wwwwzWuU]P]U @ u@wYUEY@ETYYGvYGTTUTTUDwtu]upG TUG{tU]Uw TD{WUUPM@w  pUDEt@ԝ up}* GD UX Pz] pp{ pWpwD}@M}tG}}D @ tpM tw@ @ t w} z] pp{T]pwwpE@wwG tt}ڧ@zGJ}wHUwAw} pG Fק]Pw Dt@{]tWwww p ]YD[pPtpM pG GW]UKM B pUQw}W`MGpPPpzwwwwwGppww&G]ݧGG @ p P pD]]@MtM w}  DG} U}ZpwDt}zw{wztwwwuUpz}y} J UP@@] UME WYU}UԐwpMT]}zw{wztUU]ݙ}wPUUww]]UwMGMUtJwWUPWח wݧ@{M@DzDw@]է״ЪKEWpԤwUGtzwwDP] PU@]UUw]UU]DDuz׫zGpU{wu }{Z]Ut@MpZpwUMTUU]UUUzUUEP]UP MGwUM{U]uGU}zG+WpզGwwDT]QE U+{"+ktUJwzY}ZYwMETww۔tIDժgUgpחztz]YYUtU]wԩvtWMI+{"+kt]UUuwzzt UUvw"ԪڴdҐzT]DTTYݽrwkz+tp'Dr'JwB@ mۙwfJdgBtUժgTU]]Pww*b{wp zwGwԧ'zzwzz wwztuЕYYYpՕYtUTuYݕYUUGwtM]]]Y]YUUzw{z]Yvp]W}F{  wt{t*{w׷zwMupA}t}GwMUMݐ ]JwUEPYTM'wwDWtuDU]pQYUEuݭpYw{t*{w׷UY׭jwpD DUw MGAw@J U Xէz}@wQ D}zwDw GTYUp'ЗYU D YYYVPw@E WUՙJwYUUU}Dw' MU{wKP UQaUGz@]QAI}rwM]U wtww PuGwttwwY}M] @wG]UU]GէGWu]]pU] ]Y]YgwEtw zww[}pwYtWYptݩtj}E E]G Tw էzՠԗ}Iw{wY]Y՝Uՙ]Pwt twZ}u zww[Pݵz wUUDwYUp{tgwww}'RYJWP]wrwGMp'GUY{+vGY$vDEGYDdvwjZrwPէz]UUDw@JJtJwwz+g'w wUp'jwtwwMpuYYUZtP]YUUYUU UUPpp]YYU]pMwEYUYU UUwFzW t} GG{{' pU}}wUwzwVZUtz@pZP w TݧUw]]]GTew]M]Ty{zYU]UUY@UupХ+DZ}zwVZUUUUUzGTYU@]]U{pР{ٝ@t۔YzyW@EME}zzf{ww@ ]UUwtMUU}RYUpp[՝ݥrUzz t]YewPUUU]}{{tuzwWwDUUUBbKGYTwwzwWYMU]tP] ]]UUYZ]ڕUYUU p@DPUUUUEUwz]MP٥+EuwUuTDtp]]Pw ptGz]}W utMGttPU]T zpwpPM]@ pMDETE]u T@t P ptGzDUpwG}pMMwM}@wMp wzt  qDW}@T uUUpUGMݧ]t W t uZzzGG D]MptwpP]ݭz @t G ww }խwD ww u}wGM tٝ GWUp YUuUY YuPyMU ] ] GUw@pGU}MttDDT@W UYQYEKp ]DJpЕwWyu] P]YDY@ u] D } pJy@wT D YTPUYQYEKp ]WUYY Ap@wMGyW%հ+ ]Ipw{I@]Y ՝i[M@yM$y ]]z@RYUUPeU ptzDYDwZ]ِYUUUQDYp 'ЧJ}DUt`M-ZTWM]WQٕקpG Gwv+pJp p'wwr-WPpwtwpw@E}wDUTpGՠIwUQUG]@GtwZw@ }EwEЕ]wJwy Y w ]]wEp Y G GUP@]UUБUE}ݔ]M@GtwZwY wtzw@ pUtMpwwEwG@ۻTU]Y]UUuywTUJ@ GUUU tДݕ۝P]ՙAuZt{wPUU DY]Ep UUupv@UpwpMUU MpzPYYMMUp UMTDUP A]pU @TM@pU ]UՕUUUY]YYUUU ЗE]}]]P} wtEP]pwwww}GW`U pDEGw{DpT zUUY]wԵ@wUM}T]GtPY ]U Dp}U}UYTwwww}GW`Y]]]M@PUU]]UDupUpTGJJW]}tGGGUTM}MzP@}UUYp WWUT UpU٧wzww Gw ս@w]UUUUU]wwGjzdWMPGWPu{'{] ]UYz@K]DItGՙtwMUY ݕtPUU]]tt}UE zZTuUmU]YսەԔU+jpr p zEp]t ]IwkywGYMGUzt gydp puZ]YU]]U]UUpwTUUtwwuzW ٧+jpr]}Pp}{ЭWYUtוU]t{+Gbۥ}UtwwE TMrwtUUtg&tpBwv}EUgb{wwrWP]yPP]]EGD$"vwPGJw[zt+zzzUwzw wwWPPkuEUDPYP]UUU եUUUYUYUMwwwDwUUPUUYUtzwwBJzWUuzץUzP MwzzJj[pY} ]fz"""ہ&w'iZ{}f&ywUkzk* wp "״"*J tP+'zw U]pPW} P{ڕuufz"""ہ&DTz''zwR]ՙYYYuGfj+zww Urpugfi{wו-"*+*"{$wMGr*"fr}rwt'vjtu`w}p"""b""W}bpDw"YUU'"+***'"G%'MpG""BjFww }*rbEUQGW tyUUtpwwpptEwtTYU]w*w}G]]MU+{fjrPY {PZ"BUuwUGtwDwtWzUMM DtGw }WwwTPPu} W wt@YP]YY U]DG}G ]]GtwDwtWz]]Up]@TYUp]]tE@ Ww[Y }D}wu]E{wwJGz}G]w}DYմtT@ UU@uztPDUP}]U]Pݭww MWwwtp}'rwzYzgw} }t]UUpG@ZU]]t}PPUUYw]U]T{Y]UwY MMUUtMYtDwtWU}GE}wt UP]++ww&FwP P}Gwp w ԧ}wWMw'wUwP}z*З]uGM PUխ@ P }w++ww&TktwKM]Ppz@{GmJФ[ zzt Mupzvg @pժ'w wBt Y pz$&Jj׹ @ Ew M@tz'"&']*rzvwwz PWUwzk{w p ݧrkPEtGz%]}WyGzwwtwpDuPUyP@@ ו] ݺ  }UUYW+ wuwww+G "+kprݠDYUPj"uwwzuJy 'wyrk]dMwzMIg&bV]Yݝ]UUխJ]wGwMI+G "+kpr uDrkMtYGpUUU""+&{}+ y$K&RwwW]M wG]"kw+pU"g"p B*vbrpE%f'"&"w'rWUyrkU}zp'"'r]rrrzvz+*zYz"{Wz'Ptf"kpYQ pEUQ ]Wu}UՙUU}zp@YYUYUݪGrtYuI]wrrbz* MEMptJwp]Ew{u UMgpT U K u] ݺWuG]}}fwz ]YЙEٕUypեНMI}JwpD]]U]zWU@U] }gpJ*Y]t&{GPUPY+D@]U]URG[ ]e {{vէMUuGpUU] ]KTݺ+G@ېY}}DUpv YݠTշjvw]]uWp]]}QUwYYwTU]UUYUUP T]]QIݙwڪ]PU ]יWwD ]Uy@wYUyv]twD+զze ]WE@UpppDyDDpww{tt@{tJtpEDڙYUyvpzuww&ztGpt+qr y 'RRrtvQmjKg]}]U%RpwzиGqwZAԪՐ%"G B@U} wUYv}uB"$tgU]%z-BJ% F{pHYR**kB{zw"r{www+zֲf "zzwԺ׶&"*{wD*G}rG"'&pb*YYuww@w{ݲf&&F}`r{t}gpMp yY F $ p{'JFwUtWztUЧQUp}G}bpywf&&F}}GM-f"WJwpwgwpwкZ@X]DE}vjPY"Y}]YtMy'WYѕ]G]]MuPf{zZMupF@@UЭGw'""r` vwrGԑp KptzfUqէwwjpTtwwח]zw}wzzzEݥMG@pTwwUWwwwzzTwGРb}zwG uwwwk{@Еyzwz Qu ЗzbG*IJTU)gyu]t}@QDY@EtՕywGg{wJ'rrf[ Uuw Quuv݄ }zw"vzp`*) p"""RDUejrf{"g$]uwDUU%$wwz{rW y"rbR+Օ%"tZpGQrw}RUUYU'wv"Z&wFUU%pz r++R$KDW]ٙ{*"zf"+mw"&f+{ww"r{r"{zp'""w++"&rtw*++]]&z"G M""""rKEUUujrbw{fԻwp&Wpzu [MUwwWppEUYIUՙ]wPPYzu{WU ]U}PU}eUUUZ]wp&WUН] t`wzgP ]]MMwG'TEU]vTPPuwww WM wY" UUUPUyםYUН}RUzzzp]UMJUUUPU@}wGg+J@uU*&zP ՝YYvk{w MPUP{zE] }w]t@T@]MPUU]]U]] w@wU U]U@w @Uu@TeUpUU WY ]UzzGw+wZwp I]U]vyTK ]ݧ} pY}P] PMvpJTٝ}]]ՐYu}Uו]zzGw+wZw D}twpА]YUݙMuU]}ZW@u mGY]}JPUkDuG]wUUեUEMu]{t GUU} pYUUUm{zJJ gGm{DUutEv+*wEEd Yp@Օՙ}WuYU@P U]YUUUU Y ЕUU}]ztY]U ]UU]pPU]YDGwDGtw GMP}wT}PMАPWp՝D EUPwtwGWUUUD@MP DGwDGtw]DptTPDMPPEݧwvTU]pzGUD]GZGЕyGPw]}]tU YzpwGwUGpwWwwuEٝD]U TU]uwwPU@UPYUt KKw KWUMEwWWUUpGwwtpzMP  UWJtPUUUUU T ]U Ppuw@] @Mwt@U@ЭtzWEG PMDtDwpהwDpU]]JyPU]M]]M@ Up T՝]]UPU]]@M UDtDw DpwzMIMtw@@}tpY p u UE}ݝЕ}TtT ]YU}MJPW] P WԐyU]DP uEwPtD G GWM] E@׭GG WUUݕ w]}TPwpMt] DUЕUPՙ]P ] ]UUYPY]]U]] w tw@MpDZD D}T@Q]]z''wIE D@$НMj*Iw ]Q{ttP]Х{pm PDUv$gJTّ՝P UUIp w֙t٧z''wIݙU}@YDB]r*pWQBEtP]ѽwDwbU]{g"rM}EU f}Uk'zk}pݥ{pU]-"+v$*  `+MWEMGz]w$ Y]UjGrDyIUUеPE] YE] ItMPUY ]  JYUPYYUYJ zݕ wЙPtw+V y wתPwTwzUMGդwwpw} pqPJ E]]@uwtuMPTGEEwpz}Y]]UEU}tUuwתPwTwzYUՕ tTUUФ]UU tpGw}*P]PU}wwp wp֤wwt}GוUwW] Y@p]p]BUU pvGPUuwtP PխzwGwt]Gw g}uP zwwUuw@t] *GtTUt]p @DDݙMPՙz UP]U]UDwp@}YYUUM GJwwJ wUUuE}YuUYpw P]UwwztZGzz} MPוw{TPEtՙpUYzPywtUuUw{Z]UUUՕU]DYU}wUjU[]UwwztZGU нz UpPU]zwGv*٠YUU}G U]YE}Kww YUwwՙUU@ٕ g{zwTEDEUywtU]UU zvKD}Ut{wp{W UwwpwU}pWUU}g ]W]U]u ]@UUU]U]]]YٕUU@UDGYYUYU]Uݧ{wݙYUjMUPUU ݤ&U]ЕUwzwZU { UW]}j U JpUUUtPu }UU w*JԐ@ Е]E]U qwE]MWupwzwZ ]]IWPuETIt G" ]DKէJ PՐ]uPTp{E QU p]M PYPU]uBEժwPtEUu UPUY]U ݵݧtpPЙڧ Mz wYUGU pMڙUq}pUНq@ pvpY@Y]UUDU]U]]UUwGwPEMݕTPGGԕuwwzjwjDݡGt TG ]Aww G]ٝݴUwwM P} wT YDu{wUUUpzjwjDPG zD}DGDP]M @GwPE {VPtwP P ]pW PwTMQ }UA]Juuյ @r}٩JUww}D ]G{Z]tUzM@ tzwUIpPݥTpzzU qGDtjYA@DYG]Pw UUtYqG@'Uu{w}WWtU]אUUPUPԧ**GgBIWw W % TM TYPI @z% ZUD{'gDWWytzUP MpWYt**GgBp@@zuwEUqu""Pp } EY Mrwq GzGԝ]yJ+@-ryp@{}pDz}Eי)b"]$&rUW}uGt"VEYwwwrf*tКU]qwwEwwPYqwzp{rw{ @]uwUUG] TT]UDQwtPMptw{GWV}{YyP{zb*+ Р VYj W}PݢD٭Yٻz]`}UjtB@WUU@U]EwU]W}p-*Pp֙uzb*+ tpp*Pݙ`IGPz& ]IBMiFpZYQ]"v@ppYPڐUEWՙUrEk+rZu @zG]-"BG-U&{TY}T}pB"v]}WzF'$ՙQU@@U YY]Up}UЕ՝ ]UUGU@wwT]Upw W] -*tUYY]wzg"[UwPUUPyzwUpDQAz}GP@@Y pW ppMtJ JG pPUUPyzw@wMU]EywzJwy@rrp} wwtMP[]DD]UpYy@{@w}{}G vG@YU]%k]tp{ @ppUUYUYDU}D J"rݺ׭m`J)J MwpYZzwt@'Kzw@@+GtwGwwGtz' @@@pppYtMBFKtp@ujwU PDtvGPz{zGkwZ@}wwWYwyu]MJTz uT]pw@PuutwwYP]UUYuMWUT tGu{MM z{zGkwZ@P]MPнwwwzppUUww }UнBYYwKp Pu]}wFK Ugz]p]Dw ZЭ UG`vGwpUw U wj jMWpwj TUzzpMYwWUYJwww t] ]UY MUP]UUUՕ PUWTwPYYUUUwDEzMWUYUUE'wzttUu{E}uTJDpEwMU P """"w&r w}Ym'ZypЦT٠ z+ $ ]p{'rpTMw@U}ZYt] m"НI[Ѡ""""w&rzt@ r} @wME"rTїTvw rםA@P&vptqUT -+UPmBwQ]EDm} &"rz uMUz+ $"" ""rp&DЅPMp}"rwUp w++u ]}}GP}}wJ JYU@}]]}wwݙՙUU Etwre"{zYٙDFDkU P wf"""  V}z]{W}Ի@}]Ubm$ZKU}* @ PP]Ewz t+]t]wf""" Y tm*kZYj]}'w*t]BMw {GPTu+ФT]}gZY R]P՝]ٙRE""+fW gV}P m]yJ'+"r'ݦ"z++rGU )}"z WUD W']YUGIM}I@DT PT]UUEDGwwM]U* zЁս+PЕY]wwwg"PUUGwwjtwGw wpWPMpMP GTP ]DWu}ٙUUtpWUU]UUU@uUQGwwjtwGw} pwpUUw]]UU TuE}ՠJBTUU wp pUT T}wGPEPMPIY UYU@WM}ڕtwzPM@QYUWu]PUDwљUM Mg] WUpvԭ]Y}ЕU}@wpU pU}Ww]MU] TUUT UUU ]]p@  U] ttw }DuבYUUQU ]wzwGZ uwwut[PPWG ]p UtU]Pzpݭ}WwTYUY ]U Gu*@PwzwGZ tUݥ{wwWWUU@p]UPpp' G TUU{u@Y ]MEtw MppݕUUDtwוpZUG ZM}zUի{twUUUzp]U }KDժwgZW]wwGW]{wwPէ] PUU{[{GEPݙpDUGYYDU]U]] wG}@U UwګБU*E] PpwPP]ݻj"j"GG*P*z'U%TWpf"w" խz pwMk "U* t&'"vwpZtGWW}u]pd{ "tj"j"GG*pU'&&wPՕbp U"&j&"vzA{pg&r'PJTYե*jzw*"jrv@pr@pzjrw{Mrp*&"fbZwrwGt-" TUUp+""**+b*@h&T@ݷwb"ktz'Gwjkr"bW @Mtw)GwtwwwpzDקwGqDwu MwUwPY]p] @wDfwB  "GzM*"M@pDwwGppwԛypJ} ]PݕppZ}YKYU]YDutu ]}zwww]]UUM]U yխPݕW] wGppwԛy MDwWu PwU ]w'UP]F] p]uݝUGYEYYq}UTY[M]YT ]DtDD UutT]]wwGEw W]EPw  JvwՐUPwwwwTEtUuMݕWwWUU@UU]UUT[U}pU]]]} w@UE TݭP TՔyw] wtwwwtWp ptGwpw tp }GWWU]tՕאMU ]PwwWUUP]UYUDUwDED}EW} wtwwwtWpE tpwt]U]wW PUGpwwwwwJpzKUYp@ PDTuwwpGWGzJ]UW tMUUݠGEM@yGՕDtWU]}M ]אUTuGWUݕՙUyj UY }Y}}UdԤP]}w{pwpPUM]UYUYMUАD]UUPEUpDGw}UUUUwwGt' ED}tUwt}wW]MtTwp*DtUzzwY`pYE@]GtyWzԩհ}אwIuzwTUUU]UUՕ ݐUU TyG Wp*DtUUEЭ{zwUpFUYYp$grYYY{[ WGrz +*Ug*w@R'wrUյFU{*r'W{KU t'$Uv'vG@׷w'ڝY{zYwPUgzwGYyPuTUYYUU MUUUUUYU]UUE }UYYY]} YYUUY@ J uG E@PP]Gpw'ڭYEzwwzEw w} wwwM@w]T}Q]PUwWUUDwU@pwt }]zwwzQGנww@]w]UwwpvgݷTzzzݕU}w{zpyZ} t Jww}]zP W U]pTw}}BUU PE YYTݕE {Y]Yw]Y [٧׭wPzzpMGuMw UPtppݕ]UDMP]UYU @DDwwGwUUD@wu}TUwtEwp pwMUuTUt}zԧww ]PMwMt] U @ @PE P]PU]]@Y]qEUY]UPUUPUU P p]]t}zԧww ]P DDtwDtݠWEpZrԙ]wGWM]]]uuT]Up]@U]P]Up]TT UUDGIUY]qU U]U}GTUUUWYYu]$y YuڕwZ-WUYEpEwUE@D]UݧpP UU]]p] ]ݔ UGpUY } ]P@MEpDz}]I]YUP@wY ]xw}] W pz Mp@}PTp Q}] D @M @z MtWuw @ P@wY ]xwEMGW Up ppw@ zUU՚' DRPpz@}z}]ut]P%wwTUuwzzt K з z}GYE%*EwG QT@pwwZPU]՝Up}u&]U]յW eGMp@Z&}Tw*rGwMЫtMz}M"TDЧ}Jwpgww ww]wtww"M @-נMD ]P]UUGU]PtpYMMu]ݕUUT U]UY U]] ]UMD   ՕP]UUG PYU wwpYt)UРwGBwGp]GE@T P]MUu p]U] PD]D G}tP]DUUYPEz]] PU@АYUUUUPw[TEDP Wp M ݭW PYw}g}G]PUKwtPMP]Y]UuUWЭT] tt @t}GDD]Н}w G wpzWUU pjwtg֗e }zuVP]ww}]UBUYyYݙФTuՠ PU u{v]P]UUUUMEDe"T]ە jwtg֗e ] }ZWU]ՙm]UU]}-ՙ ]uwz}wוV]ݕY" MEU]UyאVЗݝYBU wD]Uu]U]UMG'Gզ"wݝݡ]Ur"U}UUwjIDt]U]pY]U]UU]ZUUUZݕ]tM ] D ] wT]Ue"T]wDUUMխkP՝]лgkvtחyptyWݐՕ} UG]tU]]pTwk]}U ݥwYU]UUUUQWM%w]WUMgkvtחyP@pw 'zZYYݙwUUY]ݷz]-UPp@RUPUIKwЭ U]uzw"zzwG Uwg@W]R]ZI] mR ]תGGz}UUwk ]Uuw jjKp@]{ԤTpWTբ"{}@]JDUUUzzw UuuUUU]U UYYUZUYUՕ ]UPU]MU]z]E]wTU%wEtWY]wzW}UU]G{`"J"+Z}РpwWPmf"yJtU}vfWI{bKy"$JMe+""tIUU@{]mtF{ jTIy{`"J"+Z}@pݭDrbwZMwwUUUm""&&" urQTYj&DWGU'vzUp"++&tY'*"gr t]pw٩}"&"+fz'TUy"pUp$""]b$v*'wYݪrZpw$g]"""y}p}p@p@EP@y QGwYM]}] J'zT{ }Ppժ"B&RUDpwU] zw PpG pjYݍqw}}]P EЕYpݝt] p@ t @G y}M PpwU] zw}T pDwwwj ٷb RWwz}ԧ T}@TݵJMw]EuMpwIG԰ݝD] %+wt MЕYP@Dw{ ]]]YUwu}}ײrzEp}MM$E- %Ww MIU@wz{{tGw Bt pKw{JY}wJD@@pK@z]w }v}@*M DtPJW]wpvtMtw}tGwTm  wY U]I}zPpWP]p'pPWyz ]UUuMMtEWwpvttMGMtwGwwwttwwwնK"GwDwU p@P { P׽zzQYtuk DGMpww v@pM}zGЕUЭ{p'ww{ PJ}w{Z U t}P}ww`WfUqwzz{  u@ U U]]U]zDDP]y' MtwGU]wDtwpUUzzMpzw }PwpPMНwztG P]]Yt]uGUM UEtwW] ] UU } Ew UYWMpzw M pzGu ]pPKtG{WYY]UpGwt@PЧ@p{D UYww* DݝR]pTp]] wDw}UYuG]]UU}G]wuй}@ YTU YUYY]t UDw{pp]UPptTI w@U @Q U]YM@}t]U]UՐttEPp]UEw E YYUU}'[UEWb"""+""rr}gr$pD۪wrp'"{pٷPy 'Z"&'$Iv&&+"BwUtZ PK]wt{ -"G]ru*b"""+""rr}p pw'"gKݧtMm{w""k"ww]Mw"} qJt"w}pz'&yE-MtJGz}GK""bAjp"&}w]p׵z{'""r'G"""w"rwZG w"rrgzDGAu}Mkb""qu]]ekpmJ]}kfҫ }] U@z U+UUuw{W -"GwѕP {&"vwz"jr'"+""u]gwgY]{kbwU{Pyי&zyk*ݗ ݹ"kk@ԝQ]U]DYDzi٫yjr'"+""u WХw'b}wUUp U"b+"FMreYU&Vz]U Y'bz{&*+ggwY+g" Y+wkBpyٱU""j"g'rUYykp] ԥz'""rg]*"uvMݧ+Bw{brִwtUP+"]IXYYD@БDP]]UpyyYY}wTUUՕpt{ziYTPff }Yfzk pM[T]y z}UMUwwzGGywIէp yzzzZUU]UUUPUU]wJtGuufzkU }ݧzUݴYY{zD zPUڠ]נYTP]սrwww{z{GzGwwzpF'w{r{pYtMM}RݕUI]]UPpwzzKtww}{wUwpwww@EYUYU]uUU]YUUUUUUPUUUUՕ@DU] ]UUUU UYtFzWYJt Gz{p@YGUwzwJ{wG׷}wzwZUu w ] ]wPwwݭ}WPyIzY]]YE U}GUzwJ{wG׷] wwwWUU@]UUUխUpprPUzpEEwp {wppwTUpPקיU@wWU t{UUz GGUw] ԠzJw]w'z{IPG}GYUzpJ UwwGwz]UG]tUMMٕ]E]YUUUG@ D TYYUPMw{GptUGu} Upݽ UUw U M Uݝ}ww]MD} qԕ՝UU UPU EU Ut PM@}} Pw U MW tww]w][uݴ'WRtMpwqtTTUP]t ]TUYPPwEU UUU P UU pT]]UUUUQDpUEpPgRttUu @UPTQנzpWGUz YU]U} {]U Dpww MtpU PuG@@UWt pwGu}} @pMwUU]pT WPYJU}@pUPPP ]PytU]]] ]}]YtU PMU}P ]] UP] JU}@pp  PU]EpPРwM @]ww{ZWy MאPPU]]UUuTM E]}PEpu]T]E}G]ٕ]]U] pD YUMЙ]tyG U]yWݕEYuU]yGu TppwwU]}tPP UwpU @ ]אY@UYUG} M }ptM]UUpTYݔ]URUUu pWg+D]]zgu @ UPU]pUUuu@zDt@@zu D[pKPU @]URUUu z WUM]}wVtG+tTukFr`pwեwVGJ ] Up{ tpJ@Uwgm- @uk*KjݭGU]P *w UPwzjwpZUY] U$$"@{t۠UIE]%z"-V+ ]UUWWz'vz@r"}zwwwz}t Jzzppz٧'rgwtk@+ wPU p+ } }GJUwzw P tJէYuQGMppUM Й ]U} WU]M }Ww GPUwzwu } E tw@PUݧYUyUKwrJM}PutM KpwZTU wepE p EUGJw@@} YYU)uwpM T ]ՕU]U PUGy}GMktGt}Y}mw%JU GpUUZt+pwW Kw@}M{w }GbU }wzUz }GUwuw+G G @zp}P}PJp]@Upz}@pWpU@ MEWM@pwTM}M ٝ p uٙPw} P]]U] @]@ ppz}@pWp]]UU]Ф]t p@YUtЕYpDr U wGuYD ]UZpIE] ՕЗMMGPEp]UpM@]UYIzwUٙpUPp }u{TݝYYpT}pקp}]UUWDM]UYՕUYUPwPP]E @E]PYDPDPMp pЙpGՙ]UDwwzwTwv}TD EpEwDEGGw}}] tGTMPPGUw]PuGwG}YUUU}DTU}@]Ww }PDwwzwTwvUU]pPpGEUUDG]]]UtwDwgwwwBUUDpttu}wwtwzGGwGUzGpPTwG]JUMp UUwtw mwUUUw]Y]]]UUG tPTwwGg{}WU D]Zww՗UYwtw}pUu]UwPUU]Uw]WGUUUU ]GttG w}WUUUU@]t wT]Wwu T @Ptw@E]D*""Xb] vD z'FDp"bX{wt vG*KM"Fb**zvGb&&fKw QPp{iۭDf y*""Xbpu b+GZtz wzw'b+j+J+Kt tM'"wGU$bwJ" ktbg"ֶ}wr*vb-BD""""""pwb*} ]+""r&w"br&j'{''bt}"+rkw{{'wpw+fbbWtQ]MmYDYwUuݤJtt@}Dwzww@ @f&'r՗zDJwGGb"ruwjjtuwwwGZ ٺkWuՠvڝwUٝPUwݭMНJyJz]UUUYUY@YPY}ԥ{uZywjjtUM]UwwwwWUUwUՕ zy}էTG}vvuPP[GUEMJzfz{w M]GDYw wZU}vYU dKwUw]]P{zzݷkJPG}KWYYv]ptUwzU@YMYUUPMݕU]UUUUUםYUUՕDU՗YUMw{GwݤY{Eu}W]UW}w UUE Gw+*ZfGG Ԥݦ{EЙw]W} f{UgD@GpgwGDY]}]UUu}wWDYw+*ZfY]IдtZ @zMMݤj'MUt]YyBE] mwPב wrY +wKzPէGzGYPpf+&* {vu {] YYpGw'b&zg@j'T}dm-GwG{*Bz uwgzv{wYXPDYYwY U}}tYUDYD UYtU]]]է{kwG}wWwUםU]J@@k[wGpp] wUt@MyWUݐ՝ Y UU UzpyPUU]PU]Y up T]wGpp] Pt @@U]tUUwU]G}]zН@GMU]uwPUUMYUPԙwYpw]MtPЙ]U UU]UU@WUUQ YEPpW}E]zpwYmwTUw PEw] PU]UY՝]ՙPWt]U]] ] }w@UU]pНw Mu}P]upI]p PtDUTTP]ݤwpwwp }wzDwPGy ww]M PpPUTwp t] WuztwWYP]UU tUWU uJtMpwpwwp]]}wwpWUUD]]Uw PէTw@{WYpwET]Dpptz׽ ]UtP]ww UPwDwGUGtW{ JUUUwpGGGwwtY@y"w{UUY {Et@ԤPYGzwФKMTUWwݕ ЕUUUUwUTMzPUUDw@ wGUUEwUUuJt}]r wGzGMTMpDwXtw vv MpW}w w pMwG } Ep WD] U GGT] @MtpKt@pG PXtw vv w w ]w zg'BBDpww@uвPWuwzT%zztW pG}PE*ptwT'GT]W]MzWPPU]QXIuv"w Pt @$ +$ZT}t@ZbEEpz j}w նwJ ТP]G{'w'MMgwGk}@pGM-j MtupwUb"+j"fTg]U}Pי@rkT PuݝY "%rJ] Pzpk&DU]DP]]uuU]PemwRIb"+j"fTgE-jk{ZYշٝE@]''+EE$FU} qz"'uYw*{Jw ݪt Q%"""&"٪RUU%rJE]Uuw-""-U""r'bRM]ٱ$]r""BTqDfr+jYEWYwU]Gw}U]PEP] UwUGG]UY PU UUfr&GXmY Ywzw'"@]ٙDUUYY zG}Y@j@YYGuzuݕ@Pu Y ݙPY  GDt y@WtPYWUUYY zGקWݐYqtFt@U `Ez$v[J}םutYwAUU@]P]YZwDՕT w]yU]}zz }YYMY ]-z@}YUYYU@]G" ]}UY-J-ۥݝ wtm{ r{wwJwMDwDbww{M@DwwgDwDpUt '@T$+}UUQUY JPw]GDMDzt wuUzIGGPpEW]zwuztUppPEzJW]UUPUU]UDUpwuww UGDMDztUYy`}U Z]]ut'DjW ZUYz U}wvwGUw@UU pfwwG ]pzwUW]֕]{wzwwwzzGuztU]] p}{K{pw Gzwgwjw]}UU t}ZէwPPwtUUUP]YUz}UUUUYT UUUU ttwwUYUUUU tJzzG]uwwM]DTMp+pUUWkw+WEUzUPuE]E}MWw]wUEGU}Tyzv}ݙݕ]U}GUT IWՔG uWkw+WE֕UUUYzzWUUw U]UY+{wtgtzGT ]wzPUWW wB]QGzUw*Z}}V]U'jvPIEeUUw*zzGzwGWYEGUY] gf]J{wwKg ]wzWtuUЕwk]M]PPtpP]UTYYYEYUW]UwtDtG UUtY@Yw`KpTUٔpWw{KwG]u@]wyшHbb@PUMzJw"{zGGK%+ uuwݧZw}MDMPUt @DEywwggtD*Gw `pryшHbbMtp@]Uմyvf'pt" ݵr''*b"Brrwt$PTP}wwP-B'*Wzr"!'vGw&"Bw] "wMZGMPJkQUUYY}w{"r$r'kY)}{'+*@Tt]Q""'""w""z'"fww{""r" w*z""]*&""rwprj""wD}"bGw p-"}""*}MptwfbrzBw{zrGIwGG PqpJUtzE@@PwԽMEJpGwGGUtWuzt]}tP }ݭ{@ W w{zrww]zzpwwG}}wGݗ@v BMTuMJ]@{zMY٠XՔpQU @tд wG@JGzI wPwtGGݵpzpU Urwz{pJ}G z w{twt]PjtzwEw UzwGKw{uzuwwwwUwpJЙwDEgW{@GwwpTw]G w]YywUYU w YpDT]wyGu]YMP YY]@UD@YPБ M@z`{EGTtWPUYU w]} ݝYU G}wtUUyK)ս"JRw@GUywz {wG} UY][}Dՙ wyMw]WG YPYYUYd }MY] @DG UՕUUYwpt}z"rڧKpY U`z}UY K '}MGM"G pG"}zJРpkkw]ptzKM@}gtUPE@pw"p'dbvUQ]UUKwU@UwwDwpWw@WPpp PwpzM}՝ PUU]M ]P wtWUUU]]UUU ] }zEАwwDwpWwU}D}U]ק]P]U]pYEtUMw]wwP uW]PtWuUU P]DU]WTwQ UU@U]Et}UMPU]@]]M]uUE]zWw zw w }-קTPpGM@w]YWPPU]wUTUUU]U]Y PG]UUU]M]@M ]tpwpM}zЕp]Dtݕ @PДYpzkwjjW {ՠ{wФPPptzw Ww]tT}է z}մ}}zt@TW}Ѐ]UYppuzGMwEupzkwjjW { }}D w}Ч ک} GWp}פrGwUzwzwՙt*GDy]]wGzEqZwJuz} pG z}]]U ww}p wzWdz Mw{wKw}U]ݧwKwppEԝwwT MP p}YEwpt] u]]UUwwJ@PuzG}tzwzzzzwWYuD]w] zwPPз@PuD[uwݔPt UE YUMp] ppGD p А] zwMDMT]Y]  @w@p ݷqwuխ ftDwXGUwG}tpUtP԰DM@P]upw{wtwMpKE` T Z%&ptz p w UUU]UUG}GwM w GGdG Uzjjtv{} GMJwzwMD @w@ wzDtpD]pGpwp @Dzgt ]wהYЙu+`* wUzzgDww{uZwUtD gԭ$DT r{ DT]]PM TqUЭzzDwMu+`* wETYzz}@wv@wpGt}׸HwU}z]WAJM@WUtvzGYUJt*w[D@mpgG{G}upEz'" u[rtEU]@]DtJ-b+rztzgwzJJz*w]{bRwJUI] {uM z'u}zwzMAMpww G G]wwIUY }tpG ݝzzw JwwwztKGMwPp tzWtwwy@wwzMww UUUMW}UIuUWP}PMwGG@@tDUGputWT}pUpPp tzWw{zTٕ yzwwwwz@IЧzzvrwww]tww]wDםU]PPwDU]P wUPwwG@Wwz] UEY}p }GttADUUU Ԫ{{wJU]PwTtz  խG{MWtz@pwMwMG}wgzWG MpwwDGUUuwpGwWwGY ztWT}{pzwwUݕ]]uU] ]w""&&w"&wE]){wUW]P`bP}UUgT}k]e[] {*g@TU UWUE%"EI`""&&w"&wEw] YU)bwP]UU]y ]Zt] zwr]w@&F  KrMzДyUD*UݵRuYאGe Mz*vz{JIMpkTY НiU"պt I]Ԣ"MEIUyUݰr&+PPِ}uteETuz}pGw Y՝U ]UUwUUPU]DG]YPWU-"MM Qv+JיyJ f]G]pzMP@ ppzG@@ ]p} ݁tEt @ p Gw pMԷ]G]pzPMW M@tGzwJEzPw PY רwp{p DDM]E tudۧTKM @p׫}TUEw}t@p @p}ww { }UU${HYKpzw j}}wt rwDԦMw@ t pwG }{M p'p rDUMy t kw*zK-ݽ{Gy}պzWwWMPPByU]z׵gݠ PUuj+zZYUD M] }}p %+]w }kw*zK-MwUU ']]UЪwק]}rPU]wuw] MU"KMpp@]ՙuwPݥН՝terUvzw{zzDPUgME@`rzgݲbw]uMUuB"zB]Yw}Ur]@I}t@D tU}t]]] GPWTU@ww]] U]Ew kGWD%+}EY]TwGwwgf D]w""""*&"rrX}$v'wwz  %{Hw'T@bGu'Ew$d"@'rק++&"rwGէWw]F y'" z&""""*&"rrX{wz $"mwzwpz"bk"rקwvPtwpwЕz`G"GשJJz*"Vw'rzJIF Gz b+rr*{+'d"}}{wwz*""B+""rt+bzz" b"rrG* D{b""D}ڭvg pmk"*+BwP}wwwwUGGMwD@Yr Qwzz$" rGwԻ&"ҧwݥz"pzp*wzGG@MptwGMU}wPw E]UpDw@u]P EwwD]ٕUUՕ U}PEpY Upzp*wz]]UݥwtYpwtwtp]pGU@wWpTIٕuV}wwwzt}UwwwtםUdWuUE Uз{Gw{DwwUUw@]YUUYUztwGpU`ZwzWwUԫ* UtpUUUtww@DPYTUYٕUUٙ]]T]YYUDԝUUU}UWw]YUEp ԕU]twUUUUWwtwZGtywD wMD]@@w@wP]]UGQGuUYYUwGZ]]TwM}z}I WwtwZGtTww{DpwwPpwKtzzp}q]EP tzPݚPMWKDDwDMUwe U U ]tu]WUzwpەyuYYG]UU ]UpzYUݗݐYYy eXPUuYYyP-@PY]{WzTWy] wEݗ]]UwPݝ ]Utpww]] PUwww}@{W}z}EٙQGwp׺g[DPuGYzzYwz  UwMu]E@ty}W GDT} ]M]PWu IUY U UG@UԝuzM@@ uGYzzYwz]UUݝUpPUUw]ݝUP}zt'EpwP]]UDwEPD }wڠY}zGpw٫ww@twzUwMtttYUpWMpt]MUՕUEGwtGwYEEtEUtjD}PPYw]T}wEYztU UUYY} M@]{U]U]w@pztWUUuݕwzw]zuEwGDwMM D@zzdwZtz{xtwUݷںWDGYzQDWJdT  Gp JwpGt M }@ }j twzzdwZtwptzjwwD'Dwpw`JWtBYYBw}{EtEP{QYPׁHpXUUPwpztt*wzFUWuppJuGJ*& dݪzwjwPMY@MP{zG tpt}twz GwJwwwGwpttwtGwwGztzt}GGwM Pw@pDpwݧw}p}jPEWW@DPw{zttJwz*zGZ}եzUW k&Dݕ@GU]ՕUWigPE]Uյ$[UU]]]YTYyw]i*ם}R u*zGZ} UMUUizwZUu]]YU "p{ٕݙG}r]YUfBA]MVWy&vwwpEU԰g WU}UYwEՖIU-кgvMzVUٙigGpYUݝ)krG%U&wfR]I]@PYr"ҷUWUppPUU+JUUYuYU }YYЕY]WUUUEU ]UY]БwrW]pUYi*׭tWWzwz'"FU JUwwzzEtwUwpuMJtp}}UJGtwPw@ݧzMPEZPuwwtWY]UU GUWDMp@ wzz]}Y}wQ@W]]wG]Uw{pפ+'v{UUפDGMڠ}tUUzG`wUwDGwwwz]kzwtttUwG'zzpUݧzPUUM tGww uUW]yMJ"vzYEz]]pwJgW]]wpwGwwvET]UDUUUUU}]PYUU@wwwtWU]]E@ݧUQYBP՝Duuԧw{wwppp]tpw{wkw'U}GwDUGZYpP EݧzUwU]wץwpհ}tEvwGWYUUUUYUUWU]uuڕw{wkw'YU]zwtGTYwU]p tGK{UWwBЕU uP [ uw{wwGwYw@U UUp@WMU{grw@WUUUwpU D}dKp'U{{'zZywיUFkvYUוUdwztUED]YU}ՙ]YWՙPUUP]ՕM@}wEUU Uw{ YUutU}} MUUYD@Iy{r AWz&EtGppAJZwG M} ]D @@wY GM}t @{y GWDG}TYD@Iy{rDpPtE Gzwt@ & yJwp$KgrR MMwt KwwtK}DG r wZpuwwzwpu@WtgKwTwMGu-&tG}pКY ]M]Twpwr"rwGtWUٰ`r[*B$KM@t@pG'+GwGzݦww MݻwwJK"DF*wwg' }DwGpB +D@G@ urw@ IG}}DzUDXQAD]ZpG zpzW MpT@u@w@G E p@@pFpzDݺpp PDXQADGP խw{w ԥ}m'""z{www puwzR] wD]}wwwwT wz]pw{zwMEXw-&G{www} Dz ZUtwrr"rw}EwqW- }'r-rrwpYr"w-*pwDKw@ "wB@ pw&GԧvM@p D p}bjwp@+ MfK@GwuDw]tztw J  TwtMUpyM}}MUPpE] P P@wyYUU  W}YGM  tztw J]]]p@wUtWݕt-zF]Twt P wuw pKWdKzTZMuwGU٧t}PwU@pwYG D ] PD]UUw YYE@PpGGz PPpMPpw-а] P}w]]pUGpuUUU]Y{ @T]] Uw@ @pzUwUwwz}gt YG DrwT MEwwwMp pE@}@ M@U ] Ttp}P՝U] M @UUUEuGpTUMUEUMuMԐ}}U]TЪwwMp p]]D@GDy wD@PTtUzpWDWݕyMEU}z wUU]M PuU]wUtUUUUP] UY׹ETMWMM ]G pDGPU UEP QWtUt UU YP D{WU]wGpzUpWTUKJMwUUUUUD K]PU PGUw] @YG}&E}Upp]zGwUUp]pWtD rt}P]M pJPM } WP] pY MU]} ME]tMMtw}GwW GPtD rtEGW u tzpPE w{zVPp}ywwU] MY Pק]uU]z {GէwUYI eYT} @tPU]U]UPUMt"rIttЕ]yMT% }-W-DYtQGd+ ppKtw t 'pptK + twzwwtw }w]ppw"KGmj jz} DGT]w ԔuPGtU ]TWM }PDw}PMM] PPEMpU]TYDIUYTݕ U}MU@PD@up ]w ԔuPGt]U]U]MEu]ݤ]U} $DtUEtP] tPppG]]]}}Mt }G PTwGוݙY }wwPTMpP]UU]P]UUPMUwwwpЧtpUUU՝t-wuWUp @T pwݵpGUU[wMP] UYUUDtKPUUTwt TU]}DUtwpJ]upu}DG]UMtwPUwwtw]T Mp@UUppzpP JY]U] }@t ]EwutW U @ @UDD٭wXWP]wwtw]] ] ]I p]U@E$YݧWUUwU wMMGЩ U }U]U]WUpZM PWy{uP}Pp@tPU]t]@ WjZ}}Uw}JETݰwWU}w]GwPY pW UP w UUUUU{}MԚvU]T@DpפU] w@DGTY]wխwX] }tUYywWYT]Utwwp+ZW'pzw@U WUE wpwp]w{GM]E]wmGwU]GEvwGZUU]U]UUE]Х@׵Y]twwp+ZW'  EwwTUUUpUUUY]EwwGt]tvTp}w PP}wwwwwGwT}]PMw@W]RUYG@yPuJUz{wpwMKPmGw]Pՙн{ztݺkt]u YEww'wWMݠTU]dwwzUU UMPP]]UYU]p]TUMGݕUUUUt]t p]PՕ@UzGwG ݵUН]UUpݴj]]tzfz*GUu zwWYwy wtuuMGpDuЕwwUpTWPyzuUUU]]UUYDUTGYTztU tzfz*GU]]UEwwݠW]]twUYYwzwtw}vPwpGWWP MtrwDzwwwGpgGJGtwKUYttIRՙw$wwt wG UwwUYUU }wwww@tGT'{zYUtzJptp@ WwZwWUtYݝ]]UG U]U]UUUUE]UMUUYYUU@GwD TUUU]E@UD]tmwtTYYTzU wwJwzWEM]u@׷&"*jrvtwKDDZzww'wGw'} gprdP'@$&*bݫ}pJ] uz zpj&"*jrvtGwww'DtJzJzww"f{"z} pGpzww{wtWxrGpw{w{JwWWtzwz{g&Zwzp'zwzwzzwp pJzf+vk{}tprdtEDU]zz$b"gt+YwW{twtzrZwKwzwAb"&mwTzmf Zu"rrwUEwwwwG P WwzwzT zpwWwPg'{wפzz""+"b{W']z]G}zwvgGfۥUwpw "J`*GBtr*bBwEG}wt F- &UFw""+"b{W'D]M'+w}]EW}w}*jJwpt}vwwtgwvd]ZutDGЭww*z w}pw*{{}BWzzz{wMw@D&"""kwpvwd'"'G&b+Gwa$GuUb"bJ&}upw'r+&w]wwwttՐPPpwzwwwuww tz}]tpwkGWDtw"zw{uT$&PY]wwzj&v wGwG""'"krBxmrg@UtK'"ADrwIg+$& `D vPd""""BwpTutz]}] Y]DQ-"y'""'"krBxpzpp@-"'{vw GUeGW}w" +"JGr}wwy"bI@zwЕqtpG"rwwqtz'"[MtMQڐwrG+"bb"+tt'&tGp@uw-""Z'w"""ww&v{w["rr* tWmpzG&"""" W}wGT uzrzwU}M}tzUvYWUEtM -"gGr{Y׻f&"B@@yzzbIrz MDwDpppW }@pMGUPMPTpMU Q}wD D @@{ @MpG}pIrzDt} zGGDЧp u ݷJtWZ wpw}zuwDPեWw } wz} MUt pGp@tP]ٔ%DZPpMpP]U ]] U]]pJzztMpuApu ]'JpzIDtGwwzM{j pppwp&@DKwpwwM@ pppP'KtG}M -rDJU}wMWGpJ"*kִZݹZMGXwzM}@t pwP w]{wp ZpzGW]tG@@P pנt ppJ"*kִZTݕ)*t w uww{zJwww{tj MG]} tGwEtw@w*w u }wzMZ *J {wtWWEP{w]UYH " twz{UKp@E wruwpGDDw*JwW{՗ytMwwUwwwGzzz }E@p]UGp@t]WT w zt pנ ݐw] Jzz@G P{p}tUw}pMWDuwuP EPMEU ]@@wDpUYUUPUMU]M]}J WUp}tUwP]}wtUUUt@]]UDYUpGMu+Tpw]UPq}WWM ׭@MpݠPzTtwMGUtp}w}ЕpGT}Gw]U]]]P] Йwu GJ+puGpw}G'GwPUY}IWzUTUYtE]Pՙ@ ]t]]U ] U}wUUp UM tpE]}JDwDwwP ]UvjZݭt} TY@ժD}]@U}]׵wMU ygkYUUUU]UUEU}w]%k]p[UvjZM}gWUU@UUUUz}@zDݝwW]zyJTUU }pftETMUUU]wpUwZ] Uzz{w]]wT] Puwzz]wwGyJ]PrvwU}zYz]UU PYUU]]UU]UPUU]UT]]YYUUG@MDTTU]UU]rW}%kI{ZY] zwk TUPppzGTwGuutD Gppw}MW}pIP@PwDEt]} P@wtw}TY U@UwyG pzGTwG ]]]uG]}]U] pUUzGt@tG zwU}wtuMwwpwt MGPU W}KU}zwTDPvU]wG@ztwwUUEt]UY] pGwD@ttM uzݙM@EGI׷wPU]pGwGpDUEݐ UWD@D]YYJ WpTUUUUUU@pwwMU]wwwzwWՕyGEtDpME tMwwGt@P """*J""-GD zVuT%"xpDt+ jTt"M*uҗ&brwGUZ}w{@z$"G yk"""*J""w "}Dzw GwTzwzzf""ۤ@ww{U"BGDwBMWU} D]bתzpuwG+uw`wtM{gr} z"FrWM{w"upwwv*b"'&"y*gzuG{wf"RBzDeJpw`jr+&EMezPuzrwzJpuw Jt}t twwwtzwYGgp$"GwKUTG@+wp}vfDzpwwztWMU UtwzG} YUUUPuUGMEPUuGwwWYP UU}Up}wPT]DzpwwztYU p}UUU` P]UMMyDP}w zWUPEwwwݝuM] YE PGGUP]Y]UwEpGw@T}UG]P]}GDYէwwt]wQpUDԧUUtWUUwztww}zYIwUTGz]DUUU]@ՔZUUMMwp]wU դwGpTU}w} GGՑ@WYTU""""""BG$vg}[@WF"}uwtw٤ $%*$z"&*"}PGPYPuZUtA%"Y""""""BG}}w$"{V]Yݷ]EGW"f{*&J+rwYwwq ttrwwѕ}w`+Pe}G Q-rB""bRIpU%*twPMzw$"&P$U""vt"rWU@A*J]r"vrYIxU*b""PU pPY PwpGwWݝEwPWw@Y@UY]UEGwtrPQ%"ԵFt&"Y {+d*wKz wGzԐz'rJYW[ kנ D p{T ]P РdDtו{+d*wKzT}D}Gw pwD uppwztwdyzw@purMwwB!EtU]p{UkUz u}*@MTeRt+"+jrtuwpwРtww'rrrzgppkrp}t'gDJPdr"&ۺG}tmpwGz{g}GPՕ٧uEԝG[wݧ]}E@ GU}w@]ݕ] *{p MGdנwJwGwwwwJwKWUQ t}jG*z p}EG}zwzyYzwPwWuUwutp]w}GwPYՐ]]ЕEGqpWwwtut}jG*q$zWUUPיYEw{w{w}@wPFݧwwGԙY{zwzw׭YUJwzzw }]t{ՙu YP{wzwWuJJPUu UyGGgJ{twݧJzww]]wwtwwZwTUwtzzٙYUٗ]MIYTI]UM YYDwݙwwwGUwwEݐU]@www jDuwU@ YYm"" u$"*&"D")""%z$r-)@QG&"w݅qJ""&bt"""""%bbBR"vyt$Mer YYm""*-"+])"B"""&&*"" %""-""""R""Bt]-"""!"""R jzU &"&{%"(&"Kv""b"Bh" $"mtk"Qr*p+"rwX]p] "+*&"""""""u g*b"*r'""v]""""""""+""""""+w`$"""&"""""""&"""""]"""""+&""B"t*+"""ryt&"d"""mutU *""""w twUzGuEwpu@}DW U]w wwu]EZ]GuwWUTUMU w} twY}ЕUIW]UMG]PUGz@JwK]Y]WtY}pMwzFDG{Jwմ@@ԧp]u]gzw}ptUYwkGp}F ]ww M WՕuzt DYZyGD"]}{WuwwgWYwpwP}tzUMTYMPUUYUwpz]M]Gwzt} wYYJ&WU}uTPzzwwpp w]wפ&jJGwtݭuwu*zwGWU u}GT]uw'}p]Wup*wT]pUuJUE}Dzz }wפ&jJGw wt{b ]z]u]u&{z*էwwtUWUEtw wpwt]&r EBU}{pM} UGzpw}m]UuwI]ݙMww'b&B*ժr ww{'Wuw{zUtP`E]zWPUDG]MU pptJwuUUqW ]]@YwDԝU՝]ݧ}JGНzz@UUG*KtD}wwwKDW@{ݭݽ]p}@Y]UM]U G}} Н}D DPݝН ]} } TMwKDW@{] M t]q] нwwttz@TUw@ P]EGFY UUEwT]YT YwUPwWU }TUDT G}UU}uw}pE]E]p׭zWEUݙywwMt@GT}} E}U]U]]U}M]M]M t]]PUw @pupDUt}TwU ]D""""""" Bw+@{B@*"tG$Tv fp +@""' PD"*""r ԻFFpGWB@wt$"zu{}+"""""""}J} $""ttpxJFw""""r jG*z"BJwMzT]%$wbrvdJ'+&" dww'rwr` mrf" '""z"ק+r`ݻJ""wwpTz ""W*w""b"W԰֪W'""RrkDr* $+"""$BzP-b' ׽-"br*J۠Gpw"wD G pwwpwww$"z' JQB{f+k{wP-B"z'+{Zy]@JPfuWUMY{Tuդ}GtU @TݵgTՕЕM]YpTU WzUwVz'+{Zy@U vU u' }fJ@R jVwUՔYy"zwwpu]"zr}B Y'wrU}uR}tj @zrpDuGt}U]UE}$"kg' r-Gr``$*DPwzrpw'pW]{zfz}}А]TupT}QEUpETU@zt]MUWUUJprpTzDU]Uz{zj& {UսjYQ Jp]wt W]JutU}TIpUY  AGDDz@zG IvpwP @YZYQ J}}w թzzw@w'M'"r'RrխYwKwqp @]U%"w ytJTzPw{GPѴY%"MZJrtUttpUYUpMp+j{UU%EG w*-wݐYYF* k{"wjwzDM@ "Kw*K"zwGwt""b*JMggz UP"vJ*"M'*EQU]U ЪUJzwwzZWtMwKUE[UDݝttYFUU U]Ut]MTt@U}G PՕ] ] ]U@] UJzwwzZWtTTEzTPUUUD}]IpY ]PE @}MMUWY]]Ԑ&G]]՝Y]Y}PYMݕE [EwzwMG } YUTMTt]]@@ԴEUp[U]]P] z[tQYy ]wz PUMՙY]]PՙU]U]] ]]] ttIp}P]UuYDPMݪwzw'J pzu}YZpUzWEPUMU]ppGݠ MGuzU@]tUݐ U]ѥWUDwzw'J tMwW ]G DGUwT"PU@UTTMQwUt U E@}{YUUUp uwUYPF}uݕWPԥM׫tWM]u pG @d[ EJUppGZM]Pt[uՐ]ywEpypYMDtGztwٙ YPU]P }M@PUP]]U@]  UMG} D ZYUG PpE pU]WYMM@U}PDY] ] U UU UpT p] pU] PpE pM]U]u t@@t['UEwPG@ MMPP]E  @ YYW UU]TTJD]UUI} UU @ MY ]]UUUU] }PUZp t] Mםp}z @ MuGuww]]׭pDp PM z}MG w ] Pt ]MU@TUTu pMMPU]EDPET]ݧ&*bGwݠ zM@twY@jwPqP}]@է}t } wu{{GWtݔQ ]TwG]UG&*bGwtpDt }w@w@@u՝wW FpZY]PWtw*M}TW}]UtE]wjwDJ uP]UPpt]MtMweM}zwpp MGKP{rtw}pEYAPշwzPtUpMwwPwpWD@PwP GtUM wUGww  GM]P@Tu]]UP U]wD{z""k+"r@UprdMERp{+Zp p]wwg}&%b]' DY""ztpT pU]}]{ ym"]d{z""k+"r@ ڝEw w"'JG$]Ew"fk"wՑHp@Gruwww"wI]w'& GpmRժwUerMMbbbQk EE%bttw]uzw$""r ""w"rTy']PW"rBٗu +"g+yYץuw@՝U}pwwwYYu]Ew]Uw ԙխwrm"]Jי J+"]UDGfg*"+&"Jp-wzw[tpd"}԰w@t']rw] Q[p""*"BwT Et }Mzpp'g*"+&"Jtw}w-"ppMT}ww["bzfJptGrB G&rzG {rwװr'J{JWgwz"ڤ @ {J Bzt`rwG""ҚrwzG]}rwD] UyJ ""&"KU]J{rp g" gwwGp} M'"""r w}dPWt wzT{GwקztpttwݪpGtMDw{P Dtt  ZTp}Jzz""&"KzTQJG}@wZ}zt}DMYէPKp pzwJGP@}{t]]u"&"KzTYUUUet@}MD wGw EwZUE׺AGPyPJTٕ}`Qy QU@Gpwj GDUPKpљ}}$bRՠzG]u EJM zr{w}wtUuGMw{{ԕ]uwG@TuzppwwtJUX]uwUPMwUUQ]]Pttt@@IwwG{t G UWP]U@DUUuzz wj}ppR pYU]u{P}DАG@ wUu]UyzWUUUUUUEM@WU WGU@W wj}ppR]U] ]{YUGZY{wt*p'[upUݕG W]M]Ypw{ppwՕppzptU'z}} ww@G}tBTU w ]UUUUUU{wzwz]ZW} z*'tUUwUUTwWUGzwp w]UЕU ]PUYU YP}ՠ UUUUYDDtwPUUUU@]wwwUWGםYtJwttU@ wKwtGpE UwU Uww}pP ]J]]PPt G] uw}WY]UY}Uz u]@wKwtGp]]M]UU}PYwUUPPEuZpUT]uw}]GU}]]պpPU}TMUE] U UW@ptMpzW נt}P]G ]WU] DPUwtEI ptzTUUUzz@pMuw]UUwwwzzU}Uw UUUzWK]YU w@QMuJw U]uwDwwjZեz Y wwwUPU]]U ttGp@Gp wD@wp@UwWpPEUՙYUPMU]]]wuDPU ]U P M tUPttGp@Gp w tMy@DwwDwEw@UUݐGrP]U}wUtPUDwם]ԙЕZ}PՐ pE@tMWMTU PP} @EGtWUUUYЙYY} }}U uy]T uPGE@uwGu tpU]YI @UUYݙYD P TP@DuwT t}YUpНwGzkZW`ݰv RUJQE"DuPzYuUZivw$U@uWUUUUUUuGPyujGpR GzkZW`M  z[YU } UUUUU&z'"pU-MUU$Bty@]E]]z*j׽UU*KU]UwpYY%U]r"+"rEB avwp PDtG f&D$j*{*"rե+WUU {zr']UzД]'kzzzYUU]E}YUPٕUUPWPYPYUUUwU wՐ]]U٥ݙwv&zYY]ujGTPU w'" zY @]zW@pwwpPDMGPp w]ݽwG@G]G] Ywuz}} U]U*pwDT@P @UU uw}WW@pww E wE]Dw PEw GK&wpYY] {pt [}WrwD] pYwGjDuMԠ@ }Y[ wDz}puU uz}UUUY]p{{W w MJMu׷WYuU]UUEt TYwuUUPIzMw UUUIwwDY}Q ]]UwG]UUM jTUuw}UYYGUU tZ}U]uqjWzpuwUQYtyw}  Epz IםDJpݭMЗMyzwPUUUPYUDU]}}Gt uqjWzpPUJ}WUUUUtz{t'ujt]YwGP@ WztwYrw{wGUw*}wwMҕJvUDBwgwKtGJPJp]]U] ]շz@]DwW*{{ՙwwwp'UGjz]ХPUНU]pMPUYT wUUUUUGtMppTUU] w wwFtPՕG}}]u}zzz W]]}}UY٘ՐA@Q vDw"IGw]w!wGEtKD}}E YppDtP׈xGDKGwwJD*BtGy Xw@ IwGY٘ՐAEwUywzGzw"Urp$brbrvz{ו}rwtVEDwJP-rjwww" pGy'rzywzY]-"}z YZtwwYYUwrw"*tU% {$R-{rpyw*"wzw"$wwwwzw"{'" Gww&"v*&*Bpgw"t}"rGXwD*+}"v G{wGzD}yݷzz ٕz puwwPyMppJJpTwDpzMEtDMG{ PU Upzpq {t}yݷzz tU]PUJw@'פ" U]WpwD}FwpwK}z{ w$wjwgtwЧwv]} ktJp{UwGpFd`G wPpz@tWYwwwwwEptpzwzt"DwwФw${'Ptp]*EpWUwp UUP] wG*W]@www{pU u gr&Հ{}v@wtwIEGww GwMtw  zU]MMPP} P T]Pp]Et@P]w GwMtwuEtGp} ԧzD zUUzWԤݕ T@MDwD} @էMG@T}P@פuwФ@twew}DPPM }zG ]Mup JPwDz ]DMpP @EU}@p]DDpU]@WE{YAtM@pUpt @ tPz wG]UpEwwpT YGQU}}] QWPUwUwp]y]וMuwJGWPPUՕU@PwD ]]pEwwpT ] tuTU wY]] p$j d]]YwWY p uЁUzu]UwgU T}BuwJ Rwz JM]UwpTUUuzw@wWU pݷwwݭYGU]Dz PUwwttP zUUIWU@U UUՕЧ TwY]U]YY@G}wWUUPPU@UUpzUDu U T@P}UP]wpzwtjWWd]}wwUuVYPwwTw GU@]]GеwwU} UyzwtWUU]UUUUU ]U]uuU wpzwtjWWdUUwwwGUgU]UM@wYUEݗp]UU}wGu W]]D}zwDzGwM]]Y@@GPPUUUppT ]UUwztJwMTUww]U ݤJzzGݤפКupе]Uz'KY @YwwJwYUY U]YUUUTU]Y TU]UYU @ ] UUUէ}}]]yEE]UUUUE[PU]DztzDyPtWQT@up@ MpPuTՔw]wt P@t'ww TPMIP]}z}]TUpDztztwDDTz@@]w] TkwTW w}K]T G D}ڥwtT]MMp}GY]pIPuUp@ } wwGMХTwtpEYUz[U] EէZ}EФMWpGWpwUIwrwE{YzID}YT@}v ]Y@EU U @DpGו DUPug}z}ppWJYY@wwUEWwk&"j+&z{pdDTG p'"z@Ew]Gz u@*Wr*'t'*Wz׭J @@WDGtDbzպk&"j+&z@ pDMmGFtGpDE}wrjۤ& JprM@w"]tG@ݕuvtD*wGTE }`+WG-rJ Irw }Bwp+"BwrjGUr*MPuuwJ'""mU""kBPzzзj"VwGwzGz}'{"+`pKpwwz uz֪z{G } W}M@MtD@UD G @] wpzFwGDwbzUUWYTuwtwuzuukDwWMUwYGwM@ uUPp]UwGݭT@u {zTUUU]YYUUtU]pEpUPpY]UuukDwWU]T] }tw]uWU]w]]U G{GdWwt PPU}wPGy[UפUU{z`w]Uj}jtJG}pUYtzzUMUBYtwpz'w ]UUwG] ݭ{www DPudGG{]]ItwJtwgpYYpGUUUUUU p UUYUUDUYET]UU]UUtwDp DUU]wUwtWUUPM P{t}UY]]UUUwtݠt{wYuVYuGTwwwTwyНtץwݧ@DGywY]]UUUUYpUwwvtw}MwtU upzwWU]gUUU@@uDJJMPUwJuw M u}vzfzzwUUw{ww@֙Uw p֙wJwwwZPUwP Utwwzz@pԪpKzGjzzםYwwpww zwz Y]UYWp}PU]UUUUUPYYYUUUUpw U]MUUUUM zGwwwTٵvtEuZUtGzzwzzMPU}GPtDFKwwvzէ ppt wPt} @ tYGݠݕMukyG pwDW@U Epw}y DpDFKwwvz]M}wp@wGMp@w+W@YE@M @ PWrPtVzp U Wt@wקP@J@}w GY] p{w] w GGW}M d{VU}wG JڻIPGՔuwpXwGw wptwwwpGpwM E} wYpwPU]}TUwpGMjD tw}PUwDwԧ`GwwwDwuU]Yٝz{ ]UW@wMw ]WDZu}M ]U ] UU UUY@PU]U@JETu ]PuU]Yٝz{P]GPPUy DwDwyz$w[B uuIUGMuwp UUU]ZuD]]}w]pPztzW]pUU]J*M wwU}pGTU]UUUU]Ut p]p])t**GE UQK"Mm]ZzpU]Ut wkT]M}pttp{}U}ppUPwGz} }m$ {]pWYי"b"v""X"P'z''֚-rР""HwwYb''"r "++z$""&"rwzM ZGPTԕBPT)+ZmRU&R"b"v""X"@ew'""w@wb]MzY-"""+"F&E-@*"${WpW '""z"$"f+uGb'""*t}'"rg$w""""""vw"ww "+GD]-&""b""w""r"+"''z'$& }{""r+Mv{ E{J""b""Pu  wuwwtpD}Ew Dp՝Ur"YU  Dՙ&"&rUPdRԕWUT"k"&b"BkQYeDMMppK}@WWUp@@PPG]U ݝU MUMEUYU]}u]TPE@pU T tE P]DDMMppK} @ @]wuUpwttp}tPwjMw@ڔZWPpEpUPwwٝ@]UA]u]ԑT M} @DDZuQU@ MU DpWP}GwWU UU]P EYyt pUDUAW WUWEp@yGtGUIGDw{wwYՠYT}D]}GUP]@]PM @u$ tEuD} wM@UНPT]GDww"'+zj]wzwwaPGG@kp{upzpԧp d@JPt*g@TUW]t]]u @} U @ww"'+zj P]EwzwwWU Quԕzwwwzzw@ wu wP pbpwzpw+{Bz}trt ڷ֧zMҭ +j@pBwUUՙYyz "jr'*&B*Gbw !% U@w""Bw@E@przՙwPU iU]]wW@Itݥ M]w w ]UT@pݪקٙUPp UZWUG@+Kwpttסkt+rUwtGJM{Gut՚]PEGٺG}zw]pp@pzfzGw Y}]Нp@Y }Gz TItסkt+r}WuuyGGDw wpGG{''}EEBդ}DPGЕU`r[wwUj&wWwչ[U]w rtPb{zM }zwT]UE@bkr}GGzpZ{w*zUpMt{tp@wwkwMהUww QPY }WwUpwyu@PGtPPUwzvwtT}GzM@ZJ{v }EDpw+wwZ{UMwwGuWYIkT Pwww]ِUwytUuG yUUUUUY ݝYYIwwzMWUUpw+wwZ{UUU] wwwTYUwtpUUUUз{jՙ%UFYtF Euװrgzzw@tTU' ]UtY@wڙݩrUgvwDZqt]U]DmvU{{z՝pיJ tE}@]zUDPݕTu]UUUUYUU]UpYYUUY UYUUtwzww}@UYwzu TTJTp}wMUUUfb+b{W z{EE}wwW@U{ UPUݧPuzwYMPJp{w WMtpwPgMwfb+b{WMP@wWDU }tG}Յՙw }wz}wTTPkwMDP]UݙIW} U]}]VwpPYTU}zwU]Uuw'vv{pwDP Uzw  zD]D}w wwDDE}wGt M}Gw@pww ݪwzUMPguT]wP pGTMwwzG&z*zv w%-]u'fywPYzpJWНuwg}DUu'PYPݝ՝ @UEGI{Yw[uuzG&z*zv]]pz@pUrU]-b'*ԧհҙUUwbw] ] rwp"w'GU`"@tՕ$۪u}Utw pzBpuwUUyw$"jv$]'rgBJ-*Pup+GT}w Q{zy]MQYUUYݕPEu]EYYM}w@]Y]UUG{prPI{UݐUwwww&ݙutUzWDwM}}}@ wwDz}M] }uPPw@}w ]W z@wtPYݕUuDUG@Uyw ]zWDwP ]P}DpPUUMG]]]}pwMgD-PwtF]Y]pwGW t u]ww}tzPztpJDTUU ptEWwUYGwtG}w]U }wUpWwjwwU@GtywGTYUtGEpЙ[wwu] UYUY UPPu]UUUU]z DwwWU]p wp@GwUywU@w uP]wG]pwzI]WM wT DwUu]PU GU PYUpPY] U G tpMt wG]pwzP p@GuU]tzP@ w  d* JW]I}PՔE}w[ T]PpPGUP]@GZ]PQ dUU G]PUЕUUpuEYUUٝUս% ]]UPUF]}tG]UTw@ UU]Uw WtPP @ wwtp]}@pG]p {UMtED {pE]M@w @}PDԺ'gJzz u Gz@MG pM@W` u'zBwםzWyJz]MUyהtFpZ DԺ'gJzzuzzDP]u@pztwݤwG"z"DzwzpKp}P tZA@ zv@ՠ GMW@ЧG*}зDDupGwPGtwjKwBtwUup@mkuMwq]PuV*}FrQ UewPwB'ZYwwՠաzGw{UYupGpGP]TYYzwww'Fp GpDM]{zkUUwTp JU]Pt@ X TpPԝU]]YU] T MM@}TU P@D@Y Tp JM M]UUIp@wMG]uUMd vrP@Uw]zPY PDՕYYYP@p UpWZt EYZD]]YpDp}P]]UUUUYUԷZK u}]PUq}@@P٥p}{pzzD u@@ w@twDG}wD]]UupG @Օ p*KDMGm@wppPU PpP]UYU]p ]P@ ]@W}p ]UYUP] ٕPD G]E tP@}՝]]UYU]pU PDPU]uMpp@t ]]EmU Rp tJUUYUuM]P}@GGݔG ]UQIt] @}G}T]YUYUU]Y UG E@} YUdGJGUMTwдt UK] @UU] W@M wUP @P}@ ]}MJwwP@շwzzGUMU v&Gww Mt Gw}t MPUMէwp`yT]v{UWMt՝]UUGM }Ф v&GwwMwp@  MMwzwխ ]]gKMא ]pMT۽DtWM  ЧG*]}U TptwE wk[MՑ Uwp PUUM mbՙwwT@ԚUtwДte YzUuwpMy}Gw]U@tUU ]Й]Up EMPPՕ]w@ ]pwP } MUQPYIU ]pzpocketsphinx-5prealpha/test/data/tidigits/hmm/mdef0000664000175000017500000003366412771605033017546 00000000000000BMDFBEGIN FILE FORMAT DESCRIPTION int32 n_ciphone; /**< Number of base (CI) phones */ int32 n_phone; /**< Number of base (CI) phones + (CD) triphones */ int32 n_emit_state; /**< Number of emitting states per phone (0 if heterogeneous) */ int32 n_ci_sen; /**< Number of CI senones; these are the first */ int32 n_sen; /**< Number of senones (CI+CD) */ int32 n_tmat; /**< Number of transition matrices */ int32 n_sseq; /**< Number of unique senone sequences */ int32 n_ctx; /**< Number of phones of context */ int32 n_cd_tree; /**< Number of nodes in CD tree structure */ int32 sil; /**< CI phone ID for silence */ char ciphones[][]; /**< CI phone strings (null-terminated) */ char padding[]; /**< Padding to a 4-bytes boundary */ struct { int16 ctx; int16 n_down; int32 pid/down } cd_tree[]; struct { int32 ssid; int32 tmat; int8 attr[4] } phones[]; int32 sseq[]; /**< Unique senone sequences */ int8 sseq_len[]; /**< Number of states in each sseq (none if homogeneous) */ END FILE FORMAT DESCRIPTION ""AX_oneAY_fiveAY_nineEH_sevenEY_eightE_sevenF_fiveF_fourII_threeII_zeroI_sixK_sixN_nineN_nine_2N_oneN_sevenOO_twoOW_fourOW_ohOW_zeroR_fourR_threeR_zeroSILS_sevenS_sixS_six_2TH_threeT_eightT_twoV_fiveV_sevenW_oneZ_zero""&"H"j     !         !   !   ! &' ()*!+, -./ 0123456789:; <=>?@ABCDEFG HIJKLMNOPQRS TUVWXYZ[\]^_ `abcdefghijk lmnopqrstuvw xyz{|}~               " . : F R ^ j v    "# $%2W XY?@10/.-,+*)('&>=<;:9876543JIHGFEDCBA@?edcba`_^]\[ZLKJIHGFEDCBA X W V U T S R Q P O N Mponmlkjihgfe~}            !V UTSRQPO NMLK!q ponmlkj ihgf!} |{zyxwv utsr!  ~!  !2 10/.-,+ *)('!> =<;:987 6543!d cba`_^] \[ZY!| {zyxwvu tsrq!  !& %$#"!  !  !      !  !  !  !  !  !  !  !  !    !!" #$ %&' ''()(*+,-./01 112322400156 6678779565:;;< :=>>?@A B!C !D  E F  G  H  H  I  J  K  K  L  M  M  N  O  P  P  Q   O  R  S  S  P  P  Q   T  !UVVW UXYYVVZ Y![\\] [^__\\` _!abbc adeeffg h!ijkkl jmlllln l!o p p q o r q q q q s q !oppq orqqqqs q!oppq orqqqqs q!tuuv twvvvvx v!yuz{ y|{{{{} {!~ ~ !~ ~ !  !jkkl jmlllln l!jkkl jmlllln l!  !  !  !                          !   !   !                       !! !! !! !! !! !! !! !! !! !! !! !! V  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      #(* #'* $(*#(*#'*#'*"&)+!%(*!%(*,.28<,/35:,.17<-049=,/36;,/16;?BHLR>AEJP?CGNQ@DIOS>AFKP?BGMQVY]ehTX\`fUZ^dgW[_biTX\afUZ^cgkou}knswjmr{lpv~jmqyjmqxkot|jmrz         $+/#&-"(.!%,0 ")-"'-#*. "(.48;<>27;<>59;<>16:=?37:=?16;<>38;<>@CFJN@CFIM@BEHLADGKOPVYZ\QWYZ\RVYZ\TUX[]SUXZ\TUYZ\SUYZ\^`cgk^adil^`cfl_bejn^adhl^adhm^`cfkopqrsxzt~u~{}w|yvpocketsphinx-5prealpha/test/data/tidigits/hmm/variances0000664000175000017500000014611212771605033020577 00000000000000s3 version 1.0 chksum0 yes endhdr D3"  3@?n?;?J?0D?Q?9 ?s>?>&>>#S@^??5S?n?>}?%C??h-?M?O>$">@t @-V?xc?}?Z!n?%$C?-?A?_ ?N>D>'Ag@-<@sH@0(@s?Y?*? 2?8?? ?<@??"6?3?Y-?^ ?>]>>x>>@3&@?OAC?f@w?p?1?ʼ?1aU?h6]?? ?Z ?x>J>z@fS@֧?nw?24?S>>d>u@>t@q1?`??GY?*r?h *??9>?x>>Mb@^@* ?5?\=?c*?hɄ?ԩg?\=Z?{&?}?3>&e@I@?V?l]?n ?pN>?>_a>O>ѝ>ZR@0@X??^?׼!?]S?,U?)?E]9??9?@f$@M?I?b7l?~?޾x?!?>)->؟>'>%@ @(/??Kp?݂q?yN?f6? X???<>o@<@3r?@?@?i>?M?R(?iR'?o>A@?#½>ۛA],y@b@(2@sg @@0@C$>낣@1 ~@M*?3 @? ?r?N???_>;o>W}A("@@??t?h?pv?,zO?O7?5?> f@e9@ @???J|?p\N?X$?؇ ?O?>[R A@?eM@1@?H??D?c?Č?>? ?"#@9@= @]@=?W6??= A?^a??r?+?_>5~@v@;֥?N-}?)q? R?tk?k׈? $?c>>^>@I@ @???u|E?݀%?K?M ?w>m>@|\@@NS??_|? 7A{@6@`k@|g@ @lܿ?> ??r8?Ђ?oI?!@ @ib? ?\?4?????e&?U?>>@+@U'?b?WFz?;?F?w0?6K?p>?A>\@ @:?Q?^>ؖS?T8?R?2??>>X@?-ѿ?&=s?-C?V?-=?#? U??A+?L# ?.@! @~?s? ?\??,>>?ߞ>>@#@@ ? #@?7R??:?ېZ?~$?j2?N@^?T???_5?>??cQ??>q>v>i@1@?ӑ?"~?RB?Z;?n?W?˧>*>>h2@D@ ?ɢ?!S?x?;>Q%=?s?A">y->8>SY@zU@u>@??Ê?FK?c?qB?P(?u?!>bc@?m@d?[?~?g?/{?HF?b#?wl?"?t@$@v@OD?"?]?wh?Nl~? <?'(?S$?>F@n@9y@/?擻? ?bVe?74?L?$? ? *>`@( *@\ ?E?L?P?q)c?C?(?ӈ>H?l> ~@X+@|T?Z?h9?? ? >->ut>p>f> @ @"??3 %?i ?>|?\V>>>k>^@?RS?#?A'?|'?,L??P> ?;>c>@w@,@?;?N?++?9?>6?1 >>Vy@W??؅?Ra?H4?m/?^!?y>A>ES>>?U@6@>?̣?jc?)o?A? ->>f>>>o@??>[?K?&?>.>>c2>n>>.@w2@r@?s?>P?)??8?u"??d>1> a@<@ @ܫ?{v?*?d?MM>">>9C>\>u>@??r??u?H?]?l>q>>&>>c{@i9@?̵?>C? zf?nX??D>>N|>>t@Sv?1 ?P?r? ?*X? ?!?ǹ>*{>F>cW@46@f? @0?Q?°?\¬??2?PX?'?@ @A??b??`>?N?"?rH?T>:>6@Ԕ@ ??@^? G?)vO??>s>>Ɋ>t$@ *@3?dTn?~??!?/?ۑ>H?>N??>ɯ@ޮ@E@-?q[?" ?1B?\>v>[>L>>@E @SF?ؠ>M@]?e?K?Of?b@:???-?>@>A^@]?7`@ ?$?,?n?@??^<?}1?:>\@s &@s?v>P ?;> 1@H\?I&|?E?o8?? >V>B>,Կ>~>>]D@`@?/@q?@a֛?v?*?)?I??C?8@ɓ?KȐ?5V?͑>|@@#@? "???d?2??' ?#>@Y0@'?O?hj?bh?HS? X??KsX?!G}?1?h@?m??a?I8?g?Q8??t:?>&>dǛ>L@???#?#?6?t??>>>x>0A@D@]@NW@@,W@@R?.T?#f??1@?>?V8??1l?0\?N?݄?>cn1?#?=@;@Z@???J??Uh?&rf???߉@X@DL?xU?4?E?K)? ?6>ѩ>=>n>v@7@1V@??4s?uF?Z$?L ?\@MbD@3?H?Ȁ?"[?U? ??E?X>>@@(@@j:??郀??me:?+(D?d>Z>V>!@8:<@e?W?V=???R?`?l?A? ?y@@@@' @?T??@n?>?^ ?>@ʋO@2 ?~?g$f?U? ??[;>>6>>'@?s.?S?>.>U>> >">>/a>@M0@o???"?G???EF%?Y?>oU:?|!?@4??G7?Ea?8?0? W;? ~ ?" ?0Z>%&|>A@χ??:?'?^?:ec?H?2N?D?ަ>?^@@a+@?l?$?!?4L?`>-"?CB%?'?tA1@8@+@q6@~@} c@.Pl@.@@@_?W?>/>l>@[YC@??Kz?a?+*??>|?>>@T@F@~??Q#?}?a,?7C??>R>@?O@7?o?׶?d(?@ S?>b>z>ފ?'@9?Q?s?PV?~6?>>u?Mƒ>>d>%@w|@@@@?֓?ٞ?$n?dH?M?7?|?8[@2 @N??F??>jN??>>Fa>u>D@q^V@?AD@B?8?]s? A?>+S>>+>Eӵ@U@? ?.@?dz?^?E?g%?;(?]?@ @?u?)?-?W?!?z>T>{Π>>8@ҹ-@?c??FT?}?^]?vp(?^?~? >g@@??~N?R?dA???L? VD??Ȩ@5@?N[?B?[?7g?$?>O>d>X>M@0@!@ɢ?Z@)@`@u?Q?Z?m? p?\;?.~?[&?@[*@V?_?-?&?L?B>]??Л> >&'@Hu?%??z?"?+??>Y>h>>L@@s?b?υ? ?!x?͒?,??S ?>I@L?t?ؗ?ce?k-?*?T?>>>>i>PU@AW?]?tA??#?u>>.>7>L>Y>&@@D?T?r?嫄?\X+?9 ??Z?>c ?$ @k?!X??5?ǀ?bQ??}>L ?:K>">|@7@%? ?2Xr?&?k?Uv??6? ?>7 @$I@o#@P2@A?H??v??wh?s?'?o@C"@@>4@pF@<-@??-?X? ?Q?@j?? >?,w@?}?JL?3?S4??}>'>>>@>Z@\???}T?Bg?e4w@%b@?,@?_?\t??i?˽:?>rS>@~A@;>@/?M?ӂ?@???B1?H?Q@:;@??+Ԫ?@? W?A?k??l/> >@sz@][ @^?K?&'?S(??#>\w> fx>ap>kDA=@@z`@R@:?#??Jm?C?|jE?sqp?@u@.{@"@?_o?~?[q?>?uV?{?l>Z*@uy? -?}?(Q?#C?5G(?W ??>>Fױ>z?@<@V@2@:?y@sڏ?&؈?*:??4??5>`5@o?f@?4^?lg?x>&)?\>WF>8>7>>Z@j,@???;?>C?!? >]t> )>̓>C8Y>~@@و?H%?B?! ?Z?> >1>Ĵ>Ð>5j>[#@'?>Ȱ?ށ?$'B?jH5?UJ? >%>xS>>vv>I@`?"1?POR?U9~? 7?'"?E>d ?&>/>m>Qu@C?k?I7M?=?vl?wT??>=>E؟>kh>MA*@???Z@kE?i?0h??J?7? ?pAaO@Q(@4~h@]?N??;d2?8?u4?yE?|?@?>?ci?]?&z1?s$?K?O\?q>=> ڈ>$@=@+@ ? ?dw?N4?Mp,?'O4?I?\>q>_O@E@? ?V?>>.@@%?^6?xZ?+?!?D>eu>Q@>y>kj>&@+ă?of?X???A>>$>J&> >#>b@,@]ց?M?e?K^@? ?9J?1`>>!t>]>e@RHT@@9@ @@n@Ć? ?ޡ??`? @6@??w?? ?h?b>\z>]!>:>!@10@\c+@8@??;PY?7??!>'>%>@1+@?P?;w?j???3>>> >r @ڿ?Э?IA?~P?D>o>`>3>8>ȥ>Nh>}\AWG@@??#q?p?Z??eB?e>/>vV@0@?;?5h???T?8=?٩?;?%>@l@7@}+@| ??@(6@/,@???#_?j]?+FA?lU1?Qi(?o>O@u@I@ @,ȥ?z?ȍ?'5?m?Q?th>Z >"@=W@T%@?^C?]l??]?S?ݴ?{ ?۝&?YA@y @璲?&??l14? ?J?>U>>봣>Ã>f@~@/W??x?2d?p:? .?k?!??L>e@@q@@I5@R@~N@@M.@ύ @v??C@WO@?.f@#3??Y?h?C?!s?b>3W>.=@#@6@??ۏ?R?=?+Q?q$?oC*?;7-?T[@4@W @w?3?[l?1q?R*?JB??>K>@ۥ@Z @Z=??Y?q?va?L?"?u?F>@`L@?q?H?h?A,0?d*?Ϊ/?D?n?>o=Aa0@{@t?+?^?{?>?C5?Z?@>f>.Ag<@??M߂?Me8?eC?2T??> ?g>5HA@>@V<@8@F8@5Y^@bT@/@:@O??g@Hj@?1? 8?8LK?!? ?~ ? ?S?n!>@@@a?X?? (?a[?;Q?G?^??Ԅ@ @}??SE?ih$?\$?,>e>R?k?>@/???Jt?(>C&?أ/?B?a>y ?o>u@! @??@?|o?`P?[?D?.?!>Ӕ>$ry@.@t ??m?_?s5?LM?>>i>>@?@ z?2?y?Gh?mF?>?>u>>@s??2?џ?j?/???F1>!>du>-AL5Q@n?"?Sj?F~k?nA?O?>>1>!>̕@[6??9@?/p?pJ? T?@|#???2? >D@r3??)?gI?&?Z?Q0?-?L)?lq?,`?6@+ @`?.t?Vdw?Z)? ?9?>>>)^u>|@U@9?>r?9?fT? ?Ў?-Q?d?s=?Ui ?m @q@ +@F?0?9v?|?&?^?:!?1?>@A@?k@?~z?F^?-?"N@? ?+p>I-?y@. @r?Z8?ϖ?fEl?~ ?ܼ?*?Bl>>`>"Vq>K@??aϳ???@+?Z.?P(l>h>@}F@;?i?[L?Z?y?t??F*,?kg?>ջ@?h??ZP?{M??͈> > >s>E>0 A@vAB@?@]@o.@gE @_@\=@%&@+@T?w@<@?'b?,e?ϧ?93??>d>Z> o>z>=ߞ@D@W@?K?\.?,V@%@?s?U?bm:?MU?u?F6??d ?Ca>8@r@L Q@mm @Fk? pN@0?1??#q?&?J?t:@V @f@ ?K?w%Q?3?:)?j ?K?d>e>@@?N&?א??h-?"? *?%??WC?;?Y@e??6x?2v?6e?ь}?% ?H5?PY>>c>@ c@YS@*SQ@l@ @E"@d7?i??8+?(?@uQ@[?*??Y*?v?t?g?.~?o5>A,>n@??Ռ?!>?2?g;?!@?)?c>>>_@5o@'@*@е??)bT? A?S+c?7x?>>@YBm@? ?@y?Ms?h}@?2>83 ??z>Z@?$???\?N?"?=%?oD?k'>>1F@?t?&.>}(>˨>y>>@@?O?;?P(?@?q>>鬸>7>̝>U>!Κ@"@@?z?2!?˽+?i?{@?p%?>>>%6@HN?!C)?Y? ?"?>[>>R>}>=j>@?"o??!U?O>?n'?ĥ]?z?>$>9'>o@I@???ɵF??A ?$??(>>3с>V@D+@i @}?GQ?d?.-??.>?'>f>ɰ@5a?= ?ڰ?Jv?4I?9?1>j?#?_x?`?w@=P@?ѩ?ȈS?R?!?4?$?R??V>@Tn @?l?~?((@MvU?7 ?I>3>>A >A^-@@@?m?k??A?4?N?P#?>$>|T@ha@k@r??.Y?H?K?oA??n* ?ˌ>Օ@_&@??u6?_?/%?Q&?R?$>_>0>肄@xC??F?c}?)m?3 ?ߘ6?`%?+?ŋ>Ȕ>?@ܫ?Zk @G??HIk?o!g?Iz?VQ?s?4>ݰ>~GAte@n@y5@ 8@Z?@?UD@@?I? @)@&@??ʖs?c??yV^?;?b ??>5?9%@@?-?ԗ?Vu?@?V??ѲC?E??V@[ ?2ԅ?q?T7?0!? ?A;>o>U>)>u>}`@ ?,??r8?p?J?5?Le%?5F?&)>~>+AT)O@@Nj?@p0.@m?``?\-@q??2G?D ?@.)???;^r?6??~?y ?M,?>>^@?G\x?pK?:?>U>>$>#>X>j>l@VI@@r@ N?x??o??uY? P?g?K?Br ?@]K@f) @?>]/?`[?dQ?*?ŕ-?S}=?5?ݑ>y@2j@?a?ˆ?'A? XZ?5? ?>>T>_@ǕX@@?w?)_??"?s&?"?8)?~?@s?8$@m?'???F?"?YW?>>~@x=@o&@???"I??{?.΂?'A?ee?KAH??y?a>l,?T??1>>[>Lϔ>aAG@1&@f%?,?.??k?='@?uO?jS?:h?@@/@y׿? 8?'?uR?p?> ?\&/?6?1@ʫ?E|?*wX?0?ٶ>^>j>$>Fp> ɖ>e>@,@R @ @V?c?@@E@'&@ Ί?ڥ?[ ?kf?B>)>>t>@H#>@j??4`?b%?r? ?r?>aݧ>9&>9ж@+/@C?NӍ?=?~?~.?~?X?>rs>>S>_@7@l@흮??Ǝ?_~??Z?>@t@@K?@ @?Xf?c?|?X^?vy"?o+??/AV*@??sk?gш?P5?k?nK?|?>ҝ?v;=@z!@@?ɀ]?85?? ?F>DZ>_>x>ɹ>[a@ <>@@_i?䩘?l??a???M?L>@?R??$?s?:?c?0?>s>>$@,@k?@g?,i?me?1}U?N?F? ?>HS@_?Sؒ?ᣇ?e#?" ?"?w>>1>ħ>_l>w@kh@@ @;?:k\?~/?*5?P??q>!+>dR>Ӭ@@?N?Hw? ՘?_?IV?A ?%e?T9?)?mf@'?7???5Z\? ?ߦ?w1>G>M>Xv>m@G"@T؇?U?Y8)?z?a?7>>.m>>X&>@5@??cD @ge?&?!?K?m6?|?;>J3@+@ח@?H?\?r|?B?[?0([?7)?# ?\@Ɍ?"E?z?|}i???UT!?x>8>>y>2 >8@2?6i?M$?q?O>UC>j>>[>C>*>r@,.>@F??p?nv?7?,$?0??><1>%^Ao@z@o?ú@?"8@>'5@&?ۍ?V?^?P? .?X+?I?2>&>>@.<@??V? ??4? B?+3?<%?k? @d@&W*@h<@?)@Η?>q?3\?I%S?D?4?9?=@@d@?s?I?ﺼ?[m?.?Oۀ?kf2? ?@T@e?8u?$6h?:?D0?[)?`o>??[>1A<@0g|@s@-@"@ ?u?r-?]F?˚?H?)ARA@,h@X@)'@>?r???e?ɵ??&???e?[?7R?#?I3?}>y>ݿ>ɬ@`@2@'@E??r?I??t???0?m^*?ZA@@¾??S??_U?R?+?A*?:u?*AE@zUk@o@3@2?'??0\?4?U2??&@?T?G?#?e?jH?@S???.=???q@VZ@DR @[-?Gy>*?B>)>I@V@h$@O@M%?a?{?ڑo?a?Lk?q =?^ ?\@X+@-?~"?^?'?l?U?5?%?O?by?p?f?A-@-@m]@Y<@Ap@(a @?U???i?/@ @Ԧ??Q?:?)~k?@?K?A5?WT?W&?[@@_@D1@F@ @F?ij?}?v?'a?ގ?/@?[??p?gԛ7@8@ @M?_{@?8f??@Į?c?n?M?h? ?d>>>>繋> >l>ƴU>[HB>&>7@|??޲? ޅ?`?JZ\?%?+?2 ?%?0>>?c?,?(B!?!???A ?u?U>C>Wi>Ŵ>eFo@\@?q?Sm? G?4?ԣp?F>e?Zt?x ?>-?@A@U%*@W@? ?HE?Z??k?c;?(f?*+A@@@6@@?J?e?n?Yy?;?_?>?T??gr?2?jnI?D5?>>?xY>(a>^>)}@>@@???l?B?}j?N?0J>>p@.@;@?g?Ȝ?!Y?[?[?9+F?.?j?v?]+?U?@ ?M?ߙ>->E>>>>>SI>~@?5?-?H?$4? ?>T, AO0@bX?|???l?%V?,?8?p ?`p>SAm@s.@2K@&_@!j@`? ??A?v?g?Pk@"@l?s@I?_?|? c?*Z?=?1?g?)Aҧ@3a@@'@?????W6??#A-A# @h@VU@eK@f\@@dB%@@e?C?UA6A@@!u@/g@*@DM@Y@u>@ @?}c?dI???G@2?{1?96&??~e?@?f>O>>P?`R?>?1?55?S&??r ?y?¢>>$>W@E@ @?|?^?e[?J?K?[G?%!??3A0@q!e@ /@vm?E?p?ׅ?y?7 ?yX?e?@5Af@ @5O@q @@??z?0?hr?5\?$Ai@@l@"@.@$H@8??s?n?ֈ?;=??S;?v?uK?s?}6?=?b-?*R?8 ?H?c@@X-@??i?i??u??n?Nf? l?Uc@"@]n?? ??l*O?gWC?-0?'?'?~>ŸUAə@= @ @@?i`??M?e?a?Z??դM?%?9@@C)@o@/2???F?ŏ?C?z?(^?*A@]E?\j??k?Z?K?C>?J 4????☘@cF@Ƌ???8? fy?dl^?gvK?,?&?6?džA dAvky@- "@@?ğ? Qv?Q?8?=8?Z/>/A#@@x>4>>AڵAl@@P@@V @[r@(??c?–??]?\q?BI?#L?tL+?!?5?0?&?H>>>""]@ @?a?锫???f{??N?J e?{l/?A@r\@<@T@k?p_?r?Wm??xe?c'k?L7Aߑ@@f@ *@???bת?b?S??J?ݧ?V|?V/S?iB?[=?,m8?X+'?"?^ ?i>>"b@??ob?^`?5N?<>?d?Q:?/>>)Ҩ>O>Yv>u>R>V>9>yw@y@4?@?jb?P?%H??^ ?4'?L>~b>J@??˳?8V?[g??JK?C"?B??O!?@ l@l@2@9??2?2@??3?[N?j?#@?j??8?T?Gt?%8?-???? @Qf@?lH?N??J?h?O???3"?[?6@u@7@"@?`?ӏ?ȳ?"?0?h_?Ӄ9?g+A@iާ@a@(@)@H@uB@X?ү?ǜ?ۂ?!@?ҋ?4?ψ?[5O???G?-=?#?c/?|>@LF@Ҕ@P@8?op??X/??Z?RA?X`?l{?ڐ?=?oH?3n?xX$?*?q ?>->2>e>0,T@ˑd@@_?:?â?"?w?BP?['? ?(?wJ@`b?f?,?x^|?+ę?iW?\?7)?? ?>J@@`@E@+aN@@e# @0?E?W?W?燅?Ndd?Vtm@ @{!@i?Pd?I? ?U)?3?&?5=?-?@}n@1@IO@/@%@=?8?&?E??Ԯk?BQA%)@d@Hl@{6?5?g?`?yP?B?$!??AA2@Č@Uv@@k@q@?Ė?g?=?q 4?<*?Ah@#v$@? ?4?+??2Ȕ?3`??u?ܕAB'@`@@wQ@z.%@j/@dG@?6?{? ?@pW@l@*=<@F-@A@G@Y?ߑ?ֱ?Ņ?}?IA9@J.@@t@T@AD@6+@&@@V9?Z?]@J??x?*j?B?G??2? ??7>4Am@24@!IN@@e?!?Bǔ?@??'tZ?c1?A@@Iq@0@w4H@ @!@ ??y?m?_ACAF@Vў@>S@}@aG@5rl@?@B? ?5???P?, ?#?lu?z?G2?s?y?c?5z@S@Pr@x@Jh@@T?H#@ ?2?S?%E?T@gH@sX@BI?b?u??do?SS?Z)?P'? ?ط@Q@[V@-@L@dC??1?T?[I?'?3~W?n+@@@]?Ӣ?@=@$Z@yK@[?e??,?fȧ?3?'V?YF?q@j?@9 @O?K?#??/?n?O?DQ? E?Z:A@g@-f@8@H?W????wת?'?b2A @˜@S@?X?z?U?#HQ?oy?%R?z?n&YAm@Q7t@1@ b @????ّ?Ӈ?R=?) @XK?*`?cvI?5?n-? ??? ?ku>>F@U,@n?c?y?7?E_? ?d?.C?o?wV?$AE"@@s@o@.?J?bu??s?d?J;?M$?\TA@@q}M@)@@x??V??v~?Ռq?d?hd?1?T?,??@??6>>>ŧ>K@@????.T? ?[?o+L?5??)? A?@@S+@?J??t?c??}?1?y1?AA"@L@;@.@Gc@[??U?{͍?an?SGAD@l*@?X ??m|?_?:?!? ?x|?18!A@t\@$P@I@A;?:?š?D?>`?5Z?z?L@@\Y@)@P@?DŽ??%?X?l.?\L? A۫@ r@Fv@8@ @vg?Qf@G?@?@u?㕋?@'U?gv?+? t"?{h?$?W.?? >> >E@kU@*@ӹ@5p?G?p?E?7;?CT?t"? )?A@y"ABLh@!M@N@ ?9?+?b?Z?Q?0xA@+A,!@@@F@! @b?2?A?E? `?w`AAОW@75L@-@_@?%?}?.bN?y-??{@ݨ@C@@Z?5?'??hza?-?J?>wMN@=u?Ѐ??\(v?xW?}MB?\,?A?x ?>>@}"@M?R? ?qq?5`? P?A.?;#? ?M?a ?6?5? Й? ?-?n?>_>V>>>E@ME@# ?0G@.??Eٱ?!qA?Cr?Ce?A?EH?x?R?ʎ?R?"c?/>GY@9@?!G??9?t?O?sD?C?zI? J?aaAEAW̽@@A[@!EJ@lM@^O@o@@M@} ?, Az/Ajp@(A@}@7~@@*[@!.@=%@ו?N@n%@f??ܮ?zn?+6??pn?q{{?l?=%?E A آ@.x@6e@$P-@N@@@??࿼?Ws?x??8G?,?D ??>?X9>l>R>E>FA@2@U>m>P>&O>|>st>VT>y<>=.">>S?w?|aO?E?%?C&?e#?eZ(?C ?>g<>r>m@PK@}@`?y?0?)?p?q?x_??/?R(?fA`@Ju@=@@Gl@Y?%2?g?%s?׊U?&V]?B?@6Yl@4O=@}?:?RȰ?a?&$?,w?B_?e ?p ?_@i@F@D@yR!@B@?i?i??%z?,w?U@^@@3@@;?[?v?bm?y]?N8?),?W^A@@5-@r$@o?b?T??l?E?_V?K~?"=[?V2?2?:?֐?` ?8>>N>>ڇ>zz@ģ@4?D?_?K?*? ?t?X?+?b?A~@1@̻y@j$@@x?ez?/w?F?3?G$??Ai3@2$@7@w@S@@?Z @iU??Q?2x? O?jR? ?p>!>>>5Q>>:>5>Q>6T@\?.ܫ?`Ӝ? _?d?!I?YlL?"?{?A?>p?LD?0>}>>3> >>(x>k>/)>]Z>c'@,.@WGN?,o?%?H9?/?(?S ????>.>W@RA:@b%5@РE@?! @œ?+0?X ??g?%F?ĊA@Y@e@@@ ?:?{?Q??V?#*?8m?FU;?(n ?Z>U6>Q>↖>S_>l>قN>٥5>)@ 62@, @@?p?r?a?!%H?=?ڽ??I>@??^??y? v7?SD?/8?, ?p?>@r9@U0@@sd@1@??? n?3ft???6e?W5?[?$?F???>b?#>~>g|@q@N@?:ڲ?M;?q?b#?yi?6(?8A??D]?m?r?Jz?3x?Mu?3Hg?RK?72?g0+???@? b?Z?f?Pg?t@V?1e "@?a?У>@e\@>@H~ @r@?I?W?Gu??dm?oD?AA׀@l}@7@3q@S?Z?R?>?$?=?A; An@_G7@@!/@&G?=??Ē?eL?=?P!g@sA@8*@5t?:?R??bP}?-f?[?o69?)?@S@{a@#@,@ ?R?|f?N??ĉ?3{?Z!AL@|@a@j@L? ?|?Xs?g?p?_n?B?A@\@@ @<@6?F ?2&?-?`?m?t@23@,?V?,?z?}]?`@?L*?)^?Q?j>;vRAX'@C@v@-??v:?'t?RDE?IBE?9@?>/?@/-@?:e?հ??m?PZ? V?:M6?O"??^BAR@A/@T?@@?&?ѱ?r?m>ս>$@D@vB@@@4@B!@)?,Y?X-??> A'^@fQ@:@N?@d?j ??M?5?n\ ?|A#@U@9Z@@?\f??&?U{?fp?1["??!H?C%+?ƻ(?Ga2?i-?e?7?i?'?>>P?;??o?i]?4T?Q4? ??km?S0>2>z@J @{???؎?u?"H?;?f.?|7??dAZ0@s{@O@=,@s#@?ω???$?uz?ƎOA#j@x@/W@@ @'i @5?Q???(c?$\Ax@mI@$9F@[A@Hg=@E%@Z@o]?J?3!@9F?{A;s3A@!@)?A*??՝?/?l?W?q*? A*Ac@Te@5@N@ە?u}??~?K?4Z?_?wN?S$>*>1n>>i>~x>!>o>jE>@?:?Pm?'R?}a?4n%?&3??U.?|!?6>@ 0@. ???XF?"^?,́?x7n? aL?h9?{&+?.1OA@W59@͟:@3@?89?,?'??yFt?b?N?!?Z,_?K?`GR?XM?<9????xK ?>N @,5?Y?i?h?X?=?ږ!?? ?y?j?V&Ab@m5@ @??c?ey?iDu?< ?3?($?kA~@5P@C@P @? ?H'?q?P@s@+?T??ؐ?^?}.%?r@m!@5 @?;?J?????k? g?K@5-d@)19@`D@ @ݲ@e?+?C? @H{?8?(A7@M@%C?P?iY?:?v \?{$w?W?\C?p7?UAl@o@ @?J?|?D4?r?A?'?k?E@?-@5ѿ??ۚ??qs?Y?wC?{_9?O?>e@m@Q'@@ g?v????5΁?>U?q+?A#Aj@9c@@=\@Md?1?B?K?"qv?]HB?+ B}nA@%@CH@@3 @@/W?ִ?ޝ?/gc?$@9?(????e? O?oA?/?(??=@X1@@T@?A? н? ?? ? ]m?ӱZ?`+?I@@o*@x@J?c2?ѵ?}?R?q|?y]?/?=?vGAX@d@R@@L@-@l@`?Yq??Uz?\?Z?Y??>Ѐ>R>> p>p>x}>Jv>Ke> @k @F?8,?Y?m?Zh??!,??w>?²?V?(r?y?zi?\E?p,?t?r%+?s!?>>|Mp@ D@@?@??-?H~??q?&\???@?*,?O>>E>Ev>>cn>Cf> Q>L<>;L->@?$?mc?&z?wA?"s?=??#?ɂ>Z>?&[?=?@1H??"?/?=Q ?r{>L>>>F@ʿ @R=?q7??? ??M?K8?9s,?!?@(-@d@?c??α?@Ž?b\v?S?/ =?*,?{@F@&@S @?Q??|?N?x?|?yT?/PAh@`@n@P'@c]@?z?@D"?Ly?.L?GQA AA@T)]@œ@&?G@ )@?sw?.>i?ۻ5Az@ @ه?|?BE???iq?ig?)6?N?ᓜAT@$e@K@#V@j?]???. ?O?ߓ?s6#?Z@:@L?fx?̔?My?b~?ԕ_?.O?jr9?t.?,?%s@@ %@:@ ?2????BQ?50?(E?AAW@yv`@5%@YB@]?ѩ?h?5^?Ѣ7??ғ4@T?֑?p,?rj?b_?9L?>,?. ?v3?S>>W=@wj3@\ @l?Ϣ?}??Q3Z?v? E?+8?? A6ɐ@OO@#@?U?@[? N?Q??s0?Nl?*Ae@g1@#@@ @L@ ??Ť??;? RA @}\s@gY@^E@?=@Y+@b@y??oT?e?fA@Z@>@5@?H @D?q?7?.?R?~^A@X@؎@.+@&b5@-I@7I@.@:@??&@?H?m:?&?`?N? V?zF??2?/j?5@$ǚ@EA@+@B@?o?j?q^??0{?[Tf?6A̙@@m@=?g??Z? ?@b?C[?p?eAik@ e@)c@2~"@ @A?͟?'?at?D?\?Kc@ý?u?;j?с^?T>Je>@'@}E@0 @J?YS?~?6}?M?'9?q?M? c?G?>!>>ջ>*>y>Kwz>!v>z*>Q>@g?P$?Qwg?fp?_?0?YI??)?c>.?As[@H@@::@?$N@X?@?1?e?i?OMA9D@v@3G@)'/@xd@&@98@tӺ?`??v?F@D&@D??WD?@?4?]X?08?o?ψ?c8?=A@,h@m\@e@V@@M@_1@a??̻?ڋ?أ@[h@r+@E@t(@;?@,?n\?I?@?6?e=?d@+@1B@5M@^!'@K2 @|?!?R;?TM@!D?3?>:?"? ?>Ѭ?P>i>>> >+k>ߔ[>9H<@?~?p=?B??~y?L?DJ?[G>2Am@I@ O@zj? ?m?]'?`?\? ?2>FA@V@6@)Y@k??p?,4@m?O?{X?IHAH As@iT@ @?3?)?H?}? e?B?ƷNAA@P@j0@8@u@TS@V?%??*\?A1Ie@@@?a?G?/ܛ?g?h:V?C?Tmn?S]wA2@$@{w@|+@j@@ ???ó?ˇ? z@?/ ?k??!_?@M?-3? K4?8?1?>Av@jm@,@>@,@25@#?.??Q?LN?@@zR@x??X?ވ?a?4g?t?W?faB?F@o@@\@? ?-]?H?6?s{?T?M3?wF?Ί?_]?Ȑ{?r7?6?b$?u?- ?>>>}@68@֛@@?? 8?Py?ђ?NE?6?M6.?gD?)9?|-??! ?&>>.>Y;>*ߤ>>@w>7T@?|??W?fz?f?4u?p>? A?Rl?{5?9!@h@???w?x?p??o??5?`a?r@y(@?T@\&@f$@Y)@?+U?Al???"n?%@@oč?o??!b?4S?*B?,?>s?8?@v@9@?9?e?.?'ݔ?2Ѕ?:?wO>c>嚼>Ts>@j>ƠA>45>#> W>>?@~??zI??L?/?>>'>a>y>G>_?4?$> I>g>>ܔ>|>:ʋ>z>O>I>@?ħ??\?F?>?Z.?"?8 ? >Y>w?/?`>v>>.{>>>fMz> #U> H>!>c#@?qh?xxW?V4.? ?y?#?t?P>5>G̯><A@r]2@@?@?~?+i?2X???ϝ?Y?x?V?0??7@ l@'5@1@c@@@?.?ζ??Rl?`?+? ?,?<>>2 >aN>\>/B>ݑ>>RvU@?i?=[?Zo?!H?95? ;?H???J?CU@@S@@1?,G?SDz?@?p?9e?w??b-?z?+)AAi@}gx@UpU@!@_?y?oF?4?lv?+]?D?*ugA"@@FT@@'@??]??b? T?]HAJ Aq©@iM@>@a@?@x??ϙ?0??ᴥ??;?t/?S?h]-??(>)?>E>u$c@#j@?{O @?v?]?L?h?!?1*?)?ttAF@i?{>?o?g^?9J? .6?$??i|>>A>}@%q@+@ @"?"?e?s?3i?սW?-?A@'@v@l@B@^ @'?@}\??6?ShA@D'@ @p[f@(@)h @??}&? ?:?I?_"? ?u֦?N??+2?(??>ݓ>{> @,Oc@ܧ@;@o?W@6??Y|?Z?%?d?֚?s^~?7???Lm>>>=>س>6ٌ>+>ػY@h=@j ?b??ի?0Nx?i?U?IY?"?R?*M Aէ@H@>>2> >> t>>d?f#???Y?j`?#??E38?Uj"?P7?R>n>@~3@mL?? C?X?Q}?\Y?w->?k7?ne!?W?F Ah@(T???M?{x?T?8>? ,??D?bA@B@?q?8??;N?=Y?B?_h-?j?XvA@aR@X@f(?>?q?y?Д?MB?:?2?>O>7M> ;>h)> >=$U=`=S=|=G=Wt?.G?X ?>v>Fg>ܔ>ނ>py>vk>,3P>01>@E@g @)@???C?0;q??P?1^?s??8@@;@8 B@@@[?4??4C?V?, ?a?խ>@>>C|>x>ML>!>->i >t> =m?ٍ?T=?GI?G,#?"?a>b>0>>̢>ۋ>o?bj? ?qt>-7>>,ݱ>!>>>N+g> nZ>s<@A@?R,?0?ah?[?z>?M&? ?t?>C_?Mn?1?[>>ᄇ>>/>6>Va>/o>h9>/@z(@?0?n?sQ?'4?Ԥ/?=?Y?J?}>??qd0?2?"?AR? A?>1e>c>>J >:@܌@c1*@k2@u"@o#@{??}?Á?~?-S?q@z%@Ur?u?]b?i@?&?zy>AZ@jw@1@1 @??Ԫ?s? ?oS?G?ml@;@_z@??=??7>?.AAm?@@S@?g?鯪?VM?m9?[.?"@?@?k?*?? ?,?]6t@o@;@;-@8@< ?H?Xb?m?Fir?b?@3?h0@?Ai????d?? ??ҙR?5??- @֖@f@@d^@1.@j#?@?Ѻ??=\?~zg?+?>?te?j#?=;?DU?/?(4>&>W>?Ÿ>`>@4?@DK@$@?Q@uȻ??賚?~?W84?&?|7A @o@ ?@?l?Y???T??5WvAAU5|@gB@g%@?f?1?uy?:??Z?$m@T@a?;j?LJ?U???gK?)?L??s?Y@L|@'@(R+@@?4? ?? ?o??TA4u@@@?9?E?9?= ?*{?t?l?VAb@W y@*G@6%@t7@v<@??=@??Ej?67At@ /@W@W?V???Iq??B?+Y?_D:?=AȨ@ZTD@v]@???\???ٙ?0i??ѫo?4?8!8? ?  ??kx?i>o>>>tm>:F@v@?????i|?X?gVQ?;.??"xAά@`]@ @?X???u?҅y?=?t?AG@AM@z,@C3?5?=?8ާ?6??Ùa?};? @l?.,?N?Uc?>"+>>f>[Қ>Ԇ>-f>@=@?h??]?ڪ?bg>Jd@!H@@R!@@?I?ܗ?U?x?K?DF?Ơ?Y??Z>7?W}>w>>s>>xS>I>j/@;t@vB???L?d8?;2?b2?"@?>e>7??Za?s?F??R+?#?E???֠>$@"*@M @(??Ɯ?1?{??z~?|? Z*?߆AA@$@3Q@sd@?֭???)\?u?=K?6?XA^@v@}C@4@;@F?F? ?Ŗ?l?C?w2A{AQ1@9@L@;?:?c?X?E?<>\>>^5@:@ym@e??#??7??$E?tl??^A@@Wf@@4+@[e?;Z??ס?vٞ?s? JJA =A@@>@+e@[2??M?? ?b??Ϊ?G݇?k?`? g]?0\?Y2??>]>>"E@ay@@@???_?5?c{?6A?S+?o?VT??l?[#?4>x>H>>>~>Ԭ>?> @4@NJ?~?H?J?3lr?ߨ4?V%??E? >@斊@@w@=@%@q??X\?A?]qd?ׂ?&Aǡ@K@@ʳ@F[@f@NH @@X?*Ԗ?Rj?$є@>@=@,?_p?BX?Wx?f?-X?S?^b9?A?A@Ht@o@@@??u?ʇ?M?2?< L?@@f @ d@d?@;?l?\?Bc?DV?7f?FAB A:cp@@<>@3X@U@h@l????DAD@{@&J@q@A@š8@?t?:?a?_?_A^,A@@@8@D@(@Z?&?k?_?fA @DH@: @?(?*ؽ?X?mB[?A?B>?6?0XA@m@V1@-?y??N?c?gw?QY?"?}$?څc?? ?*>?gj>f>>cE>ˆ>:,D>Za@o@ ?????[?\">[@*r@JI?Z?8?jaz?W?W;8?*?k??S>@A\@@p,?-?p??h?̆_?N9?^*? ?(hAI@ o@j-@M@G`?!º?QĚ?qi?fm?K?9?@IA#@}@-@bO@>*?+ ?cƸ?I?_?^j?.h^?/V@3@?]?Tϭ??8~?!R?:?e'?>??2B@@&@%?? ?.?v?ll?Z?Y5?C?tAP@_@3g@ul@H@n@??Xk?q?#@7??&?a?kz@(І@@)?E?j?i?QX?3Y?v???C@@jJ@ i@7??0?j?ׯj?H??!&1???VI?s?V?L? =?T'1?Ȝ&?B?{?r>pR@)J@$? h?+??\e?1-L?6A?j6?V??DuA?A{@e 7@l@D@]î?)@??k?IJ?X'?ևAT@>s*@\#@ I?KU?m?B?J"h?KO?*!?? @@@@OH @Մ?`?S??c?H?mJx?E[?۴@1v@c@,@p?_?%?o?g??Ѹ?@?F?Bn@0_@FV@@?ř??s?Ȏ?Z?? hA@u2`@ge@L%2@?@???? Ɍ?K?gA@M=@_,@?'R?π??b?q?x?xt=?Ž)A@OZ@e@@??.?ճ?i?R?J>ShA AWl@@-@1@|@W?듿??Ӷ?PRo?{?OVA*@R=M@#0@G@Y?t??$?r1p?_?O$Y?ѮA@n@.\@$@P@?n?K?%k?Hu~?Nb?DAC@?M@5?KK?oJ?iM?Ues?0]?UN@?Z?ΐ>/kAvA@*@L/@U @ ?|)??3?nM?9&?Ao@pK@$@Qf???y?w????A^@w@`4@@[1@o?*?? ?? @'@?i$?9q?(D?6W?fK?n>>\?u- ?>3Ab@4N@@G{@}@E?,? ?N-??L7?A@SO@D,?)v?-?ɜ?Y]?囈?@^?'H;?h?O<Aͻ@dUa@@-@R?3?h???\?FR?;-?A>@ <@C @@ @@???)p?3?C?fA@]@\!@?e@ '?.Ӯ?n?E??? J?iL9AtoAK@Sd@3!@b@Aз?|?ܒ?G h?JX?C?%:A;A_N@/@}-@ @r??э?Fx??Tu?5ŀ?]@? ?ȄO?;J?T?v-?? ??P>eL>SUA r@ /@y??6@2j? ?:xU>@)Y@?? ?ؒ?>Ds?Z?F?0? R?Z># Af0@ps@@T@?F??H|?@y?Zj_?I4?/iA1 A@Ѩ<@_F@?!@@??P?:?tW?A)eAd@^G@j-@?ͬ@ʻ??<.?y`?<7?7AA& i@{_0@@?F@)/???[V?,?j@&@/@=6?8??X @At?fg?=%?ڛ0?hJ?@vv@o{g@6@Mj@z8@ @??)?kӖ?9e??A@m @r?[?s،?xh?qN?6?o?VE?&r>YA*@5@q?K?L?܏?Ƃ?j?F?3? &?V|A A@yl@ӳ@@?6??E??[e?IBC@ɣ@#b@I@,W@ي@@/@$?@s?"@x?˞?z?@ap?HHc?T?>?,7?jC(?nB? ?j@7@2?[?:Ƿ???? A? `d?%9?I1?5?'?46? *?2/? ?B" ?N?e>p>_>|>Q@4 @6??Vl?1P? ???eM]?H?3=?A@ n@.@yB@.@8?+?5??Cr?"W`?GAj@@Q‘@@ǽ@ @? ?'?F ?p?AIk@t@o?? ?r{?R?_F?2??5 ?z,A29@@U^@@3;??l?%`?{?q?+V?@#@ZF@/<@1@)?.?1ؒ? ?؊?w?t?%A=@@Oh@@3u#@[@@au?0M?5?5?? @t?{b`??(?Ѽ(?o-?L?>~?7>Y>uߨ@;@jt@t'@h??M̴?ލ?$w?ˡ?}]?#?(e?K?dE@&8??U4?Zm?6?͸?&n?Z?,J?p?dx?CA@,V`@@f'@D?s?4??S?*?.QV?m 6A'@r N@%X@~. @&?k@?:?iX?>1w?U?>?JA @1@ %@+)@|&@????ʅ?IS?HA,@z@@@?? ?J?T???-?PA@=S@st@0lD@? ?I@Sl??h?"M+?*j@ E?0?s???tk?!B?=gT?h?0? ?R@@Q@:@?Y@????Gd??]?@q*??`W?_G?]:?a3?*$??n?[L?M>cs@< @qі?~?kh?W?x\;?/?%?v?????Ĺ?nk?(q?Tq???TC?~?:W?2??>r@ M@r@@ @"?@Ֆ?P????>?@A.@T?x???O?$+A?T??r ?Q>xeA0@$@@E6@WN@#?PJ?˦???u?$@B@E@?N?7?am?g ~?Dv?Z?[L?P?@@XB@@@???]??Wh??cS?7K9?ԏ2?\?I|n?0AY@ @^m@E@T @B @u?I?U?&?D?6@2@?Dµ??}???i?`?b>>> X@+@]@@5@?@@K?4?$?Q?&uAg6&A@2AlՆA)A\A%tBuA ?>>AA x@ Q@eAA2vB\?1>>6B*՘ATAl?s>ȸ> A3Aƕ@Q?'v>9>vXA)AAeAoB#BA~A@A~@!@A(p@u@tIAf@ @rA߅B@AAËAE)/AEA@@A6@屜A鏬AmBoBXB^B)A(A @ _@_AxEB&A|8A9A]AȒAB%QVB3{BoAҞ7B[AtBAݻAH(B`[AwAvԓA$:A~@YiA BCyBUAAwABqB{%:B5CA\+V@hvB AOA$HADAPBBAqAƦ.A8"BPA#A_pA8?b@BWA A\tA}%@?~i}AQBԸAL7BbQBF_ACj|A/ATK@BAA!AAcBKBAyqA~A# Bw@a@5hA*BAO0BMAsAAA/7A>$A)D"B'?lA$A;A.A-{@7?>wA9AtAX1 C;B/A3.D/BA,eAq@AoA!FAA3.D/BA,ׯAkQLAA A B!BBſA1WAւAF[:B+CB@#A* @\@3.D/BA,cDAy9 AluAA|AAAB|BB{Bz%BXA,A@eA`AYV@bAfA_(@ApAbIhBh]B3.D/BA,8ӪA'B4BA&A;ABGAmeCSBnAIA@ߏA4 BiA=u@( A^ TB)EA3.D/BA,cA7A"*ABJxAA@W]@6ƅ@:?&r>BX>zBӼA2 BCArlBhlA BxAn A3.D/BA,+BJ9@k@RAKBYA=BTBPk-BAUKAhAtlAA=Ap:B@2@^BqA}.A{BeAŸAs-B'*B>AW8A+A@1A @%b@]ABAA ALx@{Aφ?Gb?@AN@Dz@NA:@m @wAAaA+A8$B'[BA=AQAA ]A)sAgA/A޺@X9AR@mKA?A6AlAiAߢ@e@AaA`3AzAߟAFuA!FAzy??(A.*AXt@5B/=Y'!?B@R,?n߽AP@k@Aw'@? A(BmBh6AAAEBAAA@N@3B!$ BABABhABBAvBdA~AABB_O@?oBv BeؗA&˧AAmAm[qA!pBA!=aA;2A`}BABA@ŬA7AAA AMA AjxAADA5ABuAtAA@AAzulADAyAgr=ABnALBIAn2A AA-Al)AIASA^j@6/A_@AB8,AAA7fpAP@YuAFoAg(B(BB)bA*AtAoAdA Ax@Aݛ ByTBuAYARrA/?C2R?Pe=xA˪AA]:AQ@6؅@3?A,(A4JgAL?\?8˛?{??? xN?K?t?l??#iA?5?n?@y%?n??0%???5?qn?a?ҩ@#<@[@?u)@ -*@A%@j$@?Ŵ??^?h?) @@8@e?S?g@???Y?0?+?-w?y0?r{?0?jj?BV9?D'?z??NM?B?|2?|@@(G@9@ @@Q?T????'? @@s@C@-@C[@?W?)j?+?L???Q?y?? i?:z?,?g?h>d>iT>ZM>@M*@C@[@U@2@3.@'P?u??P?~?@??/P?R/,?? >_.> Q>;>̹>/>r>]or?&?s}??@(?j?Y?fX?d?n?bp?Eb?vA{A_,ADAhA@@o@@3@aV@c@CFi?P&?(?5?P?J6?H?S?E ?1?E+?w?wF?o6??ӿ3?"?ߺ@??3/??w?F?>c?Z?|W??DP?A?/?f%??>&>> ?A?鉟?.?5??愀?--?MAB?Sz?o?L?@C?m?Eb??*?np?"?o?7?376??q?P??=?.?6?$?%?EIj?.&?8?lX?X??L @M?^?-?\?_?|?pƥ? ??-??j>3 ?"R?G>Cb>d>>/>g> >dF?ŧ>l>{>Ԙ>>Y>0-n>zS> Q>uB>%>??h m?"~?q?V`?A?I<.?:??-?9h> >lm> (>#>4p>13>><> @>>T@a@A,@-!@S@@@I$@1 @^'@"? ?N?,@ۺ/@:?@Q?"^?:@8??6:?"n?iR?cA8/A@S@b}@@O@3*@~@o??~?h??%??8Z? ?r?:A?Mj?U?V??5?/ ?͑k?,? ?S2?f?Ρ>kP>{>)k?3 ??7t?rN?7K=??[X?#:?1p?ڇ?j??m?_c? ?G>1L>-W> >X>p>py>$R>$A>L;>Pi+>|?N?>>>v>>p>aA>W>l8>EL> P>02?a?4?u@?n1???8 ?5?>??3?%?پ?P?({?i??y{?%{?֬c?=?52?N_?M?M?8?U?+p???,?(?l}?rW?9;??:?U?Xi?oa:?18=?L?!? ?~?>=6\@@f?W??h?`???Q?L?G_?@@k?>C> ?@O?S?@?Ϭ?X?>??N?Ru?!????J?B?E܁?>?Zq?d?"S?]?%z@L@s?@/@ @P?"?]?6??85???]ױ?D?/?T??HM?S?eH?0i?ځ?[?:@6 @7a@6@\ @3??Y?&?7?ѽ?ko?>r?Of?ͅ?S?Z?`>?s;?m I?)Q?=?5|F?I?7?h?S>H?G?*BM?>?=Ã?9\? X?6-?!\?s??E?{7?/?%A?Ǟ?Hd?cz?bOu?Q%b?P?z@3@@ >&@@[??3Ƥ?Ĥ?h{?^KY?3?m?k'@V??O??? ?z?o??\?t!A|9AA AP@t@LuX@C@M@r7@;@jU+@>@?x?z?=b?l?ٻa?S%?4?P&?y&?)?KO?ۓ@J@,L@\sP@@@-*@?Y@?(?C???>>џ>d>>>ީ~>,s>k>m>`>m?[B?%?"d?4&?+A?Q]?Ls,?jh?ZUb?U?U?@gn@@@$@?'@?x?g???#?aAT@Z@Ύ@.~@ <@3n@XV@N-@/)@8b @???L@ @Z@e?3-?:?\?1?z?] \?(?M?d?Z?G[?a@?C(6?Bp?EpJ?T@?\&??*'@ʗ?T ??P????,?b?pe?u?h??"?Q-C?*?7?η.?I??H?5?D}?Q?:s>C?c>>P>>Z>#>q>[> >|>;>?o?wL?ZcI?q+?!?"?E>N>>5>$>+?S?f ? >h><>>>Aj>ET>ۏ>f]>_?2 @S?V?iK?a?0z?臅?ԭT?ҋ??ǀ?eh?G)????{?uX?҇Q?l?*|?\h?l J?h?U?;\?QN?Z:?lA?.?G ?[??+??P?M? ?(?>.?u ????i>>>;@@?I?m?Z?9)??iy??Ip? J?* @L@O@­??i?#??|??k?{L?+`@ͮ&@&v?=???;??q?Xo?J?=?ts??ZB?Q?Im?p?H?5{? ?-?X?^?/ @B@{? @sn?]? *?L??C??Ə?Q@i[@GE@0H @?J??K?}?뷤??⡆?Щ>>K>֑V>p/>c1>W>>%=:g=Y=m=;l@I'@ ?Ї?"?-? ?vC?h?Xv?=P?P5?ǘ? ?b>>G>U6>>D>gN>Ս>5>ޘ>-}?80,?l?R?,B? ~9?޾?0 ?zV3?%??G/?B>V>#j>v>$CQ>L>23>V>J>?>V=G=/A6A?5q@N>5@d&@QP'@s@f ? @?ˆ?,u?Z??{?I.@S@2@T0@5 @ @?4?D??`?Mc??0W?p??Uh??R+?~?j?@^@~@}<@li?]?^?۟?Ę?o?]yu?C?mn?&?W>RЯ>>A>ץ>.>>R=>|>Co>z?Eֽ?q?ʰ\?@$A???:?">?c 9?+1?8 ?RT?Ɂ?B}?[?zB?Z?v0?婢?pO?6՘????nF?֓?cӏ?vB?o,|?c?XJ?;g?Mo!?C'?bD?s@V@0?P6@"@W@??Y?&???oAՑ@@@@N@p|.@;,@@??r?A.sAU@@@DM@q(@@?c??%{?i?>&?]??B?M>>K2>>'>>>"?Ex?H?yT?ۗ?%X?;?}?od??u ?D@ ?6?aܳ?)?ϭ??u?gZ?G?L?#?M8?'?n?V_?8K?n?qB?D?eZ?%?j ?QA?]??:>??a-?r?p?s?9o?~F?"?_E?@@cS@Ͱ@|}@QE@0t@>r@@@?(??˖???s??t?Et?{Y?jd?cgq?\Q?;p?G?S?iJ?xc?e?{?i?&N?]?l?5?lm?4@u@t@B? @;???Q?ß?Bnz?[?ZV?"?( ?Z>>>'>g>>݈>>T>~a@8q@!|@?:@@*@_E@A@@ZJ???}f?u?3C?ac?bA?&~?u$D?+?2L?ER?ܯ)?6?_?I$@J? ? ??A?rV????G? @5@HT@3ii@C@dL@MG@.F@D?>_?Nv?z??5}?BKb?k?@N?[Z?Jd?:u@?,N@?qD?>W?i&$A.7AF@@<@wŽ@8M@s@U?y?/?j?Y$@+)?'?5??k)?yg?)?u??a?C?@>@9/@? ???ݔ?#?cx?Ig?"&e?v@?-e>!1>\>>fG>--,>Y*4>,#>s>0] >IX>Ɏ A@?\@Q@(@h@?S@OX@@O@s?]??>9,>?->:>)>T>R>g>Q==K=?ʲ?.>????E?ռ?'?\خ?(г?jA??R?u?{@<@%"@% @?_?̇?\??/u??i?wO? E?l? ?͏?ԉ?9?k?k\J@Y@@N$@-?@?m?????&r?@=@UH9@@t(?z??1???p?b?*o@@>@@1@j%/@?k"?d˶?Ԡ?+?Ē?ʊ?\~!?:?g>d?z >}>z>R>Υ>>b>܉??28?2?? ?Y"??_Hr?I?,?U?|@;s@,\@5@@S@?T??^?g?U?@ǂ@:&U@8@#@+p@?@ ??aֽ????T?f?h!>>1>k>`>U>̊>8>u`?F?)Q?/?2?0:?w)?}?M ? ?~ > >2@HUI?'?u?ެ?IT?e?ǚ?h?nƇ?t?\Z?I??a?H?98?\??ْ??H?"f?zs?a@Q@Mh@[=@B@#@M@>?e?0??j]?O?R'F?P? ??b>>M>&>R>>>@M@lS@*A@!A@ @a@-???C?fEn??` @@ى@;@C*@@>@?cT?T?f7?MAVՁA@-Aw@G@w@׈i@@H@ @=K?"Az@65w@M@3('@'@^@?[?c??t??f?>???~?????p?k`?f?H?Cg?7??u??7s?wԃ?5sg?X? ?\+?RH?tN?9#? ?G?i?L?p?i?2?@?3(?@?'[?/ ???y??X?bGo?tnA?L??} V?ȢA?xY?6?*;?hy#? ?ʲ>>>> ~??a ?` ?5?D>4>>>Xm>E>\>>Q~??p?ps??"Қ??b?ˑh?d??6?,0?? ?4? ]?C_y?H"y?g ??]C?t?yZ?a?IA9 @{@έ\@Z/@@B??5d?E?%:?F? @ƞ?&?a,?,4?@?5??*r?R?T ? S?O@Wb@8@̿7@@mA@4@*?*??f?녫?u?zi?}Z?Q?o??v?rC?!^?ߢ?e?0k?FR?G?bo??sYl??4?zm?,E?rZ?qE?YF?!%6?Y?I??5> >[>u>һ>ՙ>\>>V@=@F@fi@8/Q@@@7!@l[@?L?D??w?9B?>B>[>]>F>qj>>VƖ>%>‡>@R?B@yL?_ @1@V_>^g$>_>'>f>a>3 >>u=Z>-v=@@<@o_ @5@O@@\B@A@?@`?ض?ia?[?II*?np>Y>m>>>>nr>5c>E>?:s>z??l?k?C?z?ҏ?? 1?iY?.>0>Y>k>*Mj>x@R@Ew@=@h@q$|@.j:@u@@@q??^@ @Y?x? ?jN? "?T8??n??]>LEA%@zf@^"@@0@m5?l?7۷??t??n?0sS?j}?3?]M?AsW>>=?e}?͇?jO??Ϡq?Rތ?}?.(??2f?jHV?1y?A٥@Yp@mD@?gG@0???V>l?C[?71??*,?l?v?'3?r?? ?֭?o?yj?i?mT(@n@??rM?J??S?;*?j?t??z?@}?v?nhm?X-Q?)J?%s>?y%?Ў?Fa(?c?S&?F@sK@^J@$6@"@Jr @#ϭ?. @G?#??7?G ?@7@Q#@??,6?(?Y?dz?f?\?h??pm?^?uP-?uc?A?H?I?pF?j-?1?1?ğ???K?V??f?0o?z?2w?teR?BZ?I6??d>/>0> >>v{>3>l>I>6ބ>$?:>>Y> >V>bV>xiT>V>{>%@> >?c.Y?%N?5q?4?I??,^?*.?( ?|?) ? @?@~?lA?Y?[??C,?2@'?B?(4?>?z?.?4?#?}t>>{>7><>N>W(>7x>Ҡ>^>j?3??d?A?h?5!?H?X>D|>P>N]>Y>R>nqA+@]\@Eʕ@FX@>M%@w@.@"@?AB??8?]"?Nh??5?*?WG?@?h `?g?d:?G?|?k@$?#?@?`v?:?}ޣ?⩍?%W_?$?*(e? y?D? 6?/F?`l?8?9F?[p?؆b?6;?D:?}K?hQAٳ@O=@-A@p @ @m @@v@~?z?VI?d?*?r ?92?=W??#?.?.?IL?5*?t?8AӋ@QE@2@M-@@x?c??Q?V?3?WDA;@@@}p@Y@1J@V@? Y?hײ?@?Ǐ?B@]q@8@@7@87@b9@v@ݮ?:? #?i?U>>==ʸ==Oh=b=Uv=`=H=9=b?U?Yq?B?JvT?b?B#4?V$? ?9?R?ȣ;?ML@d@S7@@ \@3m@\@1@@?c?\?8?B)@{q!@@??>@;&@y@?t?в?`w?A@ @g@D#@ Q@@>?w?%l@?{g?[?.v@h@w(@m.@Xg?!??f?=?Bݞ??H{?>h?j~>%>`>I\k>/0>+>">&>#>bM%>l>&?‘??2@;?T? p??" ??D;?p??0@m?! ?>@=ë?V?.?4??-?;'??!???ho?r;?9?O?OC?[A$? ??A{@Wa@r.q@@>@6X@!@k@@wv @D?n;?@@|@0 @P@, K@=@ @?TQ?I?U?A"n@M@;4E@A@ٵ"@g@?G;@ˆ?l?A?>:Af0@7ϥ@9Wz@#(@$@Yw@@@d@"?@a@\-?b?3n?n?mE?!?_ho?k???4Cr?a?[??N?e?F{?(J?b?BI?D?L96?}>3?r@S{,@'?V??d@G @S?!??g?? +@? ?Ȍ?C?F?0?:?ǭ?Fi?'"?*k?m$@ř@ b@E&@/@Z@>(@e8@?cz?m??+u?O?Ur?k?r?a??B?Ԍ?@{y?g? ??>hv>Le>>>_8V>q<>Tt>7@>R>w->2>\S!>m?$?E?v?A|?E>b~>>>Eb?V>>j9@?@?2)?|?:?J??FC|?Wf?eR?i4?@{7?Y"?] ?ݧ??ޔ?Th?1p?7IJ?+??j%i?5?)T?й?ϛ??F?p? ?懰??V?+@+?@??{?\?Ϝ?2v?\??Ls?~F?/A@P@7@i7?@@^?+??̀?޿k?VW??A?5,????˕?`???߰k?f?پ?T?`>?뇱?X?eb?Sm?q?Ά?u?=?ڋO??!@Z'@@@Q'@. @? ?y??z~??q[??K?\$>Y>8 ?z8?n>Z>E>U>C>@>AM@a@B@@?Uz?W?>"?s???-"@ҙ?iS??-?? O??X??lo?7W?y@rG@H3@\X@"@]@C?;????‹?s?Q@_̀@?^@HZ@<@ cE@@Ct??s?&?@\e?-?g?K?p?V?(??Ŗ?b??<@(@@Dc@1{@$ @N@>@?@)/@3@Q@`@g@U@@?y??'^?)*?a?,y?8n?I?>?t?&?*Q? ڃ?%xo?/?D?vX?b1!??K"??HEAͪ6@M@a@\@G_@'@K @-?-?4j?_?O?̯?{q? k?!@{?5?_-?>?(?-?*?(Y?hE@?Q֔?Y,?E?ǜ?bp?).{? g?_23?02?. ?`k@sJ@#A@;O@cd<@,@ *@h@???)^?pocketsphinx-5prealpha/test/data/tidigits/man.ah.2934za.mfc0000664000175000017500000002721012771605033020701 00000000000000 @rr?C>%1?J>a?2v>ǁ?@?e ;>h?i9? ?@By[@3rp24#>=J?#?N>yǬ? ]?Ҵ*>p@;f"p@7rX?>L?\+?R\@?ɪ=e`}?QC*@?U>?a>">=DQu?R%??e??@>N$@\*,\1@>4fK>j"+=P?#kz?F,?I>~?@u|K{?䪶??XJbk &*l=@@?:U@BV d E?X=ɿ?uq>oѽj~?4ܳ?`D>4u@=>l1#?V-OZ?^o? >'M$\??~>(?|?]2?KK&M@!ECe͝?N?$_>`B=.~=ZIX>3}G?h>b;l@oHW?Zؾb>k?,S5>b=?15?= n=@~o?rT-;(s>H;%=l?w?;>!>>HIA`Z@I2?* }?E￶?m$οGyu>>+oA+#{%?)>2>_ʿ":Y? !(?h?"%o@k$`J?ͿIl*^SQ?=>)@ñVف@"!@=Uѿg|[n??/G>_>G@v5q@>޽_ ^>#Ï$>>?% _>=@^9?lf?Xz&wI?Y?u7>?&?s,?Ƞ?-y@bi/@"1I [Yd۾k?UfT>9`? C>a>oA?Fo@ *1@ۻ־>-=jȽ?;m?J?^Y?%?Ƞ>d@@ 2K* ܾY\?[ >|? ??[}w>?E@LYps!?g>Lck>=zļ>r@ h?dP>Lt>>@q?>> >=>?-?Aվ9K xqM@h>꾇Yuq}>>E0>m?` t>@Ѭ??p?>Sjk>n[>|Ѿ?>=tM?kCt?Z>n> ~׾¾=1>jI=ɈA{ֿ*?!YX V>7>|½6Bn ?h1N=%&Kf>'RQ=mB~ہ@r-,Ge/>x쿡-ur]>?ӿ?&~AF0@]:Ŀ6 %X"cWLDs>[r>,A%@u?&(HO$?7.n#"?<5?6A\ ?@b?2D4=;x?e??gY?.A(vK@(l@?ec5@< P?U?F>>ՓAі@@?Kŝ~:@8\?`>>>D=A֓+@1@_?[ؿj?(P? h>p>`LvB#Z@t?@)>M߮+B5U?/?^@Y O{?f\>gX4B6E@?;m@ȉ5N:,?Ǎ>I?B>2B4 @Y0??e@)ߵ*4?כ=>sWB0@?V0@35Ѓ?|4C>ھy=>B/%I@s> @I! +Ĺp }&bذ<:C>:B,]@9.G@~n[3UlO=W*dl>"?~B'@ؾ<@oK l˿?,>?@B!LH@p@ K{aN(..>?mXh> 5?B@aɶ@?fڨ) =Gf>Iu>? XB@? @+>򳤿A/̦.>w=Ws?\B@?;;@>q[{a_]H>%#qz?aPB#@+?Kn@E?%ѦG:upq>;o?N}B&@\?Tե@k;?I'濊ԿD >޶P?B%@柾F@&;>C<6b WLh=ys=)@vyǿI9?EJB7@~޿@23k\o>?TjtmŽ>zB?b@V#_B?6̿f^x?y?y#= {-׾ 'iBC_@9E9?Devɿ#G"Q.I?Sa?x>|}[/fBE-@5 & -nZ(? ?>n~ڿRڿo3BF@/oUةw/7ovM?a+)`BI@704@j' ? ?MZAat`cBJ@,"˿*ý~"aX??uu\ʿp BK @!ԭx9?e?!~!e&VBJǂ@'|nO%?X@t?aۿwM#,ÍBKeq@>忉g?1y|?TKſicDBK @~*+?jgNxN ?r??F ῌX *3ο,BJ,@e&#,?eBO?k?\" BJx@:c?޿b_ҿ#??aD~T)GMBI?lD? q??X?-1(cBI-?KTR?L]6W??Vȿ:~ǟ=SFBG? @gg ?ϋ>6>ܿ0bBDʃ@uvȪ@/&3})@H=dH[D ?*#FBARQ@6W7@;dͿmX-x<@MrS& >aĔB9 @h7-@99=hM/?x>0 E{by=\J>bbB&z@)=4@<}>fIQh>7{dPfI>;{J?:B!@@Uv?p@Y:?o4gq/Ckm?%?_B@:?A@I?">쿶t_>@/FL'o?BP@?~@XD?r>nj4 >κi[,<?OBЂ@w?@@?,(?82׿ >/?~Bo\@@QV@A?`\2?=lEH?KB@@9@=d;?,Dо?Ҫ㢿 KhȾҤ?ބA@s@cj@I8!? y?Y`?jh*ok\?ΫA @@@~TS?SJRUt&t!;LJ?ŜA@ZW@՚@ue y?aŢS> ׿W;>AA߿ @Q@1H8?3ʙ>4\>itѾ]+>aAH@8Ͼ#f?Q짾2Y>E5vF?WœD/>M,]An@F?ت? F+?rƿB?dm >aA&W@v,?i{8`?wx?#>Du?,t?BV #@!(J%cŤ+>C?֫?52< [>;[?-B! f@/N">vX>n>u?*=>ĵ?;1BV8?;08v|RG}>q?Fd>%?B‹ `@?w.eԿt̸?x `?;KBn=R@ AJ>@AE+BC==+C<6?A^@ 'ѿ)?v?̀?Iɔ?7V2>d?)AI9@p^#Ey?bb@^??3v?8@>?TiAlF @?.!? @9?HG?Kt ?aE, vA(*+b@@S?j?J= 3?DٿM(=p+KAA 9@SLC?@.!Fq#k>`:;= FhVޤ>CIc?`AEغ;?R?;B1.@[~Qo@(vgv>D='2:?v@VKBJ?鐣ؽd ?;֌B7l??gb@ e?MK)=J?Ҿ B6?Z@@jp ?1=k$-?kB4*?c@t@S1?C'uL:I6<噤?8U۾zB.@F?#g@҉A ]ؔlJY? _;p!:y>G>J>*?p~VB@86?ޑ@ӀW3wUمAR?ZܿԾ>H?;?5A@ Y@cu@J ?OE4fP?G)%v??!}~ A>@E~@N@rg?,]ͧ?FdB>?TAdE>1?}@?J=9-sA򁿋? @;s!?G\> ?^>Dľ{ ?>A?>ɤ,?$A?"Z;_>iY?t??A+ )3%AR M>Q\@%0@=7|cW>?xv>nA@ ?Bw8_Сj5>g2>AS Y>]?E@>< YQC?T?U-?UAUyFt?;N?A}?Q>EA'?;fA7ښ)T?l8(>B?\ʾCW==?pw>*.v A}(?Psڇ>@i?DJ?'z֘? ?P8?? >RA@v@W??j?8LHؿكT\?">c>tאB!A.c@S\ 2Ԭg?=L=g!^{xu>|\>dBA h@030?3ٽ3^ӾTZ>M)?\BA@. ˯Vgv@?׿$[J#~?/=5vB/~A<@.}v03B5?6#T¯%m?ཎBBAL@&҃?+!=4??۽c̾B]@R@TK D?%Jo=.R> =վ?I[*Bv@#@ K=I: \މ?=KeLS󾝺?p0<=ںB@?;/ ? Z\?>zB#AQ+?ϿuXDŅ?Y!eů>H?5pB)RAώ>.2i䘿hd?qI^, ?z? +B+AU> 97d?:0wki??}ӿZ%B-̙Afvu:JW=D>Yz??#B1BAۿ"ῇ7˿N}# 鿐H ?s?@qB1@gA.!ؿ/M׿x쿴lp ":?n? zB/"CAڿ@%>1G">|#(PIQ?Ѣ'?GB-Q|A znMX?ne!tQek=bY?c?1HB,@鴿 ;a?CC ?gYF?H?GB,x@wx?Lb-. K?ZC??&B+;@JOP?m~}=G_?r=.=s?B)'@;7?i} `#??H>;#i?neѡB(@Fh,E)?U?)>Ł>yL,Hݫ?vȿ"RB*@+@?1u=7?h>*'/?V^==B(BH@㻿ZM@\g>k[? f?ST]?Áÿ;5Bq@CO@w>i nh=P?3h>Dɿؤ?^}(B @v4>9@J̾N ^="?A>)7Bn@8@?a@?ſn # ?n?ӨRb?? Rw@-@t5y ۿ1fl ?z?!?vy?aUxB}PZ@9@>h([<̲|? F>T D=h ?)A곯LH@A'D?=T?*;U tJ>PH?Ae@A$?>?`#?d`!>=1AЫ@约@ȷᾈ?O? eW:>Mܟ?2A[9A0@U@~LjDd>k^gD̋C ?PtAA2@¬+?%<:?X><ꖾ VL?MB<;2@<@VP?!B}b?'ž1=un]X?CBTaN@J@u -N0jK?ZоKMb=<.W?sHB2@u9@JIjC;>d=!A?T?jB(//<@3@ҿ㺾$1 >M>Xu?^X?VB2>vm?`@9&7l Vĩ>>?>&B6`?c?T.D@0k|ΫŽ>{;$?P>P!B8 f?q>S@z X}k@?wI?sc}B7[S?[>Y@L濕Kq!=f?dD?tOB56?@ۿ̤.DwX>85?!ק`?KUDPB4/@@'}Ƥ@$U}u>*=u>IJEq?2=#bB0`@dqC2@J@{I4?qmvi>>k9?7)B-h@@ ݼI}I&}Ci?t`>4}W=?7B+@ܟ8@R76?> ?>>>?B(@܅)O@? ?n?_^mS>|@?.,B%@48? ?FlT5?9N?> >$?贿3B"3ABu?b?gxvw?`H?{1>>UUB"cA'~?*?$Rb%n@-ʿ+>`>GqB#+A >d$Ǿ@ y@=@ : >ţZ>gB%A "TCܗ@Z9x@IJ>om>З8B'%;AݿK5>?a<?뤿3=L> B$DAC?ѿmiU/t>\?Cgվ?P])?B"A˿ľn?͡#?/&?Ο]M>U>=O(B!xAI$?,??^ں?~?O?M>'B(VA u%|<l q?<\?>?okVƫB@{AI=VO;? x>?k$?}*B!{@c~kIϿL7w:o>pX&?)Q?xz[B@-?JQڿ^;:2쾤4E-?&>h?mͰȿ&0B@^?kIJa=&P=>ѿ=?JG?bX߿B|@>|8Im5? >>T}ΜV?B?ݭBA V?jn ?A?3q>A>fU> a?B&4"A A7?dm7%?-o?u?޾up?Cj^x1 AW}ACC?2 K3/2??HӶ?Ͼ?[ĿAֱA?SNz @h?#?{ξ>K1ا?(dCA A/k?;9?V?#t? dʿcAcA+E@ =s)k@ >z??U4kO?= 1뿂AM@պ@'fV?H=?>)u˾Y7kA@@)'=MIa@G@z?ZU}?c\ >D&>cfA@#?i=x>tG@%A?x.=-?u -Qp< 9n> >v;Ab+@yӲES-=?%??t?NBn}oAk@1@FDHYI6T?z-?p]?Cw>>U澡?'QA\@?ЇJ˺ > {?_K4h?/мv]bNA5 <"q=/z8VB6Y? u>/6?TVQpE?YA/`?BIɿ)աA?p"?a?(ܿ=JA)pUMX|~M? ?$?$"C5A-p{Ebs@3?!4x2zп (%A3 TXؑ>WZ??G<>U#GzI^A7?sQ.)iL:,([?a T>ſg4GwA&?7 >t¾(ѿom>Ub=>F۾-^_?% A3ZV5;s5?[@Z'>X;%MD yF?&~A;>v>оnl>rg,A>6> 3g][Ȟe>ajA׳>" ~=kg?m?wB>|*92A:2u xq= o?3 ڑR}c~@۝QHhѿ; e7?I\?:1X><Ο@%mw&H܎r@žlXoǿU!?er?{Z?v>q==qF弒Αh@`B=PF? \>(̿PL?>}ly~a>ݿdU@*|?"c>>c=??(]> Pվ f3>[C>-@?W}?3~=RI?s?DuJlb<0@˿\>M?1ɪZ>฿/uбKȰ'@kҹ>U]c<Ls->j'>s¿sGh>)>iV >s@z0u?S?1 h-00m?aڅ v>gO> *@D?¿>Ϫ#?vAZ;Uc-@l'5.МrՐY??*1*>j?`@Zݟ:Y=Z=>ˠe>v$>>p)1V]?$@'e"m?{Z 9%>Fǿdi<ӾGU5ww6V5? l@Y\y?տO3AԧtѹL=(=66羿fMO=M8@Xdh@O?:߿c0aaֽV>%FTQ;>{@U8/??8!yZQ=蘾= >z@4?==C|s9pocketsphinx-5prealpha/test/data/tidigits/woman.ak.ooa.mfc0000664000175000017500000001766412771605033021110 00000000000000@A*_]{>r>ǿ"ǝ>^>;ݾ>JKq>S&?@9>eR]`ߐ'???1os[J?q-@ͺm?>w1;??n7>Q>ɾ;)+@ I?8EW ?p@>@Y]y2 ~W@v?= s/ç>r>7 vm>=-νŲ@Y>ܣO˿>i?PDk=Ue?'(> @xve?UYGT! $jq4/N"'6@uN)&?>Ft>s_m? g?6ܑ)?[D>@#]'?4*<|?Z*?7>e0e9?T>PPfY@%pm?1? O?]( >M? =>.Njνf?z$@ E FݾWڿ?/>>;$=ᑎ?eqg=+>?6u??rlAt뾶?>jF_p<5?-T>&0? Qy?gű?S3 ?8=Pwm˿$=ڔ¿ lA?_{>A?l;ςSN@T@ @ =6ʿI€X>"=8<>.+>w?R&?١?0>&w)p<>h?5><5>#4=wc?CGU)? >>Ue>X?!p\2C?;G>ݾvP>e9?rEXg-[=闾Tpv?ڨQQ?xB> *[?U?Sd>u0?, >1r?E?fLn {?=-t˿KI,7R?Q4]=J뿄bDm>ŻP@`q >? $C)$+_ɽ!?X?>@"!u?oZU?Ɉ?Ý:]??>澖b,>ԧ>7>x?q$?[@/R>ھ>"?A>(?M.??BI?P^?D!?\>s= =я>?d>.a>)_BiJ$?#׾?D&?=+?n?' >&?E?:-xVf@0ItmI?-?X?8aÆ>]8>>Q#>? >{@1c]Ў?Ż?5>N>y~>[>9鱿҈??>jA$gF>ld?AX*O?a)_5!}?W "W@f?q=V>s?X&jaFbt?K;>ÞVp?V?BcS>jJ}>0b%>.S1_?z0t( B?"$?5?M>6>C7?0?c A3M(Hݗcp0j@'f?`7?{𽡽?w0Z6#BH'˪?y>#?rfBG(r7ʿ5@=`u=-2~*>[{Bbo `C˞?Zf+PZO1;ӠJ_BuHiyÿ?ڣm~?Ƚ,-YUv>,;6>Q|B|=/)W?mhi@;_;vK:GM@Bu6y^? y? -*HkB@$_Bſ8n ",,t(H?ȽP{ >>HY4B FC-7M҇:?))>$@B CxMBwȿSU(u?*"y1ɾNCB,FJUUE [?E<,;M#[%` BJmXB?l14iftq*sԿ|BE1 }4fK,u?yϿML9ÿj*]p>B!ATQYkk?:a쾧ܟB'ֿWuB=:Ȭ ?h4x^? ă3xB?ݿ\CB# 5Z}?f=>3>yX00 z0Bvн~\]?Gt>o>=8:B\Q=~u d-.?.>>[|6;s׿rB>Hƿ_G>>Cԝ>gS>-SF⾘rB~f齇} dy;>G'`Ͼ4S-B}5>1B{?hpǗWmS/?J8`h?F6]Bz%f&.Z㿲j%?nF,?C onBvO? wqĿ5+?l lP?NCOBof.?zBY ;auh1?UK9[?VB`<@xj#,Ӯ>AKhU@so!5?PBO@n9tAg)&<<@EEj?[˿ׁ1BQu@-C$c*9*bn@@s-u?#*B@ҝ@))3XZ֖@i)3ъ˂?sjMB @.#O2cC0@Y?,?T5A\A @p|Lo-(q@]@@ObӾ-տժA8@`<9cOT@>@?ՎR>c%@$?sCZ&`c?0@N @@|ɽw@Kdd?V];,q ?)@@ @i(G>ͨ;Q%5?+ ?J??Xfף?$7? ?^>)B?k?ʾ7( XۿS >A ^dƩ?ܗrS~>??J1?; vw?c\,A ?^?ֿJYS?ɿI?L6XB|*gt˺r_f.>? T?4:џ?񿂌B}(ؿEȾ 4ᑿ?m?C1?k&NbG?pBy(xY?>ϾC8tֿ? ЊB ;@P#$r?CxG>2=%Bhi?IXBFowZ@PW(S?V?VD,>?O; (B).1ȥ?J%>F5:>?/B˪$Sȕ;)ƒ?j!c>djث̝ÿ@B`۴¿Ck5?d~>;m:ů=>#N(BɿZUTSE??JQ#f>ɯ>R5B]5Kb<vӿ%) >jw>ǿB>jA(?+>?>'c>>P;B/B)o!U*Lg?>iz}*> =»4Bhh+,;=~b?Eʢ>c4F-,>>B5υB.`[d9^ ?II>Կ+yf>k+8IЅB`(O:!?J>u$>WNѿ7B 返ߚj=Eʽ?J7l>Z% ="PdB۳OW!i!D0?$>C(KQ/|BXqŔ1Ͽ?Op? 'j3Ѐ=.p Ї:2BuUDѿV:A#^?Do?*JKaǢ;p) HB㢿 5eLV ?R9?}.@MsBwӿH~I>4?,=gD$H"+M1B׿Hp Pa%#^>[k ?h,>^U`(3KB# oB.K).>?-#>*n*vvB !3sϽO +xB?7?(U }w<6nB}<ץ t~SqG)Ac#w?O_?j?ȾS>vyBy1{>p6fCB.X3?53d?7{S b' >@XgfBv?D/[ Y(5G~ƿ,?AV?^$;>nٲBqz?.AE z|Fj /?7e;>7 Ӿtp?Bl'?&22XID'St2>EÅ e04A>{Bh„?ء&k]pT]bV=f[M48c?;0=BeH@vG9mI쿿>/+y=m?c4rBb @%hg&X%NAſk3!y?Tm"4?OB_V@>K=>N5Tt?2e?dRB\@KKXo.ŶM . ? C}2?bBW{r@H4ǿʹC$T?K?]CBR@ڿw;1,jpC?sۿFw?/af٩jשHr*N)"-?6T$i? 7 B:@ >㚿מxd8B >z!?3둿s>>̿JmB0sAׇ?5ls՝BT64P?ȐϿ:mFM`c[B&WA@鹿G9Lm"p#o?楾jQ$~wBDA$I?vJ?d:a(t1wA?\,V b93ۿusB_SA6?~hg{鼰R ?+cܼ BRAJ@*3?ic% wۿA^AD^@B#?aUq>#7 VgοoA\A p\@ s#)sp>{Cz!ݿ]+AAA a@?Ɵ>>P~e:Ż>cjIAӑ@ӝ?jt?H5VdA @^|?@e^5e/>Ɣe-KH"?GxRAs@g@FC?/?8"1yKG(?!sA@ik@2U>RY?n?yDA??2>"@"ugA|~ p@-6^?Gh@#?)?{2/=na?Ͽ RAwۿo@Vۿ>J?!s?Ƿ6CN?tѿ miAkUc?j(@ +|3?9>q?%F5?8jAaud4@U@nҺ?l=[x?37?Z>APx?Z0?.@?zU6>?T?kd6@ 7N?੻MAI> .?A3 @ @.Ac>;T??p? <}>Gk?zHA6?@??I?#=1??ǿ(ݾ?DA"=_;?9@Y?T =!>֮>X?ƿ6A >R\ @f@>пfHuV?)C?ҿV>3lJ?i #AŒ@K@vĹ@&R?x'՝Կ?r۽J}O?sATL@]@F@v>GQ@?@W'?U?^ ?X!>X>%{@=O>C'H@:r?QYP@mC@d0?ٺ??:w?> W1= Kdk@ř@?^R@e.@HR@>?d.n#д @+J@ux?ِ?}o ?n`?>uJ>?BVn?2N9?Ey?Uҿ@xoz@~@?՟? FDMgm??^>E@/ξ@:=l@{@=V?p>U~??5>94?8/=[A>3@X.¿-@eQ@ M>?} ?Cz<\<>et?;?5yC?T}@|Fy@, @q?)C>Vy??X$>Q,Tgz@7>@%@?Bg>y@"@Du@FR?u"=Sj>3I]p@N=@`Y@#0?- *IR?O?vwo="#H*ĉ>Gw@h ƾ;@[4@\?޾N>M?4?>UA8?|=TV@z=tn@=@ @ =2> =g">Z=.>K>彾@^2|@j[@z?"?E?N/=Rm>Fr?:3&?D? ޾?|lW?c? ?Bn(>MTοo= Q??;)=pX 7@l=r@vS?Ӕ?Cd??HvR}9>>^>>ƿ(@3>Zc@?r̩?c?8>;>]l>?A6P=pocketsphinx-5prealpha/test/data/tidigits/man.ah.63a.mfc0000664000175000017500000001556012771605033020343 00000000000000Az̾>z<@kSU?C>zCԿ g' 4=RA1[R??!GcWPs>+֓?7>rA{?$r>LC8П ob=kg>~@+c>0K>(?+fbMXp/C=>>h>dYN>q>>@Ɩs>1)x?>`P\ݽa>㝿= ?Ŝ?m@GpPbXK? .l9^bbd>At7V>MS>ؿ<=1IV1Ϳ3<=A F%H?=>J?dFBEr fȾG>nU@Ͽ?`>Sxc(f=<;ҐO>?Num>yqAYx=?S),=J>L?꾨 =<1AZny??#SE]D4 ?nkJWZ=|@>Э=L єt>Dr>! ?)v=Z 5@duX:l;. Π^+½2#q>ٽEEm@!>E!<vPÿ)Lッ|$ί<߾@>?"ɛܿv.#&ka%"P=g'7@Hn@$}o_']?4?C󋽕? #:Jv@ɾ[=?hp?`NnhYbg6e?g=dgp>@r CxX@>>D6HoHkby>k=F?t 㾨?@oa@a̾$|>6Pڳ?Hۼ?>֍=p;>G@^rs%@*n;?4ة>>o ,C>3?4?>de?>F@ܿ_?_0g?'2>2>>? >@lCa@>JmU6>E>af>C3?d7 *@7AI@A4?)>^;s:ssW?=IJ?!?@IT4y?> sj%޿s[LK.>7C?V?@n[?.u>d:A@gK>5hؿߑx?ӾۆGZ>.v7Aj&Q:@zRQW9=@}:U>M=:G>Q?*A)@\?E>%T?ɿy@{B}?S= xA6#@%?~ar?ǑoĿ \?*I?AgKZ@X, Whrͽ3>ʢ=ROy?$C/ûAYJv?@J V-8>yHW~$<%U?AluA)>@)]>E>,s~=0?3>Zi?,:}AiBV@dPaľ(G>4d>G==/? AIJ\Xz@Rmɽ/>?Ir1.>Qs?C;Ali]t@5G?,cy>?RV?̽!?HE?L~AuN@NI>LG5t6w׿1Y`Ğ??>l&AM@U'!?'>g> ;?bq?.*?a]?rCAc@Z*?;>Ͽտ~M+??kufiK>PXB @YHeɔe4&=~]" `?0>5An@?!@# ?>J<%q>*|^k%>W> B,ߨ?1?X$?뢪*7,^,<?(;;1?BMZ?K0T#V?ſ  ͷF>"s>?Tǿ8 =-'?9BU]>,c@4q<\#?*ǾTV?G$hI?TBUT-@ {}'L{?Vm]?KQ>\BTRϽݿBS@8{Q3Q8]C?lV^?6(l> >mNBPY>R=0>>=0н!B0SK?ֱ!2@q?)G<@5~C/?_̞2۳B~@4>M@P?0m*:8[@HA?XӾ==&-RB@?{?F%@E?b "@D7m2?T@>H?>PAУ*@Mz@'@ı@7Kf`@,@/'T?1Rqc?JAʱ|?=@:e@\<>W3F@?Hh5?ʺ,??!A[?"@1{r>'5?+>f?BYY>Ұ?706A_:rsmC@2t\?4p>.?NV?C>B AcJ $@ܿ0:OW="n?{;|HVdB wl"}%@U!}n5@Q>]?׳="g2/ݜBN_ ZF@gc=Pc`?F?v ?$ƿv,=йB^^D];g@HS 7z??\=R('?:RAa]">O@"]DU?Įƿ$ "A` BB?nbk@#Ǿ=Em?F<У>P;0>A,eN@2c ?GJ<鼀;?&"?6=ʓ9>A6?J1@"f>_˿?P34?h=M>mA'w%۶@-@ n}>xm4.:N??9(?VS>^RAg@@M)3?̄>A=?,qiA-@r@BO?>(7>Xտ>t>ҜA&<@>ަ@?o?8?y?bd׿ ??K̹Axv@ˆFғ@:<+>?a-d?]Az>h?`Z?t͑AVF@տ=@Ft>L>>?4$٪?N@A[! 7@Y{@ľk?we?e==>Nq87?4SAa;Z@⁚@1CV.?@9?o?U?ESnAN_@3@h AQ>Ѿ{?3?>J?L?*AnM6@9;g?3f&?p=㾛o?t>?B٧?"e7@+1~>Iq?%˿a޻?׾X_b&?.AI@ֳ@*q?/l$?B [?,t?%m>6B ?f?)ȧ@=heg9˾.>>s" Ϳ B%]@΢T@l^=߁gzg;7JKv>r>>3K/B+#@;S@b!>Ϳ)!NLT?M^K?B0OAn@?>[JGm0iZ־9?m18?o|B6Ҷ@YR@-Y>3"?:pB::]@T.?@?ɡ ~>I=呿?,ٿiB<@/@)5??XJ47>F?6)lr?}B>e>@u@;}?@_ȿYm?C[?¾{g(?vB>@@m??Ύ]qb?ہ>?p(OB?c@p0@6? ^:Bz?>LK#?PB@j|@)V!@>jr .tl?k3>nH?qv="pB<@/RZ ^@b) gFQ?=%P?lW>C B>.n?v@[ y?ozi0s?8=aUB??*֢@;RO&?aS, %7?=rEB=?>4 @.i;=?QS.=\?徚8>B5s?1?gR@ֿeyŻ> \ ?~;>ϺB,\>_?@ Z)BV?U#޿b?nx ]?{B'Q>լ? @@fa?鰿a?v6*_M>`"uB%Y?;ʎ@ o@H_oA#?76Џ?ctm2M>ċB@@!r@uK_ss>ߤ?DS"?#e>2!BZ@Yy=@9@d;= ?Uf?UR1>a\A4@˲k?@WZ=?ЊBH=8?i,v?NvAV.@Z@'@^lX>P?3>??yuk?A,e@*@@Y: Rh?}5_>H?qc>R6A{f@w@@j%:?3^?x*?> AK@@|@t┨v>=޽ն7? #A`AY[S@ߦ@kʻ@M -￀#>V*23?un*JAE>BܿI<>.N?<6A'4?e?8`?-=jʔ!c?yd=By> @)gྙOlA'I?N?ZzgʽXͿP">x9>q>-yA /?p?ٽ'>??^?P( &|䁿.ITdsS1A$-?޼?}b%=PzҿWĘ5yY'R=\`A'?@8}ھ6j rcpSԿ;he<[A'X>P>s-?㏿Ed?)>:8B> i>+@¿w0?&1=rqIʾ?,??O?/K>,d>ɐ@W><˧?@>1 ؿ?%Q?Br}>6?Y>l@!laq?@?δ?ג>]0ӋAᅾ?L>l_y@RWE^??:a?Yي>>j°" ?#m>`>L?VtMsVv9= ?;?C>|}@Z3A@.k? <{s/U.!>2V``@l>F7?ّ?~>X׿'?"I0(ؾ,<> "@ѿ@?&? eB.>>>uy^>տνԤ'@ S@/cH? FCa?c*?&>>5C?4@ʻ%@P=2>'Ŀ=qx=>]>/mȽ$:5>@!?βP= ZX16>2w>{L>n?@-ͿqQT@>Z? a{aG?R<>;z=4?7% ?F@'R??o?DP%C>ȶw¾0>CPT3@ƕ&<"?M;59?je,ڿ#]Mi=D>%>{,(_oY@D Q2?ڬ?~3kܑTL[&?2>2(>>>@H~9>>ֹNhȿi-@$>YUG*E&y{>@ >L? ç=>B܈bMd!v>? 7@w\?߃>>>3 @i\T0S?+=z@ꓻ?؁!iJҩ׾W_1y9@پUUv^>դ>n> ~09@@\@Z'^^?}=` U`?$<?>5\ @TL@d?v/;>g?a侪# >y@a(??&i?OZ?9Im_4?Rr=rљK>pocketsphinx-5prealpha/test/data/tidigits/woman.ak.o69a.mfc0000664000175000017500000003062412771605033021077 00000000000000 d=o=H|X>Ȱqn>? >q>Q>=> 6>"72O x)>˹sf?2?;? H?9?%I?(x4r?Y)?>ٻ]?t?E?*>?^:; ֮?Fi?ޅtQ>>A>Ջ?M>?=?S2 AAn ?'Ù*>ۍ?oO?q?H=<?B>~? KKY>܃>( Ѩ?Y>?@z>>`U>YfH?{>ۑiG>K=:l??_x?8}>}@# ӈ?D??^)!H?9{?%#?#>,>YK?Hn@GD}j$?S}??g迏~? X?8ڡ>9S>8M?c>Xk?vn?>?MT>H>?@A\?.?sr1?(н) TS>oJ=a46~>]?s> _?l`W=E>\!㽍%Ib R>lGh?8->aA>4>$Tn?aNӃ^j>ξϼ>t=5B>JV?[5N3>g#2?Ψ?+?q5=V>>y/>l?k=4?>W?-k?Jp M?;Ox >.|s%8Z>x ??h_C>v? >?;ľtֿ>O=,l>oy=a>UQJ?.5=Di =Ɯ>?>=FA>U ?M?S?z>Y$>Ű?)>%n}V>RD?T+ek?cJ?54O_'k~>?n!?fi>nn>L?:N;?'-?4 ?=V=m?1?w`>x?>r?c98K$?s9_h?.?ƻ?JFDS?K?<[2>d? 褾&-Qh?R!??#5 )C!7?>癫?]Xv?:6pl?,lK>>[/9Rf>ʛ?2>7N66 ?wV>r?fg>S*?$:>h?D/$ 4VA )u㿒Awd?m=>M$A )w6k]替0Ab>UվƝޫ? =֖@ 犿?b?3 atW ?+7>_:o?#Q= UPؚ?C7˗?Y=U!N>숺=ju?0 ?`kT?e?$>ԟ=̗ ?&61==#?T#>}+?>;,?2?ÙAS%#vYN.zY7N=?`>ؕ>K>A?ss?#??z&2_o*?t?d=>;P= ?}q*?Q?,|?6-{>=? ,&6ٿ+X. @6??*?#X6?<?Aev>}U? oY@ ?n?2Ra<*=>ɵ>fW0E? =2@Rq?e?+|?q?2\?\.ҿ.?кik`@ ?C?۽ܘĿ_?6???#Wᄈ>>?N?畾76?c=M(+c?C?H¾`=dq~TO?*Ŀ>+oվe>R=<*?5/<>A?I70S?h>T!>c4>?L9&?]?ϋ>@7fhs>)?b>Z?!Sx>&?w}\??!@_`<R#d?=*?ێ?5#mZy>>C>3}^@WM@">>$0B)?l> >߾m6HlA!sd@y0?ل(^Z+>IdR[Y91GJɂACH*$@P&տͻ?PF ?1X?dy!?K l @J?˾׿vS???=³侜4?Y^@ P@ǿ;RW?oݝ?`>۾ƐE>0>BϽ)A!}F=P@o?ǿg?[<@,U}?%ٿ5>?>V@Ǧ5?#;my+G? U>r?rX?¾O?z=#@VP??eqmD??-=ԓ>P?O.>Yu?s[t >Zy<<)ݿ7z;'?wl>>-iAs>?S} ?\bk2Ӿ0?+ƾj?!?w>yR:L>7@֏\ۄF%@k a>R@]$>HD?q>$>k)[@Ka @ms^>K7>?^9?$>?\=BU>-7{<@&e c=\;Bm\8 $?L>>ײ?@b<?=2KOAo_w<U>P\ 5?Q@mJ}+?Rӿ"R%f=u$FPAi.>NA$ȿܒ>?%d@AV@P{$ >@1idp9*_l ?Ae@F@=c|? y72?c?Y>=?9?c>ŵ>Ca?RN?߲3 m?1>*^?&?7W>a?b?L.?A?/>^#>N@?\~>:g>c @*w?½Ƨ#?Pgi>>0>زQ?>?&Me?^]>Tྊ^@TPE?K]?T?L2?Q?(;>b~A"{dM@P@~?+?&6=B='v=2>2>Ǩ>kB"*ſd,aֿ@=;Vd7[>ݿwUB,tv7!s2\@=+ >3>]>>*6BlI][6a*D;| ?<@GЉn>Yq3BoG?AekRY3?ut(.=Իk]BѿpƿxG??mj0;ƾbBDe=IXj GwX?ې"{FZ+B>Y }}8oj'?bOoD^[:B?ZKգbͿց?XWԿXĿ\ZBr?yHElXj ?`)5"F&;}9οv*B?J⃿!i}T#? $: L07Z@B#B@%3oҿ̊?>-( _DaO+W<;BX@]n/ m[M?u?%e]h R޿vB@Ffς0ޤ+<?D=h^H xyf8Bܭ@Li!4/phPe?ӊ>f߽k],'yo9ċMB0@wӫk8P?q颾9<)Gſu#BR?{ zU}W7?+[,[ο4WBi? [DUweh?-={|<H&q(B>WKKQ2`?UR=ܪ>g6kB}fӗnmS\O=gq龝LDh=ЯBaKn_1HJ~X>l3=7; ?/BJzkRȿ KoZ[-ډ9οqlم>,ϘBpkF$8E<e Chҿ.]翎:=˵?5|Bz0[?'& Bx|p?U?+x?ئ TsQblÿc?GB?3d̐Br??a4BZd>݂+Bl>?KTE?+,u1–m+I=b,ƿ Bi@?.*J?V2[]!ƿlh运q`Bb?kH5?gRj=yuƂznvWB[?>ga?Og@8V8)TRBI@D?><P}$P e)Aؿ}D]B7x@$8@%h>ϝ8~NDÿɤtؿ8 B*@\?(8\N=˟uȿKz_( 7쿌BB@>W@{NT>B@6G庿DqB y?㌦?m>hAoQT78.T?*|qeB  ?ww?C?F=0`d'? AzԾ!z? >]=6B Q >F>Ѿ?v?LKk=gO=:Z6%fB \W;8">ؿe|=?G|1?P;>%?{ݾ>B #"Q1Ýg<>\>>f?, 5$?)B#??X(M|??m> .P2A2 ? JB:0?]>%64>` yQ ?WY?lg ?# B >B-??8T5+?k ,?5۾>O#>46G?= BS=?3? A?LW=^Nξ ؿy?B <O??*a=旽٩N>Фɾc)1ew >.B4?[=6>pITS}A*򃿍l>5Bq @;?dL?'q 0 2 (LkGq M˿BDBEj@sn>s?gȿFYH;<[ T(<??pkSB|@R2' /vA_Ԥ+?_ sT?h2B/Bпx@PapGQ<,ȿ014K3w=BW>=دjڿ9`3e&ſ1Ôh2EABi ;^}{g𿩑4迵þ/b#Bo-t>Һ=Rhp`Mk?#0h;҆ FIBq=4]>t5ȤS4u=W>{LT˿| BgɝX >R?DrH> vm>F?}λjN>;) q>fǾ Ql>m羌`BO3:0?L]?]2=-g.>.>WO-BMp3A??pt=1iY>> <>ĥ?=o/}B6,@8-@8kvfV?c? B>n?S>տ"B;$?ǖa@yG@X(tPLf>=3oh5Jn !:Ai`@@ @$2BNՋ . C+)A@e@q@ gE?QC5ϻѿ  :>@y@4V@ ?r@Fg_' ϋ6Sԝl@?r@t7?Z?hu,@J쿰!k}羡D,l aR@@^ >2>Tl7_&˿ԽТ= tzV>A?w@f=@2> J???W}?_:=B#NIu@%@T? \)޸?>Q|tsΦB @=u?|ӿ7=?O?Ѥ >Nh"|B&m(@XT>?(?)>g?']=wӿ\(Bn*s2@ ,?̿;?=?Iѿ~#V~? &? EP>klB  Q~? > |?gE?G6Ps?J BjP? 2@?d=>?UW?5M>B\?CV/ڿ:>?poSD=y#V?[]#B{V> p{6@? )锉Hq?3g7sAn#7 +Im&x'g?0?BMw˾* >ؾa?A`%#0?p8=݁\??T>Ű bsAS?>r>rT%_?GDI>>b>Iyp,쾒B*fP9q@a@mbԿ0>#+<Ӯ?M 4BjC@@@@Ac_竿f >N]t:,?C|0A/uRx(?%?m0Ҹp?'^"L?+} Ah?@ӿD1@VNf@Z{B>s>sӿB Ab@C{@stE2`NFF}>@.ҞO5B4AG@U$@n"$?ZFwvt]B+@ۇ&?̅i@=X^YSBp?u'f_R>6ͿETB6@?) G@sU_̢= eY9:>0(JB8@ */@c^LR/XcT]l?TÎBHrI?96K7BQ~@\a?~?嫿"&QgqEʾƹ}Bl[?`JՖCa.*3>%.$y|4Br?&DͿ%Ue,?:=ο`#50eΕ忎̴Brm?CE2z)?#"ۿ nkwYoBv?g iFRDy:.$n2QT`ǾYWBqq?ѿ2f55t( dxOFд2Br,?qݿi>L醿*2%X/  Br?6 D>I=/ /!!*=NruBq?P׮>#>%x[7ֿO#p$6%-|BqW?%9?*>)2Ġͥ=GBp=?T w?F=l׿ʣ[$lޒ 0l?Ѿj Bo7t?8.:?l>-ӿoS彿:2۾C(BnOfQ>J$"pcjP BoH?Lnذ?>*ڿ=nͩ Q7v_SBn? $&{?>>HP9]F. 'Bo(?Dܪ? >׿8Ͽ}'OL"9Bl3?}*J>>տptɠ,ItUna_Bn`?),FJ>ˤghͿNl ڷǿ/ZS #JCBmj?o0{N\y><[6<$ο[pE7O2BoI? O2|?wɾRۿT"\ĿP C|gM7~HT>C{>^`\WFq틾 iBsi>ߦ>_HzJBx>|*"_þ%WOBrX82; ;93xGS6T :NBr̾mk!&;,{%+пi6f$Btl0ҽz#AQҿW>ԩ:HaO*Bsqo!Ӂ?`F^? c<"딿ѿ;kBpٿF?zm+Tڃ?\5?@N|*+׿Bmo);?nI11?K8*vqGP542Bigs??1J=iqs?g3߿0~‡>S(Bb[{?#\.?e_tD?"e?埿@L<)޿C`?QsB_a?)kŒ{mr=:/?{:1LϦ2ѿNB[??*@&j#>? ޤl c ɧ\žQBU~?7\ f>,s>->ZPǿ:<y_mBS(@Z<Y=CͽL(י:N@BR?ɻQO P{>꽾h'F)~|%BK@O=2u>b~# Ͽ3˿8 驿tF`pBF@]@?Oz!t="Baԑۿ"P%%1B:@~::b@Y7,Bt槾ӳh'1ylB.@,@j9&[GTl L>> B,dX@?F7@)KJGIj I7| ^B @0?@l(A#F [M(FAxB@Y@hI@R _,v! o98CB h@T:@k@0G_U6DFɿSKP7/B F@@Jp@ӆ19d!l$NI;l}qy$B Z@?d@?l;xo5{An AuB@?G@iqUӿBkIS|93A9AH@X@/ @ UǾͿjH)uUyB! =byA+@6q @o@n뾈XK3D0A?Z@q@B*H#ᮿ.jum_#A Os_J@`!@!#Sž 1 %BuW4ՒI>MjAfi}@[@fz. }щ{(G~RQ>Z"A F?Q@>I.R,\Y*?I8Az.?$A@`s?譋?ھ"R$%Ϳ?u&@9/tA53I>@Va> >x=տfѿG۞?@,? AyH]-@ Hz?2M^E O?R@"A7D[?8@?fؿU>W0 >@f`A0~<@$@aX?X?R!_?(D?QӿLA=@dƘZ>@&AagN?@C m+ʿjZs@" HAOs_@+ dr̹]PM0?ΰ>.IAA#e?@=`?{ 衯],>v!ӻmլ?c)iA+wg@1m>2&x?́˿.Ͽ(?p?Ͼ8A> @H?-4[v ݗ?߽ۥf?@#dAfh`?@ >ɂ)PϿ_0zw>x?f]@>?(@jf>"䤿<,ӿ#п!~4q?ǿ2y@ 1!@ (T@> ="q?濎y#Ť?0jMn@"VCv@y$@?,?+uhԿ壾˿vͿ^(L?33@YFɿ@'ZV@&э?T #>[> =h>n@u}=Q@~xb@aL@0n?>A=>?k[]t= [5@g~@H?̅?K?.^>˾ /S?N~>>?*>@/NV@7??ˣ>B?rr?iEMOk?^>>󐾥fI?},@@c?d??UJr=>βX<>|$J?/C;@Fe@*V?׸?d@ o?]-W*O]>3S6O?]?p? ==?NW=[?q>^?|ꧽ!@%^UR@AɎ??mJ?p?3߲=Ѻ>A?hZ?T?@HBۣ@:q?(>b>>4?Y>5>?X?G@al󿫙?>z2I$ӌ܉?%s?4@@8&7?w:?M߉? ?>_[?= >KA?lƾ>d@8liVD@]y>_hH?r[s>hd?;^2?8图2?cm@?Z?HrԾ_= K>e?V?&9?m~>Am?ld{p?З? ,?޾>Я>>?"-?H>~N>h?e8?U/z?@?^P=Š >Ճ? Y?W??=j:}ýI?}*>??^}@??:P?9>0%;= sFst%)?Df@o&?(_=*,3r, >am?7¾PL?N>jpocketsphinx-5prealpha/test/data/tidigits/man.ah.1b.mfc0000664000175000017500000001431412771605033020250 000000000000002@xHr>/6>bBL> y澦>>=Μ?Y69@G?@Z0.>৿ݿ ?Ge?e?WJ>>>C@tJE$>:=YRW%!l %>nxW>?z>;=~5 @ n?>p 8Y̿K|>w>s?cMV>>O@ k?ǒD>}V->Ix:g>??!+>w!@D5?U %{=c6?<>=r?"@n\gUO>߿O=FO ?0>|?/@"wνyE+pR\3lk[>p?">~_yc?*@%?>Rl>KZZ=>BkE@wCԿS?Ao$`GXԪ>@>5G?8>ݾ&@D~[>{?a2)1nGrE>6?1ҽ>G8|>@,/704@A;? L"w=;ژ?Ë>j%O>?/?4@*8? Z$A>>+=U/3E?<%?:?SH\>q?ep.@`r]?WO3޾+>u.q>:Ն?kt?\>N>y@U|]?@Ծ%nK>x>?-#>>(=/@\=sn??C>A>;Gɶ?9>ƘD>*?}@h6"8"?#s?Ͽ=X>L3?QJ??ED>8@|%>/=>/$>=*C=n>:>0? N@iF&?$,m>ll>ͨ?ie>=b6s]=L5?g@`F>#&2>cA;>&=>_ 5$=.T?/@ c{[?X?7IVn>nYT?p>"f>H?5>k@9IX;a?2Ŕ?0JF>y}:Rm>Gm<ӾG?J@bi@E?i_?Fҿ{=>tJ?Y#>oi=͘WO @JV+\ @10?n ? ` 6?3>ҕA D<1|><@ܫV@?Գ@ _>Y???P۾>]]!{zEa@/@@Ae@.@?? ľZR8ռ{ݾOAxA@vc?[=:=RF.zw d`=>LAA#`@8e/iO{P {?J?>4V>ViAmA1@A˾J Կź'9"֑dArA%r@p?sU޿4ZP#/IeIU>yABvA7,c@/۬o龋Y?qh%>?˾iGB (A@ H@6,kJsٽp?G1?QDB=A%i=@vC=Ėq6i?cZ q>f~?^ݾ.hB/ Aj@˚ag˾7r:>?,ܹ?nǾi BbA}@A#9G0+$r?J?*EWf/|?Rw= B c)@@6dE?>W?AS?L&I&<>cg= BAW@yL6?z>Ԡ>w?bcOR?W@Z6B$AT@6?Rf??|KRWW>߿5BvAV@SV\)o?OB:??P-s>>7߿B$A`@2X2>wa??@?JYWP>)>%B%`]Ax@ Yhex?hC?z? 5sjZ?I (^B.ǹ@@ Zqh;@o>U? N6&?j9Y B-N:@?]3@!u@ qu?Ls? MG?`|l@B2\@а@.I?(>?þn~?L-w˞B9f4@?Ry ">͞C>?T?Zb"ēB8,3@F?ϷK>Lxr׾&D?jB8?8>yh-KB6e@̻?g XZ0k!-?Fj?\B86B;-@m?\$c!eĢ> ?W?_j̽8iZB2N@>+/?63Na'TW?,e? {?I0@`B3@4e2?f>?'"=M]u?f=Ϳ!SB/@fX?SPW8'>Ͷ>?G췿r(KB+@ G>%¾q>w%BB@>ɔc@jZ?WϿ2O=> ??׾ǿ8>)BP@ ?O@Y?*쿁MB'?>+e>$QxX>0B@"?E@w>(h>F>bdEM>B>@iވ?U@H4?$qxZ>=a/?!J>HϽǫ7v>YB@D@@F]K?"l?s?K̑># c==B K@@-?^@t?h\K'Qn?>o=_<>+B@x]?վ @l?ڐ*9/Խ?3xb>?!V=۴>2A@V?H@l?R90?\>:@{u[&Ar@n@7@KQ\?SF(?>hҖ9>oAp@FE@]U@/w? }X jM?n>#Կ?dy>bHA!Y@@^J@6d?%72;$?x>ye?d]8TAuA @@O?W ^ p!?h>`hAųA@@a=?^ɽQ?V\ʈ>&oA&A'@ʱ@H@ 2=l?T!_?A,޽B ASb@r@ҷ@9.@6?\B!?c?=@n5!AC@a@@߹@.O@>b>$8?(vK>=?A? @f@@5<7>>՚?O? ƿB[wA M= m@dIF@Fap@*?0??F?wn:@3X??B@?q?w?*R?ollM= >@Z?I@:aO@'VE>CԿŐ>>In>S@9b>?J?J?ce?h>,P꓾p62@1.n?6? ]x <Ͷ? >a]x>P\@nM!=*?4I>sF?}?ӂ>]?D?$/W@lr?*s?N>,疿\þPJ>L>A>H Y=*>A`@!%b>Y?Hnl{'3W|J=bVu@q1?1?b?)ؔ?\[?e>O"6@_ >b1=8# >_d?0'= >J>Xses@ҿ@M?KH$?08>@8>ݿ5>*㳾@% =?z>?_G,><,?qu0+оj>H?6@~nC?..~?`?ھoAxi?m{l?93Aӓ 4&#@ K>Q@ ˈQ3?8c?XyW? @۾>|t@⬿lt?J-俼>>M?% RkiǾFä?c_A Ҿ⿞6>ǹ?Tc>u? ?ǿ?xBW?lѾrkF>? sgn ?@ǿ@b\?G?? ¿*?p?ǿ7Ŧ"C(~?}@"?d>'?6ݿl?5?l_M>?*> @ʰf??@Կ?[>1?6#0?&R ">>?=N+@~MGN?8&R?1%?]mޣ"?U>F@hPH?U\g.jͿXQ?>>FbG%=P ?@#CsD? *=O~ǿ >?rP=>i84?>H]@!K?%(j>̘ =>?T?.ĻҌnO>> ?^z?ō˿[? A!R?y>T y))>cp@XC/?h>0>,RRV0? ?=9C?Y>>->7@7>?M-ۼ03yd>>ݾ8>=H>@E)??K/>7Oe?f?>s <6&=vډS@)?uNMAϿW>=-2 78:16>$Ƚ@3fj)?Ӯf\|H>ƃ=Կ ??r?vԽ"=@u]\ >fcؾ},Xd<>?A?UG>0?[@5IyE@:?{D?*SZad(>Ò>KQ> ȾS>OD@|F?O U>$m& DKROO>ѿx6}g@Oe?"8=i>3:?(??Z^=2/> ƾokl@4u>>S}%TB?;>tJ?W?$,?֠>;1>Ԩ>( c!ݼZ>>=`5O>@b8+ٽ ?T>> [@tb*?m?4y>"_?ǾVx˾Ts@UKk0?`E/_xaݥ[">:>6C?7@ : G?¯=u%p5=tԾ`*=~?m;>QT@v]$Av/>gR>e??!ȿ\t|:=>ܹ?_(_@}WP?,gő=N>rY?c\^Rx>@6KHq+?QIfXgOɁUH?7þ}.8l@:_b;>+?'qyz]A.Ž6<?=G;>"j@eb> >E>B> 4GPߖT?VE??0?@9>3@'(:4|?;=ƕĠ$>-4\?7'TO?y|3`ne>J-@idRu?Rz$Y5TA? .?=V @'M@3Qn ??vп?B,%=c>yQ??E9?t8?Q'(>(dN@| 4!?+>3?>=$>?Ԟ?l?> %?%>upocketsphinx-5prealpha/test/data/tidigits/man.ah.4625a.mfc0000664000175000017500000002542412771605033020513 00000000000000 @H?Ew?}\>R;?Xp?!@GPQ~?lUоYр? UP?S?Pb1?$C<D|@h ?Ѫ~8B>??8>×>X?XY@~h]?NͿ^׽!;$?Dm=*0?=}?M>C`>aC@X=Vp?>>Dx>?Zr>?/?+"~?K@V*?.m>#5>|?`8?BT^?{@G?}>>?y?:?EJ?~?*k?lǽ@Lc>ʨ?joe >? 1? @;?Zvx>`?*@/G f???h5$:$$???X9%%Խh@xU6?:sl:, {>>=.>ۿ΄?0S@bs?Uo>!пZZ>?[ž>e`?@3ؽ)?@p?jrt5.W>ʉᾜ8? =a#?~>9,;>>@9=S? 9>>eΝ?+ֳ>?VTz>8O@V ? O>ͱaB>羻fHyk?2>^=ee@%vh?=ꇷ.+qC='c>v7F?L'=<>@V̸>(>r*I?=>s>g?=_@vr9>?]ai>)=h;Ϫ?_+E?L>KJ@M?>տtB>O>yQ(?W~?->в=*@!v-bAނ_=?5H¶?V?C>h?W>&@V^X+=h?!OO}?}U>t[>5?wؽS?I@v ? l#n?>̈́s?U#?R?@UmSy;?`Y̿?=FX@Vߥ M? 4@e?F_@s?D+{e>&@72_8?z?/e;Þ>¡@LJ!L?lr?"?zJ?4qQ?L?Qѽ?pS@30ӾW>Dv?9u?8>Fj?U{??^>?' @G>XF?']?s[O?1?4}>*d?SŹ?x>xYHbA&oc?:G:"rE<>x~\5J=w0Ģ>Afw4I?F쐲 ӿ1N%j4>)}4> ɳ?0?nA3t|u>vֽ#$qOf>lQ>>_XᾷS<>>vA{пmnHEٿE޾ZHĎ28]ZAڤfM=;τ*`^X+;PR>A}Zk:t6?*?;#>;%ҾŐ>I&mX&%b>Y.6AG)Y6I?5{>//I=Jp>lAiƒGz5"4>F;o>F?p9=6?{Aá?q7Δba>m>O PUJ??Hͭ?iȿ~A@܏@6*1>?i??? i>s>ჿu BqA$@2A>>U?S>&9վ5x==yS5B,A?A9 @-?-{? yX=܂= >ю>чB9fv@?\As׿b?v?H濙=f<=Y=>C? XB:@?mXϱVDd=+?\>㿜>@>b+=5T?LB=&@?s{%v?C>ٝg]F>*>e>FB>@{,?Ʋ& ?{Qj?2mQ2?ހ>\>NBAه@?feSSA%?c?tf?i@>>BE;@?,JWh%?&/?q¨;?c>u<ƥBFL@?3NHcpO>go?ßҿ%?#x?ྂ BH~@ѶjYY *?Ӵۆϝ@?" BJ_,@śڿx1fS tῴJ?,噿;@?}BHq@; [ZtY?[)?>&?a@z?^ZBED@ܲ˿Ak7wg5?NUbg?ЎbE?ؽ?BEC@r?<iW?:k?i| z?@88' ??PtBD@ߛB<7s?}?+9S?+d>|B?? BWBE-@VN-o@|t?a ~>(?jտ,?nI%B1@@ٵb-2:@` ?]C>ç?VҾy#^3?ENܿ#YBw@O"%6@7#@(lB=t?ޅf=J位)?*Bw0@46@k*p߿??r6{G>5Bd@@'|Fµ?ˍ(?)>v>LqmYTBe(6@H' >۴->`P?]?#P˾'2v`B0^Dxc@x'}p9]>9u?+>9 P8>ԟBgN?H@q#a<῍?~X?3E;[JP??]B@hJ@l Obw?=þ?XCɿ>[@RͿض>T1S>s0O"?h.B7@@n=ʐ>@Ž?->:(^ U?0a|B h=@f@ ?![Ͽ~?n=Jy, r>?!W>5B~r[@E@=,3?׿3>)>{=?k?jBm@w?2:e\>T5>ýQPd?lW?ZAӐ@f@*׿ME?*d>T@pI?>(2>FL?rB/V@!>@ ?Ζ?+Ϳľ/ ?]o>ǥ >BJG??u ?qi>Lx꾌N@>6?c?7ABV'>>>?e?sƑ-%=@ҿRV?J?^BYܽ־Ϛ?eEY1> =@G&?(?41BY-:8)!?/cp`OUb3??--?y??FTBX䭿GeɿZ?glH?ƣm?6nl>a?SBVSZAx!@5ȿPJ8J@*#?w >D[>,BN9]`bKٸ@F *G@Pjܿߋ>/ Jn?>LB8? mU@R>{<-@epGF1==j6>%Bz^?>l@?\@s[^V*?կ? oAC@QM@ @?†D}#@^X׽d+? a=A9u/@T@k0A@m.a?虾C> ?q]~>ٖ<;JA1Rx@m??m? 7@T4>:?D?>+@ A5?Gk?ʿ Ϳ?78?#?Л?eu?>@CUv?8?sD>_a@?L~<1?: ?p?oATS@>7 ?P>_d,@j>؏?ң?HA:_??S ?Ӿ/w>!12>>AmAgn{[mXU?W>Mo96u&?c>F=w < >A>PBHD?>#m@}c@??ƿ?"?B 8R?l@4C?~I,#@R?쾥̛>?=q>@}BvL]@7t?֓!]kKnA}J]H@iTv@AG>><~?;a>>>a>U>eAynSH@@*?z">UM!?>uyxo,ۗ?g<\)KBA^?uC@l>>7?61?؛%NO>1d?VCA/C;k@ ?>1?C?u C`  A;}6U*@s>vĿH?eX?OCտ#Y?>W MN$Ao*M@l>+?e9@'l-=>2?c=+A恡F@׾reQ/? X=?k3Y2w4EYU/@+$>4> MJ?j{sA@ /?*İoUɿ?Kꚿ>%>00AI?@>oB(&?[cБeDR@?Ba?@ @pk?=((Lc=]vDL?) BFK=? @sB?È&>2A\=cBP 2*?@T濵<' d?@ ;>FɝZ>ӊ>^BK̿d?Z@Xm1r*?#d=f}|>uZ>#BHlw?ˊ@4ۍ!_?m%R0 >> DBD(A6?u@ʈſ?fW&Յ<õ住>N>B?VAd@@Z-2Dk?_:>@>?AB:?,=W?@*\5 ?j'>/>?FB5?`?\@eJRmOn ?^?.=8mǾ?HB/#@m5@ @ڇHkr>&b ?MѾDڿJ?QB$@.C@"P*@i^4>)dYB@}@fJ@b̾+ >Nrġ/!;l@lU>Gܿwx>+A \@@-@? >`03NC?8p?)S<>iA.@ @N@^@!Ne-M>"k4 :Aχ0?K@9ґ?&?E-?S?1G$| ʿ[夾GA^jg?yY?5#v>.[A?q m{vhK)5A˓׫`?m@9>=Փw?sT^?NC@`@^.bAҜǢv>: So lc}9?"ƻ%>ׯ?7HR#Ao^ 'b뿹mmU{)B;.ɗZs˿j>7>I?20A?tœAi d1>[=?z→RMK]Q1?D?'otu=Ar$Kک?E?ꇿR<%+;?{@>'?5A˿6(?ֿekBԗ?6_?QU>{Y0A???>`?fK?A@@T|VY-Bu@?@# ?)4t>Wl׾KW?x[ȾGBU8@N{D@=?a5>m޾;?}?A3aHBZ?@I/[?/ ?2=F??R3B](?sR1C?dcAj?s^>+4?ђ ?)*EBa?W$#H?"(?>>l ?#?"y [1BcK?cY770[?(?9=?Jk?G˾; Bb9*?ZYL<40@?(?p=?\6>6 Ba?9P8?rn?=a?M<g=,B`?G-WX/3G?Ӻf?ԏT?V)B`E?R [g.ݿ.?Gh͔ ?ֽ@?9.ܽuL>y_B_܈?U Z'.Հ?IK?,м?CP>(;B^9?Zfs!ʯ?zP)?xw?T:]>"=B^?fB^9?;'_K(mCw?[t̵R?>^??SP>t?B^dk?AG-og8?пؗ?>.?PmTb>ùB^4?(ϮqJͿ".?zտ^4?'>Ux?UcJȥ>B^)>babڿJ?=?38>?7P>&B[P?{oa;\Dq?%hC ?JG? 3?1ÿ$ {>iBYQ?)Kĩ-n>?ʧl?E>;*lPC>gBV?zI6 4->7y $[?1)?c<>'Af>qBT3M?l-@anDqG>!BPe~?uY.ѿLD@?u>Rp"0#n>~BO?8V=qZ? ?&> d5d>),BH@jY⼿*$Sa@4?uD>K_?0BDH@m2MZؿ׸\"(@?/? Y_F>ǩBC7A@xCoE}"???ZOz 0g>{B=@VͰ,/N?s??Vf&޿>mB7_@cИGIDPFE2?hg??z9Hœxb>B/f@ J¾b afG>.? ?6I?Ǽ+,9? B!o @d?^+R&>lk1C By?>?F? _SI?A\BC@P@ fD>>Ϳ@чCH?#R?L}?1 }>AC@@@@[>ֿ^rGuշ")?l.!]AxFnA 1@֕@L*>AOǿZ>?3?IʿAPa@ۗ@߈@j_? پ!GRG>5>>>pZPAP1@[ @~HC@H?a%>+,?*5ȻMs>}j={%A~>>@?8?>#z?N>(^9 +A?FAA=~=g>??߿=vc#?A] т>Yk>(R9z|=UA=)? A$E꿨#?r,-qJio-?~.=1 ??(F|X!Jy@<01?.AbdCxq>]?%Qǽ٬q?7>Ϫ̋|`AՄ]Z?7vA(&'>&A+px6?(X?m: ϶l?6<A>`Ao>It=f!==R$?D'=\=)wA!>C?IZ<9): <>CqJ2F?96Af(nboVFտ9Z#>:ŧ>(.=jAf< ?[>_gD.X?'f?%qRG7/>N=\Ge b?AAF>nW? +_s$B>l>L셼{A1ƸC9p@;J?Q?bq)bV=4乿0 g>_VAF@?3N^>*9<ؿZ`jש`]AR~? G>??ܬ>|n ΚAAN=n޿4"L+>b)0J!.տ=Rzj=p3AN8k¿..??V?8I,ѽҘ 3E,3>7AG?.3Vo?ް`~?{;l?-ÿOWG>ܽ7A?g?dx'?8>? = ?{P .AH?q=IT*]]>D?jz?tdOr>4> R=ftA;i ?3^=jV>*?ڿsпpѤt%fA=O?8о/>ә&4b?%Ŀqf}4K>A Y>'?&>>/?j;?J=zX?`ܷ&hA-&d>@fp>$>T?iH>hG;Nܷ?qp\EAT>>Pgɷ?sk=>D?y ^-`5p=Tp>HA T>0W>Z7l?LGV>=7ȾHgvE ? >fhA -_rk&9оP=A/@=趦:MUU>k|<>>A[`6>R?j>x>>|S67<Ѿ/=X"/@x ?H{ {rF [7־ԿsD8A(6%X?>5"dv?A,>SP@v@햺ؘ?fѾB%g㾥g?s?P=.yx}c >+2@:%?WXU>-e?bƹ?%>g?Vq>-@sGR?a?F!?*?bu 5N>S̿\m*?0@s ??}?k޾mP=+,4=ZE?%@?~??i=k=>?!!pO? @hgD>n>5sj?`![RO7k>R>?:e4{?$+@-zwM˿,kxAgZŽ5>g`ԽJ?&@:''>?.??=1!P+fwp?'?@>P;z@h?Zxu?'L ?{;?>>飬=@YhkT?k ua>/>d$mL u=.??1h?FD@Yؿ?s\/&=߫>cn> >; wyp?8?7>x(>d?>ނ@^P"?)d>h&~mS>ˋ[=?o?Yk>(>Npocketsphinx-5prealpha/test/data/tidigits/man.ah.zb.mfc0000664000175000017500000001573012771605033020364 00000000000000@L_ > =hsEL@>ꯘ?.#='\{>T{>H>QKV@1jfi?^iU>r_a?5>5?3F_?G~==&?bB@)FB?`D3S%ѿ!??V>s>K?T>—>Œ@SrTq=\?$?E>6ikՇb`?\ ? }?p>u;H@gUX=2!T97qc27?e9iF>y>N˄@C۪y>);7Ŀ=?Cž>{H?=Pb \=@N8!?\??? ݵ>@fш?;ֿGCKwP_<3G6>cX???1>@1ց>|Ou?UH=bU-X?և(/-4?w"@8i>RKe0JDS>[>&H??:_?0~'>u>c?V@JCiK?U;PN? ]R 8H?xe?Z>w?v~??~?Xmu)?=1z3@X;B?Ҥ?bJ!?d?$>=?̾bɡ?X쿾Zg@46e?Ҽ=> le?vhS?@+`s?" rY=nv8?W8>;S>ǿf%@HXc?Z ƿ$c2=s??S->$To@=]ہ@5Ϳ?? >>H?0>OnRK=G@R?f=OEb@?A֦-??,Y>KTDg?e7C?-`s㱿"f?$P 1?&>s@)KTP?2M[X >F?}5>?y)>=K>I`@4eq{?X`?4Ryt?0YXiw>S?v?>>z>zO@Z(6?S>=*3όB?(?^?>4Q4y?n.PzhA.?h?'?-?z?>>_z~@<-wR*?g<>~rNo=g 2??|?_[?`].?T;XX?x$@ *?,K>4I=9?e??>²>?@bZ5/@!?>YQ>5?ébl?"?e5V:;@v(?)i? ? ̿zeq-<"??I=ھ @9&Q@ Q>ˈľu_˿eH?W?6.>=}>U>aOA @axHp>m?";>90%?T?b > A?hJs<)4H?ڑeԾ翣A?Ȏ?~rƹ>R@+_$J? ɿ+' ӿ6%ݼH?x?B?9>°@I!6/?mwv>.#NB?r+>?bl?51<=L@$.j(Qh`꾹Q>ag?>?^*?m>u=@o36:?ٽ(e#/0rp >Mi?4>'?P%,@Č Ng>>Xϒ=B?gq?{??R#@jI|ӿΟ[r>*c?b@ 7${>)@ˑn_G?l;6?>hA??/` Nb= A-ZG{^*T>^S?y+ ?s4?K^z\>qAi,'Xkl?G >C]?9?>> }zN9N?@1.@C>8XSNF>>b>?/>N=B?4b@mo>F?͚I☾8>Ş" >_?#͕??4n!>{>?;?Lpۿyw>k>N?>T>)?m@ Ir?:ſҿLQ=ӏ ?E::X፾^g<[2@c+ ?M>Tc8žW)cB? ?n4]?n>I ZȾ@B9??Hܿ xb姙>ٴ>U&3?/>~#>A;v7?U_6/d ?m>R8( >8nA#k@(?ZϿh,>b$>Ը6< e>ֿ X?'wAG<@e?![?!>ESE?œ?QU%Px>z>'?XTA[~@h@z:?@(?J@=ĥ?R"13=>~>}oAnC >@ݹ?٦\??}=@`=?WA/~@K?@(>[.?6;?.=>>qu?}A K@?R@?`u?Vo>A('@9@ @@]?ᦠ>)vS>$:/?J{;&=cA@앥?)6@':?C??F-9>JQЂ>/ŒAN9@>n@s??G?wz#1?pdvc FATL]@?Y??@-0?䡿->ؾlͦ>$MAXC@̍@S???`?{4=\%D=AI@(+?MB?A?=śG$?D;?%.4B>܌)AlA1!o@?*?? +?>?W o2?q>>D~`A Aor@L;? 4=5Iqӵ>DkOVC>U`BgF@@KMg=h2-#>*rd??MIY>+>׉B&:>@?@u!K]@QP㿔f>r.?k)L>=B/G?~@D]@Iw%iKmɿgÿ]F-?I>EB6?ԓ\@ [@" 08*꡿cPHyza?$B6e? @!@ !b!5L4;/b̿`ԿB-?hG콍pB4@@8/D@d]@! =DevM?5;ZAB-@]@G}@Jj:>m־=ā >=mvB*IA@\K@i@]u|X/>Su?Ϳ*@T$?MB&L@v@ @\ Yl?>z)U>;t?MB$@1 ?@Oi "%o?P?ܿ+aԷ?{AOfB&@R1v@yu S?Yo?[ d=e?dtk~B'@ڋ.@_u ?F~?V>K?WRB"3A T"@E'?uF T?D'~?,6ur>=>ýyyB#A'^F@"?ӿG,>{@+]K>b?xQB%-A?g?;~Pu?6rL?>0?::1jB$\=A?-? @ȑ??Jd?#1'>SKB%pA $_?/?ؘ #7>o@8e?-}>I]B(EAKK61?2I?U=[>~?+d(>؄?@B.A LaZ>?: <+ԑ>V?oB>q?Y B3d\A5`pNӽu?2׾ >?jh$u>1?Vne9B6@aYY%B?#Z{Ճ)?5T?>+>}df?B9@1S)>;\o?9?P|>.>?:ۿB=Hn@&f?N0L?o?X"^>/6?Ww?T_B@@wu%r(,c?>T?R?T fo&B?&@ܜlh=ߏ*&j?m99??ɫÿ5BCH@A?E햿YvdD]\>a &?"?ɿۿBFQ @m4 =}*5>o5r@.?zѡ+BF@5A {tFщ񻱾EZTHN@&?;B?9@i߿濍-;O^@6 ?8B8E@TiG<~>mo)9S??nm`4B*@?0#|3?T8=̿YcE/$ ??Q#HYB@Z>رW?(>>˿*0(!+?A?0Q Bl@?F0)??*quy >H(?E<[HBA ?ݤpiK?>]VN޾9fG?ѻs,BkAk@ c\[O5?m> Ixo\i?J7ɟ$SAA&@/j{%.iڼ6?S*<=x?e;оY=&A,A 1O@QU_?$>D?&ҿ;?|zFHK=AKA1@%=w?ظf?)ã?H+z>=A͂A@|Ch?09@>+Ͻ#\x!sj=!]AVA0i@>Y?=u?CF@=?թ9]>·aAqt@Qs@a??n\n?h?F>_T>bm)y-(@>\&AASy@&@pN?ˈ?qk@42@ ,?$V>--AտUЂJvN/tA2@!@?L?y@Ub@k??h́^ҿ^ApH?@vH?@"XU@ ?>nb>Gw&r->AATQ?Ż@"?4H?N @q@w?p? Hk|ҿ9LtlA?f?ߢ>:Q?n?ҕ?-?(M5?4οsVD~>h:>hG [rөA P ?kѿ,ɻ>0sm>ۘ?Nx3#_5>A;ؾ!t?ӿ'鿖Y?a?=?|/[o׼U@q^?> )u ?y<ڿwj[~pTp>WN= H@ܷbc>2]ܿCL:>'4D>A5Ծ? ?=L?=6Hs=H<ŗ4ݿq=?1>F@r_PC>5s?x>3 ?͒?(>ÿ-}@ kL=@?Q?=?^>mo/H? Wj~uAn"=U@?A? ?ֿ/˩?,ھ=AC>ҾR6>@?4T\>1@#o ͽ qOA. >@?>>LEG?y$U>й&[A `D6EJ?=^<ҏt;쿝?OUd>ܡ+G|l@ڿ[R9>e?p?>@ U>ĊwD@}rU>?6/=f޽+SzM;?Q N((>n@뉿pPݯ?4?}>Y?J?V0Y齶{cf@ϿO? :z4@> ?؜?Rh?8Ҿ͜E>p@:?vA>H== Z挭>2?I*?AxK@|2Q??C0H?&W}ZA?. ?/>iP=rw@`PA?5n<AJd>P@^u?Ok?Jy>)Qa^q I@ǿ[@  >A$g{!>>Wn>! lS >!@ ,c@%|?ִ>%>Q>N%9.55#Q)?a@i"%D?ϖ??PhZþ_?.ߔ>t>k+Bݿ-}>5@…@>ǜ?>Nwm!>L>!N\* .R=.gr@;Ku>6PGl6켗?1>q>9M?f@X_.=F:7lοC*Еֿ#}>q >4~$?78@vo%?O<>mK:OlW>S0tǿw%H=:@*8@&G>7>r3 Ǿ>ߕ?j+Ⱦ 2 >"`@u铤@Q>2?&?%?P$^$>(_?YM >pocketsphinx-5prealpha/test/data/tidigits/man.ah.111a.mfc0000664000175000017500000002136412771605033020414 00000000000000@$?>>W? Daþj2¾?j>V>8*6B>>@i=?!7?8?G4?sj?$?Y6>N@;f>XDvKb>%<cGOҾݩ?,?>>ڰ?)x[@3LyVpDXDI@ >l2?*?iܮ;_>MDa?1>#|{bt꽟ɀ>>V6o=@ N3>^JU)ݿ\^ Ii>0?gN]@9Qj?!}ㄾ>Ib>zɂ(4?{?մ=i/@9sD ?}E>5kWt=UP>?p>:J?E'?.6@/HW?p=; ;IɿQ׿?/l?Q3??? v>찒@m:!?ujUYdrUU1>A@?:u?K>?-h@& z9?迏4ҿ $^R7{?>=i=A?$?%Jb@rj%>{?=8> g'?)>j> =;-i@7. c?">?!p^=þ /=vH?4>uI?5u?8@-'?C'} [ӿ0z䱾?oH>?Ѽ)>Yz>[@]?Ҿ=)Y=2M3!i$&ͻ7.?>G*=8J>R@-<)NR?ϼ*Iqb7`ҭC>A罤5?ZM@'?w?9>>c]0>J>8?#>C>;2?i>AX vYA:@%2+nv313P?sgx=1uB!>?A{U yIRo~NA=c=3Ѿo:?@ކ?DM?RAj9ľ)?5>BaE_:>֋?M?4?#@Տ8#E?z>̿.!G?Lp?%?d> >{@MmCi࿭ѧWII3>-w?*>`Rj=u|@.M?^F`Â?_?Q| ?h?}dt??@+0$J?v>M=dbǵa>0)o8{>*}>?Jk@-V?p>>E=-sk6>.?fX=I=Y>fAn/l5 a;?uIk='Q? *>!?"[?Z>LA6-N΢3xk?4ҿpJ %j>܈tAD=.>z-UX>Hq>:/>.=>"< ]@_n@a>Q:>Pzݽ\J>I?UU?6=ڿ8@-? ?d7?f~@ur? Av2O>=(?6?8AYR򗿷Ј }?A?#f: V@>,T@]w>9TA=??܉?1u%>Δ@*r>AAP\XwvOA!W@>$Y{. m? <?4!>mT@Pe࿩ [uCĽ>m?|3 ?'$j?7L@|>dSt2y>Ɇ>ؾ>>E>h~@b?]+$? |>>{>gU&¾G*]=Q@>gBWa?6LGimEuJ3)8~lP # @,<.?p$0SQ ̽n0]A=fuq(D@-:0?[>Q>ڠ˿?<_jE1g> ?9<i@o@q1}?56>̿6~=C>K= >Pb,>Hq>m@Cܿ3*?K=Ȣ"My;ZjP%3>?k ?@!@}= @??W- X׾<3>??45>z{@d?O}@ȋ@?S*5>? t Ծ?Pg.?2%R@c?@A?w{>H>?IΪ= >H h?<?I@6@G@!@2?g, >2ֿ > ??5_>\?RdA5@7@w@&п6?f> &h>ع=?d&>QyM?:O<:AX4A*äA8?"'CW"?!o?i= >lԽpA?vA&@5{wQ򾿢ާ?{=uM?ZJp*B0A@5G쿙~Կ> ? = ?迊,zBv@MA@ p--ŕS!>5l?TąO?0z+VB%:@ච@]>C?Zq?3Qwrh?ENOB0a@Mq@VF`{ ?>"?'Os>Ψ޿!=m?^+B/_@?Y:??s`ob_>3?e{B*ڢAEI>+L'4%4>׍N?_|?">?(ފ aB2:c@*?%-t>@Rx ?jl=T ,B5@?Q /g?E_i?U1M\?>b=9/CB7-@ @  1?KM8~??˿pϿ`B7!@'[Frs1Ǿ-ʯ6p%?+?߃yB-A@n bQqҌwxx>5?J9??ݿB!S@?7je>> ? 0s]x?񫾉4[\B@@(o@?=?(TU.?'}(SB.@#@?橿r=!D#>3&L򿶺?|bl5vUj-B~@@2f@ 쿵M+?39b*%B?{ӄmి=H=Bׯ@$N@?`?W,iC?-*H??%}=ؽBz@%0@Pm?*ӿ0S =?N#^*w>Qz&P>B@u@aH?n4sBɿn ?˒s scx\/,"s?lGB$>@w@N? w>t?30ǿq O?YaB@@e? c~$?R{5>qJJi0f?2BL@>@ԻߦmS?MR3A&?qe5k>rB'@{@.48! "?/j*Ԉ>? WF\< ,BV@ @Ðn?mS~=k׾==eB @"@D|'jHLQ}?kv$о{?-ܽ K/B~A>@Mpqw? w=Zm4?HcUj> uBA@A迼 l0?tU9>?[L&_Q(BUA@X.?>оo?A羅¾UB sA ؕ@`\7, OS?4tX=OE>۾Q>;ԜjB ҴA@c/КUW?>gU?Wb?BZnxBPA#@GtkB>)٦?h>r?ULV?9KX"BƫA V@׿IH >M}?>4?y?nƽUBzAY?i?{?>m>N?o7=&FB!5A?$(9@$?a>-O8h?hO>BAn~B&$@?G"x1@Rɿh?5%=q_ZB,|@҃)?}('?f&?=ށ?Ͽ-%?(>y(B*B@: ?WRZ?F'?tjA>Jo? b=Ǫ̤B,r@`>÷lZS?Ƴ4df.?+?p9%kB#A,`j%!?m俎o=>t>g?&,B#Έ@Kj[c,&?35^.?WJ g?ӿюB~@;o {IS>Tإ(?i> e>Ͽ ۿvʙB @M@5?i8>?Xp?DT>J\ ?澫G =B @V@I 8? xܿ*7??i1 ?'?bξU?|h? 4=t~%1?P[=ô>>M;r8B @@'.?蝉^b=)?qkLJJC? >SVB f@@4]? Q=&?8kA>c7l>!֓alB \@@'b?q½?m +a> xdd=>VΗB m@]@[f?m䳿==?/ڿtkyL\1>?AB@@'x.@=F@eFq"\>?Y=}=_~B9TA,M@0ͿE`#Ы@ Ou? !=?Q, B3A I@/2C`d7 ?ʿ=~<>}RX? fB A@2}Djv?ؾdϾFC>`8B `A @l 쿨>;<[GO> B<BA@1%c>_>:?2=Lv?sJBA@JF6ru>x P>h)>y=4;{BA׾@cCw>)Iܾ*=iH=|R=>MmgTBGAZ@+1U/<)7p>)O bB إAA@}Bw~G>e>i> >HPBU Ab9@dS.0׿}S~z='?ls:Z>o1.BA @8$@NP5>p?W >Iǿ BB!@7@f>;N<3>T^?=fc? i eJBe@L@X{آ=q?d?N?Oܿ>ZK>H%tJB @@87<|C?@?.?7?@7ֿ5?. "ϿcB$@[@QR ??N?9>-P?-B)@G@ ??I?LDH@?F>?:&TB/@ux?{>6VN?-m?B?(^?P> |B1L@)?{k?ٹB>F->JJ?w)l= ˽B3=@?an`Kn7?ܺ>}M%K?tB5@>RQ@{[]\g?e?",!ELB8b@LҾ6!ݿ4?Pt Ҏ4 W?>u0!B8_@~`Aa?5>OӾs?e>ܿͨ'B5@EǬ\xU?kkF6!?!ES?u? 1㿢WB+I@kuΦSN?*22.:141?a?#_Dh!7BCl@@>?ױBu#Q?B(=@2t\@'@ɉ>Eǯ?r]!F?E>ׁ4<1>0HB.@Iˍ@ wt@!>na('E?ʯ> >eBUBظ@+?M@HǨ<Nz]ھ?>>̨Bː@eu@#cZ@05m "5>WÝ?ׯ澞>[CBo@@9)@dᄑC>^?'I+@4>ebB @@#@ [z'?*N?t5Ssj?dkB @:@d@?F>W̿>ފK?5۾Yf_>G$Be@@R@%w>_ygG?M? ]Qz8₽$5AD@@4@FC?F]Wٛ>ד?l8>R}>AC@ɡ@lhw@F?(? =4>;>e=M>c;<,@A@A=@T@^?FzȰY>=e==V>=>K>A1@̖@W@@Hk7_p] ?-͹XѾ>~Ai[@@w>@4@X?:頿^¿'?&F!Ha6>Ab@Ss @Y @{@A~F?'cd>kЎ?o~v¿c,?RAD_?_@Qf@p4@/f>k?v?(>?Q_,E^5FJA#L5?a.@0 @R?.,?,s?1a?L[*ؾ#>CkA ?tͱ?R?Z??vD.@ ;vQ'X=X@A 8*? (?@?>?f>'^-? Qa!8 aܞ@! ߩ=?#?0???(/R?+k+пՈJtv4@ ?g@?>~wXVb6wýVi6+;5r?DM{z?^@!d(? $>񓍻nn+>/[=?3?Sk-3wYB>,@wJb*?=ט?>(м ?)οdC׽rn@Gſ̾?P?/۾JdD kz>"q1pqҚ6@ʿBǫH?Ĉ?73yI>/of>xg=S0@F!:?;s?;?Ij??i<`?i4A=Bn$nAoa==??c?{i?&9u# Y=|? @Kw "> ?;?QF?s/=?8̾-9>F@ٿ$T?P ʾ ?, :U?7㿖c?;uQxa@窿dr?#{-Qm?r>ss`>?xĂ>@`?O7? $>2m?Kf?>;x6>ד@hZZ8~r?dW=?e?3BQ5M˲?@é9?.OZ7:ٛ>s:mPd;C׾ء@ =LY< Q?x? ޿)GN?uԿ$oܿC>m@:Pt-?Ŕ=ak?ClA?>7<x1?WY@䈎VQ,?=R׽rY;~XI D5>]h=r1<|?GA3y?;H>`kϿL>v1<2־\n5+,@?>oоH=C"V>싲=>RKsPzت@m]?_^?Ц>K$ir+H=-Ҿln>jv*G@8\gof}ugm"x'T? .>z <8eגBd辻?@Ɏ?ƾ׾?r/轌`KԾK@>-(?UkM?8=\?-?(^2^>@=V???K>)'޿ L>MN>Fɘ>hd.>% >5-pocketsphinx-5prealpha/test/data/tidigits/man.ah.75913a.mfc0000664000175000017500000003512012771605033020575 00000000000000@OQ?{?>&>>%>h?@KP6>?*??,>gm?!?q5?>E =KZ@_@p+?=P?਽Ƚ?@1??i>m`>Z@Ohd>_v,y/ 01 I޸=?M?SiO>'->HO@3gʜ?HtLfп= T?7?.Fx?f/A@gF?>>^R?C >8;E:>B>?;>>`@/:A?D1DjD>3Gп+?>'6r? Z> #?##h@tjM6[?1?,pMunP|>^q?DA?2#>1|@.;|?J0K@-zJ>l>*=?}?>4>O@1$R?9>C7I=9[=H?Wh?Yh,?>b@rv+?l<>P?_|>>Ԡ>w?OIy?5>$I@0JkY?b,\ξ==M^ re==9?G>{=]za?o/O4@%^=k; ڀYgx=>wG?^ ?L N@UE }@8z?)7) =>֚?y=/=m?YR+>$W3@5Kzn?پL>QݑUj? M=<\>8wq>^@$?A?>BM\|:>,>->n>?T@A,j?G=Je|?g>]*4!J?!?? a?F+t@N5?3p4_=Mw=+ 0?dξ൯#>NH=h?x?ozNs>ɠ>(?$eRl?L F>@D=?U 8<< >>x?#y-.>} V@y@"#ܾ|ۿ{ =>0#$n=̀w>EG@^%D=]-`rN>In*v@ a=0?65@ >$>{(k;󾾛x?ee&v@-UHzᖾ)-پ/Kz˿>X>>2>=@4;"N?4q=?i*S?J>%?>@XK|>?t?=W񄾕oNr:?;7Q?>3>s =`NmAq(U&C@3Jc?rl?)@ mܿO(Ǽ*A]H9梿#@.R`1J?r=>?ÿȏʿ>윾۞5AHdsa?@x> Y?>ھȱ<=riYAUr%%T?_>/>:=F>$Hɿ!v>V?AuNq? g>ʾ>kQzzb>=>KCARBW Y?s#>h?锿x2`%1Ⱦ;靿ܟ=A*??r8= >i =c,?8V>}=~=>,@JR[?+Vfd2!h=@v?,g:??SIӄM@F?f^7?ჾckbヘ>#Ӻr?M=+h>?e+@\L?Iο4Y|=>wb??9>>A X@] >Da4%> n9;>M?^I=T0G@P] K@G慨:W|^?`>¡?S@ǜT@p޿+3 8A?;>j?SE@R}L?X?۝K &?J>nX?N >y=:Dѹ@IU*?>st(?#^=>'?A?C?n?ҫž2սԁF@[=\N?W?a1@(/?6>SeL[X=U>?@ =>J?@ÁGb =r/Y??j ?9y?z>Seotӿ,d=>ΐq@+A><>GCy/n=gG>M2Ծ>T=].AW?br'x>և*>q>G/)?'?1NAFc~~}?ϿїW&y? 6?YۿA\>^I>:?HAx(e@!68Aڿxt?bF>8>>u>br?A"4@QA-O忎'? ?A?ra>.?)3AIA)@1!&r29 +?ǐT?#?_?3?uSAc@g鿶? Tw@H?ع n>n?xA{Xօ@\@~ƿ=7?$}>d~g ARni@,I3O>쿿Cgz>yb? 8? -A.?dA>hT?8!>AHZ/@| I?ڿ]?Z?ً>jռ>½?A@%@D?7r>ʨO>R?2??x9"I>(6AŋW1@>K??`>f>ͫޑy?D >A֋rJv@i!>i?>*?N?c?g?AB=WA­X@@G?D'@#?",>i?;ؿCO>y> >QAm ar@d=Ď?}??p?$p?~?Uϼ'f?>Azz@>H@Y?*?%?b?宲?+?>ߏ?jTAvr@BF?V#>-F=aQ?A?FF>?8?hqeAx>zh@|HϿ4e. k>Fd?=>p0@#AJ@@꿗ۀ?7?˾j?j\?vA>Y}Q?x{Ab@x?[!^H?>þ?f >k AIXh@^oSE@-;ƿo>t>6>ο~6?&=(TA@osA@~%@9V>2>)?[)?*yAsr/"@<@&Oս(>;?׿.J=U&?^{7A)9[@=o?}!ߺD?x9:1>u ט>IA'@cQ忍x\?gOЁ=^>t C3HƓg??AP? #+?BɸG ?"?Z/?bAkl?~@@Qxɦ<>d[M?y@\µ-?uaB@k}>ѽ'?H O?to&>6?J Y?" VBH@ V Hp=/㾦JS?#9?{?gBZ6>nttA? XDy>'?X?x{?n+B_G>A} =|-hRO?&^?5?>\?jcBb8<;z1/>?U3?D?$G ?xWBd$Y>-wf9/Sh?\#w?h?w+{R{?xBbƾ>Ӊ.o$&G?|??}Q?30B` ?^Hܽg=ߡl_?=??DM|w? B\?Kf.jPB?S?s?v$,>eBYO@)bU:/,峑?8?N¬?`Ŀ>BPu5@wL;C:!#|6> `5>ܿ.?BD-@b(BO2AY&vЬ񣿵PCe.C?? ؿ*rB'N@+1?8P?ο s+W?h?QvY B9@x?[?JQ?pj ڿyX?3 ?*MaBy@y$-;?P?w(ʫ?E? l3B!T@ϔw#>/OMt;ZӪ .??Q~TbZB2@A(5P?.Eto8y޿Hй? ?(^^Nk!GB8l@:w?[;Y1 (HcA*v:>x> ?9ӾXB< @/!I?MlNwfه>m?%2>;dUڜB;@u0?=P_Bt>6ȎнV ?7ʝҿY<".B-k@rQ?=.?q=sۿ£ezk?gEiT,yK?B%o$@b?G@?\:#[!i?{tؿQg??B"U@A?@@'-?*^=ſ?#yzտsT?QB <@O?4@*_?6tLqӑ?+YA%!?"B,@hΘ%?N\^@?9"~B*@;˿#@3z8@ 3 Rt>m[ux>Jy*?;&Bտ@w@@穨ʓ+ ->?%&d?BCA࿜?F@3饧[ =g?.78h\O?\A}A>/?j?2Q?>WY1+?@Am@]@k@CR?m.ž6D?St(>G>$(5?4{Ag@'@@ab? I?&H-`?WFC>#euY?MEA̝i(@;@i?-?>86? P/ܚ =A>#Ir?_ٝ@_!?89?,1V׾BW?>C:vt=%A:?ev@9?~< ?Pt>?(>? c>-5>Jo>pAA7ڱ> ?>86ݾg?üs>ǽߦڿ:u>:A1r?<@,bL@i>8>u?nS>gM?[ֿ1=GrAU]ԩ?׻@$>>L4 =I >dI>={>B>qLAjlz?c?r?<ϊ ?%9 >ABrc<ȼCCFA\9I+>J?@>kտE?$??(?:L=NYAPhCtu=G;?@4?\=?&V??4?r{?(9޾ müx@^V:|?>C>:J|u?g>A#Q>1Bv@Lqx?)NT?c0•>F <դ>X[>xBHa5@$YW98ؿdv>?Va?]DۻBOþ@rdi&jԿEP=dGL ?J?H>9.+/BR_@x ؿƾ⾯o?2?>嬿&Q]BVJv@F~ PTJйs_?/v?tQ?csξBWS@JM龩?X%>?.ƍ>"ھP#BY@=xZ)鿚F6s;;>?Zm>h"aB\@ zi!{ ( ư="B?)8>·^>PX컦lB\+@/ 묿yFf>3W>o?>?=(!Fȼ0B\@:t׾i#U8? >>y1Fg,c5B]w @W,D<ҿiő*d?,z>f>j4#h4B^?䚺s[u˹C,??%?=ʀ 긇B],@ a_ò*9b}~ w?He?93Q=. Fu==P?>B]e?BT>de?J?B=_;iB] ?fwHd?C_?e\=k& B[ @r/㿷(s,߿?wV?YIG>эCgԽBY ?u|1ڴdz?H? w>o">%>͂BV;@S q֬ S>`j=ῬPiBN.@H*5w>!Kh{q >0?>z>YBGF@sUܿ?`྆ H3?>r?/. B/Д@3Ӿas?A{/c0??lHZ?E gPl|tB @ҼO?dX?iONA@???@йE#⧿NQrp>벾@>l8AO@p@G@WF@ ƿEk>/>mBcg >r2Aw@@)@e?]vsf҆.n?(>]XZ> KA9C@`?ݭ?s^?Lzn#Mþn?IB@ @I? * ,@LJpՄx*Y+SG?7Bv@5@9A@NI'~m?ҷڞlN " y?DB9@{ۄ@5F@e(>#h?[>=%ezp?iBK@s?C@vm=]W^? "Gܟ=޿ƭ?Y{ZB^@PH?@a}?Tο>ݛ/_ݢ>$?J4k?MBl@K? @Ik?H1>L4yY>B@0E@@H?iпo >%d[S?f a4=\B m@@?ʼn@J%? iRǿϣ?IYo4>7B3@~g>ow>,?6Ҿ5_xKBF@g|?N*J?ɋeIB|>"-?>׾@WzT#BHi@`3Uuc߿}>=&?>񾆢_BHf@f7Y>HϿ{?2=?i> H zϿNBI@_;?gտp|>y˿<?FPt?==\ĿZ9BH!@np6k0B>ѾF?.|0+=ܲ겿| BGd@뺿xJ>ӿ6%v|e@@ j 2.VBK͹@"ѯ?Od= ~}G~@k1d))BIT@Cxe,?6#Jx(>1w?T#QHBEq/BG@[ak:?bf*$ϥɼ@efK~,O~ABFu@` an?·>,_mQ>?Ͼ 0=BFt@GGNnX?~HG Gy O??1!d.#tBFi@>3?<^2H?V?۾m$ۿHA4BC@]-7_?G,Ja;?u|?k(UOؿA9u>B?n@G@#x xl?bʂ?`dgM2Ͽ?"PB2@6L?B?YWl-)>⑾̳w>skG>RcB#Q@y>,au@?W=XzI>3ꅿeF>6B @sd.?d@$?JMط>Ǡ$[? 9i>uBr@uΎ?u5@X?z ?: 2?2b{teR>fVB@?e@C?%M?:HP}?'k>cB@?µ ?Ӻ&?)ҿ?9|\>bF pAm>rB/@?Z??f?"? @ $ϽY]#ۿ@>BS@O?Av>O:#?WN:꾴z5>}fBv@?1\>8?>ڿ#œ>yϿw>RB@!?mTF]?!J(>G"Tb7>]B(@M?o6.?P^Δ9>)>_)B@@_cܶ?ZAٿX5=;>vx>tr,>q!:F7?ړ<'==ڤ߽>Bw@ @!(aE\? ko߾>F:+ rxBA @ J0+=?u S>T7th#BAg?Ɩ#[0?2S8>zoo½6eXB iA @ `\Of7ʿ;?K>z[>h|=,.'3g֛B l*Aَ?Ǵ2Hf} +{T?e>C2dH>^H7cB#MfA?QDe,y ?2#0>߻^vB'APNfxR?<<4>{^k"1.>렺!B,yAzFX+ȾWtJ>18-rJKn?&⊾\TB.9@пk Jy>.SF=9k?} =LB6R@Veb2fOV>^jn}5FO>e?Kg:qҾ7>?裿 ޣB;E@ڊ #U>#O`[v<?>ƚC?ֻ B7 @zl3?=6]i8f˲>篽_?&P+12B-g@ NJ9>=)6L yt=?9rȿW3%dB@>?u?\>M;>Ncd=ĩP fJB!k@AE?e@/k?>/\3eN> y(B ;x@6{1?@Be?]ϿwVCܿn?>[00ξuAB@p2>@??J%,Hj?UžX'$|B@L)?@m$?^?fUˉ/ӿܐ?eٕO[ľlB}@g$0?@x?Bg%fʞy?gۿXNIJ>B @z@@ww?Qe$v;$? Y?'B ҂@n@4q@Ai?;;?%PG H&m?JȿE=?BA@i@NuL@;[? rf?}b"M?,>ޑ?A@&@b8x@LY?y $f? >*\Ϳ ?AD@vG@@z>6JT?M뽾x?v?}A'g@e@qq@BV @ e =u?Pg㿅kܽpDQ geP=}.@E?RKS@S?b}?a?=m=mv=,= ) QP|eg@'Ӻ@Lq@>$^٥?M_>"1bi7_"F@bT@\d2? ?M? nm>9>. ?<ʏ??=pyG B>(@dI@E>??l>%>3wBG&>/?d>83ɿ~>B Zeok zZ^,ްI򉾠ӾxA&F>N3ʿj<쟋kM۰>UBP>R-ꌿ׿ѨoI?>wڿwKo?A^n?mr?D%m ?&u=Ñ?.+F4?n2AT@ӽ?b>)? {}??侣p>? bA&?cy@_@@ ?ƫo>m?k5?z |%F?]&Bޱ@%>?=Ǣd=A -+?#'=ھ8?B(t@6S:@뽀[:La> ?:¼r=%HB0b@}@g@I( = B>?;,=y􎾊DEB*2A X@nj>;"Sq>?z_pCZ[>fV\B+sAz!4x@y?;J6n]t>x~?L06W&=R>.B.A8@we?ȿ_>? m>F>uiSB2Aт@r.Z?HKO6u?6z>f)?!+dB3JA@pT?3;.'?==]TEk?37.B5UAP@8?TJ TqR?8!\"B?$ϾB5@ISr@?B5cG>t9?M.t8c?j~F.B5O@pQ3@>VY`'f>?Z>"I?aDB8j@fi@Pӱ`/O?jOZ>/J1f=?ibB;@[@펿%rb}?Aƛ?MX>3?aV=&B=@OiWI@SEQc?0i:YPx4=t?X[B8W@lٿ~@壿tU?¿g4) E??-cB5@6:5@ub~?оl?Y?oN|B>!?nW`̔@+@db^y?n~Oj>o?wfѤB5@ ѿaU@!ۿ}s* ?E0\'?>>.ЏB.Y?tl>@ IO`>ɴKwp?:>71F-B.>!>r@'9A\=?o!zt? `+B,1?M >@ɺJB ᾭ?a6j S>OwWB(8?p0?@noO=m?{W?m<\>@OB4= ?@vMizy};?;.?('?1MKB&?|?ɴ@DV~%\6S?v>A}l?l>=]B@P?b@ ') y9?O^<y-?'AtY@6e@@4K΅)K?ʿsrm$?P A{Ai@ F@3PXa? e>>oBAN@B@|?93 1v}.g?*7㑰#fA@@F@?:y>Lfſ >%=xTAS:@N@=@0?3 ؖ?T0:Eg ]?G Ixe,=sAi¯@$ s@6@ˇ?yɍ@ͅ??ѿ5D:9S>ADK?@u@ ?R?7Ag?A忠0?9n?~fMJ>kZA?U@?2@W\@'BM?'Y?d[>P? ߾ ʾu?aP5AUM@?Ð@?=;2?tF}>3?DWyf=ݮ?A>z??}@i? G>eH:?id,D?Zs?f> _0> QA?>?J@ ??3S3?=k/?>_ʿr2>ʸA0GI?wT?O@=5\?DE5>zпwWQ?!%Hѿ֤>C*A>1>@?s1p|G33%ǿ I><Aj?P>∊ u#Z̾+`rp=վA" %? >g_濨)6>+"F{޿ yB@? L>Ŀk4w=e#we\> NcAtv@c?9T?_la>ϾR gӾ^@ξ?Lb?9ߦkm>IB# {@־p.A?򏯾~(efȽDF$ÿtGU=`AmX?c=,)]H@F+\qD>=a4O>%>@@O?=]1a)6< >;vS%񤾍=@>P^@5l?7?MfVվǾq翮qabr/y?I@ ?>?a;7\>L?+vBž<ᄄ\@ښ)l??CּپhSc88@Ѿok??T>;P9v>TfD9*9>@?V_lqx=M> Ծ8(/!>MN(>%vY? i@{ @ ?ۿ?|!/￈\ʿ"y ?Wƿ]?>꼻@U=?Q?;3?ʂ#>,Ӿ|?':M>a>l&@ؿ@%tH?q?4c>p>wn>,p>? >S0>3>%&@NQ?ǂ=>f>c=?.\>]? >=@7?颁?3?3?r>۾??O?>0'Ka@p\?_0#G>?4M'7b>,q?w? j>ّ>GӼi#@l>?>3GװT?",??_N>A?X=?5@^pm???&9=X >|>yb=!(?ؿWC(@΃@v?0>P>KӾa`>]?i庼O>In^@52T=):Y3wS>KlB?0m?'?Hk?c>n1pocketsphinx-5prealpha/test/data/tidigits/woman.ak.276317oa.mfc0000664000175000017500000005313012771605033021407 00000000000000?Cs??? =ʯ>>Q>?0?P?a @hڼj@yb?K?Q=uk)-y?tJ>m\?=y@7Ik#T@6 ?>l>r׷?oy T>O>="֒@]3X?h;?v? : &??뽄Xy>e@>:Z|`@X@-?knjc2X="F>$PrM%?OH:v@Bj??ɿ%1W3x`=پڅA=Zؾ> RZ@?nK>n^>Y?û>6> ?I ??yoH?MYlÏ?ZWm?Aw?K?a?SN?[?O??Q>DWYl?X?ٽF?Qh^>Xj媾R"=e=>lI>ڶ>?xHHz(?bi>Y0?q5?^R$K1KC> =a B? w=k̐!=/۷pv'뿾x=5t>󽨧 n>x^?+W>9C?=&[?Bb?)E?=jR>*?>'T=>t>( ?=v|>%>xڞ >Tl 1>u®>Ox#=[Ëb H?z,?im?V>>Hx?fL;?`r{c¹?#:>M }?!>x6*Ox>MԵ2!+-?8>>>sO>#>oؼ,۵ݜ9?)o?? h>{?P>-"tw?G?߽[?x?Ni>$=c?E\> Jsx>R??V?j=sf_q2?H>)U>5av?ݿebF>??Vϟ?l i>_)?g?IȽ;`4?+6<,> TD>>ƫս?+h<?K-??>Z?~?}M2?7>^>>1u>VN>zo>??> 3:>~qx?F8+{?ュ0e]g>?:V?>Yf>GH?8Ȅ?ZIc(??Lm>X_>Ҿ?X3?*?x>iƿ8/AʐF?La'"??_? p?W>>l6>'=B#L0?8`Z?a0>;?mz?*nN>g ξV[BY?]ʿCS~J?R3?Yד?xBD(Z@uN0>Sm>#IX??[Ta>TzBc?(@ڿ(}T'?ih>?&;@ 39B$]7Q@ ` >D>N@R=4g? dnSB),b+@ݿ>㒥>f6?~|>T>2E@B$G6 @Z# k(#=̢=dt?jmĿG=?fB+bM@7?w;&ɿPC $*^B;I=Ta,@2>RQpպDxS|$|Aq(,BDɿe܉@?g5㙿r7F0>ۿ65>MrBJ Rk@p/z?N-~_JX? /t5R8 E_BPn>j@a?&*mpo!br}L;:_Ɨ1:BV|'@:?HĿ e*wy)sfg?h ?@gnn̒,=Zhp+( ?'6@d+(P?Ulx龚C@K觿xBLÿDR?O)f@ ʚL9=x"9 #[b_ڿoBP>H=/U@ }@>aa>?&|d8oWeDBOju8n@0!@ %, ?|{ 5Rʲ㧿sg:BEُ"@M?ZcHu:;5Yɿ!dx;s/ PB?J?)@?hY5?G_Ex替C'ȬgB1%| _@༈? K/K>_,L?ڿY%hM]B!@p~? ʓ:MЮ]',f!-"?ᵁB0A@?b/o]5,h*珿.Կ6B s@t|>NO?~Em\r)O}U?>B$h[@&>c/}2?(?>>c?X9? B_ ?0ÿr`/?:jῶr>> 4bcB(?dlw?x BS ?nXUn>A˿קAxu[>QݭV=mT?+R^?I0e>pԵAw 1p?9ɿ͗~v/}??d,?&ng>rAHv?ʒ@/>O=!zP6gs>3.ÿ? )A?0/>@<3A)ݿmD=ӿn=^1/}B`T?*! >D۾ ힾX[?I">Bxu?UW!]?" ??e}?N灿72$>Fv>JAדּ0I;)?o: _?ܿW|ti=Z;B _U?ܢ?"8>>Ii>E?>D?=Bl/?,M`>țT/N(s>n; a?3V?:[NBt@rP,Pƿ]r,翃1?q +?/پ>B%U_Ҋ@ɿ2 ʾ'5+ '>څ.?vBU$?[鿑[6_j0߾2 U>.5Bij7!-\5;Qqѿ<8@BELʡRBpo&`B(ILa=B.%ٿ<O흿,s.rqBxA iۥ.|9C>\c(gI9 OBTz'JMx!>dmU 9Uc)};){׀BBns K9HX=?V(>)¿R Bo "M(#?*w-~1WοfzBJiDYEb3?{/> ]j3s e;>Pn?Bsm N&3>⾾A 1sMrDBsDOIB9Q O#i?uB(,:/5>4$tB:^͏W^C
̖6势߫7= ɿ?f0 BnVGCuOIF>CNȿ,1J.6$v B*EfH߁Qҿd|? m+GPؾ BzJȪ9je=% ӝ=1I퓾P!-BeᄒE/HX<*(SbZ;Ȥ2o.fUBB@?L6IiwO>M[ܿf6B1J@??@oHR~| .*Uwn;>;B*@9R[A?oԸ5|b ̪¿`!;׶B*z@>?|@t0&=׿$o@ B2*@ U0S󡿊4'L'~yrBb@t)J"E ?#a|ƿ46>󃥿15BbG0dXg=%yz '?:]'ߒ(ٿ7տ@KB] c "$[SH/?!E&2.Bkt+)r BTݾ80h< =oM*B?tKΔ>Agz&BH?w>?ԛM4< >kMMC"4쓿B9!@>Jq@[BI sCOH_;b>ie-.B2@{m?,)@!wj$M Kycf "B.@%?q @4\\A &=] nqB.@?@uw袿T#u/>m#>5B-!_@*?v2@Vp`忖'9v>ko(>^~MlB*~@?p@i޿x>w==?AX:->(B%U@^?f@7_FܒD=^?J/|?>\bB@?ك@8J^X.iTI?G7ڱSBHA*@e@QM\Nc%}/?SO.D,]$d!B@@@G~ࡿR+Lh.B W=*S@k@)5?E` |8ܧ)+ xVIB>6@k3? ?-Ab~>3pQF&%;}B}ۿ>^yH<㥾?aп>Mi?2r!Bn=63=\ɾ&L? 翪JO?@,?MB 3[?"o$?Q)B؝N>^?Z"?=>?WKu_?B@>(+aR>{Igs?B K uӰ.޾@f[? z̿?𚾏/BOaܻ|J?WR)?q>d??LH=lt=>@uB Aէ т?%.H-G#&=Ϳ![x&>MB2? ۿ?9+j>TdȜm?[ ɽy&>+s?n.XB@jԿ׾??qbSlqB>O O=~B/j׿T C?B?f=7[?'b?>ɵ?B [&?vr ߼X?I>, ?aῤ-WϾ>/`B X 9J@y;>9>M^>ƿ>>Bw@0>74?\n7?oLqG>nE?dB->’@w? J&>޿E>@g;*D-?gHkB;`@6C?=ڈl.a9뿈 y(ƿtBI?if PGWh B!6 :3.kEsQBU>>km=Y),guQk !>-\$*ooB_*> R?wŶa߿ɲRj?QpAq+Bf/DiX<>)ɲs"BH ?/ȿBkE[>0=8. 9#?G[w[b=14Boe ?F1?b2Xw?!u->`BpD%޿A>ϻ&_A{龂鿎ۇ`W,6Bqu~西Ġ>EO4 =! Io־+BpW",M>b ?>>*ރU ѿ)<zBBp.w+Ų>c)[G?),_쿧t6[hBj|%?PP=?[w>FphFuLBaT"leK<>7)|S?J>ZͿc!>BVaп'?FNg M?:>B(Y½;J4:BET!?e@20?7E? L>D"qWB3H>>mG@2|`_?Kp*>8>쿆? PX[2XBg?=@: O#+?nd?w;q?Kab1%AqU@6@$hI?b[ ??Z?&=>łA~?v@;>?u?R#f󣿽x KR?z0>⥽@{  @;} c'ܾ?m]>63@ 5g@3>l8o-N^gj?Z?bn=>սMx@0LSKTs|8nc&>? ?>?d2?+\ۀ@?!s>>d>{>`2?us?l˻yr?si>ٽm?"o{>(9B`?0??[5?@_?4>~?;?%]\SB1N޸+?iABm,>:=Twʚ~?O½(.:*B4??-1oN>?D#?6a!>56>VB-d@]?rw>?e?y?(\?3?Z?HN8B#@?8_Q]$>j?x?I"T.?$?G[B$@!>"(?v?>ˆc#?FGu?oK?wS?p 「LyGBs.33??"^?s.9?m?$>>f?>,ٓ8 ?A>vuLQ%?SX?XB?S6@? uf~? 5iJc7!e? ž3]B @P B?.=0?Fɡ$a>8?ྂ1EEB @Ea>0?F鿹x ?]<͕/?.?#<z&=B-@?h=V ?ʭkc?߽B  x@8ZMp?z~V?^Խ>ږ>>İj==ǔB k @`9j@,Q?*RS??OG=>?>F:>AʚBI@WO3?E?\0+>W?}U??Kv>JZ>A-@?q8^?+Lp>@R=6>'H>[MUGA`? '3?gg7?F!>y>ԾH>sRAW?y_n?这8?nn>•龥)?jJYA Y,ᢾ0i{/@o=)=h??>~wW5?t>Y=B(APp*5?{ ?;d>U>r>?˼xO-AҜ{"(k翟?@ܞKIj?_37j:c>GɥA 1>J.?-e> ehw?F6veJm=%>bp-;dA7z@s? ??U>@>e?p?? >3A>aPmE@u`S>=?DLm>?t;?㙽&R=<0@JnZ??pھIAM??Θ?l>-!?Upk? ?q3? ? ?y?RB>??L0S>H?>=pffvyS?؛Ϋ:=>!?NY\?M=? `?T/c>>&??'}?>Ո5h=ܼX?oMAwѵsM?5퉿?2=W>L &?+u3?TB:_f%oS!>V>QT DQ?2Ѿ̰BJR!?cJ#Yϵ쿘>= t`$>F]B[?ӾĿ -[qhW?a`0I{BU:@̿w?c1FjԿd ?"{=#&r1B'{@H@}=-N ީW:'I?%}QsnGqHB7M;??:$c>w3˿u;w]3BO@N=ʸV@mK ۿ99Va_4澺5BMj@Z&@=Wr1oYį6-ʿDVþϞBT@Y@ ^+H9 B?TGDms9B[@mG>rr׆Dk>Ӿ5 E'y1?B_,@65#bݿW36>?'I J>U2Bb3@8߿0k(#4i<>o}⿲>Bbk@ _4>_ɿ袽Be* @%@j# ߅.hU+=տrBǿ?HgGcY7E6ӑ c? =cf1MBoR?d8oA?cRũ>4 < e4'Y5 7Bp01Fxv(?ckE¿8P」i۷I1acBoxJ ?|ҡ-e`X%_>4¿vԿ)HBmg,?1?&eӍoCQ?cR,#㿦T忣EBk>rљ=L]?o1WW&hPZBhoe@<#uAU⦿'%b}PN{Bf_@mČqtބYcL 'xyBce6@x :mXG־I}R\zϧw|R%B`zNJ@vDz F:2LsE&u e&[B^`"@_%[UMGKZ:8v 9ĤBYRq@h@?Tr?۽Hv濳^Z-8S3BVM{@?,PWYĊrUU#S$T̿4BTbrq?1B@ IX>G r. '/e˲BO? 뾼x@E1, ^P?Khohg ԢdBD@'%@0P,c#!p'HtERWUrB:'@ۘo?vm:11U@S>S7;пfB27A 0(/EP=8/>b³?q~L),2A?hP6rEA*n?*N2B)'>A >_= b{??B?8PoG.?#PB+> A>h? cr?e?\Vqm>5B/\MA X>ǒ?[e%-?xVƲ?tgbב B46Aj???-X&+!? LIB<m@?+>2g.&?Ɣ&?hAV?BA@0?/JL­i#W3?9/'zP?1$[> ABGI@>ѿS7\?P4>`OW>v(RBMT@=5qX4?nmN=8yCWQS>\CBRd@zƿu?'dK"=(ܿB[4@&j8`Ҏ>'?+ܸ,, >-;vfBc`V@kYi5Ye?1x?4V R޿ORžِɅBm?)GͿg?^hve? UfX,XBqG:?4BDB}?T+W_-ӿ,Bsy>)buN=u?B)EJ"fWvBvi(@[ٿ]?P.~dҿӿ #_Bxz)8*۾OTq6ZzBE'AB{V`yEžؗn>悿E\;:gB|Dr7 LD$ 3J>>]&?lZi B{U4Za>(X>""&9]B|R Nǿ\ ?\y$wf+U`v<B{9D]`ǿh]?C=o ٽJ@%俆By( #}mMFԳ?ED_KΧ8yEwBw+h>bg5 p?]/;ԿaBtIGV߾i܁U)?_]K{ɳh3BmHM2v,4}F9*?kuۿF0@ܾܙ?q|Bc8{)#ֹ?f ;BJI?DBmNh|.2BS>;ӿԓ@^c[,T?LV|-wŜR,BD X?CI@)' @%{3!Bv?=׾թB?}?;'>7A@{-J q?ď}GB>??X@0LJ}fp<?^ ~?fR/ B:%?VX?9@IIQ&}4 )P7d?k*vB7E@%?@W47E.$ FS?z*xB5w@>8?ip@N0Oп$!4/{lI?#'EB1@oc?@!5 q;06pU0m?">B*Y'@ ?K@?NM>ɾ5@?7ÿ>B"@j@@[SÉZO%{)+?F?YBA&@N2@ǻ\LDFx>N1 [?U}=BA@hb@с!p weUٿáB>AE@F@eh(J>2#4d.ADfA&@B@vba(FQ 4>BBy?,O@1q^@|OB6R&In]$B \m?M@:}t2׿𛢿`IH72^2}&UL鿍72A,\sh@0>󸻾m^m00ldqF8J?,DQ?&K.A1,͋> ?}?g+$&b=Ͽy6i>8"S,AL$@C?4?IP?b !?B?G(9?B_>>v?[œAWs?P=2? =P??v=n2?r>O5Ad?7>?_?>?Lq>?C=u"?@A]?ľᤝ?n?>h[?@+?#ϛ=ٍ>q{>ڗAۤ !?WB?c(?qr=9#y{>N?>eAᲰŰ?|=NW?c N>Ǔ^=H>SQ? >:? >A/ ?ɰ?C> =P >t/a:2>iB X?]D'?.?8@/L>.xOV#PBǃ@=rN>d@-h>@|6B̿Il+=YA>0?F3?# %?i?4?G=iʸ?!Ye5 BN@4߿Y:E4bFϖށw> .(}u4Be>ȿEq|1 XF%۾ %=h Á}a?BsZtYǿf8T?>+>f#a%N>?^>?&B{]a%x ?hR=4wA='A1iBuJϗ`"?9ハO7i=T*&BJL}g#7Mb 1?P?>,BUԌ j?£پWBq_k A몿O?Kȼ%>͈ZcyB |_kz?)=4}>ʼ̍@; $>_E4ɿ:BL%G.k=?I>v \?O~龹~B.Ů> c?x~>Ztsel?BEξfBI }|H4G? έ>1>#OB52 v0aLJ?>.YFL`>4̿pAB&W;?5(֫JCO8 >k ۿB@뿘y"{ "DoKc? =h\'e>=cBy4Q$r81>yJD0r|`+1Bg>*PaZ xOc ɽp_?!|>K7@.BFq@ ?#CO?ҖMhe? `i솿K ?%uB.oQ@=wЋ?? NʗՒccMgiʊ?͊TRB#"@Z@H @ɿ%d)N)>@'ϳ_B$[c@G [?@-ߴ 3\ۿf.D[>V,c@GHFB/F@g?&e?>֟̿ǐ64'%]<@?+A!BG9@" W?]nL#PϿ s׾ˁ>BVI?0_?n?*|-)꾄({ǿ.Vo80B`wD.b(*ؾ|z foE|MBeO;g4 v&>۾l=0 dYǞLoBj m=l4` p?rIʾ'Ji~FϿtBk X ɮM?=꿑qa+ S5>BjĿE-}_*?,<9;,]'Q%BgŞ<@;\++?ܿ 6IhN8׿Bb`j?7|k־u6;¶?J򵿍þVv_FBX?п^>_HL]?GȿnLD S ,ZG}BL?ӿ%@"$ϿH,7=?! ӿEľͿ ,n{Zr B?Q8@A4@' K:= 4=O B8@:y@X VC#,?;>CG {B3@< [@Za=~~U޿"F>?S>{dB0r@dxp"@T̾gGfqp?gV ?LB.D@>]@e1ob$QA~.a .?N=xZNB+@Hh?\@Oc^}??PV> K@B&@"?ʩ@蟦mUj^8?B+m=4 B#7@5? u@䉳m8*R&?+>Ҿϟ !qBA ? @޵?kS{j?µC3>SkP揜BAn?@q.OXUB2?{9Q>N?BϦB'A%(?O@;wkĿoNWFe}BA[ @&|@UuIPD<-?D#p~BzA6@l@5xgx%?¿^a\n:B.At@yc@J俩~h!*?*Ė(AyAF6A @h@h3Eg ?/ q&B @i@ @Zq$jUvO,1LARsjA@G@w&@PgGɉc?e>EqpD&~A@+@@G=rVqd&'ɿ>GB"i?k9?X?|<- _?n?ӿB h?*7?5@[i%Bd6|?6ʛA8?@R5@zt]oWHo5a?7Ű=A)z@x@N.Ct«:$a<_^ik?+8u+A\^@IvDl珕W&׽3ٿ>;>@-J?8{_=>2Q|;]B缭??UٿI:.տ|_?WH?ƌ>BvV;]|> ?b<>GIHR>?10?r?%>8#?T>`T?@kz>F?y?,? 0?m@?> xa>ʽ&?eG@ e]?6J?pN==n<8>USO?~Օ?h|>A$L=q?"@26=h*=:>?<McA@0>1nj@iu k>%@LL=/c>9ؽk?]#ɿ@B>=tAh??n?8;?>]_>I?Sk"?`?>+; =!bu>}޶?v?*ό>9I ۾rJ?y@6???+i ?">]>!Lv@":t??~k>b>?l] >p> >u>;e#j>_ =l:5=^=(>?.w{ZW|?/J9?#FNf-e:Ű?" G?rm=ymM>KLBtŃ*NԿ%x?>jcڻ8>kgB(g8jqѿþ$@ ?QFH!]׸??3AHXP0 ">@]8@lunmX~?@๾ B2F n >>[?J;> =p/?- >07Bx1aK 5&.пE?Ga?nþl>UbsBw $kQX&ylv^?E?< ޣ辭M?eB{L^-ﳿ)??2 v1>|j|B|ke@YXEu??[Sϱؠq?K}QB 2B-75p??rͿgO$?-B+?@cF?>4?TX?>žx ?QxvBQb FE?e?JaĿ 5;5?W(@B~3yAFfM2?*?F  ԋ?Gu%BZ8<;|??G9O%3wľf?H2BZ.sn#vľD7??=]-== yH?(oLlBA}]-_Kn(4F?K?s=O־?EAB~_^gy=)9ٿ8?p?]̼ؾJ?;B|ԿJ$bO>Jȧ3Xc`?O~?XI>Fҿ!k?;_Bz5fY>.L=hx%a?$?>颿V?WBt EM,>21) >j ?m>aaf?r<@BjC;?b`?4"D=?ѵ>u n?d`ZBd?Bۿ$J]beI>;;?Y?9B9O^?)h;Bbh?̾/@ÿ=z?p?yq?xiƿ{B_@ u&bSց6h?Y?d ??dCLB_`d?B'v/a=_ Ɇ??QKGG?;0 hB](? L:iKʿ?2?瞿 $5?V]VBXA@ҿ@߾.@ NO??DEL?MRxBTd@<-=3A9ſ,>̄\@ٿ:.?Lb^SBN@kod=aR(X@-'l.=E?G BCw@`m0N,-fC@/lhئ?0 HLjB>@>XJ'(Ծr￳K@:C?/nBE@JE =5! $p;%?uU~=?W޻dlB:t@b9|jS%7Y?Vp><@῔>ɿVkB45@ε$gȶ g'Z6!?b?4˿}>5⳿qɾ H>=?ô?;l>*6B/U@(?2M$ʨ-#cS?`t?=*>'||qcB "An?㭜Ej½ĉ"'0?0>N>KbBA@Gˑe~BS?`E3$=#~> n>?Y?ĿvB8A@hZ%>#>!(6N>?i0?;AHA'Qc@4?WQ?9-fu\P!a?PĿ AA @5W>H6#S?x@,a 3E?A9hA_O@V?្5? ??x^?Wj/ ?࿁O,A7AXa@o@q'Z#>d?"#8?Q:+(.?צARNA +@@yzB&O=v?>~7?n!kxפ=蓶A@?@޼Z>?.X=>)1D3tdkAo]@6d@$@?-=~al>w-I>V[uA @5A2@9Z?db9-"ZDPUU?;ڋáAſ|"?Q@?ཇ7r{W[k ?UA5 \.@K>> Dn 1 >-?AnzDƿ@!?jt'Dÿ=vHO?R?7Ǿ|Aj?@lh>TU^m3u?*+?+(XAu @륑@ol?j=0s >oHV?>!iAT8J@".@y==/R?>dg#g d>?}C$NAs4 y@6O^@,m**?eپr=Yа֮پa>۔Am^45b@v@HA?={?֮?玩V  ? K?&=Adg@-X@9[?*7A U?&M?+97AaEL?Z@p)YJ$ھ^D?e AL!V@_v@FA>/C p?|?b?~ڿwo $=E<Ae?@o.@B?,?>f>cchSɾp7AE/>@o*l@L?R>?;Ҿ̨]>G>9 A0{@r @?샔>3pd>IA?E>Y?$A!sv?M@O@WC?? e=U-p9>-?MHGA#8?@c@k(?_ ?5?˿,KA? Ͽ[> >㽿A i?d@]@zx@V?[d?7>N@qp +>jA?Ộ@@5 6c>/?٣_n%ȖH>}>y]߿}A @@\O@>L?[D? ?=,;ԣ־&U?#>7AB@Gp@v@ -?`h>8v_uVGȾ9n1>,[@潲@M,@@:>p;*kF.xf?3>@%9?@@@\g@S3c"#8þJ>M?ozX@<7@A`@??=&I> >w/3?a%Zw@G?ܡ@[@ >??h>l>^>f4>>T^>,@zg?A@NRg@S">?ҽM>w.>"$T?^?T?=]w>g@?;@@?~3@q.>=Z>NaR ?C@5v?=.@ٴ@k@?D_="\>>Lx>l?F%A™@L?Z@@'??z>>3轑{=3ؿ7<=@G>M@@$n?zM@?E>@?eu]B`@ ? @ @I@}B\> I?Bl?2`6>]>@l>+f@&@Z@ V!Ž P??og5$F#9m݊@TԬ@7@D??7~.#paIC>,pocketsphinx-5prealpha/test/data/tidigits/tidigits.lsn0000664000175000017500000000176112771605033020456 00000000000000one one one (man.ah.111a) one (man.ah.1b) two nine three four zero (man.ah.2934za) three five oh (man.ah.35oa) three oh (man.ah.3oa) four six two five (man.ah.4625a) five eight eight zero zero (man.ah.588zza) six three (man.ah.63a) six oh eight three eight (man.ah.6o838a) seven five nine one three (man.ah.75913a) eight four four oh one (man.ah.844o1a) eight (man.ah.8b) nine (man.ah.9b) oh seven eight nine (man.ah.o789a) zero four five four eight (man.ah.z4548a) zero (man.ah.zb) one (woman.ak.1b) two seven six three one seven oh (woman.ak.276317oa) three three four (woman.ak.334a) three zero three zero nine (woman.ak.3z3z9a) four eight zero six six zero zero (woman.ak.48z66zza) five three two (woman.ak.532a) five zero eight seven four (woman.ak.5z874a) six seven two eight zero (woman.ak.6728za) seven five (woman.ak.75a) eight four nine eight three (woman.ak.84983a) eight (woman.ak.8a) nine nine seven three one (woman.ak.99731a) oh six nine (woman.ak.o69a) oh oh (woman.ak.ooa) zero (woman.ak.za) pocketsphinx-5prealpha/test/data/tidigits/woman.ak.3z3z9a.mfc0000664000175000017500000004032012771605033021356 000000000000003?BH?Jp@t+\>鋾1>0bS8<.Z>ue? X?ٵ#@-X??\>|=]3?*?W?4>Z ?e7?Ρ'F g5?.?H=@?M?c>>x@ {;V@?OT?F;=7=@y˾> ?p>!=n?Mzբ?D>">xI>UA>Y$M6={>=ch??1@Sz-ȓ>R>>@kcۿ?> >>->w=_=W?.>5@C_]?~:.ӼZFx= ?>&zG0a>t>p_->tq@>uǽt7S?5p>s 3> T]=ܲp>=Ѷ>??#Q=5aBN"H?w?X??1?>/?̚?uh?"0-?c0Ip?E=B]d?2?xrp@z?uD?n9?>@?x;]?t>Y>>ܥ1p9пS׿> ?}k>L?`7>U? ?dP?Bz?3O:V=K!(˺?\>vGm>~? >/^?jt=?Eҧ?=IB= ?Э?cʫ??|I+4>eh=?$?V>>@=ӷ>m@Ը?f)뿓e?F/?}s=9=]?{U>>ӣ?iCnO@AH?≯>i? >e)+>>n?>=LTh?=@;c?l>賾ٌ%=ѻ̟~K?.W>?z@θ?[T?>8:;>?i-9>Hi?>cAƿO?g>ɯ!տ4ο$g,*?AR^Ǹl?n">fw7<U=K=]ԡA'F/Q?d@?i͏h?zIa> ҿ>o3>ͧK> 3Ǯy>1>k4pA4Do??>>M> >EKI?g鈿ԽAh$o?D??t? 7>pū>|$X*)?쾸f>+Aevd?.>:?"11!?qZu>+SW?R iAwAd@A@_>/r>QkI-?gDp? J'>8A9>@'ŕZ^*1?*SAi[q@1?? ?6=j?l?O?Ll濆+q.AYy @'D>:M;'??K>ɢ=ڃ>j̅>|[cAČnL@%v?)b :A>D'jmb>Ģ%A⇙?t>͇>K0 6>2_>q"r?+oA.hk@0>?G>Ah. G(a#?'A*sOB%]?x V]=ֿ7!O ƾ]>7#W¦B(SP|?%N)lԿ6C%?uǿ.=%BHL@$ ?quCZ'_%ĿҔ q>b=>󽿝_BVa`?ʜ ݿ| ^c.˓Cٿ cH-&BL?G??hLt >{0c쿝 !B=r+?o?07ɻ.!$E[H[BPC`?<?pH$s eֿڵ%_B[T:Cm\o@RQ;Ȼ /<Ä+Ba? q!@,CLDd=[ӏ<@eGu+PpBdY+? ',?$me(2><㿽#>tBf?~?qN&IG0?W [ݐE~4cBh$?iAJ?$<՝Wʿw>F2" k _ Bj>o>w)$ѿA==V .*-&V'\Bo'>Ѯ2a?i>>[&:?ۿֽ/.Bss'?4]I?:A=H?.ەLPBut:?aGC? <*]2?wBt)N[E>֓>SB>Ni&(5%3]cOBx3,??Azr(9/?^v&)^Bw}Q0)a?_M%2@>:忭==%90ڎBv.ؽ=)+$8$龿{QE龶CH)BwI?,?(JDH<Ęÿ>J= ĿKBtѪ~?Y>hErNZI>zήt wQ3Bq?!6S`T/HȾ j%cHBs@Ba<>ko! _`=iR>ル~bBlJ??;zʹ]92X|E;`(ȿՕu=dʿ-p翚oBh\7@l>=Tlο翝  Bf@>HZtM8r꿮*M忈BcU&@>7V{3UgľܿV连%ᅢHB]u@]|fIW +uRN8PY])WռB_g1@L*?aIk{d'ڿ!֮d"B\>m@q߃?~1ӿ1UuU̿p-BYzO@1ɾ? >*R3J` Pվت[BY~g@-@vW+nHNP]x  BTB.#b1??΍8^UG7Ye"ZRܬBS'@ "@6'޿3nWi.LbH!-?!$BN?*@zDѿ;9Q^οUh$4OL(jBG>B? @ȿ4RHE#a/!39"rԳ 0BDU>A@VF?>P*nd{nF7GB8?*v@TH?K$[+G=>y2ڒqx;/x8B+&i>< @kX?C:aiyeZgֿHK̿8.^BB!u>c@W5?UJvF> Kڮ)%쿷|B?;(@ ?~?_x('>2/~WĿBg*?ĠZ@≨? ==ẫ$ILR>YB[MM@?ӿVіB2zF$ }CZBI=O@^?畿EO}?Xm+p9~ɿ߿|uDA" @ɭ@*$?%\$;dl68]=hBL U@?٦XB'?'zƠ=JB@Æ?'K"`#y^.*dWDB0>*l@:?W g.쿭cZ!/BED@>lj|~,x.!t>,¿/ՁBQMLQ?q>'+_T˿;PDVzDF@=B[T>? ߙyY!Cc85vSbㇿ|q:Bb "2J?g[>_iF>MSv6ȿB-'P#HBbk? =@ȁ AXHTZf俵<~e%ٿABay?q|xu ])fIV;b!>g6Bb>i?U>_>m~濿=ڿ*k ߩBd.0?=t?_|mצ#CJ2Z bP$BbԼWX0nz?)}0(o𠾿V碹BbEп.Q@JvD2j=eS>hyEB_9 ?M`#CLf=> %ɿwv?B`)~?\"?"vt>S`ݜ>5Sb"*ڿWB^?ݺQ)?'ZeS#4X\L %1%EB_`@5q?Q)0Vۜý=`뿱` nASBa@@*VE?,qnn|y\忎l忉 [vy>XBdF@iAB]?1QP?&kNN[>ϼt&BhU!?Ww~?$Ikw zտoɿ P̈́>>NwBkE>Yŷb] 480Q1NU¿m> >YRBp{|s> `]F)?.;lV&9>Ŕ/Bs-,jthO?Dxǿ4jgB=;@=By8"iRY?6(=LAMԿ>-ſ\Bxw rN?]ɿsIOBzwpLݿL"tm_w?B>շR|s9="hB{<0s{R_??%ھˌ49>βQBw41M6U? \ YsrrYh KBzneƠUWP ??9oҿX-D=lvBv[Xh__?Gƿt˭̿Կ:[~Bu%H Zybܮ+?yK(V}?7˿ZBt9!xN7dM1?-O j<7x+K753B7`OvBs$YqF4)?_VA6'Ӕ;Kd!BqQeWI:(y}?Dw4@aNtҠ׿4Bm=-֐>Xl IG"(1CaBeJ= >I\=P]!A=W/)BX*@ -(>TWS1 t#72}BMx@dE]>QWy(B`:v0V 68\BD7l@2@ A?B}hs}ҽ>\ <;B0*@R?4@MθcDζ?PAom=ؿB t?"@s@ ᆓ EȖWAS>΅\#A-Ni>V?UɾJ?ҽf3*>Q??H6? o?e"3οSYGA??AҺVn@[?&A ge?;}6>V*>A>ʚ>,DAϱ??CQ?>[i?VJ>z?W4?T}?/= ?\nAͯJ?? %i?4ϾL,w;? >?cYA#0v@?^ro@1h\7QATiC?h?[->cM]T{>mN>B>y +lG=5BI0>It>8t??$S>,?~;8?9ZL]B+ӯa=$Ӿd39?*?Apy>NQIB*!R?lh@>M2o2ipVLĿ4cr9䛿,BJ@m?|Kp7>n9/h_ܾ: ";{㿠俪;RBVC^@k^;(=밿}N2z[{]_BU^?G@h>Z0Ks nNK?h? @*^")ֿBz>P!;޿ yBE>o@L}*ܐЁu'|K>}tk~BO?@XEaDaH!9g8I?+JBXH?j^k@SS̿!VոϿ%nAvo㿋~` B^Q?Z[@!: 4di="Wj_lo)BbQ?Ji?bھKk>ʿ7R\CiBc$?cWGz@3b? '&NпgBe{?- =?b/hڿ>>ԲվTXBf[?DH?{;=bnlD=ŅAֿǯBh ?)'?ל&̈l濟γ<U'18HBhS=˽~ z?ߔ֘*X 48' CSA83Bjo(X?3ɝwOʿYס=*bCbMbBiHOw?O?owrZ~ > > xQwHBh5?*?Sy-aHg>".>R!@aOcBg~ ?Y?`sn쿸"ӿ(==nI]BfΡޚ@2RW?ENW32㽉}>>>w(ƾ۬$cBeC@Y@}?|ITUKx>%Q ţBb c@H>{ba5v;?;2` :4tBb}@s?цev ē|p4z0nBbf !@-?FM'@FҀ>G=<=BԿdB]M?@*?r0^u#1U; BZb=@cZ>"+u;kLK*0Ar6}RF{1BZƟV@.?XȣP*E)< k罿u6MBX̸@y7?x,H(ۊ=9e##sf h2np%BW]+m@l^?I#ÿB=Ce?tLBT6,u@1'@#s!JV'пX:|BPӹZ@ y@# cD2D9vjioygB5O@@h@o1pBs >#Ґ5<һ_B)? @`?yI_`= GE=NpO B @@U>Y8~PIz˿0*xXB9@@xH@Z?6H(*x#\X¿לB[k9ͿJeBb?@@Cr_?뛿03MHPڌ!蛳f\A;YaP@}.@=>q%9H3ӿnL|V0#A'@]8???Dbuay㨿4gA@[??Z9?Myr8v TAA4+@b.@@0>Jlhؾ@$N9s>^[?AG?@z?rl?ھ.#?ߵM3Sf͂+ٿKBUZ?f!?#]^=BgԿ1>Cݿ&B]E@?nsw) r%@c=[҂> TBaRk @&O?:xNGuP %Kń=tͿXBcΏ*S@14-?<Ĝ^Gտ&+1^hTBc$!@ l?#a-gsɿ,5/(ZnA`}Bcj, t?T? |9[_8^J y M>BcK%n?> @7׽2=>Qj^g@SyQ&k^4?\s]JPYB_ ?R@E _S18 ?R' 2ٿ|PB`*@ѿ @BCfM6;ӿ97?>T? ' pBa@Lm6@!8 >wDpq?)3>N?M1ӄgB`\@Hee?GC쾸p >xVKI?ĮBcr@ ?8/m?rپx?Ga)\?HBd@dH?xZnl>ھ*r>gOH?8_BgB@'g>h2!$"=(>C=e("r>ʃ Bkv@ OqZ>>p^>>-V?byBo`?nu~?n?=}n >g?%̹Bq?ew="t. >~?* 6>􌊿ӀDBr>b\,?wIGf>g>T5|>tnBt8"? [7%ZEbtxh? ?|M3)o?((Bwi> A=iGoM??IͿZW&?6yBw,>S:cU_M E? ~? rn0J?kQBvu@=򼿐7|`>GL>9fI>;vxC '>-:BuD:6==yl]#A<Ԏ>ڿ5b\>$Bs0>|%PLcH>E>- !rS=rgBq?$TmKp>^>U~M h8@Bpf?ۼ~J4֦}? 2?]W<$u>d-Bm?5 _F>>\h㾿ߜ` lg)POBj1?wL_i]LCAw>}>7ٿhSfABi|?_Z?>I.̿ѷ<ʾ%ĿMB]@ ߝ?+տ<>]ܾ]>/"x}ӿ7BQŗ@%O-d@[ $k">s˧Q8nLWB9 !@|H@hZz:⿳R;jݜh>ƨ濉Ŀ}uB3+@*?':@U~(lM3>b?Yt5`B34@x>kX@=lR-ŕ3E>Zz?)B,9B1!@??,@!cWC1`t?ߐ*>}BĿYI>08B+@ا=?<2@YqyhZ' q{yhO>I"?ͿQ(B+ @|t> @:[7ث/?a>d?}sܿngB,@8>v@oA\^'f?n$ iB8y$@/~?e;@,;  'esdi??\}R\BY]@CCkV??~ԿHU!];j a`S#/Blg?q{ &l"3PE?C;&F-־Rƿ>5ҐBxxؿwHm Q<C>mr=Y :Ϳ:=X01 BzI$\tC%դDʿ-BxD&#᩿ m:O-0ͽH_ٽ!AW -BwYx޿Dq? ׾p#&>S^Ͽo<4) Bq_ľGw;>OB Կ,?Vnb_Y !%,ٿ&4Bk5{?o{?>D[L>xj3KF8V<Bi?{4Gpl?{2)㑕?BZ=Kپ\[uy9>jBi?,忯?Fּ2"n7IڪI?&p8g^O=ly,LBm =ߑf? =U]9M绩SnSBnٿ ?C?οHlL͠ODlBpw~?KUE! |~ֿߨi}Braտ uh?t߯sX):5^MNBq827Ӻ6?NڿS;:W,ǿ @KxBqv?<.R N%Gs9ky&W Brx0m?QJ|^C>ſ<_=ʾ Bpgaqҵ5=?$$2,=z,=ƫ%`Nhw~ 3 YBoh/dB|>n8uSN=*T ,$7Z+fvKl=}BphYU?H=㿆w=<(/Q= Juq^BrˎھҾ'{6c >n&=!1͘Q!"v@S0v^Bs $c> ؿQfB\V9>H>A=ĿϾscc"BtS?[>yɿ2>#@_X9vژ@ -BtI_.>0Z?;K>o)Bǿ'K{ QBuveq0>FlFo?]??bC.aG ˘6뿂.wAyBp@jW>ܰ" 0]?JCR, P1wSBlEl>uH xLp?PK05꿯7Z +DBjwe?UaAf>ۻ?hTsB_OzC\VBii14Җ> #> ?t|REAh<,")BgsmPKPh>_?%?t(f׿.ٓK* = LrBdZ 6K>MZ?G?0Կ̿кJ{Bau.?f?B?H,AϿG_D}eB[q0nL?sH( ?˾UȿO.7YvJkuBVvӾ$?(K??̕5yH[nF <*f BO=.^?4h?)~@-TvFMBI?g8%N? ~?΅/V^Gn7ľҼ\gjBB@ >r?|Z?te0[5W22B7@ZG@&DqGDʂOC}#;Sw=B+e@uH@Z^Կkg:&;MqB&0@">~{m@LaIWƿ| &s[߃s8;o֔^aB#Uq@7>a}@Y}T&BG4:BTA+6Bb@?IEv@fE^C;`.;>W>:ɿ\<ײB l@?_+_@<*Gh6iϿ0X;4Z݁E*B@'@_f?3@{GSr0y>K1Z&4eSQB%@ ?^=@8UYKva;䍿rtF+bNyBF@*@,@umҪC.J]+PMB =@ɝ@U9@7KW_Z54i XϜ 5_N?)V0B@@ 2Y@s\&ϿMe8ieY!N~^lAu@:V@<@-cNk$vKjNj$-)1AnI@D@%@P66/~,z/?0v#Au⳾@W'X;uX ⿳)ӿpC^ K>ĿmAxs@ɭ?6>QA¨ !?AJ8?1@뾛y>5?o!])-dcHR?օLA5U>=@?4le>KXSJ2>`M?S"^''A}v/M@O|e 鿑B_*O(<[?rտA>R?gWAԴX?@v->'Q YS;y^׿E=3?>bAyK̰?@d?$b+>e*,M=J@ONK/A}N~>W@eG?i><,>0> h?AŠW'u?@\sۿ<=T˿g d0H?2?KߵAHДyڿ@IecPKIm! ?r?M{1A?F??E@;$Ƶ y$&mNWL?˽XA-<ڻr)@f3 3ľ.ϿG>??J MAPϿ*?@?a>-Ž ?}+4)ۼLf>>A)yB_~A?&@ U!#b"𛏿>w?휼^A~>@2*( !?u$>n?>>? *A jȪ4?@<~?|(>SF@K0>>>>Md?O显}4@7?@.`|> 9;BΎ)F??W[?o>@;9?Z?y)oA8(M>>b쾇և@ =g@-@fi?FX>Ti>2F?qJI>Bh:ͽ?>e @F?.x@'oy@W>{g^>H?w.[?[k>K>>@͋ >5@#s@#BtߙrK}>wz> >=Y?>J@>ja@f@?L$^>p:B)Nɜb_-`]@)g@II@8u@Z?UV?}?͙,Ѿcp@ @L@6?]Qc>\Ͽ#>hlO@߿0l@4X0?պ??d>d>CdbUM?mZ@XͿc@P^>LEvI'=]z¿v@bM\@|@'.?(|> Z$?y缂>$|&@d gW@=@¾y > [K̿I>B>0ؽ2n@Pm|:@U>mK䠿r߽=6>5= ֕tz?zl?>e@PDV&@Aɿ5]d>Tn/Z(1=&Az?F}[-$>"@#re@=_}n@?y+ tϾ>> 3Բ?i@jSrC??qR?i7?WA??=m?0]>Ng)@?1?}?,l>q.>;߾I?[[>>Ȣ1+pocketsphinx-5prealpha/test/data/tidigits/man.ah.35oa.mfc0000664000175000017500000002027012771605033020513 00000000000000-A >H#ud?i?X-`?Ͼ@>o1?$`Ugm@lOA>/>Gb>Ry?=F?t> ?>An?bP62@>?3 Tp(m.>h/UL=3: ?+:Ym@;)?-c$@RRdn>J !<骖8]>">?ka5?lYE@je# :?hY>/þr?=(SPm.?Ψ>}@f)w$?x(7gܿ\տn%:%>)+H@:Pgg?h ?Qҿ癿ɾZJ"[=#}@(1s?&࿿п>,u=D>>f?~>@PQE?z6V>K<?+N>ި><#?\}s?>DN濗#((tʾ;?X>>[>tJ@2$)5?K6Y=j[ke;=o{?q2?C-^?o+=@2bCT?FKT=N>('wC?w*?-Z`>R@zV@=]<ǧS>_E>[ @.c_q?l> ֙ ?U><*N>>>kA;.@ɿ?>^*.%G/? ?@> N"$p@'mdR>> r>%1`S8>?K?< Mݽ$[@h7=@5?7x3PF@ Cf[ ?C~|R@fn)g>2?HNC#(?7??1>ƾ:Y?3@ă13? >E >p11h]=F;?@#?V܎@|z_J?5>}Rs쾽0=w?1>%??Cmʼ@ %??pG,߾l "!>~=Ur$T>q>E5@]*1v?>ϔ!:٣jB >C@a>`|29u= jKS׿~n1/wѾ<;ཌQ?=@,(T="d88?t<,:s4S=禚>}XߧL?@gE+ ɿi ?=XK?=:?v=O?Ui|> > AW?E=>`h ǜ>(\<?@.?0c_9=*Ajh9>ܩn>^?2,~>$=N9>XAϷhjr^ۑd?[78g(?. }?"$vAY?2'?T*V?0Q?gR>ԡk?IV?bJA] w@ ԠHe@-8?7Z?'f&DZȿ&?%%Aߌ)5`?Su-?`fE׾kh?$d?V@rm+?YdA3 @?`%ӾDCĿ#? :A@6 w{?:A8P ?>?f ڣ?LF?Kا>5 ? >?=7A}Qg1@gN?V?,'?3)=ce?rep?S*A>1ArXğ8@\ʿ'N?@ ?2?$/?>cQA}Aɳ@l?EB>6E]?+S?:b?퓾s-Aܲ*> Y>v@;@,(ȿUᆭ:ԾA2=оѾBAd<[A@Q?u@6أ$#;(=굾yv>X=jGB0nZ@iq @IiT4eL> L? g> .B9@fh@$na~wp.F>8DW?/=}B?s@BDVO~@@NlY>茿S[|>t8 ?{_Q'BDL@Y%W@L Hӿo9>u6QE=E8?wrl/BEz@@+>2pX?'?|joX?i=-BE3?̽@]2ѿ )b?X4f@\?}i=VBD?os?Y@V+(L?yψ?g%W%#BC.8>?8~@#8lv6D?8쾿>'>i0?+jD@EB>>(?2@ @+veRx:Q?ݠ%N@y>Ú? 2B;;}?74?A9)Y6n?#N,ڂ>tm?}ZB6sk?l'c@>A<}Pw(?]MWXy?u$B1/a?@*hA+3Wa_?gO=m2!= >>> B#@f@u9@&B @VQ?B @Tm|=9FJS ?MaE1>X>A>ZA)@Rf~?x@LqB"a&+?j Nx?l?nZݽV˯>Ae@!Hw@r]:@@h(ο|n>4k ?x?C4k>,@ACƙ@'2@Ǭ/?>x0t=U0 H?R?1k\?O6JAH>?Q%@WБ?/>H'W>*?k{??,\.>|TA(ƙ [I@KO!?=(DTG>[F?H?!?Ok>vsܽkA$0@ C>aj=?-޾D>ҍO?*>_!A*\?>b?(.?f[?¯>Eʾ%=N<~V1Ab(3O @l?us(1>'?a?弎q&?BLQA)d @=JC?ל69LPB([=s#=hyf_O>]-A4vSZS>M?0aqWfTJ;>b4 $_,>A>d ?{?Hp_[i>k}A?O?t V fh>8AZh@ҿ@!]F?rI$>e^?W*nn@88(}s>cg??2ȹu"/*BUm2@F2E?e!µR?'A?rgG?'X/BWhs@VOi\?^]oS"?#`*??gT׿-nUBY+@ %v %D3?>ھ ?;?>} BX?T(F!7GG?O舿W>n?*x?Q>NBX?J=2ʦ?/ÿ C>Uo?1?-# RBV{=?qT"F?m.CUk?Q>?o5B#WoheBM@`] e=pǾ> > f?:6+BF@->[?C>>x>?Si>nBBd@ſޗ mו?f5P?&Ӡ> B?):0˿(>xB>B@Կ>y"I?s?= ?Ai;0=G<.B@2@8PS '?#B?)?V?${a27=QB<@ho3ۿPLgun;?D?6+?1^?k*0ں>B;6@>^6#>,?oHw?>İ @߈>iB@@rȜG9,2>V??q$>Q쿞>=BA @{@ =2?t(?1>|D8>{]B@3q@ݖr#$g?u6?{>gOտĈ>أB:t@'ͲIR &mv??f>2JzJ5?/wB5@xU<#MI!?Y?}w>=`z1>6B-@vtԿ%G?6?Lӭ?->=$B&W@ _?[IeasϾ>?Y?f򿅓=|rB|B@?AC=+>U ¾6ʿgQʎ??I.Bl\@?*A?9??S]0RKmqz@>^g?C}SAⰶ@ۇ?͓??F(>/oҿG΍??;N4PKAf@Әa@KR?`$?7>BUᄯ?D>δm_1xoA)@z@_?R?l?nx96nET>y4?QϿ /AJl@@U@D>tQV$A8I@Q @@Z,?}߽}ᬿlk?OZBvzBB@.pK?w;=?xtÿ)c\W==ԳX|a>0B4@ޥ«9>r +/kv=D?$N B'L@dHO5վe??9->yB7B@FKRiMmSR??.>%6B=U@V! 6/9q1+y>?G?rfo=;B>@Ņgiu\>=\?'?,FB@@:+^">5. '.l;@@>c@N[aBC@p̃W Uka>P @>s#wxBC|@#pn]մV>=Tkc?@=>lH]BD:F@xT`jns>放 '@è> 㯿δgBGͤ@NCQm?UAR @>dBHp@8<>e6?^ XI I@>SǽBHN1@+n>ޖow?_Y.IS1/Pn@!>Юl "lBE@CQ?>C?y@ e?J+ۿgBD7@CL^?m9S?̾￟$6V6@r?G*jBB@K?%@nx?®| ^m?Ͽ_ly᜿@?_O>l4B<R@?Ɇ &I܇?$ko~Ϋ? )?o>l(B5D@}@S(&C?pM ׿dp??;U?8B0@V@)[#wX?G**v"?E>=?v>B.@?jU?j=iS٫8?L<>s`??-FB,o@92?HQ?>{>m 6?mmX>?>EB#@:-?-{X?'p. 9Ԙ]?b3|*?m>^B"@@w-?w]߽}>t\?9>BA}@Gt%>V>iQt?5Xl@O?BW|A_ @>k˿=w ~LK?. D4*?܅n>7e2AWA$@ĿHy%=ݫ޽t{?Pc/$?z>f8AFA4S@OD#%?puk?1ʿs ?{AfA="@em|?JξD?D;> =qAڞAB @램(`̿?e>/?.TIӋ7=pK.AA. @>y͢>ѿC3,AA@d?{?>ma=#i?e]T?v>r?z!þpįAex@@[?u#??@ʝ?O=$;5&b;1A5]@`@V>?j@ @2?:s8eD萿:fAA1C?0T@RU>r?%v3?g?=:>EpFa6=9?vAV=Kҋ?9忓 @*=<󦻿"HR?%\rv %>%JA-?̾0 pm?m$4b=ͪhTPؾׄf>*8AxTu > ۶?P8TS=<_> k]51DQ<#X>MS@>ÿח1Ӿv?`=B? Ɲ5b>? &@8)ڿM#nѸɾρ>W?`?mwBͬϾw?dԇA$W?L,?)~>4ҽ?p{ѿVU3&A {}`>8"c;[>}۾S>7>/A࿁$>yA/"]5? g[ ?kV>WM[jz@?fXz#L>T&H>I>D1(῍Mo@c|E޾DV ʠo>>=g󡷺 s @XJ?.?Gpv?修=uʻ݉@ w]2_z~'m?P>܉Y\?;L2=޿4)wA x}@?Q?\S=ǎ?p-}>y̯LA ~G?5H_>?F7?Or?1JA_? ?-^9>>ܽR>7>$=68>NY@0 ?P>?/3?r>UZY>/?Kv@yA&*0??۬??i*ҿ?j>h>Ƿa3@ط>3_?V>/>+?W]>? >a>qRP=J>uK2@IV-@0r?_??* P>>==,>Hk5j?3.@m>J?~J;.c"Y ҾU>$?@>]˾X ?Df@=n?rm;>`.VO>P?k?> &ヒk?G@2ʿ`L$?fP?>6=l> ]=scv>Ae@~:?>?Q=F?q?8?%hc*7ž=q@YH@ C?`ؾ>=?!?D>>V>j=4@Y-+u?J2?ý?}^Yn?m8?5W4>I>7S= @J=Ǿ[9jk5~???wFT!|?z@I?j>?1?yQ ?>(>uɾ__Eݾ>M@]^>% ׀>OT?_hP>S#bɿVl.?2=@v>e]fc=w=j>?Yr=^p=:>@t+M>`s >F̿:qK&q?2?4?>ӧ@ؿeT]>(ݽ^8ʖI㔅4t@w=Xspocketsphinx-5prealpha/test/data/tidigits/man.ah.3oa.mfc0000664000175000017500000001406012771605033020426 00000000000000 @$~?m>D?^t 'z?%3?;'?1O%x>@B-?C?,E>>/־5 M(?F)@>b?'0"⿘Չ=X=k=KȌ{x@. ?)>+={G?Z@d?_3=ɤIoVȾp>W?]?>YϿ p@CYym?H?=YGhI>c>͋, = @J ? ?,>J>^?zU w=5? >H,@T :??8!j?QI>V?m(>U7G>^=>[@\QSW?=< >.TJ>m6> * 8=8d>x9>e(@7h?,C?(3.a=&'>v> ?d??"h>'@ E@p=#}q}>-{?|>M Ty=+@,<@H> cF? w(>h??>#=t?Z?"j?`R?p濲p來?$۬.<@?aN>u@F)d?7]j\J =5?G?A?Qi@.:3j?_=E=? q@$?-y?`4\9e>0v@*N?35>9?$N!>u>?/?aؽ\?]X=@A+M>pjݾ%x%_?)>C=??+*?bX>@]^8:?`>x?.n(ʽ}(?7n?aF?p @<m?v?$,;:>?SL?;{,>>;`^>nX@ +9??=࿂.͂?L?/#Cg?i?e=#E?ςo@E=ο!\@'? _?(q?> H>Ǿ1>Wؽ?I@@kd/>ITWn>CQ=w>P> c|>%>"?E@J/???=w8=SQ???b=RiW=PL@:84]?7S?,:?e5bx?PM?N?%>E<]4@5Q}z@4,=G?? ?N`|>{@F=>c>e'> ]꼾1>1>h=9y>hHA'E@ _5@9S=?d{<2c?r{+=?-/A17@Yti{@/,?>T?r6Tq?pTle?aAB`@UAi;@7|Tjƾy>"?5>cN?P?!AP%<@?wRbɴ>&2@cLÿ |c>A05d?M9>}w8"?>?^?85m࿎?A .2>ԃ?ޡb?GLWs?}?tw(Eɒ;?JAc/@bE'?t?$? >{ӿ"x>AhI'@%#xǿ>T>Ą>E?,SQj ACGOC.?81?I@Y??>,X25TRAHd!@T"@}>s??>=?'>wuʿ_MA@~}@(R? ?}v꪿ fi?X6k?B=A'L׿?`?5.TFޢ:m>|V?o>3)8BCA,1׬K@ (<<>˛{J?/c;-B&A1m-j3}v=]|@]=k>e?|9B+A%^O;=7R@ 2Q>>Cy?gdJ_B14$A]=>퍀?/z ?@o=?tމ7{B8@jjC?wm?e9?P_J*?r`_@ mYr@ d?̽>?2ʅU{?W<,-BBU@;v@Iri-n?{>@ϱ??g@jaBF(@W; A @}3DvmE?1CU쯾>\?*GBIA@ ?6I@h[뿱0?y<¾A?,poBKJ?m3 @(ACuJ?;̿(- D*a?'rBL?'@ @ݿMhp@y"E.wG*?4оBN">@HϿ) /[BNr-?u@ r(jY?0 >=d=(V>/BNο>?t@ r2Jz ? >"=ʌ[>ÛqBM7("A?@=7Itjb:?>ts><>>Fӭ`X>+߾}BL뾖i?@:Fc ?#;?`>*>Ͼ[9BN /^>@r_5;`RfT=EBOs>ƾEH@Pb~Lvj"? 0_?m£>G? H>.)dBS?m@W%{MJ>~` ?{>% ?i[>G>0v>܃mBT?b vg?qʿn*VF|AM??O]?I,e?>BR2?4N?y rݴ"] -?n?.&?R4=BN@ 6_Y>C&VTM.?)^?78?bp¡UbBLX@$7}޾Duƿ-Ie7e?R1v??R>mt>vMBI@S.Oedv??@?D=BOZ\BH@# ΘkW ֿ;we>ɜ?e @>>nٿճHwIBJV@9-e޾>8>:?QF>ȉ`BG@eHc\*/"ܷ"/%b?4>K(BB @s7%K!辬(¾D?t?e'X>B>@[M)AP;rU4Z@t?AbSW*BA@_V>­X c$7Kmz e@? 8fdBC@mgHi ֗>kN׾4$GC.S?7?$r(B;k@qBMe7&>tnm D^??DMd"վ B7@\c<1K_>P> ᅨz0R?rU?vlOB9h@wx[?#>BisWj?A?ԶlҾ>r0B[@@sX`V?[%?¿OT?@+B0s[%B"A@+Ct6*P3L?U>4:>G=0.B@&.>8{?Ģ?\=o?XFKbaAZ*@?kk|q@g?F@ 5TK???U?-A@@f}_?>%@M?0g}?U3w=**>AoA>Wo?(Կs?EM>{Y ʾ AhA9h&b#rGĿ{@Tx>O罄].4 `tÓA@ t?Ѥs"=\@?9?.=/7S` Ac@?ˋ"y.C=I>???Q?0M5>?iZ"tA @O>#E#{R>4>@A=I?>>!ξ?'GSA@IHx<2@>8@1>T??Gz4FA^@CC<ם58<^@}??l<迥]h A[?޿φ'́IU???,YN̅:X]+Aax@ H?8ӾN'Z?ὼ ?8K5/u0(A4?<?}?iſǦ;%EG>s@̾/οz-y 8A/>BD4>¿e% [Z?e_/?6Ny=SAA?>1=ecdҿL?3K_>`Mq]Zt>zAM>j?=7.`mX=,j?}C~=g)/,y N_A=E?D> =yU?k?pK>ľ0*>G@$Կ}>˾͇ᚔ%,?7??B[=^m30=CXF@ ?ܕ2lFfEs >N.e{=ǿ忰@fJR??9S]BM> ?A]?.7WTwAU>Jfn>>?㒋?T>þ5[W>A @$?W<վ:.?U$A?s?"T6#>Q@o=A?5JK8jqЂ?"?u?9!>v@ !af>Ds@l׿?~%?#>?> 㽔hȼž:@ʌ8?\M߾ :X=Ƚ=`>@ ?4滩paB??b5>w2/T ?1<>P@: ?=9H=I:?$'ھK>lG־EK!?4`S@j?ʂ;x[=D>z]?j? I>>%riph?8?h@k?|s>>Ś?M@0@׿t=>?8@| ,o0?a'{) A\s?R@ ?=/)>(?@л;?Xվ>g]?VG??ޗo>wՕ=ЩA??J@k7Ȅ$?/>>?n?;O?S->A綾 >@NH=t^mPڿҎ>龖<Ӡ?HeI7??9<>׮@s;9e>{ئ xK>bb=Ɍ>Nh?Ȣ}H>M>ݫ@E8? >K>=݄>E?><۞ܾq;k@gKv?1i:?/i?W?Ze?PF,z>%v@.i@D?cm=7p$|>8{@ {>N>3N@TD?GWȾd=?C?Բ?7- U<25@L3X(!?YOm wG>u3?o?( ?ey>/6%@Z4?8?t +{?[iP?NyY@*@?̿>M??/=?As2O,>񷛾pocketsphinx-5prealpha/test/data/tidigits/woman.ak.5z874a.mfc0000664000175000017500000004303012771605033021256 00000000000000A b"q`?0<D W2 ~d?-?zb3#@z)>?&_*+;s=,'=y?k@՛6N>p?dH@>>n?"h~(۾^?*^>hzF?#M?(?Yc3=s}?s>>1<;zw@?ֱ+~MS? ?g&U F?>?:?%<>->6?> ">/o==?@@>،=?Gk>1B=vL2}C>3d?m?%>1?E 𼃿$*F>.>ҩE>:?a-@ʨpb<'@p??:G?B?/꽃.>V?&NABO8j@A>O1>t?<?i?"5 ?"T?h @}49@m@վFm??˕?`?73̾-@$X@e>ǽX>ugpK?p?q?=\h=>b@ =i?_<>d?aһ?Pܶ>rr=_ pF6?§?Z?==J?>%=ߥ>`>>">D?~t:@ ?> Eo>4&??+?>ּ?s+^>Ш=xm?t?v>?k;;y?UD ?<?>[?ky(@n?(C??;q>?8?T>?V\>>C_s?hS=v龠w ?B?A?>K?Wh?k? P>$F/OhԾ*Ծdp>j?,?^?FK?i>?Ͼ>jԒ8BM??Ԅ??-gX?$ɣ&d(?d>?]J>Փx?f=z>Um?>*A?q? ?K{?=kF?kF?0?I*?5Z?#X?z:>T}7? c>L>0 ?>==>t >[?G>E6?3+?]v=T?juU?I>ԋ=w7b֥?L^ =I>ޤ @X>$d@@>惧@?C/D<\X>??k?nnIA.cG@ @Zl< ?L (?.eA-2? @@9>j Z]?2K I{?BGD?Q{ =ALl2ſxB@b?7r6?Q1P?'b>鿅b]iAcFx?K@cETyk@ R`6%FK=68\־AK|g2+@7^*i?E4>=mGAE*4?9 ?򝿭 ?˒w>P;t?A=15=?C@;<3?li?rG?|}#LAE俷2ӿi?)d=}L>4KR&? ? u>]KAK@x[|+EZ%?rʚ>#?8?,rA]?[ƾ p>p'꿰&|>=ݨ~7@>䵽~`@XV@:?KO?E&}Z?ks!? <-u@#O?n`C>&.?#jpKP@>`S?:E?A I=V~#J翍>? :N{/=Dw\@E]"?lq?5??<?)?Q?r>O$_@,g0jt?lU>ſ9|.o>?d+?,^A?r6>, >k4q^`̞k=⶗N>ց?fZ>о־M??>>62??yk?h?/s?J>_?6?J?gt?"O?3/>@>yQn?:hD>OD[>R>cO?5>>!=>h>?* Z?>R?5J?/!g>?=x3>? =G=?v?? ?!?+X?4 ?ĴQ?Q?$>8A`V*y kq,>$"?:?,=rCSB-p K,w:u43䆚>/i> >ov}>YBghA,.#$\ǿ~ļe>;?+Yg>gI>B<^]ᓺ?V  'Ž3>7>X1=/B6X@H}%W?$P6"T 7Y>tfBb@:¥1:?c*?HP@)1%N0Bs@T ,ۆ?m(LPp49a0[Bz?㠿)?$[?/qz&B1/aDBT>aR&g|?>E %7ֿvBп~9B晿O `?>ȣ)>Sqpǿv%N@>By<^YV?t̾"j?5NP$G:Bc^&S R"T/G="c1V>ǿ=d!r[Btp⿳p??վ"IY?ZYп,3`AGdKBigTW??qڿ#S?6"S2ֿOhCkB`@,x>WܿB;IAr,8B?T *i1!1Q &/xdI(ѠBюFXb辞 =濾=<ʾ^%³ȀM.BeM 9.̼,s$/pn|J\Bzcy;(@t8:9Ә:BB' ӹM="/ᯧ7&0пTZÿ퉞BZ?V2Yr?TRC gB ']>A>yU>@f[FͭBY ڇR׾>Wַ`=<+~矿ꦿB翬#u=>ߔ7 >P]OWZϿ\-B^/-q6>=?kKd.?( -Ϯܿ-aIB3>jxCJĎG'ȝ=B՟?'S/+lsܿr ̿#7~0t+@sVgBd ]Z pdx`>8Q)!mn:slxBBz)B(j`zl )7˻M<IľJIBи+P,AsW҃ =q=d;-K˿}%BEgY& ,4}T[ſ/K=eBR}Bs*=.r7&K=Pǃ9c+Ҿ[bV쿳fvB |`1ۿ^?̿6Z^ŏyB뿈 5=J?Wb$:$q>#翮kwaBehQW=v ?TUW$|_xL"EB~!bsM~@vDѿ`6e- Bzy c|O?牿(뿗G?EL!Z=bBq |HY?a/d⿼UgnE>SpBl_w"hإP??|a~K*5tоBh1v*SlC>ÿϿp7QcU&EB\}g忱mʓ tcu5vzѿqBNυ>b]5?kdBKsǿ:Qd=^ 0qBH[0>?z$?>ypCݿ+<>BfgVBB=?F@i?dTx_kӿaNYB@h?,@$??>s2`˿~]^\ GeB:s?@j:?JWjx S jFfB4O@'!V@]S[=˿ɛCaV=N3B1?R@kt?nJn?> rײ>XWrAܲ*>S>?"4#d?@=Ͼ>A:?Gk?>f='@~W? vqt?HӱA%fq%?e?o{?.i?Es>\?6?9,A\X_@})[?z>CPa?N>㦊>U>0#q>xU?[FB칖@/? lSOn?| ?\k?@ F?'ӉB us@U =ȹ|>?/[G8h1?F `>WB$=@?k6ҽտ́ο SM տGҾB]S{@yO@@Ôg } þ4)&_׿N!QgB\2@O?@&#$> gMu};B[䍿@ @)J-H!IWɾUWasIAB\ ?N@;xϏX;nF\SP8E7B]_ݼ?RF@]?myPI=4k1-NB`׉!?@Kz )P־>MRBb5gi/?_>ֿCABj?a$`hd?X2 鿿оwʾxV>U:PBm `?.:>??p/?O!d2}'DO?+vw=,Bor?pbb?ɖ]/~=IUۀ;a,?}OoBq?a>N:)?wj=9 fz+`\鿟@>3"BtAYZV?Zh[}&E>!t=K0Q[=Bw/l?)G.l\]k?%5T-꿩B;g?ֿ?Bzr>xCo!7.9?H:=;ٿ0]ÎhLB~ݿtي= b_3ir?>moC˿]Mo7mB<}7_4"Gw?7?+bJͿ왿避uGjB,cOj7? >閿,P_W?B: Or*j#eN?g>)?4ֿz,R].UB,)~hsa ?B= )zA鿲HB1t쿜iC?˞=%a]Bt3X-V\n ?=]O@b~%.eB#X_I=z?w>D*p Kwn]BK'qtY}?,x_4*nvRqjBDLLVKey? !c MZ8忕%#B$2_koLaT m?!1>{޿$ʾ4KQB/Or<|x?=MݾӀ5繧(1Bg-*o_c: ?D?$$=q]?7^BOEpQD?W>fg>Fod@' B~ ſjiL|WRJ?;>t~ Zu 3B{jCp4f>TU<"2 |4dg vBxr俚*|r]Slsw=/Fim>H&Z;r .BqyTcRW6uq=w9޾V >,ֿy;?>eCoBe$?q%޿oD @>X?(\<?w B[q?TB+Ia)9gy>?bǕ>6BK@8] 9 iр>C)?T?dl媉> cBf7MCD[4XVa3>>{>ޔe龆qiBU@N3ilyNy?\?ւ?ٿVNT3 ;A@)cMV:)z9@JW@Z@K]J@YR% Aw@n-a? L#W@_@@Ae޽QڝA8e?n6vt&@ @@ @3 %?!<@`?YD>EHTYsP@?@)?->frT2tf[?@̿>2um#. \59@@v@"V?Wu?' |.v!?{ZA @{׿8@ oG>9>?Tl?\> I&V?3mc?Nþh?xUBGgk Oݡ e@Oz0V' տ>B',Mdp^\M @?=(7wt?M3_A>bw]i5‰=2@]@ y??q ?ޚLAiHk" ?E@@@G?$ǣ51:?ϿB5#>;0{ׅ>1?$BtG>m?jP?9mL7uBwQjJmA\U>*? mbgت@8''=jBmn# `^;Y,?g-;|3{'4?sBy@/iWҧ BF*I{P<䰿?L""=aئN=UH-B|۵ e?GߝJ>'Gt"ο!OB8r~H@?'+I9>)?`?CB>-olwxuڮ>Y>꿃^ݿv0B~u/e>`ir>N6.I>鲿o|Ggc8s?ʾRu3L >tEaAvĿ:&EBy/? >ج~i>¸d*g:~M˿Bu^]F?>̨|+YF!>w 轘~$cBp3@ ?b忺r/2>Ck@=='xMBlD@BX?هЗ ɰᔚ%?"9?>BegK@R?L7]\= ?*ս?O?<4B]iRu@@gɅ=$:?x>'?p?S"6BTR@Q?d,V38`><^ʈ?Fv?'*BLo@X@7@SLd.-e >\x??0aJBBus@ @ O} Z )_?->y?.m?_ܿ B3LH.@V@)3 7i?In="q?F?I9B%1?"@rK@/!O2x?ZtY>%? 23B @=g@&@8.^&D#>;JH>W?lڿEAs@.?ɧ@;9ߞ.v0Gk?,#̿OzA@*@2!@ ]>2*s=O蘽#!Y2ʬA&[@0h@,C@ (WbM[< A?>n@#?g頍ӂ^}[7ɿ+lN?,>@>cR>;4~00<=<>؅d?"??G?d@OhS-?%a>jo1a#>"v>o?n?g?3%?Tk@i>?0bD3 !4lV~:#?w ?? Ib>AӽID@=[?Zi>Xd?B9|? y>\~>jA5>@+F?oLɾ,&? r?2>O<>АX??>A{A9?"c!Vi냿 _g¾B;>L]>>!>su >fBww"KB{=ݿ&he2a;, =MB(?.,u࿏`\:M ݭ =A ϲ>'U?΂?y>=$=m%3,F9>KSA' \z?Rt?}?|? `>>됒>3^?hA&|*ګqܾM7>3x ?>5_0S??Y>C?5A4s?4?"tnu?9}>l}?K~>(>,?#$f5+??Kl '>= 6B>A1muq?Wq?M>~?p?L&>35;? w P?B&>ǽ} d?q>Ǔ>?z׿'4?+ǾtrAr?7p8m>/>G/a !?.>n,w>I=B):?Qj??OC;$=-?ſi7.>wMu?Ľ8>EB2mտ@hwg 3iUl#av>Կ}Yo?XBG@C~?*YpPg7HD8sĹξ'6BY~)@0ÿatY6ƶM&42s>CX"yBs->#SqY.? >o'PPhkD۾.Bz"v}_iH澣t?B?0"X(Ԣ>ǘÐپ~WB|oh֠ŴnKjd?DB h.$hRB{Ŀ$S ȿOU% )?VAzaDv*׿cyB} %Kѿt*쿈kq? n>vi*aB|K-NJl k?H mzZ(5(=4B{>jɷ"qWOkZ?/9>,AE^hBzS4~kN4>j>6BUBþ쿜8Bp4?VPGQN]+i= >t>(R E,¿]-BVKB@h|.?j9oI$뵿| >1>6Iay=kB:?ٷ@;j<9Ͽ.:A¿ƾ1F?=@"ҽB.@ T6`@/##=2ē6>fp ? sB&T?޾PI@.<6? r9Ks5i忠|Ŀh;>6ȿB'S?=x@K ?/ֿz-f-ȑzտM!>0pB1e?@\ ?' grӿ5\ ?KgB=@ 꿡@PX;8c뿽lȉd5_Vl>&BF4@69횡@)pl Oh{Fp5ۿ{< );BMe@98n@rl;aLמe6R&W3y[N ҿKBT@;?P!@lCtW{+BX1?/?lM;uh>GqI[4G 1ѼcBV?ocE@r[)MmuY=$oD ׫SdBCo?26>P@'p˿eXcEwD:>V~˯U=B3@~(T?t@y&fAPƯ?Bx>iϿ_4B4@+?@G"SW=?b"?˿`%(B4qm@r?@S)v S-N{?`L?>쿪q(B3 @}%?@ɾy' U?!?>_犿{B1@:0@ @ç ^jlUEV?7>᣿῭B.@rz@i@glܸNڙ?j7ʿB+H@,@&@4=n!*GO?X:|KB'@Dl@H.@ QԿxƿM *?wlJ0YzϿ6ZB"s-@@O_@$@Gnq? T9cBZvAx@|`@dn(_{? (߿4ClɿBlAT@p@Ah;[209<ѩK}j?" z "y%BA'?@G_ӿտ1.Uq 񏿲o0ǿPA@nA@7@?-6ÿ -nh*?zB5S@̑@aC.> Uy-;_,gǿcR›zAɫj@)@>ÿVt5lk>Ͽ@oOA2ĸX "i~a;RbY=U]>R>Ɉ3Ah>~.#q?=?}1?L>࿃Ao>R3q&vFg4?4?]z"@?ƍ(_A} 7#侅,?\0U?@2? zBA 3.9 N{m?w?BU@?g=ݯ9A6$ n=;Iy@9=?|@G4[?ӎؿdAL Jl $)F=kY)?BY?Х?",7jAI{^H^ ?g>)&Fھch>$oAv. >lAv\f%?ԼY>\TMq 1HB+HWNE,?k/f SW>z(ռϟ B1@?p"R@H?ɬ ?}J*ȿ(Jz{:.B;j@q_e?] iʓw>pƿGOfWBE@Y´SS#P? a L+df?[WTg BF&@xxƟ1?c@RGi=[F>tOBF0@B ?Ῠ+];*hD>z}fBE܇@>2?lNmRw~\~Î? [BB)@?t"6?FܿUs!bݵ==a=>v4VB>|A?[~N>tܿMнj>]>)tB:Aj@xe>P'Tmc>3[>[ B7A ;@S5^=^ѿhn?h=φھB3A0@náS0ĖQyQݿ=>1۾B/@AZ@tM(PҦ> gB,_Ar@~#F-ydy%ˑ?%ν }B)ҪA @5j嫿SS<;J]>1WJ L? ЀB&ZA">@k,Vbly+=?] %B%x|A)@oqX`#]׿9/StN>9K>rZ 'xB%A)+@rweb5@4T)Y? hVPߒB*A"o@6f&G2cȷWjOʓ>>8MB05A"@kȄ> ?"A?4>@>%!+B8!AnM?|m<?ۿ5*~ O4=F+?h~;ABMq(@g?^w;g1ۮBI?'FBS}V@ :n\?kmB Y%>]c!B>()ƒgBY#@kӯ6],}?zF"g-R?(TjB\@[ u=!h}or܍? o^޿NոvB]3@p`ɿȗ7R@g4%!?0޽ +ÿ{B[AF@'aѭX#S~L7>$$.ꞿBRZB[@ϸjP**>⚝5?dE=t=VTBY'@ ox$_r(r"1uBWr@`,;@5wt?u?.x@TͽLYBVT@xsՃ@4-?AJ?8'[wؿx!BVx{@0@DrX?\e?z迆 2 zoNBSv@A΍F@E C>?xPq}W?BȰBQ@-W@``Z>?ŷ L`BBNŞ@|B@u>z?W1Nv*nBM@e&`Vq@>?e8.84IfbBL@WL/B@D>O?p??# *é42BG@Q9@q?>>73~BB@˃꒏>J?-þȹJ/:(B=o@p.̠>sx &?⾺? Ѻ忬B3!@ >%>{s?ڐ ?\\?DB;LPn"K#y~Ŀ-%B=~@KA?ԁt!O$%p?tо\?^)' Qh˿OBC@-X4@\?fs?([>zQ!% FS꿋zBxj@SX@\*@g}9@atE(<˿ Y0~1bX߿d;B&?'p}@:@ucM`%%a>Af2Ta@Q?i]N:>˼o$$oڱ6>`AY@M@6>$=И>ś?rZ!yN1djEg>E"AʷYLFg>Ag[r?uy? ??=}9w?L>A+W? ?̑?oͿBA>*7?X>'_>!Au*ztêM?:>սW >+#ܭq>=A0C XL? 1#K?GE,y[*֤eD/>5?oA*;%??]Suy>801׮㔹?:LAtpq5>?cC?I|g(M:޿̙X?J?NQD;ֽ~$ؼ?ś?/AX.r@H?N?< /Ͼxڿ`ʊɍ?^C#CFAg8 ?7?uzT?3>* m> jb?>8A@aE@h?y>?J:pq>+%>WW?EIsA4%s]C@{l9?{xR>lP?h8iyv>Q>4AB=׿1p@S?6F嶾 S|]Xd[Cn<ҏ?'=A<5?@GH@;|@5?ݾu[UW,ʺ?? A)v<@p@ N>i>si?>C8,?@?\A,?]9?%H@oH?/> >ՙ>CZA5?<ѿaL=N>9A? 6$]@RY@4B>>,S>koJ?L?xA ?ekc?T@1??Y:>@[m>ۚ>5@ʿE@$?p)3=$%LIb>bLF>?ga?X0AeP>8?j@s@B?懽i>zm{ܘd?L >Ț> X- A_VK>?F@=A?]?`^?"S?7>vy>$>7><V@ J?uF>_\6??.ϵ> f>>&8?oG@m1:z?dc?;f7f>Ǐh?yJ>E?8K@*Z?Bx?@m5> j<ء>?%Gl#>@{¿>d?O?=bSb?+Mt֠m>D5˽|@4'@tb@KG$@mu?>mcW??` > q=k>OK"@࿩h@O|@ ?b?e?2A=iY>?>[@bIi?@N?֓u<O?X?)u??K>K)@?5ڿ??>>@*@W@U@!Z?b>p>*?:rb'D>w>C@9@??& {?kt?߾&H\?Q?`zpocketsphinx-5prealpha/test/data/tidigits/test-tidigits-simple.match0000664000175000017500000000231212771605033023213 00000000000000one one one (man.ah.111a -22042) one (man.ah.1b -15261) two nine three four zero (man.ah.2934za -29271) three five oh (man.ah.35oa -20757) three oh (man.ah.3oa -15441) four six two five (man.ah.4625a -26494) five eight eight zero zero (man.ah.588zza -26930) six three (man.ah.63a -18121) six oh eight three eight (man.ah.6o838a -28095) seven five nine one three (man.ah.75913a -35654) eight four four oh one (man.ah.844o1a -27667) eight (man.ah.8b -17265) nine (man.ah.9b -14165) oh seven eight nine (man.ah.o789a -23931) zero four five four eight (man.ah.z4548a -31298) zero (man.ah.zb -16153) one (woman.ak.1b -17649) two seven six three one seven oh (woman.ak.276317oa -47026) three three four (woman.ak.334a -26853) three zero three zero nine (woman.ak.3z3z9a -35400) four eight zero six six zero zero (woman.ak.48z66zza -47568) five three two (woman.ak.532a -27690) five zero eight seven four (woman.ak.5z874a -35162) six seven two eight zero (woman.ak.6728za -36725) seven five (woman.ak.75a -22737) eight four nine eight three (woman.ak.84983a -37907) eight (woman.ak.8a -16000) nine nine seven three one (woman.ak.99731a -33245) oh six nine (woman.ak.o69a -30350) oh oh (woman.ak.ooa -20281) zero (woman.ak.za -17031) pocketsphinx-5prealpha/test/data/tidigits/woman.ak.1b.mfc0000664000175000017500000001601412771605033020620 00000000000000?V>eN?5:?H>?@A?Þ/>y bq!>~{?vo?hE?Q>=(>i*>U?>|,t?D ?S{ ?>m?J?l?8pF_?O>>^=W?">öPBΒ>zNbTr>&?v͊> =q{ |?mbT?@06+ò>{U??L>lUP>e>M>v)?M>s=)e?/{?'>?K* >k޿-c>\[=?d&>ɿ^;l7>{r=?FV? _i?%UJKI#sƿ<9`>D>>>D>r=? uEW E>B>ǯ*>}x)?@R?֭?oE?qL>F־}A{<1>f;uP)>˴Y>>6>3T(=? =>Z<Pa?k b?YK= Fs{?+wd?'?V"V=Ql?}?:1?N?qc> >[?:'u?>>q?Bo>?P8??YO?>>Xw<1?=׽bke&>]>:>?A?/?Q?q?sJ>tRze?[P> ?qҿPЦ=нy)?j=/1>5i?Z>;w?B)na/>0??8 I"?QM?p?Z?:P>I䋾??O??z >Ε>}6?" @?X1>?>a%]? N<9]?>lpgt?Q얐?e)>0CΤоq=Q>?[f?;?>.P?=R| ?$?Z>v=>~bľ:>qg??3X?(B>Oؿ`%?d8?P? ?>r>gy2?O>4.!O:?(B$?NB>Ǧ> E^?(K#?]?&>H?~f?SI?c?h>h>s?|?{c>b?X0>z9 [ }UB?T>%?N,?p?W>6?a?u?H>?qb? z=lI>N=X!?HSQ?s=*?vE>: m?r}?/>uߤ@D Wb˾ؓ??OA~5>? >`#V1PAQp8|>MK>#zMRѾx>ϻ3>-0+뾜oA` ?K?|5)Z8rΊ͟NX6>(A=#uO@t8@E޶{A&O%ƿ Ŀ/Q=" ?YA4FC>(?g&٬Ǿef=h}?=ɢAai?g.G@,e*-<= rfe?aG>C@{S??4??n/=7H?%>a?'~ S@ $??? I׾=7?Svuq&d=@ ׵?ư ? Ŀҿ>t?)[ { =%? u"Y?C???@Lɾp??0Z>?>-H?4?ě+|??yr?eer>k>:?̧ń,?n쿤?>&?i@l> +[!?-==E=@mZ>?H>P?(?%>LV=4>Z?꿛C!u8 m>6@q/?h?hqO9>>ʹy>c7ʿPp=N@2?䑪=5>_+nj7!Nx$->ɽ!JTdA?@ ^Xg:`7ZVgP yh8R/A7@a@ ?}^>-.̿%ǾePC=HZD Arg?>?𑼒p=#>@վɲ) 5& ? -2ZiA6F?">?,E < D޿&? ?)A5_?G\?O?_p0I'fBS? <3˿VAx!8>8R9r $5ˈ<8 lJAFK?(Ƭxv@@>߿H=i AT>4@L? I>ǿJla>ܿ?>zB@ΕO@l\a4׿9qj0^3Aj!ǿpB$HA?k[u @Taf H;ȿB/A.Y?O쿹-PA>]?h=?M__G(pB?OAp^w/ Pʞ)>Uzrް?-]`!^9 zBD>A⿟` *?P̿J>2wE׾Nc#BKAkfu>?hk?'7+I8hN `țCzBVg@إ6$2q(bt?ӻn'q B_rV@G\}9kt~?koM? ?u"`B Bjp@b=1?c?1P TflgQrEZBj@dksN?oթm#,o>}r.Bn-@;A{F&?&,[m⫿c߿Re)Bt @ [IMR?/1ٿ Dz{Bu[?>GS2< ?ӺjԿ/{VДUBw?-0Jl?E8ӿ75ꞿKXBwh?SÝ@HDoR?1I*fB)6Xȹ?BxƗ>K07)>'6& XZ-B{,qbx?0/qBT>q~b( Uv%T_B}Ͽr0;gԿnSԿG5OUBE& 1ĺR^۰5пр< P*0k%BzCDӎGc\,jJH+X7B+h+d[߿Dc=IKBTG8B*}G+w栾lY.jD_c4F9v}Bh7kb'q ]#r忤f4#B][Rgj65>hdVu'ժď? 3BPJFh 1͉V?7̼!%8w%Bu3T\>?`v p2;OSB}1ÿ )?LhZ7FƿWHͿӿgB|sj=Fg2FgjV?1^B(!閩mj㿭/BvLiv?Ru3!?qn '_= U &bBsƕE]9֛!}0?WMgb܆$O%Bn v8f d@Z]WFDCUBeI#c266?ѸD'Ԫ)eK(B\mviO,wHH?#l ͎; s %v]BI=s>>?=@ e,3)?2j7g"Eo|wuB8 @? @Yr sKUkķ٬dSB5z@%Tq?}@zx+PKX+"%FK_B2i@A?6@O_!( tL#q͓h"pB9B1@<?)@k6(B<[V'oB.d5@9?Ć@y6e}A%F-s (t"ȿ8B)@8G?<@OֿwN63X44ׂB%&@??)e@vKaSg>06aAuCBZ@xi?"@ogAy6B!#^$KZ8B #sdB @w@:@yRNm/JڿnCM޿ai6~JޜQBn@@@UW 1ֿ*دKeͿc~rB@)n@8@rwq-O8< 1S(kB @@5k@YUzf{ K2ݧ6qW>BW{@n@D@@j9dߪyVˋO+Rwҥ_̀AoVl6L?j@ǚpllghaWHT>(ﶾArC?@y̿>=ѿ_OS>?OZ?l>AoY ?-E@;l?s2}E ?c?>%|Aa(?ڿ@c 6OV=Lh=vUZU?C? AN ,?R@'Rѿ>g>9j>2?g=?ARMp~@Ƥ>?Gejt,?mh?Q ADO>v@eFvMMr?Ί>q.3?iL>sozA;iG?@;:s>򦞿ֽňK>^~?A.hA2LY?8@mȿA ?C:H>Ro>c=u>l6?&2EA NI/X>!@OI?`>?ICV0%?{,AOcQ? @`?|?|Q>M.>4">T`<̛=g+X;A hD?e@W??{Z&uE4 ȿT>A5I;8@AF?6l?h.>fPFVqX?8?@ ?;@T??P?:aBj=>)> ?@G@?@5h=v cnؿ|?.= @Gz@;d@/Z=m(uTQj1h>l>zQ=^{u@V@A??OUˆq?p{e>)q@¿Sf??~.?{> =5Tr;*A7K>2=G>I@ #?)H@"]?N>-> U{;"4CY?"l@qv@1 ?L?>>P[>44?1k? >@YK z@,??/+j!,+?9Q>Y?,ĽA'-(?ZS@ٿWV>'WEyX>~P> A?#_*AOg@@>_S??>6,>cj?cS$~?J S[>>^@??(?WvKU?4>?o>?,>q?F @kMu?ϋ?.?#HS71??=@ Ƞ>&=>_i ?-a@!`y @m< ?tЩ?XY>I?!e?B)?^=[>r4@*?@?D?W8>>%>4 ?+pwr>pX=D@L+ 2\?ѵ?4??Y!-?J?g?mK=???潝8@xń*??O?-%>+?>?;Sh?w>潺1@'DM?Z:?+@?e( ?4C?,B?X>esd>?^}?0@a~?/?L? J,8?av=?e?*?Ahu?Fp@.H@/6sJ(CL?87?t?ݸ; Y?j>F?Nt?&>t?$*?"?&>G վ@n$qz?du?@?}?1?aQ6?ߒ̵>8?>P{rpocketsphinx-5prealpha/test/data/tidigits/man.ah.8b.mfc0000664000175000017500000001446412771605033020265 00000000000000L@M??>E%z2Zg=? ?[=`>=> ?@ ?壶?=f?`> $JHK=B?&پF# jP=PV@6dR??R,XпAT?C? >?=h>d8@A4qC?UR׾״?0VR?a?ɲ>@`?2>?Z=z1 @i>ِ?o=2{X>ē79>k>f8>@l)+?L>Fz>DE^Y2=1;>,~z˯>7@ba6>sQa(Y>Bk)+> ?>ism>M[@D8,M!@ (?gܾ|㛿 L>>G@Ke>QOm@b &?fޡ?Y{>7㿆d:V>>CK1g>0:.@^ԨF?y?n9 r &[>d&F>,= B@xsMJU|9CdN?&m^?u\%o@7z'?_$=>89ej[%~ >9u3>"XQ_1;@46? 憎*~C2Pܾl=w==@]Uu(?@ tZ>ſ?f>['>y٦ӗ@J_=? Q6<%NҾ>սo?S@:1H?zP/\;-?&@W_z>aP>b> >i?O'>۵?bG@F#Q>/FZL?.s=>?b>>Ҩ?9k@t*R?gE\(ucо_? >>@|d(v@ ]v>6-ek5?kH>pm; l @ lG>DH õ> AQ@n-Q?TS6H>i @FP.*\@0?׍dw^Z¾=bAv)@x2ؽ@?#R?0Ͳ,I^VӿL}:>Bw>$¼˧@te@ĿV?e1Օ>lqh>J\=>?!>Y Y>@2AvzXY俗c΂t=F>bC>j#?>ŋ8>?A.e7_~; }>8J>"?G99@,:?~{>AL !soC;?Xǿ߲ej= ko@$ ?vfA1mdA^']ҖzINb>>'X>ԀA.⟾jEI?%>#p@,B?QF?Ax<ϿÓnK?޸Q?Cx? cZĿdK?G@ok.?x?d?eP@$Uj@Kc򍾫;Wd?z{4E?оk@udqSo?>Hn;K&(>k ׅ?>b@=t#x;@j6l?5: ٿI=ao=><䂾 ?N=w$-2@">h?TKs?/oѿ>bM? u?=L>?g2H?Z>>WRվ"<>l#M>$w)g>?ϕu?M^?D鿨2.T>IH?>LI>>KB?ʕ?&Koo 伈Z??>G$ >+?fU<@b*8?9? WӐ??o?c>LLK?`@BO:?#ABA?0 z;%?!? >?3 O@?d 뿊T>bs?c#?"@? >v=3E(@@uLv?]5yK6m??L>%}? F<@T)K?i?&T6}ׯ>5?A?zV>R@B?o@>6/k?C>l?iH>Ǩ/?OfV@͡N:?'>6?P?A.྆?,BNKAźr@ f>BĿS&tŸ,?[k??4>kk>]߿BfA8j@@M?>G ?!r˽r>C?<%HA$,@q@zљNyd?T?->5 QA?>s"8Pf=i$Bn?x?@u  ^?!?\?Wm?gϋb%?z.FB)`??3@A~קCoƿT?g>+?&>޾>8%ØB6ݗ?R@@,W_[r:0?d?c> ^>ᢿE$BB> |@=@ez3\x}ֿv?)?SK?Rz=_>Di>B7 <̱v@@6sn^uq%?0;>?'>S> ȾMBA% e@&@Ds2ZT=1_>_?>x>ӾB?C>@@4Y)[>> M?.=#r?TW4B8汾Z@A@@FQQz?ʷp?o>l>ݥhB7Q~@z@Ko"G$]>>$Q?`Fr>Y>L) ? B1b@)(@lDޱ'=?z>S>?i>TB1 @Sm@xWg}`)3@y`???N^?;dB7Z@@Z@̑<ϭ Ϳ3W?A??#9fB(=z2k@Ks@Ok>ܿ=Uyοz>?n('6?o?Ô!=.B(BOw@N@HT}l>S?>ŸOg;^6B!~5@ʝ@vsdU0$0P>W>;>#̿a{Bſ{@u@?k\a;mgAy?$=`-8=[ܻ:B =@֌x@a) UyNFw ?b?ND8?6Bod'@ˢ@'3o$9>=A^=*>+B R_>@`\A YQ&Tz ++Y2?S1X 1AȦӿ(@}@GMɽ0 >vW?3h?=fuA1H?@@tD?5>wK?055P龠xC+4"@O?AY@|@ C??y?4,[M>W] >vt@~@7q?>Ʋ>? ?6H>D>N>[tYZ@|??e?H>b>Z>E=x?@C;ISO@g)4?K?06?G>K=jr=P'? sX%c-@zФDŽ?8?$=x4m?g=ȈL?]%KO?9C4y@7y 0W@4ȿ?`[/>?Tۼ-v>b"@"kc@C?~ԽtQ=ng?4`Q>8A?+@0>@Z=@+?+}D>qu?1?25l 7])\3ALd@>:>T>:H>?1eh>k?k>U> "!B ,/ڿa.8f@iGN>3-O> ;A7@%OGV?Lw? دD;bq?X5OB X@O룿ED8cf?}y2%a?U?W]Atg4ʁ?A@Ek & ޾@B5>aWH?6~@ ?~Q=Az󟻿-e@QLʍ^տ{C ? h >l>fA>[e?ReDԏ*@hS+Wh?>A@?l@/?Bz?vY@RK?Gƾ=?>3 AAx?@Tx?k?*@?* y.?9>vA3W?@|?ac1wrj?k?eH%?Y)>?A_?%@ @=g흃G@ ]?]osF?Y(ZAT@DV@Կ*o?K_pAxq@T?@s?0[ {?ϰ?ՑGS>8=cA??{@[@n e@f??z@@?<■;>jξAߠ<&j#@)?Ⱦ#_>?*c@X@5*Jk ?HA'l?}@?k?--#?(X?a?p R?("RPA,@0@F@x@ ձ?;?q>V,{̝H.׿>AU ?}^@N@i@1?h<>]>P̙Խ?G>bAu^?p@C@@-@QQ?`??,{H>,(ņ[@ݞ޾ |@G?,?h:?a?摿 㻿/1?A9?2@&|O?C,Ѿ?k]>Y}K?2o>%>FP?H@֏?@E??k?=?Ó?d/ξZs>k>4@+>2&@rd?@?D+>[?yg ?gVh߿C1)q@zJ@Vz>,?G=3?P?Ko?1@W@%?@J?l?n?Q ?%?(U>ѾKl <@RA`@'F?(6??UG? /]7>0>w.<3Ӹ@\4+@v?x >h>ߤ?S >i>a_,3þ?3@=X?>V?d[?> L?n@ɾV@,>?ˊ?xH3?*Wn'>rf?jt@?*lY?$;W['?!*='>?v>#ܑ@/2ݱ>l>J;_??9=?V}$Ge< >L@kտ?>T>Կy?܅?gg?\;?0qx=u>`@7@5 m!`Ҹ#??6/` >O>PJ= %@ꏿ̝?ag?> C/9?Չ?e=;:W50[@#@$9>J>-=F?x?,+?==NK] @cl?+>+N? @ ~?o{vc?7@& D?`3*?#*^. cWZ> >R>iTy@*?s`?^?El3[`>( ?›?hx?#Eh@5??oj?BA96>æ>*{>?lj?#> F@vv4s(6fk2ֿ?1a?"?#=Y@s)J*?F& 3#'??Hxmg>]n@1^?A&O c}Fx`o>=J?f>b>MU>b?+pocketsphinx-5prealpha/test/data/librivox/0000775000175000017500000000000012771610005016204 500000000000000pocketsphinx-5prealpha/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.wav0000664000175000017500000057215412771605033026340 00000000000000RIFFdWAVEfmt >}data@"uqor}b[npR<9AJWfyvZQVccYdnfdig\QMPY?#8I@-(:D>67JOL[`SMI6Cb_PG?9<COaU=7)"$"16.57>NOL`wr_^rxlaV^ggjfadl[HWZbqztpyqlzxz}{zoo }w  '.!#*,24/!$ ($!/90,:B4("xdgWQWmudhpigqS?UdlkfrsgjndUM. '$'3*"(,0*/BE3  "  &# &-<AHGRV8/2;>?KT[SHJRNIDHVhnozqxvwzs~~t}q|faac^\d`U[`kwzyqlv{~yj]`rlRME:8/<KDIGGXPUounSYgZda[XLRTMQ^aWNSOQq~|{x~~lns^ $)  {pro{qo{}pyzlinlaZ^gf`cadona`gggvws{~kgpqjZWejpn\QRTCF^VP`lmq  $# ""/# %)&"  *&#wsqvpq~{haaecVj~iWS]gaG5>HD89M[SNPRVSOSO=8?ADA8@H884.CKSgttjo}uhlia^PEA::5:;(%$'>C<EMN<2EC3<Y]V]]XSLGN=8OQ^[J[nwwyvnqkmwlhmsz}~z{|vnyy}zzw~xtrp`|xkuog__hd^X]aKA>IYULBJ[[bp{zjhh_YYbjbTMKJLIGOWQG@GQPMTK4112, 5CHLRRJC5@TUVVUPFFHFQSKE,"(+:A@DI\a<9T\a\YZRFHTJ;?E@99@IF>;4:BACFKSQBK[CEeih_[hrqoqpkwlNhw`akxpmxvyvzz|{ty|yumr}|z~}lndHIEINVd[^ijfhqoWCNTMORUULMZcTKKGGEEIIK?4ERNL]g[X\drlXT\XHCMOKJ71NUMS\^\_gzvt|{}}qeivnb_akYBFKRU\qz}~z|~~uu{nhfcbY[aUEBCFHHKOQKHIULIXQJMXN8=9*+)'&"&'-3=F>8:4*/6/*%   &$(.-%$635=64@F:)&('!#)09*%97?GM_cPDX^^]V\RLSJDB?5+@E=FP[YU^ecgn||ZSbdkogp}qaj~y~|~s{vliqgabSSVQYpzyyrorsY;>?117.&5DDH?7A9;A:@GIMD:@A<458%%& '&  )!("-,$  "   &(+" '%&%&#""*"$<3*72'0<>6/:B759EC<DRjpiflvyighISikytedhkf]_ddK>GHQPUssisyssqkg`[]\YXXNKSFHUA652DY_]feZUST_V82/*!(00*$&#"-+*)## #")&+-'-0+48::8FJQ_g`_svjnmlm^SeeT[ZVRE@JRTTOYel{~s}~wrotfY^Xj_GMUSFHahVGKTI0,4- svumhu}~$'!)%!")25/0?9*.046?IGKQRMCPZM>=PSHIR`ZMOLU]U_srcaq|xyz~zozqv|{uqtyzpvwqpttumW\R:D=-77'(.-#  #&&<-+-*$twqbkvvx|yu}~rbRIUp}xzwfmrux~   -.?OIJJHM5!(,@G8CE?g|umvnOLT`]iur}po|wquA$IM{krVdnY{|@Ngqxiece\;PhfL;TgZ:18'$ $LH,!Eqv}yjX?3*''&ASB"3\D/BAHdx^8>K: 3<6d|ICvgCFRZL&7N6#atjleWz^Tm0.8:E>1)Ol[4 6;[# $e` }hmxa?5bm`$$}Z]Y3W`!   Q6Dl0eDvYxn bSi1TxBTO}Nla o sN_co4\$F]&EEDv?\ln u{=N;A>{a_z\X9 ppz-EcyNf"*:sWSxI,DL:} Wmc>E ',;mD<f1>R!i|}M`WC199=4 q uH2nC9u:Fz.H;"hM}*raxA}(nJpS/lehqV]emx\ uMZc](YN !X#1'%{^I!2[4\4(_$Z32VzTGp-Qq.bz:vB LXhl,<L|ReqA{X>Zb.|We5 ^=<\k2?I4jeoT|^%clS\2m0#S:We3ujovtx fXwFBfr6w_ :h6f_b#oVc_W+#d";|nRNq=x@y/ Jr-^Eot mLeEXf 3ub= Z!AR   8P'U!p'soKA_fX*N%|7U#rw2D@$I6h=D~% bdqr,_0GDG%zVHM_!7mO}yzvgMW`=Tv*YK77zrj5nt>p'^3 L,389I|: !u1BcB^ L @"|L e>.VM QKTM<1dnA 3j}xJ6,< j. 5Y_p~QBjji+Xcl[ui*xF b9 u9v <'l4+ : x 7 # [!7~OS)y ]X/X]xMn-I"hIAl)..m_SSR2qL7-I]TKeQiU`c%C@YzP9Z?"a%VM06>x!w5Jmx# > 3  ?  { f-[ 0 fjz + b  W C)Tt+(*@W{h-s~K}1Z(TF# ;z~Ty7>;b{(_tnA:WDN4y;!l)wd3N}RO1QE39T{{CMWhA|`k%  h 1`   )Rf   SMtXQ00 4 N G :s^nE|8tV_ @ =zd0Crk*8b^Tv'j[ rD'?k@o1S Z5#-x} 2NQ_ 7 3 x ;\bqlh & Y FZs<|یo%m[7 X% wx4M" WmP4jpqn . 0 l 5 jbA)7=%+(B~;4+[":=e=uK09LKe9v[m%kT*?ZiOr0UEYeS@M1i 8 \  7  H & JBshf k^) U9E $ ?$Y@F-(T <  $+||e%x  [ Ls$Sm{U r}!TU:87bJd C[q'z*PE{pHzeU1{Td;zX-|T2d'm{@VE \<Q*& S= *H a lTXpM5[ %,4U v m ^"_ 8^PI P,=  x [ 0rb]vt*2k0G}]3H8, ULE8U)BdE)qU 80hNdh|DJp"^W ,W>F% ` DT 5 VWvU 4~4)0JRe :q'v)"5sdAr-v0#Y^ZH\u]?D@R-VpvH %=i4|?+$Q[B];6$40';zZa_/znYTl88ncP* -  @tmQa  p Q t  #  f K4{O;o\ W  zdOSSv) y5saKS V$BJ3&rG;oBtQiO@UP *hS8* C'H88?867RNk S w ] V w   dd?,1( .   Pq3pQ(NRfE'(j 7   O P3!X:5EjYu @ _  q> " xYZ%GZsole I?oW| ^]i@skzR*M[ITN,!Mj]P5>n< `N x 9sP<X2slze^ lwvxiaq}JEh % s *~af9aXcVO~c TIw{ jD{v=WHNa"Y+\f]znEP}p =lzx3xLc%e ! ? 5  5 B AV':I x( .Ho5,g=si 2 Q_'c2lf#VL!8b<Dm_fgbo,5ssqt\&  ? cZT N 38?U9s$>M@ T?_ t ^hKD#D[i)^hl0&r 7d=Je:Em$#ZJz H n J<&(hk]M (ub9RmJ Q, 7 1 7 P+ > f  /(e;olvQQ(w(FX; lR7}dk;?IFwOM@g }Lpj:`'<+ L5+Z6>b R $ + 9{d MH_ STe5z,;iQK$Y- vSoQSo ,(W,U.8IvmFq0`J{Deiitps"Sv$%Q,T Hmwl A_?]"a` cl(e K7zN7k   ; U G * I & 6   ))^"F.;7Xm'/[-0uLu|h#_GK6|WfjO;L:n~0g~@ `4lGgA$u5jaQK>!%-W'xMQXeGce7h/dY4rn[]> f  "L>,ky[l0\]p ^ xb $\yY8o]?u)z\ wBM>.+LQR)LV3%o i "+ Lh1h~KbPG<=40X5 , c(0 E @#L <%)w)%MTO()dku* J vT +! y7C Ay ' ` b b^"^ {E3gI. F $  Z X  ,2pN\] a{H$n8.tQ^)f=wxRHH<Wa    m G H +d"*S/*7!U &''X(%SW!>}+^Ch(D@`999 X#r + r [74 _ +ER#7j { j/fg3;bZ#_eK|v@%A,z. %WS /Om!""7i^s 4,|La;W t : O u #T:,f (e+/ pZ]aN C?  j/,4q 8u>\ cn/1PL!=FvTk-&`cNLM oH*y Z )}>a}P F  V f ?- ! 7]5!"Y-w'ߛx!O`z`Klw .G lxmE.04EG p$am ' cXBg,5` B H zI  k 'lC7~+(  F `]n~0t pm|1zx#^3 ^Wr q [LU#;v Qt 4  !!SOiT >&\xyM PKautG_ DV /p #] ^I#iw   ?5!%`W[XX!}L1A?@'+-Ql"hP_ ~ y , " te1DOn "U BZS e H x2XC 8 uW; Tla u C0}L@!P8Q#(`.8vP%pB'|\]4J z &W|o<E_PIUS0z.nT0 kZ ~ 8@`a:(Sn d) Ws ]&`4)wzlM R{ @ "Ttb.V3\2u m>5X>y S0$&L f(S jG  I|T8 #K##KM% Y W'[8   4<^pDv8(}~N2WDPUQsy ! +sV+ Dz=pA|STk }g Ezy0k#lvG *P=L6dWV 3{M rETZM{OM~^a4 };h.g] jBt h N/?R\ai a `p v G / >' _+cc& X^Kk ]d-@%Vu ;\*=C2l{_( ~  f n"T8%eVI #p"E?o)! > N[+/ >1$ T8zWt-6IKjI\ I  r g9OqbE> 5s2| qU 9Mg;5,tkR[w=|yW X@x{i=[S)4J4 F#"A{W)ejL8rbA v5D N?Z  f N+o(x[h%  U]f==NvBQ\z{sp-X^Tw ^Ex @-&qLZa  EyX$B 0" $$ !}oyEj6q] ~  EA ,}QBLW2 | 4 fY dl~#~#=V3K(~X@> vP= [5  C ZcEJt") , - d  rqM?yG20DK~dn^oO(#TLu:xb|G \> O  P4=w3 *!X,&/{ z oBB 3l 1 #S)B  \ Vx1li:6`+Q! R{  }{8EXU.\b Bi;D<.X?\mJW'bili~f Ty_{sIo 6{o n3 QB%  / 'X  p-G Xc(nGiMu8  6 *O  va~q|vy5p G2 X] TF|+= Xl5"L)JU,h\S 0 ?.q >1 Kjb #v{6D"W,6B *L{R"yqG 1wS!"UCe&bk~ r [TYd)h=$[XZk%KNqty=6~I9iT&m7 C 'Bc!\""S#"- D& V c``Bc!Z6}UGX"~a ; $C$ + c`o0v i Xts$BT|[]Via / j QAB|Krv+fdbM~P"[8Bh< j z}tA;we>S %@qMsL V3@@npp s `/ % .j_$}ESfq[,sa4}(;lQ9bqY6dQ0_2v)94ar!R&(]~D)iF!Oh?R2uS0 )74dQ|d]~0R9F1m LOQh .  = r'T G2&N# C3~nB^"8>% !6s2 6PRj 9}Xh :m$u:/cyKH_r_`,M'jd*"?Da>:LMgP; eA3M ]v"J>?ve$cE4 e':"|:Ce H`R=} i<'8WfDFg=.iZy a_s1 X44nwthET>]#cT(o#pU!!*z}Qu3188 [{6\DOGE',1V]9l< Ulfdp}b6>K$"Q]4Av il<GG6;T GbJFO-v=;8i#lH 1 * O{x.6z[?: .C.^ to]xl$cl?d("4; [  m m]J}9^9*(oo9-7y 8C&4$wB*9z<W6GBP F![7f #Q$#;%&t#! ^ {"#"!g"s;U GBw~ZW` #!x -m+DMqg " L\ x    cl|1"UYcT|Sh_0"!= m kluO!!X!!"V+#z$\"'-d\_KdNOQ BMy 6,Y"ufS8Z? & -%E pTK?lIs 8Pg(S t:p$t kx];GSEQq<d A r Oc "%()N)'G$%'C(# /t,qp8@"n&%!$ ! nw[-wnlL+ 2!X   <%d>1gl^\*vabeij[fO>2;K~E br:(   Z e 9 t `!"#4$" !Q%&" Ao;0 L[zPu#^ V +=b=Fj#d` K} Op*5Tj/q+-0h`6dq0 [ Dr,Ae5yy/ x_q/k&VMsYz0azu{G+4`oL= 1 A ? = U!~4uX| ~cTX4g%x 4^fq`3(F%zHx>2 _tX'%<q^Ow}m/`v.[F0C%ZP90f}Ib"lx!?~XKs"nUCmi W ~ s ) H  o ; ` bB|7<@kbpUHQCE9Hgo IOTgczX% 29xFEA^ DK9BjQXk5L`j$_N;s= T b c `%9Iz9K a /~jUw-47L"_*R"#_v J~ ~+'&Zo&'54q  o d?*+Cx DXwQ c %gaZ  g | G q &Ze~ { Z } L{E-1"H1 Hfv($KtnCQ O\Qu /(TTM(sEL>'N{(\%(KM}&c/:ImYztg7Oiem5[4g)@Gknp  ; B T [HMz` : 7 b }prct=@lF*#V!kpI{ jxfWO? p!KXr=DHTvx"7e|#cfJoz$}'9>+t'2U|@OEXWB O 1 C & PDVs B E 3 k!Iv0 ;bAK /$-v_RK>DF~zT/ JUl>>()TR_=Hl:UeXs~:3RJ LdVP6)74H7Y|L  s !L]mzmI)+R$ `?x-aUNH8954:${^Uq-: iGsWNZ" !R~Ih~d1YQ$^]=WOT{txPG I [ \ v   *_yT   A@'}8bx#<3 s j  c T)t|b$Va-@N%_bq{Z^##|3T-ypPsr&} 5uVz]N6 V #MzH[y=4N~  f}3R6.. $ &L ^ nE*Xw0j`im]= .F4B0lWy1c N6cLCX~&u$fz[ Z LC:YX[)$-m/2J !e$D`Nv T ?P*J_$ S1D_ KAHP1} $rG+\B1xRkMbzCUO9 C6jf|/ f f2 *%"(&E{Sk ygS|.D" 5.A .IcZ)IIqA]8r.7xA 3 rt_0fwMd=h #UwtUY,_a vZ!G1_<h | ( M M3[/`` $z 6P M)g| c=/U -.yLCyE!LRgUKiCA $ n Y BV!vN>aThD_IUn CnL F$K B^YlTY : 8 ^ $ ?m._rj -_ | {W22y o>; _b FL5fD g uKR >[lEUI1'|lEPt[/9D39B R 6  ` #~/due { 'LATcf! f !]A h<@zNL ] a :m^ w56}3q+A4>]cQM.9G6)9o 29(Ugarj+ 5Wٛڥݚ"<#" +t6{B-]3i eKGIi c  LsIJ|w"t5+@p \J.cnO7D2urG3o l + r7G@pzQKE alFn]  %9JbI! @V!@##T#"!"  o8&2'Xe6h54 e [aU s jm7mDnB]4.j:l`>ml>8.BA^9MRVV ! o D 3 d !"#$$$#{"* Zz@ٿ KA :":'(C(e'S%!i Wc=bP$&K]V =+ 8tK`9;<5"`rHIL{*>-Ww1V  5 _ !s"""q"! H w s־Ӓӷֹl9! !%N('$I!X?` q>p W*uu#\Y Hh) gD$v:WPT:*ahW E~ :?xA'-we r ~A"8   - wCWm!`#%>&&e''C'&[%#! y01֨سs Du"&)&#R RhA GU1/2,I6\VlK x"xP9 /&ETH:n4USW,O<~JV;"Z `Euz-oaR Z Tb9$7I  2 mo,Z&5Q [xu`e4dcQ9u$#INY$41KFd  wq{ #!!Q"""""v"V!<cWݙvsՊ;xB"$$" S)b%C{{b0?* ,3)n0X 9Up9I%PNQmi+{%c+NL)-IWf%;. _"wk `!\5Rw :{@,o@,P] z=m.n]JVB^ )E"2>% s 4 ]ykqD'I%YUEyQ{cg~ ') s]kF,+h _"={T }Zq *nlf3h8f+zr<" cS=LnAIh1EFPbhE[[Tn  kk</$dB.@ O>,Sٚڤޅ ( FZIz Y{ U0A`YA][ = l OVyL K)ZrNv * o va~O1=}.}uvgV? ?@fT'5A ? Q M3;/j W^pJm :vuIwqwX?n f o _ > oY|)6<H  9 :K>l%2WCN6j (q*&pjmyF'u|#B8< /+ a it{5/p1-~:   pz F *  i %  6 p2 pS0HO..(n{2J t  V ))=cTM3BIyr=i 0j1o$'Lw#2zV8( |  @ l%zKOW\K  k@iO890 aL ?^czlHNR8f N$F f](.~J3<9xNARn$ Gakrpa{sdidXkXNAO >D\`;OsTs; B h K H ` S ~ j L GA.eXC:5AXg` }&jm%dOWGPXb_PLt$V`K5BHDF}achC* O eBgYb's/pyxVT 4}w<R)/n-o\[0t~HDBg.z=a?HLT. , < X9GA kF;IYN"GS5[gv)g\_&hrhC+fMs %H0k"dKRU6: "^+Yid6/@Fd6yd=' r:`:&U){L7iHT`?6yubUzA$JXZ;5BUdp||]31 NBI!aM]pN S a !  L<A X[53sT!X0dh[-4s.I @["QAFy JuGvxPp"SS JhAp"`*c*Jb*k6W,*:So>j8 s0 8<auhcfQ8m'<@*8g1u~pS:$ K_v|6 'p}cJP= )1J[xn) 3:/iz>+W7P xS NoDY8 ;j("G4?\z Kk^pM2PD5gs\+#Ta]oh+/Xx^%'KpX @H@9#zIW~X?>IwRi80f(/[uvg5  8+ 9zwq|fPznKCH8%-HC 6\NVYM[`slYknY9We.!('^T"/OR><Utx`b|vT9!#0{pck]LPUN_X77*'>U^juA+(#2F?76CYlf-#'%2317;-HLXhXM\ztgrg!RzM9P3&&.,UjkKN~VYjcJLz[HJSkgISxYZziXoaI90470(?^bUY[(#H=9e~cRgmso/ Rb1KAM%E`Omb- jJQCtUQ_`]Tq?MC!;G3vtW}$/T_J~ndcigD^Kj  ;bQ8: ^   . Z 7Vk$tt4lC+xL(RH*RX0IwP.\ h "E?.v  .X'[$SX+* g`q1\;nd%.,G-%k\E u/<anWC b P g'f,%~  #otCs ]@frY.82JoUC)w9K\!z@+tFP)Q=K7-UMu(#QWB9"0udeYTW 2 ) {  8l9!!m[M\TqV)sH]I=0b>HWN)l!ztXxo3,-.0^i+h$[r@  & a| i [ 7R>a_!):2`<|}G\?y%wG_gZuR $' aDWsk&AG ".}eE^U#-sQD +Ug . %> PD[ $Q6  Lm!/ 7:>;|HEbO{>[Rb ?mMYoj9xM(&$ t:{otm89QUp9w*C- f: ( S ] ( I E   C   D?,GwavxE >9oKx)}(~BT.?KV_r;!GyZI_AEI9+B`[ Oy i [` {  ~ a& ` 9  i]Tsw:oBn|W<"D=&S;wa;{AHd="(k85c} -]&:k:w^|dfn4"c7 N <  T q, &l -WP'^&7VF)I{<\AYIr{Q;'6 `XZ _,Hi,cF%wi Ak - "   D;>a0ZMOQ , =]3GfR*PGd\zMh6)-He:k#)IWPwT;GJR{jwana^T A ~@-z:} | O CYl)H0p Ml".-N<@;llA +Hr yxN>u }+, xA/dPr?YrG~ nWJ;6!>IUE'xv!sVGB*Lk\pDiz8#Z_ } r =uS6L_'  8 No9*l5Hj*xeIc&IN9BojcU'/$.` KzT[JftD} ?Xb0:G.o#  T 6 #sPeWmAs6 #`=KtK5Ap\l4a)ui%"Y:-FF ^ 8 } . + + Y ` I [Sc7CcfZZ#s4nl{]7C]6!W5~Km_>o36[ <  J f T 3 C  L |U0BAY.(]eEnV'sq7o9ko>tp99]p, V ?u@p3~-VD@c&M   +  B  B aUiFX(VH=YJV  (x?|cF@(#y" U y  z o @ E [^rv.7hZK! `(Ja)?nlj!aT C4lz;Nc"|4` = S m B  _wDf&e/df1\Wh"h+|ybnkx'4;9lZr9,*%kGRl p c v LA`Y $   {&kd(q{l3wB2Z lw4B7PMy6!jKw6bj?3uwz7 # u ju(j'q#+ w  $}y:NKE i,,>6`Py c|8;n}-*M(mw@UIw  ` -~PR{=Pqd% ax`/Hksxg 1&x=D' wmrofZ|,RD T'07CZ*K? }V;wQT'bN@,I S 5/wYL7 = /-f|t ABC_Fh2 RcE[[1'% WYSE`^"Am> N]l{[lCN E^dd>PKlA4= ,0__vk'\,O,#?9LVBzSsIw`-+H6I20KlD-}{U h e m}}SM#"Aq G 8 0*m1)X@R{[A  p 2 [  Jd+cJB]Vj NMUm/~tc;J d*2B]QG8.-/%$}T> 5!C!o!"#$I%!N=& h8r0j@^n &!j " x E~#PJ(5^}PxF6/1*'J-U9bN0(T^S x ^:k G  M cl%$("D!!R$$ > k< 7PUb^ s  W [ Q2C 7;(,!1FmW|]$\|&v=0Y"Okm bWb! ol6RM:_x [{!">$&' (M%]!! #"C+ 6M3msd<.L3pj /PAz\,FAx*UOx`r8   ` ~ v~khq7hW(XATB .Wl ~xTU) -J_S3%/"Hr' x h $ldC)B}{6$ H B-1z3d i {   WrsE%aJQJ=S, xe.%&@ oW{~f6m'4h{Nk X.tHM8,L8#~T4 `r|vZe9 6 |  ` 7   3  `   F twCZQ|#gkLD@kM"KhSFjkex]NMQa{:pd|zDp,oM$\yCnFtWh~i|0w2FhED7k ;o-{A"s >e'Z|+Lk 8M_p|eD S4"Nw `|/d6 !]$L}D*Hm'8. '=B401, ~_7eR/nNAZm ,Lp&Fi1HWi<{M|c <n':QUTVjn=d @@<.}qFnYFBKH;87>M[Yc0vEcw]8:D1 }O* c=Un>2'3;BX~.a-v5_bu%"6gO=Ux&))I_o+=DPj}{|ta? |96{DsvvT J$ >apl]ktdD.3D4w_:c'u5 urM 5Tk+M?s%2$,Rk`t )W (>_%V}Bl 7TQ3-B>!,% j;xUG@/]=&nI4/7C<01@JNWo (DRA,([[??D7[Hr[Q0f94>H CoFJC{9QKQ":,)T #j Q2^ah/D<5@?0]A(wjOFv7C%AR]Co/ f`vWK@1i7#e"cU}F+ @uOv=ykn) yyn@^`#9K]SrWz~p J & 0  w D28 S5EU6DB"=!k3bygpUw,@ V"`RI&%wa^TsHWtYH9$:n5q 9/{[JXnG1M8A@\;. [ _  ~  K nruCdGXB*Gg B/s2C*E~V E i / lTW:K\ Ux DHE@AV ]"CD`)Ta{ B JKtR];Z%Da eH'm*V.+?c # !0|`#UNYR  ,.z32tL 9^3  @h/3qZ@| t#cN&# 0Jt2FQ|,_ndq k = j}O8m Gyo^HA\ %;Z"}aCB3# 5 QyTK!W i2 ޅ۞Aޗ~ R0 CX 8 8=yn+l@'n[G  AXh 7 +cT*I0 LbKgNP/I(FNx1bP+[bAD`vqw\>o7Q E 2@j'C/i/ + P߿ޱey(O ?  r&0;&h?+U"7fI C"e{&ON c~z*"b\*|o"}s ;a7}q I-*f<0.|] N [ " L-3* v+, ({Sl5z0K l DT\ A |W&unD K] prL )e.9Xw|cx+[+tARQ9p~0j 8#`tt&c|n b 1 u C  Z < $gY v.8 6Ej'f\'su Cp6  e5>QExirr'*\ 4c4Mo:   t W,V0zU#+/hl%d&%'V(,DHbNc YU\UbjBU r r T ' 12Hj)M{8  ;KxFk |~Okvk:5 \ J9M:F~~ mn6 PC NFE|@@`ZA[Bm2=qkAt6(A^ >jVo;t  ] ! `]MM`i!n!1{2 erdU-Z KF D)04hzR9|u UU\=^W  "F5} Pi^H4zMmS(I{6=^fC@$Z1v2U"N-[H  3 t0wse%q\ IeTWG  5G`*kc ,snW `Vo  <?s VX}FNKdFCJP OU |jm^)E`kY:OCr$<} B 2`-lHJd9YU`E 1Ux:(.h,Y* = ^{}7<' /Hc.=~ $I!t: J F{| , i u Cc0muR`-dPj+akW4 t2%q|O&Q2F t M  u z A k,GtZ]F R}#nyN &2' @  _ d`geCAB`M & DNj'!m#GWn $O |SMF 3GGmuF,17,8&t}$Alx"Q[>4q0JXG  " ` 9 noW " 2 =2N9:pddQ{.l8pAs7P*`k) RIG&uWc<S:VScZ_=6I%Sf}wrkP00Iu^od(k|R&>C6@S{OH a >t({. t # T D ' OIRk)%]0d)"MzsuT^Cdwm6}Es"h*Qd4]Xe QYIvoV -B>Sy~{'FBDBc* #OhbnB`p }Q WTYUe & C w  ) F r h L O T U r o l Z ] e Sfq]lT*T3Tl<3-)/0/$%Uh`-tA*{ k#F~W2v +5ig *&dBee//q HF K c q 7 & D T;H92XfCZF9}V~CT>Q /IC9TYiYv\o<F>I:^ =y t7g+T!w04XB]uw{9`{gbw}6'()O:adS9% J Y w 8H+  P g 5 ERN}>< 7-<elYp%FDXtq'?U1X,Og]r~ -^?#$@_u,=~}vcA}q _Ag 191dw\^u.;{i  x1%M@2"tF * NxNH &S: E v { 6 g ]C137Dl#yT7|G;-Rv_3D$%/A=9hvrnDqx0m]4ti~E% z 8 P*bt:^6H w ;K,w20"QwoR a9~6FBr Y-3C,5xA87l<$Kz O |#p $hl2߿j4<(ljAFp|=yMMbNRMt 3 $~)T"#u$G%%%%g#wGm jRea:lC֓ؽܒ~/,@K;a!!m9 B XeGx 1w X&, b1q )`$P݌ڴر0#}7-o9q~,tPhW7>B ` #]%')*d+Q,,,d+&)& R r/j~a%@ J!%+'&%Z$! j1:C+X+dt "##!OB7$xfh6xպ՗p&}e!n[7-V!2e67p } -*e&!#%'l* ,,--F..$.,(!$w cR ϑkn%̣* "#](,-,t)$I V `mfLXtܮ(.܂N x!p&''W'$".(`ܩnU5\a4rX&8x g? C4 ~"cK" &*d.H246887#74o0*RڿBˆт//La ;%G*-].B,o(C$O E (#>MP=ط`yO"g%&$} 4G ۷CdTrv)NrP5 bZux% 8 w!z'-38g;=^?> =9}4,-n"qPY dE#6~&+N.300-r(2"x ' WI="W}U> $)r+h)%\N(=:6/9%>ڒZ2TOf̌_'"+0a2|1/n,v&H@C wMk:]_ٕ ؋2߼&+-L.+%N[OZl;`ќdgܾc@ m3Amwi2pI@ = 4  6&,1@6.:<==;60&DQC'4cbx E(03N430+$c 1'WدmVܮ02)0330Z)]D^ Мmd؇ހVms*;Le$5 ;Cg~*i$Y)-2-8Ϯt n!"!   Zq9Hv%z~Di\M}cn 1n9!"M$%D'())O(&$ fkS+QG%V5 { pWg N e # N d  ,?_pMot?H:mw@,=[HH4R | OXnBP>)R{w@74z vNSOP  | " |  j i 4E^GYh-f$T t?fZDB>-"R.h,Hn @l A {   mT7 n % j  u {O]:)\-1 ` mWBt9 {>^K"kDC60} r~@-=tU7dK ? ! v ' l E 8 a >w~IpU55$/|L<b_[~s"[w >#ZA_ >l@))7x,F{(A 7 S W " y q e n V!2&H O EQY, ^asi*x>KbnArVLQSfCPA](j\ t ' s , .   9  ; &I 2Q\Rp Bo8SJP_,onWIQ\1+~`* y!=<>(k*{,]nY8iGV`{l h$\QKF$%Jw C+9z&fb! I + l x 1 ~ p : Y F  [8j\5Vr32g'0$%$NC/PJosl-Vo5J 2OVw3=]Iv3wJy^v s q e `   I 5@ifn+-Is pX169X'^I5''.WUv0>9/YIaLIaOLp[:3*Vr q  : 8-@ %  R C81SpvdzcFmWHb#Gb8/['0R qIyTa - k  I ,C)RW~,L9A+<f]IxUl] > /^]^a;0N\#kNT_0"n~h  G]xJR[-S:m ~oOt|Dt_Pb`t= ) [ smir5CMc B~7MQ\3z\)t""J i ! ;x  3+n5 ? j c_v? 1 B  7x W P @f5Q \K 6 .nx+TdV'XE S#_EQ[nMrx&AVIA+N } + w_,NB't2 |/xvuXG)\ +&b9=5uU8<%  ,x~eL D~'i %K\YbCBG?<`K{&x <"BIc867 )B35a n c 1z o ~ ?~zq(uT +XnQ_c   %oMt8;MJVq7,*A`jsY" 3'H9+pMk sp#t N'D2JY2l`y[~)x0rb8!  # O [ ?/Z_7Xr*E4]!Ow W = !  QQ., +:}`9)8rh0@/B0c+T@oz9zc[w^^>BS {;{k8h'`x o+DQ1Ai<<_.3fl o0 f ^ 8%0 }:k{~?yI|iSC &JZMa.c 6b&v1V)W H^g`T<le:Ymic>R O3a|R DfK84{Z[BL\1S"G'[sSEn|CAr} BnLMORrd\Ey; Y+NS]|r-Y$Qha>#wpE /QjmR$)PC'I ; Dp`#cWg&*N>)g2 :E/a%Q KIB{:L|3?zVe>N{<|9n@9qj ~V=?~fIRcaYRFFf]FfzV>HlDJmwcy+f$V G6^W(?l/ c-B*>(. ZUF?rE7cu, s  \ ` ) T 2F6t#ZW,"T]x^b=,,\|cs^DSBCLGOs=f^d=xq~X&%e/@"\H#3 MhH '9=BHCLb>k(` SrMA[;T WI5Gx L  : Sr<X+PYv-1Gb_W_>5]ynJ;Qmm`z]@>5)K ,2iK3/ /WW30<*.(Y@PQ2 X6rc4g=j ]U_4Tkb|D^N5^?t+~3l D a  X_!=Cv3i!W5OC CK%WsotpP0CK{  a %WvH\^fa i @L|w'x;mxa2'GZ5;p&Wv?oWU40@[ ; k ~  I EV[b$Iw j.b;/TSNJTT@@F,1`T0'1912GD"& *Lt(RSf 48:@HG-3=w,f$m@_"d$_A:A? "514Vnm,JrSHh= k f F9s%]Dd <h& 7 / !   dl cn\?e+{osn}ygy6bt,7+8H(uG/i> o%i+Z&i@XLSB:ERf\GT[k{Rz!`YJ=p+o0D{.f M G~u]B(kBvKH@`((3F^fepu]IT\\RRsyaV]ily  .<Sy1M_tjIb@$vr`,^D==QS>+*Nops9]sS7%obQ+~-i"]:QXU[y-c1s)^C]Df,\[w-EGd /9R|nk_OH-  oVID'sVP>x[9{VJD0 +>[\m :g C\z.XE|!En>Qd(mjP k*KHjF;=*->#"  ~|PhQjwZ9$ W'/.YCQ^uydQPZciV'E]!LHg~>=@X{\ ^I8-@#sucyY}8h9,K;Ay=K="7g)&EqXid32XVf6WV$p*YKUUx2o(}\ 'mx?H3u9e0wO\3}7$4+byzJb%Ij}uTO|HY9 AclP#jBU(p P(=X_wD3K|E= cX`( Zl4j_vFm%9"'8QOC. 0hxlgT8=+|qc=pgE#,;&/1P5;WwV`_xW0sX\r'*  &*2ZK(%h. eQxI#} 3&w hZOZ;M>9cK8x"6]QL,lzivV\DY F~] Z m?SYQ%jtJSuXo^w)'.yHC0tC=eaNCr,TzS)' zgFk[k oh2A+ZB n Jyc2z/hld\]@AA!]h'Ftn  zSsT#[AkieQ[ }7v \"n 2 7 R n \  CZ`qMnhD>Wz]IwFc'Uc|nK.);bdaF $Cd[_IgIjZ"Mh50*p f v c "   G  ,+xf :  I \d . /A&,yd ^ztF "}'3d=K!*"]psCWHq`lBJV  T 8 _ ;44tiivTi$OHb|B/yj[J^ o9_~*y>nQRuZl]^=EB4y!7zU eKQ&  XNO9,r.:d& 6  N  UVH+$asz30YQH@ ;4D{c?z+2UHos@' d >rLj6JD C\gN P{F!2l6 t&p[T  1 7 *Z uF=f5jR!)w$c}#Yd0m|09Ml1N#1H%@K+_s11 ]|\ puMK rVcB&8ari  Z m * *  ">>T YeYVgSJa@-y6n 6_a>b^8|A> cT~. jn nS&b5~ }Mb:s c L  K 5 cN,\#]-S)Lz8I^0dfvGF7~P^@:BCB D&QR#U '5_L]lV  kT oe"a/}c]{*Gc i 53/ z-/t,~Y:ox:@xc@>#J Bw$2Q ( 5 0)c3D I ,85-"UtcA(* X ! I p XaM]c"EqE7ii GkCz eM5 kt"r}/:yn I Sgy-nt3V r ]EXK5UFY*oa^\  /&pq|@h.QS;]@ |>P0)jvX>6w;omW+t0Mi   c<P-Z < * nEh-Mf7ZvfIp:H]8B2>;K8P>$a5L5"',aliu2L 0IG|(}+ UT 7E2nwi@.@C ; 3  | i 6 K B : Z d ! IR fw'1" R 9m)C)cC ol7)s/w[%X4'$6NKX$Tq~U1z0IWw ]a ` R  r X % s < [ (TzP8esG=^TxS"@oF1kG#-j>I1Y"wM`:`uxS(_P=' W%oiIgdwycixJ0! :[Ub\ z^/JOs  c w 3 Ngr\qOLv_[r :]ubOG>4"\9nB% ~}~0e|4X02IZUW{*J`aFq!xlkdK:,pQC+i9 }V* %+0:7/5B31l]}xTH+Q`;$fD<_LJ:6*V'[ r & X . w  m zOv=$uP$3IYmcG"=b5IwQ Uta#C|)IT6F^>- 1Yw6%$1`%TgB0ZRQqoL'Hc a R % D j + R ze }gcT.]!LSL0`&-cXa6J)_ @\ zz)k76hoOtT)jzp^ Y < P $i~ x5 CATQNl*j n 3h;\E]N Qs vUTF(:D~pta mh<sx9tF _nV @|s4Zx[9T ` F, 5e3L`2~.y~ VHZ{ 0 vBa\ ;8 [/pWsMHB0Qlv/LcmKb!ay\9]Uh!r | }w}[ 35aj R h}' :l(~y` 'y~`C 9t//~`u 9pP9%  K ZGER:Bv"  Av[2'z;.  Hn\,Q4#59,bA[@bHg[g)zb :Dje|u x  zN4i0// na1jC(6  )PuVKBFi _y 'yn ]oEe]%-MnoX"Ekij } V Z}J_! Rm! = pfW  8D Jc:@pV<D|D@D0ic*M=Gm5YfsO%[}Qj:WC M `q 4yf1h N(,tWQt}XW .[ !  *  G9_W -.WMdmmM::.(XYu'Z!\K{ F : Z ;LlM@cpc+ 4 DTP c**; H 2',)[Ma+! [cFHBj:AeM+[$rta Z{hL D , QA=~ f cL{P{~xsrlW5kyIJe?9R:'Fi yjOb%YR^JB~  jEe0-  E .iI Nj`Av epn_hc:)DpPmFr)Y4O;fHIp#'e 1/"A c`y\    $ MK4)y 3 _ RA =C{$ETI F|);4Z+$ s ouea[*iJ_^K^LSN 1{`Nbu#~B4X6*OPO}Ny;GQ~D;GZ f ud]Z6q$fwV9P!RlGctZA6l3{|KG/4TA|E$:;6MQ!pX5/9i~]%u0wz ~ILEX+72X}.-Fx"]E}*`]1 4&5L71,i%V [bEeAv0,As,MR=t^~} EHi>"2'C!+JzlT\p A?W}_ZR0@ >~Bqw++%iN: 00w`;c5FcZ~fayc\61gIYFP&[Bs/uzIh h ;p \zo|,l+A2NZyPXH} mrtMb/~Z Ny :[B|s>@It[pw:FlM8 g w ^ V t R b ` ] n  Y V  { ';gK/_(OAT[*c: tl(m6%j 9 \0IJCgxO:= -)ek:G 5  oO{   RK?Y  O9$` ]\)%p\Y*twe$8r=-O{v=YDl$5l!\T;%+L9? M 9 / ! P:F}s?aNk R \tq=&deFcm(((8{a:F^|wh$% I_* -y{5_,)18]yL[r Q C wd yH   GWwg{U Q|*XG a TfExPdFKw%synyL Z 6  [. :MmX.{J i (  u}miK\<! gvaDwBH/K;N{Z.V,_'N]J7$ n9EpN2 '0C&n!n  * X ^OY5 %  .~|EKEkK@} ] LH7zvNOPP[kO[ LG6z$g$)}Xj]a] #Hjv*9X{S 0 T  'E ;X\# A ~F~>7   > M$h.8W-  ' N %7Nji?rF |#`>lf5\w\S~%FSbKiJ/< Z uga>Y q2 BSnL;|xU d wA $F Z 5q XyHJ"#&ZN6Uk}Eal=Kq3"   d+YJ#V l,Dgg4Z 0 xo PX XiylVT)o  {F6=0vnH*vJK.!x=pN&EGceE2 > U  $}.IEhX&H*!ThN  3 ?  IIaV Ve{ y h 5 @kN,R[?CoY44%5sP|IHm "hVS_bbS} h?'gX =lL TZj] 3 N@V!l6l V  { t "2u"pd}Y!{GcP=?W?Z4`#g4$xpDL1 s  .e'| F| j,/ E  u  (+G=[Q2U+fwPTOfYzW0|%9*F30J?ik887`-H` / M Vj:1jIj 1  t'V6V@5<AL rx])W 4ptHUo p,<?qYX`w]s__xPn]UbKF\Z ,  7 P z  2 y r l=Qq 5( [6'FR'faK:w*6:kU,=~:8r=%WG)% ~{o|<9&{%*"4sxES F]$lwz v\#A]N{!D , CFJJ2vv7g$Yq\ ~Zowq3 +lNqC_ EYcq}ukjW/0a<vWFCD; s^N:lJ8BQ:/=:>F>Mk~Eq4?b)Js3PhwmF71<KJ;7"lS=)  vY&f^_N0zdE40'1!1VhmvNX$.SNZ{ -ZZ?_=`WTbw  }pXKKL'k`\IG^hU/$IO)Z4A>'+;<+0::ZYVhyryv{ %FSMG|##%T_5 ?R='+%J|pr +4"=9-&A?Elg}vI jFRKs  iXP ,*}}dt|\^lE#PuYc/MEYzfHZ~1iO?%&Q_.2DJ1H^ln4@sAmo.H')py2 ?Lqe8+1Ol 2Ya7'kh_}i~b?yEB}+*3uqLVD4!)%4B &~C%# W6J,{eu)TM ~KWNP{,~5&U.DGiy9oKL 7m|n|\y"Vuu>[Kkdh  T B(z.2wV ,|#:b!  ;drn1xEc?>+C P toz,vb-3cjj4TH\Rhu5e-PB"6 7 rE\ !V$&'u)*J*b)('"#a{ 3mIQo+:e ]|5 V&pV5 ,y_uZc.BB6Ֆ.UՆB {k #$%&$Z /o e/bdl1%6 /bGQ zL,dߨ%T8 CUB"y:A qIvD^ kaR!o$L&'((D))(%#!QL #EJ_ L y@Phb{pY-tgg$3.] B iel&I)bs)td#?A7o| =Z=/D< z(B5C_) l 7 U :* O@+g 6&3_*p'&<M  ['B4KK Z ?>hDZ%_!='  #Pn)7.i>%o{POz @.9zRaa 4 : F z b }]VfSE:R0pYGNv.J_;" CL(_hi6l\Zcp0!ZT@5(wa "  7 q   \?pp]e(r&~Fc g>?E-D4\\<T{+Y}FOF_UE:^% &i81=Qfk`]lIGl~:p\Y* r L c   y   Qpe9OHE Ve>hx{n#u\Y%}k]" -{U7 yMy< "KL0 b  < A H ] [}/Y 8S 7]| ]5:5/B^ds^{P $G&|-u~dv{wa2&LrTe8\iId" aBEt~C, 2 Lli*{]n-PcY@~`Mnya3_Npp*4 _3D}\&uuj \$y 8@JU7G&gYN$?Mh  y &#P OuQ:klJH - !k q = 1R)b0 R$k>VYksm8r'SI[5za EK:` X " (^8A6 x/ TvN3bpA !m [ 7tN d=FU`7 w~Igur`"Vx@hh2jd@>{@%d tTqF>l{h 8 N L#c ] !n:S L-?)xa"W0 2U %  "\s4r NR*v$ZxCDiAJE1#wT|q\)F# d h  C  'sF^$#/P-cI.o =Q+\{  ?\!W  K4(TMtgq qNgi>fbN1R,&437 f1'3HX   QT ,<@|Zn  tf,BpK  `   = 1:KAVX#Ay 6?$N_q31|mZ/lcDb@Z.q9KA L# r  !N>E(P#G8HE{2s PFCGU M~ o n=J4MFUMZS9L6( E9sfD}LrT{T1)pupN['aq v 5 Zu;`e4G#,iqe xp#0/Y`(c  u} b QX `ww z"acYVmrN=PAo@/g g#m c M!SeH`!WUB+km d 9;>v 8 Y +) Dr~Ht?ORcI6}B0:-1y #HGjUM9?Rd`+9]&1r? m c.YdC$@fwK J8?O $H& : n+"hIp_6\ re~6<-%/{Ii^]=qN:{#UkQ9 5 Fk+<yg(!MV%//6I}+J'    l0z5Auin> `J8 =#1pY:Q;Ef[u 5rHl +}$ {B   tw\Y ` b l nFABXK< !HUKy44%#t61 *H4L5 u ? nE|; s ?N>%}CXs  { \VC8K  5 |X8BFGTYk:dQPC>LSj\} htL84y{@n h %{ >-qk,3os )=zjFcne+40|;E W Q X < 3 r' S@pfk9#6BrlnY326}D.W`X[j1 & _r K Ie g~)r"!~ gb)H >  Z % eq:U@s3G%Q=ue+{ H;' W g+)j}GTIg0l ' joKxF}   ,s_ 9 !  (q"2wa9AO (vZ~#n'83`*.#G^V`4 ~F#-K} h:  J&tG DxN}  7 b .`a| *iTATxI5("oHAe3T C.!"i# 1V 9(] {y#$@1u,/ A g}  y  d{x]U ]tDWo9!j!O=d QV4):h2X  ~eo=>zn%jo  M a0;vy96b N  8 /<o r}??tO8 J^I_ SY=msx^P`t v 5m+J_\ ,s\t1AKf0 mJ-*o 6(NjP`b2UJa  h,iPUE*_b)m[Y4"  q;wFg<gUi 0T/c)Ht>Xq9Iu@n @Nk?M\]O<5?H'Ua,Rx1b6y_:4ALj+=:5>JK7q=#i=H~uou+RE~d Bm>d;p !@l4Ei(+g,eXf$Z%~S4pu`0 nF tM fR37aw $FyAx=j}>bGq8\y7_kgd\a[D- y\"j.pRm]2a@0 %;;BYu58,,)lI(h; zZ4 3[gtLS8Ru:an<Fp*?` EbXqm1It42"q> 6$ 3cU=Jurw]% b9t G~ QV`,WQIN!?d>^+?6YX  o'WA8 hE,}X!.-$!A\nYa )6;6w{{|iOB""+;(jo3KufrZ9]db#/eRAFMQc ^ :GFkXhV~kY.wN{j!%+iQ U{3zbs[ZqI8qf;]XB*67NIV]-*+kVpVXy!&/~.X\kE  WX:*i9n 'bI~rdRt ~`Oar/A5;/h.7, +77@i#Ya/_z[ Fwv*+GPGkEx/iVy%`sJ ~2dVg:$Y39Yk$+ {]<>hFS;1\3oVOrwk\:3P:H<0?;q\RX~ugR]LS7 Zw=L- >6cT=@R|++.\|uh&I|)M,P:44Ot-&,ZxwQ(XT\=[a&J/3Ee'(&U #L n8EPT7,Xs H' 1 IV5vUQu nu_ $|3G"Vi /[U +G u{j Aq`E(G&g   0:A)r C u6 t&ijn 'b@ _.\y5;lSF;% 1i}oZld^-%B<:/M=<|<tg[3$WBa u )35\^r5V!3g 2ebh 2.AZ@ mU:uF /rp+GB'' 1?+O^_f) { ~ &>& L(2~uup|xk- - {(K?+]G3\'QLvHk\{B V`Bcn ,5 }ox"p*e  0g43YEt8~@Oie>9CMP@H@4~s9A'[DF t [|fo)a2sg @7?KvI \7 ]lp u @- @V9Pp n 5tG  ^0m#{Gu]:  H 18'MAb^o 8\?3ZESXtW,] N Z(5 8u Igl8)8  I E Y jD:~*W9: 9%  ~ U-7%6'sQr@#( , !  \0ru`ZhsB\kcI#{AVS1X/o: 'v *$2"+$ )"; FKR8ystbb1dy Y6< x;6<n^s2& *R RuLKJ-|th0}Fe]Xz5DI1/ +#e-4cs||*SXn5tJN9iJexf ax"Cs0< S#6@}I8D0:\4>I:q[e@_\pug|E/ TOd^Q:>yf% 83Q=Fp%y\FsG 5_W. C 9"F7Q)+G:z50-I\$HXs22!|vHRb I&z3(_#xVZTg4idpN^Z1[) g 6d|EL9`_cL=p6/] ?#28  25")jgN%RaMTnXrc4KE],e+|V-,\$!1[6# K k#H[H0*?L5 e# SxWTjyPC_-A.;[P 0s&?9\ K '3XsXV'6 E5XB&b"qeo}-Gp c ' R[rC ### $##"m!! bC@"LGX* wl>{t 7r{x,Bb EcYuRKC([|l^@3)eH o S#^"O##l$%%#""!y {.6{yt]PfR \[f F A Ns T{~<f{NDGzY(zwm 2 q yk@ I(!m0-)1B+  v ;  aK @`xDfNP(;`Vzp3 (~ \+v[-i] E JH6:]d( I)/Y nf 1e  wQUpC?`@` ?jV]'f)|B _ ^ N E|B~fn b5J/qA~ U < G [}MlXA?+wC|zVh f|hZmw x :~Y/$Mz K;I1+;pZ$ a q _5#XSkPcMf;]"&aNX8S9J>Yw :\oFStq5? \A86|#*{uFm# ' 2c()R|Jfs!2h|3Ksb|JXWdiXp>G "nxjn5N t5#*d@  JX?wY5 (S2]3t`j%]P%~l%/[%!:w   D s\>z)fb qRL^IH' 0K@S~]Bu5(U#CG&_y@'FQ  2r0hLP gm(9 <@|~ T=UGsJZ((|C{ N}"R$_<p = s "?D5a8r O$Ff@ ^ dwF2^2A8GE+%r_W?^ rd; I' M e ^>}waH Y5 _0+t=Dw:8?1`.r`TFqc@Sr~[JBF@ V{U&Q]^FE f Kt <aw~ @nu>H%2 X73vU{}/RMc+ 0V `E.E  eD47C  d 41[9g7v&<&YVf|Q3-OT(!,/ yE)CLF b H?hm)3 e Um$z;v8T};EW]_t8Z V (JsCd'!   @9DMb4#IqZ71=y~y{WerJx'{V o { UD5b - 3 ! [RU1F j  ; ;  ${t=a$i4i$K@d7he ^$)TN*3y|_q;J+_6yj} L S T _ L  BN'b{ -,7r8_egxmNn z ){dy0v 5f#O2L8s < 5 ) $  L9.MP#j` k2lW2]5PoX?mW#'{B&<, xyQRC32&6ts9LaZ9zQ{4uV>6<;4GNJG;2y;X#Cb= 8|X5tB{0=Rn+['A``K-I1N0Ry6BF  ))2Ar}^J0~5c])}ZM:" #@y= dwPc8S~{17Ee  p*y[2!,Y"DQ;?PK)`JASN/1+ -Q Rrjh<t! ~MTwytNFGqz)g(%SY~OJYdoZ(|/u Aj$lFcUE:``C&6^p@\jz0$ P  !  g A ]QGu,x}i9k'v Qw|O&_*_ ] 4 i9>w:&DDC L  w ( C bl9u9zFYTMJ ~_hfLY' 4k6ud28T !CVxw;&%XN0QJ L "  ) 0   J E wA?feH-gU,PF.TJ> <k0mSJsit" I()Di$)t$:m b BZ  R  a q  Q  4PA|Zw*=*lXy5 Yvox/m[!["f3_Gzaro]i]rf`X>i" n  U  C ' Q%7~@,ppx~U.cu&N*w{j%]?~,`we(>b&U* (9VkFya%(" c Q)2D^M@ xO=D |  U c  $n ewg9NBf`^)`f{G yZ4(!)T gE;Nmp `54/ 2  % f 8P Bn _:t,=\A:Q^ _y`]oNvkA9[f%p[b?2FwJ)&SbjYJJ.o^sz>5. aGts^j? 'Ii M Y Z OC !!8 [v? ;{\  <9CD>"(b>gNTt }Z=?i~~* Xj1|'i  `>{tBG?g#p4!wpKN~%nz y 42DS %7!=5fW7Qtz0-{yX0F b:Df+gr < @   <Nd?*S p]d=0X v;O I):^pB:QCnNgb7|M.4&"B!C O Gnu msP'sRLDn{~tc}yTCI )y G7 `-BrLv P w lQ BD  8 z_d[ng>HDkXQe e( jfiDre|=hOOD) o`%A] F = f m7 EuV S\6b t"xH`NV P Q% B1V!vGJ +{ZR yc8  { F v H bi$!Mq0PzK:H$jPI%AoBRspE>(tJMrj> %ifhPu }Cyevn>i ' y yq+7yOsHTr ;q>EQs T 5 jYk>_Y~((aV${q*QV)Rk(6sK<#a"%_hAa|'`ozKtrwi34Hn6=icYds!jK @i( N 7  .l.UX  eY0M7 JXcb,2| z'OW/o!^W_B+rF4[y3 '/ cX7] m;2$3J8r "Is&Z}|c6HM/@S !2@nWg&<).V{. i } R ^   rz^C?t@~< ,: 2RvVniI:syzj/bMXe6+tb9rL?FUi ~HzsnQ'lo<?p*Rghipw}wCwJl:x0>)"APOv%d_Ba2c)e?p&\z\RSAnR I=Ln9  >_C\[47R| uD1 ? D +:1!/HI7yjORM@Yzi2+y#ZPUfonw%ksVH]rlrmq:o<Ogy[! $T*<`DNR ; N a H -dIb L`b@`c yW_M}:n$ V6'yP+j4KR=uR.?sa2t=S%a"`cSMnR* 3^v$F}l^{ `;_wNl5gc qa?ir  r : /%  2 K bxM=UJ4x&?MEl) tw!#}^F4hh)7P_n13W;=#_VpmL2$w?ZRlCt~h6k.cIDB[C9Ra,:SrY1`<_y w? i   L~05icm^ . a>>Giy  F\ ~b8fY"Vs Gl U ZHcgb|+U9*.#`x b 7x8EL<d,& &dy2lM-|c$Ih}!"">_8{^M bT\n!u/- | v J A^6'C[.L+ `4P51I."%'_\p*! 7 ) V >5Z" 3]#UTx4+cOzd' 4&Oai9v:t(ofXl."ld@RM91[]>}!\0, ;   J b  K ` 5 Y 2  T l e O^okh ? imKkwYgCKa  l ~ /qW~jpJkB, _ZL.XU-HZud5.UEe|s(m~Y+C]Z~_q=6Y+L=tr4"{ d[+<+LP"kWDK / m ~ h \ (  4 W q =/yGo! AT*Ugv3o.e%1j:h xv})57WR4xGl,Ly% ;cIx{`*R fGgIXS'GI|T,YILVBZbQOi0If2"Ud*Ea,Q}Z!Z; `d   sDt bqg:*a8Xnu mHJZbSvjO0":  3>J@4y~<)j+t$nAA|e9,E e^[]5P4Y*caT`oT@P'Q{aJjJ {&/I dG8  i, W/7^y#xo5 zblP\G26J* : sK _Et>S U(?1avF?x #0$= 4F%i&|zl_o]/ I_d vS ' { CwUH:3r !2  TS  t f~X@9r3Ad r  P; ZZ O4r_ Lf ] 4Y NQ `b "*%rP3W wX) LH%.z'Ga B N Fo_]%Hmo|> :DyP]by yVO 0 g J >IWvJ z|I2rD| $.`*d~P S61kaUm) A 7Gf  JT g=7Y3-rYp ^H p gO GB&)j y Enh `q{-\ ~Tc 9 frU rj-@ F Zw,wR|1Na_Y   M{ @(u^G p&m x4j3 PHsZ6<ns P Ob< 58\R z!XWkP ( X; 5Kt (+n U6fh~f_6 qh% h /t9/ : D / N` |q o R [K%Yh:W, 2;R}! NVX8s-bt XF+F ^u _  uh;_bM }jl H >"STS ,d?jD)PTCkgJO gNV k[ X ~ |*k4%rPqW+P-pM(,v' * # F" vu5   pcs I O|Ok2#R MJ ; %  2 nIQokPzp8F)#4,PQwa6/.Yc1KJsI{ei$=Ri5Fa65$rO F=(TqjF4-CjhDRC4*r+1Qzth^2.e.o;_dus.TPVS!qoO's^KPpehv>^1)0=JrYb9pyx{yzh|ttry}u{||VOf|lWerhi|z~~~}}ielg} $+.06004:=97BYW9D^ZY\fulixrz|tminoej.5'* ,*  )  x_xbi|{ $'++,! %#,+*QorS#4OQ[j{$ NF!/eqYNj|WW|igzpZo|bVw~_LPmwm}o<7R^WMiu}bUn^9b}V_x% 0K# |a" ESQ;-FI&)!t]d   &&7kd><CM? >J99<7&+WS`j;pyXhj>Cfyt7js`~Qbw!Ca@<g&EzpV  m0]1rWh q%aw`/{aTk4dNSVh~?Rs{vUw,OxwM^q:6W=3X74v~K5vr v+GS d U 3 < q 6   ^ ~ txqlF VE% 2 !'][%LZQ6J |H XVAK_;#<# OIsHR#07%$'Y+V R p ~-R)zmX V^_1q38Q8dl 3.L $H c > H (OK['Z]0 } o `kURH>%Uyp  p I{#lKrUSALN3V_(#^B n:%k T  _  ]// w0 cH IPH}  r w:!ey{ H  gH9K"V@5  * RHdjT  T < ' a.h\R'1{ U U W 32bk>:"T q[f_yO,m7R'KQlHVg%bu W 2 1 u v&LSE zgXp( 3  D e. 67] + i 48 4> +g&j== v$^h'Fm;%1@I]">  v1Hx7y+*$[q3GkwV(FcT lBq u*\U@ N w ; `5]c7k|jHs9N J   )vBq AR! vT(qA(E?yi T k h &L]6yB(*KYJZjX1Nf&(Ph/ H{muw{hn_!<_OG{Q+i,m#97']   ^ EFr / '  w#. \ A + _BCRKV gQyJ"LrVVdRA7Wsn+SBtnbnWUe# j?A(_uPT&`:~"?1,7n94i@\6"Zxu8i'fdQZYyV` K | h  U  a5%h+ IZ-~5=>utW;9>3(KoT`SXegBRRW/kT8i d!v`okY[7g$$%q"eb(s ~Czg T8r6EUju SUn*c0NM@47;j,#2zv>vr{Qib\ p19>}{2*$|vz #IB@"AL ;-CIqE >izj\ZH7cy!)yUm,"\|ng9>gj(#LP) 17# #?11.~nam $(( !  'ScRIpdB<gzmS{u9-d.O@d:bXjp.~^2H0 u}aVqpNufVQ0"M1RDE`)"xG=Q:}n294\D?DWtv& F`_Twi\D01d8Ci?Ct^98o5(i}w\eW|~h{q]rusT}tenoPg{h|JScPbSIg,G:Q~P'#FA&FQKBS`NQWC/+3!M40\Y;~8 iF6!SzU*NP:q`NfB $ls4#mryC+?`O.$*>JTbc`]ngn`y pBW#89+vRx37|K}! |zM}OS_L||?m`<Tz 2}~{9`t>VoS6lO,Lyx[_S]zz|v} .--PYn,+207D8(HM975p{Gnx\fD=uU+LgeS:#HQ8iyrdbS!"K<OZRc\MD85OqgB2CYnqZ++  lydAw3guAgj2nX"0`?Qiqyy8(^y7E/^ Bg.Y!tL8/udJ\ .thB wiR,~C&;}4W!'*9 &hobR  =<+Ol]O!B1]L2!8-XU ')-y*V3UrbY)i&>|m4x[q[SAI9f1xSW;Z>}6r1>@J) lc{G~i+^2y^1W'X/YJ"pB6:pyRJSlK?`,!/mNuU  ;yA e?kz  !eS-^obK7 zkQoEuVWBt,]9qo3_SqIDp3)Hj3OEyG,"%h@g\^!\{-a`$uB^"WSKWd]O]w!N~*3Rf]+jp\ #!A;wLCM#nPGAEI`mR/3)8blzs{khWi^:?nVX9)43!-d,Pk&! >aQ@b'W-%n 8c,t 3wUf&PAYBAn:$#&)AEOr+[4e  qR7& 21'rV5 TlK<+   "*;e 2Vz,1(0HXw%8BUCTiG:y(0*1I=o4ak2~Cg'$/V~"Gi+C[ &/:99OC/(ok\A;<81')>IFLYdc`\Y]diYF1l,sicN=<4**000:91=Ugjr,V":Kc&2<Ke8LqD`m  & r2EdB:TlP;.-.*8Qbil;J`-M[xx_:xhimfWNJ@*gK~q Hy #,?Teqr-Id2Mv;;y/f7n%44, L"`&Jb]Wc'Gm'Hs*AUgo~vkadcblld`YA-a?)YNRJ' zU6kWWigm~y6-U%H\r7n _<C~mKw"!n G_;OJUx}{nvAu;d5Mg4hxeg|{px/)tQCNZ[nS DeivN :NaP~-a4i|nq3G*:2n)4ekQ)fRq3Gj=}e9Z#<%]|h< 3$ I_gi*sKv:xopp*_PTM m /Ws\f(sj` ( n E g:eV <Ui$u' v\z} g & / .eSj|eo ldDUM9\g`;Z10IcF[F/eqXTWYn>68+f&+;gji^Lgg[[R6u2,a)X9f8 8 PZ9CTb* L~%,Wt  ]+"  ArkBR^ N/a c  T $ Je#;m&_[2LYi>.AEZ[YI([f(%0]&E7 s i {l 19; } >)2 (u, (dV z v?-4 ^T  4 Ec1z9 jhH@Wpf74J 4Xm^[ H J?X"!rg b3*o}p{ Hl0' u (TIIudOisl]A + 3Xp=:z\&5$6BkD@-!) %IMS$4s_@) @ x mQ]vO1c -rN\z.q b`N S h!NS7MPZ}ISjX-[gMm{rhvmRV/&XAP ](KX'`ss | ]` 0 , 4 *pi[a L YCX\1 }|/e#.MM]Aayb %J5"m#f4Gm[x"q\f:a/Z0&0^ g;5\0[33 9 H oE:g +W7'P^ ; 7N  O  JOIp 8 $8~UHo"yTVDNy ]T.Rj_/8idhAGtu  I7?*L(+[ _zj`Hg8  c pzNn-CWZu):~qLYt-&o)&ywc2/@ B > H 6 ! `7I=aLqtb  2 V +  whB:,>.b'XL Goq!#{p1bV'>b x00|&[J}DJ :,2k K LEk16*fnSH} xJPjU#]9+-dv*y~POB}tT" n+N2ria>Sz3 vB0   } y ]OI  XzJbK[h|pL 6 y  G/=<&v'Kq&<-6-(r_788_5W[k #  S V lKJ3Hfb=5m! xXwD2-g#{O0?-L(*aqR6,ym {.{W'kC~TF\hGY\Bs^/ #=  ,  W H  sYz.FQb' d5dEeNUwc1%m$&]!]"g'x'qq-_99RY={~p-2+'B [ B X  ; < 8 + m X  = HpH#mS }Ws m &IF@t'/XT =Jf:(\cujxrFqrf8Kfxneb r [ $h4O 4 S +FlcAp    }!Xf,$@+t*,hSF]'|l}lJn~\ VtS [R, # |*XW0 T#)MP@VgEj5&flP y ; U  I&?t\F/sG@cKXK l6}C fh+?KH:I !"F$ e +%WP,V :R y#p1 L%x 2;N%pV D +{V_7 ^P -X*:W ue6!ko Fl x3I&8,T (uNwlY6Y8xf h Pn!$&J''^((Y&]!d=9"e#@IbWl3qMxX{e /   f5b M/S~B߼-wpUY-N+=@Cwv"z:S. C_m Z "%&&7$mL p,4O)CE|;| P2fN_ 8Jw ciE  t  ?EU-\?a& (]4cxAh]}>-6bQ   8IA8_  NS,E6DVu]q aB :fA9h.xHJ) "m` Y)$7 Dtc!d Fu)a+sVA8*I:h@F J & V v (jX67:y Vu 2O 9& U `  B 4~ fR]f']*Pc{  uysb9P3EKus9 WOO[Ko |  kz+Q#U 9`O P\,(%  R.1CfC]sM 9`eC%1My|3Ke '*9VNn 6MtQf$:6qU  ; B "8j6=},wW~ 1sO-`W ?_/h1LMae_  V W>2~n3]6 u a|C`l%>[eG1~!319,3U5SS2.wsu(;s VMZY6k-ul H3~khM2Vz Yudh&7FQ\Na;c !BM_dqC1J~3UB&/G:B45G/;{pjagd^ ~,N g A >  $ / q);g@H~a`)\LD]Gu|yru~V.Z'- :tS"Scv7=*;RdE1EKG Nr ] D u = a Ub6g-2]T+l`DP4k~]ME% `k Q pZXb\7hrb$!0uu) W  sK8G} .H (QVeC1qVf#7\)nS5 3vh B*#+yl%}av6 { L Z (IH;< j? b9y ]}=un> xnooGj5pkOWP22zefw89&pM h~ F !0p/~ t \69nK=s mV Mh"+Z:b&}XY`3 jfnbvD!OtM\5>%T +  4 MVcIj  px/Q-,QYNZyi>:c}0#{/t+IC!4Pk w3i+U _=]Zx - f 0,`N.gTO ]A  Dw[,}Z'E' Ehd~ R <i~`i|"l g$YUJp&oWQhRH {!R P # " /e^O"? P5gE.H 0< 8m2U5,DT kw]4 D, HB2y 5@ w v;jYl! .1*TXi \J::t?5b~@WJRhHR!R~,3)Sc sk  J e=/gB5 b RkH3XL9cj'g (r  ; n>a21K?UOY8LOSOSB#_m0p{ `lvd  #ubt)F tvK} (0~H-'(m| d9V t l) z }DAPuP7^\hl 4 b;eJ)3U I$ Q G -sd4(# [0nG6S^q=V4D{<E  f8Y#pQ=E{/(g~F\Sz.(k/ zW- 1n + ?X<so "cX:,9^jSh, c o gQI {kz WBc"!:$GQR}q= T E s zqZl2=w= *k(,aq+Dw`eE T"M9i4"SVz<-flXzb   & =@'~$;\Z[S+5d3;_PL\'T  }c6eD^ ' dbe_r]YA 11  B Z E D GcM?9X[S^6=/_'Q ( x% k gh1` " ~YtB[u! sphc qTZ +tc?d]ulay]=Un*4oIZdkwQ dTUP" }~ dU@Pjpa  k 5$Vs{DN*oN@ypArWLabM .j,<3X R QnY^X~'0e Gv_  B=T +CLf;3Y!:hoXQA+ iF&mZ"X>TJJh  6@ol T@ *b8$ o SU=^^[ByCq-?x'ah5}^0KA]#Rw9]3W+?$Y  A ~=RtMBHv /03 w D \|*">S\u_nSq&)=U*5_[$w :yrB2JW_K  <[; & { Ssw%AE+BJH&MjzTs s ?0 v-8R  Ze  S h#c\ Z db k w s <Lckr'tspw<HTCs0JW!|?H/$"j.;K=,K1uw]n}4 1 +Xgu T Uyg9C4 F ; ,pFY9J)GVa &YxXMJbSq39Wcb=dFwlY/"#7bbnX `SQ% k @ eM Q w  ?  ,j<H(Fl{o#W@zxE y xC`D kp2:BK5!l!1y$n[Cn4<$ Jbx$f + \ ?7 >O y:!I  P  4 BHtk6 l@oTYy:G U5oTL~99YTLl q!yJZl| \1v))2zNAPsG$tz&p?h<IP`N=;.k > c X\+E[2GE[ Z>) E} 7T t QF=# ;  H 9ans`RQ659bbt%% JB3DU:{AoI =TEjB39 F:89wkX08?Cg* Hu@rcPQ.=~%(.hq-OjwdB/P,/gZ.*/ %gn:0Q;<Y Q yn|mOgu:_ZjAz,'*?(S0aRv-lYJ^_4"czuh ]v(IicJJThq*JR;\y#=<tl? .@71%1e X_|t2-AP48EV= }xoPYaU\sg@ QtO,% 'A`P/=ug_huCKIF(EX>7"..d^;L+L{hy/{"=OD)TA|D Lq =)ts]2c|@BT:v]#OfkY4H[#.s0UE H{HU{J b K7Wz@vJ/ +1Hdu4Sau`33CB\clp9~ )Jc{zhhg[[V%0H]qz\F]xzX&}VLOA6OttL40CMD:X}pK.Er^C )fs[XE'>Y_QSS2-Yio* 0Rkg9rdAuNO["X c|&G @1 ?BH0" e0WCZ.  zR&,0W6 ?Q`J&o=)=EK@3KQ*0.QBE=2$%e\" !cvHO=(-#,2 'CA.HUL?JzxW,$#F4:f.3 f_H;q/BeI`OAz~aG9;e92M6/CI)J |\dsC S(HL^f6U\Z[,. qI%8oz~I 1gJ<s;18FYS 5:sX*jE?.81/Lgce2J5|Kslrv{/sAyVPyhp-C$qTFYGOnci=~oL bKJ~U= FJnFzp/ylxR ~2Hk!Wc8O9%Fcf|rq8|gIM#PWwpy* _}f"-Q+&`w%5',0>1(5?&7hy`QdIG-klI&@ihiK 0/0Kove{r$Jj_DBF22Es_SLEm}~s'%&1HY\h& %i!!.H#rF6dpf6isoZ3#VccZB\E`o9|fEN( #SSHetU1 4 H@ FAt ] _QChPNm*E^VF^ J"E ,? +/&O~ ^SfvXm?]5_{]M}AXJ>m#0S_~u%q}whxSOl\81GoFE @*AnG:8S4$' erY$-h\Xgl_eDq;X4V*3U1O'4=B_G[gi-lq~M^]zsbPQf1U%" i4tt/N6yv-ae<p!/sk nUda M }?Xd9sQn#4gWBlV $b7LniuLuv&Dfw;q)u7F~>!HY%[vp1 8?R?LsJ3BQW6143&','>J=64_c'"a?W=2D#qp=V .,GZBCC8ix6oL%e?2ZF:.{?DFcPEp!gg`=JsxR6wQXdw~kq;;o$UaO0<e\x\h0kG2o?ee"SWQ#FF+T\^7wY6TBlditcY6}iR$Gi6mnqJ {}%bZ`.X$l{QV?iiZ}4zB% W8]=Nye<C{l_#D'X"r{#Y lf%#kuwLCxa^ApdJ#{uY-mK7:`5~7b}_"Du/# 9ji6++pcB?GK^MFo,_3^_#ksb_tH@s:JDaxFf;k;m#x{ ^l4 ViC5d8| =e;CO;Lf,+cKuF}]nPE_I s0*\Cn)k "9QTh|$ *CQ&5/Teub *!91 u/}4h^SvyU!QxX7^dQ^oxt^!5*"bxH|CCnpe6QIj7,="5;zHgyLF~"'2|.s!j_EjkFIMnb\sl`)(_E_{}}}N@j U4 ,Y#V OXi^;#?VoQKx@ vx ]\ 7 @-:GzWG./Ii#O+S^4NOq/]dLVm; 4P=OIsrmnK){ I s A 7[ [c /8 er *;e4aW>~ /i."fRYaeD? 5 P Cb[ O  _ ZR= k= 8U ` : @ {i $0 /0'l = etkM$"N / % ~   ~X;} / ;nb 7J K Us& ] ' *S k{S YYwqVi'C" )D v 5@K v_$  ]E l(B `  (  O7D D[ }0 s 2o i H2 =L B3n \z W?|kY %j!t s~ n %:yz8 U UKNVJ5 4zsC D ?pU<^ 8 Y &b}g #R !A 4 EI Sl H q  9 d JFKJ/|n0p&;ioXfy<r0:Y?E^XXnJ0G=Kzl":!WSI<[i|2aPGex$UZ.QZt5hr~[`'!%,lfHh,1SPsX(XQ\m}MgIY*NtnOahIc=Ep> () K.nFZCbuR0 KO5AU7 #)XVbQm^$NU.$OqXgR3Uojr|I i%NQ%V{5yQc`u52 R g,1zY7 CT>IR([8~rJh~['D%_{Zk6>>;  'SJ|AHCQ';E@Vk\|eviAPOJ%PK'XZkLP Gf:,B37P!#H35#30m]G`4TpE{I)gc8nX.s0\"oUzU;XXNP>l|*P!Y|!/?May9*?g 7=YHnZ,pD Q-C`[/-Ic\s&OlZB'?9A:+D:#zN}DWrYg| 'XY)tlpDLrWy9}reJ;3)D./3hj- "iM n_u3etnIL,%l,%[PH[t I_^S,l<qH7!?pa}T/FE5nE4lAnwm1 Q+K JqK?8M>Uig]ZgHfpv3PQ<z*|#|o8?y}_lF=ij=2HYVRc_S|b}SD~JXpyK6 EW,1n](*T\<-157@>*5IKP]aOQkeOLk}^azUTko\ilbfcfookkjnwfZfhQBObG1PdTWiaaytUUmeJGB.'0+D$-' 4!+ !lQruTGms\wrvxhnbtsYKV^XRPYb_^jqmqww|vhy{|lh    $#!#,*&.67% !   }x~yrxxpjkskeurazsh{mbpyrmgfoj\[xkexupz}wzqcIBRVPNW^bX[kf\]fkVKVWPI?:5'"&    "%('*3-%%!!*3$!44-0=HGHD@Pa^YYULCAFGBAELOJ=9KSPWcmurtzw}~|nhqxuhfjf]Xj|qnut{tdblqbV\]XE7DM@7EPG@AU]UTQOMOF79;1/;<62-+0-.7:AB86A@9FSI8455-*('-&!#'),*$%'4<34A@BE;:;.5469." 3509FJIGNK>@JHB;6<B<0,8?<;>@=78CPQNTX^^\]\`ec_ZNJRVRR^afaQWaggdq]_ipwxuf`yysjkoqqq|eKPfdVW\edWZ``S@ETK9.+0)(0! 0)2>+1[J'7EDF=02/% ,+ 0033450-3-%%(&  47*&,-"!  >E-8KQY`kkrr]f|rdjrqf^btydaswiodt~vy}tlY[U?HJL]ihbe]WXX\_bYUI1=:+EUF!12.((64% (0#%./!     2XG &" %6),+$7IPXYXc[RXX`Z8258HOWif_QDNVt|]UU]UN`u{pgacRGVclg[QLPU]nm\VXQHWjqrdP>ELCAITH+#5512823A>?=62:HJ;234*     .(>=3<DCDL\bYMMQJBI^jYANcZHKZicYexkifetqcaVU__Zg}PDNd{niyzotwY\b_iso[K;<aaFYdC2RudlzlB2@OH4=I<#&#!B8  "  ~po]yv 2& /8. .*$!()*IJ")V^I)!!7DD?BA-'IVE?Lclmhdko[[cZF$.:$#9YH(.553CW:1EJN</)'50"  "2;6<7*"*+%2`fUA*!)$7N7+  04+(,) !+9<-/GNHIT_h[F=1;]j[C7(387F[\=514S`[djE(6;0.6;( +:71'0+5A36'}k }xvhs}l]U]iTJ[n|s~x| '  +310.28.3MC-.3<2%"+=<'=U\[L/4JQC0 93/;D:$%7J<3ObZMEM\M9@WX?,6A=0#+ <H<''JXL<DQ= 9VUB1    #DS<)31 - Rk`M\]MUVc{smux_@GW]\ZixfN7.DRWq~d:6iiH_wWFHCDCGUQR\cbZs~~qwxy|t|xmryej~iNOZqtppb\SP]Wma5F@@C4 $8:./7(/MC52'"*9))- 2E?+  ,;?GK=% 4B>=B6# 173J@.%""")-39-+)4ax{tny}gPWkjljFWztt}~slldh lfoh}mZTe~iUbutcXadSDEMPEAL_joi?159GMC0&8C2-/ 22 '.)+& % *Q^>"DP=65CJ52Lk{}|iL=5NjZFM^ZE?GXh\NXo{xmx_[jm`IIm~uuo~rosn[@8>PqhjpvbK[|^Id{k`a{sroe`WVr|jeqiMKD4AlfXIIMJOewfC@lhQSa\VUWYK94DYSFWpwTQgtka`O2pu`QL[{sWwlporzllZ]tpocketsphinx-5prealpha/test/data/librivox/test-lm.match0000664000175000017500000000115712771605033020540 00000000000000but mr john guess would have been at leisure to consider how much there might be prickly in his power to do for (sense_and_sensibility_01_austen_64kb-0870 -30200) he was not an illness those young man (sense_and_sensibility_01_austen_64kb-0880 -11423) homeless to be rather cold hearted and rather selfish is to be oldest those (sense_and_sensibility_01_austen_64kb-0890 -22022) had he married a more amiable woman he might have been made still more respectable many watts (sense_and_sensibility_01_austen_64kb-0920 -23591) he might even have been made the amiable itself (sense_and_sensibility_01_austen_64kb-0930 -13778) pocketsphinx-5prealpha/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.wav0000664000175000017500000031555412771605033026340 00000000000000RIFFdWAVEfmt >}data@hPM nz'@IDQ u ;D-/I(f93 kG[!79DcM~J_UF.>E kpsD?J _["^Bg\8wCqJf?Z bMVq5Id Er.5;`h:kb=>+}p?MPaz0ZEh kbfvhn' de[|h5W5KkA-f z#Ib5o#qlU"`>kw_ f`J0+$OV@_t\B[hUIB('wV@R7, 1R;Z4X~[6B|MN/ #{z<dyFqS Q Bjih]oY H;r8  wv6k:qET>]k 'Y_\)T@16*]E^.H\<4k23D-nD4yC.rS{rc%$ &R)&MU|0<R}^X' 5,RJgm^xH: !5{m wUIT{!~(4G$x0m 6Gnc9{x(! =9uB RH\U}5*ynV47]?&'N7#!(1X?$81t% DAQw:$!E'bH409FRVsv%pbK&U!#9B{-DUgq{ Le ! qE+.@-jp%6HSz113U.hd&h&pO|K+w6;C_l?N&iE_=&^B12O n=^<9V`Z&HLug\=J 4 bp*tB"C#wC%W @^; %0@zh^WU:2{7ic-*v;?y-P?|7A+@V >eG kZI@DwM5AR;8.z'STViVSQ\B>0&yJt<N`A$J./f)4'(`x9BsR}Lz6H#VYvh0Y/w0wvq&v-ARLRvqy;M~WdXDhZC@mN7 3!!1:FA!/USEP^JA``YUD>YeOZbA&7d|~WGSV\mqV10EMM4/V|cQjxsmkgj_PQohFDVcZ]aX@!2Tgrrt_@MvnFHmu_SURSXRGHF6'75;E68DPI!( n}yykzw}vpmgn`f}wftytqL-N|vqtz|u|||q LN8''6*0?2*&/319PXA7Kgxupb[s|ndjrcXfx~r}t{wsyzo`_pokf^dfaY`^LVovgUT[YQEDL@/.00%&."%"   !'',5-16  .83<IB:1:D;147758MY[[]fhfjlopintl`anm`W__TQ\c`hdetuhnun^amiYWghaXSV\]QXi`PHERA$({ux{y}~z$&#/'$5<23J>;HSB-56/BKHPOQPFM[LGVK><57;3*7PK7J`[`bryniho|xpxyO6FC>85Vk\PXfg[[hegolicenvulaYXH=."-%(5348  "& '%!A9  %&42$&;A90:P> ),( " $,(,;?;9@ID?ABQQH>-*! 71&0 !**(-&++)$5$    %',.'!)%!*"   &'##2C=:>@FTUJD9?YZA;RXB<V]Tdnify}zt{rcqtay~f\xth|{tvUXmsfqz{q|}||upwn`rYPstrfYgp]IMMKQ=':GA76<@;-4FO=#-85;FRM.'FC#:#-(D>~C#248JEdn.E.5]7>K%#?)1$'@6/=&5Q@!A*:aY*1ot]d~w<Gq^qysmwv_`rp_Z`h`Vjqd^[amsmffj]V[b]D>MMG:6KN?:C;@PLPGJQF<>?GIDMH2*2+$(.<20?RM0+<C;0:D;,(5+""%* %  -'%@?0)7O[PK_kkhWPRJLRY`RQfrtv~   |uvvyzhh~cirpnf~vtn[SA! (   <^: 9HBAA=8EVDDL* 9Uja<.EXYN<<74<D@AH?@HOY[TOUj{phlxp{xseqyzusds{njv|a^rmdigZOGHiXCUWl~vjio|pVF.&-7I: #HWK8&$8J:2ESN9@UP:&-EYI*-1HbO:0>hy{mSN_xyrclw)&"  /843)8SllOI]4$+ (|~BIH8Wg]0? nl`wph]>FkmT( !+/|ru$22 @VRN37guwjlER lt-F}FLiIRiO:nwe_|gx7r0>va pN 3  ?meP(:zzEV7 9 ?fdDLwH45BRYhd=<)1 'InzSQvP]y:Ey~r% )#"0>; d_3qh[i]NtxYh\0  Jj\yQW9QOFs*|x K98Q N'i s /U ((5.lVvb4 {O *m=e`=!FI@aC"n-Y]JIr]| IJ8 jn[8=CCzT#zSW96 1 y w _ u w . P w ; T * + h`UQ  BdMXJqE|T#;9b9kDeS0fIRH6$X708YpQ*8@(nA"ksG<[Y t JGQF~-  ; l2*vY/I#ZG`T0"h *#HuQ(z+4g{?ERu[NT_e  mH(h9N2  {"VM?b69a'W&Jcp^pmZS& f%DG#H5 mV2SS3_SeOW .K/ cu=L.H[%6.wa?&mSx /6RXgX"e{q0h{L& PXCwmX4=Pk9m/x )|!Dgj|JaQenO6 D  '   t B  ' ; * # Z bhZ>nY"23p^/prp&8ly^YqjL`1 ]KBLR3:@e8^hCE7f +pB,eQ}4YG@o!)K~!twE.o7@X@/xOU? ~  A  6 x  , 9  N+sv _S%|w)Djw}#Ptyjo}xiu 0jDF CrnHV:A~!@Wg'tX ^IP]TZO :Y lKLv_6d6E:U~ h x z W 8  hebG*:YWs#Y+$2On$o 9n "(&(.BA;CLUQa +<8/7:=A=Hax}i29Us!b.Fy/vH# s}+p*~c[Q%y-!h)|F0UfUAuM H  g z @ c P a}-Y'yKq%Y i*z*u"!3}mB" /a5j,$2,p3:E~7e4& \mTWTQ7"*Nk6ig@-r+"f @1t;r$~D{3 }  b 2 Y G 5 `  XeUgCwBre2Fy2~>pb}-P.3[C)RX,LFlYM(y-5rR x?YE-Y--?B Hc21O w^kEGN-dduWR[rw y m | F N F [ . OCK~&j"QlkWV:_5x*.>lR"[vg(RoMe5J9FG{Z:6o 14E'%rh<t u F7uz9#79bhrM#3& &?Y "eUF0Tg t  ]-@  F^:71. h42  z~ -   J/Q/LW(dxlV&"sK 3UQlyOHCmc=r>S3kx-2sO%>XZ$$x\@s[t?D$8fq"Yf3qM-~ 3>bF7u X ^a  A J,m >v\ :YO 7 !-G3V'JL WVBkH ZU j $Ih#+[r_mY<99~Kq.{ksn@A39W Q V uTt Y / k3.9^}D , 91 U zoouN /oAvM>  q L`2ZH5Ct8$fQI%f/KB``SeFSEQW\*"x*ccbQ'JN`/;k-n=BNA d  ]  np ]Xo 3sX$C7wiYy_F 4c^jl  i .Yxn:@pY}vV[=9$k]Q5a?HZMwhXB&~(`gokOKKHMZ2DWo~:ooO{M6r7Es;*dOG7+:|Cu *mA\z &W7I_=JIN QJpc2M.T2W];}xb0v{Bhva|llrYW!vNsDI*:'[r1rEb,!X3#k4uw%lc'gmrzQWi~SC{#rl!d&" n9 cNmqyn.2QWx2Uc}yZA9v~N!Yang}V>O1;;\M`\$kQvUAb Up="SN/E8(9<ZVN[ L   0 < 1 * o * , c7'F%c[82{P;`'nR 7 zinp2vFm9a ;\I,F 1`MVs]{m@_ZsOw`jm][ \$jT2ZG!%Ns BL5Ld\E6C | {   } 0 } ; ZJYQ}6VVEs"ds _O m%Lqp@ Y;z]br wc  b< J!X|:d"&/&19.V5ZfVn!0xw(mp_U}& /E{|/,b`N;t6ZB?jkwqq7MM 0 q rg=@"M'LZx 1 :|t]N{ HXC9 R 5 -  m 8jRRVuMd/#')(@\aht*FsRB gw&rvT 6#3T'H;/?Kzo G^q.q j  m 1 : @)j @ .  _lRfS@C\`O "  t B = <B6!dO@0\2PC\ir.Szrw: (c&hIlzqp42*d mTh"EJHs?2!KawzQpH=9jyXC<`O + K >v hjmI  :0j'!AH:G/%C  T m @ B r t 5 HdIDtaR 1T /=p?ZJm w _[xtQ9 X V# $wogVPd l6xbb  ~ WmXAtNY! |6m-LDV)x5.m8W= TFIa  37p V; , | I J _   @4* U #16PDm )RW &Qu : O ?8C#!#&# A n_x\:K#?" 6 _Nza {  . Y_aOq U_< U C'y,# Q dAh\ezi|, iNyB}Mu.;U [\ ] ) @~G&I- 2I;=W, K T K8!8_Z-S8h\  ^ % & 3K  7{@0hRu- ! n : | c  gq;6P%#( ;}fzcMcDY8"cs#)E< U &  x Zz,;Y/($Z D CzU$\*k+gWjE>#]D* *a+<nnY# M>d@uIcEH>I* J \1\@A\VXN 7y.~ _Wy~FA   >  pcq%)}o l $ $ KJ8l q(]h#JhcN~jYNB0c +b L]HKov[#F(.r<eI'0tlUH?8/ /Mm%Gc$mCxQ2% F Z /L U 0 O r q Z t p  O u  6Y> ,qS W w HwX&" bF\fF9!$:* Gu9CQb{nXg7Q9c^M[fl~Rh;j!TX1Lu4 z,u8N"wf!. u<  k #  uI," |mF91!//:%G;Ut46n@kUa \/$,3Jyu3(_6('@GL[ _G]6[s;^||Il?zSB|:Q S X 0 ( # % p !gO*   Z H  @ttJv_P:@ EvlhyEsPi0+s{=pKe:b`ZrryvpvpL-p,~Xb04}&>d23=K": . ] C i t `\H%s L i;~ ros|{EO\hRv@Zsj~MKChq >^u;xH,e34B&$g &uR;c_}B 6PxWgU@a %cN  \=nG_I`_ to+~CF- '5   f QF q gjg TSN.zDRb%C0V\!"V1KABK> $~\7PH}~pKVO<! r ? > 4aL52f8p# NZ)^o=U. ~  (x!IR:K}0J<W 0%<*Z. bG^@pu@Vv(0]{   $  >pX`Y-y$Ee-(Du@ + Um<Lax2T E i B]]K oo H*oN/TRiE p  a ^nX+!XT"v",$nFywwMh3PxB"K<XyADCNs!j=sPWlRAN1+M#&.[^); ' ] a  z  |  M iKsZo7{* "'  obZ.0 V@_W!dL4=] >:WMzHF:}N% 1+O7,b/<xEV(E` o  y B K = 1 w + C l:.d<{`, OhezW=,w=='9k:mk4$n#$q y|rGbdi,J0l](Ye383q_  q4 _   * r [ L  k r`!"GInE>9 +dp<%sS+w3,)/:QLQ`j}t5@9iL_ZBdBC-Zf?&n+)-~JT[6;cgXZ^h9(6(?8hjwW  ~ k R 4 ~ ^ o )MT|Fhpy7P )Ut|N404*tpo3; iUQIRFby`@@lC8YVMe@ns}3C$j5%onknoZ:*8A:C^H;;a"!/  (?'/  * a 3 # q M / v @ w50{=CC V#s~E4"09a^La65:|Nkk#\n9u><6 ` ~ 6 c F  L u % T |G_IDr-y2K`.V7(sz5FP)-+#77H[F-A7BPi@ `Pw#y}>fB7sE#?#% pUC,0)Ws8 c :   ~  M a 3 g " tN K _G\:|Own`!mq1 cGPtItEQb  F. \2'sW;oc:ULW796;$O#Z* vu]3(yi&j)U)JeJ 7* a] 3  zw).VD<DUu2nc0k6y4IK?jO<]"GK# .} 5 MWsT#t %h1<t| -\7R95 E .ys7 7'oC0B7Y+>>6  2A2Am\$9 s8ex1En_A1nT0M*I^8RtN'}^J2Vfd Uj.8 NGD"{)G":GaT|?x~a1bmD}_ } F E  zLay^:\-i : SsbZ;(;5$q OA}dGIAC(1GDWh^|Z^Tp: )jh})q4Cs>Y L T_2 j XM+4 | s  W\ C%qEf^. * o%-)CV =BNS+M#oIJ++J;&DAYCOB Z +`}w Vvs'Ei8-DW #T-  ) Nd C%) |Bk s%5) . wL X F  D4 K_-97;&m6DZA;18BOfLRE@ _{&e,KFHBV !I QO  h  e _KW%`}iWiTHsx#; F(D8_!5I ?/ a PRuWpq]BK,5Cc   =\dh_}d%v!EL/vU}!iCPc`M\L{8l|xZ+   Q g dw^UJ2 F I5pZ>1zM8UOn?rv!L' q2d~/~Ga *ob\v2w(w{$,4Ye    # a  g   Z 0 R Q  a < d  \:(> HMG [C E(Rx58n[ 2:!Y#&@HOJ6&% 6$%P4+ %AgS T8'Z L|/*%0>'\|"K \v/%gSp">?{T( h@d&zV@Am+Oe_j9V^n 0Qfn9SbYYd *$*<HRTpn\I11,$&mdc`cimh\XR<q\;%kF%~_SR= %/7AA:8IVV\`_dWTbz":ASh$5DRg}?POKTgs}wrn_G2)q``baiy}wfM:/)lfllgmh\XSJ>83$ "1,I]N<:OYOKNRH**ThTHP_aexyunjuuoww~pthvmem{tW37QB("+!!-&'+5B6)+3*+4 10.50 #' 045<9;GQSB9A=<3('!?BDXVQNSebSOc{w{aiurlunZQZP9'&6DJ>=RQ?89H9 &82*(0.&' *$#      %'.3($-FG16HI?(&;<;?@E;/6GLMYfd^lym]j~|}{tg_fULbhaY[jmbkvi~m]wnKVr}ufl{kK[pN3/:;2BG?<1,:=+*;=(#'/,+2,/=-     DI<?6?WXVY]a^Yq{{[gxxB0m!L?)"%9OQ88@zJIm]ELDWzx[]sm{/jkxvUGhW%>I'Mg4*0" %G%#YmctS^@Rd0 $DlO^,E xT~R3>D05nj%mblhS*jGzd" hm)#(<{V,iD=gqubVYZ#r}z^}t4vuuo2m-h #I@/"IcE 9 z %Lnu *! W $"#$#"O! {!! 9.N{ L+;{;8TYzZv RsDQ4 O[s<1cR,gA zV|?0 Iv;X#EQCB7Yj z6Jvhc3 I*^"O'('&#(*,)-,W+)a'%.$  9bXu9A>L {!s OpDW  c h4" > WG{H&g{+3U`6 f; Iy`wI:g   39Bl-R4.Jlp< c H; G ^msX!k d !$ ?v9~" GNX /Ct"   y`\DGpc:+' :/% Q @@#>hr?2Su"dL KI&0R7j ={9#et w ? 4/NfO@o{1x [yu!F+vTucj 9WYIsHxQqDoKD*QTX'q} =;J~Hs_*lAJ~`!\I"6  # E X{enJlL3MKq f}) 9F?o HN`EU AN(,:>F'$ )w}YA:ciOFprOt8hwz3&DtT~)j0 \#jDIek( kPYq^^ dh-/qP/M W ( 9  0=L^I m70/f}d%G~MAA"<.DJt Eo  2T{`]1Z4"S T( MK{` F'G2g]8X:{Ukl ZN   |zWd$6Sg<B=bmdqZ\7ji9'5~Q^e|]<# l`<33vl{ > \RxG! . z43T c 4o W E a)Mi/Or6>_r}oSn:d]]\;O<A#) vCC1vsvry#TA.,  c;yj/* 7Bw2a>>lOM6C7 e~c.sE(wB(Ag@itEg<36XU_&=HIJ$2]Bd8\IlhP(4k tn%OPgd} x JiP$ \ e &S[,k j2djd)fh}K5(E}48'Y;"%6y [|2ZiiEDYe0LB39u%zMy>$9"!p.["MZ n>KZas GL+ d  / i   R QeOQ4N2Rs~iPOW~\dU&'( l$p2t{rB '@6*=i"R "L#),<# He; j;Mb;I} 2c-Hrc,i7))U1Q d h  E ; | F f rtMy]S/FcgE=OO9 #Pe<rr2b) (Wsq~ExDOM4$*i"B KoMfK!@Uu _X)C&M=T~WRY y  3 { O c + *  4Gf:-! 5,clB03K|a?39dE>6aH)FuVj2b@8g%zOxWDEgg(2 o " k 9 R A   4  S_JL$kaUy7w:6TcO\R;IaP) Dx.e HsrjEz)zaik2aS`@8szt koG^H#r1 ,D6   f v )  C * #nW+uH|"xQ:^[j~ T1A1GpE@EG8$gH9S \Pr9KX X <gQN9!^_t~PpM3|PiL6MfEW}S&  q X _CLV\b$0z (k JT 1b  Zn MB+ J^aL[S->G_k(J|>j#DTc~]|phWlgB _)Ako8EtQkYp6<<.]S a v  \ k 2%tT*`_^-w* %w6N~ GqJwS> c  D%M%Kz,}y o @Iq  =  |L)!B;,S>MQER3sDwqKL dZ #%(nd&13} &4{45 j_ U8n ~yY~L a !eD/KT`9b u j_:+Rf:]NBjIc \* w!pnwo~FnY0~Ywa } y cVl!!50N E* #'I:uw  Z, G1Y< Z  e7?)>$bL 9 bF2p0[4GxExN=|9 fG- +pc e # i :_Aq,Ndr^TCS&{IK,TvbN;) w i: O>L=" T` .l.O c? G }''T |42- JBt@kt9O  O \ ?=  _Uf^ ZF >n0 ?Hp} < " eph1E#[ ^?u`Yu> B+~)& H"Z|aSZF#J}? { *eZ-kN wzBS ^M ay0 V " OfkD)77#/j  j`(W7}wN77i [u5-5u^-~oEIw:=v^9 -O,8D}&  !;yQ+2 M0<n% hZ ~f[(% b  ^ Kf Jk=&nd\B"   0  nf>D hz>H87O;;\ ) UL:88l<|mPz  aGqpN J s !, [6J  m7oLni41a $+b p R)2rIL"~SQSli  r y a_ :Lfe9b! #~F@ k# 7&)p6j 0 o3Cl F K `%EkOrotfKRdZ?m`lXf2Mb` ZS,5 .aO8N CN8]^F n y k rZhdZ VmGR'413rB>Cuk|c&z e ;3ztf:@S ($J pIfy q Ea a dXb\yr-C=B> W  L } ! \ %xsh<_VlK[Z@9vS F,/40`@wO|:[ mD<y@ q]kX ) nm9gvk?'1x, V ; $S  PHG6q6&-t^\U4q6l  z:I;F~s_Vh?$sH"n]hpp5\ J PWf=|$lw /<[] /hg`,~|  [ < ; \ +I%`D)50k=B[VAk\_ D RB=>= !"0! ~SJy |"(\9"Z [epY P=>N! Z3Bp-iJ&1 ^Z S > p%,3 $O!M:Ss5zX4q` kW|[c! 5kOi  sa}^$ !k!Lm~Sx1 E< E=1 $ , WuZZb8DS  !eJv\~@7y~< kJ"r8qXx'Ve\=fn|>W/F  m Mdx{,!#"!"#>#,##"jc  <ue/^M"6f1JG n MBp _+_Vk'=C.rN7HU$y ?l Pw i\ {\sN^jtOGEi~$_Q f ]3:Y{ "#"` ' !!& | 2 /Z>2 }|zRs ep\cSvv ~ T&I-f;Pl)  s1( < P7N [sd)k THuL& UH5,9YB 6Fx B ;?y !["""""" l a j ~)^Z4' 3]Y 0Z, 1y'Ij : `B,3 #QoNtH>4[ZLe-nvlL+Mwd;6BbPxQ/02 I G) 6lh H  . 'EwN$ w Bq(nwR # !~ 7 a S CcG$2tJ9 de5Ah vkc^*4M8&dY@Nb5 z P*H1UidT}Vrd :  z8R$v)ae'zF0&&\%V=  2wbp;5 : AQ1]9afSiQj(`v}#VPQg5 tsh 2  J t oC%Top  @ '7L Q3^K oM`c [ I&  . `  OdEf;*{5%*EyJ#?J2O{u8jyP|f4aYt6[~ii~_jv}@!ph#\'pe)p@] 1!_)92\ NOA:pwpXg)0UHgQ]F%\s^a\+p E^-@'& d>YXS dN6C _07ra Y e 3,2 X8eDMPf]{@NCJ9>P/}!S\Q>w5_h\{:Vcy 43M ~ot`5#3[O}v/yFka0.E,.&9 .uB/?D|5_U^!Rmx&cd+qNvYaOW W_z z$(joC42\X08Kr-ZUf%X Sd-G5)nI;)h_\ZeFTU6/^5hqrR%U   ] S 3   0 _ H e ;-KG#r{Ru+,cIE,<V$WQSpmlc: Oho=#m@=d=0s>Y1k_:P!EPH"_r[R)x%q> 1  ) K:i/H0'._,^ x f&N:?470Pd9)> %f $  M a"}\gNW=`C/. |,A7nuFYp)[wV<O"sq)%fQ&A   Q=OpG!,e/.(ht O *:SH!7?5J=sg_#H^! =:(h/.) ` z J {" ]Zx <sF~JAC~$3E ; Z  q  A zWp"zI6oo,)8z!?oe R> 6Ubt(cy!h/#[AL2=f 9  x p \am\B #.zx u 4$E/h) %   0 rk~08BW@M07"&pa\CjqN f|@PO=[i?lih~)h .EP]t0M%en k`x Zn_}]  mWQ J ; m K3? avc<* J-#y! [6#ZM4\ B S2Pic lP?R/ 2 n@hQL02B-: ? ] 7Y+5 ut V NAc1"] @ V:  >'z /O( 45 Ukh=~7`'m8nLr ^H.>c| k T{GW({'44;8(o;u_i/ + ORsGbb'$E n { K*AS bUr& d  E .Tn1/|[c-O'eYd |?,Vz+ )]<Wg@mHRbY$[`# zt}5Z221g]CPprjJ@iTM p 5R 7 9e )]'5^@ s r R[K^>K!i i b rV%U_>.335E]}2P+YfF@; vz6i>`MfpQ`0rbB|/*vdxWs  W^>s1v L M.#2%0Et|dG0( }pxTKWLG blx"2"xnp.!ex#xF]D7#Q }(Yr Z ||$E`;A 5 Mk,F8EleG\=w~h]JC/9M2qGfvBHp#`TOc1\&7Zy4UM{tm-xV'JR2AmJ<rR.N=:zO\ l1 6 | g D v g [M"=qYCKaH3E* 3M1B@$C]wrkG +H6 +J4Y=2{~vE h:$!KZ5 /D^ple{'wTb@,tux6< B <   E O K | ^ W?h L[7N  Z]q@  c?&4HJ'KFUhy2"KlK}}u)^mYx@&  /   ' x 3 7t*&yy1 -ovf+wUr83huEk[nj-wkn: m' DF'o_nwBr>7OfD %/D:q6o s(: g  v q ~ H ? O E)$F'I7 sew:rUlb<@fyX,"M]2'utU_| 2aDlH ~ u !Ny CLvD & D a -)&Pd;=tumOE"Y0b xdm|c-

P{6fnV3'H81* yP=~6x HO!=$ t3 As P t>Qo5uejH--z8 cV  !w}~5S=[N  8 0 wIA2<Fht7Ml#'Z{tnFJ I:5'(. >8.%)!T/'(#; &4?{ r/_u'OC^JR%2kN+j]lEZ6r,>,.aA[^AW]TmKPRVO!1^  g ! 3o {IVfi{Bcsh % v  l?1lLDVu3~s, : d 5 hJLT]h5e$J=evI&CMr[?NG%'4 p I .'}|$IYexM\ c 6&UHgBG vs_Zy"e}K4&XqM'|?=5&7K6  }WRIoYh7vY?Is/1#;q>yIQo1UR- BGHC~<69Y Htv\@^ Fi VS88sji[A#(T; 2gavNyCcEsr$V"jBH1 %&S%6=SFca;)9| *1D~Ljw=se@!Jh!<do3eWB):^=Xv&1H`r{rb^R=/lH2b?"nP(  $4RxF Hp9Tis:e} In7Y} %QiqywcaaT(Q#^0dF,e:qwvZ[f`PDTYH=Qz#2:G[n|~zrdofQK;{M8o>#wjSC/"%(Jn~)2K[z9Je7`t+\|)C[u,?Vj{  eE+U6b5}b7 '>R[a{0Sfq{sWJSMV%w: fNKG48MGXcv@a{$FUjASYXUhttuo $(9?@^zxrwtcffB" ~{cWUO<]MA&dZsrOAHHEPgsoimsuc`d[^M9GPJO_xic`L3weVD$I-m!( s D L_C)  x,mzp-.uy.EIS !$uz x 8 C N  (0)4p  'L =;| w2|U86D4z=gz Qi c +O I O X Y q$r@( Nr =,Eo+M}8 +HZ`hdU Y //#I~1l^iS 4i(cGRx /` {J^K M ?+F%u _kC_  79Uii' 4 :f\ ; / 7 F4 AMh(# B } > - z78~8Fbb~_ zGRm"c[| w+#A%'t O N*Mjk=[)+)b {TE3TlX a' "=K   r ,Cl^p\6 % ^ h E h {0\2,U }D"WY$ ^/^67ZGT` 9 0F"ZY-VZ x [zCG [hXD) P 4 Q h ) b tI|2 dW"SK6b !Cb5[Kj  f  VdR G OWM[ 2X=  H; ]r P w  | !h \-e$G"3mx/*Xf;6! '8 &io=v &u;IvsYw7+([:2*+C/~9:G | -MXoL C[ IXy;"e.H9MJ`TEO1vBI:!u?Ndy @Sb9_h^1 (j^.<_4CvAX.m~C   / ^ 8+mCG S'X K C  Xkl D Hh O9ZF%0; 8|}6|["\kq%+K9&w}?  _|L T= n0X^; :- )  g M  < ny= #MJBi)n9H;a 'PF3E YS!6}->O+fdG k/ w!ja+ J i4295Fp + 70{^,WW`f"R$oCfsb~|#SLdF ^<>=wZvwsj0K_uI,~ ~ "8#"8"V"["""s G!!!4|=7 cP5( $1z , IrgbQmd 4m]sVgK{jB%Q0fP+q :oWA?h@H q(z@i_Qi{p 1rE 8 sSZ H> V"|#a#"!7 -''bYhM"R[ rr1fDV.Hxoes Z N uhy%!6$k%$#I"!'"#%&#uuT K h eE;L- . 4 -[WoF,?mphv\W&aiv+Z5Up zwR&`W0J]f1Za7L1  `a *][:% !!!6"""""##"x}  GdRBk= zj} ,5 C !M _H[Kfct|Q9Yp;PQIo0n&lKV*@c}uejrsH}-h ;np20m]^O2% y  A A6B ^  * ) n= !kcV]EtVrG bQ/0R\gF~-B2u#w&.=w 1dl n)gjgni76 ( B 5 8  % . R NF!M#[j*~#34>=. wkN<Q2~hncHD>4:GasB{:SYj] $kP$#tb(G.6  kS>'vqKuX37Xgr(^0=*s.x%uT!i/C{H!{>&+vNMoS a M ( } N  E z 5  ;maCt-|g?8b\] ["|} R\PT[6.% gh,Pa(lONN2 ..8_RUbP j4*34l#WJ1UHJdF$|K2 ; z  J , ^ \ 5 #  ^ ; . 8n> c[uZ?~jz|zmp\I> s@U>DE7"@=+68\wmUJqDn&5f=GA?QU7JSEp\i*8L&^kV3Tg^?~QZ&f 2 $ _ D ]   JBK Lrc8o>^wZ)#zg`j B", G- .Bd .V}N,:L`7?GB QFGG7,QHuwgK[M9RwY[At/ z%Ql`4;MkR^b'cO]XINGW ^;e\>6Oh0B=x5/jK} J q> ` a+xb*:]8q% ^O@?cy8:[-! T b @  ' % XPR7PSX= 2 +& L(~yOzIdq)8ooM SXlnyIM] *pp@6QKg7Y(ZL8AXVY} Xe8 s( x[;g|cAf_?w3 &1 p# z9%l 2N p J]3(c k#e6 (n%- =Ujj UZ _ & 2WbTH4v`eFws_;oC?"B|9 "PsNwl  , _m W7nkB:n;C' wz j {JyV{y:zvLE # >Zh}3|Pxl`S;sab( nynI .q 9m& C  8K}T   ::n +V* tbWC(h4] C _\0 %/Uo7rMm/@>tVg=Is-\~h\j ,iXt2L c"X  F _Z">+mJH <<$G`9 *H8i[r35 Bku| y `7 0WZ :oW UCQbZ  ' 9XrN v V-`6b r)^ qWOF> F"  " C-@Sa=4A= %?   cs4 f*w=e$rsO *. %n  *!c6V?8l}q S\ *t c ;DT R  59 F+ kT f :pz) -[Ak@6\L5< 5&d0/4~ Oov@EJj " N. g B ?l hqGF+0hs26 Q~#<P ~z ?f S. K pZ Ac G |4Hd 1f`1" M qL:w,?@ "})4 zd9G91 6 GL*t Jx'9d _mx3XjuM  =SY, ~|"# Tx@^>l C }^f,c)1 P 3&e s6DC ";to/Y6]TH  ,35m, <F |A$oL9(SC. Ie@ 3&A exA ]W L7F` '\w ,L c  BCYV_QKFs_ i | f{0  MYJbOh<`T>0$no^4 6!r`W_n08Q%/:owN}:WP .k LQm0*7ku" R | l\R[f> g[l hjw}i@ssy/j{d9 xg^  . '   2_ E 6EH !n z d{$T, j?%p YgOJFv@%y. b|/cv[}YpLsj,#})Dkm{QN|v R|L-aUaK g Q@;4KS$nFU,+?*(`.EMjr:+_ P6"C y@]l;qM&"_8ZYAhn4M ,pd.e:ZgHFw  > ? H J#@ #a\bz-Mp]AvYH-v V]Alwev8;Seo5]1`qd@Q*,$c:&+]C' w (d`j7 <Ser@n <von`@Rr T,Q}UNM6{P>k^oPv%_>Vu|\ DStf[;]PB -{K#:M_ Sl)P3LcOq{vFn7bF<?; a X ]  z 1)m:<}OO~)[ XM#'#i GqLCa>^adEapOp0 .4`++cR#=L%1@<@)^6@ G g  \d 7 j h j V h # T HLG` , P u T +anG 1 l   V ;0tF*tE4<{K>NkRaB+!n&JOe0[]{O,4!KX8R"bIDN86.cu)  ! V ]mzW pZQ'1AWoVt@eGxa2C  .    6?e-F%E[O)^s  u 5[XN-(5}Qv_ + ~ * 4  0! =d #k {gVVB c.lE:]Gz"2ukSh60xG y al/'ZCj  ,'Qe0 e3N Z X D*TmLO/< ut u ao  u=Dd ~ yg  I]*JVE?Z[d@~uQp2|Ap \BMSHG}R{@a nI2YqM;0 } 7n(VdNj P&haNA I\WXACe N$FFG.^Bj t D K P E'm!t  ` (D-JTckXP $ bkX,Cn1YUp|^:'|8pEAE+z">gjnf s 41! y 16Jm4KCM b/*]SrVBL?\U F MUU.lxg-u   _ D 5 ]tC *9 Dz_6L '  F`pd:n}w+`[?$fls,2#k1<85zj+]&}KVGr2 z p 5 Y  X J~x./!ALܒAs;t  !oIg`{{Z(]x ~ o*h`C M e9{XR  J g o zG WS7@9-8x#@`l  bf;Z, 2GeG ^ U MOd c X@HW I D _~Q;/MM@%Lc l /G\   9btV !Y7znh:   ? N`FT]vb+`?-(>g].-y >6ll#8Qp6b[%/m:,Di3e]SayG~eIU%+` W g /% D I6vY ?""oc Kc{wڊNA2 EE_) ) $ hck47~ J[ 5 %oLC(b#o5Mu .Rf .Ca:qa]6c/ 82   27hZ4|T 8./jVPmov@ykl< ;N =cO^Vb\?Dh@' _ -tdP8r* A(5{ P^+%TC t F'=Hy!a {kP a" - q ' P^Z3z_||~m 7 Pu6Cz7 J J iT1q5]#2# s 5 8 l 0[Wr (}: ~iB BV3X 3K.X  EtRf6UC/~Y+J0TR{x[WP!d`3FeR*p8^tvow/yV|?8xq(4D~dߢ?`3sj z2`'z21 z ! dx 6V(-{nZnx, W G } B D 5V1I 9 s } eeVu31gn`UC[>2*))[n<#1:3)O>7&Ou"4k6pJW,YqPxi3wH|"u`Q?V 5 a $_a+LO C@o.7G'+[}w0l-$w<l;G Q + W  l2]Mm hU 7'ui ~yUwD>pZ]K 2eM5Pneh64] +.;LVK$3[uJjjs. ]xvo+u:SM5xt?iTFF[PxJ  xH!r:8Vy$*I/YiOVF'\K\^oWA\ "HC?"NG   e7e& Sn\05muR,!Z ! /? w_3um !7}vK=M70c!7.$!!1ELJVg]Oc~|~b+Ya|w|W*wcRA8ATnti6&/k!#|+Z[^ODLc-f]sWj<^oj_575?99IHFDUpv`t[.12qOIo|Yl$L5Kd|V} $v Z&axW  iv ;  S x j m z y   ~ z ~ _ m C 7 K P     K S * E/FwVGwt5^+ 045}z;6]SAbB(Kz6$( #G,w  eaw%  B9B IB\,*:UGCW,nNzOs@$+Cu{uk*8.K<M@tQ#X8b9||Rey~ h{uv{JR5?ex0v6rH\:[{;A* : :l/fsw)*RN/( =3S1Ssj(@rQ d`mrqTl;ezz! e]2O?vm74`?3fzCU] EdM Rwd1_)\0PA[ RTt!uC}^6,~)&| kgsVqm,b3Tt!>XqiPZ ?cVR+4'"?EO(A B>2[=W (KRQ!$$=RB.B-a ]#*_Xl$ c%#h BR!D$Pm"~lwcL8<9$,m&8 G>(O<>z4;!oAm!Smt$_ k__sxrel _ rdGey#6%5Y@`6<Y4^t9 ^@3I1^~*lY,2[YV<\bQz$Qyb$7D_72D|b/N_>* .R3:cTTRaP85LXEVD3Ln@N %@n38':2[k:;>nGH3ltH=7j0vIyA ,ZO S3O#4U;N?C1H\QVb)n,)rZZ#l?6v+O^)W\aps1%o 7h?F+CnWViB,]ulDj7}Ld,xoj~\W'MIT&,+m%B?F UD | J 2"-coARQua)15R/ GMqYI:GO;!SNPS  NQG e%"y!@^V ! ZuPs c{>&,2] ~&Ah "b Q?p E[UQfS c,)48j$7ik=[k\k [{(7zpNk*-~J' >@,2/7Gh|D'R+2pE>XT}c ,x%nL}/F _xA<MIg Z'JP'!u_/Xxh$F#N@,Jx)-YbeMdh5wso u^'mZ@'LEj%x'iE7X]]Yw4 4n{x83^~q*Py5*;CEXpp XC &B#_g1W/]7;>"O8yrkf#KV9Eb`(\cg{qk~i0BC 9fx G,of )f:vvbtGNylZk`XxwspBTuuozp[`ZMVbI&`RZ5)86L`JN*+6JW-?pi?\|.!J\L83*#4:' &#3;:25H`M-#Y8+3"(8?< >IKQ5 ,5-/'4^_:)1I'%592  ,DQLHJ7++3?-"HK+L( .9+ qhy|  !>H2)@G0! /75$)KN80*(34:Veifelhihb\@-%'BcqnlaOP_lrq|}u}gi_vqzfhvf]gnlXKPUPNF503?<"!+wl\YPAIftythytfu{|z`m~jZadipclz  +$.4("28*$9@9@Leug`tuijjhg_Ygoedx|{whvrmnlojfceqreWUe{t{bVNJND,0@KO4&)-,-?IC>ELM:-:DMwyVTjmCgO^  '!%  !!     8@PZ`flh[o~l^jsCEgeZSPSbrxwkwqcee^W[bhaL`xlk_LQcy|}{wg^aeefglePGE>:2,7>4)4JK?@LX^^af\J=@@4*-2'   +!"*)#6= +' ~        -53*(02,1:<3("" " 16*+.7;-**(!-' 00"&;C;4ANPLO]aYVX[XHCOMC807:24ISNJT[VOQ_aYZb`cYKLIFA6031.3@8)2/1:;?;>?01=BD946,       || {|si_qwmwy|zs|~mdfeYXeeMEAESKO_YU`gryji{qmuzl[jhkumbZVfoaZinfaas{hupcmt  }ohTHP]ZITw|x{vhot~{khxyz|tbMPZTD?@6)+'(CGFFGPVahli^`ie[W`bJ59KG03B`vs}or||}yc\ky2&3<79LN:'%<<4, 'IX\gpuma^ZXXZee[RC645849>+&-(+J`YWZbjmijnee[VaRCFSdbQD@HE9:BW^LLT</7DYSMd|l:)0#  "4MNLRZO=,(.31%#(&    -( x '+#"  .402>?6>O^msmgfeeirxmdXJ@@LYbn|}trwywwtg]hzokcikeju}xcY^ZWcv||syzw~x}ub`myon|n]Zhj_fwuS6=H@8?ZkQ-%6E2*g{T@0#"$)F\UD( znjko[Wg[gy~}wttn|gWe   .(%   oi]A;\t{|~pJ//Ki~tseC"-7(0PnqWA;8UVVdp[5*36/2BB! *4:8*!1*#  !8K?(7<+''#%=@6$)>D='(?WbMDY]P[mhfu|Z<*(<NZrva=5?Ga{kOHguuty u~r][Ya}e;')! 8OS:*8S@% sp%~gYoz~~ef~hO6?fz}qiT=<`|T,-Szf]dhssXMWpv{5ML',.AC;:`o2^qfpgPFAJWSNPQGCTag]B.3?Mn~c;)2Iwmx`B:()T~yzXASusP8,)V{xcWS:&?ie- NmY' 5BBSW<8;0@? gq{OYp co{ s  +K&92 twljRe~xHKrsPp 2 *~o*5! ++1MMM\L 5cpY0 DkU <M )Yu`(D)eIZUXZ8K_I.5^y2zu]: .5/U})PH1;?/Jys6rf {v{>Ksi{y/-.tx "jY pocketsphinx-5prealpha/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.wav0000664000175000017500000051325412771605033026342 00000000000000RIFFWAVEfmt >}dataxwsvtpxpQU[X_ed_`^YZ`S<BD4+0:=<7.*22.9;<>*"79(-;2#  #!      %''') &.487:  ,/-6@FE0(.9RY[bb]USM?46=4/844A@BLRQMTejbZa`S\hg^USPJLTea4+ACP[\ca\b_]YSF-( $.(%5FFF83* !&-'"    "    # &.+3(">AAI>5;D=3GZVF8C8-?A>EVXa~~|nm{~vs~kz~{tpjedbisx{sfcn`KOcqogb`eiXHKK:)193(!(.1)+34608MD0)/5/%%  "".0*(*!%/4*%/<=19A70,1>@8:?HA6BMH26F?74:<-%1::21930=A?@EFA@?956;8)!%'! ,24*-0)"'6:2183)%'($        !3868<A6'7>A?5;@86::6/2"!4)&3@>45DX[LD\Z7:GA@?BGF7,7=406@E95@C=>@EG99=<9*%"%$    tt  $%&.39>88?FNI85C9)9B8/1:;=A@JQNHHID<;HF;3',*80 7.'+'4)"(+#&&  ,&+-$,-    x{u~j||~xxr~oelmkqtsnd[`aSOMP]ULNVZRMY[NNQSK<2:LHBIZi^JN`ZCMb[MLT^^RRfj]WZaie]bk^PY_RFAAJD59JRD;BNXSR_orghtwnlv| $"$5:80/6.!$  2(!'*%"(*$",5.  ,! )4 $ (+011?=,3?GH>BOJ84<=*%  %(#"(*)     5V=87-0='$"$*"  *7JVWO;1/5:*"#  /1*27>A900*     + !("0>/'6@@C=60$    &12?JGHG?DNNGNNBKVQX\L@@I[oshp}~~y~~m]h}nfr||{zzrkmxub[`bT?CSYH=S]]XXjjVXcfooehruolfb\GGJDNLJI;@D9:4-:A2),'$&!        *)%'15+*447;7:7)"($ '1BRHBTRMW`bdf^_jf]Zeo`Tdojemz{{~|wz}nycWyyxouzzzx{ihecXLSSQRZfb`db^_bejeecde`\XUPHCFA<?>1+7JF0.<IND;BNH61:B<)#*+-&&!38(!*,#   %       $-;6(/687/8?<4,2=7!%!#0.2,*<JE6>TJ:>MUM>5,.3365>6&@J76GWXV_^SV\ZQRcncQMYbR3)KdI,7P\\WIPmjWZecNCQ]P-(0$!  (-)<C$':4*!  " &,)&/6,   %)(%8G3& )=4!2/$# (?3/5?KC:SjbLAM]YGEUd[PNP^htvw|~sr~ywpyvcnqzvpd\]YOHN\WC?O]UPZ^\TYcae_`ncMEOM;% (' 7/        )=,"+7;6B@4/#*4;>5-(  1* ?LGFUmiPPjwbMKNL<*,53"(;B9>Y\LKNLA@HP[^ZQROKK:1;617=AHLCFULGVXTZ\LCLSSD.5NO7"BjR17RZ8,L:(;JOB@CAFC<6    ,,   *+   (+FON=, TW Rp6Nl>OL9UkK6QS6N_<rBkF,JbbFiiCa\iE*xalUUB- zkP( V]>hiG@DI5PQa+9 fz:D)"Y%pl[P)<, 48H}haG6"nJTVbnKFet`E$-bQ"+ju- AP4`@9dwhH0R }x^+].1CQ#Mv6okr?@J0{r-UJ+-/:Ui%p3*Crs`t[dz ,Vy;Si.OOK*&K[K*XQ_7I*NY_\Q5d COA|*b21V{Hlm@Jf^aq~GiLwX;ioP5H T>sJe] O)uVI' 6rf"YniIh\z2;]vlX^Uy-p)u11y?Y(J`U :\f?a5V'%c[tnb G}],i-.!{J1 WzH&IP K$vhc :    O cvXU&35%.+/Hn-?#euH{ 2T5+^U==ewH@&A(lVOER94S*vML`}}P 5  & x M < ZbjT7 % w , KXD,*5 5 9 ( :#?K'"@oJ& nr{b! )cl- dv5y^-= vRpSmr zY 5zX ='(S 1^  5" /MN^H - Tk7 8 7 p<T ~t p V }IJO4f5  X  3pk;(W^/E'00^-'!3< M . ejP71 %hhe \ v J slKc  m5#)H^ 292% w d &w}st[)h @Q(Cm3OKh T UX(iAQ"D>qC53j zP G J\~Y P7@pd Q K  ,y"n,r5]1{o?oI( >q#grI F$\n- L;S G S  # p S68AM @ Jnx? fE } \ a-|#OGbd\kjPnE PfEQL0+v9xXD{RZH8# ;+GzpCIBf o m d ].S Q <  !>")@)NN r6M_\SXe<#wW(lUw#o6Wi^%wMmH$ aE^ m[ jj ;$F8yy(l$8.[y#R:tKze6. 43_S+"srPXa}"o5NH&Tv/$Y.^}bX?Nm3`C5N9  o nz9 rN%|tr=|aNaAL_Eo!8Rd m 2/\aet@j3+.LK3oy>;6B' cf19d#v(G: 6 ? ;=lP[O{ r-y^k?y'MjkU@w E8"QR=hbV 87n}EQ1kgG $QL1%Dnpm;u@H  Lz<hzc  T3mq6c|rc<$D 0 4C1NXMiFz5{G!'ZCWCB+JcXq\7gA7>#e&K2ld ,I7 #, y > , g9vCU QsWspG9*Wg: M B 4 N THlDDX9nAanpOd;k1D8Mx"ds"k7>DX m a#I2/~!Wc S~XM3M} 2 ]jP; Au(*c>koT,t a z/hP[gjpEm yZ(s Ps (Z 3 S#$#!O Jfۂ`(wM TZgv dM@p;(`V M } c1~@9}" G h&5F%qO Iot]WW6& "6"}!"".P wuxzߛF r=/P DB!|@/a| /fb (>>p #ql/0]m!5HWIs~`. RHEs ""#!C }?a h-uj eTcK /cO1_ 'e.p;M=7`y;%7 IjA:S=O${y_fNO ]!G#<##$7$"!~AN`g7A | , 6 # 97u U:YWs I> )0ItG=| r~d8%eXVavgF;etjtD R"w  "op{1}*< k KpJ`  C :<^ n31Q]  N _j# ,8s4e|%G -_gZ(VvpU{m# h&+SS-Ox(w M682te})~$ggr J%h[`>.D7a Q`6cU3z_!  45O2m41lhRQ)!~o  x  ]G1s93un x G}p)hY]Y%tJ[crlJ |  | K _ ,( qxL n7 y3  le= UV Q Y [ >/ D }< Q 5 b c[AYHeCqNA,8?O >q0v\-M0z GCmUdN 1 'hB`AMm oM^ hz  f M ! !< )Ng F{ eT3 D,A V oD E 3} ]_=Z;\CTe 3 wy wd J 8I)~wG f  HtZ 6  J/0P oSgPA%5G|0| )3?`c. s =A ~ *fd 36 yF o]P 8>Hd MDW9 (O FBR r vX hY Kb NGyLaV>{ z \=) jL } Sd ";; D S/ F t su0X D [ ppaRKh &   Km }h ly&7 i   g 7<*:;oL#$,E {Vs $ ^LA NY=pKd- ~< %r %X=l 4f0 X0%l"Tvy! q? MH hprD|] yvO yZ  g1 /dbUKE ;sax2 Cg xv X4~o)5V$UO\(hB>m Hp QKYWQp2I{ep"TKY50>^Xm0O}ab}=:Qm&+VCc.@'Qq<ga~*UxET$iU .q&Q s;;s%MD6}Y*)Yz5]sIs$+Fk.'0;D~/}Ws cGOAfPJV3 )z 7~>,-)cu<CZi0bX4]Gj7 /mdquhp gmY&^[nVAU'\K2'0<u&aO[:-zaE rw :[Ti5_\0I$pJ~i,"/12iDK)Iby!0@/S}~"rI43Q\o#$0e <8OpozAPpsqZ:7 5J)#wW+xE14w6$Oozy2m".e<>c^gm,9]w`y4' #/*5( 3>:;9?,&-;E3.CZX-$@WI&GkTYjml[jkprLVyYtx\iuozpxwqdugcf}e;;cvh_wfUUNOB:T^I<@OJ7<\gMC=1V{Q9ol-9XD/(# ,H . >(3?:#87 eo%!1 FydJFQ|n=SR\> Yka7`rWe{vtx!9~Y#; \  59u8s 'XH&YVyJl>vwT{Z W) (l$).G3#37/S);P)y]<>u)"wOv6!(Z}VsVX"hk)ib#^+F-D +lXf0BTX7<Ag3}/Nj274(CH`%8Y~+*LpPc!~C|4f`]xlL:{/VM>x6{xKM~_S$ MN%tm!rx?ah+r=$q,/  t, die~i)o?vdX*S m6T^_8\ryCaw .p'P-InCa1nGW t?lq ?;nYEy I    0 v m~  O v n=a#RK)RLSU{l% .d>O K2cgNZ)Xwb^\=|!n]dofT;Dl 9 c_n %S > ) I pBqo$`&Lyf?R# K  kI  S S /5# U}/[{zyBw:d">c,_ lcnXudWf . W \ c I  A V<nL;HplFFTS.\kNvAQ+A\/NuG*>:Is|}0H & ~Nm/% ; < B  s\9fIe4 *d9G5@]|fDTK\t6)0gS7_9" 3U H v'$XZ57h9y0h[CFk'KAmCmeZ Cb2L.&|`];A,$3J SH.b (AC=OkrgTOW<|Ow]@g'a@# {L_A, !!#7ENl/Qz%tS+jN E{+f>u4^)\i} be~;o1(%#+IyYy([v+Qm{q{g|~O Plh6 fGO]*!zWJ! 7TW v,JQQIJ>8fmeO87aaYACwpnNs+=xk#F[o"<;\~6 UA'LPL PEh2&ZjpQuHAVIR)r 4VNGa8|T$Aad|i'ZtS;Tt-Mua$:,zBaz<=Tj *VYV]cs/:2|Wj4\`[yrZSMi   ^Wx2K1]|,1cqkG-sBRv!R/{2M YM[ fp 5C{6s>1 ;15 !"x"N#I%&&% wt%"*9jgRb1<l /><5=  |3_G<|8v J69ugUC[Q7vBUkTBt %d4Hx L:5$hr!#%(((,K0 /.,,,"j$\c6k-&ވiQ i F$S7! 4 # J?(=@a6r yr?kw?R'x 3m+w] ti! !%'&&),6-_,8,2+z#? td ! NH/kbG3PB K%L& %6 F D9n[%HgQ7 /e5 DRYsSTsdz5** X f,2T1"n$#5#.$#d"&"! ` MF1g >ߌ%b^+ %v ,^ph{\YL x   LN;m(hUXJM"%> }^|,s5""V! !5#j&F'$!~k' .9Jx.M ):)  SRfyI+1n FZ#$ 7/sL7 ?,(Lxg9z~I]4VhlGLU /$RI4y!/#R!e u L hF11e0 {.C pM<U )kB:uiL #0)`MiTIDU%)ZWb ~,gA?z,sXtfh f V q u8mg&K  i!"J  ->SkIhx!3`H4  ~;s 9 Y=pFy+A(/*K1>vsh-b5aN#fvMqZM]5$ZQD*WYzg! 2$>A xUu fMb]LW1pb \ 7n # ~bh* Xazd:=34xs( \|DSowe*j&6ks*0j7 Y I+K2snu`& |P!fQw 2 Hr4W6u  -J -yf+d2uw16*7/44)dVmpeY n-N y >IX=G-:[ e  Ah~L3gW *Ur/it A & } Q })N >O4"|>^7Rb6=&oDj8p)L} A  jMrvOd x  43M-za*"v 8 d|_ ~  UC`I0^c o>(lbK8{=dcDR=p/h  ra`*!~p ?,F @jND} k& # yv u !V>KA3r) 2tBD)}gcOVI}Qa R&|wlDz7Ku  >xBY5eLk/y pK/^:h5GIZp+ ov, vp+M"rhS~r~lj <MFP t$b_y \OYR&-2pW 5 V "m]IEY\eCa\i !SF-k[\ [ @ 6 ( ` 7 9 Ory-iq!oRZ!wa8\94A,uV8oaj$~I:~oY{?T5G  =I2]WY,ZJ7  +"MB DfAI30 0 w G Z Y`nJw[TOJ9y ~CvKV&u1-t8g7e.;f&D*]0"\ 6 Y:.C EOCd~0F_i ,0$Co %aOm4 E3  %>'\ "i/6# 3*y E g;oIT{^h_F2 5 ( 9 }    7t6t`NGE)_Qs> @"2u7a{,=~}g !LFNUzR~8eqrb P s WPW{+(i&& Q7ކd OjOj2e ]U5 |WyZ%%!iVvf C=_` @ V\ MJUAG][/F903(J66{ d ! xw_ht wB%QM8:q"$\% B@,( =0~  ZNan{|SuY53k[/iK\Jf]xdlLUj b$1 # 9 2pPS>19EY3%: Z P2nT+G | %(jA# . XJ[7b$as:H}dY>ayN1fc&)w`"'g2Nd?@S >~rthM]~\L. i_ T, Eie8 5 N   W [ ?POISBU7ex7LFW&_C;dR-";7 ) #Cb]y+63 }[B V a8  Cu}8/n8"*eThRrH:4n3 G p Y a)\Zh&ud]7tGkhGyHgD # }A9 C3qkk  Edo4#  Sk. B / 2 |_:WQ%xpX6Q<Sxv3xiv:oL`|0T'?"~s+\?0DR%g E@ 3D $!y.~,oy5XYSHAv WAF #pW"E3670LdF-V 5Jw@$ xG DorVG0 F@Ux=Y3_ %Mp  X9:  $@3rJ80 a = 3][+lW= jlO52~p! X?$G q ncY s   S$+aBM7iywq:b e& ^ | k Y9  G ? 4F~RIFnM^ +j94H>klB* g= ` q8#Y "[-^r,pf=1 Uwf9  \  o+JDEV~\'(Bm*X:}Yw;[)/eP{UdplE$uOC;>tjD/R^)'0;wCzb2)kY%zRER U  = 0 j r ! Y3<V[-HCu 4yn*,>d;]%@6%YhuCj]$,*~(4/\/!a_T_llquBRV= z+2S2O_V `  0  wBZ0*# ( #i]apcsBOA#&,W4 !\GOZ`DZiur AR6VzBhg;Spb}Bbkqv 5K950)K!73;IC_)BBN4b"-:chLRH>)BEqYlkC,;13k R= yy&_f(mq}PJ v t *P( n U  h")GJ ]d' 8Y LGzv/:}OLxjT u OVd Y)MY89f.Q7 T 2fph `xcpoX!M}>K \u  ~GkcxVJa'3SXp.1@z5sm;  91Jj2Oh#)E,FG#BBb  ` R]  8 v#*XpXX]qI_$?b  'yLf {zorGN y+c%T y,s7A%>Aw &Kxv-Cdd(a~ k 6\y F| b h [v\,/ *$19kh(k?"Nb=%Lbc\47dS^8J Qdvy -gizWU>XqUu %kIG{QL,N9(|) U K m  pRc\AYFXcl?!tO lQ9[X;Ndj5=&l v=Gb WK)LO!9d  J ;?>^0g)  `  C$2i :2;1Q3xLSnWwPrq#!6`9[3{C|*W5L*W I$W |+z_gi kvqiz/2M) k K>A-TgEV@?t3AZs ;Pavb$%?i-!ne]lu5no^ri@ m T ( u 0 n jZ3 8>n A ?Durkx33%aK=l*_*  7Sn@n>Cxg("z"hG8gfK+zLXzTT{,f5c$,Y=g *%o%CK[*%+ { ?obb l ) LXW d6Ea5M1slsSx\#TCE/S`1|_}r%k4]hPc+;LULj?n>V[" N x s A F %  = s : OGd^t=pvZP73 A+4'5Q~f^SU9SV$~.?9d]`m/$ uz26y3BY iKE*I} HzEQ%_g&Yy5z &!GPCc6EZF7gb#Qnx0F +``c77L6L|M]g7Hr'aV^L#.|35h=IK^ c&/1?D$lvE!PXf.7n88TIOqa$946fnU"YE3Bo}e4Vu<|{ P'c l[]! \k?# $_ikmxyKGbSQm=/]Pzp:%>^P{{aE?C<;8:=1,,xVF1#S|w\HVooV;>@-&% q`c^>%  5==FFELHGU[SJQeggx|_QTUGEdwwtc_mqms   }z~| &+  "(05-.DCBHNO@<;@MQHEC64/##)-,)($!(*$56*'4;1(0;/ "       ! #1);K1@M=BHD7.75"*+,,5BB:=LJCG?./.(3;3%&9*(363(#4% %$#(43)*;1#  ++   ~iou{}{s{y{~uwyz|us|}rtp_mssutos~VGP_VHZf`ZY;*.$#(+85#'"#"3@?.%19-"*;?47>;2-3?03<445@OK95AHB7$ 3=25<4"+, &.881($-=,$$-<>?7AYYNJ7Ca]YctoYXgkbZYVKCPSNJO]d`Y]gjo^Ow}uwvchkgefc`ieQQcg[Q]mbX^^VNMTTQRG=:=6*+.55;C9-*+'",95339;2/38.#&--+"#)"&5215;:8:=F5 ()"'/7@>8AG;8G^aUT^bSGPYTFFMIFJLQQJR[^]^ai|   $*    ""! %1-     ~ttneefovkq~}vxltltrklwt~ #2&"* "").)&+0@K4=B)""<.%   *  '+&42.4337&(- !*02'$0GYFLgP6701>7:H=-(/85/:VZV[[]VRX[\[_eXS_inlr|{shTJXXHQ]TJD=@KOI;AL1 &2<0+08A>HRBB<!-2EGAHKE;86NQ6?GB>;FF6+171("*2)"!$!     );>608VYAK_O-.,",.+18IfVCR[K=BQVE>CD0!,*#,)?B4BmeVhv{sos{~sfjoEBWU7$6JSX`wujmo`Zl}6KeBv]DraR}  >|Q:-ODbz>pva[yz`_qJ  1EBPov(^-7.R.x2 )#$D\/! Q3y_IRo4 D`Yi~O4 zRv;3Y?exW<FB*cUc:{z,#( v2\'sM {f)\X8$G48ZuY~UyFSD";#(i  L Z986g  _ h?u{Bw\u1U_ O#=`b B u- ET yyyfA`e9 u  W9xD6s>X<pSK4.CU<gk,4m^ *tMS2 8 _"}ftA5f"nM0=IHKp@|WL4\c*145=IOS> ZIt& y!spThk{L}&;/n/}D{[?O-LU\uahCCP5Pw7tZF V qbCg&  ?b4VVmJ`'$+Hm7(H 4 2Wa :+/"`o yQ!uO8a'P_S6OS)grAEnw@kC_<nf\}H,]d!ki1)AgBF,(miLr(tv7Z> I2qg@.!O:UAr?w,u p@9FMN j|PpeVnO?h   ' }NBk-DN 0zgZ'!J}q\)e FdK =ua >.<P9:M/ww+Fm3<z^C#4cni0]:=MY=kR6oa~PdTxV9(\X4H(/qA=o od j r  * '   x_y&?g+ k`(X_;H6x03oZ% dL0:% ` 7dO-o_U  ; *L/h(k """abf{ ?^htx *A  4Gp;q,h/ yJO83#>tGG+l%*O"R_9|>] * `UL!g$'*p,7,*@&%{:ޒnnԒ֕ڢ!"_ y:I \Kauzp9a HPE Mp uqYwݒt8r { ^`"9Q0'Tmx /$d - H * p, %(,K-+'"K<#tm ʇ#|h#)*c)& D. ^:OH)XF o0 BkC ܎Pcובp  p  @ 9u|yUI.h 'e f s eE%D u 9%)-l/-)g%( FPɾȓˇ׼i] DW 4! >7:" M,(O rCa 'g 'ڈֺ # ܅ Ao3 7 j a/ExgHY"D 1  ur#3G#D'*h-40E220,`'J K.̧f c&bC^%M*s,q,W*"&7 p {LVB0}?N Z" L >\7bp( v5֌"E DH+*xXys  %~V2BE"&)-0I220Z.)" ]ј.Kbڲ $+0-3d31?,&&2  ]2vz.8f  :! 9 MiG%&1k  @'U~o 363[?{9y nPG(2"&)-0]467663-%#W]jʚݿoͧ: % ~'B-1c32.)R$a[ c'#Jb k!iv~MyNܚL/z.ג~_yX: }Rd,QWP^ .3 <$'+.M1222 1-%(v  cN߳U ; m  %+*-.%.*G&  K,Q-Y}])$HVa M ` C ZSal Ho51oݣBm KGm"iq,s_e) xv<"%b')+--- -+5)$~ AۂեЃ ʀմn  5"&4))(&T#.( /EW.x^LX}C dvh, vtܿڏsY6IevbQ Vi@M h>o;!#q%@'(.*n*)'$ Q| ޢם/?ӫߗjb"&F(('G&6#}4 1h}Y${ Kma -, -7XaFۊ!BiEw ` P Q Q A,h_{(.^E q5 1 !Vl!$'1*|+,,,M+($>g }yߋ͝F9L' ^#(V*+U--)$fs vMjtgJ :&^~{8 _UYM*0y>bn 1" T *  )#yIXKO  /k8$ !2""|"G"!K!8 $~% I\%2ݡ^ըLާee*y m!#8'^**'#^6Z #pdR:L}i .  LT f  jtrdsDK]Z ] m T/nht_ kn8W7jH$ _RC޳۫,ٔر]f}T {u $'& $*!<G T#LvUOyH"jy_7r ?6hb. Qx8p* cPuEtE i K / c~hm2+)$ixG  #x* 5L1rL<=9)$ 5[t iOl 9lpmw  c^ #=*"K2j( sk Q  $C=\:3U\.bc0hPs\ >)= d{sf0p8? d C@!A{KhXD z! FE J Gh:_x6gU O}[Xm]iD._ s Y  ,  T B%q MwR&!tTg7yeF 6]?2J#w(4T 4 C sMU@< 5G >  N\9u* S `"c>m ~ N"{O9E\I8T ^e z  =  ! xRl{1yy3z}LbWYR"s{tuaT=,>Xdga40 B / 4 f m e Z 8Pw&2 @LP.li.3aQ/ ?tU  0/"s'tuvZ@f( z  J8w?.2$LQ/w4XO I#[?u{f.pYjf#Ha 8QE;  5 M 79:f bG9 }! '6z< " F4J Or'q C}'Pu692|E}  5 & X2= f }d~kg~NO Y-$XFT%:-Jgn#LpLz  { f E > 8/ 4 3H h$E V  C ~  kPAvUo kbg gU n o ^ % =s~jk&I V(Y)r?]zc Gf^k<7vLFl>\*:GZ() c M  4 q X cZZhG }q {t'j[F Oja: V v K  zV2"d:q?Eiknf> W  t e 4Y@|x8xaY(MJ; M4  !v`$,QD\;SyIzwh 7  o7 p M b2#qw>@H3 i {vyy !E+3K  b q 2 1  ~V2y,*onpV j))y _"c@\e+~Uhtq  >7Oi<JpAEY*)+4ezd/?k<V~EA9+ B   Q A{Qy.p~.! t    MYGrpRl< \\rsx]? f)Pf\R Zj@,lU\@K<H!Oil:$>6Z1j  V{=WL+-vepS2^B]>MT((pA4dK $:NFo:L  1  <   v $     Uw@"vrN/:3^b ` gTj-ak^6KJF\COdPVmKpPW2I x rm?4KwzT*m{RLDi@3+R?RH)!A0s[Amvj8dvAe4"*UDwr9->N? Zf*d6\IiV^[SAR?ak}Z2NkQ ;^PCuX]LV3)SQKE:.b  1Nk-6?)q)3'djH+(6&{bW"q#B~M'vV=<3~^qS1E`czt+~^H~" 8Es.Q?*;3a"E C'sj&ms,8c\Kp= s?pE,m'?MFk9p 1xi T P>E6aZ`:D ?wIj q )m>$? bi> 2WNfr*<Gi|_x)MYA r'$FN{>&>#i l  +  nhikj T c  *!8Kc t H & xt#*JZwqjW7;EnnTW 1Txw1Iu^ T[Qt5DvhQHP\]{3p@Yz~Y9$`oYlZ-w eG&x s^N*%"K\ N ] e J : q  y Edw  A  S h_ C  y x G , fX$ h  0 Y ' ^ 7 -:t>lbwwf1 q y r v=8gn<%a%S?D [>TTO, .T6aq5_Iu></gBWp A.jRDpp*btB#,`dXdT&| 2 q;QwqWJ g_ \\t5L"o{b: c ` Y -=ry | F\UQscN+%GTAcyf~E7R|lk$&+7c0Fd2YL kYxg"a  Lz}TD$l&7y+9 c+5Dx7]` diWX = 6-X ; Yvr 9 "h_ - p:PZ:It[>+-dGX|/1h w Hy>Kkm<z 2~u^M$,e,KM o>tad>g8jr@ZG}LZO'nkBX"1 T'.,5Eur&   ]3#lXd<  C{XX\Y}L`wC%B[# 62 %,BRS?v2" 2GEH [9=j1,UR3N|A  >;~7ZJ_Hx>+W9 PzXbav^_ '/!^(LG1K-J]U|W]Kxa9 &$ xq" & }  Nlr2jzV[(~~e8kT4H2512|HxPb7TwUr{mUF*7 bZU W8+ [w<~f$@`x?6+9HJ=3@ Hu.~:  v Pf &  W V : Y C  $- ?  kZy,jQr]Adx=(Qp:lV}p O: wV x!Yyo  n0m.5ez l^ ZJ.S0.(a;-?X NbLG'"Pb#.(/GcF~g_aBCd )jZX X~V]7d8%'k\<}&2   w   *  E ~W VPq*r :'$*/ 't>: ! O"J-u|6qKfD B '$_cN["\Yu7 f`OLpW 3Yz jA ];ZL)^d *~y R2bF ;HE  , HS )  n k =wo [Q 0 ,X\bwj't7w& ^Nhj+u6u2 U V*UWMcHx nGVD1(;%c[(IC|B5j*!^%:^5NsKafBea*s Gj@>S|  |5 S"<ty[f1 c}n rLF ?Er?y dr >q2RCAD+ sn8 9 ; r P &*ajc$`cHm" hOxclL &096@>zpeo'g7)V)(6vk=.*Aii n7  - y eP?6?&0 )J#Y8h y) w1Y w|7   { r]tY@X  ]  W,AyL_fK @ BI}kVv4`+D?q}Q6>yDk5n}E{(f{A Y#q&Mpke2<6huG1. p  r ?  NjC/ {OWP G Q  J*l<:?#iT y 8 F /+&b.*d `vcI:0,vTg2RFXXP!   3_"zw8e\PTG-gtQ|Il9eZJRhK $ W . & (&a\Yx7m 8u # Qm<$ /k " Gg,\&H?-|7 : ,|ClM#?]dj!U;l3hO7fxX#cwK*=./5A jr\rCh\|i/Y]=_Kyl6L!8ge($$fN6   I v'4   F ? TF$\T + w   l~T:J2 gk1K NNUycVl[xe\ ElTm/^ p]* OX3Rbg)z<@$AFv=W  p7\-If9Jr#N8u = $f J z   aX&3G  S w j CC_Rvz>XtoLy*CvQGh}{UbT4@ f{?@TJ?aF>sCe]'RaFAlFT~i+y>'q^xQX>q^yDPJ)~hQ_ s | d11 N j SL(YzNWJ)8Rbk KSyXfxH|`6+?f9v<c1i}>* P{hC['X)TljBkq\I44R)n]-dRuyj$'n7i<ol\P  B ; \ M   P ( 0,~pfh<@*<my2L{_CZhEDe t|7)S||njk)gnQ;1,$0iR yG-Hyr]UB+$"Fi e@`.#"<\kxhBoK@2VLrb4$@ZTev^OMmyP--+6( {MZr@/<Ka-'8]eX_{tHIRl(;nd\cM7ppd2.Z.LoK$Bz\?Ixlw5__kRQ@njBpYMPH&k0 G/SW DlY-",4!l R\r*B0t.vkxtls)g.d4s x+Si!TP70l_[10/D6  ENGp+ ,eDiD6 = K _ S 6  * ! B~i|.(D;1fj>{ 9dEZEnrH~fUked_TjeM,;(r6e}TL5j~x|i"W[}y8$@Lr6EF8AZQu^moE 2.bL3-S%l V  ! ]   h P H B @ 1 +X ; /x I{4  I/K2g%E![,4$ IgnA[wuAk@7{:3Bo8kN+B%8$;=\/E9+0Sh, X i Y )   ^ f [ow, TS iZ)%d'n \B u$bMW4C6Fss0K"VbH7Uq@:d #@; 9 f ^^4iQQuhx|9HCDm  [ t R v H 5     @l nb3Ga<`.,vD2s ce}Vo?8~TevQR("eWzbA{b,6/*j]*~Id[b@5?_,=LX 0  8 f wM @ V} " S] U P7 J~ |^1]q0(bI0%GMQn#0OacV }ZsS@u)ty/xpn/$jG+ LPrTZ~U(q `V}B|t G"^0@"_m6&/%iH!Ns7fiWzT|^Gvr\Fj{$A$WZ:1FTZKLk7[ ZA8J! +  4  ` R 2 : b<R5 zILgC=MIlUs\[PEs+s>wuGUubPrMEYx]<)i4) PO>vZE *3g 3'E %0k Cs6.}| /]<BOW&)w#zm[HZ]C1!9Y}fLkL58}yQ%0&q#Wd/shIn7 '`c/)9xyY;@U3 \*A'9|25)ShCGbrKUXtU@~@c>E9 Ruyqn{uG5-wuib}sa>q*Ha7 .:DF!=0 -J\nzy<_LPMfmz.F} Bcws:nWTFr9ltjxP$GK ~ 4L_t{+96=BRai{ub[Pcqi ?K-(G`TMroQ]eWa^`voSKYeU6*43 znUI% 1"}qv|d>/CJ.!",:PEFrts.H`%7QF9Yga`f|y$>LGK[ZfseiafsdPVI33[\Y;"PI 35xQkxz{nekmeL=1;TR6>[>D,lv ) CUF09'F$/4&+HxX@Zww{KCkWpe:;fT)RQ?h|V\/(?e_xd91Iz8xOBv"\E; {W< 'cuU,OCm-(v>k)h0q qj>X2lXn!JV1Y8[O, *mvRu^`oS gngk9!p["Pf\ed#}X3'%xoPwd I#?@ P1 b)`9,>bm|X6BX$C }h%~Pl Q*`Gy,m D;<oY Bj.:2Js[~s354qR.!GtoP{] <]."v&L{ XImcefRnJ(tP=bn?No !biM%!?IF 6VD~-[),}`N*x[$L1 ]sC.L~vima`Vmufa?__3k+ZI#cC_F8 (yXFwH*iJ-yIu4p^^EFtgV+[wCG&6?es+g*#bv gP@I=8qM#|VHOTNkH $6Fchg<|%xk c;y<:b$ w_W*u[{z% Y]EP/n>)G}:{{+&B-EJ>)[w[{vV.jq[qV8D~I2s1HPL rs}nFu];a?Qw6Jz"SEFs{{G5/Q3~ria Sn}^8o  / e Z =]Kg)U[E84)Vmtqz]F u[?Nw2Y^]G]2f j cK s [5@kK~.-O^XR=k7*RKtXeq5$:j2#5rE5i$Lt3_*Ud+ $r#+KA+=1J2e j#TVW<EK)x)"qV*b. ! <   O = O )f%4.Zc6#xClisCK(Ko`H(3 {qhs\qiwal'2ksP[}t\ZlN]|H$/P_kQ u,FB D#$1Kj4d0KynTn)Q[N#!*1J-[l")&=Fc.Kf?/s~Efh(TL:3Gv\/=A&%([Uh*n|yH *8C=E&N_D4]jJWs q)k3 E>NC:M?^HA*"?aQpMSG0> \V;EF2CxQaN<o Cm 08VY3 uPh1UuY:My"S"R)k$+bL5@8 }Q!]ZFQGv`-tXfI+&|qQ! LW8-\v x,;!&\7ewqXQv5[Y`v3~E`~O;T- pT2`Vw 6RZmEFz(l+M]`~w%aG,-kqV{rB )*[Q|`AIlGB(4gI^MM3[KfE/|2q z{v u* ^fl"H V m;09HL-$R! n n X7dgDv|Y-!\uo]YUr,v =l )5A\Z+ [F+gNQ(g pL*-&1doFdD q#OS-Ps ,G`x@t R v Y  zk/Nqgc#ev}fM;?gN|+OVm=py[dde{hs,gBSf{ WkeL(G| pa~L9 3Ub\z8 dQACvj[)AE F0DjZRl//CHN"r"Wh J {  i @_ , -v$9T7m F &?f9)r RM4\}$G}6Nu54mXR;0=:8%@>p f 6dA'DgX_00aYE!#b  g  I ! r 'k"M ^ nVWc ^w]9w1)Vy P7>Y*A;L z`i<pQ}cg]GT4E7E  s u_V_k* tk  H n s  m X z 'tV7  c%Q4uq  > [bgYJ.a A9TP P{l8$sR~>@SY<Nbcs9;)?I|>4c-NurylN-^ L O {  h _ -AAJ ;DS$aDH G \sn%^WZ,nG[N*0"bznkHW1c)_/_%vAq!|huW4V-UD 2 &  V " ; U9-1V+_ ^ &V P = )X@ZD9 eg#  G %Ja>YPqMd[\WoIs't9#p\tg#;\JO\u|u&X{{Idte,4@ D $s  o & \ r *Sg&=;f ]f - = )C1fy;[Nz> Mh D_p vYZsl7=@ndl89P$ ?.lt A1Cd__ tt  r ^ ]? M [ 4 6`}< $,~:g3> 7 ; @.[tSm:8QDK}VHa5S+#-P{6vR_?PZDc]?*,ck~oP e0FM 1 jF F { eB: EmNt I L?.t|IH%/8 ('N #N /cGo * /30T @t{Ol0~\/^@[G/C=1{n{s..&grK2v9p.Yv O w  r j 4  Fe .fX-SGS    _wpR2F\cv50 {l7/`}U4?c(q~G}S##p*<K1tb wN#,TO O ( J-y N t iHl/ -f vGcTx } & B  ?pc4~oN7Pa ,kq7B"gC#$w:#fl=h4>>P eK_n ?  2zV^  ge O N_|; J 2oY  ? `q|*4@ER+q 5 oZuAOhtE\dO)zTe&03p}'IC#rB[M\>=d2[\vkzx 5r BbxT1XYY$6Nqm=T f i ; 2 ; &aF?< } . E JJT-!cJ2qnP~``8-/&1pfj4>NrU'1 ?~M+L2 Yvw_:[2&hdG\O}plOKO}f0D{r* / p  8 P   : e}q$Vi#G2 9rOESBXc0?ZHDV -X~s76H<^tO}6U}W` zF, k!<~LwJGJ4Y$Q`*j9bCe%rC_ `sUFnmj}`R39B_qjk[>)"#0LC9:I9 6IhBBV$w"gG}gT9tye>7K58q " ib]7pb[)!puG#(!Bq`,]n|DRV[v.pIF0_F|t %y*6Sm!Q hUJ3'/+z"%H Zm&M)1 @[q<-p 4RloVLXh[eujI>YtkQnmG PRu75Kj'%F,Q;H?/3s0E dN3 N<1Lb]X5#sc&p6Js"gl)tt/vGXj=;IVY9pIO>\)N1}%L^>cq4 M2>HzF } ~Bo^W9 xVLt_gAs1= DnI 5Qq<V^y+C8FT1DLi 9 N{[Sq]W\BKWKXATSNre C 1 m B I %%4f[ZoO3+&$T- FXL2J>'.C>#4{+(v!ClXr\YgJjk0x5#PLQY7 N ZIf%k ] o yD>thq}t6~(#?vzhg~)V=efgBQ:$(-gFjQb k 1c`(&hE J _ as1N$a>*$2*;uZ$L'ZB;]?5I &d7x6x===cl $6[7.\u~a'[XqwQ}^d  DCL#lvpAs T ~ ,b(yz;Pd gyS H0~eU#%46Cg9J3 \ ]x;b ] { \ ( aj6$ t/# )0$jzBc5 E7n+{Oe_;p"1!jJl ;4)9Z9Kq)uOZ{jd? e Q|,4s [ L | B s  Qk]MA  h }rh]=n=Rs:caU# R8 q8zb*G[y7pLnt0 )Q-H`MaL!}7s E }$ VNfg E S = k|F|nA,_2!Wba 0 '4uv*!%}nOOq'P<(oJ;v2@em<>p~( XJLO7LLzNtqs# /rZ _@ BKVRUR4 \r1vJ \ EwJTl+fXx[ g(x)-\`^#P~0eb)nkbQVtgPX 2#B1 hDM{xQGlEz!TE oT;8 Y W B Pv2eJ"66w O I   /9T4@q\ww=(Us p,-m`eIlZZ]/;cBABH>>Wi>iGUjJF$S1Oue0@7L  9` b O z}A ,;"d,7qNcqNHy#Ca \Zn_(!}!;.<ZW<_=wRt mVWC\7 >cfb Z*HR[2M S  a 6  CUa@'RQ~Fl*J};z_t5 qq5F.A%vP ~]P3/">(@UM,p;|';/JL^P_ H H W  S Lo :L h n "  t}X/nv@qGnp!D\:e7"j#=a&R#l$uVbiTCDqIUQPxr,EkQa4@&-"q! " 7 n /H2I Y 1  ? % u7("&[vX %dqSi_H R[_WJRQ cRrk!GFaQ/2Z,BRZ ?Qs'v2yP # q  2 g< g : k  R  K w ! % E ! Qq{+jTck 1ffK%EIP\ eeL += PiY1#+sfc*Fn;d$ s=<1x` Z x( 8fe5]eHxtpQ)nQg{pe.#V\[[ iX3Q)o['8@LuUuP5xS#'m{Zyx )x. Xe "  Z)S{tyG|Bm=nA9)v2uhrspK@]d%ok\29oY0}Hd){6dou9 m+cD @ a6zm Dw!="0Mc.*mE ! w }JBTEeusDrt8?kU# *JG#Q>'BWn V K- W@~[qra{a?' EI-Sfbsg:TE8T)q :@Q|E(n/K%Y=|7  .Pv >@ YoGN=P4q^ J = h5  DX<@,`O0mk7Z3t./q,yXYOmp {US+H,(P QH ,2l>.b  N`m{#!Z) b:8m~~ % rfxcNa^Vnp'SX[DA=yQ~B_ f-4rZ) BBcGim%,z]d P2 HK* GV^z:qy)t)2fCof(oG\sr'N\;sPw!8;Wz :7Zl@! sd=]e",nYQt\U`U?em18 6h6(+^gn 7R</?_< \u^xwr7P( h.U7K GK +_nF*x'u{D[%9-aK[(  2`_]w"0(q2X/oM%{G2z;pUB[sWey @6,2r1,hgv);eA6iG'5.fU&-4OH ?zo$g)L)! e':4|{3c`6GPYu}MpOo hO5C#0| e,iM&.P>yYt D=.Mf_  h-7{J@g|52OZZ >.% @"X``rliC1S 0Kr'&7U&4fa!zP3]kuFP8 (>';]:n9{\fbwK $(D*[/u}d]sQVT)5HN/}   `]_ l) 9&14?[RwjC!V.ze;wY5(w)~DkK ; =*Uy!+5XaNwOdoptYa[z0A%F;yeSV9@fhdMf%ylN\NF3a6C]Wx* PX2BP_cxI[{.,?#_oST!-)5^3wKcw+M[]be _k*~i&l &z"q?\Ke *Ewuf 9#S -=TK]"p4W dM4P?AfhyM\ }D P%mT4r0 paDoUqmg"2C&SrL8)DRbR,+_^FlNO Ye Y4@6pM1 &ZhaB"eZ<8EWL/12 zO\|R. B-Vcf(LDnlcNgBZ4`|n'~+OQZ}WjL"d _,}! e\uI}NwmD~Z?n%\YqC?,+ex iMk eG!2,/-N][pA Z\cB0GqRD \EKXJ}65RxUxGqd<] pKsiaPxU..dVSV-s<w xSVC%4^ 8#DcJ 4~hY7'{Wmsh7Q02zZdg20/#Y8]-fq ^{R;yyy_92Nlmb[g0B6 &5$$lt2;"]UEBC(b|+7V[V=~@& iOF2SH =%a </fU,|Q9eS \J*MNCh{~@}})z%_SAMogK; ':+t J=9Z8qh 0bkA Hks,YHI(a+,XdWib|2\tzS fron+X34~ *P,xvTb! ={J'2' ,~_*|Ay 5)~Uf-,,tJ  T K = YpCYQ [> x a@LS|-,]AC V>\vY{1 f   ?=/!""'## "H%$t @=v~#Lriwu K ~GAX4 8{`@)xk z Mzf"'L(e%#)!S6 dOIhM#at zAK V (p); (&Roo!](v!NZEOfP=h A(W"6$!Z 7  3k}-MVW o!)S b.P6}hM89I4 84rGD0  =ra@bT $"M(H %!k=L YW,>*T]sBD_Xm.|`\u.E3}h1 9 uW.[sl QC}v:D 0 # 2  J ]W 2QM~w !XJ)W lPZ+wB?zo( d 0zh1Et}^sh 3zw|T?; ] z " fdfH:xV 7l m<5f\F\MK g_    z|K7 (!7 {6  / % v ? YD(?D!$K5fFUB"Vi>:Hk 4 O 9  $s"n$o%'i(#M)@<߱j# k t ,C 6jnl2a(+w?:h[\Fhr-/3 R gNOs!<##<%%n" ޏv?B QSFp[ -&-ifx0A+(JAxVN6pq5g\i!? &jNRZy/[7#Ei2O; ahZOGX\aPrtw(cMD0q eW*@CC)1vr18B OT%6g(vLy~ =i",UwaJgol%CvZN9uROX2!$Z[J("k ?N>gwR?XD~8 ,'8EG#Nl<Xym[gW{-.\Jq5HhQ9xWjK 6n$u;AH/m-U%?IN|m@fepe9>E,Ec} )u7+| a %LpZG0VF=JCVY2Kx|* OHa14Y_tyt zMC}kEK$yoI>OM`[71:=^%|eyVGpARUp ]a{h~d@wg^s#H_D)05T_P#%sft:"q(*4 !8 tvQVty_(K}MVrW'%B')\ 0QMzB h#bqK 045$S<Zw6m )[ GsfVU11jgR_a8QNJsx8T?SWk[KZBj`xmSLN(A`K- ^M"* y{?ak+MB +[pPImnQ*5L46COR}1{A<=y-,L_ai@0<QOOm2H A/[+M  kn!OA_bKW  1ly#_ oP<4F{/A~u,H'`b%d^6MEF#E4 D2`)x6dO@5P_%6Ngh0CGg(SmKbE/9 b%:`Kyu QB( v5Zo2z. q8"ykY4v XCQQhj)r;B+D|p`</YnM,[u}"h~Z'P`C[d]cv@~7<\"u8@YxqQ"w[}z\Ln]U^XdV\~d}of6\b/(@ )HS}7Pc=O05]*# $Y%!Sef74tw}~bOJedqf[n) Ccu_Cb2GxIpk PO C1b;z-j?vmylH%xF=nEt[>, MLaq3Snjq[POjz?REU o  P I  )    Z E , P1sx)6V=(jHw\=& 2}I^3Pk:9'r GtT4VwXO\ 2-q"$<% BWD,p @EdS;O:!=&> N3oBmS&H5+$I~g; |gWE-;YX3L72J14MeK@cK{/D;\;QRH0(`W- V24(uq)4Y,0b+dE=O1A(R,R<oY "w'1f 1?{8 k<|"-xg,In> 0S#';(p  7+cf66-UvrwrJVP:;  6_qt\JkR#L1;rlNkKm`C:JE')79wS~$ywE   k  'MY= ~-*EUF PICs.L2i "i=-x3uX}ub36E-PIxI/k4;\0$&8\^wVR:nZ/l>]?ReOti8/\ +2 ^9G\gi^ZzmgZ??\g5 ;o\cc80^O  %'53+6Pd^"'hyS! ':3AX)mui8g '>?ip;$paIR?;E b\ZF2B1 %SErZKK`Z$qcC!{Y| Iz F{-YF a$5|N+ {9 Gn/ (2$\cV>sr\^N3;<G`yZgD+&22&4+c&=5q\njr$)'aMv/&6<z|\9)^C5}3WL> !>V.7I++Gg%57{]F%N Tjs7rt o%*-~k:tFUlrWH L]>+Np<oWFb;mS*=,WYHgo5kpSk+F:C7\LH!8fWjImNfHl>N4. &"?.=".I4*XV<L_`mMo$!%;4I^ykjLB4fY > bi~3b0>X9= V%=]FE&/051-Zx UE$5WM0B?FH yr=m:*EgJui1vzCb mTUcZis9bht@"bPU*\t |,#'}X"xn#")`6 ZZ]<Y;*#i6]63n^oJu:,V)I hp7T 5'MIsH2E JV8!oM~t1:<"%GsO S\*2%{3uXgq  o:l.2(faHOb/*rg:#c>8x9Bm}O mT%\Z }!aW.Y Zq*RGO.V A=cHE e%yGC7I*;@4-;v|%|4i$_oxnXi. Kj#$MSe<F R Z2=Z] m .}-T 1v /R) ] 7</1 #M NF$u  ]%>nR ;O P8y{KtNpN \{/5VJd5Z; W  z(  VAq  Y2yB;# P oHk  ^e=7" As 4TB4 @zLHt!-ON h$?"^ (C \0^8NT>%We H g F2 -'&4 wHd|/ mH wU  G 4 F*q-)v nZ]/, ,pzXqyVw SL [ x /2ke`OM8pHq{w? E?3~aZ? |HbB(a#rU` ##9-HOyH3;> 8 x\}FjG^&rcR|\ CN Z, V  0YF S\ (:fEQbv ($ A?f+ wx.Q O _EYj;a ^Qth`SG:*J 1d,:Ubo/c +w6 Kudz ^mhtMHN*DMpbL uKQ1)q/$q0Q=  _E)m x JOe8!c>=/yu~' uma^ / R'#mz"1qMg$L 9p\$ ;Q.j$u?=b5PYT]s("t#6oYq:'p6=cr4 Eu${H|[w n EB9S;! /r8 CM@Pv?! #g&e:_>xSm %p];Tj|0LC)|Gj* .((L ;#S`b|F[ ^ {dg M]  =B8?.EqTb Vp+1 n4QACn- }f]2M@c  v#%giPx v g! At[DTBBJ=HwGv2 +/6IRH4T}3vf(k2P4gUaC g60me[& \IO G3d/-7,r> ~ *i+xD>Q 3)}SO9u(&g! Ez3VH p7eu)1_rLkP * t@\P_nPEk i Yk5<)7o}j(+_ ~ 9S0O SsB  8+s@r(n y{u1tgO;;cEoV`S8?3 ?U+atNC;1QtlY& g hS15L)2rjs&7Q`-byQL PY>`\#p22pWySY5&mrxau CNo9'_\z"LjyIe6UUDJR$b^*_i%fT2HR!+~c3ON;Vr(3_.C9\,P!oa1L6I;rbnI>^ jN*]]g:2<}Og!g8afg2}:Y+ u{_V!{IPP/fa<k0G[#/yj97H%u.RIR L!%= CeIO X*CVQFRjR_GyBp*dQ8SE4Q EVY,Uhe&B "gh 9Hxsz3.KT\UYz!hb #7+B*#45OS'<u@SijZL:Lc&!Glr[8 ?tU#F`M{SKP]vmg!! 217bP!#'#-9@G*=J U{a'|(n5'p_lL!x_cDduiXS|wxhw <~UHGLZik_QQesysq65|Y>[22- fk(;74j460 ePB0oQ3#(* (O~m^"&Ry|/% D~MO -.4^7:I`^Oma^tmg]OGFb} ]T2Y<ccQ4mi(|zO "&+09sT`wg !DZH% oXyL9[h\qgmzpn[BHJ% '%Vxfcl$'r3Ev*;T+>mjQ4Q)T}0|iqmp=   gNj=Tx2:Km +x :.[x 3LKo*w*#~r@>@/%_}RO-J`Bn8#(O~!^~u"2dG+zm9 %a :0qe\bsfc#`\NXFF)y`5n;Vr/K,?:&<.0="lE)IW~i_Cc| Ycaj)+Ij'`*"nDQ Cv_?`Y hC#vGfE<, G52wY]9JVd +Lhde0vp+}b8#v&am2arNsVU|%c=-K3Q$*|zHz6$EPv?b-v[Z>5Mew6+YTT;Wd`WRf->kH`^ zr+n{37 +E17`6G7`gU6QU.GT|nBquFiHlf`>V\].>gl4[|G6^n0N] ahW&\4M + , q'8o(mhI `#^mlEtkNjh"5 +Rf$SR@Y$3c }RgW|22Eb1~)vsq8;/uCY-`*2& gO({swm j[.uOb =6LFR`W~ 8hh uQ@i-Hx9]$ 9 !l|Kx ?HN|Ck ~'W X8D_e`.)55}sH)JY m="PkWmgBY1>TDnnDVb+%_{v }k+uHd u]7It')}W$]#;\.  ,  |%3bZ1 h  & ]k0a[aQq|53L}+^%*1I }Hgk>D[Q @W=:wV?dmxQkUB,}@<]OVfxpqt`B`/?T'$79_81:Mpk\3)GtVOC4k5 }pBS Ht14dg9Z_1|>9uIU7e6 o(KjB}(6A,wI<~l|tT6VqA:5mA>Wz+8A]bO9XJ\E(62mw(fjF<2q-_A:H|m(;Z;&A'YAZQ~taC>;_%3$0Tfq~Lxc@JIBe5Cz 9~Y}9?n(!cpN}*Jpr2PwV)EbCIBkHLP*@?`urOXyZA(# M}%- {nW~s*; `])tvBkx_]W(X!.UwWVbE0M-C0,(ihHs &s0.7!kXZ/#u7.99 +1jQv9/dBm i R<)@=)CD:(G-}]>Y/,Wy'~Hx2[dtkv?^>@{v0A|9u{?NzK UeLCFzh ,vm])&3 PLkk)+KeV!NJ8EDF)odg^fJJW~"/ZT$~2f6I}5doolN<-\u;]Y/4g <i^ER\cM(8aGVu?XG?}ExyvhvNYnbn,fnf=s\05K;!J>-%`t 2&0kd~\O? V_Y 'Jw?T<7>k{MPY2~?` @6k/F ii%9Vn d&w`L ~2V*b~S#VP2ol$"#Z ivFI(WU(BjVZHV>HRbWek :_WsdB [# f] ghW)^#6@`XkqPm%+f/ [,j4@Jq,D uUdb!}SXrPw7HfFM66 H5A,&:+6KkXY%)!+n +1/  ' 6  $)0.  &7) 9 A%6% 3D4?2(F$:%' I  !# %6$!,&>! '\=#:$+93019B9<TRgtC:J94UgeL1XNHZk^_qk{{sponong_VXOCcpH9bY DRAML\koG"CT8<[_:"=[UI@BG.*@6+EqhIYT(<2&4*% a4Vxklflh{mfWs 0YjQn!A'FiORZ>.6[^;8?PE-gfn4 Iae>6} /W5+vmc[vw#UZc)mCXuKDq-+Ao#32Rfd*KT74~Ya.^9xC[UbTym!]!I7h8$=& uh<9.g2\2:+OV0D]Ep>~x#N5K6y(qWMe{+F_LpeGm3WX(DOy B2@GOQDdS~ZK^2M*LVY<h4dAF{IC[xzn`[j0g1IB?Z/&-nQJU\/N'omH#h$kGBI oy{J+ % y daT"Fcj{J-/m/q-n@TkV 3n' Z5s3E0V!V{9c ,r~:tmCDcq+7GO#wnKrVD* T4oGE9am&VlYSsAOF 7rm!AJ@('+!I#4)cFhKTa#~4mzGD I.mBAWB!r:Cfhwn6Q:2 W  F N r  S ^  [   M h 'pN|#b6{AT|s.TOgTIpQw[g|T%<'7_<5R)eL-]wy="3L%:cT_U;HBO"VGG5)a"*jK5{.ItA8Q]`<@QPY=7= qWPrsXm;0RI.2DQDS)K2/U~0aF3bxDW{kPF5 T)VpE'30]DRYJLYAR]AGblut>rSJPvMmR=))@Vbx-_4PO>P}#Ear,Lc%M)OtsAO v/Js0Y?*$:KYd~7@Ni&/5IdjinqfZ[]XE60~`[V/   ^.N( wN* $9G_qq|$?:/>f4Le"Bl+HPf;f.T  ". K5.~f9 H R06A % )2\%>O5 $7on9xLk[ B7me~l q" x6b;/ KuS)oF$I./yve7 +U;#\Lss+*5JInFcdM;&VS9ff0iVBrD]/$@EC; 4_<"i[r>vhaMu.aN{`G\Prm3 h0%:@SxYR{ILy.^>{7/%\ CUq`1^Dm[mfaQ_:|H.     u. P N U  k"Y wsX7%J Y wI6 / ;r^,?buOf$a` YB wW?08| ^gJZ&\HrI M( d'Zt2PsQ+ r W]N}8eam ; ~fH C{R90@V7w + <  DG1J[5t@^c~yJJ\S ,Z30$5>&6e'E_asDIbK:]$R>U ;jq^%U=>EAAOMk~fq mbl%|^q \ Y I , 67w4 m$$,2} 2q G  s ot$mRW.\ua&,^c;&]`5BK+, ki\1P.RM*- '[}<R=\Ll0w7 c !;i$gU^g9Ew@ G{ fqX_ W X' B9 Nl ukD`J1ilT'8y J% G H  c  (>#`5eX\I\ !$Y'?"Z&/g]weLvysk o*Lfv G8vOG VD3@MXc{NSh( ' n3U UuF*)se  > f*Y8!By   ^%BGuu@A+R 8 zB X  o p-u S)Xxw31B5" * \b|wp/ g$ "@JGtJd7adpF @=<@BZ&}#(LXjKj  JQk005 w n  S & D$ zC 0 e uP`"QP&ZO"s"L I :oNp`s?f`kp\n)pIEo,;& yeV!,P8Tgz#5v KW @}eQn/V@b vMh!zaS y'iL<3Ha"DG? h   U  x " F 3 ?# ]&^0XgojL 7 "^ulwc+^`}dQF"%&\(OZ\P(QZlu7`,D ;467@|}'{xLS,yM>pg [ T:\}WhiyLW/ ! < ' f! s%Fb |Jp (*vDCbl%m2lXE>u[qMCZ/[N v?xCYz272U%~)`GM1T)rJz9, pX<`nJZC(` ^'DZI GdLX` #B'[V Jl-:&oj @>  +-  6DYl_`eq|>[Ue Uyy R)Xlb[a@nNCe|]zHUd\KHB`T{aL:z"QL |&{Y Fs[*+KIcGf`e>n*sl I(m7s1)>:alzr!,Dix/%_Tf 0eNz, es.      <?|lPKKc3+03%2@7 r H(Q/H`c obD.-zj U ?#3\B"HZ uV [k&{9S-1A[gfaGy,JqBf!GL;2y(?bh4"E@~kRj@<Z2Qj@|3c& U,+kho\0A'f fIA/oQk %h#A7{PMM;@/ICC'$W$( #  ! KO@&i NVn0Yo\tb.EbM^Z`-=|5amy%ZvyOJ2{A+*| : [y5X IlrXNP3w2$#NTZR\G$D}[]D:    1 o $ "Y  5 # &1Zu w|QZ}s  H J8*a p])_]*s<^[{3. pqU|N-Zk>pxn~ 6 ,d+kFemm` c{;i` b 7  [ J x ?|9 F + ] E  e Na45q9;e i B F G  O^&Hbl?i%2#e8N/ %R dgpk0l>$(Aaq^V&Vk ETOBT9c+c?JT]J/  P  ` v h . UyN G k @?j~}eJ -fiO_w}b%DOv R;Wd:4QISeEU=6n3jENt&[>8h<%w ^24Trwpy3d- \ 1 \ ^*k| | X ! E RrDo@p o .2gY 5Is}F|Clsai X 7^*F[mEX#@%`M N 8Y\@8>cvm'G/ur+Akf1%`>3yBG } " g <5 Mh, 6-0Z ,F3 1ObV3wVb0l]&F`A&-tS3?A u  _Mj7V/C6VUx VOwf@KVKk+ =Mtg/^(`/4*N  D Q \e5 1  ^ GtlIoqIV(KYoNVUe+ftB Agn!Z6 q @k*UGu,(=5ij1hr'Ox ,,7p9.>!#EF\XMd3-i%:Y}fh X t h Y O d D  * e  t1\:jU:HUXmEZR|Y~LI Z]iq{},:=#:>ky ^ZqS|:o 1IInT+[v5k*r]kTSk&H!5@dz\Zw+ 0 j 4  f . V I m 7\/A9:~Rkd5/"uL] A4}|0G[N8uDpWz!T&vw[ *Bv% 6W3Br`{G(xBj9aAJj7^;.BKE ;  1 O : B   , G  p:Kk=fHGzyF`9`z/ n x;KwVc54Li'.|lyxfY4cqkG.-n=e ~!0.iFmHK n75lVN Ah-'Ejay((9;j7mAT#c  @   &91,vWE 7 @mId{t,,!:/$u1 Jd-u&dbK9y2.26w@n$ lP\pYF )E{9r"i]==k o $4&[Aa 6`d]]}tp@Dj~)S*va+/z;JpX][B2620b 5`k>lyw}\oSsZn ,X{^bY6[ps<U15pohKJgC ZkaR,6vo> T3+~r pG\s}n)CD9Fn;n;ZSQsbs)N8%id-b=%JEP9p* Mr .d `M. (/<V ou}So QzM%zZ[||eVdXAiX`^$8f:jD&e6DGqZxo4z$*1L{Q l\_RjD-cn%iYo[\iPQpp<|gX)XW>F&5{3C&xbcO#HFD?& C?3#feB#t, 5@g_pn#!cEHc qQdROF'*` a}!JS?.: C_z}LXt`R 3U$~#s] A zNA`P1:p$qCvrlJ|xa~} VoH{$7#Z~,B6}.!EZtaHab!`y,5DUyLf(aKWA'fi f5aMF+irA&`yRM xmVwd*>B\OFd)6R<p,"U=bK^d%KY+yguX~u2E k%Tod#J{ M{*:3:8<Y& hYvsVy*u0t9CkB<|`PG}SkYZ30zT=Miu "r]WGT}CY leiiZrp@2g@_WcsCExj %E%<eOPH&^ skF4%%gi{pye5Q uN  D t. / '"I%JZ  J04Q"5u9$>'ai58z/\l%M+1~.`h> d5gt{n^R (6)zb??tIks{n<<4y~ lN:B#%>%5dW T  (g5a5iM9 =)/CJB+3a^>/q$['''?2G#vT 1,`*WsT $[oxr7Ajg$X .?`cvQpQxftvj Of[ ut[1J9[aloYf r4wx#v=\P:/I54ZKO2= =@N> t[}8|GW#+};^-#{u#m9~LmK KXaG6y/ {\YE d?o{} 7]Xz 6o-Q:3}|Aal&wyU#\>w-w/ %L8>85F6(\Ah# SM,yc"LeT}Q0s`uw2`Pg)aNM ;>=, -CK Vt6 _,X<QTx;:U,v4]-q2X$risC]4+dno J . m) vpty~31|Km![Lz"Y-H:F7u& |  *'dm)Jz/dyEk$-D2{  xaaHP0.#fdw(P=oh8H g8*C_Kq2|2JUl:F> @*}=X^KOFlw r5 Oe${G%!XuL Q+@B8!dS|7 ~. sgB" 0&{$} 7pwMwok1  SCuxeE%[ U__!h]CQ=.r)CR"|Gg%a_H R ;i?A@8OGcvBo7WM UD%o^v#cPEorJ8$J|G1&hL"4 M-hhYxe\&U)omzr(!=W@t&v6(pPEqa{f& <hxhEu-WR.187Bu. ]6~Zp`Qyw@<*f9QRM!;%OS$#%"x3r Mc7*n&o$6[`w{ZCL{&wW sx]*q0) S2pG ;A:4Pg(B|M 9T`;K0Z0[@!<,9EH<(J 85vtxJn;iycJzz! 15  5'W:ae2&8MB5El`BPcS>A-7^ttszqz}oxvp~wy}{iUSXUK79D1%.40-<C63<;--KI)(*/CXbWcp[HEGH" !HWNINYS;.MR6AG9//BD4-+ %;IRU]gdqyehymm|nhwmi{f{ ' ,R;:DJON?4<<15<>A0/:@PPZ|x    } %;^{~}XKvp\q{fyv6KC:HQKO[E)0@5(*/.J<d0hIC#FkG'"GoY&!-jT6. g:%AzvukDYlUFWx~AO#(:2/  w`JO]oVPwm8Y`09J6{xx~Qz &ZXo8 / K ; / S ` } A  a (DxOztudib/c~S !R!<wd28f- $^Z#sn/{2U6pVl:Vx7 [ q (M^3b1R' < y A@97B - ]H ! J6 ] iz WIc1IxOLw} I R + I /"yQ]]?i%U#Jn\z8|1c0)2FBxew$dHaw OBs[`W? / j |^s Z  oJ pNkv]-, 2#s .# 7)7!bc MpZ o Q6TS2wcC>:XwAL.^QV1yQ5)1):\+K Wgctang_k$[  @u ( [ h d~,7#ChM/ ` tYb( 5K"yzt6f+ z it}g$ln@g]xv"Xgl]U 401q\~w z  I ,1 * kT  wC!& "n|[mNW7Q~p`O  % ie&*a  = B K 8 Egw1vMVhDlEz g   .dQ Fg,YYjC8\a^>]~{Ke8f~I3IJ~L0AB><Q9s P pl Q . q S : n  i@xwI\G;J  ? 8q_ 2^/k0cZe 8Z/cq0 WeZ;W ZqA~ P h 9'o?/`@Gq9 *6A9sIb2?UwMK+ie'o]k {17 a f e ^LM1K6U&bm-yjl \!g!xq@g M Q Z8fc_sn&%+LwH. ]RX ci2 BG>cjNzQ=6s e$ #G + # z [tTU:q 8 'N u1}.)=B:mIy! uq Yw7gS'Tb z  c | / H (d V ~x{PU { 5  AKWF+UL>u_){P w2>|[U5ke)jk  G . 1'/ vg@ vA5!rE6@sg& I  q ' }G_<_FB*u"+ 1 X> K[B m/1WK4o6(87T\iHFn3u(T{ ' _]  M 3D7" sBt`wL N 1 : + A&/uOhUDcC'a+_;&j%fCDu<_NUY,Q^Qg P #ux mJIpPngX t] k o 0_]\ h%=K !;iZ mzEF*W/y",eV*HryhJ1T1} - ex=ki3 #pp c!q+qq @ ? S5p7ea5g @9YC5Z9NFgu z#HIO 8g S {(o F l o o | g3sP|n')F f@u/Z4G Wo-w0t|Tt7[S,(E7!wuHY}&/ @ 2{ AdBgHbI16a`b[A0e]2z.?R InKfmWd5m MN a: *")CdD_<6 ` ' + }  5 p u @ i0&* ]bVdbf:~* }cTYV!l4*`afT$=:%n0]u++>:;PO`x8S Q  e }\+^i1\3]0. |Ai&JpDxL4|OoG2,!1ta^st$EB 3ql (   v L _ K gI 2i fxhl'W7_"N%|=A A*ME.L(oV?<_keKO*jd iecDz s   D 0 N b  =uE$=T?uZbmqg#@@yoMg7V\$"|>^8ocjv+:oYt.7  .~\tqi t!Jka$:JpabO2q0Kne{ lcreH~9) =4Z V= S? *2_elEEI~ f0FGtei*#: *jgtKrLn`;xN/|1n_0$c R$ nr+>gBa&D^L]}n ` I1 Et A ^+} z*ak .8J#]A %X}Avb~/7 4X$$ Y{  S8 gj[::I(-xO8{}5 -:vsf G*OHA9?O R[#yPHAfN54 ?,  \/jNl!= EjcR @ E/g WX /&m:U!q_n7fWY V@F S<^*Q2w5]$0rp_^O5 tW szQ_+^W_>Q 8Z4k=@@:,]i;SZW*4<~;G[.a=$;z;`-rz]5yk3^$b9/Bz3M*rnK; CDr:Y9njklfYE ^ M~%VaCyUCN&'o3LSAG]>pu3zLPzWwXRHDFWz/FZoTL 3-w->;i ~ ,S~9=0Oef\ aJc.Or-wD[gy8[Inc)W7{+@^  IFUQ6uOBF i-w@5r6'N]n71f}g%+ vo6m-Mf!f` >C5V"8vSv|^w'3gys9Uw`:^m&o0PECRL?ARP}PRH3K2w#x;J_?B+0RPB PmN0}w)JQ?YX}6-BwgwE<T_B#vnzy8zqw\Ra|Yj^UGNK;/xl[ylz\Onz}Sur~ZJ%WioJA %-C_L@g tg|!i= FK ({?Ue2!]LWPvT%7Y`~q`k'*>(MtI/#{G8K+6i <L~H_/8}UC8) p&\+WBC&3q\x&c1fDZr)rV}$ wh5%i/X)lJv:5 Tcmxx88:be'6;J6jMRs,i JZ[nfDJ: >jX#e]*K5)"+13BQ$oe[QmXLxS 'j JBdR*[^<R?=G)?TN HA FrQ=k5Cp6 u24q!$ ~M< ZlM`V./?z&d+7L{~gqQiNK-y=BAIm^2)~.O)0uDx+U6kN(%G;B('6sgl8mUBViTX# iW2:jF./4!GF_o-$p 89!36 I,<<  lziCm ,Us=%C@\x^Iqq[vA<op@+14WT.mq{{r4&('0+%9LPP=1")5,,'$,40"#59.0" $(       |oWX]W\lqbaoi_pw}s{sdhnllmrwun{|}uxjbs{tfk    )-1806) ,>9()0&!)93+-9?5*4*",)'"   }|qn}{VUadppeilhgabrutxvoWJJ;<EA76><01?DBJTRPekZMJRKFX^SE* '##EE:>IRPMZL1:8.:NVMHW_\bO?PV[bc_Zghesmv  =G;5JhnaPVdbQBJ`eVS`nh^kurho~zz}uc`ff\POWYTWekf`bkh\\n|rf\WZH9DUW>.2@N>/<9+ :PD5EXPAFOOA(9OB3)"            '#&!)57.&35! "7=<H\TC@BJA",/%$5:309BC??LYWPWc_TIIRLHGIEA<4>KEADHJ;AKB=7=C<9EQN='&5:#$/   !(,  r{p{jdv{V@\gOG^u\JWWWf`OVj^<IkfNO\VXYOV]S@:BHA17A<42D? &;NG:BHMD6020%% "&+-)$%!08' &!&$,/ **""(.--7BLEEMF?<550$*,'&)017;00AHE<BUTTWX`[W[^`[^`W\]MHU_ZZ[_`\ciqtnpwwidllmlZXbXNNPTSO\figY]uveagfZUV[bdd^\`a\[\b_T`gidakuk^gimg\oqdiea]YXW^YMPGGYVckacn~zv|q_TA:PsiWammddnu]Yiiom_^xvktyc`kuiXbncQJYjg`iusqt{tr|v^s"" #, .! ! )&.30.28:6,7>,6<38316A7"+!/,/VXD?CHC;'  )(" ~xuwyzpg|t|{}|kmos{\Wbv}{     # !05-*8B<,&25"!#3:3%$*181&( -E:(()&'  3!|zw}up}d_UP[\Z_\mxfkkk]:H\\]ftp`RHIG41DOD:5/28545.+%0.&=OPRRISUF?<;@<15>FHGQ[^]XPShh\Y\]NIKMWI>ELNFHVgz  yu~{l`a`SZiomecgrql|~ofrwdhmmK5HH==3=E)-2&&950+'0;2 +# (46,3965*!"!4<:822BTL=CJFERda\bffd_\VVTCGZcggozouzxyyvpwtmmnyu^v}q|ynszgn}oehjul_fqtt}|vrpqsief^aVGMTPGDNWIBPZ[dukYKAN^W@02LWFCACF;>QdcSR]st`Y^ci}vtjWXovvzdVaupr~jpssifsxqdc}ysx}wrflwzlfj|~{p_XYp~traRZ`SKbyoh`VOQVXpu^RZkmoubPD<LULF?3)!3SYdU?NJFJLi~hI=DBH_knT,*:B@=H^ZC>PZNLQ`xwg_owjd\jdUebKGL_ebgvp{|kz|~z~pyllmlv}snjRHRrvcPJA2'*EjkJ83!)KE(.LVH9;AWcO@>8'+9<KTTH4=KB6685+)3>3 #6%*-#;<,#&)!%7@54CCV{pTTgjI17EG?7ESD>IA9FCCZhwz`NWXTaqp[FHVXagV4*LN#2U_J1/;I[orqwla^c|ozyr_S_uxiclgpqh~jjyphUBgkligsuY@=3#5ctK8F7 %=T__V<'%*5AH1  "( )( *,4& 9C 2'02"*6>VL*Jyb$Kzm[]aYZlgWu}abtypykX^o1"]zMIcmQADko0BdC(/HX}: *RXUXYD*'NE'=- duzp~'/(  &=nh%&?TW7cxV NL)JdhB 0BUX%'hn8rMGTN6pocketsphinx-5prealpha/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.wav0000664000175000017500000027275412771605033026350 00000000000000RIFFuWAVEfmt >}datauyspyyvrlJJ_{hZSKH[tdS^x}]FI+*C9#P`]`=H\mG )Jqf-6Y`J(FrqF($*CYlmQ#8>1.=>(M_QZmcWwP>:G]kaM/1XngL6?cqu}mmtmT\qwx 9= "))  !6LVTB=9$*B86  %+/91"4.  &$,,24"#0-'  '?M@#07B; 03GaVA#LnX6<^rwzV3Oont{jb|zv~wfVYh||vrqru}xmdajzl\KOlwpngbabrsiolbJGajc_]L.,PlcNEFHTfyfRRA@JG5   s~ rubfydbZ[it~|iisvpaKOiuonz\5CST]adj\E9;?HI3I- &-+0" +,  )-,1"+51%+EWRG9*595 "/651" 7DMC50).<=)&%NdhXFF0+Mb]LDB4=ZiiWBCGCUgortvnkyyx|zkvxx{z~r[w~hozxr{t~hedUB8=DEE3*2<PMW\PSZQ@@HC1/9::7<KKA<!,032!  #5.-45BNJ6   +( (0)*7>1!  ';B85:*318CLO?9;63227BFJQ^fUayzxgbchmcbfbdknqv~ww~x|kj\T^l|xz{z}w~xtvqfdb`[JJK<8BPMDU^Xbd^ZVUQNRQ<3C.!!  3:71%,96.+'&*+/4*&:*,=;@5?YS\gkusk\VYNASll_[^ebUZYPGASkwy}uyzzo]XTMM\[XOIT\bemrghpu|~}z~~iipeZZ]b]RVYVVZcrussgb``hkg]_m^OXWHJVM?@D@>>CMMHOQOINXQPNMMB;212- 0+*34.&$-/*683;-$'2:0%2/,:GKIFMUD9APZRLLGCA<AMYTHLY^Zco}~z{x~       lPcz{w|yw||xrrg`^VTKCSZRR]c^VNNKLUcoiaZWZWJOM3+,&0:5@UYay}]HWe_IViZONOLBABBLA>[dfpytx|~xrww~v|wgjbdib`l{zz~}{zskfcgd_efgc_ccjmglpopqsohlwpd`bd]\ZNMIAMbmptwxsmp}pX]W`m]t}xjigfrstyzvpnywvlmuicwrojYYWLHMNSVSSWZ\clqe\ffWGDD8/9% 54/30#,.# $,2./1(/!'!&  ""# %,$*9><:GYL9@>2./40//4FIEMJVjebx~tljszrmuoa\VTahaetvoqv}usqspdZ\YRLQZUY\]ixvjoxxqspmp^V`_QCGH:86FUC:FPQOGP]SMchQHE>4'   "  !"+.9MRPPNHDAABBA=;;7:@CCAFPUUSPX`YSUYO=@JKFP[ZWUSSRRW^ahpjlvm|xxznouvpnrghhfdw}w}vy~|tkqskeabb_WXM5CJDMKHILPPTUYh[>?I<8HRUKDNK<:.  (*)')  $-,91)#"%86"(6.&1-($'5<805BFGHNPMPTKI_d\adddchjkkj[GQRLYem||nsxx}lkv}~w}adsrsrrxkw}qjYW^IJSQVXbYSgipmNJG6=C74?FOTHA<;8,+*&"*2%$+-)+-%  %  !&01*&(,##% $(8NXWS[XKQL?FKWbG#"&*:ACA::GITqvoryyy{xowwwpl}yrkus]\\RPLG8/- &/    " vvvus{vTTib]fvkog\iz~m^SKUiso]A4CftaSQ`fN4'/=A3G@&0&   .J6QsV)]L30?imG&-\rXHjpcxv=`W@,3*?D&0RIBbsjM@Q]NGrZ):yvI*,Cjj:=k~qgX^|rby|P4It}mmidn}ye>"?MD) 2QcdF1=>2Inb#8SdI*?lqgYf2B$&DR< _yR+^g4 $.% bs= BY3!_@8C3( 3* G}vc_w|~w D:Ic.!]P('24.*$%10'"&+2UvZ*P&!D;LF+m1 mcewTaB8|vTsKS".$, z8!^iVA%#q$[  Et[RQ_KTmdJ9<HEKbiC!!FLnY-_bU1AEyjm)sN~I1tH(5  A9&s\BB5F&^,_"nj$*@{BIC V)el={GE?-D.B8oKC^v2/ [7Wa46X.c e    T  >+z0wvh!' 4AUHa/Yj  Lppi|u!i " ?`/bo,PO0 zSE].2Qv>~{C%j{!=]IEDSCHx_qAQH'K> !SR |b (DA+l%z|2zU A>oU  C s  x k ? " P)\0h`{@ V?, o:|>$CkFK]s>CS,`<ARigiPU:S*wkO2 U}VKejkMV' 9 I 9* m )  d g    d  H > I  -/6&,7TMaX!p;s>SU@ *5)%Hh3Nnav?(n"TQnDn2Ki^?EMyg4~|+EYX|&Gvw + f m Q Og s u  qi Z- ?-GZoFK; nMC;>-MkCj<HKLg{MHJGY^Nt-Y/iM /sP:hnxnaX7;0|YOO6! R q d   O { B '  g  e  n'8T6 'zm^N ^e ZU7B FXi3uD kED1;H})`V7GXa:tz|myXrleDb:Ec g%x-^ ` - * 0  X  D k U  *   > 0 U >"#1 N  \M>_{ U: <"60rT!ECj]U)U? [0>lh2BzeeMuiE_V(~pO&BFX/BwJ?S1!Hk&_Ml'(kKfd,]hKZ8i-6^G4 < w U 3 w W  1    1 f h ?   % X5{M|Y8`nA cRPs4Z*wFzXX@W &H4\Clk4oK37`(8w)5&&Sx !wUOt$9[AHF4}U!KR*g :O'4q#q6d?5'G/C DPs.OO{}R_D_q(qW}fHQR] '4_!R2WMp?$[&;ZO!I\$=XQ6&@q9U$< ZS-yaYFZ1gE S / 2' U /  7 N @{cy{><Tak @#H&A6T0gU-I&:S ==y|;:H9zv1y^S( 69V%6}a;OB^] Yu+.^@I jEFrX{@  $.,|  old W Y )   C E E v B e F s L  h Im8E;=:[%YS} F^sHP{]\ozRdq|Jq"JV?YnHDV`2 J&l(\2L"55r~LZ]^]Z07a LTEr]N\6VK@ O  @ s t N ^ d *  L - ,#A 9 9,LcM w6'ke u e /*i7n@*sU6:"lKx 4RKw]G%AX^/*UkN"WYG{%,MC b  9^IQ={Kqi ~ f f X y Y P _ h 3 - '*!wK^1 (h%we c  #a`s~4HB]?qA8i)t.>+gxiXf#Y~=avF-K3hl9RKqduU(TK&+vIz(im+mqXG)  b  |  # k A    X B< YJpO7{[&rKeYxk!lum~key1 P|2w | kl_ 7 4X2 hn *d Q\ i;]Lra]iOPMQZmA98Za@!Q|dQ*zAj66[]@zS+2,rfSq hv ~( 1p S*, v;}{@8tRGie7/YN.GyNmm&&RC3? PD bTu^~L5i% K*Hm(|t^$;b/Myekn6xvRnP8(MBCWblim> !NfY\ c_v~9^^uy68 UBwpr(iG.`Xv[dG;5. UIJ D~YrE yBaB1:*Oa !N'RL| i@Xvv\ e^rcst j;?Gq 7td] %i |m-o6{uXs! ^SQ f zFE[}g9VE">%"4u)Du28GF$vycy;BJFZHUy[w o0k)-[<uQO4#OY$zg6F]=U/l4v@  fbj[v^#X ->_DlbSc2$p6O> \:MP gfm7/A[i55^+]px`m)E#zq x 3K[/vB~eN ]ml[s)P4!* LK[O* :,0h19KB3S3dI/#DiUA .S) &gi8\:NxjhX<' $2"G;LblLGwvdolIwj~^[OKV]ZVb[19eV5<KB'(3 C>rampoLF'.5/5X[+&J;'>2B  DEJ9*45CJH1-GOA9<2 09Ha?!J[3>fW11\n<)`m]wzm|igW,5XoqysC "   }qlOQX7+IiX3 " < *7HcVTT:9ANiBLvNyx[yy+VSVt"Xed7i~6k)OB"{ "~rJ%@'#-Pcu31.snRtc]~X]sS0%QOpmYYOFT@ryH|R^l1kP]I+ r  Y  mGlS.!50Gn;"hS@$~qwe0 'FJ@P{pPfmpVZ{TI9OD}<0WYbpgYYfeL0vGR.R.[cZn==}3c ex\fzzOa#y)zYF & 9 g O q  Z \ e  2W=CF{9>gO# D=C(il~DI)]MQwanURdheNQSgPi\ s=}~ ;0D@iK*`tG0BFwRNSa]-U5T)RC'cbJQ( A  , p { t %:)-|JU?  !{ +% w T4ULu}f'X %^ O'3K^B Z ,0 CdsdEe,w+K5I9# iiI!;Ef hJq"i+3M"$.U P E@ p _ 5 % ^ U <" /]-< sLMN! Z +dq S* LlEn+UHEA.hJ, l5 $ h1@;l4#3)<xAvaf%Ttipk;;fV@8?W):Cy|yS33o-f92?%wQ c 6 M  =`bH 3 s  27h] B{3 w6! El S uB c K CwabubjD O;j[3 E jH  O 2'13qJYT/`>C(9EcN`|n=-Rr}b~8[&{D}X { ] 1 i         ,{Rg%z +![ B&y%S = C/jVs +Q O`s  c ~"7g_ j >9PA?93% /4t * H gF\>LgED=fu-.l | (FNW]4"3*_aqGXQz9H yt?4o  |( " W g % 0 R7 \;2/ ]kAxT !Mm }.O^zeRnpR& 4 y GZ_Y=eq1E|7jI .Dx Lp0vJWs3}]l[>r6 $ "@g''r $)#d [i5;uq|u!8{!nVs s v # 0(f1 { g:-u' Xqw^ EMc  fre'}  1wZk(U+diBH+ }Y\/}3= eqdfK fL N{D }Yd^W%$RqVDbu>9AR\ c`Jw6 C ^ _ ~ =j k_[:a| $/4>=)M  n Wmh`P! L S{"2v R[2p5H~he|IGBqMqf"t\>S euJ0*rU1 =D0 Z  U8$,h #    2r> Lti "Y . 70~ :ly zN P J*a+^ @>"'7B!1aez  d= 4}:if v9Om#)A n U(W*XH]nU]tND3o}jWT-k*<!4" :DNydS   \   &\|'*QW6)/]AP_=!f!nK 3x/rxa:s , !q1n6PPF c HJ._Uh\6MO}}LV])5?!&Gq^dh(M$5(iS:V>@p8 GawspoG*HsqL6|FvW -<mE kA  &(  # &Z]["4&Vy# '  x$QmFy]O_=]+fzB i 7  P / "<$Z>] Py N ol/v*  N!TFhXZCmn#f8YKR{P?WHi WrD>E&@ da_= Ix P9Cn_7%7(q* 9n`Wf:F-i!(l$V G-xpQlh% =4>hUXMr\|DG(Aawd5MvwfV{Yfjqa8F?H>^4D?XUg')-bKl%m2 ! t;T,.\I9.,BK&"^&Hx&  , -i-Y Y^^Te ;z{uh#&nQ}&wO w8 ] M_r,q|YE!rdeD~1ukX]:Q6O:p2^G}"DUaJaLLBV$ rUM'u&{K   t~ M n   F6' ? [   v6x$: -yU-j~&R_w G 1yg+%w4 +lbYu__?q4(rf`&8]a&%i6u Q/[6oW7uK2 mv"Bb Atp5~  S o q / i 1 ; trkptqT@;sSkI$kq)d_-# N.9aOrTmwt ;knZkaMh]th;"c#-a|Ap9K4sM ~Bu-22mt    5ML b7>  sKy0b|Go'5c4J\_v]_uyLb _$D&qXW8MzjXc#,ph)"=Y21!|lz x8+QSBp}\272!%iq<7`{wREm\Gm@Ojp~bQ_R& ikr`S_jlw~t{}zrwxsu{yn|t`]q{~ # $..1#+603KRHLUSJTYDCX]UYclmqw\EVmdUJGVUM?5IX?*40$=F0'H`ZYlsuskwvl^FFGBD.3M2!98'%<K90@G8&(7BJA/6KC*%#  %*2/,,+;<+4C=/+=473#'! &<Iaht|v* -' !.RU^gTG=&>|wBM{l G DP+kz}dYbNEw[,0 ; 3^G155pz{  'AsxtPT-:)+O%[/Al#Xhip4hj\<=4\uH;WM}j.N fZ;~viy^-/-8`Zp7mOp#"P(`B8#>NqB9P?V{.NsyhzQt'Q:_N+RlV6"}a8eL#y)3GG y9} c3apd:^U O|#h^}slVAA7pJ=G1s>m*bw}# !%  |/BLG E# N~Qf YnEZfM8f <"; B@`lmU/\ms*Q}E` <RCq<_ qnu ;Rp]E:Nvn,88eo48"H!"k]}c'5R' k UxX%!/M g { ..^DZR oY=@L<Z/WeBaoB?{G<Vay@,tRJe&@@"Ff;;b%m)oWrMaBq6/J u {dm v)]L#g$C8%s2{?d%YjpAuZV\MWbP2AU$b4oRMI|qP0@bR2)@b(BrILi>FX^OCp txHV6LQMsf\[DQgX7r$uI+8Pps9:-3[iF mCCIIev\d0 Kmy0{$g=2Z4'rn54[2l3\?YZDq vh`LsI,{|Fel,=<f Be8!>\/T#Je79~x;!VPu)J9C2D:t] Ij8>ahjbK\l LD"!>ZE%'-+4]t> 6&:,6YpsJ3a7J-(GK8S[a;]|^~E3 "ylYcm}]a&\\(-,!C|k#*DH.(/LM68?2   2?<2'Igj_}V(skI!mz)):JcrV)=g]mxC+OK *4o~lORhyi~)%vH!?hOiT^r%$S92[?E[vyV_}-A!c>9M}  =g`! <XL  ',!,&.9 '#  ($-6'hZkfV\skuu`kdJg~xai}ZBV|#$   '%  c[opNPlpZV]hlmvwjd^V^s~siNBOT^dR91*"!'2;>9/7@4161"".& #,)# "  0> +2;&:@;1+65"&EPB0/?@4)%<B'.8.,<]eX[fgYKETurWTWTRQWYZPPdgbftvdapv|py|yvdtl_q}qvuspb\g]LUihVVjz}oX`t~|whlt}tdc_\WNP[jlfxxvcWgg[_rnK/092(&$++)21& +1,9;023"3, %# !&-' -86) 0&)(&'"&" ."   !' (%(3-$',"%  #$,&(/')1*%    (6$35@@4.1<>(  "$    %)*!#.;B@NaWTgorlmwwjisgcedrqhnxwo ~xr}~zxzysfYP?=E8)0?FC=F\_RS`WLJQd^g|{vuxslicbffcdda]]efhqkifeop|xj^cn`IGSZF.26@SUWm}y"/,   yU_rilzzrpWVwrho~atzZQT_wsjw !*@@'7K)+%56)-52*.. " #&..nnsCBamSF^rGO{NU^E"-B1*nsmq*)*)(9<' s_]PTk{pcnANgj2<+M N-NVWL_2t%- 3y7^vCUA6vJvlGHh?Mx d:TL.5s{Z WNlCu(R#(nu#zI_QZ)bVDP![[I1IzVaG?lI^:-c\btW<nYTv|A9hlS\/"Kp9}';5Y5QmM59%O{* HcC`7r7TpQy@-|ZX)I=SOh@'V7X{Pt,"k|q$oR|a9<. QgLQr<:jxMa-}&!JXV*3QyEp\t282m $g$#Y7,y V_|FDKzX;HdU}C= +Hu/B_ ;a1!2+l`ciu`O3 6(tL1Q&VtB\<OVLUZQ#%[5A`_up't]EZsd";l'b<;tZ@NtpI~t|ToW^|nHOSJx8_%} $   Q0F@Yr~w"r1rsis"`i|Di{6uYuRb=v.sW~%[`'y FaWk:[ esNr1'wYO|6S I$YztF=](*T 6h %hx @  _ :   L]DUQNw1ioLeal(*p3[=`$:& +xaK^'fuTFpdH]Mhrs2z*\Q>vFpv)2C' W v x h 0 & p d   b = ^ 4  5hMf?[Gp(7P6E|TUqG DqX5&Cp]aGOf=w4;q!0fBA=3tGf"mRX*@>Ue^9\L0 *Y;TE3`71Cs x  J   b S ; $  3#qhnxsr9 wO2pNy_qDIlTXOm~Q-_&wgi8K;=[ACq. T>2:yU TUz+3nD'jm 1M:U\W%3Sl^qP UDQ K A |   , y   n U : + l#zJ~aelN5.e  $P3Ms-SQ^6"1CL6R (0-dzDFP2 G.&W} ;_i*QFhcuWbYu#AF T;U _9 {:2 h  F 6  > d / WIQB#Y\Dp ]/EoM@O_gyupk'aseq;>dsQ(9U'<b@h?Y?S%f4)@cf*eN3%!{0?'~:Fo*wK a _ x # bLVKwhB[_=.<<6\~s"(G\cYdHYkxwYynx9# k@c8}S&lJF=@;B_G9|A 3D}+Z^TYHeez  K z  | k 0 G/4xBs 5OVrc[qiI6ny   j $  + q    ; b  nr O   uN % H SpU%,da k f ?`Xu[ aH\g'Yyh,O!a:ZB&R'Ku vDI< jz$`QnM9oekN_\ EO% k#:Yny"U@j Y  =   ) @ D ^` A 3x l5l$W<RBWdz/ ;  lZ T5UIx_GxO o W HefF,D}7I@cDq nLk;wpU=V4=G:e>winM]m 2aR@\C  4 I   v !o %sovMM+051 ~uVrzT9 >   =   ds8Huj   S + FWDPpL>1^tW2fs h>dVzfU N m:`,2i D2:DB8 + F G q @ H X oE] \u/-IzLLpN 7I M6.)/YZ5T~a6I uu-s9cJ<af-#0x~`n!};|* :NJ3&xz<jNiH `pH-d = [ [  8 _  C NQ: 5q\zC3rJf^Md S ;NiS/G3bw\o` ?p_ s0I(e\q G8o^%Xqt/uUQ34H~Q XGQvO=T7(]q8E?Nf)] H  j p 4 ` 9 `62E l r @GF5QY% j6v] ,giW2(|.RCZtB>gdf<&W5YN\]F?"{FU~5xJ"#Q R=D\.>-+8z]<e+o],C 5  M w X  h )RN @ N<%pT6P"   3B  R ~5<77PbA g X e05\7Huy3DRuOIqUe}HPC Skx]k1C!N]>)e&/+Uj$]C K % }Sbz,X  c%Hec-"   <  F_\]2{xB)hgtR$NFc /|Pi7< xwR)RkWqR}; ti`?N f[ ps'.1XA,QIQqa!YzF3rg` woB /  =SvXi6q l,`LTH=[bS*'^Qmg[s*g"|zaXgb85`7qd'(;Kk[wqO*O?1/P';[72vC=p=aud"=v&(=5%s`2!%=m t m , ( $  m M{J/)}Gu]L (*30p/ OW>Z/rG4y MODgc3GKR88qTm#5t gyd`l$\u-FQZ*35l2$N*qGd %uL[)l<o  /Mx]tRj'% QF%{ EyK/GIvkq)3geo( +>(cDSH $4Hf<pz<%}@~Zsdv%$3o@`0]`f ~JM 9.%7 \lxTi"M*U_kksC8>H(X&F=Lz*g &orC{%Tu9Qg% eL+tZ?%k.c ~ B?8[{yv :;  9)0MY:! v^!4DS_N,<f[^|C/;+$Y0&M|kW4 m&. ; B4hHUickcJlla?S.k ~./)jq.I~{`UQm~Er{)RkWJZ7JllRyF?&!L0ENL!~KG%dAJK#xQ<"[HblC46>$`BpELH 9Qs'-C_uIe]?|"AXh({$d| iC8}4 $k39)KX _LBSArc!O:facjcjhVGeW|;YOk22seKYy28 M2X{Z-XL b /M8g9h+6Khq > kXm%,BxD1jN3NK8uudZqtM\vWm`FGpm.;'WY8>;;1 3oY*^>s4BY,8[r"d8a2=y <c lAu{87A:MyI9g9lqqZ8E#b vuwW*`@)`;Nt#/~ -H.t/p%7D+rt'|mn?q6eYmx_] Xm"dQX+GsG=Y e<68%Rpr^pzcs^%L}Ezr+jGi c"$^R8s>W(@G_|6L.-od_<e"U~y$}F_$2OB>@`VVC ,,_#9c*4CRFi^Q|Zm!'?1`&nks_uO<'o)]+Glds6`OwL!iTfI-ZXm}k00dn8 Y`R ;CO <\Kc CC8 K;q@ We2e5j: !}EZIK $bdSw=eZFI: GLWA  0pB If% snS 4"=   ")f) -g n4>0d<s3whyI/\g_ *G L-<33! \S T5 S +`_dx`DE\q5m jyU0- X1R.;66  5 ] TcY|-Qc 30 N2 }Ra } . f| O< MSizN|,fn62n#pq=% bcSVAu ;rT ,} gB?2I=5 IR, %H" >FJa {: X lw8 2Yj*_yfE:Pz Kp0  z H;_ g)  ]hdDS:&49i%b}L? ^+ dp5  !yVWG; {V @yp2=pq=r )NLXL  1Io[\ ZWib y_Z} 7 S_] kk %n[Ir Y^p UK~[s R I0M * zb )h ]c fijPRk S#Mfi.Y  c!  LC~lf*vl/}r/ 0  S`U@.< M0 L r>u am 9 lo+rJj D m /]  Pg o.   }GzYbc 1{y,gzj38a, q TD  6 q L , P -  ) #7 \ ' u p D \ ! _ A / 0 4:  0 ) y u )S  ( MYn  6qyuw2}?I80L 6^q- t*%|dd S@oAw( !?e,E M5B/?|`\Q *Ht A0~roQavEKx3}Cau F8HQtJ7/_W41C B{s IQf \@`|6 sNqfJ]<2EN`tx0&)uOC^(YoG0o<``l)Sy~?4i5N 8hk08]1hH/AcXPmtMO/6r3@6z"zmyyahDwjn}wyS, *>HL),>.H)[P#qKCrqIGW;7\<Dd?8S]VQzXpny~}~eGjf=J8&<@-0Zg>Dwg@^WEX?Y[@5CN.(C&0N,BJ6%?&"2  !1+-"<);HEB]b8FgwkYenficjzbC`z^JefPhjlrrZRn}lo|d|{iwzu~gkyvx{xiV^wxiweZRb^K45VP5&8X@%eY$6]^GMv_ORX\_U[`>6-X`A"#:?%5;~9O3Frrb  ybO=Yqvcnu]nrf   AXNZJ:/ |iA0XaH,0\;3KhU,dwf!  U}wK>lr> 7, x~oMCV~zxXLc* /6-\SIJOsvre;+#BA;F@Q}C8BygmXU7g86/<9^}N2zRhXN%"/xghGso%CxuhGh{FUJ3LCi Z M"pZ_ ?t E ^iO33Q & j m 4 R TQtNY @z b7 oWrd3kkxLnrb}y5EYKu4LCR?jL!2k'xHT6D_ A Z t ( O J  B 6 +  6FwFBm % US8+  1hAf%Qyi8s3sb'$JVZHo`hPH]4  K^6W80qf 7(MCtB8rB.:"{?),n_kO b   m M s !"_Z="{ [4 6zD6sk}q4u" a G e @x Ct:(& \ - >  +xfIRrd6Q7VG5FDBign%  ^p/-LVV)likNW# 4p7d%u+7X> > Y$j+W!uC 6tP|q7o5_38[2, #X5M b ! , Q :  XYsz1ZlL]yCfvo ? $"=nE# H*]x)m=R%?c{0 |Xw%`cfLp<Aw$Z_Y h&~haEt,:&x&mWgw q s"r C  C  s %S  1~FnG+ q( L x*N! A^&X psN&('/R5SXKw 3vX0N. <=&U.pSK !d6.O1v6P2Z;Q N L 1 k G ( xi]FZ.1QNa^_  I o ? sE-N\u%va2cQHRbbX`X?`<$qX`}#4,:Q(w$lT DuD1oCz(@u rYb% r,'TG6[ f Z 9  ,"C#: @ Z?P ^ %WJo7yR  P b W$tp}BvD&`;?2aML\bW w"xYY!O|MSsA%/oh7%g}  -  rJAY  s B H W +7r"cRXA]clR>9$EO_ mO>}u6 &RSP*; M^ ] jZrdb7~6 ` g { V  i3YhdD}O"1j'HUQYXY4WX"gG{ NI"@;ZA}B7yCq;oUjqWnsS!e o&jT+I a,o6Hgs| %\)f Jh55wec,1f1E;F2{TLW]i}@6IK q,@k0#II]Wkj*m.> [9At;RG.3V]  uv BUV.E= 9 2- 8la<2mI' B;&-cpC )1s/#o>PbL%vVQqwM S^$xAIn  F&J#)T HNo&`E6)T,G1 >N&  = aY8JCjl_)_" A { I [l662HW) 8.>T6q7H^B"x3 l +?-oDazb" hXo{iKZqvU %' x/|ttr#>bH2i z74gimtzEiy#_8?'|L:2Y1WA+sGKE= TPT930gX &XLh^6J A  ; @ # l"M|351.yM>+ T 7 [fL },"h|Hh-&/JCuQ`D wS0_C@hB2'04K8U  2 sF;Ag9/CC ~ L,q]L qm_ v v k za {i }~ h1ZH D i pLM`m,]p5b$Q-4AswLu\Fu?9$qpz / { sNO8 xYvl ai5zR E y IfKL;"I V S E u&0< '1S\@E=WL)as0`L=h@ o # l  >oi'v@d 4cb) ~I[HAB  8 J ] q  ( t ".};^YG1D @ ^q/NTWL:er}SVc!4i-:1^&G;B&{AgiU ]m+3d2C b r b2%JwO%.$t 0  n z D ^ $ ~ [E]VFc $|ULf p T fa)yL+Lv4yy6;FvF-|Qx*"= ]%  G7\+&f&Il5 > n )s3W gn Mzys?2s JzxyU5M m y/Kd daT7bic6 AGey D K  }k' EWe7iXV;%i O ; |H3$E-0_QPQNzDW~%uGW]T?5k >iTM(z! P - 2 }}n!>w' - iW; dTW<D_ o Q \ % j*tQ'PRFN/HnT=_> <.Wr Z - GjD:w'p-xh~RJC ^ >   e g R @ ;  ] N F}mCM?P`bL(BstrWeIot:N''G4Ua>Bnt_*no)gTRv%v*? H7c7;X@6K;jBg -Nf L 7 "   . e  ^c@tl I g#-H>p$"n^+18E* W*h#8y qYCI* <=&BMx~ztLl= :fzn! e{!V>$.X,s/<0,P%8?4<$t~]~E_)\[SkYd{UUV(+?z<D^}X5]<Y|s:Dny-~ 5QzSncrLE!iBA#]f?AlP;F0:+y%yN_S}c'}wRsOngC.-njgPEXx 10<'8Wq\&~j_qYWQ+x-s *bAr0bN#Zo{vsn-dQ 7O h?ouIW#,-Z)n'm]cTFl5a Lmfb$2D(aX18'v$5+d&GL? "-7<g[%(Qwtrd!H,6qp?_P<Uxtc[Iu @Lx:xeGx&7S+vmG}z1MlGnAQ  f4Oy,>k1::\~T9Z|<-*J9dR3pTEzJXJLE@&?zM.B9+'SRTYPt'1K( SO<L)P(oCef8x[Wy,9"/[6"S&Yx ;x}||tq(s@Ed@PAm<es!^-AS 1g~sCG_@j!LZ)l:qJam4TFe7q<N#& Z~#~LP,|M|ozw% XH7 w!  \H{i Q/;Oo%8s@:uAvp;iAmBg H&Ph/ tV?*:GWET T?_#IN8fk^ej6-  `Hk\nJ2q0KZ \cY |m3bxHj@3}[q_HtDx.C%et S Nuthm@#@F 0V\#_! "H-) {%}VWaErTltheT^X~lIfPTpMp ^ b:K(<f<R Kg$w] Tc[@;D:y]/O8fbcCfDcz:,q-EAdre(-H:z"RI 89szM=w>O]g&44?Z 9TT]-=wVs_$u8 3_HiRae,\ukJ+R;-jN]uTZI,o_u 09_Da+[U^s-T7&#]rEae:d([Dw]v2k+g/'*U4s5, V>C`i~g^:]*/$q4 qt3su:t, ! v U ] 2  P q" 3 Y  ZS u^6 .I$/ d=L 8 y 9  $9fI0xMe7fXq!6ydXZ2n#V:e (1HoGqm&OH,t'=8IJ28< ?,ATMW/[0;'7$|MOcTwa9;wh|1 E-S? 4S,[L 2!V 0At WX+c4-h& f / ]& ? = 3 G K#W4Vr3U}' z H;aWj0^%^skJd|3FMD MKU(=M7hCh]F#F*_&K? :  , q $L NQM p  a  i#j0FH[O kR@(KX"pS>QO3nrb! Qv}KUq:Aa&K !"cXy8bl$XZ,X/Q"E`Exrl~aO * S P n ?  Q { D K D E! q np Y S|VDPcm2_?@e7kAT0W-`zDM zHnWV0iz2|oRW5 ;`5qIu1R zC{ J`LN>vI + 7  < d DT  (  A@ n."=W1W@p2u1D{paFS}(HHBweZ3}tCP=Q<fl*og[-eD`[y*,>E4; 5_IsSlxUDYKt#. 5(:cB',D+  n k < 4  9 TF DUeGq w]Lg  <x CGf j)O3FXA==HE_E/~pm(nk_bn(T.jZ&saiHXHO2{wD)Uy{VDh8~8MSu46MRQbA%@Pscq6U ' S 8 } #oah  !Ym4 pBPn(8r.3KTQX\E/l` !(3ZGVZjK [3XK3l)fbZtk]!S`rPTFudq_zr,KKVbneo 2`!*_^u v ` . H*_8 l U  ~  >  B}`%T6ic(6TzOoBS<->B~yaXgn0xaCnbrB 7}cV I^~p;,Qns99Ba5EBG qNE=>2#;O f y  ; e R  }  0s<jMW{ !iSPn4P Sw3eaX?o@8("$.-!N ;tD,0$o<8E6(s7XtY&jvlm6^;#n_TA( .Hj Fiy*J}>[uzp[&kvD!n*n<\/%!#7IV]b}$TS.a<!\t@D4t 2W$ o |  f'm78!Y%bz@}_tzRE>)#,@JQZjzB{ .Fk|pR0 eQlouW+TU7 8KDSwJC?"f!?4k1n3z/ \ j { i  M#qcDSH"*(,&o-}L5+!Ip@t&18%'<?@Tq{X@ s_,~dX;@3U$ E\[p&a2.Zs5|-m0i8l!Eh}*n Cb[74.[[1K'cB(Kb!."5PadfkaWc|sX;27! "O|2E[0Vo (9MYhkgdchi\S^bS>0n$RG gi/p kI=6.5Ljz ,ZNCzw6]M S51x>h8d 1BPZAlX7$;`m}xcQN?.")OoemG3f"6DYw^7d&DF_EU^9x={z J Ou\K"x3 A>J! Fj(S]o_5bUr C9JdV;:>Wz2Ryp^[F+yklt$Os*<Ym(1B\j^FGEep#f';S#xrQx\K82ej3lg)yQT(T+kJ{-pi& i  2 C M G , G j\L?el vC,+6Ke  *-5[t3U( ):205EUKUp8s*;1*!$43 p63;'Luo[ }(S'h!'wU ey=T\ k~  v % ] r N g g Ro>~bH4er*H]ehX@, =TZqH~t>dbhjJH,gx)z+a1Ji&Eo -+ u5T~S g X|7a7Hse.6iqi f@+f=U=I#. : $ < : > \ E #  |YgZmkM_D'h0urXcvN tRbqIHL~H R|6rAzASOM'#^T"<>pVD -s9 : |X ~Y-tLFqeK Z & P.&N`)9a]= BQ{P/x_ Y6  % M!^)(fGOH~t].b8+*h{NgcEP8{e[PNBP D$YdCn.9_\$a0S\ + 0 { c AE x =Hoj vC mo LvZW,8v O M Zrn.fs]Lzz(B_kbOR{` }Cv; e/'l3y Ai3@T@UR-" [SJ%gHDy A | r *   P  #RJ$$ * %l)_=bA2 e fQ(O`^>a{=}rd4xYzJ2.ODOdm/aw++K1"z.iY4X? 3LH9n#T/Y}/QF2R ^ - h b 6 U > Ag[ L2}e!m+E  8\~Tje'!tYI0:E*F%>%'~5H/GX"?:w)bev~sP3gmtUv_kwuqR#]QzyL)y2 n @ 2 Y  _  n%dZ,.POZ:.@xU<z OUrJI~Ve7eD]Ynf>o{L!W}zfD^rFSzy?Q/Y2K9K!~'1s`D[ A Y. K K I  .  "z% |, ,} y"xv! $ \#B-/gUMZGdhDo*oX`, FKMZ j rn9)8m}A3IOnC ZRg: ?8, u!_ M X HFm n $ [ O 6r  T  <DR?HfrR _ ^C G.9q rSp]p18 w%--1)5AZ7(J"\_ - O2m>4&f1E5#bB"p9vP[Ks5=B ys'Qpk   qSU=>V? /<|KD1P P  1 E5 !t4q!O}H(y Z#m  6XVxn .L3%&c4hhM<PCC2nq~ I E c { 5 M r wa3m8{8 kDR64%,; ?]T#!/N|"ZhtRzj.2lBhgE_r4Jnk]fL3JQ'l!m Y155MDg!?0$dk8Szp\a8l\s'z01  b r d r U dyNS{rE S5bSdC?Mu[)x _>^0aA '_4)5Ia ##)E64V9d/xLcuAc:cxw^.qq@W v OXw  e e $y  Vy;,M -jF>(y,5 YUjy](v$Ut?nP(7m *.tFm^a ) D$]yD DlH{&Q)Q uj y R6 cJ  ' KRe)?o>x$bN`,rx@ ,GuIb&+eDyj%yUUX=z*Do]L1`-VkBH-SU7g5$|AR;ztJ;Yq J 1B0`4N +5,F4OtB<T?^^Lq wu@JH^^{ @5OFf6#lQb[^'f Y1=}w1)c}NOIKC& CVi ~ 0 a e= ey[Jm<;Z&f\ Z d>d4 Gz$EH hbP<2X]L=`v{^!~,BmpRcV(H JDQ=ZVMS   5 +=ZXnHN h r  o1WJM'vIJ #!@~.UwGS$xY;3*Uk,w^W1x& 8F 8 P6Y7_/k ( 8OqBLjBTj $-tOnt;(|*.%$R~JX~tT}`>0K_Bh,7tg{(v1N>nOsCFC"%NnM I#r;'on=otw_wA q zNb<Q4l_Q (|Mt?!}sqd9Q8#|6>MM1]2 emQ!=9V!v_6vh@#/h|(E6\Cm>E(J @FDChaR XzA[wo#a2 M+2IJ5/( <ZT8\"|TBBmb;@/GDXO==J7 Hhr7*BK'sn~ pguU9*|T'\xP/wlU) j>M/*^TUV6nK. e8P e%-: (D^joT:mN /qLOqV-@_w.}(tKsL jM7IZ `W>[{_Uo1`? |L${VS(Z [PDn/f:FKPV>P 7po LC'M3{gES 1%nN'_dJU__MTYMFHaOK_K2ym\jsR69;0vK4H,.3.2!$P`^q a#aD?[]n =Od0qX9uK/e*j0q36]vqspdqavt }WsKB3433Ih&S'g3Qt?[ 0VAAx=v?` ,AORe|U'O$`#}bsQ8{uY/<@9uYp3l,s{NqEru:K]0A^%0., nGBCvE&/PmWPly~qO:b"vSmUC$mU2cF! '1f36Q|;@(#yEi!tLr*p0 r>15.'"tTF7gA"sH#{M7'}[^K7* *58Jt&Um /] /V!W3L%A^Q)b.nL11*   ~9 #}W:) }Uq-}i`_TE78,*GZUd6Qj!@fTx%f=yI39AYwe?H[R1a9.zI,_jrQB0uS?9*uhXOG/ }Ywr!-L%Vo!/Dm3e#e)Y5Ep+GaWPbaTB,b^Il\HyR3x_){oY8vUB{d/9G! !.?_os7CLSa/V )SyJt*NTf %:L`s~wi]OEGF@4 ABUG iE%'iI3)We'Z_xxih};ASs*>aC^aw1Par 3;APU``XX\P,x[`c-#rcOEC739.L'k7mQ:>8"$%1APe 7@Phv}+@Z^gz zffnZ9;H523urs^YM><EKB;;<99:1  2BI[  29EUkpmy6:F`gpzz{ucuynevzhiurceiYF<=9$peh`PE.  kbaYT<*63   -(;Uk-07<AEJL6))!*/*$*5.)3+$7DG?FXd_NK[g^G?DVPBIF8+(.2)+2*&-66*')+%)+   .*"%#./)9AA=1(*.$+5&!/9;999@SLK`lbOSetq]eogWO]cZVYbf]Zevu]\p}|rx{ywx}rknhkaYp{jZbpoggnnd`dnsaX]WYRP]_NBHOVTPYeO*4FG>7OZJ76GD=6*01(1"+.*+$+     !&1<A:+4J:,4-20).*1, &,8<ITMSM=53@H7&)7-$!        x}x|xsmhgqvkqofgbXZ`XORPOQZ]aN25DHEQZ`fa`dWSRKV\J<?JK?:EMF5-?M=9EF>319=0.=6/**'$$#.1+),/&%.%!'60)AJ@9;EI;042:EFGJWXLTrbGY`iebkh\XelZKPOSZTZlsmm|~}zsz}}{stvojvvlfakzwnq|y|YVegiffputy~|x}{jjqi`hthY[cngZVbcT]ehkebeaUQ^eOCJJMNEP`^fsv~tlxwum}|yt    "5DMRV]aXPRRE><:/ +,%8;:>KLCNJ2;@699DN>6==0#"(&*2-#/      &,4;;99B?=9*+,(,42*(4;9;BQTP]nrgflmqohoxdUX`\LIFISIO__aZKN_b\dlmh_yfHDPD4:GE724=A:@OULHS[XLHOXYJMXK84043!*2 /*$%#"*))-!  yvzskjalt]ZY]l`\fh_YW\gc_`WNMSB0;GFMPHS[G:9756.%5=2"   &%)5B>15<AA<94,0>:**'"-.',2=?AKOUZXPW^__QBCEILIMG;EUkwmr{adgdmwqedki`df[TZ_ZZifOOZQEC=A< % +*$*'&%&%# $)$&+24.# !%#'     !).. $##,DL@GUOHA@IE9BUVG*+NW6*KMGLOX`bRQddXP`yxjfln_T[a_UKGEFEGM\feinlhhis{g[\X[]d^NNKMK>=CSWBBMQZORf[NKKOI99CH:1@CBH@2.-0/1=>;;AI;4AIF<FG6'")%'&%#!-2'/.(.6=:(&+        # :G;:<663',=;"&&&34:D?AOZRFNXWITl]OPeh]vz\cqks{{v}|{{xwsvtpxpQU[X_ed_`^YZ`S<BD4+0:=<7.*22.9;<>*"79(-;2#  #!      %''') &.487:  ,/-6@FE0(.9RY[bb]USM?46=4/844A@BLRQMTejbZa`S\hg^USPJLTea4+ACP[\ca\b_]YSF-( $.(%5FFF83* !&-'"    pocketsphinx-5prealpha/test/data/librivox/fileids0000664000175000017500000000032212771605033017470 00000000000000sense_and_sensibility_01_austen_64kb-0870 sense_and_sensibility_01_austen_64kb-0880 sense_and_sensibility_01_austen_64kb-0890 sense_and_sensibility_01_austen_64kb-0920 sense_and_sensibility_01_austen_64kb-0930 pocketsphinx-5prealpha/test/data/librivox/transcription0000664000175000017500000000117212771605033020754 00000000000000 and mister john dashwood had then leisure to consider how much there might be prudently in his power to do for them (sense_and_sensibility_01_austen_64kb-0870) he was not an ill disposed young man (sense_and_sensibility_01_austen_64kb-0880) unless to be rather cold hearted and rather selfish is to be ill disposed (sense_and_sensibility_01_austen_64kb-0890) had he married a more a amiable woman he might have been made still more respectable than he was (sense_and_sensibility_01_austen_64kb-0920) he might even have been made amiable himself (sense_and_sensibility_01_austen_64kb-0930) pocketsphinx-5prealpha/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.wav0000664000175000017500000067365412771605033026353 00000000000000RIFFwWAVEfmt >}datawIqYZcCBVxtT5zNb y^4XEf.7Z-m1tzj.FXHX>vwZfn(T4ws"t L0-113!291BUA7C]E$gYZ) J%dd}BXM5="+N3zt=aG1{5N m<HUCDElE"3yAY<# ]{zw"FE.2~ 23>6I5z%o}G6PiWD}Uz+_I!bqJI.! h0hnE@$< XV766%'~=Y wYW=/y G_@EJT&^V"3[v|"A~x6"5BW_oi7p b3 4YU%p^lMrQk6_J I;q:F^q(CAL}m%@IJ:B)Td<*),K1L=p}fa&cp(r 4.zo]TXr/Sr hAr Jjz9p K.aG~cxR"M# E\]$Czsq}'H Co/B{QhZ*]0nR3 dK#M T-z4^nT>bZ~p>jslU<K|IL?lhKad;: RYvl_ E  20U' ,NY%m%}Ht.LC q a8qs][YRH?/' - $)S@tp. 58s$lo_u c}Ou}grMp+Y#SB=H-zsrnVjT.R0/TA[$U'M,nWjhdYc'#V/"'m5AS2hO%P_&' B>?.E2U]Wh58AG,j>Xv,l`Xp-O B:sDj]+ ,F8]%I5#BqR+NJrm5s83it;t/-URYb,pWhKoG#@"W:e4&K0'q<[!BoHU62zUG/{)W_oLNJYn YyR3.UV%i8d tE  Oql* MCGS9GF*AW?N*@J?K"SLLv oZ J0|DRrP?]jOk.,N4$BL / Gp(J:0D0@!m7EXwJcs_=M0%X.$wcdXGXL>_o|z~]Wo^y57 m\|VPIna 7 kMuYhVvhexwWtVTg `^szo~C`r!]|D*yzJXvfF$xxJ3@C&`ViY[>S7+('6s{MT< "I#%sX<tcI%eFlI&EaBGG}&3oUTvT6Yonaam* (HR_l]a]^I`xreE[|NMXL,R`Xas= MrADf#l`p).N(qNBE]6 6TO%ac#@/tL"-*H$D=%rXl 0o""J<}Qccl.56 ~]& 55\4:YNh$@<0K#:G0-6fJf(eME>Kq " YZVFfqbyKZ=:- $%]sK E]VB9' >[cSA5'-D[`T8 3dkdWHK]nc:!)=HEKx_CDR]]SH6*M}xqL16Jz|T94,**7at?$18'6MEHqrpR.')#  GE6.$!   -07FFFHJSVND>DIKK>,0,*LQB@<=@<HUSD?ObfbXbfF=89F22UTI^`]`d~y{|wwzoinulbWfzmso    ! !,:3&9>5?7 .746:9=GD<:FRLOgj`_^ZXYVQ; 0/=Z\U[lfim^iunghtu^VbhhN<RSKXXVcb\fl]QNYlii|g`TU^dbY[E=SSXcb]XYbg]NHD7"-?T[SP5.HE=;.$#&#,BD6B]kX:DUK=4,(!     0902CU[N?9/   257@:AE@IPD.)9A.&871%(CCAMQE;BN[kzrZYmtqtmfei~w ):'  '(Lg<{w|{gVxH*JL%% Pm0 $[uo;5 !57;8?exkte[rqWNK:6Vy}QSorlpLd /:W7 <TA !1O^}Z'/sU$$A)3?+wuQH7#' SI:[sjjxn&RnK+@`7fwLh3Sg"=)l*Q6FXIDztY6.3zh]4S#//cC!>FweZ ;;:'89;n}_qH: A2{VmgGxU u n O  , ` a  % s WoPQ]/,!glO ,' !NQs@hK;GQ}J~d+Hq)CK MW]rR"<Iq p;}.lMTi.k)mcQO9zc   bX % + T)3 f }^Bea_}L 4~ d (Js,/+VQ) hXBh4Cu)aW7tJX^5dU0fL!u~C+Z!YEjm?5~;TM$\o  t; F  ?  c ?{ C ; HQ # }\UHLDHl :c!C XL%zu_c! [g\KbCJVj}:Rf0 ;b+Ej"_Dq@/_DQ+B&c hC^jMt@pjdO?($Cx#=gc/ 3  V @ : +  @X$ )'`We^*8X\s^"64 z jEqb`eWB /  H]7nh^dT$D#KFc z8 a~N|~@']{VWhA$C[C7=~JplZBs p  h N `t', hs2^`~(H&8 ei  Z +%vt$#7 Y _R%@Jy LcEs] /hkaTfY7Q /Dgr|Eny<4l\: ;  % ( 9 d  v r . Mlc9$^<=H2ars,. yvWhU HCt@5g~9?#B-qH{4,av=XYBq= c7HEAD6M+faQ8\Wr 6qB&R 4y3*P~T>HQqeOF v  ! . 7 ! ; '   ) aAb$`2K&E^~!Lh=ib=ni}gq;YA$K1Y9W?6)o3G{[Y)i\p~>iLG}]u h e  I K uC}\jP _  M$ x2^a&P Jm lW{io Q*+*.gX"/SU2H2{cR$[p6i+XwT*L!`drM2Rb_E!c)I! f (  } }V U P D  #f<*P=b#%<g{gLFI'(HMGcDC))}n Sv Bn=u( f__/Q/( L a 88x{DKcw n3rkDb{$ ^5L : 2 0  s ) I  KK6P/(,=d@7+:= '7]tC.@b56[D$Ym#*1Yvc7 KHh2|#CUyi4y}H++USbg^bx  ^  + R * 9 )  4 z  T P Q2LZ:CWqK\zCj|{E#jslEg9%z_\SoO6qeMH\rT;cYZ2aD kh`EPM34ZThH_X69`t;?peI ]4 + $ h [ + M r j )  3 X6"ObL]S\h6_emXB]-23*6553$6 !hE` /j8%'^10?mQWzS6ZE:Hp$=bUVce N  W ^ Xsd  v S|0f'z*1vd]jppaU&8`h<q kB=ms@ M|VAs-szT  io\>AbUFu Sa 9?<6HJS{? &:s|v7UBaJ>dCIWnTUX:!CAQTusL",%4?8@_I0 ZCs,R H k &q_dv &}x:_dt+ 6N  ix,gL=Y:/+/(3@WT[rJZg$Fi;49V[}|=cSa<? GdI`h#)dOh%r{x[zAsQP)\\{-Zra| " ^@ G`:sm)e'8\,$O}#=( ~GP\/ (/#xfrn_] r CqOl"]UoF] UT  Y " M6 }({ ,A@  Lo2Yj^p*k [yS(8UFP@zG6klw.OF4T[2wi\ Yt1 P K 6Je B N J GE ^ 'b sH . i  c } 9PvZ='9kG 9I_?O.G.hzs}Q57[-=UJx6tr#`gj2-:@gO%6H&1 ayu`;?QaCg {(f ] ?= h8 a W?+.C J BdQ7.ay[3 USlC9 } WFQ~ % RS #U9MnU%tdPZK4-ck#FxMX|J8~~< `98yl `${_+~ ,o nt  ) vH+x3?x_'8 H)d'tz_"'ep ! R=  _cg. F'/KAIs|y{KFBg\WZ_ a(~Jb(IuXZ+ U* B[5R^Q7U} [.))w&E=uF*|$k}T&}t#"v"HaeBXv7Gnm2&0P,cY9u@K3I TVTNb>n=} {{3nB4_#N qH[mzG*<|SPXvBG8(/8p hZD.%C3 bU!n!4;7?D#Eki Mx +75Cx=(M+-jFe!@[J?0iIyD^- Nco&,S RW}vq+I@ul!BxIiJQ 1`pSZ-|(!%,+. 9" CT&92%+ &VM.S?:<=<Lf_szSIEbJ1rY0`SJg/RpRAdy_Vvi-/dX7YybJLQMDdHJa@F\gI,4E*"F/.(F " &'IkZ0+6 B/  "*&-71 2 3''.3#B?;,'S^^ 0@cTPZH7IVJZv^J|a:k/[z{sxxot]rtRco 3c#W`']VoEoU++>TwZZed<5dHJAaW #^v . RTuraGH_?~$%$:!0 87g { b.KLS R)UlCn14 NGK?2nu8[%RGNR/|jL --X]W;8+ -8\=GH :? MR\)p0MsyVVNFt>>9 ]":k _]%kN1_w?n:)Y!e+H qB+)_Q-4S5Z>|Ehy}=WY)GFhc |H4&#*Sucp'~MiB2 vKh&3Y"B9W  r3I1F%WVu  >h~46izt<#ow}5#acn&4  .J92DI"hl@3"  Sn]hxtY%Fqn_Y!gUr$]E GQ0[ zyl[POG%oJ&qyL7e?;!?smR;V620#ct tS.  7 . #qbfVQ%} SB}ud:*; H  f /   {jWF E)IJT\A /cR#-Nsmut!owry1Nw10RyX I y y_7f&Ho4?S!_ 0 a  ]h!c!}2  >  M   :I:/?`#x!O,7@  oW\awmw57,--r{eqb*`ic + I8ky47 8 d ZO PD8P?ql6 O-2 1 " ~ A  *\ICK'4z Q-eZ?r"@B {p`[I-iM[ x&&9E/jlBl.+   . &J $ g  }f ("#6|Xnasr+:zR=pcs9%-3g`s%6M%}%z0q -\J:91\OLa1DB pGs\g8B]}Y/-dhKi] W[x n:'$7p=sqH-+Q y{Nfh`f'dg%I K~ qOkmP1omm!9Y^eo>}Pr\GdFveGNSsfX""2ZNHv? ^,MyWpdvYj\LM+i=)pa:S1 N&}:d =dZDPkx{ej~}4y*X`\=dHGTL% !B(Ez}q?\O@^x_MqP_l`>Z}!c2y:%vm`\r\R(&r6w&a'xj0{eA?H 02Eh{= Dp .Yz}kpaxq^E53 pEPZEjUF%!)7e^[4VblnCh"Ht![E"Ltmae 3<<&* w(@QO- Y`&I3> Jz-%* b.6FQLE5R,mX>"nd&rB DySnX!+x1,< Q~>~Y"Mus8K+s|=#q~%L a)T(cLA{%1xD>"LTMJ5]i|{zI=N AYf'o E>_R1!uXi+3v:I[Dr  tTN_d0FvUNmq'P'nm#C 7tqf:SNLmyOS/:#iM41{6T1  mw(U4~ RUf{cZ&<?yH^wi}?dcNbRg(:3y`c ^^Nf ea@&#jh\V4]| $ zQ { 9 \: -D 7|M oP1  k lCs^,$ u=q]D >k {U\Qkv X?QW1 D.k|P\U{*Y" 9%ivWD* +Mr<0Z@ f [   BFl hevfD F2[y>A4{  '7VAT=BE 7] y/ /I-MP/B|:0XP?bH B, SNqy/J ?k$ 38 D ))|& N 6 ,P NNJE 4&\]<E M- q.HF0LV|qhIBWc0I/v$? m s..5K)LnsRs]^<~o5?4[FuS(PiO:2'g}JKR 1 i  s FFV8Ol6%54 h%jpIu{iP6z8 O 6 X je"'Hl }y30*~= hzo\7VqzgDnMR\@VL U[/4 C#$&(&$#[##=$1&"tFqo|ߜi& ' D  KRN!`"` h^Fn#]Q + 3 uds */@U~3QB;-0?vp+nlfrh!a`u9vz g<$} $'(J)**r'%$M$ dU=eߤM:ߓۋY "nO#)A&%" E &\/T=8Us; akgF Ha6!byJ2>+FiH|k:aN fe+U"k'&" "#;%_$N6Nkr"-z C ok? mL3UD = ! i ^  4u8@),h}AV!nt~ JK<P ~;\L}7/l^X@8lWUPKmp5;'o 5 mJ6^ "#F!, C  I;לk8oFK`# qh/dh Ah $^ A_y{YD L) | O FbߏiV._qWWfwy!;0#2 8uf\]e #Z$o$#""m#m# wlw d$t҉/VSc " ^ h { `EfO / G?@I6=GY9G D f TBQL8c!Vd:3O (7mYnOuSc&vq+e_P.7 %T\-t!"+"^! NlM (xh  A g  QF=G1&] [rg HMh! W{v7Ek '# */% \DlK9V2:%@6V: 0o"dykw#!Q  1 O 0U7pS `*\ J%?Vc7& = 0d%XJU ]Xg eI&#;9  e  ^{IA.^Tta*R^0FW7k%ss 5o&9M) Cu.jwX,!. fQ^ h%G d 1P ~ S@:&jz% M  _;~z > ? R3Cp5JM\<)K_1C5Z Rb DXW5bx&U89KC : G!:4$E b R[G_a ` 5lm >kNx1D@n;9   p!.s.-xH4vr xLH]U *a C& w&c  a l 2  acgkihu"&? knP {ok4]!/hsQ i]ey< f % k70uL`x}1>l]H!D*Q\A@?I ^ A ]* b[J\v^ . w TYBu8F  Z%&0-|rx % ^'=$D 3g{:r)/A(UT*&D{g.@/vG ` ( yES v)) zJ1 K9 pV!  pSr>9" f1 Sr*?:8BuuQ E e 3/Qo i?kH6eFk3u=zN8i b# o z # l{| 1Y0{=9 y9* 1 Q !% S s vT+ FCl)8w Fy;DD65>{o8 w_$~jz&lhUy7A  x&eBW'PLC LMQn @  V >  l n X n~O?6[2-1jG4p+Yn(m2: w4tJ?~@^oe[;b@z9 d6D4< + I d ' [ U t  Z u " c pKU3U'6\m_@52^B;8F)6Ed_e8. aK7g0S0~^LR65  ^ ]%c' k ~ 4 k $  ^HK%Ax{rJ4/y,37@Qg"` qyI|/bl!Fz"OxXzNv{+n U ^  n  ;  A tAKQ']O(Dy9Si=xMD\Re21Q- -6R'[$M Kc w@> X  a n %4) X  _ 0 b7>~)^s.[}oZO:o-uQ6&h [MFfd|y >AkGVWt1~,,a7uK.  L ; o   m  P gw7Uh0kyEBJTt|";v$3SifWF2 d2l-FK?[wiecZUfwvs=Oe!AYp&rRGgafD1 g  d b F<  $ e 0 -h,tba8) 7Y{!AdpL2Bk7 a ZONH%& ?GEl ,Qm'hlH!Y:w [   O J ( mP J{vWh86=b ?wL{}VqH#m R:`W?I|xOmU1G8k:? asd" : [  T r 6  ( 3:}!n{-j}A.?H^e3PhpG`itJ( y# oVJi8PlNYeNG@La]mcm"V7q}k4,d >R"8xuCZ$zz9gX.r&@hBZ~V^SKMY?5>;| /[<1z_e[B>d},`?>`T}zJut}Ljl,1\h >="(- QyL4N]/?+,T 57&8)q/0j}sO2(3nel_WJ=2K$uGWa/$JV 9. SIdyI68-) ,G \ xJZAi}VF=Mj6@1qk6j~*Es?Ed6CF 9aFj+'4$d[J -\o#u{Xn`U=)M4UHYA:Z"N||c%iC;4 o321 d+m% s[ ? %  [lN|X~<jMxkL} kT*6Z`W=_xuO_UFr*m6)#p(z[d k g K 3"F%p'$$~(*N((t)%! +"7BNK?e=0 Fd @Gc5R t ;nY`76gf!Q~2T{e7iL  .c%,]6_ 8 aL- #""'(%F###"mv VuXQ!upY ^|??~? [q NE-tPNu  PZUlre~D*}0c@ 'KHt!$&&G(('(i++X(#I oM/mRVl&!v($yz *mX*.` |3Uo _  -x u}, cj;ipFo]ux`j'tMZQ0$r! i*!%# "5""  Q1xG"[P S S( C W}|{6>vw] ki\6n9[2jNd4\dNx ~[}Tf^ 7  vD.?&GZo 1vr8s^ C $  R)\Ud Q+dgީ3rnH+C|"@S2\ (Pd' - L ;&]nN]ZZq[%{  iw x[@m>jjp|N uW%nݔE%h0tK5E_ wP VWT `=u SmJONa~X{4<R}"s}(6  o1 '$Qo=4_+,f ] iߘkP\e*_:z~ ;MYFibNls V TU|H! ?m$"4{N}  K $ + 5uVa9 =IJ ZVp{T=uab`\e75%H7%+$qhU-Z 5v B#Vx_O76zI` Ae6#Y X)( .6O6h*'H- 5 ^ g*!7atk/9.G,v%+ # h om5m(ty P \{"Q d}gkEz9  n !<9q-cuVSbO qu0[}|rRWjp!E\| o0ZV \S psodh%Q o Gqs} h$=PM k 64 d D *?co+ S *phcU*^ ^e9&;1B%Kj _ ^a`G^Z 4(%]BP .}> z ,@<>Zq>@a 1 ` xpyE\.M OWbpFEz(G]S=\F]2I TKqtM  v_Ge'R!koZ,  u^@ hQpgs T 7 \LJ#ޮg =OmRR 'Pqn{Dy3ZL gP !"A"-#Cj <;cer">F Cy-<7%ln5v3Qy  -YG^dqG- p'SOV*MP_uZ Ia4Y\FfAL! KuGkF#H `IVM i} )  $ zN6zRGtiD'LY )}S?i| FCyM]} vCJ!*Ms. 1X>d!Fcq#+'tM b7.{yo~_ { q  ` sP;:'.4QAv)R;#SoaeZk/6_!.68Me[9!m C v m fFqMZXF{Cp| LB,$H6gE q y R"w=62p_/.A_*9)_^#^U kA y69r(#IQ '12t 2 D!Zo5p:u^:@-ada@)[1'gh5*%s K3j\`PPt,~gSvl_ ZY-=3?i#p$IS.)C)"e ~  G q @T }+I ( c<) r;j?.1(IyZr YEu@[Yd.F~0nG&G>ct-$s >G+aD,UMA.o o   %D    Q ; x EpT3_nzgh]/| W)zWZ6p e3LLqjwFu62sAE2RF^u o HJg}  ^ u 8 0 aH? k  YD  k'y  i `  < H 2 a &_ Z:wpurvf i.{ % Oo [6  DBp :xHX " - "-? :R   * W? 8 q[D P jop  W+#RY if v9^   Z~v _k9# UV i H_D s_t S-R TGw D [FTm `mM a] Q 27M# X HN}3r EqXoEQd13og.B3e rV  N\>5 lpy8 F@8Ns[  szIe4w 'r E] U GE  `)lR|{ A;' 4vj` 9@ (~ {Nv ! q~^I@dagZ7}W { Hu \8vB I {P3D;AVV[ BYy+^nB<) s< wOR[ b P9S@ ?1$  Sa= 1cp}I cj  !t t$H42 T '] df} to p R2 cTnp9\6pQ/{ Q.gHE :{9 G( YaWcFXf d; W} E 9e9)+KC*-u H CZ#P#e 19ow 1+ =G :kS +"+OGnFb?@C z6bIKL  @O"+{ O  1h!ce&@}i +CF D.B g0 b) {( : {J Bh,".BjQN@{*%Rfo>` 3 W}F hD  S 8, H WgB~*g&y`VP vU bE3u !jBI'thS I36-+n [|]: MzFZ'g*$GA Wlq?^Pp$nQYaV T'W=j/zWF7  ~. FZ3 %{Am'N7`v) 4ru%KEP`KhMhvB:o8 8e D]`qz2"6 u7:K)Iw|T_gA<i0|U[9M V2 o0uDs *K8AnQ*Jp?Hs|F  .TNW8>g/WYC3$&[Rit,#dP! ILW0;6'b%[n{6*sX`V{SDgL9~ K({_{Q#-ow's^1"@ Sp6  cbD.]wBP&pdAh>dwt@ )W* @u1C$._N .KXB\g%] 1 ;%L{|.*_+y+,DhTy,0t;n) R~ Z7C_"J!@Ulqc2utPlaeZCo  ugfEm} ONXFS5v)TZzW':@dA1T px"FUpU[KW( J'/ ahO))?YgZ3PEMhJ%,-U1o}ywg[gvdPBH|xiV< }}:8so n xwt8> xFC^kgXb}tqxvqf\B721=kpRN8L;,{2mA01^c01N-^)sX+)K3wUqhfUBN!''Tj"VUQ1.A4yT [,[ I W T & qNw}OA<s BL`[<NT M< D , f!}~VPL4yH: {O"Zl Iw$NuuD.Np  m@lw}  z(I 5r 1M<4-(n LeT> 5m)5=ZV * "  ~_ !{~ Ccyh!m)Kz   |4m!! s p'|?}#$!Gr $3:J>? eTzz8w!] MU< k * ]MJ Sf+9s>YK[D_8; Q."<%1''%$;$"}H qyxox+R_n ftQ->r gs@5n2 Q:5 d <cyC?q\We g,I|. dR Q>!$'*+*")'%#JBOL߶XI݄3h7;2m} D. #$#"6 JwnN93@3 K$Ha/ -l'eoY,;;j >d8C:\ R"Y&j(*-/0 .+*(>$3֜յ֫B4sd 44 #.'I**'#n z,kG_d HBKYlqLr qP+6/%ۛۅݽN XNSZ.f|D2Q 6#(-Z1 346N5<1;,}($,SwWۃ {~ՙfhj0 ")-D-,,+'B!W eTH +ޏ߃w$- 4ya%Nq{ K@h2/Xa@sBr;j2kl`5 j.yb/_ #HR ";%&&z%##0$#  0,޻߽m)% ^; 1QNO.E1XIo { l 10 >kn{R^p);d 'plVz ^,aF i!EuRo g ""$%{$###$T"A Z(:jv2c2i.He0 KBvR ` D%(kzj ;~:S&)nKGU"!1CK:Z RW5"vtG)Q ["g###?#""#}$ %$"r8 ">9]ߌaq^lW5'^!!Sf #%5:!w(>* j%&=  1w`HXe:zndbS?gyY}tDAS $ $%$v$$%& (n(`'%u# ,}Kt  O#1"v"y~H`s7b#K3 ?qm _Yuob+9Yae'e1(GW)[ ds[Z+> Q6}1b_s k$t&*''B(y'/%" 0(guJ_QKr6h;+ >X\ VB qMpE!nub < ? W P  < E }dP5[{Mp5v+>V%UgDhP<:)(3|WI ! O @ > x[[,1QT pDz<=NNR;l~?3m7ymI2mjqE"O%"r |C07| _ln>0?Z9j|C0 q P * w g A m r u3}Cw.y4^A M'>9?NlgRA;,(%T0}=%2>Ua%%Br&gy) t%FgH@GNopaT`ygTy,>a\-lFtdA20*0?' 7Uok(9_FtuEG8ZZ],wD"aObSo`y=cOwXA=V ,_/\z ]EFWP|MLC_@Aty9gOTv/;VL6[ vE%1u/))mpmbi^Ghoiz6 1H4@zoHCri$~w2o&?gR%V ,c   kq  @ ` u;ESqT$K8N) ry'qYRw5Z3#!zJlR$\9b^B|=e]i[B  m<)%y0:L~Pm'K 4 y X  B F~ ` s ' # /.z\2E I,/l ] H  McdcASBRbm-Q]!\V8xtB u^|SS$@X-IyTQTA2 j e = B ] {79^4 l / j#rY ]El3fMq<0Xvr iAG(iDX{>}$'|$s'$Vo jP,ad;o8o {E!gK{f5rk1mN,\,w_T0yw|j2c]}l {lnRX:,;4`  u    g4d 9' vpfG\4Kp3yXW>C}E0[Kl'}s6).(T<F#m O^K2PNAXB2 X d % J n&m0<L) !|KFgP^MXBHdi F~  ` R %(Fld +&J y <L[[} G r Z;Ih9DiIc pUbzP1Nc8#pg26@VC>=^T f}j5 X = v & W g98#6c v-vs,1] {c, q "h]" gL W4J<8,8xJ  }VIYoG|2N&=nAsE)8qw9>v=m6 #  {N2oQ"E) { 1G p3V2Q=8 &  yQ r4.sIjg  Z vCHt b 672h'|~~\e&=/7e~0: X[y sh.M_" . rVAO:  {r1 )ww2!  3 8 1xaz0gkt +N[ nL}Fs?5oU5:]!1h~^,D "'\W1H'} o&@Tww3roY; XB8!p%"z | s Sb& lX 1D\g V )O  %. 1 (-DEzX'-  V 1 [;td/@](_XxlE> 1   e (q)5RO%(!7#( eyKGDoA|Q H~p") \ Y6B] hUR>l+Hj? * `>DQZ:VZc-w Js '@[_ !R!  #a N&x=bk_Ih  q `N XP>Ma( (U? D7`% L C T )1%$}7Swr)}/*VoX2% r XOLaI +Zc`C/H`? Xo&2.  H,<   'l*9cHg 4I|$|\ Ay5PHaNQhwqG!#G&-B0c$NdK   ) n iff2`/tz  N 4}$kDC82 g0d`~tf2gK#v#p`+$n2+Sl(Z=[zmlLF*$ k 1Zk&P8`$5T#Aqis}Y,}< Yv.56'Dt'{Rb1?Oh[.65S;=YD B C,<%cx8s:z;3SagM+q#pN{0bEyux1W$]R~*@<.1EIDW|}eUaufLGN`\8hH3t`ZjkC$f4>^a@]1)>V#.X*Q=X{4q,iPD%[ VGe_8 0K>WXe[TRSPDMw ;Xi "5I_o`[p|wffaYdhZI9 }QB1 ~]I:&oTD$%=l O >|2zB&QATp KE{s0^Bkz<As6,9@]~?bsxtL-,`C/`B"xbA'V$Ki8Lj/] 'S;Y8g.cYi/[:LfU&tlbbljp (2Gbdew):Ohs}|j^VE Y?#m6hI6%7e /k[YL'1Sx~6Ht(^cj~mpnM-Rn` mIoY;*qY]laUUd|wkt}ouw^J\xk\O%> J4meeF58M #>Lr)]OMt?T"OR$V  ;r~N kTVVVD#wwdjG nP]v_w7 1>D`ylKCp5?M@1PnQ3%o|^tV fes Olh[_,=CX~/3Jb <h6(H{ hD,'znI:6#o_b+|a<UaNIHOotkp|}p =mwsV-/E>N\a3`A feOI9&O\D-9EWyJu.Glf~|bCzV48-LM 8lT8tkRkGnp&!$P"pBpBbu'kb)8&o;*wZ|.x6& g:`L-hdj7m$oF}F1N*)W^Oln>:PZIeJheOy 7 *14.{9'fUuKqaf*xj)j7 ~O_g Ac3k}iZJ35X" g5xeQA? B)Ai2 g zgG C R(QfXv< > n  XO 7lavvDE2Gs+:;;>);BXE&a}("Rx<QJ iUh "&(((**U+P*(%!{\cmmO&Z!?a(H3b"!d1p% $!-j.9t E9J5 i8{_A\iq߸iNEz#X6iH1sSd%l%k6 * c!'-01a1,2_21w1+32.("#DN.ҳ_rs| %T* *p(&# :/]bSIfiaYz7 !q"# Hx ;%lSy4rCUu62%  e D7 "&Z.v d]RxNd!(tA*Y A.' 5 n+\/POILk !  m bt}%2   ^ +SCE R & m Nr_uO=pELygi? ~ u#l'tJP\+ n_hIK r  R z J j"v7I! _   geX@(> lR?rPC'L\nL\R  *~DQ"Us/!m>   l  Q|sia 0yl6*_%Z}x gVN07dfF{@8,"n $  Tl^zezWM6q>Fo I e $TS<)K'CJ1y x;2{huf ^YQ [e&y(djE  : wZ`'%(])>s )%2;~ DHO R{iZ u CbNNp{"I%V- 5}v8-)Sn~#Xhh0$JcJ0 j - a g r*oz #;g g $ 3-Z5uC$#H:0ya38 V* ]9/H Tp6"];b0"U=;mW:RB"hb @0 J " H )C8r24: W _ X F(R- d1jJ'3d$s*H@Q}X2'"uL/$Dm4LP?g ' F+/CxqB k)2*1zv -  # *6}fK)2*^( '0Q2&&tcF1BK9KMN [?L<$Er"DbEj {'1-/A " q` R iKp4 t{B4TZ "044!l\4hxv8rMkfz:h%w}@9c I'Lu'?nVo^ 7Sd58i7FzRQ$81kA@?;k^^?/uG;<f^,c]2Oi#,#. <$u)8 0 2  l E A  kFQ`04U Z}v6|Ds@4+|krdiYZN:_LQtc ^E@4Zk h+E(Z$:w x  * z  .`e//K6|#</K]|SN8 zH yvW45Y4,z"uR%t%ciVHfnY"[V & t z 3 X {^44XHyE1!<qownU3/~dDFeC87!t^%dTI5~r/fo|Dwc+B'[c6eu q , Q l b  & 7!_ya Y {|\4%/LavrR>4*Uu^@&x^I54C4 p?0?$ys@j3 % 7yG:!naD~k|qtR3 ;  )B\<(F]L) Qyol\9 |x^8mC)"\3$ ~^?=r ';vlZ\+:23'c4A } T |`b0+|(M \)b+; ,a.? (3"q9.N{ep Do<ib:EyOI6s'|q,G(>J] 8&|pofL0#--4Rh 9~fK^ kLB,?h &XpB8 < )p8f5   ! * 1 : }  HY"0;8>* =o\JXOmf_9?18 ]8d}_EAsV}Bt|=,=[O0} vQ@ Dc89W1:Lz|B S S mv U 9" wq3spV6)$fq? <0QV-AU)^ gkxfeqRQ("i/^e9_4gGCk2^$~n5!H9r[  R1  P1 i Q m C@xJ(  {c,dKVYXZ\W<JXDO_C~JU7 M:Ayjd op7KDY6JfxWj:HIP YQAdBC6 qUL_a:d''%" [WK6l7q6\q?u7 \_0oApy$qg 1]T\DeW+Bw{7V\+Z?)"64{@.W0(qqDASIa9"L6!\f@w 1ep c P0@JIavJqdY ]Bx8=(@Y@| *mwE9WD}fq I D :g\] )Va*J2L:yLqC? O$$^^cOI"?bqT}hsb-oy9s$IaV]x f~s jK "d]=l7:ot{{| OyrT [h7CV1MyviVht6/^}oVW04ScD%L;vz5{g|n 2;Cpnisl`bkqBDlbBpgI:lXE.=2Vx/  +-7,%SxuebL}bO5*. =c@x=,Kj vZ>-(%@+gsks1'|OYy(W+)w@ 9G6 o-kyUH 8J=@Db^ 8>-9:&r`*YP :@j=wzInl?N1y|PH qe`@*q)M4)$[p+ji  8EOYE2 =G1m:8c$$ rMcpX&WWqc<Tictk'gricezlW3B#;C"#\YH!(95=E?,@_kKw4lHQF 6X5meAl^ ]&x &Wf>O%':^VDAYE3FTOU_V1bD\y[ I~2%G>GFjn>1Dm>6. .p}`i|kRRaX#JI HD9FK-%OX8p-)C9# %u2]ZY\\gX?^$4qgTEFox{&318?>Hn~vzuDPg}q__bfiiq^>JpuN+## 0KQXM' #$3NN2 1G!,DZJ'$2/:6$+"*L3NI-'/) %3,<Zhi[ZN|pS`cMNA4"3gn?#Hv~~r^\suxekxmk]RFPgg[MKT`dcu(67{Vm*<nLJyQ @\a^ZP;@`}tbw0RhHzAIDPJV_q{szit +#Nw~oYeimK@J$H^?V'Y ,g(r( Ga<]:E }9ScA0`N&.G5:=V|R^C;-|YrI4`1^//C^ZUZdO7)xn*_P-0&6t0rifa>T 7?Ei.  '  N N <<i^UfZts;$fgui? Q983'^ "*|o;"RG46tca%Ha\E0--o#ccJ"raut$}ZD^  M@,  `  i+gLe>{   h.",FQD@acqF hm9 Ew}f}j'kXc"KJ]5<"/+l" $3Rgb,e: > N  ^% Kh14}<KQ=g3`eZE$A4e>mi[(MpiZmoS2rJN#`E OMm iuG$zo`\8=(F-H S f 0 ^ s  vyXo$pumwH9 J"MX7H^2}4J/}Xt^e|Foz}!o$=e&wAX;w<+ t @  M  Q [ s c  3Ds)GiSpdc`D=lQJOmc k Nz]Q&Q%B~'l-@)r7!1 <B1kk>g}9kI1LGtN1y;2%= Z!$Hw } z  ' *  @ _ s D x 7TV@JOdK    v/t#lW `^ !_uXwW&tYMI[0OO"}~_%,( z = X 1  { y  KwqB&2n*\ + h :"GUnqn:G^oD ,Ai._1dOzY/)v_M{  h L ? K K W 0 7 V z - {>Ty!:^b VdJzl=fe?a?BVYY&x+f W%%~$:&0\_5)-h;-M A  + R , k  > X 3I8 YX70Ta"mdIW$6FjoVPIWRnrM"?VNlujWB]V5^j:%\|> y .` kZw# E nM 9> qOI{1w5F.   7 [0 JmEZ;4pz+  !,,R)R!-95 lv4 Y 3  96PcnM L4 V (wfv7jpCiU  /g/M ' YFbG&NF!?UYp[sX7,v@2 ]I`4l,' <huYN*K_4q1 ?+j7aH7bQj+-T&  "  j1&jX6> N#`H_K' ZDEC!6iq! W ^ 4gWZq|Tc$+ubuh6Q  ] -j &6 7h[=bc.xc0+;v^)8} 9x-L1/NIY x fK<AQ-,=[) EO)mz;+mej :C ( ~SvksZ(^Lc+ UhL)~lT[rDO`H{9b w v>2R#W.E|d ?l1?K)2$K+2 } , 4,. , B TDB"<a~kmI`(2G61UV(/ja9q/} ~z|7Tt  F7R@V70o",y'NN]:%Q  $  u $  $ Tedn!v~@uory$`a\d , | PU8h}F>~ ! O 3 J5BXtJ!^ yzZ T ! W z  I fiBxsNO KX> 2uk& |  + Z`qL)RsGp  RdSLxax7YQ:E l   k / RV?O{+}D q_y={  kl/j u  C Qs"}[Z3^ *    C%GMb |Mjv O   & SqhBf/VjKwdBP(+TA2 ,& d 3 D O W 1 :NAf  @YS2IF1>g 6g+Z8n>fwNq*hWs_I!ZwDf sJR|520xAs`  > o ~ d S  D Q /  8nDFabIfz$?ct/w3dChg"(@h-oa< _X*L  Q  8 t R Z 6  j Y13<  e-R<btp<k4oEOR#_\^Cr"i"Gu$R._k fC`,F > m  X *  9 ~ J  P r r  V L:O# l<2d#_t<R$~hTVZ@6@`k7 JyEc3( 7 ': - ? 8 m h - / $c)C& iN%\jK Ob8'( m6GLV7dh=zX   # : =  y %   # wm68mL[Ai y5 j"BR\LQ)6HgM?$G`D\Os3b  +O kVm)C;H rWoe N3$ Z2T]QFW7{ w(ivEiQ#s5 = h#x9B?@yphX0DDL1@x&ys" , Hi   H $ Lx+Y.-&I/$66,Eqp7f&^actkNudDcg/r-Qn+N  U@^w]|'r acW7-Z{B s3B-Qc&zQR {6  \TC+o9yt1;)y Q2S^O!AsQ Lr'? G~O x   =~~_cIQa2Rc4Z*nCJ&j!`gz'FETl>)&_ tv}M{h|,t[a^PuGSVf"xCj <20iu/-W  *.}4 *;!u,]t@ !yIeo_yi$^K9 {$ F P X_Q[;lZ  -E_QKxZ X[O@$_ f6grDa JLh8 zw,iEQ.o5e:HHB  #3 |cg8 0Z[<PA>JVN Hr"7e1 ^.5c G  d-.* D8*N?ke;Lj zsBK {:RQIx ! A  F s!P  m[D f>7<(JVx}s  d K ~nK eVp ,Ebha#'b 7&Y > ]L?)Q*%NPp OI ?zAu# : |o{Z[!\c r /iF++ i&@ ZDuS #TS#C\ +)0 @ F7MPg 2D^HGr_?Q}{fC-\GC%CJq S sJBC` ok [ oNw`Wi AUhE\yb fG.|s,Qhav Cg%<<KDikVL*'Xl0=} "*S.Z78R~ [nVp> :K2E / Q&  qPaW |= ^udu?T Lao lbY&LvGcK1TG=>)&Se4b/Y=jh-YHxg9e^vd1(`PBj[  f  ,n - jYE2   f ( ZjAQ:lMGU7W+d0@U5 ?&E5.CIr!$rE6z'yF  g 3 9| !1Kv ^W @#>^~*^q(Opgg` O q c c Q $5U"W{k5M\)Fh0>]_ % ~ yq]f/z q3a8 /$52([kOv u  S c Inq{Vm]ax bw%[SqjvU   b=D*e}( ?|,.FeVi"Y_ Y A e@ q -r9NNO erqj/{_&$7}?SwrR(M^e N YIo-sV1 e d HP(nJ}7a  0 M C 5$/: #3aF[$'j0k\Q*Y(rfw8GpG*9 Ynz ; FJn8tcl14 aXv5 D G ') xP }84V!%nQ/Eg`9[6~,n*7~tt [ MRV v,O]wPgI &! B \ u 8 $!&vd(X~=|^aYFY!5N}kV<A!J}k/Vh/ < W1;_f13 ;$sF~n*%jJ>]Qd. kBO |' q~<^x~3WLQLz&` ml<k8; h3=|+# X||Fqgd MftFnT>O  \ WL[ I7?zf7 ghi~Vr+d iy`BCA$ !Xmk34('o} . 3 [E3iDMrd x _|"U) ;)I - $X  (S ^ zNpfMw|lcR.ij@pBVEH w >r]#< dORr\!QK .YvlzZs"!3^<l T >E6_ Q? 0IIc w68WL {qeIK-34m|tUs2 (;3g!70xv)n>V+8Z]2_ #1B4@3!ml+.D,p>MG~|[% V""9fp#+, &QqsbQo@L 1??*!-).8D8'EWau~wthQ1)"g[]pqk{sc`_PRV\^OMIIUYTUWMC;898A8!,8PQE:649FIUUCJVdzvxjrytqx}sp{zdesilwqolptifzm^dk{vlx~yr`W\ctxid\B;LZYMJIA2.8ITgsmnv~rntqhZL?4( !8OE:5EVLJNMHBDP_jjqvuv|   !   }{tx|tULSOYmy~o]cvxwodrrVT\i{pdXRO8?[^M:FPC48I@66;??8(#&"3@00503ESJ88INUTUfcUP[i^OO[[PVWNKGFOW[enpjfis}t|tecdcgpnkrvpfeov\ur}{wPOi ^R||vn{ K/5!k\!"KM*QC 9*9q@3OTmZ FSY@kX0q~7D HY5_+t2#)|bao*#8{nI#;e>`U.^~FRw}.o[}fW"Z +b l bZk\V;& [t}5y@u#?FU|5q70hOq/GQaVfyf_:N,?N uU=-|Bp S FD|k(%I3[GNhS H$l  Av;"EOC*YnFx +0!*  rYJ*  EX nw.G+v.BPZ3+@(\jM=9=  P} yJ>g$RV DE.6iTyE cf.d HzX.3/HzQVP9aR^-kiXe.5m/vK L  ^_n$  ^-Qb`\' $:Uty'jx$5`]cd#x-3tl]lTmkYBgbfPh!^bFG7db[2~t1n!!t=y <YM /PMut@\Ro}4s<W  S.7qiD@Ik upoi}vbf|YYK9F2!:KEsg\5ptKAoo$& BOVoH=RvSVcc9\mr6i vYqm2s/q9v|pKTG'6;=:DP,_qJ%TLvl,mCW4 o|Z 4 +/L  W #dJX-<.s0+Zx[^^:=$1uXa65lDO3 +   L /o)> _ 6 . v=bC1 3(EG_p*1y*-.#e I$r$XZn|| A'8MOmGs{ S F6<t? <~#S (?  = i A#A , #<;:RUhji<2lDT &6BN>P[D2C]$N/|&?2CX~ t N [yOB/SK6L7w D ]$#p {^kPPp _ / g ( Q|xp]K ^hYHT $0mEu /k[R *08WV+xKL p x y'B_jGRp L U" 5FBb19|4 X T  Y O f Bm^3mpgr}szPXSQx'-$un$B=8|PWYB;FLw!r d ` 7 j \ $ P + c [  : [ U2g?D427ylZOU`jau6&;D7@  zxZ^:hT3 7'fY)MCSqanYNp'%d)*CCjZnJdWD P:v/_t&ED8S6x=$Qk_oQ2foMzw [^QaGA0;&N}v&?^vw2X][ZLAYw~vuwj8@wY%(QTY*[KXb_^e^E?LektzdceTB<FK<3/z}yw|}{gZRIVjigt~| #0& )  2EID?P^qw}xrtmbhyxq|xcY\i[M]w|z^KM@&  '% %"   }w\TE:CA8=ETdmiumjvltlb`_]\pw^tw#A<7EH3*"  & # 8939KWR]ofMGMC8>>>BB>65:??Jb^IRdjbY\]fhM00/+5CG.)DPNRIBL^qof[I?GUdcP= $+%!+4""  |u 7"),$6(/\kw~{|~u^>5E\hMAF. &G[Z6#.66)98  6=D?"9`? P,'0N~<*YeOEI74a~xkfmsxuiyxmV8Ncv\mviszwfa}+kq(Nkz2yMWhP+%EskmfA2s@rS9~9FgVG'8c\X`_rYLT_ fiaBOolJ#\J+v `J9 SfhS)a\i\)*4F m76'  r('/RcH3Jl&Z9yY%'}ia+C~^IClwe9w ub+[=[MHsAUa_+tzlw5'e@`S*;j>81:*gKv%`_O3*Y(SvfMJ="u~mZx"2!3D| El`(b"1S0zHk >GMKWHn1^._&q7?YJyM)221kc^=!l:0n 2[bqT*IL=_ _  C U) ? t  LU%:X[;LvV;@B0sn`<Q4LWRdi'llz }n{\6AB!_8hU=g5:gN: w Lk)<hL b G  m= Bx@\0r& C 1 c V  = @ UmaC}=ee-z}\&x~r65"MW%QL9o ' zDQZ7r xQu~mm.tjBly'a  w<AB;=Xx"oph.o #e'Gt]#\s.UV]NQq: q + Kh+xC  \{qZIssM_x^;h`*j$[B:tD_j \ER^ghJ3& SC7.\] ) d f d k  N Y#9;?}T%^ Xjr0zrEetS?O -AXAIQ]2V~uX8* a/Qf4wmU0N-b]FAx'u^HlB` a + E / a @ Ah~ ^pH^ HRko5k1 j>\YI/-FacW=.NYlm&#(r4 9 jA.>UPMFShpHYNs|u j 3 I  Q : B$c@*Tsai1d^ sN5n.3fdFJHeCz_'i:w{4ujE"?{";Y' h > .pAj-p -kSfP< c3bE %S ~ EeVc&DC:-J5")B,'kW8*KgT,>+4V1t\3 2_DTJV$@z*dO2Z+7#d]{Jq$^@VVVG=T|GQ1 68 ,xX1V~>,NiLC kB8MO\.)1~/[HGwY [?~^ EmY hVl=fYls-Rj%N>zl2 {mKM^vi|Xy`gO & B w +Ur3.~; WeSe^9 T [lwJ^?0SwY0m) T`a5_[S]!~l^Z:< 7 ;&;`qezTw!I)NZz!Huyt 9"iqX! Y6 o/ S &x[ D C Y 9^ T5 >6Ex  ;%K \Wu/;@) 1  *K{ S aG UZ 1ZVJP dVwg8 3?af L  (/ x +\4/ \onr\SjKmgI N? >u ] f{pnr`(JN 'j uoL G0+z &V"' ug 7~RG$JsD<#>S1c #l#}f c/78\I At\ ;H#VK KF] '3 -u1r{V .TA + b "v }t+1Nb  Pm lJu$p|ajO 3  1J %!]# (^ :3X3L/nRV/x7F@m 4H 2p ^% :~ xl?TS)~ 3BA% dfySk) _$:Z8vcGI   e"_> he3IG*3Wt{ evm-A:0nRsKDR/Z yMDdbze+Zxk] @RF-I "'~r)L)B hC_d^K% EallYgE_* ^KokWefVXSo0D"}}pnUn zPGgfw}/<8`ap^:$xRH[Q6-? ozr43.m'! 6yJX75yX*U:z%rr){&j3:(JyM_ v>4  mY"]BGUUh 'l1h`=eh1e*4t+d\|Idv P(G-l?!".4Dn a  _ | 1 9 3 ?I  + E ) 70 GO8=?9PpmvAKrxi?x,]R7+X[ N4j&rl VT+Y7  uQFU_^tnzW/L1mOGiK1JwFtW  eG=2u`Adx#xn  Y   @ \mKF`"d[|l|7OJ9(+APr*bAD,_ ]5c h"h%&"# >!  ~,q/KWVZ x|W<I 11|no;|TWl^^ C 6x.` *  )9ap3[D(_qCX60\Iv*~sR.NvH !I ""a""r"?] [9߂$Ev_k=r0~OuDF@\2% `z !";!QVS ZI.HN,gvest fX ( 9:G#Xio)Z}"V-XtaP   ) sxvDK}JGUR;:Q,U5KZTd !& ?]RWG ]3&eekQ6DR 1-" B c E - J +\n\o/e3G(9k'`^ _~9v%3qflOd1#OFz $F,I_Ah?, t<2Y%D}=z9OeR/a&IK9{ Bf"q j;]6=&5QJ~ 2Ga@{D!CY /c@,1| $6GLX1+u xSJy0;s;\;kt/g(pnggA(#{r(KOB;o5*i[Lmpc(Yl-4b:VvDb],m.$}R4\25zc< f SV6skh{L;&bu])c(s%0)[WF8~#`]IJ"NtS#ifbcy@_F>2~3(b  _ t ` HN^^ L  J1sQ%L WuVo  rucU-U4]?mf9B2cg?5W pXS?|Zqt+7^ZzNO d BKvsa^  9hFgbtd6Lcv e  9   4 vvl^m3=P  !^B[)z/iF(vZME .we'w$`TnI | .l;e8: r7Cl[>PA/ BJXt 5 &Q8?rxG V ( * 8 XNJ{~wm6! PUVvLP2E "})wv3<W AQ:+(5,i y-&r. z dsu1He $2;+ /+zAp^@5 sX_-  T k ~ 2 , R%m[ | q(GZ\}N~/W\RRte>tL ~_ZOS H /s%EYyC $n 4u[rGwB Pm ^zQ u   $/ 0 R~ \v7ipoSoHc']@ 4 Ksgw sPk5yG2R%/ M  y ZoF[x SU*$^r* Q,z lww@CMqU,'VvfOFOM{UGF / OY3%uyL0C V=cg~> yT p   ``/>,XWbGu1J H6 N,h qXRjA4um3JqiU;*  g  j &p"#mz C  ^AUmCG 2# sy QC^kOlIB*L:5~>ycjIv^h( x|P&7!)C`7sBwX,0U o | K d *{3 7 , K[y % ( zv|:'8? M  ITO:qR>UuA-!~3b[v%O\ G4]Bz_UL^G>Xv,(I?d 4,p  * c htj e ;T%=A4cea]jLl_^XgnZx} iPg 4[O1~Jl@MPvYaxdSw?( uXmEp8m7`Jy b | ? y ; \ ? 9  x  p <  ~5p}O<T  Z^`23<CbH"Q'yHSd8 q/dT8(d! %lqE o:>-bq%+Llcs%"025U$UYHR3 > o ' . l C4 B hLs^' \4yaqh-+_Y)fQ;= lg??VEGOxv &viVG\I/>qz4[<M)R}Wq k$l  ,  W ~  ^  P3pU " |^#yL0jb(l.xSR==H}w5 g;q :wGvB1h)oBQE}C-Evf9]S^[vXP<Kl$Q KEIn @@"  Z L m qcT6  TT> nNk] z$62O-Ij+(Qc/1u/XI-_Ev3cRN}4{KHN:">I8G(1:@) /sW&$pM<>!zV&R0"RW\  YRIYY G?Cv q tP$RRCZa4'[uj &L!k Pmov|wg|Ssw'$)yey/?1 ^,KN(D fRk5) 'yR  w  e K SG RM(1 x*sqQ>HW5T']wO2{rD1bE] 3=_jUN;'nz&.ij;)%_R UE|:F < 8}}3 8z%l } %M 2R@ W=" ? GSpZQ57Uk4nGfq!F8i\w vS;Pv3a*3Dd?xV2aX0SWkfXdxLDId / meD[    B  Xg0u@i]-G"l/G_kg'u?eL"Jsf#;D;$foeGoIycIR  _jI d5 FX+T7  z9  a   4 oZ: + y V<8(S8Kf aDn+~46NM U%"Zd; PM?a]05l wF i_ /6%F3Fa =   Z d { ' m?  -/ I Lz jgsb$aRV)P'M7k7>\![QYB_9JL2`j:fcm6>/Nw=^.A)`Z CE1 j L  m  w 8V[o( 9 k In#(a 9+r5`COS*s*uiD:+G75J>|w.brMJ; XZ(``YG F5P[A}/Hf4G)< sunT}H@P Mf!/  3 7l >e8^I_  /d0h  ytP^A Yy3@1BLr}w?V2'?u1;V O/AD]+N*1C?) %g$  `N pfx *y@wQ x T*{[qHa) a{Ki9&dDCD BZfVT5DTEki1}x%tRCd&TG;\Mz <8A%8P6  S,*/W F@h.t 2 IJ@n"~  y^;gt:rX`1CrJ'8 ev_ogiunc<l@m=-:@_ w 5=ys"+ o}DuR 0 \YSGg-  *3 ]"kTW1~3LX@pj WP[X @G_=gA~;'6#>:^:K23l^ 2H 3n>=*jp0c`"B`:5 "{< 0BzO4PY a \s&E4+fQ|&|7rL0&4v|vV@x.vj8mQn11S.-o  7 u (_xo+4 xs e WH~3)g1 K 1:0j&i]:!<g{ @-~pv"Vqtip>}rea-0b]L 9o qYjwK | n\ C (]3Y zp[   d/Ln%4  Q4) 4+Jb{zu:rXg'R[le3/0 #0N{'25gbKLm?  w|jUw5> X OU,q :#C WM QG.=F;a[p3 gfpk@{_/]~lFUCI#raFg UM&t;^n[u .F4h`[E8~b8c Em&v  vna]iyR `0~ kw f1L$Bw {Hg \Q=PihB/I$s4n -iY+ ' g l a7EBmP wEnZVX2I | U 1 RMiE: ^4clnF{pL%Z9P>`ye}^^EFQ C g=nTX #gW`S  =  T  oM)Rq- L.VD:q%A'De C0YVA\z:b E|s]O8z6eB %5Ye%# *ضKG 2  &Iq 5f yVW8) mQzT*- EXE: C(\:)SmDmvV} ,g&h ;B PZU3.H_P~~J?It6J_YZba_M%;Dgq\|7^ $H?EV)wvQ\P^r$\ <j]:xzF4tO=H [\;<>;X|UJK#lJ\6Nx W +t5R"InC <hf7fG^a71F1IM*v=xz^BR X ~@  `v#\jy+ &WMj[JzqzL 8B #;`OAy ]ly >"~agkY).7vrThY#8m JX.<~ 32 n%c'jbIK@gi p+B;3Q-b l c-l=%3 U%H r`X7XG2[V[Oj o]p%D;),~S3OjskK,.?sF> k@|?^<1TeA|OLu\* ;EU N e99uxsXY_  L^ )UV ? {zi9y .S " XF\]t6.o- s2E!V hr54b{$z | e R K (  H*e X > X~Z, & 96}v}(l%r I|~Q2|5 ^eU[\4s?Ii \3k6c 0 W b  drpYx9I mjg}}A , }9Le:>j^D nHGSVAX]9.I 7TTG"Qc-Oi:w{:]e&l&F)LP~qKg b 5 ` xxuD[K^ ^ C Z ,0dvMO ~ 5 " pFMEU" jJ',|(BBrpm" B4UaOAM#BymdUGx OlMb2Ws/ - R }E*"NVf< ~ 8 RtxEo4xq1& m D R B(rnyNu>$ER3[p+&|Tbcr7()="9v;s'lz"bJNEW6\wIR ;4p / / 6 @i$'r.W > < 6 e![HD" |  Z )wX;=;;awGFj!~k8EX0_Y*k`.6SU^k $ua5H . q , Q <  YPDo}X  J O  PG5Gw /zzT_K4-t(m%x.<qe4LQ5|YF]#}~ :g36r:E ?h{uCW{xwbw  !  q ` : S $ L E{9c)E\3Qa#T [K9Nya2   C1% {:6"7 '.b+^Fmi21{fB^Q7 t=lW#:< v C m  nJF$PtzVE6KJ)0A;O78ZSgxs/:>Qnhp[wlj]=F39 .9)=\Mu]kwXll28(#+dEXe`jfj 6 V [ ) J ' H&ZI 1T Fn%Wsi_LQ? yY3%5&Z "L|U=x,pQ_F> e: H5D^yEw<D .F,@:QE9Rof'f  ytZ&)5\gB29Ba,h0i'GZU_ L) *Kb sxh5; ^>6kem U 8t`/  & L@u^mV-~WM?,"+8FowegzcN,6I:2'B50>Xuu 5rdJn+[jTmgtI|?xslS?M`][rmyy{xnzYxb Flzn6% e]4Bqw/v/P#gOdhI8"_NqFKn-;bwdNg?DzsEzI;HIABQWP:!1CH>;OXdslhldHM5pkkuv%>:sZ1o1h}ixWb[LTOYg/UWWHN-n.F= l<7-|~y3f  l=|_-b5Y.7KTA%qg ES #+ ooim'x[8kr|sbVC+ xIl>i'KVjz]r&lBa0 *?_2"~YI0.A;;<0-999B=CLPY`[JEPWQI1|`FkX;8e4wlK+ ,o8j%fQ!i!Lv|kT@ }\+{P+ .MuO@S]mY47~&j=#8Ql!-2!// {k^]SD,## y}    -0/KVUXYXR\WZfaiX91+&0IZZXZbjnmkloilmq}fk~|r]PFDEK]\ZWNGC??=;;.+3.+(%(+-'%)>OW`Z\XKU`\NOI8<DB<?M]lklnk{~o|ssk]QG4/,,+  # #$BYXe&>,Bq $4?FA<HJ6lXTIL@,%*+/87@NTas[9u]8#{Y5!,1#%8:3+/:=<@B?HLMW]^\XTPOD9?=%|nox !4GQcut (Ngu5FWvwkuzqgZ_\G(ycI3(qrk]OWS0 /, %11"/'2Oehd_bm_IF?-ty{rwtjaA'%qfW>,'7Sm#Aj?Wm !)+2:6/*+}h^S@)+nb_S;*#++*8J[[Werpm #'&#"ygPA# rcQ9" 6KSWbx0Hp0W 4[)Rjnux}nE:#_H@.|N=OXa\\c[HDF?3$dC:*8SROa "132*(&-5::$ ,,"+. 8z'd$$DJ827$ (X *] .01=GYersaL7wV&pElA 18;::Nizx~ssli^>1$oC* 1Sf*4:8D]ixyd\ogKHMNJNgt{{{{oxw{{ov}}xZ=B>xC k@ rD/+38OW.vAb'X.g F8KhZ<,t7v=}_D$paP<1zwtwpWA.'. .L^i{|e4 t='!wS9&A~X-l$]V:Q*TblzH~. nQ.^LL;APN$|uswgaaXld)k8 b4 y_pnP6(8?7V?tUT[\gD}&SO>TmqyQ)Cx"eU"fOM;06WJ  7>&2GBiX$~zqLoAM0J =8oU YxK*#c9+~7N\i0M St3~ZpSY-ey9tvqJIXy@}|1& }l.nN|*&JW_GYnH*t>e@ +wr Rv7 f $ ]H_K|V-?^SJA}YVl@ !fe1f6:DVln:}]Q:!vJ7F}j TB4%Af$ [ + f  7  q ~ r  q TTcaF3S7]SbFD;AD'0Py`8vxn:13;eR't _)yo76)m9\WN.ck,u *N` { $ |  "K r * gK1 .uh K g<_XpX}lAHe p  R M4KiDSN99\!PNly b[u ~J$zM (' f\Sc T k   Tak  ;fG,_3e9vrFs[NW7  ~} )/~X]1#9#3A+vS u$ Mt_ S 0$jk>b3): dx.*5 x 9`   T 5I3Yk o+U K_=`h[~]G 4D 1)D~fagr\o8T ~ۋBu9| &2Ue< ]RVNV T L] ` u !hul7Hx7[s-A[ # vnkPrG 3Xv9I,2Q - `\ߪ4.q>St?rWQ'tZ# <  ? 73G;2SG ,v@#  GF [0~5#_W/g-C ?  %G4QUV  [ v q %<!qEUn^-kI($ = i z B =Bq ?#P^B~r z <+oYifi%y^v|GMd^>k= Y|/2a4 PO%)_A))`Ysk'.5-=CvXsFk D [cS< xx@3pE ^?hX  J   XC A5Cc !P!" 1` ydUlMU3J ? KE  Oj$Q+,A?E`6@70v s;8"[sH=RF@Hrg-NWH5&:L:`YPt7Fpzy_@,vHf:P[CDWz(D>$u2?&yQu0 >nv>xjpyT+zQ=?6+'%0#&eda;{>7]vkUI) mantu-P* (Tlqpd^puwiF@OJ+:GKWajepj>9CC*CjO'=+4EUQ 4R%;@9"&"6J3-KtpP>DFB?, :7(&)+#&3HF%/<+,RlrgY`t|h>4;GPF0/EPD735)7II<  /##$*0>PJ65>:@IA6 6Wh[JGThjUEPfk\jyxxf][VHFUWA:BI?9N]L/:S\_bfvssvovtmajZ[w`bzpdblnT^ugiufHLUX]X[X:'11+.@myaizupkfwvy=;R<#.C8-<MUTJ9<SVIS{yukp}xZTo|gXpeUcePOr  +53/,ipL@n}L;m{nCgxF6HkgboaLR +0K :fKdqDx>BRNBdk62?5%:%)!=M(_Z +GC C\LkmS. L=ZaIpf*V9 6nwQ\Jk|om*`AvmU"7O ['tI\2^r ;E.@ +!ocmRxIyw0u/a4M:d[jc\Uq>+M )5 ;_G ?; Blq WM YBM P X* 5Ev l_^n"( 7, mjP1W\!V{y7j)G m0)2 w 1|P2I+* S,yXiM! ?_} Ce |sn1rxj"qMd?'FJ GnARn d( -# E_f09_Dy@4c@#L%I!BA r+hM99hk, fp Pb#!$l? x U MU 7L6rs\ OS 0F e3 ?F ~xSS, d<<3v3K &b\C<#9<0t v8 f { n}b7tn) ) J<*r B (l i1]&x Ly ?  G  jf"pYI3|W 2 b 2EO 9 h _P5De< ZQ >'q, Z r?HW4A;1=Hm]dzh&1$P 2# gOcU ^+G $<0| Wv -. ?x^@L^  B*0{L| O$ Lo6z3  *W$.}QaX[!W[o}Nw;/g@T*/1_iv|+2 ~4MH!_WrEWoDu>,e ToH?qC-^/`?!*2mmYew7)\jQ\c`V</ lS#D@T:\wk+.gSufQ^oG0mX0Z3mP1zo3oHfKj=VqpZ}z}bn2c^,lMW8-IBW.^7Rjpe&]HRPl4_CwX)8v>L:\ \tKCP_Mgj 7* e)(V+__;$Lu2R@5g_:M;x/4/B:(I@ xTA?kXPgB"c=&2gz3B&/K:B*a%%pfdHyjijuVijVG~lM3U^0OaH~tH]vQTA(bnR2Lh`ikKnp*/ 9 * #  7%#.8   o|pz}  % ## =3&++28-+BC*(77+?A'9:%+GYjcHJ]b[>#,30/2317EH@L]Q9FZUGAP\QIF59J>  ,'%"-#'43 )$   $,.2+)0/*  .     "31,:@EC74754,)5A8%/JNF@Hbn_Ykqmab^C;6<HTYXcfdfjt}jPUszrtxxooyreeYANgh[\wuzvow~xvvzy}tcbddd]TYfhprtwmchzrccpkZVVUG=KaeVQVRK@BRYQHS[OFGVYHEFB<6AACMFCB?AHGILE=421394*,,,+'&)'# %')89=@?HTU[bhbVX_dj`W`UTfbckjnuxukidahsxmmmffnvs{    -("(   &:GJ@CWZE6ANH4#+9*+  -%3IOG8>D@96;6-"   xsokW<;0(4FSSXUHIQFA=0$ " !("%( !27+*>H=4/ ' $43;>BKC0*306E>.,@ahXGaoUJEVm}||l_^RYgwzlfv}#BP-#2$  !  'LPL844DM=D5K**$fb-+=$=_W?Uox*?> ,!| zep_Tt{`E8&%:$ 6GJaKYF-tn]{eyw8/ecD_sZ~3qf  Z+g"9r[5CsWV():KLaf Qdo:CM*18zCkP.c OK Awmna:g<LE:(Ox9R 78Qq/iWNaSukr/N<":$e1) v  y Z  dJ@ a  I 9  h}]op[`Q?-#9 +Q{qKk {bC=}^yP$eJ *u4RIO2.L,td m U  PJ8; M  YN_ "A.-&l62l I  H K 3 z  k o[}_g0+ nbi]KTjH~dQkFiV;2E}>?;/p{k%+ JX3I` ! X  ckFG" s"!KVkc V='Odv,@c->Ce |x$/> Vn'#VE9 *dua#yo2EU&1VJw2<3LbF3zj[?7ErS p+T,$ 8 ] [$O"Aa 3 O  kQx ^ <t f`" v P R< 7 7 [D# s@_g RK<:PVL_e^gAl6I: D^OBaLp` zB (^Trj@Zie]2.VA~3 D 6 n  T & N "@ V/%T dX}W k!XL R * 5 g  '86Cam9Sj7m  ];E%AzEcc5zd&U={(32k%t_F*C  Q xLK,i!c@7qS - n k   2 #Et!Y 1 U w f ;5$ZG,(F3. i} |iPC.0tr-^wq&U^+2;Rtp3Z ZrKdB@p6S3OV'$`kow Sc}Za;rUK ! w U 0 m L [ [ < * 0 . Py uU[VR ]~,(MCOS@e !hK$VV$"O -ZMx9l_C(ZJ)'\_8eR17s\yI)*M [^j{,L} 1>;zD ~(,/8    d <  } 4 }3 * OtSXIDql1mEhY]?eVCPr`V{V}Y\ gOBKpm!~R'51`GI]Yjg:j I@thG: N;ND<:1.13Az #N$r)zsl%:SS\!+W H :T]$V^ z{BerR+ `!/ok%@]]gC}C]UX ^ <h;b; h4]{xg^R"Ani*>m(tNYzyvfeVOUSalLMTZlDO;1Pupn }`{{E;W0za?hDd; ExdT[@2eY/"[XzcIWjn`{+fDy);Y9@XVaLwqXa_#QTsfs|qaaV7 ><1TUc:W/b 1+"3c <cwT.(9OI9Rptx@PAI%9.K:Wp~Rwy%j/mGv?pA#`g D ? k s\Jd 4 n ?   k,PC|'{lf2]M7U~eI(O!G+1H.50nlWHwq.`2M}+)U{a3Yf /  O*^|d|m45cn8#0&<O`a z + * l % J _ ^ K  op  %cefG_++fR# n^5Q(}!e )kAz5M]3j={U;1whrTOtDW/MMr?8LK'2`j%Ruy>&APz3Lp|)&v.WCc=O ? 6   g'NdKV<R:9q2II>a@Be:  g-RrRn& %/&:1XG.#9Zz'v,yq|(#p;"#@~ gD,!5ah>\@ \g7 n t  ^h4M2\wdCs9b<unt-ze3k^il06;K}L@<9 WKda.{_G7OQ,A#Se[\9 UF#;U/^d _ Y,S#nIL &BkK@~'$Q$O"Mx i2:%  h>G v 7*} IfEa:,3XL@Wo 5OeMEHi!gn4\BXPV $QyaUxP8SIft(nvZ )>~a nPiL%[a"3=pR!Ri7g];.RTr/ L "*pu9C xgjK+e [=m|TY"~9[W@Z3-h@|}\tuy[KM\nI)0[Q1hP LNX{&6P{FI> W`3o6R\dYhJvm@ p,@1g.q C;N : XMb ( b f 0 4 )~swX9R5$4.-p@-G0s+g X1J,;;&x\CR   &Vz*4?k{*<(~(x?%2*579BD?IO?>INWchlx{z|~~rgff_NCB9-173   {x|putjaXIIO@% 19Im)535;BA/5SVPJJQT^^SPK@9;A@&()$$&*+.411+)(!|vsul_VH<=;0$&'! *("!#+'  $1FKC8DW`ky   um\NWgulclsrkafhKAJIKE@KZdSI[T;!<0%%$2+%-3'$$++    &00"))(" &&#/4-+68=GKNF9/2:5++7?;77<KUVUPGGKXgoslfjk`Q;@SD>JLDEQMBGPU`T>;<HH:6=MSIKLG90DC11DO7,@Vgif[_zvhp{ymffaPEIMM3'@?6619FE=@POF<(/7*&7,"1270  ,3?HC0(/7<7+-9," *1$#256:<G>$)-5;27@C:0394.6:5==6IRPPKPWerzxq{x`TPV`\Yetumis|usuon}|uor[OV[XVF51%)2)1<3/0&!+/0-1<6#!#-4! 1+(16743DMDJNK84=4*$63158CB/6O[URhkb{nhu|smwwm`UWk~|ot *23:UZB>Q^[Urty     */#".5/.EM;+7MM3!1:% >3  )skAQoY>Wc7:,%4./;##5)$59)'& #2jlA!0t}y_qR9^j^QX]l`";;(JXPNS9R~aD~&*1?dU"`Du>Xfda)[&2WmbS YVy gdr<QleNy YJ$Om)3G[S`K^IfGgcdQL4aa47IJy%IcU W$Mz<ofYlV@%"$@r~GhZ =b \ i  h  R  G 8 e o H w ` *k6rJC|+g@k/pb6Qr'n0rSY[-&P"'04X$+3U?Or6V+t!+aJ,E}h<|W4raJk?C=qc^0%3_ '##;,JJ ~ u @ D` J $ e Td?B ZqwA|X+[G{~1^4h%1",2J %"6/SJI_*J6)8 G2d5,rIun+b*6"Ge02QE)~a3W Hr2ka;s)ay#wBrZ>rMOe - z -J  z nSK s{)Ab!w\3c )OvBjQ!K.%#i*]jt^Sh*kt(^j+|.UtK*dTrvLWyCF_h7KaN:;uK~i hlh^U#f_peI F b8 M ' k$ 3 2 !+ W giO w jQ1:$'SJMX3Y$Ov]GziyF"$@flz6;id(TKNpqJ|q1G}*M?:=C?U[ dq$>o+S w7M_[f{ 6 <?#{-G[B ( b b}  C  i A q T R  n  2 \Zu=\@ o[aQ*!ZwAL:_|KgG=2S z6@J'1./F e\'Xe? I=ra(#-? BJ!ki9`z\ +nS@L|\~U6 & +  , S   L r d t ~ S uz1lGZF%. u}FAO=7bFV ''OJ^L28Sgo O@tq_F,N wfr6 |#3.P&t3,+j#JU9 j:4P4n j5K<c e?V[a Hf*_}Rw~08^n\f@pbU\[4,_]@=.,X5_{glU=D@gW&`c56cEQ8]a*9G:KT>*pob7HY]xo"ar42q6R17:d,^0',A`t8U|A3#:.^ 9O-d"#AH3+/M6@/OoN5khixmcwe~{ub1! |qw\d~zjkuTFYMJUUWTOIA:>;,&')6BBPOMECP=9<B[P<FS^]OZdWUWafVU\YYZWTRL8-4FD<JE*!'.50/*-2%GXPO[fi]^s{pixrunmfXRL[{ wz~vz{}umoa_QFX`fget}ridgWA?36?7G[O:OgdkyZ:MTTizzvz|k\\\fkitxt|wgiv|qit{vsquury}z  #  !7 %'   !;8&  #  '3-  @M>Tc/ 9DVmW# *ThgF0?H./@Haza+/yvjx~``N8SNGSVge}kQKTcqtB  9Q> I\$ &IJV`G&@@*K BG('=W74X`C/ks9Z>> (JUTPYgk|AIohE<y 2\.:#-1xZ=3 t_  ::T(7Z^6n,7r$Qfu%!!4:d;pjFY#3\@35i&Q9z3eU KF8iZBR~ ozW7*X1.U"e @*;rl?Qf`[H?1ma~~>J%ZUv3?^ s5dK@S'zOh%sF>lyzM] Ia raP90SgB8T5Tqzg,f 5[G>c`pq:c8r.$DV i7El~r} H+T> 3 F2&R31/2j  .\'F`-{PoWF >1\CzhI|l"K_2TAG@~[-.(zd-PqSoN[Nh1.2wXK1{`qS--mdg18KSZo_AyZJ}*=_R m\CWP@YHWUmG|(MGb,BgF?Y6n}VMo|c_y/B*o@W5[1c!k<4N5K~n0a %%$2Xp!j-NgH (2fkx^E`[:@/. @I&X / 1V*4\dP 5_%<XfNW!gIl[>EB3[V_w-$((&Ufc4aM;BOq>"y<.'Ur&h -dc:2Fqjeu,RNs{ *-DiJC' z*0yR8c<YFh#U'"AA$3dS SQrWm6J\yPeI+&,Z Oz*m Kx l EY\ '2*&LGyZ`n]p]fpY{[SwH" )OvS8EmQ_/8wI*+G1f=+,;G/S:%5 . p  8 Q (fp:p  ux:JBXhssoCWEt:p Q!7 .3Cpi R E i Rg z[#wj1h@q))A5ze.%w$0 mCysa?SNg\X$Ia< KdM M:dS(9 z )Vf1F8nS8z63  B .  f 8 T ;]v_ z 9dJO)ed sU}8Sg;UbZfn/d,cl&fk;Q{m.E$hi;y*S YOb4 f&X_y_i[r5+fcX l x L %k[J"}, +q!K0 fgM6OYa\+rE'qu`@F.]_R'&uxa x c  >~Ap<  6#Sy J J p Q oYmg4{,7Z`=q VRP*l j334,~zgJ40 vhEJmP^>#v" > J0^[ w ,NcH,!./Hd3~~.h  ] D ] HiZB ,DK5.s SeC P`yQdCX&l;Uj@{(T[r=5oF;aKJw,=t a: = d d uh2# /7h]5#+./nqN|z5j-z`d+\L%W^Oj=\ +K o6HWh SB!|Q;=[%Dga S S@ fu`#=|m ] [&zKp buZa{]gg8B>X  [3.C[B -[tuaeUZ1V^BDb~uOAkC5a)b;ax#6EVg +Z}],^su]5u(3o&W0!-C@Ih'=;6>GKOZgmxxgu   uVOH8, iW=#zD6,"  &P[l :l}w}7M[n)::=IN@9AMI>9?>.&:XWLNQI8+ gbaMH+   )%fOK?* `{{kck{#    !ERNp'Gj#>`omstjtz}]a`D&wjknfOFA<A8:OK3+AM8./&-, voP-#!$=Zy0DfJh7i!=Y ),C9&0)',( d5Ty(F :z^X}vke^gffwy{|jrQ+pU-r=% }nqvt@p5apmZ)#em fiZ},Rdk  zcEDqVGWhcOEFIM>Re]9$SU. 2E6//?aw2J]czmYH I@9!cU>`c5w0w;oL?![ EgF RbX{jOt0CPA#doX,Ai`irwx&(G.rB%=6P^$<^ 5rOnPZ\3W=X>`jaOmQx1wH yQmA4cWNNH8KCDX7MvZ|s2w+!!* secfz(nIG>,(a0]1Pu J3"-._eY_4?+xK78p("kI ENo 2l82lf i%Gk;<^F!5bgF<ewi.(],y{@<$T* |cx7ACsLu7b`DNVMU+sY#&BlCh YCq5E]y~9C#_Y#!7U\%[rbJ|&Na4 {us/ ki+.]4([nv 6uIq8:Ih"0R*en ,fRJm0&8#eCS&k%"9`uleE>+novxkrLW-{%`Rem%m@PM!ea n>J9DM`E6qa0f?mF.QG 2 X - N +  m   Q zzRFO Eaf}YM5T k@TD.]~ o :W X .5r6WY3 f+Eb)]$Wc_(SC #vJT ]b  D  % b B<BIeGwZ]xZ[ ;rObs&(`5:R$TQ2ra,b(BW! '  7 B m   Z  O A  s0~3({ao+T[e2ml=p*;\+ m3cXMEs}c~z4$'GF_B@srU,M@fn@?O P6&p"oy h &  A  Z   gB e h } U l e v ) 4  q|ti/WE;D[;@&`8$5|h*z#:2IlXfR&.DLI"vT^P0"3x{&HoL(:uDYu\T{+|WS y  G  }  U | US A A0 !  (D*p0%/A$Z~=^B2Lj{6h\M+NYsu6p^$?d{~[ g\`@ai->k<L 0  E   L &  - 1 ] V~x"B PP<Qq*y# k$^58 7%lh=s\@ xq<DE5er4)ZL>,eKf)z4g pVO{2{  ( \\ o  KRa  _ 8 K  _ q{y66Guoa?S*/{hwN\nD}.J_ObbQH EGv+Vt-L7K&JE9vT]1.yc9ZkC3%LF[I4( 0 `  \ \ c K   X&4Pp+(4l_ emI]Ro^uCy>H>JEAVZW|\o,DBh&lqLvTqEWrAp|Hs2o)zgNPgwSeQxV2#a'h|+tC[( w  s u * j z P )  m lCz>0"['%6&Q}];Xn)qot97@$GqBax?A4_V3/?.+L3F'(IT"l)}b6l7Y5f{- S  $ 9 ` e = R 3q>`\0b^9@ 4L.E>xb$Ub4x^UC[<ui@( !! "@@UV22LyO$Z{q*+x'~ ! ^   ( d s B z +A+g+\T@eFIR  EqP8ncZ uPmi,fBTgX*i2.*M7-#)#-me:52Z } [ l E a d a U   %, =8u~O_/%EsnaB%DWcWyWRch)o;u\aHC9d. kF8W4Bh`^k*1 n[ srW'Ik83r3s0hhyzLl3E8,B L  D G '  V V  P " " ; y[ Eg[  P3D*?MOmCU Sot+,=@<(DUvq =UHmx"*HP90LG*1 u& & /  n R 4   4Fedft.y0 jZ2hzL3 ( l*+eVo!}/~f1n]+Vm$)dN81{cQr-m9Y:   ; 8 2 g y V [ L [ f  2 c  v 6<EpXF*p~5H (n8ve#zb1>lB&IDv0Ptwey{Y-,Wdm{s'N\}1a8mY&Q^VMd+  "<@bN/5U"A6PkuBirJ^R}*Wf,!XCsv& Pm*oGr^2[F|~T/p( 3 7  [ b <  k z  1 @ ymw^5Q&&$1+B,V9m~' _H'vo;gcgDv_ URz])Ii E[4jD:^L(6}{"$ w ?5y&%<GJ]3n|! RN@EBR ;z c> Pknb7~1f7_ YQDBkQ>&9qhxqhH@-3(_7^OM!TC<Hp{rafV  UNWIsPP>x]M2 #e9#*@e:Ugn>I`}.n7%vql:9P) eB&"Dw DzQ75]J(ppr^|1# g}[5 LLE|~1I]t bDxq,}Fv*:i-Rm }3mg k?i~kiIed4 ("iJ)m<!>5M5Q] &[ >o!vGS7v#xmVK@#D{sV{SdU<\?[LW=_VDe ;]<oN9H   !%4dugl\t9MO 1rKc,?Zt' k,PW];pC4tl0J<)Q;3"!OBU; U}]N( H,->[ w !  Q H  e + " NCL2&q2x,g^ i?n,P3WyS6oz+i(A(( Ze  Uc,K|S i* #*0= KwtL7]iO+  | m / /  5 |  W z n  @'Mj\xH#Q~l~ `l k67ZB("&)^`APw]K,U KN]A{Gl wGC[F&GGhU{*MB5# WeJYDf %    5 8 _ SB <  f H =kZ1.64S ==l5Hf:CAM8nRS6PP%i-,&tLh%YL1%P@< gVVm^$ ; "  l Y T Z #  & ? d  K87|0D/?]BM&k<O_uyl5mVxr.~0L4iE0:om^h7y9&Ovf0tYm7,5TX.2fI>NIBam6.h ,% ; \ s  . 7  @ l w  ' _cm Gele/z0J+eKA+I$  .XVohsE1%3L!uUhw ff k s]`]_@Ijbo;'s]^ z*X ( 1 , ^ 3  ) : V . B  v Gf5p<sI3xD'g5}%6JX:D&L rIm: 8aDUL:f q& VDd7j0 3vVQBhz}%R445I;!.T>cz;c"@sqy P G } $  y 3$ +smWyghz/`9G4*0W/k%(YT$YG! 8|OS0hcSt:]+gCx<q1XKe,s!*h- sHXo#=s^~ka |y>Z5X!DNL#>MP cOpMKj#,HG=0kgH O}J~V.3*fFb%_ Qh3,R-Yhpnp]} @!PEDHkQEeXtlX8q6{>cq( { =(MJwzeS\2oDZboqp8Fv@eMCG/D=$cw$!eUr9m=l?#JWz;oA B]"8=8}dD_V`/7MUHx}<X?[P-qX )e i b=a$6"Y| [:NF 9'`c}PHhI=b31v1*!.%[ld%Q;-yioR~)yC9+PZq8>ixoB>TAR))YD Hr=S!x/5cQE~ZNBH"D3R 78rX @C+?3A"v*i4zJ.*^D y*!.T% 5u;M#zytj||B`b|ZdaX}}Qxl A< @D(!;MD31@WK)9m|^NUbqf_|{Q66?KqiFE^nG(-!-3#+SwTjtlb^ha]XSwxvv}{~xcR_kbVXahth:*IVLc}z^Qfd\aR' 60/ '7) (A7?J6)% zx.   ..cbOSo|aZwz`fZSROecW[_p|pp *,$=TA6AF4)+  $-9,!kpJ556B\aP?21,/0  (8G]f`h{xuh`gI(%%,(   ROnsqye3b.ay~ZH EtwZrtU8">wk-!7d|wb[84oYAdrEfCFTwA<dZ/$*=GOwk5#veZ&Uex Py:#oDE cm=cZw]w-s^- Z/"wrRYG:${3v gA,C|5V8.4&I #9M:v8o&%r38he=` |V#;'}=%N w oaz9Fhy7q/|9il+$\] (u`W?a mgF]_AZL7(/]hGrFPAtVr46|hd1d&1h'im_` (c_2W7T$ ~xV~s@/{O D )[ e m ~ Cd{$37Ym`$|$)7)ed!?Q *o:AVghu /]YDi   WmjCTUIy Y1 FU(K1 + n5v:lPf WcAU+1L^y*:2d;N*n:NkRB-.+*jwBMk| Tk?S"&  b#qjh   J485>aj@M1bM4Ez&r bE^O5xh H2x=gVA& D{vG `P l <8i<rvh ;nE>'c t +/dRdJP$ m C JHoac*j#]d`C33wqROS_e{8`@y:T^ { u i /#C 3 *0[ s9.,|! } B F >GT}_/HCHv> |<mf~6Iea^&YxI4'*R ZId8{?,Vv9?&*<Wk  O K V x   K w &a%H`|:-TwbL/mgh"n{- ,t8di#sp,P-:3rO B[ Ncen!E_ \9*h1O * 2 9O$ a e o v4"{fRw N-J{}Q \ )=G0eFV0_f#WKfYx(]J%@@R9k,wsgW .8q`c V3u? V C ' 1 $  d' ~0 %Qb4hF//C) ;* Hk[HI\sMo;!A`mEJ3s"_j'L1j7* Cw+Y[TVZuxs1&g`  4 Cvb x 2 ( > ( O yAFx#d4usW0j@UUbaw%G*W?\G$ QF8';;KGyn` |&^rb+W%J$d4Jd ]  8_s j 6 B KN ^ t Z90=jy O lS:#JFG$I +FqY7*9Flw=G  dZA5 =e@ dj<!;uL -H \<[$Du{ $ p 5  v   d   l L6a> Y _bNS,*o{+FwUXH6CsWOTP=ro4_qB?Eg+y>&k  i  j q d u +*!8  4 I !T~11EUiY<__=q.!~=L(%]g>7WgfO8yzb<8h jN}4,v.$ H!mr Q H f W  P ? _ ) f@xGStc^g~}-e|<:7b4v2uvJ VDV"/~Bl[@zfT*` OOg Hf6,&&U O {} i % Z  o naA VtQ4(E3Fe/ kUId)W,x`8rt{1i4Wl}n@u} ni`,6!7c v W#P n & 6 q  }:Z%*.vbr V r:F3zGts+O[S9TBMov?2YXIhR{/nyunJ_`Y~t  1  `  |b E  t q a wSo4/Y=UI   d]3LE1][rJ%dtv4Bkd.4#5fI*Q a n-W6(R$8 MQn "  E l/4!U cDIu:@z T PU_ZfCt:`E0d2n^]{qrB_LWE+mI0-*xRFLPFc5sAh { Elp[iy+k~ 9 )v|VaFm |S4a:J ANKVcE \:9R._`*C 0t"<Dv4 ]D#6 CDx\e|W,p,ySP$aaCa}Y$]L=i%(m5n+y?1M~1z2\S27PY,ZqCm"l-Ncz Eh$ZEbtt0^7:r[5&V0aqLU+sAY- +r5rnVQ{ )Qep6W.br <`fuhB \HE?h+J !>A)+LQB4E_>4a1B+*1:6 ofEq4LCB7 2D7?v^xUF@qT3RXq}qKr3&d!27E*o65eh`X'orgXhn@&M}iz . 9 QQs.3CF,B @V6*-lG* y74{-amms1$aJPPoUFan&-d:y?33!y6)3a^r{9r. biR?J%QC26 VMA@<0iWdiZQD"gu3 _97 A q PHXCs  & o D\n~}/BL,HD rQKWXo1O]14+X_YNFgYflR!/eS&@oWN]) I n Hy4C U 3Ly@<2*$]^H7$ f^1:jhQ?t@gMQ\B6uP!QD9! i)N,  MrVF % I %z%3/GBp o@i'k4W7x]*Z/'*auG|b3e$ i%J>BS] "mVyCNA K  ?1Ovc v oY% 1-umE[-~ >#`P#B A N(nW /i:.h$G`> SG}O+P  TwboC ) _ U t:[s dR_SW}G6 uV7SAB$G^_;* ,M EfungmVyVSy];Ak9,\W;R  [ 8 c } e 1 Q U ~ m ]l;qVL+C#InDf S)tU] Dsqa.h-4%;6Cgxi)_9B[a@H:1Yn7,~7f&# ,'B`bPWxG@ H9;IZ]+> D&zG{ GVXv7w*YaM9:LG*seS%^%lF*f;%[I9*& ,GOV\_mrwwxO>GF3" xZ!qJ" #Fx(^FEr"Uu}(UETm&JV[m|ohM5+rI1 i0}mWGD@x=t@&IvBBEw9di[n0Zdbw ]I7x{Y;CUP;466=HNNX^SKLOJDBB:scUJ9--) 6JBCa,D($`&DFEHp .BB) 0R,,_~T-, 6#fb=!gpyi"0&yLyf 5\4r.e}5@njPUZ<4INI>#:'q.?|L/f  HVvm5QXg@$Jx7\NJY(w#at 5hwbZQgZ}k6 q"]  q   XF!9o*v&\lK1M?f`1t+Sk0!44k[Dtp0#}DUB{{+C3TA}Z#>\*!2Iub?RMY$7+(>l r { B 9y>nR$vX^<c`e'bIc~n!K'WhGn:m d $?> ;)\Oo )u & , W ZxK.k~)%;m[@F43q :U=\dq;3^Ga47 Tk>a,a 9z X  ] D7'a{HB  eU/xn\ndDU3 n ]  - <'%s<[%}k! D#/P]` r X W YQ q43(Rir A=Mg>S78TnO.v_ : & @ v g p I QiO1u(m%GUob,>)=v k G r;vc,+~b  | . 3uHYpK8}z}p^L#.Yx J  x _  g "  bV^L+7=? B YQ$p g ? D /xaN\zc~"m fd9/k+A6Tg[ m G[ u j a t /k=,Do&e 4G/9Q N*]EIC N #\ A  k V t  I&`Io }vR/3w4Qoh852w? ! N B Z ~Cb^Spq $ I X8`zr"O4zMZTd6} pR INn(6h. 4 0 ` bvb9X;AT A*/x;0q0,xe);B#*K& t:8x^<6 <  M F 4 ! W.)i" !h7]'   4K}, vVhH WK Rmvz<9ukrRBu0|d=z1! a x q:t+%  9"sDa = (#kG48Z HU4#&OF!D9nOe'0)=n p982m 0 ~ L <X4v*?  7 )5] HQmBB%/~WUto0 &LUTnFhsAJ2Q8-m#ezCTe=_ 1 ) S  @  - BT(Y6,Oo7]XpEWa% >-dNzj?9hnlv3u$Ih~&Ym0& R B ? `  n 0 G E o l   [ 2 b 0 -I$ ncPZu /Tb^h rev[HQc2SfnToKK4ckhpy7wvo"y S*4Q,>pV0%Z!R[N7 Lm9Nc W!'|2T*/a)16WVk*AY- `z#=jT;"%"{-`E{R"Zq/[/MhSO1vQ E6?,WKZ( *K%%aXE_ TmC kPd192Z`\,"(& P)K1l8$~77d DVn /:0#r9 t`P dF6&[^@| 9>[kEQy8g6\ v Iczkd'+ sam/e6xlj@- TO%{"=M0 >)mz bYq!LB< &?*hB=+F& i<S#nr=bH8f2Vnry[<.mp@~*_&p(PRXH@;LR1T?Y+Qu5J40aB1;M pkEtq2Q<a X4:-7.Jfo`yXCnD (/5Q" y)` yV  @&&K)FrQ\mS+BC~0Z8gS!CHB#|t<nv~xeqgL pIJ;el1y~lyui"u p'DHPfml6@w9m+Um#r2jl&~ fI6 DODl_m$:/@]VVW`  GX!vc4x5-LwQx0=+ow 6 . {j^\5u}W4j g`nb ENx J)7w`zo_019-@8nTKtMtpB!BXm|7SNi1]?+8Xqy^nV =,;pVIDl/ WA IaSvSFw<D>Abw3,04ef5OD#q L(Iw ,;s jMT)%>+-0UkYaB,gK|3&Qs1 vU2puS^\F'R'laP6>N`d}~kY2xfYU !V%JV1G[+hL3d.'.xlfz ,\^ w4'-o#p+>HcDK@(|I&7S hN(Y/Rv{a^?x. }|cxE]H9X&Y]pGXY 9{(xG5a81]Q:43R'}1 K | yN_`H :y9X5Wx}h}yO wUEPcg<eV)B4L6Wa=Z HzHS@:b~\? S-[nb~j&' 0Yz^g `Xw06yYh~4!w@8&_X%8&YqWKXk$0g`YtTt3@)+uY04#}%CUTB:*,E A_S_l2$opXDd eV3=Li>pH@dlF+q',e7o?=ZUU.\2 <  + #*h_ ?ld'[-iO?L^ !U!|FC'k5g)g] Ru \29Z4*  G$ %  Denv ?yH)I  q N oh"Cop/23\E% ) _ 9W9h O"}(#45F:  q!qh.L22#6xUZW0I^C3j@rLL7liU1/sE   m  a  A < Mo&T8z=K' 8 5 B  = ,VI%du}1[sDG"  > 7 J "h@pfP K/RFbA*{ '[X;rD"x`1y4{ 0 y%Z\KM g[32A-W 6-gllhOwRr i 7  `h  # @ U e ] +  `YR7&.Q4e^{[v"k+zdmtYF6i[ b )PwGGCWv-'aXT?Cd,ZH~}uoppkx5B_Zf[ut4!&}O@HvS>i]sBU8ivj &+%nHG4!aJxWP]7(- )&{vaL*[5p`w, xDDZ5   +a''~cAcy>]|XTT8rG>D)2lx6xt"bR%-&{Ma3D&d|0?R-TR-CZ:b'xI#MjH6di0DS@EKSz z3c p^>s$,WO`_fJ{m0>P2~_V] =gr]&Z<( ,qm0{ljixf@"{jWx$mzubZfhjm[hM wU6\BF#~Akf2(KT2E!;X @e[*'Mq`;lQ}%_;,#0#rH eYZsk<IpT2,7X5y"9]eXwzu3S^YG{cZo#F& vux1";fLr6*C;Ch 5:kbSVq|sR=5Z wc ?q jlt?jG,Vm4 83,ICi] X{pE RV @O,5ffjywK|?3 vmnqx#|)5MVLmpJ]xTiw&?MB:81 Kl?~iu8B67qfjQ'%kjua;! ,AD.+ 5U$(imbVJK`[<9;HQEYgrO4 go=#4FAVejbNTaVg|jT6Z7A9=esXJy.a=6)/AUYJ1Fea-<]iRA{)/Hvy{ xQ>C8a)7~e N:p>]>HAu{whVKHU}IaeLoy0 adUU}ns~pxy~l]O0 kIjXpsE"T[iYw;/-d<3i)LEbO3^[ 1.$ 8]CfgJP3&M@Q(mxi_IKtg# }IK6$*GQ}@,EXR,G$%p x%&5% )9AD7 5.+9,W~v: DUK6 Kw)"n'=r!4EK06zk~B 2-%P!bOF ESaaU}: }V4yp\_nVf'F[: H2#,j]%9-1w?/]P^HTOi#sX'XXt1*5BA@UeHN MUnbRhI 12 8t^." %XhD+*?0GsQNQF0?o|zukmic]-5H.b|8fREw6;\9p^_9GzA233l?% wLJMB#"#)C58RJ8  Fte;&?D/:=%%/@)+OZ9"6/.KOSY]K;DA4.:[  *%o`Q2    ,0"'8b(D;?LS[HM`z ;N:*Kka:,<C6# rloz3.s~wliR+$)%$ '4:DFHUUWWWZ[bchl^TXK6BQX[^jhgegj\gq_[fu}qryvy~|WVloaE+/9,  %<D?7<Peol&10'?WXr03288BRRIFH<)')!$73&!_:vkE#   #  #*%GbajaYo}yrwxJ4Sgy~swselmYBDPNRURQNDAJKKJVqqgq?,fcNrmirZ:@= wtvdjncfjiggz /LLGVt,=]szz{qrkezqtuqjTO\d_Ruf#!  !!"':AIQZ`R]y~uedq|wo~    sJWGFGDSS$VHh~t\d&5;CI6'4B?Ehmhsow{|#K;"-55?GAPtxbdxzr`[mo~kblglifE7Q^Q40F]O  8T[OZuyo[E::8b!#!$/+(069..<</)=Q>@fvdomqpk`[ggZ[WYVZnzznkpyvh]UgP+6186?>1$ *%9G82.*621AKH[uzzvpdoy~{laceadW=BJ>+(8::=>H@-$',)+*%,/)'/?:-6Ol_Seywdfwxyznbb^L=;<- &05?Zos   !2=;0-59@8.4%''    n^WVB (8=B/';K4&kkrhQ?@PTIMasvtruqsrke^[``H7bdNS`^TRRJF@=;1)"~y%1N]QOaq\37DBEGWlbFNut_\docXq{ks{{t}pd{~vquvolqw|uz~{~b[dZacx}zkqe_qskr}|}{nl`VWYRKXZXjj`k~|~n[Ybfd^UPSL=<INHScYINWPGECHUU\jim}xWBL=00*Lmmpnni_\KF[Z_xoibZMC:6/3>GVZXaib_oqvtuhx~umnzx^`qushRT[Q@BU^cikkkbXXO: ( *0 ~ ,&$.,'%>?=?7.:O]W@89FK" 1=<Bds\RmzyoerkTKRVPK;9>)*7DNB=HVTRfsbML[h_L54:/.)%-("),$&%%0) "    &5&(;5%'6:@HKOC?E>5/+-,*/8?CNY`fdfwqlqm\[hna]dgqusrspnvzzopqdknknfj}}xzk[P_hSLTYbYRUROP\`ei`Y[RKPMKD67C<171)/4+2DA=>GORPBENDHG>2%+! "  (P=&2>>7(#( !$*0MRTLM\\XODHB32?8 )&230,18E=*Ha]XUYYV=3GA,/1486BPREQxodeP\}{~su~xomq}vafmlon~ysuw{y{xvwscSUPEGA597366?DP`ZYjz{hZebOYT-%4/#(64"*G>8RX\aVXYXN>MXIBDNQ>*+56-$(33/8@GOEG^ZO]hc]R509* '%90)78/&2PbcRc{v^AWWTXT`_[dlpmjo}|wy|}~|~yw|~tkoriYfw}{jb^[Vgpnhak}xrw`gy|}xpyvlimfWampsy /520/95.2000,/102.(,2&#1?D20GJ?EUQNGCNNFFFEC5*28<@@FKJZf`cgm{yqmunfgdli\bjismewv^OU^[B7IG529<2!*2*1=65KH1".@*') (-  !   *) 4/$ 1+"  )!!+9:=8<KEF@DRKD=;CG:/12"*1,-)%,($),--&(*         /9-3M\N?=EMEIQ>==4BI5(9E>407JO51@FA>LKTPE[^QUG1#")AIKNIOM62:69C>007=:'4E44+47)03,,7AB@96CD8760+" "vtunU]algZa]fkVUe`\UH^[=9?PXXamocigSX\Rby|||iV`mjkrvmi{~| "#!!&!'$ ,&$(*7<;9;?=DD43+$07IJJSD6.7<*'484/7?92**24=<             }uy|v~~{y}   %3=<1167%%& &*!(/8LFBPQXWPU[XURYb[bqvq]IANXX_gkopkknphU[p|xvtinodc__knnriftnckumeidiwtpqsjdgeni?:C802NYTZ\ecRJ@2/,4DGJB<C@1+(%#6"$*)&   `r|{zx{pzvf]XV\]HC^vp_YbeSKYbTDHLCCC78IA=QUE>GSQCHXabURbU?95CX[ZfiR=HWL8216IRQW[ZYWfphlhYRLRROXYbpupjqwia]ZZgwx|}c\cZ]hghkZV]Tcxqkhjihllllomlsvrvvy}efkblrx|~~}rs}ut~|{~zquukc\`\MMURIEIKB89@?54EP>1=GA22pocketsphinx-5prealpha/test/data/goforward.fsg0000664000175000017500000000074612771605033016775 00000000000000FSG_BEGIN turtle NUM_STATES 7 START_STATE 0 FINAL_STATE 6 # Transitions TRANSITION 0 1 1.0 go TRANSITION 1 2 0.5 forward TRANSITION 1 3 0.5 backward TRANSITION 2 4 1.0 TRANSITION 3 4 1.0 TRANSITION 4 5 0.1 one TRANSITION 4 5 0.1 two TRANSITION 4 5 0.1 three TRANSITION 4 5 0.1 four TRANSITION 4 5 0.1 five TRANSITION 4 5 0.1 six TRANSITION 4 5 0.1 seven TRANSITION 4 5 0.1 eight TRANSITION 4 5 0.1 nine TRANSITION 4 5 0.1 ten TRANSITION 5 6 0.1 meter TRANSITION 5 6 0.9 meters FSG_END pocketsphinx-5prealpha/test/data/goforward.raw0000664000175000017500000025611012771605033017005 00000000000000    $              ##&%#&2-1) *$#!$'%109;1+.%"$"$ """.(!-10)-7;:& .+ )*#&%*+&&#12/&#)''*$ $!  )(0<1?>@IAB863()),*&,12/7123-1+24/,")4-*/4.-743-'12$#'&+) %2,0CE76<..966AAEMOJ;567HTDDA<FC57>8=A<?FLPHSXRJIHEHDAH:1=.# "0*$07((),B<50:?=A18756/3-+0'#,)#$& (& ##0'*+/,! $ !                     ""$ "$$*'1%+(20).21)/8*36&%$2>888F@>C<D=44@BBFAHJPTMGAIIC;APFNLJPMJQU;4538@;?FHYSNORVBA?=E@PEEMLUOPNQQIAJ>CDCWS_YNQRHCRSQOOQIC?J@<C>>>FSQCTM;AGE9>>QWO`aWZLPUS_bkqqgckf^hhid^jb_dhpqjgfdabY[ibhhhcfzyrmieYWZ_^`pfbkhokji`\\VV_\_a_^d`]a^TT]Xa`^\QYZbYXVLHEQQRXX\IQJCVFXZNU_ffgijc[W_gcZ[T\ZLYRLSXTVd__^STUS]`Y]\`Y[ad^]ecbZ`hcmi`a^]i]RX]bXYSTZSYUTJADHKKEFDJHEK:2B:BE9HQRRMJHD>9<>5C@0;9;9.<:56;8*/4-*)&%"(        "         $ %           #' !&) (.%! $(,&(+*0($('(.+10*3863064-/20/7=027?;>@>H9:A9EKNBCNCQVPO_ZJPOM^PISIKRYVQRUMNB7>FE9B:6@;3850'#5$#2(.- ##"+2;8.)1<40)''#'&1,*7-10127B755>JA?JF@FHI@5HI@GFQMCHF>?E@:=:8<CB:55<=;95&'&).-&&.,*) (%!&*01-2=<7588141#"'08B:-7/ ""',/%''      %!                (! !*(+'09<85;3.45-==-606955;=AD<0162<89B9=DABGH9,47/20$..2/7>*@>@I@CA>A:BPJ86@7BD:@FDAHGICKG?J?=7984HB:F>@@AC6=89>4473864>7<94>;74>?5<;.4;/)3+-+(-%",,,"",&&"# *.,.&-69513+&+("0==2473988<2&',21305?48:,3-7:.;=5FFDFBF=A=@?=FEQRHKRVTLBAC@FGDNLAEF?CAAA>FEFIEAA:/1696FHDRIHPJ=?@7:AKIDJRUSQMN>9G7FSGTQNSLH;9;,C9#5585C@63./!*()%')$*.1'352('3/6%2-%0./G?.56><?JA0-;;?+(811%(4:*$(*1-(!"A=6:4D;*6:>K0&04^j|RUK;I>JB"$Hci8P(&=)oQ$ $322 % '  ,       " $!  %             '"#*##$&%!'(&!-,1(1! *'                              !&# $#"+'' "%#')"           #*B.('!#%,!               !   !$ #!+ "-%$$"'"&..2;:4.320.,''),-15..&,5'%-',&/834$)!%&%$07612D<376'" #!$%     "$ (,+%%'%+(-#(1651;73+!(-/64,6>B?3<9)1876-)/7795""*0$0'%)17-$*#!!#*/+**)*.31$&6;:;;67:87<>-!"+04:1,+5/ *##''(%),',+*%$                         !  !$% %'#%$)(%+.0<0#'(&""'(*)%'#! """  (+&-26601567<:2849B@:56<B<7<F9478:++'#(&*+310)'%-.+.,4::2;?@>9MC@QMPRBNbe^PI=EH,7>A>6:,178954,)141&&%"(..56.-'',*+-##.,2767.,#+1,0==<A9>>9DRG7;*1A<,+=049,/2,(..-&))$!#+)4/3/697=0(!'$'..'$)'''150/*.6-&0210,2:<@=B:#17)//-1.040.)&%!'# %'%&  $%$#%&(# "-0& & ".+ '($(2);:"$#.&"$ &(+&,& "*'   ###                    7001+1($##8,1:35     9V'"-horzWZ!Dzlzf2_QW[cV8 3:||n3=BV?OgkRs~()l\ nP\k#Sfn V``ti{.Xk]4r(O*OucS{_L0p1(^U~i)-E3B tpmg`qhQ~8 ZmV|2ba$3' Z!#>#3 tj Lq@4}|dyCAX 7I4,/O v QCON6DV OGTmf$ 4 L v u'xsRdflWD]6 :$.y~r qH 7 `  ) I#/U %r@ $ D 3%/sUMEs - !- 7ImbZ}BUw>3j\GRx*@ vFV47" **JE U  (l0[1kR j A + % C W f;;1:re] Q RM?\f?>C^Ing[S"#"TFqSz4%U0I A  I )C$=W'c@u.1}  = # el[:GZ{C4:46!MAAzRAaF1GD<52Of>/-   Z \[1ANz=]t-%5Cxc2 mUH4E@o kBqW @Z^8c[EZTe'I&P-BVd@l58 Wv  N2 Idh?nVH4)cX?g[\})!}Xrk~=*Jh|E0[Tqs1gdtrTW&mJ(F qpz /d{(AVO(Y;G  a BZK>I2Sl, +=|a1eJq!`/9oc7G%cFsfc@$ UG . d "6uSH$y5mi6# <  XpYH9nh-B:^_>g.7obf` ]@ n ^k=b`z%g;]Ul YPriItyI+9k/:],~5vjc ( <t { t|W4Qm#oP7b c > =  %v!m 4v~ ]{YE=MD\: - Apj  \& 'IfM%3F->#' % c Q I $ p@ 7,cIm{lSvX^(S% * ] ]TdBx RC27uh=6Y  W 7 C 4 ?H!i?tO;{[Hd U=tO@:YoygA+>j*a2 ]TAw  L GEf{C 6;KU6cJap t K RS x]#2vNLO!HkQ8GD9^Y_E/.HX+  j   ECVFS`s15)v;HT>@5e r {X4y + EhCc}s![;/_B e ?EH>EH8,jzSwX6MVo lku{[1x~t{*\xvH-*# 4WshsTyB I)3Nsd^t-Zas #Vy }9"^ka0Jq|C,5OT>Z@jJ:PyF)zv#0Q]#a^^B'vrR}.tMALb+/Wr4KK# !qj-CxyMfkRaB@~ L%9mZ?*EnG7Ky !7Xd/BblAq\.j0w*mP_LuT ?cU;gcjpjUW7K)~O>Cw=mK>Lyof%:25y%UsevLQ!S1V.h.,LoZ&yNal T0&'^Nn/`-H5`u%wk /5OA4)Wc-0qFL~BC9@`N#6e-15x`Is"=r`[-vG,r`d7/mKB$ve@dMVV|\x};k0>"VaD9hD Sdf@AW\m8.c0ji/'Ivw4*GV3SOaa [NTtX7%19EgG>J(4qDxezkQIr.C}PD?(rV %{R/|P'u\ #<%,DSY+|HC"C("y2Ear7v d3]{QC^~Wp"14 ap SJ"qB^lbUv8tsE)fulEOxBLQh`F.Q$ _BOCGD!r5u?1,cJ]" k=S)dK'gVy"<>~|EB G/M4F{"Da"O 2%lz&%[u(uD^%-&79}xV~`~v f.xo_/@&[<w]@G%T[s1'yV#j2n_(qTiphl&]M?XD Zlz'`N5w^7I VoXzT%*:)*L!rohLT;1?zO@k1 #y2~cZT  dO_ik}Q49A<s3puxqRrHC}:9Nr"in6{!v:nEt:b,'7/wNLw|x6Xw![{V|.^z~SvzK2S.%7KEFzpP"Y=8jK i)Mj--D>8hQf!KrxxpRyYE5I]sW "6 D8#`X]yllRksD++=tcz!.-I<Bz%qq^$EcU2 Q }+Q+q<')8|Sdt]P(Q"z $ 4 I -EUK5s$^~=rv!r;[ V \ 6B;F<mUha={ g4%|63oVk+ -PK f  ;VS"!Bh& d Q } nt{+ V #:<  e k e( +vabv9hb#f}pmr1 ,?Uv N}BY&bX18 s -  n7fP3up, # ( Y+yw3XEO2I}L81l>"POi " O%Y]`.'&- K1 Q W-~46M E,on , [?:H n.tz+ gnEj MN7qwA;XF.[ <W$T.1 R #o C  #R=4 `"D@9eAC'kC7w H k| ]:UyX$dyR!sJuIS,GAmLC ;aU  )-t;9y3q d  S% F\aT qVe1 T O%" Ix2C'FYj\HO@[#kP4OS=JfU rM<F 69q!}B'SwK^6AF CZ ?"`(sr?1<H DWYvO_-4>w}A 8NE`_=cmt~e4,1ia xv^ZDK R*9,Z? %  (SVaLM3KGF _ - ULJMS' <*f_P/MI/i-k>/M,X3&lb;nL' Fi 5 G/8 :-^++T%5? |_d ' ghQJI?49u .k $:Sm h;e3^ $. l=Aa0r}#\hg(s%x R  V {b_ZC-ag z cK= rmv*KF K0#C|  ^v-t ndQ"L1/N5Z 24o8/g83 meADZ Ki  E9;JO n . 53H lXN'CpA%l 0^1( /A` 4k@?T;ml}pm[ M|VrR 3 _w Txy _ WTt>] H | +Yb8vx?'L  eB|'C  6 lElFr+\U2F WaSyF] HXh W$#7 n $39 .*;MbE! W  <`KG~-;n+s!ae" K 7o l'G +m.eLSS?y5QF9:$diQu' 5 , K8]/O.}J +>d?  x96o<9S&)t8, o t b j3,a]HnWhgzL `uxu~qCSocfunhDNVL r  )p' 4#*%p5O9@7  V/5{zt&GZruS$3an/yvnuC 2dI2$=Ja|#x)x"<]%s";+a^$A %d6Vh`f{V'y^x`/A IWifvL4(6Ns( zwqq4um|J2S>Y889H^b- i;;1FEELq@M $@duQk(h/3Yza[iCqEO jI%PRg4A4>UL325YN"hO*oOw8c \=?FhYdo}Lz^8!  Kmw:jIHXwiE9UWI"^&v]:ow7-sjskeV0&")4+ M h<18EXr~}Y28Q\cJB.7Ddz W]<Rr"(~21sX!W|s|%VugGL@s"0iTnP_ Iyrpxx9HCO9j9o{rE*1>$xe ]:ES'|R ,#vsr:MnAE|@PG%{[#,q+W#G;FL.;Yt|*a1 MF VG$CVn 1+@nyunxU>G3!B,2QhN\ j^ n7w3O8` 5sn>5RII&#VZP"T@e5HEbj? Gb/ASK(7_?cA\n `A8_gqmV;AKk\T`7"kt;I%>S xMmO< Cu$m3FH4tD] {ki]\~ JYO,1&}dyO:}c^X^A;Q4Lmg;pOyh?{+27~<_oVwC'jEY5x."!ne c}2|"*v1_pd\9&bd:/=ynjFtEP-- PV(KcX^(DQD [XUy3:dO5 ),<1%v!{'v$zy/r.Edr'cJx#a\:iV&p[%$173 f7m(I]Q;cBi!Zg1|luE]%v~L#K~cgB \=47Fvn sLxP( tod_6iaYv1rJhY?S_\{d Y 1UmVoS.g:BC zh;NOq-.[3z4`?eR9y{mQ:o!+Idr30re4 |}Q}acy~-^. vCMiy.4I ;> 4MYKHk+Ta7)WWykmI e1; zKi:'z\`a&X xhcLlJDv"S/Nmd.y3 -,<pM-a a7p<(*.+L4r@X%!$G8eWHlq -_GT 9as.uDzn[\fS37,lF H@J=V/-F`"EFmZ8{!!4Mnf/dX #s%ncx@?zq_EGWrXd"wixrx?4se*/NNJ cz[q.imD4a!3k}Q, }r .I6&+  9GM7  (4C>?PXTprr|sqf^WMF0*#"!'=C6700,+'+7161   wr{ &+9IJ@LIEOFFB?;79-%! ,/(.8/4=;1:=9GD?FB4/1 ,?"0(   '!' $1-+,(%!&+1#'(   38.(+%+/&-27>F4#C./C<A@J@OeSJO@HWJIK<7HJGD;<EH>@A=<C:38==.1.2<+*!!$   +!$$ (9?4304<;?JP]\Y]`bdX]h\\[YXXegYYYUWPLKS]TOJ9:DOSSSKMMGNNJEB@</()&$%-0).,*3..$*0%     |y~rs|z~ys{ Ns^f5G 7--u.P<1 )6 * ' "-#(-#(*(./,  "# !$ &2(&#"%+$$&)/13(,'%765A69>433@:89@GEMD=35:=EJSB><2@<LWOJCLR=)3;<9:5/285-21.8>60-.&'$(.(*,$%0,%,!/18/+;43<?F>77291,2=FILJOBB@9<<<DFAC<=CA=BD;6BF4>B?ADOKJOOMGKEFKRSXadZQTOCBLWMFSDFWNOVVNNXWIVZWcYTYY]jjcq[gp\RIZ[TQS\Y\[djdhfUMMSaecaababhgf]bkhafhgnprnmjhb]ha[Z[[T\d^[YWMD>CPMFJDIFEMHF@LNLVNOKMSICEBA<AA=;;?=:;B@:3))'***32'.71203+"&!'/)+$''!     QX-l4>PC$/;*W=k^ss  8P %+jf5&$+0     <bh8y"(}/O'/!8&H ib)-?E(?P81 ]PlgV]P;oyh+MPEWm>3W/= {RWk@t!A=Zt@z" HpwC1y 1? )|jNxh*AP#}Yv Sm?xkSrXF1+](N'?\S=eumY) /k=ix>|qWc,G]E9w^j.$n _8jX#V&-RYIxOdT%ySb aI#&@"eP/^>owp4se[U8FUP0MD/kZEMHMn fr^ g!G% O\zN )\_1y/9 I2 x _F k  J a @ a a _ - < j $ @ # \ e  B  z \ l  q  O  E 0Vh n G hD?->f@{\uy/ix[ z u~  Ow!1 _c7o:`l $8Z?O @$N{b]cyl(ZOt))@;NR+R  xBjFW"sN$N AtE&zd <xW9/GOJ|rHDoh(VZY.(eyLL%$dAq@WY2BS,fRMl.*3,&dCWnl=i\N_234e#{eHQV}{Ni{BA;ve]U0$|*-, Te74o08GwPOUXhpmR5!C (P]Af~wXl;67]gGDQ'En@E<M /Pk/i6:m,^dA0{.~0_"LL$losX&X Se?x_&*%hK @ " UF! ;A:'+z7cI~Ye-OKq>y h2 t dNc7Ixk.aGR@WwteB 'j M`89~:s  ,A'.iQILFQ,\M^8 #6l!48  MZ(Yx5Y2zUG[xBmV } clO%bH g K 3;161@QyJ$zmysx   X /f /#Eitz%k; L?0A"> _]= r # /JM C + ny$o|50@V0P?#E]:B2@ H \*xmQAl]MOVlHR!w7ym8k(Qt*jhh vXYr+J g-zA#V1~<,?&C b'nWX-.b09 x  C#J# UB)Z4[5HYV 5/ OM) o 67}eBVo!2LW$!Lfez>[P1 q%aG# *'V}ht?0_<\<G6j3 8l 58}caq\A(N!] VB&0Uwh6j-:aeBMa[lA.V=y\D 4o5 3u2Y= &1_~E.Hi6]N 6xyTAjO[A%n f2*]sEz E6+QWO3b6~&/^W2a/] [0q!>n`W#ONP R@Yo? =q}jK HA6}J? "6[e{K"2k={'H Kcnv@[Fwh g\,| 2vL38&UTt&zYn:yPndb|gNqRz{R0*|Nc lt]cZZ87f(q#:qMlp_/cZ1RceOV ".#XE%wsQ9^/bEGIsdQ;=z>i53\2$vw).VoH UY/Z]iVa_QM@N9K%R}(lT)(C?g|S3YJ<1,xjmW&j u&Q"KNl4fC_uTTY/Ir~-r_ 0T-pUw6nrLw7|Q WYw; n{({ 'qYxoc j` DZ)>~OG~L`!Zy!_PFx\dGlH]-w>1|AZ4Z00T5GMf01C.M AP-}lQm:hw#$q? p`T|X6Lixa&t|\gK5r{ l[Ku4n%x h%;Qk#5N,r{BEeGb}RR>!qUkaZXPS^*-ba\/~|i&%C w;*l8'HK"7)~4{lXTsURqI N n+'aoA`y>5!*9q<-`h1OKAkQ2pP{-9hEp2 ({Sm jJ6z(G& V OeITp pF\4mD}@dj+u%_ ptXh9X,XaJ!vV2)e^G?44HMI@_u{I'w>Zj^>Yu}0`+ZGCx:x:Yj@w; gIi6nn, Pcr3LBN? DaZ@E(fX0(d)gk`Vx$''+N`W,,!_$Jr[@W9S_0+'B7y[$XXwtYfm9r&[r 0 ;]LVQPCtrc T|t"`.g8C}OM]U9*i=9ImI!pR:^!q9ZKGj|$ &A>p 2lHgTi9DUh6NSy_u1<VWm>;oQ=& Gn2pAb38_Oemk:rB7BYOIWS]Lh 5 ax)C w%oA84#;IytOqGUku/Z[|{~.BT 84-w %+|P; -PdFT{E. -^&w)RH!! 0!:so9.`H8}6 x  g9vG3l,,IvS0& 8B Ff,N!g4yQ Di"4X  %wJk(kgIK=&xygv0-T\<a]3"p*XFbUWT8\R/<7Et%hJI ^8x$^T-o*|1dm9v ZI [i-fg /J%3igMr2p0iUnFCIT77d4bp L}UZ'/<R58g69wRq+NM<"*dw_xAm%{".rY[[-m t _z0  :j|Z*Vk8e%)4-AP1t8 t?o*]4 &Zj~g+I7tkau]L]AnNP' K] ] ?w&"t*4w.&&yd| c.[nh,#MLBSF->H5 $PoR6oVrogj2"bV?sQ3,`6s^|4aJi[dr}A p9 r bWfkg]R,;DDh?l"5 VuE(!bf;j 4H^bf}+x#=0C';M-#*u0Qsmpv0A\Ok}9^ n KA P cX(|F rxx_#l=oD~ .4<'1}jAKswcbS?Jx (QvZ$+2''@lNAsF,6TA. lTob=CvF>glA2]uCPU ~n0?K:mZy% Ew~,n&tCw[Nitcq&ngs "xw N %Qe Ps nnz+kr.hv:9lgkS`1];NXQ73Lr'~ upZiBb&zZn( Vf&(EQm Y4DN+XPG:[1;Pc~n+"P{ kEU5(G<yY#O qw9/u6`zs./]-)Dg~Gf#quxefC! y`m!F$g/"{}XpIw'&5xcY |( "F (F(d$Re4Iv]Iz ShiksUx{R +Z4'-P$*nWW@ "+, F<xSv ,o%3ww<+5H1;@JVZZN;=ENWD!8o5#$0Vi&zpl^o#U CR"k2N%/2 ) `jgz-#Js&e 52,&O\~4, %Bnl)$Pan_"KQD6)T=s9|!Xtq|hd[1CvGU#G WM0T*3iqpB|hu$OgX,B;iOprqv|nm%h@X5e,TmF8 mEQ0f8fN5Mk*5m@4$hVa =M2k"g#]CInk% ^%xfv%ppe==/!#(SF{m[>5@q NsA{q F}P,)~6y 5;o'+ ,jo@3: L"E2)e2D-FL\C'>}gmz~@oqU O9\ KHU z.FEBqQ.,M $QZ Uu))A=^4i-pkYl@J99Gn[jit R /\=|q>)itzHe%YHi9,tcxyfLr ZjaL$|Z "-M`L]zf@D<Q3T{?-xglv)8(GC!LC(CayeA'a04pwKz@YA u<Md?iR2C!pol @ K(HiwPH(:l:a'M7=h|5usgSUcwV<}V>L|C~2xfI Hl]@6-?~tDF%]Y+JXBl ct..g-%9&##5G2S @83W6gw4cY ye!MWbXTbX+83Q6QyaXKg[,| _!pU~#\29aeKl/H=lzblu]Lr|NaUNr&i:y#3N|sA6 g'*a wQ8wU&/h<\fhhRCW[}8C!p('nN`bY0`izt}lJ KI<Gt{BS4ef2VrWXH7nSol8Kvm+<!h| E;X) ~Y sK+P-Qi yF# uMttK+X)upG5 F/k( FPC3UsJ]`xhs 4)?pr!'_tC)8rE%lvEkegU/B% jMbZA)CL8&, ^p9+5RZ8"?NAG16Rnh,=V7=>rpFi`kn`AaWw"6a@F+~ZGOygB@|r;)Yx7jI{a ~_$QAM~+.JG,(m-fWQK3`./f} AVP4$HR@|.v^/Liznw{taNG%0e]vDb7P`ttS }3?'a!g'^lB XB4+%QT=Sq"^;'K{qQjDHUF+VDZ;Z*%D;dEF~1'Nm|iSqhX QzZ7+pu|#U,Ot$[jviZhvsQ:~]hbyyg4kB1lrpVrt\BzkG p_+p--"Ko\l)h^8SwQ:$!a2ojfW& ^c.2 R{S, /.5QdUPR[R,$1<mmpmC#!rpyH;-WU *~`H$/AN+&Mb~J,3|$rXemx-I9BT~8-F[`\:4S<ui4=DZU,{o)11=3# :,<OcB0L9bWE{ CsM58xk&UQx|7@WsR8o6iCY2dOx.lonDz E\pzw."H@%n6PZA=(`#a\Jq3'z:JSHBa' "I4+kggZcv &4&a'([j}iZXg41x$W^~r&*6 2$g|/x3F+J$vM)yrE5-o>(_sC; 8 7E8u$2d|T8</!.l}UQrUpoj"d+XMHuklJ c[4J:8CVrGlq3JO,PK[JO6) m|'M`8K7p[=oq>8os:uAEZ !=Xpgh_|:y/c=w {=]UEjI wx,gvAJ  gRCt#^crWO0;5-db"2!.f2DDdB 4 B.q+Xk8O"G .r`f& s  T   ) Wb =<`z2\H'|mtVEwBxz\'<ECwcB[ fQxl|DH*!ubLG]S2v4P?:yee#P>{=\:H? mml&yARho%$#7653R*|rC/,HH_0BC\+oU7PY"9`l `nMT3E)d))z":FH(?a%$bbW{|.oo`;'K0cVyU9_I]L.w=Q4by3QLDkyKC#: mG+,EcL?Ykg>~)G)H8KWf_q\t5I f\]5:]"tq.l3.[+/SNKqq3 8o9n.=\c z CsHI ~nc-;Kshi> Wxi.<t[`bD,T6F xGx T.cD>s\&}T dY5%M4)C}TZGv{ b(j)RQ  Ux"@3s3+:K^9We~ SK@&9QmCIh;k {a!"Z/d2b,n< [#7wX=L(}WeafbA(s'_Wv+'LqY!'Dz.6A o\/6;Y=Q~'DmI a{5%0+Af.RH"Bw-5`p` ;&;C.<&A+AU]i<93`+HYj?i}'\5%PRm@DTKpupXN$c5P=f !  "<\qV);cFclT[-8Ta"mz# t7lPK&~0 0*0r{ytlB*_,,_JPb}CrK~MJ?_!Mtu*rRsb,#-v  :mZ\.TB`,%AzN`bo3DaGmBG? Hyk-}! ,n4Q,'[%m387Qi#ThaorOt6@q4'' \,#-U/(m=076Vvx<iy`Y(`|>c4LAK2+D|0(BzO j$Y/wXp07$qxr?%:k >cMX/@O:#glKzFc|J%B*]oW\kK\ z/y($ G0]z'R- "s`.0req{"(-wpXqK`%>6PI-`?nTx <P*n' uj&D [7nMuv R)pGLIl 6)3ERS+eIv : 6pvgq OZczU|eELajdF&j4?6(Xe ~ d(4Wx#pISv<^j|5KPlD3*1Kj0O)S@.3#\c=+%#$/ -M]5 . yb^k`asKV><^ARHYmB:|-_O$b}g&=6$`YjD^[VnW^y{oz& L @ ] & 9 })s;zZk;$sY" vB(M+h0zD$WM1'/{T@'___~jYH0:0/,7|rvjbg}j[U]TMsu`m{thrrts|vmx|wydRzSL_L>9K\V>$ ! d{bMXigL\rXUI9YG0ac/ (,!(EK83,5=YgXf  25=PWs %'FVpnv49BUw" 71-%.9Zhytp @79=?ERanopyy| )8O\X_gr $3JOPSQ`gxz +7?JW]QJZjguy&!,.GMMTMHN^[Zrwquywigorkr{|~rkpikn_aejjjgaXPR[VVXQTT_aWS?:<1>70/#*#&$!!    q}yxzbhj]^`QNSLPC?A;?=::;,"#  {uqztmrwpqzw{u`Zdt{uj\RPWhZLI639:1-,2&#*$%)&%"#          #"%#/+*$&,*62;E>HEEK9BAKWMOPYXUVgicq||yv{s{  %!"%%3%1.()+  "!"!"    !'#!(2,/17:;AEDIGDQ]_]`YPXgda[`ljsro_^ga`_mc[a_cgfrsmsvrpzxqqvtuy}{|szss{jnpv|yyx|mptmqjtzvvx|{pnls{ojuvvz{uzu|y{u|| %"!%!/.%($)+/*463+)+)-(/5?6;G?AA13>76;>C:<D>GI@78/&'$,/&)(()(/,,%"   |zvhgajoml^abY`c^TIJNYVB<?>DLDD>;>=DFDA?;80')'"  {~xvmfkkigmhimdUW\PF>70..2/% %)*4% wu~xy{qrmcc`[dhede[[[TXTHKG@PQVUPXZ[WVKIQTYXW^bcjeda]c]Wbmhbfopnlilnkkilpblyw~szrcpjlrosxwrszz{zt *0/-)14:B>?JOX`afksurmkt}{!")/.9</.>F@FFWTV^QPOKQRUTYihsz|x  !-427?LUIAKLR[]_env~~    %!!,44'3C?AC?;55<>9CCFDDG=:?>=92*+:@<<4($!vrh^^hiVUXZL?944*$&"&)  |{ohnlqnhpg\YXQDB>8>7(!'"vr{}wvtnzqZejckd\hqiagqfjjdgYVVZ`PIVSJSMLG=IHNQ>@?BGDEA>3,:0.::;;655%"')07&�/-&-C:4-2779GS>9@>AKJRKGE@S=BMEEDJCKE@C>DFEDFC5??:5.,--(!#*!# !'$*0.6'&2++&') #,8/*0(-')40()/6><;;>FCJBAC/:32EAIDDSVQTVSbcZTNRT]eggflsskfadd]dlqqptiqxhgnox{zzs}r{ytfr}{woljyreiqqvtsxztovthdZWS\bX_^``abUXfc^cicbd\XXZZ\fj^SRXSTTQZZY^WLIL[RI?6;//&''(1"#*+1/)(0481))),84891A:56+++-/07DKBBDHJ@BAGQKFMQVURQVIFTIDCCHOORQO[[VXXRYdYV^XPZWMQSLH?>K7+FCCFGRKFFMCEMECLG2;A??;@C?AF>49<6>?38@>>59><7$&/'-430-078,,)!"*$)&& %! ",/&+!#&!-$!3>><8282-/*7:5><7:@>425021&-643@@:47774+1*.*#-%()/*!&# (          #$$.-'%"#"# +**')-*3946?8,:>70257('66575<==;342/# " %$&"'&($                 $$!,.-47:?DDA:=;0.3@DPRKPURMPT]^^WehTgbVkcQesint~yhoqs}}|sozxjvmp{iwyqvvpsfmiqvvprs`cXW]SUTXVXYQOS[NVUK\TP[XYTV]XOVbOBFBBDGJK?>@CCC9)/06<;305,)+'$"$ )- *%&'$& "'$&       {||szzys|~{{zytoyoebcjjgopepqqy~{rz}}nqtquowzz~xx}{wwwzn}     !('%(&$#'#(.3>-/413/0 $"*1(!*))-%,+)(/5.02%)*&('"1)./1;<GJKEDBB@::9>JKLFEK@AKFCJGETZZUV\hcXeeea[`T_idl][off^]\X_^esjcqnmnqrqsfgrwz~rytpuqoptqwy|{yzx|z|{}yu|qr~zmgrjhc[RPSN[^[[UOFPRFC>/.*%-/53.48950+--%%(''%(         ")$/&.+-6*27$#.64,-1131//2(&&&037.4<335.*5/&'6:3332.2((* $$ &17/1)/<-( !)'!*!%    !         }{        !&*)!$               ##(%$!$$ ! ),-,5,-8654?0;J2>4*4:;494.5;9=EMRKJJGEB?:6@@;>8BI@?DIH5*24:@C??;@B9=@F;>HA@IS?DJCFEA;<3<D6BC@MJFGB>;<3/1>>4333.1)&,&#"$$-1.5-.,"42A@9CHJ@@?8+2:4AFOWVPBJ?:B??;8=E>AGNTLULYc[`SXWW_g]ORNQ[Y\TMYXONNIKJDMMQTS\`^[a`\XPV^`gfgg^fkkf[`beoqjjny~w|tvz~t~~z~w~z~}~qesz|x{~zvufgoq~wrojdntnqd[ecosh`beilnrfQNQRNKLJIIAITRA7GA=B;A76;6<FC?844372175/'",.)(-1934=6.'/53.-+01++$ 058=/6/#""$," )($! !&# "$*&#%$$$,% #$" #*"% (&"))/;6-+("$"()&            !! "2" !"" %("   ##!!"!% (!!&&!$#'&/7( # #%'."&*(),40+)'.4A=66<GINHABELOHLDCIB<:CMHGB@<6WF5>,7KFHHE>;@JPS]REFDOI?>HHTe\Z[WVYQKOOGDDKRPZVSPHKD@HMROMVMCAAHB@CAKGGH@DJJ::90*(:+(05874,41159/-1)-005/1A;EB?D9@4864F?>96BKNNWZKSRSZJWRJXWG:P3%l<]Vdep c##OKT.D"'MB!e@8F>6W^?UC3I8.K2N8<S+_G4MOQOQ2J[Kd_OP6CJBILN?M5?X3B?5;IIE=>N;AF?=276.4B@69.BA&8-"2727GJFAA=>G@<549)4B=7H@CW;7:2-3%!8126@HPJ;<9'#%!77/57866,++'(!&,*&). 0,*",+$',*-*$% '# )(.)')+ $        !                                /^8XP, 0 ;.GA&L)!1&=!-+7<D5C$ $"&6 " "&     04 '  "" (    "! %%""  &!   pocketsphinx-5prealpha/test/data/turtle.dic0000664000175000017500000001074512771605033016302 00000000000000a AH a(2) EY and AE N T and(2) AH N T are AA R are(2) ER around ER AW N around(2) ER AW N T backward B AE K W ER T backwards B AE K W ER D Z bye B AY centimeter S EH N T AH M IY T ER centimeters S EH N T AH M IY T ER Z chase CH EY S color K AH L ER color(2) K AO L ER degrees D IH G R IY Z display D IH S P L EY do D UW doing D UW IH NG eight EY T eighteen EY T IY N eighty EY T IY eleven AH L EH V AH N eleven(2) IY L EH V AH N exit EH G Z AH T exit(2) EH K S AH T explore IH K S P L AO R fifteen F IH F T IY N fifty F IH F T IY find F AY N T finish F IH N IH SH five F AY V forty F AO R T IY forward F AO R W ER T four F AO R fourteen F AO R T IY N go G OW grey G R EY guard G AA R T half HH AE F hall HH AO L hallway HH AO L W EY halt HH AO L T hello HH AH L OW hello(2) HH EH L OW home HH OW M hundred HH AH N ER T hundred(2) HH AH N D ER T hundred(3) HH AH N D R AH T kevin K EH V IH N lab L AE T left L EH F T listening L IH S AH N IH NG listening(2) L IH S N IH NG lost L AO S T meter M IY T ER meters M IY T ER Z minus M AY N AH S nine N AY N nineteen N AY N T IY N ninety N AY N T IY office AO F AH S one HH W AH N one(2) W AH N person P ER S AH N quarter K AO R T ER quarter(2) K W AO R T ER quarters K W AO R T ER Z quit K W IH T ready R EH D IY reid R IY T right R AY T roboman R AA B AH M AH N room R UW M rotate R OW T EY T say S EY sebastian S AH B AE S CH AH N seven S EH V AH N seventeen S EH V AH N T IY N seventy S EH V AH N IY seventy(2) S EH V AH N T IY six S IH K S sixteen S IH K S T IY N sixteen(2) S IH K S T IY N sixty S IH K S T IY stop S T AA T ten T EH N the DH AH the(2) DH AH the(3) DH IY then DH EH N thirteen TH ER T IY N thirty TH ER T IY three TH R IY to T AH to(2) T IH to(3) T UW tom T AA M turn T ER N twelve T W EH L V twenty T W EH N IY twenty(2) T W EH N T IY two T UW understand AH N D ER S T AE N T wander W AA N D ER what HH W AH T what(2) W AH T window W IH N D OW you Y UW pocketsphinx-5prealpha/test/data/turtle.lm.bin0000664000175000017500000300665112771605033016726 00000000000000Trie Language Model[.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*********************************************************************************************************************************************************************************************************************************************************************************************************************$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒo}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++::@G$jG$jHOHJ$jدMO8OدP$jQدSدTUVd/دW$j]^د_د`دaPZЫbدeدfدg$jЫhدjkدl;?8mO0q3 tدuدvPwxyPZ zد|د}د~ددŀ$jŁدŃ$jدń[F8ņدňدʼnOدŊ3دō$jœدŕدŖPZЫŗدŚ3(śدŠPZدšدŤدťدŦدŧ;?HŨدŪدū59@Ŭ$joŭدŮ$jPůدűدŲدųدŴدŵدŶPZ8ŷOźدžدſ$jЫO$j د[FxددPZPد$jد[F# # `\CM& wQ[I -P4jq 5 `\IM@0ä& RQ ƕN\jx+)05`\MM@&}.Sp rj`;H5`\SM@0nȩ& WU; $Q㖬jqMX5f(`WM@0ʫ& wV" ƥj mj57s([M@0n& W'Wۣ jqz5e_A`\_M@0& hX[YD 5*kq5IȚ`\dM@0& iYRĬ ƅjF9kx+5sSКJhM@0nմ& ׊Z{U H0IJfekq&\񶚀xoeWϑ 5"5`]M0q@&sb L1xo%Yp,`Y`0 0 ` L0y+&&MgLʴ f vMi`4t `RL0k޴&fo̚ fM\@&n9[ g< `L0k&5rx[ٗ\&`.`Y00 h48!tMs &5ϑ X2 `L0k&0^{Lʽ fM_s&f>0 `L0k&~ Lx[Mm 0`Y0 \`k)lZLR3B &\a&pd`hh3d; `$nL0 &JCƧ &\c ֑5Fjo+ `HL0k$`5AR3 od&20ޖDi0b쌷UH,{Ve_̀̚ fM i>4d `ljM0I6&5AWN&dg&3`Y0} `RyL0k<m5s(π fMg&3`Y0 `|L0k>`5MsϞ&X174+*s oVL0y+K&5xoi15cuu 2aandarearoundbackwardbackwardsbyecentimetercentimeterschasecolordegreesdisplaydodoingeighteighteeneightyelevenexitexplorefifteenfiftyfindfinishfivefortyforwardfourfourteengogreyguardhalfhallhallwayhalthellohomehundredkevinlableftlisteninglostmetermetersminusninenineteenninetyofficeonepersonquarterquartersquitreadyreidrightrobomanroomrotatesaysebastiansevenseventeenseventysixsixteensixtystoptenthethenthirteenthirtythreetotomturntwelvetwentytwounderstandwanderwhatwindowyoupocketsphinx-5prealpha/test/data/cards/0000775000175000017500000000000012771610005015442 500000000000000pocketsphinx-5prealpha/test/data/cards/002.wav0000664000175000017500000017246412771605033016425 00000000000000RIFF,WAVEfmt >}data4:R PM/-!kkCLu*3j&`9c Vplk/uq <X&9ltW&vr nw7!f;vGbN(L1 =; ;?9 -bo V |o&TZU?F=W:[77RKKdh=47GE =Jt\Wu;B*(@$\w/ZmcQD*)R>Zo~@/ea:~r-w@V{d9Md$:,ES%O]G aU_JdmSj7A>@u"a)w/ Z i#)=Z9<`~H*Q> ;E;2+&&)':M'p{T-ETo{qwgD7eh[602bb~(K {{iju KQFL "DoT4NQicSniQLK4! "$;W8 H~) 5 -D36E7K9 +(nqCC,2C/8>[y<')<HHkf8"&u/[wu`l,~i', 8|piDR$UV^nn^.4gPpaF7VnHuFu Ki@;N?Nzbwc;BpCE#K?ZNT73M0O*6 .Hm3s:0E~~ZYLh"!z{nlv\}{c}Ps7A1X*uF_@+)0@krZWZZoF~-123- ^B{TT`1T{wS 1!PPuAqnWFK5 o.Q2KrcV "4 uMDU @ -W VrtuToO` 6[95^Lp_"8j ?I,+9RI'}ZN@pIdlxAmxZp;E@&L~ln[>^eahGg ?,aS,aJsH@E;_4A3?~`Jv N4bE!N{!/(87Mql0Z>Wa `^!n8KCe2*R"fnl2~sSHtScS|om$Lrrj[|Z[5o:>W9Sfm '1"0F>Cx{x[W}pDuW #!0`qF]C $592K< y{p"JO"-H]u,q^4;*;}jOC\+ {=cE YN,C^4SF"(v*?B%8~:Z$&nbMmN$t<0OBQAi6o6brQdLmz}2P/'sSH^`uE,^{[^x 7aKfL|,3pm;]7'!F8QGCuabla:Q@^sSWC\J H?{=m8"m2j<~Dclv *QT!|Ln`0 x3<3ck3k6<.dMRYf ''P(1Q"5QVEDH583B7EO"va`VtC_l)B}.2M pNL&2q9gjB.$SLu\l_i5\pr +)!VDoc=Bm Y UFgdZ %aH}*vVkY*%++! v 9 ( L}l !U [g "  e H I `s  : % x b S  Jc 9 > qP g   N    %  W  <   s u O Y 5GV   G#  #m T Mc ) ~ l \U c + t 7 1 u l a  yl 6S r ~w 9 jtKsbY Ezyvh8JCXR9$X.D9(v)O:-b4vNhw => +^v`bg:4(x1yrY#=gUCPe) UVowGjc!^ {+27DTzzd}#rH mWJH9 T!I+ BPZF a}zb] L Az!o }j\ 1eve9#3&` +{K"@~= `^B" bhgD\eGQuU1:en>V6%1sOA y]o+RaaP.*NGy3G.jj;@oA42y z٧1ׯ~0&ZJ!Z;o^ GR;5% #% S ; wn !{-& 1%N,y+!#3+&+y398")+)W9,+-",)-b3 1_59{13x1.9T:^54.M5G3w,369U7B92.r%0i(Yy t @ 8d X >DvN>W|D m>Xr[86 6{D`OI:FwZ]T3Q6g@BlgWOx4{qnw8{ .dw) I\`9jy1u.G0 ;!4!eNwE=9,W2# ^: [R4))8\;P ` *EB iAkL VOq}9  D  n<(-  Q4U~f Z  "[C fY Y f2$I{ T AN? W ~ < ) 1 18h .4; HZ4 QF--4\sUK(.l{J)2~1231G^~B+!t FC.Jvs$kT9 %Lh^t a' ozbjpl?{vyl||.]Sqvd a  bP06 <ui0G4 pV1 I5} !< " 0T&}i D Fkn K *dL A [?[  OkD*8` ? b 1 + c>' Df[G lmSSA=V@=\bL} )4} G DP@+fvxs 4@m1Bmy-2@@vvO7 j Y@ w E il2%9a e1>   C  Zp:w;B[O >*~%p|%)ex gUl6 T'o /w 7fk/D!x6q&W v6/, x1CB4": %f|  &ChSjHW2qbi e~ (hW y=ku|pU[&W-no3$Y.}7oU7I:kLzazFq]A;0 d^ V i W<E@s,F` W#jb--RvOR's`wcb`U{N~97qIC^svClJgOq#vtYX5Oa nAVfa}Hf C 6c [  # N _P K #Kb2>zz3?GLbG_H?!/91/~=Mc X T  K a 8:M.3!K JBC <ٹЪjeՍخvzy_6-Pv)t9_E.u/~ۘ&9W -   O[RUnrp_!z &= ^U%!lzؘ&eMQݘu1]YdNF ' <(#^. !!" $$f$$! پ 5d]:pFkh?#$1$$&i%="@ g #xNf_w ^  <3CxٷHײԬգڴ&`aQ" L te 208.)[   !!N#$$$#"  f \ϣ˫6#5<&` $##%@&$!]L tf[&imeDgC7(2/ .r߱{0׎דؠۡ|& d_3 q [1 r bEE"$W&(N''('$r V#5غs8אp {Q#P%%'*(%m /57W}B?T Q ,W=fܥԓY ݾewxB;p 4EC  1 UI|)"#G%.&&4&%%_#i fN9u^3 Rʚy8OH!#B$,&G((% [1 ^')h'R8ktPuv F*ۧپ;׀ٌ|ߐR ^ hRY7 'O#!#'s),))c,*('%Fmt{rΫkkmh@ $)/0-($!Z GrHQ./+cK`020+/#Rn RDw4Uz}G5Хϰx.Z& j "(i'(*($6 &N(޵ޜ"+ڦےOCRT n k>]lgdd e ]!A"a#%'R)):,/256:75?2W/*!_[} פi$׫?5"*064-+ ,(G#G  OnJhMˋœdŽncԳ 1!'*.1.&s{q!=I:#Kc B  >x<Ye' 3&#'T,/3"6[9<>?=8`4-'. Ю^Ê%]A%-15e8%6/+++](! F&0fx*$uďZkxjIF#+/.l)!$1 ' 4j=77N1ϡӭړ}/ V  D iX_LpZ3F v3$(7-001v33446|753j0//+;'T ?}xȘ|ibzؖ ])-./1;0*L#6| 5KUϧerĔ̌~_Y1t#&(%.$q"  "edέӐA\+K`G]|N-bV$ :Q$ $~')++,,,+-~/14 79?:@963-# (lߴ4 p5י>I"%##&*=,*(%#"" Mgč¢Õʬыp N'xhlv vANS3/P\fW Whz_!tM߇ݸܲh j<j !o"D"y#N&*059=b==;%72,c&-VtlRsM_WW""())*,//,(0"%$b+0`ǀ+;X9 ""]  x,{P0̀["G.$'diP,}1VA{6*_: #%c)-80\366/7q763=0*B%l F۫'!RAȞѡ܇4`9 }&O*N)/&k$%(*+)~#KL2@˿gϑN9_> 9`} 6 [,Cܭ gB˫x9\ AO)mx]1_R ,@#h'X+-x/12:33222"2|1F.)/& ) _\ϼXu e p#h#S#%(,00x,$ rx޻AZʶXֆޢ8]G "%;&$!CPD1ӈ} k6 6 4 pO+(jqPq@L=$'|))*L+1,-w.k0224e6X7<61+# Kb΋ƹµȣ?ݭL H %3)B++,-3-\*#\֧׫ߪ4]b ` $%""~P(5 fMLLA+Z]A~ mfgX* BB!#'K($)*+;.1%47J99]6 1*m$ pWI7CZ c!?&(u*e+m,,+%)q#Aa#K{Ӓ՘؈$|[ * #%$!E, ZZ1ߙnqەܕ36x;dJT5XZ ; V#%&(+'/25:9;;59?4M-%.IxfnYTY}Tr+ *t!$&()+g,J+|'p"5Bv7Z۳CX^[@5vB"% &# V%`ݠפׂד&y9$=2WE~<@m)  * !!&*/269;;:=7'2*$^w߀*߻@ePMH?z ;#'H+.0)1s/*$2j .խFۛ%Fu2Q$&%:"?8 p Q J0ԋ2ݍ5ZxfTv7VxB dt 'x.48;-=<:7%4/+((n#iZ JJi&=ӾR;&^' @")Y0s6:v<93*` ݰTiԯ`B%,2 !F%%#D P ) z/#б^D(Dm[B)($V7@ dC &,034431///V.s-M+& 7 v9aB M!*1576E1D)?`Z#&=wѥ3܄*H S(1< ~܃؅J$^LkPce5rXpNuo c>!s$,&~&&'(p*-+123*2N/w,{)X&J!$9ڌ"yyiG E{%*t.&11I/(]3XtlK׬y \tc< O b܁~&\d(&oZ# mx-LF|D | Ok!,#%')h, .%..D- +b)<(,&"^rw ~/ȖŋKٽ.)f V"'Y+--b)U! T3V jYڃrx DR Z 2 $  Xy6B $14PzAT@ J -IC<,u&b>g _-?u!>#"%N&'e''(E)))(&%]#h@ә-.X!߰y\~,T% h!U T '5  `|+t ]Wfl9C)# wCTl |7'7l\x}u*OYYl ,"$#D e !#c%% `6nAY+ O   G <m#TkeTo*_y%XWY'pw"[CkPz9EB E|__] > K + e^@EKK(3 !!+G=LF Ta ' * mHR)+&^VS+$jUS#QIGx2@z0oJftB  }Kw s&-V]\$ wy%3']vSrdM/d[OCHQ B>L#G6-7qhvUk }>+0huV!~F329YK  > !dww" v6`*A WrQ]9RvbqItk >!;l00$*rqe:uD/ld0.N.kk\O n,5lQ,g090  P ' O 1U = d YJ)wE)Wm"08DtzWPFvIUbKuxm4cA3M]-j^c/[H<]x@3] ]   6 B j 4E0GYZzS*(`s3KXcnjjSC~pY&=dFGkN l"@"C./Af\k(e ^t/U{pQSp<qp]0f$ylc?juCtVQ Yvsx uvXRC5T<4"!F/NPj)1M$X4{}qOZ/>[VxAp2%'ZJ\EV<|c?{r&2 /' MkP&Mb7R*D1Bt0i#[_&4?c]U||rDb- 9Kx2~X'Xs,\mn`VA 2+ DF+R" Fz ^ID=qC/#  <7zQ!1,na:I!$Vfx+1$C]SQaX _ P![<dsTlw"cbqCI4Q>S6`h=YarZ)E0 3h9# ^N-K&1d0D#"T9&>&=cyfB.(iL #9.6&2XA7/M-?x)'-.; }m{$pp+0O+j~ ? Mf96!*E q-\!%QEP2Ye7A.#11 &p^6IXC4,K6poW_rx7 A]K6ZGab{fV@sE]xM$`=>T${hABB)a9 vkKDSdikVy{xuO]hmrUzYX%`Rl^+a|USzNZ{?>/?291&7#;C%;P(:=,[I*S|JL_sad~=g[6-o8 F599)-9N:<21#)!tf t] ?[]zhew:7O,G!) `X,A84% '8$AYcViUXKW`*5.'='mj$NsunO6ltH[QF<>2*9@UdMS_JON`GEN($A-   8 )G6TOA[p)-1]JKZm_A')'#=#PV=V8C!75%F!#$XNAdQc^^\5QB;KA[^]W"Q- <0 D4"%  6?( & w: '51), ~      *#  % ? :@,3' <* "K7 2  #$S 01'+G#.8+X!0|F 29:&&OUN'bD9P/"rIbF0)MsmLVJ[c#;7<M+2V93 J3D+&<,<GiQN~ZeR_^Loz|xP`ETtlRpwae\}aLsWUphdglkD$[^OSH2phD*R2Tub, I 5trc(#G z\? j *.XxC(2 ro_"=Q0S*E~4cZ(T?ZaN^Dg6u^".w fLTa:9+%i5_I:-JH^U2|yObU[3T;\C=d*cxaSD /`O/x yoYH0 D DG\g.D@j  *-qpcK7PPy'< sC"Dj 61cDZ DSU19Oz 0 4NS^Q{ _ 1 [ /(r< *A  0  N \ c   N? v C u p  < 1CVV J _ r #>=F-N8: H > v  $zVf~)F ~_nO t<e'`b.Wa Oi',}dmH"p?vXTLXM;>X$!`D,267hO.%g4_Gx@Yt= o7t`c4?#LP 6() ;za-72Er*5@!7;0hh6j[` 4I\9TO*Iio jV+b?7FfLBR T>{s}D7zRbI1"ck N . m { p>|e @plLE0ZBWo#VE 26:mA;Y^aLU@#\S0FE[!3f  l WEe Eb!$'*,,-//q(rNc?"Rp}ې %0F'2 V $$e3CRdaH4c&5yZ+-q#s*.^MsCbV Z Q2{!$s&=(M)*++*l)7$ysߦ-EVYX  OP a F@oF10Qa@uE J C0g<;m_yD;Vg &U8E >_ 8!f"$%'((*6-.$-;' f1Sxxޛw:EE A Fy9Sa/C  #Clf i0:B7C5 "79 B mS`Lx@ޅH0rL() k9hK- ""$&'&%=&'p)+T)#!zp# 3&}C+ڢ*$ *= <O )g  ' }q\%Q_b+.!m8)@>/A 5 L x O^zl'ݿY FC}s%{5Hlx  !$m$ #P"#`(+,-j-+*& "!l'9Bs,ѩk_(R %> u c XU HIpW -!OIRRzm(C ]5*X-/} lpI7My Qa4 #9$%`()*,+;%#,3+ 3"lNd6 3k;  v&&Im u?K} 3 y-3iC# :IM=(xX8w[ ;cqCLncYks= EA|N  t!""X#(+0+B,//V+'8(>"5%&~RLe;؎+hi vH<Tb#Z*!=zF6Ho:Ru}M`Db-SD@ 7nBC!+{K߳R@~Z~i !pVk  ( z&'# j&!# g 'W >)feX\,6 e { 2}O -d4D f<? J N 6RluW+t: >@Zl bM  GT+a6",(L)% !L&&+#O3w$ ] %KfwYg+ם!Acq- R0"rq_ +>j;?ex7ka^  c . ~)  bl o*6Z9}6jwp}eY) @M<![#&(++&\$%&&" S6kO,Ǣ % bٌ |< s rlJ;LT 2 ,l yD 57&g%'"K"dN,`$(Km?  i$),D*%x&+)|"e *qܲǰ:^ \@ .Q s 2 2 yZq,))]D >X'u#{r: A+u6$qgds\j5* O$ #=%4%%;''$!D S 9LB,m7kq<}AVroZdc%T k qAG.v ~ G_.2 tHeB@F(PCr55>/CY8 q2l=q*P^se)[Td6y;ys.qGFF s r T!;M]\O uIUlU$O$^K2+Q{Xj?x.m]k .*d,kjor1U_u\eyj`  Sv^N  Y CRW?V![n V[ iUB)BBcf"D4   -J|l8=$ar[]g~u n<Q[nmR^ H %_9 Li -k^7wtPz I8r !9Enr7gJ";$ZGLV.f2LP .F]4o'pL?j` d_2 2g H^8Di.@"f7au_!KWs^pF?zVUe_bBjNA'`#/%aJ2|{y:v [jG6 U u !!d r!"#K!vLpEraBx~g'U&Mx;^z nEH^dNv:V%5xlwt0poM$ZYc}tfona4A G<_ | 0P%kv S8[D.o{4y7AC;4N|E1Yx ]P&f(_+")R*** ,)&E$ \9r]Wpњլ;e9knl'  7G+8}vgO T EB '  Ga5/f'+Yl$U>(%,^'o|߼ތZ9v o$M"U` M\2fv!s%)&,~-^-+(.%"#d$!Pb^tLa7W6?`  Q&[.&y r FgNT1eZ^)YrwH)=T(~[! =MGyn -Z zvTW !#%b()+++)!(&%{# HmۿAfeR.  lL KC|P8dL2;~q+7BU IQ%\ ~@ 3cB+pe N _ L  gpK< moD&6..7y77j@1GG X5:!P|b_hY3xJyOF(d,JI(mq t;S&&)e< [~O=Q$,JvLxbeSL  ^Z!^j%} eFF39Oez6ECuY6&pNC/mvVs)}`+QZThK6 "W k&* zE-]r%{t;%W-%z1v3-c;hu`1 YV'z|;fdUKuePJL]}S$J  M@._O9 C2`UhuEVU2\OYlO~(WrD>(d2MN-o F<WGoP5chV4Q < 0OGD +k4^ qt}T}Se112V"Cf`1d jXx"Z%GnAEH [e>T~.S}aTknlwq g?psm; 3ehK 3T(OE` I(xF< |! g) ;dW, [LqFu e9K3beNXAeNP)w1YPKaR*_@~2m`qrH/D#|6MTe-G> U7-@h Z/|r%kl{0G4BU?kH}J5%$rNEnIrby<>`yQpM4>:2-( N*-^l(%ajnfM$TLQ{l Id^O[anL.~}>#u"goG|= !p\`=f1W >'fwc\=. S:@+ O[d?TR`K /B.Mc]hp%AS%`h~&Q^ACyL f *:+IG4 B\Ke'[sv35nG?JI}Hb11rjb>tEg UZU$8%ee*e)tDZ!?z3y/]K=WoDqv7*A!. z#i2t^<{!4nSQeN-Y) -kcTazBFHMF P=DjVPAwSJg h(QKL o"< QuW%Zv=_2Frv49br& Oj"q{Tj hbI"<T|~L>1#_<p,eN@,i!Uc?` %AWN I*0 sIR7)fjF:Q-4fm|.Ndd6`_FSLSND$_A?_9(N t_D[A2^2*Y'\kb"?:v[2hJXK\GX,; xB*O  l.< 'N;7Z?&RQ_6  xv&o n'Ja5t6k2l~2,JW@ 63GiIs(En.-!tq<I7_ Qj% M D  w`}a-z I t5M# " 9D ]iH  d%1MsxM B~ e7l}1Z kkj`1NZt$Kx?! c h] y H2G9xo"IbzK-e9t-RbgnR3$F-} \d)&vm D9[ R PB ; [ ] w4F=VhVF %}Nu1+^iqY u3Q{uN G5E$jE#CFdm^C$_q{j .3W* !  =   6dW^ W@qw_h~M\;%VD/->&1 Fv+co4N%6U{Kr9^TmwF_ 9"1sFw1 x  $uo ps8'I98'Ev 9 ;G  x p< G7Y<E|o/8=D O  eh 4';pfy=dF $PHBX@i9>Yps(H7i\*  sC@2j  =!b![ o_l.ּ@ޘ9]Z< [;3  j  $^GI= 6LmQ  ; i Bn P - h?6Cfq4cwj{ |.p=\CcS\ "I$k&'''&# yx 8p/ٟױKDؙ7oE %{K:v  { [ o3z/J/4?A[ A  &mG@bYVCBGM?%RR9jv0^l/ OCz|x h qUblB!#&(*3+*C*(s$4Oa~q̦ؖϧͿѓD 2y@p7q5R) C~l?mx@k6(NZ$ x%Y /as"V$'*)*),+6)$y#\ WܚưC@ Y @E"E,' }3ݣݱB  G8 vs9.Rj(Hc \u q0j$vc!L(&(PXs=L m"Pc[>Ww%e)h+,-,)&!f P&ԦQB6%'% {  MkRPכӣp޸( E!"C ex2 b-A2 Q% N0z^d \=39FMBz <$e[ !f[VJ! ;M!"@$%&$  aiӅĻڤ  X&"x# &Y`ܹ5ޢn ;`Sp 2X5:n:I}1 xUH pJj$'g=9zRw1QV].y&d  p b (N> ;"S#">#$" ~ 'RXĶ)  pu$el&k&@ 11J٥q ~bD3i,^  +]O}# qIB # _r7\@,(c*u _)\k` %VRN @?~u*\\ C VZ!")(X%%"m  ܳҼÍ$ +#}!#V1| 1^vկ->dt.&ueb: s m C R"ޔT ~3! N G $  @,BHzUTI[uLEvt`@tX s . y Q#:Q ##$$#"]=\k̪L9֐-Ś 8 !D =F_65:D҃(M>V,@V^B I+b H3ZY B  Evx" f,H<8 O|A0>]p2Wg,z=s } #z s 6Rvae;x lv  {S7zabO 0Y6 VF+0k 'T4Y GqyDd@: { @ M 2 %}3]6FC-P!zن`cM K _ u ,O  KZ&-2k2/K& MF -l4 #b\LT : + 4 {K<,-cT~oK7 }{Cqd ARI 3    A B d ln`q=8n9&s6Yy Nqih YgR/ AdtUjzcr+.  s j Pm*c#+iWu[ u~=}>QL&E/|f3sN*NuT g:,g2u8ah r 1 ] Z ?   6nArD#l N4_t~i~~LIS-Dw;[tajxstR^^g0qb.r9396!M)P 6|SR~W@LAh3WEZaWB  V_$O!D-J9@R{7SWg UYt)Oa A+xZ&\{RJ!Y1&v2#(fYA/;F8g]R8=Ec#TCWFSO`qSo k\B:]ZU+"mq*  cC0VS_Y$] e'm#><$2}WbLc|Hg$O~!=5BJ#G N C4N(]#`t3|2Hd3i &BxPd X.6*4G%43#As=  L RZ~7aqU6@zKA|d%/K E)l,85#v6T=16i( DYA^9WxY:[$D%`eJ M Z<|OSO{obmAJ]7BHP14`]f)?`[*7 JCZy#1?6#qobZ5A2[Y{N? nhVCX'b#=<9T\h#3&w#&Cu2<c1r% HC9<* *i#rV)-g~@HU.r*peQ2V&mb,3Om(D>JkW ,Xo7vVp*^nI%NRuS\H'$UIWb,RuI~=D@0@E})fA @`S^0s8kB6Rp5[,yFg'{oC* ep[#SdQ fw<Y=9GrduI kQ' FL!-NPiCeA )G<$,43 zhaiV5RBew.PPovjP^S3&K#O1)AGd!$|8+xO#5[4H*PN1m B& ~JN=UiDl8 " csDCU &{b+Ok X Vew m? H+SNAc_Rt  J V{y- gqU ^ ld RPc   M V =C{ J m7CdW {\mF=Oh H W  4o m}6:8!v Gjn0xOo jo~A$1 wfb zS g2=&!^ Ho =) V}K  ]F{0 cs` ;Jm  \Y?b L7Y- x%,- =%H-d )yGI;n %*#v y i n <~ o5p m B2 +# >o>q Vp,&q Bb(P% { y# z W=Q cS \ f(9Q 4qIj ( Z Xy"+[uh Y RERo2\"0"[Dy l~! .+ 6]i v 7F@/'t8 faiSHI:Ajdj6?F V D N7k Fa Xb:I p9.{2 C T)* -WG39 M %  8M3  } _} Ek Y2=R$=[ eC~5 ,nrs .HR<[nGy P$ C {"j{U0o)bNi K 2lZjM &) IFMkl>9kidHkih^GEx<6  [Nf_A2 'Y oL6T@y  |G ? UcW4 CX!1 jST c _=%o wOMks- {v[9V= Or J` %e\ E4 .F?AGry"5bWtG \8ir. q: Ym ]x]Q9  [Ck!=\'xFsr2CQ &[ s:e3,sN/'JQ,8 bh rwqpl*Y= ZR,6-E}D}Z/{/HCML@ }? < < Jt'q3I<T8 19E^)Ceb# t=+  i  "MX6ia o0WV]  FY UD (<A) |j Sf,k 3TiY+ yhgolSV:D' Py,]E c.DD< N g "g|o`  1$u C6E\ ZZ!0Ezc' 5@r y55o[V X**,;p6]$G2P##`'4I+VOCs;*h?%v5s9\s   9'<XiTzF;?yjAr'}Fa G!HAbjIvVG q4VRJC 0 n CUY <n!C4U,8I<w~yhk]Tkl*WPSB0Tc5\ F *JG$l64XJ*jGY*Lifn<e$F%UP]qa^~Iv{n<_C9m6}g(.dL)U^CulQ_;> W%4n9CR$3 lrFyvF$?g||*FP-j 4|cnUj{%OGsgHF#MSX>?/k#~;f-L9 XR{va* )cHFYn i0.0L$v}_nPSd-d[%"Z ;:, E{J5 0R4&`j,h{NgDYRU2 2 Rtj.=s~^<IZ-t&Kx>T0.a(1WOW!K4*[CaUpx"r?G?TD  q[:z}g?vuE83gSJAb5'K!QX}^WBG@3G]q)L,pJ|;F)p-GBzVmJ1hFH$bk.m40<o`FpDRH.[I/A-:g@U~y/ mx)LD ^H`%o;IDg:$X)yID=&(Bl>AlH.  ?99Bp<+An ,GG 6U YKe2()#f-K~=b$#J9cF$%)#+  :V+Srs(O$`Q^GxHy|]2Zy1iO{Va!^,,+i?ZZyC~6Rysk~TjPv}su:rrLCyaW\x]~J4.zaK}^]_btdvXdXSjy3I3urh\Avq1#^] $ :.^R%,p o_cJu6W1$E5BhQ*W7+~aG0 U -04AEPphRGI?Y6+@W!\94 2SX*-~nPF\08L^/'+6<HbiJa *://_,M/**>)4A(*#9 14FG/!''  u |A !).#& gDu~e3fvs{y~Lnd @4R-A=}keiuhfyl1=].cw6?X]dK}|O9~pFmt2Mu30?6vw,If$M0AZdA` \_P~S9pH_q2|ukYitasPvJ}5|m8VpV>Ybr5J4CJZua_}Xt}jn,j.ZieFq_+j{B-ns2i^;qq|cD}2\cn{/KS3a}UsyPj7x=Oz=SLsV|sXfUq\8gQdB:[lrww6F,WE.d34P\datWjpx{?Xv'%MF2[UrMS (=9UPj^MXTjqojaReL_|1#^X>H\s\ox|rr\hdg~QiRNlRE9\7&JL@dF NX??WnJR0<'5@Y`34-.PT<81T9FD`(El%eD"^&#J%*_.A '#98x09Seu5,\R{3C7y^Gpz>(n8mqAwb^X[MWKh*+b0b4R<NVN zu# G{E _E?&t02_mpN\&!Fll4}dW G+>Q5o['d%j`0.k~h,i!`PrUv3]]6X D4? C9;xkdY, TX ~(&1X]{@*D|<%$bk,$Oa6c4 hu#;C|w6Tm6=iAvRKyh# 9`?W"}Wp#" (H'>"NUyBY >#IC::`<')HY L E UV;J.~u {YF32,N q64 /e~i=0\YAJ,NP1%*,ZY<~I]`(u\7R@qUm(Gq~;R^l|.366Ok?48wqCn T}r_.vLK/~&Ne+([{cJSRp+mm6-`h4@\;#.M1)p;-Y ew.9Al}S1Q/] >)tJU!? Gr-W[|*5d'vAS9.. W*jaA]8]'boQ}-O>KK_Y /J6W @V 9m.tuQ6^'(gcYbXjeAD7^$;{ XbcXv, Qz"`[}&n6{0l5UbyOyk]X\A5JIn\F; H{L([jtwCM]U][%*` 8-}K=gGj 9+Q5s8 HsF<I|w'P P([-cGsL `vVY7$$Y$|,KTpfcZs i`b>k1 A#]W}^F 4kKy7V'r3" H32F9qw3*zfl"$|L dq_``:gTQvuj7n!F7{Z$RL>^y B?ldG~J?A J2y)kLj/WrJP#'Zd?fK<Px`0b.arl[pD`;]rpli4q: o-d''b/ST s{b|!a-sq9ia9Bn(!QW9T\[4nBFIOD.FF6D.M:z]=0$&3R%+Np'Q1D7p2AIA9U|8FKGbY L)N>6ENi|4IH<0I3&9<]#Y4SN(R^ak ?8w9"&Fu` ?F#8\[#C `.:>2>{1Fr><R0BN&(D, #h2&r@xa02!Nu4,_I4a< $C=i,5 .Q MJ) & 4RdR9 `w61'Pt. &= M{ 5D8$K/!]7a?ou 5#   U& ,<;jM 'f(} vw  ~ 1 q*$">{8 *D' $-z# !) pocketsphinx-5prealpha/test/data/cards/cards.fileids0000664000175000017500000000002412771605033020020 00000000000000001 002 003 004 005 pocketsphinx-5prealpha/test/data/cards/003.wav0000664000175000017500000014016212771605033016414 00000000000000RIFFjWAVEfmt >}dataF~oz{yvzsx_`tYhXGv|YwfndO``dpngobdhzpm_U_RgHQ[\cQ]=-2%G . 4 &%/*)3 gc2C8I7@*6GJ;(>(#%TDA:;";Q3-CPF5F=9*7',=>;JF@I?i\h{RWTxRMvibpgqme^`tr]er`xjr{|y|  &#  1%/0$- 7* PM4QE<QRF;D*.'F5:E=LaNUaRUb[BZbGbm__|mtodtad|p}nl^jt^rx_hjra`g^szryyuhcskhdrbQjVu}sxjm}oizjevvqvy[vcsp_Vogetjgv`jZUBEw]QxCdlQ\/?HHWELXUwsOQ\myhG7.*6BK3=W62.>=;: )4^M9C.9)'$*-10% (4 "(   ~|l~y|    &&2@P49=G(>?K3'/J2+1/7DK/$KKN0K\XyPTJ965;/TE2<?:<OOHFSljiP.RQ=!%B<4/@`uO2``Nimff|hi{xo}gUR7MiZK^bZwwRXZprn`{wpr}xvN^^fi\nzmopb%_r|}{{kl{|xQ{wgsjrnufry$ uwyqq^lxmhLhx`sYkjImqrt1yjqascf8-2m}nyD"syCEK?:`P 4h|jP[  H86qvtQ1nQC-L|P:dss~(%mA-1AVe2s%%XTJq \x,C Wgov8 Tz?'izbGz7*d?-(*^~"69.}3x7p3C8Sp1snE=(B33!{GA\1z*Bw6 d>P E(H.zBKW Pl|S^(Z4{L_4Rbp |Ph.Am\E$%3d -- 6?.C0cJsM)pN # m/a c*1OW )d2@bjo@~ 3c]{# & MF%d~- >n i~> } Z-6.Nt| {0!}P$+5m.# oR{Ya0  g3!f>/%.>A *BqU|w5Msf  'd i.4W l .w|- c<ts*mL3 Gm' ZsZ) !5?we<" . KHy+ HAy= B mul$:*%|Ajaa1|^C`Y _-$iv (=?4F H$. ;e O ?a J\kX_.o +{= ^> m0 ! ajM k @1_q- oMcC!  dn \5 9  'stL6/k{#G($! \l OD G6 66 w1 p\3 m  ^@zR T| P7 pv d{A y2:$Ata$H>(@@)j 8B u!'L! w P11! d[l.s.q Lo5s)%u qX DU ~Hd6 * ZqTQR&^&,L!VK [o daHp(> sC I8LiRMA*ݼBޢ ;2f+Ԙ5W 3%*#ڵi YTEU ^5.nt0r j]-&Cw e-yY  OWn%N#jY$jj"$R~cO]-& mjb Lޏn*(S"!4GO h&z 6 WW bq?*B>݈ ""1,}Qv3w"6[߶xHTE0!pmb79=@ <'-% ^D )H5)$2x:Q8F!*K11-$&p[KEzD +Igm  Q'*X b>9"%S&z8^! {oNn*;[=\, /E' bVZR Bߍ#w/ Ev$ ? yQ  F&" tY;Xx{W .   5&;!Gy#aW-lU&8K c <ԁ @#3 5?3JA]~E9D*tJB'C?!8Q7 YI &l ۇM;"p>Z*,rj3.t%h3 *Ur6a+rѩu-ovO$Z53VI Mj_i{ 8_.!ܵBD''w $2$>|ٗ}5٧ <2ghJ PHP{ `58"h Y*W.r+X+ !^)\'G)( c $U  % 4)~$t"Un-c14mY&(Uf(T$S /36!3C9aK!HK(k{q!0p AE!Wy>|!~ Q wZ'%6<9v/Y#93('# iЯ"' .$0"|\)6βyBim=)3]o\+(0Z#.(X^(P =f&  x6-1GC+Rݿ8b)/; 1$$iw8۵C)^DP'Y"# ՙ_Pړ1X%Ku;J7^8o&4I B,9kp6v 0ןP'_o1 0% Ъ" 'nnWT7'y -){Kc#] pq1Oa.Eĵ .'e`Eg"YgG lo . MP |FJ6Jm c+ <p͵IrXqs xQEnMF]٥! #|Z+i*:}" j#N,@ GK6W 9#'uJ=)jE-DIؘP#l2߂g0 pݫ1 y/wע6\->%<##T B4(3%'*G׮,#XG,v#mf`| a C `!jAZ D veV3| {8*J F  MLq7<$ N^C ) wo#-= L ) nj[ |tpSap* o _^$=6X JQ 3 'm]>fy@BJo~C6$ D ] C h@ak bHE$e  ,cQMC1HB {F# >| k\\USO?VxdI jxZp:/5N#G `yPDLwQ?8 !@\]G1X?Hq~q:{8*[j&67%MS 9D"x S ]jwc |/Zd=. t8F":SlRkjP>U wl)[ \_  H {:[8p!  bE0yK^W]   H+M ?+HD8G%_ZF}]!^Bw/;5s=t$WO'5a 3GF&   j*fz $#)1Z0.W1o,̙u{ٵU 5O~43l3HR 7.  T4 sFe?foYD?K$UX!N QgP :k!%)+,>./.Y.-+(7/̽/ߙ\P!''%}k ? 8E4K%U*( J j uw 4 O=K $ "GyX~LZvJ9ZW8K0:pJ[/f[^)4er"_ 6I3_q 9##v$a'~+,~.0../,r X(to"/%[%(!S  ! V%c[[.&MK fi s0[3 ~ >lmb(MB'iO(qY$~e@o:w o| g}p~oHs +t"%% ) -++/--g1q"hn 3Ffb*3.%$#)j$ nh xuޢ|b  ><T~qf0<#Tzq9 j*sqqu@6R\/^H~OF d y *Finji #$%'H* +Y,.,*.`.>+T1Bs߿ߊ>_ '$i"t'$.)  jBwCI"f9 O VTew 'DWm3Z]; * V~e=OvO|pmI1<, AtI6z   2{</\ 3!!]!#&'(b+-0-݆sI553dB! $"!s52%97 = of PZx7N<9viVtaNkiG<5AR '$usua&%#7p b e seH: Vb #%)N,!1]LNRi{az;Rxkb  Aq !]H]f7I/34az-_ MX|;.mOzviO@PdQ(:&7]On;sxT"K_Y},*Et#R;\79]3 ^5@yu-$n'y 7EO^2GW6m3k[ [F 1 _vwC& B@ 1Y+w*upBV1M%1LX1$RMkvz&PDZf (*/w^tc6n)#WzG5= ? 2jPl BhM  ) / -86j Q{WAq 1 " ; ]nujvR^E:H@8 [>6c5:(t] dEF*Vg/ ARx(2jbB[.9c8W$;HIA6S,MD@~,:z% (  A UIq )P'C3R&zTH5Hw -8%[2xN;lID _U$-i S@hCE[:,L M0`qzXN&|JGS c>NU* m 8 4 L CecvVGCgJA"&NmHTK ?7S ZL]\)- ZFmt A"uWSDK!`,IC{o+7[W ; A  \ hvN{{ I#& #PiE,rM[awKH@ _ pa' ]v$Bk77\$hDe2!,)Cy+o/C}n2^,Xi : 2 efD1gz "%L*-*@рssl "g I2G7I$z} K .46l;4Q,; [87&GFOUD *H~:2:, ` }.Wc=!#"#%L((O(\)c,//$RβԼ݃O<L^B 2(|&) ayr4s02}JE P  ^ #{ye;7Z%y^wVTjkHp51jr>-EiqSAE?b t A5q! %&')W*,01Y0B144.># q+ Ƥ%ɖҚ_M'C#%-,(Z,(Dv(i߆ߐf1 =@ 7y thWX`=C{%QAj>nߗz ނ.(v^Sp2 ): a7"%(s*-+/N01344534.i$GkddΧ\k 8G!352'!(.)U} e|;ks0)b{ݍee! rct$2 TE _0ko19/ 1W`"WEX~No3*tB3ORN=: <# !"%'D)*+4+,b//%-*1'_ b66GVކ*ur 7 T PEdRK5c:(TIoHw][ [  `7@)etD vL/f$Waz2,R7>mIt+"@ q~%YKYm% 9D23mx#   / D   d-f@ )|xfjX&a)g7tn &i5xbz6-vNC0&&?5n6/: cg'Ea"zthH%}JDS0% | `+@Z&rfab 63 )B]5i|M))0[Mhn!  Yv?^EtkK"5 z5 Dj_&/|u s_N %Ah)3d& 3 ED?lCIh^ !Sna~"-VgW9tpjZ~QkmsnrJ)5I$ :d:# ?==v7iY& { CMk?+:){FM13Q~^wW= /'p5e LRh9}LK7cUR0111Jd t0oV U%w id+_hZlc I > i_m+t  p!! !.#" J&sP_ l8+u9`\g'S<|:-x P QC Or `3u570!\4F'RD\&vdTW+~FC.@1up2= ( g d .p!""!##$$#<$"(+4)e%o$'*`&տOY)ھ A ,|^m|! im.*oB~eoZ   aUw6f V  \-%0}-p22@h0M?j_T t n4~Na :P!#$$$$##$&()X'$%?)+S3놼qZ:C jnb h +C ]vXi ) {aK[M;0] r x,6M|XEv2Y>yC%vKB|] %@&. z R . >Q}"! e "x"!!"#%(a)&g"a"'-!lڿޏEtl #OgIq@i/.t&zS C`wp=E%ZDUqj_p/^7w5&Fnx\xyVjIa} \ G'E &m!R#""##O" "#&+ **άD=ߜ 9!yF y -o b|_~oQzFd N9`&}'t9o4}Mne3bpCJY4O?CD -ej w y ,_ / uNFp2Y!+ !BYh%ey#Y/&>tDiB_+y:'801,E AM0\Dd=LD9r@M<34z8.w5P0]K_m* ] 3 Z M w}B,DBre8RDrDe \W7T{DGcJkxB6(6PZI=uPN./VERFI) ;{i'r)E@F,p*4]'dQ#o=X[$}gzfvK $B^i.G`v-mZ$<vpMmeZ6"1t"S 5*$(6YtrO7HYFt_j#Q3:zd4$Z:7 %^g?deG6"6UUaaF,yr#l:bjZP|0l8;{(/<"2st+h^\a`^[v3"b&l.=^|).,n}ao}M[Ib$:(xhu-24"@<#~yVm0gxoR{h`jdS3sHt"Cy-tI   VD%R>./9Wt=1az5o~?_)z~|x r4o>7.'_dj.q}nT3>f0i:hz?)VaN'C[e- D|3;9?4k%3CH<)UP{Y+][9LzYbR5,f&Tjbk.Xs!(0d {V5JPErb L(9D~b yd, ffNGnN `02^HCgcFI.;}H$rVGe/CU' P71KY>9E&xEQ>HaR@PesP~fz>HOd8TV*Z"Dw]u##b?5ro\2?r_gsoZ .]@05Xlw8@!~M7"n`s>"1d| C=^5 *~F" >([np3|yx3-G_Aqo.eIJu'kp6-W9X18Rz$ ge8; \QpqL2^zpC?(@S\[kXJ{gw$)A'!DR[^\~c}wkveCa=UYC)XnVP.5a;b$ =XX! ^o\dicqK~/* ; >!?kmhqfR@`SGOZ{cr{rI@A #;_BB58iyt{gyy{!n:?(28#o7+F(7G(OBSb3xK`y?::JXj]u}zatvbinq^coq|xA{tg}{tcyra5;2\zaK+3'*E)="/216)lfqew~[XFWmS(!'Jb$,:? :*DU5,|~}{yiyAh^R"?I}PMOI&0MB{M ,RK3&b  &*; *  4, 5 # ), )+ -N;IZUJGV;#5A-3:') <)A!8X:,)!09EOD@KZKxr<uJSy#Ga}cvw(v8CmiIzJluM7atDYr?p+ZR}$EeJrd{0 e~gI)T9R| p bf_#x7;GEj"'%myu@q ["YAVRkI(vAG&t 'vy"64j8a9cHxXtM\jE;h\s"F7Gl<W\1R-g| !-w}ty6M;~X]g e"wal x n }9[sBk;0  +q) <HWh}}{ 7GuWYHX.8|uL[&x/X%BCr`2( H*DGznDaN![ K!w3YR3bi# mez <*]F;{1;. y]=M]]2!tTA|/ds m#}lP%eHN/0^ h2Lgr,O} ! E >CHC@  !Q>Cy f )Q.q X % H V'i4B7b^=?<4Jrr? ^rk=m:g  8j 3 )*P6kNU?HbEx<߾ߘ]z>) ! Z P m? $ B]pCJl&m! A = J  @  &cQi1cZi@!d;T*( U#E|Xc M l,MyGi: q!"#$%$$" us BC!lَ]߸H5 MC6(+QD8 6Wi]s+}-j:(  < % 7 + c f ! \G/#+}u"F&>Fa7j1A1MfNU '}\6Ky ""E#1#!O /R {ܙפ8hKa6'8 IeBm5 f?4d,Za  6 Y e  }-RsvcDzX}:O[8J'z8FMGN}pHAMoe D cUP:CS! "#[$$#"V!" YHɓ=Q 5+}I^s_Q aFz/gߜ)ޡݙu7HeaP B @j!?3y y,q U 6 9DvuZFOlLsLXJ -Y  n : Y  qf 7o  zTc|-<z%Dے;r$*Og " P  \ zQS     & {B{o%#!!!:2[St$֙3? <",Nq;}  >~)z+ ($r<P *)vW(7tDoD v:wU y G)x  r 9!'yLFn(p0vE[LDqW!k-T,T PU+MTof2 ,4 پI=9 ~R #aR>) -g] ܹO&^ O W`H  :  [ VUo9:*[pW^9 |  ;::KP+:> a9m8Av1Wx9cL&M't #17'^h-nR " I%QC; O #ڝ}ɕیS YW {Q ܝޥ@$ UpB3l  { 5  DzCc&VEg 9 L 0 _ y w 2s@Cx^WBj].jT&5 [NW+A;98yvVG96bl K h+d)KRZ 6+EoEWm Hr1 .L^DއF6L   ] BI a5"9S ` P y M K +R1Q~U 1$l;&,nM"p!'&i%9f&b? ,7vuHX0c-0RSߑݑyܯC}|D]_YZWj 'a[%PH:0 =:f 30Z. w L  T$pV]hk)ocu*b # MK-I>%*w`vTF=nAuzX z o4?"o E&H;ڿ,Q4Gn f W 0 M mA }e@;3TNh(>]qDxJ@14sYB'+CeP&J K>GRi7aSgZT6%Ga-~:IKEg@Tlml,C6:3qG>={E#6%jE:\LGXe@e $mG`=;&q;\e{j0{Ry|WK$__  $slIB=?;~\a!szs'<b/G"b.!Xv526pWf2'$!X{c| wTXWE~ @ CY=X< q&uV"PV!rw tEcd lupLWC>s I\ Sg( ;7Q01 R&*(oO P} 0 :F ~# 4 0! a_{ +E9Uol! ) :(`S RS# xC# . 6 f z] o5&U #Q K ~r * M% zH,X;X Qk V~ CPD &2 Ne$\9f% > e9qY~s 4 4 z_K qV! b\=<di03z"d Eh`J u ?  eC8v2V  O9  a ol @MQ|$0\a ~ j p|`GHm: DmtW0 L L} 1_ ,/=7  *K% ?!Y \  QLD>G5 U ix b V{9j[K\4 Omi Y/ () GytQ6~ n1 jMc/L:f o m @& 2&Tw{e zwR+;CjSH! z~[|dda}5$' 5 .@'[ omv\+& :, /{E" gt+A , (^hPc$޿U64xF-  ACNQQ 6h/ ,"HZlYO o#Eu ,dUu 7 [6 (7W G K{ ;-v #mLqK(rL8~ )]|a pP |J/" Aye  F 4g J zB/ Rm%}H[Td-v$ 4# K WW) 4 ` iK\,!vM>|dv * 4>/T> 4, pbk&>,Bb(po-,j"wfld.=k k @cVl!Ib x8%r % o# / l~b:n31KbH [vV gL ER q  YN \#*n)y/51$ "FmAc H}! 9v PB e '  |E2|!6+m<!%$^` ^y?YOM&< +mwd n xs "4 i)*<L0%+{rk?e>UP Ri;J STD= 8N:U].KQe 0| 6-NJ } ) \ + d ""W1Y "H)xi6k:]Tk+Qe)Md~Y]p' [2}NMQf j k vD +m 9/4w'|{%zNVPC OO ~H ~T!l35gs .Xz2)D5_wX-ppM^NA8 {Q[6 ]u "Fy [K Dr> i O Gl)GZ5  '{Y %ZH _}T!-q %AkOl|/ 0:f a8G pN*^+EOyTTx5Eoi 2 K$ y(/N  0LY T Cs-dA n8L^VED<V  {/ 4.K\hl d sO}$Y1@0 pZhc lj9 Q!Y Fq: .a",`k+_#  W `Fc;uR| 4 9L]D5p05y7x~J Ye@EcXS#t.r; L 1vk'`Qgaz/MLD #M% wZh Y=  q"NlLK @l 1 +n  . 7# IACHKK }p 5/ pPPp^/  LNgb0G53E  \n_$ 7wY yY@OO,w$^P?5W r3y9?!?vmH.1RbH FaG}.']p(dau$?=H0:5 Asp=F>GI':T#xRXWXG@vE ?6:Sz=42Wq4kA -eI".UrA}|,a&~ g M>tOw^={0^ # \S9?6]V!'j{9+Rx+xe32A[4EE :ji(TvVM9?6X 0G;8FMB@ Oz]MVRh&/%/v=|q8''hU]DEt9e4T~?ZEQA3K5+0yOHp~wYod`Rrqv_{hbx|e"p3-$9|7zW\}rHu zfe"_I9)gAvB#b/JT;m0D0:)/FP{9JvrY2k 62 =v ?%o~c,</~<R#*Fpj`cAdB7 U_ry% .G%;TOtHASBh/++2c.40NkXW&0LT` sJ&-\@7-OG!w rlK'2 &v`^A6!NY@SQ2r:J.26}RH %"!Q: >r`?M19'0 yuc@:9AX)dSG_{4|iinsHN.a&E,Z- B6*osYAjj%]{\8Q=d{/$N0_(CyKcxG>2|ZeUHp+eH6|p"8ebJ,] *l<bpEB""Wr}qu~yg%*U`CJEF.p/%8#<A*/Qr$[kZuz.mac=qi]\Z>Gq-y]${Pq$N->OR3xRF- !QpgS)hx\MTBUGvP}u`7&F}?-t>\6i\`s(m 8*@BO@ Mh%jv {r/fK0i ^+-2p[ysW+. 0{f oZyC't!u1I:W'NvTnEPi60h>w@5a$/1%A xxU{D\]|q&S@H\~H$\F[/wPM ^^"9ng 8 7J 8R,tncSV} W"Nla+M*%2Q~00H^TfX & 098I\p8j =)(xGevR43ZYIU^`r|D U Yl:/}|sn0#M^ CgyTc2<^[WSrvokXDrX%3Mn\b1N^ -]P `|$5(HS_w{a)C:*cjbH).0:70+/4 c{mtVVp4Vd e =]l BP"9L2UQ! <; dv0%ts~M"J?nqYX7On4(8G[|ea_z[moma!3v$60>J.wn|fngtww>Y{'B%mffjaQ-aa\z90+CB8hfIO[IyX{qrkvdccjtvrX7n Y@ToqOo,t?lxn;b^o QaVGM1_h9z@6O)GxhlO.azyyQ i;=v{z6 1*  <u##*(;6/.I? FE,vh"V7/%+We0 *)@6;0FHW@8%< CFa]a`QcA$DQ[OInbqvMM\F4i{eW:Zvw_n\Y`b\zfezco~m^l_ffsPER6vd0/!94WHaZC6Q6BO?$8Plk7A9+A53 /&6$A z !-6 #*B)RW12UX4 "3qqP_>KtMVqcIE@=?WfN#Or[seHQ<Nt]w`^ofuy|zpxcPBZuzH=So~  !   B@:C$DT.=:)-flg4!?WN[]I-)E3(LW<%.LRCM33:5^<,5 'TKz{QG2"'#*2NZ#(8  ChcQ8'9 #--   +&%% " qkR\s\YfSmocZTDO7BTN\YId{c>$0)MDA; ?0% #.#*6,u~w~qruoWzjyedoZ[RUtC*PcgrOGH;__SGFU<;dWEN:.%) ,]P5;+".  .B45Z= %*%&)"4;9;9E:BWPVLu~jgn`\}]|osW~tr}|~Z^w_?O>:RfR2Q?,B\+$9Q /  yqx}hXI)3>g_ZKXB8#G D9 !5-?i\afEPV+S<-/9%.+B-%CJrwbz}oree~YyUxdjyn % ; "3CI8OAFND[hdYJE8D]AHt`o_Ak|x^xTvovhk0bvZ'181-ekOsq^@KaLDBD:1MYhrnosxjmYhs+Y<'02&`vlvsCV]U-.nL6*;%<.1# ; ?'G3",63H)$7?0b/MZRbYDJZDo<_{jd[BC{juzzKzvmUXCu[ts]Lk7,^T=]gQdv|r*?- ,  .(Ng9Mi:=2*?pocketsphinx-5prealpha/test/data/cards/004.wav0000664000175000017500000014115412771605033016417 00000000000000RIFFdWAVEfmt >}data@+ =08[+Ni"(-H47$ K8HlFf[Cl|]|fWuP2)Y&>!) &+I8 4et_ikT685# rwRPSNI!%&  p+0%43 :0*tpsP&aWl\l|]o{*}qw+-9j_<'C8>[%#,5 /&/-% AU^).-2*"?,'3<&'!Ysx/+' o :O]#J sIOV (#<% zB/5l;37+ i: =$%GR7}w]uIZ,}q8vJtZS3zj6go\tQ]M(pW+_3/&0S2ox!N 7^DlwcgK3\I7U}PiDyt4)?1T)JR%>N,A1:;TAkpM { }_ a9( ;"Mg| 6)5) TX%{}3H&G *2!H16#!'_ #2 #!9',) "8vQp\Nczv[]2RdZzNUci{GpeklnVp_NhfVm=iT?}nbkic`4[pioUu[b_p+?Z75tb`j8lSBF[gI3UKZI9z2TjLMR7sq^e{xaNJTVo;oXSegMV-a:) e Gmp~h8WfD4DFR,xHN]\'_{8<_P.S6e*0Zv\vvs,?#($[E0D+5'FA $C> ED [|"PbShD`xAavkTOm{6S}0e{{<6}gG\HhD{V||x]4be! 'Lpu   (R-I(e/z<?}E"vU9(-T=9._ASz7/n!Yc~>oDJez $maQ''TKv$i7*$=%-j5V hH< Yxmw)fSh ]?V)Ej#Hf16Xw8kO2J F<}l*E>//^K XU3n 9Tnpc+@#Go3Ss0 .(c /J]b>o&73v4m. w^njwZc@F?DKb"D_gPi6kKyI[lLe[`XpNW@$S,E)BV-}=uSDOqQ YFr9~;>RFm%D[bXy?.Uctk(xV|hbqPnb1q.[4#(3E%~S#^v2 fH#g[; "p'(L<Jr#V^ Np AGAxT GUR)O+Hkjds{|.W 8 E=>DfcU$EsdQnn_*qYrS?:_2f OqK{V@z+ AI `y4|=,A|88U"D"wR5f5fQ$^5v^(u> CMjHexrWw|sUQ6bAR!"fNN-{)Z BRx$}[ >[u =P o~^p t>D8Gm,=i`^ub}KnfX|1W-(3|Nk:IJe!W [O=UpD YJ1heaEue:GQt}c4@ \aN$GUnF^0?l>H*rr Q. q%o 5 ~g- :fto P4(T% y)=F %>i AjO$ 'e-h>YBlKb3`})x$-6qw3Sa c~O >WiL1j #,|Hrjg ]Wh^NId|Z}Dl4Gl[qA)&/8"zJ@[ } c   GS1   Q8 R%]^ sK : W P4$ ) a l d_ 'l'`=}n8I<(} Xo/C $T1H+u+ j H}N= U $  6"A'%^+5/407974{ Hڔ¶tpbܺF~ 7 W ;0F%mVB < H 9Mi Ak,OQ_;_q V06N3"S_QEKR%g % + v  5 P ^H !%(*.26]93<>BFITk\ Q1XŁ|І3jw)AMRQM%B(~a2X:$d"-&) 5=O sI<2jDHtrjIiߋS߼QUM?^"VUTvrNo\' pk  V7Rv. n5n vS!g#$'R),-479}@sF\JPPfLQXJo w0ȂƁq^̲$Y}~nG]NJj}~ʅͶI&FvJh'=M V-S@%- jݳóDd ] 3 k*= 6Yyԥ NM pne3;Δ=wL [Be?  WUy ($3i;AIQnW:Z?W=OD3퓒9ƄXZ)#>LXu~~?`RF4!τ8GrEիk7`Pb3GVD_XIF10 hv 8 /w+2A/("$5VN g3Ra֓^ *4~72'<rٳ6>:٣Ofn,T/Bs V ! 05!%$- "!H!$+u0U36E:82&p5py<1GQ4er}|mT^ ܇θ˱*@Cz. CqJqMI8!-Ƭgqos#-241( a& O9@׽q(M1'4/&mT@v;s$1Yu[)bRI[1wp y  >,#'06;$BD?%:7/~0t뷋X:W fss@@Ʒ\a#iL+c)CQ3VQBr.2,3ڧ~Տ> *52 3,0%~ tF.B`[j}E ,67^2(Ba|_Pְڋ'5[T n Z^Cחa; w &z k^!r)R-q5?BA!@PWSA+M%?P q*b/-&Ry \=Z9Zt&q29;7-i 6 ځ grXuz+%ƍ  @7`\nt _  k9&2/78<;$62.-0.%TŃ2;C8luw3r9 ̃TQ>}޲2(7=4PZX(FK+ ̇vf"w,E/+$UL, #_hΑɗ̿ձ^"{069:4@('6܏ݶ4 {QiKʷoƌʬڈ95 |BR"ߡ pzk"&,}.0554e5455,ʒr7/iYwmrpG mE/7vu@`;9_2FlTH[WD $+F z H! LXĨ̃ۙCT,4F4q-#GR l (S,?JikR%ʷ_iq%TK.lnJ E7Tw& #+226w;==<<|7U- 'w)z+iz{Ljba+Bl8ߤa{Q3DCҀ%% FZ]_YM@5v,V ^4) , +0~0,&Kkr9ݺT=4 %'#f L_9\*$O i^^1ɘg{qa)kPb &qzf%F"#'.73>A@u@*?A<4@'L^up"Y-lRxaWaW=|3LJ/ 0TXeQ`PB=#$!9ցp_ܳ/p,_>E@4" }()Ί"l > o$#GEFL-Z[Y9\QTA SU%5 s+ R|J 7 B7#x)-"0147Z:@EDAM<60$ց@98,pqRDD3RjjYjŁc'՟;V,_S?3* bj{ TTU@)9C4C9*"k|: *11*K=4V|$fXW; )b4ä;edwS ?, -~|9g'm/ ` m)xvK" -*f aeQ!r&o,156R9u8L2.3;BD#9+&E"_oU $o0?NFSW"`J[Թ=̂ٓ[܂GU2$`=SHC5'>p-c[l(}@B!G# #]qۄl߈p2Wdq^qMT9٠կ  ا@sQ.z75DP y  ) vQQ P  )/49<*=:8&N>;/5+K$!3A" d$"Q5/-=?H1=@$ "'7z֜xS   '//(#" .(٠܀! ftPQziۨ@H6ɌނRߪMynSnwEf Y  p  A / b #{R -&z)v+-,(,118=<:>6+#"%)0Y=ZGobi݇|% WC<^NRE i!1',1m53642#1136601&{ ;ҴXDӴͱ(6{-0'("U,09O3M8^BÝ?ۑmI0Y v?<C d?^Q[C f%18d4Bӂ!XnM 1 K_Lr{ XB &+-/2/3y2+48q<=;;4)$M&'!+˾W#ƶMַymr  v($8 O)76t&Y< =H;qZo5"z! pH!%! O OT#H(4l6t+%nasDB<}0OJ%aw i 'bW.#%b%&'9)#,l.034 5^3./+(&'t!8K xhӫ[`,e'k.5 N1(*<  `9"rq+;6YZ;0_L-0]0Yj% L$$NLP)D~)9zI:&#xG^k T Z\0)O "s###c%%$%(k+c+("%"!!t 6qB z'ژJH Fz(rDD x]nUed)[b6 ? ! X 6 I # uzlNb{,Uj]5]1LaL l3 _/xUpgk4j{+ pRJ*T934 'L>4*]aS9oFJZA9<bD-#a,)Xe#EB3eff00V3!%QM?(CO5)O}va@6y,@eW7 3S5._ 4 nO eWFm2c_S0@ (<WZz cK>Gy`{k9[ewRG,#a~{1Fz a70(!6Pn}*9>rJOzS g"y1c ;/;/dJBDhw8mB /il\idA7M,gJ-$0~D"ZSL]dvG+nmMz h\ G 9Xq B$f0cC hS8SpxB6T}0x!cRBX1X<@[61Q;MZyYu^eyg[4`Q!BG& X}` )s ,"O&5^>|-yZj^l%1BM4`6o#X8Kx YiyGTUkrp_dw n<0 XiS~<<)x !HoMH/< wyix_YLOxU@?e^l`k1$QrJOI=*x8 oD=q5 B4[L$kPz z+wwS>rD8OhkvA.9Z5p MCXUxZD/8Cp b:^pPO#J@o /,z.nKt~r#EPW8grug0!g\]r&{md jBCEk*F:Y@(8yLU=\N aRF6\deb G[_5B^6 P_oZbH=0%tJhAp/Ba=[OY+0lDg}Ps)9x^s}(K; 7G5?s69T'5 F)nQr>n5v0A hx`[ ,dFI^Hq\yA(i5B'~w VxC5j`S/!4I|~H8j69z`f[gS<82)1mq| nM_|Q?7?K~/|c1?Z!&<3 V6?> s8g.[9"e{`qd]^$6/~yafHOfGKdXPhJ{b=4Vb4$pV> Bq|#.h3FO9.X83dCp{;( )`SN"=-b*VXP5 :&n/crbg\ 7fb+!7X1 ~z]F+UYW \}SH5,j^l69'h^&7 GX`4^^Yq:D)%!PbMv> +6OI*4/rTndu1C!7D"X. '< R`qP/ID(7[~yz* MAHolr@$.FQ2b,&-T\\PA3pj @HJ3tZ"Ar~bA'j~|?]U(!R^;@EDL  yrw/J}y 1 b?gsu^=E 0, <!n`EQH.}&TE<$;9l;A t~6-!lpHTkdWI{}=6'TnN{x97haC]dEBpG]:Bh0 RZg}qo=-5PvZL_\M. IQ(WKRV@C6qGStzggtm!xKw -o^SGhSm ~;.]rj^rGMV)5.`KA9 %/ ! Fm`nrGdpg{wvv4K( sqLHx(Tqa586R6FFd4C|!/ tPVW"._?TCdMh Fyj~}-i!4r!4ItDI|kXur ~S Z' b9\v ou p2"2rY1Qj'>II?EJT "]tXw<X<'4,CrM;u!d|~'PO8L\CW1X6bW/Ss~fv#Sy9'!\BOj9X  o|z~ E~R"?8xRB4WH GX9@PaK( 4Mn(]L !7+lF=k$B`#Qs:h #eH[M8 N&g3V#-z^%DUudM>coDU'5 1Lv`MX]VgfpJlx!iYEd ;&nRYut| #7"g?_8,#WXv@`d E"uuWz$/X*mLkCpr\R4X c \A[<L wlC\-70-5=3l2b 0EzO HTe&'>}d];X]r<oPYIpF^AL14O\Pi$n=zv6q+7Sitou{+s,%O5B1)B%6N0M R6mJMzLn<K\ a !@jZpH{bY^Y@,3o^gThg j3iED9o9&wI4fu:kPWj 1?D"+-6[a;[uJQC8e`[l&Z[ qTpL' _XO)v21?-lw|+7YslWq!ga: WZ@%}yY1> Md"*Z@&Fk}+7_)0(s$1ZOgiUwW.>49u*QhO<PcZVNq .9Ghh6'z4<}6mlYQuzyCS?Rl9mG{p-*%R*GCx wX]5Uf\j'}aq|=+~d,b78~^dR0v^%G}K,R9 e'pH*9QbWt" cfNsj4,B.}1Rgm3dD T1z2<AGYFyLvk!EJ:o_ Z J>  2| ASCTw.~)M+&fV_j@dSB1W\%6(n!+lp}F%%m</1R1k0CLt*`0+b0O?E[2#BfM7yHSZvOVArL({'! ,,/vGU$Y < W7fp<h1)uLc*gYlSsY,0096JsK2^|z!`#~gn yz,G%"^ XN- +:ILpD^I\0) (,juHf{e|dnpV\$vgoa%q[y Da,y@_ a`G^d4I=}dg0,v@f/O~B',c\=[AWT,9$C9%\5ycXwGtmETyP]znac _t*Ox:d& m"&$`1 x|;|+8TbLH8"w:).Qc9# J ;+$")&P(#,ʼФڇK0B  g:BEmDd$7;WB&-({k6Ec@=XV7xDwy2JAWXOۡؾ\2 SE/0Rr~g k 9~N}]: "k',0p4.7885q.(;^t/00<.532(nS ^ bC/ Z/,މ֓*2t =&9,.-m(Q%F' ( d 0H0z6+slKE-=[YqMNt SvGH  <.r"G&6'i&'+-,A+5,K+&L" -}>l-;mp;aSI>(>8M#b\K%s!O|xjۭbjȍЌ z);zJQKl7W nfE$?P; B).(+ d ~ߟZ-M}ee k Nr=$(t>ߺww  FQJoͧ~ptAR4^z_ 88P Y #3*-/-(& (\((U*-@1K2+-;" ъ7޷i(+]hWUcP. ")l(ʲՠj:mHfPU$UHD#p'xŻM62pA "r)1 7I6)*Nɼ߅Tw0r h6MzuG Ha@9L~qȤ0-م{.I Nih-W~Ϧ :C7 tVTEr&*x,r+(p$""#%&) /r44u-]#T4n  <]gcF#=E4?% z rJȰь9:SUsI?44cuFwG!$7?91'X=GAդ=coFY9 n Tz !!V ^PoC*4:U#   8 z <_fƻ,r.ߌRA ' 3>Ld4=k :.fn $%# t #b',278)4-s'zC {ېˎ [ VdE+Y02B   8Mަ|5ӸW4?NM;,'"Qc\#bՇ8v} ,:<=0XjN,G$(&V;;5y;R%QB:l -= B{Qy5c @  dYlJa  -"G$#"z" &t$n /!@#]%B))%! ,eT`ֶ,WQ*By^e `a{0.5 (1~? NtКJoYt! p N *Na0vޡw߶" : oMy 1r>j  .Jo{?vͿph4 81FAnm?~\ 7 +,+Bo= QnF"%'d#!! 6$o*>(K%(*)T' ˙6ݳ8 !D= K ?'m10! e`:ݵH.;c X ]#V8o'N)&u S\C9vF: j9&53 Ip ( pkF !k)Ibo L Q H3̗+"zbd(q2BLp gf8lyoi qY!9'+'$"u"%' '7&'(&E0AB"&+ l$+2A#@*OQN;N+-+&\ j8FC "):A  I; a | V  ^?~;js"Nt}{[='&A`DJhL9%;YycW$ 7 ) 5 "V3 z"v&|*+E)'a)@*(s#7J+׶w/8HV(W2?iA/2tMܭzO&6.F I*P ;` EU^3l]:Q   A[Iiy/#A Q + X:5)T :oa8%s7B>hA8)m_F{Y)d2|ov&a\fTT &lZ~' %"qF"%%""$#'$u%%:Lj Y$8'0/  \ PhT  1v!o!0 ` m 3PW{@?1&kR=/ :_=P))l6}xO+ z e3n_T3H@durH8Cmn`kQw/P q'E irj "'b(#2 G"'#*%Wdݍͫ.# "/"[d_w~- rC*H p8yt=f?j$j+3 b s (lSpr)`kQ>s! : v 2Ke3qg*=/R$Jj#Hr-bz"F!Ey O+ T|3Sw !I""#% (s)&E诽-ܳ . q}7t 3.&/&u _LsqP97#d* Uej   @ ##Cfa48=KFz > N L  `Py36dt0B  42\G[Z!>No &AwEsWN8^]E o Q 8 *)~[P[.)J ""!#i$!Uti<ؾT& 7vNeUa (UVQ{_  M8c!'CZ:$>VR#Q_^Amc~6W)Z;#z(9~FL2.d_"~ !o(6  } s8 t"`! c T1<8B\ 2x yy-\ 9_]oV| uNeP f `i 3  z`eXN[IvAc'+57w>^f%%RcR Ay[Z/` o)m"qu N  w , yvSl6j!( G PEND_\q3ok  ;} dhs_RhpndfGl__T-rs)?t.urI q.@Zkm3ysC.)qg#=.10]e  S  S nUc. :!l>BJM8C ( 6j r < D@V}Wv jx(r?{ 2tq{);WOsnH@{UpH4*;4k,t?>Sl[H5XWBhLJwOmaL-(]%pq$Uvc e 1 j  _ [ g N }WJ$1E?YMdC V;vqa KXo;iyY"_A*;t$J'L%V3]5sN ZJLc|~kg?10LVd'CP1pu0k Z>WiL_mF2MG2G.ec7\ff ?DD8VIq}25jocY/T #F-=>_SQRl(E\1uAw}K#s#p3s0=#MB|U4qF7:'VYG9|uMgbh=&Bf b;@4cm~opQ1o K&d<_d&xcp]A*_Kg{/8h5.'at1zL$qDk/)89J 8Z.zM84^G%DH=<B3-U ''YGl~)8  +64Y a)+GTn-/ ~AUsSO*,l Hnm+gWq p~7VXY<k,-=*zh LO? ,4`bJ+^CBIp$ bt1`g  !Zn@7Rvg uc`wx2&owOE+9{L_0RV^sn;9]R=C ,rjw>RLO2O[`.Yri'!DgsorWvPg4FQ3B}FU%3Mxs9s_6VE$l<!OZmf AP '^~ /5R5*DIrZ8dn3U /r~g}#CZ4'IPK10;l#\ txylOcOaS";9M4o?: [?aSQ7La%G>{{[Jv&x{\^[(A {1QFTsO}-;,G%VNAYyp|:`W`ak9*&0Mt`U}Q mgMk,J s2r,U?(I45D*hxGg .LC1Dt1f2/G2Lkv"2]lIbr3`bNZQAnRx#7& ]_oL|\m57SMLDWC" ?+''/QvR"?EHR@Gs4dU>[h|J\>4UPQ#AC FvZ;l=='v3jsj7~(p#?3lfg=>&r']7s6Pp<5 roB]a0K;]Hc<}kCY8E95 v5]dcB4!2 ) EXk2m{X+0 RIlee<u4HzhG+XHGOqSJ#b\g[ s_sJ6~P>KmrW"l 3i"c}YGod3#APV\It> i*f|=tZB/'J J^M9 $*T3B &zHZ^7yZKd_H6|% crCp2(YU<HM{%UM_klNUcI^E3Y%^&|$A?!l8CjDjY:gNf9<!Ipu!d|?@mcEb%?CdE!?$D# D)<DGxlwQCHWDA [M"&Ey0u-= Wd{!#wB, 0Gkp+C *tStp^4T. `k)x4p~woQX6 Kb^?$@c"8#e]SC}F~ceqC[@S+QYuuh=0i@I g^z{ _I3^5!\i#>,!7]1~u\ask)\ADhD7OA*Nfczd\vjdfk|0mcT,cSd]a;@*%%=b[jidOwJ\Pd5n,ztNIK/ceu]@9 4 <P3s-O= I$C.ukz`x3F.sUQbI?0R=-OZs@m4=%/(<1f'Ns"Ie2Ts9VEX{iNC)`{}E)O;778)vE$PYyX a DN3 rmM47kR02}Mue w_t|uX&db9E##%  E*FPNs4+I.0$Smqrz}nm|im[% $8$15..2?=<21 ),/5%'D8*(.01 ! 1 7D(3* "1 !61' *5;+Kll_?XJ5P9RpI\\NnD:ZXO@3&++'"=7HHR[MVTZwquzolstXP<<R!  )*-Zibz}f]URlVVn_NK>-7PSNR<1Vor{jXvavmo|[[_elclkl~tie|l~scw|dvxqxdz{\Pwqgutzpzn~t{Ng^mem[}yj}zqsj}~~el6@[_Pm`Bl?>{RY[N^gotvczt~ywrw]gtqtw~_mqjx|{u]t{}r}mybw~mowolsgu}h{lW33 9-1,1,-ESbUM_~GM* %+('NKJFeqrhV ( 76W`iusktw|YYk20D6%/P?3D;6@QFBVQI\C8A\RGQXbbNVHIB:=#6"+< $!!KXNYBJdQD19DCWGHX^PAOX;.3 1 ! 4)" !!.9 $+,"I@A+2-5M/28&YCcjs{m]YL3iu(MsypZAD8+AERLC8)<2;8)! *4/4$ #tqrg =Dd|{^hcWW=H _BS1"H?=VbK[K6,,1  xV`ht~pgz  O_Z>?LCJ_AVgV0klrzguU3(gnH/+&Pir A^,'9u !$ }uX]4'532.R=O{-<{dV:v`8(694Dj%7=.RgQfR-mvekilmp}v  *%&(#~scXQLZl'_x}C=IqCIdTxt/LVu|ujJ ) @OJ[I=#'(PSF`e\V:!}}rZRM9U^5UoxtqcL7xnEGPKbl!"P{zZF:yT(&>4^kes ?St[xXw5u rkb)b\F_ !0KF?fwfeV&pcr!h}dW)wlm|8\i:TM7%)_k*_E("lL ~{Ps*XW2I=&Be`K]=@;% Hs{- p|uvnb5@s?=)sO<>Z$0es]LJak`2[zg#~hK6%/0b/)*Qczoa&|x 1IcYMI&zA :p-`iP&{tx]e"JhVHN001j9+AQHbjh%,ipT^}t_QWt~ }ytem\1( pocketsphinx-5prealpha/test/data/cards/cards.gram0000664000175000017500000000067412771605033017342 00000000000000#JSGF v1.0; grammar cards; public = | | | | ; = ; = ; = ; = ; = [ of ] ; = clubs | hearts | diamonds | spades; = ace | two | three | four | five | six | seven | eight | nine | ten | jack | queen | king | lady; pocketsphinx-5prealpha/test/data/cards/cards.transcription0000664000175000017500000000027012771605033021303 00000000000000 ten of clubs (001) four queen of clubs (002) seven of clubs (003) five five (004) eight of spades four of clubs seven of hearts (005) pocketsphinx-5prealpha/test/data/cards/cards.hyp0000664000175000017500000000024412771605033017205 00000000000000ten of clubs (001 -3466) four queen of clubs (002 -3714) seven of clubs (003 -3184) five five (004 -2755) eight of spades four of clubs seven of hearts (005 -5472) pocketsphinx-5prealpha/test/data/cards/005.wav0000664000175000017500000033277412771605033016432 00000000000000RIFFWAVEfmt >}dataеtm|}x~Wdt|kthjd^l~ttw^jxYgfP]vyNSpPmohS>_^hmdtpcxrbnV`nfskfgkynXno\^kvipnmxigxou|afZQVW|dGY_lb}k{UoPKzgP@?N^XX[ZbN[VNh06[7C_ZIV4GgToTrqRiBOiNYO.4I9)C-8L<96EQT<B9"6?:7?%'@/6Ql/>,#6 &E9 * (@-814%!:/   y   0+  +'$ #  !!# 6,21  .%" )0)* )&!''  "' +((&# /;,$ 2** ."$(,;IB*4-,H!7;78<J 720 >4'29!71EZLK.)%'1$# '- ! 0!%+;%4,"39F,#<ZCEHEc2.&!OFM=-?LbgTJ2".D_E?`CD^21.*1KQPXTLFP<3C&<;ED!2"&I%?[*DN3-(?5$.!4D=<YK8@2I."TI3@F4:3          )  ')$1!) , ,".   /!      &8! %5 )3   4    ( "#"-%;:ZM7:!*6*4.2%-65:6EVC5%)0%8:"1:5 '(*CAFI=E:$4D-0.()/1L[;:O0&'$))%6A*22+@:WhJPB'87*?8>R==D"DD)>3<SUP--?1IV6MD2:*8WEMIMRGW1IW[kjiUtbLsltVSNIOeI\[T|@6ZHW[=ZcpiOaQ3CE?M:$2<56CB'6=BCC29+COKM75P?8>(/16XR:LaNBNB'2-4</! %#($ +6(.2;+*)$"&*&;$1C'%$!  )+% !0 ##- *-4O>9=3#(<3? /&  &=%;6+O4*$ )+<H5. 6.,;6   #!   -$     " "   %!$,?<@A3 ,A:"+2!"8&,4&DE4=:1/P>>UAGG+.PRQU?AIIcv^imXnuch\DK>Inng|t|]j\b`^[WUDUY:.2?J?HN8ACQeJA8<#3O.U?*KC=A+ElZdVI]E9N?37KD@71EA(>>;c=/Y3DMFE7?!.8*"+91$)$5"52?I<363!6N@*C>.4,;=&%"&B!.'+3  !    # 7         #4 & ( 4 4,!+7( >!<. )%&  2 3) 1C&,1.> 3#0@:XCHiF9PUY@&KL+@?01+) %: %%3. 01(6B$5>53##$ "  *o{zrxzy r  y_l\KM=&* $ *U!TM`@^$ԨHH#q{Onassf c F' <.+JK-t VU! 'xȗKӮ&N zs!(!V"+ ^ oJ ߩ_8:@_    bz R4FN.wl#N4 (D A 8߅=ggea#/6p!ztdGE.I_ h ;H0'##!R%#}*/%!z%U&*' ]ƯTEQipcJ+b"AZ(<[ 5&<'33 [B s)̼+bʂѡ(D V~)&,  c gM)_\8!{ p$  T 1֡@՘͸M N$8y2VU@Dsw ` | b#$<* +',133.,03S9:4d/kl% /.(ė HZ5I 2PO4 a)4 ҍ8Q98orfAy5Y "_)q`($"r%+}y[ oVس1YQC jqO VI֓F#>h"3Au߈u?R0< ^I #V1 %!HU_4AU#*[109+-11E23.x9֜Wt/Yk ?WPj^7e9Ac/A ")(,w1,=5]hws [ݾ*A {4%IK%% @dV//m<5X9j?l Y:K*W#XػiZ97 Br=cW#Q=0 Z#()_*,+m)) . 32i%=۶[iuOƖ u6ѥ֤ 20Ј:38E&<B13+ V $:A@<)~۬S8_N  E1 J@'<&:;v M~'b{zZG r3=2Mm,-lA0RyJku~? k  & Y "+D$,1~0*&+683/0//<}M9wVE9F2 q߱򗙴 ߹'B ).j +B:-"rY 1\m,^ hϯ7H TP  xkW  `X_k߉c Ϥ pPIj,6XI\D)u /)0-*-21P3d:;k30 #,{Eҷ%]չb0 9 !!`"p/-/d!7E28  _ Nc!-a6>B' +k9 "9 6 \)ӿ՛|wԁϭٮG&yl5L 3A  ? yxbZ L9#! #^(,.y02s20l/7BGLm v(W )Db&Z̎ 4"KFi#n2$No; Q%- M iرs3yfx$:F A  t z H  F *-C͗ܫʴ\G|&ۦG%  al AoZ G }GR{#" p#%N(->/*m'=c;l")}Of T-ϓ )]O:! d%k& R'+o C~4`IEWX   w T  { ( F U47܄(٪z,ٮl_g [=h O Ta;\76 %0(b&# \%*,)szQ /Y]38d֝ε! NN{ h_ i!qFK!)u5; qHL;fZ(1  T IoD sF]UV,nݡ||Rddpl Y8 ' %-GcW3[ #%$ u #'!{ 7,EGE!8۾  m/.b[p. , @j?s |!;< . Lev+ay)(]k  G<ytoPb?Bsf&gmd + GV$b:XLGo!;: -|+Ӟ xYux*. >B ^  = `*g w+=@<j@_[LY% Dq xyfOK$7k$ fi| g34rml:wh*A[]Zr}i |5@nNK;LTn"Ob=hak-DrF(GeO`y9 0w_,Nnvfabe{?AV^ wI:v_BcZ>Wl^2j^+k@>:T!|@xUbk5G9,\Hp*"V?3dw]l\G=Ekqx(p|@w:qs)zPJaBX-ACI{fZyH+|_9  mX,\+w(Gbs0KE/Sc_`6= + !xHbZJrNyCJSmqi\*JH,koapL]F-yo_T93<j`}D`Ym)F,7n.iyUti@C1i\V(gJrN{mzZ_ft?m J]+5yp)O, -|%{U7x@Hl& P6!&CDs&U5~*\v3UOI#X *j;OR gYR 1!u5mN%v |bl, ND={,5v &IgcsTo:ya*4(d1Le  @ T ?j z #{ * Z `6] L f <_9 [W |QU~ 4q&) ` I E1X8Q#x 'Ka-PWV% QdN1p-(* L  bpWb&)07o  FrB&KJ p ] C T @  IkB6BjP93(y,:^J:D[i2 A vGmM+Fek-  dqF s !!@ 6Qjv5[c M K <j T Z6*Pn[&+=(u \( I  & UySTD,fQ<%WVCtpil ro 4 3% } gwHqRlZ$  ?_ 1=>' w,D( I?X >?ltyu_5,Pf&r,85'$?p$) ^`N9r] [ x } 0xcIjZK`yEHnv:7{D{IZW/ 3Kcgi`<4PKRZ,fPAm(7:pyZP9VIiCyo (@ne_ G FaW|Yax p} kxYbNW&w}.[QJAa8bLC @+cJ^mn`XtmF@J  ]d 1#^Dm{ly]`G@uG[ R2yp>l!{r\fe]&#dZ,sIBXw{qr > iw&54%W-|56[C^ xhrOfnzw;>^n]_ LE-ihI1pIgO5iAR{eQ"F21Gcwj"?<r<Cp}YYCilkdl%2NMz9vCL1VkL>qi:( ;i]ekai;,b<tq75vgh~i^[}IoH^8>A?VN[Ywx_#X57}kK  2rv\W_6a% P6w<2qsa6 eWFBXN&vft ).lO*3$j%.Qbl>\@6i= Ia, 4vR0nS%Aeo&dgV6}:ST8 %zx%}w F4iV! }aJr_b#&Mz# k<hDjO{Y~xo#.@ZpUi_uZhc 9j sk Dz yQ. 83   q:P ]"p 26 %l ~ <\# }1b4S @=F=r " {:#lqua1x :3gb ZA3* Jh, ?A E( 3" Eay&tgC@ <u h O)9 I3n )%kN z E fn tkMkw `%HA @bz "ad`v k\  i7 '|&]  T_<{ lKY  mk=\P   (T\ vc . { #2(2E ?OB :o xJ ew(=h^1 HO f 3;_ T)Mz LAl" ={O )3C]z9pw1 5N :_f)WSM&GC2S$Yxd-$[] "[c)uf|0bE#sf-C3O=e{q{LP$:?H,c+C;B"/,$XLy\<#uAB 7sO1y$3 }d W2&ZL:A8x-|6L+T2,&vRu8]G>< o%Rmf5[Ub`gGSudq =\dV4/x9FS2uX5 oRb!K^3AWiY&&,/ VY'fPu:N!c"] K3%/I)[-BRZcR|Puk<5tDuig )` 2C02RWl&' CEBfK;939iDp.{~Fi60 ' M[WNWaX'BK4H($K;@?z="t.hIZ/2XlyU|q0}e[{ }-k:rs">hw(*'_"o^*/"x41Y^Au $i[E6{PTb#f3_TSP-O\:IAdA0iQ8C1O#X4'>7-V}i-Y\H*;&sX;6Q0D?CAE9t-CyYJ/Z d%W2MI7j.G/ZN2]=9W59S!d1/$@"7 `"32w{ }d~}IUymyttlzw{M ^sk`LVw;Ts<Qd\@rKa7FQvUK+dTxyAVNcICt,PXLu8`O .bS->M.=QmFLR".&.IQ^wA$-M# 6?2  +&)<E 3 ' 4Y ]&1) S!LH ! 3O4;5(>A6]$;=7&4K+A52\A<K87C>L,@16u9 PQHXJI,;mi+B1 SefvNlAp> 3 -  4 t62a, p  v f f /(r  u =*Y; h s e Z |     5\A77n # "o""#$n%%%N%%&w''(b*+++. 0A( `O:mF5 + % nx { v9%}~.߯BT7 X:3[Hk .f=<C!9Qe[۟dgu1kB65xE#@ /!w"{$'c$o>/ף5A̍G H'I!_<$(H w|Rx)} l9ϖ[ ` PmV vێ޻@`~r p tIn#>w޽ oR2YYD\pn IUGtD':p ez!=&))v*( WwQeb1%m\ݞDC Au5@2C ?5n^%qQPHY ' w  > # 8 {1 m@ Yu> ^r4 &djJ#[.Iwt?F$I-}~=J&/VPO L f>\>B$,,((m(}(,/4//- 툨I 0ՄPO Q  k1HDw$3Ozo.)>g !1x(( B r3 -_ :K =F\  eLu7B0Anj4T/0ATg[ { Sl!'+`-*(-`33~0-n+(F=#8jpexo^6  [14Ac3o*%{C/taw{ ZH#$ .!^U( r;r$Dbu OD Haoœo]Z 8(/. u ="4&1 Lc/A׵C%' - @kvAy  ak 1|tHױU&ԥӲdr'"ir}]j|9 /7F c$B+02/-,-..ƽO4# ϊ!YpxЙ)9Vk w#U)/3'L <uݞXjzb@ _SUJR^ =(Td+V{  .F\ָ=,8C)a.uF_k_@ o n k+j%v(n&&)+..-$p85IJմg3bƒ͋sfm @%  Hy R  ܄)FnWD.2 8 " 9 dsQ:PKG^ Rc$gc3Bhi sW+8/  C7}UI" %$#%M(+T,*'ܑ6ZC缌، qҹ/qG{ULC/ 7gG Hfy  $ t$xl? jPlg>t B ,  ;rc3 :{Q 7%29@U~B"K//&sX$SC&R>[&a |T &G*(&'(t(5'C #ػ 5dXtn35$h 2I hS; 'psVa|  v b =PC~fUJ6l|c7 \ V$ 5 |  -9+V o#XrM*>mQoU ^krow jh;Y  #  -VFkR!I"#o$f%%&'%&!kbS/Yp԰ /YWp  Sݜ je djC L|2h#x_P[T/:Z1` I vZ"l % ] Y`jy}NJn4vU*jdg&PI$ m$v?8) ~ b6F."!"#$S%e&5))G(6ۭX-Q (  S4 W < {+[h2li 1wI`}/ #2 r 0 E c yazj0%s$ :rJ(>+A:_M7WJ1I g I6c o-$'('%%wH9ZPG3'Vޡ LjI"}ԉ n' OF ZC aK , )XR(&V@  Z   ,W c Y2 4 AF{d0 Ot&L+D[j6"""g"$&'YZM(5ɿtty<+*sOg  .@&r }N%?UdEoCDYIj{%tl (  !  D7+Z7@l mhg\16sA@im Uj4=G#$$Hn A:@ʘ$HF =W5Ӫs CjS> Fy T~+@+|fAo:J { ?  S I ,zU=J3C0t,\D-W Rk5O!N}w M W q@ V (nhy6V k,> 34k.5)ADؽ Ld\]0 L V 0 o ZyzW :O\aPuurg<1s=\  \Ug5ngTa}L% v'y8V 0  |  T @Z .ZTG6yATp;jqG].m;T  }6 p:6 n6< SwBZ};fFO/FDn~k#Y9'h !Pz+sDQ94x =  4 ^ U u_Fej4nKqP6 o"&m}M^'9dwf"F m39 K k % f i{(K_iQnfOnQz\YaA#vZ=fgW}>3Y cj7 E ` E ^ @  Y P {~A=_n `y1YH m*eI&?_J:nL[fR3m1'/3G-ZWfH,Th7 >(1NgW3S"A_O9 ']HtP]j<`vqQNDG%ZRsp[Jlcw7C,Zwk.xzs$V\jkC8[ L9|qZ Fx$60P9%" <3@)8Bmdmnz&dSwkT $(/|[q|E'Qaw?T_|0.@i;k|ml2?\;"l4Za]W5 no{\7/!6C-D_#Ci\s;X_!_v|z x 67X(mn3 LE9Oaf^ tv_q D!>"uNX3&;jJ55.1LpU5Jn_HUYTg\@fz *31|ti=-n;20$D]klY[swQ9XY7y^5XC!!?=! iO[Ngqvv{^G|VSE2PM<*]j4V<-*;T.Z/o>\EjC D.org<*EQD3Y8G'? M 8G3 #.2t]G 7 ;9F(M-$1_mLm/\>nw60:.a^p)ujhiDu| sYjckL377ho_vvu2~eB VD#O%Jn}0 C9#{e-l h7HjL=i 6u ~l cZJDM,/lYF%:nY5Zd&4oM@6.ar($} )*x g 6m< #&\ t3+q,d]Kg9C f!i0^AzYI."Ix\=k?PUXFn9 Av.?ixRSq6EL"vci]2, nUt MQ8 K@V 1 ^ j{Vu5HH _|c%{ 8#UF_   SWERg&  ) a8cT oHy Z^OA M, ]U.^-ef Q4 V' _* \0  .MC V/0  _R o=|>o( \| M  P]/ xONhC 7-"<cj fV]C-`UA;Nj: Y3 o{N0rI GBn )G{. + b.:Jk %,7N+ C ?( ~VjhRmn?Ye   /}S=>tD' YN _ Bu' ,R:* z : ,  (|^g8Ph |t 4\ Yi w  AD^Q' @KB9^8 tPL\C[" T~ iDPMJ t 4SB'_u j;\pUXqPr ^]eqr){;@2f 9  cE)dMHtHfI$S @2k 8U!K%+A(Wu**`]r S/8], i25 & XFM!\KX - $D ]v^M?S7#  gaTPD_ -g)'Te`"?y|BQI7, s}*?F\W>P%lwZECK) d>zoQi K];31VUn!, LM ~ \*  7~z pzo.X ~XVisQqwJKp. 2 `{V% ^~KzjxM#K$Xf|qwJ-YG-;m }P:mRy)7 1 %E"HMk%;7*jqc eqH  m@/qU~rx wXc)U(#  " Fu\r:^Iox]ixe.A ^ N"eOkG|a;IJ^Q'p@R`r9y q]/NGtAF Dpjh8 o{eNk!C-s6>C=+< 6),56ES/6<,2 I%)hI']z 4V9@U&F  'K/3"B=k" T[=SZyT8f HLDN(K9TWJUC*IWPG?zu$-b+Pj'o?]yG])P ~VT|HprBfQ_d_wlSi>QDk4vsiC.rvX[RKBc1pz}u ^]Bq?P5GfWa#sb@~s^As.dgV` {dZ\nlhMo}=\b|'~i|';2$wTcZjnOwY[N.+ESJpF/C%'DA<Z(6O1*DrdqnhJ5]J=3A{5cJuj~pwcMl: 3/'  ;^s:hyoysXz^^~U]].!@hd0br(i.CkA .eM7@EE8 gBXJlscY%+gZ*[:DFk o:{\_AGHzil|{YdX Xc 2cU*D%F9Oz8:G] vZ;hVyl%p7 &!^fOq>C`n64aICGl1Zg>j;'&AqdCLGB?NF@C&8 bB?g_#X=4>:/:jOdC!f>X`}M/ xfp!0MLO%3Lmq>JdW)L$a}2l4fh ]gtH` 8{K<3;i:tXX$ 9% aw3hd?y*2!v11W ?'M(WR.(o.1^g)CX!uvPEZmf.+*TD@{;aJkZYD6f [^ &.T8EK8o}HVCE9' c+]qelT>nn>prV33Y  &jgE#B)U1N2f_(Z|25;w SNzy2s V&Q@p\nPY XUh)BSFM$Va"gQm~8M\ sQBlCMP1xM`U+M'#fPU0'}q;U;8V {Up pMs=P5kx--r5 afI%]58%b"%rwQc_yV& |$O  Tl7lRSPLt,f-6A{8GA+t$ N yagFE>ppgR.RG7SI)C*b'y7yVL$ 3(z5=HXa^uN'7yN?I []CYvYs(.gCRgM:3^i9}zh?0 Jl04*P4XxoTy_&z+F"=| tMJ+9Ewj+?A S-O[+kK S$kM0XK%)Vq>IuXo qGw%@)i8rZW\} *OAlDEIb[L +TmUpi{SpxVw x$m6 @ |+g!4`yTs h|hbZA_3:wR4{|:E3t _7g( 9OMT{q1nUNJ8H^H$7ySV.t-OcPs 7PR\`oEiZ7i9^+3&_8$]S+EB=g lW yqp n M ?#6P}g&/gD+C"+8`rB}%(%QZ,\ J~'EKUy1eo#mINM>CCF#>F:UR(hT0$F8&~m]WTA!3 2rPLFsH7rG\f455Un8 ihgUG!>$kdMC"JMYFd!TLNiG"s8P,[c9OSb@+X](@lg6Wh BjZ??&%M=8=i l+[40[acbwr &PRSO1A6#zHc5D }8DqPA[cPn ++ F8dBk+%#]'B q v@{s l\k C8/O/o5q;*C]ZxWR?\Vk*5hU@A$Sf/M >ttGK<`y7oPdV0WIDTyEXS;3X]sZAq"4$6k#p!uY!56_`T5m4d '!2W =JIG7kv Od^=wm-&ry!d JP"(c Lwk[hn|FTQ6/;"e `V>df$%|$f8@S j%jU@yi8rq%D(Pe_ 5Rh$j7eUO8KG?0rck`*/3 /3w>(_2:eB3Ap@01R H --0"K8S 1TCU(u=:z|lSc2 kGdhb#78{mvv'=J4tLcJllzkpdiAh N9D4$rbY6J,%?`c 6)_ nLN.q;FtFF 4y^ i3&.GXe5Mzym.|h|g%S;V U/3Mg ^A{ O 2O;OpJ MMITs~j4m&)deV`) 1~}tiNdDEiG  f ^ 8E# `C?Qb9y-_S(@ qcIkv>d/:z4h("5z& 0my 1yDa) 1 m :hTaTb5l;SLغ۳2T% " b 4a\cN5 TRSruOV   M Lb6bk&P Twyap31nU]:N &u u !###5 \ Hݕ]ϯ/ؽޛQ.|4#} YN eXY(mFyo l3Z H SGySMrX82$FU9;Qk%SYlp }f$;, i!y"N##W# 6 ( ۂ҉͔̔Ӯ݊DGD !9 3 7  RzjBZ5] ;V_ l)DD0_|m8n ~ ,~-IHHZ Swzi{*^>[!N#$%B%-#DJpsiٓ>gO>E3+H  j ny<$۶Fߖ9": ~Z k^z5LPFP.f5q,k)]uknV` ` D !/|KY`s" !""  Vя=J݆\Du NiE Cs.m dl)o JGx /  o  8x2RW >  !)>LpTE# x(4KOM'nb W X-ZO"=%&'"&/"hS FАPkK*[ 6E$gk # }. vN HQ7ot Ib k m ! ~h4   5f /Xc;wZMO'C U xEKD{>-68zYtA^an8v0 o X7a=/z{T#&$)\*)h'" AbWڱ7ɎnיuH  (  g z f!" !`QK0ޛL+4o<LH l K1q% P`eQ_;wSRdx+ sZ~Q 32 26 5Sco !]"""b###!&=ؿOx_(5 U ?8 }ߎޘ_{b< R 3{ ]ICoh'gG:efQKqzGVTN^t!-j dq )  @ f31 "## sjf#Mӵ5o'wPv ?j*TL/A!]<s" Rw iWrN>{Q! ~ ~Hp^;i$V_E_>%#M  @ y | f (f!! "#$$"p/Ϟ2t^ + !/d R).F{\G f' 1+0!%Oh54  ZcCp}Aq$|o@K B4u2j+O<&5V T x g D 9 U~ !W! e - t W+_1.Cy;d2@b}B 29 O'lC aj$7V?!$ ;6E\  ;ybP1 S   c"}J!Q1mXf-"C$/  _0( [V O !u"V#$%l%# gC:SܑzpL w Bi "X#")  R) zYM3 wF7W>: B9\R*8J   mxB%6d>mzuU)sKy gDq.!!o#N$%c%%&&;% :tw ֝vr[+T p"c$;%#RUl"hEVqe JI}E-gYP|.f'L1o ' . :Y,NH^|30*o3O9B &< e"$$$L$#"H"B"!T[!x(*_FiH j  Lvh#0&% k $Yq hJlz@Rv .w %P>^<XAFG 7 x  {)Of X~Z tQozE ? V hb  R"(#e N_?޶a}  %} F"&$ K=[# b|w Y Dru EO+SyVl ? |a`7L~V9fxh@V"q T ip/ m ! $&=(#`Cܸ) OAo L 9 | M/b `;<G>Pg2 W p^$sX0d 9nC(6-T5 {f5@/R"P3T6En0 ) CXO2hRPm "$K% AlWzۈONHV \k LR !m"y)jJ.B ? ? bTz:DV \,?PZn\(QFdG011h7ygGhhF| b { d ]mW!{,;J UH :n0b<  ^ `tz4%tF}(RaG&XXb@^tNi`2>_[c,r+9HJ=Pf\pYD$0s\\Jd35X4, Z=G8YBW_y} PL^uX:keA/]a8&SD.p*a2s{Hx]';nPK P'x\nc_D^Lj` LUvdVAF{h-92 )Y1 \0JfKOjl+kQ=ymFDGk/C)Y,?nO]9>=6 }:7aWVU}}0KV5`_c,XjIDWm8swC7tiE.'h 6h6#4sa>Yk A6R_vaay[w^qPD}'W-F<yK$[Q >PdlZ|B0ektcTD wl.BY/@9z7vN@Ms!s=@e /KD0 @`y!zp} ?b~$-sg{d2`ADF%V?S}6O{tGBz'4rkk.hD]z1m8dm.]`1 XWRIP0 &:T# A'+h//$;eoO0% )*&$U1 -@FLDYgia;kaDcvYK'0:Usjt{})89'(10B59zrSiy_hTFs9EaMYmtiafCQZboe~{o~Nqvz~_}g (   ,( &#,505G!:K9 :-!?7') 0M?=F;DDKTAUR5=)?P(#FMOCAXcnusjdkeD]Q[\VnpK[sh}rwyyioQVC_hMM0o4b\{1 -Z:os9jj63&~G.&1)[/al0.TLFdW& 9P{pD:$4(4mrq\iA+=8mWR\7/4%l:?8( #!zgiG8%;o*b_C f\|pLH=JIajQ""}w&6Xfp`N\FRi|e\BUsm{gXaGd~i~pvXK\c~dtz`)6`Q\h9bxpztbj~pny`gcnv`Y:\3XL+-DOyF kT`-|3\&>z| $^vA$FnWK,"}.Wpu7 eQ <5>?3^7HB}@8dyxe\Ca6^Ii!*c1"#:ubfAua1d0r1{K3F[%ESs OG^.d{oq5!y5y iNHNye~ xBclXnOs7Y(ca C8`H|7(mTb(D- .O=,[D&CS vK3')b;\}tkm=6i%3D  u<_#pE2SyYGDj"TRF yVvpkw>LrB@?h [z3apJea$jmdNJbw>mtqez"(9|dX$y(;WHt4qX!aPTYO:Y&Gz]qDo}Lt(N/VJ?d` X%8x |JHUo7- Y'S&wZ4w 'cDNzV/|_OWGQIYNb1aK2PB ;mL?ONP+jzFL!/AE' LRbTr_By]o Y Z7gCnF:xP[go|@4 n%'!f`g+$R0*I1y1hzADB[.9uvno}C?Z]5)h\VOVf_pIKs?W[; U1V\1Z0a'BPWjIo^NCO]7wDa&A^eHL{A,VV(b~9 ZmXY*]d7oq=?7'QB TK 3 F S; )O]1=\m|qsEH%r 2 M9I"GFV+4C/eb% 'P%`f5P: zRS~F}K#vq:}V1?[ e W % ; e 9zPZag 4)6Q Wd|!-$>n ^ f x oL4)zVx /p\+?_m`2Y[f}Ph4Xagc|*\X$"1KKK ~ U #b> o`fe 6D]q3Q(@GFe~| A k , G ~ YR;b -C[SHm.pZ D |cZFY>!f jRSDE-dR*$)3 { W u # -\'! rTچv,0 L  D _ +aB 3$*~*FkPN 0- y Ow(`5;)7!p J#p$5W].V[(0:D, V v  A+okP2+K3!!7 Q5vل) nE r7K~  Aa y `)G3{zXl'P|m . T|'vR^aQYMJ+|mg^|+HM` *%2t|n<O?9 " v D ' JD+^~z $&| űkR< ( `C J N B^DvBF!#  .E(tD3:P'iC~ KWq9<9GLAjW%R%xM=V 5 9 e d  *  $@0"2$% = '|í/L u  k." wl zuZTBC.J LV l f?<<G0WSKa*Dxne]H24Zy@_uq:D;6e J 0  ,BI*f_]Z"#U(sކ+ 4o8 2N? yMO "BHTb:?] 834 ! u3jMX+dREi.,5!k.*{__R++SI$3"|$2/ @ Pt[WID "$d 9 7_÷L~N 5 n a~ C-7,!*$4e*2Fc5 h~iI&ahOrml89bGfa)QR6^R +l   ; U"n,L;"e$$;c4ź$ݡR:' ]# Yv8 g 6 )_hc 9mXqJv J %At$ lLG-e!"  c&o9Q?)[*UGkr_o1,u\J x0 8 7p%_DKJj Y"!S8Ѽߛq c  j sE@ g#n*;iT ^_KG Z_=WJ'x=vkr9G43 (%[?7iT . H E e (=yZ1oOq O A^I ai| uDS_Ht/%:;c J|{d L xW2bt3$Gy|5)6]Il i  K F M haMaZP>rzX"N$%tRwdn.3FoBb wS *  " P"f]w!=>_"WY\~jcSBfTBCZUWxVYkrLI4 * | n g o R p  a m6XGeY/,r.U^w~ % 2f;LX].:`f)p8d2vmqgi37js<!;?. F?O 1FN{ jEu , Y 1    5   Tz cG6TIt+v:]L{IG;U1ODn|;*Ba>GE4`p> `mTYxT+m12.S3 {Q$iPF-u4A6TFl5ODz)O2kvWfBp_ <QlOC ZQlfQuG9 F163O_bn#A|?z_Ny+{WL s><+n1bd `\>"? -@%gz U}i.>;D6V ,b@7 fS_etps fP-<SJr(%f qZxH5964gfxtbVqW )=s}?R5tpQZE_qoS w &BZ ;_oXp=0yhE- ]&`Bv{ 5PfF 0Q H 1fc<?5'h M^ ] x*!VWp4 R*ho/!2"xW &T4-dmYDE Q DCU C 8XPsmG rPlW <j&r =j(ov D&ErsZ P)JN~ >6z MxWRQcQ  ih C s oZN!3&Cc Z|& q pi#E!3js5d Ws .~/g   + ^S YbHT#%P*8 m Q=b:^ bUw]9cRpyn&(7 9 &7 VENmNa7 !  fPh/ * FIW]t - +-~ w(;75 7A<Du4Vs} Vo4TT bL! &fE{5a(sP+ 3D5 mf@vaCcT(%ttTphNJ:;m 2zg{L0 GZ)c_ `4I<p[& lAR : 9,y 5#29'*.K#v Bo6'zp | o'c*X9VK-*,E@%aK-\ABv0izWI. 18zA7}I.P}B^S ! ~Dj\[r}'tRA,SB^zCJcGcL>QYss).Mi#*mcbVAE2xLK}{KC$uj:tINo$IBsjHu,Tu8Wp"7dRt6htkT')e 9v6:,:U8 [;#oqe\d};Q5$EWJ.}{=7 bwNp ,MTU k -<+  E^wo E/c/\ (?ze9??>SC>&p!=oBtu*~.;JCXZj_Fh K\1J$0q%w,{qh lHq..|#A`g1Rdrao lG 3okNP9c%;p'u;_G'>vTeHa/h5ED%RSjJ bf{eM;bL\R1WRpF[E:bGn/gX!v/,5)+(D Cv]W:_-,.1\%K/u& ^-Kp{zXve<>1C$,,9-[JpnVF1\(90/aim)6'E= o5N)%*S*;pvJqf4STgimpcleT7^o nukqnHVGImD2PL~j8at:*KFIXYDSUVaD0COQ0Rtid=6A; M9 If;ge3XaPWRjm\0ZCpugh`4~A5Q;@A|c qbEO2*=&D,) \ $ G 5 $!& "CX!.3& bvS{Ff %2! 7$jqgwU\e /&@%+ ,  b^prG ?cGZU@Wc,4koQ=Aive_}wnL'wI[8&>BE026M&3n'e J91_EMW`}MG`LR[nfoyx{uu<?EW~N`h4&!7L(Jd2I^\~\pzki" }osuO^i'Zq>f[DLA812OmC|wgYYkqmdCLE),_[Ej]PQ0'$  #%#1!PE&.X/<2Z]|lan|SHWRs@,NC90MW*+JP>0"=Q18 "tn\]kz}qVGro3\sqm]rYHeZ6/ 1 !E"B ;Iz`IkiJ.84%B#1%"3-G>-E$IF.RwTcgKJSc&iXxSQg81[M?A#1&_;7wT#1>&MT B?\u%$2 " .I48uG**@cHZ:,N9)"NM"]Z2L0CG=K?YOHA2INAAI H|E:V;{y%26gH ./]^KVXZu3[m \hKV]k/0d,E1)_gN"xh`UiX%^;ro<qiN&Scb24 cBX:%?xZ:wJh$P<@a%X~@C,`KFEwO$h _zpF ,'//at^b2RBZ;G! P QT #2p@K+/ru.N q4_?/?vX`mmqi @/M1g^ye1<ei FvzEUt)gc Y FJI ~E Q jbaw< Bj 0c~pxRxJVv/'b . kL;  OD!%K A cz /g f\3_ 8" /]"[ zq|W q ] 7YJE32 v# F U Q -6PnL $VH ^`GBz$*]&- m 6|TUFkbY+r& ^>; LB { 8 + 7,  b iG> p]o(qsB  oiaz? =0| uo 4 ` Q $ 4 KFIkd }}}TeV'm 03sve ] D 1{4"? %OX FG=yan%f S .e '\ gr V -# Eo}u^=9X jz0= Z Ec O"5` %~g&3zbxT7od*g`G eG< 5 ?irD ~eo rz P kJ26' #i " 5\@)j O@(t1fp' M" W01K2H!N&rtmJ"vsu9v&)An :| 9{_" ?Ytf&{-iJ\Q /l P,-r "qjGwEe y`H$U= .HGu}QI 0 j$R;xJr ( ! bC)ed *  OR]N<@ mHf]}u6- M\ WpCyM - PK SY% * \t1NzOz`% |LH92O7K82B`0!  "B t]H,'U2G4yp G=PD& " ~1eiD)vh''6Y. }Z a; Y*3Q ikmu # %+;dF+8M> 2\+ ( tz _-hZ Lu  5 P M%NQRD$rm!Rm 6 gW { R@ f5 id hN dhz_Rm Q $:^. 5$    Ar +r2m IqqrQ"I  ! ',\ m;m "X TTai+7g> !b2p,~ofWXZ d6d 7y$:cA ( ;XefV5$#ME7 8UZtLdTEcRVvPrW.Z*I7"{*WFRr L*Z8+E`Brg}8bU\WE  I s -a,!m$%C'g(&U%.Zkm3Z C>[  D }  ftaV_J&"ksfpon"0LFA_;   HY"W%F(-3^:"9.Z gűZ? edM q*V f3,S7ux8VTNmO= uo7i FG)k[M$9{#>aG37~ x )5$50r|L\eanCnS mQt&J'['MfZ"M&Q%'-15j6]42B/{"RY!־ږW}4t*U$ '+O,' kOe݌ie L ~ P4+;,PpVpR.[ 6 Rx G#'#6ߡ +|= y{2 UO!&8*+|+%+^,0:43h1r0(F*(QDA^ {+p3!}O*"  hs `;e1eb)R 9 N+.FUO-KtJt n 80 [ )AFqN7a?BEo5@X{B**MTDxmX , x S!$%7'{'h*,-+..2 4S3p,ݰ#ǵKmК٢ Kf ,)'$M#WF  `Li_*X9azD M pV_y GFA3M}#l$ E[ls)5 lNq & w ]  MvUMG!z!i#$&i(%*,<-*ؚziKh:~ K xLw\5bwBE8}t yj3OCsg [pBwcxrr)fp/c 7y9nj}Xt |Y|BU^V;7* ~ x X vlyqe "#QdTD@aLZm L )<L]p2 h-xvhCpm+l22V`I3x3 H/F6^\<0Ox~>K_8v!QmEgmY%ghH  = 9 wQ -f8B,N[*Y+lfy7im[ti!PT9aM~ 4+h0 Y4R1THT3&Hhh,Mv6|=q1GNHGJg4jZDT m  :fg\ 'U&{l rEDl:]C~WCqNX{'wW{?t #L Pr2Z,J F0Yr!HsnPqj>Rwni/H%  17E   m /$JQJ@ F#L@\Lhal> OiuN[l]v`T[T-MG5&Nu!F%Ak~ 3,9Psdvp*.F:; MvipT-^D B . ]VD3 6 @CVwc bzBJrQx`%ix^J04]l\SW]1wS[BAg#g6uk<'C042j<"Mp-vn 3 k  q ' i'uK P D;0_zAO  JB=9Rst_0rX[gPPkfg &!! [|";V ~ _"o4 "$"&6dy؀!`gF+ZJ) ]Y{=z,L"[`s  f|T?Kh * k]SrVfwvp8b;=9+)~VfX=y 9 lPk< EF!#&f)*) B^AQ\+0o_  k #,!/@ MAu ,zEdQ i jZyiMpA_1$>&:5  1Q`e$^);C9& = [R|3^XR V#%&'&{#ެY$bd- Q   |. fnQ)xg G  {0K?N:@l.4t= E5UgG`"D5'fPJk}/3%$l<&o 3 p\nq=!%r( )%&G!zJ}Iެa< m ; :l &6OaW`QQ D$V"NZTDek] G@MGI{,5U lK&o|;Qo$T<#&?UhO z ` : w n Y|VcZZvK R1ms{gNpy<#/Ea8AreDoL/IXAk@%dgtd~PYbjM,A en,W$k Q#D   *t  74gELR{^#U<m>[bW"'a e}&+#!VjRSra!eR\!PQ8 f<:tc_<l% t 1  : 8 hv*_ h.:2bKQ_>>m_v-uY@x %&Gfzj)uxGWv}.MO (?he4O>\z S) ,{NCe-\$g_WlMi ;AUm8\d@'rx"] b l  e " u{<< TosDSlM%udyxI )q(4{$auO3\@6NrawJBL6V@IM_%pRuZ .yrtW 7 |). d/ .G] |%]C= #?CKz0'`L6 e7X3#[z  oR0D^:Nbcd[) vM&P(h)S  ;v V +MJh0K|!"*#!ٯs< |-` }  (VyY&/ .3Q ua -W3D TSXuT 6r. $dWHh{c6.z W%X  pwg(S  nN3DOC^l!>$"QU`E5 w dZB #WYz*!fDm|(sl 4 D%_TOZP&="qshO[!@!oiN?1,1g- zfgkP|sx!P#VC*^W 7\ f] oq Vvl| 4|N>B&CS3iO,G>U;+D3g IIb/ yw>~l&{~2[_ .K1cj+U6u*" 4 k ] sVRQ<vg, ""6Yz c$ Q v MA Qp y^_37 I]?J|2:X(.%r!O;XlnF7 MDRx4 ) j ,  9  ] J<@N%?uK  zaa[.Z/%A@5B> )op~>` Is}nh`*DK*48Fc zsq#:5 &45B0LMAEFuN"4P$ b Y * ?2  -32" Y1;zasC[I KiOGOUyW|= 5P p{|bIB:U.z8 a*9, 7JKZ{E".guVhmz>/{p3G`oI{:GyY}mB _l@@'#yv6bS6TJe00|U4,NV?IcK,}/%V+OK$xZsSs0ZsHpzq@c?f z }+Z =S8 iVv$ p6r48 ?.jAcWp*6$pdka fQQ&6tVxve=/UJ $hC>j\O|.s(XeCKRIC!>W6<@ )l;<Um +9`umV3'Y :;%qC&B}n5?Wc=B:-OAI?\bINBQTlA=RQnQ6M?qOE n+ wFCp(v|LVLk{Ji,L`f;aoYca^YI'/+37 y $L)C-A[cDHEmf_ t d($I!%K /9PM4sp>"#.W9%u5_H'wU?!cv[ :5ZU"VH6^U A#xD rCW;5~L{{h6e}*z86#?n: F+eF9(*<|`'e^U)ar`QN{Vs,S; 4PS]#kX0 mpq [?.e2F[DLz o;_ P!<yevl:9): n[U>K+mn uW*;<wPL[s 9BMs%B?!y2+aB QI=V>e6JF;Mc~5mV$"+ <.EDzcuZO)WkM`T&8S:0a4`6T:KCsYWfm]8k_ 5!t+7[a/t!9ZmV I$z19dV^Ic vuu5g`Rg2HB  {65B:!:1]B\I oNBj4nfDl  &*~*' 2,u0fs,OQ Pa 28 02hqbY,tshCRPOL5c cfF{=@Lx`5Jwzv -H'&%>:X*+>xD{<4Z}O3gy$FBEs2h. Qf1RJ.:loK5Y w)e(NBBO]~_f ( =hX{, C$[|OP ~ h WLdCWz.L3CLMmyyAe"X94o.2bR(\pT aqe7E'=jo H  d )I<U!~##!Y ܡՖLՅ_!{ 1{a )G&( q A 3qR^d]= Q]UoxB>#-i(gQ2BzIk0cK}k7jxhnPYY(:28 _v\Y hN  N 5@>sf u#H#6^9Uܢu|ؕݲ C&aR gC N~5d^~  LXmyc YA99 : TZ]uHLex\aoDy Y-w$=2isGT.K56d TY: b.N" X @ r  J u{Ns!.# {(ڇf^N޶)IK  y   x9?P+ wF 5p|C`V`:q.& |  i (V84Oz ~; ]E_#'mh3J]gh+B*xip2TTzdZC? 8 B  @G k MH!8 { e 4NN+ /f54T؀l5 k4 #(C f  W,M^~ f _ |A6&gzd5Wa-K%_/?4?"ag tqPgjX)kKG2[r /{f2N`Hu!Ifu- q y O3 2&]gD8 7H+j*mR~B Ox2 Gvcl OH)J9FRe9 # i gZMl=#lAj l|:_Ousgv+k 1d b J2q W3(XDHXtq08+  r s s%|Tr? o2 _n d! 'Iq]A r hyT ic#/8Oa xB-ZJS?";0|rI8!3tXbI!]pa?ssi*vKQN4r"w^[C9 }R{SV~8B( Q b i , B3jPEA;@L 6 4~)VyCxJkBKo.=]S$97w i/d'a:`v?_{Q:t mqM,TR~kCU@*^?v  M ! 5   jP w(vf" `DVXCD GlVT '7X!Y/E eOPeX'i@$L b | ? 6 = 8   ; C :V l68HpC+P*7,(%+q*. 9U-`iZKYq8EnG'7>5tRP.m+Q+Dj'v F8}e'ZySpx4S}8u>  $ $pt+37-"Wtx{w 1#0p2BGzb"~d,]G D 4AT2 1_7+\OUva6U74(5@,e@z%GWXBp>C)D**xrI=YcrsecQr):~Ew|s[{}vQc.JyC *$ R56KJw+ 7B`{rdeM9:&0|u^`IEM31/HOSmq |l}|mzxvtebhrr}wdlyv}qn{qzzll}fnaovesxm{sszqy}]\Z[h]fwla]Kfwv{go~zypvhtoszjolhjmetcBqnr{zcwmz~trxs_F5y~tncM`a]RDEKI=3 .C`]@I$    (+&%.345EPMVBAQB<HEPgwny $}xsyk~oSv`NU3*/ 7  ugdapavS3 %$')%"'&45=*J?Lj^eUWUUbmp}|o )(IRaKKcMpxnq^|Ziassxe42{+[qUVG%LP::2!2 #-!2>));R6(ET.PMGa(1G553A88JRC!Ld`t^unsdg[IPehl[m}blu`eth{kUzir^mnnkf}kgw{a_a_ofzuom[ZebYOd^i_EZ]kZPbMA?*,(;7D?3)  J9,-;\f!wmqv{cCG;W0Gzp}}~ruo[efgfZkzpuz]`sKWTbs}lo~LXz{wtoyvf_bqovuX_`j~irohept`mwtbog_rOY^QU3g TK$ < :RyY2@-D]j!>/::qu  g,"a^GgMV,[A[rNU3-C- v =ut %eUACaQ NLZ ;a$cR  &]|qXRSNe~G,;D_P \?i:_gV2Y4{*)]5#wjy FOKd$|3$VN )`s[s>SNOx,&-Ey#AR`Qiz q].7jyTqRNuPk5Vs'?9CU/6/rg;?\yfbB5 SO!O]!.V-Ta)Ce IY]@h[Op2-R<P_N2"+?*&D":&.0L\F<$/*.KH.&b)HhQ0|^g6"H+mqTOM[Tqdyb/_$B{3Fybfqq4(HY 1>6,Ml]ZS=, >[*zy +uT` RaX]KH`&!8dv!`PFR2K< Uf3D'lJHx^ $Qw;al!pwx=Jf} K{ajyKr(z7(d?v8E/k[\*R0UbE)o|VI^i0Z y0?j3 bH:@0C)NAg( htT<JGtzb&|~P<G[}*{&S +8q*>(d-HD) `9"*)|EDQqx/DrhyCaZetvn*A=KsY@kBGR*FMK})KV1n!/hO& gO5m`!KT@roZ 2(THr|j@ 5h =:pc=G[x?B[a`zI/*>PrB>,rK\N** 2 N92} i6 UsIHhmYa$`Z1%! I)m;)Tf[KA4 bSAYsS "+'5H>~fG<;wDIhB\;PhZgRg;]3:hrc[br5|oT EtF>pLD\@>*p!Taq W[)c PD"D"]Gg 6'dx5]= P-@ wgXoYlOig;!wCh0uI>8b5|HS7%H& v`}tH& `*.$gZh=RPm")h-Imj}LB"zB@QP{ :EH<,#@EgHCcccYW\F**0KJKUE,QUZqjcTK=3=80#M(]E><2UL5;1AicJSFOH0/),)V# W!#8KA>: B7=- 72*?40/GA;7 "H 4(: .)3$*<=-%@"3,)5"9*.N<'/ /3#, %:J>?-%>%!  ,,&7"'$$    / 0  !   '-1  !      1'#(,"$*& ))" ;?7K 8)71?GMC.=#3M% 7C6323:5cK=]53&,6:93EM"8c*F>( ";=-820-  5 %  *  .  $69& '!-& G36:0>00.  &6 @ 6-)#(-&:'%6+((%&CI/A(7<*>@4)6bPW]Tleh^C\WGnfdcLuURtm_ITQ0!08*@R=G:M]OLTXdkuxsyYqvodnjqwzku}zxn~d\uvgluj[dvo|yf~kGXj`YT`yununzu~r~}}~~ukagns}vz{yuq`j~7KC7H,JB@LIQOQSFPx^ImDQf=9\fGGJy^NZ@TZI/30-86D51./,BGJb@HP_c?^frY=L$DbNH39\ZSiVcuZbU.oU)P)N5A#,>=2QY8"-WL$RE%W:42+%'C343:4,Q3)C:)#*N.-41^D<@WR&5:2.&%K=9<+H<P=.T<jJ>e2AC 3A+.Q4qjUQ5oXCP1RPBR7VB,M+44.NWUi;L^Ha3?/#U+1;!(/>T>;S;7;NfKMXgd`aX~OSmQyM2^NuMSYhuM90+:14c[[}IWwJ]jcKJ_XpZL_UcTtynkdY^TNj0IbSaNLQ;@M?@X%5NE_4Nj=ND>:OJWX06""-"<+@]=?22(#! #-C*#6 L( E<# $0#" &&$ *% $ p|}|gruQltkwmm}zadhZt{rqaO[a\ipd^ihigVgaRw}fuZywiYQ=_uynbNV_grk^`bU`_rukS|tm^dt{Thnosl|axpb{xpc{qnu~pi}vfqf^T\smwdWN^^~ce~dpg|xZxd;caedrkpidEOqx|Wsvxjw}y}jxqf}}t{~~}   !-7!!())0-<H#7'>:/./66D4+5/./4<E0>T7AEJR:IP5IU6??LSFcD@G?J:4C;29&/T,CV*@H=::ISMMXKRxcTNKi^g}ffhl{`aq~p_YUrWSaXqv~_kjguly}jP|qlSsonk|p~|~evxkmpocketsphinx-5prealpha/test/data/cards/001.wav0000664000175000017500000010443012771605033016410 00000000000000RIFFWAVEfmt >}datanhetv|k: P< -* Z3qwlMM7_6$:JTy#A$?[3NJ@cyv|f.mP|'1;Pgkm^)% 4I4* :  $ :A& ; $(., * q z^v[veRYvS[m}mPt||{zax`kl! {~F]z\_S=URWz]ErkdrQvra8^kXyXum,B3A2"S8/Ea>* 3 dkk6|k;svFpNqWSzqCLa\m8RAT+/7Q"dz.D <=|Nqu~SET PM @E$o:@$(xo~2eM ;V+4|\CW5Z:D&R}'d`Q:\OQZcW*>]cR/yjcNK]2IXA cGOsyH`bx*rr`)?l`ozfqbvuk~1C} %#U&3 [P'- -1X> 0 /c& C]E3-!LBZ<_Y&V~^aoLc"TlT=;wQ-{)Aw+Aqh5bz2~pURUvlKt]*Jw%^Be$G`YG? dl n+H@=PVqb5>] \{0~(R 5?UgDk4$ C{[UYz!sXX ~>UZn j8P StA}>"VE<6.<E~&rX(qWW`W~'j%(Ls H:'u0&Blj\*P51`oor b#8^A bDEovX*p:  +$>G)2./6W]BBE3(, +;+, *t[C;7M[A^@*D8.&J.F<AFJ5/9),,P'; :< |sp=!%,9#5 0%&&7 " %  + "%.ox}zdxTu}o}tUpUx@izmhPTwjfE[uVQeh}WfbO`o`iLVA4KJENN0Oj[Jx=X`Ln[Qpozqjd} **.## 1C6&">94(3 @-C);b5FK!BQ27 ?"$%B$LD5#+>"#M84" Ho1."=8T4M)*1pC%# '+>5(0;3/F,6!1&" & 337*3@ 6A-1+)39F &FH! )* Gd5 5:(oT1y}K/,BS_m(.gl@U]TVHabALNB`YzPTRtX\BBU)tsvkzgyd*yrZp9Oc^v`ehud`vvflmxvtwIfHQBvKI/xoNj }wxqNe\_cly{sh}JUu8nTscc\^fKVqni|{YV`woJ>&]D2\;OvGLUZ'.`D6Eqc$59Hiq7FW+:,Kj!= \!'&0YI'$<L 7v(E. @s? khr2 tc&'s5k$%l:oS^iZGL$"[z]`v %0V? S">Ct1 -J%Z Ի1" IVD o9P= !vxT+X j8]lyS_`\iSA !.T&z & \ LB }@PNn>(~kC W % /}c p b O7#@Z %&! ( z   0:F [4Wx^ ' 0$K =I O& z,q""_ k!'!*p"g%C&!! /I0hc'j6u`/6!|t #x zV/ m P i" 6 G0 FtB|@>[P  ,  8n ~   sS*9* n Q6 5 -POp. "N9ap~ 5 : a `+ 7 KuQOtm*9gSf'R7SNp/ &v(KiMt sDH %  ? / ,"*"0.W1 513/*% o!# qaR .BtUucak5+P/J0M M&Oe aכt#ڒZ֭6DAޜtݽ!ZyS{Ml.? % ?#`#}%#!*58U;4)I+32-=JH`3bm :fA"ڋPoB [ %&ߐSe}#X6U`uc34jZ~;Um*q_\7,J؝ܖKx4Z ;6_rU)|Y6xr M X%( *),2>58;A E<44A1I%'靼~˵Eq.p5+:  f+tL?+S"g*Ua}=QWQ[X-N A9[ טe^3ޔK"'4(2c ݵeJf}g qJf yP!&-2d46 ;<:=9BiII FqDs@;=>+٠qh4 <! \.BE :SH Q ہ١9dé' B` T l{=#o 2; }I(iNqst݁|ܦ`:r-_4wm[Fb N r!$&.9?>? "od[,EDkC.OW Z  )56d{&,G1 l] + 9Q@Bg< (;;PnV|xN>p~uj!KL}/q*RhO5 B H_@ ^c: x G iWv^=e$vEV8\21DE7hj.NH|u}s~#su=j@O)nVf-}ZvL3S]dG^,   6c@iGJ>6  : spHBaKMB,!R[ Y UvfL4`1URL^@6/Xhr \*A(MZs`D I (kfRCmZP _k*pHK`6 T~vmS7_P563xkysU-W@\k4F[ k ^ T c_+u4`  X 5+hnVAv\/c:+EmdX'>O<"#& |l~#-X'=+dixm+q / {y#(*+h--,*+,d+***( ]-ybE &(mSn?:M   , LTT<:ލTSi7nnxlUr x@!8a"`'X+G/3h66953&312Q662-03ݾN7j',b <+&rcV zU@ <Z M Zei< v e4;'/v)hWߣFtZ~ >(l-- & pmum)"(f.247::#;881~.C3;?;778#:zR  uj"7(2*v (IiL߹׿Q UIS{ O&`# JS": k  j~K/Y/NPrbEai֏~Wn-}+j-5lJy7 ; S  h"4"C!!!_$(.49L==:6Y5V651--24K!򿓿i?6f g$:< 8 #%f ""q\V_ 9}c_= 3-D  0 >bUT*SAc>7t~ =9 gb[E ~  FP(w !"&*~,,,--8,,V--.`,((+-'8 4Tב2({}YL3u~ n: R V vA N-Uz/||t4pi]BhDBcR R6z7D=1W& f Q {,r07|!c"#~#n#z#$%z! a Ibj((:Kw,?|6 G &!=^~ 2 ZKQwcJ FI&}OgakFI<N3\ R)  KJ6wt2  F g q <S4 W= #3)pS`6+ \yo2wu>g"=x-k-`Fa! qOYEdJMU,kV%"%fK_e-[Lb5m 8SKvC,7#v vj<([3;8|^e}+TI aI]LW"S u[[n<6C =')#k*D74%n Z=qPEYGVdnaj,bk%6[&Z<n< O- #j = (D&T2[K >%2Z~  % (DX."yvV,u%XG '7 B & J / # C  ZC *] k \mwr 1  $= Y T I  E F 0 }o ^ G qEX^ vE O h YQ  f m S$ aG 06 /  n   Q 0 q    V; ?T R zh   > kiy ' k { b  j #; C}vRLAjO{]5tHZqj63 g f  sxP?gn ^N Y8]P5 O *p.LN?D[:Ai@0K@#- . k!MZA`>Z 7*!R7'$Ap,>x@oN-ru96 i6>]9L 2f 0&?P:@9Pu/K%g5OI b (rBN]I=j5,U`}MXa9\ iM1\r4 \* C)Nj&fS%y wo4;6?|b0#t&8D?X&t|hx^[BeK1XY<+91tLE_eZ3z:]Yh zX7  Iv8OWT&YXip0#*Fd,B Je=Qra2:n,D"}$O_/ N/; ?Xl?36'4") -J&^/&>.G[Ah8h+A#2Ev}}9^Vz,',Sq) + y 7;wA%wK\Y\3{r `N[n _v{b"ow]n!  OBg/9} ] VtsH~s`;o" _  ! 57d _   A m[J#v w b f ^ L   f    ]>  T1 ~sT @  J }  $  2 X V y @ @ @  : n 0^ x%}5 >3 e I}vvq-J Q '& & 2 $lI  S+/   !  c h K . c(gG 8z;va WzNK Es?#,n^=(g~   #U;g5/*]B yLG\4~+C;}!0JA7:YG bW:IGOMK"VODgIQIsq(Cc?vIc c>8^6W F3Siqs\lpGnpBA z:gbcd?) ֿtߙ+. p 3 4?d YKpNގމ+^TY1 a q2Gw NSOT| .|YG$ "&)+)./2K44"63630-( $F-8ŅDԛޙb, pV$ t.$'#2= B=& nj\Z߱_0_ g#Q=o ( %i:+' %RԷZϧ?׊ߛ08P9@B>'=mBCVB U'W&"$i& ())(()t*'"!6%% 0kDDz!LmK0 3&7$ ! i  .Sprq`vh =H\  _`bדVg\a /fiV$ v+G*16ۈ0>[uil:n =.j s  _ a[_a^7!~$'()'[),,)&IW5K16d8ۭm UwD"2:!5=E  ' B 2  t6"%(l+^* '#(q+( !7 tZOÏqr""$9,W K?@cW ܽqR h!=l H9|G31 _ rs r (1<<C'Rz:y|Wwx)- =7{i V/ kSdWC.#&'&$e#"g#e!{A;7U޵Tfb $d:T: )ޕ ڹ1Cr' 8:3)%36=0 mVd w `  Y# w?I#&~:XjKm@p}dG \ E  t t]*c] U!D"!b!!!u@g(?q"8a-VtKs I H7_ S gg Wv4'8+:! t  C 6~ar D:=d+GNto,%0YD]Re3} ` [B%i9gKjP- T= !(UHqVB! BH\*s "? 0e@W* P & ,7i!5O! 1 G=?lUJ9FnB}MPibA| k ^IrQ| . c N ,i ?} (=,*/4 jca%9E;hM ' U4J/TIcnz7jK!rgy~.wcf9!evS?y?en,o%t8 {\[vP6"_{nhrY<3Gv  a  k @C~>-[{f2300tQp8 Z#PlcHm$Gnv & U|\py*^IPctL>V#Ed,{UbDfRpL Sv?NF J|@V&Y4VE1|! N3k= /IJVQ,3Z"lq<#;Mi5uT c6hq'ljKrWK~,Mj:2%H* vM1@<K~c0Sb[xX@W\nhd$><t7Xw ,-rMK'II^8!$R:5_N|{dln|rIG(0MG<wzIxrULLurf~^MnaG[0ZP:1WT3AdjF6v@f}0 C1Dlof7CjpZo\L8SWQ,A/c` -yMO.'g+5Z F1\W>(;KO5@M\z`v0C{a am .eGg.W&NX(qU%*swRPnSDHc4 d{w -g+Hts#k6{Kz+&HJu_ZG.Mlv4,d -z3v[!}X313GK8-hv-Z1|G0Kb1 p!@FToB-E4 lMj5;qgR0>,oxy0#*='{7`2ej|5!of8{s p`{),ZAp(2Y% a)0tq~&-z8 !v 87,yI $s8  l 3= u O~F>ul T;# jssMqm JxVg{+ s/ 1Iy 3 1'a pno#Mcx K .1UY23ktr9f+ZG{ # F3F wO  ]w T<Xe@RP4 )R 'eRN;* U[u"1 vi v JS |u|rF5 xsWS'wU rnr9 < AMnkX?rqgSx U} n!Yah9 (G?  3 ! E36#j` s WV\l gm!^3 Xa=Fe p Ztfeb0o~d "  5iHz]}D 3 BH C( f N l-j < & o 3W0 5-L= 0x*hg|# /AoLG8afAE u `` vM6 M%}f wi+YX .dP ^ra p"1 X,.w C8(Gnc Av` ( _= 7 }@d- vI cMtZ{axvj$% ]L $}%:e{N MQ3  V >" qp p $H d 4vO36 v &031S  n1]1Cw)  `< nI  TW.  sq'$6c xuz= K 4 xW2 06j%B9i< &e6R cn ~5VpN] ybh R\k5,!J<@ [ It:reazM) diB5I ($Z:muZ t2P/2TdS \ JkM,c #pur F  wO PEG|!s Ja7W p4<y w0 )L=kaߟl {w>N7C iQ urgIHQDI9n.7]}  6rH  Y k ] <)3[ x~`zuYt  Asl28Ng/ } )D D E1AEEev  3HZ oP|:SL @n3V^M k[ @)  c * +'|? V  1l fe&ds {/qI Alz0\Z%   Z| ^ i  7!9?`FQJINa{+(}}[ YS AC D G Iv @\Fm} s;E  Ny . !l ;WS2^%Se&) >V5p/ ]bba 1E:F<2y J{GZH Vj1 @n Cs  kIQB1$ i%=(*G ~N=<~TYmS q LL(  &bfM  AqVx4( Cwq3^x Fk C| 4 jWs#B* dRJ5R]%@N t Z PYR aw `- { /=:TtA#!b b 4 /Y ?BNtr5f7> ;*  d_=Tn8 C7EJg_ ~E;Y{d]bh; S H"hX%PVH {  gwA+)Q'd]SD$N9QH~%})NTJ5w)_3=+d\jtk{/F}t'KcL5G[u x^CNTsSYN\G$Bc }gy6KjuHPKK{B>c 5ezTaw #9RgU!n>j8b/.4#X hWz~'(1X[i;2r|+N| Y$r,[3.eG[J?[d]E0$<`I _rY<TJr?J6>(($u4M"GpRKBa1)T/wrm~Zvp4]I ><5ub3V@tQ-cF(- f<_i^')_ o )k?4>9no}79B#7~fVE!<#pRQ`U97(aLU&Qf](3\,eGYgtYi}|pPIl*y>J[& WyOO!7m]yVsn[qrhN >c 3,Ra OH]jzWtTO8#Rfi-M"-M-I W ;>rqOGZH0kEKTmkQeIt \%ht7g$/*)_+3# O{Y=eR|q8gZj.LU,w#Cxh=R5E^ A]2jZ\^y6p!l_<~IF&,LV,AXY<=!!0 - |DJ&)9X@CB/7|9MUiBUk)^sxf0KP9?1ivq{MoW4M$ORE[;Z=GVkTsG_RC8DOT+sEk\F9PIqm576  U0*8%* S!c{JQ=&^Ztw`eyX=v\PO6g@9!f1<r{bYWJl5KG?SC|`T|xCXlTm}o8=B0]oPKALmSGy~vQR}C2.@1M !5[ R:-=BqO)71qJc.EVbVJ2784NechCV*;z&SJ*^Z*}^-jirz0^}(XN=$|*[8%,A"F(D2 |  k(I$,(- / 9@<p=*K~VhvTvTzlU^ZLfm`L\S70;^l}u_7 T)eEW-\HNg/*`1_-DV@ G! veG<,G  "Ex $ roQTnbSf> GHSr,`[ \b)%;F:}fQD:UsNbec/OH?UohzqsZju/B#H).(0)3?!',LX8aO+F.S _(/ 8  !,@=Q/BTJZ\R>"$0!8E: 13 V,N&?9 JX : %9.3`, f7> 7!2Z+HT/Jk|,aD3-41BNu5H<2WR`T7C:WONtsxyj[[Q}q~  |vzlquj^L}m6>pD%U{U>_REKOI?v~d_ix5e|$?Py *X2H2_MK#$>GKXj,!+&TYB#79/ZOT@4|[2pb~>^XDRG7+M^3/;bE+zINmND`Lh &2)Ep78_RMG7bM5B8>9TVXlX6R|o;vaOeslp}fVrz|!F`sOy}*mf{{~g^horp} +?   oIoMc^LI0\{JV]%>DH@>)ybspocketsphinx-5prealpha/test/data/defective.dic0000664000175000017500000000023212771605033016707 00000000000000go g ow forward f ao r W ER D ten t EH n degrees d ih G R iy z years Y IH r z pocketsphinx-5prealpha/test/data/defective.gram0000664000175000017500000000010712771605033017077 00000000000000#JSGF V1.0; grammar defective; public = really_bad_word; pocketsphinx-5prealpha/test/data/something.raw0000664000175000017500000027332612771605033017020 00000000000000?edUIC3Vh}[9.719X'[D)*Mwe5+& AJUwleij9-FIW=VbABhT/JgQOOF)5+Bbm`nR0:1#1=9A<'$4LxmzL< a?5rvhfameQnikyYpsi\ZJ+<`sYOE?;m1  + iwMHb|kNWj64";/Nxz{gEtr}uhljvz.$ 8a6yxC;q_ZrY^`/NE7L[ml|g6CVepo{{X}l,=9cp4!TJ   #$" "brwz[fpz]P`:.5%)E ,zwsXqxmYj^DCL}qMJargEPtTokA;QPTQbqe'@>PAHbf7:`6/OH9baensjkxb  %  nvo\hplEOex[w7C[$)K*+Qyx|\E;CIGGUn~ht~XMDRi| &ax  $GV%,)5khFOO9&9;BEJYPPda$NXikj<7\Kj\.9YLNxxgosJJikqmwzamfiOCJTkchZ:B8L/67IVJABbjpjD\b}xXCwU[BFEJ`9,%+;7TL9N6V{hUd`:E|q@H;NH?pN2cYXjh|oemep{_5::T}FEV1)#, !)F.  CJJ ?=>Y!IdLIF?]xpIW;G{cxpPegei{uo||ZQ}UHJPLv`}{]@78^a8:(<!0M>0DB(-NCQrJRPZIB]Dmj|_]ihkY'DyZOMFurzQofhYe-:^R@!0+*2C5=fah:3X(3>/RH%9L+ZfiYPC5L^nuteMGMZKnjZDQyrB06 >NDXM07W=9]IMbbYkpXebM=R?PT&!BIDDF+H= 4_`\QPm,*<B2):@B57EL9#$?71" .5,hjNRqe>fcMjM@*DW1$ (-DB3,)+U\ ".8&A1PYKQRVyuDKW( 'L@+$!2&Dq[7VVLP7_sw`X>0rCB_ @ii]ao`IPw}xmxt   16Hgd: " !)! E5+  3*>$A$#"At_>KeZ.&'N,./3( |!0(LF_jGB8: '3$$-(&%9!,<205K %2+ %6TXCB3/]8?%!<HiE$J`\HS!%5&I.# &NJQ7-r2 xwQ 2 NFJrw{iGKlztr~pk~}kac}]5E  -  +%/ ,  4N;""FEIVQ< ..8*9M/}Xgw~[G|ru|T:g 1"&$(3  &,-*"' DI8AE%5#7" 1+9,(  3>!   3&- `s7CndUf{]q}O{P/ebD,$!=SqHdGH]H^qeiacjUJC3&:UN%0-LS@EYF=D*FBCLXwvdor`nzzcmsuj]\C43QJS;1`vt-+57@?:CFU??mRM<<R4@ )" 7T((.NI4& ,,0: )6*#''1::+O_HYF;_cx]XqnxLz|zdINIGW3HceXNSFPK<Ic6&`e]`q]Xmo?`jRi_}zQ')*!*$ @67C-->?-'/;,[)  8"&7(8G `yd8d~YOwTs{]xrX`P\YbOMd~zty~twa{ xpsHu:%U83M<#;CZ7 715D7>KB<40F)<LGUSd_HHctqAE\nf<D6 #"#L>45&69!IS99hiLtWmvoVmmTI</6/+;E<:MJ&10Ab[c7C*VQ( 2+.$@ttweE>_luL=xd@>+?S,$4CMb_GR_I "- %1  1D@T;U[)35=;'  :]`4<6-: '"# BE"  (=/9 7CJ'C' 4T.#,&{vVaFVKI|xtxj]bJOcmVk7<8>?Q?&! (@/ '8%.7.8%A2A6M0=W[o{vZa{xD88*?On]DB=:^``o7"@1+4+;(EV7P616&+6(B[HOYD.20"36-?$ v}z  !   "*4 %z 7 pu$!$)3(54. Td@bmQ^Nf|sO:.CLSgxoty~dnSWmOLch8,M^nPmysyYkrg~sl~mryZichqOkrhnvJ_cK~qeX}bYp_=powm~oujS`~n}fKWy`>H5! 22d{ta[CPsgzt%@B:0BncyPHLYCM`1!J7;xjb^}x;Nm~||~ot^h/*QG.5]SmUA^PP_v^o{vxQMkjumoY^~Zej@PjR9\vT>1SpKM7?_R2);<T[zdy}O]oqqFE^TJ[F5Q%CB+aMM\HWjWGIQZ7N3-{aEHa6)FUwsfYo\+.<;<J (aZWECJLU]c5*A' ..!6L9:4&,  ?SttD*&0528jqbbH%B8!/#@)3?H>1?>&/N? 7hxlaVMhebI95(14) D#& L ,0$}x[`pr{>1B$QhgS~rsvkxhgCOPGZ;CQj|iT`Y_oWO>&.F<$;H#,5Min`E2HTLu`qjO]ueW) %/$D/ )'ELHhFu^J`t^cr|popsxz~&) }v {\j{eqw{s<f7'/8<(,TeWR'  ET+-CLZwp|O\UA((3AG6'I2%/3YwgHb@, xxtx_jZ\jp~p  &3&.G17AicgiJSXgludRmVieRXC\{k\yr}vDUavwalc`N;V7! (+0?&)Ea`XA  %Okf7" SvzZds[se`ABO!2 oqX[gL46ReU=F/=acWCCdhk\tgp|$egk+5/ 6& 06?'Donb>tXhw^@gqxhn~gcR^asrJl;L[Kkc__[F]<1% _  (.:$?(#0K66@5_mVNF.JTWa30ADe`tkMC$ 0KN[E 2<JncEO4W_WkWyRl||ws\U]hrk[9K_et`{aNyvrXwF<A[upabWM64_VGH\OGsmC6RC(1-A]T`oL ,7$-$,*3/CNG<P8 #KML1  ,4DIiL-::.@baY[]@1& ST'0=40 !&*Wq;A2;;EjU.4QGG.,8_P6K_C#. 1>$2M('(+2AA))7\U%#48?RVAVS#' +!4 )1?`k. -" 2$fgX\QS3/S5 *?=O8-(*rzat?&&;@&:12"3&KV0GG7;FH;QgPR]^druj\\~oqdq]a[`wotQZllyq{~ff`If|m|rwrYZ36eOk{~}fj~uYeyt|pkiSG14PmlP~zv`pr  <EeNCI42hI@Kh[  %,?LN:7SB9rb$0:uAZ"U@qMlu0C+8A&_8V;}%X$fUN:pK]d!wcci&/|y(?9+>B%/[PsSl 3t #9]jG@?5zJvDJvWW8LNRlv6`s=sW~^De|>5&xS$k/ Ef^WQD~X47 upK\:P1|FM~K|4 DK ~  Lo% ;JF^LY3)rJi %6;?IqT]LB^1Mj:yWqj< 2I\F`([Z/ ` ^2un8Vg  >I"t'M# gbNe H '= S\X+#\jI] W7}w0 I~"#<,C$_?5z7T8 Kp [tE H, * DdXMMuFV} q  *- | 3 biQu40dK wuP^ov 2f %$  (@{aW>sbfv } * BMIPiMFKIgF   Q %ZHw9[ 6Uzx+a2Huh\5XmqAES;!U [$`'#s  yE'G~S]wX`Ml^e* ^Zh j+ euR \I8*u1&^u\n> P&&#{fCD T 5r#, QjOOw% V ^ [0VV})ug%.?{<"u1 V#FSl s' $&" w@ Y?qsdN}V/h! T ( qp \wxI0  ! H /)l u z-fR!|3$9B$<_Wf7i P(sP$z%! J Kd{@.C/ 8W\*k h 177A@" +   D  s  \|0nRm"52Q,3ti1z"GN9YS5Or jC ^2f\T  P6 xP>A}\k)[/  t0 .y/N lhC` m$;4%$23 N;)Kt ")#_wH }C!(+ ,))R \  }xYJHD7+i+ $  9 9  >sAYa"biTCB>`HHFLN2wz,jxxh"kd"yYP#) mt|u>c*:{g Jn9m,o;NN 484]% <la*>;r+;`CuJ"  t]_mVA:;]H xudp n #E g;T( mTKO i( ?-s < 6 h e R6{PCRR "gT?I   o/S df?~%4 T3hKdv rK .J:QdiL$T5:J8j w_ pi k4 4- TAh=kmS * $ul  7tt-ZK) m Ph PP"Yjb Fi  wsr;(z fB}'  E@CzP <5bqmE_ gR 0[ 0 |:m} !A  FT f  [Wa1FZ_+~kO 0 !g<'o#'xW ; _wc"-#j"*y- aJY:o[ 9)Y"(nIQ^A&$'!W)3:W,h6Cyj O R@%Dcp%~2 >% I?l!q'?J FZ!x3.nq `Gnz nQ $; 2V " ~s 0<4/@& k!J(XՈ YJ49Q(#v  t'2*=) O  uG. %&"bEW@J ك%k #$=>T<% <wnj tF1 O +Nr*B"(Md  L[p"mC V P5jxI87p.?Lv I1!& f lq   [ \r `"b%ROf"a|| 0zY Vn0r x?l M, BAWC s(y&U~.J/yn 4Tv( _]IK Pa Mp Gj,8p !ha T"]eY X(7J$!ݞ 5 qu2 @[ dI#;f1\C&]"aC *NY8E\'BH=q )Vmny?jSO,C Ht O s 5 jݐZo ,_ ! \ C(@|puc [tA0t 72+a?^6_CY| 21*k )W 3N " # :V ; ~DA+kZ OI1CVGX2 r`*  :3 *3 KPM), t f pJqX W " S$5@/$ |?=~.1:()Gx> T.^<#  O/LL+"$ {P R7;d: |sPg{W^ rsf /F# >Xjn ;^;myI@8>}_T0EL[ynExc3 < '  u 2~^  #iTsmV +r0 h$I i  %'+8~h C? EJ hp9-#F :3k{][5N4 :u 7=H LT @ lO ``1   PyZ$k  LQhd M\V*?dM4 zzffn $S~KAq2^AT-h m!!z!(Du'nd2Dt "_#@0@Zu^RQq $d<: b%|1[v%yt$7gL '8}O8JdB*w[Jry:-K.0r?N=gi@tAZ$5s~.xp x   =T654T"!?HR$(:j{ 5G=-#7$120Y)1 pycU6E@ B w !e6r N"E! f v$4 Q `L#V3=uk.882(( wS;C&^ dB/  /o#GzQ~7F  u S ~}l ^[/3_1.Ar1B&$yw vL +(6&:6, /4"A#.#Ub*V_ kK[A] 1Q+n ^l.FE\ 9 ^9:;qJuSIH-m:Pw PJe$-14{, gx hdgt!"Y!8: .nug <d V KaD ?B^ + Q ?`cLz 4Mq ()1m4v0 (&K<~:3@VK!$" G75`Iq0NG ~(?@Ikg!Iy W: J' $,nta5y,6:[5+S1?#'6F}BE> 2L;"##+ Wy1X ~&|t2b^60*  } vEmn=, 0qE[HFn{ ;"0660'ds <6i b $ $c rwhP   n! { PyA:F < ]; :;riD!K9o^G,K [%b)(!% 7Y0/#V    #rCyyV8=(P.: |XQv\ ^>Pe++Lb]-x;{v $m|bhioByt l$#!( i%$ ?)JteOI8 sHMn iT>M&r9b2 !i3KsvPjI.G uQ TX u1r\}S +(Lzx":P<1Wt  ( N @  ) C *)'lPEm"$:/ GgLf^+1N RkA#lh,D s}OYc #PZN&8MjoI5O[z  d U a Q4Go{45nB.Bd3)Y7J~RY{TS . D   Z va%z&C"mF?c]3b  NW\{X&"ga.?5!6<R  P}U~j  h0{%mX:C=O[PE3R O s D  # 1 U L y  Xx3EXQ lU'/.u  ;9A{=o < ) z1)c$(\{'s+CSwos< J  G " C K E \AXY&3j\tg3Ukn^+U H v 9%8SBF r < n .~ZK {e+.y$xfo   f  V+jIjL+OK+Na18zKNr2Rn+'27j%H 3  ud *$f } , )8@c pdH32^[8iH!' : p C J 3 ~y/0/EV~$.I 4 HvB]fQXSH 8# H,v6$c.o8gK + 2 ,  m (  TB+4+ il7"9l'p#}hO3;j v |?%9vd <  - ] #o8Fi6*`>"O1' 4 ^ j   W ,];,=K }Jf[>zelf!9' x ;6s E 7  X @ sLwLV}xXD%+>1Nii I < 7  , &=/Z<WzAlxuI%$-_3tg b     ].5@JE,cv.4T32 U]),   r : cwD  KEjpMiK6bm#>g;a[! k G A@d N  a  F6E'rXHNFoin[p=A- W # 1 U O Q r}I^[HY nxI9u8tkgK Q xj>-2, ] C$hVrC6Xr9H^)r9XSFLgV|szq ? 7 t <j\&)wc?(AI`b>O)scj { xmXb L  VB)tu.z,5 YIJ> : 6 ! w5yNZL21GA2w[|Ksm!uLwm m$ * 5k+l' NTa1zPw.t.N;=RKZ D d-`kr 2Jd|  )N :jB3 F 4PMnk8B41[(;V~I '2 _}' D_Z%^Q rv< f. h0[C=Lm+"^ WHdOP4itjt`aIda3AZCU  OQ,5~ v}TV0v4ZQ7o?D  ] l U*f l=T$(\ m ^ * 6 R0D%>:XMW  q[Y| kU_kvW8 q`Nf js%) @[kHCgC+.n w+ in% 9 -G;~Xa%!H \U\/k|&GQVWl8]z=ipU=LJaNLD<[Q=D9uH:; !O > Wg1{~O:<@5,.`A#   C xUYG|,I lZ1 7 ln -mt:w,[.b|XJV( q=;ejubito-sPay  F9s.*`+D_;'+(AuwkH+xIZ4&rkL5BP_ T'Zd7^ {8,{D,P!w?%  7vDt vMM X  `BEs$@9/ k6 s/Q &Zb{ ,wU.I1j5~mYh?1km${adI\{9 da e sc` |t? x j\Rhmi)~kS (6 sL ?(2 T,c_/l~k1F~.}e2[}F9qK&6ET5  BO y 7  a_ s 721d1Cy  $ l<}}+=D>wbB#7 -: l },sjUnj/n>`fZn`2*yQbm;  &e 2=9 VWR Q~|t+1n -W !FFYrW 4?`);T_ $o)-P Z  =;?JC3d%Ix3r[,4!^#-;TN7/B sKW, Unz9iw'$@)mQT B+,W>Cv. ),qL}7o0 Y l 6f ,NzDXByFV'mij )"_{QD l?GgR6/PSBCt NDlGh=!P*a z{Bp  p8sPMN:&zeQYZ_iEj*^{4T 2 _108U[?xjAo!m%\s@|xkC}g#d5{-jw:tD96) ;<i^ e^ i W:L6j'o 9m ) F&M'gs'xM]bB|t7 E A t]>lU _  @ ,vDo$ ?A0~C>dB3\[_ 1 O w 1>j:/%% `58)@yRD;0$WO9+G8;m|H0 K 7DY W7oK  SCjE[_w WxG:uryJw)Tq 2= #-e :C#I&/JZy^ +F,]c>%`k\/MVz9f ]h, ^W*%\tdceN-q&Y2A E(o"9 2H A& -@ ns*9L.U0q $!]8 O/?8vg&) y!;lVX{~9 h_ AHpi9lelBtl "o=u} n?Bp \1`  f Q ? ,jRSN6BMSeMA;)zq*2(|Xb^?Gm? X- WX\1U4 byX7>e T y 3~}. QyTQ H\b . {  6.$=x]q55+e-{eR;"Lka%rQ}!@DeDu[{6 }( 5Q*Wi>)U$tz<5f::twvCm\C,Y^_vW+mRa e < :j70E? U`@< 1J2pX_*O%35y258 i )}4[g>?sj}/f6x&,L0~x/?W2,p h jj}`9ZDxX H 4j[T S$a8m0-}w4gN  ` _uB,wFX{7Gj Nu>51thJLB?i:#~;$  @jrBg9 9  iO#Z[6 ( V0&rOj{|U (|uonpi?8;2 Y  I5WO;GQW,a`D.xVnT!;*]J~Yb<b]4'J =wRqe.4|1 / 8bbs m*-4hznTf'fry6cvr5H} {    )F` eCt Lg%)2YTLWz]p^ 0'UFsjel |J{  T5,a007Q\ _ = Q<e9'3  l,A}'1 SRq9?  \)K{ at )f Y_T!`Mj=K4kgWl}&/w&d5e.kNS&\ AL } Lpq  c+p#tG( At["T[,G,bh  X jJ)|NE8Y})7 GZ {PkOb\ kYT_ dKX dz-5j'v X 4b0@ q9 Y P _WG],!q7^oRB0 HQ5YD+ll/w m#U|-} iE21vP6EN13 I V\i] cI \Z fbjg~5b1Ey}2(3oAFtK-"HXCfB L owB^?jW:\z^R8OX/mAiOlE*QA @WH 3JrIp,)4D#uaKjs= K $_AJNXY^/AJr? @ %EC7I^H5E0VFap-E_UE}P3@]&P(tA6d#R msm ~ ^s_Mk%Ubrg&`l&15KZ;"I*$p~XsU_H Z Cn)$*L1aT uM;DsU`",{4SNB N U G+<(ia [b`w*QY8OQyIkH:lEpJedq.%;ej ug fRb=1F:"G(#L]{1>\ L19qXv 6~QZx ? Q v s -(YhowH?: yrCz= T!yg+p={f&_7U'3xn~J^TZy=~K(p{I,0CX,TumE`)* #l- 9 #  X  x 4gMR"&*0r5(A~^`rxZAcWSKANqy\(j|CuM%[^x9WXp1DX*ABV  P   ^ M =bIbYt:Q[kN|WTwSUYH'v 6v/^iaS`gW!V.c #jD3Jf+bq?~""*_Q}Y4j g&H;fGR1WnyUet cVi5]IHg{ae99!"BYCf<7vIEL &1+2- 6"bW _ v 9  4 USXiw4{LhXW"kQy<"4x jj r""_\14'XY5l''.0 knZaS P<#HMG {W5~ g3 ;R T!/3g gpv=~kGk2K  iDPaRxADU} x-FY01$@8]hv@KGV^%-INdz^jADme3_}S; a?'!s.Zf{oz1Y0&\+x0{DvxW&+4~/k/)-<F/GxCt%=)k9SiD(p(=B6=&|< lU<, 4f_l;L[Z(>FMsn, T`Ls1z2hR}m' @"C>5kT +k5w,mj(PWQq sdmynCE5>MH  /Jbzzl<G/:/%&k8x`A2$jr8&<7S%ECm[n,yZCPH.~r(ng9`*VrvoheG{V6i{)H:[qRDS+7G9/ 07m~fumQ/Fnj}as/$vTFDLd^xi94".]66,Itdjpx{kj%~!{8o]nAY&Y^>'qNp*}\=p#r> D, B+7 OG;wfp:NdfIzu !@H'${9{,h=MGU *[,l   ^(U 7 k  gZPv[7$T?5o .{d1wQnP}1[ f U d RJ g se PX|qu]] D@:a($s.L)t"/gs!bAS[ M o@ z9L?  z OT#/g  0`;v5 > [ 4u p Bm;bB 2^n[5+Cj^OJuj]hj7XGiFj G  + +*I> y  3V$2@&mc6OoA>047QKr  y~ - u lmu2/>L87[k&@ZT}8<`;C|-yq  bg  TZ  |mXb}q;4 Cqsf'4KP0 _ &  2 NN=yUFxJi MrSj=2+ !6 Mlu) =O5y+ VW 0   } 5Vs/+_mER$}% >+ { U { ,pj,u%q|?t0ai@J\J ;K"ShB/yDSp2  e B, Fer#hfF MVv"`|; n 2 (2s $ gtY X u.]~+`[YDPA7 m@Q  J0-"~ h w # {%j  j CC5{l~ws|d  jW =~ + s <SCw3"UQ]{17|QFQyb)$?ew 1! ? < {  \   ,KPfZ\)sjr9#D V  M 9<  R,*W6kFc\J;e_7`i ,(@c@V fEm=` #$ F & H /5 h >KxQDK8 FQy.  ^z 3SS, O ZB#g]_&,HSCFqDs~ywN'xp\ Z Z [ C ){ [rpt3y{5@c9@e3D}Z+ @ I -D7 7 c1 .9Ng3h,@`9uBG filA j@7R)  r a @ [ h` M|&*{fl=#|9C=@! }?" N H2igt~WcC|@HOGbG@nOr0y}:7 bvC A  b $ ^ gy5/]8O+Ui/S9q:A+;%U%Jm>Q'r*~:!Fb+mr$TRm@}X}/gX QxLBJI; &#u+#I%8*HSPJ:& h79Vt'CR.RNxrn hhB*7UF,p>wm  ix y+P ^Hzy 7-[j^ P,#I (* W{Aw l0 [% 81 l  RavA#X+ o> fCQEܬl435[XhJH "^F $m - F& ]Y R? gjVQ \l,fhdXZX\;e12L " mmw D l#'t TCP^Vq ?;$1dD  ua e qe[f9,Zgv ZFs  cpA_   8Zx<Z2c~ ^m): ch A D$ `hB8P- 7} x If7 al!% ]6r ] &>z%f EQ o #]+] .tex & ;~ MDVRB| (w# pY.W0 kx  CNe FH ng;)nUA+j 1R0CV u4vp yU:{ }; 2 TBj K+/N<'*l } nU. R9,pzq  zs.Pev5n 1s]5r IT wf h. ox [@>5\ ^ p.i`  T M ^VZE( M $@  ] ymT U g` %  T` [cr KI/Q.w 7v*Uy%xrJ  k h j#;7! nC[SVRx hK=$=25,C n d FJzd}))Z~ z_(gD^Y^?B|mJD y(W gMIU+ U7 UY  { WT y wS"$jO3H/(Hng0 m 0P,@/ ^uhr q? >db!jZJ pN) iG   Sr6 bV/  {3x1+1F7< d x` .^"A . ?Z| _./2@$ &faZ% yO0M   9jHq keY !8 r&d PVf : m2 D QJ wmk  7E; T?_DolmIJ @=XV 9d OthHf- U 7 ( UG K 4 /a yxZov: S.Bl O]`k \ E6 YZb a*0p}j)"y I )c<3/SlX FNw[9JNcPPr. RIH+] 7Fn[3QWRI+ l0 uV)\u, 9bY"QuY4 w  h F:,n`(3Sh 1OArE1KVQuCPjp?2*}HGl0]*jK&(E.5sM !93Pc]}m0&]1UOL/(>"\1Y]LX0lA?JU)cz4|)/j$%*x5Ii+:IJL>;^=4 S|CzBK"Ps7   ZRFnV-Df .Rr<#+D%/,g*\K  5cANESScQ  % $GW 6H7.C'R%^5}YXyN[ w@ #c_'}GTlgT {u&%}G_6  L42   $'$Q Wh,OBfAin %/Qx z)}au4L|&r : ;%FYGv8  B*[ tV2})R! \  : bkP(';XRz OekOea*/*!<rBPdyRtb OFv{b]G  F _3sAmN= d Z YNj ieC# @;*ox~*pgM@,15BE sI# i!l 2n*i#[s X   ]J:eDOV S k  q 3YR3E` &  =g*RBZ2((#e/w=a=OLynr Fqz+*[Na-1 h 23^ j[nX vs'?_=*3vNCH E_B'39MR[O  Q l&t %wu7 /!/@2 F/Pc=(tS4PRv "g > U_Z_  .yXzB>&F | ^wJ0y(qS (R/  H ::9s 0 *oZ2!{f"Do|[aP)2j3%K[ ?8   >PZ5a  a T  ^eGNF Ab@ rn:A~P)XqG2=Gh&iWS4[#E gh)TLk1vcg-oQ)ca4Rto wM'D 5E/mjr?]E?cdC86 {6z  a5DuH4/Cj 3 yCRgD|tq?lhovTy!'h J  wgY 9?M~DApoxcxSw_2%<dx*sE@^U 7wZAqTnW~xjxa@+HlyC@"| ]W E 9 +  i _ @  _n>D`FYCEp >DZl9v?KO%j;D ,/nN ^G>5$#(%0kTtiS3@Tho7j= H M D R / ZZ!hq5U; sEy{X~lAVs8OY jqk"}<;hS@]O(3YP'"HzR~'?*]K~Ai".%SKw<]JgjMJ@pK2_wOZu+=;k(s~}"{_=ts0"\`oD;kjyg>Xet;+QvXK| ?g|sU| /M=LsxzOOsXA;=*1:H/>N]N,3SH[.KT@BbeN.%FZ: Utr,o>G<"@}o^U LYZ8 %2Z.6u $AXi ^aP=YQNgy ,902wz5y gjqw$FutsdjhXf~Vnw @W[opjFbd4#!/(5FS^ =2Q~^qH%2*eCXI&19m''(>:;UZIfsM&vmGx3 |*s:$RiE D`CV F/#CU,l |0O 5sVRG~EHNC@?gCLU6G'`,IMS0]e8pNo#'r9<_qzWn"br|tvVDiVb|QGSd 3n.(|m7r|op~2N2#O,#0-Bm)POg@GKMzh%Rq((SxzS0q aV\Vun[2>bx7|F73<:z-H,L#ySIp%~rpMwE)"a[Q\+y&b&$UY` ((V4Y oL(t0ID goI#1-DX*topv1IJ HHi/Z5_f?5,)w+X Nk1(u&Axbt2THf7(&vm$}e$,H!:wLotaysq\ :A**|;-Pb?RP5c=wK DWw{*q MOns47IgS0n=~5zz I|ID1_.|89+;h,<Wn-4,/0X  lTTA}MzP:diXhn9'k=}C^?2@:`&sIRW(:< ] +RF&% Saa2a^eG[y^!\zGpUF;8mg"xz|k]f[ }Vi0mi(zR[X^"SYy<]]#1&FeL|G3Es&uV{k*9BD^Eg/DhtInL&&)inu2=UjH4b@+~GN1U?|*A%vVO5jmW^F)aN C7l /+?]z(aC9"|A9a<}K[bvEc Mq'= + # 9[Ea[j ]x%8 (k T_`nHo 8uaWM.{jMp>(R \Hm1{x "  -K6pd ?$y$]qA~lrrzWz 9yb=%DWZ |zlI,O Vd,_'@nJTh=`/e r1 RW85z !jN-AX X_$$}D QS _ c5 Q{++ G *8XfzIruy?;*/|iyb) dA-h  PqRcF6=HkbPVM+c'W]+f5e cA7m?jw*Vdv hmD\r:4o , * ~'wKn@c xZ  * +j3z<mIROT^FK<u9Z`GTVxI^EV\yOw%A[ `cEgr9GbcL: Dc+7 d' Fld&VImC l[  Z?g/F$3b MWdsGG~bd\3iPas+?HNwn3 s#g#1x]__^ P6;[04g?R'Ao,:S*N2yH-U7gP- bL MD-5 [!)?hpoOi/axhyj'%eCvKGG-}#p$Cv\ N<,9sd@ M3w}YYV]8SDk#L7.4Jg=Z 3k p n7-Q Z ^ NX1jt#y6KWo?R|PO2nk2#0\pnQ"f"k,-=C68m/C BnN"Nk8S] }Tt^S>8Hk`FGFX_&d 2 '+  R)Z2p,Kg^~Q3Ed8OYzDsbpNa|}~iZ ,jBZnhvu;xR6CH]^Sq iQI@N  G &W3`W ~F~X]3xt4 TB~pLMDpE! mjB3>\S}g*/5P/H 4pr52F~]s**2NSs:ri`l^N|MRGT _vgW?//L&5 tKRRU`pJ^v2`b(4#H iL|bw%wH-G~Z l#rXDZx,)$8=SsBjt,NR/js }A@?`-"!>'opCr}-k#.udw[s2& HpeJ>$!;;d/_7[Jn_"F^7"x(!#XxJX{ _#9~:xxE{7097Hn^gv)C'*!g<&w}g ;j'O~ 0Y%C>'ti]C?8q_[k9Jp6m'} Y89P@FH2/ZF P3%, hah<P)BY7ye0,3b=qWD _UivUJ$2fU,ifQFv4Nl"}5%!JlgX"T9}Q04iHVvM$L&\PgPzb:@kp4o=$kxW5V}i=n 'ZpQjs;(LSnqPB!e\( Zo)gnIw2L7K3']!*zgf11 ta74 r7ax:gf<)oZI(<6 58!Rrr IJi]Ye-03Vp*D'VQotok\dlA`gF,OiW&FmT,VLDDTDZplxg7?M\x5tUBI] BUJWF8Z=#:$Bv>sNG5'[D=$D? `bZxI/:W&kBfe[sw=.1 B^FAO\wwCGH\X5. 5/-W*E0! #-"(JKGH1.k|DLYA@'8#dIAI*DP[DQV;$&;w~(:ESufy2*^vtE, 5IReXQ^mC#GY$BF69) )mlbywbt9paz8&D38 |gk#Dtwz`MS9`6 LuuE!#92VBDc=c ~ ?*-1+:I'*C]fTC|sR|v^saPEeg!\zY\_Y;-3y& 0l$ @VVg3}sA%$  r'Pg:XFo1?(;9l. {6*~MEX7ja99/fn+@wr& [ mgYT:dWY^&dFNq`3?M0dr~iL{m]z"jbRB|< X1\zZ7"F h-.5gl)j/+,>& !u+oT8PI'r'./K$7/ zujF8oc2'nUqJ6YX+[1:Rrl,I84'1sH [ @0'nT&>'81$B!#7%Boa?BliYv.WIrV:6kX5fg[t 1<:;CfJ\UbDAR*8*<b\GqH,RPoJA#\PcLt][@*4&>B%D4HTIL|bd[=cf6emi}ypdY7P<__I 1NClO Vl_ 7CEGL\Au`$E)3 J6 !v>.Vtgpu2F[QjH:'7 1!9Kvl#L_Mp7ruEzNXtbgy;1nLC  2F# z]vrY UW()3!h7fxt~}tkdx_k :C7#(83 >:!>sZf0MbVweJ[<;l`J9&6=OWywze=/1J\qr6!phTTQ2 -9& B,'L3=F =[RUytYDXWLhZ}k^uxmo*vjCUfdr:- 6,<)  8$tx{cnft{ON;Skr{AZX0FcY?kZblvyrIt_EbeQace\'SL7@Ds\$\h#:oN6}_.+#??'=W; "!3*Uhd9/ !&DUKD  2= +.!'.2!F'1KNLHUEBF4\u]ge SjxL[m`7>5~|  Sz& qFM}\//Q&bW7.-VpRG<E>IHUqbdrf]rb^GH' ,@/8- 7_yn~h83&?J+ #  ]Y)1DF2+ -TmY`l|h~zhbwebog~}qoRQXURDhzkLps^c]cQEL%Mc-EFz|\IEqPV4!7&":%ADGX96\hH? 3=OT#:k[;BSH+3JP:M> $&&6+" #/>4AUiSSrA$@ M,*6  BV$,L&  %  Q^FJhpQAc^Kr~j[PHHSLPN?F^cC8YC  -QP#+(1^W::/M`L?@2~A _vtz|saJ/Wq4Su ># $+=ELS>3GXak\arhrcqjwvry]RwrX|{s|~R_OEY=H+8>AMGdg;!#%21C-? w   0 ,( : :P4Uqs^eT"'&& '#OuG<Wzqaf}|kZfsYa|yoqmtc~`ZcKJV&)& }kW-+'PdfVTfG$"5% $ != MR:4 0: "67 1 !7GD,B8>$  'BA ( $'. #&^:--RdOn\2ID:#\sReu .HZdW453/(B7!A4BKWhkz}\Pm,J`b[zqaq{{dh||YnbNeabYPOpwlZWLKmx~m3 cMO>YbVV? E*5|  %.DD3;Z?id@L7J[OcdO;!3IgD@n-=J/:ZC-8bc{~yoUVgsq|z[u}uwX{i{s~cHuOA>EKUb]UCbQTeF$08>@<7$2 rVhE`mA\s\6  .C,1YALM,7@+TQ*>EH@=+Hf>b|X}jbaDA)5E7/ %2JRlu_hgn}s|vhRSh\Xlv|`tqlY4jqjnhulD2(-\LVdH\ $%%81#.31,]qngF;B7*QjF4;CXPJ5O9!,N@! " #wkocx|Y_t &%,% 2nvzzT@G,.PP]kuWzS  s~bOkGA_|jpYbzdV\hcfYL`2 ) $   %"%)p}mm~ONP~|^p~$%>6 =5 $'NM/ !   0> *;7 #._||{uq{cyHxkPioWQYimz_owk{\qnb6KC/.8>(1#$ &>\X7!:JFPZ=$ 8Nbu< }  &=_kJ(!$"& |' S<'Hyh~vsYxfnxwd{n 1b LY^YM%% " x`~vyhZs|ky}~Kiy[f<>XHqaRz[qvVsWBYaA*Smtq>>_ :Y=8TL2< 460NFC'4  %4#;* " :bL6lKL%)7+FK<A$I^0E>4hJ+6Nnli38YQG>bPC. ;1B ''',%&#)1.'=&1{w3.+>_ORC+* M/ ",&J]R.6bll8%JN^_hZdr[[ZsdKnqt<aDEaiurR7.&\gh9)&)67%GeGWn9>FXi~`uuqtio[:q{^@8Mip@<+.#Hs`CmK>MO?&%= "/?34)!-2 %%!/ AF*!5! OI5.$>8&C*7[>;L^~OP./(33ojGK+/$ *2"#A,<Sjp:SjDE<.=<@OgYV~\TbTL]a`^Zoc~r\{`yp\x}jg=Xz&7C,]pn{bobFOabmfIP|ywwY^yva^ohhqqF?6!*: 56BeUieqyM.\SrrYG56Dg>A]<zy{sxo_Tvlzwn}[xo{vzpeXFE'7J %(CGJ^D/EG>+ !&(mwQl_4eT(K %43$' 8&;#>C'[ro~mE9. 4 "90AGVngw8,  $*90""[T6=x{~z}tJ:KLsrjx}#& y n{x^wwdqgr}|cVf~ydtb}&Pwnsk`zsbp}y ~szZapG_WdutPzsTks  E509/#/!9O7C2H2<1<K*"$.$ /I/2:",:VvqoXM)9S  $D1 -"$- %}~OBCJ8  6@>EAazd_lP7A*4"4A>K1!& ::%2EP_L @=01)=#TW5'F5(%"!}u`20PE?RUevv{iFAVPBQ'3D9WN8AWs}y}zGP]HM>B4H5'/ .& :\gL)IFYS$=\((74?DOHF5!J]Nj^}qhN7.55>C#9E%+9K:3[O=$0 $(H<1(@+3D%&%$ <F161<D)/ 8R0RnmpbaDJSg^XX_t;226<)/4CX@** $)CFQ_VK*?F+.2hSQY(%JJ<*'">986d|}w{[Suolurz{wS#C*1L? lWne\tSD3 BQgd4 #'  279"/DE+-J57ZSJrkme[JkvdydH031FA,7-.Kqay> >: %2.*J"-G@[P^pp}nntNAV:68L?,0-39KPN#  ~Tn~lbvs]t{DXcs|x GNL+%3 &-#$ &',!,.D=WQ'/."/P%5MYR>Gjc<MdND]@10(0PQ!F<'IBnpfjqz]{erub~uvfY/1' noah]ndJZLl? M`jtOw|dKmYHgJ2?cO9UcU[xiZB:Ppha( @7K@K\E-(QEKZDJ[_bRS^:MT/)EtYH~d^vhj_Lsvgf|rvwhF7>LO8 !B% ^Z/),>/)^\MrU5$ "$&9(32393/()  hOVAS_WR2."EGYv^NK>fSIumnI.Sukuwz'<C+AC*O>9#$;/% $JT:$?BB0^tKb~m}zl6MG&, )B&8/J{M`j`Ra}WpaNM0*gw~ '.#0 )bzq*~lyhlm|ooks,.M8GRD_3& !J(/FFotvteI``4E24cgugfvt ,% { (#"xsW=exW{~## pRo{k`I^}VOlc{T13 4--FO?$4ACC*2 @$ "*<A/^`O:. "  % amxcyq 4rOM>;i?_su~rviKqj@Yxuh~  . ER3/Qkcussr`rywzVd}ul'33(<J!,*E=))",=G66 o`~HuedtzY;U6 Pn@,#  $ fl{ &! !JM;-4/G,&& 3V0,HPDAddgMZ47BY)!O=600()OJSc@Q\d' _lXCixXtdaP283;,"Ck\8AMDHM5" :m5>8 ,O/<F;3;eW^x0;?RaOy[:9:">m@!.#>(-V509BK75%"2/#E;%1 x)5$1" "' 1L+Iogpitp~q]dx9"Jf- 21fmzbywyiYrgqc;?U;1$##Uz`qtnn_qztmZ]h_QPbWcn 6# ",AI[WVEI/?S ":5'%6[(&#;4@(ECSP/Za6, w\bmxq}uYAewir}xcA4:LX11Fq}z(;CNFLXQF8SmuzWb~bmwxP|r[ltmLhcXNTgliZOgw}|~adMIWnhlZ}tgfvOEdr puV[mWrXKd46E1JD%?  + $2Ub]@ALSsys_L-4<VW6NA=  @NFGEZB<E3P]^eH?8#1%&"Q>:4:c]T:,6# 5WhDHT 2RDXP-. #"#;E* )W,?BTmK=D&L7 %TEPF ?I\Hq|_QH6.$!8<$$ *  /0F(;QXK4PQA/7 K<Mdp_\fwsohOpmy6,:##  #{~zpH,"->NPIP:^qJCr{W|p{`|uub\PI" !  4$!cyx ((")(3>QFCmxva;&65DKcbZM<g^KOiX;<O43R@=+L&<6,5@(&G# EC9D95NA943AFZG /7PM:* 6F! )#-'  )#)x z}  z ~pweq^p{l{x );YiQiyTqtWf@M=?+)B::gihpn||ear{pB6IBbW34WaL[iq|[Yn6*4(_]9E<NL Ib[~v`PzeQ #DS@'..%2 +(957$- 3+(:RMK? 4  &9,(#;R *I2" ,B('S9:_gVyxi;T69;.'>~!K2Dj$J1yz$; O\KI;7~CD$U#7e12C1%L/".y# SYL(,] /(dAm\Pojz_{# 3-GgF/)DZ8@_JQQ3hph`TYcS[c`ezosnu] -($ ? cMs[azrUS{[em]oddwjqt?i]KM57$D28RLg&%I-)V7LB ;YBWaP7?A=)&H'4, /18EE_`KrughcFB4O[RTGR9Xka\cchI0SD2<EVLOK,VAI2%I< Sh; 'npm|hmd|~G;B5VT;k|Mu~`h{F~lI 9- cOmxg_oP;M+7J* +I1 1VJ;GO''=exokb\|qtdibWjuwZsiM^L8KaoS73ZiIXxy}pW:kyz`yQoqqi%Q_Wl=z|^apj\ht`^]~~|to ~MVUgkVXebBZX,Y;H82Qg7dcIC+dOlrRfdYP010FOZ2    *F:L=:b4JJE4E/0Yfb|ox) 'yukrei~]ncjg^vy:\h6a@LSK\PV)"p'Q2JEaVVS D}x~(>}CqP#<D R. f2 sUne=ZI "CNp:?'<dee`S61>:0<E-_H:*.2xo\Kpocketsphinx-5prealpha/test/data/goforward.kws0000664000175000017500000000012712771605033017013 00000000000000anything /1e-10/ something bad line / here just bad line / forward non_existign_word pocketsphinx-5prealpha/test/data/goforward.gram0000664000175000017500000000044712771605033017142 00000000000000#JSGF V1.0; /** * JSGF Grammar for Turtle example */ grammar goforward; public = go forward ten meters; public = go [meter | meters]; = forward | backward; = one | two | three | four | five | six | seven | eight | nine | ten; pocketsphinx-5prealpha/test/compare_table.pl0000775000175000017500000000635612771605033016531 00000000000000#!/usr/bin/perl # ==================================================================== # Copyright (c) 2000 Carnegie Mellon University. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # This work was supported in part by funding from the Defense Advanced # Research Projects Agency and the National Science Foundation of the # United States of America, and the CMU Sphinx Speech Consortium. # # THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND # ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY # NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. use strict; die "$0 (tolerance)\n" unless (($#ARGV == 1) or ($#ARGV == 2)); my $fn1 = $ARGV[0]; my $fn2 = $ARGV[1]; my $tolerance = 0.002; $tolerance = $ARGV[2] if ($#ARGV == 2); my $comparison = 0; my $line1 = ""; my $line2 = ""; if ((open (FN1, "<$fn1")) and (open (FN2, "<$fn2"))) { $comparison = 1; while (($line1 = ) . ($line2 = )) { chomp($line1); chomp($line2); next if ($line1 eq $line2); my @field1 = split /[,\s]+/, $line1; my @field2 = split /[,\s]+/, $line2; # If the number of tokens in each line is different, the lines, # and therefore the files, don't match. if ($#field1 != $#field2) { $comparison = 0; last; } for (my $i = 0; $i <= $#field1; $i++) { if (($field1[$i] !~ m/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?\)?$/) or ($field2[$i] !~ m/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?\)?$/)) { # Check if any of the tokens in the line is a string rather # than a number, and compare the strings if ($field1[$i] ne $field2[$i]) { $comparison = 0; last; } } elsif (abs($field1[$i] - $field2[$i]) > $tolerance) { # If the tokens are both numbers, check if they match within # a tolerance $comparison = 0; last; } } # If there was a mismatch, we can skip to the end of the loop last if ($comparison == 0); } # If the files don't have the same number of lines, one of the # lines will be EOF, and the other won't. $comparison = 0 if ($line1 != $line2); } close(FN1); close(FN2); if ($comparison) { print "Comparison: SUCCESS\n"; } else { print "Comparison: FAIL\n"; } pocketsphinx-5prealpha/test/Makefile.am0000664000175000017500000000533212771605033015421 00000000000000SUBDIRS = unit regression EXTRA_DIST = \ compare_table.pl \ testfuncs_cygwin.sh \ word_align.pl \ data/an4_ci_cont/feat.params \ data/an4_ci_cont/mdef \ data/an4_ci_cont/means \ data/an4_ci_cont/mixture_weights \ data/an4_ci_cont/noisedict \ data/an4_ci_cont/transition_matrices \ data/an4_ci_cont/variances \ data/cards/001.wav \ data/cards/002.wav \ data/cards/003.wav \ data/cards/004.wav \ data/cards/005.wav \ data/cards/cards.fileids \ data/cards/cards.gram \ data/cards/cards.hyp \ data/cards/cards.transcription \ data/defective.gram \ data/defective.dic \ data/goforward.fsg \ data/goforward.gram \ data/goforward.raw \ data/goforward.kws \ data/goforward.mfc \ data/mllr_matrices \ data/numbers.raw \ data/something.raw \ data/test.lmctl \ data/tidigits/dhd.2934z.raw \ data/tidigits/man.ah.111a.mfc \ data/tidigits/man.ah.1b.mfc \ data/tidigits/man.ah.2934za.mfc \ data/tidigits/man.ah.35oa.mfc \ data/tidigits/man.ah.3oa.mfc \ data/tidigits/man.ah.4625a.mfc \ data/tidigits/man.ah.588zza.mfc \ data/tidigits/man.ah.63a.mfc \ data/tidigits/man.ah.6o838a.mfc \ data/tidigits/man.ah.75913a.mfc \ data/tidigits/man.ah.844o1a.mfc \ data/tidigits/man.ah.8b.mfc \ data/tidigits/man.ah.9b.mfc \ data/tidigits/man.ah.o789a.mfc \ data/tidigits/man.ah.z4548a.mfc \ data/tidigits/man.ah.zb.mfc \ data/tidigits/test-tidigits-fsg.match \ data/tidigits/test-tidigits-simple.match \ data/tidigits/tidigits.ctl \ data/tidigits/tidigits.lsn \ data/tidigits/woman.ak.1b.mfc \ data/tidigits/woman.ak.276317oa.mfc \ data/tidigits/woman.ak.334a.mfc \ data/tidigits/woman.ak.3z3z9a.mfc \ data/tidigits/woman.ak.48z66zza.mfc \ data/tidigits/woman.ak.532a.mfc \ data/tidigits/woman.ak.5z874a.mfc \ data/tidigits/woman.ak.6728za.mfc \ data/tidigits/woman.ak.75a.mfc \ data/tidigits/woman.ak.84983a.mfc \ data/tidigits/woman.ak.8a.mfc \ data/tidigits/woman.ak.99731a.mfc \ data/tidigits/woman.ak.o69a.mfc \ data/tidigits/woman.ak.ooa.mfc \ data/tidigits/woman.ak.za.mfc \ data/tidigits/hmm/feat.params \ data/tidigits/hmm/variances \ data/tidigits/hmm/transition_matrices \ data/tidigits/hmm/sendump \ data/tidigits/hmm/mdef \ data/tidigits/hmm/means \ data/tidigits/lm/tidigits.dic \ data/tidigits/lm/tidigits.lm.bin \ data/tidigits/lm/tidigits.fsg \ data/turtle.dic \ data/turtle.lm.bin \ data/unreachable.lat \ data/librivox/fileids \ data/librivox/sense_and_sensibility_01_austen_64kb-0880.wav \ data/librivox/sense_and_sensibility_01_austen_64kb-0890.wav \ data/librivox/sense_and_sensibility_01_austen_64kb-0930.wav \ data/librivox/sense_and_sensibility_01_austen_64kb-0870.wav \ data/librivox/sense_and_sensibility_01_austen_64kb-0920.wav \ data/librivox/transcription \ data/librivox/test-lm.match pocketsphinx-5prealpha/test/regression/0000775000175000017500000000000012771610005015615 500000000000000pocketsphinx-5prealpha/test/regression/Makefile.am0000664000175000017500000000025212771605033017575 00000000000000TESTS = \ test-cards.sh \ test-lm.sh \ test-tidigits-fsg.sh \ test-tidigits-simple.sh TESTDATA = EXTRA_DIST = $(TESTS) $(TESTDATA) CLEANFILES = *.match *.log pocketsphinx-5prealpha/test/regression/test-tidigits-simple.sh0000775000175000017500000000115712771605033022171 00000000000000#!/bin/sh . ../testfuncs.sh bn=`basename $0 .sh` echo "Test: $bn" run_program pocketsphinx_batch \ -hmm $data/tidigits/hmm \ -lm $data/tidigits/lm/tidigits.lm.bin \ -dict $data/tidigits/lm/tidigits.dic \ -ctl $data/tidigits/tidigits.ctl \ -cepdir $data/tidigits \ -hyp $bn.match \ > $bn.log 2>&1 # Test whether it actually completed if [ $? = 0 ]; then pass "run" else fail "run" fi # Check the decoding results grep AVERAGE $bn.log $tests/word_align.pl -i $data/tidigits/tidigits.lsn $bn.match | grep 'TOTAL Percent' compare_table "match" $data/tidigits/$bn.match $bn.match 100000 pocketsphinx-5prealpha/test/regression/test-tidigits-fsg.sh0000775000175000017500000000120012771605033021444 00000000000000#!/bin/sh . ../testfuncs.sh bn=`basename $0 .sh` echo "Test: $bn" run_program pocketsphinx_batch \ -hmm $data/tidigits/hmm \ -fsg $data/tidigits/lm/tidigits.fsg \ -dict $data/tidigits/lm/tidigits.dic \ -ctl $data/tidigits/tidigits.ctl \ -cepdir $data/tidigits \ -hyp $bn.match \ -wbeam 1e-48 \ > $bn.log 2>&1 # Test whether it actually completed if [ $? = 0 ]; then pass "run" else fail "run" fi # Check the decoding results grep AVERAGE $bn.log $tests/word_align.pl -i $data/tidigits/tidigits.lsn $bn.match | grep 'TOTAL Percent' compare_table "match" $data/tidigits/$bn.match $bn.match 100000 pocketsphinx-5prealpha/test/regression/test-lm.sh0000775000175000017500000000123312771605033017465 00000000000000#!/bin/sh . ../testfuncs.sh bn=`basename $0 .sh` echo "Test: $bn" run_program pocketsphinx_batch \ -hmm $model/en-us/en-us \ -lm $model/en-us/en-us.lm.bin \ -dict $model/en-us/cmudict-en-us.dict \ -ctl $data/librivox/fileids \ -cepdir $data/librivox \ -cepext .wav \ -adcin yes \ -hyp $bn.match \ -backtrace yes \ > $bn.log 2>&1 # Test whether it actually completed if [ $? = 0 ]; then pass "run" else fail "run" fi # Check the decoding results grep AVERAGE $bn.log $tests/word_align.pl $data/librivox/transcription $bn.match | grep 'TOTAL Percent' compare_table "match" $data/librivox/$bn.match $bn.match 1000000 pocketsphinx-5prealpha/test/regression/Makefile.in0000664000175000017500000006574012771607732017633 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ subdir = test/regression DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 = SOURCES = DIST_SOURCES = 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) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = \ test-cards.sh \ test-lm.sh \ test-tidigits-fsg.sh \ test-tidigits-simple.sh TESTDATA = EXTRA_DIST = $(TESTS) $(TESTDATA) CLEANFILES = *.match *.log all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(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 test/regression/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign test/regression/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test-cards.sh.log: test-cards.sh @p='test-cards.sh'; \ b='test-cards.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test-lm.sh.log: test-lm.sh @p='test-lm.sh'; \ b='test-lm.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test-tidigits-fsg.sh.log: test-tidigits-fsg.sh @p='test-tidigits-fsg.sh'; \ b='test-tidigits-fsg.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test-tidigits-simple.sh.log: test-tidigits-simple.sh @p='test-tidigits-simple.sh'; \ b='test-tidigits-simple.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(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 $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: 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: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic 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-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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am check check-TESTS check-am clean clean-generic \ clean-libtool cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am 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-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am # 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: pocketsphinx-5prealpha/test/regression/test-cards.sh0000775000175000017500000000123412771605033020152 00000000000000#!/bin/sh . ../testfuncs.sh bn=`basename $0 .sh` echo "Test: $bn" run_program pocketsphinx_batch \ -hmm $model/en-us/en-us \ -jsgf $data/cards/cards.gram \ -dict $model/en-us/cmudict-en-us.dict\ -ctl $data/cards/cards.fileids \ -adcin yes \ -cepdir $data/cards \ -cepext .wav \ -hyp $bn.match \ -backtrace yes \ > $bn.log 2>&1 # Test whether it actually completed if [ $? = 0 ]; then pass "run" else fail "run" fi # Check the decoding results grep AVERAGE $bn.log $tests/word_align.pl -i $data/cards/cards.transcription $bn.match | grep 'TOTAL Percent' compare_table "match" $data/cards/cards.hyp $bn.match 1000000 pocketsphinx-5prealpha/test/word_align.pl0000775000175000017500000002272212771605033016054 00000000000000#!/usr/bin/perl -w # word_align.pl - Calculate word error and accuracy for a recognition # hypothesis file vs. a reference transcription # # Written by David Huggins-Daines for Speech # Recognition and Understanding 11-751, Carnegie Mellon University, # October 2004. use strict; use Getopt::Long; use Pod::Usage; use vars qw($Verbose $CER $IgnoreUttID); use encoding 'utf8'; my ($help,%hyphash); GetOptions( 'help|?' => \$help, 'verbose|v' => \$Verbose, 'cer|c' => \$CER, 'ignore-uttid|i' => \$IgnoreUttID, ) or pod2usage(1); pod2usage(1) if $help; pod2usage(2) unless @ARGV == 2; my ($ref, $hyp) = @ARGV; open HYP, "<$hyp" or die "Failed to open $hyp: $!"; while (defined(my $hyp_utt=)){ my $hyp_uttid; ($hyp_utt, $hyp_uttid) = s3_magic_norm($hyp_utt); $hyphash{$hyp_uttid} = "$hyp_utt ($hyp_uttid)"; } close HYP; open REF, "<$ref" or die "Failed to open $ref: $!"; open HYP, "<$hyp" or die "Failed to open $hyp: $!"; use constant INS => 1; use constant DEL => 2; use constant MATCH => 3; use constant SUBST => 4; use constant BIG_NUMBER => 1e50; my ($total_words, $total_match, $total_cost, $total_hyp); my ($total_ins, $total_del, $total_subst); while (defined(my $ref_utt = )) { my $hyp_utt; my $ref_uttid; my $hyp_uttid; last unless defined $ref_utt; ($ref_utt,$ref_uttid)=s3_magic_norm($ref_utt); if(defined $IgnoreUttID){ $hyp_utt = ; die "UttID is ignored but file size mismatch between $ref and $hyp" unless defined($hyp_utt); }else{ $hyp_utt=$hyphash{$ref_uttid}; die "UttID is not ignored but it could not found in any entries of the hypothesis file on line3 $. UTTID: $ref_uttid\n" unless defined($hyp_utt); } ($hyp_utt,$hyp_uttid)=s3_magic_norm($hyp_utt); if(! defined $IgnoreUttID){ die "Utterance ID mismatch on line $.: $ref_uttid != $hyp_uttid" unless $ref_uttid eq $hyp_uttid; } # Split the text into an array of words my @ref_words = split ' ', $ref_utt; my @hyp_words = split ' ', $hyp_utt; if ($CER) { # Split the text into an array of characters @ref_words = map { split "" } @ref_words; @hyp_words = map { split "" } @hyp_words; } my (@align_matrix, @backtrace_matrix); # Initialize the alignment and backtrace matrices initialize(\@ref_words, \@hyp_words, \@align_matrix, \@backtrace_matrix); # Do DP alignment maintaining backtrace pointers my $cost = align(\@ref_words, \@hyp_words, \@align_matrix, \@backtrace_matrix); # Find the backtrace my ($alignment, $ins, $del, $subst, $match) = backtrace(\@ref_words, \@hyp_words, \@align_matrix, \@backtrace_matrix); # Format the alignment nicely my ($ref_align, $hyp_align) = ("", ""); foreach (@$alignment) { my ($ref, $hyp) = @$_; my $width = 0; if (defined($ref) and defined($hyp)) { if ($CER or ($ref =~ /\p{InCJKUnifiedIdeographs}/ or $ref =~ /\p{Han}/ or $hyp =~ /\p{Han}/)) { # Assume this is Chinese, no capitalization so put ** around errors if ($ref ne $hyp) { $ref = "*$ref*"; $hyp = "*$hyp*"; } } elsif ($ref eq $hyp) { # Capitalize errors (they already are...), lowercase matches $ref = lc $ref; $hyp = lc $hyp; } } # Replace deletions with *** foreach ($ref, $hyp) { $_ = "***" unless defined $_ }; # Find the width of this column foreach ($ref, $hyp) { $width = length if length > $width }; $width = 3 if $width < 3; # Make it long enough for *** # Space out the words and concatenate them to the output $ref_align .= sprintf("%-*s ", $width, $ref); $hyp_align .= sprintf("%-*s ", $width, $hyp); } $ref_uttid = "" unless defined $ref_uttid; # avoid warnings print "$ref_align ($ref_uttid)\n$hyp_align ($hyp_uttid)\n"; # Print out the word error and accuracy rates my $error = @ref_words == 0 ? 1 : $cost/@ref_words; my $acc = @ref_words == 0 ? 0 : $match/@ref_words; printf("Words: %d Correct: %d Errors: %d Percent correct = %.2f%% Error = %.2f%% Accuracy = %.2f%%\n", scalar(@ref_words), $match, $cost, $acc*100, $error*100, 100-$error*100); print "Insertions: $ins Deletions: $del Substitutions: $subst\n"; $total_cost += $cost; $total_match += $match; $total_words += @ref_words; $total_hyp += @hyp_words; $total_ins += $ins; $total_del += $del; $total_subst += $subst; } # Print out the total word error and accuracy rates my ($error, $acc); if ($total_words == 0) { $error = $total_cost/$total_hyp; $acc = $total_match/$total_hyp; } else { $error = $total_cost/$total_words; $acc = $total_match/$total_words; } printf("TOTAL Words: %d Correct: %d Errors: %d\nTOTAL Percent correct = %.2f%% Error = %.2f%% Accuracy = %.2f%%\n", $total_words, $total_match, $total_cost, $acc*100, $error*100, 100-$error*100); print "TOTAL Insertions: $total_ins Deletions: $total_del Substitutions: $total_subst\n"; # This function normalizes a line of a match file. sub s3_magic_norm{ my ($word)=@_; my $uttid; # Remove line endings $word =~ s/[\n\r]+$//; # the agnostic way... # This computes the uttid and remove it from a line. $word =~ s/\(([^) ]+)[^)]*\)$// ; $uttid = $1; # Normalize case $word = uc $word; # Remove filler words and context cues $word =~ s/<[^>]+>//g; $word =~ s/\+\+[^+]+\+\+//g; $word =~ s/\+[^+]+\+//g; # Remove alternative pronunciations $word =~ s/\([1-9]\)//g; # Remove class tags $word =~ s/:\S+//g; # Split apart compound words and acronyms $word =~ tr/-_./ /; return ($word,$uttid); } sub initialize { my ($ref_words, $hyp_words, $align_matrix, $backtrace_matrix) = @_; # All initial costs along the j axis are insertions for (my $j = 0; $j <= @$hyp_words; ++$j) { $$align_matrix[0][$j] = $j; } for (my $j = 0; $j <= @$hyp_words; ++$j) { $$backtrace_matrix[0][$j] = INS; } # All initial costs along the i axis are deletions for (my $i = 0; $i <= @$ref_words; ++$i) { $$align_matrix[$i][0] = $i; } for (my $i = 0; $i <= @$ref_words; ++$i) { $$backtrace_matrix[$i][0] = DEL; } } sub align { my ($ref_words, $hyp_words, $align_matrix, $backtrace_matrix) = @_; for (my $i = 1; $i <= @$ref_words; ++$i) { for (my $j = 1; $j <= @$hyp_words; ++$j) { # Find insertion, deletion, substitution scores my ($ins, $del, $subst); # Cost of a substitution (0 if they are equal) my $cost = $$ref_words[$i-1] ne $$hyp_words[$j-1]; # Find insertion, deletion, substitution costs $ins = $$align_matrix[$i][$j-1] + 1; $del = $$align_matrix[$i-1][$j] + 1; $subst = $$align_matrix[$i-1][$j-1] + $cost; print "Costs at $i $j: INS $ins DEL $del SUBST $subst\n" if $Verbose; # Get the minimum one my $min = BIG_NUMBER; foreach ($ins, $del, $subst) { if ($_ < $min) { $min = $_; } } $$align_matrix[$i][$j] = $min; # If the costs are equal, prefer match or substitution # (keep the path diagonal). if ($min == $subst) { print(($cost ? "SUBSTITUTION" : "MATCH"), "($$ref_words[$i-1] <=> $$hyp_words[$j-1])\n") if $Verbose; $$backtrace_matrix[$i][$j] = MATCH+$cost; } elsif ($min == $ins) { print "INSERTION (0 => $$hyp_words[$j-1])\n" if $Verbose; $$backtrace_matrix[$i][$j] = INS; } elsif ($min == $del) { print "DELETION ($$ref_words[$i-1] => 0)\n" if $Verbose; $$backtrace_matrix[$i][$j] = DEL; } } } return $$align_matrix[@$ref_words][@$hyp_words]; } sub backtrace { my ($ref_words, $hyp_words, $align_matrix, $backtrace_matrix) = @_; # Backtrace to find number of ins/del/subst my @alignment; my $i = @$ref_words; my $j = @$hyp_words; my ($inspen, $delpen, $substpen, $match) = (0,0,0,0); while (!($i == 0 and $j == 0)) { my $pointer = $$backtrace_matrix[$i][$j]; print "Cost at $i $j: $$align_matrix[$i][$j]\n" if $Verbose; if ($pointer == INS) { print "INSERTION (0 => $$hyp_words[$j-1])" if $Verbose; # Append the pair 0:hyp[j] to the front of the alignment unshift @alignment, [undef, $$hyp_words[$j-1]]; ++$inspen; --$j; print " - moving to $i $j\n" if $Verbose; } elsif ($pointer == DEL) { print "DELETION ($$ref_words[$i-1] => 0)" if $Verbose; # Append the pair ref[i]:0 to the front of the alignment unshift @alignment, [$$ref_words[$i-1], undef]; ++$delpen; --$i; print " - moving to $i $j\n" if $Verbose; } elsif ($pointer == MATCH) { print "MATCH ($$ref_words[$i-1] <=> $$hyp_words[$j-1])" if $Verbose; # Append the pair ref[i]:hyp[j] to the front of the alignment unshift @alignment, [$$ref_words[$i-1], $$hyp_words[$j-1]]; ++$match; --$j; --$i; print " - moving to $i $j\n" if $Verbose; } elsif ($pointer == SUBST) { print "SUBSTITUTION ($$ref_words[$i-1] <=> $$hyp_words[$j-1])" if $Verbose; # Append the pair ref[i]:hyp[j] to the front of the alignment unshift @alignment, [$$ref_words[$i-1], $$hyp_words[$j-1]]; ++$substpen; --$j; --$i; print " - moving to $i $j\n" if $Verbose; } else { last; } } return (\@alignment, $inspen, $delpen, $substpen, $match); } __END__ =head1 NAME calculate_wer - Calculate Word Error Rate from a reference and hypothesis file =head1 SYNOPSIS calculate_wer [options] reference_file hypothesis_file =head1 OPTIONS =over 8 =item B<--help>, B<-?> Print a brief help message and exit. =item B<--verbose>, B<-v> Print out messages tracing the alignment algorithm. =cut pocketsphinx-5prealpha/test/Makefile.in0000664000175000017500000005276512771607732015456 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ subdir = test DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/testfuncs.sh.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = testfuncs.sh CONFIG_CLEAN_VPATH_FILES = 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 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = unit regression EXTRA_DIST = \ compare_table.pl \ testfuncs_cygwin.sh \ word_align.pl \ data/an4_ci_cont/feat.params \ data/an4_ci_cont/mdef \ data/an4_ci_cont/means \ data/an4_ci_cont/mixture_weights \ data/an4_ci_cont/noisedict \ data/an4_ci_cont/transition_matrices \ data/an4_ci_cont/variances \ data/cards/001.wav \ data/cards/002.wav \ data/cards/003.wav \ data/cards/004.wav \ data/cards/005.wav \ data/cards/cards.fileids \ data/cards/cards.gram \ data/cards/cards.hyp \ data/cards/cards.transcription \ data/defective.gram \ data/defective.dic \ data/goforward.fsg \ data/goforward.gram \ data/goforward.raw \ data/goforward.kws \ data/goforward.mfc \ data/mllr_matrices \ data/numbers.raw \ data/something.raw \ data/test.lmctl \ data/tidigits/dhd.2934z.raw \ data/tidigits/man.ah.111a.mfc \ data/tidigits/man.ah.1b.mfc \ data/tidigits/man.ah.2934za.mfc \ data/tidigits/man.ah.35oa.mfc \ data/tidigits/man.ah.3oa.mfc \ data/tidigits/man.ah.4625a.mfc \ data/tidigits/man.ah.588zza.mfc \ data/tidigits/man.ah.63a.mfc \ data/tidigits/man.ah.6o838a.mfc \ data/tidigits/man.ah.75913a.mfc \ data/tidigits/man.ah.844o1a.mfc \ data/tidigits/man.ah.8b.mfc \ data/tidigits/man.ah.9b.mfc \ data/tidigits/man.ah.o789a.mfc \ data/tidigits/man.ah.z4548a.mfc \ data/tidigits/man.ah.zb.mfc \ data/tidigits/test-tidigits-fsg.match \ data/tidigits/test-tidigits-simple.match \ data/tidigits/tidigits.ctl \ data/tidigits/tidigits.lsn \ data/tidigits/woman.ak.1b.mfc \ data/tidigits/woman.ak.276317oa.mfc \ data/tidigits/woman.ak.334a.mfc \ data/tidigits/woman.ak.3z3z9a.mfc \ data/tidigits/woman.ak.48z66zza.mfc \ data/tidigits/woman.ak.532a.mfc \ data/tidigits/woman.ak.5z874a.mfc \ data/tidigits/woman.ak.6728za.mfc \ data/tidigits/woman.ak.75a.mfc \ data/tidigits/woman.ak.84983a.mfc \ data/tidigits/woman.ak.8a.mfc \ data/tidigits/woman.ak.99731a.mfc \ data/tidigits/woman.ak.o69a.mfc \ data/tidigits/woman.ak.ooa.mfc \ data/tidigits/woman.ak.za.mfc \ data/tidigits/hmm/feat.params \ data/tidigits/hmm/variances \ data/tidigits/hmm/transition_matrices \ data/tidigits/hmm/sendump \ data/tidigits/hmm/mdef \ data/tidigits/hmm/means \ data/tidigits/lm/tidigits.dic \ data/tidigits/lm/tidigits.lm.bin \ data/tidigits/lm/tidigits.fsg \ data/turtle.dic \ data/turtle.lm.bin \ data/unreachable.lat \ data/librivox/fileids \ data/librivox/sense_and_sensibility_01_austen_64kb-0880.wav \ data/librivox/sense_and_sensibility_01_austen_64kb-0890.wav \ data/librivox/sense_and_sensibility_01_austen_64kb-0930.wav \ data/librivox/sense_and_sensibility_01_austen_64kb-0870.wav \ data/librivox/sense_and_sensibility_01_austen_64kb-0920.wav \ data/librivox/transcription \ data/librivox/test-lm.match all: all-recursive .SUFFIXES: $(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 test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign test/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): testfuncs.sh: $(top_builddir)/config.status $(srcdir)/testfuncs.sh.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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-recursive 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: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am 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 \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # 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: pocketsphinx-5prealpha/test/testfuncs_cygwin.sh0000664000175000017500000000221212771605033017311 00000000000000# Utility functions and parameters for regression tests # Predefined directories you may need : ${CONFIGURATION:=Debug} builddir="../../bin/$CONFIGURATION" sourcedir="../.." tests=$sourcedir/test data=$sourcedir/test/data model=$sourcedir/model cp -f ../../../sphinxbase/bin/$CONFIGURATION/*.dll "$builddir" # Automatically report failures on exit failures="" trap "report_failures" 0 run_program() { program=`basename $1` shift "$builddir/$program" $@ } debug_program() { program=`basename $1` shift gdb --args "$builddir/$program" $@ } memcheck_program() { program=`basename $1` shift valgrind --leak-check=full "$builddir/$program" $@ } pass() { title="$1" echo "$title PASSED" } fail() { title="$1" echo "$title FAILED" failures="$failures,$title" } compare_table() { title="$1" shift if perl "$tests/compare_table.pl" $@ | grep SUCCESS >/dev/null 2>&1; then pass "$title" else fail "$title" fi } report_failures() { if test x"$failures" = x; then echo "All sub-tests passed" exit 0 else echo "Sub-tests failed:$failures" | sed -e 's/,/ /g' exit 1 fi } pocketsphinx-5prealpha/test/unit/0000775000175000017500000000000012771610005014414 500000000000000pocketsphinx-5prealpha/test/unit/test_jsgf.c0000664000175000017500000000572712771605033016510 00000000000000#include #include #include #include #include #include #include "pocketsphinx_internal.h" #include "fsg_search_internal.h" #include "test_macros.h" int main(int argc, char *argv[]) { ps_decoder_t *ps; cmd_ln_t *config; jsgf_t *jsgf; jsgf_rule_t *rule; fsg_model_t *fsg; FILE *rawfh; char const *hyp; int32 score, prob; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-dict", DATADIR "/turtle.dic", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); jsgf = jsgf_parse_file(DATADIR "/goforward.gram", NULL); TEST_ASSERT(jsgf); rule = jsgf_get_rule(jsgf, "goforward.move2"); TEST_ASSERT(rule); fsg = jsgf_build_fsg(jsgf, rule, ps->lmath, 7.5); TEST_ASSERT(fsg); fsg_model_write(fsg, stdout); ps_set_fsg(ps, "goforward.move2", fsg); ps_set_search(ps, "goforward.move2"); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); hyp = ps_get_hyp(ps, &score); prob = ps_get_prob(ps); printf("%s (%d, %d)\n", hyp, score, prob); TEST_EQUAL(0, strcmp("go forward ten meters", hyp)); ps_free(ps); fclose(rawfh); cmd_ln_free_r(config); TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-dict", DATADIR "/turtle.dic", "-jsgf", DATADIR "/goforward.gram", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); hyp = ps_get_hyp(ps, &score); prob = ps_get_prob(ps); printf("%s (%d, %d)\n", hyp, score, prob); TEST_EQUAL(0, strcmp("go forward ten meters", hyp)); ps_free(ps); fclose(rawfh); cmd_ln_free_r(config); TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-dict", DATADIR "/turtle.dic", "-jsgf", DATADIR "/goforward.gram", "-toprule", "goforward.move2", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); hyp = ps_get_hyp(ps, &score); prob = ps_get_prob(ps); printf("%s (%d, %d)\n", hyp, score, prob); TEST_EQUAL(0, strcmp("go forward ten meters", hyp)); ps_free(ps); cmd_ln_free_r(config); fclose(rawfh); TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-dict", DATADIR "/turtle.dic", "-jsgf", DATADIR "/defective.gram", NULL)); TEST_ASSERT(NULL == ps_init(config)); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_reinit.c0000664000175000017500000000151112771605033017034 00000000000000#include #include #include #include "test_macros.h" int main(int argc, char *argv[]) { ps_decoder_t *ps; cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", DATADIR "/tidigits/hmm", "-dict", DATADIR "/tidigits/lm/tidigits.dic", NULL)); TEST_ASSERT(ps = ps_init(config)); cmd_ln_free_r(config); TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", NULL)); TEST_EQUAL(0, ps_reinit(ps, config)); /* Reinit when adding words */ ps_add_word(ps, "foobie", "F UW B IY", FALSE); ps_add_word(ps, "hellosomething", "HH EH L OW S", TRUE); /* Reinit with existing config */ ps_reinit(ps, NULL); ps_free(ps); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_acmod_grow.c0000664000175000017500000001070012771605033017663 00000000000000#include #include #include #include #include "acmod.h" #include "test_macros.h" static const mfcc_t cmninit[13] = { FLOAT2MFCC(41.00), FLOAT2MFCC(-5.29), FLOAT2MFCC(-0.12), FLOAT2MFCC(5.09), FLOAT2MFCC(2.48), FLOAT2MFCC(-4.07), FLOAT2MFCC(-1.37), FLOAT2MFCC(-1.78), FLOAT2MFCC(-5.08), FLOAT2MFCC(-2.05), FLOAT2MFCC(-6.45), FLOAT2MFCC(-1.42), FLOAT2MFCC(1.17) }; int main(int argc, char *argv[]) { acmod_t *acmod; logmath_t *lmath; cmd_ln_t *config; FILE *rawfh; int16 *buf; int16 const *bptr; size_t nread, nsamps; int nfr; int frame_counter; int bestsen1[270]; lmath = logmath_init(1.0001, 0, 0); config = cmd_ln_init(NULL, ps_args(), TRUE, "-compallsen", "true", "-cmn", "live", "-tmatfloor", "0.0001", "-mixwfloor", "0.001", "-varfloor", "0.0001", "-mmap", "no", "-topn", "4", "-ds", "1", "-samprate", "16000", NULL); TEST_ASSERT(config); cmd_ln_parse_file_r(config, ps_args(), MODELDIR "/en-us/en-us/feat.params", FALSE); cmd_ln_set_str_extra_r(config, "_mdef", MODELDIR "/en-us/en-us/mdef"); cmd_ln_set_str_extra_r(config, "_mean", MODELDIR "/en-us/en-us/means"); cmd_ln_set_str_extra_r(config, "_var", MODELDIR "/en-us/en-us/variances"); cmd_ln_set_str_extra_r(config, "_tmat", MODELDIR "/en-us/en-us/transition_matrices"); cmd_ln_set_str_extra_r(config, "_sendump", MODELDIR "/en-us/en-us/sendump"); cmd_ln_set_str_extra_r(config, "_mixw", NULL); cmd_ln_set_str_extra_r(config, "_lda", NULL); cmd_ln_set_str_extra_r(config, "_senmgau", NULL); TEST_ASSERT(acmod = acmod_init(config, lmath, NULL, NULL)); cmn_live_set(acmod->fcb->cmn_struct, cmninit); nsamps = 2048; frame_counter = 0; buf = ckd_calloc(nsamps, sizeof(*buf)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); TEST_EQUAL(FALSE, acmod_set_grow(acmod, TRUE)); TEST_EQUAL(0, acmod_start_utt(acmod)); printf("Incremental(2048):\n"); while (!feof(rawfh)) { nread = fread(buf, sizeof(*buf), nsamps, rawfh); bptr = buf; while ((nfr = acmod_process_raw(acmod, &bptr, &nread, FALSE)) > 0 || nread > 0) { int16 best_score; int frame_idx = -1, best_senid; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); printf("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); TEST_EQUAL(frame_counter, frame_idx); if (frame_counter < 190) bestsen1[frame_counter] = best_senid; ++frame_counter; frame_idx = -1; } } } TEST_EQUAL(0, acmod_end_utt(acmod)); nread = 0; acmod_process_raw(acmod, NULL, &nread, FALSE); { int16 best_score; int frame_idx = -1, best_senid; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); printf("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); if (frame_counter < 190) bestsen1[frame_counter] = best_senid; TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; frame_idx = -1; } } printf("Rewound (MFCC):\n"); TEST_EQUAL(0, acmod_rewind(acmod)); { int16 best_score; int frame_idx = -1, best_senid; frame_counter = 0; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); printf("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); if (frame_counter < 190) TEST_EQUAL(best_senid, bestsen1[frame_counter]); TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; frame_idx = -1; } } /* Clean up, go home. */ fclose(rawfh); ckd_free(buf); acmod_free(acmod); logmath_free(lmath); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_mllr.c0000664000175000017500000000141712771605033016515 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "test_macros.h" #include "test_ps.c" int main(int argc, char *argv[]) { cmd_ln_t *config; ps_decoder_t *ps; FILE *rawfh; char const *hyp; int32 score; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", DATADIR "/an4_ci_cont", "-lm", DATADIR "/turtle.lm.bin", "-dict", DATADIR "/turtle.dic", "-mllr", DATADIR "/mllr_matrices", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); fclose(rawfh); hyp = ps_get_hyp(ps, &score); printf("FWDFLAT: %s (%d)\n", hyp, score); ps_free(ps); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_acmod.c0000664000175000017500000002125412771605033016633 00000000000000#include #include #include #include #include "acmod.h" #include "test_macros.h" static const mfcc_t cmninit[13] = { FLOAT2MFCC(41.00), FLOAT2MFCC(-5.29), FLOAT2MFCC(-0.12), FLOAT2MFCC(5.09), FLOAT2MFCC(2.48), FLOAT2MFCC(-4.07), FLOAT2MFCC(-1.37), FLOAT2MFCC(-1.78), FLOAT2MFCC(-5.08), FLOAT2MFCC(-2.05), FLOAT2MFCC(-6.45), FLOAT2MFCC(-1.42), FLOAT2MFCC(1.17) }; int main(int argc, char *argv[]) { acmod_t *acmod; logmath_t *lmath; cmd_ln_t *config; FILE *rawfh; int16 *buf; int16 const *bptr; mfcc_t **cepbuf, **cptr; size_t nread, nsamps; int nfr; int frame_counter; int bestsen1[270]; lmath = logmath_init(1.0001, 0, 0); config = cmd_ln_init(NULL, ps_args(), TRUE, "-compallsen", "true", "-cmn", "live", "-tmatfloor", "0.0001", "-mixwfloor", "0.001", "-varfloor", "0.0001", "-mmap", "no", "-topn", "4", "-ds", "1", "-samprate", "16000", NULL); TEST_ASSERT(config); cmd_ln_parse_file_r(config, ps_args(), MODELDIR "/en-us/en-us/feat.params", FALSE); cmd_ln_set_str_extra_r(config, "_mdef", MODELDIR "/en-us/en-us/mdef"); cmd_ln_set_str_extra_r(config, "_mean", MODELDIR "/en-us/en-us/means"); cmd_ln_set_str_extra_r(config, "_var", MODELDIR "/en-us/en-us/variances"); cmd_ln_set_str_extra_r(config, "_tmat", MODELDIR "/en-us/en-us/transition_matrices"); cmd_ln_set_str_extra_r(config, "_sendump", MODELDIR "/en-us/en-us/sendump"); cmd_ln_set_str_extra_r(config, "_mixw", NULL); cmd_ln_set_str_extra_r(config, "_lda", NULL); cmd_ln_set_str_extra_r(config, "_senmgau", NULL); TEST_ASSERT(acmod = acmod_init(config, lmath, NULL, NULL)); cmn_live_set(acmod->fcb->cmn_struct, cmninit); nsamps = 2048; frame_counter = 0; buf = ckd_calloc(nsamps, sizeof(*buf)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); TEST_EQUAL(0, acmod_start_utt(acmod)); E_INFO("Incremental(2048):\n"); while (!feof(rawfh)) { nread = fread(buf, sizeof(*buf), nsamps, rawfh); bptr = buf; while ((nfr = acmod_process_raw(acmod, &bptr, &nread, FALSE)) > 0 || nread > 0) { int16 best_score; int frame_idx = -1, best_senid; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); E_INFO("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); TEST_EQUAL(frame_counter, frame_idx); if (frame_counter < 190) bestsen1[frame_counter] = best_score; ++frame_counter; frame_idx = -1; } } } TEST_EQUAL(0, acmod_end_utt(acmod)); nread = 0; { int16 best_score; int frame_idx = -1, best_senid; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); E_INFO("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); if (frame_counter < 190) bestsen1[frame_counter] = best_score; TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; frame_idx = -1; } } /* Now try to process the whole thing at once. */ E_INFO("Whole utterance:\n"); cmn_live_set(acmod->fcb->cmn_struct, cmninit); nsamps = ftell(rawfh) / sizeof(*buf); clearerr(rawfh); fseek(rawfh, 0, SEEK_SET); buf = ckd_realloc(buf, nsamps * sizeof(*buf)); TEST_EQUAL(nsamps, fread(buf, sizeof(*buf), nsamps, rawfh)); bptr = buf; TEST_EQUAL(0, acmod_start_utt(acmod)); acmod_process_raw(acmod, &bptr, &nsamps, TRUE); TEST_EQUAL(0, acmod_end_utt(acmod)); { int16 best_score; int frame_idx = -1, best_senid; frame_counter = 0; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); E_INFO("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); if (frame_counter < 190) TEST_EQUAL_LOG(best_score, bestsen1[frame_counter]); TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; frame_idx = -1; } } /* Now process MFCCs and make sure we get the same results. */ cepbuf = ckd_calloc_2d(frame_counter, fe_get_output_size(acmod->fe), sizeof(**cepbuf)); fe_start_utt(acmod->fe); nsamps = ftell(rawfh) / sizeof(*buf); bptr = buf; nfr = frame_counter; fe_process_frames(acmod->fe, &bptr, &nsamps, cepbuf, &nfr, NULL); fe_end_utt(acmod->fe, cepbuf[frame_counter-1], &nfr); E_INFO("Incremental(MFCC):\n"); cmn_live_set(acmod->fcb->cmn_struct, cmninit); TEST_EQUAL(0, acmod_start_utt(acmod)); cptr = cepbuf; nfr = frame_counter; frame_counter = 0; while ((acmod_process_cep(acmod, &cptr, &nfr, FALSE)) > 0) { int16 best_score; int frame_idx = -1, best_senid; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); E_INFO("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); TEST_EQUAL(frame_counter, frame_idx); if (frame_counter < 190) TEST_EQUAL_LOG(best_score, bestsen1[frame_counter]); ++frame_counter; frame_idx = -1; } } TEST_EQUAL(0, acmod_end_utt(acmod)); nfr = 0; acmod_process_cep(acmod, &cptr, &nfr, FALSE); { int16 best_score; int frame_idx = -1, best_senid; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); E_INFO("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); TEST_EQUAL(frame_counter, frame_idx); if (frame_counter < 190) TEST_EQUAL_LOG(best_score, bestsen1[frame_counter]); ++frame_counter; frame_idx = -1; } } /* Note that we have to process the whole thing again because * !#@$@ s2mfc2feat modifies its argument (not for long) */ fe_start_utt(acmod->fe); nsamps = ftell(rawfh) / sizeof(*buf); bptr = buf; nfr = frame_counter; fe_process_frames(acmod->fe, &bptr, &nsamps, cepbuf, &nfr, NULL); fe_end_utt(acmod->fe, cepbuf[frame_counter-1], &nfr); E_INFO("Whole utterance (MFCC):\n"); cmn_live_set(acmod->fcb->cmn_struct, cmninit); TEST_EQUAL(0, acmod_start_utt(acmod)); cptr = cepbuf; nfr = frame_counter; acmod_process_cep(acmod, &cptr, &nfr, TRUE); TEST_EQUAL(0, acmod_end_utt(acmod)); { int16 best_score; int frame_idx = -1, best_senid; frame_counter = 0; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); E_INFO("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); if (frame_counter < 190) TEST_EQUAL_LOG(best_score, bestsen1[frame_counter]); TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; frame_idx = -1; } } E_INFO("Rewound (MFCC):\n"); TEST_EQUAL(0, acmod_rewind(acmod)); { int16 best_score; int frame_idx = -1, best_senid; frame_counter = 0; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); E_INFO("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); if (frame_counter < 190) TEST_EQUAL_LOG(best_score, bestsen1[frame_counter]); TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; frame_idx = -1; } } /* Clean up, go home. */ ckd_free_2d(cepbuf); fclose(rawfh); ckd_free(buf); acmod_free(acmod); logmath_free(lmath); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_keyphrase.c0000664000175000017500000000077612771605033017551 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "test_macros.h" #include "test_ps.c" int main(int argc, char *argv[]) { cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-kws", DATADIR "/goforward.kws", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", NULL)); return ps_decoder_test(config, "KEYPHRASE", "forward"); } pocketsphinx-5prealpha/test/unit/test_senfh.c0000664000175000017500000000554512771605033016660 00000000000000#include #include #include #include #include "pocketsphinx_internal.h" #include "ngram_search_fwdtree.h" #include "test_macros.h" int main(int argc, char *argv[]) { ps_decoder_t *ps; cmd_ln_t *config; acmod_t *acmod; ngram_search_t *ngs; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdtree", "yes", "-fwdflat", "no", "-bestpath", "no", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); ngs = (ngram_search_t *)ps->search; acmod = ps->acmod; setbuf(stdout, NULL); { FILE *rawfh, *senfh; int16 buf[2048]; size_t nread; int16 const *bptr; int nfr; TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); TEST_EQUAL(0, acmod_start_utt(acmod)); TEST_ASSERT(senfh = fopen("goforward.sen", "wb")); TEST_EQUAL(0, acmod_set_senfh(acmod, senfh)); ngram_fwdtree_start(ngs); while (!feof(rawfh)) { nread = fread(buf, sizeof(*buf), 2048, rawfh); bptr = buf; while ((nfr = acmod_process_raw(acmod, &bptr, &nread, FALSE)) > 0) { while (acmod->n_feat_frame > 0) { ngram_fwdtree_search(ngs, acmod->output_frame); acmod_advance(acmod); } } } ngram_fwdtree_finish(ngs); printf("%s\n", ngram_search_bp_hyp(ngs, ngram_search_find_exit(ngs, -1, NULL))); TEST_ASSERT(acmod_end_utt(acmod) >= 0); fclose(rawfh); TEST_EQUAL(0, strcmp("go forward ten meters", ngram_search_bp_hyp(ngs, ngram_search_find_exit(ngs, -1, NULL)))); TEST_EQUAL(0, acmod_set_senfh(acmod, NULL)); TEST_EQUAL(0, acmod_start_utt(acmod)); TEST_ASSERT(senfh = fopen("goforward.sen", "rb")); TEST_EQUAL(0, acmod_set_insenfh(acmod, senfh)); ngram_fwdtree_start(ngs); while ((nfr = acmod_read_scores(acmod)) > 0) { while (acmod->n_feat_frame > 0) { ngram_fwdtree_search(ngs, acmod->output_frame); acmod_advance(acmod); } } ngram_fwdtree_finish(ngs); printf("%s\n", ngram_search_bp_hyp(ngs, ngram_search_find_exit(ngs, -1, NULL))); TEST_ASSERT(acmod_end_utt(acmod) >= 0); TEST_EQUAL(0, strcmp("go forward ten meters", ngram_search_bp_hyp(ngs, ngram_search_find_exit(ngs, -1, NULL)))); fclose(senfh); } ps_free(ps); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_posterior.c0000664000175000017500000001055212771605033017575 00000000000000#include #include #include #include #include "pocketsphinx_internal.h" #include "ngram_search_fwdtree.h" #include "ps_lattice_internal.h" #include "test_macros.h" int test_decode(ps_decoder_t *ps) { FILE *rawfh; int16 buf[2048]; size_t nread; int16 const *bptr; int nfr; ps_lattice_t *dag; acmod_t *acmod; ngram_search_t *ngs; int i, j; ps_latlink_t *link; ps_latnode_t *node; latlink_list_t *x; int32 norm, post; ngs = (ngram_search_t *)ps->search; acmod = ps->acmod; /* Decode stuff and build a DAG. */ TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); TEST_EQUAL(0, acmod_start_utt(acmod)); ngram_fwdtree_start(ngs); while (!feof(rawfh)) { nread = fread(buf, sizeof(*buf), 2048, rawfh); bptr = buf; while ((nfr = acmod_process_raw(acmod, &bptr, &nread, FALSE)) > 0) { while (acmod->n_feat_frame > 0) { ngram_fwdtree_search(ngs, acmod->output_frame); acmod_advance(acmod); } } } ngram_fwdtree_finish(ngs); printf("FWDTREE: %s\n", ngram_search_bp_hyp(ngs, ngram_search_find_exit(ngs, -1, NULL))); TEST_ASSERT(acmod_end_utt(acmod) >= 0); fclose(rawfh); dag = ngram_search_lattice(ps->search); if (dag == NULL) { E_ERROR("Failed to build DAG!\n"); return -1; } /* Write lattice to disk. */ TEST_EQUAL(0, ps_lattice_write(dag, "test_posterior.lat")); /* Do a bunch of checks on the DAG generation and traversal code: */ /* Verify that forward and backward iteration give the same number of edges. */ i = j = 0; for (link = ps_lattice_traverse_edges(dag, NULL, NULL); link; link = ps_lattice_traverse_next(dag, NULL)) { ++i; } for (link = ps_lattice_reverse_edges(dag, NULL, NULL); link; link = ps_lattice_reverse_next(dag, NULL)) { ++j; } printf("%d forward edges, %d reverse edges\n", i, j); TEST_EQUAL(i,j); /* Verify that the same links are reachable via entries and exits. */ for (node = dag->nodes; node; node = node->next) { for (x = node->exits; x; x = x->next) x->link->alpha = -42; } for (node = dag->nodes; node; node = node->next) { for (x = node->entries; x; x = x->next) TEST_EQUAL(x->link->alpha, -42); } /* Verify that forward iteration is properly ordered. */ for (link = ps_lattice_traverse_edges(dag, NULL, NULL); link; link = ps_lattice_traverse_next(dag, NULL)) { link->alpha = 0; for (x = link->from->entries; x; x = x->next) { TEST_EQUAL(x->link->alpha, 0); } } /* Verify that backward iteration is properly ordered. */ for (node = dag->nodes; node; node = node->next) { for (x = node->exits; x; x = x->next) x->link->alpha = -42; } for (link = ps_lattice_reverse_edges(dag, NULL, NULL); link; link = ps_lattice_reverse_next(dag, NULL)) { link->alpha = 0; for (x = link->to->exits; x; x = x->next) { TEST_EQUAL(x->link->alpha, 0); } } /* Find and print best path. */ link = ps_lattice_bestpath(dag, ngs->lmset, 1.0, 1.0/20.0); printf("BESTPATH: %s\n", ps_lattice_hyp(dag, link)); /* Calculate betas. */ post = ps_lattice_posterior(dag, ngs->lmset, 1.0/20.0); printf("Best path score: %d\n", link->path_scr + dag->final_node_ascr); printf("P(S|O) = %d\n", post); /* Verify that sum of final alphas and initial alphas+betas is * sufficiently similar. */ norm = logmath_get_zero(acmod->lmath); for (x = dag->start->exits; x; x = x->next) norm = logmath_add(acmod->lmath, norm, x->link->beta + x->link->alpha); E_INFO("Sum of final alphas+betas = %d\n", dag->norm); E_INFO("Sum of initial alphas+betas = %d\n", norm); TEST_EQUAL_LOG(dag->norm, norm); /* Print posterior probabilities for each link in best path. */ while (link) { printf("P(%s,%d) = %d = %f\n", dict_wordstr(ps->search->dict, link->from->wid), link->ef, link->alpha + link->beta - dag->norm, logmath_exp(acmod->lmath, link->alpha + link->beta - dag->norm)); link = link->best_prev; } return 0; } int main(int argc, char *argv[]) { ps_decoder_t *ps; cmd_ln_t *config; int rv; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdtree", "yes", "-fwdflat", "no", "-bestpath", "yes", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); rv = test_decode(ps); ps_free(ps); cmd_ln_free_r(config); return rv; } pocketsphinx-5prealpha/test/unit/test_alignment.c0000664000175000017500000000327012771605033017524 00000000000000#include #include "ps_alignment.h" #include "pocketsphinx_internal.h" #include "test_macros.h" int main(int argc, char *argv[]) { bin_mdef_t *mdef; dict_t *dict; dict2pid_t *d2p; ps_alignment_t *al; ps_alignment_iter_t *itor; cmd_ln_t *config; config = cmd_ln_init(NULL, NULL, FALSE, "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "_fdict", MODELDIR "/en-us/en-us/noisedict", NULL); mdef = bin_mdef_read(NULL, MODELDIR "/en-us/en-us/mdef"); dict = dict_init(config, mdef); d2p = dict2pid_build(mdef, dict); al = ps_alignment_init(d2p); TEST_EQUAL(1, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); TEST_EQUAL(2, ps_alignment_add_word(al, dict_wordid(dict, "hello"), 0)); TEST_EQUAL(3, ps_alignment_add_word(al, dict_wordid(dict, "world"), 0)); TEST_EQUAL(4, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); TEST_EQUAL(0, ps_alignment_populate(al)); itor = ps_alignment_words(al); TEST_EQUAL(ps_alignment_iter_get(itor)->id.wid, dict_wordid(dict, "")); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->id.wid, dict_wordid(dict, "hello")); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->id.wid, dict_wordid(dict, "world")); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->id.wid, dict_wordid(dict, "")); itor = ps_alignment_iter_next(itor); TEST_EQUAL(itor, NULL); printf("%d words %d phones %d states\n", ps_alignment_n_words(al), ps_alignment_n_phones(al), ps_alignment_n_states(al)); ps_alignment_free(al); dict_free(dict); dict2pid_free(d2p); bin_mdef_free(mdef); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_fwdflat.c0000664000175000017500000000121612771605033017173 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "test_macros.h" #include "test_ps.c" int main(int argc, char *argv[]) { cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdflatlw", "6.5", "-fwdtree", "no", "-fwdflat", "yes", "-bestpath", "no", "-fwdflatbeam", "1e-30", "-fwdflatwbeam", "1e-20", "-samprate", "16000", NULL)); return ps_decoder_test(config, "FWDFLAT", "go forward ten meters"); } pocketsphinx-5prealpha/test/unit/Makefile.am0000664000175000017500000000167512771605033016406 00000000000000check_PROGRAMS = \ test_acmod \ test_acmod_grow \ test_alignment \ test_allphone \ test_dict2pid \ test_dict \ test_fsg \ test_fwdflat \ test_fwdtree_bestpath \ test_fwdtree \ test_init \ test_jsgf \ test_keyphrase \ test_lattice \ test_lm_read \ test_mllr \ test_nbest \ test_posterior \ test_ptm_mgau \ test_reinit \ test_senfh \ test_set_search \ test_simple \ test_state_align TESTS = $(check_PROGRAMS) EXTRA_DIST = test_ps.c noinst_HEADERS = test_macros.h AM_CFLAGS =-I$(top_srcdir)/include \ -I$(top_srcdir)/src/libpocketsphinx \ -I$(top_builddir)/include \ -I$(srcdir) \ -DMODELDIR=\"${top_srcdir}/model\" \ -DDATADIR=\"${top_srcdir}/test/data\" LDADD = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ -lsphinxbase CLEANFILES = *.log *.out *.lat *.mfc *.raw *.dic *.sen valgrind-check: for testf in .libs/lt-*; do valgrind --leak-check=full --show-reachable=yes \ $$testf; done >& valgrind.log pocketsphinx-5prealpha/test/unit/test_state_align.c0000664000175000017500000000743712771605033020051 00000000000000#include #include "ps_alignment.h" #include "state_align_search.h" #include "pocketsphinx_internal.h" #include "test_macros.h" static int do_search(ps_search_t *search, acmod_t *acmod) { FILE *rawfh; int16 buf[2048]; size_t nread; int16 const *bptr; int nfr; TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); TEST_EQUAL(0, acmod_start_utt(acmod)); ps_search_start(search); while (!feof(rawfh)) { nread = fread(buf, sizeof(*buf), 2048, rawfh); bptr = buf; while ((nfr = acmod_process_raw(acmod, &bptr, &nread, FALSE)) > 0) { while (acmod->n_feat_frame > 0) { ps_search_step(search, acmod->output_frame); acmod_advance(acmod); } } } TEST_ASSERT(acmod_end_utt(acmod) >= 0); fclose(rawfh); return ps_search_finish(search); } int main(int argc, char *argv[]) { ps_decoder_t *ps; dict_t *dict; dict2pid_t *d2p; acmod_t *acmod; ps_alignment_t *al; ps_alignment_iter_t *itor; ps_search_t *search; cmd_ln_t *config; int i; config = cmd_ln_init(NULL, ps_args(), FALSE, "-hmm", MODELDIR "/en-us/en-us", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-samprate", "16000", NULL); TEST_ASSERT(ps = ps_init(config)); dict = ps->dict; d2p = ps->d2p; acmod = ps->acmod; al = ps_alignment_init(d2p); TEST_EQUAL(1, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); TEST_EQUAL(2, ps_alignment_add_word(al, dict_wordid(dict, "go"), 0)); TEST_EQUAL(3, ps_alignment_add_word(al, dict_wordid(dict, "forward"), 0)); TEST_EQUAL(4, ps_alignment_add_word(al, dict_wordid(dict, "ten"), 0)); TEST_EQUAL(5, ps_alignment_add_word(al, dict_wordid(dict, "meters"), 0)); TEST_EQUAL(6, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); TEST_EQUAL(0, ps_alignment_populate(al)); TEST_ASSERT(search = state_align_search_init("state_align", config, acmod, al)); for (i = 0; i < 5; i++) do_search(search, acmod); itor = ps_alignment_words(al); TEST_EQUAL(ps_alignment_iter_get(itor)->start, 0); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 8); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->start, 8); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 18); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->start, 26); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 53); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->start, 79); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 36); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->start, 115); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 59); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->start, 174); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 49); itor = ps_alignment_iter_next(itor); TEST_EQUAL(itor, NULL); ps_search_free(search); ps_alignment_free(al); /* Test bad alignment */ al = ps_alignment_init(d2p); TEST_EQUAL(1, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); for (i = 0; i < 20; i++) { TEST_EQUAL(i + 2, ps_alignment_add_word(al, dict_wordid(dict, "hello"), 0)); } TEST_EQUAL(22, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); TEST_EQUAL(0, ps_alignment_populate(al)); TEST_ASSERT(search = state_align_search_init("state_align", config, acmod, al)); E_INFO("Error here is expected, testing bad alignment\n"); TEST_EQUAL(-1, do_search(search, acmod)); ps_search_free(search); ps_alignment_free(al); ps_free(ps); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_simple.c0000664000175000017500000000134612771605033017041 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "test_macros.h" #include "test_ps.c" int main(int argc, char *argv[]) { cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdtree", "yes", "-fwdflat", "yes", "-bestpath", "yes", "-mfclogdir", ".", "-rawlogdir", ".", "-samprate", "16000", NULL)); return ps_decoder_test(config, "BESTPATH", "go forward ten meters"); } pocketsphinx-5prealpha/test/unit/test_ps.c0000664000175000017500000001010312771605033016161 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "test_macros.h" int ps_decoder_test(cmd_ln_t *config, char const *sname, char const *expected) { ps_decoder_t *ps; mfcc_t **cepbuf; FILE *rawfh; int16 *buf; int16 const *bptr; size_t nread; size_t nsamps; int32 nfr, i, score, prob; char const *hyp; double n_speech, n_cpu, n_wall; ps_seg_t *seg; TEST_ASSERT(ps = ps_init(config)); /* Test it first with pocketsphinx_decode_raw() */ TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); hyp = ps_get_hyp(ps, &score); prob = ps_get_prob(ps); printf("%s: %s (%d, %d)\n", sname, hyp, score, prob); TEST_EQUAL(0, strcmp(hyp, expected)); TEST_ASSERT(prob <= 0); ps_get_utt_time(ps, &n_speech, &n_cpu, &n_wall); printf("%.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", n_speech, n_cpu, n_wall); printf("%.2f xRT (CPU), %.2f xRT (elapsed)\n", n_cpu / n_speech, n_wall / n_speech); /* Test it with ps_process_raw() */ clearerr(rawfh); fseek(rawfh, 0, SEEK_END); nsamps = ftell(rawfh) / sizeof(*buf); fseek(rawfh, 0, SEEK_SET); TEST_EQUAL(0, ps_start_utt(ps)); nsamps = 2048; buf = ckd_calloc(nsamps, sizeof(*buf)); while (!feof(rawfh)) { nread = fread(buf, sizeof(*buf), nsamps, rawfh); ps_process_raw(ps, buf, nread, FALSE, FALSE); } TEST_EQUAL(0, ps_end_utt(ps)); hyp = ps_get_hyp(ps, &score); prob = ps_get_prob(ps); printf("%s: %s (%d, %d)\n", sname, hyp, score, prob); TEST_EQUAL(0, strcmp(hyp, expected)); ps_get_utt_time(ps, &n_speech, &n_cpu, &n_wall); printf("%.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", n_speech, n_cpu, n_wall); printf("%.2f xRT (CPU), %.2f xRT (elapsed)\n", n_cpu / n_speech, n_wall / n_speech); /* Now read the whole file and produce an MFCC buffer. */ clearerr(rawfh); fseek(rawfh, 0, SEEK_END); nsamps = ftell(rawfh) / sizeof(*buf); fseek(rawfh, 0, SEEK_SET); bptr = buf = ckd_realloc(buf, nsamps * sizeof(*buf)); TEST_EQUAL(nsamps, fread(buf, sizeof(*buf), nsamps, rawfh)); fe_process_frames(ps->acmod->fe, &bptr, &nsamps, NULL, &nfr, NULL); cepbuf = ckd_calloc_2d(nfr + 1, fe_get_output_size(ps->acmod->fe), sizeof(**cepbuf)); fe_start_utt(ps->acmod->fe); fe_process_frames(ps->acmod->fe, &bptr, &nsamps, cepbuf, &nfr, NULL); fe_end_utt(ps->acmod->fe, cepbuf[nfr], &i); /* Decode it with process_cep() */ TEST_EQUAL(0, ps_start_utt(ps)); for (i = 0; i < nfr; ++i) { ps_process_cep(ps, cepbuf + i, 1, FALSE, FALSE); } TEST_EQUAL(0, ps_end_utt(ps)); hyp = ps_get_hyp(ps, &score); prob = ps_get_prob(ps); printf("%s: %s (%d, %d)\n", sname, hyp, score, prob); TEST_EQUAL(0, strcmp(hyp, expected)); TEST_ASSERT(prob <= 0); for (seg = ps_seg_iter(ps); seg; seg = ps_seg_next(seg)) { char const *word; int sf, ef; int32 post, lscr, ascr, lback; word = ps_seg_word(seg); ps_seg_frames(seg, &sf, &ef); post = ps_seg_prob(seg, &ascr, &lscr, &lback); printf("%s (%d:%d) P(w|o) = %f ascr = %d lscr = %d lback = %d post=%d\n", word, sf, ef, logmath_exp(ps_get_logmath(ps), post), ascr, lscr, lback, post); } ps_get_utt_time(ps, &n_speech, &n_cpu, &n_wall); printf("%.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", n_speech, n_cpu, n_wall); printf("%.2f xRT (CPU), %.2f xRT (elapsed)\n", n_cpu / n_speech, n_wall / n_speech); ps_get_all_time(ps, &n_speech, &n_cpu, &n_wall); printf("TOTAL: %.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", n_speech, n_cpu, n_wall); printf("TOTAL: %.2f xRT (CPU), %.2f xRT (elapsed)\n", n_cpu / n_speech, n_wall / n_speech); fclose(rawfh); ps_free(ps); cmd_ln_free_r(config); ckd_free_2d(cepbuf); ckd_free(buf); return 0; } pocketsphinx-5prealpha/test/unit/test_fwdtree_bestpath.c0000664000175000017500000000123712771605033021101 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "test_macros.h" #include "test_ps.c" int main(int argc, char *argv[]) { cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdtree", "yes", "-fwdflat", "no", "-bestpath", "yes", "-samprate", "16000", NULL)); return ps_decoder_test(config, "BESTPATH", "go forward ten meters"); } pocketsphinx-5prealpha/test/unit/test_macros.h0000664000175000017500000000055312771605033017040 00000000000000#include #include #include #define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } #define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) #define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) #define LOG_EPSILON 200 #define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) pocketsphinx-5prealpha/test/unit/Makefile.in0000664000175000017500000014636012771607732016430 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ check_PROGRAMS = test_acmod$(EXEEXT) test_acmod_grow$(EXEEXT) \ test_alignment$(EXEEXT) test_allphone$(EXEEXT) \ test_dict2pid$(EXEEXT) test_dict$(EXEEXT) test_fsg$(EXEEXT) \ test_fwdflat$(EXEEXT) test_fwdtree_bestpath$(EXEEXT) \ test_fwdtree$(EXEEXT) test_init$(EXEEXT) test_jsgf$(EXEEXT) \ test_keyphrase$(EXEEXT) test_lattice$(EXEEXT) \ test_lm_read$(EXEEXT) test_mllr$(EXEEXT) test_nbest$(EXEEXT) \ test_posterior$(EXEEXT) test_ptm_mgau$(EXEEXT) \ test_reinit$(EXEEXT) test_senfh$(EXEEXT) \ test_set_search$(EXEEXT) test_simple$(EXEEXT) \ test_state_align$(EXEEXT) subdir = test/unit DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) \ $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = test_acmod_SOURCES = test_acmod.c test_acmod_OBJECTS = test_acmod.$(OBJEXT) test_acmod_LDADD = $(LDADD) test_acmod_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = test_acmod_grow_SOURCES = test_acmod_grow.c test_acmod_grow_OBJECTS = test_acmod_grow.$(OBJEXT) test_acmod_grow_LDADD = $(LDADD) test_acmod_grow_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_alignment_SOURCES = test_alignment.c test_alignment_OBJECTS = test_alignment.$(OBJEXT) test_alignment_LDADD = $(LDADD) test_alignment_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_allphone_SOURCES = test_allphone.c test_allphone_OBJECTS = test_allphone.$(OBJEXT) test_allphone_LDADD = $(LDADD) test_allphone_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_dict_SOURCES = test_dict.c test_dict_OBJECTS = test_dict.$(OBJEXT) test_dict_LDADD = $(LDADD) test_dict_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_dict2pid_SOURCES = test_dict2pid.c test_dict2pid_OBJECTS = test_dict2pid.$(OBJEXT) test_dict2pid_LDADD = $(LDADD) test_dict2pid_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_fsg_SOURCES = test_fsg.c test_fsg_OBJECTS = test_fsg.$(OBJEXT) test_fsg_LDADD = $(LDADD) test_fsg_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_fwdflat_SOURCES = test_fwdflat.c test_fwdflat_OBJECTS = test_fwdflat.$(OBJEXT) test_fwdflat_LDADD = $(LDADD) test_fwdflat_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_fwdtree_SOURCES = test_fwdtree.c test_fwdtree_OBJECTS = test_fwdtree.$(OBJEXT) test_fwdtree_LDADD = $(LDADD) test_fwdtree_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_fwdtree_bestpath_SOURCES = test_fwdtree_bestpath.c test_fwdtree_bestpath_OBJECTS = test_fwdtree_bestpath.$(OBJEXT) test_fwdtree_bestpath_LDADD = $(LDADD) test_fwdtree_bestpath_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_init_SOURCES = test_init.c test_init_OBJECTS = test_init.$(OBJEXT) test_init_LDADD = $(LDADD) test_init_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_jsgf_SOURCES = test_jsgf.c test_jsgf_OBJECTS = test_jsgf.$(OBJEXT) test_jsgf_LDADD = $(LDADD) test_jsgf_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_keyphrase_SOURCES = test_keyphrase.c test_keyphrase_OBJECTS = test_keyphrase.$(OBJEXT) test_keyphrase_LDADD = $(LDADD) test_keyphrase_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_lattice_SOURCES = test_lattice.c test_lattice_OBJECTS = test_lattice.$(OBJEXT) test_lattice_LDADD = $(LDADD) test_lattice_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_lm_read_SOURCES = test_lm_read.c test_lm_read_OBJECTS = test_lm_read.$(OBJEXT) test_lm_read_LDADD = $(LDADD) test_lm_read_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_mllr_SOURCES = test_mllr.c test_mllr_OBJECTS = test_mllr.$(OBJEXT) test_mllr_LDADD = $(LDADD) test_mllr_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_nbest_SOURCES = test_nbest.c test_nbest_OBJECTS = test_nbest.$(OBJEXT) test_nbest_LDADD = $(LDADD) test_nbest_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_posterior_SOURCES = test_posterior.c test_posterior_OBJECTS = test_posterior.$(OBJEXT) test_posterior_LDADD = $(LDADD) test_posterior_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_ptm_mgau_SOURCES = test_ptm_mgau.c test_ptm_mgau_OBJECTS = test_ptm_mgau.$(OBJEXT) test_ptm_mgau_LDADD = $(LDADD) test_ptm_mgau_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_reinit_SOURCES = test_reinit.c test_reinit_OBJECTS = test_reinit.$(OBJEXT) test_reinit_LDADD = $(LDADD) test_reinit_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_senfh_SOURCES = test_senfh.c test_senfh_OBJECTS = test_senfh.$(OBJEXT) test_senfh_LDADD = $(LDADD) test_senfh_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_set_search_SOURCES = test_set_search.c test_set_search_OBJECTS = test_set_search.$(OBJEXT) test_set_search_LDADD = $(LDADD) test_set_search_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_simple_SOURCES = test_simple.c test_simple_OBJECTS = test_simple.$(OBJEXT) test_simple_LDADD = $(LDADD) test_simple_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la test_state_align_SOURCES = test_state_align.c test_state_align_OBJECTS = test_state_align.$(OBJEXT) test_state_align_LDADD = $(LDADD) test_state_align_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la 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@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = test_acmod.c test_acmod_grow.c test_alignment.c \ test_allphone.c test_dict.c test_dict2pid.c test_fsg.c \ test_fwdflat.c test_fwdtree.c test_fwdtree_bestpath.c \ test_init.c test_jsgf.c test_keyphrase.c test_lattice.c \ test_lm_read.c test_mllr.c test_nbest.c test_posterior.c \ test_ptm_mgau.c test_reinit.c test_senfh.c test_set_search.c \ test_simple.c test_state_align.c DIST_SOURCES = test_acmod.c test_acmod_grow.c test_alignment.c \ test_allphone.c test_dict.c test_dict2pid.c test_fsg.c \ test_fwdflat.c test_fwdtree.c test_fwdtree_bestpath.c \ test_init.c test_jsgf.c test_keyphrase.c test_lattice.c \ test_lm_read.c test_mllr.c test_nbest.c test_posterior.c \ test_ptm_mgau.c test_reinit.c test_senfh.c test_set_search.c \ test_simple.c test_state_align.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = $(check_PROGRAMS) EXTRA_DIST = test_ps.c noinst_HEADERS = test_macros.h AM_CFLAGS = -I$(top_srcdir)/include \ -I$(top_srcdir)/src/libpocketsphinx \ -I$(top_builddir)/include \ -I$(srcdir) \ -DMODELDIR=\"${top_srcdir}/model\" \ -DDATADIR=\"${top_srcdir}/test/data\" LDADD = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ -lsphinxbase CLEANFILES = *.log *.out *.lat *.mfc *.raw *.dic *.sen all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 test/unit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign test/unit/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test_acmod$(EXEEXT): $(test_acmod_OBJECTS) $(test_acmod_DEPENDENCIES) $(EXTRA_test_acmod_DEPENDENCIES) @rm -f test_acmod$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_acmod_OBJECTS) $(test_acmod_LDADD) $(LIBS) test_acmod_grow$(EXEEXT): $(test_acmod_grow_OBJECTS) $(test_acmod_grow_DEPENDENCIES) $(EXTRA_test_acmod_grow_DEPENDENCIES) @rm -f test_acmod_grow$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_acmod_grow_OBJECTS) $(test_acmod_grow_LDADD) $(LIBS) test_alignment$(EXEEXT): $(test_alignment_OBJECTS) $(test_alignment_DEPENDENCIES) $(EXTRA_test_alignment_DEPENDENCIES) @rm -f test_alignment$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_alignment_OBJECTS) $(test_alignment_LDADD) $(LIBS) test_allphone$(EXEEXT): $(test_allphone_OBJECTS) $(test_allphone_DEPENDENCIES) $(EXTRA_test_allphone_DEPENDENCIES) @rm -f test_allphone$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_allphone_OBJECTS) $(test_allphone_LDADD) $(LIBS) test_dict$(EXEEXT): $(test_dict_OBJECTS) $(test_dict_DEPENDENCIES) $(EXTRA_test_dict_DEPENDENCIES) @rm -f test_dict$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_dict_OBJECTS) $(test_dict_LDADD) $(LIBS) test_dict2pid$(EXEEXT): $(test_dict2pid_OBJECTS) $(test_dict2pid_DEPENDENCIES) $(EXTRA_test_dict2pid_DEPENDENCIES) @rm -f test_dict2pid$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_dict2pid_OBJECTS) $(test_dict2pid_LDADD) $(LIBS) test_fsg$(EXEEXT): $(test_fsg_OBJECTS) $(test_fsg_DEPENDENCIES) $(EXTRA_test_fsg_DEPENDENCIES) @rm -f test_fsg$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_fsg_OBJECTS) $(test_fsg_LDADD) $(LIBS) test_fwdflat$(EXEEXT): $(test_fwdflat_OBJECTS) $(test_fwdflat_DEPENDENCIES) $(EXTRA_test_fwdflat_DEPENDENCIES) @rm -f test_fwdflat$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_fwdflat_OBJECTS) $(test_fwdflat_LDADD) $(LIBS) test_fwdtree$(EXEEXT): $(test_fwdtree_OBJECTS) $(test_fwdtree_DEPENDENCIES) $(EXTRA_test_fwdtree_DEPENDENCIES) @rm -f test_fwdtree$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_fwdtree_OBJECTS) $(test_fwdtree_LDADD) $(LIBS) test_fwdtree_bestpath$(EXEEXT): $(test_fwdtree_bestpath_OBJECTS) $(test_fwdtree_bestpath_DEPENDENCIES) $(EXTRA_test_fwdtree_bestpath_DEPENDENCIES) @rm -f test_fwdtree_bestpath$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_fwdtree_bestpath_OBJECTS) $(test_fwdtree_bestpath_LDADD) $(LIBS) test_init$(EXEEXT): $(test_init_OBJECTS) $(test_init_DEPENDENCIES) $(EXTRA_test_init_DEPENDENCIES) @rm -f test_init$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_init_OBJECTS) $(test_init_LDADD) $(LIBS) test_jsgf$(EXEEXT): $(test_jsgf_OBJECTS) $(test_jsgf_DEPENDENCIES) $(EXTRA_test_jsgf_DEPENDENCIES) @rm -f test_jsgf$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_jsgf_OBJECTS) $(test_jsgf_LDADD) $(LIBS) test_keyphrase$(EXEEXT): $(test_keyphrase_OBJECTS) $(test_keyphrase_DEPENDENCIES) $(EXTRA_test_keyphrase_DEPENDENCIES) @rm -f test_keyphrase$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_keyphrase_OBJECTS) $(test_keyphrase_LDADD) $(LIBS) test_lattice$(EXEEXT): $(test_lattice_OBJECTS) $(test_lattice_DEPENDENCIES) $(EXTRA_test_lattice_DEPENDENCIES) @rm -f test_lattice$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_lattice_OBJECTS) $(test_lattice_LDADD) $(LIBS) test_lm_read$(EXEEXT): $(test_lm_read_OBJECTS) $(test_lm_read_DEPENDENCIES) $(EXTRA_test_lm_read_DEPENDENCIES) @rm -f test_lm_read$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_lm_read_OBJECTS) $(test_lm_read_LDADD) $(LIBS) test_mllr$(EXEEXT): $(test_mllr_OBJECTS) $(test_mllr_DEPENDENCIES) $(EXTRA_test_mllr_DEPENDENCIES) @rm -f test_mllr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_mllr_OBJECTS) $(test_mllr_LDADD) $(LIBS) test_nbest$(EXEEXT): $(test_nbest_OBJECTS) $(test_nbest_DEPENDENCIES) $(EXTRA_test_nbest_DEPENDENCIES) @rm -f test_nbest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_nbest_OBJECTS) $(test_nbest_LDADD) $(LIBS) test_posterior$(EXEEXT): $(test_posterior_OBJECTS) $(test_posterior_DEPENDENCIES) $(EXTRA_test_posterior_DEPENDENCIES) @rm -f test_posterior$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_posterior_OBJECTS) $(test_posterior_LDADD) $(LIBS) test_ptm_mgau$(EXEEXT): $(test_ptm_mgau_OBJECTS) $(test_ptm_mgau_DEPENDENCIES) $(EXTRA_test_ptm_mgau_DEPENDENCIES) @rm -f test_ptm_mgau$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_ptm_mgau_OBJECTS) $(test_ptm_mgau_LDADD) $(LIBS) test_reinit$(EXEEXT): $(test_reinit_OBJECTS) $(test_reinit_DEPENDENCIES) $(EXTRA_test_reinit_DEPENDENCIES) @rm -f test_reinit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_reinit_OBJECTS) $(test_reinit_LDADD) $(LIBS) test_senfh$(EXEEXT): $(test_senfh_OBJECTS) $(test_senfh_DEPENDENCIES) $(EXTRA_test_senfh_DEPENDENCIES) @rm -f test_senfh$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_senfh_OBJECTS) $(test_senfh_LDADD) $(LIBS) test_set_search$(EXEEXT): $(test_set_search_OBJECTS) $(test_set_search_DEPENDENCIES) $(EXTRA_test_set_search_DEPENDENCIES) @rm -f test_set_search$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_set_search_OBJECTS) $(test_set_search_LDADD) $(LIBS) test_simple$(EXEEXT): $(test_simple_OBJECTS) $(test_simple_DEPENDENCIES) $(EXTRA_test_simple_DEPENDENCIES) @rm -f test_simple$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_simple_OBJECTS) $(test_simple_LDADD) $(LIBS) test_state_align$(EXEEXT): $(test_state_align_OBJECTS) $(test_state_align_DEPENDENCIES) $(EXTRA_test_state_align_DEPENDENCIES) @rm -f test_state_align$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_state_align_OBJECTS) $(test_state_align_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_acmod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_acmod_grow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_alignment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_allphone.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dict.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dict2pid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fwdflat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fwdtree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fwdtree_bestpath.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_jsgf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_keyphrase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_lattice.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_lm_read.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mllr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_nbest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_posterior.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ptm_mgau.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_reinit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_senfh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_set_search.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_simple.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_state_align.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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 # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test_acmod.log: test_acmod$(EXEEXT) @p='test_acmod$(EXEEXT)'; \ b='test_acmod'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_acmod_grow.log: test_acmod_grow$(EXEEXT) @p='test_acmod_grow$(EXEEXT)'; \ b='test_acmod_grow'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_alignment.log: test_alignment$(EXEEXT) @p='test_alignment$(EXEEXT)'; \ b='test_alignment'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_allphone.log: test_allphone$(EXEEXT) @p='test_allphone$(EXEEXT)'; \ b='test_allphone'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_dict2pid.log: test_dict2pid$(EXEEXT) @p='test_dict2pid$(EXEEXT)'; \ b='test_dict2pid'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_dict.log: test_dict$(EXEEXT) @p='test_dict$(EXEEXT)'; \ b='test_dict'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_fsg.log: test_fsg$(EXEEXT) @p='test_fsg$(EXEEXT)'; \ b='test_fsg'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_fwdflat.log: test_fwdflat$(EXEEXT) @p='test_fwdflat$(EXEEXT)'; \ b='test_fwdflat'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_fwdtree_bestpath.log: test_fwdtree_bestpath$(EXEEXT) @p='test_fwdtree_bestpath$(EXEEXT)'; \ b='test_fwdtree_bestpath'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_fwdtree.log: test_fwdtree$(EXEEXT) @p='test_fwdtree$(EXEEXT)'; \ b='test_fwdtree'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_init.log: test_init$(EXEEXT) @p='test_init$(EXEEXT)'; \ b='test_init'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_jsgf.log: test_jsgf$(EXEEXT) @p='test_jsgf$(EXEEXT)'; \ b='test_jsgf'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_keyphrase.log: test_keyphrase$(EXEEXT) @p='test_keyphrase$(EXEEXT)'; \ b='test_keyphrase'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_lattice.log: test_lattice$(EXEEXT) @p='test_lattice$(EXEEXT)'; \ b='test_lattice'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_lm_read.log: test_lm_read$(EXEEXT) @p='test_lm_read$(EXEEXT)'; \ b='test_lm_read'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_mllr.log: test_mllr$(EXEEXT) @p='test_mllr$(EXEEXT)'; \ b='test_mllr'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_nbest.log: test_nbest$(EXEEXT) @p='test_nbest$(EXEEXT)'; \ b='test_nbest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_posterior.log: test_posterior$(EXEEXT) @p='test_posterior$(EXEEXT)'; \ b='test_posterior'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_ptm_mgau.log: test_ptm_mgau$(EXEEXT) @p='test_ptm_mgau$(EXEEXT)'; \ b='test_ptm_mgau'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_reinit.log: test_reinit$(EXEEXT) @p='test_reinit$(EXEEXT)'; \ b='test_reinit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_senfh.log: test_senfh$(EXEEXT) @p='test_senfh$(EXEEXT)'; \ b='test_senfh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_set_search.log: test_set_search$(EXEEXT) @p='test_set_search$(EXEEXT)'; \ b='test_set_search'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_simple.log: test_simple$(EXEEXT) @p='test_simple$(EXEEXT)'; \ b='test_simple'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_state_align.log: test_state_align$(EXEEXT) @p='test_state_align$(EXEEXT)'; \ b='test_state_align'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(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 $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: 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: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ 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-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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am valgrind-check: for testf in .libs/lt-*; do valgrind --leak-check=full --show-reachable=yes \ $$testf; done >& valgrind.log # 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: pocketsphinx-5prealpha/test/unit/test_ptm_mgau.c0000664000175000017500000000723412771605033017363 00000000000000#include #include #include #include #include "pocketsphinx_internal.h" #include "ptm_mgau.h" #include "ms_mgau.h" #include "test_macros.h" static const mfcc_t cmninit[13] = { FLOAT2MFCC(41.00), FLOAT2MFCC(-5.29), FLOAT2MFCC(-0.12), FLOAT2MFCC(5.09), FLOAT2MFCC(2.48), FLOAT2MFCC(-4.07), FLOAT2MFCC(-1.37), FLOAT2MFCC(-1.78), FLOAT2MFCC(-5.08), FLOAT2MFCC(-2.05), FLOAT2MFCC(-6.45), FLOAT2MFCC(-1.42), FLOAT2MFCC(1.17) }; void run_acmod_test(acmod_t *acmod) { FILE *rawfh; int16 *buf; int16 const *bptr; size_t nread, nsamps; int nfr; int frame_counter; cmn_live_set(acmod->fcb->cmn_struct, cmninit); nsamps = 2048; frame_counter = 0; buf = ckd_calloc(nsamps, sizeof(*buf)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); TEST_EQUAL(0, acmod_start_utt(acmod)); printf("Incremental(2048):\n"); while (!feof(rawfh)) { nread = fread(buf, sizeof(*buf), nsamps, rawfh); bptr = buf; while ((nfr = acmod_process_raw(acmod, &bptr, &nread, FALSE)) > 0) { int16 best_score; int frame_idx = -1, best_senid; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); printf("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; frame_idx = -1; } } } TEST_EQUAL(0, acmod_end_utt(acmod)); nread = 0; { int16 best_score; int frame_idx = -1, best_senid; while (acmod->n_feat_frame > 0) { acmod_score(acmod, &frame_idx); acmod_advance(acmod); best_score = acmod_best_score(acmod, &best_senid); printf("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; frame_idx = -1; } } fclose(rawfh); } int main(int argc, char *argv[]) { logmath_t *lmath; cmd_ln_t *config; acmod_t *acmod; ps_mgau_t *ps; ptm_mgau_t *s; int i, lastcb; lmath = logmath_init(1.0001, 0, 0); config = cmd_ln_init(NULL, ps_args(), TRUE, "-compallsen", "yes", NULL); cmd_ln_parse_file_r(config, ps_args(), MODELDIR "/en-us/en-us/feat.params", FALSE); cmd_ln_set_str_extra_r(config, "_mdef", MODELDIR "/en-us/en-us/mdef"); cmd_ln_set_str_extra_r(config, "_mean", MODELDIR "/en-us/en-us/means"); cmd_ln_set_str_extra_r(config, "_var", MODELDIR "/en-us/en-us/variances"); cmd_ln_set_str_extra_r(config, "_tmat", MODELDIR "/en-us/en-us/transition_matrices"); cmd_ln_set_str_extra_r(config, "_sendump", MODELDIR "/en-us/en-us/sendump"); cmd_ln_set_str_extra_r(config, "_mixw", NULL); cmd_ln_set_str_extra_r(config, "_lda", NULL); cmd_ln_set_str_extra_r(config, "_senmgau", NULL); err_set_debug_level(3); TEST_ASSERT(config); TEST_ASSERT((acmod = acmod_init(config, lmath, NULL, NULL))); TEST_ASSERT((ps = acmod->mgau)); TEST_EQUAL(0, strcmp(ps->vt->name, "ptm")); s = (ptm_mgau_t *)ps; E_DEBUG(2,("PTM model loaded: %d codebooks, %d senones, %d frames of history\n", s->g->n_mgau, s->n_sen, s->n_fast_hist)); E_DEBUG(2,("Senone to codebook mappings:\n")); lastcb = s->sen2cb[0]; E_DEBUG(2,("\t%d: 0", lastcb)); for (i = 0; i < s->n_sen; ++i) { if (s->sen2cb[i] != lastcb) { lastcb = s->sen2cb[i]; E_DEBUGCONT(2,("-%d\n", i-1)); E_DEBUGCONT(2,("\t%d: %d", lastcb, i)); } } E_INFOCONT("-%d\n", i-1); run_acmod_test(acmod); #if 0 /* Replace it with ms_mgau. */ ptm_mgau_free(ps); cmd_ln_set_str_r(config, "-mixw", MODELDIR "/en-us/en-us/mixture_weights"); TEST_ASSERT((acmod->mgau = ms_mgau_init(acmod, lmath, acmod->mdef))); run_acmod_test(acmod); cmd_ln_free_r(config); #endif return 0; } pocketsphinx-5prealpha/test/unit/test_dict.c0000664000175000017500000000343112771605033016470 00000000000000#include #include #include #include #include "dict.h" #include "test_macros.h" int main(int argc, char *argv[]) { bin_mdef_t *mdef; dict_t *dict; cmd_ln_t *config; int i; char buf[100]; TEST_ASSERT(config = cmd_ln_init(NULL, NULL, FALSE, "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "_fdict", MODELDIR "/en-us/en-us/noisedict", NULL)); /* Test dictionary in standard fashion. */ TEST_ASSERT(mdef = bin_mdef_read(NULL, MODELDIR "/en-us/en-us/mdef")); TEST_ASSERT(dict = dict_init(config, mdef)); printf("Word ID (CARNEGIE) = %d\n", dict_wordid(dict, "CARNEGIE")); printf("Word ID (ASDFASFASSD) = %d\n", dict_wordid(dict, "ASDFASFASSD")); TEST_EQUAL(0, dict_write(dict, "_cmu07a.dic", NULL)); TEST_EQUAL(0, system("diff -uw " MODELDIR "/en-us/cmudict-en-us.dict _cmu07a.dic")); dict_free(dict); bin_mdef_free(mdef); /* Now test an empty dictionary. */ TEST_ASSERT(dict = dict_init(NULL, NULL)); printf("Word ID() = %d\n", dict_wordid(dict, "")); TEST_ASSERT(BAD_S3WID != dict_add_word(dict, "FOOBIE", NULL, 0)); TEST_ASSERT(BAD_S3WID != dict_add_word(dict, "BLETCH", NULL, 0)); printf("Word ID(FOOBIE) = %d\n", dict_wordid(dict, "FOOBIE")); printf("Word ID(BLETCH) = %d\n", dict_wordid(dict, "BLETCH")); TEST_ASSERT(dict_real_word(dict, dict_wordid(dict, "FOOBIE"))); TEST_ASSERT(dict_real_word(dict, dict_wordid(dict, "BLETCH"))); TEST_ASSERT(!dict_real_word(dict, dict_wordid(dict, ""))); dict_free(dict); /* Test to add 500k words. */ TEST_ASSERT(dict = dict_init(NULL, NULL)); for (i = 0; i < 5000; i++) { sprintf(buf, "word_%d", i); TEST_ASSERT(BAD_S3WID != dict_add_word(dict, buf, NULL, 0)); } dict_free(dict); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_set_search.c0000664000175000017500000001111512771605033017663 00000000000000#include #include #include #include "test_macros.h" static cmd_ln_t * default_config() { return cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", NULL); } static void test_no_search() { cmd_ln_t *config = default_config(); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(ps_start_utt(ps) < 0); ps_free(ps); cmd_ln_free_r(config); } static void test_default_fsg() { cmd_ln_t *config = default_config(); cmd_ln_set_str_r(config, "-hmm", DATADIR "/tidigits/hmm"); cmd_ln_set_str_r(config, "-dict", DATADIR "/tidigits/lm/tidigits.dic"); cmd_ln_set_str_r(config, "-fsg", DATADIR "/tidigits/lm/tidigits.fsg"); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(!ps_get_lm(ps, PS_DEFAULT_SEARCH)); TEST_ASSERT(ps_get_fsg(ps, PS_DEFAULT_SEARCH)); ps_free(ps); cmd_ln_free_r(config); } static void test_default_jsgf() { cmd_ln_t *config = default_config(); cmd_ln_set_str_r(config, "-jsgf", DATADIR "/goforward.gram"); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(!ps_get_lm(ps, PS_DEFAULT_SEARCH)); TEST_ASSERT(ps_get_fsg(ps, PS_DEFAULT_SEARCH)); ps_free(ps); cmd_ln_free_r(config); } static void test_default_lm() { cmd_ln_t *config = default_config(); cmd_ln_set_str_r(config, "-lm", MODELDIR "/en-us/en-us.lm.bin"); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(!ps_get_fsg(ps, PS_DEFAULT_SEARCH)); TEST_ASSERT(ps_get_lm(ps, PS_DEFAULT_SEARCH)); ps_free(ps); cmd_ln_free_r(config); } static void test_default_lmctl() { cmd_ln_t *config = default_config(); cmd_ln_set_str_r(config, "-lmctl", DATADIR "/test.lmctl"); cmd_ln_set_str_r(config, "-lmname", "tidigits"); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(ps_get_lm(ps, "tidigits")); TEST_ASSERT(ps_get_lm(ps, "turtle")); TEST_ASSERT(!ps_set_search(ps, "turtle")); TEST_ASSERT(!ps_set_search(ps, "tidigits")); ps_free(ps); cmd_ln_free_r(config); } static void test_set_search() { cmd_ln_t *config = default_config(); ps_decoder_t *ps = ps_init(config); ps_search_iter_t *itor; jsgf_t *jsgf = jsgf_parse_file(DATADIR "/goforward.gram", NULL); fsg_model_t *fsg = jsgf_build_fsg(jsgf, jsgf_get_rule(jsgf, "goforward.move"), ps->lmath, cmd_ln_int32_r(config, "-lw")); TEST_ASSERT(!ps_set_fsg(ps, "goforward", fsg)); fsg_model_free(fsg); jsgf_grammar_free(jsgf); TEST_ASSERT(!ps_set_jsgf_file(ps, "goforward_other", DATADIR "/goforward.gram")); // Second time TEST_ASSERT(!ps_set_jsgf_file(ps, "goforward_other", DATADIR "/goforward.gram")); ngram_model_t *lm = ngram_model_read(config, DATADIR "/tidigits/lm/tidigits.lm.bin", NGRAM_AUTO, ps->lmath); TEST_ASSERT(!ps_set_lm(ps, "tidigits", lm)); ngram_model_free(lm); TEST_ASSERT(!ps_set_search(ps, "tidigits")); TEST_ASSERT(!ps_set_search(ps, "goforward")); itor = ps_search_iter(ps); TEST_EQUAL(0, strcmp("goforward_other", ps_search_iter_val(itor))); itor = ps_search_iter_next(itor); TEST_EQUAL(0, strcmp("tidigits", ps_search_iter_val(itor))); itor = ps_search_iter_next(itor); TEST_EQUAL(0, strcmp("goforward", ps_search_iter_val(itor))); itor = ps_search_iter_next(itor); TEST_EQUAL(0, strcmp("_default_pl", ps_search_iter_val(itor))); itor = ps_search_iter_next(itor); TEST_EQUAL(NULL, itor); TEST_ASSERT(!ps_start_utt(ps)); TEST_ASSERT(!ps_end_utt(ps)); ps_free(ps); cmd_ln_free_r(config); } static void test_check_mode() { cmd_ln_t *config = default_config(); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(!ps_set_jsgf_file(ps, "goforward", DATADIR "/goforward.gram")); ngram_model_t *lm = ngram_model_read(config, DATADIR "/tidigits/lm/tidigits.lm.bin", NGRAM_AUTO, ps->lmath); TEST_ASSERT(!ps_set_lm(ps, "tidigits", lm)); ngram_model_free(lm); TEST_ASSERT(!ps_set_search(ps, "tidigits")); ps_start_utt(ps); TEST_EQUAL(-1, ps_set_search(ps, "tidigits")); TEST_EQUAL(-1, ps_set_search(ps, "goforward")); ps_end_utt(ps); ps_free(ps); cmd_ln_free_r(config); } int main(int argc, char* argv[]) { test_no_search(); test_default_fsg(); test_default_jsgf(); test_default_lm(); test_default_lmctl(); test_set_search(); test_check_mode(); return 0; } pocketsphinx-5prealpha/test/unit/test_dict2pid.c0000664000175000017500000000130412771605033017244 00000000000000#include #include #include #include #include "dict.h" #include "dict2pid.h" #include "test_macros.h" int main(int argc, char *argv[]) { bin_mdef_t *mdef; dict_t *dict; dict2pid_t *d2p; cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, NULL, FALSE, "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "_fdict", MODELDIR "/en-us/en-us/noisedict", NULL)); TEST_ASSERT(mdef = bin_mdef_read(NULL, MODELDIR "/en-us/en-us/mdef")); TEST_ASSERT(dict = dict_init(config, mdef)); TEST_ASSERT(d2p = dict2pid_build(mdef, dict)); dict_free(dict); dict2pid_free(d2p); bin_mdef_free(mdef); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_init.c0000664000175000017500000000105112771605033016504 00000000000000#include #include #include #include "test_macros.h" int main(int argc, char *argv[]) { ps_decoder_t *ps; cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdtree", "yes", "-fwdflat", "yes", "-bestpath", "yes", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); ps_free(ps); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_lattice.c0000664000175000017500000001016112771605033017170 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "ps_lattice_internal.h" #include "test_macros.h" #include "test_ps.c" int test_nodes_and_stuff(ps_lattice_t *dag) { ps_latnode_iter_t *itor; ps_latlink_iter_t *litor; ps_latnode_t *forward = NULL; TEST_ASSERT(itor = ps_latnode_iter(dag)); while ((itor = ps_latnode_iter_next(itor))) { int16 sf, fef, lef; ps_latnode_t *node; float64 post; node = ps_latnode_iter_node(itor); sf = ps_latnode_times(node, &fef, &lef); post = logmath_exp(ps_lattice_get_logmath(dag), ps_latnode_prob(dag, node, NULL)); if (post > 0.0001) printf("%s %s %d -> (%d,%d) %f\n", ps_latnode_baseword(dag, node), ps_latnode_word(dag, node), sf, fef, lef, post); if (0 == strcmp(ps_latnode_baseword(dag, node), "forward")) forward = node; } TEST_ASSERT(forward); printf("FORWARD entries:\n"); for (litor = ps_latnode_entries(forward); litor; litor = ps_latlink_iter_next(litor)) { ps_latlink_t *link = ps_latlink_iter_link(litor); int16 sf, ef; float64 post; int32 ascr; ef = ps_latlink_times(link, &sf); post = logmath_exp(ps_lattice_get_logmath(dag), ps_latlink_prob(dag, link, &ascr)); if (post > 0.0001) printf("%s %d -> %d prob %f ascr %d\n", ps_latlink_baseword(dag, link), sf, ef, post, ascr); } printf("FORWARD exits:\n"); for (litor = ps_latnode_exits(forward); litor; litor = ps_latlink_iter_next(litor)) { ps_latlink_t *link = ps_latlink_iter_link(litor); int16 sf, ef; float64 post; int32 ascr; ef = ps_latlink_times(link, &sf); post = logmath_exp(ps_lattice_get_logmath(dag), ps_latlink_prob(dag, link, &ascr)); if (post > 0.0001) printf("%d -> %d prob %f ascr %d\n", sf, ef, post, ascr); } return 0; } int test_remaining_nodes(ps_lattice_t *dag) { ps_latnode_iter_t *itor; ps_latlink_iter_t *litor; int count, lcount; count = 0; lcount = 0; for (itor = ps_latnode_iter(dag); itor; itor = ps_latnode_iter_next(itor)) { ps_latnode_t* node = ps_latnode_iter_node(itor); for (litor = ps_latnode_entries(node); litor; litor = ps_latlink_iter_next(litor)) { lcount++; } count++; } TEST_ASSERT(count == 3); TEST_ASSERT(lcount == 2); printf("Remaining %d nodes %d links\n", count, lcount); return 0; } int main(int argc, char *argv[]) { ps_decoder_t *ps; ps_lattice_t *dag; cmd_ln_t *config; FILE *rawfh; char const *hyp; int32 score; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdtree", "yes", "-fwdflat", "no", "-bestpath", "no", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); fclose(rawfh); hyp = ps_get_hyp(ps, &score); printf("FWDFLAT: %s (%d)\n", hyp, score); TEST_ASSERT(dag = ps_get_lattice(ps)); ps_lattice_bestpath(dag, ps_get_lm(ps, PS_DEFAULT_SEARCH), 1.0, 1.0/15.0); score = ps_lattice_posterior(dag, ps_get_lm(ps, PS_DEFAULT_SEARCH), 1.0/15.0); printf("P(S|O) = %d\n", score); test_nodes_and_stuff(dag); ps_lattice_posterior_prune(dag, logmath_log(ps_lattice_get_logmath(dag), 1e-2)); test_nodes_and_stuff(dag); TEST_EQUAL(0, ps_lattice_write(dag, "goforward.lat")); dag = ps_lattice_read(ps, "goforward.lat"); TEST_ASSERT(dag); ps_lattice_bestpath(dag, ps_get_lm(ps, PS_DEFAULT_SEARCH), 1.0, 1.0/15.0); score = ps_lattice_posterior(dag, ps_get_lm(ps, PS_DEFAULT_SEARCH), 1.0/15.0); printf("P(S|O) = %d\n", score); test_nodes_and_stuff(dag); ps_lattice_free(dag); ps_free(ps); cmd_ln_free_r(config); /* Now test standalone lattices. */ dag = ps_lattice_read(NULL, "goforward.lat"); TEST_ASSERT(dag); test_nodes_and_stuff(dag); ps_lattice_free(dag); /* Test stripping the unreachable nodes. */ dag = ps_lattice_read(NULL, DATADIR "/unreachable.lat"); TEST_ASSERT(dag); ps_lattice_delete_unreachable(dag); test_remaining_nodes(dag); ps_lattice_free(dag); return 0; } pocketsphinx-5prealpha/test/unit/test_lm_read.c0000664000175000017500000000574112771605033017156 00000000000000#include #include #include #include "test_macros.h" int main(int argc, char *argv[]) { char const *hyp; ps_decoder_t *ps; cmd_ln_t *config; ngram_model_t *lm; FILE *rawfh; int32 score; /* First decode it with the crappy WSJ language model. */ TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", DATADIR "/defective.dic", "-dictcase", "yes", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); hyp = ps_get_hyp(ps, &score); printf("%s (%d)\n", hyp, score); TEST_EQUAL(0, strcmp(hyp, "go forward ten years")); /* Now load the turtle language model. */ lm = ngram_model_read(config, DATADIR "/turtle.lm.bin", NGRAM_AUTO, ps_get_logmath(ps)); ps_set_lm(ps, "turtle", lm); ps_set_search(ps, "turtle"); clearerr(rawfh); fseek(rawfh, 0, SEEK_SET); TEST_ASSERT(ps_decode_raw(ps, rawfh, -1)); hyp = ps_get_hyp(ps, &score); printf("%s (%d)\n", hyp, score); /* Oops! It's still not correct, because METERS isn't in the * dictionary that we originally loaded. */ TEST_EQUAL(0, strcmp(hyp, "go forward ten degrees")); /* So let's add it to the dictionary. */ ps_add_word(ps, "foobie", "F UW B IY", FALSE); ps_add_word(ps, "meters", "M IY T ER Z", TRUE); /* And try again. */ clearerr(rawfh); fseek(rawfh, 0, SEEK_SET); TEST_ASSERT(ps_decode_raw(ps, rawfh, -1)); hyp = ps_get_hyp(ps, &score); TEST_ASSERT(hyp); printf("%s (%d)\n", hyp, score); ps_lattice_write(ps_get_lattice(ps), "meters.lat"); /* Bingo! */ TEST_EQUAL(0, strcmp(hyp, "go forward ten meters")); /* Now let's test dictionary switching. */ TEST_EQUAL(-1, ps_load_dict(ps, DATADIR "/turtle_missing_file.dic", NULL, NULL)); /* Now let's test dictionary switching. */ TEST_EQUAL(0, ps_load_dict(ps, DATADIR "/turtle.dic", NULL, NULL)); /* And try again. */ clearerr(rawfh); fseek(rawfh, 0, SEEK_SET); TEST_ASSERT(ps_decode_raw(ps, rawfh, -1)); hyp = ps_get_hyp(ps, &score); printf("%s (%d)\n", hyp, score); TEST_EQUAL(0, strcmp(hyp, "go forward ten meters")); /* Try switching back again just to make sure. */ TEST_EQUAL(0, ps_load_dict(ps, DATADIR "/defective.dic", NULL, NULL)); clearerr(rawfh); fseek(rawfh, 0, SEEK_SET); TEST_ASSERT(ps_decode_raw(ps, rawfh, -1)); hyp = ps_get_hyp(ps, &score); printf("%s (%d)\n", hyp, score); TEST_EQUAL(0, strcmp(hyp, "go forward ten degrees")); fclose(rawfh); ps_free(ps); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_nbest.c0000664000175000017500000000243212771605033016660 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "test_macros.h" #include "test_ps.c" int main(int argc, char *argv[]) { ps_decoder_t *ps; ps_nbest_t *nbest; cmd_ln_t *config; FILE *rawfh; char const *hyp; int32 score, n; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdtree", "yes", "-fwdflat", "yes", "-bestpath", "yes", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); fclose(rawfh); hyp = ps_get_hyp(ps, &score); printf("BESTPATH: %s (%d)\n", hyp, score); for (n = 1, nbest = ps_nbest(ps); nbest && n < 10; nbest = ps_nbest_next(nbest), n++) { ps_seg_t *seg; hyp = ps_nbest_hyp(nbest, &score); printf("NBEST %d: %s (%d)\n", n, hyp, score); for (seg = ps_nbest_seg(nbest); seg; seg = ps_seg_next(seg)) { char const *word; int sf, ef; word = ps_seg_word(seg); ps_seg_frames(seg, &sf, &ef); printf("%s %d %d\n", word, sf, ef); } } if (nbest) ps_nbest_free(nbest); ps_free(ps); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_fsg.c0000664000175000017500000000343712771605033016332 00000000000000#include #include #include #include #include "pocketsphinx_internal.h" #include "fsg_search_internal.h" #include "ps_lattice_internal.h" #include "test_macros.h" int main(int argc, char *argv[]) { ps_decoder_t *ps; cmd_ln_t *config; ps_lattice_t *dag; const char *hyp; ps_seg_t *seg; int32 score, prob; FILE *rawfh; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-fsg", DATADIR "/goforward.fsg", "-dict", DATADIR "/turtle.dic", "-bestpath", "no", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); hyp = ps_get_hyp(ps, &score); prob = ps_get_prob(ps); printf("%s (%d, %d)\n", hyp, score, prob); TEST_EQUAL(0, strcmp("go forward ten meters", hyp)); for (seg = ps_seg_iter(ps); seg; seg = ps_seg_next(seg)) { char const *word; int sf, ef; int32 post, lscr, ascr, lback; word = ps_seg_word(seg); ps_seg_frames(seg, &sf, &ef); if (sf == ef) continue; post = ps_seg_prob(seg, &ascr, &lscr, &lback); printf("%s (%d:%d) P(w|o) = %f ascr = %d lscr = %d lback = %d\n", word, sf, ef, logmath_exp(ps_get_logmath(ps), post), ascr, lscr, lback); } /* Now get the DAG and play with it. */ dag = ps_get_lattice(ps); ps_lattice_write(dag, "test_fsg.lat"); printf("BESTPATH: %s\n", ps_lattice_hyp(dag, ps_lattice_bestpath(dag, NULL, 1.0, 15.0))); ps_lattice_posterior(dag, NULL, 15.0); ps_free(ps); cmd_ln_free_r(config); return 0; } pocketsphinx-5prealpha/test/unit/test_allphone.c0000664000175000017500000000114612771605033017350 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "test_macros.h" #include "test_ps.c" int main(int argc, char *argv[]) { cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-allphone", MODELDIR "/en-us/en-us-phone.lm.bin", "-beam", "1e-20", "-pbeam", "1e-10", "-allphone_ci", "no", "-lw", "2.0", NULL)); return ps_decoder_test(config, "ALLPHONE", "SIL G OW F AO R W ER D T AE N M IY IH ZH ER Z S V SIL"); } pocketsphinx-5prealpha/test/unit/test_fwdtree.c0000664000175000017500000000123512771605033017205 00000000000000#include #include #include #include "pocketsphinx_internal.h" #include "test_macros.h" #include "test_ps.c" int main(int argc, char *argv[]) { cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdtree", "yes", "-fwdflat", "no", "-bestpath", "no", "-samprate", "16000", NULL)); return ps_decoder_test(config, "FWDTREE", "go forward ten meters"); } pocketsphinx-5prealpha/swig/0000775000175000017500000000000012771610005013427 500000000000000pocketsphinx-5prealpha/swig/pocketsphinx.i0000664000175000017500000001256112771605033016252 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2013 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ %define DOCSTRING "This documentation was automatically generated using original comments in Doxygen format. As some C types and data structures cannot be directly mapped into Python types, some non-trivial type conversion could have place. Basically a type is replaced with another one that has the closest match, and sometimes one argument of generated function comprises several arguments of the original function (usually two). Functions having error code as the return value and returning effective value in one of its arguments are transformed so that the effective value is returned in a regular fashion and run-time exception is being thrown in case of negative error code." %enddef #if SWIGJAVA %module PocketSphinx #else %module(docstring=DOCSTRING) pocketsphinx #endif %feature("autodoc", "1"); %include typemaps.i %include iterators.i %import sphinxbase.i #if SWIGPYTHON %include pybuffer.i #endif %{ typedef cmd_ln_t Config; typedef feat_t Feature; typedef fe_t FrontEnd; typedef fsg_model_t FsgModel; typedef logmath_t LogMath; typedef ngram_model_t NGramModel; typedef ngram_model_t NGramModelSet; %} #if SWIGPYTHON %begin %{ #include %} #endif #if SWIGJAVASCRIPT %begin %{ #include #include #include %} #endif %begin %{ #ifndef __cplusplus typedef int bool; #define true 1 #define false 0 #endif #include typedef ps_decoder_t Decoder; typedef ps_decoder_t SegmentList; typedef ps_decoder_t NBestList; typedef ps_lattice_t Lattice; %} %inline %{ // TODO: make private with %immutable typedef struct { char *hypstr; int best_score; int prob; } Hypothesis; typedef struct { char *word; int32 ascore; int32 lscore; int32 lback; int32 prob; int start_frame; int end_frame; } Segment; typedef struct { char *hypstr; int32 score; } NBest; %} %nodefaultctor SegmentList; %nodefaultctor NBestList; sb_iterator(Segment, ps_seg, Segment) sb_iterator(NBest, ps_nbest, NBest) sb_iterable(SegmentList, Segment, ps_seg, ps_seg_iter, Segment) sb_iterable(NBestList, NBest, ps_nbest, ps_nbest, NBest) typedef struct {} Decoder; typedef struct {} Lattice; typedef struct {} NBestList; typedef struct {} SegmentList; #ifdef HAS_DOC %include pydoc.i #endif %extend Hypothesis { Hypothesis(char const *hypstr, int best_score, int prob) { Hypothesis *h = (Hypothesis *)ckd_malloc(sizeof *h); if (hypstr) h->hypstr = ckd_salloc(hypstr); else h->hypstr = NULL; h->best_score = best_score; h->prob = prob; return h; } ~Hypothesis() { if ($self->hypstr) ckd_free($self->hypstr); ckd_free($self); } } %extend Segment { static Segment* fromIter(ps_seg_t *itor) { Segment *seg; if (!itor) return NULL; seg = (Segment *)ckd_malloc(sizeof(Segment)); seg->word = ckd_salloc(ps_seg_word(itor)); seg->prob = ps_seg_prob(itor, &(seg->ascore), &(seg->lscore), &(seg->lback)); ps_seg_frames(itor, &seg->start_frame, &seg->end_frame); return seg; } ~Segment() { ckd_free($self->word); ckd_free($self); } } %extend NBest { static NBest* fromIter(ps_nbest_t *itor) { NBest *nbest; if (!itor) return NULL; nbest = (NBest *)ckd_malloc(sizeof(NBest)); nbest->hypstr = ckd_salloc(ps_nbest_hyp(itor, &(nbest->score))); return nbest; } %newobject hyp; Hypothesis* hyp() { return $self->hypstr ? new_Hypothesis($self->hypstr, $self->score, 0) : NULL; } ~NBest() { ckd_free($self->hypstr); ckd_free($self); } } %include ps_decoder.i %include ps_lattice.i pocketsphinx-5prealpha/swig/Makefile.am0000664000175000017500000000016212771605033015407 00000000000000SUBDIRS = python swigdir = $(pkgdatadir)/swig dist_swig_DATA = \ pocketsphinx.i \ ps_decoder.i \ ps_lattice.i pocketsphinx-5prealpha/swig/python/0000775000175000017500000000000012771610005014750 500000000000000pocketsphinx-5prealpha/swig/python/test/0000775000175000017500000000000012771610005015727 500000000000000pocketsphinx-5prealpha/swig/python/test/continuous_test.py0000664000175000017500000000202012771605033021465 00000000000000#!/usr/bin/python from os import environ, path from pocketsphinx.pocketsphinx import * from sphinxbase.sphinxbase import * MODELDIR = "../../../model" DATADIR = "../../../test/data" config = Decoder.default_config() config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) config.set_string('-lm', path.join(MODELDIR, 'en-us/en-us.lm.bin')) config.set_string('-dict', path.join(MODELDIR, 'en-us/cmudict-en-us.dict')) config.set_string('-logfn', '/dev/null') decoder = Decoder(config) stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') #stream = open('10001-90210-01803.wav', 'rb') in_speech_bf = False decoder.start_utt() while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) if decoder.get_in_speech() != in_speech_bf: in_speech_bf = decoder.get_in_speech() if not in_speech_bf: decoder.end_utt() print 'Result:', decoder.hyp().hypstr decoder.start_utt() else: break decoder.end_utt() pocketsphinx-5prealpha/swig/python/test/fsg_test.py0000664000175000017500000000044412771605033020046 00000000000000#!/usr/bin/python import sys from sphinxbase.sphinxbase import LogMath from sphinxbase.sphinxbase import FsgModel lmath = LogMath() fsg = FsgModel("simple_grammar", lmath, 1.0, 10) fsg.word_add("hello") fsg.word_add("world") print (fsg.word_id("world")) fsg.add_silence("", 1, 0.5) pocketsphinx-5prealpha/swig/python/test/lattice_test.py0000664000175000017500000000144612771605033020717 00000000000000#!/usr/bin/python from os import environ, path from pocketsphinx.pocketsphinx import * from sphinxbase.sphinxbase import * MODELDIR = "../../../model" DATADIR = "../../../test/data" # Create a decoder with certain model config = Decoder.default_config() config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) config.set_string('-lm', path.join(MODELDIR, 'en-us/en-us.lm.bin')) config.set_string('-dict', path.join(MODELDIR, 'en-us/cmudict-en-us.dict')) decoder = Decoder(config) decoder.start_utt() stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) else: break decoder.end_utt() decoder.get_lattice().write('goforward.lat') decoder.get_lattice().write_htk('goforward.htk') pocketsphinx-5prealpha/swig/python/test/Makefile.am0000664000175000017500000000025312771605033017710 00000000000000EXTRA_DIST = \ config_test.py \ continuous_test.py \ decoder_test.py \ kws_test.py \ fsg_test.py \ jsgf_test.py \ lattice_test.py \ lm_test.py \ phoneme_test.py pocketsphinx-5prealpha/swig/python/test/decoder_test.py0000664000175000017500000000311112771605033020666 00000000000000#!/usr/bin/python from os import environ, path from pocketsphinx.pocketsphinx import * from sphinxbase.sphinxbase import * MODELDIR = "../../../model" DATADIR = "../../../test/data" # Create a decoder with certain model config = Decoder.default_config() config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) config.set_string('-lm', path.join(MODELDIR, 'en-us/en-us.lm.bin')) config.set_string('-dict', path.join(MODELDIR, 'en-us/cmudict-en-us.dict')) # Decode streaming data. decoder = Decoder(config) print ("Pronunciation for word 'hello' is ", decoder.lookup_word("hello")) print ("Pronunciation for word 'abcdf' is ", decoder.lookup_word("abcdf")) decoder.start_utt() stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) else: break decoder.end_utt() hypothesis = decoder.hyp() logmath = decoder.get_logmath() print ('Best hypothesis: ', hypothesis.hypstr, " model score: ", hypothesis.best_score, " confidence: ", logmath.exp(hypothesis.prob)) print ('Best hypothesis segments: ', [seg.word for seg in decoder.seg()]) # Access N best decodings. print ('Best 10 hypothesis: ') for best, i in zip(decoder.nbest(), range(10)): print (best.hypstr, best.score) stream = open(path.join(DATADIR, 'goforward.mfc'), 'rb') stream.read(4) buf = stream.read(13780) decoder.start_utt() decoder.process_cep(buf, False, True) decoder.end_utt() hypothesis = decoder.hyp() print ('Best hypothesis: ', hypothesis.hypstr, " model score: ", hypothesis.best_score, " confidence: ", hypothesis.prob) pocketsphinx-5prealpha/swig/python/test/Makefile.in0000664000175000017500000003112012771607732017726 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ subdir = swig/python/test DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 = SOURCES = DIST_SOURCES = 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) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ config_test.py \ continuous_test.py \ decoder_test.py \ kws_test.py \ fsg_test.py \ jsgf_test.py \ lattice_test.py \ lm_test.py \ phoneme_test.py all: all-am .SUFFIXES: $(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 swig/python/test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign swig/python/test/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(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: check-am all-am: Makefile installdirs: install: install-am install-exec: 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic 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-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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am 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-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # 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: pocketsphinx-5prealpha/swig/python/test/phoneme_test.py0000664000175000017500000000161612771605033020724 00000000000000#!/usr/bin/python from os import environ, path from pocketsphinx.pocketsphinx import * from sphinxbase.sphinxbase import * MODELDIR = "../../../model" DATADIR = "../../../test/data" # Create a decoder with certain model config = Decoder.default_config() config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) config.set_string('-allphone', path.join(MODELDIR, 'en-us/en-us-phone.lm.bin')) config.set_float('-lw', 2.0) config.set_float('-pip', 0.3) config.set_float('-beam', 1e-200) config.set_float('-pbeam', 1e-20) config.set_boolean('-mmap', False) # Decode streaming data. decoder = Decoder(config) decoder.start_utt() stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) else: break decoder.end_utt() hypothesis = decoder.hyp() print ('Best phonemes: ', [seg.word for seg in decoder.seg()]) pocketsphinx-5prealpha/swig/python/test/lm_test.py0000664000175000017500000000352212771605033017677 00000000000000#!/usr/bin/python from os import environ, path from pocketsphinx.pocketsphinx import * from sphinxbase.sphinxbase import * MODELDIR = "../../../model" DATADIR = "../../../test/data" # Create a decoder with certain model config = Decoder.default_config() config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) config.set_string('-lm', path.join(MODELDIR, 'en-us/en-us.lm.bin')) config.set_string('-dict', path.join(DATADIR, 'defective.dic')) config.set_boolean('-mmap', False) decoder = Decoder(config) decoder.start_utt() stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) else: break decoder.end_utt() print ('Decoding with default settings:', decoder.hyp().hypstr) # Load "turtle" language model and decode again. lm = NGramModel(config, decoder.get_logmath(), path.join(DATADIR, 'turtle.lm.bin')) print (lm.prob(['you'])) print (lm.prob(['are','you'])) print (lm.prob(['you', 'are', 'what'])) print (lm.prob(['lost', 'are', 'you'])) decoder.set_lm('turtle', lm) decoder.set_search('turtle') decoder.start_utt() stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) else: break decoder.end_utt() print ('Decoding with "turtle" language:', decoder.hyp().hypstr) ## The word 'meters' isn't in the loaded dictionary. ## Let's add it manually. decoder.add_word('foobie', 'F UW B IY', False) decoder.add_word('meters', 'M IY T ER Z', True) decoder.start_utt() stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) else: break decoder.end_utt() print ('Decoding with customized language:', decoder.hyp().hypstr) pocketsphinx-5prealpha/swig/python/test/config_test.py0000664000175000017500000000220212771605033020526 00000000000000#!/usr/bin/python from os import environ, path from pocketsphinx.pocketsphinx import * from sphinxbase.sphinxbase import * #some dumb test for checking during developent MODELDIR = "../../../model" config = Decoder.default_config() intval = 256 floatval = 8000.0 stringval = "~/pocketsphinx" boolval = True # Check values that was previously set. s = config.get_float("-samprate") print ("Float: ",floatval ," ", s) config.set_float("-samprate", floatval) s = config.get_float("-samprate") print ("Float: ",floatval ," ", s) s = config.get_int("-nfft") print ("Int:",intval, " ", s) config.set_int("-nfft", intval) s = config.get_int("-nfft") print ("Int:",intval, " ", s) s = config.get_string("-rawlogdir") print ("String:",stringval, " ", s) config.set_string("-rawlogdir", stringval) s = config.get_string("-rawlogdir") print ("String:",stringval, " ", s) s = config.get_boolean("-backtrace") print ("Boolean:", boolval, " ", s) config.set_boolean("-backtrace", boolval); s = config.get_boolean("-backtrace") print ("Boolean:", boolval, " ", s) config.set_string_extra("-something12321", "abc") print config.get_string("-something12321") pocketsphinx-5prealpha/swig/python/test/kws_test.py0000664000175000017500000000237412771605033020077 00000000000000#!/usr/bin/python import sys, os from pocketsphinx.pocketsphinx import * from sphinxbase.sphinxbase import * modeldir = "../../../model" datadir = "../../../test/data" # Create a decoder with certain model config = Decoder.default_config() config.set_string('-hmm', os.path.join(modeldir, 'en-us/en-us')) config.set_string('-dict', os.path.join(modeldir, 'en-us/cmudict-en-us.dict')) config.set_string('-keyphrase', 'forward') config.set_float('-kws_threshold', 1e+20) # Open file to read the data stream = open(os.path.join(datadir, "goforward.raw"), "rb") # Alternatively you can read from microphone # import pyaudio # # p = pyaudio.PyAudio() # stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024) # stream.start_stream() # Process audio chunk by chunk. On keyphrase detected perform action and restart search decoder = Decoder(config) decoder.start_utt() while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) else: break if decoder.hyp() != None: print ([(seg.word, seg.prob, seg.start_frame, seg.end_frame) for seg in decoder.seg()]) print ("Detected keyphrase, restarting search") decoder.end_utt() decoder.start_utt() pocketsphinx-5prealpha/swig/python/test/jsgf_test.py0000664000175000017500000000251012771605033020214 00000000000000#!/usr/bin/python from os import environ, path from sys import stdout from pocketsphinx.pocketsphinx import * from sphinxbase.sphinxbase import * MODELDIR = "../../../model" DATADIR = "../../../test/data" # Create a decoder with certain model config = Decoder.default_config() config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) config.set_string('-lm', path.join(DATADIR, 'turtle.lm.bin')) config.set_string('-dict', path.join(DATADIR, 'turtle.dic')) decoder = Decoder(config) # Decode with lm decoder.start_utt() stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) else: break decoder.end_utt() print ('Decoding with "turtle" language:', decoder.hyp().hypstr) # Switch to JSGF grammar jsgf = Jsgf(path.join(DATADIR, 'goforward.gram')) rule = jsgf.get_rule('goforward.move2') fsg = jsgf.build_fsg(rule, decoder.get_logmath(), 7.5) fsg.writefile('goforward.fsg') decoder.set_fsg("goforward", fsg) decoder.set_search("goforward") decoder.start_utt() stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') while True: buf = stream.read(1024) if buf: decoder.process_raw(buf, False, False) else: break decoder.end_utt() print ('Decoding with "goforward" grammar:', decoder.hyp().hypstr) pocketsphinx-5prealpha/swig/python/Makefile.am0000664000175000017500000000160212771605033016730 00000000000000if BUILD_SWIG SUBDIRS = test SWIG_FLAGS = -I$(top_srcdir)/include -I@SPHINXBASE_SWIG@ SWIG_DIR = $(top_srcdir)/swig SWIG_FILES = \ $(SWIG_DIR)/pocketsphinx.i \ $(SWIG_DIR)/ps_decoder.i \ $(SWIG_DIR)/ps_lattice.i if BUILD_DOXYGEN SWIG_FLAGS += -DHAS_DOC -I$(top_builddir)/doc SWIG_FILES += $(top_builddir)/doc/pydoc.i endif CLEANFILES = pocketsphinx_wrap.c pocketsphinx.py pocketsphinx.pyc nodist_pkgpyexec_PYTHON = pocketsphinx.py pkgpyexec_PYTHON = __init__.py pkgpyexec_LTLIBRARIES = _pocketsphinx.la nodist__pocketsphinx_la_SOURCES = pocketsphinx_wrap.c AM_CFLAGS =\ $(PYTHON_CPPFLAGS) \ -I$(top_srcdir)/include \ -D_DATADIR=\"$(datadir)/@PACKAGE@\" _pocketsphinx_la_LDFLAGS = -module _pocketsphinx_la_LIBADD = \ -lsphinxbase \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la pocketsphinx_wrap.c: $(SWIG_FILES) $(SWIG) $(SWIG_FLAGS) -outdir . -o $@ -python $< endif pocketsphinx-5prealpha/swig/python/Makefile.in0000664000175000017500000007431212771607732016761 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ @BUILD_DOXYGEN_TRUE@@BUILD_SWIG_TRUE@am__append_1 = -DHAS_DOC -I$(top_builddir)/doc @BUILD_DOXYGEN_TRUE@@BUILD_SWIG_TRUE@am__append_2 = $(top_builddir)/doc/pydoc.i subdir = swig/python DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(am__pkgpyexec_PYTHON_DIST) \ $(top_srcdir)/py-compile ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgpyexecdir)" \ "$(DESTDIR)$(pkgpyexecdir)" "$(DESTDIR)$(pkgpyexecdir)" LTLIBRARIES = $(pkgpyexec_LTLIBRARIES) @BUILD_SWIG_TRUE@_pocketsphinx_la_DEPENDENCIES = $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la @BUILD_SWIG_TRUE@nodist__pocketsphinx_la_OBJECTS = \ @BUILD_SWIG_TRUE@ pocketsphinx_wrap.lo _pocketsphinx_la_OBJECTS = $(nodist__pocketsphinx_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = _pocketsphinx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(_pocketsphinx_la_LDFLAGS) $(LDFLAGS) \ -o $@ @BUILD_SWIG_TRUE@am__pocketsphinx_la_rpath = -rpath $(pkgpyexecdir) 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@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(nodist__pocketsphinx_la_SOURCES) DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) am__pep3147_tweak = \ sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.py|' am__pkgpyexec_PYTHON_DIST = __init__.py py_compile = $(top_srcdir)/py-compile RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = test DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @BUILD_SWIG_TRUE@SUBDIRS = test @BUILD_SWIG_TRUE@SWIG_FLAGS = -I$(top_srcdir)/include \ @BUILD_SWIG_TRUE@ -I@SPHINXBASE_SWIG@ $(am__append_1) @BUILD_SWIG_TRUE@SWIG_DIR = $(top_srcdir)/swig @BUILD_SWIG_TRUE@SWIG_FILES = $(SWIG_DIR)/pocketsphinx.i \ @BUILD_SWIG_TRUE@ $(SWIG_DIR)/ps_decoder.i \ @BUILD_SWIG_TRUE@ $(SWIG_DIR)/ps_lattice.i $(am__append_2) @BUILD_SWIG_TRUE@CLEANFILES = pocketsphinx_wrap.c pocketsphinx.py pocketsphinx.pyc @BUILD_SWIG_TRUE@nodist_pkgpyexec_PYTHON = pocketsphinx.py @BUILD_SWIG_TRUE@pkgpyexec_PYTHON = __init__.py @BUILD_SWIG_TRUE@pkgpyexec_LTLIBRARIES = _pocketsphinx.la @BUILD_SWIG_TRUE@nodist__pocketsphinx_la_SOURCES = pocketsphinx_wrap.c @BUILD_SWIG_TRUE@AM_CFLAGS = \ @BUILD_SWIG_TRUE@ $(PYTHON_CPPFLAGS) \ @BUILD_SWIG_TRUE@ -I$(top_srcdir)/include \ @BUILD_SWIG_TRUE@ -D_DATADIR=\"$(datadir)/@PACKAGE@\" @BUILD_SWIG_TRUE@_pocketsphinx_la_LDFLAGS = -module @BUILD_SWIG_TRUE@_pocketsphinx_la_LIBADD = \ @BUILD_SWIG_TRUE@ -lsphinxbase \ @BUILD_SWIG_TRUE@ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .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 swig/python/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign swig/python/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): install-pkgpyexecLTLIBRARIES: $(pkgpyexec_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkgpyexec_LTLIBRARIES)'; test -n "$(pkgpyexecdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgpyexecdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgpyexecdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkgpyexecdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkgpyexecdir)"; \ } uninstall-pkgpyexecLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkgpyexec_LTLIBRARIES)'; test -n "$(pkgpyexecdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkgpyexecdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkgpyexecdir)/$$f"; \ done clean-pkgpyexecLTLIBRARIES: -test -z "$(pkgpyexec_LTLIBRARIES)" || rm -f $(pkgpyexec_LTLIBRARIES) @list='$(pkgpyexec_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } _pocketsphinx.la: $(_pocketsphinx_la_OBJECTS) $(_pocketsphinx_la_DEPENDENCIES) $(EXTRA__pocketsphinx_la_DEPENDENCIES) $(AM_V_CCLD)$(_pocketsphinx_la_LINK) $(am__pocketsphinx_la_rpath) $(_pocketsphinx_la_OBJECTS) $(_pocketsphinx_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pocketsphinx_wrap.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-nodist_pkgpyexecPYTHON: $(nodist_pkgpyexec_PYTHON) @$(NORMAL_INSTALL) @list='$(nodist_pkgpyexec_PYTHON)'; dlist=; list2=; test -n "$(pkgpyexecdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgpyexecdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgpyexecdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ $(am__strip_dir) \ dlist="$$dlist $$f"; \ list2="$$list2 $$b$$p"; \ else :; fi; \ done; \ for file in $$list2; do echo $$file; done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgpyexecdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgpyexecdir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ $(am__py_compile) --destdir "$(DESTDIR)" \ --basedir "$(pkgpyexecdir)" $$dlist; \ else :; fi uninstall-nodist_pkgpyexecPYTHON: @$(NORMAL_UNINSTALL) @list='$(nodist_pkgpyexec_PYTHON)'; test -n "$(pkgpyexecdir)" || list=; \ py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$py_files" || exit 0; \ dir='$(DESTDIR)$(pkgpyexecdir)'; \ pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \ echo "$$py_files_pep3147";\ pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \ pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \ st=0; \ for files in \ "$$py_files" \ "$$pyc_files" \ "$$pyo_files" \ "$$pyc_files_pep3147" \ "$$pyo_files_pep3147" \ ; do \ $(am__uninstall_files_from_dir) || st=$$?; \ done; \ exit $$st install-pkgpyexecPYTHON: $(pkgpyexec_PYTHON) @$(NORMAL_INSTALL) @list='$(pkgpyexec_PYTHON)'; dlist=; list2=; test -n "$(pkgpyexecdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgpyexecdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgpyexecdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ $(am__strip_dir) \ dlist="$$dlist $$f"; \ list2="$$list2 $$b$$p"; \ else :; fi; \ done; \ for file in $$list2; do echo $$file; done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgpyexecdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgpyexecdir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ $(am__py_compile) --destdir "$(DESTDIR)" \ --basedir "$(pkgpyexecdir)" $$dlist; \ else :; fi uninstall-pkgpyexecPYTHON: @$(NORMAL_UNINSTALL) @list='$(pkgpyexec_PYTHON)'; test -n "$(pkgpyexecdir)" || list=; \ py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$py_files" || exit 0; \ dir='$(DESTDIR)$(pkgpyexecdir)'; \ pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \ echo "$$py_files_pep3147";\ pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \ pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \ st=0; \ for files in \ "$$py_files" \ "$$pyc_files" \ "$$pyo_files" \ "$$pyc_files_pep3147" \ "$$pyo_files_pep3147" \ ; do \ $(am__uninstall_files_from_dir) || st=$$?; \ done; \ exit $$st # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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-recursive 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: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgpyexecdir)" "$(DESTDIR)$(pkgpyexecdir)" "$(DESTDIR)$(pkgpyexecdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-pkgpyexecLTLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-nodist_pkgpyexecPYTHON \ install-pkgpyexecLTLIBRARIES install-pkgpyexecPYTHON install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-nodist_pkgpyexecPYTHON \ uninstall-pkgpyexecLTLIBRARIES uninstall-pkgpyexecPYTHON .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-pkgpyexecLTLIBRARIES cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am 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-nodist_pkgpyexecPYTHON \ install-pdf install-pdf-am install-pkgpyexecLTLIBRARIES \ install-pkgpyexecPYTHON install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-nodist_pkgpyexecPYTHON \ uninstall-pkgpyexecLTLIBRARIES uninstall-pkgpyexecPYTHON @BUILD_SWIG_TRUE@pocketsphinx_wrap.c: $(SWIG_FILES) @BUILD_SWIG_TRUE@ $(SWIG) $(SWIG_FLAGS) -outdir . -o $@ -python $< # 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: pocketsphinx-5prealpha/swig/python/__init__.py0000664000175000017500000000342512771605033017012 00000000000000# -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ # ==================================================================== # Copyright (c) 2013 Carnegie Mellon University. All rights # reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # This work was supported in part by funding from the Defense Advanced # Research Projects Agency and the National Science Foundation of the # United States of America, and the CMU Sphinx Speech Consortium. # # THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND # ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY # NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # ==================================================================== from pocketsphinx import * pocketsphinx-5prealpha/swig/Makefile.in0000664000175000017500000005166012771607732015441 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ subdir = swig DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(dist_swig_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(swigdir)" DATA = $(dist_swig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = python swigdir = $(pkgdatadir)/swig dist_swig_DATA = \ pocketsphinx.i \ ps_decoder.i \ ps_lattice.i all: all-recursive .SUFFIXES: $(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 swig/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign swig/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_swigDATA: $(dist_swig_DATA) @$(NORMAL_INSTALL) @list='$(dist_swig_DATA)'; test -n "$(swigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(swigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(swigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(swigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(swigdir)" || exit $$?; \ done uninstall-dist_swigDATA: @$(NORMAL_UNINSTALL) @list='$(dist_swig_DATA)'; test -n "$(swigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(swigdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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-recursive 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: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(swigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_swigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dist_swigDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-dist_swigDATA 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-dist_swigDATA # 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: pocketsphinx-5prealpha/swig/ps_decoder.i0000664000175000017500000001766512771605033015654 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2013 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ %extend Decoder { /* Following functions have no bindings: * ps_mllr_t *ps_update_mllr - requires * int ps_decode_senscr */ Decoder(int *errcode) { Decoder *d = ps_init(cmd_ln_init(NULL, ps_args(), FALSE, NULL)); *errcode = d ? 0 : -1; return d; } Decoder(Config *config, int *errcode) { Decoder *d = ps_init(config); *errcode = d ? 0 : -1; return d; } ~Decoder() { ps_free($self); } void reinit(Config *config, int *errcode) { *errcode = ps_reinit($self, config); } void load_dict( char const *fdict, char const *ffilter, char const *format, int *errcode) { *errcode = ps_load_dict($self, fdict, ffilter, format); } void save_dict(char const *dictfile, char const *format, int *errcode) { *errcode = ps_save_dict($self, dictfile, format); } void add_word(char const *word, char const *phones, int update, int *errcode) { *errcode = ps_add_word($self, word, phones, update); } %newobject lookup_word; char * lookup_word(const char *word) { return ps_lookup_word($self, word); } Lattice * get_lattice() { return ps_lattice_retain(ps_get_lattice($self)); } %newobject get_config; Config *get_config() { return cmd_ln_retain(ps_get_config($self)); } %newobject default_config; static Config *default_config() { return cmd_ln_parse_r(NULL, ps_args(), 0, NULL, FALSE); } %newobject file_config; static Config *file_config(char const * path) { return cmd_ln_parse_file_r(NULL, ps_args(), path, FALSE); } void start_stream(int *errcode) { *errcode = ps_start_stream($self); } void start_utt(int *errcode) { *errcode = ps_start_utt($self); } void end_utt(int *errcode) { *errcode = ps_end_utt($self); } #ifdef SWIGPYTHON %include %pybuffer_binary(const char* SDATA, size_t NSAMP); int process_raw(const char* SDATA, size_t NSAMP, bool no_search, bool full_utt, int *errcode) { NSAMP /= sizeof(int16); return *errcode = ps_process_raw($self, (int16 *)SDATA, NSAMP, no_search, full_utt); } int process_cep(const char *SDATA, size_t NSAMP, bool no_search, bool full_utt, int *errcode) { mfcc_t **feats; int ncep = fe_get_output_size(ps_get_fe($self)); NSAMP /= ncep * sizeof(mfcc_t); feats = ckd_calloc_2d(NSAMP, ncep, sizeof(mfcc_t)); memcpy(feats[0], SDATA, NSAMP * ncep * sizeof(mfcc_t)); *errcode = ps_process_cep($self, feats, NSAMP, no_search, full_utt); ckd_free_2d(feats); return *errcode; } #elif SWIGJAVASCRIPT int process_raw(SWIG_Object ptr, bool no_search, bool full_utt, int *errcode) { int16* data = (int16*) node::Buffer::Data(ptr); size_t length = node::Buffer::Length(ptr) / sizeof(int16); return *errcode = ps_process_raw($self, data, length, no_search, full_utt); } #elif SWIGJAVA int process_raw(const int16 *SDATA, size_t NSAMP, bool no_search, bool full_utt, int *errcode) { return *errcode = ps_process_raw($self, SDATA, NSAMP, no_search, full_utt); } #elif SWIGRUBY int process_raw(const char* STRING, size_t SIZE, bool no_search, bool full_utt, int *errcode) { return *errcode = ps_process_raw($self, (const int16 *)STRING, SIZE / 2, no_search, full_utt); } #endif #ifdef SWIGJAVA // Not sure how to properly return binary buffer in python yet (python3 is also an issue) void set_rawdata_size(size_t size) { ps_set_rawdata_size($self, size); } int16 *get_rawdata(int32 *RAWDATA_SIZE) { int16 *result; ps_get_rawdata($self, &result, RAWDATA_SIZE); return result; } #endif %newobject hyp; Hypothesis * hyp() { char const *hyp; int32 best_score, prob; hyp = ps_get_hyp($self, &best_score); if (hyp) prob = ps_get_prob($self); return hyp ? new_Hypothesis(hyp, best_score, prob) : NULL; } FrontEnd * get_fe() { return ps_get_fe($self); } Feature * get_feat() { return ps_get_feat($self); } bool get_in_speech() { return ps_get_in_speech($self); } FsgModel * get_fsg(const char *name) { return fsg_model_retain(ps_get_fsg($self, name)); } void set_fsg(const char *name, FsgModel *fsg, int *errcode) { *errcode = ps_set_fsg($self, name, fsg); } void set_jsgf_file(const char *name, const char *path, int *errcode) { *errcode = ps_set_jsgf_file($self, name, path); } void set_jsgf_string(const char *name, const char *jsgf_string, int *errcode) { *errcode = ps_set_jsgf_string($self, name, jsgf_string); } const char * get_kws(const char *name) { return ps_get_kws($self, name); } void set_kws(const char *name, const char *keyfile, int *errcode) { *errcode = ps_set_kws($self, name, keyfile); } void set_keyphrase(const char *name, const char *keyphrase, int *errcode) { *errcode = ps_set_keyphrase($self, name, keyphrase); } void set_allphone_file(const char *name, const char *lmfile, int *errcode) { *errcode = ps_set_allphone_file($self, name, lmfile); } %newobject get_lm; NGramModel * get_lm(const char *name) { return ngram_model_retain(ps_get_lm($self, name)); } void set_lm(const char *name, NGramModel *lm, int *errcode) { *errcode = ps_set_lm($self, name, lm); } void set_lm_file(const char *name, const char *path, int *errcode) { *errcode = ps_set_lm_file($self, name, path); } %newobject get_logmath; LogMath * get_logmath() { return logmath_retain(ps_get_logmath($self)); } void set_search(const char *search_name, int *errcode) { *errcode = ps_set_search($self, search_name); } const char * get_search() { return ps_get_search($self); } int n_frames() { return ps_get_n_frames($self); } SegmentList *seg() { return $self; } NBestList *nbest() { return $self; } } pocketsphinx-5prealpha/swig/ps_lattice.i0000664000175000017500000000437712771605033015670 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2013 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ %extend Lattice { Lattice(const char *path) { return ps_lattice_read(NULL, path); } Lattice(Decoder *decoder, char *path) { return ps_lattice_read(decoder, path); } ~Lattice() { ps_lattice_free($self); } void write(char const *path, int *errcode) { *errcode = ps_lattice_write($self, path); } void write_htk(char const *path, int *errcode) { *errcode = ps_lattice_write_htk($self, path); } } pocketsphinx-5prealpha/win32/0000775000175000017500000000000012771610005013420 500000000000000pocketsphinx-5prealpha/win32/pocketsphinx_mdef_convert/0000775000175000017500000000000012771610005020672 500000000000000pocketsphinx-5prealpha/win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj0000775000175000017500000001140112771605033027506 00000000000000 Debug Win32 Release Win32 Debug x64 Release x64 {94001a0e-a837-445c-8004-f918f10d0226} {4FB65800-11B8-46BD-95B8-6E4F73BDAD91} Win32Proj pocketsphinx_mdef_convert Application false MultiByte v110 Win32 X64 MachineX64 MachineX86 $(SolutionDir)\bin\$(Configuration)\$(Platform)\ $(Configuration)\$(Platform)\ false Level3 Disabled _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) Console true sphinxbase.lib;pocketsphinx.lib;%(AdditionalDependencies) $(SolutionDir)/bin/$(Configuration)/$(Platform)/pocketsphinx_mdef_convert.exe ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);..\..\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) false Level3 MaxSpeed true true NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) Console true true true pocketsphinx-5prealpha/win32/pocketsphinx_continuous/0000775000175000017500000000000012771610005020425 500000000000000pocketsphinx-5prealpha/win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj0000775000175000017500000001761112771605033027005 00000000000000 Debug Win32 Release Win32 Debug x64 Release x64 {1380AF76-C926-44D0-8002-06C228AC869A} pocketsphinx_continuous Application false v110 MultiByte Win32 X64 MachineX64 MachineX86 $(SolutionDir)\bin\$(Configuration)\$(Platform)\ $(Configuration)\$(Platform)\ false $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.tlb Disabled ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;AD_BACKEND_WIN32;HAVE_CONFIG_H;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL .\$(Configuration)\$(Platform)/pocketsphinx_continuous.pch .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ Level3 true EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0409 sphinxbase.lib;winmm.lib;pocketsphinx.lib;%(AdditionalDependencies) $(SolutionDir)\bin\$(Configuration)\$(Platform)\pocketsphinx_continuous.exe true ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);..\..\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) true $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.pdb Console false $(MachineArch) false true $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.bsc $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.tlb MaxSpeed OnlyExplicitInline ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) NDEBUG;_CONSOLE;AD_BACKEND_WIN32;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) true MultiThreadedDLL true .\$(Configuration)\$(Platform)/pocketsphinx_continuous.pch .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 sphinxbase.lib;winmm.lib;%(AdditionalDependencies) $(SolutionDir)\bin\$(Configuration)\$(Platform)\pocketsphinx_continuous.exe true ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.pdb Console false $(MachineArch) true $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.bsc {94001a0e-a837-445c-8004-f918f10d0226} pocketsphinx-5prealpha/win32/pocketsphinx/0000775000175000017500000000000012771610005016137 500000000000000pocketsphinx-5prealpha/win32/pocketsphinx/pocketsphinx.vcxproj.filters0000775000175000017500000001030312771605033023667 00000000000000 pocketsphinx-5prealpha/win32/pocketsphinx/pocketsphinx.vcxproj0000775000175000017500000002777612771605033022246 00000000000000 Debug Win32 Release Win32 Debug x64 Release x64 {94001A0E-A837-445C-8004-F918F10D0226} pocketsphinx DynamicLibrary false MultiByte v110 Win32 X64 MachineX64 MachineX86 $(SolutionDir)\bin\$(Configuration)\$(Platform)\ $(Configuration)\$(Platform)\ false NDEBUG;%(PreprocessorDefinitions) true true $(TargetEnv) .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.tlb MaxSpeed OnlyExplicitInline ../../include;../../src/libpocketsphinx;../../../sphinxbase/include;../../../sphinxbase/include/win32;%(AdditionalIncludeDirectories) NDEBUG;_USRDLL;SPHINX_DLL;POCKETSPHINX_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true .\$(Configuration)\$(Platform)/pocketsphinx.pch .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 sphinxbase.lib;winmm.lib;%(AdditionalDependencies) ..\..\bin\$(Configuration)\$(Platform)\pocketsphinx.dll true ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.pdb false ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.lib $(MachineArch) true .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.bsc _DEBUG;%(PreprocessorDefinitions) true true $(TargetEnv) .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.tlb Disabled ../../include;../../src/libpocketsphinx;../../../sphinxbase/include;../../../sphinxbase/include/win32;%(AdditionalIncludeDirectories) _DEBUG;_USRDLL;SPHINX_DLL;POCKETSPHINX_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL .\$(Configuration)\$(Platform)/pocketsphinx.pch .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ Level3 true EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0409 sphinxbase.lib;winmm.lib;%(AdditionalDependencies) ../../bin/$(Configuration)/$(Platform)/pocketsphinx.dll true ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) true ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.pdb false ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.lib $(MachineArch) false true .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.bsc pocketsphinx-5prealpha/win32/pocketsphinx_batch/0000775000175000017500000000000012771610005017300 500000000000000pocketsphinx-5prealpha/win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj0000775000175000017500000001736712771605033024543 00000000000000 Debug Win32 Release Win32 Debug x64 Release x64 {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A} pocketsphinx_batch Application false MultiByte v110 Win32 X64 MachineX64 MachineX86 $(SolutionDir)\bin\$(Configuration)\$(Platform)\ $(Configuration)\$(Platform)\ false .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.tlb MaxSpeed OnlyExplicitInline ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) true MultiThreadedDLL true .\$(Configuration)\$(Platform)/pocketsphinx_batch.pch .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 sphinxbase.lib;winmm.lib;%(AdditionalDependencies) ..\..\bin\$(Configuration)\$(Platform)\pocketsphinx_batch.exe true ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.pdb Console false $(MachineArch) true .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.bsc .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.tlb Disabled ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) _DEBUG;_CONSOLE;HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL .\$(Configuration)\$(Platform)/pocketsphinx_batch.pch .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ .\$(Configuration)\$(Platform)/ Level3 true EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0409 sphinxbase.lib;winmm.lib;pocketsphinx.lib;%(AdditionalDependencies) ../../bin/$(Configuration)/$(Platform)/pocketsphinx_batch.exe true ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);..\..\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) true ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.pdb Console false $(MachineArch) false true .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.bsc {94001a0e-a837-445c-8004-f918f10d0226} pocketsphinx-5prealpha/pocketsphinx.pc.in0000664000175000017500000000072312771605033016055 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ libs=@LIBS@ datadir=@datarootdir@/@PACKAGE@ modeldir=@datarootdir@/@PACKAGE@/model Name: PocketSphinx Description: Lightweight speech recognition system Version: @VERSION@ URL: http://cmusphinx.sourceforge.net/ Requires: sphinxbase >= @VERSION@ Libs: -L${libdir} -lpocketsphinx Libs.private: ${libs} -lm Cflags: -I${includedir} -I${includedir}/sphinxbase -I${includedir}/pocketsphinx pocketsphinx-5prealpha/LICENSE0000664000175000017500000000300112771605033013402 00000000000000Copyright (c) 1999-2016 Carnegie Mellon University. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. This work was supported in part by funding from the Defense Advanced Research Projects Agency and the National Science Foundation of the United States of America, and the CMU Sphinx Speech Consortium. THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pocketsphinx-5prealpha/include/0000775000175000017500000000000012771610005014101 500000000000000pocketsphinx-5prealpha/include/ps_lattice.h0000664000175000017500000003232712771605033016335 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ps_lattice.h Word graph search */ #ifndef __PS_LATTICE_H__ #define __PS_LATTICE_H__ /* SphinxBase headers. */ #include #include /* PocketSphinx headers. */ #include #ifdef __cplusplus extern "C" { #endif #if 0 } #endif /** * Word graph structure used in bestpath/nbest search. */ typedef struct ps_lattice_s ps_lattice_t; /** * DAG nodes. * * A node corresponds to a number of hypothesized instances of a word * which all share the same starting point. */ typedef struct ps_latnode_s ps_latnode_t; /** * Iterator over DAG nodes. */ typedef struct ps_latnode_s ps_latnode_iter_t; /* pay no attention to the man behind the curtain */ /** * Links between DAG nodes. * * A link corresponds to a single hypothesized instance of a word with * a given start and end point. */ typedef struct ps_latlink_s ps_latlink_t; /** * Iterator over DAG links. */ typedef struct latlink_list_s ps_latlink_iter_t; /* Forward declaration needed to avoid circular includes */ struct ps_decoder_s; /** * Read a lattice from a file on disk. * * @param ps Decoder to use for processing this lattice, or NULL. * @param file Path to lattice file. * @return Newly created lattice, or NULL for failure. */ POCKETSPHINX_EXPORT ps_lattice_t *ps_lattice_read(struct ps_decoder_s *ps, char const *file); /** * Retain a lattice. * * This function retains ownership of a lattice for the caller, * preventing it from being freed automatically. You must call * ps_lattice_free() to free it after having called this function. * * @return pointer to the retained lattice. */ POCKETSPHINX_EXPORT ps_lattice_t *ps_lattice_retain(ps_lattice_t *dag); /** * Free a lattice. * * @return new reference count (0 if dag was freed) */ POCKETSPHINX_EXPORT int ps_lattice_free(ps_lattice_t *dag); /** * Write a lattice to disk. * * @return 0 for success, <0 on failure. */ POCKETSPHINX_EXPORT int ps_lattice_write(ps_lattice_t *dag, char const *filename); /** * Write a lattice to disk in HTK format * * @return 0 for success, <0 on failure. */ POCKETSPHINX_EXPORT int ps_lattice_write_htk(ps_lattice_t *dag, char const *filename); /** * Get the log-math computation object for this lattice * * @return The log-math object for this lattice. The lattice retains * ownership of this pointer, so you should not attempt to * free it manually. Use logmath_retain() if you wish to * reuse it elsewhere. */ POCKETSPHINX_EXPORT logmath_t *ps_lattice_get_logmath(ps_lattice_t *dag); /** * Start iterating over nodes in the lattice. * * @note No particular order of traversal is guaranteed, and you * should not depend on this. * * @param dag Lattice to iterate over. * @return Iterator over lattice nodes. */ POCKETSPHINX_EXPORT ps_latnode_iter_t *ps_latnode_iter(ps_lattice_t *dag); /** * Move to next node in iteration. * @param itor Node iterator. * @return Updated node iterator, or NULL if finished */ POCKETSPHINX_EXPORT ps_latnode_iter_t *ps_latnode_iter_next(ps_latnode_iter_t *itor); /** * Stop iterating over nodes. * @param itor Node iterator. */ POCKETSPHINX_EXPORT void ps_latnode_iter_free(ps_latnode_iter_t *itor); /** * Get node from iterator. */ POCKETSPHINX_EXPORT ps_latnode_t *ps_latnode_iter_node(ps_latnode_iter_t *itor); /** * Get start and end time range for a node. * * @param node Node inquired about. * @param out_fef Output: End frame of first exit from this node. * @param out_lef Output: End frame of last exit from this node. * @return Start frame for all edges exiting this node. */ POCKETSPHINX_EXPORT int ps_latnode_times(ps_latnode_t *node, int16 *out_fef, int16 *out_lef); /** * Get word string for this node. * * @param dag Lattice to which node belongs. * @param node Node inquired about. * @return Word string for this node (possibly a pronunciation variant). */ POCKETSPHINX_EXPORT char const *ps_latnode_word(ps_lattice_t *dag, ps_latnode_t *node); /** * Get base word string for this node. * * @param dag Lattice to which node belongs. * @param node Node inquired about. * @return Base word string for this node. */ POCKETSPHINX_EXPORT char const *ps_latnode_baseword(ps_lattice_t *dag, ps_latnode_t *node); /** * Iterate over exits from this node. * * @param node Node inquired about. * @return Iterator over exit links from this node. */ POCKETSPHINX_EXPORT ps_latlink_iter_t *ps_latnode_exits(ps_latnode_t *node); /** * Iterate over entries to this node. * * @param node Node inquired about. * @return Iterator over entry links to this node. */ POCKETSPHINX_EXPORT ps_latlink_iter_t *ps_latnode_entries(ps_latnode_t *node); /** * Get best posterior probability and associated acoustic score from a lattice node. * * @param dag Lattice to which node belongs. * @param node Node inquired about. * @param out_link Output: exit link with highest posterior probability * @return Posterior probability of the best link exiting this node. * Log is expressed in the log-base used in the decoder. To * convert to linear floating-point, use * logmath_exp(ps_lattice_get_logmath(), pprob). */ POCKETSPHINX_EXPORT int32 ps_latnode_prob(ps_lattice_t *dag, ps_latnode_t *node, ps_latlink_t **out_link); /** * Get next link from a lattice link iterator. * * @param itor Iterator. * @return Updated iterator, or NULL if finished. */ POCKETSPHINX_EXPORT ps_latlink_iter_t *ps_latlink_iter_next(ps_latlink_iter_t *itor); /** * Stop iterating over links. * @param itor Link iterator. */ POCKETSPHINX_EXPORT void ps_latlink_iter_free(ps_latlink_iter_t *itor); /** * Get link from iterator. */ POCKETSPHINX_EXPORT ps_latlink_t *ps_latlink_iter_link(ps_latlink_iter_t *itor); /** * Get start and end times from a lattice link. * * @note these are inclusive - i.e. the last frame of * this word is ef, not ef-1. * * @param link Link inquired about. * @param out_sf Output: (optional) start frame of this link. * @return End frame of this link. */ POCKETSPHINX_EXPORT int ps_latlink_times(ps_latlink_t *link, int16 *out_sf); /** * Get destination and source nodes from a lattice link * * @param link Link inquired about * @param out_src Output: (optional) source node. * @return destination node */ POCKETSPHINX_EXPORT ps_latnode_t *ps_latlink_nodes(ps_latlink_t *link, ps_latnode_t **out_src); /** * Get word string from a lattice link. * * @param dag Lattice to which node belongs. * @param link Link inquired about * @return Word string for this link (possibly a pronunciation variant). */ POCKETSPHINX_EXPORT char const *ps_latlink_word(ps_lattice_t *dag, ps_latlink_t *link); /** * Get base word string from a lattice link. * * @param dag Lattice to which node belongs. * @param link Link inquired about * @return Base word string for this link */ POCKETSPHINX_EXPORT char const *ps_latlink_baseword(ps_lattice_t *dag, ps_latlink_t *link); /** * Get predecessor link in best path. * * @param link Link inquired about * @return Best previous link from bestpath search, if any. Otherwise NULL */ POCKETSPHINX_EXPORT ps_latlink_t *ps_latlink_pred(ps_latlink_t *link); /** * Get acoustic score and posterior probability from a lattice link. * * @param dag Lattice to which node belongs. * @param link Link inquired about * @param out_ascr Output: (optional) acoustic score. * @return Posterior probability for this link. Log is expressed in * the log-base used in the decoder. To convert to linear * floating-point, use logmath_exp(ps_lattice_get_logmath(), pprob). */ POCKETSPHINX_EXPORT int32 ps_latlink_prob(ps_lattice_t *dag, ps_latlink_t *link, int32 *out_ascr); /** * Create a directed link between "from" and "to" nodes, but if a link already exists, * choose one with the best link_scr. */ POCKETSPHINX_EXPORT void ps_lattice_link(ps_lattice_t *dag, ps_latnode_t *from, ps_latnode_t *to, int32 score, int32 ef); /** * Start a forward traversal of edges in a word graph. * * @note A keen eye will notice an inconsistency in this API versus * other types of iterators in PocketSphinx. The reason for this is * that the traversal algorithm is much more efficient when it is able * to modify the lattice structure. Therefore, to avoid giving the * impression that multiple traversals are possible at once, no * separate iterator structure is provided. * * @param dag Lattice to be traversed. * @param start Start node (source) of traversal. * @param end End node (goal) of traversal. * @return First link in traversal. */ POCKETSPHINX_EXPORT ps_latlink_t *ps_lattice_traverse_edges(ps_lattice_t *dag, ps_latnode_t *start, ps_latnode_t *end); /** * Get the next link in forward traversal. * * @param dag Lattice to be traversed. * @param end End node (goal) of traversal. * @return Next link in traversal. */ POCKETSPHINX_EXPORT ps_latlink_t *ps_lattice_traverse_next(ps_lattice_t *dag, ps_latnode_t *end); /** * Start a reverse traversal of edges in a word graph. * * @note See ps_lattice_traverse_edges() for why this API is the way it is. * * @param dag Lattice to be traversed. * @param start Start node (goal) of traversal. * @param end End node (source) of traversal. * @return First link in traversal. */ POCKETSPHINX_EXPORT ps_latlink_t *ps_lattice_reverse_edges(ps_lattice_t *dag, ps_latnode_t *start, ps_latnode_t *end); /** * Get the next link in reverse traversal. * * @param dag Lattice to be traversed. * @param start Start node (goal) of traversal. * @return Next link in traversal. */ POCKETSPHINX_EXPORT ps_latlink_t *ps_lattice_reverse_next(ps_lattice_t *dag, ps_latnode_t *start); /** * Do N-Gram based best-path search on a word graph. * * This function calculates both the best path as well as the forward * probability used in confidence estimation. * * @return Final link in best path, NULL on error. */ POCKETSPHINX_EXPORT ps_latlink_t *ps_lattice_bestpath(ps_lattice_t *dag, ngram_model_t *lmset, float32 lwf, float32 ascale); /** * Calculate link posterior probabilities on a word graph. * * This function assumes that bestpath search has already been done. * * @return Posterior probability of the utterance as a whole. */ POCKETSPHINX_EXPORT int32 ps_lattice_posterior(ps_lattice_t *dag, ngram_model_t *lmset, float32 ascale); /** * Prune all links (and associated nodes) below a certain posterior probability. * * This function assumes that ps_lattice_posterior() has already been called. * * @param beam Minimum posterior probability for links. This is * expressed in the log-base used in the decoder. To convert * from linear floating-point, use * logmath_log(ps_lattice_get_logmath(), prob). * @return number of arcs removed. */ POCKETSPHINX_EXPORT int32 ps_lattice_posterior_prune(ps_lattice_t *dag, int32 beam); #ifdef NOT_IMPLEMENTED_YET /** * Expand lattice using an N-gram language model. * * This function expands the lattice such that each node represents a * unique N-gram history, and adds language model scores to the links. */ POCKETSPHINX_EXPORT int32 ps_lattice_ngram_expand(ps_lattice_t *dag, ngram_model_t *lm); #endif /** * Get the number of frames in the lattice. * * @param dag The lattice in question. * @return Number of frames in this lattice. */ POCKETSPHINX_EXPORT int ps_lattice_n_frames(ps_lattice_t *dag); #ifdef __cplusplus } #endif #endif /* __PS_LATTICE_H__ */ pocketsphinx-5prealpha/include/pocketsphinx_export.h0000664000175000017500000000061512771605033020321 00000000000000#ifndef __POCKETSPHINX_EXPORT_H__ #define __POCKETSPHINX_EXPORT_H__ /* Win32 DLL gunk */ #if defined(_WIN32) && defined(SPHINX_DLL) #if defined(POCKETSPHINX_EXPORTS) /* DLL itself */ #define POCKETSPHINX_EXPORT __declspec(dllexport) #else #define POCKETSPHINX_EXPORT __declspec(dllimport) #endif #else /* No DLL things*/ #define POCKETSPHINX_EXPORT #endif #endif /* __POCKETSPHINX_EXPORT_H__ */ pocketsphinx-5prealpha/include/ps_search.h0000664000175000017500000002122212771605033016145 00000000000000/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2014 Alpha Cephei Inc.. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY ALPHA CEPHEI INC. ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ps_search.h User can configure several "search" objects with * different grammars and langauge models and switch them in runtime to * provide interactive experience for the user. * * There are different possible search modes: * *

* * Each search has a name and can be referenced by a name, names are * application-specific. The function ps_set_search allows to activate * the search previously added by a name. Only single search can be * activated at time. * * To add the search one needs to point to the grammar/language model * describing the search. The location of the grammar is specific to the * application. * * The exact design of a searches depends on your application. For * example, you might want to listen for activation keyphrase first and once * keyphrase is recognized switch to ngram search to recognize actual * command. Once you recognized the command you can switch to grammar * search to recognize the confirmation and then switch back to keyphrase listening * mode to wait for another command. * * If only a simple recognition is required it is sufficient to add a single search or * just configure the required mode with configuration options. */ #ifndef __PS_SEARCH_H__ #define __PS_SEARCH_H__ #include #include #ifdef __cplusplus extern "C" { #endif #if 0 } #endif /** * PocketSphinx search iterator. */ typedef struct ps_search_iter_s ps_search_iter_t; /** * Actives search with the provided name. * * Activates search with the provided name. The search must be added before * using either ps_set_fsg(), ps_set_lm() or ps_set_kws(). * * @return 0 on success, -1 on failure */ POCKETSPHINX_EXPORT int ps_set_search(ps_decoder_t *ps, const char *name); /** * Returns name of curent search in decoder * * @see ps_set_search */ POCKETSPHINX_EXPORT const char* ps_get_search(ps_decoder_t *ps); /** * Unsets the search and releases related resources. * * Unsets the search previously added with * using either ps_set_fsg(), ps_set_lm() or ps_set_kws(). * * @see ps_set_fsg * @see ps_set_lm * @see ps_set_kws */ POCKETSPHINX_EXPORT int ps_unset_search(ps_decoder_t *ps, const char *name); /** * Returns iterator over current searches * * @see ps_set_search */ POCKETSPHINX_EXPORT ps_search_iter_t *ps_search_iter(ps_decoder_t *ps); /** * Updates search iterator to point to the next position. * * This function automatically frees the iterator object upon reaching * the final entry. * @see ps_set_search */ POCKETSPHINX_EXPORT ps_search_iter_t *ps_search_iter_next(ps_search_iter_t *itor); /** * Retrieves the name of the search the iterator points to. * * @see ps_set_search */ POCKETSPHINX_EXPORT const char* ps_search_iter_val(ps_search_iter_t *itor); /** * Delete an unfinished search iterator * * @see ps_set_search */ POCKETSPHINX_EXPORT void ps_search_iter_free(ps_search_iter_t *itor); /** * Updates search iterator to point to the next position. * * This function automatically frees the iterator object upon reaching * the final entry. * @see ps_set_search */ POCKETSPHINX_EXPORT const char* ps_search_iter_val(ps_search_iter_t *itor); /** * Get the language model set object for this decoder. * * If N-Gram decoding is not enabled, this will return NULL. You will * need to enable it using ps_set_lmset(). * * @return The language model set object for this decoder. The * decoder retains ownership of this pointer, so you should * not attempt to free it manually. Use ngram_model_retain() * if you wish to reuse it elsewhere. */ POCKETSPHINX_EXPORT ngram_model_t *ps_get_lm(ps_decoder_t *ps, const char *name); /** * Adds new search based on N-gram language model. * * Associates N-gram search with the provided name. The search can be activated * using ps_set_search(). * * @see ps_set_search. */ POCKETSPHINX_EXPORT int ps_set_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm); /** * Adds new search based on N-gram language model. * * Convenient method to load N-gram model and create a search. * * @see ps_set_lm */ POCKETSPHINX_EXPORT int ps_set_lm_file(ps_decoder_t *ps, const char *name, const char *path); /** * Get the finite-state grammar set object for this decoder. * * If FSG decoding is not enabled, this returns NULL. Call * ps_set_fsgset() to enable it. * * @return The current FSG set object for this decoder, or * NULL if none is available. */ POCKETSPHINX_EXPORT fsg_model_t *ps_get_fsg(ps_decoder_t *ps, const char *name); /** * Adds new search based on finite state grammar. * * Associates FSG search with the provided name. The search can be activated * using ps_set_search(). * * @see ps_set_search */ POCKETSPHINX_EXPORT int ps_set_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg); /** * Adds new search using JSGF model. * * Convenient method to load JSGF model and create a search. * * @see ps_set_fsg */ POCKETSPHINX_EXPORT int ps_set_jsgf_file(ps_decoder_t *ps, const char *name, const char *path); /** * Adds new search using JSGF model. * * Convenience method to parse JSGF model from string and create a search. * * @see ps_set_fsg */ POCKETSPHINX_EXPORT int ps_set_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string); /** * Get the current Key phrase to spot * * If KWS is not enabled, this returns NULL. Call * ps_update_kws() to enable it. * * @return The current keyphrase to spot */ POCKETSPHINX_EXPORT const char* ps_get_kws(ps_decoder_t *ps, const char *name); /** * Adds keyphrases from a file to spotting * * Associates KWS search with the provided name. The search can be activated * using ps_set_search(). * * @see ps_set_search */ POCKETSPHINX_EXPORT int ps_set_kws(ps_decoder_t *ps, const char *name, const char *keyfile); /** * Adds new keyphrase to spot * * Associates KWS search with the provided name. The search can be activated * using ps_set_search(). * * @see ps_set_search */ POCKETSPHINX_EXPORT int ps_set_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase); /** * Adds new search based on phone N-gram language model. * * Associates N-gram search with the provided name. The search can be activated * using ps_set_search(). * * @see ps_set_search. */ POCKETSPHINX_EXPORT int ps_set_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm); /** * Adds new search based on phone N-gram language model. * * Convenient method to load N-gram model and create a search. * * @see ps_set_allphone */ POCKETSPHINX_EXPORT int ps_set_allphone_file(ps_decoder_t *ps, const char *name, const char *path); #ifdef __cplusplus } #endif #endif /* __PS_SEARCH_H__ */ pocketsphinx-5prealpha/include/pocketsphinx.h0000664000175000017500000005047712771605033016733 00000000000000/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file pocketsphinx.h Main header file for the PocketSphinx decoder. */ #ifndef __POCKETSPHINX_H__ #define __POCKETSPHINX_H__ /* System headers we need. */ #include /* SphinxBase headers we need. */ #include #include #include #include /* PocketSphinx headers (not many of them!) */ #include #include #include #include #ifdef __cplusplus extern "C" { #endif #if 0 } #endif /** * PocketSphinx speech recognizer object. */ typedef struct ps_decoder_s ps_decoder_t; #include /** * PocketSphinx N-best hypothesis iterator object. */ typedef struct ps_astar_s ps_nbest_t; /** * PocketSphinx segmentation iterator object. */ typedef struct ps_seg_s ps_seg_t; /** * Sets default grammar and language model if they are not set explicitly and * are present in the default search path. */ POCKETSPHINX_EXPORT void ps_default_search_args(cmd_ln_t *); /** * Initialize the decoder from a configuration object. * * @note The decoder retains ownership of the pointer * config, so if you are not going to use it * elsewere, you can free it. * * @param config a command-line structure, as created by * cmd_ln_parse_r() or cmd_ln_parse_file_r(). */ POCKETSPHINX_EXPORT ps_decoder_t *ps_init(cmd_ln_t *config); /** * Reinitialize the decoder with updated configuration. * * This function allows you to switch the acoustic model, dictionary, * or other configuration without creating an entirely new decoding * object. * * @note The decoder retains ownership of the pointer * config, so you must not attempt to free it manually. * If you wish to reuse it elsewhere, call cmd_ln_retain() on it. * * @param ps Decoder. * @param config An optional new configuration to use. If this is * NULL, the previous configuration will be reloaded, * with any changes applied. * @return 0 for success, <0 for failure. */ POCKETSPHINX_EXPORT int ps_reinit(ps_decoder_t *ps, cmd_ln_t *config); /** * Returns the argument definitions used in ps_init(). * * This is here to avoid exporting global data, which is problematic * on Win32 and Symbian (and possibly other platforms). */ POCKETSPHINX_EXPORT arg_t const *ps_args(void); /** * Retain a pointer to the decoder. * * This increments the reference count on the decoder, allowing it to * be shared between multiple parent objects. In general you will not * need to use this function, ever. It is mainly here for the * convenience of scripting language bindings. * * @return pointer to retained decoder. */ POCKETSPHINX_EXPORT ps_decoder_t *ps_retain(ps_decoder_t *ps); /** * Finalize the decoder. * * This releases all resources associated with the decoder, including * any language models or grammars which have been added to it, and * the initial configuration object passed to ps_init(). * * @param ps Decoder to be freed. * @return New reference count (0 if freed). */ POCKETSPHINX_EXPORT int ps_free(ps_decoder_t *ps); /** * Get the configuration object for this decoder. * * @return The configuration object for this decoder. The decoder * retains ownership of this pointer, so you should not * attempt to free it manually. Use cmd_ln_retain() if you * wish to reuse it elsewhere. */ POCKETSPHINX_EXPORT cmd_ln_t *ps_get_config(ps_decoder_t *ps); /** * Get the log-math computation object for this decoder. * * @return The log-math object for this decoder. The decoder retains * ownership of this pointer, so you should not attempt to * free it manually. Use logmath_retain() if you wish to * reuse it elsewhere. */ POCKETSPHINX_EXPORT logmath_t *ps_get_logmath(ps_decoder_t *ps); /** * Get the feature extraction object for this decoder. * * @return The feature extraction object for this decoder. The * decoder retains ownership of this pointer, so you should * not attempt to free it manually. Use fe_retain() if you * wish to reuse it elsewhere. */ POCKETSPHINX_EXPORT fe_t *ps_get_fe(ps_decoder_t *ps); /** * Get the dynamic feature computation object for this decoder. * * @return The dynamic feature computation object for this decoder. The * decoder retains ownership of this pointer, so you should * not attempt to free it manually. Use feat_retain() if you * wish to reuse it elsewhere. */ POCKETSPHINX_EXPORT feat_t *ps_get_feat(ps_decoder_t *ps); /** * Adapt current acoustic model using a linear transform. * * @param mllr The new transform to use, or NULL to update the existing * transform. The decoder retains ownership of this pointer, * so you should not attempt to free it manually. Use * ps_mllr_retain() if you wish to reuse it * elsewhere. * @return The updated transform object for this decoder, or * NULL on failure. */ POCKETSPHINX_EXPORT ps_mllr_t *ps_update_mllr(ps_decoder_t *ps, ps_mllr_t *mllr); /** * Reload the pronunciation dictionary from a file. * * This function replaces the current pronunciation dictionary with * the one stored in dictfile. This also causes the active search * module(s) to be reinitialized, in the same manner as calling * ps_add_word() with update=TRUE. * * @param dictfile Path to dictionary file to load. * @param fdictfile Path to filler dictionary to load, or NULL to keep * the existing filler dictionary. * @param format Format of the dictionary file, or NULL to determine * automatically (currently unused,should be NULL) */ POCKETSPHINX_EXPORT int ps_load_dict(ps_decoder_t *ps, char const *dictfile, char const *fdictfile, char const *format); /** * Dump the current pronunciation dictionary to a file. * * This function dumps the current pronunciation dictionary to a tex * * @param dictfile Path to file where dictionary will be written. * @param format Format of the dictionary file, or NULL for the * default (text) format (currently unused, should be NULL) */ POCKETSPHINX_EXPORT int ps_save_dict(ps_decoder_t *ps, char const *dictfile, char const *format); /** * Add a word to the pronunciation dictionary. * * This function adds a word to the pronunciation dictionary and the * current language model (but, obviously, not to the current FSG if * FSG mode is enabled). If the word is already present in one or the * other, it does whatever is necessary to ensure that the word can be * recognized. * * @param word Word string to add. * @param phones Whitespace-separated list of phoneme strings * describing pronunciation of word. * @param update If TRUE, update the search module (whichever one is * currently active) to recognize the newly added word. * If adding multiple words, it is more efficient to * pass FALSE here in all but the last word. * @return The internal ID (>= 0) of the newly added word, or <0 on * failure. */ POCKETSPHINX_EXPORT int ps_add_word(ps_decoder_t *ps, char const *word, char const *phones, int update); /** * Lookup for the word in the dictionary and return phone transcription * for it. * * @param ps Pocketsphinx decoder * @param word Word to look for * * @return Whitespace-spearated phone string describing the pronunciation of the word * or NULL if word is not present in the dictionary. The string is * allocated and must be freed by the user. */ POCKETSPHINX_EXPORT char *ps_lookup_word(ps_decoder_t *ps, const char *word); /** * Decode a raw audio stream. * * No headers are recognized in this files. The configuration * parameters -samprate and -input_endian are used * to determine the sampling rate and endianness of the stream, * respectively. Audio is always assumed to be 16-bit signed PCM. * * @param ps Decoder. * @param rawfh Previously opened file stream. * @param maxsamps Maximum number of samples to read from rawfh, or -1 * to read until end-of-file. * @return Number of samples of audio. */ POCKETSPHINX_EXPORT long ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, long maxsamps); /** * Decode a senone score dump file. * * @param ps Decoder * @param fh Previously opened file handle positioned at start of file. * @return Number of frames read. */ POCKETSPHINX_EXPORT int ps_decode_senscr(ps_decoder_t *ps, FILE *senfh); /** * Start processing of the stream of speech. Channel parameters like * noise-level are maintained for the stream and reused among utterances. * Times returned in segment iterators are also stream-wide. * * @return 0 for success, <0 on error. */ POCKETSPHINX_EXPORT int ps_start_stream(ps_decoder_t *ps); /** * Start utterance processing. * * This function should be called before any utterance data is passed * to the decoder. It marks the start of a new utterance and * reinitializes internal data structures. * * @param ps Decoder to be started. * @return 0 for success, <0 on error. */ POCKETSPHINX_EXPORT int ps_start_utt(ps_decoder_t *ps); /** * Decode raw audio data. * * @param ps Decoder. * @param no_search If non-zero, perform feature extraction but don't * do any recognition yet. This may be necessary if * your processor has trouble doing recognition in * real-time. * @param full_utt If non-zero, this block of data is a full utterance * worth of data. This may allow the recognizer to * produce more accurate results. * @return Number of frames of data searched, or <0 for error. */ POCKETSPHINX_EXPORT int ps_process_raw(ps_decoder_t *ps, int16 const *data, size_t n_samples, int no_search, int full_utt); /** * Decode acoustic feature data. * * @param ps Decoder. * @param no_search If non-zero, perform feature extraction but don't * do any recognition yet. This may be necessary if * your processor has trouble doing recognition in * real-time. * @param full_utt If non-zero, this block of data is a full utterance * worth of data. This may allow the recognizer to * produce more accurate results. * @return Number of frames of data searched, or <0 for error. */ POCKETSPHINX_EXPORT int ps_process_cep(ps_decoder_t *ps, mfcc_t **data, int n_frames, int no_search, int full_utt); /** * Get the number of frames of data searched. * * Note that there is a delay between this and the number of frames of * audio which have been input to the system. This is due to the fact * that acoustic features are computed using a sliding window of * audio, and dynamic features are computed over a sliding window of * acoustic features. * * @param ps Decoder. * @return Number of frames of speech data which have been recognized * so far. */ POCKETSPHINX_EXPORT int ps_get_n_frames(ps_decoder_t *ps); /** * End utterance processing. * * @param ps Decoder. * @return 0 for success, <0 on error */ POCKETSPHINX_EXPORT int ps_end_utt(ps_decoder_t *ps); /** * Get hypothesis string and path score. * * @param ps Decoder. * @param out_best_score Output: path score corresponding to returned string. * @return String containing best hypothesis at this point in * decoding. NULL if no hypothesis is available. */ POCKETSPHINX_EXPORT char const *ps_get_hyp(ps_decoder_t *ps, int32 *out_best_score); /** * Get posterior probability. * * @note Unless the -bestpath option is enabled, this function will * always return zero (corresponding to a posterior probability of * 1.0). Even if -bestpath is enabled, it will also return zero when * called on a partial result. Ongoing research into effective * confidence annotation for partial hypotheses may result in these * restrictions being lifted in future versions. * * @param ps Decoder. * @return Posterior probability of the best hypothesis. */ POCKETSPHINX_EXPORT int32 ps_get_prob(ps_decoder_t *ps); /** * Get word lattice. * * There isn't much you can do with this so far, a public API will * appear in the future. * * @param ps Decoder. * @return Word lattice object containing all hypotheses so far. NULL * if no hypotheses are available. This pointer is owned by * the decoder and you should not attempt to free it manually. * It is only valid until the next utterance, unless you use * ps_lattice_retain() to retain it. */ POCKETSPHINX_EXPORT ps_lattice_t *ps_get_lattice(ps_decoder_t *ps); /** * Get an iterator over the word segmentation for the best hypothesis. * * @param ps Decoder. * @return Iterator over the best hypothesis at this point in * decoding. NULL if no hypothesis is available. */ POCKETSPHINX_EXPORT ps_seg_t *ps_seg_iter(ps_decoder_t *ps); /** * Get the next segment in a word segmentation. * * @param seg Segment iterator. * @return Updated iterator with the next segment. NULL at end of * utterance (the iterator will be freed in this case). */ POCKETSPHINX_EXPORT ps_seg_t *ps_seg_next(ps_seg_t *seg); /** * Get word string from a segmentation iterator. * * @param seg Segment iterator. * @return Read-only string giving string name of this segment. This * is only valid until the next call to ps_seg_next(). */ POCKETSPHINX_EXPORT char const *ps_seg_word(ps_seg_t *seg); /** * Get inclusive start and end frames from a segmentation iterator. * * @note These frame numbers are inclusive, i.e. the end frame refers * to the last frame in which the given word or other segment was * active. Therefore, the actual duration is *out_ef - *out_sf + 1. * * @param seg Segment iterator. * @param out_sf Output: First frame index in segment. * @param out_sf Output: Last frame index in segment. */ POCKETSPHINX_EXPORT void ps_seg_frames(ps_seg_t *seg, int *out_sf, int *out_ef); /** * Get language, acoustic, and posterior probabilities from a * segmentation iterator. * * @note Unless the -bestpath option is enabled, this function will * always return zero (corresponding to a posterior probability of * 1.0). Even if -bestpath is enabled, it will also return zero when * called on a partial result. Ongoing research into effective * confidence annotation for partial hypotheses may result in these * restrictions being lifted in future versions. * * @param out_ascr Output: acoustic model score for this segment. * @param out_lscr Output: language model score for this segment. * @param out_lback Output: language model backoff mode for this * segment (i.e. the number of words used in * calculating lscr). This field is, of course, only * meaningful for N-Gram models. * @return Log posterior probability of current segment. Log is * expressed in the log-base used in the decoder. To convert * to linear floating-point, use logmath_exp(ps_get_logmath(), * pprob). */ POCKETSPHINX_EXPORT int32 ps_seg_prob(ps_seg_t *seg, int32 *out_ascr, int32 *out_lscr, int32 *out_lback); /** * Finish iterating over a word segmentation early, freeing resources. */ POCKETSPHINX_EXPORT void ps_seg_free(ps_seg_t *seg); /** * Get an iterator over the best hypotheses. The function may also * return a NULL which means that there is no hypothesis available for this * utterance. * * @param ps Decoder. * @return Iterator over N-best hypotheses or NULL if no hypothesis is available */ POCKETSPHINX_EXPORT ps_nbest_t *ps_nbest(ps_decoder_t *ps); /** * Move an N-best list iterator forward. * * @param nbest N-best iterator. * @return Updated N-best iterator, or NULL if no more hypotheses are * available (iterator is freed ni this case). */ POCKETSPHINX_EXPORT ps_nbest_t *ps_nbest_next(ps_nbest_t *nbest); /** * Get the hypothesis string from an N-best list iterator. * * @param nbest N-best iterator. * @param out_score Output: Path score for this hypothesis. * @return String containing next best hypothesis. */ POCKETSPHINX_EXPORT char const *ps_nbest_hyp(ps_nbest_t *nbest, int32 *out_score); /** * Get the word segmentation from an N-best list iterator. * * @param nbest N-best iterator. * @param out_score Output: Path score for this hypothesis. * @return Iterator over the next best hypothesis. */ POCKETSPHINX_EXPORT ps_seg_t *ps_nbest_seg(ps_nbest_t *nbest); /** * Finish N-best search early, releasing resources. * * @param nbest N-best iterator. */ POCKETSPHINX_EXPORT void ps_nbest_free(ps_nbest_t *nbest); /** * Get performance information for the current utterance. * * @param ps Decoder. * @param out_nspeech Output: Number of seconds of speech. * @param out_ncpu Output: Number of seconds of CPU time used. * @param out_nwall Output: Number of seconds of wall time used. */ POCKETSPHINX_EXPORT void ps_get_utt_time(ps_decoder_t *ps, double *out_nspeech, double *out_ncpu, double *out_nwall); /** * Get overall performance information. * * @param ps Decoder. * @param out_nspeech Output: Number of seconds of speech. * @param out_ncpu Output: Number of seconds of CPU time used. * @param out_nwall Output: Number of seconds of wall time used. */ POCKETSPHINX_EXPORT void ps_get_all_time(ps_decoder_t *ps, double *out_nspeech, double *out_ncpu, double *out_nwall); /** * Checks if the last feed audio buffer contained speech * * @param ps Decoder. * @return 1 if last buffer contained speech, 0 - otherwise */ POCKETSPHINX_EXPORT uint8 ps_get_in_speech(ps_decoder_t *ps); /** * Sets the limit of the raw audio data to store in decoder * to retrieve it later on ps_get_rawdata. * * @param ps Decoder * @param size bytes of the utterance to store */ POCKETSPHINX_EXPORT void ps_set_rawdata_size(ps_decoder_t *ps, int32 size); /** * Retrieves the raw data collected during utterance decoding. * * @param ps Decoder * @param buffer preallocated buffer to store the data, must be within the limit * set before * @param size size of the data collected in samples (not bytes). */ POCKETSPHINX_EXPORT void ps_get_rawdata(ps_decoder_t *ps, int16 **buffer, int32 *size); /** * @mainpage PocketSphinx API Documentation * @author David Huggins-Daines * @author Alpha Cephei Inc. * @version 5prealpha * @date July, 2015 * * @section intro_sec Introduction * * This is the API documentation for the PocketSphinx speech * recognition engine. The main API calls are documented in * . */ #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __POCKETSPHINX_H__ */ pocketsphinx-5prealpha/include/Makefile.am0000664000175000017500000000025312771605033016062 00000000000000pkginclude_HEADERS = \ cmdln_macro.h \ ps_lattice.h \ ps_mllr.h \ ps_search.h \ pocketsphinx_export.h \ pocketsphinx.h pocketsphinx-5prealpha/include/config.h.in0000664000175000017500000000340012771607746016063 00000000000000/* include/config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if the system has the type `long long'. */ #undef HAVE_LONG_LONG /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* If available, contains the Python version number currently in use. */ #undef HAVE_PYTHON /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_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 the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* 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 `long long', as computed by sizeof. */ #undef SIZEOF_LONG_LONG /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS pocketsphinx-5prealpha/include/Makefile.in0000664000175000017500000004260212771607732016107 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ subdir = include DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/config.h.in $(pkginclude_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) 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)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkginclude_HEADERS = \ cmdln_macro.h \ ps_lattice.h \ ps_mllr.h \ ps_search.h \ pocketsphinx_export.h \ pocketsphinx.h all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: $(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 include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status include/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 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) 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: $(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: check-am all-am: Makefile $(HEADERS) config.h installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am 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-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: all install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-generic distclean-hdr distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am 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-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-pkgincludeHEADERS # 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: pocketsphinx-5prealpha/include/cmdln_macro.h0000664000175000017500000005611112771605033016461 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2006 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* cmdln_macro.h - Command line definitions for PocketSphinx */ #ifndef __PS_CMDLN_MACRO_H__ #define __PS_CMDLN_MACRO_H__ #include #include #include /** Minimal set of command-line options for PocketSphinx. */ #define POCKETSPHINX_OPTIONS \ waveform_to_cepstral_command_line_macro(), \ cepstral_to_feature_command_line_macro(), \ POCKETSPHINX_ACMOD_OPTIONS, \ POCKETSPHINX_BEAM_OPTIONS, \ POCKETSPHINX_SEARCH_OPTIONS, \ POCKETSPHINX_DICT_OPTIONS, \ POCKETSPHINX_NGRAM_OPTIONS, \ POCKETSPHINX_FSG_OPTIONS, \ POCKETSPHINX_KWS_OPTIONS, \ POCKETSPHINX_DEBUG_OPTIONS /** Options for debugging and logging. */ #define POCKETSPHINX_DEBUG_OPTIONS \ { "-logfn", \ ARG_STRING, \ NULL, \ "File to write log messages in" }, \ { "-debug", \ ARG_INT32, \ NULL, \ "Verbosity level for debugging messages" }, \ { "-mfclogdir", \ ARG_STRING, \ NULL, \ "Directory to log feature files to" \ }, \ { "-rawlogdir", \ ARG_STRING, \ NULL, \ "Directory to log raw audio files to" }, \ { "-senlogdir", \ ARG_STRING, \ NULL, \ "Directory to log senone score files to" \ } /** Options defining beam width parameters for tuning the search. */ #define POCKETSPHINX_BEAM_OPTIONS \ { "-beam", \ ARG_FLOAT64, \ "1e-48", \ "Beam width applied to every frame in Viterbi search (smaller values mean wider beam)" }, \ { "-wbeam", \ ARG_FLOAT64, \ "7e-29", \ "Beam width applied to word exits" }, \ { "-pbeam", \ ARG_FLOAT64, \ "1e-48", \ "Beam width applied to phone transitions" }, \ { "-lpbeam", \ ARG_FLOAT64, \ "1e-40", \ "Beam width applied to last phone in words" }, \ { "-lponlybeam", \ ARG_FLOAT64, \ "7e-29", \ "Beam width applied to last phone in single-phone words" }, \ { "-fwdflatbeam", \ ARG_FLOAT64, \ "1e-64", \ "Beam width applied to every frame in second-pass flat search" }, \ { "-fwdflatwbeam", \ ARG_FLOAT64, \ "7e-29", \ "Beam width applied to word exits in second-pass flat search" }, \ { "-pl_window", \ ARG_INT32, \ "5", \ "Phoneme lookahead window size, in frames" }, \ { "-pl_beam", \ ARG_FLOAT64, \ "1e-10", \ "Beam width applied to phone loop search for lookahead" }, \ { "-pl_pbeam", \ ARG_FLOAT64, \ "1e-10", \ "Beam width applied to phone loop transitions for lookahead" }, \ { "-pl_pip", \ ARG_FLOAT32, \ "1.0", \ "Phone insertion penalty for phone loop" }, \ { "-pl_weight", \ ARG_FLOAT64, \ "3.0", \ "Weight for phoneme lookahead penalties" } \ /** Options defining other parameters for tuning the search. */ #define POCKETSPHINX_SEARCH_OPTIONS \ { "-compallsen", \ ARG_BOOLEAN, \ "no", \ "Compute all senone scores in every frame (can be faster when there are many senones)" }, \ { "-fwdtree", \ ARG_BOOLEAN, \ "yes", \ "Run forward lexicon-tree search (1st pass)" }, \ { "-fwdflat", \ ARG_BOOLEAN, \ "yes", \ "Run forward flat-lexicon search over word lattice (2nd pass)" }, \ { "-bestpath", \ ARG_BOOLEAN, \ "yes", \ "Run bestpath (Dijkstra) search over word lattice (3rd pass)" }, \ { "-backtrace", \ ARG_BOOLEAN, \ "no", \ "Print results and backtraces to log." }, \ { "-latsize", \ ARG_INT32, \ "5000", \ "Initial backpointer table size" }, \ { "-maxwpf", \ ARG_INT32, \ "-1", \ "Maximum number of distinct word exits at each frame (or -1 for no pruning)" }, \ { "-maxhmmpf", \ ARG_INT32, \ "30000", \ "Maximum number of active HMMs to maintain at each frame (or -1 for no pruning)" }, \ { "-min_endfr", \ ARG_INT32, \ "0", \ "Nodes ignored in lattice construction if they persist for fewer than N frames" }, \ { "-fwdflatefwid", \ ARG_INT32, \ "4", \ "Minimum number of end frames for a word to be searched in fwdflat search" }, \ { "-fwdflatsfwin", \ ARG_INT32, \ "25", \ "Window of frames in lattice to search for successor words in fwdflat search " } /** Command-line options for keyphrase spotting */ #define POCKETSPHINX_KWS_OPTIONS \ { "-keyphrase", \ ARG_STRING, \ NULL, \ "Keyphrase to spot"}, \ { "-kws", \ ARG_STRING, \ NULL, \ "A file with keyphrases to spot, one per line"}, \ { "-kws_plp", \ ARG_FLOAT64, \ "1e-1", \ "Phone loop probability for keyphrase spotting" }, \ { "-kws_delay", \ ARG_INT32, \ "10", \ "Delay to wait for best detection score" }, \ { "-kws_threshold", \ ARG_FLOAT64, \ "1", \ "Threshold for p(hyp)/p(alternatives) ratio" } /** Command-line options for finite state grammars. */ #define POCKETSPHINX_FSG_OPTIONS \ { "-fsg", \ ARG_STRING, \ NULL, \ "Sphinx format finite state grammar file"}, \ { "-jsgf", \ ARG_STRING, \ NULL, \ "JSGF grammar file" }, \ { "-toprule", \ ARG_STRING, \ NULL, \ "Start rule for JSGF (first public rule is default)" }, \ { "-fsgusealtpron", \ ARG_BOOLEAN, \ "yes", \ "Add alternate pronunciations to FSG"}, \ { "-fsgusefiller", \ ARG_BOOLEAN, \ "yes", \ "Insert filler words at each state."} /** Command-line options for statistical language models. */ #define POCKETSPHINX_NGRAM_OPTIONS \ { "-allphone", \ ARG_STRING, \ NULL, \ "Perform phoneme decoding with phonetic lm" }, \ { "-allphone_ci", \ ARG_BOOLEAN, \ "no", \ "Perform phoneme decoding with phonetic lm and context-independent units only" }, \ { "-lm", \ ARG_STRING, \ NULL, \ "Word trigram language model input file" }, \ { "-lmctl", \ ARG_STRING, \ NULL, \ "Specify a set of language model"}, \ { "-lmname", \ ARG_STRING, \ NULL, \ "Which language model in -lmctl to use by default"}, \ { "-lw", \ ARG_FLOAT32, \ "6.5", \ "Language model probability weight" }, \ { "-fwdflatlw", \ ARG_FLOAT32, \ "8.5", \ "Language model probability weight for flat lexicon (2nd pass) decoding" }, \ { "-bestpathlw", \ ARG_FLOAT32, \ "9.5", \ "Language model probability weight for bestpath search" }, \ { "-ascale", \ ARG_FLOAT32, \ "20.0", \ "Inverse of acoustic model scale for confidence score calculation" }, \ { "-wip", \ ARG_FLOAT32, \ "0.65", \ "Word insertion penalty" }, \ { "-nwpen", \ ARG_FLOAT32, \ "1.0", \ "New word transition penalty" }, \ { "-pip", \ ARG_FLOAT32, \ "1.0", \ "Phone insertion penalty" }, \ { "-uw", \ ARG_FLOAT32, \ "1.0", \ "Unigram weight" }, \ { "-silprob", \ ARG_FLOAT32, \ "0.005", \ "Silence word transition probability" }, \ { "-fillprob", \ ARG_FLOAT32, \ "1e-8", \ "Filler word transition probability" } \ /** Command-line options for dictionaries. */ #define POCKETSPHINX_DICT_OPTIONS \ { "-dict", \ REQARG_STRING, \ NULL, \ "Main pronunciation dictionary (lexicon) input file" }, \ { "-fdict", \ ARG_STRING, \ NULL, \ "Noise word pronunciation dictionary input file" }, \ { "-dictcase", \ ARG_BOOLEAN, \ "no", \ "Dictionary is case sensitive (NOTE: case insensitivity applies to ASCII characters only)" } \ /** Command-line options for acoustic modeling */ #define POCKETSPHINX_ACMOD_OPTIONS \ { "-hmm", \ ARG_STRING, \ NULL, \ "Directory containing acoustic model files."}, \ { "-featparams", \ ARG_STRING, \ NULL, \ "File containing feature extraction parameters."}, \ { "-mdef", \ ARG_STRING, \ NULL, \ "Model definition input file" }, \ { "-senmgau", \ ARG_STRING, \ NULL, \ "Senone to codebook mapping input file (usually not needed)" }, \ { "-tmat", \ ARG_STRING, \ NULL, \ "HMM state transition matrix input file" }, \ { "-tmatfloor", \ ARG_FLOAT32, \ "0.0001", \ "HMM state transition probability floor (applied to -tmat file)" }, \ { "-mean", \ ARG_STRING, \ NULL, \ "Mixture gaussian means input file" }, \ { "-var", \ ARG_STRING, \ NULL, \ "Mixture gaussian variances input file" }, \ { "-varfloor", \ ARG_FLOAT32, \ "0.0001", \ "Mixture gaussian variance floor (applied to data from -var file)" }, \ { "-mixw", \ ARG_STRING, \ NULL, \ "Senone mixture weights input file (uncompressed)" }, \ { "-mixwfloor", \ ARG_FLOAT32, \ "0.0000001", \ "Senone mixture weights floor (applied to data from -mixw file)" }, \ { "-aw", \ ARG_INT32, \ "1", \ "Inverse weight applied to acoustic scores." }, \ { "-sendump", \ ARG_STRING, \ NULL, \ "Senone dump (compressed mixture weights) input file" }, \ { "-mllr", \ ARG_STRING, \ NULL, \ "MLLR transformation to apply to means and variances" }, \ { "-mmap", \ ARG_BOOLEAN, \ "yes", \ "Use memory-mapped I/O (if possible) for model files" }, \ { "-ds", \ ARG_INT32, \ "1", \ "Frame GMM computation downsampling ratio" }, \ { "-topn", \ ARG_INT32, \ "4", \ "Maximum number of top Gaussians to use in scoring." }, \ { "-topn_beam", \ ARG_STRING, \ "0", \ "Beam width used to determine top-N Gaussians (or a list, per-feature)" },\ { "-logbase", \ ARG_FLOAT32, \ "1.0001", \ "Base in which all log-likelihoods calculated" } #define CMDLN_EMPTY_OPTION { NULL, 0, NULL, NULL } #endif /* __PS_CMDLN_MACRO_H__ */ pocketsphinx-5prealpha/include/ps_mllr.h0000664000175000017500000000514612771605033015655 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ps_mllr.h Model-space linear transforms for speaker adaptation */ #ifndef __PS_MLLR_H__ #define __PS_MLLR_H__ /* SphinxBase headers. */ #include #include /* PocketSphinx headers. */ #include #ifdef __cplusplus extern "C" { #endif #if 0 } #endif /** * Feature space linear transform object. */ typedef struct ps_mllr_s ps_mllr_t; /** * Read a speaker-adaptive linear transform from a file. */ POCKETSPHINX_EXPORT ps_mllr_t *ps_mllr_read(char const *file); /** * Retain a pointer to a linear transform. */ POCKETSPHINX_EXPORT ps_mllr_t *ps_mllr_retain(ps_mllr_t *mllr); /** * Release a pointer to a linear transform. */ POCKETSPHINX_EXPORT int ps_mllr_free(ps_mllr_t *mllr); #ifdef __cplusplus } #endif #endif /* __PS_MLLR_H__ */ pocketsphinx-5prealpha/AUTHORS0000664000175000017500000000032212771605033013450 00000000000000Fil Alleva Robert Brennan Hsiao-wen Hon Ravishankar Mosur Eric Thayer Kevin Lenzo Alan W Black Evandro Gouvea David Huggins-Daines Alexander Solovets Vyacheslav Klimkov More! please help us get all the names. pocketsphinx-5prealpha/src/0000775000175000017500000000000012771610005013245 500000000000000pocketsphinx-5prealpha/src/gst-plugin/0000775000175000017500000000000012771610005015336 500000000000000pocketsphinx-5prealpha/src/gst-plugin/livedemo.c0000664000175000017500000000553512771605033017243 00000000000000#include #include static gboolean bus_call(GstBus * bus, GstMessage * msg, gpointer data) { GMainLoop *loop = (GMainLoop *) data; switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: g_print("End of stream\n"); g_main_loop_quit(loop); break; case GST_MESSAGE_ERROR:{ gchar *debug; GError *error; gst_message_parse_error(msg, &error, &debug); g_free(debug); g_printerr("Error: %s\n", error->message); g_error_free(error); g_main_loop_quit(loop); break; } default: break; } const GstStructure *st = gst_message_get_structure(msg); if (st && strcmp(gst_structure_get_name(st), "pocketsphinx") == 0) { if (g_value_get_boolean(gst_structure_get_value(st, "final"))) g_print("Got result %s\n", g_value_get_string(gst_structure_get_value(st, "hypothesis"))); } return TRUE; } int main(int argc, char *argv[]) { GMainLoop *loop; GstElement *pipeline, *source, *decoder, *sink; GstBus *bus; guint bus_watch_id; /* Initialisation */ gst_init(&argc, &argv); loop = g_main_loop_new(NULL, FALSE); /* Check input arguments */ if (argc != 2) { g_printerr("Usage: %s \n", argv[0]); return -1; } /* Create gstreamer elements */ pipeline = gst_pipeline_new("pipeline"); source = gst_element_factory_make("filesrc", "file-source"); decoder = gst_element_factory_make("pocketsphinx", "asr"); sink = gst_element_factory_make("fakesink", "output"); if (!pipeline || !source || !decoder || !sink) { g_printerr("One element could not be created. Exiting.\n"); return -1; } /* Set up the pipeline */ /* we set the input filename to the source element */ g_object_set(G_OBJECT(source), "location", argv[1], NULL); g_object_set(G_OBJECT(decoder), "lmctl", "test.lmctl", NULL); g_object_set(G_OBJECT(decoder), "lmname", "tidigits", NULL); /* we add a message handler */ bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); bus_watch_id = gst_bus_add_watch(bus, bus_call, loop); gst_object_unref(bus); /* we add all elements into the pipeline */ gst_bin_add_many(GST_BIN(pipeline), source, decoder, sink, NULL); /* we link the elements together */ gst_element_link_many(source, decoder, sink, NULL); gst_element_set_state(pipeline, GST_STATE_PLAYING); /* Iterate */ g_print("Running...\n"); g_main_loop_run(loop); /* Out of the main loop, clean up nicely */ g_print("Returned, stopping playback\n"); gst_element_set_state(pipeline, GST_STATE_NULL); g_print("Deleting pipeline\n"); gst_object_unref(GST_OBJECT(pipeline)); g_source_remove(bus_watch_id); g_main_loop_unref(loop); return 0; } pocketsphinx-5prealpha/src/gst-plugin/gstpocketsphinx.c0000664000175000017500000006275512771605673020715 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2014 Alpha Cephei Inc. * Copyright (c) 2007 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * * Author: David Huggins-Daines */ /** * SECTION:element-pocketsphix * * The element runs the speech recohgnition on incomming audio buffers and * generates an element messages named "pocketsphinx" * for each hypothesis and one for the final result. The message's structure * contains these fields: * * * * * #GstClockTime * "timestamp": * the timestamp of the buffer that triggered the message. * * * * * #gboolean * "final": * %FALSE for intermediate messages. * * * * * #gin32 * "confidence": * posterior probability (confidence) of the result in log domain * * * * * #gchar * "hypothesis": * the recognized text * * * * * * Example pipeline * |[ * gst-launch-1.0 -m autoaudiosrc ! audioconvert ! audioresample ! pocketsphinx ! fakesink * ]| * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "gstpocketsphinx.h" GST_DEBUG_CATEGORY_STATIC(pocketsphinx_debug); #define GST_CAT_DEFAULT pocketsphinx_debug static void gst_pocketsphinx_set_property(GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_pocketsphinx_get_property(GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_pocketsphinx_change_state(GstElement *element, GstStateChange transition); static GstFlowReturn gst_pocketsphinx_chain(GstPad * pad, GstObject *parent, GstBuffer * buffer); static gboolean gst_pocketsphinx_event(GstPad *pad, GstObject *parent, GstEvent *event); static void gst_pocketsphinx_finalize_utt(GstPocketSphinx *ps); static void gst_pocketsphinx_finalize(GObject * gobject); enum { PROP_0, PROP_HMM_DIR, PROP_LM_FILE, PROP_LMCTL_FILE, PROP_DICT_FILE, PROP_MLLR_FILE, PROP_FSG_FILE, PROP_ALLPHONE_FILE, PROP_KWS_FILE, PROP_FWDFLAT, PROP_BESTPATH, PROP_MAXHMMPF, PROP_MAXWPF, PROP_BEAM, PROP_WBEAM, PROP_PBEAM, PROP_DSRATIO, PROP_LATDIR, PROP_LM_NAME, PROP_DECODER }; /* * Static data. */ /* Default command line. (will go away soon and be constructed using properties) */ static char *default_argv[] = { "gst-pocketsphinx", }; static const int default_argc = sizeof(default_argv)/sizeof(default_argv[0]); static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw, " "format = (string) { S16LE }, " "channels = (int) 1, " "rate = (int) 16000") ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS("text/plain") ); /* * Boxing of ps_decoder_t. */ GType ps_decoder_get_type(void) { static GType ps_decoder_type = 0; if (G_UNLIKELY(ps_decoder_type == 0)) { ps_decoder_type = g_boxed_type_register_static ("PSDecoder", /* Conveniently, these should just work. */ (GBoxedCopyFunc) ps_retain, (GBoxedFreeFunc) ps_free); } return ps_decoder_type; } G_DEFINE_TYPE(GstPocketSphinx, gst_pocketsphinx, GST_TYPE_ELEMENT); static void gst_pocketsphinx_class_init(GstPocketSphinxClass * klass) { GObjectClass *gobject_class; GstElementClass *element_class;; gobject_class =(GObjectClass *) klass; element_class = (GstElementClass *)klass; gobject_class->set_property = gst_pocketsphinx_set_property; gobject_class->get_property = gst_pocketsphinx_get_property; gobject_class->finalize = gst_pocketsphinx_finalize; /* TODO: We will bridge cmd_ln.h properties to GObject * properties here somehow eventually. */ g_object_class_install_property (gobject_class, PROP_HMM_DIR, g_param_spec_string("hmm", "HMM Directory", "Directory containing acoustic model parameters", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_LM_FILE, g_param_spec_string("lm", "LM File", "Language model file", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_LMCTL_FILE, g_param_spec_string("lmctl", "LM Control File", "Language model control file (for class LMs)", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_FSG_FILE, g_param_spec_string("fsg", "FSG File", "Finite state grammar file", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_ALLPHONE_FILE, g_param_spec_string("allphone", "Allphone File", "Phonetic language model file", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_KWS_FILE, g_param_spec_string("kws", "Keyphrases File", "List of keyphrases for spotting", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_DICT_FILE, g_param_spec_string("dict", "Dictionary File", "Dictionary File", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_FWDFLAT, g_param_spec_boolean("fwdflat", "Flat Lexicon Search", "Enable Flat Lexicon Search", FALSE, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_BESTPATH, g_param_spec_boolean("bestpath", "Graph Search", "Enable Graph Search", FALSE, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_MAXHMMPF, g_param_spec_int("maxhmmpf", "Maximum HMMs per frame", "Maximum number of HMMs searched per frame", 1, 100000, 1000, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_MAXWPF, g_param_spec_int("maxwpf", "Maximum words per frame", "Maximum number of words searched per frame", 1, 100000, 10, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_BEAM, g_param_spec_double("beam", "Beam width applied to every frame in Viterbi search", "Beam width applied to every frame in Viterbi search", -1, 1, 1e-48, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_PBEAM, g_param_spec_double("pbeam", "Beam width applied to phone transitions", "Beam width applied to phone transitions", -1, 1, 1e-48, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_WBEAM, g_param_spec_double("wbeam", "Beam width applied to word exits", "Beam width applied to phone transitions", -1, 1, 7e-29, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_DSRATIO, g_param_spec_int("dsratio", "Frame downsampling ratio", "Evaluate acoustic model every N frames", 1, 10, 1, G_PARAM_READWRITE)); /* Could be changed on runtime when ps is already initialized */ g_object_class_install_property (gobject_class, PROP_LM_NAME, g_param_spec_string("lmname", "LM Name", "Language model name (to select LMs from lmctl)", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_LATDIR, g_param_spec_string("latdir", "Lattice Directory", "Output Directory for Lattices", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_DECODER, g_param_spec_boxed("decoder", "Decoder object", "The underlying decoder", PS_DECODER_TYPE, G_PARAM_READABLE)); GST_DEBUG_CATEGORY_INIT(pocketsphinx_debug, "pocketsphinx", 0, "Automatic Speech Recognition"); element_class->change_state = gst_pocketsphinx_change_state; gst_element_class_add_pad_template(element_class, gst_static_pad_template_get(&sink_factory)); gst_element_class_add_pad_template(element_class, gst_static_pad_template_get(&src_factory)); gst_element_class_set_static_metadata(element_class, "PocketSphinx", "Filter/Audio", "Convert speech to text", "CMUSphinx-devel "); } static void gst_pocketsphinx_set_string(GstPocketSphinx *ps, const gchar *key, const GValue *value) { if (value != NULL) { cmd_ln_set_str_r(ps->config, key, g_value_get_string(value)); } else { cmd_ln_set_str_r(ps->config, key, NULL); } } static void gst_pocketsphinx_set_int(GstPocketSphinx *ps, const gchar *key, const GValue *value) { cmd_ln_set_int32_r(ps->config, key, g_value_get_int(value)); } static void gst_pocketsphinx_set_boolean(GstPocketSphinx *ps, const gchar *key, const GValue *value) { cmd_ln_set_boolean_r(ps->config, key, g_value_get_boolean(value)); } static void gst_pocketsphinx_set_double(GstPocketSphinx *ps, const gchar *key, const GValue *value) { cmd_ln_set_float_r(ps->config, key, g_value_get_double(value)); } static void gst_pocketsphinx_set_property(GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPocketSphinx *ps = GST_POCKETSPHINX(object); switch (prop_id) { case PROP_HMM_DIR: gst_pocketsphinx_set_string(ps, "-hmm", value); break; case PROP_LM_FILE: /* FSG and LM are mutually exclusive. */ gst_pocketsphinx_set_string(ps, "-lm", value); gst_pocketsphinx_set_string(ps, "-lmctl", NULL); gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-allphone", NULL); gst_pocketsphinx_set_string(ps, "-kws", NULL); break; case PROP_LMCTL_FILE: /* FSG and LM are mutually exclusive. */ gst_pocketsphinx_set_string(ps, "-lm", NULL); gst_pocketsphinx_set_string(ps, "-lmctl", value); gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-allphone", NULL); gst_pocketsphinx_set_string(ps, "-kws", NULL); break; case PROP_DICT_FILE: gst_pocketsphinx_set_string(ps, "-dict", value); break; case PROP_MLLR_FILE: gst_pocketsphinx_set_string(ps, "-mllr", value); break; case PROP_FSG_FILE: /* FSG and LM are mutually exclusive */ gst_pocketsphinx_set_string(ps, "-lm", NULL); gst_pocketsphinx_set_string(ps, "-lmctl", NULL); gst_pocketsphinx_set_string(ps, "-fsg", value); gst_pocketsphinx_set_string(ps, "-allphone", NULL); gst_pocketsphinx_set_string(ps, "-kws", NULL); break; case PROP_ALLPHONE_FILE: /* FSG and LM are mutually exclusive. */ gst_pocketsphinx_set_string(ps, "-lm", NULL); gst_pocketsphinx_set_string(ps, "-lmctl", NULL); gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-allphone", value); gst_pocketsphinx_set_string(ps, "-kws", NULL); break; case PROP_KWS_FILE: /* FSG and LM are mutually exclusive. */ gst_pocketsphinx_set_string(ps, "-lm", NULL); gst_pocketsphinx_set_string(ps, "-lmctl", NULL); gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-allphone", NULL); gst_pocketsphinx_set_string(ps, "-kws", value); break; case PROP_FWDFLAT: gst_pocketsphinx_set_boolean(ps, "-fwdflat", value); break; case PROP_BESTPATH: gst_pocketsphinx_set_boolean(ps, "-bestpath", value); break; case PROP_MAXHMMPF: gst_pocketsphinx_set_int(ps, "-maxhmmpf", value); break; case PROP_MAXWPF: gst_pocketsphinx_set_int(ps, "-maxwpf", value); break; case PROP_BEAM: gst_pocketsphinx_set_double(ps, "-beam", value); break; case PROP_PBEAM: gst_pocketsphinx_set_double(ps, "-pbeam", value); break; case PROP_WBEAM: gst_pocketsphinx_set_double(ps, "-wbeam", value); break; case PROP_DSRATIO: gst_pocketsphinx_set_int(ps, "-ds", value); break; case PROP_LATDIR: if (ps->latdir) g_free(ps->latdir); ps->latdir = g_strdup(g_value_get_string(value)); break; case PROP_LM_NAME: gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-lm", NULL); gst_pocketsphinx_set_string(ps, "-allphone", NULL); gst_pocketsphinx_set_string(ps, "-kws", NULL); gst_pocketsphinx_set_string(ps, "-lmname", value); /** * Chances are that lmctl is already loaded and all * corresponding searches are configured, so we simply * try to set the search */ if (value != NULL && ps->ps) { ps_set_search(ps->ps, g_value_get_string(value)); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); return; } /* If decoder was already initialized, reinit */ if (ps->ps && prop_id != PROP_LATDIR && prop_id != PROP_LM_NAME) ps_reinit(ps->ps, ps->config); } static void gst_pocketsphinx_get_property(GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstPocketSphinx *ps = GST_POCKETSPHINX(object); switch (prop_id) { case PROP_DECODER: g_value_set_boxed(value, ps->ps); break; case PROP_HMM_DIR: g_value_set_string(value, cmd_ln_str_r(ps->config, "-hmm")); break; case PROP_LM_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-lm")); break; case PROP_LMCTL_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmctl")); break; case PROP_LM_NAME: g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmname")); break; case PROP_DICT_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-dict")); break; case PROP_MLLR_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-mllr")); break; case PROP_FSG_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-fsg")); break; case PROP_ALLPHONE_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-allphone")); break; case PROP_KWS_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-kws")); break; case PROP_FWDFLAT: g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-fwdflat")); break; case PROP_BESTPATH: g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-bestpath")); break; case PROP_LATDIR: g_value_set_string(value, ps->latdir); break; case PROP_MAXHMMPF: g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxhmmpf")); break; case PROP_MAXWPF: g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxwpf")); break; case PROP_BEAM: g_value_set_double(value, cmd_ln_float_r(ps->config, "-beam")); break; case PROP_PBEAM: g_value_set_double(value, cmd_ln_float_r(ps->config, "-pbeam")); break; case PROP_WBEAM: g_value_set_double(value, cmd_ln_float_r(ps->config, "-wbeam")); break; case PROP_DSRATIO: g_value_set_int(value, cmd_ln_int32_r(ps->config, "-ds")); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void gst_pocketsphinx_finalize(GObject * gobject) { GstPocketSphinx *ps = GST_POCKETSPHINX(gobject); ps_free(ps->ps); cmd_ln_free_r(ps->config); g_free(ps->last_result); g_free(ps->latdir); G_OBJECT_CLASS(gst_pocketsphinx_parent_class)->finalize(gobject); } static void gst_pocketsphinx_init(GstPocketSphinx * ps) { ps->sinkpad = gst_pad_new_from_static_template(&sink_factory, "sink"); ps->srcpad = gst_pad_new_from_static_template(&src_factory, "src"); /* Parse default command-line options. */ ps->config = cmd_ln_parse_r(NULL, ps_args(), default_argc, default_argv, FALSE); ps_default_search_args(ps->config); /* Set up pads. */ gst_element_add_pad(GST_ELEMENT(ps), ps->sinkpad); gst_pad_set_chain_function(ps->sinkpad, gst_pocketsphinx_chain); gst_pad_set_event_function(ps->sinkpad, gst_pocketsphinx_event); gst_pad_use_fixed_caps(ps->sinkpad); gst_element_add_pad(GST_ELEMENT(ps), ps->srcpad); gst_pad_use_fixed_caps(ps->srcpad); /* Initialize time. */ ps->last_result_time = 0; ps->last_result = NULL; } static GstStateChangeReturn gst_pocketsphinx_change_state(GstElement *element, GstStateChange transition) { GstPocketSphinx *ps = GST_POCKETSPHINX(element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: ps->ps = ps_init(ps->config); if (ps->ps == NULL) { GST_ELEMENT_ERROR(GST_ELEMENT(ps), LIBRARY, INIT, ("Failed to initialize PocketSphinx"), ("Failed to initialize PocketSphinx")); return GST_STATE_CHANGE_FAILURE; } break; case GST_STATE_CHANGE_READY_TO_NULL: ps_free(ps->ps); ps->ps = NULL; default: break; } return GST_ELEMENT_CLASS(gst_pocketsphinx_parent_class)->change_state(element, transition); } static void gst_pocketsphinx_post_message(GstPocketSphinx *ps, gboolean final, GstClockTime timestamp, gint32 prob, const gchar *hyp) { GstStructure *s = gst_structure_new ("pocketsphinx", "timestamp", G_TYPE_UINT64, timestamp, "final", G_TYPE_BOOLEAN, final, "confidence", G_TYPE_LONG, prob, "hypothesis", G_TYPE_STRING, hyp, NULL); gst_element_post_message (GST_ELEMENT (ps), gst_message_new_element (GST_OBJECT (ps), s)); } static GstFlowReturn gst_pocketsphinx_chain(GstPad * pad, GstObject *parent, GstBuffer * buffer) { GstPocketSphinx *ps; GstMapInfo info; gboolean in_speech; ps = GST_POCKETSPHINX(parent); /* Start an utterance for the first buffer we get */ if (!ps->listening_started) { ps->listening_started = TRUE; ps->speech_started = FALSE; ps_start_utt(ps->ps); } gst_buffer_map (buffer, &info, GST_MAP_READ); ps_process_raw(ps->ps, (short*) info.data, info.size / sizeof(short), FALSE, FALSE); gst_buffer_unmap (buffer, &info); in_speech = ps_get_in_speech(ps->ps); if (in_speech && !ps->speech_started) { ps->speech_started = TRUE; } if (!in_speech && ps->speech_started) { gst_pocketsphinx_finalize_utt(ps); } else if (ps->last_result_time == 0 /* Get a partial result every now and then, see if it is different. */ /* Check every 100 milliseconds. */ || (GST_BUFFER_TIMESTAMP(buffer) - ps->last_result_time) > 100*10*1000) { int32 score; char const *hyp; hyp = ps_get_hyp(ps->ps, &score); ps->last_result_time = GST_BUFFER_TIMESTAMP(buffer); if (hyp && strlen(hyp) > 0) { if (ps->last_result == NULL || 0 != strcmp(ps->last_result, hyp)) { g_free(ps->last_result); ps->last_result = g_strdup(hyp); gst_pocketsphinx_post_message(ps, FALSE, ps->last_result_time, ps_get_prob(ps->ps), hyp); } } } gst_buffer_unref(buffer); return GST_FLOW_OK; } static void gst_pocketsphinx_finalize_utt(GstPocketSphinx *ps) { GstBuffer *buffer; char const *hyp; int32 score; hyp = NULL; if (!ps->listening_started) return; ps_end_utt(ps->ps); ps->listening_started = FALSE; hyp = ps_get_hyp(ps->ps, &score); if (hyp) { gst_pocketsphinx_post_message(ps, TRUE, GST_CLOCK_TIME_NONE, ps_get_prob(ps->ps), hyp); buffer = gst_buffer_new_and_alloc(strlen(hyp) + 1); gst_buffer_fill(buffer, 0, hyp, strlen(hyp)); gst_buffer_fill(buffer, strlen(hyp), "\n", 1); gst_pad_push(ps->srcpad, buffer); } if (ps->latdir) { char *latfile; char uttid[16]; sprintf(uttid, "%09u", ps->uttno); ps->uttno++; latfile = string_join(ps->latdir, "/", uttid, ".lat", NULL); ps_lattice_t *dag; if ((dag = ps_get_lattice(ps->ps))) ps_lattice_write(dag, latfile); ckd_free(latfile); } } static gboolean gst_pocketsphinx_event(GstPad *pad, GstObject *parent, GstEvent *event) { GstPocketSphinx *ps; ps = GST_POCKETSPHINX(parent); switch (event->type) { case GST_EVENT_EOS: { gst_pocketsphinx_finalize_utt(ps); return gst_pad_event_default(pad, parent, event); } default: return gst_pad_event_default(pad, parent, event); } } static void gst_pocketsphinx_log(void *user_data, err_lvl_t lvl, const char *fmt, ...) { static const int gst_level[ERR_MAX] = {GST_LEVEL_DEBUG, GST_LEVEL_INFO, GST_LEVEL_INFO, GST_LEVEL_WARNING, GST_LEVEL_ERROR, GST_LEVEL_ERROR}; va_list ap; va_start(ap, fmt); gst_debug_log_valist(pocketsphinx_debug, gst_level[lvl], "", "", 0, NULL, fmt, ap); va_end(ap); } static gboolean plugin_init(GstPlugin * plugin) { err_set_callback(gst_pocketsphinx_log, NULL); if (!gst_element_register(plugin, "pocketsphinx", GST_RANK_NONE, GST_TYPE_POCKETSPHINX)) return FALSE; return TRUE; } #define PACKAGE PACKAGE_NAME GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, pocketsphinx, "PocketSphinx plugin", plugin_init, PACKAGE_VERSION, "BSD", "PocketSphinx", "http://cmusphinx.sourceforge.net/") pocketsphinx-5prealpha/src/gst-plugin/livedemo.py0000664000175000017500000000674712771605033017457 00000000000000#!/usr/bin/env python # Copyright (c) 2008 Carnegie Mellon University. # # You may modify and redistribute this file under the same terms as # the CMU Sphinx system. See LICENSE for more information. from gi import pygtkcompat import gi gi.require_version('Gst', '1.0') from gi.repository import GObject, Gst GObject.threads_init() Gst.init(None) gst = Gst print("Using pygtkcompat and Gst from gi") pygtkcompat.enable() pygtkcompat.enable_gtk(version='3.0') import gtk class DemoApp(object): """GStreamer/PocketSphinx Demo Application""" def __init__(self): """Initialize a DemoApp object""" self.init_gui() self.init_gst() def init_gui(self): """Initialize the GUI components""" self.window = gtk.Window() self.window.connect("delete-event", gtk.main_quit) self.window.set_default_size(400,200) self.window.set_border_width(10) vbox = gtk.VBox() self.textbuf = gtk.TextBuffer() self.text = gtk.TextView(buffer=self.textbuf) self.text.set_wrap_mode(gtk.WRAP_WORD) vbox.pack_start(self.text) self.button = gtk.ToggleButton("Speak") self.button.connect('clicked', self.button_clicked) vbox.pack_start(self.button, False, False, 5) self.window.add(vbox) self.window.show_all() def init_gst(self): """Initialize the speech components""" self.pipeline = gst.parse_launch('autoaudiosrc ! audioconvert ! audioresample ' + '! pocketsphinx ! fakesink') bus = self.pipeline.get_bus() bus.add_signal_watch() bus.connect('message::element', self.element_message) self.pipeline.set_state(gst.State.PAUSED) def element_message(self, bus, msg): """Receive element messages from the bus.""" msgtype = msg.get_structure().get_name() if msgtype != 'pocketsphinx': return if msg.get_structure().get_value('final'): self.final_result(msg.get_structure().get_value('hypothesis'), msg.get_structure().get_value('confidence')) self.pipeline.set_state(gst.State.PAUSED) self.button.set_active(False) elif msg.get_structure().get_value('hypothesis'): self.partial_result(msg.get_structure().get_value('hypothesis')) def partial_result(self, hyp): """Delete any previous selection, insert text and select it.""" # All this stuff appears as one single action self.textbuf.begin_user_action() self.textbuf.delete_selection(True, self.text.get_editable()) self.textbuf.insert_at_cursor(hyp) ins = self.textbuf.get_insert() iter = self.textbuf.get_iter_at_mark(ins) iter.backward_chars(len(hyp)) self.textbuf.move_mark(ins, iter) self.textbuf.end_user_action() def final_result(self, hyp, confidence): """Insert the final result.""" # All this stuff appears as one single action self.textbuf.begin_user_action() self.textbuf.delete_selection(True, self.text.get_editable()) self.textbuf.insert_at_cursor(hyp) self.textbuf.end_user_action() def button_clicked(self, button): """Handle button presses.""" if button.get_active(): button.set_label("Stop") self.pipeline.set_state(gst.State.PLAYING) else: button.set_label("Speak") self.pipeline.set_state(gst.State.PAUSED) app = DemoApp() gtk.main() pocketsphinx-5prealpha/src/gst-plugin/Makefile.am0000664000175000017500000000111212771605033017312 00000000000000my_plugins = my_headers = my_files = if BUILD_GST my_plugins += libgstpocketsphinx.la endif plugin_LTLIBRARIES = $(my_plugins) libgstpocketsphinx_la_SOURCES = gstpocketsphinx.c libgstpocketsphinx_la_LIBADD = \ $(GST_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ -lsphinxbase libgstpocketsphinx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = gstpocketsphinx.h AM_CFLAGS = \ -I$(top_srcdir)/include \ -I$(top_builddir)/include \ $(GST_CFLAGS) \ -DMODELDIR=\"$(pkgdatadir)/model\" EXTRA_DIST = livedemo.py livedemo.c pocketsphinx-5prealpha/src/gst-plugin/gstpocketsphinx.h0000664000175000017500000000705112771605033020674 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2007 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * * Author: David Huggins-Daines */ #ifndef __GST_POCKETSPHINX_H__ #define __GST_POCKETSPHINX_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_POCKETSPHINX \ (gst_pocketsphinx_get_type()) #define GST_POCKETSPHINX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_POCKETSPHINX,GstPocketSphinx)) #define GST_POCKETSPHINX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_POCKETSPHINX,GstPocketSphinxClass)) #define GST_IS_POCKETSPHINX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_POCKETSPHINX)) #define GST_IS_POCKETSPHINX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_POCKETSPHINX)) typedef struct _GstPocketSphinx GstPocketSphinx; typedef struct _GstPocketSphinxClass GstPocketSphinxClass; struct _GstPocketSphinx { GstElement element; GstPad *sinkpad, *srcpad; ps_decoder_t *ps; cmd_ln_t *config; gchar *latdir; /**< Output directory for word lattices. */ gboolean speech_started; gboolean listening_started; gint uttno; GstClockTime last_result_time; /**< Timestamp of last partial result. */ char *last_result; /**< String of last partial result. */ }; struct _GstPocketSphinxClass { GstElementClass parent_class; void (*partial_result) (GstElement *element, const gchar *hyp_str); void (*result) (GstElement *element, const gchar *hyp_str); }; GType gst_pocketsphinx_get_type(void); /* * Boxing of decoder. */ #define PS_DECODER_TYPE (ps_decoder_get_type()) GType ps_decoder_get_type(void); G_END_DECLS #endif /* __GST_POCKETSPHINX_H__ */ pocketsphinx-5prealpha/src/gst-plugin/Makefile.in0000664000175000017500000005247412771607732017354 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ @BUILD_GST_TRUE@am__append_1 = libgstpocketsphinx.la subdir = src/gst-plugin DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstpocketsphinx_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la am_libgstpocketsphinx_la_OBJECTS = gstpocketsphinx.lo libgstpocketsphinx_la_OBJECTS = $(am_libgstpocketsphinx_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libgstpocketsphinx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libgstpocketsphinx_la_LDFLAGS) \ $(LDFLAGS) -o $@ @BUILD_GST_TRUE@am_libgstpocketsphinx_la_rpath = -rpath $(plugindir) 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@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(libgstpocketsphinx_la_SOURCES) DIST_SOURCES = $(libgstpocketsphinx_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ my_plugins = $(am__append_1) my_headers = my_files = plugin_LTLIBRARIES = $(my_plugins) libgstpocketsphinx_la_SOURCES = gstpocketsphinx.c libgstpocketsphinx_la_LIBADD = \ $(GST_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ -lsphinxbase libgstpocketsphinx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = gstpocketsphinx.h AM_CFLAGS = \ -I$(top_srcdir)/include \ -I$(top_builddir)/include \ $(GST_CFLAGS) \ -DMODELDIR=\"$(pkgdatadir)/model\" EXTRA_DIST = livedemo.py livedemo.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .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/gst-plugin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/gst-plugin/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgstpocketsphinx.la: $(libgstpocketsphinx_la_OBJECTS) $(libgstpocketsphinx_la_DEPENDENCIES) $(EXTRA_libgstpocketsphinx_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstpocketsphinx_la_LINK) $(am_libgstpocketsphinx_la_rpath) $(libgstpocketsphinx_la_OBJECTS) $(libgstpocketsphinx_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstpocketsphinx.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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: $(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: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: 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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am 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-pluginLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pluginLTLIBRARIES # 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: pocketsphinx-5prealpha/src/libpocketsphinx/0000775000175000017500000000000012771610005016453 500000000000000pocketsphinx-5prealpha/src/libpocketsphinx/ngram_search.c0000664000175000017500000013736712771605033021216 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ngram_search.c N-Gram based multi-pass search ("FBS") */ /* System headers. */ #include #include /* SphinxBase headers. */ #include #include #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "ps_lattice_internal.h" #include "ngram_search.h" #include "ngram_search_fwdtree.h" #include "ngram_search_fwdflat.h" static int ngram_search_start(ps_search_t *search); static int ngram_search_step(ps_search_t *search, int frame_idx); static int ngram_search_finish(ps_search_t *search); static int ngram_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p); static char const *ngram_search_hyp(ps_search_t *search, int32 *out_score); static int32 ngram_search_prob(ps_search_t *search); static ps_seg_t *ngram_search_seg_iter(ps_search_t *search); static ps_searchfuncs_t ngram_funcs = { /* start: */ ngram_search_start, /* step: */ ngram_search_step, /* finish: */ ngram_search_finish, /* reinit: */ ngram_search_reinit, /* free: */ ngram_search_free, /* lattice: */ ngram_search_lattice, /* hyp: */ ngram_search_hyp, /* prob: */ ngram_search_prob, /* seg_iter: */ ngram_search_seg_iter, }; static ngram_model_t *default_lm; static void ngram_search_update_widmap(ngram_search_t *ngs) { char const **words; int32 i, n_words; /* It's okay to include fillers since they won't be in the LM */ n_words = ps_search_n_words(ngs); words = (char const**)ckd_calloc(n_words, sizeof(*words)); /* This will include alternates, again, that's okay since they aren't in the LM */ for (i = 0; i < n_words; ++i) words[i] = dict_wordstr(ps_search_dict(ngs), i); ngram_model_set_map_words(ngs->lmset, words, n_words); ckd_free(words); } static void ngram_search_calc_beams(ngram_search_t *ngs) { cmd_ln_t *config; acmod_t *acmod; config = ps_search_config(ngs); acmod = ps_search_acmod(ngs); /* Log beam widths. */ ngs->beam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-beam"))>>SENSCR_SHIFT; ngs->wbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-wbeam"))>>SENSCR_SHIFT; ngs->pbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pbeam"))>>SENSCR_SHIFT; ngs->lpbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-lpbeam"))>>SENSCR_SHIFT; ngs->lponlybeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-lponlybeam"))>>SENSCR_SHIFT; ngs->fwdflatbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-fwdflatbeam"))>>SENSCR_SHIFT; ngs->fwdflatwbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-fwdflatwbeam"))>>SENSCR_SHIFT; /* Absolute pruning parameters. */ ngs->maxwpf = cmd_ln_int32_r(config, "-maxwpf"); ngs->maxhmmpf = cmd_ln_int32_r(config, "-maxhmmpf"); /* Various penalties which may or may not be useful. */ ngs->wip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-wip")) >>SENSCR_SHIFT; ngs->nwpen = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-nwpen")) >>SENSCR_SHIFT; ngs->pip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pip")) >>SENSCR_SHIFT; ngs->silpen = ngs->pip + (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-silprob"))>>SENSCR_SHIFT); ngs->fillpen = ngs->pip + (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-fillprob"))>>SENSCR_SHIFT); /* Language weight ratios for fwdflat and bestpath search. */ ngs->fwdflat_fwdtree_lw_ratio = cmd_ln_float32_r(config, "-fwdflatlw") / cmd_ln_float32_r(config, "-lw"); ngs->bestpath_fwdtree_lw_ratio = cmd_ln_float32_r(config, "-bestpathlw") / cmd_ln_float32_r(config, "-lw"); /* Acoustic score scale for posterior probabilities. */ ngs->ascale = 1.0 / cmd_ln_float32_r(config, "-ascale"); } ps_search_t * ngram_search_init(const char *name, ngram_model_t *lm, cmd_ln_t *config, acmod_t *acmod, dict_t *dict, dict2pid_t *d2p) { ngram_search_t *ngs; static char *lmname = "default"; /* Make the acmod's feature buffer growable if we are doing two-pass * search. */ acmod_set_grow(acmod, cmd_ln_boolean_r(config, "-fwdflat") && cmd_ln_boolean_r(config, "-fwdtree")); ngs = ckd_calloc(1, sizeof(*ngs)); ps_search_init(&ngs->base, &ngram_funcs, PS_SEARCH_TYPE_NGRAM, name, config, acmod, dict, d2p); ngs->hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->mdef), acmod->tmat->tp, NULL, acmod->mdef->sseq); if (ngs->hmmctx == NULL) { ps_search_free(ps_search_base(ngs)); return NULL; } ngs->chan_alloc = listelem_alloc_init(sizeof(chan_t)); ngs->root_chan_alloc = listelem_alloc_init(sizeof(root_chan_t)); ngs->latnode_alloc = listelem_alloc_init(sizeof(ps_latnode_t)); /* Calculate various beam widths and such. */ ngram_search_calc_beams(ngs); /* Allocate a billion different tables for stuff. */ ngs->word_chan = ckd_calloc(dict_size(dict), sizeof(*ngs->word_chan)); ngs->word_lat_idx = ckd_calloc(dict_size(dict), sizeof(*ngs->word_lat_idx)); ngs->word_active = bitvec_alloc(dict_size(dict)); ngs->last_ltrans = ckd_calloc(dict_size(dict), sizeof(*ngs->last_ltrans)); /* FIXME: All these structures need to be made dynamic with * garbage collection. */ ngs->bp_table_size = cmd_ln_int32_r(config, "-latsize"); ngs->bp_table = ckd_calloc(ngs->bp_table_size, sizeof(*ngs->bp_table)); /* FIXME: This thing is frickin' huge. */ ngs->bscore_stack_size = ngs->bp_table_size * 20; ngs->bscore_stack = ckd_calloc(ngs->bscore_stack_size, sizeof(*ngs->bscore_stack)); ngs->n_frame_alloc = 256; ngs->bp_table_idx = ckd_calloc(ngs->n_frame_alloc + 1, sizeof(*ngs->bp_table_idx)); ++ngs->bp_table_idx; /* Make bptableidx[-1] valid */ /* Allocate active word list array */ ngs->active_word_list = ckd_calloc_2d(2, dict_size(dict), sizeof(**ngs->active_word_list)); ngs->lmset = ngram_model_set_init(config, &lm, &lmname, NULL, 1); if (!ngs->lmset) goto error_out; if (ngram_wid(ngs->lmset, S3_FINISH_WORD) == ngram_unknown_wid(ngs->lmset)) { E_ERROR("Language model/set does not contain , " "recognition will fail\n"); goto error_out; } /* Create word mappings. */ ngram_search_update_widmap(ngs); /* Initialize fwdtree, fwdflat, bestpath modules if necessary. */ if (cmd_ln_boolean_r(config, "-fwdtree")) { ngram_fwdtree_init(ngs); ngs->fwdtree = TRUE; ngs->fwdtree_perf.name = "fwdtree"; ptmr_init(&ngs->fwdtree_perf); } if (cmd_ln_boolean_r(config, "-fwdflat")) { ngram_fwdflat_init(ngs); ngs->fwdflat = TRUE; ngs->fwdflat_perf.name = "fwdflat"; ptmr_init(&ngs->fwdflat_perf); } if (cmd_ln_boolean_r(config, "-bestpath")) { ngs->bestpath = TRUE; ngs->bestpath_perf.name = "bestpath"; ptmr_init(&ngs->bestpath_perf); } return (ps_search_t *)ngs; error_out: ngram_search_free((ps_search_t *)ngs); return NULL; } static int ngram_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) { ngram_search_t *ngs = (ngram_search_t *)search; int old_n_words; int rv = 0; /* Update the number of words. */ old_n_words = search->n_words; if (old_n_words != dict_size(dict)) { search->n_words = dict_size(dict); /* Reallocate these temporary arrays. */ ckd_free(ngs->word_lat_idx); ckd_free(ngs->word_active); ckd_free(ngs->last_ltrans); ckd_free_2d(ngs->active_word_list); ngs->word_lat_idx = ckd_calloc(search->n_words, sizeof(*ngs->word_lat_idx)); ngs->word_active = bitvec_alloc(search->n_words); ngs->last_ltrans = ckd_calloc(search->n_words, sizeof(*ngs->last_ltrans)); ngs->active_word_list = ckd_calloc_2d(2, search->n_words, sizeof(**ngs->active_word_list)); } /* Free old dict2pid, dict */ ps_search_base_reinit(search, dict, d2p); if (ngs->lmset == NULL) return 0; /* Update beam widths. */ ngram_search_calc_beams(ngs); /* Update word mappings. */ ngram_search_update_widmap(ngs); /* Now rebuild lextrees. */ if (ngs->fwdtree) { if ((rv = ngram_fwdtree_reinit(ngs)) < 0) return rv; } if (ngs->fwdflat) { if ((rv = ngram_fwdflat_reinit(ngs)) < 0) return rv; } return rv; } void ngram_search_free(ps_search_t *search) { ngram_search_t *ngs = (ngram_search_t *)search; if (ngs->fwdtree) ngram_fwdtree_deinit(ngs); if (ngs->fwdflat) ngram_fwdflat_deinit(ngs); if (ngs->bestpath) { double n_speech = (double)ngs->n_tot_frame / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); E_INFO("TOTAL bestpath %.2f CPU %.3f xRT\n", ngs->bestpath_perf.t_tot_cpu, ngs->bestpath_perf.t_tot_cpu / n_speech); E_INFO("TOTAL bestpath %.2f wall %.3f xRT\n", ngs->bestpath_perf.t_tot_elapsed, ngs->bestpath_perf.t_tot_elapsed / n_speech); } ps_search_base_free(search); hmm_context_free(ngs->hmmctx); listelem_alloc_free(ngs->chan_alloc); listelem_alloc_free(ngs->root_chan_alloc); listelem_alloc_free(ngs->latnode_alloc); ngram_model_free(ngs->lmset); ckd_free(ngs->word_chan); ckd_free(ngs->word_lat_idx); bitvec_free(ngs->word_active); ckd_free(ngs->bp_table); ckd_free(ngs->bscore_stack); if (ngs->bp_table_idx != NULL) ckd_free(ngs->bp_table_idx - 1); ckd_free_2d(ngs->active_word_list); ckd_free(ngs->last_ltrans); ckd_free(ngs); } int ngram_search_mark_bptable(ngram_search_t *ngs, int frame_idx) { if (frame_idx >= ngs->n_frame_alloc) { ngs->n_frame_alloc *= 2; ngs->bp_table_idx = ckd_realloc(ngs->bp_table_idx - 1, (ngs->n_frame_alloc + 1) * sizeof(*ngs->bp_table_idx)); if (ngs->frm_wordlist) { ngs->frm_wordlist = ckd_realloc(ngs->frm_wordlist, ngs->n_frame_alloc * sizeof(*ngs->frm_wordlist)); } ++ngs->bp_table_idx; /* Make bptableidx[-1] valid */ } ngs->bp_table_idx[frame_idx] = ngs->bpidx; return ngs->bpidx; } static void set_real_wid(ngram_search_t *ngs, int32 bp) { bptbl_t *ent, *prev; assert(bp != NO_BP); ent = ngs->bp_table + bp; if (ent->bp == NO_BP) prev = NULL; else prev = ngs->bp_table + ent->bp; /* Propagate lm state for fillers, rotate it for words. */ if (dict_filler_word(ps_search_dict(ngs), ent->wid)) { if (prev != NULL) { ent->real_wid = prev->real_wid; ent->prev_real_wid = prev->prev_real_wid; } else { ent->real_wid = dict_basewid(ps_search_dict(ngs), ent->wid); ent->prev_real_wid = BAD_S3WID; } } else { ent->real_wid = dict_basewid(ps_search_dict(ngs), ent->wid); if (prev != NULL) ent->prev_real_wid = prev->real_wid; else ent->prev_real_wid = BAD_S3WID; } } #define NGRAM_HISTORY_LONG_WORD 2000 /* 20s */ void ngram_search_save_bp(ngram_search_t *ngs, int frame_idx, int32 w, int32 score, int32 path, int32 rc) { int32 bp; /* Look for an existing exit for this word in this frame. The * only reason one would exist is from a different right context * triphone, but of course that happens quite frequently. */ bp = ngs->word_lat_idx[w]; if (bp != NO_BP) { if (frame_idx - ngs->bp_table[path].frame > NGRAM_HISTORY_LONG_WORD) { E_WARN("Word '%s' survived for %d frames, potential overpruning\n", dict_wordstr(ps_search_dict(ngs), w), frame_idx - ngs->bp_table[path].frame); } /* Keep only the best scoring one, we will reconstruct the * others from the right context scores - usually the history * is not lost. */ if (ngs->bp_table[bp].score WORSE_THAN score) { assert(path != bp); /* Pathological. */ if (ngs->bp_table[bp].bp != path) { int32 bplh[2], newlh[2]; /* But, sometimes, the history *is* lost. If we wanted to * do exact language model scoring we'd have to preserve * these alternate histories. */ E_DEBUG(2,("Updating path history %d => %d frame %d\n", ngs->bp_table[bp].bp, path, frame_idx)); bplh[0] = ngs->bp_table[bp].bp == -1 ? -1 : ngs->bp_table[ngs->bp_table[bp].bp].prev_real_wid; bplh[1] = ngs->bp_table[bp].bp == -1 ? -1 : ngs->bp_table[ngs->bp_table[bp].bp].real_wid; newlh[0] = path == -1 ? -1 : ngs->bp_table[path].prev_real_wid; newlh[1] = path == -1 ? -1 : ngs->bp_table[path].real_wid; /* Actually it's worth checking how often the actual * language model state changes. */ if (bplh[0] != newlh[0] || bplh[1] != newlh[1]) { /* It's fairly rare that the actual language model * state changes, but it does happen some * times. */ E_DEBUG(1, ("Updating language model state %s,%s => %s,%s frame %d\n", dict_wordstr(ps_search_dict(ngs), bplh[0]), dict_wordstr(ps_search_dict(ngs), bplh[1]), dict_wordstr(ps_search_dict(ngs), newlh[0]), dict_wordstr(ps_search_dict(ngs), newlh[1]), frame_idx)); set_real_wid(ngs, bp); } ngs->bp_table[bp].bp = path; } ngs->bp_table[bp].score = score; } /* But do keep track of scores for all right contexts, since * we need them to determine the starting path scores for any * successors of this word exit. */ if (ngs->bp_table[bp].s_idx != -1) ngs->bscore_stack[ngs->bp_table[bp].s_idx + rc] = score; } else { int32 i, rcsize; bptbl_t *be; /* This might happen if recognition fails. */ if (ngs->bpidx == NO_BP) { E_ERROR("No entries in backpointer table!"); return; } /* Expand the backpointer tables if necessary. */ if (ngs->bpidx >= ngs->bp_table_size) { ngs->bp_table_size *= 2; ngs->bp_table = ckd_realloc(ngs->bp_table, ngs->bp_table_size * sizeof(*ngs->bp_table)); E_INFO("Resized backpointer table to %d entries\n", ngs->bp_table_size); } if (ngs->bss_head >= ngs->bscore_stack_size - bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef)) { ngs->bscore_stack_size *= 2; ngs->bscore_stack = ckd_realloc(ngs->bscore_stack, ngs->bscore_stack_size * sizeof(*ngs->bscore_stack)); E_INFO("Resized score stack to %d entries\n", ngs->bscore_stack_size); } ngs->word_lat_idx[w] = ngs->bpidx; be = &(ngs->bp_table[ngs->bpidx]); be->wid = w; be->frame = frame_idx; be->bp = path; be->score = score; be->s_idx = ngs->bss_head; be->valid = TRUE; assert(path != ngs->bpidx); /* DICT2PID */ /* Get diphone ID for final phone and number of ssids corresponding to it. */ be->last_phone = dict_last_phone(ps_search_dict(ngs),w); if (dict_is_single_phone(ps_search_dict(ngs), w)) { be->last2_phone = -1; be->s_idx = -1; rcsize = 0; } else { be->last2_phone = dict_second_last_phone(ps_search_dict(ngs),w); rcsize = dict2pid_rssid(ps_search_dict2pid(ngs), be->last_phone, be->last2_phone)->n_ssid; } /* Allocate some space on the bscore_stack for all of these triphones. */ for (i = 0; i < rcsize; ++i) ngs->bscore_stack[ngs->bss_head + i] = WORST_SCORE; if (rcsize) ngs->bscore_stack[ngs->bss_head + rc] = score; set_real_wid(ngs, ngs->bpidx); ngs->bpidx++; ngs->bss_head += rcsize; } } int ngram_search_find_exit(ngram_search_t *ngs, int frame_idx, int32 *out_best_score) { /* End of backpointers for this frame. */ int end_bpidx; int best_exit, bp; int32 best_score; /* No hypothesis means no exit node! */ if (ngs->n_frame == 0) return NO_BP; if (frame_idx == -1 || frame_idx >= ngs->n_frame) frame_idx = ngs->n_frame - 1; end_bpidx = ngs->bp_table_idx[frame_idx]; best_score = WORST_SCORE; best_exit = NO_BP; /* Scan back to find a frame with some backpointers in it. */ while (frame_idx >= 0 && ngs->bp_table_idx[frame_idx] == end_bpidx) --frame_idx; /* This is NOT an error, it just means there is no hypothesis yet. */ if (frame_idx < 0) return NO_BP; /* Now find the entry for OR the best scoring entry. */ assert(end_bpidx < ngs->bp_table_size); for (bp = ngs->bp_table_idx[frame_idx]; bp < end_bpidx; ++bp) { if (ngs->bp_table[bp].wid == ps_search_finish_wid(ngs) || ngs->bp_table[bp].score BETTER_THAN best_score) { best_score = ngs->bp_table[bp].score; best_exit = bp; } if (ngs->bp_table[bp].wid == ps_search_finish_wid(ngs)) break; } if (out_best_score) { *out_best_score = best_score; } return best_exit; } char const * ngram_search_bp_hyp(ngram_search_t *ngs, int bpidx) { ps_search_t *base = ps_search_base(ngs); char *c; size_t len; int bp; if (bpidx == NO_BP) return NULL; bp = bpidx; len = 0; while (bp != NO_BP) { bptbl_t *be = &ngs->bp_table[bp]; bp = be->bp; if (dict_real_word(ps_search_dict(ngs), be->wid)) len += strlen(dict_basestr(ps_search_dict(ngs), be->wid)) + 1; } ckd_free(base->hyp_str); if (len == 0) { base->hyp_str = NULL; return base->hyp_str; } base->hyp_str = ckd_calloc(1, len); bp = bpidx; c = base->hyp_str + len - 1; while (bp != NO_BP) { bptbl_t *be = &ngs->bp_table[bp]; size_t len; bp = be->bp; if (dict_real_word(ps_search_dict(ngs), be->wid)) { len = strlen(dict_basestr(ps_search_dict(ngs), be->wid)); c -= len; memcpy(c, dict_basestr(ps_search_dict(ngs), be->wid), len); if (c > base->hyp_str) { --c; *c = ' '; } } } return base->hyp_str; } void ngram_search_alloc_all_rc(ngram_search_t *ngs, int32 w) { chan_t *hmm, *thmm; xwdssid_t *rssid; int32 i, tmatid, ciphone; /* DICT2PID */ /* Get pointer to array of triphones for final diphone. */ assert(!dict_is_single_phone(ps_search_dict(ngs), w)); ciphone = dict_last_phone(ps_search_dict(ngs),w); rssid = dict2pid_rssid(ps_search_dict2pid(ngs), ciphone, dict_second_last_phone(ps_search_dict(ngs),w)); tmatid = bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, ciphone); hmm = ngs->word_chan[w]; if ((hmm == NULL) || (hmm_nonmpx_ssid(&hmm->hmm) != rssid->ssid[0])) { hmm = listelem_malloc(ngs->chan_alloc); hmm->next = ngs->word_chan[w]; ngs->word_chan[w] = hmm; hmm->info.rc_id = 0; hmm->ciphone = ciphone; hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, rssid->ssid[0], tmatid); E_DEBUG(3,("allocated rc_id 0 ssid %d ciphone %d lc %d word %s\n", rssid->ssid[0], hmm->ciphone, dict_second_last_phone(ps_search_dict(ngs),w), dict_wordstr(ps_search_dict(ngs),w))); } for (i = 1; i < rssid->n_ssid; ++i) { if ((hmm->next == NULL) || (hmm_nonmpx_ssid(&hmm->next->hmm) != rssid->ssid[i])) { thmm = listelem_malloc(ngs->chan_alloc); thmm->next = hmm->next; hmm->next = thmm; hmm = thmm; hmm->info.rc_id = i; hmm->ciphone = ciphone; hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, rssid->ssid[i], tmatid); E_DEBUG(3,("allocated rc_id %d ssid %d ciphone %d lc %d word %s\n", i, rssid->ssid[i], hmm->ciphone, dict_second_last_phone(ps_search_dict(ngs),w), dict_wordstr(ps_search_dict(ngs),w))); } else hmm = hmm->next; } } void ngram_search_free_all_rc(ngram_search_t *ngs, int32 w) { chan_t *hmm, *thmm; for (hmm = ngs->word_chan[w]; hmm; hmm = thmm) { thmm = hmm->next; hmm_deinit(&hmm->hmm); listelem_free(ngs->chan_alloc, hmm); } ngs->word_chan[w] = NULL; } int32 ngram_search_exit_score(ngram_search_t *ngs, bptbl_t *pbe, int rcphone) { /* DICT2PID */ /* Get the mapping from right context phone ID to index in the * right context table and the bscore_stack. */ if (pbe->last2_phone == -1) { /* No right context for single phone predecessor words. */ return pbe->score; } else { xwdssid_t *rssid; /* Find the index for the last diphone of the previous word + * the first phone of the current word. */ rssid = dict2pid_rssid(ps_search_dict2pid(ngs), pbe->last_phone, pbe->last2_phone); /* This may be WORST_SCORE, which means that there was no exit * with rcphone as right context. */ return ngs->bscore_stack[pbe->s_idx + rssid->cimap[rcphone]]; } } /* * Compute acoustic and LM scores for a BPTable entry (segment). */ void ngram_compute_seg_score(ngram_search_t *ngs, bptbl_t *be, float32 lwf, int32 *out_ascr, int32 *out_lscr) { bptbl_t *pbe; int32 start_score; /* Start of utterance. */ if (be->bp == NO_BP) { *out_ascr = be->score; *out_lscr = 0; return; } /* Otherwise, calculate lscr and ascr. */ pbe = ngs->bp_table + be->bp; start_score = ngram_search_exit_score(ngs, pbe, dict_first_phone(ps_search_dict(ngs),be->wid)); assert(start_score BETTER_THAN WORST_SCORE); /* FIXME: These result in positive acoustic scores when filler words have non-filler pronunciations. That whole business is still pretty much broken but at least it doesn't segfault. */ if (be->wid == ps_search_silence_wid(ngs)) { *out_lscr = ngs->silpen; } else if (dict_filler_word(ps_search_dict(ngs), be->wid)) { *out_lscr = ngs->fillpen; } else { int32 n_used; *out_lscr = ngram_tg_score(ngs->lmset, be->real_wid, pbe->real_wid, pbe->prev_real_wid, &n_used)>>SENSCR_SHIFT; *out_lscr = *out_lscr * lwf; } *out_ascr = be->score - start_score - *out_lscr; } static int ngram_search_start(ps_search_t *search) { ngram_search_t *ngs = (ngram_search_t *)search; ngs->done = FALSE; ngram_model_flush(ngs->lmset); if (ngs->fwdtree) ngram_fwdtree_start(ngs); else if (ngs->fwdflat) ngram_fwdflat_start(ngs); else return -1; return 0; } static int ngram_search_step(ps_search_t *search, int frame_idx) { ngram_search_t *ngs = (ngram_search_t *)search; if (ngs->fwdtree) return ngram_fwdtree_search(ngs, frame_idx); else if (ngs->fwdflat) return ngram_fwdflat_search(ngs, frame_idx); else return -1; } void dump_bptable(ngram_search_t *ngs) { int i; E_INFO("Backpointer table (%d entries):\n", ngs->bpidx); for (i = 0; i < ngs->bpidx; ++i) { bptbl_t *bpe = ngs->bp_table + i; int j, rcsize; E_INFO_NOFN("%-5d %-10s start %-3d end %-3d score %-8d bp %-3d real_wid %-5d prev_real_wid %-5d", i, dict_wordstr(ps_search_dict(ngs), bpe->wid), (bpe->bp == -1 ? 0 : ngs->bp_table[bpe->bp].frame + 1), bpe->frame, bpe->score, bpe->bp, bpe->real_wid, bpe->prev_real_wid); if (bpe->last2_phone == -1) rcsize = 0; else rcsize = dict2pid_rssid(ps_search_dict2pid(ngs), bpe->last_phone, bpe->last2_phone)->n_ssid; if (rcsize) { E_INFOCONT("\tbss"); for (j = 0; j < rcsize; ++j) if (ngs->bscore_stack[bpe->s_idx + j] != WORST_SCORE) E_INFOCONT(" %d", bpe->score - ngs->bscore_stack[bpe->s_idx + j]); } E_INFOCONT("\n"); } } static int ngram_search_finish(ps_search_t *search) { ngram_search_t *ngs = (ngram_search_t *)search; ngs->n_tot_frame += ngs->n_frame; if (ngs->fwdtree) { ngram_fwdtree_finish(ngs); /* dump_bptable(ngs); */ /* Now do fwdflat search in its entirety, if requested. */ if (ngs->fwdflat) { int i; /* Rewind the acoustic model. */ if (acmod_rewind(ps_search_acmod(ngs)) < 0) return -1; /* Now redo search. */ ngram_fwdflat_start(ngs); i = 0; while (ps_search_acmod(ngs)->n_feat_frame > 0) { int nfr; if ((nfr = ngram_fwdflat_search(ngs, i)) < 0) return nfr; acmod_advance(ps_search_acmod(ngs)); ++i; } ngram_fwdflat_finish(ngs); /* And now, we should have a result... */ /* dump_bptable(ngs); */ } } else if (ngs->fwdflat) { ngram_fwdflat_finish(ngs); } /* Mark the current utterance as done. */ ngs->done = TRUE; return 0; } static ps_latlink_t * ngram_search_bestpath(ps_search_t *search, int32 *out_score, int backward) { ngram_search_t *ngs = (ngram_search_t *)search; if (search->last_link == NULL) { search->last_link = ps_lattice_bestpath(search->dag, ngs->lmset, ngs->bestpath_fwdtree_lw_ratio, ngs->ascale); if (search->last_link == NULL) return NULL; /* Also calculate betas so we can fill in the posterior * probability field in the segmentation. */ if (search->post == 0) search->post = ps_lattice_posterior(search->dag, ngs->lmset, ngs->ascale); } if (out_score) *out_score = search->last_link->path_scr + search->dag->final_node_ascr; return search->last_link; } static char const * ngram_search_hyp(ps_search_t *search, int32 *out_score) { ngram_search_t *ngs = (ngram_search_t *)search; /* Only do bestpath search if the utterance is complete. */ if (ngs->bestpath && ngs->done) { ps_lattice_t *dag; ps_latlink_t *link; char const *hyp; double n_speech; ptmr_reset(&ngs->bestpath_perf); ptmr_start(&ngs->bestpath_perf); if ((dag = ngram_search_lattice(search)) == NULL) return NULL; if ((link = ngram_search_bestpath(search, out_score, FALSE)) == NULL) return NULL; hyp = ps_lattice_hyp(dag, link); ptmr_stop(&ngs->bestpath_perf); n_speech = (double)dag->n_frames / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); E_INFO("bestpath %.2f CPU %.3f xRT\n", ngs->bestpath_perf.t_cpu, ngs->bestpath_perf.t_cpu / n_speech); E_INFO("bestpath %.2f wall %.3f xRT\n", ngs->bestpath_perf.t_elapsed, ngs->bestpath_perf.t_elapsed / n_speech); return hyp; } else { int32 bpidx; /* fwdtree and fwdflat use same backpointer table. */ bpidx = ngram_search_find_exit(ngs, -1, out_score); if (bpidx != NO_BP) return ngram_search_bp_hyp(ngs, bpidx); } return NULL; } static void ngram_search_bp2itor(ps_seg_t *seg, int bp) { ngram_search_t *ngs = (ngram_search_t *)seg->search; bptbl_t *be, *pbe; be = &ngs->bp_table[bp]; pbe = be->bp == -1 ? NULL : &ngs->bp_table[be->bp]; seg->word = dict_wordstr(ps_search_dict(ngs), be->wid); seg->ef = be->frame; seg->sf = pbe ? pbe->frame + 1 : 0; seg->prob = 0; /* Bogus value... */ /* Compute acoustic and LM scores for this segment. */ if (pbe == NULL) { seg->ascr = be->score; seg->lscr = 0; seg->lback = 0; } else { int32 start_score; /* Find ending path score of previous word. */ start_score = ngram_search_exit_score(ngs, pbe, dict_first_phone(ps_search_dict(ngs), be->wid)); assert(start_score BETTER_THAN WORST_SCORE); if (be->wid == ps_search_silence_wid(ngs)) { seg->lscr = ngs->silpen; } else if (dict_filler_word(ps_search_dict(ngs), be->wid)) { seg->lscr = ngs->fillpen; } else { seg->lscr = ngram_tg_score(ngs->lmset, be->real_wid, pbe->real_wid, pbe->prev_real_wid, &seg->lback)>>SENSCR_SHIFT; seg->lscr = (int32)(seg->lscr * seg->lwf); } seg->ascr = be->score - start_score - seg->lscr; } } static void ngram_bp_seg_free(ps_seg_t *seg) { bptbl_seg_t *itor = (bptbl_seg_t *)seg; ckd_free(itor->bpidx); ckd_free(itor); } static ps_seg_t * ngram_bp_seg_next(ps_seg_t *seg) { bptbl_seg_t *itor = (bptbl_seg_t *)seg; if (++itor->cur == itor->n_bpidx) { ngram_bp_seg_free(seg); return NULL; } ngram_search_bp2itor(seg, itor->bpidx[itor->cur]); return seg; } static ps_segfuncs_t ngram_bp_segfuncs = { /* seg_next */ ngram_bp_seg_next, /* seg_free */ ngram_bp_seg_free }; static ps_seg_t * ngram_search_bp_iter(ngram_search_t *ngs, int bpidx, float32 lwf) { bptbl_seg_t *itor; int bp, cur; /* Calling this an "iterator" is a bit of a misnomer since we have * to get the entire backtrace in order to produce it. On the * other hand, all we actually need is the bptbl IDs, and we can * allocate a fixed-size array of them. */ itor = ckd_calloc(1, sizeof(*itor)); itor->base.vt = &ngram_bp_segfuncs; itor->base.search = ps_search_base(ngs); itor->base.lwf = lwf; itor->n_bpidx = 0; bp = bpidx; while (bp != NO_BP) { bptbl_t *be = &ngs->bp_table[bp]; bp = be->bp; ++itor->n_bpidx; } if (itor->n_bpidx == 0) { ckd_free(itor); return NULL; } itor->bpidx = ckd_calloc(itor->n_bpidx, sizeof(*itor->bpidx)); cur = itor->n_bpidx - 1; bp = bpidx; while (bp != NO_BP) { bptbl_t *be = &ngs->bp_table[bp]; itor->bpidx[cur] = bp; bp = be->bp; --cur; } /* Fill in relevant fields for first element. */ ngram_search_bp2itor((ps_seg_t *)itor, itor->bpidx[0]); return (ps_seg_t *)itor; } static ps_seg_t * ngram_search_seg_iter(ps_search_t *search) { ngram_search_t *ngs = (ngram_search_t *)search; /* Only do bestpath search if the utterance is done. */ if (ngs->bestpath && ngs->done) { ps_lattice_t *dag; ps_latlink_t *link; double n_speech; ps_seg_t *itor; ptmr_reset(&ngs->bestpath_perf); ptmr_start(&ngs->bestpath_perf); if ((dag = ngram_search_lattice(search)) == NULL) return NULL; if ((link = ngram_search_bestpath(search, NULL, TRUE)) == NULL) return NULL; itor = ps_lattice_seg_iter(dag, link, ngs->bestpath_fwdtree_lw_ratio); ptmr_stop(&ngs->bestpath_perf); n_speech = (double)dag->n_frames / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); E_INFO("bestpath %.2f CPU %.3f xRT\n", ngs->bestpath_perf.t_cpu, ngs->bestpath_perf.t_cpu / n_speech); E_INFO("bestpath %.2f wall %.3f xRT\n", ngs->bestpath_perf.t_elapsed, ngs->bestpath_perf.t_elapsed / n_speech); return itor; } else { int32 bpidx; /* fwdtree and fwdflat use same backpointer table. */ bpidx = ngram_search_find_exit(ngs, -1, NULL); return ngram_search_bp_iter(ngs, bpidx, /* but different language weights... */ (ngs->done && ngs->fwdflat) ? ngs->fwdflat_fwdtree_lw_ratio : 1.0); } return NULL; } static int32 ngram_search_prob(ps_search_t *search) { ngram_search_t *ngs = (ngram_search_t *)search; /* Only do bestpath search if the utterance is done. */ if (ngs->bestpath && ngs->done) { ps_lattice_t *dag; ps_latlink_t *link; if ((dag = ngram_search_lattice(search)) == NULL) return 0; if ((link = ngram_search_bestpath(search, NULL, TRUE)) == NULL) return 0; return search->post; } else { /* FIXME: Give some kind of good estimate here, eventually. */ return 0; } } static void create_dag_nodes(ngram_search_t *ngs, ps_lattice_t *dag) { bptbl_t *bp_ptr; int32 i; for (i = 0, bp_ptr = ngs->bp_table; i < ngs->bpidx; ++i, ++bp_ptr) { int32 sf, ef, wid; ps_latnode_t *node; /* Skip invalid backpointers (these result from -maxwpf pruning) */ if (!bp_ptr->valid) continue; sf = (bp_ptr->bp < 0) ? 0 : ngs->bp_table[bp_ptr->bp].frame + 1; ef = bp_ptr->frame; wid = bp_ptr->wid; assert(ef < dag->n_frames); /* Skip non-final entries. */ if ((wid == ps_search_finish_wid(ngs)) && (ef < dag->n_frames - 1)) continue; /* Skip if word not in LM */ if ((!dict_filler_word(ps_search_dict(ngs), wid)) && (!ngram_model_set_known_wid(ngs->lmset, dict_basewid(ps_search_dict(ngs), wid)))) continue; /* See if bptbl entry already in lattice */ for (node = dag->nodes; node; node = node->next) { if ((node->wid == wid) && (node->sf == sf)) break; } /* For the moment, store bptbl indices in node.{fef,lef} */ if (node) node->lef = i; else { /* New node; link to head of list */ node = listelem_malloc(dag->latnode_alloc); node->wid = wid; node->sf = sf; /* This is a frame index. */ node->fef = node->lef = i; /* These are backpointer indices (argh) */ node->reachable = FALSE; node->entries = NULL; node->exits = NULL; /* NOTE: This creates the list of nodes in reverse * topological order, i.e. a node always precedes its * antecedents in this list. */ node->next = dag->nodes; dag->nodes = node; ++dag->n_nodes; } } } static ps_latnode_t * find_start_node(ngram_search_t *ngs, ps_lattice_t *dag) { ps_latnode_t *node; /* Find start node .0 */ for (node = dag->nodes; node; node = node->next) { if ((node->wid == ps_search_start_wid(ngs)) && (node->sf == 0)) break; } if (!node) { /* This is probably impossible. */ E_ERROR("Couldn't find in first frame\n"); return NULL; } return node; } static ps_latnode_t * find_end_node(ngram_search_t *ngs, ps_lattice_t *dag, float32 lwf) { ps_latnode_t *node; int32 ef, bestbp, bp, bestscore; /* Find final node .last_frame; nothing can follow this node */ for (node = dag->nodes; node; node = node->next) { int32 lef = ngs->bp_table[node->lef].frame; if ((node->wid == ps_search_finish_wid(ngs)) && (lef == dag->n_frames - 1)) break; } if (node != NULL) return node; /* It is quite likely that no exited in the last frame. So, * find the node corresponding to the best exit. */ /* Find the last frame containing a word exit. */ for (ef = dag->n_frames - 1; ef >= 0 && ngs->bp_table_idx[ef] == ngs->bpidx; --ef); if (ef < 0) { E_ERROR("Empty backpointer table: can not build DAG.\n"); return NULL; } /* Find best word exit in that frame. */ bestscore = WORST_SCORE; bestbp = NO_BP; for (bp = ngs->bp_table_idx[ef]; bp < ngs->bp_table_idx[ef + 1]; ++bp) { int32 n_used, l_scr, wid, prev_wid; wid = ngs->bp_table[bp].real_wid; prev_wid = ngs->bp_table[bp].prev_real_wid; /* Always prefer , of which there will only be one per frame. */ if (wid == ps_search_finish_wid(ngs)) { bestbp = bp; break; } l_scr = ngram_tg_score(ngs->lmset, ps_search_finish_wid(ngs), wid, prev_wid, &n_used) >>SENSCR_SHIFT; l_scr = l_scr * lwf; if (ngs->bp_table[bp].score + l_scr BETTER_THAN bestscore) { bestscore = ngs->bp_table[bp].score + l_scr; bestbp = bp; } } if (bestbp == NO_BP) { E_ERROR("No word exits found in last frame (%d), assuming no recognition\n", ef); return NULL; } E_INFO(" not found in last frame, using %s.%d instead\n", dict_basestr(ps_search_dict(ngs), ngs->bp_table[bestbp].wid), ef); /* Now find the node that corresponds to it. */ for (node = dag->nodes; node; node = node->next) { if (node->lef == bestbp) return node; } /* FIXME: This seems to happen a lot! */ E_ERROR("Failed to find DAG node corresponding to %s\n", dict_basestr(ps_search_dict(ngs), ngs->bp_table[bestbp].wid)); return NULL; } /* * Build lattice from bptable. */ ps_lattice_t * ngram_search_lattice(ps_search_t *search) { int32 i, score, ascr, lscr; ps_latnode_t *node, *from, *to; ngram_search_t *ngs; ps_lattice_t *dag; int min_endfr, nlink; float lwf; ngs = (ngram_search_t *)search; min_endfr = cmd_ln_int32_r(ps_search_config(search), "-min_endfr"); /* If the best score is WORST_SCORE or worse, there is no way to * make a lattice. */ if (ngs->best_score == WORST_SCORE || ngs->best_score WORSE_THAN WORST_SCORE) return NULL; /* Check to see if a lattice has previously been created over the * same number of frames, and reuse it if so. */ if (search->dag && search->dag->n_frames == ngs->n_frame) return search->dag; /* Nope, create a new one. */ ps_lattice_free(search->dag); search->dag = NULL; dag = ps_lattice_init_search(search, ngs->n_frame); /* Compute these such that they agree with the fwdtree language weight. */ lwf = ngs->fwdflat ? ngs->fwdflat_fwdtree_lw_ratio : 1.0; create_dag_nodes(ngs, dag); if ((dag->start = find_start_node(ngs, dag)) == NULL) goto error_out; if ((dag->end = find_end_node(ngs, dag, ngs->bestpath_fwdtree_lw_ratio)) == NULL) goto error_out; E_INFO("lattice start node %s.%d end node %s.%d\n", dict_wordstr(search->dict, dag->start->wid), dag->start->sf, dict_wordstr(search->dict, dag->end->wid), dag->end->sf); ngram_compute_seg_score(ngs, ngs->bp_table + dag->end->lef, lwf, &dag->final_node_ascr, &lscr); /* * At this point, dag->nodes is ordered such that nodes earlier in * the list can follow (in time) those later in the list, but not * vice versa (see above - also note that adjacency is purely * determined by time which is why we can make this claim). Now * create precedence links and simultanesously mark all nodes that * can reach dag->end. (All nodes are reached from dag->start * simply by definition - they were created that way). * * Note that this also means that any nodes before dag->end in the * list can be discarded, meaning that dag->end will always be * equal to dag->nodes (FIXME: except when loading from a file but * we can fix that...) */ i = 0; while (dag->nodes && dag->nodes != dag->end) { ps_latnode_t *next = dag->nodes->next; listelem_free(dag->latnode_alloc, dag->nodes); dag->nodes = next; ++i; } E_INFO("Eliminated %d nodes before end node\n", i); dag->end->reachable = TRUE; nlink = 0; for (to = dag->end; to; to = to->next) { int fef, lef; /* Skip if not reachable; it will never be reachable from dag->end */ if (!to->reachable) continue; /* Prune nodes with too few endpoints - heuristic borrowed from Sphinx3 */ fef = ngs->bp_table[to->fef].frame; lef = ngs->bp_table[to->lef].frame; if (to != dag->end && lef - fef < min_endfr) { to->reachable = FALSE; continue; } /* Find predecessors of to : from->fef+1 <= to->sf <= from->lef+1 */ for (from = to->next; from; from = from->next) { bptbl_t *from_bpe; fef = ngs->bp_table[from->fef].frame; lef = ngs->bp_table[from->lef].frame; if ((to->sf <= fef) || (to->sf > lef + 1)) continue; if (lef - fef < min_endfr) { assert(!from->reachable); continue; } /* Find bptable entry for "from" that exactly precedes "to" */ i = from->fef; from_bpe = ngs->bp_table + i; for (; i <= from->lef; i++, from_bpe++) { if (from_bpe->wid != from->wid) continue; if (from_bpe->frame >= to->sf - 1) break; } if ((i > from->lef) || (from_bpe->frame != to->sf - 1)) continue; /* Find acoustic score from.sf->to.sf-1 with right context = to */ /* This gives us from_bpe's best acoustic score. */ ngram_compute_seg_score(ngs, from_bpe, lwf, &ascr, &lscr); /* Now find the exact path score for from->to, including * the appropriate final triphone. In fact this might not * exist. */ score = ngram_search_exit_score(ngs, from_bpe, dict_first_phone(ps_search_dict(ngs), to->wid)); /* Does not exist. Can't create a link here. */ if (score == WORST_SCORE) continue; /* Adjust the arc score to match the correct triphone. */ else score = ascr + (score - from_bpe->score); if (score BETTER_THAN 0) { /* Scores must be negative, or Bad Things will happen. In general, they are, except in corner cases involving filler words. We don't want to throw any links away so we'll keep these, but with some arbitrarily improbable but recognizable score. */ ps_lattice_link(dag, from, to, -424242, from_bpe->frame); ++nlink; from->reachable = TRUE; } else if (score BETTER_THAN WORST_SCORE) { ps_lattice_link(dag, from, to, score, from_bpe->frame); ++nlink; from->reachable = TRUE; } } } /* There must be at least one path between dag->start and dag->end */ if (!dag->start->reachable) { E_ERROR("End node of lattice isolated; unreachable\n"); goto error_out; } for (node = dag->nodes; node; node = node->next) { /* Change node->{fef,lef} from bptbl indices to frames. */ node->fef = ngs->bp_table[node->fef].frame; node->lef = ngs->bp_table[node->lef].frame; /* Find base wid for nodes. */ node->basewid = dict_basewid(search->dict, node->wid); } /* Link nodes with alternate pronunciations at the same timepoint. */ for (node = dag->nodes; node; node = node->next) { ps_latnode_t *alt; /* Scan forward to find the next alternate, then stop. */ for (alt = node->next; alt && alt->sf == node->sf; alt = alt->next) { if (alt->basewid == node->basewid) { alt->alt = node->alt; node->alt = alt; break; } } } E_INFO("Lattice has %d nodes, %d links\n", dag->n_nodes, nlink); /* Minor hack: If the final node is a filler word and not , * then set its base word ID to , so that the language model * scores won't be screwed up. */ if (dict_filler_word(ps_search_dict(ngs), dag->end->wid)) dag->end->basewid = ps_search_finish_wid(ngs); /* Free nodes unreachable from dag->end and their links */ ps_lattice_delete_unreachable(dag); /* Add silprob and fillprob to corresponding links */ ps_lattice_penalize_fillers(dag, ngs->silpen, ngs->fillpen); search->dag = dag; return dag; error_out: ps_lattice_free(dag); return NULL; } void ngram_search_set_lm(ngram_model_t *lm) { default_lm = ngram_model_retain(lm); } pocketsphinx-5prealpha/src/libpocketsphinx/ms_senone.c0000664000175000017500000003344212771605033020540 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* System headers. */ #include #include #include /* SphinxBase headers. */ #include /* Local headers. */ #include "ms_senone.h" #define MIXW_PARAM_VERSION "1.0" #define SPDEF_PARAM_VERSION "1.2" static int32 senone_mgau_map_read(senone_t * s, char const *file_name) { FILE *fp; int32 byteswap, chksum_present, n_gauden_present; uint32 chksum; int32 i; char eofchk; char **argname, **argval; void *ptr; float32 v; E_INFO("Reading senone gauden-codebook map file: %s\n", file_name); if ((fp = fopen(file_name, "rb")) == NULL) E_FATAL_SYSTEM("Failed to open map file '%s' for reading", file_name); /* Read header, including argument-value info and 32-bit byteorder magic */ if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) E_FATAL("Failed to read header from file '%s'\n", file_name); /* Parse argument-value list */ chksum_present = 0; n_gauden_present = 0; for (i = 0; argname[i]; i++) { if (strcmp(argname[i], "version") == 0) { if (strcmp(argval[i], SPDEF_PARAM_VERSION) != 0) { E_WARN("Version mismatch(%s): %s, expecting %s\n", file_name, argval[i], SPDEF_PARAM_VERSION); } /* HACK!! Convert version# to float32 and take appropriate action */ if (sscanf(argval[i], "%f", &v) != 1) E_FATAL("%s: Bad version no. string: %s\n", file_name, argval[i]); n_gauden_present = (v > 1.1) ? 1 : 0; } else if (strcmp(argname[i], "chksum0") == 0) { chksum_present = 1; /* Ignore the associated value */ } } bio_hdrarg_free(argname, argval); argname = argval = NULL; chksum = 0; /* Read #gauden (if version matches) */ if (n_gauden_present) { E_INFO("Reading number of codebooks from %s\n", file_name); if (bio_fread (&(s->n_gauden), sizeof(int32), 1, fp, byteswap, &chksum) != 1) E_FATAL("fread(%s) (#gauden) failed\n", file_name); } /* Read 1d array data */ if (bio_fread_1d(&ptr, sizeof(uint32), &(s->n_sen), fp, byteswap, &chksum) < 0) { E_FATAL("bio_fread_1d(%s) failed\n", file_name); } s->mgau = ptr; E_INFO("Mapping %d senones to %d codebooks\n", s->n_sen, s->n_gauden); /* Infer n_gauden if not present in this version */ if (!n_gauden_present) { s->n_gauden = 1; for (i = 0; i < s->n_sen; i++) if (s->mgau[i] >= s->n_gauden) s->n_gauden = s->mgau[i] + 1; } if (chksum_present) bio_verify_chksum(fp, byteswap, chksum); if (fread(&eofchk, 1, 1, fp) == 1) E_FATAL("More data than expected in %s: %d\n", file_name, eofchk); fclose(fp); E_INFO("Read %d->%d senone-codebook mappings\n", s->n_sen, s->n_gauden); return 1; } static int32 senone_mixw_read(senone_t * s, char const *file_name, logmath_t *lmath) { char eofchk; FILE *fp; int32 byteswap, chksum_present; uint32 chksum; float32 *pdf; int32 i, f, c, p, n_err; char **argname, **argval; E_INFO("Reading senone mixture weights: %s\n", file_name); if ((fp = fopen(file_name, "rb")) == NULL) E_FATAL_SYSTEM("Failed to open mixture weights file '%s' for reading", file_name); /* Read header, including argument-value info and 32-bit byteorder magic */ if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) E_FATAL("Failed to read header from file '%s'\n", file_name); /* Parse argument-value list */ chksum_present = 0; for (i = 0; argname[i]; i++) { if (strcmp(argname[i], "version") == 0) { if (strcmp(argval[i], MIXW_PARAM_VERSION) != 0) E_WARN("Version mismatch(%s): %s, expecting %s\n", file_name, argval[i], MIXW_PARAM_VERSION); } else if (strcmp(argname[i], "chksum0") == 0) { chksum_present = 1; /* Ignore the associated value */ } } bio_hdrarg_free(argname, argval); argname = argval = NULL; chksum = 0; /* Read #senones, #features, #codewords, arraysize */ if ((bio_fread(&(s->n_sen), sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&(s->n_feat), sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&(s->n_cw), sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&i, sizeof(int32), 1, fp, byteswap, &chksum) != 1)) { E_FATAL("bio_fread(%s) (arraysize) failed\n", file_name); } if (i != s->n_sen * s->n_feat * s->n_cw) { E_FATAL ("%s: #float32s(%d) doesn't match dimensions: %d x %d x %d\n", file_name, i, s->n_sen, s->n_feat, s->n_cw); } /* * Compute #LSB bits to be dropped to represent mixwfloor with 8 bits. * All PDF values will be truncated (in the LSB positions) by these many bits. */ if ((s->mixwfloor <= 0.0) || (s->mixwfloor >= 1.0)) E_FATAL("mixwfloor (%e) not in range (0, 1)\n", s->mixwfloor); /* Use a fixed shift for compatibility with everything else. */ E_INFO("Truncating senone logs3(pdf) values by %d bits\n", SENSCR_SHIFT); /* * Allocate memory for senone PDF data. Organize normally or transposed depending on * s->n_gauden. */ if (s->n_gauden > 1) { E_INFO("Not transposing mixture weights in memory\n"); s->pdf = (senprob_t ***) ckd_calloc_3d(s->n_sen, s->n_feat, s->n_cw, sizeof(senprob_t)); } else { E_INFO("Transposing mixture weights in memory\n"); s->pdf = (senprob_t ***) ckd_calloc_3d(s->n_feat, s->n_cw, s->n_sen, sizeof(senprob_t)); } /* Temporary structure to read in floats */ pdf = (float32 *) ckd_calloc(s->n_cw, sizeof(float32)); /* Read senone probs data, normalize, floor, convert to logs3, truncate to 8 bits */ n_err = 0; for (i = 0; i < s->n_sen; i++) { for (f = 0; f < s->n_feat; f++) { if (bio_fread ((void *) pdf, sizeof(float32), s->n_cw, fp, byteswap, &chksum) != s->n_cw) { E_FATAL("bio_fread(%s) (arraydata) failed\n", file_name); } /* Normalize and floor */ if (vector_sum_norm(pdf, s->n_cw) <= 0.0) n_err++; vector_floor(pdf, s->n_cw, s->mixwfloor); vector_sum_norm(pdf, s->n_cw); /* Convert to logs3, truncate to 8 bits, and store in s->pdf */ for (c = 0; c < s->n_cw; c++) { p = -(logmath_log(lmath, pdf[c])); p += (1 << (SENSCR_SHIFT - 1)) - 1; /* Rounding before truncation */ if (s->n_gauden > 1) s->pdf[i][f][c] = (p < (255 << SENSCR_SHIFT)) ? (p >> SENSCR_SHIFT) : 255; else s->pdf[f][c][i] = (p < (255 << SENSCR_SHIFT)) ? (p >> SENSCR_SHIFT) : 255; } } } if (n_err > 0) E_WARN("Weight normalization failed for %d mixture weights components\n", n_err); ckd_free(pdf); if (chksum_present) bio_verify_chksum(fp, byteswap, chksum); if (fread(&eofchk, 1, 1, fp) == 1) E_FATAL("More data than expected in %s\n", file_name); fclose(fp); E_INFO ("Read mixture weights for %d senones: %d features x %d codewords\n", s->n_sen, s->n_feat, s->n_cw); return 1; } senone_t * senone_init(gauden_t *g, char const *mixwfile, char const *sen2mgau_map_file, float32 mixwfloor, logmath_t *lmath, bin_mdef_t *mdef) { senone_t *s; int32 n = 0, i; s = (senone_t *) ckd_calloc(1, sizeof(senone_t)); s->lmath = logmath_init(logmath_get_base(lmath), SENSCR_SHIFT, TRUE); s->mixwfloor = mixwfloor; s->n_gauden = g->n_mgau; if (sen2mgau_map_file) { if (!(strcmp(sen2mgau_map_file, ".semi.") == 0 || strcmp(sen2mgau_map_file, ".ptm.") == 0 || strcmp(sen2mgau_map_file, ".cont.") == 0)) { senone_mgau_map_read(s, sen2mgau_map_file); n = s->n_sen; } } else { if (s->n_gauden == 1) sen2mgau_map_file = ".semi."; else if (s->n_gauden == bin_mdef_n_ciphone(mdef)) sen2mgau_map_file = ".ptm."; else sen2mgau_map_file = ".cont."; } senone_mixw_read(s, mixwfile, lmath); if (strcmp(sen2mgau_map_file, ".semi.") == 0) { /* All-to-1 senones-codebook mapping */ E_INFO("Mapping all senones to one codebook\n"); s->mgau = (uint32 *) ckd_calloc(s->n_sen, sizeof(*s->mgau)); } else if (strcmp(sen2mgau_map_file, ".ptm.") == 0) { /* All-to-ciphone-id senones-codebook mapping */ E_INFO("Mapping senones to context-independent phone codebooks\n"); s->mgau = (uint32 *) ckd_calloc(s->n_sen, sizeof(*s->mgau)); for (i = 0; i < s->n_sen; i++) s->mgau[i] = bin_mdef_sen2cimap(mdef, i); } else if (strcmp(sen2mgau_map_file, ".cont.") == 0 || strcmp(sen2mgau_map_file, ".s3cont.") == 0) { /* 1-to-1 senone-codebook mapping */ E_INFO("Mapping senones to individual codebooks\n"); if (s->n_sen <= 1) E_FATAL("#senone=%d; must be >1\n", s->n_sen); s->mgau = (uint32 *) ckd_calloc(s->n_sen, sizeof(*s->mgau)); for (i = 0; i < s->n_sen; i++) s->mgau[i] = i; /* Not sure why this is here, it probably does nothing. */ s->n_gauden = s->n_sen; } else { if (s->n_sen != n) E_FATAL("#senones inconsistent: %d in %s; %d in %s\n", n, sen2mgau_map_file, s->n_sen, mixwfile); } s->featscr = NULL; return s; } void senone_free(senone_t * s) { if (s == NULL) return; if (s->pdf) ckd_free_3d((void *) s->pdf); if (s->mgau) ckd_free(s->mgau); if (s->featscr) ckd_free(s->featscr); logmath_free(s->lmath); ckd_free(s); } /* * Compute senone score for one senone. * NOTE: Remember that senone PDF tables contain SCALED, NEGATED logs3 values. * NOTE: Remember also that PDF data may be transposed or not depending on s->n_gauden. */ int32 senone_eval(senone_t * s, int id, gauden_dist_t ** dist, int32 n_top) { int32 scr; /* total senone score */ int32 fden; /* Gaussian density */ int32 fscr; /* senone score for one feature */ int32 fwscr; /* senone score for one feature, one codeword */ int32 f, t; gauden_dist_t *fdist; assert((id >= 0) && (id < s->n_sen)); assert((n_top > 0) && (n_top <= s->n_cw)); scr = 0; for (f = 0; f < s->n_feat; f++) { #ifdef SPHINX_DEBUG int top; #endif fdist = dist[f]; /* Top codeword for feature f */ #ifdef SPHINX_DEBUG top = #endif fden = ((int32)fdist[0].dist + ((1<> SENSCR_SHIFT; fscr = (s->n_gauden > 1) ? (fden + -s->pdf[id][f][fdist[0].id]) /* untransposed */ : (fden + -s->pdf[f][fdist[0].id][id]); /* transposed */ E_DEBUG(1, ("fden[%d][%d] l+= %d + %d = %d\n", id, f, -(fscr - fden), -(fden-top), -(fscr-top))); /* Remaining of n_top codewords for feature f */ for (t = 1; t < n_top; t++) { fden = ((int32)fdist[t].dist + ((1<> SENSCR_SHIFT; fwscr = (s->n_gauden > 1) ? (fden + -s->pdf[id][f][fdist[t].id]) : (fden + -s->pdf[f][fdist[t].id][id]); fscr = logmath_add(s->lmath, fscr, fwscr); E_DEBUG(1, ("fden[%d][%d] l+= %d + %d = %d\n", id, f, -(fwscr - fden), -(fden-top), -(fscr-top))); } /* Senone scores are also scaled, negated logs3 values. Hence * we have to negate the stuff we calculated above. */ scr -= fscr; } /* Downscale scores. */ scr /= s->aw; /* Avoid overflowing int16 */ if (scr > 32767) scr = 32767; if (scr < -32768) scr = -32768; return scr; } pocketsphinx-5prealpha/src/libpocketsphinx/s3types.h0000664000175000017500000000664512771605033020176 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ #ifndef _S3_S3TYPES_H_ #define _S3_S3TYPES_H_ #include #include #include #include #include /** \file s3types.h * \brief Size definition of semantically units. Common for both s3 and s3.X decoder. */ #ifdef __cplusplus extern "C" { #endif /** * Size definitions for more semantially meaningful units. * Illegal value definitions, limits, and tests for specific types. * NOTE: Types will be either int32 or smaller; only smaller ones may be unsigned (i.e., * no type will be uint32). */ typedef int16 s3cipid_t; /** Ci phone id */ #define BAD_S3CIPID ((s3cipid_t) -1) #define NOT_S3CIPID(p) ((p)<0) #define IS_S3CIPID(p) ((p)>=0) #define MAX_S3CIPID 32767 /*#define MAX_S3CIPID 127*/ typedef int32 s3pid_t; /** Phone id (triphone or ciphone) */ #define BAD_S3PID ((s3pid_t) -1) #define NOT_S3PID(p) ((p)<0) #define IS_S3PID(p) ((p)>=0) #define MAX_S3PID ((int32)0x7ffffffe) typedef uint16 s3ssid_t; /** Senone sequence id (triphone or ciphone) */ #define BAD_S3SSID ((s3ssid_t) 0xffff) #define NOT_S3SSID(p) ((p) == BAD_S3SSID) #define IS_S3SSID(p) ((p) != BAD_S3SSID) #define MAX_S3SSID ((s3ssid_t)0xfffe) typedef int32 s3tmatid_t; /** Transition matrix id; there can be as many as pids */ #define BAD_S3TMATID ((s3tmatid_t) -1) #define NOT_S3TMATID(t) ((t)<0) #define IS_S3TMATID(t) ((t)>=0) #define MAX_S3TMATID ((int32)0x7ffffffe) typedef int32 s3wid_t; /** Dictionary word id */ #define BAD_S3WID ((s3wid_t) -1) #define NOT_S3WID(w) ((w)<0) #define IS_S3WID(w) ((w)>=0) #define MAX_S3WID ((int32)0x7ffffffe) #ifdef __cplusplus } #endif #endif pocketsphinx-5prealpha/src/libpocketsphinx/fsg_lextree.c0000664000175000017500000007420412771605033021062 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2010 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file fsg_lextree.c * @brief The collection of all the lextrees for the entire FSM. * @author M K Ravishankar * @author Bhiksha Raj */ /* System headers. */ #include #include #include /* SphinxBase headers. */ #include #include /* Local headers. */ #include "fsg_lextree.h" #define __FSG_DBG__ 0 /* A linklist structure that is actually used to build local lextrees at grammar nodes */ typedef struct fsg_glist_linklist_t { int32 ci, rc; glist_t glist; struct fsg_glist_linklist_t *next; } fsg_glist_linklist_t; /** * Build the phone lextree for all transitions out of state from_state. * Return the root node of this tree. * Also, return a linear linked list of all allocated fsg_pnode_t nodes in * *alloc_head (for memory management purposes). */ static fsg_pnode_t *fsg_psubtree_init(fsg_lextree_t *tree, fsg_model_t *fsg, int32 from_state, fsg_pnode_t **alloc_head); /** * Free the given lextree. alloc_head: head of linear list of allocated * nodes updated by fsg_psubtree_init(). */ static void fsg_psubtree_free(fsg_pnode_t *alloc_head); /** * Dump the list of nodes in the given lextree to the given file. alloc_head: * head of linear list of allocated nodes updated by fsg_psubtree_init(). */ static void fsg_psubtree_dump(fsg_lextree_t *tree, fsg_pnode_t *root, FILE *fp); /** * Compute the left and right context CIphone sets for each state. */ static void fsg_lextree_lc_rc(fsg_lextree_t *lextree) { int32 s, i, j; int32 n_ci; fsg_model_t *fsg; int32 silcipid; int32 len; silcipid = bin_mdef_silphone(lextree->mdef); assert(silcipid >= 0); n_ci = bin_mdef_n_ciphone(lextree->mdef); fsg = lextree->fsg; /* * lextree->lc[s] = set of left context CIphones for state s. Similarly, rc[s] * for right context CIphones. */ lextree->lc = ckd_calloc_2d(fsg->n_state, n_ci + 1, sizeof(**lextree->lc)); lextree->rc = ckd_calloc_2d(fsg->n_state, n_ci + 1, sizeof(**lextree->rc)); E_INFO("Allocated %d bytes (%d KiB) for left and right context phones\n", fsg->n_state * (n_ci + 1) * 2, fsg->n_state * (n_ci + 1) * 2 / 1024); for (s = 0; s < fsg->n_state; s++) { fsg_arciter_t *itor; for (itor = fsg_model_arcs(fsg, s); itor; itor = fsg_arciter_next(itor)) { fsg_link_t *l = fsg_arciter_get(itor); int32 dictwid; /**< Dictionary (not FSG) word ID!! */ if (fsg_link_wid(l) >= 0) { dictwid = dict_wordid(lextree->dict, fsg_model_word_str(lextree->fsg, l->wid)); /* * Add the first CIphone of l->wid to the rclist of state s, and * the last CIphone to lclist of state d. * (Filler phones are a pain to deal with. There is no direct * marking of a filler phone; but only filler words are supposed to * use such phones, so we use that fact. HACK!! FRAGILE!!) * * UPD: tests carsh here if .fsg model used with wrong hmm and * dictionary */ if (fsg_model_is_filler(fsg, fsg_link_wid(l))) { /* Filler phone; use silence phone as context */ lextree->rc[fsg_link_from_state(l)][silcipid] = 1; lextree->lc[fsg_link_to_state(l)][silcipid] = 1; } else { len = dict_pronlen(lextree->dict, dictwid); lextree->rc[fsg_link_from_state(l)][dict_pron(lextree->dict, dictwid, 0)] = 1; lextree->lc[fsg_link_to_state(l)][dict_pron(lextree->dict, dictwid, len - 1)] = 1; } } } } for (s = 0; s < fsg->n_state; s++) { /* * Add SIL phone to the lclist and rclist of each state. Strictly * speaking, only needed at start and final states, respectively, but * all states considered since the user may change the start and final * states. In any case, most applications would have a silence self * loop at each state, hence these would be needed anyway. */ lextree->lc[s][silcipid] = 1; lextree->rc[s][silcipid] = 1; } /* * Propagate lc and rc lists past null transitions. (Since FSG contains * null transitions closure, no need to worry about a chain of successive * null transitions. Right??) * * This can't be joined with the previous loop because we first calculate * contexts and only then we can propagate them. */ for (s = 0; s < fsg->n_state; s++) { fsg_arciter_t *itor; for (itor = fsg_model_arcs(fsg, s); itor; itor = fsg_arciter_next(itor)) { fsg_link_t *l = fsg_arciter_get(itor); if (fsg_link_wid(l) < 0) { /* * lclist(d) |= lclist(s), because all the words ending up at s, can * now also end at d, becoming the left context for words leaving d. */ for (i = 0; i < n_ci; i++) lextree->lc[fsg_link_to_state(l)][i] |= lextree->lc[fsg_link_from_state(l)][i]; /* * Similarly, rclist(s) |= rclist(d), because all the words leaving d * can equivalently leave s, becoming the right context for words * ending up at s. */ for (i = 0; i < n_ci; i++) lextree->rc[fsg_link_from_state(l)][i] |= lextree->rc[fsg_link_to_state(l)][i]; } } } /* Convert the bit-vector representation into a list */ for (s = 0; s < fsg->n_state; s++) { j = 0; for (i = 0; i < n_ci; i++) { if (lextree->lc[s][i]) { lextree->lc[s][j] = i; j++; } } lextree->lc[s][j] = -1; /* Terminate the list */ j = 0; for (i = 0; i < n_ci; i++) { if (lextree->rc[s][i]) { lextree->rc[s][j] = i; j++; } } lextree->rc[s][j] = -1; /* Terminate the list */ } } /* * For now, allocate the entire lextree statically. */ fsg_lextree_t * fsg_lextree_init(fsg_model_t * fsg, dict_t *dict, dict2pid_t *d2p, bin_mdef_t *mdef, hmm_context_t *ctx, int32 wip, int32 pip) { int32 s, n_leaves; fsg_lextree_t *lextree; fsg_pnode_t *pn; lextree = ckd_calloc(1, sizeof(fsg_lextree_t)); lextree->fsg = fsg; lextree->root = ckd_calloc(fsg_model_n_state(fsg), sizeof(fsg_pnode_t *)); lextree->alloc_head = ckd_calloc(fsg_model_n_state(fsg), sizeof(fsg_pnode_t *)); lextree->ctx = ctx; lextree->dict = dict; lextree->d2p = d2p; lextree->mdef = mdef; lextree->wip = wip; lextree->pip = pip; /* Compute lc and rc for fsg. */ fsg_lextree_lc_rc(lextree); /* Create lextree for each state, i.e. an HMM network that * represents words for all arcs exiting that state. Note that * for a dense grammar such as an N-gram model, this will * rapidly exhaust all available memory. */ lextree->n_pnode = 0; n_leaves = 0; for (s = 0; s < fsg_model_n_state(fsg); s++) { lextree->root[s] = fsg_psubtree_init(lextree, fsg, s, &(lextree->alloc_head[s])); for (pn = lextree->alloc_head[s]; pn; pn = pn->alloc_next) { lextree->n_pnode++; if (pn->leaf) ++n_leaves; } } E_INFO("%d HMM nodes in lextree (%d leaves)\n", lextree->n_pnode, n_leaves); E_INFO("Allocated %d bytes (%d KiB) for all lextree nodes\n", lextree->n_pnode * sizeof(fsg_pnode_t), lextree->n_pnode * sizeof(fsg_pnode_t) / 1024); E_INFO("Allocated %d bytes (%d KiB) for lextree leafnodes\n", n_leaves * sizeof(fsg_pnode_t), n_leaves * sizeof(fsg_pnode_t) / 1024); #if __FSG_DBG__ fsg_lextree_dump(lextree, stdout); #endif return lextree; } void fsg_lextree_dump(fsg_lextree_t * lextree, FILE * fp) { int32 s; for (s = 0; s < fsg_model_n_state(lextree->fsg); s++) { fprintf(fp, "State %5d root %p\n", s, lextree->root[s]); fsg_psubtree_dump(lextree, lextree->root[s], fp); } fflush(fp); } void fsg_lextree_free(fsg_lextree_t * lextree) { int32 s; if (lextree == NULL) return; if (lextree->fsg) for (s = 0; s < fsg_model_n_state(lextree->fsg); s++) fsg_psubtree_free(lextree->alloc_head[s]); ckd_free_2d(lextree->lc); ckd_free_2d(lextree->rc); ckd_free(lextree->root); ckd_free(lextree->alloc_head); ckd_free(lextree); } /****************************** * psubtree stuff starts here * ******************************/ void fsg_glist_linklist_free(fsg_glist_linklist_t *glist) { if (glist) { fsg_glist_linklist_t *nxtglist; if (glist->glist) glist_free(glist->glist); nxtglist = glist->next; while (nxtglist) { ckd_free(glist); glist = nxtglist; if (glist->glist) glist_free(glist->glist); nxtglist = glist->next; } ckd_free(glist); } return; } void fsg_pnode_add_all_ctxt(fsg_pnode_ctxt_t * ctxt) { int32 i; for (i = 0; i < FSG_PNODE_CTXT_BVSZ; i++) ctxt->bv[i] = 0xffffffff; } uint32 fsg_pnode_ctxt_sub_generic(fsg_pnode_ctxt_t *src, fsg_pnode_ctxt_t *sub) { int32 i; uint32 res = 0; for (i = 0; i < FSG_PNODE_CTXT_BVSZ; i++) res |= (src->bv[i] = ~(sub->bv[i]) & src->bv[i]); return res; } /* * fsg_pnode_ctxt_sub(fsg_pnode_ctxt_t * src, fsg_pnode_ctxt_t * sub) * This has been moved into a macro in fsg_psubtree.h * because it is called so frequently! */ /* * Add the word emitted by the given transition (fsglink) to the given lextree * (rooted at root), and return the new lextree root. (There may actually be * several root nodes, maintained in a linked list via fsg_pnode_t.sibling. * "root" is the head of this list.) * lclist, rclist: sets of left and right context phones for this link. * alloc_head: head of a linear list of all allocated pnodes for the parent * FSG state, kept elsewhere and updated by this routine. */ static fsg_pnode_t * psubtree_add_trans(fsg_lextree_t *lextree, fsg_pnode_t * root, fsg_glist_linklist_t **curglist, fsg_link_t * fsglink, int16 *lclist, int16 *rclist, fsg_pnode_t ** alloc_head) { int32 silcipid; /* Silence CI phone ID */ int32 pronlen; /* Pronunciation length */ int32 wid; /* FSG (not dictionary!!) word ID */ int32 dictwid; /* Dictionary (not FSG!!) word ID */ int32 ssid; /* Senone Sequence ID */ int32 tmatid; gnode_t *gn; fsg_pnode_t *pnode, *pred, *head; int32 n_ci, p, lc, rc; glist_t lc_pnodelist; /* Temp pnodes list for different left contexts */ glist_t rc_pnodelist; /* Temp pnodes list for different right contexts */ int32 i, j; int n_lc_alloc = 0, n_int_alloc = 0, n_rc_alloc = 0; silcipid = bin_mdef_silphone(lextree->mdef); n_ci = bin_mdef_n_ciphone(lextree->mdef); wid = fsg_link_wid(fsglink); assert(wid >= 0); /* Cannot be a null transition */ dictwid = dict_wordid(lextree->dict, fsg_model_word_str(lextree->fsg, wid)); pronlen = dict_pronlen(lextree->dict, dictwid); assert(pronlen >= 1); assert(lclist[0] >= 0); /* At least one phonetic context provided */ assert(rclist[0] >= 0); head = *alloc_head; pred = NULL; if (pronlen == 1) { /* Single-phone word */ int ci = dict_first_phone(lextree->dict, dictwid); /* Only non-filler words are mpx */ if (!dict_filler_word(lextree->dict, dictwid)) { /* * Left diphone ID for single-phone words already assumes SIL is right * context; only left contexts need to be handled. */ lc_pnodelist = NULL; for (i = 0; lclist[i] >= 0; i++) { lc = lclist[i]; ssid = dict2pid_lrdiph_rc(lextree->d2p, ci, lc, silcipid); tmatid = bin_mdef_pid2tmatid(lextree->mdef, dict_first_phone(lextree->dict, dictwid)); /* Check if this ssid already allocated for some other context */ for (gn = lc_pnodelist; gn; gn = gnode_next(gn)) { pnode = (fsg_pnode_t *) gnode_ptr(gn); if (hmm_nonmpx_ssid(&pnode->hmm) == ssid) { /* already allocated; share it for this context phone */ fsg_pnode_add_ctxt(pnode, lc); break; } } if (!gn) { /* ssid not already allocated */ pnode = (fsg_pnode_t *) ckd_calloc(1, sizeof(fsg_pnode_t)); pnode->ctx = lextree->ctx; pnode->next.fsglink = fsglink; pnode->logs2prob = (fsg_link_logs2prob(fsglink) >> SENSCR_SHIFT) + lextree->wip + lextree->pip; pnode->ci_ext = dict_first_phone(lextree->dict, dictwid); pnode->ppos = 0; pnode->leaf = TRUE; pnode->sibling = root; /* All root nodes linked together */ fsg_pnode_add_ctxt(pnode, lc); /* Initially zeroed by calloc above */ pnode->alloc_next = head; head = pnode; root = pnode; ++n_lc_alloc; hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); lc_pnodelist = glist_add_ptr(lc_pnodelist, (void *) pnode); } } glist_free(lc_pnodelist); } else { /* Filler word; no context modelled */ ssid = bin_mdef_pid2ssid(lextree->mdef, ci); /* probably the same... */ tmatid = bin_mdef_pid2tmatid(lextree->mdef, ci); pnode = (fsg_pnode_t *) ckd_calloc(1, sizeof(fsg_pnode_t)); pnode->ctx = lextree->ctx; pnode->next.fsglink = fsglink; pnode->logs2prob = (fsg_link_logs2prob(fsglink) >> SENSCR_SHIFT) + lextree->wip + lextree->pip; pnode->ci_ext = silcipid; /* Presents SIL as context to neighbors */ pnode->ppos = 0; pnode->leaf = TRUE; pnode->sibling = root; fsg_pnode_add_all_ctxt(&(pnode->ctxt)); pnode->alloc_next = head; head = pnode; root = pnode; ++n_int_alloc; hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); } } else { /* Multi-phone word */ fsg_pnode_t **ssid_pnode_map; /* Temp array of ssid->pnode mapping */ ssid_pnode_map = (fsg_pnode_t **) ckd_calloc(n_ci, sizeof(fsg_pnode_t *)); lc_pnodelist = NULL; rc_pnodelist = NULL; for (p = 0; p < pronlen; p++) { int ci = dict_pron(lextree->dict, dictwid, p); if (p == 0) { /* Root phone, handle required left contexts */ /* Find if we already have an lc_pnodelist for the first phone of this word */ fsg_glist_linklist_t *glist; rc = dict_pron(lextree->dict, dictwid, 1); for (glist = *curglist; glist && glist->glist; glist = glist->next) { if (glist->ci == ci && glist->rc == rc) break; } if (glist && glist->glist) { assert(glist->ci == ci && glist->rc == rc); /* We've found a valid glist. Hook to it and move to next phoneme */ E_DEBUG(2,("Found match for (%d,%d)\n", ci, rc)); lc_pnodelist = glist->glist; /* Set the predecessor node for the future tree first */ pred = (fsg_pnode_t *) gnode_ptr(lc_pnodelist); continue; } else { /* Two cases that can bring us here * a. glist == NULL, i.e. end of current list. Create new entry. * b. glist->glist == NULL, i.e. first entry into list. */ if (glist == NULL) { /* Case a; reduce it to case b by allocing glist */ glist = (fsg_glist_linklist_t*) ckd_calloc(1, sizeof(fsg_glist_linklist_t)); glist->next = *curglist; *curglist = glist; } glist->ci = ci; glist->rc = rc; lc_pnodelist = glist->glist = NULL; /* Gets created below */ } for (i = 0; lclist[i] >= 0; i++) { lc = lclist[i]; ssid = dict2pid_ldiph_lc(lextree->d2p, ci, rc, lc); tmatid = bin_mdef_pid2tmatid(lextree->mdef, dict_first_phone(lextree->dict, dictwid)); /* Compression is not done by d2p, so we do it * here. This might be slow, but it might not * be... we'll see. */ pnode = ssid_pnode_map[0]; for (j = 0; j < n_ci && ssid_pnode_map[j] != NULL; ++j) { pnode = ssid_pnode_map[j]; if (hmm_nonmpx_ssid(&pnode->hmm) == ssid) break; } assert(j < n_ci); if (!pnode) { /* Allocate pnode for this new ssid */ pnode = (fsg_pnode_t *) ckd_calloc(1, sizeof (fsg_pnode_t)); pnode->ctx = lextree->ctx; /* This bit is tricky! For now we'll put the prob in the final link only */ /* pnode->logs2prob = (fsg_link_logs2prob(fsglink) >> SENSCR_SHIFT) + lextree->wip + lextree->pip; */ pnode->logs2prob = lextree->wip + lextree->pip; pnode->ci_ext = dict_first_phone(lextree->dict, dictwid); pnode->ppos = 0; pnode->leaf = FALSE; pnode->sibling = root; /* All root nodes linked together */ pnode->alloc_next = head; head = pnode; root = pnode; ++n_lc_alloc; hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); lc_pnodelist = glist_add_ptr(lc_pnodelist, (void *) pnode); ssid_pnode_map[j] = pnode; } fsg_pnode_add_ctxt(pnode, lc); } /* Put the lc_pnodelist back into glist */ glist->glist = lc_pnodelist; /* The predecessor node for the future tree is the root */ pred = root; } else if (p != pronlen - 1) { /* Word internal phone */ fsg_pnode_t *pnodeyoungest; ssid = dict2pid_internal(lextree->d2p, dictwid, p); tmatid = bin_mdef_pid2tmatid(lextree->mdef, dict_pron (lextree->dict, dictwid, p)); /* First check if we already have this ssid in our tree */ pnode = pred->next.succ; pnodeyoungest = pnode; /* The youngest sibling */ while (pnode && (hmm_nonmpx_ssid(&pnode->hmm) != ssid || pnode->leaf)) { pnode = pnode->sibling; } if (pnode && (hmm_nonmpx_ssid(&pnode->hmm) == ssid && !pnode->leaf)) { /* Found the ssid; go to next phoneme */ E_DEBUG(2,("Found match for %d\n", ci)); pred = pnode; continue; } /* pnode not found, allocate it */ pnode = (fsg_pnode_t *) ckd_calloc(1, sizeof(fsg_pnode_t)); pnode->ctx = lextree->ctx; pnode->logs2prob = lextree->pip; pnode->ci_ext = dict_pron(lextree->dict, dictwid, p); pnode->ppos = p; pnode->leaf = FALSE; pnode->sibling = pnodeyoungest; /* May be NULL */ if (p == 1) { /* Predecessor = set of root nodes for left ctxts */ for (gn = lc_pnodelist; gn; gn = gnode_next(gn)) { pred = (fsg_pnode_t *) gnode_ptr(gn); pred->next.succ = pnode; } } else { /* Predecessor = word internal node */ pred->next.succ = pnode; } pnode->alloc_next = head; head = pnode; ++n_int_alloc; hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); pred = pnode; } else { /* Leaf phone, handle required right contexts */ /* Note, leaf phones are not part of the tree */ xwdssid_t *rssid; memset((void *) ssid_pnode_map, 0, n_ci * sizeof(fsg_pnode_t *)); lc = dict_pron(lextree->dict, dictwid, p-1); rssid = dict2pid_rssid(lextree->d2p, ci, lc); tmatid = bin_mdef_pid2tmatid(lextree->mdef, dict_pron (lextree->dict, dictwid, p)); for (i = 0; rclist[i] >= 0; i++) { rc = rclist[i]; j = rssid->cimap[rc]; ssid = rssid->ssid[j]; pnode = ssid_pnode_map[j]; if (!pnode) { /* Allocate pnode for this new ssid */ pnode = (fsg_pnode_t *) ckd_calloc(1, sizeof (fsg_pnode_t)); pnode->ctx = lextree->ctx; /* We are plugging the word prob here. Ugly */ /* pnode->logs2prob = lextree->pip; */ pnode->logs2prob = (fsg_link_logs2prob(fsglink) >> SENSCR_SHIFT) + lextree->pip; pnode->ci_ext = dict_pron(lextree->dict, dictwid, p); pnode->ppos = p; pnode->leaf = TRUE; pnode->sibling = rc_pnodelist ? (fsg_pnode_t *) gnode_ptr(rc_pnodelist) : NULL; pnode->next.fsglink = fsglink; pnode->alloc_next = head; head = pnode; ++n_rc_alloc; hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); rc_pnodelist = glist_add_ptr(rc_pnodelist, (void *) pnode); ssid_pnode_map[j] = pnode; } else { assert(hmm_nonmpx_ssid(&pnode->hmm) == ssid); } fsg_pnode_add_ctxt(pnode, rc); } if (p == 1) { /* Predecessor = set of root nodes for left ctxts */ for (gn = lc_pnodelist; gn; gn = gnode_next(gn)) { pred = (fsg_pnode_t *) gnode_ptr(gn); if (!pred->next.succ) pred->next.succ = (fsg_pnode_t *) gnode_ptr(rc_pnodelist); else { /* Link to the end of the sibling chain */ fsg_pnode_t *succ = pred->next.succ; while (succ->sibling) succ = succ->sibling; succ->sibling = (fsg_pnode_t*) gnode_ptr(rc_pnodelist); /* Since all entries of lc_pnodelist point to the same array, sufficient to update it once */ break; } } } else { /* Predecessor = word internal node */ if (!pred->next.succ) pred->next.succ = (fsg_pnode_t *) gnode_ptr(rc_pnodelist); else { /* Link to the end of the sibling chain */ fsg_pnode_t *succ = pred->next.succ; while (succ->sibling) succ = succ->sibling; succ->sibling = (fsg_pnode_t *) gnode_ptr(rc_pnodelist); } } } } ckd_free((void *) ssid_pnode_map); /* glist_free(lc_pnodelist); Nope; this gets freed outside */ glist_free(rc_pnodelist); } E_DEBUG(2,("Allocated %d HMMs (%d lc, %d rc, %d internal)\n", n_lc_alloc + n_rc_alloc + n_int_alloc, n_lc_alloc, n_rc_alloc, n_int_alloc)); *alloc_head = head; return root; } static fsg_pnode_t * fsg_psubtree_init(fsg_lextree_t *lextree, fsg_model_t * fsg, int32 from_state, fsg_pnode_t ** alloc_head) { fsg_arciter_t *itor; fsg_link_t *fsglink; fsg_pnode_t *root; int32 n_ci, n_arc; fsg_glist_linklist_t *glist = NULL; root = NULL; assert(*alloc_head == NULL); n_ci = bin_mdef_n_ciphone(lextree->mdef); if (n_ci > (FSG_PNODE_CTXT_BVSZ * 32)) { E_FATAL ("#phones > %d; increase FSG_PNODE_CTXT_BVSZ and recompile\n", FSG_PNODE_CTXT_BVSZ * 32); } n_arc = 0; for (itor = fsg_model_arcs(fsg, from_state); itor; itor = fsg_arciter_next(itor)) { int32 dst; fsglink = fsg_arciter_get(itor); dst = fsglink->to_state; if (fsg_link_wid(fsglink) < 0) continue; E_DEBUG(2,("Building lextree for arc from %d to %d: %s\n", from_state, dst, fsg_model_word_str(fsg, fsg_link_wid(fsglink)))); root = psubtree_add_trans(lextree, root, &glist, fsglink, lextree->lc[from_state], lextree->rc[dst], alloc_head); ++n_arc; } E_DEBUG(2,("State %d has %d outgoing arcs\n", from_state, n_arc)); fsg_glist_linklist_free(glist); return root; } static void fsg_psubtree_free(fsg_pnode_t * head) { fsg_pnode_t *next; while (head) { next = head->alloc_next; hmm_deinit(&head->hmm); ckd_free(head); head = next; } } void fsg_psubtree_dump_node(fsg_lextree_t *tree, fsg_pnode_t *node, FILE *fp) { int32 i; fsg_link_t *tl; /* Indentation */ for (i = 0; i <= node->ppos; i++) fprintf(fp, " "); fprintf(fp, "%p.@", node); /* Pointer used as node * ID */ fprintf(fp, " %5d.SS", hmm_nonmpx_ssid(&node->hmm)); fprintf(fp, " %10d.LP", node->logs2prob); fprintf(fp, " %p.SIB", node->sibling); fprintf(fp, " %s.%d", bin_mdef_ciphone_str(tree->mdef, node->ci_ext), node->ppos); if ((node->ppos == 0) || node->leaf) { fprintf(fp, " ["); for (i = 0; i < FSG_PNODE_CTXT_BVSZ; i++) fprintf(fp, "%08x", node->ctxt.bv[i]); fprintf(fp, "]"); } if (node->leaf) { tl = node->next.fsglink; fprintf(fp, " {%s[%d->%d](%d)}", fsg_model_word_str(tree->fsg, tl->wid), tl->from_state, tl->to_state, tl->logs2prob); } else { fprintf(fp, " %p.NXT", node->next.succ); } fprintf(fp, "\n"); return; } void fsg_psubtree_dump(fsg_lextree_t *tree, fsg_pnode_t *root, FILE * fp) { fsg_pnode_t *succ; if (root == NULL) return; if (root->ppos == 0) { while(root->sibling && root->sibling->next.succ == root->next.succ) { fsg_psubtree_dump_node(tree, root, fp); root = root->sibling; } fflush(fp); } fsg_psubtree_dump_node(tree, root, fp); if (root->leaf) { if (root->ppos == 0 && root->sibling) { /* For single-phone words */ fsg_psubtree_dump(tree, root->sibling,fp); } return; } succ = root->next.succ; while(succ) { fsg_psubtree_dump(tree, succ,fp); succ = succ->sibling; } if (root->ppos == 0) { fsg_psubtree_dump(tree, root->sibling,fp); fflush(fp); } return; } void fsg_psubtree_pnode_deactivate(fsg_pnode_t * pnode) { hmm_clear(&pnode->hmm); } pocketsphinx-5prealpha/src/libpocketsphinx/ngram_search_fwdflat.h0000664000175000017500000000525712771605033022722 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ngram_search_fwdflat.h Flat lexicon based Viterbi search. */ #ifndef __NGRAM_SEARCH_FWDFLAT_H__ #define __NGRAM_SEARCH_FWDFLAT_H__ /* SphinxBase headers. */ /* Local headers. */ #include "ngram_search.h" /** * Initialize N-Gram search for fwdflat decoding. */ void ngram_fwdflat_init(ngram_search_t *ngs); /** * Release memory associated with fwdflat decoding. */ void ngram_fwdflat_deinit(ngram_search_t *ngs); /** * Rebuild search structures for updated language models. */ int ngram_fwdflat_reinit(ngram_search_t *ngs); /** * Start fwdflat decoding for an utterance. */ void ngram_fwdflat_start(ngram_search_t *ngs); /** * Search one frame forward in an utterance. */ int ngram_fwdflat_search(ngram_search_t *ngs, int frame_idx); /** * Finish fwdflat decoding for an utterance. */ void ngram_fwdflat_finish(ngram_search_t *ngs); #endif /* __NGRAM_SEARCH_FWDFLAT_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/fsg_history.h0000664000175000017500000001771312771605033021122 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * fsg_history.h -- FSG Viterbi decode history * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1999 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** * * HISTORY * * $Log: fsg_history.h,v $ * Revision 1.1.1.1 2006/05/23 18:45:02 dhuggins * re-importation * * Revision 1.1 2004/07/16 00:57:12 egouvea * Added Ravi's implementation of FSG support. * * Revision 1.7 2004/07/07 22:30:35 rkm * *** empty log message *** * * Revision 1.6 2004/07/07 13:56:33 rkm * Added reporting of (acoustic score - best senone score)/frame * * Revision 1.5 2004/06/25 14:49:08 rkm * Optimized size of history table and speed of word transitions by maintaining only best scoring word exits at each state * * Revision 1.4 2004/06/23 20:32:16 rkm * *** empty log message *** * * Revision 1.3 2004/05/27 15:16:08 rkm * *** empty log message *** * * * 25-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * Started, based on S3.3 version. */ #ifndef __S2_FSG_HISTORY_H__ #define __S2_FSG_HISTORY_H__ /* SphinxBase headers. */ #include #include /* Local headers. */ #include "blkarray_list.h" #include "fsg_lextree.h" #include "dict.h" /* * The Viterbi history structure. This is a tree, with the root at the * FSG start state, at frame 0, with a null predecessor. */ /* * A single Viterbi history entry */ typedef struct fsg_hist_entry_s { fsg_link_t *fsglink; /* Link taken result in this entry */ int32 score; /* Total path score at the end of this transition */ int32 pred; /* Predecessor entry; -1 if none */ frame_idx_t frame; /* Ending frame for this entry */ int16 lc; /* Left context provided by this entry to succeeding words */ fsg_pnode_ctxt_t rc; /* Possible right contexts to which this entry applies */ } fsg_hist_entry_t; /* Access macros */ #define fsg_hist_entry_fsglink(v) ((v)->fsglink) #define fsg_hist_entry_frame(v) ((v)->frame) #define fsg_hist_entry_score(v) ((v)->score) #define fsg_hist_entry_pred(v) ((v)->pred) #define fsg_hist_entry_lc(v) ((v)->lc) #define fsg_hist_entry_rc(v) ((v)->rc) /* * The entire tree of history entries (fsg_history_t.entries). * Optimization: In a given frame, there may be several history entries, with * the same left and right phonetic context, terminating in a particular state. * Only the best scoring one of these needs to be saved, since everything else * will be pruned according to the Viterbi algorithm. frame_entries is used * temporarily in each frame to determine these best scoring entries in that * frame. Only the ones not pruned are transferred to entries at the end of * the frame. However, null transitions are a problem since they create * entries that depend on entries created in the CURRENT frame. Hence, this * pruning is done in two stages: first for the non-null transitions, and then * for the null transitions alone. (This solution is sub-optimal, and can be * improved with a little more work. SMOP.) * Why is frame_entries a list? Each entry has a unique terminating state, * and has a unique lc CIphone. But it has a SET of rc CIphones. * frame_entries[s][lc] is an ordered list of entries created in the current * frame, terminating in state s, and with left context lc. The list is in * descending order of path score. When a new entry with (s,lc) arrives, * its position in the list is determined. Then its rc set is modified by * subtracting the union of the rc's of all its predecessors (i.e., better * scoring entries). If the resulting rc set is empty, the entry is discarded. * Otherwise, it is inserted, and the rc sets of all downstream entries in the * list are updated by subtracting the new entry's rc. If any of them becomes * empty, it is also discarded. * As mentioned earlier, this procedure is applied in two stages, for the * non-null transitions, and the null transitions, separately. */ typedef struct fsg_history_s { fsg_model_t *fsg; /* The FSG for which this object applies */ blkarray_list_t *entries; /* A list of history table entries; the root entry is the first element of the list */ glist_t **frame_entries; int n_ciphone; } fsg_history_t; /* * One-time intialization: Allocate and return an initially empty history * module. */ fsg_history_t *fsg_history_init(fsg_model_t *fsg, dict_t *dict); void fsg_history_utt_start(fsg_history_t *h); void fsg_history_utt_end(fsg_history_t *h); /* * Create a history entry recording the completion of the given FSG * transition, at the end of the given frame, with the given score, and * the given predecessor history entry. * The entry is initially temporary, and may be superseded by another * with a higher score. The surviving entries must be transferred to * the main history table, via fsg_history_end_frame(). */ void fsg_history_entry_add (fsg_history_t *h, fsg_link_t *l, /* FSG transition */ int32 frame, int32 score, int32 pred, int32 lc, fsg_pnode_ctxt_t rc); /* * Transfer the surviving history entries for this frame into the permanent * history table. This function can be called several times during a frame. * Each time, the entries surviving so far are transferred, and the temporary * lists cleared. This feature is used to handle the entries due to non-null * transitions and null transitions separately. */ void fsg_history_end_frame (fsg_history_t *h); /* Clear the hitory table */ void fsg_history_reset (fsg_history_t *h); /* Return the number of valid entries in the given history table */ int32 fsg_history_n_entries (fsg_history_t *h); /* * Return a ptr to the history entry for the given ID; NULL if there is no * such entry. */ fsg_hist_entry_t *fsg_history_entry_get(fsg_history_t *h, int32 id); /* * Switch the FSG associated with the given history module. Should be done * when the history list is empty. If not empty, the list is cleared. */ void fsg_history_set_fsg (fsg_history_t *h, fsg_model_t *fsg, dict_t *dict); /* Free the given Viterbi search history object */ void fsg_history_free (fsg_history_t *h); /* Print the entire history */ void fsg_history_print(fsg_history_t *h, dict_t *dict); #endif pocketsphinx-5prealpha/src/libpocketsphinx/ptm_mgau.c0000664000175000017500000007362412771605033020371 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2010 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* System headers */ #include #include #include #include #include #include #if defined(__ADSPBLACKFIN__) #elif !defined(_WIN32_WCE) #include #endif /* SphinxBase headers */ #include #include #include #include #include #include #include /* Local headers */ #include "tied_mgau_common.h" #include "ptm_mgau.h" static ps_mgaufuncs_t ptm_mgau_funcs = { "ptm", ptm_mgau_frame_eval, /* frame_eval */ ptm_mgau_mllr_transform, /* transform */ ptm_mgau_free /* free */ }; #define COMPUTE_GMM_MAP(_idx) \ diff[_idx] = obs[_idx] - mean[_idx]; \ sqdiff[_idx] = MFCCMUL(diff[_idx], diff[_idx]); \ compl[_idx] = MFCCMUL(sqdiff[_idx], var[_idx]); #define COMPUTE_GMM_REDUCE(_idx) \ d = GMMSUB(d, compl[_idx]); static void insertion_sort_topn(ptm_topn_t *topn, int i, int32 d) { ptm_topn_t vtmp; int j; topn[i].score = d; if (i == 0) return; vtmp = topn[i]; for (j = i - 1; j >= 0 && d > topn[j].score; j--) { topn[j + 1] = topn[j]; } topn[j + 1] = vtmp; } static int eval_topn(ptm_mgau_t *s, int cb, int feat, mfcc_t *z) { ptm_topn_t *topn; int i, ceplen; topn = s->f->topn[cb][feat]; ceplen = s->g->featlen[feat]; for (i = 0; i < s->max_topn; i++) { mfcc_t *mean, diff[4], sqdiff[4], compl[4]; /* diff, diff^2, component likelihood */ mfcc_t *var, d; mfcc_t *obs; int32 cw, j; cw = topn[i].cw; mean = s->g->mean[cb][feat][0] + cw * ceplen; var = s->g->var[cb][feat][0] + cw * ceplen; d = s->g->det[cb][feat][cw]; obs = z; for (j = 0; j < ceplen % 4; ++j) { diff[0] = *obs++ - *mean++; sqdiff[0] = MFCCMUL(diff[0], diff[0]); compl[0] = MFCCMUL(sqdiff[0], *var); d = GMMSUB(d, compl[0]); ++var; } /* We could vectorize this but it's unlikely to make much * difference as the outer loop here isn't very big. */ for (;j < ceplen; j += 4) { COMPUTE_GMM_MAP(0); COMPUTE_GMM_MAP(1); COMPUTE_GMM_MAP(2); COMPUTE_GMM_MAP(3); COMPUTE_GMM_REDUCE(0); COMPUTE_GMM_REDUCE(1); COMPUTE_GMM_REDUCE(2); COMPUTE_GMM_REDUCE(3); var += 4; obs += 4; mean += 4; } insertion_sort_topn(topn, i, (int32)d); } return topn[0].score; } /* This looks bad, but it actually isn't. Less than 1% of eval_cb's * time is spent doing this. */ static void insertion_sort_cb(ptm_topn_t **cur, ptm_topn_t *worst, ptm_topn_t *best, int cw, int32 intd) { for (*cur = worst - 1; *cur >= best && intd >= (*cur)->score; --*cur) memcpy(*cur + 1, *cur, sizeof(**cur)); ++*cur; (*cur)->cw = cw; (*cur)->score = intd; } static int eval_cb(ptm_mgau_t *s, int cb, int feat, mfcc_t *z) { ptm_topn_t *worst, *best, *topn; mfcc_t *mean; mfcc_t *var, *det, *detP, *detE; int32 i, ceplen; best = topn = s->f->topn[cb][feat]; worst = topn + (s->max_topn - 1); mean = s->g->mean[cb][feat][0]; var = s->g->var[cb][feat][0]; det = s->g->det[cb][feat]; detE = det + s->g->n_density; ceplen = s->g->featlen[feat]; for (detP = det; detP < detE; ++detP) { mfcc_t diff[4], sqdiff[4], compl[4]; /* diff, diff^2, component likelihood */ mfcc_t d, thresh; mfcc_t *obs; ptm_topn_t *cur; int32 cw, j; d = *detP; thresh = (mfcc_t) worst->score; /* Avoid int-to-float conversions */ obs = z; cw = (int)(detP - det); /* Unroll the loop starting with the first dimension(s). In * theory this might be a bit faster if this Gaussian gets * "knocked out" by C0. In practice not. */ for (j = 0; (j < ceplen % 4) && (d >= thresh); ++j) { diff[0] = *obs++ - *mean++; sqdiff[0] = MFCCMUL(diff[0], diff[0]); compl[0] = MFCCMUL(sqdiff[0], *var++); d = GMMSUB(d, compl[0]); } /* Now do 4 dimensions at a time. You'd think that GCC would * vectorize this? Apparently not. And it's right, because * that won't make this any faster, at least on x86-64. */ for (; j < ceplen && d >= thresh; j += 4) { COMPUTE_GMM_MAP(0); COMPUTE_GMM_MAP(1); COMPUTE_GMM_MAP(2); COMPUTE_GMM_MAP(3); COMPUTE_GMM_REDUCE(0); COMPUTE_GMM_REDUCE(1); COMPUTE_GMM_REDUCE(2); COMPUTE_GMM_REDUCE(3); var += 4; obs += 4; mean += 4; } if (j < ceplen) { /* terminated early, so not in topn */ mean += (ceplen - j); var += (ceplen - j); continue; } if (d < thresh) continue; for (i = 0; i < s->max_topn; i++) { /* already there, so don't need to insert */ if (topn[i].cw == cw) break; } if (i < s->max_topn) continue; /* already there. Don't insert */ insertion_sort_cb(&cur, worst, best, cw, (int32)d); } return best->score; } /** * Compute top-N densities for active codebooks (and prune) */ static int ptm_mgau_codebook_eval(ptm_mgau_t *s, mfcc_t **z, int frame) { int i, j; /* First evaluate top-N from previous frame. */ for (i = 0; i < s->g->n_mgau; ++i) for (j = 0; j < s->g->n_feat; ++j) eval_topn(s, i, j, z[j]); /* If frame downsampling is in effect, possibly do nothing else. */ if (frame % s->ds_ratio) return 0; /* Evaluate remaining codebooks. */ for (i = 0; i < s->g->n_mgau; ++i) { if (bitvec_is_clear(s->f->mgau_active, i)) continue; for (j = 0; j < s->g->n_feat; ++j) { eval_cb(s, i, j, z[j]); } } return 0; } /** * Normalize densities to produce "posterior probabilities", * i.e. things with a reasonable dynamic range, then scale and * clamp them to the acceptable range. This is actually done * solely to ensure that we can use fast_logmath_add(). Note that * unless we share the same normalizer across all codebooks for * each feature stream we get defective scores (that's why these * loops are inside out - doing it per-feature should give us * greater precision). */ static int ptm_mgau_codebook_norm(ptm_mgau_t *s, mfcc_t **z, int frame) { int i, j; for (j = 0; j < s->g->n_feat; ++j) { int32 norm = WORST_SCORE; for (i = 0; i < s->g->n_mgau; ++i) { if (bitvec_is_clear(s->f->mgau_active, i)) continue; if (norm < s->f->topn[i][j][0].score >> SENSCR_SHIFT) norm = s->f->topn[i][j][0].score >> SENSCR_SHIFT; } assert(norm != WORST_SCORE); for (i = 0; i < s->g->n_mgau; ++i) { int32 k; if (bitvec_is_clear(s->f->mgau_active, i)) continue; for (k = 0; k < s->max_topn; ++k) { s->f->topn[i][j][k].score >>= SENSCR_SHIFT; s->f->topn[i][j][k].score -= norm; s->f->topn[i][j][k].score = -s->f->topn[i][j][k].score; if (s->f->topn[i][j][k].score > MAX_NEG_ASCR) s->f->topn[i][j][k].score = MAX_NEG_ASCR; } } } return 0; } static int ptm_mgau_calc_cb_active(ptm_mgau_t *s, uint8 *senone_active, int32 n_senone_active, int compallsen) { int i, lastsen; if (compallsen) { bitvec_set_all(s->f->mgau_active, s->g->n_mgau); return 0; } bitvec_clear_all(s->f->mgau_active, s->g->n_mgau); for (lastsen = i = 0; i < n_senone_active; ++i) { int sen = senone_active[i] + lastsen; int cb = s->sen2cb[sen]; bitvec_set(s->f->mgau_active, cb); lastsen = sen; } E_DEBUG(1, ("Active codebooks:")); for (i = 0; i < s->g->n_mgau; ++i) { if (bitvec_is_clear(s->f->mgau_active, i)) continue; E_DEBUGCONT(1, (" %d", i)); } E_DEBUGCONT(1, ("\n")); return 0; } /** * Compute senone scores from top-N densities for active codebooks. */ static int ptm_mgau_senone_eval(ptm_mgau_t *s, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active, int compall) { int i, lastsen, bestscore; memset(senone_scores, 0, s->n_sen * sizeof(*senone_scores)); /* FIXME: This is the non-cache-efficient way to do this. We want * to evaluate one codeword at a time but this requires us to have * a reverse codebook to senone mapping, which we don't have * (yet), since different codebooks have different top-N * codewords. */ if (compall) n_senone_active = s->n_sen; bestscore = 0x7fffffff; for (lastsen = i = 0; i < n_senone_active; ++i) { int sen, f, cb; int ascore; if (compall) sen = i; else sen = senone_active[i] + lastsen; lastsen = sen; cb = s->sen2cb[sen]; if (bitvec_is_clear(s->f->mgau_active, cb)) { int j; /* Because senone_active is deltas we can't really "knock * out" senones from pruned codebooks, and in any case, * it wouldn't make any difference to the search code, * which doesn't expect senone_active to change. */ for (f = 0; f < s->g->n_feat; ++f) { for (j = 0; j < s->max_topn; ++j) { s->f->topn[cb][f][j].score = MAX_NEG_ASCR; } } } /* For each feature, log-sum codeword scores + mixw to get * feature density, then sum (multiply) to get ascore */ ascore = 0; for (f = 0; f < s->g->n_feat; ++f) { ptm_topn_t *topn; int j, fden = 0; topn = s->f->topn[cb][f]; for (j = 0; j < s->max_topn; ++j) { int mixw; /* Find mixture weight for this codeword. */ if (s->mixw_cb) { int dcw = s->mixw[f][topn[j].cw][sen/2]; dcw = (dcw & 1) ? dcw >> 4 : dcw & 0x0f; mixw = s->mixw_cb[dcw]; } else { mixw = s->mixw[f][topn[j].cw][sen]; } if (j == 0) fden = mixw + topn[j].score; else fden = fast_logmath_add(s->lmath_8b, fden, mixw + topn[j].score); E_DEBUG(3, ("fden[%d][%d] l+= %d + %d = %d\n", sen, f, mixw, topn[j].score, fden)); } ascore += fden; } if (ascore < bestscore) bestscore = ascore; senone_scores[sen] = ascore; } /* Normalize the scores again (finishing the job we started above * in ptm_mgau_codebook_eval...) */ for (i = 0; i < s->n_sen; ++i) { senone_scores[i] -= bestscore; } return 0; } /** * Compute senone scores for the active senones. */ int32 ptm_mgau_frame_eval(ps_mgau_t *ps, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active, mfcc_t ** featbuf, int32 frame, int32 compallsen) { ptm_mgau_t *s = (ptm_mgau_t *)ps; int fast_eval_idx; /* Find the appropriate frame in the rotating history buffer * corresponding to the requested input frame. No bounds checking * is done here, which just means you'll get semi-random crap if * you request a frame in the future or one that's too far in the * past. Since the history buffer is just used for fast match * that might not be fatal. */ fast_eval_idx = frame % s->n_fast_hist; s->f = s->hist + fast_eval_idx; /* Compute the top-N codewords for every codebook, unless this * is a past frame, in which case we already have them (we * hope!) */ if (frame >= ps_mgau_base(ps)->frame_idx) { ptm_fast_eval_t *lastf; /* Get the previous frame's top-N information (on the * first frame of the input this is just all WORST_DIST, * no harm in that) */ if (fast_eval_idx == 0) lastf = s->hist + s->n_fast_hist - 1; else lastf = s->hist + fast_eval_idx - 1; /* Copy in initial top-N info */ memcpy(s->f->topn[0][0], lastf->topn[0][0], s->g->n_mgau * s->g->n_feat * s->max_topn * sizeof(ptm_topn_t)); /* Generate initial active codebook list (this might not be * necessary) */ ptm_mgau_calc_cb_active(s, senone_active, n_senone_active, compallsen); /* Now evaluate top-N, prune, and evaluate remaining codebooks. */ ptm_mgau_codebook_eval(s, featbuf, frame); ptm_mgau_codebook_norm(s, featbuf, frame); } /* Evaluate intersection of active senones and active codebooks. */ ptm_mgau_senone_eval(s, senone_scores, senone_active, n_senone_active, compallsen); return 0; } static int32 read_sendump(ptm_mgau_t *s, bin_mdef_t *mdef, char const *file) { FILE *fp; char line[1000]; int32 i, n, r, c; int32 do_swap, do_mmap; size_t offset; int n_clust = 0; int n_feat = s->g->n_feat; int n_density = s->g->n_density; int n_sen = bin_mdef_n_sen(mdef); int n_bits = 8; s->n_sen = n_sen; /* FIXME: Should have been done earlier */ do_mmap = cmd_ln_boolean_r(s->config, "-mmap"); if ((fp = fopen(file, "rb")) == NULL) return -1; E_INFO("Loading senones from dump file %s\n", file); /* Read title size, title */ if (fread(&n, sizeof(int32), 1, fp) != 1) { E_ERROR_SYSTEM("Failed to read title size from %s", file); goto error_out; } /* This is extremely bogus */ do_swap = 0; if (n < 1 || n > 999) { SWAP_INT32(&n); if (n < 1 || n > 999) { E_ERROR("Title length %x in dump file %s out of range\n", n, file); goto error_out; } do_swap = 1; } if (fread(line, sizeof(char), n, fp) != n) { E_ERROR_SYSTEM("Cannot read title"); goto error_out; } if (line[n - 1] != '\0') { E_ERROR("Bad title in dump file\n"); goto error_out; } E_INFO("%s\n", line); /* Read header size, header */ if (fread(&n, sizeof(n), 1, fp) != 1) { E_ERROR_SYSTEM("Failed to read header size from %s", file); goto error_out; } if (do_swap) SWAP_INT32(&n); if (fread(line, sizeof(char), n, fp) != n) { E_ERROR_SYSTEM("Cannot read header"); goto error_out; } if (line[n - 1] != '\0') { E_ERROR("Bad header in dump file\n"); goto error_out; } /* Read other header strings until string length = 0 */ for (;;) { if (fread(&n, sizeof(n), 1, fp) != 1) { E_ERROR_SYSTEM("Failed to read header string size from %s", file); goto error_out; } if (do_swap) SWAP_INT32(&n); if (n == 0) break; if (fread(line, sizeof(char), n, fp) != n) { E_ERROR_SYSTEM("Cannot read header"); goto error_out; } /* Look for a cluster count, if present */ if (!strncmp(line, "feature_count ", strlen("feature_count "))) { n_feat = atoi(line + strlen("feature_count ")); } if (!strncmp(line, "mixture_count ", strlen("mixture_count "))) { n_density = atoi(line + strlen("mixture_count ")); } if (!strncmp(line, "model_count ", strlen("model_count "))) { n_sen = atoi(line + strlen("model_count ")); } if (!strncmp(line, "cluster_count ", strlen("cluster_count "))) { n_clust = atoi(line + strlen("cluster_count ")); } if (!strncmp(line, "cluster_bits ", strlen("cluster_bits "))) { n_bits = atoi(line + strlen("cluster_bits ")); } } /* Defaults for #rows, #columns in mixw array. */ c = n_sen; r = n_density; if (n_clust == 0) { /* Older mixw files have them here, and they might be padded. */ if (fread(&r, sizeof(r), 1, fp) != 1) { E_ERROR_SYSTEM("Cannot read #rows"); goto error_out; } if (do_swap) SWAP_INT32(&r); if (fread(&c, sizeof(c), 1, fp) != 1) { E_ERROR_SYSTEM("Cannot read #columns"); goto error_out; } if (do_swap) SWAP_INT32(&c); E_INFO("Rows: %d, Columns: %d\n", r, c); } if (n_feat != s->g->n_feat) { E_ERROR("Number of feature streams mismatch: %d != %d\n", n_feat, s->g->n_feat); goto error_out; } if (n_density != s->g->n_density) { E_ERROR("Number of densities mismatch: %d != %d\n", n_density, s->g->n_density); goto error_out; } if (n_sen != s->n_sen) { E_ERROR("Number of senones mismatch: %d != %d\n", n_sen, s->n_sen); goto error_out; } if (!((n_clust == 0) || (n_clust == 15) || (n_clust == 16))) { E_ERROR("Cluster count must be 0, 15, or 16\n"); goto error_out; } if (n_clust == 15) ++n_clust; if (!((n_bits == 8) || (n_bits == 4))) { E_ERROR("Cluster count must be 4 or 8\n"); goto error_out; } if (do_mmap) { E_INFO("Using memory-mapped I/O for senones\n"); } offset = ftell(fp); /* Allocate memory for pdfs (or memory map them) */ if (do_mmap) { s->sendump_mmap = mmio_file_read(file); /* Get cluster codebook if any. */ if (n_clust) { s->mixw_cb = ((uint8 *) mmio_file_ptr(s->sendump_mmap)) + offset; offset += n_clust; } } else { /* Get cluster codebook if any. */ if (n_clust) { s->mixw_cb = ckd_calloc(1, n_clust); if (fread(s->mixw_cb, 1, n_clust, fp) != (size_t) n_clust) { E_ERROR("Failed to read %d bytes from sendump\n", n_clust); goto error_out; } } } /* Set up pointers, or read, or whatever */ if (s->sendump_mmap) { s->mixw = ckd_calloc_2d(n_feat, n_density, sizeof(*s->mixw)); for (n = 0; n < n_feat; n++) { int step = c; if (n_bits == 4) step = (step + 1) / 2; for (i = 0; i < r; i++) { s->mixw[n][i] = ((uint8 *) mmio_file_ptr(s->sendump_mmap)) + offset; offset += step; } } } else { s->mixw = ckd_calloc_3d(n_feat, n_density, n_sen, sizeof(***s->mixw)); /* Read pdf values and ids */ for (n = 0; n < n_feat; n++) { int step = c; if (n_bits == 4) step = (step + 1) / 2; for (i = 0; i < r; i++) { if (fread(s->mixw[n][i], sizeof(***s->mixw), step, fp) != (size_t) step) { E_ERROR("Failed to read %d bytes from sendump\n", step); goto error_out; } } } } fclose(fp); return 0; error_out: fclose(fp); return -1; } static int32 read_mixw(ptm_mgau_t * s, char const *file_name, double SmoothMin) { char **argname, **argval; char eofchk; FILE *fp; int32 byteswap, chksum_present; uint32 chksum; float32 *pdf; int32 i, f, c, n; int32 n_sen; int32 n_feat; int32 n_comp; int32 n_err; E_INFO("Reading mixture weights file '%s'\n", file_name); if ((fp = fopen(file_name, "rb")) == NULL) E_FATAL_SYSTEM("Failed to open mixture file '%s' for reading", file_name); /* Read header, including argument-value info and 32-bit byteorder magic */ if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) E_FATAL("Failed to read header from '%s'\n", file_name); /* Parse argument-value list */ chksum_present = 0; for (i = 0; argname[i]; i++) { if (strcmp(argname[i], "version") == 0) { if (strcmp(argval[i], MGAU_MIXW_VERSION) != 0) E_WARN("Version mismatch(%s): %s, expecting %s\n", file_name, argval[i], MGAU_MIXW_VERSION); } else if (strcmp(argname[i], "chksum0") == 0) { chksum_present = 1; /* Ignore the associated value */ } } bio_hdrarg_free(argname, argval); argname = argval = NULL; chksum = 0; /* Read #senones, #features, #codewords, arraysize */ if ((bio_fread(&n_sen, sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&n_feat, sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&n_comp, sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&n, sizeof(int32), 1, fp, byteswap, &chksum) != 1)) { E_FATAL("bio_fread(%s) (arraysize) failed\n", file_name); } if (n_feat != s->g->n_feat) E_FATAL("#Features streams(%d) != %d\n", n_feat, s->g->n_feat); if (n != n_sen * n_feat * n_comp) { E_FATAL ("%s: #float32s(%d) doesn't match header dimensions: %d x %d x %d\n", file_name, i, n_sen, n_feat, n_comp); } /* n_sen = number of mixture weights per codeword, which is * fixed at the number of senones since we have only one codebook. */ s->n_sen = n_sen; /* Quantized mixture weight arrays. */ s->mixw = ckd_calloc_3d(s->g->n_feat, s->g->n_density, n_sen, sizeof(***s->mixw)); /* Temporary structure to read in floats before conversion to (int32) logs3 */ pdf = (float32 *) ckd_calloc(n_comp, sizeof(float32)); /* Read senone probs data, normalize, floor, convert to logs3, truncate to 8 bits */ n_err = 0; for (i = 0; i < n_sen; i++) { for (f = 0; f < n_feat; f++) { if (bio_fread((void *) pdf, sizeof(float32), n_comp, fp, byteswap, &chksum) != n_comp) { E_FATAL("bio_fread(%s) (arraydata) failed\n", file_name); } /* Normalize and floor */ if (vector_sum_norm(pdf, n_comp) <= 0.0) n_err++; vector_floor(pdf, n_comp, SmoothMin); vector_sum_norm(pdf, n_comp); /* Convert to LOG, quantize, and transpose */ for (c = 0; c < n_comp; c++) { int32 qscr; qscr = -logmath_log(s->lmath_8b, pdf[c]); if ((qscr > MAX_NEG_MIXW) || (qscr < 0)) qscr = MAX_NEG_MIXW; s->mixw[f][c][i] = qscr; } } } if (n_err > 0) E_WARN("Weight normalization failed for %d mixture weights components\n", n_err); ckd_free(pdf); if (chksum_present) bio_verify_chksum(fp, byteswap, chksum); if (fread(&eofchk, 1, 1, fp) == 1) E_FATAL("More data than expected in %s\n", file_name); fclose(fp); E_INFO("Read %d x %d x %d mixture weights\n", n_sen, n_feat, n_comp); return n_sen; } ps_mgau_t * ptm_mgau_init(acmod_t *acmod, bin_mdef_t *mdef) { ptm_mgau_t *s; ps_mgau_t *ps; char const *sendump_path; int i; s = ckd_calloc(1, sizeof(*s)); s->config = acmod->config; s->lmath = logmath_retain(acmod->lmath); /* Log-add table. */ s->lmath_8b = logmath_init(logmath_get_base(acmod->lmath), SENSCR_SHIFT, TRUE); if (s->lmath_8b == NULL) goto error_out; /* Ensure that it is only 8 bits wide so that fast_logmath_add() works. */ if (logmath_get_width(s->lmath_8b) != 1) { E_ERROR("Log base %f is too small to represent add table in 8 bits\n", logmath_get_base(s->lmath_8b)); goto error_out; } /* Read means and variances. */ if ((s->g = gauden_init(cmd_ln_str_r(s->config, "_mean"), cmd_ln_str_r(s->config, "_var"), cmd_ln_float32_r(s->config, "-varfloor"), s->lmath)) == NULL) { E_ERROR("Failed to read means and variances\n"); goto error_out; } /* We only support 256 codebooks or less (like 640k or 2GB, this * should be enough for anyone) */ if (s->g->n_mgau > 256) { E_INFO("Number of codebooks exceeds 256: %d\n", s->g->n_mgau); goto error_out; } if (s->g->n_mgau != bin_mdef_n_ciphone(mdef)) { E_INFO("Number of codebooks doesn't match number of ciphones, doesn't look like PTM: %d != %d\n", s->g->n_mgau, bin_mdef_n_ciphone(mdef)); goto error_out; } /* Verify n_feat and veclen, against acmod. */ if (s->g->n_feat != feat_dimension1(acmod->fcb)) { E_ERROR("Number of streams does not match: %d != %d\n", s->g->n_feat, feat_dimension1(acmod->fcb)); goto error_out; } for (i = 0; i < s->g->n_feat; ++i) { if (s->g->featlen[i] != feat_dimension2(acmod->fcb, i)) { E_ERROR("Dimension of stream %d does not match: %d != %d\n", s->g->featlen[i], feat_dimension2(acmod->fcb, i)); goto error_out; } } /* Read mixture weights. */ if ((sendump_path = cmd_ln_str_r(s->config, "_sendump"))) { if (read_sendump(s, acmod->mdef, sendump_path) < 0) { goto error_out; } } else { if (read_mixw(s, cmd_ln_str_r(s->config, "_mixw"), cmd_ln_float32_r(s->config, "-mixwfloor")) < 0) { goto error_out; } } s->ds_ratio = cmd_ln_int32_r(s->config, "-ds"); s->max_topn = cmd_ln_int32_r(s->config, "-topn"); E_INFO("Maximum top-N: %d\n", s->max_topn); /* Assume mapping of senones to their base phones, though this * will become more flexible in the future. */ s->sen2cb = ckd_calloc(s->n_sen, sizeof(*s->sen2cb)); for (i = 0; i < s->n_sen; ++i) s->sen2cb[i] = bin_mdef_sen2cimap(acmod->mdef, i); /* Allocate fast-match history buffers. We need enough for the * phoneme lookahead window, plus the current frame, plus one for * good measure? (FIXME: I don't remember why) */ s->n_fast_hist = cmd_ln_int32_r(s->config, "-pl_window") + 2; s->hist = ckd_calloc(s->n_fast_hist, sizeof(*s->hist)); /* s->f will be a rotating pointer into s->hist. */ s->f = s->hist; for (i = 0; i < s->n_fast_hist; ++i) { int j, k, m; /* Top-N codewords for every codebook and feature. */ s->hist[i].topn = ckd_calloc_3d(s->g->n_mgau, s->g->n_feat, s->max_topn, sizeof(ptm_topn_t)); /* Initialize them to sane (yet arbitrary) defaults. */ for (j = 0; j < s->g->n_mgau; ++j) { for (k = 0; k < s->g->n_feat; ++k) { for (m = 0; m < s->max_topn; ++m) { s->hist[i].topn[j][k][m].cw = m; s->hist[i].topn[j][k][m].score = WORST_DIST; } } } /* Active codebook mapping (just codebook, not features, at least not yet) */ s->hist[i].mgau_active = bitvec_alloc(s->g->n_mgau); /* Start with them all on, prune them later. */ bitvec_set_all(s->hist[i].mgau_active, s->g->n_mgau); } ps = (ps_mgau_t *)s; ps->vt = &ptm_mgau_funcs; return ps; error_out: ptm_mgau_free(ps_mgau_base(s)); return NULL; } int ptm_mgau_mllr_transform(ps_mgau_t *ps, ps_mllr_t *mllr) { ptm_mgau_t *s = (ptm_mgau_t *)ps; return gauden_mllr_transform(s->g, mllr, s->config); } void ptm_mgau_free(ps_mgau_t *ps) { int i; ptm_mgau_t *s = (ptm_mgau_t *)ps; logmath_free(s->lmath); logmath_free(s->lmath_8b); if (s->sendump_mmap) { ckd_free_2d(s->mixw); mmio_file_unmap(s->sendump_mmap); } else { ckd_free_3d(s->mixw); } ckd_free(s->sen2cb); for (i = 0; i < s->n_fast_hist; i++) { ckd_free_3d(s->hist[i].topn); bitvec_free(s->hist[i].mgau_active); } ckd_free(s->hist); gauden_free(s->g); ckd_free(s); } pocketsphinx-5prealpha/src/libpocketsphinx/tied_mgau_common.h0000664000175000017500000001033112771605033022055 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2010 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file tied_mgau_common.h * @brief Common code shared between SC and PTM (tied-state) models. */ #ifndef __TIED_MGAU_COMMON_H__ #define __TIED_MGAU_COMMON_H__ #include #include #define MGAU_MIXW_VERSION "1.0" /* Sphinx-3 file format version for mixw */ #define MGAU_PARAM_VERSION "1.0" /* Sphinx-3 file format version for mean/var */ #define NONE -1 #define WORST_DIST (int32)(0x80000000) /** Subtract GMM component b (assumed to be positive) and saturate */ #ifdef FIXED_POINT #define GMMSUB(a,b) \ (((a)-(b) > a) ? (INT_MIN) : ((a)-(b))) /** Add GMM component b (assumed to be positive) and saturate */ #define GMMADD(a,b) \ (((a)+(b) < a) ? (INT_MAX) : ((a)+(b))) #else #define GMMSUB(a,b) ((a)-(b)) #define GMMADD(a,b) ((a)+(b)) #endif #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) #define LOGMATH_INLINE static inline #elif defined(_MSC_VER) #define LOGMATH_INLINE __inline #else #define LOGMATH_INLINE static #endif /* Allocate 0..159 for negated quantized mixture weights and 0..96 for * negated normalized acoustic scores, so that the combination of the * two (for a single mixture) can never exceed 255. */ #define MAX_NEG_MIXW 159 /**< Maximum negated mixture weight value. */ #define MAX_NEG_ASCR 96 /**< Maximum negated acoustic score value. */ /** * Quickly log-add two negated log probabilities. * * @param lmath The log-math object * @param mlx A negative log probability (0 < mlx < 255) * @param mly A negative log probability (0 < mly < 255) * @return -log(exp(-mlx)+exp(-mly)) * * We can do some extra-fast log addition since we know that * mixw+ascr is always less than 256 and hence x-y is also always less * than 256. This relies on some cooperation from logmath_t which * will never produce a logmath table smaller than 256 entries. * * Note that the parameters are *negated* log probabilities (and * hence, are positive numbers), as is the return value. This is the * key to the "fastness" of this function. */ LOGMATH_INLINE int fast_logmath_add(logmath_t *lmath, int mlx, int mly) { logadd_t *t = LOGMATH_TABLE(lmath); int d, r; /* d must be positive, obviously. */ if (mlx > mly) { d = (mlx - mly); r = mly; } else { d = (mly - mlx); r = mlx; } return r - (((uint8 *)t->table)[d]); } #endif /* __TIED_MGAU_COMMON_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/pocketsphinx.c0000664000175000017500000011424412771605033021271 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* System headers. */ #include #include #ifdef HAVE_UNISTD_H #include #endif /* SphinxBase headers. */ #include #include #include #include #include #include /* Local headers. */ #include "cmdln_macro.h" #include "pocketsphinx.h" #include "pocketsphinx_internal.h" #include "ps_lattice_internal.h" #include "phone_loop_search.h" #include "kws_search.h" #include "fsg_search_internal.h" #include "ngram_search.h" #include "ngram_search_fwdtree.h" #include "ngram_search_fwdflat.h" #include "allphone_search.h" static const arg_t ps_args_def[] = { POCKETSPHINX_OPTIONS, CMDLN_EMPTY_OPTION }; /* I'm not sure what the portable way to do this is. */ static int file_exists(const char *path) { FILE *tmp; tmp = fopen(path, "rb"); if (tmp) fclose(tmp); return (tmp != NULL); } #ifdef MODELDIR static int hmmdir_exists(const char *path) { FILE *tmp; char *mdef = string_join(path, "/mdef", NULL); tmp = fopen(mdef, "rb"); if (tmp) fclose(tmp); ckd_free(mdef); return (tmp != NULL); } #endif static void ps_expand_file_config(ps_decoder_t *ps, const char *arg, const char *extra_arg, const char *hmmdir, const char *file) { const char *val; if ((val = cmd_ln_str_r(ps->config, arg)) != NULL) { cmd_ln_set_str_extra_r(ps->config, extra_arg, val); } else if (hmmdir == NULL) { cmd_ln_set_str_extra_r(ps->config, extra_arg, NULL); } else { char *tmp = string_join(hmmdir, "/", file, NULL); if (file_exists(tmp)) cmd_ln_set_str_extra_r(ps->config, extra_arg, tmp); else cmd_ln_set_str_extra_r(ps->config, extra_arg, NULL); ckd_free(tmp); } } /* Feature and front-end parameters that may be in feat.params */ static const arg_t feat_defn[] = { waveform_to_cepstral_command_line_macro(), cepstral_to_feature_command_line_macro(), CMDLN_EMPTY_OPTION }; static void ps_expand_model_config(ps_decoder_t *ps) { char const *hmmdir, *featparams; /* Disable memory mapping on Blackfin (FIXME: should be uClinux in general). */ #ifdef __ADSPBLACKFIN__ E_INFO("Will not use mmap() on uClinux/Blackfin."); cmd_ln_set_boolean_r(ps->config, "-mmap", FALSE); #endif /* Get acoustic model filenames and add them to the command-line */ hmmdir = cmd_ln_str_r(ps->config, "-hmm"); ps_expand_file_config(ps, "-mdef", "_mdef", hmmdir, "mdef"); ps_expand_file_config(ps, "-mean", "_mean", hmmdir, "means"); ps_expand_file_config(ps, "-var", "_var", hmmdir, "variances"); ps_expand_file_config(ps, "-tmat", "_tmat", hmmdir, "transition_matrices"); ps_expand_file_config(ps, "-mixw", "_mixw", hmmdir, "mixture_weights"); ps_expand_file_config(ps, "-sendump", "_sendump", hmmdir, "sendump"); ps_expand_file_config(ps, "-fdict", "_fdict", hmmdir, "noisedict"); ps_expand_file_config(ps, "-lda", "_lda", hmmdir, "feature_transform"); ps_expand_file_config(ps, "-featparams", "_featparams", hmmdir, "feat.params"); ps_expand_file_config(ps, "-senmgau", "_senmgau", hmmdir, "senmgau"); /* Look for feat.params in acoustic model dir. */ if ((featparams = cmd_ln_str_r(ps->config, "_featparams"))) { if (NULL != cmd_ln_parse_file_r(ps->config, feat_defn, featparams, FALSE)) E_INFO("Parsed model-specific feature parameters from %s\n", featparams); } /* Print here because acmod_init might load feat.params file */ if (err_get_logfp() != NULL) { cmd_ln_print_values_r(ps->config, err_get_logfp(), ps_args()); } } static void ps_free_searches(ps_decoder_t *ps) { if (ps->searches) { hash_iter_t *search_it; for (search_it = hash_table_iter(ps->searches); search_it; search_it = hash_table_iter_next(search_it)) { ps_search_free(hash_entry_val(search_it->ent)); } hash_table_free(ps->searches); } ps->searches = NULL; ps->search = NULL; } static ps_search_t * ps_find_search(ps_decoder_t *ps, char const *name) { void *search = NULL; hash_table_lookup(ps->searches, name, &search); return (ps_search_t *) search; } /* Set default acoustic and language models if they are not defined in configuration. */ void ps_default_search_args(cmd_ln_t *config) { #ifdef MODELDIR const char *hmmdir = cmd_ln_str_r(config, "-hmm"); const char *lmfile = cmd_ln_str_r(config, "-lm"); const char *dictfile = cmd_ln_str_r(config, "-dict"); if (hmmdir == NULL && hmmdir_exists(MODELDIR "/en-us/en-us")) { hmmdir = MODELDIR "/en-us/en-us"; cmd_ln_set_str_r(config, "-hmm", hmmdir); } if (lmfile == NULL && !cmd_ln_str_r(config, "-fsg") && !cmd_ln_str_r(config, "-jsgf") && !cmd_ln_str_r(config, "-lmctl") && !cmd_ln_str_r(config, "-kws") && !cmd_ln_str_r(config, "-keyphrase") && file_exists(MODELDIR "/en-us/en-us.lm.bin")) { lmfile = MODELDIR "/en-us/en-us.lm.bin"; cmd_ln_set_str_r(config, "-lm", lmfile); } if (dictfile == NULL && file_exists(MODELDIR "/en-us/cmudict-en-us.dict")) { dictfile = MODELDIR "/en-us/cmudict-en-us.dict"; cmd_ln_set_str_r(config, "-dict", dictfile); } #endif } int ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) { const char *path; const char *keyphrase; int32 lw; if (config && config != ps->config) { cmd_ln_free_r(ps->config); ps->config = cmd_ln_retain(config); } err_set_debug_level(cmd_ln_int32_r(ps->config, "-debug")); /* Set up logging. We need to do this earlier because we want to dump * the information to the configured log, not to the stderr. */ if (config && cmd_ln_str_r(ps->config, "-logfn")) { if (err_set_logfile(cmd_ln_str_r(ps->config, "-logfn")) < 0) { E_ERROR("Cannot redirect log output\n"); return -1; } } ps->mfclogdir = cmd_ln_str_r(ps->config, "-mfclogdir"); ps->rawlogdir = cmd_ln_str_r(ps->config, "-rawlogdir"); ps->senlogdir = cmd_ln_str_r(ps->config, "-senlogdir"); /* Fill in some default arguments. */ ps_expand_model_config(ps); /* Free old searches (do this before other reinit) */ ps_free_searches(ps); ps->searches = hash_table_new(3, HASH_CASE_YES); /* Free old acmod. */ acmod_free(ps->acmod); ps->acmod = NULL; /* Free old dictionary (must be done after the two things above) */ dict_free(ps->dict); ps->dict = NULL; /* Free d2p */ dict2pid_free(ps->d2p); ps->d2p = NULL; /* Logmath computation (used in acmod and search) */ if (ps->lmath == NULL || (logmath_get_base(ps->lmath) != (float64)cmd_ln_float32_r(ps->config, "-logbase"))) { if (ps->lmath) logmath_free(ps->lmath); ps->lmath = logmath_init ((float64)cmd_ln_float32_r(ps->config, "-logbase"), 0, cmd_ln_boolean_r(ps->config, "-bestpath")); } /* Acoustic model (this is basically everything that * uttproc.c, senscr.c, and others used to do) */ if ((ps->acmod = acmod_init(ps->config, ps->lmath, NULL, NULL)) == NULL) return -1; if (cmd_ln_int32_r(ps->config, "-pl_window") > 0) { /* Initialize an auxiliary phone loop search, which will run in * "parallel" with FSG or N-Gram search. */ if ((ps->phone_loop = phone_loop_search_init(ps->config, ps->acmod, ps->dict)) == NULL) return -1; hash_table_enter(ps->searches, ps_search_name(ps->phone_loop), ps->phone_loop); } /* Dictionary and triphone mappings (depends on acmod). */ /* FIXME: pass config, change arguments, implement LTS, etc. */ if ((ps->dict = dict_init(ps->config, ps->acmod->mdef)) == NULL) return -1; if ((ps->d2p = dict2pid_build(ps->acmod->mdef, ps->dict)) == NULL) return -1; lw = cmd_ln_float32_r(ps->config, "-lw"); /* Determine whether we are starting out in FSG or N-Gram search mode. * If neither is used skip search initialization. */ /* Load KWS if one was specified in config */ if ((keyphrase = cmd_ln_str_r(ps->config, "-keyphrase"))) { if (ps_set_keyphrase(ps, PS_DEFAULT_SEARCH, keyphrase)) return -1; ps_set_search(ps, PS_DEFAULT_SEARCH); } if ((path = cmd_ln_str_r(ps->config, "-kws"))) { if (ps_set_kws(ps, PS_DEFAULT_SEARCH, path)) return -1; ps_set_search(ps, PS_DEFAULT_SEARCH); } /* Load an FSG if one was specified in config */ if ((path = cmd_ln_str_r(ps->config, "-fsg"))) { fsg_model_t *fsg = fsg_model_readfile(path, ps->lmath, lw); if (!fsg) return -1; if (ps_set_fsg(ps, PS_DEFAULT_SEARCH, fsg)) { fsg_model_free(fsg); return -1; } fsg_model_free(fsg); ps_set_search(ps, PS_DEFAULT_SEARCH); } /* Or load a JSGF grammar */ if ((path = cmd_ln_str_r(ps->config, "-jsgf"))) { if (ps_set_jsgf_file(ps, PS_DEFAULT_SEARCH, path) || ps_set_search(ps, PS_DEFAULT_SEARCH)) return -1; } if ((path = cmd_ln_str_r(ps->config, "-allphone"))) { if (ps_set_allphone_file(ps, PS_DEFAULT_SEARCH, path) || ps_set_search(ps, PS_DEFAULT_SEARCH)) return -1; } if ((path = cmd_ln_str_r(ps->config, "-lm")) && !cmd_ln_boolean_r(ps->config, "-allphone")) { if (ps_set_lm_file(ps, PS_DEFAULT_SEARCH, path) || ps_set_search(ps, PS_DEFAULT_SEARCH)) return -1; } if ((path = cmd_ln_str_r(ps->config, "-lmctl"))) { const char *name; ngram_model_t *lmset; ngram_model_set_iter_t *lmset_it; if (!(lmset = ngram_model_set_read(ps->config, path, ps->lmath))) { E_ERROR("Failed to read language model control file: %s\n", path); return -1; } for(lmset_it = ngram_model_set_iter(lmset); lmset_it; lmset_it = ngram_model_set_iter_next(lmset_it)) { ngram_model_t *lm = ngram_model_set_iter_model(lmset_it, &name); E_INFO("adding search %s\n", name); if (ps_set_lm(ps, name, lm)) { ngram_model_set_iter_free(lmset_it); ngram_model_free(lmset); return -1; } } ngram_model_free(lmset); name = cmd_ln_str_r(ps->config, "-lmname"); if (name) ps_set_search(ps, name); else { E_ERROR("No default LM name (-lmname) for `-lmctl'\n"); return -1; } } /* Initialize performance timer. */ ps->perf.name = "decode"; ptmr_init(&ps->perf); return 0; } ps_decoder_t * ps_init(cmd_ln_t *config) { ps_decoder_t *ps; if (!config) { E_ERROR("No configuration specified"); return NULL; } ps = ckd_calloc(1, sizeof(*ps)); ps->refcount = 1; if (ps_reinit(ps, config) < 0) { ps_free(ps); return NULL; } return ps; } arg_t const * ps_args(void) { return ps_args_def; } ps_decoder_t * ps_retain(ps_decoder_t *ps) { ++ps->refcount; return ps; } int ps_free(ps_decoder_t *ps) { if (ps == NULL) return 0; if (--ps->refcount > 0) return ps->refcount; ps_free_searches(ps); dict_free(ps->dict); dict2pid_free(ps->d2p); acmod_free(ps->acmod); logmath_free(ps->lmath); cmd_ln_free_r(ps->config); ckd_free(ps); return 0; } cmd_ln_t * ps_get_config(ps_decoder_t *ps) { return ps->config; } logmath_t * ps_get_logmath(ps_decoder_t *ps) { return ps->lmath; } fe_t * ps_get_fe(ps_decoder_t *ps) { return ps->acmod->fe; } feat_t * ps_get_feat(ps_decoder_t *ps) { return ps->acmod->fcb; } ps_mllr_t * ps_update_mllr(ps_decoder_t *ps, ps_mllr_t *mllr) { return acmod_update_mllr(ps->acmod, mllr); } int ps_set_search(ps_decoder_t *ps, const char *name) { ps_search_t *search; if (ps->acmod->state != ACMOD_ENDED && ps->acmod->state != ACMOD_IDLE) { E_ERROR("Cannot change search while decoding, end utterance first\n"); return -1; } if (!(search = ps_find_search(ps, name))) { return -1; } ps->search = search; /* Set pl window depending on the search */ if (!strcmp(PS_SEARCH_TYPE_NGRAM, ps_search_type(search))) { ps->pl_window = cmd_ln_int32_r(ps->config, "-pl_window"); } else { ps->pl_window = 0; } return 0; } const char* ps_get_search(ps_decoder_t *ps) { hash_iter_t *search_it; const char* name = NULL; for (search_it = hash_table_iter(ps->searches); search_it; search_it = hash_table_iter_next(search_it)) { if (hash_entry_val(search_it->ent) == ps->search) { name = hash_entry_key(search_it->ent); break; } } return name; } int ps_unset_search(ps_decoder_t *ps, const char *name) { ps_search_t *search = hash_table_delete(ps->searches, name); if (!search) return -1; if (ps->search == search) ps->search = NULL; ps_search_free(search); return 0; } ps_search_iter_t * ps_search_iter(ps_decoder_t *ps) { return (ps_search_iter_t *)hash_table_iter(ps->searches); } ps_search_iter_t * ps_search_iter_next(ps_search_iter_t *itor) { return (ps_search_iter_t *)hash_table_iter_next((hash_iter_t *)itor); } const char* ps_search_iter_val(ps_search_iter_t *itor) { return (const char*)(((hash_iter_t *)itor)->ent->key); } void ps_search_iter_free(ps_search_iter_t *itor) { hash_table_iter_free((hash_iter_t *)itor); } ngram_model_t * ps_get_lm(ps_decoder_t *ps, const char *name) { ps_search_t *search = ps_find_search(ps, name); if (search && strcmp(PS_SEARCH_TYPE_NGRAM, ps_search_type(search))) return NULL; return search ? ((ngram_search_t *) search)->lmset : NULL; } fsg_model_t * ps_get_fsg(ps_decoder_t *ps, const char *name) { ps_search_t *search = ps_find_search(ps, name); if (search && strcmp(PS_SEARCH_TYPE_FSG, ps_search_type(search))) return NULL; return search ? ((fsg_search_t *) search)->fsg : NULL; } const char* ps_get_kws(ps_decoder_t *ps, const char* name) { ps_search_t *search = ps_find_search(ps, name); if (search && strcmp(PS_SEARCH_TYPE_KWS, ps_search_type(search))) return NULL; return search ? kws_search_get_keyphrases(search) : NULL; } static int set_search_internal(ps_decoder_t *ps, ps_search_t *search) { ps_search_t *old_search; if (!search) return -1; search->pls = ps->phone_loop; old_search = (ps_search_t *) hash_table_replace(ps->searches, ps_search_name(search), search); if (old_search != search) ps_search_free(old_search); return 0; } int ps_set_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm) { ps_search_t *search; search = ngram_search_init(name, lm, ps->config, ps->acmod, ps->dict, ps->d2p); return set_search_internal(ps, search); } int ps_set_lm_file(ps_decoder_t *ps, const char *name, const char *path) { ngram_model_t *lm; int result; lm = ngram_model_read(ps->config, path, NGRAM_AUTO, ps->lmath); if (!lm) return -1; result = ps_set_lm(ps, name, lm); ngram_model_free(lm); return result; } int ps_set_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm) { ps_search_t *search; search = allphone_search_init(name, lm, ps->config, ps->acmod, ps->dict, ps->d2p); return set_search_internal(ps, search); } int ps_set_allphone_file(ps_decoder_t *ps, const char *name, const char *path) { ngram_model_t *lm; int result; lm = NULL; if (path) lm = ngram_model_read(ps->config, path, NGRAM_AUTO, ps->lmath); result = ps_set_allphone(ps, name, lm); if (lm) ngram_model_free(lm); return result; } int ps_set_kws(ps_decoder_t *ps, const char *name, const char *keyfile) { ps_search_t *search; search = kws_search_init(name, NULL, keyfile, ps->config, ps->acmod, ps->dict, ps->d2p); return set_search_internal(ps, search); } int ps_set_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase) { ps_search_t *search; search = kws_search_init(name, keyphrase, NULL, ps->config, ps->acmod, ps->dict, ps->d2p); return set_search_internal(ps, search); } int ps_set_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg) { ps_search_t *search; search = fsg_search_init(name, fsg, ps->config, ps->acmod, ps->dict, ps->d2p); return set_search_internal(ps, search); } int ps_set_jsgf_file(ps_decoder_t *ps, const char *name, const char *path) { fsg_model_t *fsg; jsgf_rule_t *rule; char const *toprule; jsgf_t *jsgf = jsgf_parse_file(path, NULL); float lw; int result; if (!jsgf) return -1; rule = NULL; /* Take the -toprule if specified. */ if ((toprule = cmd_ln_str_r(ps->config, "-toprule"))) { rule = jsgf_get_rule(jsgf, toprule); if (rule == NULL) { E_ERROR("Start rule %s not found\n", toprule); jsgf_grammar_free(jsgf); return -1; } } else { rule = jsgf_get_public_rule(jsgf); if (rule == NULL) { E_ERROR("No public rules found in %s\n", path); jsgf_grammar_free(jsgf); return -1; } } lw = cmd_ln_float32_r(ps->config, "-lw"); fsg = jsgf_build_fsg(jsgf, rule, ps->lmath, lw); result = ps_set_fsg(ps, name, fsg); fsg_model_free(fsg); jsgf_grammar_free(jsgf); return result; } int ps_set_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string) { fsg_model_t *fsg; jsgf_rule_t *rule; char const *toprule; jsgf_t *jsgf = jsgf_parse_string(jsgf_string, NULL); float lw; int result; if (!jsgf) return -1; rule = NULL; /* Take the -toprule if specified. */ if ((toprule = cmd_ln_str_r(ps->config, "-toprule"))) { rule = jsgf_get_rule(jsgf, toprule); if (rule == NULL) { E_ERROR("Start rule %s not found\n", toprule); return -1; } } else { rule = jsgf_get_public_rule(jsgf); if (rule == NULL) { E_ERROR("No public rules found in input string\n"); return -1; } } lw = cmd_ln_float32_r(ps->config, "-lw"); fsg = jsgf_build_fsg(jsgf, rule, ps->lmath, lw); result = ps_set_fsg(ps, name, fsg); fsg_model_free(fsg); return result; } int ps_load_dict(ps_decoder_t *ps, char const *dictfile, char const *fdictfile, char const *format) { dict2pid_t *d2p; dict_t *dict; hash_iter_t *search_it; cmd_ln_t *newconfig; /* Create a new scratch config to load this dict (so existing one * won't be affected if it fails) */ newconfig = cmd_ln_init(NULL, ps_args(), TRUE, NULL); cmd_ln_set_boolean_r(newconfig, "-dictcase", cmd_ln_boolean_r(ps->config, "-dictcase")); cmd_ln_set_str_r(newconfig, "-dict", dictfile); if (fdictfile) cmd_ln_set_str_extra_r(newconfig, "_fdict", fdictfile); else cmd_ln_set_str_extra_r(newconfig, "_fdict", cmd_ln_str_r(ps->config, "_fdict")); /* Try to load it. */ if ((dict = dict_init(newconfig, ps->acmod->mdef)) == NULL) { cmd_ln_free_r(newconfig); return -1; } /* Reinit the dict2pid. */ if ((d2p = dict2pid_build(ps->acmod->mdef, dict)) == NULL) { cmd_ln_free_r(newconfig); return -1; } /* Success! Update the existing config to reflect new dicts and * drop everything into place. */ cmd_ln_free_r(newconfig); dict_free(ps->dict); ps->dict = dict; dict2pid_free(ps->d2p); ps->d2p = d2p; /* And tell all searches to reconfigure themselves. */ for (search_it = hash_table_iter(ps->searches); search_it; search_it = hash_table_iter_next(search_it)) { if (ps_search_reinit(hash_entry_val(search_it->ent), dict, d2p) < 0) { hash_table_iter_free(search_it); return -1; } } return 0; } int ps_save_dict(ps_decoder_t *ps, char const *dictfile, char const *format) { return dict_write(ps->dict, dictfile, format); } int ps_add_word(ps_decoder_t *ps, char const *word, char const *phones, int update) { int32 wid; s3cipid_t *pron; hash_iter_t *search_it; char **phonestr, *tmp; int np, i, rv; /* Parse phones into an array of phone IDs. */ tmp = ckd_salloc(phones); np = str2words(tmp, NULL, 0); phonestr = ckd_calloc(np, sizeof(*phonestr)); str2words(tmp, phonestr, np); pron = ckd_calloc(np, sizeof(*pron)); for (i = 0; i < np; ++i) { pron[i] = bin_mdef_ciphone_id(ps->acmod->mdef, phonestr[i]); if (pron[i] == -1) { E_ERROR("Unknown phone %s in phone string %s\n", phonestr[i], tmp); ckd_free(phonestr); ckd_free(tmp); ckd_free(pron); return -1; } } /* No longer needed. */ ckd_free(phonestr); ckd_free(tmp); /* Add it to the dictionary. */ if ((wid = dict_add_word(ps->dict, word, pron, np)) == -1) { ckd_free(pron); return -1; } /* No longer needed. */ ckd_free(pron); /* Now we also have to add it to dict2pid. */ dict2pid_add_word(ps->d2p, wid); /* TODO: we definitely need to refactor this */ for (search_it = hash_table_iter(ps->searches); search_it; search_it = hash_table_iter_next(search_it)) { ps_search_t *search = hash_entry_val(search_it->ent); if (!strcmp(PS_SEARCH_TYPE_NGRAM, ps_search_type(search))) { ngram_model_t *lmset = ((ngram_search_t *) search)->lmset; if (ngram_model_add_word(lmset, word, 1.0) == NGRAM_INVALID_WID) { hash_table_iter_free(search_it); return -1; } } if (update) { if ((rv = ps_search_reinit(search, ps->dict, ps->d2p) < 0)) { hash_table_iter_free(search_it); return rv; } } } /* Rebuild the widmap and search tree if requested. */ return wid; } char * ps_lookup_word(ps_decoder_t *ps, const char *word) { s3wid_t wid; int32 phlen, j; char *phones; dict_t *dict = ps->dict; wid = dict_wordid(dict, word); if (wid == BAD_S3WID) return NULL; for (phlen = j = 0; j < dict_pronlen(dict, wid); ++j) phlen += strlen(dict_ciphone_str(dict, wid, j)) + 1; phones = ckd_calloc(1, phlen); for (j = 0; j < dict_pronlen(dict, wid); ++j) { strcat(phones, dict_ciphone_str(dict, wid, j)); if (j != dict_pronlen(dict, wid) - 1) strcat(phones, " "); } return phones; } long ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, long maxsamps) { int16 *data; long total, pos, endpos; ps_start_stream(ps); ps_start_utt(ps); /* If this file is seekable or maxsamps is specified, then decode * the whole thing at once. */ if (maxsamps != -1) { data = ckd_calloc(maxsamps, sizeof(*data)); total = fread(data, sizeof(*data), maxsamps, rawfh); ps_process_raw(ps, data, total, FALSE, TRUE); ckd_free(data); } else if ((pos = ftell(rawfh)) >= 0) { fseek(rawfh, 0, SEEK_END); endpos = ftell(rawfh); fseek(rawfh, pos, SEEK_SET); maxsamps = endpos - pos; data = ckd_calloc(maxsamps, sizeof(*data)); total = fread(data, sizeof(*data), maxsamps, rawfh); ps_process_raw(ps, data, total, FALSE, TRUE); ckd_free(data); } else { /* Otherwise decode it in a stream. */ total = 0; while (!feof(rawfh)) { int16 data[256]; size_t nread; nread = fread(data, sizeof(*data), sizeof(data)/sizeof(*data), rawfh); ps_process_raw(ps, data, nread, FALSE, FALSE); total += nread; } } ps_end_utt(ps); return total; } int ps_start_stream(ps_decoder_t *ps) { acmod_start_stream(ps->acmod); return 0; } int ps_start_utt(ps_decoder_t *ps) { int rv; char uttid[16]; if (ps->acmod->state == ACMOD_STARTED || ps->acmod->state == ACMOD_PROCESSING) { E_ERROR("Utterance already started\n"); return -1; } if (ps->search == NULL) { E_ERROR("No search module is selected, did you forget to " "specify a language model or grammar?\n"); return -1; } ptmr_reset(&ps->perf); ptmr_start(&ps->perf); sprintf(uttid, "%09u", ps->uttno); ++ps->uttno; /* Remove any residual word lattice and hypothesis. */ ps_lattice_free(ps->search->dag); ps->search->dag = NULL; ps->search->last_link = NULL; ps->search->post = 0; ckd_free(ps->search->hyp_str); ps->search->hyp_str = NULL; if ((rv = acmod_start_utt(ps->acmod)) < 0) return rv; /* Start logging features and audio if requested. */ if (ps->mfclogdir) { char *logfn = string_join(ps->mfclogdir, "/", uttid, ".mfc", NULL); FILE *mfcfh; E_INFO("Writing MFCC file: %s\n", logfn); if ((mfcfh = fopen(logfn, "wb")) == NULL) { E_ERROR_SYSTEM("Failed to open MFCC file %s", logfn); ckd_free(logfn); return -1; } ckd_free(logfn); acmod_set_mfcfh(ps->acmod, mfcfh); } if (ps->rawlogdir) { char *logfn = string_join(ps->rawlogdir, "/", uttid, ".raw", NULL); FILE *rawfh; E_INFO("Writing raw audio file: %s\n", logfn); if ((rawfh = fopen(logfn, "wb")) == NULL) { E_ERROR_SYSTEM("Failed to open raw audio file %s", logfn); ckd_free(logfn); return -1; } ckd_free(logfn); acmod_set_rawfh(ps->acmod, rawfh); } if (ps->senlogdir) { char *logfn = string_join(ps->senlogdir, "/", uttid, ".sen", NULL); FILE *senfh; E_INFO("Writing senone score file: %s\n", logfn); if ((senfh = fopen(logfn, "wb")) == NULL) { E_ERROR_SYSTEM("Failed to open senone score file %s", logfn); ckd_free(logfn); return -1; } ckd_free(logfn); acmod_set_senfh(ps->acmod, senfh); } /* Start auxiliary phone loop search. */ if (ps->phone_loop) ps_search_start(ps->phone_loop); return ps_search_start(ps->search); } static int ps_search_forward(ps_decoder_t *ps) { int nfr; nfr = 0; while (ps->acmod->n_feat_frame > 0) { int k; if (ps->pl_window > 0) if ((k = ps_search_step(ps->phone_loop, ps->acmod->output_frame)) < 0) return k; if (ps->acmod->output_frame >= ps->pl_window) if ((k = ps_search_step(ps->search, ps->acmod->output_frame - ps->pl_window)) < 0) return k; acmod_advance(ps->acmod); ++ps->n_frame; ++nfr; } return nfr; } int ps_decode_senscr(ps_decoder_t *ps, FILE *senfh) { int nfr, n_searchfr; ps_start_utt(ps); n_searchfr = 0; acmod_set_insenfh(ps->acmod, senfh); while ((nfr = acmod_read_scores(ps->acmod)) > 0) { if ((nfr = ps_search_forward(ps)) < 0) { ps_end_utt(ps); return nfr; } n_searchfr += nfr; } ps_end_utt(ps); acmod_set_insenfh(ps->acmod, NULL); return n_searchfr; } int ps_process_raw(ps_decoder_t *ps, int16 const *data, size_t n_samples, int no_search, int full_utt) { int n_searchfr = 0; if (ps->acmod->state == ACMOD_IDLE) { E_ERROR("Failed to process data, utterance is not started. Use start_utt to start it\n"); return 0; } if (no_search) acmod_set_grow(ps->acmod, TRUE); while (n_samples) { int nfr; /* Process some data into features. */ if ((nfr = acmod_process_raw(ps->acmod, &data, &n_samples, full_utt)) < 0) return nfr; /* Score and search as much data as possible */ if (no_search) continue; if ((nfr = ps_search_forward(ps)) < 0) return nfr; n_searchfr += nfr; } return n_searchfr; } int ps_process_cep(ps_decoder_t *ps, mfcc_t **data, int32 n_frames, int no_search, int full_utt) { int n_searchfr = 0; if (no_search) acmod_set_grow(ps->acmod, TRUE); while (n_frames) { int nfr; /* Process some data into features. */ if ((nfr = acmod_process_cep(ps->acmod, &data, &n_frames, full_utt)) < 0) return nfr; /* Score and search as much data as possible */ if (no_search) continue; if ((nfr = ps_search_forward(ps)) < 0) return nfr; n_searchfr += nfr; } return n_searchfr; } int ps_end_utt(ps_decoder_t *ps) { int rv, i; if (ps->acmod->state == ACMOD_ENDED || ps->acmod->state == ACMOD_IDLE) { E_ERROR("Utterance is not started\n"); return -1; } acmod_end_utt(ps->acmod); /* Search any remaining frames. */ if ((rv = ps_search_forward(ps)) < 0) { ptmr_stop(&ps->perf); return rv; } /* Finish phone loop search. */ if (ps->phone_loop) { if ((rv = ps_search_finish(ps->phone_loop)) < 0) { ptmr_stop(&ps->perf); return rv; } } /* Search any frames remaining in the lookahead window. */ if (ps->acmod->output_frame >= ps->pl_window) { for (i = ps->acmod->output_frame - ps->pl_window; i < ps->acmod->output_frame; ++i) ps_search_step(ps->search, i); } /* Finish main search. */ if ((rv = ps_search_finish(ps->search)) < 0) { ptmr_stop(&ps->perf); return rv; } ptmr_stop(&ps->perf); /* Log a backtrace if requested. */ if (cmd_ln_boolean_r(ps->config, "-backtrace")) { const char* hyp; ps_seg_t *seg; int32 score; hyp = ps_get_hyp(ps, &score); if (hyp != NULL) { E_INFO("%s (%d)\n", hyp, score); E_INFO_NOFN("%-20s %-5s %-5s %-5s %-10s %-10s %-3s\n", "word", "start", "end", "pprob", "ascr", "lscr", "lback"); for (seg = ps_seg_iter(ps); seg; seg = ps_seg_next(seg)) { char const *word; int sf, ef; int32 post, lscr, ascr, lback; word = ps_seg_word(seg); ps_seg_frames(seg, &sf, &ef); post = ps_seg_prob(seg, &ascr, &lscr, &lback); E_INFO_NOFN("%-20s %-5d %-5d %-1.3f %-10d %-10d %-3d\n", word, sf, ef, logmath_exp(ps_get_logmath(ps), post), ascr, lscr, lback); } } } return rv; } char const * ps_get_hyp(ps_decoder_t *ps, int32 *out_best_score) { char const *hyp; ptmr_start(&ps->perf); hyp = ps_search_hyp(ps->search, out_best_score); ptmr_stop(&ps->perf); return hyp; } int32 ps_get_prob(ps_decoder_t *ps) { int32 prob; ptmr_start(&ps->perf); prob = ps_search_prob(ps->search); ptmr_stop(&ps->perf); return prob; } ps_seg_t * ps_seg_iter(ps_decoder_t *ps) { ps_seg_t *itor; ptmr_start(&ps->perf); itor = ps_search_seg_iter(ps->search); ptmr_stop(&ps->perf); return itor; } ps_seg_t * ps_seg_next(ps_seg_t *seg) { return ps_search_seg_next(seg); } char const * ps_seg_word(ps_seg_t *seg) { return seg->word; } void ps_seg_frames(ps_seg_t *seg, int *out_sf, int *out_ef) { int uf; uf = acmod_stream_offset(seg->search->acmod); if (out_sf) *out_sf = seg->sf + uf; if (out_ef) *out_ef = seg->ef + uf; } int32 ps_seg_prob(ps_seg_t *seg, int32 *out_ascr, int32 *out_lscr, int32 *out_lback) { if (out_ascr) *out_ascr = seg->ascr; if (out_lscr) *out_lscr = seg->lscr; if (out_lback) *out_lback = seg->lback; return seg->prob; } void ps_seg_free(ps_seg_t *seg) { ps_search_seg_free(seg); } ps_lattice_t * ps_get_lattice(ps_decoder_t *ps) { return ps_search_lattice(ps->search); } ps_nbest_t * ps_nbest(ps_decoder_t *ps) { ps_lattice_t *dag; ngram_model_t *lmset; ps_astar_t *nbest; float32 lwf; if (ps->search == NULL) return NULL; if ((dag = ps_get_lattice(ps)) == NULL) return NULL; /* FIXME: This is all quite specific to N-Gram search. Either we * should make N-best a method for each search module or it needs * to be abstracted to work for N-Gram and FSG. */ if (0 != strcmp(ps_search_type(ps->search), PS_SEARCH_TYPE_NGRAM)) { lmset = NULL; lwf = 1.0f; } else { lmset = ((ngram_search_t *)ps->search)->lmset; lwf = ((ngram_search_t *)ps->search)->bestpath_fwdtree_lw_ratio; } nbest = ps_astar_start(dag, lmset, lwf, 0, -1, -1, -1); nbest = ps_nbest_next(nbest); return (ps_nbest_t *)nbest; } void ps_nbest_free(ps_nbest_t *nbest) { ps_astar_finish(nbest); } ps_nbest_t * ps_nbest_next(ps_nbest_t *nbest) { ps_latpath_t *next; next = ps_astar_next(nbest); if (next == NULL) { ps_nbest_free(nbest); return NULL; } return nbest; } char const * ps_nbest_hyp(ps_nbest_t *nbest, int32 *out_score) { assert(nbest != NULL); if (nbest->top == NULL) return NULL; if (out_score) *out_score = nbest->top->score; return ps_astar_hyp(nbest, nbest->top); } ps_seg_t * ps_nbest_seg(ps_nbest_t *nbest) { if (nbest->top == NULL) return NULL; return ps_astar_seg_iter(nbest, nbest->top, 1.0); } int ps_get_n_frames(ps_decoder_t *ps) { return ps->acmod->output_frame + 1; } void ps_get_utt_time(ps_decoder_t *ps, double *out_nspeech, double *out_ncpu, double *out_nwall) { int32 frate; frate = cmd_ln_int32_r(ps->config, "-frate"); *out_nspeech = (double)ps->acmod->output_frame / frate; *out_ncpu = ps->perf.t_cpu; *out_nwall = ps->perf.t_elapsed; } void ps_get_all_time(ps_decoder_t *ps, double *out_nspeech, double *out_ncpu, double *out_nwall) { int32 frate; frate = cmd_ln_int32_r(ps->config, "-frate"); *out_nspeech = (double)ps->n_frame / frate; *out_ncpu = ps->perf.t_tot_cpu; *out_nwall = ps->perf.t_tot_elapsed; } uint8 ps_get_in_speech(ps_decoder_t *ps) { return fe_get_vad_state(ps->acmod->fe); } void ps_search_init(ps_search_t *search, ps_searchfuncs_t *vt, const char *type, const char *name, cmd_ln_t *config, acmod_t *acmod, dict_t *dict, dict2pid_t *d2p) { search->vt = vt; search->name = ckd_salloc(name); search->type = ckd_salloc(type); search->config = config; search->acmod = acmod; if (d2p) search->d2p = dict2pid_retain(d2p); else search->d2p = NULL; if (dict) { search->dict = dict_retain(dict); search->start_wid = dict_startwid(dict); search->finish_wid = dict_finishwid(dict); search->silence_wid = dict_silwid(dict); search->n_words = dict_size(dict); } else { search->dict = NULL; search->start_wid = search->finish_wid = search->silence_wid = -1; search->n_words = 0; } } void ps_search_base_free(ps_search_t *search) { /* FIXME: We will have refcounting on acmod, config, etc, at which * point we will free them here too. */ ckd_free(search->name); ckd_free(search->type); dict_free(search->dict); dict2pid_free(search->d2p); ckd_free(search->hyp_str); ps_lattice_free(search->dag); } void ps_search_base_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) { dict_free(search->dict); dict2pid_free(search->d2p); /* FIXME: _retain() should just return NULL if passed NULL. */ if (dict) { search->dict = dict_retain(dict); search->start_wid = dict_startwid(dict); search->finish_wid = dict_finishwid(dict); search->silence_wid = dict_silwid(dict); search->n_words = dict_size(dict); } else { search->dict = NULL; search->start_wid = search->finish_wid = search->silence_wid = -1; search->n_words = 0; } if (d2p) search->d2p = dict2pid_retain(d2p); else search->d2p = NULL; } void ps_set_rawdata_size(ps_decoder_t *ps, int32 size) { acmod_set_rawdata_size(ps->acmod, size); } void ps_get_rawdata(ps_decoder_t *ps, int16 **buffer, int32 *size) { acmod_get_rawdata(ps->acmod, buffer, size); } pocketsphinx-5prealpha/src/libpocketsphinx/mdef.h0000664000175000017500000002363712771605033017477 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * mdef.h -- HMM model definition: base (CI) phones and triphones * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1999 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** */ #ifndef __MDEF_H__ #define __MDEF_H__ /* System headers. */ #include /* SphinxBase headers. */ #include #ifdef __cplusplus extern "C" { #endif /** \file mdef.h * \brief Model definition */ /** \enum word_posn_t * \brief Union of different type of word position */ typedef enum { WORD_POSN_INTERNAL = 0, /**< Internal phone of word */ WORD_POSN_BEGIN = 1, /**< Beginning phone of word */ WORD_POSN_END = 2, /**< Ending phone of word */ WORD_POSN_SINGLE = 3, /**< Single phone word (i.e. begin & end) */ WORD_POSN_UNDEFINED = 4 /**< Undefined value, used for initial conditions, etc */ } word_posn_t; #define N_WORD_POSN 4 /**< total # of word positions (excluding undefined) */ #define WPOS_NAME "ibesu" /**< Printable code for each word position above */ #define S3_SILENCE_CIPHONE "SIL" /**< Hard-coded silence CI phone name */ /** \struct ciphone_t \brief CI phone information */ typedef struct { char *name; /**< The name of the CI phone */ int32 filler; /**< Whether a filler phone; if so, can be substituted by silence phone in left or right context position */ } ciphone_t; /** * \struct phone_t * \brief Triphone information, including base phones as a subset. For the latter, lc, rc and wpos are non-existent. */ typedef struct { int32 ssid; /**< State sequence (or senone sequence) ID, considering the n_emit_state senone-ids are a unit. The senone sequences themselves are in a separate table */ int32 tmat; /**< Transition matrix id */ int16 ci, lc, rc; /**< Base, left, right context ciphones */ word_posn_t wpos; /**< Word position */ } phone_t; /** * \struct ph_rc_t * \brief Structures needed for mapping into pid. (See mdef_t.wpos_ci_lclist below.) (lc = left context; rc = right context.) * NOTE: Both ph_rc_t and ph_lc_t FOR INTERNAL USE ONLY. */ typedef struct ph_rc_s { int16 rc; /**< Specific rc for a parent */ int32 pid; /**< Triphone id for above rc instance */ struct ph_rc_s *next; /**< Next rc entry for same parent */ } ph_rc_t; /** * \struct ph_lc_t * \brief Structures for storing the left context. */ typedef struct ph_lc_s { int16 lc; /**< Specific lc for a parent */ ph_rc_t *rclist; /**< rc list for above lc instance */ struct ph_lc_s *next; /**< Next lc entry for same parent */ } ph_lc_t; /** The main model definition structure */ /** \struct mdef_t \brief strcture for storing the model definition. */ typedef struct { int32 n_ciphone; /**< number basephones actually present */ int32 n_phone; /**< number basephones + number triphones actually present */ int32 n_emit_state; /**< number emitting states per phone */ int32 n_ci_sen; /**< number CI senones; these are the first */ int32 n_sen; /**< number senones (CI+CD) */ int32 n_tmat; /**< number transition matrices */ hash_table_t *ciphone_ht; /**< Hash table for mapping ciphone strings to ids */ ciphone_t *ciphone; /**< CI-phone information for all ciphones */ phone_t *phone; /**< Information for all ciphones and triphones */ uint16 **sseq; /**< Unique state (or senone) sequences in this model, shared among all phones/triphones */ int32 n_sseq; /**< No. of unique senone sequences in this model */ int16 *cd2cisen; /**< Parent CI-senone id for each senone; the first n_ci_sen are identity mappings; the CD-senones are contiguous for each parent CI-phone */ int16 *sen2cimap; /**< Parent CI-phone for each senone (CI or CD) */ int16 sil; /**< SILENCE_CIPHONE id */ ph_lc_t ***wpos_ci_lclist; /**< wpos_ci_lclist[wpos][ci] = list of lc for . wpos_ci_lclist[wpos][ci][lc].rclist = list of rc for . Only entries for the known triphones are created to conserve space. (NOTE: FOR INTERNAL USE ONLY.) */ } mdef_t; /** Access macros; not meant for arbitrary use */ #define mdef_is_fillerphone(m,p) ((m)->ciphone[p].filler) #define mdef_n_ciphone(m) ((m)->n_ciphone) #define mdef_n_phone(m) ((m)->n_phone) #define mdef_n_sseq(m) ((m)->n_sseq) #define mdef_n_emit_state(m) ((m)->n_emit_state) #define mdef_n_sen(m) ((m)->n_sen) #define mdef_n_tmat(m) ((m)->n_tmat) #define mdef_pid2ssid(m,p) ((m)->phone[p].ssid) #define mdef_pid2tmatid(m,p) ((m)->phone[p].tmat) #define mdef_silphone(m) ((m)->sil) #define mdef_sen2cimap(m) ((m)->sen2cimap) #define mdef_sseq2sen(m,ss,pos) ((m)->sseq[ss][pos]) #define mdef_pid2ci(m,p) ((m)->phone[p].ci) #define mdef_cd2cisen(m) ((m)->cd2cisen) /** * Initialize the phone structure from the given model definition file. * It should be treated as a READ-ONLY structure. * @return pointer to the phone structure created. */ mdef_t *mdef_init (char *mdeffile, /**< In: Model definition file */ int breport /**< In: whether to report the progress or not */ ); /** Get the ciphone id given a string name @return ciphone id for the given ciphone string name */ int mdef_ciphone_id(mdef_t *m, /**< In: Model structure being queried */ char *ciphone /**< In: ciphone for which id wanted */ ); /** Get the phone string given the ci phone id. @return: READ-ONLY ciphone string name for the given ciphone id */ const char *mdef_ciphone_str(mdef_t *m, /**< In: Model structure being queried */ int ci /**< In: ciphone id for which name wanted */ ); /** Decide whether the phone is ci phone. @return 1 if given triphone argument is a ciphone, 0 if not, -1 if error */ int mdef_is_ciphone (mdef_t *m, /**< In: Model structure being queried */ int p /**< In: triphone id being queried */ ); /** Decide whether the senone is a senone for a ci phone, or a ci senone @return 1 if a given senone is a ci senone */ int mdef_is_cisenone(mdef_t *m, /**< In: Model structure being queried */ int s /**< In: senone id being queried */ ); /** Decide the phone id given the left, right and base phones. @return: phone id for the given constituents if found, else BAD_S3PID */ int mdef_phone_id (mdef_t *m, /**< In: Model structure being queried */ int b, /**< In: base ciphone id */ int l, /**< In: left context ciphone id */ int r, /**< In: right context ciphone id */ word_posn_t pos /**< In: Word position */ ); /** * Create a phone string for the given phone (base or triphone) id in the given buf. * @return 0 if successful, -1 if error. */ int mdef_phone_str(mdef_t *m, /**< In: Model structure being queried */ int pid, /**< In: phone id being queried */ char *buf /**< Out: On return, buf has the string */ ); /** * Compare the underlying HMMs for two given phones (i.e., compare the two transition * matrix IDs and the individual state(senone) IDs). * @return 0 iff the HMMs are identical, -1 otherwise. */ int mdef_hmm_cmp (mdef_t *m, /**< In: Model being queried */ int p1, /**< In: One of the two triphones being compared */ int p2 /**< In: One of the two triphones being compared */ ); /** Report the model definition's parameters */ void mdef_report(mdef_t *m /**< In: model definition structure */ ); /** RAH, For freeing memory */ void mdef_free_recursive_lc (ph_lc_t *lc /**< In: A list of left context */ ); void mdef_free_recursive_rc (ph_rc_t *rc /**< In: A list of right context */ ); /** Free an mdef_t */ void mdef_free (mdef_t *mdef /**< In : The model definition*/ ); #ifdef __cplusplus } #endif #endif pocketsphinx-5prealpha/src/libpocketsphinx/fsg_lextree.h0000664000175000017500000002301412771605033021060 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2013 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * fsg_lextree.h -- The collection of all the lextrees for the entire FSM. * */ #ifndef __S2_FSG_LEXTREE_H__ #define __S2_FSG_LEXTREE_H__ /* SphinxBase headers. */ #include #include /* Local headers. */ #include "hmm.h" #include "dict.h" #include "dict2pid.h" /* * Compile-time constant determining the size of the * bitvector fsg_pnode_t.fsg_pnode_ctxt_t.bv. (See below.) * But it makes memory allocation simpler and more efficient. * Make it smaller (2) to save memory if your phoneset has less than * 64 phones. */ #define FSG_PNODE_CTXT_BVSZ 4 typedef struct { uint32 bv[FSG_PNODE_CTXT_BVSZ]; } fsg_pnode_ctxt_t; /* * All transitions (words) out of any given FSG state represented are by a * phonetic prefix lextree (except for epsilon or null transitions; they * are not part of the lextree). Lextree leaf nodes represent individual * FSG transitions, so no sharing is allowed at the leaf nodes. The FSG * transition probs are distributed along the lextree: the prob at a node * is the max of the probs of all leaf nodes (and, hence, FSG transitions) * reachable from that node. * * To conserve memory, the underlying HMMs with state-level information are * allocated only as needed. Root and leaf nodes must also account for all * the possible phonetic contexts, with an independent HMM for each distinct * context. */ typedef struct fsg_pnode_s { /* * If this is not a leaf node, the first successor (child) node. Otherwise * the parent FSG transition for which this is the leaf node (for figuring * the FSG destination state, and word emitted by the transition). A node * may have several children. The succ ptr gives just the first; the rest * are linked via the sibling ptr below. */ union { struct fsg_pnode_s *succ; fsg_link_t *fsglink; } next; /* * For simplicity of memory management (i.e., freeing the pnodes), all * pnodes allocated for all transitions out of a state are maintained in a * linear linked list through the alloc_next pointer. */ struct fsg_pnode_s *alloc_next; /* * The next node that is also a child of the parent of this node; NULL if * none. */ struct fsg_pnode_s *sibling; /* * The transition (log) probability to be incurred upon transitioning to * this node. (Transition probabilities are really associated with the * transitions. But a lextree node has exactly one incoming transition. * Hence, the prob can be associated with the node.) * This is a logs2(prob) value, and includes the language weight. */ int32 logs2prob; /* * The root and leaf positions associated with any transition have to deal * with multiple phonetic contexts. However, different contexts may result * in the same SSID (senone-seq ID), and can share a single pnode with that * SSID. But the pnode should track the set of context CI phones that share * it. Hence the fsg_pnode_ctxt_t bit-vector set-representation. (For * simplicity of implementation, its size is a compile-time constant for * now.) Single phone words would need a 2-D array of context, but that's * too expensive. For now, they simply use SIL as right context, so only * the left context is properly modelled. * (For word-internal phones, this field is unused, of course.) */ fsg_pnode_ctxt_t ctxt; uint16 ci_ext; /* This node's CIphone as viewed externally (context) */ uint8 ppos; /* Phoneme position in pronunciation */ uint8 leaf; /* Whether this is a leaf node */ /* HMM-state-level stuff here */ hmm_context_t *ctx; hmm_t hmm; } fsg_pnode_t; /* Access macros */ #define fsg_pnode_leaf(p) ((p)->leaf) #define fsg_pnode_logs2prob(p) ((p)->logs2prob) #define fsg_pnode_succ(p) ((p)->next.succ) #define fsg_pnode_fsglink(p) ((p)->next.fsglink) #define fsg_pnode_sibling(p) ((p)->sibling) #define fsg_pnode_hmmptr(p) (&((p)->hmm)) #define fsg_pnode_ci_ext(p) ((p)->ci_ext) #define fsg_pnode_ppos(p) ((p)->ppos) #define fsg_pnode_leaf(p) ((p)->leaf) #define fsg_pnode_ctxt(p) ((p)->ctxt) #define fsg_pnode_add_ctxt(p,c) ((p)->ctxt.bv[(c)>>5] |= (1 << ((c)&0x001f))) /* * The following is macroized because its called very frequently * ::: uint32 fsg_pnode_ctxt_sub (fsg_pnode_ctxt_t *src, fsg_pnode_ctxt_t *sub); */ /* * Subtract bitvector sub from bitvector src (src updated with the result). * Return 0 if result is all 0, non-zero otherwise. */ #if (FSG_PNODE_CTXT_BVSZ == 1) #define FSG_PNODE_CTXT_SUB(src,sub) \ ((src)->bv[0] = (~((sub)->bv[0]) & (src)->bv[0])) #elif (FSG_PNODE_CTXT_BVSZ == 2) #define FSG_PNODE_CTXT_SUB(src,sub) \ (((src)->bv[0] = (~((sub)->bv[0]) & (src)->bv[0])) | \ ((src)->bv[1] = (~((sub)->bv[1]) & (src)->bv[1]))) #elif (FSG_PNODE_CTXT_BVSZ == 4) #define FSG_PNODE_CTXT_SUB(src,sub) \ (((src)->bv[0] = (~((sub)->bv[0]) & (src)->bv[0])) | \ ((src)->bv[1] = (~((sub)->bv[1]) & (src)->bv[1])) | \ ((src)->bv[2] = (~((sub)->bv[2]) & (src)->bv[2])) | \ ((src)->bv[3] = (~((sub)->bv[3]) & (src)->bv[3]))) #else #define FSG_PNODE_CTXT_SUB(src,sub) fsg_pnode_ctxt_sub_generic((src),(sub)) #endif /** * Collection of lextrees for an FSG. */ typedef struct fsg_lextree_s { fsg_model_t *fsg; /**< The fsg for which this lextree is built. */ hmm_context_t *ctx; /**< HMM context structure. */ dict_t *dict; /**< Pronunciation dictionary for this FSG. */ dict2pid_t *d2p; /**< Context-dependent phone mappings for this FSG. */ bin_mdef_t *mdef; /**< Model definition (triphone mappings). */ /* * Left and right CIphone sets for each state. * Left context CIphones for a state S: If word W transitions into S, W's * final CIphone is in S's {lc}. Words transitioning out of S must consider * these left context CIphones. * Similarly, right contexts for state S: If word W transitions out of S, * W's first CIphone is in S's {rc}. Words transitioning into S must consider * these right contexts. * * NOTE: Words may transition into and out of S INDIRECTLY, with intermediate * null transitions. * NOTE: Single-phone words are difficult; only SILENCE right context is * modelled for them. * NOTE: Non-silence filler phones aren't included in these sets. Filler * words don't use context, and present the SILENCE phone as context to * adjacent words. */ int16 **lc; /**< Left context triphone mappings for FSG. */ int16 **rc; /**< Right context triphone mappings for FSG. */ fsg_pnode_t **root; /* root[s] = lextree representing all transitions out of state s. Note that the "tree" for each state is actually a collection of trees, linked via fsg_pnode_t.sibling (root[s]->sibling) */ fsg_pnode_t **alloc_head; /* alloc_head[s] = head of linear list of all pnodes allocated for state s */ int32 n_pnode; /* #HMM nodes in search structure */ int32 wip; int32 pip; } fsg_lextree_t; /* Access macros */ #define fsg_lextree_root(lt,s) ((lt)->root[s]) #define fsg_lextree_n_pnode(lt) ((lt)->n_pnode) /** * Create, initialize, and return a new phonetic lextree for the given FSG. */ fsg_lextree_t *fsg_lextree_init(fsg_model_t *fsg, dict_t *dict, dict2pid_t *d2p, bin_mdef_t *mdef, hmm_context_t *ctx, int32 wip, int32 pip); /** * Free lextrees for an FSG. */ void fsg_lextree_free(fsg_lextree_t *fsg); /** * Print an FSG lextree to a file for debugging. */ void fsg_lextree_dump(fsg_lextree_t *fsg, FILE *fh); /** * Mark the given pnode as inactive (for search). */ void fsg_psubtree_pnode_deactivate(fsg_pnode_t *pnode); /** * Set all flags on in the given context bitvector. */ void fsg_pnode_add_all_ctxt(fsg_pnode_ctxt_t *ctxt); /** * Generic variant for arbitrary size */ uint32 fsg_pnode_ctxt_sub_generic(fsg_pnode_ctxt_t *src, fsg_pnode_ctxt_t *sub); #endif pocketsphinx-5prealpha/src/libpocketsphinx/hmm.c0000664000175000017500000005630512771605033017336 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file hmm.h Implementation of HMM base structure. */ /* System headers. */ #include #include #include #include /* SphinxBase headers. */ #include #include /* Local headers. */ #include "hmm.h" hmm_context_t * hmm_context_init(int32 n_emit_state, uint8 ** const *tp, int16 const *senscore, uint16 * const *sseq) { hmm_context_t *ctx; assert(n_emit_state > 0); if (n_emit_state > HMM_MAX_NSTATE) { E_ERROR("Number of emitting states must be <= %d\n", HMM_MAX_NSTATE); return NULL; } ctx = ckd_calloc(1, sizeof(*ctx)); ctx->n_emit_state = n_emit_state; ctx->tp = tp; ctx->senscore = senscore; ctx->sseq = sseq; ctx->st_sen_scr = ckd_calloc(n_emit_state, sizeof(*ctx->st_sen_scr)); return ctx; } void hmm_context_free(hmm_context_t *ctx) { if (ctx == NULL) return; ckd_free(ctx->st_sen_scr); ckd_free(ctx); } void hmm_init(hmm_context_t *ctx, hmm_t *hmm, int mpx, int ssid, int tmatid) { hmm->ctx = ctx; hmm->mpx = mpx; hmm->n_emit_state = ctx->n_emit_state; if (mpx) { int i; hmm->ssid = BAD_SSID; hmm->senid[0] = ssid; for (i = 1; i < hmm_n_emit_state(hmm); ++i) { hmm->senid[i] = BAD_SSID; } } else { hmm->ssid = ssid; memcpy(hmm->senid, ctx->sseq[ssid], hmm->n_emit_state * sizeof(*hmm->senid)); } hmm->tmatid = tmatid; hmm_clear(hmm); } void hmm_deinit(hmm_t *hmm) { } void hmm_dump(hmm_t * hmm, FILE * fp) { int32 i; if (hmm_is_mpx(hmm)) { fprintf(fp, "MPX "); for (i = 0; i < hmm_n_emit_state(hmm); i++) fprintf(fp, " %11d", hmm_senid(hmm, i)); fprintf(fp, " ( "); for (i = 0; i < hmm_n_emit_state(hmm); i++) fprintf(fp, "%d ", hmm_ssid(hmm, i)); fprintf(fp, ")\n"); } else { fprintf(fp, "SSID "); for (i = 0; i < hmm_n_emit_state(hmm); i++) fprintf(fp, " %11d", hmm_senid(hmm, i)); fprintf(fp, " (%d)\n", hmm_ssid(hmm, 0)); } if (hmm->ctx->senscore) { fprintf(fp, "SENSCR"); for (i = 0; i < hmm_n_emit_state(hmm); i++) fprintf(fp, " %11d", hmm_senscr(hmm, i)); fprintf(fp, "\n"); } fprintf(fp, "SCORES %11d", hmm_in_score(hmm)); for (i = 1; i < hmm_n_emit_state(hmm); i++) fprintf(fp, " %11d", hmm_score(hmm, i)); fprintf(fp, " %11d", hmm_out_score(hmm)); fprintf(fp, "\n"); fprintf(fp, "HISTID %11d", hmm_in_history(hmm)); for (i = 1; i < hmm_n_emit_state(hmm); i++) fprintf(fp, " %11d", hmm_history(hmm, i)); fprintf(fp, " %11d", hmm_out_history(hmm)); fprintf(fp, "\n"); if (hmm_in_score(hmm) > 0) fprintf(fp, "ALERT!! The input score %d is large than 0. Probably wrap around.\n", hmm_in_score(hmm)); if (hmm_out_score(hmm) > 0) fprintf(fp, "ALERT!! The output score %d is large than 0. Probably wrap around\n.", hmm_out_score(hmm)); fflush(fp); } void hmm_clear_scores(hmm_t * h) { int32 i; hmm_in_score(h) = WORST_SCORE; for (i = 1; i < hmm_n_emit_state(h); i++) hmm_score(h, i) = WORST_SCORE; hmm_out_score(h) = WORST_SCORE; h->bestscore = WORST_SCORE; } void hmm_clear(hmm_t * h) { int32 i; hmm_in_score(h) = WORST_SCORE; hmm_in_history(h) = -1; for (i = 1; i < hmm_n_emit_state(h); i++) { hmm_score(h, i) = WORST_SCORE; hmm_history(h, i) = -1; } hmm_out_score(h) = WORST_SCORE; hmm_out_history(h) = -1; h->bestscore = WORST_SCORE; h->frame = -1; } void hmm_enter(hmm_t *h, int32 score, int32 histid, int frame) { hmm_in_score(h) = score; hmm_in_history(h) = histid; hmm_frame(h) = frame; } void hmm_normalize(hmm_t *h, int32 bestscr) { int32 i; for (i = 0; i < hmm_n_emit_state(h); i++) { if (hmm_score(h, i) BETTER_THAN WORST_SCORE) hmm_score(h, i) -= bestscr; } if (hmm_out_score(h) BETTER_THAN WORST_SCORE) hmm_out_score(h) -= bestscr; } #define hmm_tprob_5st(i, j) (-tp[(i)*6+(j)]) #define nonmpx_senscr(i) (-senscore[sseq[i]]) static int32 hmm_vit_eval_5st_lr(hmm_t * hmm) { int16 const *senscore = hmm->ctx->senscore; uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; uint16 const *sseq = hmm->senid; int32 s5, s4, s3, s2, s1, s0, t2, t1, t0, bestScore; /* It was the best of scores, it was the worst of scores. */ bestScore = WORST_SCORE; /* Cache problem here! */ s4 = hmm_score(hmm, 4) + nonmpx_senscr(4); s3 = hmm_score(hmm, 3) + nonmpx_senscr(3); /* Transitions into non-emitting state 5 */ if (s3 BETTER_THAN WORST_SCORE) { t1 = s4 + hmm_tprob_5st(4, 5); t2 = s3 + hmm_tprob_5st(3, 5); if (t1 BETTER_THAN t2) { s5 = t1; hmm_out_history(hmm) = hmm_history(hmm, 4); } else { s5 = t2; hmm_out_history(hmm) = hmm_history(hmm, 3); } if (s5 WORSE_THAN WORST_SCORE) s5 = WORST_SCORE; hmm_out_score(hmm) = s5; bestScore = s5; } s2 = hmm_score(hmm, 2) + nonmpx_senscr(2); /* All transitions into state 4 */ if (s2 BETTER_THAN WORST_SCORE) { t0 = s4 + hmm_tprob_5st(4, 4); t1 = s3 + hmm_tprob_5st(3, 4); t2 = s2 + hmm_tprob_5st(2, 4); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); } else s4 = t0; } else { if (t2 BETTER_THAN t1) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); } else { s4 = t1; hmm_history(hmm, 4) = hmm_history(hmm, 3); } } if (s4 WORSE_THAN WORST_SCORE) s4 = WORST_SCORE; if (s4 BETTER_THAN bestScore) bestScore = s4; hmm_score(hmm, 4) = s4; } s1 = hmm_score(hmm, 1) + nonmpx_senscr(1); /* All transitions into state 3 */ if (s1 BETTER_THAN WORST_SCORE) { t0 = s3 + hmm_tprob_5st(3, 3); t1 = s2 + hmm_tprob_5st(2, 3); t2 = s1 + hmm_tprob_5st(1, 3); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); } else s3 = t0; } else { if (t2 BETTER_THAN t1) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); } else { s3 = t1; hmm_history(hmm, 3) = hmm_history(hmm, 2); } } if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; if (s3 BETTER_THAN bestScore) bestScore = s3; hmm_score(hmm, 3) = s3; } s0 = hmm_in_score(hmm) + nonmpx_senscr(0); /* All transitions into state 2 (state 0 is always active) */ t0 = s2 + hmm_tprob_5st(2, 2); t1 = s1 + hmm_tprob_5st(1, 2); t2 = s0 + hmm_tprob_5st(0, 2); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else s2 = t0; } else { if (t2 BETTER_THAN t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); } } if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; if (s2 BETTER_THAN bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* All transitions into state 1 */ t0 = s1 + hmm_tprob_5st(1, 1); t1 = s0 + hmm_tprob_5st(0, 1); if (t0 BETTER_THAN t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); } if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; if (s1 BETTER_THAN bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; /* All transitions into state 0 */ s0 = s0 + hmm_tprob_5st(0, 0); if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; if (s0 BETTER_THAN bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; } #define mpx_senid(st) sseq[ssid[st]][st] #define mpx_senscr(st) (-senscore[mpx_senid(st)]) static int32 hmm_vit_eval_5st_lr_mpx(hmm_t * hmm) { uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; int16 const *senscore = hmm->ctx->senscore; uint16 * const *sseq = hmm->ctx->sseq; uint16 *ssid = hmm->senid; int32 bestScore; int32 s5, s4, s3, s2, s1, s0, t2, t1, t0; /* Don't propagate WORST_SCORE */ if (ssid[4] == BAD_SSID) s4 = t1 = WORST_SCORE; else { s4 = hmm_score(hmm, 4) + mpx_senscr(4); t1 = s4 + hmm_tprob_5st(4, 5); } if (ssid[3] == BAD_SSID) s3 = t2 = WORST_SCORE; else { s3 = hmm_score(hmm, 3) + mpx_senscr(3); t2 = s3 + hmm_tprob_5st(3, 5); } if (t1 BETTER_THAN t2) { s5 = t1; hmm_out_history(hmm) = hmm_history(hmm, 4); } else { s5 = t2; hmm_out_history(hmm) = hmm_history(hmm, 3); } if (s5 WORSE_THAN WORST_SCORE) s5 = WORST_SCORE; hmm_out_score(hmm) = s5; bestScore = s5; /* Don't propagate WORST_SCORE */ if (ssid[2] == BAD_SSID) s2 = t2 = WORST_SCORE; else { s2 = hmm_score(hmm, 2) + mpx_senscr(2); t2 = s2 + hmm_tprob_5st(2, 4); } t0 = t1 = WORST_SCORE; if (s4 != WORST_SCORE) t0 = s4 + hmm_tprob_5st(4, 4); if (s3 != WORST_SCORE) t1 = s3 + hmm_tprob_5st(3, 4); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); ssid[4] = ssid[2]; } else s4 = t0; } else { if (t2 BETTER_THAN t1) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); ssid[4] = ssid[2]; } else { s4 = t1; hmm_history(hmm, 4) = hmm_history(hmm, 3); ssid[4] = ssid[3]; } } if (s4 WORSE_THAN WORST_SCORE) s4 = WORST_SCORE; if (s4 BETTER_THAN bestScore) bestScore = s4; hmm_score(hmm, 4) = s4; /* Don't propagate WORST_SCORE */ if (ssid[1] == BAD_SSID) s1 = t2 = WORST_SCORE; else { s1 = hmm_score(hmm, 1) + mpx_senscr(1); t2 = s1 + hmm_tprob_5st(1, 3); } t0 = t1 = WORST_SCORE; if (s3 != WORST_SCORE) t0 = s3 + hmm_tprob_5st(3, 3); if (s2 != WORST_SCORE) t1 = s2 + hmm_tprob_5st(2, 3); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); ssid[3] = ssid[1]; } else s3 = t0; } else { if (t2 BETTER_THAN t1) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); ssid[3] = ssid[1]; } else { s3 = t1; hmm_history(hmm, 3) = hmm_history(hmm, 2); ssid[3] = ssid[2]; } } if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; if (s3 BETTER_THAN bestScore) bestScore = s3; hmm_score(hmm, 3) = s3; /* State 0 is always active */ s0 = hmm_in_score(hmm) + mpx_senscr(0); /* Don't propagate WORST_SCORE */ t0 = t1 = WORST_SCORE; if (s2 != WORST_SCORE) t0 = s2 + hmm_tprob_5st(2, 2); if (s1 != WORST_SCORE) t1 = s1 + hmm_tprob_5st(1, 2); t2 = s0 + hmm_tprob_5st(0, 2); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else s2 = t0; } else { if (t2 BETTER_THAN t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); ssid[2] = ssid[1]; } } if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; if (s2 BETTER_THAN bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* Don't propagate WORST_SCORE */ t0 = WORST_SCORE; if (s1 != WORST_SCORE) t0 = s1 + hmm_tprob_5st(1, 1); t1 = s0 + hmm_tprob_5st(0, 1); if (t0 BETTER_THAN t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); ssid[1] = ssid[0]; } if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; if (s1 BETTER_THAN bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; s0 += hmm_tprob_5st(0, 0); if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; if (s0 BETTER_THAN bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; } #define hmm_tprob_3st(i, j) (-tp[(i)*4+(j)]) static int32 hmm_vit_eval_3st_lr(hmm_t * hmm) { int16 const *senscore = hmm->ctx->senscore; uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; uint16 const *sseq = hmm->senid; int32 s3, s2, s1, s0, t2, t1, t0, bestScore; s2 = hmm_score(hmm, 2) + nonmpx_senscr(2); s1 = hmm_score(hmm, 1) + nonmpx_senscr(1); s0 = hmm_in_score(hmm) + nonmpx_senscr(0); /* It was the best of scores, it was the worst of scores. */ bestScore = WORST_SCORE; t2 = INT_MIN; /* Not used unless skipstate is true */ /* Transitions into non-emitting state 3 */ if (s1 BETTER_THAN WORST_SCORE) { t1 = s2 + hmm_tprob_3st(2, 3); if (hmm_tprob_3st(1,3) BETTER_THAN TMAT_WORST_SCORE) t2 = s1 + hmm_tprob_3st(1, 3); if (t1 BETTER_THAN t2) { s3 = t1; hmm_out_history(hmm) = hmm_history(hmm, 2); } else { s3 = t2; hmm_out_history(hmm) = hmm_history(hmm, 1); } if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; hmm_out_score(hmm) = s3; bestScore = s3; } /* All transitions into state 2 (state 0 is always active) */ t0 = s2 + hmm_tprob_3st(2, 2); t1 = s1 + hmm_tprob_3st(1, 2); if (hmm_tprob_3st(0, 2) BETTER_THAN TMAT_WORST_SCORE) t2 = s0 + hmm_tprob_3st(0, 2); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else s2 = t0; } else { if (t2 BETTER_THAN t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); } } if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; if (s2 BETTER_THAN bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* All transitions into state 1 */ t0 = s1 + hmm_tprob_3st(1, 1); t1 = s0 + hmm_tprob_3st(0, 1); if (t0 BETTER_THAN t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); } if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; if (s1 BETTER_THAN bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; /* All transitions into state 0 */ s0 = s0 + hmm_tprob_3st(0, 0); if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; if (s0 BETTER_THAN bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; } static int32 hmm_vit_eval_3st_lr_mpx(hmm_t * hmm) { uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; int16 const *senscore = hmm->ctx->senscore; uint16 * const *sseq = hmm->ctx->sseq; uint16 *ssid = hmm->senid; int32 bestScore; int32 s3, s2, s1, s0, t2, t1, t0; /* Don't propagate WORST_SCORE */ t2 = INT_MIN; /* Not used unless skipstate is true */ if (ssid[2] == BAD_SSID) s2 = t1 = WORST_SCORE; else { s2 = hmm_score(hmm, 2) + mpx_senscr(2); t1 = s2 + hmm_tprob_3st(2, 3); } if (ssid[1] == BAD_SSID) s1 = t2 = WORST_SCORE; else { s1 = hmm_score(hmm, 1) + mpx_senscr(1); if (hmm_tprob_3st(1,3) BETTER_THAN TMAT_WORST_SCORE) t2 = s1 + hmm_tprob_3st(1, 3); } if (t1 BETTER_THAN t2) { s3 = t1; hmm_out_history(hmm) = hmm_history(hmm, 2); } else { s3 = t2; hmm_out_history(hmm) = hmm_history(hmm, 1); } if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; hmm_out_score(hmm) = s3; bestScore = s3; /* State 0 is always active */ s0 = hmm_in_score(hmm) + mpx_senscr(0); /* Don't propagate WORST_SCORE */ t0 = t1 = WORST_SCORE; if (s2 != WORST_SCORE) t0 = s2 + hmm_tprob_3st(2, 2); if (s1 != WORST_SCORE) t1 = s1 + hmm_tprob_3st(1, 2); if (hmm_tprob_3st(0,2) BETTER_THAN TMAT_WORST_SCORE) t2 = s0 + hmm_tprob_3st(0, 2); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else s2 = t0; } else { if (t2 BETTER_THAN t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); ssid[2] = ssid[1]; } } if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; if (s2 BETTER_THAN bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* Don't propagate WORST_SCORE */ t0 = WORST_SCORE; if (s1 != WORST_SCORE) t0 = s1 + hmm_tprob_3st(1, 1); t1 = s0 + hmm_tprob_3st(0, 1); if (t0 BETTER_THAN t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); ssid[1] = ssid[0]; } if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; if (s1 BETTER_THAN bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; /* State 0 is always active */ s0 += hmm_tprob_3st(0, 0); if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; if (s0 BETTER_THAN bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; } static int32 hmm_vit_eval_anytopo(hmm_t * hmm) { hmm_context_t *ctx = hmm->ctx; int32 to, from, bestfrom; int32 newscr, scr, bestscr; int final_state; /* Compute previous state-score + observation output prob for each emitting state */ ctx->st_sen_scr[0] = hmm_in_score(hmm) + hmm_senscr(hmm, 0); for (from = 1; from < hmm_n_emit_state(hmm); ++from) { if ((ctx->st_sen_scr[from] = hmm_score(hmm, from) + hmm_senscr(hmm, from)) WORSE_THAN WORST_SCORE) ctx->st_sen_scr[from] = WORST_SCORE; } /* FIXME/TODO: Use the BLAS for all this. */ /* Evaluate final-state first, which does not have a self-transition */ final_state = hmm_n_emit_state(hmm); to = final_state; scr = WORST_SCORE; bestfrom = -1; for (from = to - 1; from >= 0; --from) { if ((hmm_tprob(hmm, from, to) BETTER_THAN TMAT_WORST_SCORE) && ((newscr = ctx->st_sen_scr[from] + hmm_tprob(hmm, from, to)) BETTER_THAN scr)) { scr = newscr; bestfrom = from; } } hmm_out_score(hmm) = scr; if (bestfrom >= 0) hmm_out_history(hmm) = hmm_history(hmm, bestfrom); bestscr = scr; /* Evaluate all other states, which might have self-transitions */ for (to = final_state - 1; to >= 0; --to) { /* Score from self-transition, if any */ scr = (hmm_tprob(hmm, to, to) BETTER_THAN TMAT_WORST_SCORE) ? ctx->st_sen_scr[to] + hmm_tprob(hmm, to, to) : WORST_SCORE; /* Scores from transitions from other states */ bestfrom = -1; for (from = to - 1; from >= 0; --from) { if ((hmm_tprob(hmm, from, to) BETTER_THAN TMAT_WORST_SCORE) && ((newscr = ctx->st_sen_scr[from] + hmm_tprob(hmm, from, to)) BETTER_THAN scr)) { scr = newscr; bestfrom = from; } } /* Update new result for state to */ if (to == 0) { hmm_in_score(hmm) = scr; if (bestfrom >= 0) hmm_in_history(hmm) = hmm_history(hmm, bestfrom); } else { hmm_score(hmm, to) = scr; if (bestfrom >= 0) hmm_history(hmm, to) = hmm_history(hmm, bestfrom); } /* Propagate ssid for multiplex HMMs */ if (bestfrom >= 0 && hmm_is_mpx(hmm)) hmm->senid[to] = hmm->senid[bestfrom]; if (bestscr WORSE_THAN scr) bestscr = scr; } hmm_bestscore(hmm) = bestscr; return bestscr; } int32 hmm_vit_eval(hmm_t * hmm) { if (hmm_is_mpx(hmm)) { if (hmm_n_emit_state(hmm) == 5) return hmm_vit_eval_5st_lr_mpx(hmm); else if (hmm_n_emit_state(hmm) == 3) return hmm_vit_eval_3st_lr_mpx(hmm); else return hmm_vit_eval_anytopo(hmm); } else { if (hmm_n_emit_state(hmm) == 5) return hmm_vit_eval_5st_lr(hmm); else if (hmm_n_emit_state(hmm) == 3) return hmm_vit_eval_3st_lr(hmm); else return hmm_vit_eval_anytopo(hmm); } } int32 hmm_dump_vit_eval(hmm_t * hmm, FILE * fp) { int32 bs = 0; if (fp) { fprintf(fp, "BEFORE:\n"); hmm_dump(hmm, fp); } bs = hmm_vit_eval(hmm); if (fp) { fprintf(fp, "AFTER:\n"); hmm_dump(hmm, fp); } return bs; } pocketsphinx-5prealpha/src/libpocketsphinx/phone_loop_search.h0000664000175000017500000001023612771605033022242 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file phone_loop_search.h Fast and rough context-independent * phoneme loop search. * * This exists for the purposes of phoneme lookahead, and thus it * actually does not do phoneme recognition (it wouldn't be very * accurate anyway). */ #ifndef __PHONE_LOOP_SEARCH_H__ #define __PHONE_LOOP_SEARCH_H__ /* SphinxBase headers. */ #include #include #include #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "hmm.h" /** * Renormalization event. */ struct phone_loop_renorm_s { int frame_idx; /**< Frame of renormalization. */ int32 norm; /**< Normalization constant. */ }; typedef struct phone_loop_renorm_s phone_loop_renorm_t; /** * Phone loop search structure. */ struct phone_loop_search_s { ps_search_t base; /**< Base search structure. */ hmm_t *hmms; /**< Basic HMM structures for CI phones. */ hmm_context_t *hmmctx; /**< HMM context structure. */ int16 frame; /**< Current frame being searched. */ int16 n_phones; /**< Size of phone array. */ int32 **pen_buf; /**< Penalty buffer */ int16 pen_buf_ptr; /**< Pointer for frame to fill in penalty buffer */ int32 *penalties; /**< Penalties for CI phones in current frame */ float64 penalty_weight; /**< Weighting factor for penalties */ int32 best_score; /**< Best Viterbi score in current frame. */ int32 beam; /**< HMM pruning beam width. */ int32 pbeam; /**< Phone exit pruning beam width. */ int32 pip; /**< Phone insertion penalty ("language score"). */ int window; /**< Window size for phoneme lookahead */ glist_t renorm; /**< List of renormalizations. */ }; typedef struct phone_loop_search_s phone_loop_search_t; ps_search_t *phone_loop_search_init(cmd_ln_t *config, acmod_t *acmod, dict_t *dict); /** * Return lookahead heuristic score for a specific phone. */ #define phone_loop_search_score(pls,ci) \ ((pls == NULL) ? 0 : (pls->penalties[ci])) #endif /* __PHONE_LOOP_SEARCH_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/vector.c0000664000175000017500000001015712771605033020052 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * vector.c * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1997 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** * * HISTORY * * 22-Nov-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * Imported from s3.2, for supporting s3 format continuous * acoustic models. * * 10-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * Added vector_accum(), vector_vqlabel(), and vector_vqgen(). * * 09-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * Added vector_is_zero(), vector_cmp(), and vector_dist_eucl(). * Changed the name vector_dist_eval to vector_dist_maha. * * 07-Oct-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * Added distance computation related functions. * * 12-Nov-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * Copied from Eric Thayer. */ /* System headers. */ #include #include #include #include #include /* SphinxBase headers. */ #include #include #include /* Local headers. */ #include "vector.h" #if defined(_WIN32) #define srandom srand #define random rand #endif float64 vector_sum_norm(float32 * vec, int32 len) { float64 sum, f; int32 i; sum = 0.0; for (i = 0; i < len; i++) sum += vec[i]; if (sum != 0.0) { f = 1.0 / sum; for (i = 0; i < len; i++) vec[i] *= f; } return sum; } void vector_floor(float32 * vec, int32 len, float64 flr) { int32 i; for (i = 0; i < len; i++) if (vec[i] < flr) vec[i] = (float32) flr; } void vector_nz_floor(float32 * vec, int32 len, float64 flr) { int32 i; for (i = 0; i < len; i++) if ((vec[i] != 0.0) && (vec[i] < flr)) vec[i] = (float32) flr; } void vector_print(FILE * fp, vector_t v, int32 dim) { int32 i; for (i = 0; i < dim; i++) fprintf(fp, " %11.4e", v[i]); fprintf(fp, "\n"); fflush(fp); } int32 vector_is_zero(float32 * vec, int32 len) { int32 i; for (i = 0; (i < len) && (vec[i] == 0.0); i++); return (i == len); /* TRUE iff all mean values are 0.0 */ } pocketsphinx-5prealpha/src/libpocketsphinx/tmat.h0000664000175000017500000000630212771605033017517 00000000000000/* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ #ifndef _S3_TMAT_H_ #define _S3_TMAT_H_ #include #include /** \file tmat.h * \brief Transition matrix data structure. */ #ifdef __cplusplus extern "C" { #endif /** * \struct tmat_t * \brief Transition matrix data structure. All phone HMMs are assumed to have the same * topology. */ typedef struct { uint8 ***tp; /**< The transition matrices; kept in the same scale as acoustic scores; tp[tmatid][from-state][to-state] */ int16 n_tmat; /**< Number matrices */ int16 n_state; /**< Number source states in matrix (only the emitting states); Number destination states = n_state+1, it includes the exit state */ } tmat_t; /** Initialize transition matrix */ tmat_t *tmat_init (char const *tmatfile,/**< In: input file */ logmath_t *lmath, /**< In: log math parameters */ float64 tpfloor, /**< In: floor value for each non-zero transition probability */ int32 breport /**< In: whether reporting the process of tmat_t */ ); /** Dumping the transition matrix for debugging */ void tmat_dump (tmat_t *tmat, /**< In: transition matrix */ FILE *fp /**< In: file pointer */ ); /** * RAH, add code to remove memory allocated by tmat_init */ void tmat_free (tmat_t *t /**< In: transition matrix */ ); /** * Report the detail of the transition matrix structure. */ void tmat_report(tmat_t *t /**< In: transition matrix*/ ); #ifdef __cplusplus } #endif #endif pocketsphinx-5prealpha/src/libpocketsphinx/ps_mllr.c0000664000175000017500000001262712771605033020224 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2009 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ps_mllr.c Model-space linear transforms for speaker adaptation */ /* System headers. */ #include /* SphinxBase headers. */ #include /* Local headers. */ #include "acmod.h" ps_mllr_t * ps_mllr_read(char const *regmatfile) { ps_mllr_t *mllr; FILE *fp; int n, i, m, j, k; mllr = ckd_calloc(1, sizeof(*mllr)); mllr->refcnt = 1; if ((fp = fopen(regmatfile, "r")) == NULL) { E_ERROR_SYSTEM("Failed to open MLLR file '%s' for reading", regmatfile); goto error_out; } else E_INFO("Reading MLLR transformation file '%s'\n", regmatfile); if ((fscanf(fp, "%d", &n) != 1) || (n < 1)) { E_ERROR("Failed to read number of MLLR classes\n"); goto error_out; } mllr->n_class = n; if ((fscanf(fp, "%d", &n) != 1)) { E_ERROR("Failed to read number of feature streams\n"); goto error_out; } mllr->n_feat = n; mllr->veclen = ckd_calloc(mllr->n_feat, sizeof(*mllr->veclen)); mllr->A = (float32 ****) ckd_calloc(mllr->n_feat, sizeof(float32 **)); mllr->b = (float32 ***) ckd_calloc(mllr->n_feat, sizeof(float32 *)); mllr->h = (float32 ***) ckd_calloc(mllr->n_feat, sizeof(float32 *)); for (i = 0; i < mllr->n_feat; ++i) { if (fscanf(fp, "%d", &n) != 1) { E_ERROR("Failed to read stream length for feature %d\n", i); goto error_out; } mllr->veclen[i] = n; mllr->A[i] = (float32 ***) ckd_calloc_3d(mllr->n_class, mllr->veclen[i], mllr->veclen[i], sizeof(float32)); mllr->b[i] = (float32 **) ckd_calloc_2d(mllr->n_class, mllr->veclen[i], sizeof(float32)); mllr->h[i] = (float32 **) ckd_calloc_2d(mllr->n_class, mllr->veclen[i], sizeof(float32)); for (m = 0; m < mllr->n_class; ++m) { for (j = 0; j < mllr->veclen[i]; ++j) { for (k = 0; k < mllr->veclen[i]; ++k) { if (fscanf(fp, "%f ", &mllr->A[i][m][j][k]) != 1) { E_ERROR("Failed reading MLLR rotation (%d,%d,%d,%d)\n", i, m, j, k); goto error_out; } } } for (j = 0; j < mllr->veclen[i]; ++j) { if (fscanf(fp, "%f ", &mllr->b[i][m][j]) != 1) { E_ERROR("Failed reading MLLR bias (%d,%d,%d)\n", i, m, j); goto error_out; } } for (j = 0; j < mllr->veclen[i]; ++j) { if (fscanf(fp, "%f ", &mllr->h[i][m][j]) != 1) { E_ERROR("Failed reading MLLR variance scale (%d,%d,%d)\n", i, m, j); goto error_out; } } } } fclose(fp); return mllr; error_out: if (fp) fclose(fp); ps_mllr_free(mllr); return NULL; } ps_mllr_t * ps_mllr_retain(ps_mllr_t *mllr) { ++mllr->refcnt; return mllr; } int ps_mllr_free(ps_mllr_t *mllr) { int i; if (mllr == NULL) return 0; if (--mllr->refcnt > 0) return mllr->refcnt; for (i = 0; i < mllr->n_feat; ++i) { if (mllr->A) ckd_free_3d(mllr->A[i]); if (mllr->b) ckd_free_2d(mllr->b[i]); if (mllr->h) ckd_free_2d(mllr->h[i]); } ckd_free(mllr->veclen); ckd_free(mllr->A); ckd_free(mllr->b); ckd_free(mllr->h); ckd_free(mllr); return 0; } pocketsphinx-5prealpha/src/libpocketsphinx/ps_lattice.c0000664000175000017500000016162112771605033020702 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ps_lattice.c Word graph search. */ /* System headers. */ #include #include #include /* SphinxBase headers. */ #include #include #include #include #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "ps_lattice_internal.h" #include "ngram_search.h" #include "dict.h" /* * Create a directed link between "from" and "to" nodes, but if a link already exists, * choose one with the best ascr. */ void ps_lattice_link(ps_lattice_t *dag, ps_latnode_t *from, ps_latnode_t *to, int32 score, int32 ef) { latlink_list_t *fwdlink; /* Look for an existing link between "from" and "to" nodes */ for (fwdlink = from->exits; fwdlink; fwdlink = fwdlink->next) if (fwdlink->link->to == to) break; if (fwdlink == NULL) { latlink_list_t *revlink; ps_latlink_t *link; /* No link between the two nodes; create a new one */ link = listelem_malloc(dag->latlink_alloc); fwdlink = listelem_malloc(dag->latlink_list_alloc); revlink = listelem_malloc(dag->latlink_list_alloc); link->from = from; link->to = to; link->ascr = score; link->ef = ef; link->best_prev = NULL; fwdlink->link = revlink->link = link; fwdlink->next = from->exits; from->exits = fwdlink; revlink->next = to->entries; to->entries = revlink; } else { /* Link already exists; just retain the best ascr */ if (score BETTER_THAN fwdlink->link->ascr) { fwdlink->link->ascr = score; fwdlink->link->ef = ef; } } } void ps_lattice_penalize_fillers(ps_lattice_t *dag, int32 silpen, int32 fillpen) { ps_latnode_t *node; for (node = dag->nodes; node; node = node->next) { latlink_list_t *linklist; if (node != dag->start && node != dag->end && dict_filler_word(dag->dict, node->basewid)) { for (linklist = node->entries; linklist; linklist = linklist->next) linklist->link->ascr += (node->basewid == dag->silence) ? silpen : fillpen; } } } static void delete_node(ps_lattice_t *dag, ps_latnode_t *node) { latlink_list_t *x, *next_x; for (x = node->exits; x; x = next_x) { next_x = x->next; x->link->from = NULL; listelem_free(dag->latlink_list_alloc, x); } for (x = node->entries; x; x = next_x) { next_x = x->next; x->link->to = NULL; listelem_free(dag->latlink_list_alloc, x); } listelem_free(dag->latnode_alloc, node); } static void remove_dangling_links(ps_lattice_t *dag, ps_latnode_t *node) { latlink_list_t *x, *prev_x, *next_x; prev_x = NULL; for (x = node->exits; x; x = next_x) { next_x = x->next; if (x->link->to == NULL) { if (prev_x) prev_x->next = next_x; else node->exits = next_x; listelem_free(dag->latlink_alloc, x->link); listelem_free(dag->latlink_list_alloc, x); } else prev_x = x; } prev_x = NULL; for (x = node->entries; x; x = next_x) { next_x = x->next; if (x->link->from == NULL) { if (prev_x) prev_x->next = next_x; else node->entries = next_x; listelem_free(dag->latlink_alloc, x->link); listelem_free(dag->latlink_list_alloc, x); } else prev_x = x; } } void ps_lattice_delete_unreachable(ps_lattice_t *dag) { ps_latnode_t *node, *prev_node, *next_node; int i; /* Remove unreachable nodes from the list of nodes. */ prev_node = NULL; for (node = dag->nodes; node; node = next_node) { next_node = node->next; if (!node->reachable) { if (prev_node) prev_node->next = next_node; else dag->nodes = next_node; /* Delete this node and NULLify links to it. */ delete_node(dag, node); } else prev_node = node; } /* Remove all links to and from unreachable nodes. */ i = 0; for (node = dag->nodes; node; node = node->next) { /* Assign sequence numbers. */ node->id = i++; /* We should obviously not encounter unreachable nodes here! */ assert(node->reachable); /* Remove all links that go nowhere. */ remove_dangling_links(dag, node); } } int32 ps_lattice_write(ps_lattice_t *dag, char const *filename) { FILE *fp; int32 i; ps_latnode_t *d, *initial, *final; initial = dag->start; final = dag->end; E_INFO("Writing lattice file: %s\n", filename); if ((fp = fopen(filename, "w")) == NULL) { E_ERROR_SYSTEM("Failed to open lattice file '%s' for writing", filename); return -1; } /* Stupid Sphinx-III lattice code expects 'getcwd:' here */ fprintf(fp, "# getcwd: /this/is/bogus\n"); fprintf(fp, "# -logbase %e\n", logmath_get_base(dag->lmath)); fprintf(fp, "#\n"); fprintf(fp, "Frames %d\n", dag->n_frames); fprintf(fp, "#\n"); for (i = 0, d = dag->nodes; d; d = d->next, i++); fprintf(fp, "Nodes %d (NODEID WORD STARTFRAME FIRST-ENDFRAME LAST-ENDFRAME)\n", i); for (i = 0, d = dag->nodes; d; d = d->next, i++) { d->id = i; fprintf(fp, "%d %s %d %d %d ; %d\n", i, dict_wordstr(dag->dict, d->wid), d->sf, d->fef, d->lef, d->node_id); } fprintf(fp, "#\n"); fprintf(fp, "Initial %d\nFinal %d\n", initial->id, final->id); fprintf(fp, "#\n"); /* Don't bother with this, it's not used by anything. */ fprintf(fp, "BestSegAscr %d (NODEID ENDFRAME ASCORE)\n", 0 /* #BPTable entries */ ); fprintf(fp, "#\n"); fprintf(fp, "Edges (FROM-NODEID TO-NODEID ASCORE)\n"); for (d = dag->nodes; d; d = d->next) { latlink_list_t *l; for (l = d->exits; l; l = l->next) { if (l->link->ascr WORSE_THAN WORST_SCORE || l->link->ascr BETTER_THAN 0) continue; fprintf(fp, "%d %d %d\n", d->id, l->link->to->id, l->link->ascr << SENSCR_SHIFT); } } fprintf(fp, "End\n"); fclose(fp); return 0; } int32 ps_lattice_write_htk(ps_lattice_t *dag, char const *filename) { FILE *fp; ps_latnode_t *d, *initial, *final; int32 j, n_links, n_nodes; initial = dag->start; final = dag->end; E_INFO("Writing lattice file: %s\n", filename); if ((fp = fopen(filename, "w")) == NULL) { E_ERROR_SYSTEM("Failed to open lattice file '%s' for writing", filename); return -1; } for (n_links = n_nodes = 0, d = dag->nodes; d; d = d->next) { latlink_list_t *l; if (!d->reachable) continue; d->id = n_nodes; for (l = d->exits; l; l = l->next) { if (l->link->to == NULL || !l->link->to->reachable) continue; if (l->link->ascr WORSE_THAN WORST_SCORE || l->link->ascr BETTER_THAN 0) continue; ++n_links; } ++n_nodes; } fprintf(fp, "# Lattice generated by PocketSphinx\n"); fprintf(fp, "#\n# Header\n#\n"); fprintf(fp, "VERSION=1.0\n"); fprintf(fp, "start=%d\n", initial->id); fprintf(fp, "end=%d\n", final->id); fprintf(fp, "#\n"); fprintf(fp, "N=%d\tL=%d\n", n_nodes, n_links); fprintf(fp, "#\n# Node definitions\n#\n"); for (d = dag->nodes; d; d = d->next) { char const *word = dict_wordstr(dag->dict, d->wid); char const *c = strrchr(word, '('); int altpron = 1; if (!d->reachable) continue; if (c) altpron = atoi(c + 1); word = dict_basestr(dag->dict, d->wid); if (d->wid == dict_startwid(dag->dict)) word = "!SENT_START"; else if (d->wid == dict_finishwid(dag->dict)) word = "!SENT_END"; else if (dict_filler_word(dag->dict, d->wid)) word = "!NULL"; fprintf(fp, "I=%d\tt=%.2f\tW=%s\tv=%d\n", d->id, (double)d->sf / dag->frate, word, altpron); } fprintf(fp, "#\n# Link definitions\n#\n"); for (j = 0, d = dag->nodes; d; d = d->next) { latlink_list_t *l; if (!d->reachable) continue; for (l = d->exits; l; l = l->next) { if (l->link->to == NULL || !l->link->to->reachable) continue; if (l->link->ascr WORSE_THAN WORST_SCORE || l->link->ascr BETTER_THAN 0) continue; fprintf(fp, "J=%d\tS=%d\tE=%d\ta=%f\tp=%g\n", j++, d->id, l->link->to->id, logmath_log_to_ln(dag->lmath, l->link->ascr << SENSCR_SHIFT), logmath_exp(dag->lmath, l->link->alpha + l->link->beta - dag->norm)); } } fclose(fp); return 0; } /* Read parameter from a lattice file*/ static int dag_param_read(lineiter_t *li, char *param) { int32 n; while ((li = lineiter_next(li)) != NULL) { char *c; /* Ignore comments. */ if (li->buf[0] == '#') continue; /* Find the first space. */ c = strchr(li->buf, ' '); if (c == NULL) continue; /* Check that the first field equals param and that there's a number after it. */ if (strncmp(li->buf, param, strlen(param)) == 0 && sscanf(c + 1, "%d", &n) == 1) return n; } return -1; } /* Mark every node that has a path to the argument dagnode as "reachable". */ static void dag_mark_reachable(ps_latnode_t * d) { latlink_list_t *l; d->reachable = 1; for (l = d->entries; l; l = l->next) if (l->link->from && !l->link->from->reachable) dag_mark_reachable(l->link->from); } ps_lattice_t * ps_lattice_read(ps_decoder_t *ps, char const *file) { FILE *fp; int32 ispipe; lineiter_t *line; float64 lb; float32 logratio; ps_latnode_t *tail; ps_latnode_t **darray; ps_lattice_t *dag; int i, k, n_nodes; int32 pip, silpen, fillpen; dag = ckd_calloc(1, sizeof(*dag)); if (ps) { dag->search = ps->search; dag->dict = dict_retain(ps->dict); dag->lmath = logmath_retain(ps->lmath); dag->frate = cmd_ln_int32_r(dag->search->config, "-frate"); } else { dag->dict = dict_init(NULL, NULL); dag->lmath = logmath_init(1.0001, 0, FALSE); dag->frate = 100; } dag->silence = dict_silwid(dag->dict); dag->latnode_alloc = listelem_alloc_init(sizeof(ps_latnode_t)); dag->latlink_alloc = listelem_alloc_init(sizeof(ps_latlink_t)); dag->latlink_list_alloc = listelem_alloc_init(sizeof(latlink_list_t)); dag->refcount = 1; tail = NULL; darray = NULL; E_INFO("Reading DAG file: %s\n", file); if ((fp = fopen_compchk(file, &ispipe)) == NULL) { E_ERROR_SYSTEM("Failed to open DAG file '%s' for reading", file); return NULL; } line = lineiter_start(fp); /* Read and verify logbase (ONE BIG HACK!!) */ if (line == NULL) { E_ERROR("Premature EOF(%s)\n", file); goto load_error; } if (strncmp(line->buf, "# getcwd: ", 10) != 0) { E_ERROR("%s does not begin with '# getcwd: '\n%s", file, line->buf); goto load_error; } if ((line = lineiter_next(line)) == NULL) { E_ERROR("Premature EOF(%s)\n", file); goto load_error; } if ((strncmp(line->buf, "# -logbase ", 11) != 0) || (sscanf(line->buf + 11, "%lf", &lb) != 1)) { E_WARN("%s: Cannot find -logbase in header\n", file); lb = 1.0001; } logratio = 1.0f; if (dag->lmath == NULL) dag->lmath = logmath_init(lb, 0, TRUE); else { float32 pb = logmath_get_base(dag->lmath); if (fabs(lb - pb) >= 0.0001) { E_WARN("Inconsistent logbases: %f vs %f: will compensate\n", lb, pb); logratio = (float32)(log(lb) / log(pb)); E_INFO("Lattice log ratio: %f\n", logratio); } } /* Read Frames parameter */ dag->n_frames = dag_param_read(line, "Frames"); if (dag->n_frames <= 0) { E_ERROR("Frames parameter missing or invalid\n"); goto load_error; } /* Read Nodes parameter */ n_nodes = dag_param_read(line, "Nodes"); if (n_nodes <= 0) { E_ERROR("Nodes parameter missing or invalid\n"); goto load_error; } /* Read nodes */ darray = ckd_calloc(n_nodes, sizeof(*darray)); for (i = 0; i < n_nodes; i++) { ps_latnode_t *d; int32 w; int seqid, sf, fef, lef; char wd[256]; if ((line = lineiter_next(line)) == NULL) { E_ERROR("Premature EOF while loading Nodes(%s)\n", file); goto load_error; } if ((k = sscanf(line->buf, "%d %255s %d %d %d", &seqid, wd, &sf, &fef, &lef)) != 5) { E_ERROR("Cannot parse line: %s, value of count %d\n", line->buf, k); goto load_error; } w = dict_wordid(dag->dict, wd); if (w < 0) { if (dag->search == NULL) { char *ww = ckd_salloc(wd); if (dict_word2basestr(ww) != -1) { if (dict_wordid(dag->dict, ww) == BAD_S3WID) dict_add_word(dag->dict, ww, NULL, 0); } ckd_free(ww); w = dict_add_word(dag->dict, wd, NULL, 0); } if (w < 0) { E_ERROR("Unknown word in line: %s\n", line->buf); goto load_error; } } if (seqid != i) { E_ERROR("Seqno error: %s\n", line->buf); goto load_error; } d = listelem_malloc(dag->latnode_alloc); darray[i] = d; d->wid = w; d->basewid = dict_basewid(dag->dict, w); d->id = seqid; d->sf = sf; d->fef = fef; d->lef = lef; d->reachable = 0; d->exits = d->entries = NULL; d->next = NULL; if (!dag->nodes) dag->nodes = d; else tail->next = d; tail = d; } /* Read initial node ID */ k = dag_param_read(line, "Initial"); if ((k < 0) || (k >= n_nodes)) { E_ERROR("Initial node parameter missing or invalid\n"); goto load_error; } dag->start = darray[k]; /* Read final node ID */ k = dag_param_read(line, "Final"); if ((k < 0) || (k >= n_nodes)) { E_ERROR("Final node parameter missing or invalid\n"); goto load_error; } dag->end = darray[k]; /* Read bestsegscore entries and ignore them. */ if ((k = dag_param_read(line, "BestSegAscr")) < 0) { E_ERROR("BestSegAscr parameter missing\n"); goto load_error; } for (i = 0; i < k; i++) { if ((line = lineiter_next(line)) == NULL) { E_ERROR("Premature EOF while (%s) ignoring BestSegAscr\n", line); goto load_error; } } /* Read in edges. */ while ((line = lineiter_next(line)) != NULL) { if (line->buf[0] == '#') continue; if (0 == strncmp(line->buf, "Edges", 5)) break; } if (line == NULL) { E_ERROR("Edges missing\n"); goto load_error; } while ((line = lineiter_next(line)) != NULL) { int from, to, ascr; ps_latnode_t *pd, *d; if (sscanf(line->buf, "%d %d %d", &from, &to, &ascr) != 3) break; if (ascr WORSE_THAN WORST_SCORE) continue; pd = darray[from]; d = darray[to]; if (logratio != 1.0f) ascr = (int32)(ascr * logratio); ps_lattice_link(dag, pd, d, ascr, d->sf - 1); } if (strcmp(line->buf, "End\n") != 0) { E_ERROR("Terminating 'End' missing\n"); goto load_error; } lineiter_free(line); fclose_comp(fp, ispipe); ckd_free(darray); /* Minor hack: If the final node is a filler word and not , * then set its base word ID to , so that the language model * scores won't be screwed up. */ if (dict_filler_word(dag->dict, dag->end->wid)) dag->end->basewid = dag->search ? ps_search_finish_wid(dag->search) : dict_wordid(dag->dict, S3_FINISH_WORD); /* Mark reachable from dag->end */ dag_mark_reachable(dag->end); /* Free nodes unreachable from dag->end and their links */ ps_lattice_delete_unreachable(dag); if (ps) { /* Build links around silence and filler words, since they do * not exist in the language model. FIXME: This is * potentially buggy, as we already do this before outputing * lattices. */ pip = logmath_log(dag->lmath, cmd_ln_float32_r(ps->config, "-pip")); silpen = pip + logmath_log(dag->lmath, cmd_ln_float32_r(ps->config, "-silprob")); fillpen = pip + logmath_log(dag->lmath, cmd_ln_float32_r(ps->config, "-fillprob")); ps_lattice_penalize_fillers(dag, silpen, fillpen); } return dag; load_error: E_ERROR("Failed to load %s\n", file); lineiter_free(line); if (fp) fclose_comp(fp, ispipe); ckd_free(darray); return NULL; } int ps_lattice_n_frames(ps_lattice_t *dag) { return dag->n_frames; } ps_lattice_t * ps_lattice_init_search(ps_search_t *search, int n_frame) { ps_lattice_t *dag; dag = ckd_calloc(1, sizeof(*dag)); dag->search = search; dag->dict = dict_retain(search->dict); dag->lmath = logmath_retain(search->acmod->lmath); dag->frate = cmd_ln_int32_r(dag->search->config, "-frate"); dag->silence = dict_silwid(dag->dict); dag->n_frames = n_frame; dag->latnode_alloc = listelem_alloc_init(sizeof(ps_latnode_t)); dag->latlink_alloc = listelem_alloc_init(sizeof(ps_latlink_t)); dag->latlink_list_alloc = listelem_alloc_init(sizeof(latlink_list_t)); dag->refcount = 1; return dag; } ps_lattice_t * ps_lattice_retain(ps_lattice_t *dag) { ++dag->refcount; return dag; } int ps_lattice_free(ps_lattice_t *dag) { if (dag == NULL) return 0; if (--dag->refcount > 0) return dag->refcount; logmath_free(dag->lmath); dict_free(dag->dict); listelem_alloc_free(dag->latnode_alloc); listelem_alloc_free(dag->latlink_alloc); listelem_alloc_free(dag->latlink_list_alloc); ckd_free(dag->hyp_str); ckd_free(dag); return 0; } logmath_t * ps_lattice_get_logmath(ps_lattice_t *dag) { return dag->lmath; } ps_latnode_iter_t * ps_latnode_iter(ps_lattice_t *dag) { return dag->nodes; } ps_latnode_iter_t * ps_latnode_iter_next(ps_latnode_iter_t *itor) { return itor->next; } void ps_latnode_iter_free(ps_latnode_iter_t *itor) { /* Do absolutely nothing. */ } ps_latnode_t * ps_latnode_iter_node(ps_latnode_iter_t *itor) { return itor; } int ps_latnode_times(ps_latnode_t *node, int16 *out_fef, int16 *out_lef) { if (out_fef) *out_fef = (int16)node->fef; if (out_lef) *out_lef = (int16)node->lef; return node->sf; } char const * ps_latnode_word(ps_lattice_t *dag, ps_latnode_t *node) { return dict_wordstr(dag->dict, node->wid); } char const * ps_latnode_baseword(ps_lattice_t *dag, ps_latnode_t *node) { return dict_wordstr(dag->dict, node->basewid); } int32 ps_latnode_prob(ps_lattice_t *dag, ps_latnode_t *node, ps_latlink_t **out_link) { latlink_list_t *links; int32 bestpost = logmath_get_zero(dag->lmath); for (links = node->exits; links; links = links->next) { int32 post = links->link->alpha + links->link->beta - dag->norm; if (post > bestpost) { if (out_link) *out_link = links->link; bestpost = post; } } return bestpost; } ps_latlink_iter_t * ps_latnode_exits(ps_latnode_t *node) { return node->exits; } ps_latlink_iter_t * ps_latnode_entries(ps_latnode_t *node) { return node->entries; } ps_latlink_iter_t * ps_latlink_iter_next(ps_latlink_iter_t *itor) { return itor->next; } void ps_latlink_iter_free(ps_latlink_iter_t *itor) { /* Do absolutely nothing. */ } ps_latlink_t * ps_latlink_iter_link(ps_latlink_iter_t *itor) { return itor->link; } int ps_latlink_times(ps_latlink_t *link, int16 *out_sf) { if (out_sf) { if (link->from) { *out_sf = link->from->sf; } else { *out_sf = 0; } } return link->ef; } ps_latnode_t * ps_latlink_nodes(ps_latlink_t *link, ps_latnode_t **out_src) { if (out_src) *out_src = link->from; return link->to; } char const * ps_latlink_word(ps_lattice_t *dag, ps_latlink_t *link) { if (link->from == NULL) return NULL; return dict_wordstr(dag->dict, link->from->wid); } char const * ps_latlink_baseword(ps_lattice_t *dag, ps_latlink_t *link) { if (link->from == NULL) return NULL; return dict_wordstr(dag->dict, link->from->basewid); } ps_latlink_t * ps_latlink_pred(ps_latlink_t *link) { return link->best_prev; } int32 ps_latlink_prob(ps_lattice_t *dag, ps_latlink_t *link, int32 *out_ascr) { int32 post = link->alpha + link->beta - dag->norm; if (out_ascr) *out_ascr = link->ascr << SENSCR_SHIFT; return post; } char const * ps_lattice_hyp(ps_lattice_t *dag, ps_latlink_t *link) { ps_latlink_t *l; size_t len; char *c; /* Backtrace once to get hypothesis length. */ len = 0; /* FIXME: There may not be a search, but actually there should be a dict. */ if (dict_real_word(dag->dict, link->to->basewid)) { char *wstr = dict_wordstr(dag->dict, link->to->basewid); if (wstr != NULL) len += strlen(wstr) + 1; } for (l = link; l; l = l->best_prev) { if (dict_real_word(dag->dict, l->from->basewid)) { char *wstr = dict_wordstr(dag->dict, l->from->basewid); if (wstr != NULL) len += strlen(wstr) + 1; } } /* Backtrace again to construct hypothesis string. */ ckd_free(dag->hyp_str); dag->hyp_str = ckd_calloc(1, len+1); /* extra one incase the hyp is empty */ c = dag->hyp_str + len - 1; if (dict_real_word(dag->dict, link->to->basewid)) { char *wstr = dict_wordstr(dag->dict, link->to->basewid); if (wstr != NULL) { len = strlen(wstr); c -= len; memcpy(c, wstr, len); if (c > dag->hyp_str) { --c; *c = ' '; } } } for (l = link; l; l = l->best_prev) { if (dict_real_word(dag->dict, l->from->basewid)) { char *wstr = dict_wordstr(dag->dict, l->from->basewid); if (wstr != NULL) { len = strlen(wstr); c -= len; memcpy(c, wstr, len); if (c > dag->hyp_str) { --c; *c = ' '; } } } } return dag->hyp_str; } static void ps_lattice_compute_lscr(ps_seg_t *seg, ps_latlink_t *link, int to) { ngram_model_t *lmset; /* Language model score is included in the link score for FSG * search. FIXME: Of course, this is sort of a hack :( */ if (0 != strcmp(ps_search_type(seg->search), PS_SEARCH_TYPE_NGRAM)) { seg->lback = 1; /* Unigram... */ seg->lscr = 0; return; } lmset = ((ngram_search_t *)seg->search)->lmset; if (link->best_prev == NULL) { if (to) /* Sentence has only two words. */ seg->lscr = ngram_bg_score(lmset, link->to->basewid, link->from->basewid, &seg->lback) >> SENSCR_SHIFT; else {/* This is the start symbol, its lscr is always 0. */ seg->lscr = 0; seg->lback = 1; } } else { /* Find the two predecessor words. */ if (to) { seg->lscr = ngram_tg_score(lmset, link->to->basewid, link->from->basewid, link->best_prev->from->basewid, &seg->lback) >> SENSCR_SHIFT; } else { if (link->best_prev->best_prev) seg->lscr = ngram_tg_score(lmset, link->from->basewid, link->best_prev->from->basewid, link->best_prev->best_prev->from->basewid, &seg->lback) >> SENSCR_SHIFT; else seg->lscr = ngram_bg_score(lmset, link->from->basewid, link->best_prev->from->basewid, &seg->lback) >> SENSCR_SHIFT; } } } static void ps_lattice_link2itor(ps_seg_t *seg, ps_latlink_t *link, int to) { dag_seg_t *itor = (dag_seg_t *)seg; ps_latnode_t *node; if (to) { node = link->to; seg->ef = node->lef; seg->prob = 0; /* norm + beta - norm */ } else { latlink_list_t *x; ps_latnode_t *n; logmath_t *lmath = ps_search_acmod(seg->search)->lmath; node = link->from; seg->ef = link->ef; seg->prob = link->alpha + link->beta - itor->norm; /* Sum over all exits for this word and any alternate pronunciations at the same frame. */ for (n = node; n; n = n->alt) { for (x = n->exits; x; x = x->next) { if (x->link == link) continue; seg->prob = logmath_add(lmath, seg->prob, x->link->alpha + x->link->beta - itor->norm); } } } seg->word = dict_wordstr(ps_search_dict(seg->search), node->wid); seg->sf = node->sf; seg->ascr = link->ascr << SENSCR_SHIFT; /* Compute language model score from best predecessors. */ ps_lattice_compute_lscr(seg, link, to); } static void ps_lattice_seg_free(ps_seg_t *seg) { dag_seg_t *itor = (dag_seg_t *)seg; ckd_free(itor->links); ckd_free(itor); } static ps_seg_t * ps_lattice_seg_next(ps_seg_t *seg) { dag_seg_t *itor = (dag_seg_t *)seg; ++itor->cur; if (itor->cur == itor->n_links + 1) { ps_lattice_seg_free(seg); return NULL; } else if (itor->cur == itor->n_links) { /* Re-use the last link but with the "to" node. */ ps_lattice_link2itor(seg, itor->links[itor->cur - 1], TRUE); } else { ps_lattice_link2itor(seg, itor->links[itor->cur], FALSE); } return seg; } static ps_segfuncs_t ps_lattice_segfuncs = { /* seg_next */ ps_lattice_seg_next, /* seg_free */ ps_lattice_seg_free }; ps_seg_t * ps_lattice_seg_iter(ps_lattice_t *dag, ps_latlink_t *link, float32 lwf) { dag_seg_t *itor; ps_latlink_t *l; int cur; /* Calling this an "iterator" is a bit of a misnomer since we have * to get the entire backtrace in order to produce it. */ itor = ckd_calloc(1, sizeof(*itor)); itor->base.vt = &ps_lattice_segfuncs; itor->base.search = dag->search; itor->base.lwf = lwf; itor->n_links = 0; itor->norm = dag->norm; for (l = link; l; l = l->best_prev) { ++itor->n_links; } if (itor->n_links == 0) { ckd_free(itor); return NULL; } itor->links = ckd_calloc(itor->n_links, sizeof(*itor->links)); cur = itor->n_links - 1; for (l = link; l; l = l->best_prev) { itor->links[cur] = l; --cur; } ps_lattice_link2itor((ps_seg_t *)itor, itor->links[0], FALSE); return (ps_seg_t *)itor; } latlink_list_t * latlink_list_new(ps_lattice_t *dag, ps_latlink_t *link, latlink_list_t *next) { latlink_list_t *ll; ll = listelem_malloc(dag->latlink_list_alloc); ll->link = link; ll->next = next; return ll; } void ps_lattice_pushq(ps_lattice_t *dag, ps_latlink_t *link) { if (dag->q_head == NULL) dag->q_head = dag->q_tail = latlink_list_new(dag, link, NULL); else { dag->q_tail->next = latlink_list_new(dag, link, NULL); dag->q_tail = dag->q_tail->next; } } ps_latlink_t * ps_lattice_popq(ps_lattice_t *dag) { latlink_list_t *x; ps_latlink_t *link; if (dag->q_head == NULL) return NULL; link = dag->q_head->link; x = dag->q_head->next; listelem_free(dag->latlink_list_alloc, dag->q_head); dag->q_head = x; if (dag->q_head == NULL) dag->q_tail = NULL; return link; } void ps_lattice_delq(ps_lattice_t *dag) { while (ps_lattice_popq(dag)) { /* Do nothing. */ } } ps_latlink_t * ps_lattice_traverse_edges(ps_lattice_t *dag, ps_latnode_t *start, ps_latnode_t *end) { ps_latnode_t *node; latlink_list_t *x; /* Cancel any unfinished traversal. */ ps_lattice_delq(dag); /* Initialize node fanin counts and path scores. */ for (node = dag->nodes; node; node = node->next) node->info.fanin = 0; for (node = dag->nodes; node; node = node->next) { for (x = node->exits; x; x = x->next) (x->link->to->info.fanin)++; } /* Initialize agenda with all exits from start. */ if (start == NULL) start = dag->start; for (x = start->exits; x; x = x->next) ps_lattice_pushq(dag, x->link); /* Pull the first edge off the queue. */ return ps_lattice_traverse_next(dag, end); } ps_latlink_t * ps_lattice_traverse_next(ps_lattice_t *dag, ps_latnode_t *end) { ps_latlink_t *next; next = ps_lattice_popq(dag); if (next == NULL) return NULL; /* Decrease fanin count for destination node and expand outgoing * edges if all incoming edges have been seen. */ --next->to->info.fanin; if (next->to->info.fanin == 0) { latlink_list_t *x; if (end == NULL) end = dag->end; if (next->to == end) { /* If we have traversed all links entering the end node, * clear the queue, causing future calls to this function * to return NULL. */ ps_lattice_delq(dag); return next; } /* Extend all outgoing edges. */ for (x = next->to->exits; x; x = x->next) ps_lattice_pushq(dag, x->link); } return next; } ps_latlink_t * ps_lattice_reverse_edges(ps_lattice_t *dag, ps_latnode_t *start, ps_latnode_t *end) { ps_latnode_t *node; latlink_list_t *x; /* Cancel any unfinished traversal. */ ps_lattice_delq(dag); /* Initialize node fanout counts and path scores. */ for (node = dag->nodes; node; node = node->next) { node->info.fanin = 0; for (x = node->exits; x; x = x->next) ++node->info.fanin; } /* Initialize agenda with all entries from end. */ if (end == NULL) end = dag->end; for (x = end->entries; x; x = x->next) ps_lattice_pushq(dag, x->link); /* Pull the first edge off the queue. */ return ps_lattice_reverse_next(dag, start); } ps_latlink_t * ps_lattice_reverse_next(ps_lattice_t *dag, ps_latnode_t *start) { ps_latlink_t *next; next = ps_lattice_popq(dag); if (next == NULL) return NULL; /* Decrease fanout count for source node and expand incoming * edges if all incoming edges have been seen. */ --next->from->info.fanin; if (next->from->info.fanin == 0) { latlink_list_t *x; if (start == NULL) start = dag->start; if (next->from == start) { /* If we have traversed all links entering the start node, * clear the queue, causing future calls to this function * to return NULL. */ ps_lattice_delq(dag); return next; } /* Extend all outgoing edges. */ for (x = next->from->entries; x; x = x->next) ps_lattice_pushq(dag, x->link); } return next; } /* * Find the best score from dag->start to end point of any link and * use it to update links further down the path. This is like * single-source shortest path search, except that it is done over * edges rather than nodes, which allows us to do exact trigram scoring. * * Helpfully enough, we get half of the posterior probability * calculation for free that way too. (interesting research topic: is * there a reliable Viterbi analogue to word-level Forward-Backward * like there is for state-level? Or, is it just lattice density?) */ ps_latlink_t * ps_lattice_bestpath(ps_lattice_t *dag, ngram_model_t *lmset, float32 lwf, float32 ascale) { ps_search_t *search; ps_latnode_t *node; ps_latlink_t *link; ps_latlink_t *bestend; latlink_list_t *x; logmath_t *lmath; int32 bestescr; search = dag->search; lmath = dag->lmath; /* Initialize path scores for all links exiting dag->start, and * set all other scores to the minimum. Also initialize alphas to * log-zero. */ for (node = dag->nodes; node; node = node->next) { for (x = node->exits; x; x = x->next) { x->link->path_scr = MAX_NEG_INT32; x->link->alpha = logmath_get_zero(lmath); } } for (x = dag->start->exits; x; x = x->next) { int32 n_used; int16 to_is_fil; to_is_fil = dict_filler_word(ps_search_dict(search), x->link->to->basewid) && x->link->to != dag->end; /* Best path points to dag->start, obviously. */ x->link->path_scr = x->link->ascr; if (lmset && !to_is_fil) x->link->path_scr += (ngram_bg_score(lmset, x->link->to->basewid, ps_search_start_wid(search), &n_used) >> SENSCR_SHIFT) * lwf; x->link->best_prev = NULL; /* No predecessors for start links. */ x->link->alpha = 0; } /* Traverse the edges in the graph, updating path scores. */ for (link = ps_lattice_traverse_edges(dag, NULL, NULL); link; link = ps_lattice_traverse_next(dag, NULL)) { int32 bprob, n_used; int32 w3_wid, w2_wid; int16 w3_is_fil, w2_is_fil; ps_latlink_t *prev_link; /* Sanity check, we should not be traversing edges that * weren't previously updated, otherwise nasty overflows will result. */ assert(link->path_scr != MAX_NEG_INT32); /* Find word predecessor if from-word is filler */ w3_wid = link->from->basewid; w2_wid = link->to->basewid; w3_is_fil = dict_filler_word(ps_search_dict(search), link->from->basewid) && link->from != dag->start; w2_is_fil = dict_filler_word(ps_search_dict(search), w2_wid) && link->to != dag->end; prev_link = link; if (w3_is_fil) { while (prev_link->best_prev != NULL) { prev_link = prev_link->best_prev; w3_wid = prev_link->from->basewid; if (!dict_filler_word(ps_search_dict(search), w3_wid) || prev_link->from == dag->start) { w3_is_fil = FALSE; break; } } } /* Calculate common bigram probability for all alphas. */ if (lmset && !w3_is_fil && !w2_is_fil) bprob = ngram_ng_prob(lmset, w2_wid, &w3_wid, 1, &n_used); else bprob = 0; /* Add in this link's acoustic score, which was a constant factor in previous computations (if any). */ link->alpha += (link->ascr << SENSCR_SHIFT) * ascale; if (w2_is_fil) { w2_is_fil = w3_is_fil; w3_is_fil = TRUE; w2_wid = w3_wid; while (prev_link->best_prev != NULL) { prev_link = prev_link->best_prev; w3_wid = prev_link->from->basewid; if (!dict_filler_word(ps_search_dict(search), w3_wid) || prev_link->from == dag->start) { w3_is_fil = FALSE; break; } } } /* Update scores for all paths exiting link->to. */ for (x = link->to->exits; x; x = x->next) { int32 score; int32 w1_wid; int16 w1_is_fil; w1_wid = x->link->to->basewid; w1_is_fil = dict_filler_word(ps_search_dict(search), w1_wid) && x->link->to != dag->end; /* Update alpha with sum of previous alphas. */ x->link->alpha = logmath_add(lmath, x->link->alpha, link->alpha + bprob); /* Update link score with maximum link score. */ score = link->path_scr + x->link->ascr; /* Calculate language score for bestpath if possible */ if (lmset && !w1_is_fil && !w2_is_fil) { if (w3_is_fil) /* partial context available */ score += (ngram_bg_score(lmset, w1_wid, w2_wid, &n_used) >> SENSCR_SHIFT) * lwf; else /* full context available */ score += (ngram_tg_score(lmset, w1_wid, w2_wid, w3_wid, &n_used) >> SENSCR_SHIFT) * lwf; } if (score BETTER_THAN x->link->path_scr) { x->link->path_scr = score; x->link->best_prev = link; } } } /* Find best link entering final node, and calculate normalizer * for posterior probabilities. */ bestend = NULL; bestescr = MAX_NEG_INT32; /* Normalizer is the alpha for the imaginary link exiting the final node. */ dag->norm = logmath_get_zero(lmath); for (x = dag->end->entries; x; x = x->next) { int32 bprob, n_used; int32 from_wid; int16 from_is_fil; from_wid = x->link->from->basewid; from_is_fil = dict_filler_word(ps_search_dict(search), from_wid) && x->link->from != dag->start; if (from_is_fil) { ps_latlink_t *prev_link = x->link; while (prev_link->best_prev != NULL) { prev_link = prev_link->best_prev; from_wid = prev_link->from->basewid; if (!dict_filler_word(ps_search_dict(search), from_wid) || prev_link->from == dag->start) { from_is_fil = FALSE; break; } } } if (lmset && !from_is_fil) bprob = ngram_ng_prob(lmset, x->link->to->basewid, &from_wid, 1, &n_used); else bprob = 0; dag->norm = logmath_add(lmath, dag->norm, x->link->alpha + bprob); if (x->link->path_scr BETTER_THAN bestescr) { bestescr = x->link->path_scr; bestend = x->link; } } /* FIXME: floating point... */ dag->norm += (int32)(dag->final_node_ascr << SENSCR_SHIFT) * ascale; E_INFO("Bestpath score: %d\n", bestescr); E_INFO("Normalizer P(O) = alpha(%s:%d:%d) = %d\n", dict_wordstr(dag->search->dict, dag->end->wid), dag->end->sf, dag->end->lef, dag->norm); return bestend; } static int32 ps_lattice_joint(ps_lattice_t *dag, ps_latlink_t *link, float32 ascale) { ngram_model_t *lmset; int32 jprob; /* Sort of a hack... */ if (dag->search && 0 == strcmp(ps_search_type(dag->search), PS_SEARCH_TYPE_NGRAM)) lmset = ((ngram_search_t *)dag->search)->lmset; else lmset = NULL; jprob = (dag->final_node_ascr << SENSCR_SHIFT) * ascale; while (link) { if (lmset) { int lback; int32 from_wid, to_wid; int16 from_is_fil, to_is_fil; from_wid = link->from->basewid; to_wid = link->to->basewid; from_is_fil = dict_filler_word(dag->dict, from_wid) && link->from != dag->start; to_is_fil = dict_filler_word(dag->dict, to_wid) && link->to != dag->end; /* Find word predecessor if from-word is filler */ if (!to_is_fil && from_is_fil) { ps_latlink_t *prev_link = link; while (prev_link->best_prev != NULL) { prev_link = prev_link->best_prev; from_wid = prev_link->from->basewid; if (!dict_filler_word(dag->dict, from_wid) || prev_link->from == dag->start) { from_is_fil = FALSE; break; } } } /* Compute unscaled language model probability. Note that this is actually not the language model probability that corresponds to this link, but that is okay, because we are just taking the sum over all links in the best path. */ if (!from_is_fil && !to_is_fil) jprob += ngram_ng_prob(lmset, to_wid, &from_wid, 1, &lback); } /* If there is no language model, we assume that the language model probability (such as it is) has been included in the link score. */ jprob += (link->ascr << SENSCR_SHIFT) * ascale; link = link->best_prev; } E_INFO("Joint P(O,S) = %d P(S|O) = %d\n", jprob, jprob - dag->norm); return jprob; } int32 ps_lattice_posterior(ps_lattice_t *dag, ngram_model_t *lmset, float32 ascale) { logmath_t *lmath; ps_latnode_t *node; ps_latlink_t *link; latlink_list_t *x; ps_latlink_t *bestend; int32 bestescr; lmath = dag->lmath; /* Reset all betas to zero. */ for (node = dag->nodes; node; node = node->next) { for (x = node->exits; x; x = x->next) { x->link->beta = logmath_get_zero(lmath); } } bestend = NULL; bestescr = MAX_NEG_INT32; /* Accumulate backward probabilities for all links. */ for (link = ps_lattice_reverse_edges(dag, NULL, NULL); link; link = ps_lattice_reverse_next(dag, NULL)) { int32 bprob, n_used; int32 from_wid, to_wid; int16 from_is_fil, to_is_fil; from_wid = link->from->basewid; to_wid = link->to->basewid; from_is_fil = dict_filler_word(dag->dict, from_wid) && link->from != dag->start; to_is_fil = dict_filler_word(dag->dict, to_wid) && link->to != dag->end; /* Find word predecessor if from-word is filler */ if (!to_is_fil && from_is_fil) { ps_latlink_t *prev_link = link; while (prev_link->best_prev != NULL) { prev_link = prev_link->best_prev; from_wid = prev_link->from->basewid; if (!dict_filler_word(dag->dict, from_wid) || prev_link->from == dag->start) { from_is_fil = FALSE; break; } } } /* Calculate LM probability. */ if (lmset && !from_is_fil && !to_is_fil) bprob = ngram_ng_prob(lmset, to_wid, &from_wid, 1, &n_used); else bprob = 0; if (link->to == dag->end) { /* Track the best path - we will backtrace in order to calculate the unscaled joint probability for sentence posterior. */ if (link->path_scr BETTER_THAN bestescr) { bestescr = link->path_scr; bestend = link; } /* Imaginary exit link from final node has beta = 1.0 */ link->beta = bprob + (dag->final_node_ascr << SENSCR_SHIFT) * ascale; } else { /* Update beta from all outgoing betas. */ for (x = link->to->exits; x; x = x->next) { link->beta = logmath_add(lmath, link->beta, x->link->beta + bprob + (x->link->ascr << SENSCR_SHIFT) * ascale); } } } /* Return P(S|O) = P(O,S)/P(O) */ return ps_lattice_joint(dag, bestend, ascale) - dag->norm; } int32 ps_lattice_posterior_prune(ps_lattice_t *dag, int32 beam) { ps_latlink_t *link; int npruned = 0; for (link = ps_lattice_traverse_edges(dag, dag->start, dag->end); link; link = ps_lattice_traverse_next(dag, dag->end)) { link->from->reachable = FALSE; if (link->alpha + link->beta - dag->norm < beam) { latlink_list_t *x, *tmp, *next; tmp = NULL; for (x = link->from->exits; x; x = next) { next = x->next; if (x->link == link) { listelem_free(dag->latlink_list_alloc, x); } else { x->next = tmp; tmp = x; } } link->from->exits = tmp; tmp = NULL; for (x = link->to->entries; x; x = next) { next = x->next; if (x->link == link) { listelem_free(dag->latlink_list_alloc, x); } else { x->next = tmp; tmp = x; } } link->to->entries = tmp; listelem_free(dag->latlink_alloc, link); ++npruned; } } dag_mark_reachable(dag->end); ps_lattice_delete_unreachable(dag); return npruned; } /* Parameters to prune n-best alternatives search */ #define MAX_PATHS 500 /* Max allowed active paths at any time */ #define MAX_HYP_TRIES 10000 /* * For each node in any path between from and end of utt, find the * best score from "from".sf to end of utt. (NOTE: Uses bigram probs; * this is an estimate of the best score from "from".) (NOTE #2: yes, * this is the "heuristic score" used in A* search) */ static int32 best_rem_score(ps_astar_t *nbest, ps_latnode_t * from) { latlink_list_t *x; int32 bestscore, score; if (from->info.rem_score <= 0) return (from->info.rem_score); /* Best score from "from" to end of utt not known; compute from successors */ bestscore = WORST_SCORE; for (x = from->exits; x; x = x->next) { int32 n_used; score = best_rem_score(nbest, x->link->to); score += x->link->ascr; if (nbest->lmset) score += (ngram_bg_score(nbest->lmset, x->link->to->basewid, from->basewid, &n_used) >> SENSCR_SHIFT) * nbest->lwf; if (score BETTER_THAN bestscore) bestscore = score; } from->info.rem_score = bestscore; return bestscore; } /* * Insert newpath in sorted (by path score) list of paths. But if newpath is * too far down the list, drop it (FIXME: necessary?) * total_score = path score (newpath) + rem_score to end of utt. */ static void path_insert(ps_astar_t *nbest, ps_latpath_t *newpath, int32 total_score) { ps_latpath_t *prev, *p; int32 i; prev = NULL; for (i = 0, p = nbest->path_list; (i < MAX_PATHS) && p; p = p->next, i++) { if ((p->score + p->node->info.rem_score) < total_score) break; prev = p; } /* newpath should be inserted between prev and p */ if (i < MAX_PATHS) { /* Insert new partial hyp */ newpath->next = p; if (!prev) nbest->path_list = newpath; else prev->next = newpath; if (!p) nbest->path_tail = newpath; nbest->n_path++; nbest->n_hyp_insert++; nbest->insert_depth += i; } else { /* newpath score too low; reject it and also prune paths beyond MAX_PATHS */ nbest->path_tail = prev; prev->next = NULL; nbest->n_path = MAX_PATHS; listelem_free(nbest->latpath_alloc, newpath); nbest->n_hyp_reject++; for (; p; p = newpath) { newpath = p->next; listelem_free(nbest->latpath_alloc, p); nbest->n_hyp_reject++; } } } /* Find all possible extensions to given partial path */ static void path_extend(ps_astar_t *nbest, ps_latpath_t * path) { latlink_list_t *x; ps_latpath_t *newpath; int32 total_score, tail_score; /* Consider all successors of path->node */ for (x = path->node->exits; x; x = x->next) { int32 n_used; /* Skip successor if no path from it reaches the final node */ if (x->link->to->info.rem_score <= WORST_SCORE) continue; /* Create path extension and compute exact score for this extension */ newpath = listelem_malloc(nbest->latpath_alloc); newpath->node = x->link->to; newpath->parent = path; newpath->score = path->score + x->link->ascr; if (nbest->lmset) { if (path->parent) { newpath->score += nbest->lwf * (ngram_tg_score(nbest->lmset, newpath->node->basewid, path->node->basewid, path->parent->node->basewid, &n_used) >> SENSCR_SHIFT); } else newpath->score += nbest->lwf * (ngram_bg_score(nbest->lmset, newpath->node->basewid, path->node->basewid, &n_used) >> SENSCR_SHIFT); } /* Insert new partial path hypothesis into sorted path_list */ nbest->n_hyp_tried++; total_score = newpath->score + newpath->node->info.rem_score; /* First see if hyp would be worse than the worst */ if (nbest->n_path >= MAX_PATHS) { tail_score = nbest->path_tail->score + nbest->path_tail->node->info.rem_score; if (total_score < tail_score) { listelem_free(nbest->latpath_alloc, newpath); nbest->n_hyp_reject++; continue; } } path_insert(nbest, newpath, total_score); } } ps_astar_t * ps_astar_start(ps_lattice_t *dag, ngram_model_t *lmset, float32 lwf, int sf, int ef, int w1, int w2) { ps_astar_t *nbest; ps_latnode_t *node; nbest = ckd_calloc(1, sizeof(*nbest)); nbest->dag = dag; nbest->lmset = lmset; nbest->lwf = lwf; nbest->sf = sf; if (ef < 0) nbest->ef = dag->n_frames + 1; else nbest->ef = ef; nbest->w1 = w1; nbest->w2 = w2; nbest->latpath_alloc = listelem_alloc_init(sizeof(ps_latpath_t)); /* Initialize rem_score (A* heuristic) to default values */ for (node = dag->nodes; node; node = node->next) { if (node == dag->end) node->info.rem_score = 0; else if (node->exits == NULL) node->info.rem_score = WORST_SCORE; else node->info.rem_score = 1; /* +ve => unknown value */ } /* Create initial partial hypotheses list consisting of nodes starting at sf */ nbest->path_list = nbest->path_tail = NULL; for (node = dag->nodes; node; node = node->next) { if (node->sf == sf) { ps_latpath_t *path; int32 n_used; best_rem_score(nbest, node); path = listelem_malloc(nbest->latpath_alloc); path->node = node; path->parent = NULL; if (nbest->lmset) path->score = nbest->lwf * ((w1 < 0) ? ngram_bg_score(nbest->lmset, node->basewid, w2, &n_used) : ngram_tg_score(nbest->lmset, node->basewid, w2, w1, &n_used)); else path->score = 0; path->score >>= SENSCR_SHIFT; path_insert(nbest, path, path->score + node->info.rem_score); } } return nbest; } ps_latpath_t * ps_astar_next(ps_astar_t *nbest) { ps_lattice_t *dag; dag = nbest->dag; /* Pop the top (best) partial hypothesis */ while ((nbest->top = nbest->path_list) != NULL) { nbest->path_list = nbest->path_list->next; if (nbest->top == nbest->path_tail) nbest->path_tail = NULL; nbest->n_path--; /* Complete hypothesis? */ if ((nbest->top->node->sf >= nbest->ef) || ((nbest->top->node == dag->end) && (nbest->ef > dag->end->sf))) { /* FIXME: Verify that it is non-empty. Also we may want * to verify that it is actually distinct from other * paths, since often this is not the case*/ return nbest->top; } else { if (nbest->top->node->fef < nbest->ef) path_extend(nbest, nbest->top); } } /* Did not find any more paths to extend. */ return NULL; } char const * ps_astar_hyp(ps_astar_t *nbest, ps_latpath_t *path) { ps_search_t *search; ps_latpath_t *p; size_t len; char *c; char *hyp; search = nbest->dag->search; /* Backtrace once to get hypothesis length. */ len = 0; for (p = path; p; p = p->parent) { if (dict_real_word(ps_search_dict(search), p->node->basewid)) { char *wstr = dict_wordstr(ps_search_dict(search), p->node->basewid); if (wstr != NULL) len += strlen(wstr) + 1; } } if (len == 0) { return NULL; } /* Backtrace again to construct hypothesis string. */ hyp = ckd_calloc(1, len); c = hyp + len - 1; for (p = path; p; p = p->parent) { if (dict_real_word(ps_search_dict(search), p->node->basewid)) { char *wstr = dict_wordstr(ps_search_dict(search), p->node->basewid); if (wstr != NULL) { len = strlen(wstr); c -= len; memcpy(c, wstr, len); if (c > hyp) { --c; *c = ' '; } } } } nbest->hyps = glist_add_ptr(nbest->hyps, hyp); return hyp; } static void ps_astar_node2itor(astar_seg_t *itor) { ps_seg_t *seg = (ps_seg_t *)itor; ps_latnode_t *node; assert(itor->cur < itor->n_nodes); node = itor->nodes[itor->cur]; if (itor->cur == itor->n_nodes - 1) seg->ef = node->lef; else seg->ef = itor->nodes[itor->cur + 1]->sf - 1; seg->word = dict_wordstr(ps_search_dict(seg->search), node->wid); seg->sf = node->sf; seg->prob = 0; /* FIXME: implement forward-backward */ } static void ps_astar_seg_free(ps_seg_t *seg) { astar_seg_t *itor = (astar_seg_t *)seg; ckd_free(itor->nodes); ckd_free(itor); } static ps_seg_t * ps_astar_seg_next(ps_seg_t *seg) { astar_seg_t *itor = (astar_seg_t *)seg; ++itor->cur; if (itor->cur == itor->n_nodes) { ps_astar_seg_free(seg); return NULL; } else { ps_astar_node2itor(itor); } return seg; } static ps_segfuncs_t ps_astar_segfuncs = { /* seg_next */ ps_astar_seg_next, /* seg_free */ ps_astar_seg_free }; ps_seg_t * ps_astar_seg_iter(ps_astar_t *astar, ps_latpath_t *path, float32 lwf) { astar_seg_t *itor; ps_latpath_t *p; int cur; /* Backtrace and make an iterator, this should look familiar by now. */ itor = ckd_calloc(1, sizeof(*itor)); itor->base.vt = &ps_astar_segfuncs; itor->base.search = astar->dag->search; itor->base.lwf = lwf; itor->n_nodes = itor->cur = 0; for (p = path; p; p = p->parent) { ++itor->n_nodes; } itor->nodes = ckd_calloc(itor->n_nodes, sizeof(*itor->nodes)); cur = itor->n_nodes - 1; for (p = path; p; p = p->parent) { itor->nodes[cur] = p->node; --cur; } ps_astar_node2itor(itor); return (ps_seg_t *)itor; } void ps_astar_finish(ps_astar_t *nbest) { gnode_t *gn; /* Free all hyps. */ for (gn = nbest->hyps; gn; gn = gnode_next(gn)) { ckd_free(gnode_ptr(gn)); } glist_free(nbest->hyps); /* Free all paths. */ listelem_alloc_free(nbest->latpath_alloc); /* Free the Henge. */ ckd_free(nbest); } pocketsphinx-5prealpha/src/libpocketsphinx/ps_lattice_internal.h0000664000175000017500000002264512771605033022605 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ps_lattice_internal.h Word graph search implementation */ #ifndef __PS_LATTICE_INTERNAL_H__ #define __PS_LATTICE_INTERNAL_H__ /** * Linked list of DAG link pointers. * * Because the same link structure is used for forward and reverse * links, as well as for the agenda used in bestpath search, we can't * store the list pointer inside latlink_t. We could use glist_t * here, but it wastes 4 bytes per entry on 32-bit machines. */ typedef struct latlink_list_s { ps_latlink_t *link; struct latlink_list_s *next; } latlink_list_t; /** * Word graph structure used in bestpath/nbest search. */ struct ps_lattice_s { int refcount; /**< Reference count. */ logmath_t *lmath; /**< Log-math object. */ ps_search_t *search; /**< Search (if generated by search). */ dict_t *dict; /**< Dictionary for this DAG. */ int32 silence; /**< Silence word ID. */ int32 frate; /**< Frame rate. */ ps_latnode_t *nodes; /**< List of all nodes. */ ps_latnode_t *start; /**< Starting node. */ ps_latnode_t *end; /**< Ending node. */ frame_idx_t n_frames; /**< Number of frames for this utterance. */ int32 n_nodes; /**< Number of nodes in this lattice. */ int32 final_node_ascr; /**< Acoustic score of implicit link exiting final node. */ int32 norm; /**< Normalizer for posterior probabilities. */ char *hyp_str; /**< Current hypothesis string. */ listelem_alloc_t *latnode_alloc; /**< Node allocator for this DAG. */ listelem_alloc_t *latlink_alloc; /**< Link allocator for this DAG. */ listelem_alloc_t *latlink_list_alloc; /**< List element allocator for this DAG. */ /* This will probably be replaced with a heap. */ latlink_list_t *q_head; /**< Queue of links for traversal. */ latlink_list_t *q_tail; /**< Queue of links for traversal. */ }; /** * Links between DAG nodes. * * A link corresponds to a single hypothesized instance of a word with * a given start and end point. */ struct ps_latlink_s { struct ps_latnode_s *from; /**< From node */ struct ps_latnode_s *to; /**< To node */ struct ps_latlink_s *best_prev; int32 ascr; /**< Score for from->wid (from->sf to this->ef) */ int32 path_scr; /**< Best path score from root of DAG */ frame_idx_t ef; /**< Ending frame of this word */ int32 alpha; /**< Forward probability of this link P(w,o_1^{ef}) */ int32 beta; /**< Backward probability of this link P(w|o_{ef+1}^T) */ }; /** * DAG nodes. * * A node corresponds to a number of hypothesized instances of a word * which all share the same starting point. */ struct ps_latnode_s { int32 id; /**< Unique id for this node */ int32 wid; /**< Dictionary word id */ int32 basewid; /**< Dictionary base word id */ /* FIXME: These are (ab)used to store backpointer indices, therefore they MUST be 32 bits. */ int32 fef; /**< First end frame */ int32 lef; /**< Last end frame */ frame_idx_t sf; /**< Start frame */ int16 reachable; /**< From \verbatim \endverbatim or \verbatim \endverbatim */ int32 node_id; /**< Node from fsg model, used to map lattice back to model */ union { glist_t velist; /**< List of history entries with different lmstate (tst only) */ int32 fanin; /**< Number nodes with links to this node */ int32 rem_score; /**< Estimated best score from node.sf to end */ int32 best_exit; /**< Best exit score (used for final nodes only) */ } info; latlink_list_t *exits; /**< Links out of this node */ latlink_list_t *entries; /**< Links into this node */ struct ps_latnode_s *alt; /**< Node with alternate pronunciation for this word */ struct ps_latnode_s *next; /**< Next node in DAG (no ordering implied) */ }; /** * Segmentation "iterator" for backpointer table results. */ typedef struct dag_seg_s { ps_seg_t base; /**< Base structure. */ ps_latlink_t **links; /**< Array of lattice links. */ int32 norm; /**< Normalizer for posterior probabilities. */ int16 n_links; /**< Number of lattice links. */ int16 cur; /**< Current position in bpidx. */ } dag_seg_t; /** * Partial path structure used in N-best (A*) search. * * Each partial path (latpath_t) is constructed by extending another * partial path--parent--by one node. */ typedef struct ps_latpath_s { ps_latnode_t *node; /**< Node ending this path. */ struct ps_latpath_s *parent; /**< Previous element in this path. */ struct ps_latpath_s *next; /**< Pointer to next path in list of paths. */ int32 score; /**< Exact score from start node up to node->sf. */ } ps_latpath_t; /** * A* search structure. */ typedef struct ps_astar_s { ps_lattice_t *dag; ngram_model_t *lmset; float32 lwf; frame_idx_t sf; frame_idx_t ef; int32 w1; int32 w2; int32 n_hyp_tried; int32 n_hyp_insert; int32 n_hyp_reject; int32 insert_depth; int32 n_path; ps_latpath_t *path_list; ps_latpath_t *path_tail; ps_latpath_t *top; glist_t hyps; /**< List of hypothesis strings. */ listelem_alloc_t *latpath_alloc; /**< Path allocator for N-best search. */ } ps_astar_t; /** * Segmentation "iterator" for A* search results. */ typedef struct astar_seg_s { ps_seg_t base; ps_latnode_t **nodes; int n_nodes; int cur; } astar_seg_t; /** * Construct an empty word graph with reference to a search structure. */ ps_lattice_t *ps_lattice_init_search(ps_search_t *search, int n_frame); /** * Insert penalty for fillers */ void ps_lattice_penalize_fillers(ps_lattice_t *dag, int32 silpen, int32 fillpen); /** * Remove nodes marked as unreachable. */ void ps_lattice_delete_unreachable(ps_lattice_t *dag); /** * Add an edge to the traversal queue. */ void ps_lattice_pushq(ps_lattice_t *dag, ps_latlink_t *link); /** * Remove an edge from the traversal queue. */ ps_latlink_t *ps_lattice_popq(ps_lattice_t *dag); /** * Clear and reset the traversal queue. */ void ps_lattice_delq(ps_lattice_t *dag); /** * Create a new lattice link element. */ latlink_list_t *latlink_list_new(ps_lattice_t *dag, ps_latlink_t *link, latlink_list_t *next); /** * Get hypothesis string after bestpath search. */ char const *ps_lattice_hyp(ps_lattice_t *dag, ps_latlink_t *link); /** * Get hypothesis segmentation iterator after bestpath search. */ ps_seg_t *ps_lattice_seg_iter(ps_lattice_t *dag, ps_latlink_t *link, float32 lwf); /** * Begin N-Gram based A* search on a word graph. * * @param sf Starting frame for N-best search. * @param ef Ending frame for N-best search, or -1 for last frame. * @param w1 First context word, or -1 for none. * @param w2 Second context word, or -1 for none. * @return 0 for success, <0 on error. */ ps_astar_t *ps_astar_start(ps_lattice_t *dag, ngram_model_t *lmset, float32 lwf, int sf, int ef, int w1, int w2); /** * Find next best hypothesis of A* on a word graph. * * @return a complete path, or NULL if no more hypotheses exist. */ ps_latpath_t *ps_astar_next(ps_astar_t *nbest); /** * Finish N-best search, releasing resources associated with it. */ void ps_astar_finish(ps_astar_t *nbest); /** * Get hypothesis string from A* search. */ char const *ps_astar_hyp(ps_astar_t *nbest, ps_latpath_t *path); /** * Get hypothesis segmentation from A* search. */ ps_seg_t *ps_astar_seg_iter(ps_astar_t *astar, ps_latpath_t *path, float32 lwf); #endif /* __PS_LATTICE_INTERNAL_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/fsg_search_internal.h0000664000175000017500000001217012771605033022552 00000000000000/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * fsg_search_internal.h -- Search structures for FSG decoding. */ #ifndef __S2_FSG_SEARCH_H__ #define __S2_FSG_SEARCH_H__ /* SphinxBase headers. */ #include #include #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "hmm.h" #include "fsg_history.h" #include "fsg_lextree.h" /** * Segmentation "iterator" for FSG history. */ typedef struct fsg_seg_s { ps_seg_t base; /**< Base structure. */ fsg_hist_entry_t **hist; /**< Sequence of history entries. */ int16 n_hist; /**< Number of history entries. */ int16 cur; /**< Current position in hist. */ } fsg_seg_t; /** * Implementation of FSG search (and "FSG set") structure. */ typedef struct fsg_search_s { ps_search_t base; hmm_context_t *hmmctx; /**< HMM context. */ fsg_model_t *fsg; /**< FSG model */ struct fsg_lextree_s *lextree;/**< Lextree structure for the currently active FSG */ struct fsg_history_s *history;/**< For storing the Viterbi search history */ glist_t pnode_active; /**< Those active in this frame */ glist_t pnode_active_next; /**< Those activated for the next frame */ int32 beam_orig; /**< Global pruning threshold */ int32 pbeam_orig; /**< Pruning threshold for phone transition */ int32 wbeam_orig; /**< Pruning threshold for word exit */ float32 beam_factor; /**< Dynamic/adaptive factor (<=1) applied to above beams to determine actual effective beams. For implementing absolute pruning. */ int32 beam, pbeam, wbeam; /**< Effective beams after applying beam_factor */ int32 lw, pip, wip; /**< Language weights */ frame_idx_t frame; /**< Current frame. */ uint8 final; /**< Decoding is finished for this utterance. */ uint8 bestpath; /**< Whether to run bestpath search and confidence annotation at end. */ float32 ascale; /**< Acoustic score scale for posterior probabilities. */ int32 bestscore; /**< For beam pruning */ int32 bpidx_start; /**< First history entry index this frame */ int32 ascr, lscr; /**< Total acoustic and lm score for utt */ int32 n_hmm_eval; /**< Total HMMs evaluated this utt */ int32 n_sen_eval; /**< Total senones evaluated this utt */ ptmr_t perf; /**< Performance counter */ int32 n_tot_frame; } fsg_search_t; /* Access macros */ #define fsg_search_frame(s) ((s)->frame) /** * Create, initialize and return a search module. */ ps_search_t *fsg_search_init(const char *name, fsg_model_t *fsg, cmd_ln_t *config, acmod_t *acmod, dict_t *dict, dict2pid_t *d2p); /** * Deallocate search structure. */ void fsg_search_free(ps_search_t *search); /** * Update FSG search module for new or updated FSGs. */ int fsg_search_reinit(ps_search_t *fsgs, dict_t *dict, dict2pid_t *d2p); /** * Prepare the FSG search structure for beginning decoding of the next * utterance. */ int fsg_search_start(ps_search_t *search); /** * Step one frame forward through the Viterbi search. */ int fsg_search_step(ps_search_t *search, int frame_idx); /** * Windup and clean the FSG search structure after utterance. */ int fsg_search_finish(ps_search_t *search); /** * Get hypothesis string from the FSG search. */ char const *fsg_search_hyp(ps_search_t *search, int32 *out_score); #endif pocketsphinx-5prealpha/src/libpocketsphinx/blkarray_list.h0000664000175000017500000001116212771605033021414 00000000000000/* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * blkarray_list.h -- array-based list structure, for memory and access * efficiency. * * HISTORY * * $Log: blkarray_list.h,v $ * Revision 1.1.1.1 2006/05/23 18:45:02 dhuggins * re-importation * * Revision 1.2 2004/12/10 16:48:58 rkm * Added continuous density acoustic model handling * * Revision 1.1 2004/07/16 00:57:12 egouvea * Added Ravi's implementation of FSG support. * * Revision 1.2 2004/05/27 14:22:57 rkm * FSG cross-word triphones completed (but for single-phone words) * * Revision 1.1.1.1 2004/03/01 14:30:31 rkm * * * Revision 1.1 2004/02/26 01:14:48 rkm * *** empty log message *** * * * 18-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon * Started. */ #ifndef __S2_BLKARRAY_LIST_H__ #define __S2_BLKARRAY_LIST_H__ #include /* * For maintaining a (conceptual) "list" of pointers to arbitrary data. * The application is responsible for knowing the true data type. * Use an array instead of a true list for efficiency (both memory and * speed). But use a blocked (2-D) array to allow dynamic resizing at a * coarse grain. An entire block is allocated or freed, as appropriate. */ typedef struct blkarray_list_s { void ***ptr; /* ptr[][] is the user-supplied ptr */ int32 maxblks; /* size of ptr (#rows) */ int32 blksize; /* size of ptr[] (#cols, ie, size of each row) */ int32 n_valid; /* # entries actually stored in the list */ int32 cur_row; /* The current row being that has empty entry */ int32 cur_row_free; /* First entry valid within the current row */ } blkarray_list_t; /* Access macros */ #define blkarray_list_ptr(l,r,c) ((l)->ptr[r][c]) #define blkarray_list_maxblks(l) ((l)->maxblks) #define blkarray_list_blksize(l) ((l)->blksize) #define blkarray_list_n_valid(l) ((l)->n_valid) #define blkarray_list_cur_row(l) ((l)->cur_row) #define blkarray_list_cur_row_free(l) ((l)->cur_row_free) /* * Initialize and return a new blkarray_list containing an empty list * (i.e., 0 length). Sized for the given values of maxblks and blksize. * NOTE: (maxblks * blksize) should not overflow int32, but this is not * checked. * Return the allocated entry if successful, NULL if any error. */ blkarray_list_t *_blkarray_list_init (int32 maxblks, int32 blksize); /* * Like _blkarray_list_init() above, but for some default values of * maxblks and blksize. */ blkarray_list_t *blkarray_list_init ( void ); /** * Completely finalize a blkarray_list. */ void blkarray_list_free(blkarray_list_t *bl); /* * Append the given new entry (data) to the end of the list. * Return the index of the entry if successful, -1 if any error. * The returned indices are guaranteed to be successive integers (i.e., * 0, 1, 2...) for successive append operations, until the list is reset, * when they resume from 0. */ int32 blkarray_list_append (blkarray_list_t *, void *data); /* * Free all the entries in the list (using ckd_free) and reset the * list length to 0. */ void blkarray_list_reset (blkarray_list_t *); /* Gets n-th element of the array list */ void * blkarray_list_get(blkarray_list_t *, int32 n); #endif pocketsphinx-5prealpha/src/libpocketsphinx/kws_search.c0000664000175000017500000005044312771605033020703 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2013 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * kws_search.c -- Search object for key phrase spotting. */ #include #include #include #include #include #include #include #include #include "pocketsphinx_internal.h" #include "kws_search.h" /** Access macros */ #define hmm_is_active(hmm) ((hmm)->frame > 0) #define kws_nth_hmm(keyphrase,n) (&((keyphrase)->hmms[n])) /* Value selected experimentally as maximum difference between triphone score and phone loop score, used in confidence computation to make sure that confidence value is less than 1. This might be different for different models. Corresponds to threshold of about 1e+50 */ #define KWS_MAX 1500 static ps_lattice_t * kws_search_lattice(ps_search_t * search) { return NULL; } static int kws_search_prob(ps_search_t * search) { return 0; } static void kws_seg_free(ps_seg_t *seg) { kws_seg_t *itor = (kws_seg_t *)seg; ckd_free(itor); } static void kws_seg_fill(kws_seg_t *itor) { kws_detection_t* detection = (kws_detection_t*)gnode_ptr(itor->detection); itor->base.word = detection->keyphrase; itor->base.sf = detection->sf; itor->base.ef = detection->ef; itor->base.prob = detection->prob; itor->base.ascr = detection->ascr; itor->base.lscr = 0; } static ps_seg_t * kws_seg_next(ps_seg_t *seg) { kws_seg_t *itor = (kws_seg_t *)seg; gnode_t *detect_head = gnode_next(itor->detection); while (detect_head != NULL && ((kws_detection_t*)gnode_ptr(detect_head))->ef > itor->last_frame) detect_head = gnode_next(detect_head); itor->detection = detect_head; if (!itor->detection) { kws_seg_free(seg); return NULL; } kws_seg_fill(itor); return seg; } static ps_segfuncs_t kws_segfuncs = { /* seg_next */ kws_seg_next, /* seg_free */ kws_seg_free }; static ps_seg_t * kws_search_seg_iter(ps_search_t * search) { kws_search_t *kwss = (kws_search_t *)search; kws_seg_t *itor; gnode_t *detect_head = kwss->detections->detect_list; while (detect_head != NULL && ((kws_detection_t*)gnode_ptr(detect_head))->ef > kwss->frame - kwss->delay) detect_head = gnode_next(detect_head); if (!detect_head) return NULL; itor = (kws_seg_t *)ckd_calloc(1, sizeof(*itor)); itor->base.vt = &kws_segfuncs; itor->base.search = search; itor->base.lwf = 1.0; itor->detection = detect_head; itor->last_frame = kwss->frame - kwss->delay; kws_seg_fill(itor); return (ps_seg_t *)itor; } static ps_searchfuncs_t kws_funcs = { /* start: */ kws_search_start, /* step: */ kws_search_step, /* finish: */ kws_search_finish, /* reinit: */ kws_search_reinit, /* free: */ kws_search_free, /* lattice: */ kws_search_lattice, /* hyp: */ kws_search_hyp, /* prob: */ kws_search_prob, /* seg_iter: */ kws_search_seg_iter, }; /* Activate senones for scoring */ static void kws_search_sen_active(kws_search_t * kwss) { int i; gnode_t *gn; acmod_clear_active(ps_search_acmod(kwss)); /* active phone loop hmms */ for (i = 0; i < kwss->n_pl; i++) acmod_activate_hmm(ps_search_acmod(kwss), &kwss->pl_hmms[i]); /* activate hmms in active nodes */ for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { kws_keyphrase_t *keyphrase = gnode_ptr(gn); for (i = 0; i < keyphrase->n_hmms; i++) { if (hmm_is_active(kws_nth_hmm(keyphrase, i))) acmod_activate_hmm(ps_search_acmod(kwss), kws_nth_hmm(keyphrase, i)); } } } /* * Evaluate all the active HMMs. * (Executed once per frame.) */ static void kws_search_hmm_eval(kws_search_t * kwss, int16 const *senscr) { int32 i; gnode_t *gn; int32 bestscore = WORST_SCORE; hmm_context_set_senscore(kwss->hmmctx, senscr); /* evaluate hmms from phone loop */ for (i = 0; i < kwss->n_pl; ++i) { hmm_t *hmm = &kwss->pl_hmms[i]; int32 score; score = hmm_vit_eval(hmm); if (score BETTER_THAN bestscore) bestscore = score; } /* evaluate hmms for active nodes */ for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { kws_keyphrase_t *keyphrase = gnode_ptr(gn); for (i = 0; i < keyphrase->n_hmms; i++) { hmm_t *hmm = kws_nth_hmm(keyphrase, i); if (hmm_is_active(hmm)) { int32 score; score = hmm_vit_eval(hmm); if (score BETTER_THAN bestscore) bestscore = score; } } } kwss->bestscore = bestscore; } /* * (Beam) prune the just evaluated HMMs, determine which ones remain * active. Executed once per frame. */ static void kws_search_hmm_prune(kws_search_t * kwss) { int32 thresh, i; gnode_t *gn; thresh = kwss->bestscore + kwss->beam; for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { kws_keyphrase_t *keyphrase = gnode_ptr(gn); for (i = 0; i < keyphrase->n_hmms; i++) { hmm_t *hmm = kws_nth_hmm(keyphrase, i); if (hmm_is_active(hmm) && hmm_bestscore(hmm) < thresh) hmm_clear(hmm); } } } /** * Do phone transitions */ static void kws_search_trans(kws_search_t * kwss) { hmm_t *pl_best_hmm = NULL; int32 best_out_score = WORST_SCORE; int i; gnode_t *gn; /* select best hmm in phone-loop to be a predecessor */ for (i = 0; i < kwss->n_pl; i++) if (hmm_out_score(&kwss->pl_hmms[i]) BETTER_THAN best_out_score) { best_out_score = hmm_out_score(&kwss->pl_hmms[i]); pl_best_hmm = &kwss->pl_hmms[i]; } /* out probs are not ready yet */ if (!pl_best_hmm) return; /* Check whether keyphrase wasn't spotted yet */ for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { kws_keyphrase_t *keyphrase = gnode_ptr(gn); hmm_t *last_hmm; if (keyphrase->n_hmms < 1) continue; last_hmm = kws_nth_hmm(keyphrase, keyphrase->n_hmms - 1); if (hmm_is_active(last_hmm) && hmm_out_score(pl_best_hmm) BETTER_THAN WORST_SCORE) { if (hmm_out_score(last_hmm) - hmm_out_score(pl_best_hmm) >= keyphrase->threshold) { int32 prob = hmm_out_score(last_hmm) - hmm_out_score(pl_best_hmm) - KWS_MAX; kws_detections_add(kwss->detections, keyphrase->word, hmm_out_history(last_hmm), kwss->frame, prob, hmm_out_score(last_hmm)); } /* keyphrase is spotted */ } /* last hmm of keyphrase is active */ } /* keyphrase loop */ /* Make transition for all phone loop hmms */ for (i = 0; i < kwss->n_pl; i++) { if (hmm_out_score(pl_best_hmm) + kwss->plp BETTER_THAN hmm_in_score(&kwss->pl_hmms[i])) { hmm_enter(&kwss->pl_hmms[i], hmm_out_score(pl_best_hmm) + kwss->plp, hmm_out_history(pl_best_hmm), kwss->frame + 1); } } /* Activate new keyphrase nodes, enter their hmms */ for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { kws_keyphrase_t *keyphrase = gnode_ptr(gn); if (keyphrase->n_hmms < 1) continue; for (i = keyphrase->n_hmms - 1; i > 0; i--) { hmm_t *pred_hmm = kws_nth_hmm(keyphrase, i - 1); hmm_t *hmm = kws_nth_hmm(keyphrase, i); if (hmm_is_active(pred_hmm)) { if (!hmm_is_active(hmm) || hmm_out_score(pred_hmm) BETTER_THAN hmm_in_score(hmm)) hmm_enter(hmm, hmm_out_score(pred_hmm), hmm_out_history(pred_hmm), kwss->frame + 1); } } /* Enter keyphrase start node from phone loop */ if (hmm_out_score(pl_best_hmm) BETTER_THAN hmm_in_score(kws_nth_hmm(keyphrase, 0))) hmm_enter(kws_nth_hmm(keyphrase, 0), hmm_out_score(pl_best_hmm), kwss->frame, kwss->frame + 1); } } static int kws_search_read_list(kws_search_t *kwss, const char* keyfile) { FILE *list_file; lineiter_t *li; char *line; if ((list_file = fopen(keyfile, "r")) == NULL) { E_ERROR_SYSTEM("Failed to open keyphrase file '%s'", keyfile); return -1; } kwss->keyphrases = NULL; /* read keyphrases */ for (li = lineiter_start_clean(list_file); li; li = lineiter_next(li)) { size_t begin, end; kws_keyphrase_t *keyphrase; if (li->len == 0) continue; keyphrase = ckd_calloc(1, sizeof(kws_keyphrase_t)); line = li->buf; end = strlen(line) - 1; begin = end - 1; if (line[end] == '/') { while (line[begin] != '/' && begin > 0) begin--; line[end] = 0; line[begin] = 0; keyphrase->threshold = (int32) logmath_log(kwss->base.acmod->lmath, atof_c(line + begin + 1)) >> SENSCR_SHIFT; } else { keyphrase->threshold = kwss->def_threshold; } keyphrase->word = ckd_salloc(line); kwss->keyphrases = glist_add_ptr(kwss->keyphrases, keyphrase); } fclose(list_file); return 0; } ps_search_t * kws_search_init(const char *name, const char *keyphrase, const char *keyfile, cmd_ln_t * config, acmod_t * acmod, dict_t * dict, dict2pid_t * d2p) { kws_search_t *kwss = (kws_search_t *) ckd_calloc(1, sizeof(*kwss)); ps_search_init(ps_search_base(kwss), &kws_funcs, PS_SEARCH_TYPE_KWS, name, config, acmod, dict, d2p); kwss->detections = (kws_detections_t *)ckd_calloc(1, sizeof(*kwss->detections)); kwss->beam = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-beam")) >> SENSCR_SHIFT; kwss->plp = (int32) logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-kws_plp")) >> SENSCR_SHIFT; kwss->def_threshold = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-kws_threshold")) >> SENSCR_SHIFT; kwss->delay = (int32) cmd_ln_int32_r(config, "-kws_delay"); E_INFO("KWS(beam: %d, plp: %d, default threshold %d, delay %d)\n", kwss->beam, kwss->plp, kwss->def_threshold, kwss->delay); if (keyfile) { if (kws_search_read_list(kwss, keyfile) < 0) { E_ERROR("Failed to create kws search\n"); kws_search_free(ps_search_base(kwss)); return NULL; } } else { kws_keyphrase_t *k = ckd_calloc(1, sizeof(kws_keyphrase_t)); k->threshold = kwss->def_threshold; k->word = ckd_salloc(keyphrase); kwss->keyphrases = glist_add_ptr(NULL, k); } /* Reinit for provided keyphrase */ if (kws_search_reinit(ps_search_base(kwss), ps_search_dict(kwss), ps_search_dict2pid(kwss)) < 0) { ps_search_free(ps_search_base(kwss)); return NULL; } ptmr_init(&kwss->perf); return ps_search_base(kwss); } void kws_search_free(ps_search_t * search) { kws_search_t *kwss; double n_speech; gnode_t *gn; kwss = (kws_search_t *) search; n_speech = (double)kwss->n_tot_frame / cmd_ln_int32_r(ps_search_config(kwss), "-frate"); E_INFO("TOTAL kws %.2f CPU %.3f xRT\n", kwss->perf.t_tot_cpu, kwss->perf.t_tot_cpu / n_speech); E_INFO("TOTAL kws %.2f wall %.3f xRT\n", kwss->perf.t_tot_elapsed, kwss->perf.t_tot_elapsed / n_speech); ps_search_base_free(search); hmm_context_free(kwss->hmmctx); kws_detections_reset(kwss->detections); ckd_free(kwss->detections); ckd_free(kwss->pl_hmms); for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { kws_keyphrase_t *keyphrase = gnode_ptr(gn); ckd_free(keyphrase->hmms); ckd_free(keyphrase->word); ckd_free(keyphrase); } glist_free(kwss->keyphrases); ckd_free(kwss); } int kws_search_reinit(ps_search_t * search, dict_t * dict, dict2pid_t * d2p) { char **wrdptr; char *tmp_keyphrase; int32 wid, pronlen, in_dict; int32 n_hmms, n_wrds; int32 ssid, tmatid; int i, j, p; kws_search_t *kwss = (kws_search_t *) search; bin_mdef_t *mdef = search->acmod->mdef; int32 silcipid = bin_mdef_silphone(mdef); gnode_t *gn; /* Free old dict2pid, dict */ ps_search_base_reinit(search, dict, d2p); /* Initialize HMM context. */ if (kwss->hmmctx) hmm_context_free(kwss->hmmctx); kwss->hmmctx = hmm_context_init(bin_mdef_n_emit_state(search->acmod->mdef), search->acmod->tmat->tp, NULL, search->acmod->mdef->sseq); if (kwss->hmmctx == NULL) return -1; /* Initialize phone loop HMMs. */ if (kwss->pl_hmms) { for (i = 0; i < kwss->n_pl; ++i) hmm_deinit((hmm_t *) & kwss->pl_hmms[i]); ckd_free(kwss->pl_hmms); } kwss->n_pl = bin_mdef_n_ciphone(search->acmod->mdef); kwss->pl_hmms = (hmm_t *) ckd_calloc(kwss->n_pl, sizeof(*kwss->pl_hmms)); for (i = 0; i < kwss->n_pl; ++i) { hmm_init(kwss->hmmctx, (hmm_t *) & kwss->pl_hmms[i], FALSE, bin_mdef_pid2ssid(search->acmod->mdef, i), bin_mdef_pid2tmatid(search->acmod->mdef, i)); } for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { kws_keyphrase_t *keyphrase = gnode_ptr(gn); /* Initialize keyphrase HMMs */ tmp_keyphrase = (char *) ckd_salloc(keyphrase->word); n_wrds = str2words(tmp_keyphrase, NULL, 0); wrdptr = (char **) ckd_calloc(n_wrds, sizeof(*wrdptr)); str2words(tmp_keyphrase, wrdptr, n_wrds); /* count amount of hmms */ n_hmms = 0; in_dict = TRUE; for (i = 0; i < n_wrds; i++) { wid = dict_wordid(dict, wrdptr[i]); if (wid == BAD_S3WID) { E_ERROR("Word '%s' in phrase '%s' is missing in the dictionary\n", wrdptr[i], keyphrase->word); in_dict = FALSE; break; } pronlen = dict_pronlen(dict, wid); n_hmms += pronlen; } if (!in_dict) { ckd_free(wrdptr); ckd_free(tmp_keyphrase); continue; } /* allocate node array */ if (keyphrase->hmms) ckd_free(keyphrase->hmms); keyphrase->hmms = (hmm_t *) ckd_calloc(n_hmms, sizeof(hmm_t)); keyphrase->n_hmms = n_hmms; /* fill node array */ j = 0; for (i = 0; i < n_wrds; i++) { wid = dict_wordid(dict, wrdptr[i]); pronlen = dict_pronlen(dict, wid); for (p = 0; p < pronlen; p++) { int32 ci = dict_pron(dict, wid, p); if (p == 0) { /* first phone of word */ int32 rc = pronlen > 1 ? dict_pron(dict, wid, 1) : silcipid; ssid = dict2pid_ldiph_lc(d2p, ci, rc, silcipid); } else if (p == pronlen - 1) { /* last phone of the word */ int32 lc = dict_pron(dict, wid, p - 1); xwdssid_t *rssid = dict2pid_rssid(d2p, ci, lc); int j = rssid->cimap[silcipid]; ssid = rssid->ssid[j]; } else { /* word internal phone */ ssid = dict2pid_internal(d2p, wid, p); } tmatid = bin_mdef_pid2tmatid(mdef, ci); hmm_init(kwss->hmmctx, &keyphrase->hmms[j], FALSE, ssid, tmatid); j++; } } ckd_free(wrdptr); ckd_free(tmp_keyphrase); } return 0; } int kws_search_start(ps_search_t * search) { int i; kws_search_t *kwss = (kws_search_t *) search; kwss->frame = 0; kwss->bestscore = 0; kws_detections_reset(kwss->detections); /* Reset and enter all phone-loop HMMs. */ for (i = 0; i < kwss->n_pl; ++i) { hmm_t *hmm = (hmm_t *) & kwss->pl_hmms[i]; hmm_clear(hmm); hmm_enter(hmm, 0, -1, 0); } ptmr_reset(&kwss->perf); ptmr_start(&kwss->perf); return 0; } int kws_search_step(ps_search_t * search, int frame_idx) { int16 const *senscr; kws_search_t *kwss = (kws_search_t *) search; acmod_t *acmod = search->acmod; /* Activate senones */ if (!acmod->compallsen) kws_search_sen_active(kwss); /* Calculate senone scores for current frame. */ senscr = acmod_score(acmod, &frame_idx); /* Evaluate hmms in phone loop and in active keyphrase nodes */ kws_search_hmm_eval(kwss, senscr); /* Prune hmms with low prob */ kws_search_hmm_prune(kwss); /* Do hmms transitions */ kws_search_trans(kwss); ++kwss->frame; return 0; } int kws_search_finish(ps_search_t * search) { kws_search_t *kwss; int32 cf; kwss = (kws_search_t *) search; kwss->n_tot_frame += kwss->frame; /* Print out some statistics. */ ptmr_stop(&kwss->perf); /* This is the number of frames processed. */ cf = ps_search_acmod(kwss)->output_frame; if (cf > 0) { double n_speech = (double) (cf + 1) / cmd_ln_int32_r(ps_search_config(kwss), "-frate"); E_INFO("kws %.2f CPU %.3f xRT\n", kwss->perf.t_cpu, kwss->perf.t_cpu / n_speech); E_INFO("kws %.2f wall %.3f xRT\n", kwss->perf.t_elapsed, kwss->perf.t_elapsed / n_speech); } return 0; } char const * kws_search_hyp(ps_search_t * search, int32 * out_score) { kws_search_t *kwss = (kws_search_t *) search; if (out_score) *out_score = 0; if (search->hyp_str) ckd_free(search->hyp_str); search->hyp_str = kws_detections_hyp_str(kwss->detections, kwss->frame, kwss->delay); return search->hyp_str; } char * kws_search_get_keyphrases(ps_search_t * search) { int c, len; kws_search_t *kwss; char* line; gnode_t *gn; kwss = (kws_search_t *) search; len = 0; for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) len += strlen(((kws_keyphrase_t *)gnode_ptr(gn))->word) + 1; c = 0; line = (char *)ckd_calloc(len, sizeof(*line)); for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { const char *str = ((kws_keyphrase_t *)gnode_ptr(gn))->word; memcpy(&line[c], str, strlen(str)); c += strlen(str); line[c++] = '\n'; } line[--c] = '\0'; return line; } pocketsphinx-5prealpha/src/libpocketsphinx/ms_mgau.h0000664000175000017500000001271112771605033020203 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * ms_mgau.h -- Essentially a wrapper that wrap up gauden and * senone. It supports multi-stream. * * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1997 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** * HISTORY * $Log$ * Revision 1.1 2006/04/05 20:27:30 dhdfu * A Great Reorganzation of header files and executables * * Revision 1.3 2006/02/22 16:57:15 arthchan2003 * Fixed minor dox-doc issue * * Revision 1.2 2006/02/22 16:56:01 arthchan2003 * Merged from SPHINX3_5_2_RCI_IRII_BRANCH: Added ms_mgau.[ch] into the trunk. It is a wrapper of ms_gauden and ms_senone * * Revision 1.1.2.4 2005/09/25 18:55:19 arthchan2003 * Added a flag to turn on and off precomputation. * * Revision 1.1.2.3 2005/08/03 18:53:44 dhdfu * Add memory deallocation functions. Also move all the initialization * of ms_mgau_model_t into ms_mgau_init (duh!), which entails removing it * from decode_anytopo and friends. * * Revision 1.1.2.2 2005/08/02 21:05:38 arthchan2003 * 1, Added dist and mgau_active as intermediate variable for computation. 2, Added ms_cont_mgau_frame_eval, which is a multi stream version of GMM computation mainly s3.0 family of tools. 3, Fixed dox-doc. * * Revision 1.1.2.1 2005/07/20 19:37:09 arthchan2003 * Added a multi-stream cont_mgau (ms_mgau) which is a wrapper of both gauden and senone. Add ms_mgau_init and model_set_mllr. This allow eliminating 600 lines of code in decode_anytopo/align/allphone. * * * */ /** \file ms_mgau.h * * \brief (Sphinx 3.0 specific) A module that wraps up the code of * gauden and senone because they are closely related. * * At the time at Sphinx 3.1 to 3.2, Ravi has decided to rewrite only * single-stream part of the code into cont_mgau.[ch]. This marks the * beginning of historical problem of having two sets of Gaussian * distribution computation routine, one for single-stream and one of * multi-stream. * * In Sphinx 3.5, when we figure out that it is possible to allow both * 3.0 family of tools and 3.x family of tools to coexist. This * becomes one problem we found that very hard to reconcile. That is * why we currently allow two versions of the code in the code * base. This is likely to change in the future. */ #ifndef _LIBFBS_MS_CONT_MGAU_H_ #define _LIBFBS_MS_CONT_MGAU_H_ /* SphinxBase headers. */ #include #include #include /* Local headers. */ #include "acmod.h" #include "bin_mdef.h" #include "ms_gauden.h" #include "ms_senone.h" /** \struct ms_mgau_t \brief Multi-stream mixture gaussian. It is not necessary to be continr */ typedef struct { ps_mgau_t base; gauden_t* g; /**< The codebook */ senone_t* s; /**< The senone */ int topn; /**< Top-n gaussian will be computed */ /**< Intermediate used in computation */ gauden_dist_t ***dist; uint8 *mgau_active; cmd_ln_t *config; } ms_mgau_model_t; #define ms_mgau_gauden(msg) (msg->g) #define ms_mgau_senone(msg) (msg->s) #define ms_mgau_topn(msg) (msg->topn) ps_mgau_t* ms_mgau_init(acmod_t *acmod, logmath_t *lmath, bin_mdef_t *mdef); void ms_mgau_free(ps_mgau_t *g); int32 ms_cont_mgau_frame_eval(ps_mgau_t * msg, int16 *senscr, uint8 *senone_active, int32 n_senone_active, mfcc_t ** feat, int32 frame, int32 compallsen); int32 ms_mgau_mllr_transform(ps_mgau_t *s, ps_mllr_t *mllr); #endif /* _LIBFBS_MS_CONT_MGAU_H_*/ pocketsphinx-5prealpha/src/libpocketsphinx/ps_alignment.h0000664000175000017500000001212712771605033021234 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2010 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ps_alignment.h Multi-level alignment structure */ #ifndef __PS_ALIGNMENT_H__ #define __PS_ALIGNMENT_H__ /* System headers. */ /* SphinxBase headers. */ #include /* Local headers. */ #include "dict2pid.h" #include "hmm.h" #define PS_ALIGNMENT_NONE ((uint16)0xffff) struct ps_alignment_entry_s { union { int32 wid; struct { uint16 ssid; uint16 cipid; uint16 tmatid; } pid; uint16 senid; } id; int16 start; int16 duration; int32 score; uint16 parent; uint16 child; }; typedef struct ps_alignment_entry_s ps_alignment_entry_t; struct ps_alignment_vector_s { ps_alignment_entry_t *seq; uint16 n_ent, n_alloc; }; typedef struct ps_alignment_vector_s ps_alignment_vector_t; struct ps_alignment_s { dict2pid_t *d2p; ps_alignment_vector_t word; ps_alignment_vector_t sseq; ps_alignment_vector_t state; }; typedef struct ps_alignment_s ps_alignment_t; struct ps_alignment_iter_s { ps_alignment_t *al; ps_alignment_vector_t *vec; int pos; }; typedef struct ps_alignment_iter_s ps_alignment_iter_t; /** * Create a new, empty alignment. */ ps_alignment_t *ps_alignment_init(dict2pid_t *d2p); /** * Release an alignment */ int ps_alignment_free(ps_alignment_t *al); /** * Append a word. */ int ps_alignment_add_word(ps_alignment_t *al, int32 wid, int duration); /** * Populate lower layers using available word information. */ int ps_alignment_populate(ps_alignment_t *al); /** * Populate lower layers using context-independent phones. */ int ps_alignment_populate_ci(ps_alignment_t *al); /** * Propagate timing information up from state sequence. */ int ps_alignment_propagate(ps_alignment_t *al); /** * Number of words. */ int ps_alignment_n_words(ps_alignment_t *al); /** * Number of phones. */ int ps_alignment_n_phones(ps_alignment_t *al); /** * Number of states. */ int ps_alignment_n_states(ps_alignment_t *al); /** * Iterate over the alignment starting at the first word. */ ps_alignment_iter_t *ps_alignment_words(ps_alignment_t *al); /** * Iterate over the alignment starting at the first phone. */ ps_alignment_iter_t *ps_alignment_phones(ps_alignment_t *al); /** * Iterate over the alignment starting at the first state. */ ps_alignment_iter_t *ps_alignment_states(ps_alignment_t *al); /** * Get the alignment entry pointed to by an iterator. */ ps_alignment_entry_t *ps_alignment_iter_get(ps_alignment_iter_t *itor); /** * Move alignment iterator to given index. */ ps_alignment_iter_t *ps_alignment_iter_goto(ps_alignment_iter_t *itor, int pos); /** * Move an alignment iterator forward. */ ps_alignment_iter_t *ps_alignment_iter_next(ps_alignment_iter_t *itor); /** * Move an alignment iterator back. */ ps_alignment_iter_t *ps_alignment_iter_prev(ps_alignment_iter_t *itor); /** * Get a new iterator starting at the parent of the current node. */ ps_alignment_iter_t *ps_alignment_iter_up(ps_alignment_iter_t *itor); /** * Get a new iterator starting at the first child of the current node. */ ps_alignment_iter_t *ps_alignment_iter_down(ps_alignment_iter_t *itor); /** * Release an iterator before completing all iterations. */ int ps_alignment_iter_free(ps_alignment_iter_t *itor); #endif /* __PS_ALIGNMENT_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/Makefile.am0000664000175000017500000000302512771605033020434 00000000000000ARCH = `uname -m | sed s/i.86/i386/`_`uname -s | tr A-Z a-z` lib_LTLIBRARIES = libpocketsphinx.la libpocketsphinx_la_LDFLAGS = -version-info 3:0:0 -lm libpocketsphinx_la_SOURCES = \ acmod.c \ bin_mdef.c \ blkarray_list.c \ dict.c \ dict2pid.c \ fsg_history.c \ fsg_lextree.c \ fsg_search.c \ allphone_search.c \ kws_search.c \ kws_detections.c \ hmm.c \ mdef.c \ ms_gauden.c \ ms_mgau.c \ ms_senone.c \ ngram_search.c \ ngram_search_fwdtree.c \ ngram_search_fwdflat.c \ phone_loop_search.c \ ps_alignment.c \ ps_lattice.c \ ps_mllr.c \ ptm_mgau.c \ s2_semi_mgau.c \ state_align_search.c \ tmat.c \ vector.c \ pocketsphinx.c noinst_HEADERS = \ pocketsphinx_internal.h \ acmod.h \ ngram_search.h \ bin_mdef.h \ blkarray_list.h \ dict.h \ dict2pid.h \ fsg_history.h \ fsg_lextree.h \ fsg_search_internal.h \ allphone_search.h \ kws_search.h \ kws_detections.h \ hmm.h \ mdef.h \ ms_gauden.h \ ms_mgau.h \ ms_senone.h \ ngram_search.h \ ngram_search_fwdtree.h \ ngram_search_fwdflat.h \ phone_loop_search.h \ ps_alignment.h \ ps_lattice_internal.h \ ptm_mgau.h \ s2_semi_mgau.h \ s3types.h \ state_align_search.h \ tied_mgau_common.h \ tmat.h \ vector.h AM_CFLAGS =\ -I$(top_srcdir)/include \ -I$(top_builddir)/include \ -DMODELDIR=\"${prefix}/share/pocketsphinx/model\" pocketsphinx-5prealpha/src/libpocketsphinx/ngram_search.h0000664000175000017500000003647412771605033021220 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ngram_search.h N-Gram based multi-pass search ("FBS") */ #ifndef __NGRAM_SEARCH_H__ #define __NGRAM_SEARCH_H__ /* SphinxBase headers. */ #include #include #include #include #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "hmm.h" /** * Lexical tree node data type. * * Not the first HMM for words, which multiplex HMMs based on * different left contexts. This structure is used both in the * dynamic HMM tree structure and in the per-word last-phone right * context fanout. */ typedef struct chan_s { hmm_t hmm; /**< Basic HMM structure. This *must* be first in the structure because chan_t and root_chan_t are sometimes used interchangeably */ struct chan_s *next; /**< first descendant of this channel; or, in the case of the last phone of a word, the next alternative right context channel */ struct chan_s *alt; /**< sibling; i.e., next descendant of parent HMM */ int32 ciphone; /**< ciphone for this node */ union { int32 penult_phn_wid; /**< list of words whose last phone follows this one; this field indicates the first of the list; the rest must be built up in a separate array. Used only within HMM tree. -1 if none */ int32 rc_id; /**< right-context id for last phone of words */ } info; } chan_t; /** * Lexical tree node data type for the first phone (root) of each dynamic HMM tree * structure. * * Each state may have a different parent static HMM. Most fields are * similar to those in chan_t. */ typedef struct root_chan_s { hmm_t hmm; /**< Basic HMM structure. This *must* be first in the structure because chan_t and root_chan_t are sometimes used interchangeably. */ chan_t *next; /**< first descendant of this channel */ int32 penult_phn_wid; int32 this_phn_wid; /**< list of words consisting of this single phone; actually the first of the list, like penult_phn_wid; -1 if none */ int16 ciphone; /**< first ciphone of this node; all words rooted at this node begin with this ciphone */ int16 ci2phone; /**< second ciphone of this node; one root HMM for each unique right context */ } root_chan_t; /** * Back pointer table (forward pass lattice; actually a tree) */ typedef struct bptbl_s { frame_idx_t frame; /**< start or end frame */ uint8 valid; /**< For absolute pruning */ uint8 refcnt; /**< Reference count (number of successors) */ int32 wid; /**< Word index */ int32 bp; /**< Back Pointer */ int32 score; /**< Score (best among all right contexts) */ int32 s_idx; /**< Start of BScoreStack for various right contexts*/ int32 real_wid; /**< wid of this or latest predecessor real word */ int32 prev_real_wid; /**< wid of second-last real word */ int16 last_phone; /**< last phone of this word */ int16 last2_phone; /**< next-to-last phone of this word */ } bptbl_t; /** * Segmentation "iterator" for backpointer table results. */ typedef struct bptbl_seg_s { ps_seg_t base; /**< Base structure. */ int32 *bpidx; /**< Sequence of backpointer IDs. */ int16 n_bpidx; /**< Number of backpointer IDs. */ int16 cur; /**< Current position in bpidx. */ } bptbl_seg_t; /* * Candidates words for entering their last phones. Cleared and rebuilt in each * frame. * NOTE: candidates can only be multi-phone, real dictionary words. */ typedef struct lastphn_cand_s { int32 wid; int32 score; int32 bp; int32 next; /* next candidate starting at the same frame */ } lastphn_cand_t; /* * Since the same instance of a word (i.e., ) reaches its last * phone several times, we can compute its best BP and LM transition score info * just the first time and cache it for future occurrences. Structure for such * a cache. */ typedef struct { int32 sf; /* Start frame */ int32 dscr; /* Delta-score upon entering last phone */ int32 bp; /* Best BP */ } last_ltrans_t; #define CAND_SF_ALLOCSIZE 32 typedef struct { int32 bp_ef; int32 cand; } cand_sf_t; /* * Structure for reorganizing the BP table entries in the current frame according * to distinct right context ci-phones. Each entry contains the best BP entry for * a given right context. Each successor word will pick up the correct entry based * on its first ci-phone. */ typedef struct bestbp_rc_s { int32 score; int32 path; /* BP table index corresponding to this entry */ int32 lc; /* right most ci-phone of above BP entry word */ } bestbp_rc_t; #define NO_BP -1 /** * Various statistics for profiling. */ typedef struct ngram_search_stats_s { int32 n_phone_eval; int32 n_root_chan_eval; int32 n_nonroot_chan_eval; int32 n_last_chan_eval; int32 n_word_lastchan_eval; int32 n_lastphn_cand_utt; int32 n_fwdflat_chan; int32 n_fwdflat_words; int32 n_fwdflat_word_transition; int32 n_senone_active_utt; } ngram_search_stats_t; /** * N-Gram search module structure. */ struct ngram_search_s { ps_search_t base; ngram_model_t *lmset; /**< Set of language models. */ hmm_context_t *hmmctx; /**< HMM context. */ /* Flags to quickly indicate which passes are enabled. */ uint8 fwdtree; uint8 fwdflat; uint8 bestpath; /* State of procesing. */ uint8 done; /* Allocators */ listelem_alloc_t *chan_alloc; /**< For chan_t */ listelem_alloc_t *root_chan_alloc; /**< For root_chan_t */ listelem_alloc_t *latnode_alloc; /**< For latnode_t */ /** * Search structure of HMM instances. * * The word triphone sequences (HMM instances) are transformed * into tree structures, one tree per unique left triphone in the * entire dictionary (actually diphone, since its left context * varies dyamically during the search process). The entire set * of trees of channels is allocated once and for all during * initialization (since dynamic management of active CHANs is * time consuming), with one exception: the last phones of words, * that need multiple right context modelling, are not maintained * in this static structure since there are too many of them and * few are active at any time. Instead they are maintained as * linked lists of CHANs, one list per word, and each CHAN in this * set is allocated only on demand and freed if inactive. */ root_chan_t *root_chan; /**< Roots of search tree. */ int32 n_root_chan_alloc; /**< Number of root_chan allocated */ int32 n_root_chan; /**< Number of valid root_chan */ int32 n_nonroot_chan; /**< Number of valid non-root channels */ int32 max_nonroot_chan; /**< Maximum possible number of non-root channels */ root_chan_t *rhmm_1ph; /**< Root HMMs for single-phone words */ /** * Channels associated with a given word (only used for right * contexts, single-phone words in fwdtree search, and word HMMs * in fwdflat search). WARNING: For single-phone words and * fwdflat search, this actually contains pointers to root_chan_t, * which are allocated using root_chan_alloc. This is a * suboptimal state of affairs. */ chan_t **word_chan; bitvec_t *word_active; /**< array of active flags for all words. */ /** * Each node in the HMM tree structure may point to a set of words * whose last phone would follow that node in the tree structure * (but is not included in the tree structure for reasons * explained above). The channel node points to one word in this * set of words. The remaining words are linked through * homophone_set[]. * * Single-phone words are not represented in the HMM tree; they * are kept in word_chan. * * Specifically, homophone_set[w] = wid of next word in the same * set as w. */ int32 *homophone_set; int32 *single_phone_wid; /**< list of single-phone word ids */ int32 n_1ph_words; /**< Number single phone words in dict (total) */ int32 n_1ph_LMwords; /**< Number single phone dict words also in LM; these come first in single_phone_wid */ /** * Array of active channels for current and next frame. * * In any frame, only some HMM tree nodes are active. * active_chan_list[f mod 2] = list of nonroot channels in the HMM * tree active in frame f. */ chan_t ***active_chan_list; int32 n_active_chan[2]; /**< Number entries in active_chan_list */ /** * Array of active multi-phone words for current and next frame. * * Similarly to active_chan_list, active_word_list[f mod 2] = list * of word ids for which active channels exist in word_chan in * frame f. * * Statically allocated single-phone words are always active and * should not appear in this list. */ int32 **active_word_list; int32 n_active_word[2]; /**< Number entries in active_word_list */ /* * FIXME: Document all of these bits. */ lastphn_cand_t *lastphn_cand; int32 n_lastphn_cand; last_ltrans_t *last_ltrans; /* one per word */ int32 cand_sf_alloc; cand_sf_t *cand_sf; bestbp_rc_t *bestbp_rc; bptbl_t *bp_table; /* Forward pass lattice */ int32 bpidx; /* First free BPTable entry */ int32 bp_table_size; int32 *bscore_stack; /* Score stack for all possible right contexts */ int32 bss_head; /* First free BScoreStack entry */ int32 bscore_stack_size; int32 n_frame_alloc; /**< Number of frames allocated in bp_table_idx and friends. */ int32 n_frame; /**< Number of frames actually present. */ int32 *bp_table_idx; /* First BPTable entry for each frame */ int32 *word_lat_idx; /* BPTable index for any word in current frame; cleared before each frame */ /* * Flat lexicon (2nd pass) search stuff. */ ps_latnode_t **frm_wordlist; /**< List of active words in each frame. */ int32 *fwdflat_wordlist; /**< List of active word IDs for utterance. */ bitvec_t *expand_word_flag; int32 *expand_word_list; int32 n_expand_words; int32 min_ef_width; int32 max_sf_win; float32 fwdflat_fwdtree_lw_ratio; int32 best_score; /**< Best Viterbi path score. */ int32 last_phone_best_score; /**< Best Viterbi path score for last phone. */ int32 renormalized; /* * DAG (3rd pass) search stuff. */ float32 bestpath_fwdtree_lw_ratio; float32 ascale; /**< Acoustic score scale for posterior probabilities. */ ngram_search_stats_t st; /**< Various statistics for profiling. */ ptmr_t fwdtree_perf; ptmr_t fwdflat_perf; ptmr_t bestpath_perf; int32 n_tot_frame; /* A collection of beam widths. */ int32 beam; int32 dynamic_beam; int32 pbeam; int32 wbeam; int32 lpbeam; int32 lponlybeam; int32 fwdflatbeam; int32 fwdflatwbeam; int32 fillpen; int32 silpen; int32 wip; int32 nwpen; int32 pip; int32 maxwpf; int32 maxhmmpf; }; typedef struct ngram_search_s ngram_search_t; /** * Initialize the N-Gram search module. */ ps_search_t *ngram_search_init(const char *name, ngram_model_t *lm, cmd_ln_t *config, acmod_t *acmod, dict_t *dict, dict2pid_t *d2p); /** * Finalize the N-Gram search module. */ void ngram_search_free(ps_search_t *ngs); /** * Record the current frame's index in the backpointer table. * * @return the current backpointer index. */ int ngram_search_mark_bptable(ngram_search_t *ngs, int frame_idx); /** * Enter a word in the backpointer table. */ void ngram_search_save_bp(ngram_search_t *ngs, int frame_idx, int32 w, int32 score, int32 path, int32 rc); /** * Allocate last phone channels for all possible right contexts for word w. */ void ngram_search_alloc_all_rc(ngram_search_t *ngs, int32 w); /** * Allocate last phone channels for all possible right contexts for word w. */ void ngram_search_free_all_rc(ngram_search_t *ngs, int32 w); /** * Find the best word exit for the current frame in the backpointer table. * * @return the backpointer index of the best word exit. */ int ngram_search_find_exit(ngram_search_t *ngs, int frame_idx, int32 *out_best_score); /** * Backtrace from a given backpointer index to obtain a word hypothesis. * * @return a read-only string with the best hypothesis. */ char const *ngram_search_bp_hyp(ngram_search_t *ngs, int bpidx); /** * Compute language and acoustic scores for backpointer table entries. */ void ngram_compute_seg_scores(ngram_search_t *ngs, float32 lwf); /** * Construct a word lattice from the current hypothesis. */ ps_lattice_t *ngram_search_lattice(ps_search_t *search); /** * Get the exit score for a backpointer entry with a given right context. */ int32 ngram_search_exit_score(ngram_search_t *ngs, bptbl_t *pbe, int rcphone); /** * Sets the global language model. * * Sets the language model to use if nothing was passed in configuration */ void ngram_search_set_lm(ngram_model_t *lm); #endif /* __NGRAM_SEARCH_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/dict2pid.h0000664000175000017500000001347212771605033020262 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2014 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ #ifndef _S3_DICT2PID_H_ #define _S3_DICT2PID_H_ /* System headers. */ #include /* SphinxBase headers. */ #include #include /* Local headers. */ #include "s3types.h" #include "bin_mdef.h" #include "dict.h" /** \file dict2pid.h * \brief Building triphones for a dictionary. * * This is one of the more complicated parts of a cross-word * triphone model decoder. The first and last phones of each word * get their left and right contexts, respectively, from other * words. For single-phone words, both its contexts are from other * words, simultaneously. As these words are not known beforehand, * life gets complicated. */ #ifdef __cplusplus extern "C" { #endif /** * \struct xwdssid_t * \brief cross word triphone model structure */ typedef struct { s3ssid_t *ssid; /**< Senone Sequence ID list for all context ciphones */ s3cipid_t *cimap; /**< Index into ssid[] above for each ci phone */ int32 n_ssid; /**< #Unique ssid in above, compressed ssid list */ } xwdssid_t; /** \struct dict2pid_t \brief Building composite triphone (as well as word internal triphones) with the dictionary. */ typedef struct { int refcount; bin_mdef_t *mdef; /**< Model definition, used to generate internal ssids on the fly. */ dict_t *dict; /**< Dictionary this table refers to. */ /*Notice the order of the arguments */ /* FIXME: This is crying out for compression - in Mandarin we have * 180 context independent phones, which makes this an 11MB * array. */ s3ssid_t ***ldiph_lc; /**< For multi-phone words, [base][rc][lc] -> ssid; filled out for word-initial base x rc combinations in current vocabulary */ xwdssid_t **rssid; /**< Right context state sequence id table First dimension: base phone, Second dimension: left context. */ s3ssid_t ***lrdiph_rc; /**< For single-phone words, [base][lc][rc] -> ssid; filled out for single-phone base x lc combinations in current vocabulary */ xwdssid_t **lrssid; /**< Left-Right context state sequence id table First dimension: base phone, Second dimension: left context. */ } dict2pid_t; /** Access macros; not designed for arbitrary use */ #define dict2pid_rssid(d,ci,lc) (&(d)->rssid[ci][lc]) #define dict2pid_ldiph_lc(d,b,r,l) ((d)->ldiph_lc[b][r][l]) #define dict2pid_lrdiph_rc(d,b,l,r) ((d)->lrdiph_rc[b][l][r]) /** * Build the dict2pid structure for the given model/dictionary */ dict2pid_t *dict2pid_build(bin_mdef_t *mdef, /**< A model definition*/ dict_t *dict /**< An initialized dictionary */ ); /** * Retain a pointer to dict2pid */ dict2pid_t *dict2pid_retain(dict2pid_t *d2p); /** * Free the memory dict2pid structure */ int dict2pid_free(dict2pid_t *d2p /**< In: the d2p */ ); /** * Return the senone sequence ID for the given word position. */ s3ssid_t dict2pid_internal(dict2pid_t *d2p, int32 wid, int pos); /** * Add a word to the dict2pid structure (after adding it to dict). */ int dict2pid_add_word(dict2pid_t *d2p, int32 wid); /** * For debugging */ void dict2pid_dump(FILE *fp, /**< In: a file pointer */ dict2pid_t *d2p /**< In: a dict2pid_t structure */ ); /** Report a dict2pid data structure */ void dict2pid_report(dict2pid_t *d2p /**< In: a dict2pid_t structure */ ); /** * Get number of rc */ int32 get_rc_nssid(dict2pid_t *d2p, /**< In: a dict2pid */ s3wid_t w /**< In: a wid */ ); /** * Get RC map */ s3cipid_t* dict2pid_get_rcmap(dict2pid_t *d2p, /**< In: a dict2pid */ s3wid_t w /**< In: a wid */ ); #ifdef __cplusplus } #endif #endif pocketsphinx-5prealpha/src/libpocketsphinx/dict2pid.c0000664000175000017500000004633112771605033020255 00000000000000/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ #include #include "dict2pid.h" #include "hmm.h" /** * @file dict2pid.c - dictionary word to senone sequence mappings */ void compress_table(s3ssid_t * uncomp_tab, s3ssid_t * com_tab, s3cipid_t * ci_map, int32 n_ci) { int32 found; int32 r; int32 tmp_r; for (r = 0; r < n_ci; r++) { com_tab[r] = BAD_S3SSID; ci_map[r] = BAD_S3CIPID; } /** Compress this map */ for (r = 0; r < n_ci; r++) { found = 0; for (tmp_r = 0; tmp_r < r && com_tab[tmp_r] != BAD_S3SSID; tmp_r++) { /* If it appears before, just filled in cimap; */ if (uncomp_tab[r] == com_tab[tmp_r]) { found = 1; ci_map[r] = tmp_r; break; } } if (found == 0) { com_tab[tmp_r] = uncomp_tab[r]; ci_map[r] = tmp_r; } } } static void compress_right_context_tree(dict2pid_t * d2p, s3ssid_t ***rdiph_rc) { int32 n_ci; int32 b, l, r; s3ssid_t *rmap; s3ssid_t *tmpssid; s3cipid_t *tmpcimap; bin_mdef_t *mdef = d2p->mdef; size_t alloc; n_ci = mdef->n_ciphone; tmpssid = ckd_calloc(n_ci, sizeof(s3ssid_t)); tmpcimap = ckd_calloc(n_ci, sizeof(s3cipid_t)); d2p->rssid = (xwdssid_t **) ckd_calloc(mdef->n_ciphone, sizeof(xwdssid_t *)); alloc = mdef->n_ciphone * sizeof(xwdssid_t *); for (b = 0; b < n_ci; b++) { d2p->rssid[b] = (xwdssid_t *) ckd_calloc(mdef->n_ciphone, sizeof(xwdssid_t)); alloc += mdef->n_ciphone * sizeof(xwdssid_t); for (l = 0; l < n_ci; l++) { rmap = rdiph_rc[b][l]; compress_table(rmap, tmpssid, tmpcimap, mdef->n_ciphone); for (r = 0; r < mdef->n_ciphone && tmpssid[r] != BAD_S3SSID; r++); if (tmpssid[0] != BAD_S3SSID) { d2p->rssid[b][l].ssid = ckd_calloc(r, sizeof(s3ssid_t)); memcpy(d2p->rssid[b][l].ssid, tmpssid, r * sizeof(s3ssid_t)); d2p->rssid[b][l].cimap = ckd_calloc(mdef->n_ciphone, sizeof(s3cipid_t)); memcpy(d2p->rssid[b][l].cimap, tmpcimap, (mdef->n_ciphone) * sizeof(s3cipid_t)); d2p->rssid[b][l].n_ssid = r; } else { d2p->rssid[b][l].ssid = NULL; d2p->rssid[b][l].cimap = NULL; d2p->rssid[b][l].n_ssid = 0; } } } E_INFO("Allocated %d bytes (%d KiB) for word-final triphones\n", (int)alloc, (int)alloc / 1024); ckd_free(tmpssid); ckd_free(tmpcimap); } static void compress_left_right_context_tree(dict2pid_t * d2p) { int32 n_ci; int32 b, l, r; s3ssid_t *rmap; s3ssid_t *tmpssid; s3cipid_t *tmpcimap; bin_mdef_t *mdef = d2p->mdef; size_t alloc; n_ci = mdef->n_ciphone; tmpssid = ckd_calloc(n_ci, sizeof(s3ssid_t)); tmpcimap = ckd_calloc(n_ci, sizeof(s3cipid_t)); assert(d2p->lrdiph_rc); d2p->lrssid = (xwdssid_t **) ckd_calloc(mdef->n_ciphone, sizeof(xwdssid_t *)); alloc = mdef->n_ciphone * sizeof(xwdssid_t *); for (b = 0; b < n_ci; b++) { d2p->lrssid[b] = (xwdssid_t *) ckd_calloc(mdef->n_ciphone, sizeof(xwdssid_t)); alloc += mdef->n_ciphone * sizeof(xwdssid_t); for (l = 0; l < n_ci; l++) { rmap = d2p->lrdiph_rc[b][l]; compress_table(rmap, tmpssid, tmpcimap, mdef->n_ciphone); for (r = 0; r < mdef->n_ciphone && tmpssid[r] != BAD_S3SSID; r++); if (tmpssid[0] != BAD_S3SSID) { d2p->lrssid[b][l].ssid = ckd_calloc(r, sizeof(s3ssid_t)); memcpy(d2p->lrssid[b][l].ssid, tmpssid, r * sizeof(s3ssid_t)); d2p->lrssid[b][l].cimap = ckd_calloc(mdef->n_ciphone, sizeof(s3cipid_t)); memcpy(d2p->lrssid[b][l].cimap, tmpcimap, (mdef->n_ciphone) * sizeof(s3cipid_t)); d2p->lrssid[b][l].n_ssid = r; } else { d2p->lrssid[b][l].ssid = NULL; d2p->lrssid[b][l].cimap = NULL; d2p->lrssid[b][l].n_ssid = 0; } } } /* Try to compress lrdiph_rc into lrdiph_rc_compressed */ ckd_free(tmpssid); ckd_free(tmpcimap); E_INFO("Allocated %d bytes (%d KiB) for single-phone word triphones\n", (int)alloc, (int)alloc / 1024); } /** ARCHAN, A duplicate of get_rc_npid in ctxt_table.h. I doubt whether it is correct because the compressed map has not been checked. */ int32 get_rc_nssid(dict2pid_t * d2p, s3wid_t w) { int32 pronlen; s3cipid_t b, lc; dict_t *dict = d2p->dict; pronlen = dict->word[w].pronlen; b = dict->word[w].ciphone[pronlen - 1]; if (pronlen == 1) { /* Is this true ? No known left context. But all cimaps (for any l) are identical; pick one */ /*E_INFO("Single phone word\n"); */ return (d2p->lrssid[b][0].n_ssid); } else { /* E_INFO("Multiple phone word\n"); */ lc = dict->word[w].ciphone[pronlen - 2]; return (d2p->rssid[b][lc].n_ssid); } } s3cipid_t * dict2pid_get_rcmap(dict2pid_t * d2p, s3wid_t w) { int32 pronlen; s3cipid_t b, lc; dict_t *dict = d2p->dict; pronlen = dict->word[w].pronlen; b = dict->word[w].ciphone[pronlen - 1]; if (pronlen == 1) { /* Is this true ? No known left context. But all cimaps (for any l) are identical; pick one */ /*E_INFO("Single phone word\n"); */ return (d2p->lrssid[b][0].cimap); } else { /* E_INFO("Multiple phone word\n"); */ lc = dict->word[w].ciphone[pronlen - 2]; return (d2p->rssid[b][lc].cimap); } } static void free_compress_map(xwdssid_t ** tree, int32 n_ci) { int32 b, l; for (b = 0; b < n_ci; b++) { for (l = 0; l < n_ci; l++) { ckd_free(tree[b][l].ssid); ckd_free(tree[b][l].cimap); } ckd_free(tree[b]); } ckd_free(tree); } static void populate_lrdiph(dict2pid_t *d2p, s3ssid_t ***rdiph_rc, s3cipid_t b) { bin_mdef_t *mdef = d2p->mdef; s3cipid_t l, r; for (l = 0; l < bin_mdef_n_ciphone(mdef); l++) { for (r = 0; r < bin_mdef_n_ciphone(mdef); r++) { s3pid_t p; p = bin_mdef_phone_id_nearest(mdef, (s3cipid_t) b, (s3cipid_t) l, (s3cipid_t) r, WORD_POSN_SINGLE); d2p->lrdiph_rc[b][l][r] = bin_mdef_pid2ssid(mdef, p); if (r == bin_mdef_silphone(mdef)) d2p->ldiph_lc[b][r][l] = bin_mdef_pid2ssid(mdef, p); if (rdiph_rc && l == bin_mdef_silphone(mdef)) rdiph_rc[b][l][r] = bin_mdef_pid2ssid(mdef, p); assert(IS_S3SSID(bin_mdef_pid2ssid(mdef, p))); E_DEBUG(2,("%s(%s,%s) => %d / %d\n", bin_mdef_ciphone_str(mdef, b), bin_mdef_ciphone_str(mdef, l), bin_mdef_ciphone_str(mdef, r), p, bin_mdef_pid2ssid(mdef, p))); } } } int dict2pid_add_word(dict2pid_t *d2p, int32 wid) { bin_mdef_t *mdef = d2p->mdef; dict_t *d = d2p->dict; if (dict_pronlen(d, wid) > 1) { s3cipid_t l; /* Make sure we have left and right context diphones for this * word. */ if (d2p->ldiph_lc[dict_first_phone(d, wid)][dict_second_phone(d, wid)][0] == BAD_S3SSID) { E_DEBUG(2, ("Filling in left-context diphones for %s(?,%s)\n", bin_mdef_ciphone_str(mdef, dict_first_phone(d, wid)), bin_mdef_ciphone_str(mdef, dict_second_phone(d, wid)))); for (l = 0; l < bin_mdef_n_ciphone(mdef); l++) { int p = bin_mdef_phone_id_nearest(mdef, dict_first_phone(d, wid), l, dict_second_phone(d, wid), WORD_POSN_BEGIN); d2p->ldiph_lc[dict_first_phone(d, wid)][dict_second_phone(d, wid)][l] = bin_mdef_pid2ssid(mdef, p); } } if (d2p->rssid[dict_last_phone(d, wid)][dict_second_last_phone(d, wid)].n_ssid == 0) { s3ssid_t *rmap; s3ssid_t *tmpssid; s3cipid_t *tmpcimap; s3cipid_t r; E_DEBUG(2, ("Filling in right-context diphones for %s(%s,?)\n", bin_mdef_ciphone_str(mdef, dict_last_phone(d, wid)), bin_mdef_ciphone_str(mdef, dict_second_last_phone(d, wid)))); rmap = ckd_calloc(bin_mdef_n_ciphone(mdef), sizeof(*rmap)); for (r = 0; r < bin_mdef_n_ciphone(mdef); r++) { int p = bin_mdef_phone_id_nearest(mdef, dict_last_phone(d, wid), dict_second_last_phone(d, wid), r, WORD_POSN_END); rmap[r] = bin_mdef_pid2ssid(mdef, p); } tmpssid = ckd_calloc(bin_mdef_n_ciphone(mdef), sizeof(*tmpssid)); tmpcimap = ckd_calloc(bin_mdef_n_ciphone(mdef), sizeof(*tmpcimap)); compress_table(rmap, tmpssid, tmpcimap, bin_mdef_n_ciphone(mdef)); for (r = 0; r < mdef->n_ciphone && tmpssid[r] != BAD_S3SSID; r++) ; d2p->rssid[dict_last_phone(d, wid)][dict_second_last_phone(d, wid)].ssid = tmpssid; d2p->rssid[dict_last_phone(d, wid)][dict_second_last_phone(d, wid)].cimap = tmpcimap; d2p->rssid[dict_last_phone(d, wid)][dict_second_last_phone(d, wid)].n_ssid = r; ckd_free(rmap); } } else { /* Make sure we have a left-right context triphone entry for * this word. */ E_INFO("Filling in context triphones for %s(?,?)\n", bin_mdef_ciphone_str(mdef, dict_first_phone(d, wid))); if (d2p->lrdiph_rc[dict_first_phone(d, wid)][0][0] == BAD_S3SSID) { populate_lrdiph(d2p, NULL, dict_first_phone(d, wid)); } } return 0; } s3ssid_t dict2pid_internal(dict2pid_t *d2p, int32 wid, int pos) { int b, l, r, p; dict_t *dict = d2p->dict; bin_mdef_t *mdef = d2p->mdef; if (pos == 0 || pos == dict_pronlen(dict, wid)) return BAD_S3SSID; b = dict_pron(dict, wid, pos); l = dict_pron(dict, wid, pos - 1); r = dict_pron(dict, wid, pos + 1); p = bin_mdef_phone_id_nearest(mdef, (s3cipid_t) b, (s3cipid_t) l, (s3cipid_t) r, WORD_POSN_INTERNAL); return bin_mdef_pid2ssid(mdef, p); } dict2pid_t * dict2pid_build(bin_mdef_t * mdef, dict_t * dict) { dict2pid_t *dict2pid; s3ssid_t ***rdiph_rc; bitvec_t *ldiph, *rdiph, *single; int32 pronlen; int32 b, l, r, w, p; E_INFO("Building PID tables for dictionary\n"); assert(mdef); assert(dict); dict2pid = (dict2pid_t *) ckd_calloc(1, sizeof(dict2pid_t)); dict2pid->refcount = 1; dict2pid->mdef = bin_mdef_retain(mdef); dict2pid->dict = dict_retain(dict); E_INFO("Allocating %d^3 * %d bytes (%d KiB) for word-initial triphones\n", mdef->n_ciphone, sizeof(s3ssid_t), mdef->n_ciphone * mdef->n_ciphone * mdef->n_ciphone * sizeof(s3ssid_t) / 1024); dict2pid->ldiph_lc = (s3ssid_t ***) ckd_calloc_3d(mdef->n_ciphone, mdef->n_ciphone, mdef->n_ciphone, sizeof(s3ssid_t)); /* Only used internally to generate rssid */ rdiph_rc = (s3ssid_t ***) ckd_calloc_3d(mdef->n_ciphone, mdef->n_ciphone, mdef->n_ciphone, sizeof(s3ssid_t)); dict2pid->lrdiph_rc = (s3ssid_t ***) ckd_calloc_3d(mdef->n_ciphone, mdef->n_ciphone, mdef->n_ciphone, sizeof (s3ssid_t)); /* Actually could use memset for this, if BAD_S3SSID is guaranteed * to be 65535... */ for (b = 0; b < mdef->n_ciphone; ++b) { for (r = 0; r < mdef->n_ciphone; ++r) { for (l = 0; l < mdef->n_ciphone; ++l) { dict2pid->ldiph_lc[b][r][l] = BAD_S3SSID; dict2pid->lrdiph_rc[b][l][r] = BAD_S3SSID; rdiph_rc[b][l][r] = BAD_S3SSID; } } } /* Track which diphones / ciphones have been seen. */ ldiph = bitvec_alloc(mdef->n_ciphone * mdef->n_ciphone); rdiph = bitvec_alloc(mdef->n_ciphone * mdef->n_ciphone); single = bitvec_alloc(mdef->n_ciphone); for (w = 0; w < dict_size(dict2pid->dict); w++) { pronlen = dict_pronlen(dict, w); if (pronlen >= 2) { b = dict_first_phone(dict, w); r = dict_second_phone(dict, w); /* Populate ldiph_lc */ if (bitvec_is_clear(ldiph, b * mdef->n_ciphone + r)) { /* Mark this diphone as done */ bitvec_set(ldiph, b * mdef->n_ciphone + r); /* Record all possible ssids for b(?,r) */ for (l = 0; l < bin_mdef_n_ciphone(mdef); l++) { p = bin_mdef_phone_id_nearest(mdef, (s3cipid_t) b, (s3cipid_t) l, (s3cipid_t) r, WORD_POSN_BEGIN); dict2pid->ldiph_lc[b][r][l] = bin_mdef_pid2ssid(mdef, p); } } /* Populate rdiph_rc */ l = dict_second_last_phone(dict, w); b = dict_last_phone(dict, w); if (bitvec_is_clear(rdiph, b * mdef->n_ciphone + l)) { /* Mark this diphone as done */ bitvec_set(rdiph, b * mdef->n_ciphone + l); for (r = 0; r < bin_mdef_n_ciphone(mdef); r++) { p = bin_mdef_phone_id_nearest(mdef, (s3cipid_t) b, (s3cipid_t) l, (s3cipid_t) r, WORD_POSN_END); rdiph_rc[b][l][r] = bin_mdef_pid2ssid(mdef, p); } } } else if (pronlen == 1) { b = dict_pron(dict, w, 0); E_DEBUG(1,("Building tables for single phone word %s phone %d = %s\n", dict_wordstr(dict, w), b, bin_mdef_ciphone_str(mdef, b))); /* Populate lrdiph_rc (and also ldiph_lc, rdiph_rc if needed) */ if (bitvec_is_clear(single, b)) { populate_lrdiph(dict2pid, rdiph_rc, b); bitvec_set(single, b); } } } bitvec_free(ldiph); bitvec_free(rdiph); bitvec_free(single); /* Try to compress rdiph_rc into rdiph_rc_compressed */ compress_right_context_tree(dict2pid, rdiph_rc); compress_left_right_context_tree(dict2pid); ckd_free_3d(rdiph_rc); dict2pid_report(dict2pid); return dict2pid; } dict2pid_t * dict2pid_retain(dict2pid_t *d2p) { ++d2p->refcount; return d2p; } int dict2pid_free(dict2pid_t * d2p) { if (d2p == NULL) return 0; if (--d2p->refcount > 0) return d2p->refcount; if (d2p->ldiph_lc) ckd_free_3d((void ***) d2p->ldiph_lc); if (d2p->lrdiph_rc) ckd_free_3d((void ***) d2p->lrdiph_rc); if (d2p->rssid) free_compress_map(d2p->rssid, bin_mdef_n_ciphone(d2p->mdef)); if (d2p->lrssid) free_compress_map(d2p->lrssid, bin_mdef_n_ciphone(d2p->mdef)); bin_mdef_free(d2p->mdef); dict_free(d2p->dict); ckd_free(d2p); return 0; } void dict2pid_report(dict2pid_t * d2p) { } void dict2pid_dump(FILE * fp, dict2pid_t * d2p) { int32 w, p, pronlen; int32 i, j, b, l, r; bin_mdef_t *mdef = d2p->mdef; dict_t *dict = d2p->dict; fprintf(fp, "# INTERNAL (wd comssid ssid ssid ... ssid comssid)\n"); for (w = 0; w < dict_size(dict); w++) { fprintf(fp, "%30s ", dict_wordstr(dict, w)); pronlen = dict_pronlen(dict, w); for (p = 0; p < pronlen; p++) fprintf(fp, " %5d", dict2pid_internal(d2p, w, p)); fprintf(fp, "\n"); } fprintf(fp, "#\n"); fprintf(fp, "# LDIPH_LC (b r l ssid)\n"); for (b = 0; b < bin_mdef_n_ciphone(mdef); b++) { for (r = 0; r < bin_mdef_n_ciphone(mdef); r++) { for (l = 0; l < bin_mdef_n_ciphone(mdef); l++) { if (IS_S3SSID(d2p->ldiph_lc[b][r][l])) fprintf(fp, "%6s %6s %6s %5d\n", bin_mdef_ciphone_str(mdef, (s3cipid_t) b), bin_mdef_ciphone_str(mdef, (s3cipid_t) r), bin_mdef_ciphone_str(mdef, (s3cipid_t) l), d2p->ldiph_lc[b][r][l]); /* RAH, ldiph_lc is returning an int32, %d expects an int16 */ } } } fprintf(fp, "#\n"); fprintf(fp, "# SSEQ %d (senid senid ...)\n", mdef->n_sseq); for (i = 0; i < mdef->n_sseq; i++) { fprintf(fp, "%5d ", i); for (j = 0; j < bin_mdef_n_emit_state(mdef); j++) fprintf(fp, " %5d", mdef->sseq[i][j]); fprintf(fp, "\n"); } fprintf(fp, "#\n"); fprintf(fp, "# END\n"); fflush(fp); } pocketsphinx-5prealpha/src/libpocketsphinx/fsg_history.c0000664000175000017500000002130412771605033021104 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * fsg_history.c -- FSG Viterbi decode history * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1999 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** * * HISTORY * * 25-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * Started.. */ /* System headers. */ #include /* SphinxBase headers. */ #include #include #include /* Local headers. */ #include "fsg_search_internal.h" #include "fsg_history.h" #define __FSG_DBG__ 0 fsg_history_t * fsg_history_init(fsg_model_t * fsg, dict_t *dict) { fsg_history_t *h; h = (fsg_history_t *) ckd_calloc(1, sizeof(fsg_history_t)); h->fsg = fsg; h->entries = blkarray_list_init(); if (fsg && dict) { h->n_ciphone = bin_mdef_n_ciphone(dict->mdef); h->frame_entries = (glist_t **) ckd_calloc_2d(fsg_model_n_state(fsg), bin_mdef_n_ciphone(dict->mdef), sizeof(**h->frame_entries)); } else { h->frame_entries = NULL; } return h; } void fsg_history_free(fsg_history_t *h) { int32 s, lc, ns, np; gnode_t *gn; if (h->fsg) { ns = fsg_model_n_state(h->fsg); np = h->n_ciphone; for (s = 0; s < ns; s++) { for (lc = 0; lc < np; lc++) { for (gn = h->frame_entries[s][lc]; gn; gn = gnode_next(gn)) { ckd_free(gnode_ptr(gn)); } glist_free(h->frame_entries[s][lc]); } } } ckd_free_2d(h->frame_entries); blkarray_list_free(h->entries); ckd_free(h); } void fsg_history_set_fsg(fsg_history_t *h, fsg_model_t *fsg, dict_t *dict) { if (blkarray_list_n_valid(h->entries) != 0) { E_WARN("Switching FSG while history not empty; history cleared\n"); blkarray_list_reset(h->entries); } if (h->frame_entries) ckd_free_2d((void **) h->frame_entries); h->frame_entries = NULL; h->fsg = fsg; if (fsg && dict) { h->n_ciphone = bin_mdef_n_ciphone(dict->mdef); h->frame_entries = (glist_t **) ckd_calloc_2d(fsg_model_n_state(fsg), bin_mdef_n_ciphone(dict->mdef), sizeof(glist_t)); } } void fsg_history_entry_add(fsg_history_t * h, fsg_link_t * link, int32 frame, int32 score, int32 pred, int32 lc, fsg_pnode_ctxt_t rc) { fsg_hist_entry_t *entry, *new_entry; int32 s; gnode_t *gn, *prev_gn; /* Skip the optimization for the initial dummy entries; always enter them */ if (frame < 0) { new_entry = (fsg_hist_entry_t *) ckd_calloc(1, sizeof(fsg_hist_entry_t)); new_entry->fsglink = link; new_entry->frame = frame; new_entry->score = score; new_entry->pred = pred; new_entry->lc = lc; new_entry->rc = rc; blkarray_list_append(h->entries, (void *) new_entry); return; } s = fsg_link_to_state(link); /* Locate where this entry should be inserted in frame_entries[s][lc] */ prev_gn = NULL; for (gn = h->frame_entries[s][lc]; gn; gn = gnode_next(gn)) { entry = (fsg_hist_entry_t *) gnode_ptr(gn); if (score BETTER_THAN entry->score) break; /* Found where to insert new entry */ /* Existing entry score not worse than new score */ if (FSG_PNODE_CTXT_SUB(&rc, &(entry->rc)) == 0) return; /* rc set reduced to 0; new entry can be ignored */ prev_gn = gn; } /* Create new entry after prev_gn (if prev_gn is NULL, at head) */ new_entry = (fsg_hist_entry_t *) ckd_calloc(1, sizeof(fsg_hist_entry_t)); new_entry->fsglink = link; new_entry->frame = frame; new_entry->score = score; new_entry->pred = pred; new_entry->lc = lc; new_entry->rc = rc; /* Note: rc set must be non-empty at this point */ if (!prev_gn) { h->frame_entries[s][lc] = glist_add_ptr(h->frame_entries[s][lc], (void *) new_entry); prev_gn = h->frame_entries[s][lc]; } else prev_gn = glist_insert_ptr(prev_gn, (void *) new_entry); /* * Update the rc set of all the remaining entries in the list. At this * point, gn is the entry, if any, immediately following new entry. */ while (gn) { entry = (fsg_hist_entry_t *) gnode_ptr(gn); if (FSG_PNODE_CTXT_SUB(&(entry->rc), &rc) == 0) { /* rc set of entry reduced to 0; can prune this entry */ ckd_free((void *) entry); gn = gnode_free(gn, prev_gn); } else { prev_gn = gn; gn = gnode_next(gn); } } } /* * Transfer the surviving history entries for this frame into the permanent * history table. */ void fsg_history_end_frame(fsg_history_t * h) { int32 s, lc, ns, np; gnode_t *gn; fsg_hist_entry_t *entry; ns = fsg_model_n_state(h->fsg); np = h->n_ciphone; for (s = 0; s < ns; s++) { for (lc = 0; lc < np; lc++) { for (gn = h->frame_entries[s][lc]; gn; gn = gnode_next(gn)) { entry = (fsg_hist_entry_t *) gnode_ptr(gn); blkarray_list_append(h->entries, (void *) entry); } glist_free(h->frame_entries[s][lc]); h->frame_entries[s][lc] = NULL; } } } fsg_hist_entry_t * fsg_history_entry_get(fsg_history_t * h, int32 id) { return ((fsg_hist_entry_t *) blkarray_list_get(h->entries, id)); } void fsg_history_reset(fsg_history_t * h) { blkarray_list_reset(h->entries); } int32 fsg_history_n_entries(fsg_history_t * h) { return (blkarray_list_n_valid(h->entries)); } void fsg_history_utt_start(fsg_history_t * h) { int32 s, lc, ns, np; assert(blkarray_list_n_valid(h->entries) == 0); assert(h->frame_entries); ns = fsg_model_n_state(h->fsg); np = h->n_ciphone; for (s = 0; s < ns; s++) { for (lc = 0; lc < np; lc++) { assert(h->frame_entries[s][lc] == NULL); } } } void fsg_history_utt_end(fsg_history_t * h) { } void fsg_history_print(fsg_history_t *h, dict_t *dict) { int bpidx, bp; for (bpidx = 0; bpidx < blkarray_list_n_valid(h->entries); bpidx++) { bp = bpidx; printf("History entry: "); while (bp > 0) { fsg_hist_entry_t *hist_entry = fsg_history_entry_get(h, bp); fsg_link_t *fl = fsg_hist_entry_fsglink(hist_entry); char const *baseword; int32 wid; bp = fsg_hist_entry_pred(hist_entry); wid = fsg_link_wid(fl); if (fl == NULL) continue; baseword = fsg_model_word_str(h->fsg, wid); printf("%s(%d->%d:%d) ", baseword, fsg_link_from_state(hist_entry->fsglink), fsg_link_to_state(hist_entry->fsglink), hist_entry->frame); } printf("\n"); } } pocketsphinx-5prealpha/src/libpocketsphinx/pocketsphinx_internal.h0000664000175000017500000002123612771605033023170 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file pocketsphinx_internal.h Internal implementation of * PocketSphinx decoder. * @author David Huggins-Daines */ #ifndef __POCKETSPHINX_INTERNAL_H__ #define __POCKETSPHINX_INTERNAL_H__ /* SphinxBase headers. */ #include #include #include #include #include #include /* Local headers. */ #include "pocketsphinx.h" #include "acmod.h" #include "dict.h" #include "dict2pid.h" /** * Search algorithm structure. */ typedef struct ps_search_s ps_search_t; /* Search names*/ #define PS_DEFAULT_SEARCH "_default" #define PS_DEFAULT_PL_SEARCH "_default_pl" /* Search types */ #define PS_SEARCH_TYPE_KWS "kws" #define PS_SEARCH_TYPE_FSG "fsg" #define PS_SEARCH_TYPE_NGRAM "ngram" #define PS_SEARCH_TYPE_ALLPHONE "allphone" #define PS_SEARCH_TYPE_STATE_ALIGN "state_align" #define PS_SEARCH_TYPE_PHONE_LOOP "phone_loop" /** * V-table for search algorithm. */ typedef struct ps_searchfuncs_s { int (*start)(ps_search_t *search); int (*step)(ps_search_t *search, int frame_idx); int (*finish)(ps_search_t *search); int (*reinit)(ps_search_t *search, dict_t *dict, dict2pid_t *d2p); void (*free)(ps_search_t *search); ps_lattice_t *(*lattice)(ps_search_t *search); char const *(*hyp)(ps_search_t *search, int32 *out_score); int32 (*prob)(ps_search_t *search); ps_seg_t *(*seg_iter)(ps_search_t *search); } ps_searchfuncs_t; /** * Base structure for search module. */ struct ps_search_s { ps_searchfuncs_t *vt; /**< V-table of search methods. */ char *type; char *name; ps_search_t *pls; /**< Phoneme loop for lookahead. */ cmd_ln_t *config; /**< Configuration. */ acmod_t *acmod; /**< Acoustic model. */ dict_t *dict; /**< Pronunciation dictionary. */ dict2pid_t *d2p; /**< Dictionary to senone mappings. */ char *hyp_str; /**< Current hypothesis string. */ ps_lattice_t *dag; /**< Current hypothesis word graph. */ ps_latlink_t *last_link; /**< Final link in best path. */ int32 post; /**< Utterance posterior probability. */ int32 n_words; /**< Number of words known to search (may be less than in the dictionary) */ /* Magical word IDs that must exist in the dictionary: */ int32 start_wid; /**< Start word ID. */ int32 silence_wid; /**< Silence word ID. */ int32 finish_wid; /**< Finish word ID. */ }; #define ps_search_base(s) ((ps_search_t *)s) #define ps_search_config(s) ps_search_base(s)->config #define ps_search_acmod(s) ps_search_base(s)->acmod #define ps_search_dict(s) ps_search_base(s)->dict #define ps_search_dict2pid(s) ps_search_base(s)->d2p #define ps_search_dag(s) ps_search_base(s)->dag #define ps_search_last_link(s) ps_search_base(s)->last_link #define ps_search_post(s) ps_search_base(s)->post #define ps_search_lookahead(s) ps_search_base(s)->pls #define ps_search_n_words(s) ps_search_base(s)->n_words #define ps_search_type(s) ps_search_base(s)->type #define ps_search_name(s) ps_search_base(s)->name #define ps_search_start(s) (*(ps_search_base(s)->vt->start))(s) #define ps_search_step(s,i) (*(ps_search_base(s)->vt->step))(s,i) #define ps_search_finish(s) (*(ps_search_base(s)->vt->finish))(s) #define ps_search_reinit(s,d,d2p) (*(ps_search_base(s)->vt->reinit))(s,d,d2p) #define ps_search_free(s) (*(ps_search_base(s)->vt->free))(s) #define ps_search_lattice(s) (*(ps_search_base(s)->vt->lattice))(s) #define ps_search_hyp(s,sc) (*(ps_search_base(s)->vt->hyp))(s,sc) #define ps_search_prob(s) (*(ps_search_base(s)->vt->prob))(s) #define ps_search_seg_iter(s) (*(ps_search_base(s)->vt->seg_iter))(s) /* For convenience... */ #define ps_search_silence_wid(s) ps_search_base(s)->silence_wid #define ps_search_start_wid(s) ps_search_base(s)->start_wid #define ps_search_finish_wid(s) ps_search_base(s)->finish_wid /** * Initialize base structure. */ void ps_search_init(ps_search_t *search, ps_searchfuncs_t *vt, const char *type, const char *name, cmd_ln_t *config, acmod_t *acmod, dict_t *dict, dict2pid_t *d2p); /** * Free search */ void ps_search_base_free(ps_search_t *search); /** * Re-initialize base structure with new dictionary. */ void ps_search_base_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p); typedef struct ps_segfuncs_s { ps_seg_t *(*seg_next)(ps_seg_t *seg); void (*seg_free)(ps_seg_t *seg); } ps_segfuncs_t; /** * Base structure for hypothesis segmentation iterator. */ struct ps_seg_s { ps_segfuncs_t *vt; /**< V-table of seg methods */ ps_search_t *search; /**< Search object from whence this came */ char const *word; /**< Word string (pointer into dictionary hash) */ frame_idx_t sf; /**< Start frame. */ frame_idx_t ef; /**< End frame. */ int32 ascr; /**< Acoustic score. */ int32 lscr; /**< Language model score. */ int32 prob; /**< Log posterior probability. */ /* This doesn't need to be 32 bits, so once the scores above are * reduced to 16 bits (or less!), this will be too. */ int32 lback; /**< Language model backoff. */ /* Not sure if this should be here at all. */ float32 lwf; /**< Language weight factor (for second-pass searches) */ }; #define ps_search_seg_next(seg) (*(seg->vt->seg_next))(seg) #define ps_search_seg_free(s) (*(seg->vt->seg_free))(seg) /** * Decoder object. */ struct ps_decoder_s { /* Model parameters and such. */ cmd_ln_t *config; /**< Configuration. */ int refcount; /**< Reference count. */ /* Basic units of computation. */ acmod_t *acmod; /**< Acoustic model. */ dict_t *dict; /**< Pronunciation dictionary. */ dict2pid_t *d2p; /**< Dictionary to senone mapping. */ logmath_t *lmath; /**< Log math computation. */ /* Search modules. */ hash_table_t *searches; /**< Set of search modules. */ /* TODO: Convert this to a stack of searches each with their own * lookahead value. */ ps_search_t *search; /**< Currently active search module. */ ps_search_t *phone_loop; /**< Phone loop search for lookahead. */ int pl_window; /**< Window size for phoneme lookahead. */ /* Utterance-processing related stuff. */ uint32 uttno; /**< Utterance counter. */ ptmr_t perf; /**< Performance counter for all of decoding. */ uint32 n_frame; /**< Total number of frames processed. */ char const *mfclogdir; /**< Log directory for MFCC files. */ char const *rawlogdir; /**< Log directory for audio files. */ char const *senlogdir; /**< Log directory for senone score files. */ }; struct ps_search_iter_s { hash_iter_t itor; }; #endif /* __POCKETSPHINX_INTERNAL_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/kws_detections.c0000664000175000017500000000733012771605033021574 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2014 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * kws_detections.c -- Object for storing keyphrase search results */ #include "kws_detections.h" void kws_detections_reset(kws_detections_t *detections) { gnode_t *gn; if (!detections->detect_list) return; for (gn = detections->detect_list; gn; gn = gnode_next(gn)) ckd_free(gnode_ptr(gn)); glist_free(detections->detect_list); detections->detect_list = NULL; } void kws_detections_add(kws_detections_t *detections, const char* keyphrase, int sf, int ef, int prob, int ascr) { gnode_t *gn; kws_detection_t* detection; for (gn = detections->detect_list; gn; gn = gnode_next(gn)) { kws_detection_t *det = (kws_detection_t *)gnode_ptr(gn); if (strcmp(keyphrase, det->keyphrase) == 0 && det->sf < ef && det->ef > sf) { if (det->prob < prob) { det->sf = sf; det->ef = ef; det->prob = prob; det->ascr = ascr; } return; } } /* Nothing found */ detection = (kws_detection_t *)ckd_calloc(1, sizeof(*detection)); detection->sf = sf; detection->ef = ef; detection->keyphrase = keyphrase; detection->prob = prob; detection->ascr = ascr; detections->detect_list = glist_add_ptr(detections->detect_list, detection); } char * kws_detections_hyp_str(kws_detections_t *detections, int frame, int delay) { gnode_t *gn; char *c; int len; char *hyp_str; len = 0; for (gn = detections->detect_list; gn; gn = gnode_next(gn)) { kws_detection_t *det = (kws_detection_t *)gnode_ptr(gn); if (det->ef < frame - delay) { len += strlen(det->keyphrase) + 1; } } if (len == 0) { return NULL; } hyp_str = (char *)ckd_calloc(len, sizeof(char)); c = hyp_str; for (gn = detections->detect_list; gn; gn = gnode_next(gn)) { kws_detection_t *det = (kws_detection_t *)gnode_ptr(gn); if (det->ef < frame - delay) { memcpy(c, det->keyphrase, strlen(det->keyphrase)); c += strlen(det->keyphrase); *c = ' '; c++; } } if (c > hyp_str) { c--; *c = '\0'; } return hyp_str; } pocketsphinx-5prealpha/src/libpocketsphinx/vector.h0000664000175000017500000000604612771605033020061 00000000000000/* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * vector.h -- vector routines. * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1997 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** */ #ifndef __VECTOR_H__ #define __VECTOR_H__ /* System headers. */ #include /* SphinxBase headers. */ #include typedef float32 *vector_t; /* * The reason for some of the "trivial" routines below is that they could be OPTIMIZED for SPEED * at some point. */ /* Floor all elements of v[0..dim-1] to min value of f */ void vector_floor(vector_t v, int32 dim, float64 f); /* Floor all non-0 elements of v[0..dim-1] to min value of f */ void vector_nz_floor(vector_t v, int32 dim, float64 f); /* * Normalize the elements of the given vector so that they sum to 1.0. If the sum is 0.0 * to begin with, the vector is left untouched. Return value: The normalization factor. */ float64 vector_sum_norm(vector_t v, int32 dim); /* Print vector in one line, in %11.4e format, terminated by newline */ void vector_print(FILE *fp, vector_t v, int32 dim); /* Return TRUE iff given vector is all 0.0 */ int32 vector_is_zero (float32 *vec, /* In: Vector to be checked */ int32 len); /* In: Length of above vector */ #endif /* VECTOR_H */ pocketsphinx-5prealpha/src/libpocketsphinx/s2_semi_mgau.c0000664000175000017500000012517012771605033021124 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* System headers */ #include #include #include #include #include #include #if defined(__ADSPBLACKFIN__) #elif !defined(_WIN32_WCE) #include #endif /* SphinxBase headers */ #include #include #include #include #include #include #include /* Local headers */ #include "s2_semi_mgau.h" #include "tied_mgau_common.h" static ps_mgaufuncs_t s2_semi_mgau_funcs = { "s2_semi", s2_semi_mgau_frame_eval, /* frame_eval */ s2_semi_mgau_mllr_transform, /* transform */ s2_semi_mgau_free /* free */ }; struct vqFeature_s { int32 score; /* score or distance */ int32 codeword; /* codeword (vector index) */ }; static void eval_topn(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) { int i, ceplen; vqFeature_t *topn; topn = s->f[feat]; ceplen = s->g->featlen[feat]; for (i = 0; i < s->max_topn; i++) { mfcc_t *mean, diff, sqdiff, compl; /* diff, diff^2, component likelihood */ vqFeature_t vtmp; mfcc_t *var, d; mfcc_t *obs; int32 cw, j; cw = topn[i].codeword; mean = s->g->mean[0][feat][0] + cw * ceplen; var = s->g->var[0][feat][0] + cw * ceplen; d = s->g->det[0][feat][cw]; obs = z; for (j = 0; j < ceplen; j++) { diff = *obs++ - *mean++; sqdiff = MFCCMUL(diff, diff); compl = MFCCMUL(sqdiff, *var); d = GMMSUB(d, compl); ++var; } topn[i].score = (int32)d; if (i == 0) continue; vtmp = topn[i]; for (j = i - 1; j >= 0 && (int32)d > topn[j].score; j--) { topn[j + 1] = topn[j]; } topn[j + 1] = vtmp; } } static void eval_cb(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) { vqFeature_t *worst, *best, *topn; mfcc_t *mean; mfcc_t *var, *det, *detP, *detE; int32 i, ceplen; best = topn = s->f[feat]; worst = topn + (s->max_topn - 1); mean = s->g->mean[0][feat][0]; var = s->g->var[0][feat][0]; det = s->g->det[0][feat]; detE = det + s->g->n_density; ceplen = s->g->featlen[feat]; for (detP = det; detP < detE; ++detP) { mfcc_t diff, sqdiff, compl; /* diff, diff^2, component likelihood */ mfcc_t d; mfcc_t *obs; vqFeature_t *cur; int32 cw, j; d = *detP; obs = z; cw = (int)(detP - det); for (j = 0; (j < ceplen) && (d >= worst->score); ++j) { diff = *obs++ - *mean++; sqdiff = MFCCMUL(diff, diff); compl = MFCCMUL(sqdiff, *var); d = GMMSUB(d, compl); ++var; } if (j < ceplen) { /* terminated early, so not in topn */ mean += (ceplen - j); var += (ceplen - j); continue; } if ((int32)d < worst->score) continue; for (i = 0; i < s->max_topn; i++) { /* already there, so don't need to insert */ if (topn[i].codeword == cw) break; } if (i < s->max_topn) continue; /* already there. Don't insert */ /* remaining code inserts codeword and dist in correct spot */ for (cur = worst - 1; cur >= best && (int32)d >= cur->score; --cur) memcpy(cur + 1, cur, sizeof(vqFeature_t)); ++cur; cur->codeword = cw; cur->score = (int32)d; } } static void mgau_dist(s2_semi_mgau_t * s, int32 frame, int32 feat, mfcc_t * z) { eval_topn(s, feat, z); /* If this frame is skipped, do nothing else. */ if (frame % s->ds_ratio) return; /* Evaluate the rest of the codebook (or subset thereof). */ eval_cb(s, feat, z); } static int mgau_norm(s2_semi_mgau_t *s, int feat) { int32 norm; int j; /* Compute quantized normalizing constant. */ norm = s->f[feat][0].score >> SENSCR_SHIFT; /* Normalize the scores, negate them, and clamp their dynamic range. */ for (j = 0; j < s->max_topn; ++j) { s->f[feat][j].score = -((s->f[feat][j].score >> SENSCR_SHIFT) - norm); if (s->f[feat][j].score > MAX_NEG_ASCR) s->f[feat][j].score = MAX_NEG_ASCR; if (s->topn_beam[feat] && s->f[feat][j].score > s->topn_beam[feat]) break; } return j; } static int32 get_scores_8b_feat_6(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3, *pid_cw4, *pid_cw5; pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; pid_cw2 = s->mixw[i][s->f[i][2].codeword]; pid_cw3 = s->mixw[i][s->f[i][3].codeword]; pid_cw4 = s->mixw[i][s->f[i][4].codeword]; pid_cw5 = s->mixw[i][s->f[i][5].codeword]; for (l = j = 0; j < n_senone_active; j++) { int sen = senone_active[j] + l; int32 tmp = pid_cw0[sen] + s->f[i][0].score; tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw1[sen] + s->f[i][1].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw2[sen] + s->f[i][2].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw3[sen] + s->f[i][3].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw4[sen] + s->f[i][4].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw5[sen] + s->f[i][5].score); senone_scores[sen] += tmp; l = sen; } return 0; } static int32 get_scores_8b_feat_5(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3, *pid_cw4; pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; pid_cw2 = s->mixw[i][s->f[i][2].codeword]; pid_cw3 = s->mixw[i][s->f[i][3].codeword]; pid_cw4 = s->mixw[i][s->f[i][4].codeword]; for (l = j = 0; j < n_senone_active; j++) { int sen = senone_active[j] + l; int32 tmp = pid_cw0[sen] + s->f[i][0].score; tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw1[sen] + s->f[i][1].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw2[sen] + s->f[i][2].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw3[sen] + s->f[i][3].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw4[sen] + s->f[i][4].score); senone_scores[sen] += tmp; l = sen; } return 0; } static int32 get_scores_8b_feat_4(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3; pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; pid_cw2 = s->mixw[i][s->f[i][2].codeword]; pid_cw3 = s->mixw[i][s->f[i][3].codeword]; for (l = j = 0; j < n_senone_active; j++) { int sen = senone_active[j] + l; int32 tmp = pid_cw0[sen] + s->f[i][0].score; tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw1[sen] + s->f[i][1].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw2[sen] + s->f[i][2].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw3[sen] + s->f[i][3].score); senone_scores[sen] += tmp; l = sen; } return 0; } static int32 get_scores_8b_feat_3(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1, *pid_cw2; pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; pid_cw2 = s->mixw[i][s->f[i][2].codeword]; for (l = j = 0; j < n_senone_active; j++) { int sen = senone_active[j] + l; int32 tmp = pid_cw0[sen] + s->f[i][0].score; tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw1[sen] + s->f[i][1].score); tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw2[sen] + s->f[i][2].score); senone_scores[sen] += tmp; l = sen; } return 0; } static int32 get_scores_8b_feat_2(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1; pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; for (l = j = 0; j < n_senone_active; j++) { int sen = senone_active[j] + l; int32 tmp = pid_cw0[sen] + s->f[i][0].score; tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw1[sen] + s->f[i][1].score); senone_scores[sen] += tmp; l = sen; } return 0; } static int32 get_scores_8b_feat_1(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0; pid_cw0 = s->mixw[i][s->f[i][0].codeword]; for (l = j = 0; j < n_senone_active; j++) { int sen = senone_active[j] + l; int32 tmp = pid_cw0[sen] + s->f[i][0].score; senone_scores[sen] += tmp; l = sen; } return 0; } static int32 get_scores_8b_feat_any(s2_semi_mgau_t * s, int i, int topn, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, k, l; for (l = j = 0; j < n_senone_active; j++) { int sen = senone_active[j] + l; uint8 *pid_cw; int32 tmp; pid_cw = s->mixw[i][s->f[i][0].codeword]; tmp = pid_cw[sen] + s->f[i][0].score; for (k = 1; k < topn; ++k) { pid_cw = s->mixw[i][s->f[i][k].codeword]; tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw[sen] + s->f[i][k].score); } senone_scores[sen] += tmp; l = sen; } return 0; } static int32 get_scores_8b_feat(s2_semi_mgau_t * s, int i, int topn, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { switch (topn) { case 6: return get_scores_8b_feat_6(s, i, senone_scores, senone_active, n_senone_active); case 5: return get_scores_8b_feat_5(s, i, senone_scores, senone_active, n_senone_active); case 4: return get_scores_8b_feat_4(s, i, senone_scores, senone_active, n_senone_active); case 3: return get_scores_8b_feat_3(s, i, senone_scores, senone_active, n_senone_active); case 2: return get_scores_8b_feat_2(s, i, senone_scores, senone_active, n_senone_active); case 1: return get_scores_8b_feat_1(s, i, senone_scores, senone_active, n_senone_active); default: return get_scores_8b_feat_any(s, i, topn, senone_scores, senone_active, n_senone_active); } } static int32 get_scores_8b_feat_all(s2_semi_mgau_t * s, int i, int topn, int16 *senone_scores) { int32 j, k; for (j = 0; j < s->n_sen; j++) { uint8 *pid_cw; int32 tmp; pid_cw = s->mixw[i][s->f[i][0].codeword]; tmp = pid_cw[j] + s->f[i][0].score; for (k = 1; k < topn; ++k) { pid_cw = s->mixw[i][s->f[i][k].codeword]; tmp = fast_logmath_add(s->lmath_8b, tmp, pid_cw[j] + s->f[i][k].score); } senone_scores[j] += tmp; } return 0; } static int32 get_scores_4b_feat_6(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3, *pid_cw4, *pid_cw5; uint8 w_den[6][16]; /* Precompute scaled densities. */ for (j = 0; j < 16; ++j) { w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; w_den[2][j] = s->mixw_cb[j] + s->f[i][2].score; w_den[3][j] = s->mixw_cb[j] + s->f[i][3].score; w_den[4][j] = s->mixw_cb[j] + s->f[i][4].score; w_den[5][j] = s->mixw_cb[j] + s->f[i][5].score; } pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; pid_cw2 = s->mixw[i][s->f[i][2].codeword]; pid_cw3 = s->mixw[i][s->f[i][3].codeword]; pid_cw4 = s->mixw[i][s->f[i][4].codeword]; pid_cw5 = s->mixw[i][s->f[i][5].codeword]; for (l = j = 0; j < n_senone_active; j++) { int n = senone_active[j] + l; int tmp, cw; if (n & 1) { cw = pid_cw0[n/2] >> 4; tmp = w_den[0][cw]; cw = pid_cw1[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); cw = pid_cw2[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); cw = pid_cw3[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); cw = pid_cw4[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[4][cw]); cw = pid_cw5[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[5][cw]); } else { cw = pid_cw0[n/2] & 0x0f; tmp = w_den[0][cw]; cw = pid_cw1[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); cw = pid_cw2[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); cw = pid_cw3[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); cw = pid_cw4[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[4][cw]); cw = pid_cw5[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[5][cw]); } senone_scores[n] += tmp; l = n; } return 0; } static int32 get_scores_4b_feat_5(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3, *pid_cw4; uint8 w_den[5][16]; /* Precompute scaled densities. */ for (j = 0; j < 16; ++j) { w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; w_den[2][j] = s->mixw_cb[j] + s->f[i][2].score; w_den[3][j] = s->mixw_cb[j] + s->f[i][3].score; w_den[4][j] = s->mixw_cb[j] + s->f[i][4].score; } pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; pid_cw2 = s->mixw[i][s->f[i][2].codeword]; pid_cw3 = s->mixw[i][s->f[i][3].codeword]; pid_cw4 = s->mixw[i][s->f[i][4].codeword]; for (l = j = 0; j < n_senone_active; j++) { int n = senone_active[j] + l; int tmp, cw; if (n & 1) { cw = pid_cw0[n/2] >> 4; tmp = w_den[0][cw]; cw = pid_cw1[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); cw = pid_cw2[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); cw = pid_cw3[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); cw = pid_cw4[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[4][cw]); } else { cw = pid_cw0[n/2] & 0x0f; tmp = w_den[0][cw]; cw = pid_cw1[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); cw = pid_cw2[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); cw = pid_cw3[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); cw = pid_cw4[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[4][cw]); } senone_scores[n] += tmp; l = n; } return 0; } static int32 get_scores_4b_feat_4(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3; uint8 w_den[4][16]; /* Precompute scaled densities. */ for (j = 0; j < 16; ++j) { w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; w_den[2][j] = s->mixw_cb[j] + s->f[i][2].score; w_den[3][j] = s->mixw_cb[j] + s->f[i][3].score; } pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; pid_cw2 = s->mixw[i][s->f[i][2].codeword]; pid_cw3 = s->mixw[i][s->f[i][3].codeword]; for (l = j = 0; j < n_senone_active; j++) { int n = senone_active[j] + l; int tmp, cw; if (n & 1) { cw = pid_cw0[n/2] >> 4; tmp = w_den[0][cw]; cw = pid_cw1[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); cw = pid_cw2[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); cw = pid_cw3[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); } else { cw = pid_cw0[n/2] & 0x0f; tmp = w_den[0][cw]; cw = pid_cw1[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); cw = pid_cw2[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); cw = pid_cw3[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); } senone_scores[n] += tmp; l = n; } return 0; } static int32 get_scores_4b_feat_3(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1, *pid_cw2; uint8 w_den[3][16]; /* Precompute scaled densities. */ for (j = 0; j < 16; ++j) { w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; w_den[2][j] = s->mixw_cb[j] + s->f[i][2].score; } pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; pid_cw2 = s->mixw[i][s->f[i][2].codeword]; for (l = j = 0; j < n_senone_active; j++) { int n = senone_active[j] + l; int tmp, cw; if (n & 1) { cw = pid_cw0[n/2] >> 4; tmp = w_den[0][cw]; cw = pid_cw1[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); cw = pid_cw2[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); } else { cw = pid_cw0[n/2] & 0x0f; tmp = w_den[0][cw]; cw = pid_cw1[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); cw = pid_cw2[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); } senone_scores[n] += tmp; l = n; } return 0; } static int32 get_scores_4b_feat_2(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0, *pid_cw1; uint8 w_den[2][16]; /* Precompute scaled densities. */ for (j = 0; j < 16; ++j) { w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; } pid_cw0 = s->mixw[i][s->f[i][0].codeword]; pid_cw1 = s->mixw[i][s->f[i][1].codeword]; for (l = j = 0; j < n_senone_active; j++) { int n = senone_active[j] + l; int tmp, cw; if (n & 1) { cw = pid_cw0[n/2] >> 4; tmp = w_den[0][cw]; cw = pid_cw1[n/2] >> 4; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); } else { cw = pid_cw0[n/2] & 0x0f; tmp = w_den[0][cw]; cw = pid_cw1[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); } senone_scores[n] += tmp; l = n; } return 0; } static int32 get_scores_4b_feat_1(s2_semi_mgau_t * s, int i, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, l; uint8 *pid_cw0; uint8 w_den[16]; /* Precompute scaled densities. */ for (j = 0; j < 16; ++j) { w_den[j] = s->mixw_cb[j] + s->f[i][0].score; } pid_cw0 = s->mixw[i][s->f[i][0].codeword]; for (l = j = 0; j < n_senone_active; j++) { int n = senone_active[j] + l; int tmp, cw; if (n & 1) { cw = pid_cw0[n/2] >> 4; tmp = w_den[cw]; } else { cw = pid_cw0[n/2] & 0x0f; tmp = w_den[cw]; } senone_scores[n] += tmp; l = n; } return 0; } static int32 get_scores_4b_feat_any(s2_semi_mgau_t * s, int i, int topn, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { int32 j, k, l; for (l = j = 0; j < n_senone_active; j++) { int n = senone_active[j] + l; int tmp, cw; uint8 *pid_cw; pid_cw = s->mixw[i][s->f[i][0].codeword]; if (n & 1) cw = pid_cw[n/2] >> 4; else cw = pid_cw[n/2] & 0x0f; tmp = s->mixw_cb[cw] + s->f[i][0].score; for (k = 1; k < topn; ++k) { pid_cw = s->mixw[i][s->f[i][k].codeword]; if (n & 1) cw = pid_cw[n/2] >> 4; else cw = pid_cw[n/2] & 0x0f; tmp = fast_logmath_add(s->lmath_8b, tmp, s->mixw_cb[cw] + s->f[i][k].score); } senone_scores[n] += tmp; l = n; } return 0; } static int32 get_scores_4b_feat(s2_semi_mgau_t * s, int i, int topn, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) { switch (topn) { case 6: return get_scores_4b_feat_6(s, i, senone_scores, senone_active, n_senone_active); case 5: return get_scores_4b_feat_5(s, i, senone_scores, senone_active, n_senone_active); case 4: return get_scores_4b_feat_4(s, i, senone_scores, senone_active, n_senone_active); case 3: return get_scores_4b_feat_3(s, i, senone_scores, senone_active, n_senone_active); case 2: return get_scores_4b_feat_2(s, i, senone_scores, senone_active, n_senone_active); case 1: return get_scores_4b_feat_1(s, i, senone_scores, senone_active, n_senone_active); default: return get_scores_4b_feat_any(s, i, topn, senone_scores, senone_active, n_senone_active); } } static int32 get_scores_4b_feat_all(s2_semi_mgau_t * s, int i, int topn, int16 *senone_scores) { int j, last_sen; j = 0; /* Number of senones is always even, but don't overrun if it isn't. */ last_sen = s->n_sen & ~1; while (j < last_sen) { uint8 *pid_cw; int32 tmp0, tmp1; int k; pid_cw = s->mixw[i][s->f[i][0].codeword]; tmp0 = s->mixw_cb[pid_cw[j/2] & 0x0f] + s->f[i][0].score; tmp1 = s->mixw_cb[pid_cw[j/2] >> 4] + s->f[i][0].score; for (k = 1; k < topn; ++k) { int32 w_den0, w_den1; pid_cw = s->mixw[i][s->f[i][k].codeword]; w_den0 = s->mixw_cb[pid_cw[j/2] & 0x0f] + s->f[i][k].score; w_den1 = s->mixw_cb[pid_cw[j/2] >> 4] + s->f[i][k].score; tmp0 = fast_logmath_add(s->lmath_8b, tmp0, w_den0); tmp1 = fast_logmath_add(s->lmath_8b, tmp1, w_den1); } senone_scores[j++] += tmp0; senone_scores[j++] += tmp1; } return 0; } /* * Compute senone scores for the active senones. */ int32 s2_semi_mgau_frame_eval(ps_mgau_t *ps, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active, mfcc_t ** featbuf, int32 frame, int32 compallsen) { s2_semi_mgau_t *s = (s2_semi_mgau_t *)ps; int i, topn_idx; int n_feat = s->g->n_feat; memset(senone_scores, 0, s->n_sen * sizeof(*senone_scores)); /* No bounds checking is done here, which just means you'll get * semi-random crap if you request a frame in the future or one * that's too far in the past. */ topn_idx = frame % s->n_topn_hist; s->f = s->topn_hist[topn_idx]; for (i = 0; i < n_feat; ++i) { /* For past frames this will already be computed. */ if (frame >= ps_mgau_base(ps)->frame_idx) { vqFeature_t **lastf; if (topn_idx == 0) lastf = s->topn_hist[s->n_topn_hist-1]; else lastf = s->topn_hist[topn_idx-1]; memcpy(s->f[i], lastf[i], sizeof(vqFeature_t) * s->max_topn); mgau_dist(s, frame, i, featbuf[i]); s->topn_hist_n[topn_idx][i] = mgau_norm(s, i); } if (s->mixw_cb) { if (compallsen) get_scores_4b_feat_all(s, i, s->topn_hist_n[topn_idx][i], senone_scores); else get_scores_4b_feat(s, i, s->topn_hist_n[topn_idx][i], senone_scores, senone_active, n_senone_active); } else { if (compallsen) get_scores_8b_feat_all(s, i, s->topn_hist_n[topn_idx][i], senone_scores); else get_scores_8b_feat(s, i, s->topn_hist_n[topn_idx][i], senone_scores, senone_active, n_senone_active); } } return 0; } static int32 read_sendump(s2_semi_mgau_t *s, bin_mdef_t *mdef, char const *file) { FILE *fp; char line[1000]; int32 i, n, r, c; int32 do_swap, do_mmap; size_t offset; int n_clust = 0; int n_feat = s->g->n_feat; int n_density = s->g->n_density; int n_sen = bin_mdef_n_sen(mdef); int n_bits = 8; s->n_sen = n_sen; /* FIXME: Should have been done earlier */ do_mmap = cmd_ln_boolean_r(s->config, "-mmap"); if ((fp = fopen(file, "rb")) == NULL) return -1; E_INFO("Loading senones from dump file %s\n", file); /* Read title size, title */ if (fread(&n, sizeof(int32), 1, fp) != 1) { E_ERROR_SYSTEM("Failed to read title size from %s", file); goto error_out; } /* This is extremely bogus */ do_swap = 0; if (n < 1 || n > 999) { SWAP_INT32(&n); if (n < 1 || n > 999) { E_ERROR("Title length %x in dump file %s out of range\n", n, file); goto error_out; } do_swap = 1; } if (fread(line, sizeof(char), n, fp) != n) { E_ERROR_SYSTEM("Cannot read title"); goto error_out; } if (line[n - 1] != '\0') { E_ERROR("Bad title in dump file\n"); goto error_out; } E_INFO("%s\n", line); /* Read header size, header */ if (fread(&n, sizeof(n), 1, fp) != 1) { E_ERROR_SYSTEM("Failed to read header size from %s", file); goto error_out; } if (do_swap) SWAP_INT32(&n); if (fread(line, sizeof(char), n, fp) != n) { E_ERROR_SYSTEM("Cannot read header"); goto error_out; } if (line[n - 1] != '\0') { E_ERROR("Bad header in dump file\n"); goto error_out; } /* Read other header strings until string length = 0 */ for (;;) { if (fread(&n, sizeof(n), 1, fp) != 1) { E_ERROR_SYSTEM("Failed to read header string size from %s", file); goto error_out; } if (do_swap) SWAP_INT32(&n); if (n == 0) break; if (fread(line, sizeof(char), n, fp) != n) { E_ERROR_SYSTEM("Cannot read header"); goto error_out; } /* Look for a cluster count, if present */ if (!strncmp(line, "feature_count ", strlen("feature_count "))) { n_feat = atoi(line + strlen("feature_count ")); } if (!strncmp(line, "mixture_count ", strlen("mixture_count "))) { n_density = atoi(line + strlen("mixture_count ")); } if (!strncmp(line, "model_count ", strlen("model_count "))) { n_sen = atoi(line + strlen("model_count ")); } if (!strncmp(line, "cluster_count ", strlen("cluster_count "))) { n_clust = atoi(line + strlen("cluster_count ")); } if (!strncmp(line, "cluster_bits ", strlen("cluster_bits "))) { n_bits = atoi(line + strlen("cluster_bits ")); } } /* Defaults for #rows, #columns in mixw array. */ c = n_sen; r = n_density; if (n_clust == 0) { /* Older mixw files have them here, and they might be padded. */ if (fread(&r, sizeof(r), 1, fp) != 1) { E_ERROR_SYSTEM("Cannot read #rows"); goto error_out; } if (do_swap) SWAP_INT32(&r); if (fread(&c, sizeof(c), 1, fp) != 1) { E_ERROR_SYSTEM("Cannot read #columns"); goto error_out; } if (do_swap) SWAP_INT32(&c); E_INFO("Rows: %d, Columns: %d\n", r, c); } if (n_feat != s->g->n_feat) { E_ERROR("Number of feature streams mismatch: %d != %d\n", n_feat, s->g->n_feat); goto error_out; } if (n_density != s->g->n_density) { E_ERROR("Number of densities mismatch: %d != %d\n", n_density, s->g->n_density); goto error_out; } if (n_sen != s->n_sen) { E_ERROR("Number of senones mismatch: %d != %d\n", n_sen, s->n_sen); goto error_out; } if (!((n_clust == 0) || (n_clust == 15) || (n_clust == 16))) { E_ERROR("Cluster count must be 0, 15, or 16\n"); goto error_out; } if (n_clust == 15) ++n_clust; if (!((n_bits == 8) || (n_bits == 4))) { E_ERROR("Cluster count must be 4 or 8\n"); goto error_out; } if (do_mmap) { E_INFO("Using memory-mapped I/O for senones\n"); } offset = ftell(fp); /* Allocate memory for pdfs (or memory map them) */ if (do_mmap) { s->sendump_mmap = mmio_file_read(file); /* Get cluster codebook if any. */ if (n_clust) { s->mixw_cb = ((uint8 *) mmio_file_ptr(s->sendump_mmap)) + offset; offset += n_clust; } } else { /* Get cluster codebook if any. */ if (n_clust) { s->mixw_cb = ckd_calloc(1, n_clust); if (fread(s->mixw_cb, 1, n_clust, fp) != (size_t) n_clust) { E_ERROR("Failed to read %d bytes from sendump\n", n_clust); goto error_out; } } } /* Set up pointers, or read, or whatever */ if (s->sendump_mmap) { s->mixw = ckd_calloc_2d(n_feat, n_density, sizeof(*s->mixw)); for (n = 0; n < n_feat; n++) { int step = c; if (n_bits == 4) step = (step + 1) / 2; for (i = 0; i < r; i++) { s->mixw[n][i] = ((uint8 *) mmio_file_ptr(s->sendump_mmap)) + offset; offset += step; } } } else { s->mixw = ckd_calloc_3d(n_feat, n_density, n_sen, sizeof(***s->mixw)); /* Read pdf values and ids */ for (n = 0; n < n_feat; n++) { int step = c; if (n_bits == 4) step = (step + 1) / 2; for (i = 0; i < r; i++) { if (fread(s->mixw[n][i], sizeof(***s->mixw), step, fp) != (size_t) step) { E_ERROR("Failed to read %d bytes from sendump\n", step); goto error_out; } } } } fclose(fp); return 0; error_out: fclose(fp); return -1; } static int32 read_mixw(s2_semi_mgau_t * s, char const *file_name, double SmoothMin) { char **argname, **argval; char eofchk; FILE *fp; int32 byteswap, chksum_present; uint32 chksum; float32 *pdf; int32 i, f, c, n; int32 n_sen; int32 n_feat; int32 n_comp; int32 n_err; E_INFO("Reading mixture weights file '%s'\n", file_name); if ((fp = fopen(file_name, "rb")) == NULL) E_FATAL_SYSTEM("Failed to open mixture weights file '%s' for reading", file_name); /* Read header, including argument-value info and 32-bit byteorder magic */ if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) E_FATAL("Failed to read header from file '%s'\n", file_name); /* Parse argument-value list */ chksum_present = 0; for (i = 0; argname[i]; i++) { if (strcmp(argname[i], "version") == 0) { if (strcmp(argval[i], MGAU_MIXW_VERSION) != 0) E_WARN("Version mismatch(%s): %s, expecting %s\n", file_name, argval[i], MGAU_MIXW_VERSION); } else if (strcmp(argname[i], "chksum0") == 0) { chksum_present = 1; /* Ignore the associated value */ } } bio_hdrarg_free(argname, argval); argname = argval = NULL; chksum = 0; /* Read #senones, #features, #codewords, arraysize */ if ((bio_fread(&n_sen, sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&n_feat, sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&n_comp, sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&n, sizeof(int32), 1, fp, byteswap, &chksum) != 1)) { E_FATAL("bio_fread(%s) (arraysize) failed\n", file_name); } if (n_feat != s->g->n_feat) E_FATAL("#Features streams(%d) != %d\n", n_feat, s->g->n_feat); if (n != n_sen * n_feat * n_comp) { E_FATAL ("%s: #float32s(%d) doesn't match header dimensions: %d x %d x %d\n", file_name, i, n_sen, n_feat, n_comp); } /* n_sen = number of mixture weights per codeword, which is * fixed at the number of senones since we have only one codebook. */ s->n_sen = n_sen; /* Quantized mixture weight arrays. */ s->mixw = ckd_calloc_3d(n_feat, s->g->n_density, n_sen, sizeof(***s->mixw)); /* Temporary structure to read in floats before conversion to (int32) logs3 */ pdf = (float32 *) ckd_calloc(n_comp, sizeof(float32)); /* Read senone probs data, normalize, floor, convert to logs3, truncate to 8 bits */ n_err = 0; for (i = 0; i < n_sen; i++) { for (f = 0; f < n_feat; f++) { if (bio_fread((void *) pdf, sizeof(float32), n_comp, fp, byteswap, &chksum) != n_comp) { E_FATAL("bio_fread(%s) (arraydata) failed\n", file_name); } /* Normalize and floor */ if (vector_sum_norm(pdf, n_comp) <= 0.0) n_err++; vector_floor(pdf, n_comp, SmoothMin); vector_sum_norm(pdf, n_comp); /* Convert to LOG, quantize, and transpose */ for (c = 0; c < n_comp; c++) { int32 qscr; qscr = -logmath_log(s->lmath_8b, pdf[c]); if ((qscr > MAX_NEG_MIXW) || (qscr < 0)) qscr = MAX_NEG_MIXW; s->mixw[f][c][i] = qscr; } } } if (n_err > 0) E_WARN("Weight normalization failed for %d mixture weights components\n", n_err); ckd_free(pdf); if (chksum_present) bio_verify_chksum(fp, byteswap, chksum); if (fread(&eofchk, 1, 1, fp) == 1) E_FATAL("More data than expected in %s\n", file_name); fclose(fp); E_INFO("Read %d x %d x %d mixture weights\n", n_sen, n_feat, n_comp); return n_sen; } static int split_topn(char const *str, uint8 *out, int nfeat) { char *topn_list = ckd_salloc(str); char *c, *cc; int i, maxn; c = topn_list; i = 0; maxn = 0; while (i < nfeat && (cc = strchr(c, ',')) != NULL) { *cc = '\0'; out[i] = atoi(c); if (out[i] > maxn) maxn = out[i]; c = cc + 1; ++i; } if (i < nfeat && *c != '\0') { out[i] = atoi(c); if (out[i] > maxn) maxn = out[i]; ++i; } while (i < nfeat) out[i++] = maxn; ckd_free(topn_list); return maxn; } ps_mgau_t * s2_semi_mgau_init(acmod_t *acmod) { s2_semi_mgau_t *s; ps_mgau_t *ps; char const *sendump_path; int i; int n_feat; s = ckd_calloc(1, sizeof(*s)); s->config = acmod->config; s->lmath = logmath_retain(acmod->lmath); /* Log-add table. */ s->lmath_8b = logmath_init(logmath_get_base(acmod->lmath), SENSCR_SHIFT, TRUE); if (s->lmath_8b == NULL) goto error_out; /* Ensure that it is only 8 bits wide so that fast_logmath_add() works. */ if (logmath_get_width(s->lmath_8b) != 1) { E_ERROR("Log base %f is too small to represent add table in 8 bits\n", logmath_get_base(s->lmath_8b)); goto error_out; } /* Read means and variances. */ if ((s->g = gauden_init(cmd_ln_str_r(s->config, "_mean"), cmd_ln_str_r(s->config, "_var"), cmd_ln_float32_r(s->config, "-varfloor"), s->lmath)) == NULL) { E_ERROR("Failed to read means and variances\n"); goto error_out; } /* Currently only a single codebook is supported. */ if (s->g->n_mgau != 1) goto error_out; n_feat = s->g->n_feat; /* Verify n_feat and veclen, against acmod. */ if (n_feat != feat_dimension1(acmod->fcb)) { E_ERROR("Number of streams does not match: %d != %d\n", n_feat, feat_dimension1(acmod->fcb)); goto error_out; } for (i = 0; i < n_feat; ++i) { if (s->g->featlen[i] != feat_dimension2(acmod->fcb, i)) { E_ERROR("Dimension of stream %d does not match: %d != %d\n", i, s->g->featlen[i], feat_dimension2(acmod->fcb, i)); goto error_out; } } /* Read mixture weights */ if ((sendump_path = cmd_ln_str_r(s->config, "_sendump"))) { if (read_sendump(s, acmod->mdef, sendump_path) < 0) { goto error_out; } } else { if (read_mixw(s, cmd_ln_str_r(s->config, "_mixw"), cmd_ln_float32_r(s->config, "-mixwfloor")) < 0) { goto error_out; } } s->ds_ratio = cmd_ln_int32_r(s->config, "-ds"); /* Determine top-N for each feature */ s->topn_beam = ckd_calloc(n_feat, sizeof(*s->topn_beam)); s->max_topn = cmd_ln_int32_r(s->config, "-topn"); split_topn(cmd_ln_str_r(s->config, "-topn_beam"), s->topn_beam, n_feat); E_INFO("Maximum top-N: %d ", s->max_topn); E_INFOCONT("Top-N beams:"); for (i = 0; i < n_feat; ++i) { E_INFOCONT(" %d", s->topn_beam[i]); } E_INFOCONT("\n"); /* Top-N scores from recent frames */ s->n_topn_hist = cmd_ln_int32_r(s->config, "-pl_window") + 2; s->topn_hist = (vqFeature_t ***) ckd_calloc_3d(s->n_topn_hist, n_feat, s->max_topn, sizeof(***s->topn_hist)); s->topn_hist_n = ckd_calloc_2d(s->n_topn_hist, n_feat, sizeof(**s->topn_hist_n)); for (i = 0; i < s->n_topn_hist; ++i) { int j; for (j = 0; j < n_feat; ++j) { int k; for (k = 0; k < s->max_topn; ++k) { s->topn_hist[i][j][k].score = WORST_DIST; s->topn_hist[i][j][k].codeword = k; } } } ps = (ps_mgau_t *)s; ps->vt = &s2_semi_mgau_funcs; return ps; error_out: s2_semi_mgau_free(ps_mgau_base(s)); return NULL; } int s2_semi_mgau_mllr_transform(ps_mgau_t *ps, ps_mllr_t *mllr) { s2_semi_mgau_t *s = (s2_semi_mgau_t *)ps; return gauden_mllr_transform(s->g, mllr, s->config); } void s2_semi_mgau_free(ps_mgau_t *ps) { s2_semi_mgau_t *s = (s2_semi_mgau_t *)ps; logmath_free(s->lmath); logmath_free(s->lmath_8b); if (s->sendump_mmap) { ckd_free_2d(s->mixw); mmio_file_unmap(s->sendump_mmap); } else { ckd_free_3d(s->mixw); if (s->mixw_cb) ckd_free(s->mixw_cb); } gauden_free(s->g); ckd_free(s->topn_beam); ckd_free_2d(s->topn_hist_n); ckd_free_3d((void **)s->topn_hist); ckd_free(s); } pocketsphinx-5prealpha/src/libpocketsphinx/s2_semi_mgau.h0000664000175000017500000000747712771605033021142 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * Interface for "semi-continuous vector quantization", a.k.a. Sphinx2 * fast GMM computation. */ #ifndef __S2_SEMI_MGAU_H__ #define __S2_SEMI_MGAU_H__ /* SphinxBase headesr. */ #include #include #include /* Local headers. */ #include "acmod.h" #include "hmm.h" #include "bin_mdef.h" #include "ms_gauden.h" typedef struct vqFeature_s vqFeature_t; typedef struct s2_semi_mgau_s s2_semi_mgau_t; struct s2_semi_mgau_s { ps_mgau_t base; /**< base structure. */ cmd_ln_t *config; /* configuration parameters */ gauden_t *g; /* Set of Gaussians (pointers below point in here and will go away soon) */ uint8 ***mixw; /* mixture weight distributions */ mmio_file_t *sendump_mmap;/* memory map for mixw (or NULL if not mmap) */ uint8 *mixw_cb; /* mixture weight codebook, if any (assume it contains 16 values) */ int32 n_sen; /* Number of senones */ uint8 *topn_beam; /* Beam for determining per-frame top-N densities */ int16 max_topn; int16 ds_ratio; vqFeature_t ***topn_hist; /**< Top-N scores and codewords for past frames. */ uint8 **topn_hist_n; /**< Variable top-N for past frames. */ vqFeature_t **f; /**< Topn-N for currently scoring frame. */ int n_topn_hist; /**< Number of past frames tracked. */ /* Log-add table for compressed values. */ logmath_t *lmath_8b; /* Log-add object for reloading means/variances. */ logmath_t *lmath; }; ps_mgau_t *s2_semi_mgau_init(acmod_t *acmod); void s2_semi_mgau_free(ps_mgau_t *s); int s2_semi_mgau_frame_eval(ps_mgau_t *s, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active, mfcc_t **featbuf, int32 frame, int32 compallsen); int s2_semi_mgau_mllr_transform(ps_mgau_t *s, ps_mllr_t *mllr); #endif /* __S2_SEMI_MGAU_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/ngram_search_fwdtree.h0000664000175000017500000000535012771605033022725 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ngram_search_fwdtree.h Lexicon tree based Viterbi search. */ #ifndef __NGRAM_SEARCH_FWDTREE_H__ #define __NGRAM_SEARCH_FWDTREE_H__ /* SphinxBase headers. */ /* Local headers. */ #include "ngram_search.h" /** * Initialize N-Gram search for fwdtree decoding. */ void ngram_fwdtree_init(ngram_search_t *ngs); /** * Release memory associated with fwdtree decoding. */ void ngram_fwdtree_deinit(ngram_search_t *ngs); /** * Rebuild search structures for updated language models. */ int ngram_fwdtree_reinit(ngram_search_t *ngs); /** * Start fwdtree decoding for an utterance. */ void ngram_fwdtree_start(ngram_search_t *ngs); /** * Search one frame forward in an utterance. * * @return Number of frames searched (either 0 or 1). */ int ngram_fwdtree_search(ngram_search_t *ngs, int frame_idx); /** * Finish fwdtree decoding for an utterance. */ void ngram_fwdtree_finish(ngram_search_t *ngs); #endif /* __NGRAM_SEARCH_FWDTREE_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/ms_gauden.c0000664000175000017500000004133412771605033020513 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ #include #include #include #include #include #include #include #include "ms_gauden.h" #define GAUDEN_PARAM_VERSION "1.0" #ifndef M_PI #define M_PI 3.1415926535897932385e0 #endif #define WORST_DIST (int32)(0x80000000) void gauden_dump(const gauden_t * g) { int32 c; for (c = 0; c < g->n_mgau; c++) gauden_dump_ind(g, c); } void gauden_dump_ind(const gauden_t * g, int senidx) { int32 f, d, i; for (f = 0; f < g->n_feat; f++) { E_INFO("Codebook %d, Feature %d (%dx%d):\n", senidx, f, g->n_density, g->featlen[f]); for (d = 0; d < g->n_density; d++) { printf("m[%3d]", d); for (i = 0; i < g->featlen[f]; i++) printf(" %7.4f", MFCC2FLOAT(g->mean[senidx][f][d][i])); printf("\n"); } printf("\n"); for (d = 0; d < g->n_density; d++) { printf("v[%3d]", d); for (i = 0; i < g->featlen[f]; i++) printf(" %d", (int)g->var[senidx][f][d][i]); printf("\n"); } printf("\n"); for (d = 0; d < g->n_density; d++) printf("d[%3d] %d\n", d, (int)g->det[senidx][f][d]); } fflush(stderr); } /** * Reads gaussian parameters from a file * * @param: out_param output parameter * @ * * @returns: allocated 4-d array of gaussians * */ static float **** gauden_param_read(const char *file_name, int32 * out_n_mgau, int32 * out_n_feat, int32 * out_n_density, int32 ** out_veclen) { char tmp; FILE *fp; int32 i, j, k, l, n, blk; int32 n_mgau; int32 n_feat; int32 n_density; int32 *veclen; int32 byteswap, chksum_present; float32 ****out; float32 *buf; char **argname, **argval; uint32 chksum; E_INFO("Reading mixture gaussian parameter: %s\n", file_name); if ((fp = fopen(file_name, "rb")) == NULL) { E_ERROR_SYSTEM("Failed to open file '%s' for reading", file_name); return NULL; } /* Read header, including argument-value info and 32-bit byteorder magic */ if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) { E_ERROR("Failed to read header from file '%s'\n", file_name); fclose(fp); return NULL; } /* Parse argument-value list */ chksum_present = 0; for (i = 0; argname[i]; i++) { if (strcmp(argname[i], "version") == 0) { if (strcmp(argval[i], GAUDEN_PARAM_VERSION) != 0) E_WARN("Version mismatch(%s): %s, expecting %s\n", file_name, argval[i], GAUDEN_PARAM_VERSION); } else if (strcmp(argname[i], "chksum0") == 0) { chksum_present = 1; /* Ignore the associated value */ } } bio_hdrarg_free(argname, argval); argname = argval = NULL; chksum = 0; /* #Codebooks */ if (bio_fread(&n_mgau, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { E_ERROR("Failed to read number fo codebooks from %s\n", file_name); fclose(fp); return NULL; } *out_n_mgau = n_mgau; /* #Features/codebook */ if (bio_fread(&n_feat, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { E_ERROR("Failed to read number of features from %s\n", file_name); fclose(fp); return NULL; } *out_n_feat = n_feat; /* #Gaussian densities/feature in each codebook */ if (bio_fread(&n_density, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { E_ERROR("fread(%s) (#density/codebook) failed\n", file_name); } *out_n_density = n_density; /* #Dimensions in each feature stream */ veclen = ckd_calloc(n_feat, sizeof(uint32)); *out_veclen = veclen; if (bio_fread(veclen, sizeof(int32), n_feat, fp, byteswap, &chksum) != n_feat) { E_ERROR("fread(%s) (feature-lengths) failed\n", file_name); fclose(fp); return NULL; } /* blk = total vector length of all feature streams */ for (i = 0, blk = 0; i < n_feat; i++) blk += veclen[i]; /* #Floats to follow; for the ENTIRE SET of CODEBOOKS */ if (bio_fread(&n, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { E_ERROR("Failed to read number of parameters from %s\n", file_name); fclose(fp); return NULL; } if (n != n_mgau * n_density * blk) { E_ERROR ("Number of parameters in %s(%d) doesn't match dimensions: %d x %d x %d\n", file_name, n, n_mgau, n_density, blk); fclose(fp); return NULL; } /* Allocate memory for mixture gaussian densities if not already allocated */ out = (float32 ****) ckd_calloc_3d(n_mgau, n_feat, n_density, sizeof(float32 *)); buf = (float32 *) ckd_calloc(n, sizeof(float32)); for (i = 0, l = 0; i < n_mgau; i++) { for (j = 0; j < n_feat; j++) { for (k = 0; k < n_density; k++) { out[i][j][k] = &buf[l]; l += veclen[j]; } } } /* Read mixture gaussian densities data */ if (bio_fread(buf, sizeof(float32), n, fp, byteswap, &chksum) != n) { E_ERROR("Failed to read density data from file '%s'\n", file_name); fclose(fp); ckd_free_3d(out); return NULL; } if (chksum_present) bio_verify_chksum(fp, byteswap, chksum); if (fread(&tmp, 1, 1, fp) == 1) { E_ERROR("More data than expected in %s\n", file_name); fclose(fp); ckd_free_3d(out); return NULL; } fclose(fp); E_INFO("%d codebook, %d feature, size: \n", n_mgau, n_feat); for (i = 0; i < n_feat; i++) E_INFO(" %dx%d\n", n_density, veclen[i]); return out; } static void gauden_param_free(mfcc_t **** p) { ckd_free(p[0][0][0]); ckd_free_3d(p); } /* * Some of the gaussian density computation can be carried out in advance: * log(determinant) calculation, * 1/(2*var) in the exponent, * NOTE; The density computation is performed in log domain. */ static int32 gauden_dist_precompute(gauden_t * g, logmath_t *lmath, float32 varfloor) { int32 i, m, f, d, flen; mfcc_t *meanp; mfcc_t *varp; mfcc_t *detp; int32 floored; floored = 0; /* Allocate space for determinants */ g->det = ckd_calloc_3d(g->n_mgau, g->n_feat, g->n_density, sizeof(***g->det)); for (m = 0; m < g->n_mgau; m++) { for (f = 0; f < g->n_feat; f++) { flen = g->featlen[f]; /* Determinants for all variance vectors in g->[m][f] */ for (d = 0, detp = g->det[m][f]; d < g->n_density; d++, detp++) { *detp = 0; for (i = 0, varp = g->var[m][f][d], meanp = g->mean[m][f][d]; i < flen; i++, varp++, meanp++) { float32 *fvarp = (float32 *)varp; #ifdef FIXED_POINT float32 *fmp = (float32 *)meanp; *meanp = FLOAT2MFCC(*fmp); #endif if (*fvarp < varfloor) { *fvarp = varfloor; ++floored; } *detp += (mfcc_t)logmath_log(lmath, 1.0 / sqrt(*fvarp * 2.0 * M_PI)); /* Precompute this part of the exponential */ *varp = (mfcc_t)logmath_ln_to_log(lmath, (1.0 / (*fvarp * 2.0))); } } } } E_INFO("%d variance values floored\n", floored); return 0; } gauden_t * gauden_init(char const *meanfile, char const *varfile, float32 varfloor, logmath_t *lmath) { int32 i, m, f, d, *flen; gauden_t *g; assert(meanfile != NULL); assert(varfile != NULL); assert(varfloor > 0.0); g = (gauden_t *) ckd_calloc(1, sizeof(gauden_t)); g->lmath = lmath; g->mean = (mfcc_t ****)gauden_param_read(meanfile, &g->n_mgau, &g->n_feat, &g->n_density, &g->featlen); if (g->mean == NULL) { return NULL; } g->var = (mfcc_t ****)gauden_param_read(varfile, &m, &f, &d, &flen); if (g->var == NULL) { return NULL; } /* Verify mean and variance parameter dimensions */ if ((m != g->n_mgau) || (f != g->n_feat) || (d != g->n_density)) { E_ERROR ("Mixture-gaussians dimensions for means and variances differ\n"); ckd_free(flen); gauden_free(g); return NULL; } for (i = 0; i < g->n_feat; i++) { if (g->featlen[i] != flen[i]) { E_FATAL("Feature lengths for means and variances differ\n"); ckd_free(flen); gauden_free(g); return NULL; } } ckd_free(flen); gauden_dist_precompute(g, lmath, varfloor); return g; } void gauden_free(gauden_t * g) { if (g == NULL) return; if (g->mean) gauden_param_free(g->mean); if (g->var) gauden_param_free(g->var); if (g->det) ckd_free_3d(g->det); if (g->featlen) ckd_free(g->featlen); ckd_free(g); } /* See compute_dist below */ static int32 compute_dist_all(gauden_dist_t * out_dist, mfcc_t* obs, int32 featlen, mfcc_t ** mean, mfcc_t ** var, mfcc_t * det, int32 n_density) { int32 i, d; for (d = 0; d < n_density; ++d) { mfcc_t *m; mfcc_t *v; mfcc_t dval; m = mean[d]; v = var[d]; dval = det[d]; for (i = 0; i < featlen; i++) { mfcc_t diff; #ifdef FIXED_POINT /* Have to check for underflows here. */ mfcc_t pdval = dval; diff = obs[i] - m[i]; dval -= MFCCMUL(MFCCMUL(diff, diff), v[i]); if (dval > pdval) { dval = WORST_SCORE; break; } #else diff = obs[i] - m[i]; /* The compiler really likes this to be a single * expression, for whatever reason. */ dval -= diff * diff * v[i]; #endif } out_dist[d].dist = dval; out_dist[d].id = d; } return 0; } /* * Compute the top-N closest gaussians from the chosen set (mgau,feat) * for the given input observation vector. */ static int32 compute_dist(gauden_dist_t * out_dist, int32 n_top, mfcc_t * obs, int32 featlen, mfcc_t ** mean, mfcc_t ** var, mfcc_t * det, int32 n_density) { int32 i, j, d; gauden_dist_t *worst; /* Special case optimization when n_density <= n_top */ if (n_top >= n_density) return (compute_dist_all (out_dist, obs, featlen, mean, var, det, n_density)); for (i = 0; i < n_top; i++) out_dist[i].dist = WORST_DIST; worst = &(out_dist[n_top - 1]); for (d = 0; d < n_density; d++) { mfcc_t *m; mfcc_t *v; mfcc_t dval; m = mean[d]; v = var[d]; dval = det[d]; for (i = 0; (i < featlen) && (dval >= worst->dist); i++) { mfcc_t diff; #ifdef FIXED_POINT /* Have to check for underflows here. */ mfcc_t pdval = dval; diff = obs[i] - m[i]; dval -= MFCCMUL(MFCCMUL(diff, diff), v[i]); if (dval > pdval) { dval = WORST_SCORE; break; } #else diff = obs[i] - m[i]; /* The compiler really likes this to be a single * expression, for whatever reason. */ dval -= diff * diff * v[i]; #endif } if ((i < featlen) || (dval < worst->dist)) /* Codeword d worse than worst */ continue; /* Codeword d at least as good as worst so far; insert in the ordered list */ for (i = 0; (i < n_top) && (dval < out_dist[i].dist); i++); assert(i < n_top); for (j = n_top - 1; j > i; --j) out_dist[j] = out_dist[j - 1]; out_dist[i].dist = dval; out_dist[i].id = d; } return 0; } /* * Compute distances of the input observation from the top N codewords in the given * codebook (g->{mean,var}[mgau]). The input observation, obs, includes vectors for * all features in the codebook. */ int32 gauden_dist(gauden_t * g, int mgau, int32 n_top, mfcc_t** obs, gauden_dist_t ** out_dist) { int32 f; assert((n_top > 0) && (n_top <= g->n_density)); for (f = 0; f < g->n_feat; f++) { compute_dist(out_dist[f], n_top, obs[f], g->featlen[f], g->mean[mgau][f], g->var[mgau][f], g->det[mgau][f], g->n_density); E_DEBUG(3, ("Top CW(%d,%d) = %d %d\n", mgau, f, out_dist[f][0].id, (int)out_dist[f][0].dist >> SENSCR_SHIFT)); } return 0; } int32 gauden_mllr_transform(gauden_t *g, ps_mllr_t *mllr, cmd_ln_t *config) { int32 i, m, f, d, *flen; /* Free data if already here */ if (g->mean) gauden_param_free(g->mean); if (g->var) gauden_param_free(g->var); if (g->det) ckd_free_3d(g->det); if (g->featlen) ckd_free(g->featlen); g->det = NULL; g->featlen = NULL; /* Reload means and variances (un-precomputed). */ g->mean = (mfcc_t ****)gauden_param_read(cmd_ln_str_r(config, "_mean"), &g->n_mgau, &g->n_feat, &g->n_density, &g->featlen); g->var = (mfcc_t ****)gauden_param_read(cmd_ln_str_r(config, "_var"), &m, &f, &d, &flen); /* Verify mean and variance parameter dimensions */ if ((m != g->n_mgau) || (f != g->n_feat) || (d != g->n_density)) E_FATAL ("Mixture-gaussians dimensions for means and variances differ\n"); for (i = 0; i < g->n_feat; i++) if (g->featlen[i] != flen[i]) E_FATAL("Feature lengths for means and variances differ\n"); ckd_free(flen); /* Transform codebook for each stream s */ for (i = 0; i < g->n_mgau; ++i) { for (f = 0; f < g->n_feat; ++f) { float64 *temp; temp = (float64 *) ckd_calloc(g->featlen[f], sizeof(float64)); /* Transform each density d in selected codebook */ for (d = 0; d < g->n_density; d++) { int l; for (l = 0; l < g->featlen[f]; l++) { temp[l] = 0.0; for (m = 0; m < g->featlen[f]; m++) { /* FIXME: For now, only one class, hence the zeros below. */ temp[l] += mllr->A[f][0][l][m] * g->mean[i][f][d][m]; } temp[l] += mllr->b[f][0][l]; } for (l = 0; l < g->featlen[f]; l++) { g->mean[i][f][d][l] = (float32) temp[l]; g->var[i][f][d][l] *= mllr->h[f][0][l]; } } ckd_free(temp); } } /* Re-precompute (if we aren't adapting variances this isn't * actually necessary...) */ gauden_dist_precompute(g, g->lmath, cmd_ln_float32_r(config, "-varfloor")); return 0; } pocketsphinx-5prealpha/src/libpocketsphinx/ptm_mgau.h0000664000175000017500000000770512771605033020373 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2010 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ptm_mgau.h Fast phonetically-tied mixture evaluation. * @author David Huggins-Daines */ #ifndef __PTM_MGAU_H__ #define __PTM_MGAU_H__ /* SphinxBase headesr. */ #include #include #include /* Local headers. */ #include "acmod.h" #include "hmm.h" #include "bin_mdef.h" #include "ms_gauden.h" typedef struct ptm_mgau_s ptm_mgau_t; typedef struct ptm_topn_s { int32 cw; /**< Codeword index. */ int32 score; /**< Score. */ } ptm_topn_t; typedef struct ptm_fast_eval_s { ptm_topn_t ***topn; /**< Top-N for each codebook (mgau x feature x topn) */ bitvec_t *mgau_active; /**< Set of active codebooks */ } ptm_fast_eval_t; struct ptm_mgau_s { ps_mgau_t base; /**< base structure. */ cmd_ln_t *config; /**< Configuration parameters */ gauden_t *g; /**< Set of Gaussians. */ int32 n_sen; /**< Number of senones. */ uint8 *sen2cb; /**< Senone to codebook mapping. */ uint8 ***mixw; /**< Mixture weight distributions by feature, codeword, senone */ mmio_file_t *sendump_mmap;/* Memory map for mixw (or NULL if not mmap) */ uint8 *mixw_cb; /* Mixture weight codebook, if any (assume it contains 16 values) */ int16 max_topn; int16 ds_ratio; ptm_fast_eval_t *hist; /**< Fast evaluation info for past frames. */ ptm_fast_eval_t *f; /**< Fast eval info for current frame. */ int n_fast_hist; /**< Number of past frames tracked. */ /* Log-add table for compressed values. */ logmath_t *lmath_8b; /* Log-add object for reloading means/variances. */ logmath_t *lmath; }; ps_mgau_t *ptm_mgau_init(acmod_t *acmod, bin_mdef_t *mdef); void ptm_mgau_free(ps_mgau_t *s); int ptm_mgau_frame_eval(ps_mgau_t *s, int16 *senone_scores, uint8 *senone_active, int32 n_senone_active, mfcc_t **featbuf, int32 frame, int32 compallsen); int ptm_mgau_mllr_transform(ps_mgau_t *s, ps_mllr_t *mllr); #endif /* __PTM_MGAU_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/ngram_search_fwdtree.c0000664000175000017500000016267212771605033022733 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ngram_search_fwdtree.c Lexicon tree search. */ /* System headers. */ #include #include /* SphinxBase headers. */ #include #include #include /* Local headers. */ #include "ngram_search_fwdtree.h" #include "phone_loop_search.h" /* Turn this on to dump channels for debugging */ #define __CHAN_DUMP__ 0 #if __CHAN_DUMP__ #define chan_v_eval(chan) hmm_dump_vit_eval(&(chan)->hmm, stderr) #else #define chan_v_eval(chan) hmm_vit_eval(&(chan)->hmm) #endif /* * Allocate that part of the search channel tree structure that is independent of the * LM in use. */ static void init_search_tree(ngram_search_t *ngs) { int32 w, ndiph, i, n_words, n_ci; dict_t *dict = ps_search_dict(ngs); bitvec_t *dimap; E_INFO("Initializing search tree\n"); n_words = ps_search_n_words(ngs); ngs->homophone_set = ckd_calloc(n_words, sizeof(*ngs->homophone_set)); /* Find #single phone words, and #unique first diphones (#root channels) in dict. */ ndiph = 0; ngs->n_1ph_words = 0; n_ci = bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef); /* Allocate a bitvector with flags for each possible diphone. */ dimap = bitvec_alloc(n_ci * n_ci); for (w = 0; w < n_words; w++) { if (!dict_real_word(dict, w)) continue; if (dict_is_single_phone(dict, w)) ++ngs->n_1ph_words; else { int ph0, ph1; ph0 = dict_first_phone(dict, w); ph1 = dict_second_phone(dict, w); /* Increment ndiph the first time we see a diphone. */ if (bitvec_is_clear(dimap, ph0 * n_ci + ph1)) { bitvec_set(dimap, ph0 * n_ci + ph1); ++ndiph; } } } E_INFO("%d unique initial diphones\n", ndiph); bitvec_free(dimap); /* Add remaining dict words (, , , noise words) to single-phone words */ ngs->n_1ph_words += dict_num_fillers(dict) + 2; ngs->n_root_chan_alloc = ndiph + 1; /* Verify that these are all *actually* single-phone words, * otherwise really bad things will happen to us. */ for (w = 0; w < n_words; ++w) { if (dict_real_word(dict, w)) continue; if (!dict_is_single_phone(dict, w)) { E_WARN("Filler word %d = %s has more than one phone, ignoring it.\n", w, dict_wordstr(dict, w)); --ngs->n_1ph_words; } } /* Allocate and initialize root channels */ ngs->root_chan = ckd_calloc(ngs->n_root_chan_alloc, sizeof(*ngs->root_chan)); for (i = 0; i < ngs->n_root_chan_alloc; i++) { hmm_init(ngs->hmmctx, &ngs->root_chan[i].hmm, TRUE, -1, -1); ngs->root_chan[i].penult_phn_wid = -1; ngs->root_chan[i].next = NULL; } /* Permanently allocate and initialize channels for single-phone * words (1/word). */ ngs->rhmm_1ph = ckd_calloc(ngs->n_1ph_words, sizeof(*ngs->rhmm_1ph)); i = 0; for (w = 0; w < n_words; w++) { if (!dict_is_single_phone(dict, w)) continue; /* Use SIL as right context for these. */ ngs->rhmm_1ph[i].ci2phone = bin_mdef_silphone(ps_search_acmod(ngs)->mdef); ngs->rhmm_1ph[i].ciphone = dict_first_phone(dict, w); hmm_init(ngs->hmmctx, &ngs->rhmm_1ph[i].hmm, TRUE, bin_mdef_pid2ssid(ps_search_acmod(ngs)->mdef, ngs->rhmm_1ph[i].ciphone), bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, ngs->rhmm_1ph[i].ciphone)); ngs->rhmm_1ph[i].next = NULL; ngs->word_chan[w] = (chan_t *) &(ngs->rhmm_1ph[i]); i++; } ngs->single_phone_wid = ckd_calloc(ngs->n_1ph_words, sizeof(*ngs->single_phone_wid)); } /* * One-time initialization of internal channels in HMM tree. */ static void init_nonroot_chan(ngram_search_t *ngs, chan_t * hmm, int32 ph, int32 ci, int32 tmatid) { hmm->next = NULL; hmm->alt = NULL; hmm->info.penult_phn_wid = -1; hmm->ciphone = ci; hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, ph, tmatid); } /* * Allocate and initialize search channel-tree structure. * At this point, all the root-channels have been allocated and partly initialized * (as per init_search_tree()), and channels for all the single-phone words have been * allocated and initialized. None of the interior channels of search-trees have * been allocated. * This routine may be called on every utterance, after reinit_search_tree() clears * the search tree created for the previous utterance. Meant for reconfiguring the * search tree to suit the currently active LM. */ static void create_search_channels(ngram_search_t *ngs) { chan_t *hmm; root_chan_t *rhmm; int32 w, i, j, p, ph, tmatid; int32 n_words; dict_t *dict = ps_search_dict(ngs); dict2pid_t *d2p = ps_search_dict2pid(ngs); n_words = ps_search_n_words(ngs); E_INFO("Creating search channels\n"); for (w = 0; w < n_words; w++) ngs->homophone_set[w] = -1; ngs->n_1ph_LMwords = 0; ngs->n_root_chan = 0; ngs->n_nonroot_chan = 0; for (w = 0; w < n_words; w++) { int ciphone, ci2phone; /* Ignore dictionary words not in LM */ if (!ngram_model_set_known_wid(ngs->lmset, dict_basewid(dict, w))) continue; /* Handle single-phone words individually; not in channel tree */ if (dict_is_single_phone(dict, w)) { E_DEBUG(1,("single_phone_wid[%d] = %s\n", ngs->n_1ph_LMwords, dict_wordstr(dict, w))); ngs->single_phone_wid[ngs->n_1ph_LMwords++] = w; continue; } /* Find a root channel matching the initial diphone, or * allocate one if not found. */ ciphone = dict_first_phone(dict, w); ci2phone = dict_second_phone(dict, w); for (i = 0; i < ngs->n_root_chan; ++i) { if (ngs->root_chan[i].ciphone == ciphone && ngs->root_chan[i].ci2phone == ci2phone) break; } if (i == ngs->n_root_chan) { rhmm = &(ngs->root_chan[ngs->n_root_chan]); rhmm->hmm.tmatid = bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, ciphone); /* Begin with CI phone? Not sure this makes a difference... */ hmm_mpx_ssid(&rhmm->hmm, 0) = bin_mdef_pid2ssid(ps_search_acmod(ngs)->mdef, ciphone); rhmm->ciphone = ciphone; rhmm->ci2phone = ci2phone; ngs->n_root_chan++; } else rhmm = &(ngs->root_chan[i]); E_DEBUG(3,("word %s rhmm %d\n", dict_wordstr(dict, w), rhmm - ngs->root_chan)); /* Now, rhmm = root channel for w. Go on to remaining phones */ if (dict_pronlen(dict, w) == 2) { /* Next phone is the last; not kept in tree; add w to penult_phn_wid set */ if ((j = rhmm->penult_phn_wid) < 0) rhmm->penult_phn_wid = w; else { for (; ngs->homophone_set[j] >= 0; j = ngs->homophone_set[j]); ngs->homophone_set[j] = w; } } else { /* Add remaining phones, except the last, to tree */ ph = dict2pid_internal(d2p, w, 1); tmatid = bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, dict_pron(dict, w, 1)); hmm = rhmm->next; if (hmm == NULL) { rhmm->next = hmm = listelem_malloc(ngs->chan_alloc); init_nonroot_chan(ngs, hmm, ph, dict_pron(dict, w, 1), tmatid); ngs->n_nonroot_chan++; } else { chan_t *prev_hmm = NULL; for (; hmm && (hmm_nonmpx_ssid(&hmm->hmm) != ph); hmm = hmm->alt) prev_hmm = hmm; if (!hmm) { /* thanks, rkm! */ prev_hmm->alt = hmm = listelem_malloc(ngs->chan_alloc); init_nonroot_chan(ngs, hmm, ph, dict_pron(dict, w, 1), tmatid); ngs->n_nonroot_chan++; } } E_DEBUG(3,("phone %s = %d\n", bin_mdef_ciphone_str(ps_search_acmod(ngs)->mdef, dict_second_phone(dict, w)), ph)); for (p = 2; p < dict_pronlen(dict, w) - 1; p++) { ph = dict2pid_internal(d2p, w, p); tmatid = bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, dict_pron(dict, w, p)); if (!hmm->next) { hmm->next = listelem_malloc(ngs->chan_alloc); hmm = hmm->next; init_nonroot_chan(ngs, hmm, ph, dict_pron(dict, w, p), tmatid); ngs->n_nonroot_chan++; } else { chan_t *prev_hmm = NULL; for (hmm = hmm->next; hmm && (hmm_nonmpx_ssid(&hmm->hmm) != ph); hmm = hmm->alt) prev_hmm = hmm; if (!hmm) { /* thanks, rkm! */ prev_hmm->alt = hmm = listelem_malloc(ngs->chan_alloc); init_nonroot_chan(ngs, hmm, ph, dict_pron(dict, w, p), tmatid); ngs->n_nonroot_chan++; } } E_DEBUG(3,("phone %s = %d\n", bin_mdef_ciphone_str(ps_search_acmod(ngs)->mdef, dict_pron(dict, w, p)), ph)); } /* All but last phone of w in tree; add w to hmm->info.penult_phn_wid set */ if ((j = hmm->info.penult_phn_wid) < 0) hmm->info.penult_phn_wid = w; else { for (; ngs->homophone_set[j] >= 0; j = ngs->homophone_set[j]); ngs->homophone_set[j] = w; } } } ngs->n_1ph_words = ngs->n_1ph_LMwords; /* Add filler words to the array of 1ph words. */ for (w = 0; w < n_words; ++w) { /* Skip anything that doesn't actually have a single phone. */ if (!dict_is_single_phone(dict, w)) continue; /* Also skip "real words" and things that are in the LM. */ if (dict_real_word(dict, w)) continue; if (ngram_model_set_known_wid(ngs->lmset, dict_basewid(dict, w))) continue; E_DEBUG(1,("single_phone_wid[%d] = %s\n", ngs->n_1ph_words, dict_wordstr(dict, w))); ngs->single_phone_wid[ngs->n_1ph_words++] = w; } if (ngs->n_nonroot_chan >= ngs->max_nonroot_chan) { /* Give some room for channels for new words added dynamically at run time */ ngs->max_nonroot_chan = ngs->n_nonroot_chan + 128; E_INFO("Max nonroot chan increased to %d\n", ngs->max_nonroot_chan); /* Free old active channel list array if any and allocate new one */ if (ngs->active_chan_list) ckd_free_2d(ngs->active_chan_list); ngs->active_chan_list = ckd_calloc_2d(2, ngs->max_nonroot_chan, sizeof(**ngs->active_chan_list)); } E_INFO("Created %d root, %d non-root channels, %d single-phone words\n", ngs->n_root_chan, ngs->n_nonroot_chan, ngs->n_1ph_words); if (ngs->n_root_chan + ngs->n_1ph_words == 0) E_ERROR("No word from the language model has pronunciation in the dictionary\n"); } static void reinit_search_subtree(ngram_search_t *ngs, chan_t * hmm) { chan_t *child, *sibling; /* First free all children under hmm */ for (child = hmm->next; child; child = sibling) { sibling = child->alt; reinit_search_subtree(ngs, child); } /* Now free hmm */ hmm_deinit(&hmm->hmm); listelem_free(ngs->chan_alloc, hmm); } /* * Delete search tree by freeing all interior channels within search tree and * restoring root channel state to the init state (i.e., just after init_search_tree()). */ static void reinit_search_tree(ngram_search_t *ngs) { int32 i; chan_t *hmm, *sibling; for (i = 0; i < ngs->n_root_chan; i++) { hmm = ngs->root_chan[i].next; while (hmm) { sibling = hmm->alt; reinit_search_subtree(ngs, hmm); hmm = sibling; } ngs->root_chan[i].penult_phn_wid = -1; ngs->root_chan[i].next = NULL; } ngs->n_nonroot_chan = 0; } void ngram_fwdtree_init(ngram_search_t *ngs) { /* Allocate bestbp_rc, lastphn_cand, last_ltrans */ ngs->bestbp_rc = ckd_calloc(bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef), sizeof(*ngs->bestbp_rc)); ngs->lastphn_cand = ckd_calloc(ps_search_n_words(ngs), sizeof(*ngs->lastphn_cand)); init_search_tree(ngs); create_search_channels(ngs); } static void deinit_search_tree(ngram_search_t *ngs) { int i, w, n_words; n_words = ps_search_n_words(ngs); for (i = 0; i < ngs->n_root_chan_alloc; i++) { hmm_deinit(&ngs->root_chan[i].hmm); } if (ngs->rhmm_1ph) { for (i = w = 0; w < n_words; ++w) { if (!dict_is_single_phone(ps_search_dict(ngs), w)) continue; hmm_deinit(&ngs->rhmm_1ph[i].hmm); ++i; } ckd_free(ngs->rhmm_1ph); ngs->rhmm_1ph = NULL; } ngs->n_root_chan = 0; ngs->n_root_chan_alloc = 0; ckd_free(ngs->root_chan); ngs->root_chan = NULL; ckd_free(ngs->single_phone_wid); ngs->single_phone_wid = NULL; ckd_free(ngs->homophone_set); ngs->homophone_set = NULL; } void ngram_fwdtree_deinit(ngram_search_t *ngs) { double n_speech = (double)ngs->n_tot_frame / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); E_INFO("TOTAL fwdtree %.2f CPU %.3f xRT\n", ngs->fwdtree_perf.t_tot_cpu, ngs->fwdtree_perf.t_tot_cpu / n_speech); E_INFO("TOTAL fwdtree %.2f wall %.3f xRT\n", ngs->fwdtree_perf.t_tot_elapsed, ngs->fwdtree_perf.t_tot_elapsed / n_speech); /* Reset non-root channels. */ reinit_search_tree(ngs); /* Free the search tree. */ deinit_search_tree(ngs); /* Free other stuff. */ ngs->max_nonroot_chan = 0; ckd_free_2d(ngs->active_chan_list); ngs->active_chan_list = NULL; ckd_free(ngs->cand_sf); ngs->cand_sf = NULL; ckd_free(ngs->bestbp_rc); ngs->bestbp_rc = NULL; ckd_free(ngs->lastphn_cand); ngs->lastphn_cand = NULL; } int ngram_fwdtree_reinit(ngram_search_t *ngs) { /* Reset non-root channels. */ reinit_search_tree(ngs); /* Free the search tree. */ deinit_search_tree(ngs); /* Reallocate things that depend on the number of words. */ ckd_free(ngs->lastphn_cand); ngs->lastphn_cand = ckd_calloc(ps_search_n_words(ngs), sizeof(*ngs->lastphn_cand)); ckd_free(ngs->word_chan); ngs->word_chan = ckd_calloc(ps_search_n_words(ngs), sizeof(*ngs->word_chan)); /* Rebuild the search tree. */ init_search_tree(ngs); create_search_channels(ngs); return 0; } void ngram_fwdtree_start(ngram_search_t *ngs) { ps_search_t *base = (ps_search_t *)ngs; int32 i, w, n_words; root_chan_t *rhmm; n_words = ps_search_n_words(ngs); /* Reset utterance statistics. */ memset(&ngs->st, 0, sizeof(ngs->st)); ptmr_reset(&ngs->fwdtree_perf); ptmr_start(&ngs->fwdtree_perf); /* Reset backpointer table. */ ngs->bpidx = 0; ngs->bss_head = 0; /* Reset word lattice. */ for (i = 0; i < n_words; ++i) ngs->word_lat_idx[i] = NO_BP; /* Reset active HMM and word lists. */ ngs->n_active_chan[0] = ngs->n_active_chan[1] = 0; ngs->n_active_word[0] = ngs->n_active_word[1] = 0; /* Reset scores. */ ngs->best_score = 0; ngs->renormalized = 0; /* Reset other stuff. */ for (i = 0; i < n_words; i++) ngs->last_ltrans[i].sf = -1; ngs->n_frame = 0; /* Clear the hypothesis string. */ ckd_free(base->hyp_str); base->hyp_str = NULL; /* Reset the permanently allocated single-phone words, since they * may have junk left over in them from FWDFLAT. */ for (i = 0; i < ngs->n_1ph_words; i++) { w = ngs->single_phone_wid[i]; rhmm = (root_chan_t *) ngs->word_chan[w]; hmm_clear(&rhmm->hmm); } /* Start search with ; word_chan[] is permanently allocated */ rhmm = (root_chan_t *) ngs->word_chan[dict_startwid(ps_search_dict(ngs))]; hmm_clear(&rhmm->hmm); hmm_enter(&rhmm->hmm, 0, NO_BP, 0); } /* * Mark the active senones for all senones belonging to channels that are active in the * current frame. */ static void compute_sen_active(ngram_search_t *ngs, int frame_idx) { root_chan_t *rhmm; chan_t *hmm, **acl; int32 i, w, *awl; acmod_clear_active(ps_search_acmod(ngs)); /* Flag active senones for root channels */ for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { if (hmm_frame(&rhmm->hmm) == frame_idx) acmod_activate_hmm(ps_search_acmod(ngs), &rhmm->hmm); } /* Flag active senones for nonroot channels in HMM tree */ i = ngs->n_active_chan[frame_idx & 0x1]; acl = ngs->active_chan_list[frame_idx & 0x1]; for (hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { acmod_activate_hmm(ps_search_acmod(ngs), &hmm->hmm); } /* Flag active senones for individual word channels */ i = ngs->n_active_word[frame_idx & 0x1]; awl = ngs->active_word_list[frame_idx & 0x1]; for (w = *(awl++); i > 0; --i, w = *(awl++)) { for (hmm = ngs->word_chan[w]; hmm; hmm = hmm->next) { acmod_activate_hmm(ps_search_acmod(ngs), &hmm->hmm); } } for (i = 0; i < ngs->n_1ph_words; i++) { w = ngs->single_phone_wid[i]; rhmm = (root_chan_t *) ngs->word_chan[w]; if (hmm_frame(&rhmm->hmm) == frame_idx) acmod_activate_hmm(ps_search_acmod(ngs), &rhmm->hmm); } } static void renormalize_scores(ngram_search_t *ngs, int frame_idx, int32 norm) { root_chan_t *rhmm; chan_t *hmm, **acl; int32 i, w, *awl; /* Renormalize root channels */ for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { if (hmm_frame(&rhmm->hmm) == frame_idx) { hmm_normalize(&rhmm->hmm, norm); } } /* Renormalize nonroot channels in HMM tree */ i = ngs->n_active_chan[frame_idx & 0x1]; acl = ngs->active_chan_list[frame_idx & 0x1]; for (hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { hmm_normalize(&hmm->hmm, norm); } /* Renormalize individual word channels */ i = ngs->n_active_word[frame_idx & 0x1]; awl = ngs->active_word_list[frame_idx & 0x1]; for (w = *(awl++); i > 0; --i, w = *(awl++)) { for (hmm = ngs->word_chan[w]; hmm; hmm = hmm->next) { hmm_normalize(&hmm->hmm, norm); } } for (i = 0; i < ngs->n_1ph_words; i++) { w = ngs->single_phone_wid[i]; rhmm = (root_chan_t *) ngs->word_chan[w]; if (hmm_frame(&rhmm->hmm) == frame_idx) { hmm_normalize(&rhmm->hmm, norm); } } ngs->renormalized = TRUE; } static int32 eval_root_chan(ngram_search_t *ngs, int frame_idx) { root_chan_t *rhmm; int32 i, bestscore; bestscore = WORST_SCORE; for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { if (hmm_frame(&rhmm->hmm) == frame_idx) { int32 score = chan_v_eval(rhmm); if (score BETTER_THAN bestscore) bestscore = score; ++ngs->st.n_root_chan_eval; } } return (bestscore); } static int32 eval_nonroot_chan(ngram_search_t *ngs, int frame_idx) { chan_t *hmm, **acl; int32 i, bestscore; i = ngs->n_active_chan[frame_idx & 0x1]; acl = ngs->active_chan_list[frame_idx & 0x1]; bestscore = WORST_SCORE; ngs->st.n_nonroot_chan_eval += i; for (hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { int32 score = chan_v_eval(hmm); assert(hmm_frame(&hmm->hmm) == frame_idx); if (score BETTER_THAN bestscore) bestscore = score; } return bestscore; } static int32 eval_word_chan(ngram_search_t *ngs, int frame_idx) { root_chan_t *rhmm; chan_t *hmm; int32 i, w, bestscore, *awl, j, k; k = 0; bestscore = WORST_SCORE; awl = ngs->active_word_list[frame_idx & 0x1]; i = ngs->n_active_word[frame_idx & 0x1]; for (w = *(awl++); i > 0; --i, w = *(awl++)) { assert(bitvec_is_set(ngs->word_active, w)); bitvec_clear(ngs->word_active, w); assert(ngs->word_chan[w] != NULL); for (hmm = ngs->word_chan[w]; hmm; hmm = hmm->next) { int32 score; assert(hmm_frame(&hmm->hmm) == frame_idx); score = chan_v_eval(hmm); /*printf("eval word chan %d score %d\n", w, score); */ if (score BETTER_THAN bestscore) bestscore = score; k++; } } /* Similarly for statically allocated single-phone words */ j = 0; for (i = 0; i < ngs->n_1ph_words; i++) { int32 score; w = ngs->single_phone_wid[i]; rhmm = (root_chan_t *) ngs->word_chan[w]; if (hmm_frame(&rhmm->hmm) < frame_idx) continue; score = chan_v_eval(rhmm); /* printf("eval 1ph word chan %d score %d\n", w, score); */ if (score BETTER_THAN bestscore && w != ps_search_finish_wid(ngs)) bestscore = score; j++; } ngs->st.n_last_chan_eval += k + j; ngs->st.n_nonroot_chan_eval += k + j; ngs->st.n_word_lastchan_eval += ngs->n_active_word[frame_idx & 0x1] + j; return bestscore; } static int32 evaluate_channels(ngram_search_t *ngs, int16 const *senone_scores, int frame_idx) { int32 bs; hmm_context_set_senscore(ngs->hmmctx, senone_scores); ngs->best_score = eval_root_chan(ngs, frame_idx); if ((bs = eval_nonroot_chan(ngs, frame_idx)) BETTER_THAN ngs->best_score) ngs->best_score = bs; if ((bs = eval_word_chan(ngs, frame_idx)) BETTER_THAN ngs->best_score) ngs->best_score = bs; ngs->last_phone_best_score = bs; return ngs->best_score; } /* * Prune currently active root channels for next frame. Also, perform exit * transitions out of them and activate successors. * score[] of pruned root chan set to WORST_SCORE elsewhere. */ static void prune_root_chan(ngram_search_t *ngs, int frame_idx) { root_chan_t *rhmm; chan_t *hmm; int32 i, nf, w; int32 thresh, newphone_thresh, lastphn_thresh, newphone_score; chan_t **nacl; /* next active list */ lastphn_cand_t *candp; phone_loop_search_t *pls; nf = frame_idx + 1; thresh = ngs->best_score + ngs->dynamic_beam; newphone_thresh = ngs->best_score + ngs->pbeam; lastphn_thresh = ngs->best_score + ngs->lpbeam; nacl = ngs->active_chan_list[nf & 0x1]; pls = (phone_loop_search_t *)ps_search_lookahead(ngs); for (i = 0, rhmm = ngs->root_chan; i < ngs->n_root_chan; i++, rhmm++) { E_DEBUG(3,("Root channel %d frame %d score %d thresh %d\n", i, hmm_frame(&rhmm->hmm), hmm_bestscore(&rhmm->hmm), thresh)); /* First check if this channel was active in current frame */ if (hmm_frame(&rhmm->hmm) < frame_idx) continue; if (hmm_bestscore(&rhmm->hmm) BETTER_THAN thresh) { hmm_frame(&rhmm->hmm) = nf; /* rhmm will be active in next frame */ E_DEBUG(3,("Preserving root channel %d score %d\n", i, hmm_bestscore(&rhmm->hmm))); /* transitions out of this root channel */ /* transition to all next-level channels in the HMM tree */ newphone_score = hmm_out_score(&rhmm->hmm) + ngs->pip; if (pls != NULL || newphone_score BETTER_THAN newphone_thresh) { for (hmm = rhmm->next; hmm; hmm = hmm->alt) { int32 pl_newphone_score = newphone_score + phone_loop_search_score(pls, hmm->ciphone); if (pl_newphone_score BETTER_THAN newphone_thresh) { if ((hmm_frame(&hmm->hmm) < frame_idx) || (newphone_score BETTER_THAN hmm_in_score(&hmm->hmm))) { hmm_enter(&hmm->hmm, newphone_score, hmm_out_history(&rhmm->hmm), nf); *(nacl++) = hmm; } } } } /* * Transition to last phone of all words for which this is the * penultimate phone (the last phones may need multiple right contexts). * Remember to remove the temporary newword_penalty. */ if (pls != NULL || newphone_score BETTER_THAN lastphn_thresh) { for (w = rhmm->penult_phn_wid; w >= 0; w = ngs->homophone_set[w]) { int32 pl_newphone_score = newphone_score + phone_loop_search_score (pls, dict_last_phone(ps_search_dict(ngs),w)); E_DEBUG(3,("word %s newphone_score %d\n", dict_wordstr(ps_search_dict(ngs), w), newphone_score)); if (pl_newphone_score BETTER_THAN lastphn_thresh) { candp = ngs->lastphn_cand + ngs->n_lastphn_cand; ngs->n_lastphn_cand++; candp->wid = w; candp->score = newphone_score - ngs->nwpen; candp->bp = hmm_out_history(&rhmm->hmm); } } } } } ngs->n_active_chan[nf & 0x1] = (int)(nacl - ngs->active_chan_list[nf & 0x1]); } /* * Prune currently active nonroot channels in HMM tree for next frame. Also, perform * exit transitions out of such channels and activate successors. */ static void prune_nonroot_chan(ngram_search_t *ngs, int frame_idx) { chan_t *hmm, *nexthmm; int32 nf, w, i; int32 thresh, newphone_thresh, lastphn_thresh, newphone_score; chan_t **acl, **nacl; /* active list, next active list */ lastphn_cand_t *candp; phone_loop_search_t *pls; nf = frame_idx + 1; thresh = ngs->best_score + ngs->dynamic_beam; newphone_thresh = ngs->best_score + ngs->pbeam; lastphn_thresh = ngs->best_score + ngs->lpbeam; pls = (phone_loop_search_t *)ps_search_lookahead(ngs); acl = ngs->active_chan_list[frame_idx & 0x1]; /* currently active HMMs in tree */ nacl = ngs->active_chan_list[nf & 0x1] + ngs->n_active_chan[nf & 0x1]; for (i = ngs->n_active_chan[frame_idx & 0x1], hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { assert(hmm_frame(&hmm->hmm) >= frame_idx); if (hmm_bestscore(&hmm->hmm) BETTER_THAN thresh) { /* retain this channel in next frame */ if (hmm_frame(&hmm->hmm) != nf) { hmm_frame(&hmm->hmm) = nf; *(nacl++) = hmm; } /* transition to all next-level channel in the HMM tree */ newphone_score = hmm_out_score(&hmm->hmm) + ngs->pip; if (pls != NULL || newphone_score BETTER_THAN newphone_thresh) { for (nexthmm = hmm->next; nexthmm; nexthmm = nexthmm->alt) { int32 pl_newphone_score = newphone_score + phone_loop_search_score(pls, nexthmm->ciphone); if ((pl_newphone_score BETTER_THAN newphone_thresh) && ((hmm_frame(&nexthmm->hmm) < frame_idx) || (newphone_score BETTER_THAN hmm_in_score(&nexthmm->hmm)))) { if (hmm_frame(&nexthmm->hmm) != nf) { /* Keep this HMM on the active list */ *(nacl++) = nexthmm; } hmm_enter(&nexthmm->hmm, newphone_score, hmm_out_history(&hmm->hmm), nf); } } } /* * Transition to last phone of all words for which this is the * penultimate phone (the last phones may need multiple right contexts). * Remember to remove the temporary newword_penalty. */ if (pls != NULL || newphone_score BETTER_THAN lastphn_thresh) { for (w = hmm->info.penult_phn_wid; w >= 0; w = ngs->homophone_set[w]) { int32 pl_newphone_score = newphone_score + phone_loop_search_score (pls, dict_last_phone(ps_search_dict(ngs),w)); if (pl_newphone_score BETTER_THAN lastphn_thresh) { candp = ngs->lastphn_cand + ngs->n_lastphn_cand; ngs->n_lastphn_cand++; candp->wid = w; candp->score = newphone_score - ngs->nwpen; candp->bp = hmm_out_history(&hmm->hmm); } } } } else if (hmm_frame(&hmm->hmm) != nf) { hmm_clear(&hmm->hmm); } } ngs->n_active_chan[nf & 0x1] = (int)(nacl - ngs->active_chan_list[nf & 0x1]); } /* * Execute the transition into the last phone for all candidates words emerging from * the HMM tree. Attach LM scores to such transitions. * (Executed after pruning root and non-root, but before pruning word-chan.) */ static void last_phone_transition(ngram_search_t *ngs, int frame_idx) { int32 i, j, k, nf, bp, bpend, w; lastphn_cand_t *candp; int32 *nawl; int32 thresh; int32 bestscore, dscr; chan_t *hmm; bptbl_t *bpe; int32 n_cand_sf = 0; nf = frame_idx + 1; nawl = ngs->active_word_list[nf & 0x1]; ngs->st.n_lastphn_cand_utt += ngs->n_lastphn_cand; /* For each candidate word (entering its last phone) */ /* If best LM score and bp for candidate known use it, else sort cands by startfrm */ for (i = 0, candp = ngs->lastphn_cand; i < ngs->n_lastphn_cand; i++, candp++) { int32 start_score; /* This can happen if recognition fails. */ if (candp->bp == -1) continue; /* Backpointer entry for it. */ bpe = &(ngs->bp_table[candp->bp]); /* Subtract starting score for candidate, leave it with only word score */ start_score = ngram_search_exit_score (ngs, bpe, dict_first_phone(ps_search_dict(ngs), candp->wid)); assert(start_score BETTER_THAN WORST_SCORE); candp->score -= start_score; /* * If this candidate not occurred in an earlier frame, prepare for finding * best transition score into last phone; sort by start frame. */ /* i.e. if we don't have an entry in last_ltrans for this * , then create one */ if (ngs->last_ltrans[candp->wid].sf != bpe->frame + 1) { /* Look for an entry in cand_sf matching the backpointer * for this candidate. */ for (j = 0; j < n_cand_sf; j++) { if (ngs->cand_sf[j].bp_ef == bpe->frame) break; } /* Oh, we found one, so chain onto it. */ if (j < n_cand_sf) candp->next = ngs->cand_sf[j].cand; else { /* Nope, let's make a new one, allocating cand_sf if necessary. */ if (n_cand_sf >= ngs->cand_sf_alloc) { if (ngs->cand_sf_alloc == 0) { ngs->cand_sf = ckd_calloc(CAND_SF_ALLOCSIZE, sizeof(*ngs->cand_sf)); ngs->cand_sf_alloc = CAND_SF_ALLOCSIZE; } else { ngs->cand_sf_alloc += CAND_SF_ALLOCSIZE; ngs->cand_sf = ckd_realloc(ngs->cand_sf, ngs->cand_sf_alloc * sizeof(*ngs->cand_sf)); E_INFO("cand_sf[] increased to %d entries\n", ngs->cand_sf_alloc); } } /* Use the newly created cand_sf. */ j = n_cand_sf++; candp->next = -1; /* End of the chain. */ ngs->cand_sf[j].bp_ef = bpe->frame; } /* Update it to point to this candidate. */ ngs->cand_sf[j].cand = i; ngs->last_ltrans[candp->wid].dscr = WORST_SCORE; ngs->last_ltrans[candp->wid].sf = bpe->frame + 1; } } /* Compute best LM score and bp for new cands entered in the sorted lists above */ for (i = 0; i < n_cand_sf; i++) { /* For the i-th unique end frame... */ bp = ngs->bp_table_idx[ngs->cand_sf[i].bp_ef]; bpend = ngs->bp_table_idx[ngs->cand_sf[i].bp_ef + 1]; for (bpe = &(ngs->bp_table[bp]); bp < bpend; bp++, bpe++) { if (!bpe->valid) continue; /* For each candidate at the start frame find bp->cand transition-score */ for (j = ngs->cand_sf[i].cand; j >= 0; j = candp->next) { int32 n_used; candp = &(ngs->lastphn_cand[j]); dscr = ngram_search_exit_score (ngs, bpe, dict_first_phone(ps_search_dict(ngs), candp->wid)); if (dscr BETTER_THAN WORST_SCORE) { assert(!dict_filler_word(ps_search_dict(ngs), candp->wid)); dscr += ngram_tg_score(ngs->lmset, dict_basewid(ps_search_dict(ngs), candp->wid), bpe->real_wid, bpe->prev_real_wid, &n_used)>>SENSCR_SHIFT; } if (dscr BETTER_THAN ngs->last_ltrans[candp->wid].dscr) { ngs->last_ltrans[candp->wid].dscr = dscr; ngs->last_ltrans[candp->wid].bp = bp; } } } } /* Update best transitions for all candidates; also update best lastphone score */ bestscore = ngs->last_phone_best_score; for (i = 0, candp = ngs->lastphn_cand; i < ngs->n_lastphn_cand; i++, candp++) { candp->score += ngs->last_ltrans[candp->wid].dscr; candp->bp = ngs->last_ltrans[candp->wid].bp; if (candp->score BETTER_THAN bestscore) bestscore = candp->score; } ngs->last_phone_best_score = bestscore; /* At this pt, we know the best entry score (with LM component) for all candidates */ thresh = bestscore + ngs->lponlybeam; for (i = ngs->n_lastphn_cand, candp = ngs->lastphn_cand; i > 0; --i, candp++) { if (candp->score BETTER_THAN thresh) { w = candp->wid; ngram_search_alloc_all_rc(ngs, w); k = 0; for (hmm = ngs->word_chan[w]; hmm; hmm = hmm->next) { if ((hmm_frame(&hmm->hmm) < frame_idx) || (candp->score BETTER_THAN hmm_in_score(&hmm->hmm))) { assert(hmm_frame(&hmm->hmm) != nf); hmm_enter(&hmm->hmm, candp->score, candp->bp, nf); k++; } } if (k > 0) { assert(bitvec_is_clear(ngs->word_active, w)); assert(!dict_is_single_phone(ps_search_dict(ngs), w)); *(nawl++) = w; bitvec_set(ngs->word_active, w); } } } ngs->n_active_word[nf & 0x1] = (int)(nawl - ngs->active_word_list[nf & 0x1]); } /* * Prune currently active word channels for next frame. Also, perform exit * transitions out of such channels and active successors. */ static void prune_word_chan(ngram_search_t *ngs, int frame_idx) { root_chan_t *rhmm; chan_t *hmm, *thmm; chan_t **phmmp; /* previous HMM-pointer */ int32 nf, w, i, k; int32 newword_thresh, lastphn_thresh; int32 *awl, *nawl; nf = frame_idx + 1; newword_thresh = ngs->last_phone_best_score + ngs->wbeam; lastphn_thresh = ngs->last_phone_best_score + ngs->lponlybeam; awl = ngs->active_word_list[frame_idx & 0x1]; nawl = ngs->active_word_list[nf & 0x1] + ngs->n_active_word[nf & 0x1]; /* Dynamically allocated last channels of multi-phone words */ for (i = ngs->n_active_word[frame_idx & 0x1], w = *(awl++); i > 0; --i, w = *(awl++)) { k = 0; phmmp = &(ngs->word_chan[w]); for (hmm = ngs->word_chan[w]; hmm; hmm = thmm) { assert(hmm_frame(&hmm->hmm) >= frame_idx); thmm = hmm->next; if (hmm_bestscore(&hmm->hmm) BETTER_THAN lastphn_thresh) { /* retain this channel in next frame */ hmm_frame(&hmm->hmm) = nf; k++; phmmp = &(hmm->next); /* Could if ((! skip_alt_frm) || (frame_idx & 0x1)) the following */ if (hmm_out_score(&hmm->hmm) BETTER_THAN newword_thresh) { /* can exit channel and recognize word */ ngram_search_save_bp(ngs, frame_idx, w, hmm_out_score(&hmm->hmm), hmm_out_history(&hmm->hmm), hmm->info.rc_id); } } else if (hmm_frame(&hmm->hmm) == nf) { phmmp = &(hmm->next); } else { hmm_deinit(&hmm->hmm); listelem_free(ngs->chan_alloc, hmm); *phmmp = thmm; } } if ((k > 0) && (bitvec_is_clear(ngs->word_active, w))) { assert(!dict_is_single_phone(ps_search_dict(ngs), w)); *(nawl++) = w; bitvec_set(ngs->word_active, w); } } ngs->n_active_word[nf & 0x1] = (int)(nawl - ngs->active_word_list[nf & 0x1]); /* * Prune permanently allocated single-phone channels. * NOTES: score[] of pruned channels set to WORST_SCORE elsewhere. */ for (i = 0; i < ngs->n_1ph_words; i++) { w = ngs->single_phone_wid[i]; rhmm = (root_chan_t *) ngs->word_chan[w]; E_DEBUG(3,("Single phone word %s frame %d score %d thresh %d outscore %d nwthresh %d\n", dict_wordstr(ps_search_dict(ngs),w), hmm_frame(&rhmm->hmm), hmm_bestscore(&rhmm->hmm), lastphn_thresh, hmm_out_score(&rhmm->hmm), newword_thresh)); if (hmm_frame(&rhmm->hmm) < frame_idx) continue; if (hmm_bestscore(&rhmm->hmm) BETTER_THAN lastphn_thresh) { hmm_frame(&rhmm->hmm) = nf; /* Could if ((! skip_alt_frm) || (frame_idx & 0x1)) the following */ if (hmm_out_score(&rhmm->hmm) BETTER_THAN newword_thresh) { E_DEBUG(4,("Exiting single phone word %s with %d > %d, %d\n", dict_wordstr(ps_search_dict(ngs),w), hmm_out_score(&rhmm->hmm), lastphn_thresh, newword_thresh)); ngram_search_save_bp(ngs, frame_idx, w, hmm_out_score(&rhmm->hmm), hmm_out_history(&rhmm->hmm), 0); } } } } static void prune_channels(ngram_search_t *ngs, int frame_idx) { /* Clear last phone candidate list. */ ngs->n_lastphn_cand = 0; /* Set the dynamic beam based on maxhmmpf here. */ ngs->dynamic_beam = ngs->beam; if (ngs->maxhmmpf != -1 && ngs->st.n_root_chan_eval + ngs->st.n_nonroot_chan_eval > ngs->maxhmmpf) { /* Build a histogram to approximately prune them. */ int32 bins[256], bw, nhmms, i; root_chan_t *rhmm; chan_t **acl, *hmm; /* Bins go from zero (best score) to edge of beam. */ bw = -ngs->beam / 256; memset(bins, 0, sizeof(bins)); /* For each active root channel. */ for (i = 0, rhmm = ngs->root_chan; i < ngs->n_root_chan; i++, rhmm++) { int32 b; /* Put it in a bin according to its bestscore. */ b = (ngs->best_score - hmm_bestscore(&rhmm->hmm)) / bw; if (b >= 256) b = 255; ++bins[b]; } /* For each active non-root channel. */ acl = ngs->active_chan_list[frame_idx & 0x1]; /* currently active HMMs in tree */ for (i = ngs->n_active_chan[frame_idx & 0x1], hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { int32 b; /* Put it in a bin according to its bestscore. */ b = (ngs->best_score - hmm_bestscore(&hmm->hmm)) / bw; if (b >= 256) b = 255; ++bins[b]; } /* Walk down the bins to find the new beam. */ for (i = nhmms = 0; i < 256; ++i) { nhmms += bins[i]; if (nhmms > ngs->maxhmmpf) break; } ngs->dynamic_beam = -(i * bw); } prune_root_chan(ngs, frame_idx); prune_nonroot_chan(ngs, frame_idx); last_phone_transition(ngs, frame_idx); prune_word_chan(ngs, frame_idx); } /* * Limit the number of word exits in each frame to maxwpf. And also limit the number of filler * words to 1. */ static void bptable_maxwpf(ngram_search_t *ngs, int frame_idx) { int32 bp, n; int32 bestscr, worstscr; bptbl_t *bpe, *bestbpe, *worstbpe; /* Don't prune if no pruing. */ if (ngs->maxwpf == -1 || ngs->maxwpf == ps_search_n_words(ngs)) return; /* Allow only one filler word exit (the best) per frame */ bestscr = (int32) 0x80000000; bestbpe = NULL; n = 0; for (bp = ngs->bp_table_idx[frame_idx]; bp < ngs->bpidx; bp++) { bpe = &(ngs->bp_table[bp]); if (dict_filler_word(ps_search_dict(ngs), bpe->wid)) { if (bpe->score BETTER_THAN bestscr) { bestscr = bpe->score; bestbpe = bpe; } bpe->valid = FALSE; n++; /* No. of filler words */ } } /* Restore bestbpe to valid state */ if (bestbpe != NULL) { bestbpe->valid = TRUE; --n; } /* Allow up to maxwpf best entries to survive; mark the remaining with valid = 0 */ n = (ngs->bpidx - ngs->bp_table_idx[frame_idx]) - n; /* No. of entries after limiting fillers */ for (; n > ngs->maxwpf; --n) { /* Find worst BPTable entry */ worstscr = (int32) 0x7fffffff; worstbpe = NULL; for (bp = ngs->bp_table_idx[frame_idx]; (bp < ngs->bpidx); bp++) { bpe = &(ngs->bp_table[bp]); if (bpe->valid && (bpe->score WORSE_THAN worstscr)) { worstscr = bpe->score; worstbpe = bpe; } } /* FIXME: Don't panic! */ if (worstbpe == NULL) E_FATAL("PANIC: No worst BPtable entry remaining\n"); worstbpe->valid = FALSE; } } static void word_transition(ngram_search_t *ngs, int frame_idx) { int32 i, k, bp, w, nf; int32 rc; int32 thresh, newscore, pl_newscore; bptbl_t *bpe; root_chan_t *rhmm; struct bestbp_rc_s *bestbp_rc_ptr; phone_loop_search_t *pls; dict_t *dict = ps_search_dict(ngs); dict2pid_t *d2p = ps_search_dict2pid(ngs); /* * Transition to start of new word instances (HMM tree roots); but only if words * other than finished here. * But, first, find the best starting score for each possible right context phone. */ for (i = bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef) - 1; i >= 0; --i) ngs->bestbp_rc[i].score = WORST_SCORE; k = 0; pls = (phone_loop_search_t *)ps_search_lookahead(ngs); /* Ugh, this is complicated. Scan all word exits for this frame * (they have already been created by prune_word_chan()). */ for (bp = ngs->bp_table_idx[frame_idx]; bp < ngs->bpidx; bp++) { bpe = &(ngs->bp_table[bp]); ngs->word_lat_idx[bpe->wid] = NO_BP; if (bpe->wid == ps_search_finish_wid(ngs)) continue; k++; /* DICT2PID */ /* Array of HMM scores corresponding to all the possible right * context expansions of the final phone. It's likely that a * lot of these are going to be missing, actually. */ if (bpe->last2_phone == -1) { /* implies s_idx == -1 */ /* No right context expansion. */ for (rc = 0; rc < bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef); ++rc) { if (bpe->score BETTER_THAN ngs->bestbp_rc[rc].score) { E_DEBUG(4,("bestbp_rc[0] = %d lc %d\n", bpe->score, bpe->last_phone)); ngs->bestbp_rc[rc].score = bpe->score; ngs->bestbp_rc[rc].path = bp; ngs->bestbp_rc[rc].lc = bpe->last_phone; } } } else { xwdssid_t *rssid = dict2pid_rssid(d2p, bpe->last_phone, bpe->last2_phone); int32 *rcss = &(ngs->bscore_stack[bpe->s_idx]); for (rc = 0; rc < bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef); ++rc) { if (rcss[rssid->cimap[rc]] BETTER_THAN ngs->bestbp_rc[rc].score) { E_DEBUG(4,("bestbp_rc[%d] = %d lc %d\n", rc, rcss[rssid->cimap[rc]], bpe->last_phone)); ngs->bestbp_rc[rc].score = rcss[rssid->cimap[rc]]; ngs->bestbp_rc[rc].path = bp; ngs->bestbp_rc[rc].lc = bpe->last_phone; } } } } if (k == 0) return; nf = frame_idx + 1; thresh = ngs->best_score + ngs->dynamic_beam; /* * Hypothesize successors to words finished in this frame. * Main dictionary, multi-phone words transition to HMM-trees roots. */ for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { bestbp_rc_ptr = &(ngs->bestbp_rc[rhmm->ciphone]); newscore = bestbp_rc_ptr->score + ngs->nwpen + ngs->pip; pl_newscore = newscore + phone_loop_search_score(pls, rhmm->ciphone); if (pl_newscore BETTER_THAN thresh) { if ((hmm_frame(&rhmm->hmm) < frame_idx) || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { hmm_enter(&rhmm->hmm, newscore, bestbp_rc_ptr->path, nf); /* DICT2PID: Another place where mpx ssids are entered. */ /* Look up the ssid to use when entering this mpx triphone. */ hmm_mpx_ssid(&rhmm->hmm, 0) = dict2pid_ldiph_lc(d2p, rhmm->ciphone, rhmm->ci2phone, bestbp_rc_ptr->lc); assert(hmm_mpx_ssid(&rhmm->hmm, 0) != BAD_SSID); } } } /* * Single phone words; no right context for these. Cannot use bestbp_rc as * LM scores have to be included. First find best transition to these words. */ for (i = 0; i < ngs->n_1ph_LMwords; i++) { w = ngs->single_phone_wid[i]; ngs->last_ltrans[w].dscr = (int32) 0x80000000; } for (bp = ngs->bp_table_idx[frame_idx]; bp < ngs->bpidx; bp++) { bpe = &(ngs->bp_table[bp]); if (!bpe->valid) continue; for (i = 0; i < ngs->n_1ph_LMwords; i++) { int32 n_used; w = ngs->single_phone_wid[i]; newscore = ngram_search_exit_score (ngs, bpe, dict_first_phone(dict, w)); E_DEBUG(4, ("initial newscore for %s: %d\n", dict_wordstr(dict, w), newscore)); if (newscore != WORST_SCORE) newscore += ngram_tg_score(ngs->lmset, dict_basewid(dict, w), bpe->real_wid, bpe->prev_real_wid, &n_used)>>SENSCR_SHIFT; /* FIXME: Not sure how WORST_SCORE could be better, but it * apparently happens. */ if (newscore BETTER_THAN ngs->last_ltrans[w].dscr) { ngs->last_ltrans[w].dscr = newscore; ngs->last_ltrans[w].bp = bp; } } } /* Now transition to in-LM single phone words */ for (i = 0; i < ngs->n_1ph_LMwords; i++) { w = ngs->single_phone_wid[i]; /* Never transition into the start word (for one thing, it is a non-event in the language model.) */ if (w == dict_startwid(ps_search_dict(ngs))) continue; rhmm = (root_chan_t *) ngs->word_chan[w]; newscore = ngs->last_ltrans[w].dscr + ngs->pip; pl_newscore = newscore + phone_loop_search_score(pls, rhmm->ciphone); if (pl_newscore BETTER_THAN thresh) { bpe = ngs->bp_table + ngs->last_ltrans[w].bp; if ((hmm_frame(&rhmm->hmm) < frame_idx) || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { hmm_enter(&rhmm->hmm, newscore, ngs->last_ltrans[w].bp, nf); /* DICT2PID: another place where mpx ssids are entered. */ /* Look up the ssid to use when entering this mpx triphone. */ hmm_mpx_ssid(&rhmm->hmm, 0) = dict2pid_ldiph_lc(d2p, rhmm->ciphone, rhmm->ci2phone, dict_last_phone(dict, bpe->wid)); assert(hmm_mpx_ssid(&rhmm->hmm, 0) != BAD_SSID); } } } /* Remaining words: , noise words. No mpx for these! */ w = ps_search_silence_wid(ngs); rhmm = (root_chan_t *) ngs->word_chan[w]; bestbp_rc_ptr = &(ngs->bestbp_rc[ps_search_acmod(ngs)->mdef->sil]); newscore = bestbp_rc_ptr->score + ngs->silpen + ngs->pip; pl_newscore = newscore + phone_loop_search_score(pls, rhmm->ciphone); if (pl_newscore BETTER_THAN thresh) { if ((hmm_frame(&rhmm->hmm) < frame_idx) || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { hmm_enter(&rhmm->hmm, newscore, bestbp_rc_ptr->path, nf); } } for (w = dict_filler_start(dict); w <= dict_filler_end(dict); w++) { if (w == ps_search_silence_wid(ngs)) continue; /* Never transition into the start word (for one thing, it is a non-event in the language model.) */ if (w == dict_startwid(ps_search_dict(ngs))) continue; rhmm = (root_chan_t *) ngs->word_chan[w]; /* If this was not actually a single-phone word, rhmm will be NULL. */ if (rhmm == NULL) continue; newscore = bestbp_rc_ptr->score + ngs->fillpen + ngs->pip; pl_newscore = newscore + phone_loop_search_score(pls, rhmm->ciphone); if (pl_newscore BETTER_THAN thresh) { if ((hmm_frame(&rhmm->hmm) < frame_idx) || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { hmm_enter(&rhmm->hmm, newscore, bestbp_rc_ptr->path, nf); } } } } static void deactivate_channels(ngram_search_t *ngs, int frame_idx) { root_chan_t *rhmm; int i; /* Clear score[] of pruned root channels */ for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { if (hmm_frame(&rhmm->hmm) == frame_idx) { hmm_clear(&rhmm->hmm); } } /* Clear score[] of pruned single-phone channels */ for (i = 0; i < ngs->n_1ph_words; i++) { int32 w = ngs->single_phone_wid[i]; rhmm = (root_chan_t *) ngs->word_chan[w]; if (hmm_frame(&rhmm->hmm) == frame_idx) { hmm_clear(&rhmm->hmm); } } } int ngram_fwdtree_search(ngram_search_t *ngs, int frame_idx) { int16 const *senscr; /* Activate our HMMs for the current frame if need be. */ if (!ps_search_acmod(ngs)->compallsen) compute_sen_active(ngs, frame_idx); /* Compute GMM scores for the current frame. */ if ((senscr = acmod_score(ps_search_acmod(ngs), &frame_idx)) == NULL) return 0; ngs->st.n_senone_active_utt += ps_search_acmod(ngs)->n_senone_active; /* Mark backpointer table for current frame. */ ngram_search_mark_bptable(ngs, frame_idx); /* If the best score is equal to or worse than WORST_SCORE, * recognition has failed, don't bother to keep trying. */ if (ngs->best_score == WORST_SCORE || ngs->best_score WORSE_THAN WORST_SCORE) return 0; /* Renormalize if necessary */ if (ngs->best_score + (2 * ngs->beam) WORSE_THAN WORST_SCORE) { E_INFO("Renormalizing Scores at frame %d, best score %d\n", frame_idx, ngs->best_score); renormalize_scores(ngs, frame_idx, ngs->best_score); } /* Evaluate HMMs */ evaluate_channels(ngs, senscr, frame_idx); /* Prune HMMs and do phone transitions. */ prune_channels(ngs, frame_idx); /* Do absolute pruning on word exits. */ bptable_maxwpf(ngs, frame_idx); /* Do word transitions. */ word_transition(ngs, frame_idx); /* Deactivate pruned HMMs. */ deactivate_channels(ngs, frame_idx); ++ngs->n_frame; /* Return the number of frames processed. */ return 1; } void ngram_fwdtree_finish(ngram_search_t *ngs) { int32 i, w, cf, *awl; root_chan_t *rhmm; chan_t *hmm, **acl; /* This is the number of frames processed. */ cf = ps_search_acmod(ngs)->output_frame; /* Add a mark in the backpointer table for one past the final frame. */ ngram_search_mark_bptable(ngs, cf); /* Deactivate channels lined up for the next frame */ /* First, root channels of HMM tree */ for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { hmm_clear(&rhmm->hmm); } /* nonroot channels of HMM tree */ i = ngs->n_active_chan[cf & 0x1]; acl = ngs->active_chan_list[cf & 0x1]; for (hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { hmm_clear(&hmm->hmm); } /* word channels */ i = ngs->n_active_word[cf & 0x1]; awl = ngs->active_word_list[cf & 0x1]; for (w = *(awl++); i > 0; --i, w = *(awl++)) { /* Don't accidentally free single-phone words! */ if (dict_is_single_phone(ps_search_dict(ngs), w)) continue; bitvec_clear(ngs->word_active, w); if (ngs->word_chan[w] == NULL) continue; ngram_search_free_all_rc(ngs, w); } /* * The previous search code did a postprocessing of the * backpointer table here, but we will postpone this until it is * absolutely necessary, i.e. when generating a word graph. * Likewise we don't actually have to decide what the exit word is * until somebody requests a backtrace. */ ptmr_stop(&ngs->fwdtree_perf); /* Print out some statistics. */ if (cf > 0) { double n_speech = (double)(cf + 1) / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); E_INFO("%8d words recognized (%d/fr)\n", ngs->bpidx, (ngs->bpidx + (cf >> 1)) / (cf + 1)); E_INFO("%8d senones evaluated (%d/fr)\n", ngs->st.n_senone_active_utt, (ngs->st.n_senone_active_utt + (cf >> 1)) / (cf + 1)); E_INFO("%8d channels searched (%d/fr), %d 1st, %d last\n", ngs->st.n_root_chan_eval + ngs->st.n_nonroot_chan_eval, (ngs->st.n_root_chan_eval + ngs->st.n_nonroot_chan_eval) / (cf + 1), ngs->st.n_root_chan_eval, ngs->st.n_last_chan_eval); E_INFO("%8d words for which last channels evaluated (%d/fr)\n", ngs->st.n_word_lastchan_eval, ngs->st.n_word_lastchan_eval / (cf + 1)); E_INFO("%8d candidate words for entering last phone (%d/fr)\n", ngs->st.n_lastphn_cand_utt, ngs->st.n_lastphn_cand_utt / (cf + 1)); E_INFO("fwdtree %.2f CPU %.3f xRT\n", ngs->fwdtree_perf.t_cpu, ngs->fwdtree_perf.t_cpu / n_speech); E_INFO("fwdtree %.2f wall %.3f xRT\n", ngs->fwdtree_perf.t_elapsed, ngs->fwdtree_perf.t_elapsed / n_speech); } /* dump_bptable(ngs); */ } pocketsphinx-5prealpha/src/libpocketsphinx/allphone_search.c0000664000175000017500000006455612771605033021713 00000000000000/* ==================================================================== * Copyright (c) 2014 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * allphone_search.c -- Search for phonetic decoding. */ #include #include #include #include #include #include #include #include #include "pocketsphinx_internal.h" #include "allphone_search.h" static ps_lattice_t * allphone_search_lattice(ps_search_t * search) { return NULL; } static int allphone_search_prob(ps_search_t * search) { return 0; } static void allphone_backtrace(allphone_search_t * allphs, int32 f, int32 *out_score); static void allphone_search_seg_free(ps_seg_t * seg) { ckd_free(seg); } static void allphone_search_fill_iter(ps_seg_t *seg, phseg_t *phseg) { seg->sf = phseg->sf; seg->ef = phseg->ef; seg->ascr = phseg->score; seg->lscr = phseg->tscore; seg->word = bin_mdef_ciphone_str(ps_search_acmod(seg->search)->mdef, phseg->ci); } static ps_seg_t * allphone_search_seg_next(ps_seg_t * seg) { phseg_iter_t *itor = (phseg_iter_t *) seg; phseg_t *phseg; itor->seg = itor->seg->next; if (itor->seg == NULL) { allphone_search_seg_free(seg); return NULL; } phseg = gnode_ptr(itor->seg); allphone_search_fill_iter(seg, phseg); return seg; } static ps_segfuncs_t fsg_segfuncs = { /* seg_next */ allphone_search_seg_next, /* seg_free */ allphone_search_seg_free }; static ps_seg_t * allphone_search_seg_iter(ps_search_t * search) { allphone_search_t *allphs = (allphone_search_t *) search; phseg_iter_t *iter; allphone_backtrace(allphs, allphs->frame - 1, NULL); if (allphs->segments == NULL) return NULL; iter = ckd_calloc(1, sizeof(phseg_iter_t)); iter->base.vt = &fsg_segfuncs; iter->base.search = search; iter->seg = allphs->segments; allphone_search_fill_iter((ps_seg_t *)iter, gnode_ptr(iter->seg)); return (ps_seg_t *) iter; } static ps_searchfuncs_t allphone_funcs = { /* start: */ allphone_search_start, /* step: */ allphone_search_step, /* finish: */ allphone_search_finish, /* reinit: */ allphone_search_reinit, /* free: */ allphone_search_free, /* lattice: */ allphone_search_lattice, /* hyp: */ allphone_search_hyp, /* prob: */ allphone_search_prob, /* seg_iter: */ allphone_search_seg_iter, }; /** * Find PHMM node with same senone sequence and tmat id as the given triphone. * Return ptr to PHMM node if found, NULL otherwise. */ static phmm_t * phmm_lookup(allphone_search_t * allphs, s3pid_t pid) { phmm_t *p; bin_mdef_t *mdef; phmm_t **ci_phmm; mdef = ((ps_search_t *) allphs)->acmod->mdef; ci_phmm = allphs->ci_phmm; for (p = ci_phmm[bin_mdef_pid2ci(mdef, pid)]; p; p = p->next) { if (mdef_pid2tmatid(mdef, p->pid) == mdef_pid2tmatid(mdef, pid)) if (mdef_pid2ssid(mdef, p->pid) == mdef_pid2ssid(mdef, pid)) return p; } return NULL; } static int32 phmm_link(allphone_search_t * allphs) { s3cipid_t ci, rc; phmm_t *p, *p2; int32 *rclist; int32 i, n_link; plink_t *l; bin_mdef_t *mdef; phmm_t **ci_phmm; mdef = ((ps_search_t *) allphs)->acmod->mdef; ci_phmm = allphs->ci_phmm; rclist = (int32 *) ckd_calloc(mdef->n_ciphone + 1, sizeof(int32)); /* Create successor links between PHMM nodes */ n_link = 0; for (ci = 0; ci < mdef->n_ciphone; ci++) { for (p = ci_phmm[ci]; p; p = p->next) { /* Build rclist for p */ i = 0; for (rc = 0; rc < mdef->n_ciphone; rc++) { if (bitvec_is_set(p->rc, rc)) rclist[i++] = rc; } rclist[i] = BAD_S3CIPID; /* For each rc in rclist, transition to PHMMs for rc if left context = ci */ for (i = 0; IS_S3CIPID(rclist[i]); i++) { for (p2 = ci_phmm[rclist[i]]; p2; p2 = p2->next) { if (bitvec_is_set(p2->lc, ci)) { /* transition from p to p2 */ l = (plink_t *) ckd_calloc(1, sizeof(*l)); l->phmm = p2; l->next = p->succlist; p->succlist = l; n_link++; } } } } } ckd_free(rclist); return n_link; } /** * Build net from phone HMMs */ static int phmm_build(allphone_search_t * allphs) { phmm_t *p, **pid2phmm; bin_mdef_t *mdef; int32 lrc_size; uint32 *lc, *rc; s3pid_t pid; s3cipid_t ci; s3cipid_t *filler; int n_phmm, n_link; int i, nphone; mdef = ((ps_search_t *) allphs)->acmod->mdef; allphs->ci_phmm = (phmm_t **) ckd_calloc(bin_mdef_n_ciphone(mdef), sizeof(phmm_t *)); pid2phmm = (phmm_t **) ckd_calloc(bin_mdef_n_phone(mdef), sizeof(phmm_t *)); /* For each unique ciphone/triphone entry in mdef, create a PHMM node */ n_phmm = 0; nphone = allphs->ci_only ? bin_mdef_n_ciphone(mdef) : bin_mdef_n_phone(mdef); E_INFO("Building PHMM net of %d phones\n", nphone); for (pid = 0; pid < nphone; pid++) { if ((p = phmm_lookup(allphs, pid)) == NULL) { /* not found, should be created */ p = (phmm_t *) ckd_calloc(1, sizeof(*p)); hmm_init(allphs->hmmctx, &(p->hmm), FALSE, mdef_pid2ssid(mdef, pid), mdef->phone[pid].tmat); p->pid = pid; p->ci = bin_mdef_pid2ci(mdef, pid); p->succlist = NULL; p->next = allphs->ci_phmm[p->ci]; allphs->ci_phmm[p->ci] = p; n_phmm++; } pid2phmm[pid] = p; } /* Fill out bitvecs of each PHMM node, alloc continuous memory chunk for context bitvectors */ lrc_size = bitvec_size(bin_mdef_n_ciphone(mdef)); lc = ckd_calloc(n_phmm * 2 * lrc_size, sizeof(bitvec_t)); rc = lc + (n_phmm * lrc_size); for (ci = 0; ci < mdef->n_ciphone; ci++) { for (p = allphs->ci_phmm[ci]; p; p = p->next) { p->lc = lc; lc += lrc_size; p->rc = rc; rc += lrc_size; } } /* Fill out lc and rc bitmaps (remember to map all fillers to each other!!) */ filler = (s3cipid_t *) ckd_calloc(bin_mdef_n_ciphone(mdef) + 1, sizeof(s3cipid_t)); /* Connect fillers */ i = 0; for (ci = 0; ci < bin_mdef_n_ciphone(mdef); ci++) { p = pid2phmm[ci]; bitvec_set_all(p->lc, bin_mdef_n_ciphone(mdef)); bitvec_set_all(p->rc, bin_mdef_n_ciphone(mdef)); if (mdef->phone[ci].info.ci.filler) { filler[i++] = ci; } } filler[i] = BAD_S3CIPID; /* Loop over cdphones only if ci_only is not set */ for (pid = bin_mdef_n_ciphone(mdef); pid < nphone; pid++) { p = pid2phmm[pid]; if (mdef->phone[mdef->phone[pid].info.cd.ctx[1]].info.ci.filler) { for (i = 0; IS_S3CIPID(filler[i]); i++) bitvec_set(p->lc, filler[i]); } else bitvec_set(p->lc, mdef->phone[pid].info.cd.ctx[1]); if (mdef->phone[mdef->phone[pid].info.cd.ctx[2]].info.ci.filler) { for (i = 0; IS_S3CIPID(filler[i]); i++) bitvec_set(p->rc, filler[i]); } else bitvec_set(p->rc, mdef->phone[pid].info.cd.ctx[2]); } ckd_free(pid2phmm); ckd_free(filler); /* Create links between PHMM nodes */ n_link = phmm_link(allphs); E_INFO("%d nodes, %d links\n", n_phmm, n_link); return 0; } static void phmm_free(allphone_search_t * allphs) { s3cipid_t ci; bin_mdef_t *mdef; if (!allphs->ci_phmm) return; ckd_free(allphs->ci_phmm[0]->lc); mdef = ((ps_search_t *) allphs)->acmod->mdef; for (ci = 0; ci < mdef_n_ciphone(mdef); ++ci) { phmm_t *p, *next; for (p = allphs->ci_phmm[ci]; p; p = next) { plink_t *l, *lnext; next = p->next; for (l = p->succlist; l; l = lnext) { lnext = l->next; ckd_free(l); } hmm_deinit(&(p->hmm)); ckd_free(p); } } ckd_free(allphs->ci_phmm); } /** Evaluate active PHMMs */ static int32 phmm_eval_all(allphone_search_t * allphs, const int16 * senscr) { s3cipid_t ci; phmm_t *p; int32 best; bin_mdef_t *mdef; phmm_t **ci_phmm; mdef = ((ps_search_t *) allphs)->acmod->mdef; ci_phmm = allphs->ci_phmm; best = WORST_SCORE; hmm_context_set_senscore(allphs->hmmctx, senscr); for (ci = 0; ci < mdef->n_ciphone; ci++) { for (p = ci_phmm[(unsigned) ci]; p; p = p->next) { if (hmm_frame(&(p->hmm)) == allphs->frame) { int32 score; allphs->n_hmm_eval++; score = hmm_vit_eval((hmm_t *) p); if (score > best) best = score; } } } return best; } static void phmm_exit(allphone_search_t * allphs, int32 best) { s3cipid_t ci; phmm_t *p; int32 th, nf; history_t *h; blkarray_list_t *history; bin_mdef_t *mdef; int32 curfrm; phmm_t **ci_phmm; int32 *ci2lmwid; th = best + allphs->pbeam; history = allphs->history; mdef = ps_search_acmod(allphs)->mdef; curfrm = allphs->frame; ci_phmm = allphs->ci_phmm; ci2lmwid = allphs->ci2lmwid; nf = curfrm + 1; for (ci = 0; ci < mdef->n_ciphone; ci++) { for (p = ci_phmm[(unsigned) ci]; p; p = p->next) { if (hmm_frame(&(p->hmm)) == curfrm) { if (hmm_bestscore(&(p->hmm)) >= th) { h = (history_t *) ckd_calloc(1, sizeof(*h)); h->ef = curfrm; h->phmm = p; h->hist = hmm_out_history(&(p->hmm)); h->score = hmm_out_score(&(p->hmm)); if (!allphs->lm) { h->tscore = allphs->inspen; } else { if (h->hist > 0) { int32 n_used; history_t *pred = blkarray_list_get(history, h->hist); if (pred->hist > 0) { history_t *pred_pred = blkarray_list_get(history, h->hist); h->tscore = ngram_tg_score(allphs->lm, ci2lmwid [pred_pred->phmm->ci], ci2lmwid[pred-> phmm->ci], ci2lmwid[p->ci], &n_used) >> SENSCR_SHIFT; } else { h->tscore = ngram_bg_score(allphs->lm, ci2lmwid [pred->phmm->ci], ci2lmwid[p->ci], &n_used) >> SENSCR_SHIFT; } } else { /* * This is the beginning SIL and in srch_allphone_begin() * it's inscore is set to 0. */ h->tscore = 0; } } blkarray_list_append(history, h); /* Mark PHMM active in next frame */ hmm_frame(&(p->hmm)) = nf; } else { /* Reset state scores */ hmm_clear(&(p->hmm)); } } } } } static void phmm_trans(allphone_search_t * allphs, int32 best, int32 frame_history_start) { history_t *h; phmm_t *from, *to; plink_t *l; int32 newscore, nf, curfrm; int32 *ci2lmwid; int32 hist_idx; curfrm = allphs->frame; nf = curfrm + 1; ci2lmwid = allphs->ci2lmwid; /* Transition from exited nodes to initial states of HMMs */ for (hist_idx = frame_history_start; hist_idx < blkarray_list_n_valid(allphs->history); hist_idx++) { h = blkarray_list_get(allphs->history, hist_idx); from = h->phmm; for (l = from->succlist; l; l = l->next) { int32 tscore; to = l->phmm; /* No LM, just use uniform (insertion penalty). */ if (!allphs->lm) tscore = allphs->inspen; else { int32 n_used; if (h->hist > 0) { history_t *pred = blkarray_list_get(allphs->history, h->hist); tscore = ngram_tg_score(allphs->lm, ci2lmwid[pred->phmm->ci], ci2lmwid[from->ci], ci2lmwid[to->ci], &n_used) >> SENSCR_SHIFT; } else { tscore = ngram_bg_score(allphs->lm, ci2lmwid[from->ci], ci2lmwid[to->ci], &n_used) >> SENSCR_SHIFT; } } newscore = h->score + tscore; if ((newscore > best + allphs->beam) && (newscore > hmm_in_score(&(to->hmm)))) { hmm_enter(&(to->hmm), newscore, hist_idx, nf); } } } } ps_search_t * allphone_search_init(const char *name, ngram_model_t * lm, cmd_ln_t * config, acmod_t * acmod, dict_t * dict, dict2pid_t * d2p) { int i; bin_mdef_t *mdef; allphone_search_t *allphs; allphs = (allphone_search_t *) ckd_calloc(1, sizeof(*allphs)); ps_search_init(ps_search_base(allphs), &allphone_funcs, PS_SEARCH_TYPE_ALLPHONE, name, config, acmod, dict, d2p); mdef = acmod->mdef; allphs->hmmctx = hmm_context_init(bin_mdef_n_emit_state(mdef), acmod->tmat->tp, NULL, mdef->sseq); if (allphs->hmmctx == NULL) { ps_search_free(ps_search_base(allphs)); return NULL; } allphs->ci_only = cmd_ln_boolean_r(config, "-allphone_ci"); allphs->lw = cmd_ln_float32_r(config, "-lw"); phmm_build(allphs); if (lm) { int32 silwid; allphs->lm = ngram_model_retain(lm); silwid = ngram_wid(allphs->lm, bin_mdef_ciphone_str(mdef, mdef_silphone (mdef))); if (silwid == ngram_unknown_wid(allphs->lm)) { E_ERROR("Phonetic LM does not have SIL phone in vocabulary\n"); allphone_search_free((ps_search_t *) allphs); return NULL; } allphs->ci2lmwid = (int32 *) ckd_calloc(mdef->n_ciphone, sizeof(*allphs->ci2lmwid)); for (i = 0; i < mdef->n_ciphone; i++) { allphs->ci2lmwid[i] = ngram_wid(allphs->lm, (char *) bin_mdef_ciphone_str(mdef, i)); /* Map filler phones and other missing phones to silence if not found */ if (allphs->ci2lmwid[i] == ngram_unknown_wid(allphs->lm)) allphs->ci2lmwid[i] = silwid; } } else { E_WARN ("Failed to load language model specified in -allphone, doing unconstrained phone-loop decoding\n"); allphs->inspen = (int32) (logmath_log (acmod->lmath, cmd_ln_float32_r(config, "-pip")) * allphs->lw) >> SENSCR_SHIFT; } allphs->n_tot_frame = 0; allphs->frame = -1; allphs->segments = NULL; /* Get search pruning parameters */ allphs->beam = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-beam")) >> SENSCR_SHIFT; allphs->pbeam = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pbeam")) >> SENSCR_SHIFT; /* LM related weights/penalties */ allphs->history = blkarray_list_init(); /* Acoustic score scale for posterior probabilities. */ allphs->ascale = 1.0 / cmd_ln_float32_r(config, "-ascale"); E_INFO("Allphone(beam: %d, pbeam: %d)\n", allphs->beam, allphs->pbeam); ptmr_init(&allphs->perf); return (ps_search_t *) allphs; } int allphone_search_reinit(ps_search_t * search, dict_t * dict, dict2pid_t * d2p) { allphone_search_t *allphs = (allphone_search_t *) search; /* Free old dict2pid, dict */ ps_search_base_reinit(search, dict, d2p); if (!allphs->lm) { E_WARN ("-lm argument missing; doing unconstrained phone-loop decoding\n"); allphs->inspen = (int32) (logmath_log (search->acmod->lmath, cmd_ln_float32_r(search->config, "-pip")) * allphs->lw) >> SENSCR_SHIFT; } return 0; } void allphone_search_free(ps_search_t * search) { allphone_search_t *allphs = (allphone_search_t *) search; double n_speech = (double)allphs->n_tot_frame / cmd_ln_int32_r(ps_search_config(allphs), "-frate"); E_INFO("TOTAL allphone %.2f CPU %.3f xRT\n", allphs->perf.t_tot_cpu, allphs->perf.t_tot_cpu / n_speech); E_INFO("TOTAL allphone %.2f wall %.3f xRT\n", allphs->perf.t_tot_elapsed, allphs->perf.t_tot_elapsed / n_speech); ps_search_base_free(search); hmm_context_free(allphs->hmmctx); phmm_free(allphs); if (allphs->lm) ngram_model_free(allphs->lm); if (allphs->ci2lmwid) ckd_free(allphs->ci2lmwid); if (allphs->history) blkarray_list_free(allphs->history); ckd_free(allphs); } int allphone_search_start(ps_search_t * search) { allphone_search_t *allphs; bin_mdef_t *mdef; s3cipid_t ci; phmm_t *p; allphs = (allphone_search_t *) search; mdef = search->acmod->mdef; /* Reset all HMMs. */ for (ci = 0; ci < bin_mdef_n_ciphone(mdef); ci++) { for (p = allphs->ci_phmm[(unsigned) ci]; p; p = p->next) { hmm_clear(&(p->hmm)); } } allphs->n_hmm_eval = 0; allphs->n_sen_eval = 0; /* Free history nodes, if any */ blkarray_list_reset(allphs->history); /* Initialize start state of the SILENCE PHMM */ allphs->frame = 0; ci = bin_mdef_silphone(mdef); if (NOT_S3CIPID(ci)) E_FATAL("Cannot find CI-phone %s\n", S3_SILENCE_CIPHONE); for (p = allphs->ci_phmm[ci]; p && (p->pid != ci); p = p->next); if (!p) E_FATAL("Cannot find HMM for %s\n", S3_SILENCE_CIPHONE); hmm_enter(&(p->hmm), 0, 0, allphs->frame); ptmr_reset(&allphs->perf); ptmr_start(&allphs->perf); return 0; } static void allphone_search_sen_active(allphone_search_t * allphs) { acmod_t *acmod; bin_mdef_t *mdef; phmm_t *p; int32 ci; acmod = ps_search_acmod(allphs); mdef = acmod->mdef; acmod_clear_active(acmod); for (ci = 0; ci < bin_mdef_n_ciphone(mdef); ci++) for (p = allphs->ci_phmm[ci]; p; p = p->next) if (hmm_frame(&(p->hmm)) == allphs->frame) acmod_activate_hmm(acmod, &(p->hmm)); } int allphone_search_step(ps_search_t * search, int frame_idx) { int32 bestscr, frame_history_start; const int16 *senscr; allphone_search_t *allphs = (allphone_search_t *) search; acmod_t *acmod = search->acmod; if (!acmod->compallsen) allphone_search_sen_active(allphs); senscr = acmod_score(acmod, &frame_idx); allphs->n_sen_eval += acmod->n_senone_active; bestscr = phmm_eval_all(allphs, senscr); frame_history_start = blkarray_list_n_valid(allphs->history); phmm_exit(allphs, bestscr); phmm_trans(allphs, bestscr, frame_history_start); allphs->frame++; return 0; } static int32 ascore(allphone_search_t * allphs, history_t * h) { int32 score = h->score; if (h->hist > 0) { history_t *pred = blkarray_list_get(allphs->history, h->hist); score -= pred->score; } return score - h->tscore; } static void allphone_clear_segments(allphone_search_t * allphs) { gnode_t *gn; for (gn = allphs->segments; gn; gn = gn->next) { ckd_free(gnode_ptr(gn)); } glist_free(allphs->segments); allphs->segments = NULL; } static void allphone_backtrace(allphone_search_t * allphs, int32 f, int32 *out_score) { int32 best, hist_idx, best_idx; int32 frm, last_frm; history_t *h; phseg_t *s; /* Clear old list */ allphone_clear_segments(allphs); frm = last_frm = f; /* Find the first history entry for the requested frame */ hist_idx = blkarray_list_n_valid(allphs->history) - 1; while (hist_idx > 0) { h = blkarray_list_get(allphs->history, hist_idx); if (h->ef <= f) { frm = last_frm = h->ef; break; } hist_idx--; } if (hist_idx < 0) return; /* Find bestscore */ best = (int32) 0x80000000; best_idx = -1; while (frm == last_frm && hist_idx > 0) { h = blkarray_list_get(allphs->history, hist_idx); frm = h->ef; if (h->score > best && frm == last_frm) { best = h->score; best_idx = hist_idx; } hist_idx--; } if (best_idx < 0) return; if (out_score) *out_score = best; /* Backtrace */ while (best_idx > 0) { h = blkarray_list_get(allphs->history, best_idx); s = (phseg_t *) ckd_calloc(1, sizeof(phseg_t)); s->ci = h->phmm->ci; s->sf = (h->hist > 0) ? ((history_t *) blkarray_list_get(allphs->history, h->hist))->ef + 1 : 0; s->ef = h->ef; s->score = ascore(allphs, h); s->tscore = h->tscore; allphs->segments = glist_add_ptr(allphs->segments, s); best_idx = h->hist; } return; } int allphone_search_finish(ps_search_t * search) { allphone_search_t *allphs; int32 cf, n_hist; allphs = (allphone_search_t *) search; allphs->n_tot_frame += allphs->frame; n_hist = blkarray_list_n_valid(allphs->history); E_INFO ("%d frames, %d HMMs (%d/fr), %d senones (%d/fr), %d history entries (%d/fr)\n", allphs->frame, allphs->n_hmm_eval, (allphs->frame > 0) ? allphs->n_hmm_eval / allphs->frame : 0, allphs->n_sen_eval, (allphs->frame > 0) ? allphs->n_sen_eval / allphs->frame : 0, n_hist, (allphs->frame > 0) ? n_hist / allphs->frame : 0); /* Now backtrace. */ allphone_backtrace(allphs, allphs->frame - 1, NULL); /* Print out some statistics. */ ptmr_stop(&allphs->perf); /* This is the number of frames processed. */ cf = ps_search_acmod(allphs)->output_frame; if (cf > 0) { double n_speech = (double) (cf + 1) / cmd_ln_int32_r(ps_search_config(allphs), "-frate"); E_INFO("allphone %.2f CPU %.3f xRT\n", allphs->perf.t_cpu, allphs->perf.t_cpu / n_speech); E_INFO("allphone %.2f wall %.3f xRT\n", allphs->perf.t_elapsed, allphs->perf.t_elapsed / n_speech); } return 0; } char const * allphone_search_hyp(ps_search_t * search, int32 * out_score) { allphone_search_t *allphs; phseg_t *p; gnode_t *gn; const char *phone_str; bin_mdef_t *mdef; int len, hyp_idx, phone_idx; allphs = (allphone_search_t *) search; mdef = search->acmod->mdef; /* Create hypothesis */ if (search->hyp_str) ckd_free(search->hyp_str); search->hyp_str = NULL; allphone_backtrace(allphs, allphs->frame - 1, out_score); if (allphs->segments == NULL) { return NULL; } len = glist_count(allphs->segments) * 10; /* maximum length of one phone with spacebar */ search->hyp_str = (char *) ckd_calloc(len, sizeof(*search->hyp_str)); hyp_idx = 0; for (gn = allphs->segments; gn; gn = gn->next) { p = gnode_ptr(gn); phone_str = bin_mdef_ciphone_str(mdef, p->ci); phone_idx = 0; while (phone_str[phone_idx] != '\0') search->hyp_str[hyp_idx++] = phone_str[phone_idx++]; search->hyp_str[hyp_idx++] = ' '; } search->hyp_str[--hyp_idx] = '\0'; E_INFO("Hyp: %s\n", search->hyp_str); return search->hyp_str; } pocketsphinx-5prealpha/src/libpocketsphinx/Makefile.in0000664000175000017500000006063612771607732020470 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ subdir = src/libpocketsphinx DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libpocketsphinx_la_LIBADD = am_libpocketsphinx_la_OBJECTS = acmod.lo bin_mdef.lo blkarray_list.lo \ dict.lo dict2pid.lo fsg_history.lo fsg_lextree.lo \ fsg_search.lo allphone_search.lo kws_search.lo \ kws_detections.lo hmm.lo mdef.lo ms_gauden.lo ms_mgau.lo \ ms_senone.lo ngram_search.lo ngram_search_fwdtree.lo \ ngram_search_fwdflat.lo phone_loop_search.lo ps_alignment.lo \ ps_lattice.lo ps_mllr.lo ptm_mgau.lo s2_semi_mgau.lo \ state_align_search.lo tmat.lo vector.lo pocketsphinx.lo libpocketsphinx_la_OBJECTS = $(am_libpocketsphinx_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libpocketsphinx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libpocketsphinx_la_LDFLAGS) \ $(LDFLAGS) -o $@ 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@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(libpocketsphinx_la_SOURCES) DIST_SOURCES = $(libpocketsphinx_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ARCH = `uname -m | sed s/i.86/i386/`_`uname -s | tr A-Z a-z` lib_LTLIBRARIES = libpocketsphinx.la libpocketsphinx_la_LDFLAGS = -version-info 3:0:0 -lm libpocketsphinx_la_SOURCES = \ acmod.c \ bin_mdef.c \ blkarray_list.c \ dict.c \ dict2pid.c \ fsg_history.c \ fsg_lextree.c \ fsg_search.c \ allphone_search.c \ kws_search.c \ kws_detections.c \ hmm.c \ mdef.c \ ms_gauden.c \ ms_mgau.c \ ms_senone.c \ ngram_search.c \ ngram_search_fwdtree.c \ ngram_search_fwdflat.c \ phone_loop_search.c \ ps_alignment.c \ ps_lattice.c \ ps_mllr.c \ ptm_mgau.c \ s2_semi_mgau.c \ state_align_search.c \ tmat.c \ vector.c \ pocketsphinx.c noinst_HEADERS = \ pocketsphinx_internal.h \ acmod.h \ ngram_search.h \ bin_mdef.h \ blkarray_list.h \ dict.h \ dict2pid.h \ fsg_history.h \ fsg_lextree.h \ fsg_search_internal.h \ allphone_search.h \ kws_search.h \ kws_detections.h \ hmm.h \ mdef.h \ ms_gauden.h \ ms_mgau.h \ ms_senone.h \ ngram_search.h \ ngram_search_fwdtree.h \ ngram_search_fwdflat.h \ phone_loop_search.h \ ps_alignment.h \ ps_lattice_internal.h \ ptm_mgau.h \ s2_semi_mgau.h \ s3types.h \ state_align_search.h \ tied_mgau_common.h \ tmat.h \ vector.h AM_CFLAGS = \ -I$(top_srcdir)/include \ -I$(top_builddir)/include \ -DMODELDIR=\"${prefix}/share/pocketsphinx/model\" all: all-am .SUFFIXES: .SUFFIXES: .c .lo .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/libpocketsphinx/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/libpocketsphinx/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libpocketsphinx.la: $(libpocketsphinx_la_OBJECTS) $(libpocketsphinx_la_DEPENDENCIES) $(EXTRA_libpocketsphinx_la_DEPENDENCIES) $(AM_V_CCLD)$(libpocketsphinx_la_LINK) -rpath $(libdir) $(libpocketsphinx_la_OBJECTS) $(libpocketsphinx_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acmod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allphone_search.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bin_mdef.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blkarray_list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dict.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dict2pid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsg_history.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsg_lextree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsg_search.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hmm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kws_detections.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kws_search.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdef.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ms_gauden.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ms_mgau.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ms_senone.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ngram_search.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ngram_search_fwdflat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ngram_search_fwdtree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/phone_loop_search.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pocketsphinx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps_alignment.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps_lattice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps_mllr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptm_mgau.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s2_semi_mgau.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state_align_search.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tmat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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: $(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: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ 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-libLTLIBRARIES 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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am 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-libLTLIBRARIES 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES # 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: pocketsphinx-5prealpha/src/libpocketsphinx/ms_senone.h0000664000175000017500000001316112771605033020541 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * senone.h -- Mixture density weights associated with each tied state. */ #ifndef _MS_SENONE_H_ #define _MS_SENONE_H_ /* SphinxBase headers. */ #include #include #include #include /* Local headers. */ #include "ms_gauden.h" #include "bin_mdef.h" /** \file ms_senone.h * \brief (Sphinx 3.0 specific) multiple streams senones. used with ms_gauden.h * In Sphinx 3.0 family of tools, ms_senone is used to combine the Gaussian scores. * Its existence is crucial in Sphinx 3.0 because 3.0 supports both SCHMM and CDHMM. * There are optimization scheme for SCHMM (e.g. compute the top-N Gaussian) that is * applicable to SCHMM than CDHMM. This is wrapped in senone_eval_all. */ #ifdef __cplusplus extern "C" { #endif typedef uint8 senprob_t; /**< Senone logs3-probs, truncated to 8 bits */ /** * \struct senone_t * \brief 8-bit senone PDF structure. * * 8-bit senone PDF structure. Senone pdf values are normalized, floored, converted to * logs3 domain, and finally truncated to 8 bits precision to conserve memory space. */ typedef struct { senprob_t ***pdf; /**< gaussian density mixture weights, organized two possible ways depending on n_gauden: if (n_gauden > 1): pdf[sen][feat][codeword]. Not an efficient representation--memory access-wise--but evaluating the many codebooks will be more costly. if (n_gauden == 1): pdf[feat][codeword][sen]. Optimized for the shared-distribution semi-continuous case. */ logmath_t *lmath; /**< log math computation */ uint32 n_sen; /**< Number senones in this set */ uint32 n_feat; /**< Number feature streams */ uint32 n_cw; /**< Number codewords per codebook,stream */ uint32 n_gauden; /**< Number gaussian density codebooks referred to by senones */ float32 mixwfloor; /**< floor applied to each PDF entry */ uint32 *mgau; /**< senone-id -> mgau-id mapping for senones in this set */ int32 *featscr; /**< The feature score for every senone, will be initialized inside senone_eval_all */ int32 aw; /**< Inverse acoustic weight */ } senone_t; /** * Load a set of senones (mixing weights and mixture gaussian codebook mappings) from * the given files. Normalize weights for each codebook, apply the given floor, convert * PDF values to logs3 domain and quantize to 8-bits. * @return pointer to senone structure created. Caller MUST NOT change its contents. */ senone_t *senone_init (gauden_t *g, /**< In: codebooks */ char const *mixwfile, /**< In: mixing weights file */ char const *mgau_mapfile,/**< In: file specifying mapping from each senone to mixture gaussian codebook. If NULL all senones map to codebook 0 */ float32 mixwfloor, /**< In: Floor value for senone weights */ logmath_t *lmath, /**< In: log math computation */ bin_mdef_t *mdef /**< In: model definition */ ); /** Release memory allocated by senone_init. */ void senone_free(senone_t *s); /**< In: The senone_t to free */ /** * Evaluate the score for the given senone wrt to the given top N gaussian codewords. * @return senone score (in logs3 domain). */ int32 senone_eval (senone_t *s, int id, /**< In: senone for which score desired */ gauden_dist_t **dist, /**< In: top N codewords and densities for all features, to be combined into senone score. IE, dist[f][i] = i-th best for feaure f */ int n_top /**< In: Length of dist[f], for each f */ ); #ifdef __cplusplus } #endif #endif pocketsphinx-5prealpha/src/libpocketsphinx/allphone_search.h0000664000175000017500000001413712771605033021706 00000000000000/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2014 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * allphone_search.h -- Search structures for phoneme decoding. */ #ifndef __ALLPHONE_SEARCH_H__ #define __ALLPHONE_SEARCH_H__ /* SphinxBase headers. */ #include #include #include #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "blkarray_list.h" #include "hmm.h" /** * Models a single unique pair. * Can represent several different triphones, but all with the same parent basephone. * (NOTE: Word-position attribute of triphone is ignored.) */ typedef struct phmm_s { hmm_t hmm; /**< Base HMM structure */ s3pid_t pid; /**< Phone id (temp. during init.) */ s3cipid_t ci; /**< Parent basephone for this PHMM */ bitvec_t *lc; /**< Set (bit-vector) of left context phones seen for this PHMM */ bitvec_t *rc; /**< Set (bit-vector) of right context phones seen for this PHMM */ struct phmm_s *next; /**< Next unique PHMM for same parent basephone */ struct plink_s *succlist; /**< List of predecessor PHMM nodes */ } phmm_t; /** * List of links from a PHMM node to its successors; one link per successor. */ typedef struct plink_s { phmm_t *phmm; /**< Successor PHMM node */ struct plink_s *next; /**< Next link for parent PHMM node */ } plink_t; /** * History (paths) information at any point in allphone Viterbi search. */ typedef struct history_s { phmm_t *phmm; /**< PHMM ending this path */ int32 score; /**< Path score for this path */ int32 tscore; /**< Transition score for this path */ frame_idx_t ef; /**< End frame */ int32 hist; /**< Previous history entry */ } history_t; /** * Phone level segmentation information */ typedef struct phseg_s { s3cipid_t ci; /* CI-phone id */ frame_idx_t sf, ef; /* Start and end frame for this phone occurrence */ int32 score; /* Acoustic score for this segment of alignment */ int32 tscore; /* Transition ("LM") score for this segment */ } phseg_t; /** * Segment iterator over list of phseg */ typedef struct phseg_iter_s { ps_seg_t base; glist_t seg; } phseg_iter_t; /** * Implementation of allphone search structure. */ typedef struct allphone_search_s { ps_search_t base; hmm_context_t *hmmctx; /**< HMM context. */ ngram_model_t *lm; /**< Ngram model set */ int32 ci_only; /**< Use context-independent phones for decoding */ phmm_t **ci_phmm; /**< PHMM lists (for each CI phone) */ int32 *ci2lmwid; /**< Mapping of CI phones to LM word IDs */ int32 beam, pbeam; /**< Effective beams after applying beam_factor */ int32 lw, inspen; /**< Language weights */ frame_idx_t frame; /**< Current frame. */ float32 ascale; /**< Acoustic score scale for posterior probabilities. */ int32 n_tot_frame; /**< Total number of frames processed */ int32 n_hmm_eval; /**< Total HMMs evaluated this utt */ int32 n_sen_eval; /**< Total senones evaluated this utt */ /* Backtrace information */ blkarray_list_t *history; /**< List of history nodes allocated in each frame */ /* Hypothesis DAG */ glist_t segments; ptmr_t perf; /**< Performance counter */ } allphone_search_t; /** * Create, initialize and return a search module. */ ps_search_t *allphone_search_init(const char *name, ngram_model_t * lm, cmd_ln_t * config, acmod_t * acmod, dict_t * dict, dict2pid_t * d2p); /** * Deallocate search structure. */ void allphone_search_free(ps_search_t * search); /** * Update allphone search module. */ int allphone_search_reinit(ps_search_t * search, dict_t * dict, dict2pid_t * d2p); /** * Prepare the allphone search structure for beginning decoding of the next * utterance. */ int allphone_search_start(ps_search_t * search); /** * Step one frame forward through the Viterbi search. */ int allphone_search_step(ps_search_t * search, int frame_idx); /** * Windup and clean the allphone search structure after utterance. */ int allphone_search_finish(ps_search_t * search); /** * Get hypothesis string from the allphone search. */ char const *allphone_search_hyp(ps_search_t * search, int32 * out_score); #endif /* __ALLPHONE_SEARCH_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/bin_mdef.c0000664000175000017500000007011112771605033020307 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2005 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /********************************************************************* * * File: bin_mdef.c * * Description: * Binary format model definition files, with support for * heterogeneous topologies and variable-size N-phones * * Author: * David Huggins-Daines *********************************************************************/ /* System headers. */ #include #include #include /* SphinxBase headers. */ #include #include #include #include #include /* Local headers. */ #include "mdef.h" #include "bin_mdef.h" bin_mdef_t * bin_mdef_read_text(cmd_ln_t *config, const char *filename) { bin_mdef_t *bmdef; mdef_t *mdef; int i, nodes, ci_idx, lc_idx, rc_idx; int nchars; if ((mdef = mdef_init((char *) filename, TRUE)) == NULL) return NULL; /* Enforce some limits. */ if (mdef->n_sen > BAD_SENID) { E_ERROR("Number of senones exceeds limit: %d > %d\n", mdef->n_sen, BAD_SENID); mdef_free(mdef); return NULL; } if (mdef->n_sseq > BAD_SSID) { E_ERROR("Number of senone sequences exceeds limit: %d > %d\n", mdef->n_sseq, BAD_SSID); mdef_free(mdef); return NULL; } /* We use uint8 for ciphones */ if (mdef->n_ciphone > 255) { E_ERROR("Number of phones exceeds limit: %d > %d\n", mdef->n_ciphone, 255); mdef_free(mdef); return NULL; } bmdef = ckd_calloc(1, sizeof(*bmdef)); bmdef->refcnt = 1; /* Easy stuff. The mdef.c code has done the heavy lifting for us. */ bmdef->n_ciphone = mdef->n_ciphone; bmdef->n_phone = mdef->n_phone; bmdef->n_emit_state = mdef->n_emit_state; bmdef->n_ci_sen = mdef->n_ci_sen; bmdef->n_sen = mdef->n_sen; bmdef->n_tmat = mdef->n_tmat; bmdef->n_sseq = mdef->n_sseq; bmdef->sseq = mdef->sseq; bmdef->cd2cisen = mdef->cd2cisen; bmdef->sen2cimap = mdef->sen2cimap; bmdef->n_ctx = 3; /* Triphones only. */ bmdef->sil = mdef->sil; mdef->sseq = NULL; /* We are taking over this one. */ mdef->cd2cisen = NULL; /* And this one. */ mdef->sen2cimap = NULL; /* And this one. */ /* Get the phone names. If they are not sorted * ASCII-betically then we are in a world of hurt and * therefore will simply refuse to continue. */ bmdef->ciname = ckd_calloc(bmdef->n_ciphone, sizeof(*bmdef->ciname)); nchars = 0; for (i = 0; i < bmdef->n_ciphone; ++i) nchars += strlen(mdef->ciphone[i].name) + 1; bmdef->ciname[0] = ckd_calloc(nchars, 1); strcpy(bmdef->ciname[0], mdef->ciphone[0].name); for (i = 1; i < bmdef->n_ciphone; ++i) { bmdef->ciname[i] = bmdef->ciname[i - 1] + strlen(bmdef->ciname[i - 1]) + 1; strcpy(bmdef->ciname[i], mdef->ciphone[i].name); if (i > 0 && strcmp(bmdef->ciname[i - 1], bmdef->ciname[i]) > 0) { /* FIXME: there should be a solution to this, actually. */ E_ERROR("Phone names are not in sorted order, sorry."); bin_mdef_free(bmdef); return NULL; } } /* Copy over phone information. */ bmdef->phone = ckd_calloc(bmdef->n_phone, sizeof(*bmdef->phone)); for (i = 0; i < mdef->n_phone; ++i) { bmdef->phone[i].ssid = mdef->phone[i].ssid; bmdef->phone[i].tmat = mdef->phone[i].tmat; if (i < bmdef->n_ciphone) { bmdef->phone[i].info.ci.filler = mdef->ciphone[i].filler; } else { bmdef->phone[i].info.cd.wpos = mdef->phone[i].wpos; bmdef->phone[i].info.cd.ctx[0] = mdef->phone[i].ci; bmdef->phone[i].info.cd.ctx[1] = mdef->phone[i].lc; bmdef->phone[i].info.cd.ctx[2] = mdef->phone[i].rc; } } /* Walk the wpos_ci_lclist once to find the total number of * nodes and the starting locations for each level. */ nodes = lc_idx = ci_idx = rc_idx = 0; for (i = 0; i < N_WORD_POSN; ++i) { int j; for (j = 0; j < mdef->n_ciphone; ++j) { ph_lc_t *lc; for (lc = mdef->wpos_ci_lclist[i][j]; lc; lc = lc->next) { ph_rc_t *rc; for (rc = lc->rclist; rc; rc = rc->next) { ++nodes; /* RC node */ } ++nodes; /* LC node */ ++rc_idx; /* Start of RC nodes (after LC nodes) */ } ++nodes; /* CI node */ ++lc_idx; /* Start of LC nodes (after CI nodes) */ ++rc_idx; /* Start of RC nodes (after CI and LC nodes) */ } ++nodes; /* wpos node */ ++ci_idx; /* Start of CI nodes (after wpos nodes) */ ++lc_idx; /* Start of LC nodes (after CI nodes) */ ++rc_idx; /* STart of RC nodes (after wpos, CI, and LC nodes) */ } E_INFO("Allocating %d * %d bytes (%d KiB) for CD tree\n", nodes, sizeof(*bmdef->cd_tree), nodes * sizeof(*bmdef->cd_tree) / 1024); bmdef->n_cd_tree = nodes; bmdef->cd_tree = ckd_calloc(nodes, sizeof(*bmdef->cd_tree)); for (i = 0; i < N_WORD_POSN; ++i) { int j; bmdef->cd_tree[i].ctx = i; bmdef->cd_tree[i].n_down = mdef->n_ciphone; bmdef->cd_tree[i].c.down = ci_idx; #if 0 E_INFO("%d => %c (%d@%d)\n", i, (WPOS_NAME)[i], bmdef->cd_tree[i].n_down, bmdef->cd_tree[i].c.down); #endif /* Now we can build the rest of the tree. */ for (j = 0; j < mdef->n_ciphone; ++j) { ph_lc_t *lc; bmdef->cd_tree[ci_idx].ctx = j; bmdef->cd_tree[ci_idx].c.down = lc_idx; for (lc = mdef->wpos_ci_lclist[i][j]; lc; lc = lc->next) { ph_rc_t *rc; bmdef->cd_tree[lc_idx].ctx = lc->lc; bmdef->cd_tree[lc_idx].c.down = rc_idx; for (rc = lc->rclist; rc; rc = rc->next) { bmdef->cd_tree[rc_idx].ctx = rc->rc; bmdef->cd_tree[rc_idx].n_down = 0; bmdef->cd_tree[rc_idx].c.pid = rc->pid; #if 0 E_INFO("%d => %s %s %s %c (%d@%d)\n", rc_idx, bmdef->ciname[j], bmdef->ciname[lc->lc], bmdef->ciname[rc->rc], (WPOS_NAME)[i], bmdef->cd_tree[rc_idx].n_down, bmdef->cd_tree[rc_idx].c.down); #endif ++bmdef->cd_tree[lc_idx].n_down; ++rc_idx; } /* If there are no triphones here, * this is considered a leafnode, so * set the pid to -1. */ if (bmdef->cd_tree[lc_idx].n_down == 0) bmdef->cd_tree[lc_idx].c.pid = -1; #if 0 E_INFO("%d => %s %s %c (%d@%d)\n", lc_idx, bmdef->ciname[j], bmdef->ciname[lc->lc], (WPOS_NAME)[i], bmdef->cd_tree[lc_idx].n_down, bmdef->cd_tree[lc_idx].c.down); #endif ++bmdef->cd_tree[ci_idx].n_down; ++lc_idx; } /* As above, so below. */ if (bmdef->cd_tree[ci_idx].n_down == 0) bmdef->cd_tree[ci_idx].c.pid = -1; #if 0 E_INFO("%d => %d=%s (%d@%d)\n", ci_idx, j, bmdef->ciname[j], bmdef->cd_tree[ci_idx].n_down, bmdef->cd_tree[ci_idx].c.down); #endif ++ci_idx; } } mdef_free(mdef); bmdef->alloc_mode = BIN_MDEF_FROM_TEXT; return bmdef; } bin_mdef_t * bin_mdef_retain(bin_mdef_t *m) { ++m->refcnt; return m; } int bin_mdef_free(bin_mdef_t * m) { if (m == NULL) return 0; if (--m->refcnt > 0) return m->refcnt; switch (m->alloc_mode) { case BIN_MDEF_FROM_TEXT: ckd_free(m->ciname[0]); ckd_free(m->sseq[0]); ckd_free(m->phone); ckd_free(m->cd_tree); break; case BIN_MDEF_IN_MEMORY: ckd_free(m->ciname[0]); break; case BIN_MDEF_ON_DISK: break; } if (m->filemap) mmio_file_unmap(m->filemap); ckd_free(m->cd2cisen); ckd_free(m->sen2cimap); ckd_free(m->ciname); ckd_free(m->sseq); ckd_free(m); return 0; } static const char format_desc[] = "BEGIN FILE FORMAT DESCRIPTION\n" "int32 n_ciphone; /**< Number of base (CI) phones */\n" "int32 n_phone; /**< Number of base (CI) phones + (CD) triphones */\n" "int32 n_emit_state; /**< Number of emitting states per phone (0 if heterogeneous) */\n" "int32 n_ci_sen; /**< Number of CI senones; these are the first */\n" "int32 n_sen; /**< Number of senones (CI+CD) */\n" "int32 n_tmat; /**< Number of transition matrices */\n" "int32 n_sseq; /**< Number of unique senone sequences */\n" "int32 n_ctx; /**< Number of phones of context */\n" "int32 n_cd_tree; /**< Number of nodes in CD tree structure */\n" "int32 sil; /**< CI phone ID for silence */\n" "char ciphones[][]; /**< CI phone strings (null-terminated) */\n" "char padding[]; /**< Padding to a 4-bytes boundary */\n" "struct { int16 ctx; int16 n_down; int32 pid/down } cd_tree[];\n" "struct { int32 ssid; int32 tmat; int8 attr[4] } phones[];\n" "int16 sseq[]; /**< Unique senone sequences */\n" "int8 sseq_len[]; /**< Number of states in each sseq (none if homogeneous) */\n" "END FILE FORMAT DESCRIPTION\n"; bin_mdef_t * bin_mdef_read(cmd_ln_t *config, const char *filename) { bin_mdef_t *m; FILE *fh; size_t tree_start; int32 val, i, do_mmap, swap; long pos, end; int32 *sseq_size; /* Try to read it as text first. */ if ((m = bin_mdef_read_text(config, filename)) != NULL) return m; E_INFO("Reading binary model definition: %s\n", filename); if ((fh = fopen(filename, "rb")) == NULL) return NULL; if (fread(&val, 4, 1, fh) != 1) { fclose(fh); E_ERROR_SYSTEM("Failed to read byte-order marker from %s\n", filename); return NULL; } swap = 0; if (val == BIN_MDEF_OTHER_ENDIAN) { swap = 1; E_INFO("Must byte-swap %s\n", filename); } if (fread(&val, 4, 1, fh) != 1) { fclose(fh); E_ERROR_SYSTEM("Failed to read version from %s\n", filename); return NULL; } if (swap) SWAP_INT32(&val); if (val > BIN_MDEF_FORMAT_VERSION) { E_ERROR("File format version %d for %s is newer than library\n", val, filename); fclose(fh); return NULL; } if (fread(&val, 4, 1, fh) != 1) { fclose(fh); E_ERROR_SYSTEM("Failed to read header length from %s\n", filename); return NULL; } if (swap) SWAP_INT32(&val); /* Skip format descriptor. */ fseek(fh, val, SEEK_CUR); /* Finally allocate it. */ m = ckd_calloc(1, sizeof(*m)); m->refcnt = 1; /* Check these, to make gcc/glibc shut up. */ #define FREAD_SWAP32_CHK(dest) \ if (fread((dest), 4, 1, fh) != 1) { \ fclose(fh); \ ckd_free(m); \ E_ERROR_SYSTEM("Failed to read %s from %s\n", #dest, filename); \ return NULL; \ } \ if (swap) SWAP_INT32(dest); FREAD_SWAP32_CHK(&m->n_ciphone); FREAD_SWAP32_CHK(&m->n_phone); FREAD_SWAP32_CHK(&m->n_emit_state); FREAD_SWAP32_CHK(&m->n_ci_sen); FREAD_SWAP32_CHK(&m->n_sen); FREAD_SWAP32_CHK(&m->n_tmat); FREAD_SWAP32_CHK(&m->n_sseq); FREAD_SWAP32_CHK(&m->n_ctx); FREAD_SWAP32_CHK(&m->n_cd_tree); FREAD_SWAP32_CHK(&m->sil); /* CI names are first in the file. */ m->ciname = ckd_calloc(m->n_ciphone, sizeof(*m->ciname)); /* Decide whether to read in the whole file or mmap it. */ do_mmap = config ? cmd_ln_boolean_r(config, "-mmap") : TRUE; if (swap) { E_WARN("-mmap specified, but mdef is other-endian. Will not memory-map.\n"); do_mmap = FALSE; } /* Actually try to mmap it. */ if (do_mmap) { m->filemap = mmio_file_read(filename); if (m->filemap == NULL) do_mmap = FALSE; } pos = ftell(fh); if (do_mmap) { /* Get the base pointer from the memory map. */ m->ciname[0] = (char *)mmio_file_ptr(m->filemap) + pos; /* Success! */ m->alloc_mode = BIN_MDEF_ON_DISK; } else { /* Read everything into memory. */ m->alloc_mode = BIN_MDEF_IN_MEMORY; fseek(fh, 0, SEEK_END); end = ftell(fh); fseek(fh, pos, SEEK_SET); m->ciname[0] = ckd_malloc(end - pos); if (fread(m->ciname[0], 1, end - pos, fh) != end - pos) E_FATAL("Failed to read %d bytes of data from %s\n", end - pos, filename); } for (i = 1; i < m->n_ciphone; ++i) m->ciname[i] = m->ciname[i - 1] + strlen(m->ciname[i - 1]) + 1; /* Skip past the padding. */ tree_start = m->ciname[i - 1] + strlen(m->ciname[i - 1]) + 1 - m->ciname[0]; tree_start = (tree_start + 3) & ~3; m->cd_tree = (cd_tree_t *) (m->ciname[0] + tree_start); if (swap) { for (i = 0; i < m->n_cd_tree; ++i) { SWAP_INT16(&m->cd_tree[i].ctx); SWAP_INT16(&m->cd_tree[i].n_down); SWAP_INT32(&m->cd_tree[i].c.down); } } m->phone = (mdef_entry_t *) (m->cd_tree + m->n_cd_tree); if (swap) { for (i = 0; i < m->n_phone; ++i) { SWAP_INT32(&m->phone[i].ssid); SWAP_INT32(&m->phone[i].tmat); } } sseq_size = (int32 *) (m->phone + m->n_phone); if (swap) SWAP_INT32(sseq_size); m->sseq = ckd_calloc(m->n_sseq, sizeof(*m->sseq)); m->sseq[0] = (uint16 *) (sseq_size + 1); if (swap) { for (i = 0; i < *sseq_size; ++i) SWAP_INT16(m->sseq[0] + i); } if (m->n_emit_state) { for (i = 1; i < m->n_sseq; ++i) m->sseq[i] = m->sseq[0] + i * m->n_emit_state; } else { m->sseq_len = (uint8 *) (m->sseq[0] + *sseq_size); for (i = 1; i < m->n_sseq; ++i) m->sseq[i] = m->sseq[i - 1] + m->sseq_len[i - 1]; } /* Now build the CD-to-CI mappings using the senone sequences. * This is the only really accurate way to do it, though it is * still inaccurate in the case of heterogeneous topologies or * cross-state tying. */ m->cd2cisen = (int16 *) ckd_malloc(m->n_sen * sizeof(*m->cd2cisen)); m->sen2cimap = (int16 *) ckd_malloc(m->n_sen * sizeof(*m->sen2cimap)); /* Default mappings (identity, none) */ for (i = 0; i < m->n_ci_sen; ++i) m->cd2cisen[i] = i; for (; i < m->n_sen; ++i) m->cd2cisen[i] = -1; for (i = 0; i < m->n_sen; ++i) m->sen2cimap[i] = -1; for (i = 0; i < m->n_phone; ++i) { int32 j, ssid = m->phone[i].ssid; for (j = 0; j < bin_mdef_n_emit_state_phone(m, i); ++j) { int s = bin_mdef_sseq2sen(m, ssid, j); int ci = bin_mdef_pid2ci(m, i); /* Take the first one and warn if we have cross-state tying. */ if (m->sen2cimap[s] == -1) m->sen2cimap[s] = ci; if (m->sen2cimap[s] != ci) E_WARN ("Senone %d is shared between multiple base phones\n", s); if (j > bin_mdef_n_emit_state_phone(m, ci)) E_WARN("CD phone %d has fewer states than CI phone %d\n", i, ci); else m->cd2cisen[s] = bin_mdef_sseq2sen(m, m->phone[ci].ssid, j); } } /* Set the silence phone. */ m->sil = bin_mdef_ciphone_id(m, S3_SILENCE_CIPHONE); E_INFO ("%d CI-phone, %d CD-phone, %d emitstate/phone, %d CI-sen, %d Sen, %d Sen-Seq\n", m->n_ciphone, m->n_phone - m->n_ciphone, m->n_emit_state, m->n_ci_sen, m->n_sen, m->n_sseq); fclose(fh); return m; } int bin_mdef_write(bin_mdef_t * m, const char *filename) { FILE *fh; int32 val, i; if ((fh = fopen(filename, "wb")) == NULL) return -1; /* Byteorder marker. */ val = BIN_MDEF_NATIVE_ENDIAN; fwrite(&val, 1, 4, fh); /* Version. */ val = BIN_MDEF_FORMAT_VERSION; fwrite(&val, 1, sizeof(val), fh); /* Round the format descriptor size up to a 4-byte boundary. */ val = ((sizeof(format_desc) + 3) & ~3); fwrite(&val, 1, sizeof(val), fh); fwrite(format_desc, 1, sizeof(format_desc), fh); /* Pad it with zeros. */ i = 0; fwrite(&i, 1, val - sizeof(format_desc), fh); /* Binary header things. */ fwrite(&m->n_ciphone, 4, 1, fh); fwrite(&m->n_phone, 4, 1, fh); fwrite(&m->n_emit_state, 4, 1, fh); fwrite(&m->n_ci_sen, 4, 1, fh); fwrite(&m->n_sen, 4, 1, fh); fwrite(&m->n_tmat, 4, 1, fh); fwrite(&m->n_sseq, 4, 1, fh); fwrite(&m->n_ctx, 4, 1, fh); fwrite(&m->n_cd_tree, 4, 1, fh); /* Write this as a 32-bit value to preserve alignment for the * non-mmap case (we want things aligned both from the * beginning of the file and the beginning of the phone * strings). */ val = m->sil; fwrite(&val, 4, 1, fh); /* Phone strings. */ for (i = 0; i < m->n_ciphone; ++i) fwrite(m->ciname[i], 1, strlen(m->ciname[i]) + 1, fh); /* Pad with zeros. */ val = (ftell(fh) + 3) & ~3; i = 0; fwrite(&i, 1, val - ftell(fh), fh); /* Write CD-tree */ fwrite(m->cd_tree, sizeof(*m->cd_tree), m->n_cd_tree, fh); /* Write phones */ fwrite(m->phone, sizeof(*m->phone), m->n_phone, fh); if (m->n_emit_state) { /* Write size of sseq */ val = m->n_sseq * m->n_emit_state; fwrite(&val, 4, 1, fh); /* Write sseq */ fwrite(m->sseq[0], sizeof(**m->sseq), m->n_sseq * m->n_emit_state, fh); } else { int32 n; /* Calcluate size of sseq */ n = 0; for (i = 0; i < m->n_sseq; ++i) n += m->sseq_len[i]; /* Write size of sseq */ fwrite(&n, 4, 1, fh); /* Write sseq */ fwrite(m->sseq[0], sizeof(**m->sseq), n, fh); /* Write sseq_len */ fwrite(m->sseq_len, 1, m->n_sseq, fh); } fclose(fh); return 0; } int bin_mdef_write_text(bin_mdef_t * m, const char *filename) { FILE *fh; int p, i, n_total_state; if (strcmp(filename, "-") == 0) fh = stdout; else { if ((fh = fopen(filename, "w")) == NULL) return -1; } fprintf(fh, "0.3\n"); fprintf(fh, "%d n_base\n", m->n_ciphone); fprintf(fh, "%d n_tri\n", m->n_phone - m->n_ciphone); if (m->n_emit_state) n_total_state = m->n_phone * (m->n_emit_state + 1); else { n_total_state = 0; for (i = 0; i < m->n_phone; ++i) n_total_state += m->sseq_len[m->phone[i].ssid] + 1; } fprintf(fh, "%d n_state_map\n", n_total_state); fprintf(fh, "%d n_tied_state\n", m->n_sen); fprintf(fh, "%d n_tied_ci_state\n", m->n_ci_sen); fprintf(fh, "%d n_tied_tmat\n", m->n_tmat); fprintf(fh, "#\n# Columns definitions\n"); fprintf(fh, "#%4s %3s %3s %1s %6s %4s %s\n", "base", "lft", "rt", "p", "attrib", "tmat", " ... state id's ..."); for (p = 0; p < m->n_ciphone; p++) { int n_state; fprintf(fh, "%5s %3s %3s %1s", m->ciname[p], "-", "-", "-"); if (bin_mdef_is_fillerphone(m, p)) fprintf(fh, " %6s", "filler"); else fprintf(fh, " %6s", "n/a"); fprintf(fh, " %4d", m->phone[p].tmat); if (m->n_emit_state) n_state = m->n_emit_state; else n_state = m->sseq_len[m->phone[p].ssid]; for (i = 0; i < n_state; i++) { fprintf(fh, " %6u", m->sseq[m->phone[p].ssid][i]); } fprintf(fh, " N\n"); } for (; p < m->n_phone; p++) { int n_state; fprintf(fh, "%5s %3s %3s %c", m->ciname[m->phone[p].info.cd.ctx[0]], m->ciname[m->phone[p].info.cd.ctx[1]], m->ciname[m->phone[p].info.cd.ctx[2]], (WPOS_NAME)[m->phone[p].info.cd.wpos]); if (bin_mdef_is_fillerphone(m, p)) fprintf(fh, " %6s", "filler"); else fprintf(fh, " %6s", "n/a"); fprintf(fh, " %4d", m->phone[p].tmat); if (m->n_emit_state) n_state = m->n_emit_state; else n_state = m->sseq_len[m->phone[p].ssid]; for (i = 0; i < n_state; i++) { fprintf(fh, " %6u", m->sseq[m->phone[p].ssid][i]); } fprintf(fh, " N\n"); } if (strcmp(filename, "-") != 0) fclose(fh); return 0; } int bin_mdef_ciphone_id(bin_mdef_t * m, const char *ciphone) { int low, mid, high; /* Exact binary search on m->ciphone */ low = 0; high = m->n_ciphone; while (low < high) { int c; mid = (low + high) / 2; c = strcmp(ciphone, m->ciname[mid]); if (c == 0) return mid; else if (c > 0) low = mid + 1; else if (c < 0) high = mid; } return -1; } int bin_mdef_ciphone_id_nocase(bin_mdef_t * m, const char *ciphone) { int low, mid, high; /* Exact binary search on m->ciphone */ low = 0; high = m->n_ciphone; while (low < high) { int c; mid = (low + high) / 2; c = strcmp_nocase(ciphone, m->ciname[mid]); if (c == 0) return mid; else if (c > 0) low = mid + 1; else if (c < 0) high = mid; } return -1; } const char * bin_mdef_ciphone_str(bin_mdef_t * m, int32 ci) { assert(m != NULL); assert(ci < m->n_ciphone); return m->ciname[ci]; } int bin_mdef_phone_id(bin_mdef_t * m, int32 ci, int32 lc, int32 rc, int32 wpos) { cd_tree_t *cd_tree; int level, max; int16 ctx[4]; assert(m); /* In the future, we might back off when context is not available, * but for now we'll just return the CI phone. */ if (lc < 0 || rc < 0) return ci; assert((ci >= 0) && (ci < m->n_ciphone)); assert((lc >= 0) && (lc < m->n_ciphone)); assert((rc >= 0) && (rc < m->n_ciphone)); assert((wpos >= 0) && (wpos < N_WORD_POSN)); /* Create a context list, mapping fillers to silence. */ ctx[0] = wpos; ctx[1] = ci; ctx[2] = (m->sil >= 0 && m->phone[lc].info.ci.filler) ? m->sil : lc; ctx[3] = (m->sil >= 0 && m->phone[rc].info.ci.filler) ? m->sil : rc; /* Walk down the cd_tree. */ cd_tree = m->cd_tree; level = 0; /* What level we are on. */ max = N_WORD_POSN; /* Number of nodes on this level. */ while (level < 4) { int i; #if 0 E_INFO("Looking for context %d=%s in %d at %d\n", ctx[level], m->ciname[ctx[level]], max, cd_tree - m->cd_tree); #endif for (i = 0; i < max; ++i) { #if 0 E_INFO("Look at context %d=%s at %d\n", cd_tree[i].ctx, m->ciname[cd_tree[i].ctx], cd_tree + i - m->cd_tree); #endif if (cd_tree[i].ctx == ctx[level]) break; } if (i == max) return -1; #if 0 E_INFO("Found context %d=%s at %d, n_down=%d, down=%d\n", ctx[level], m->ciname[ctx[level]], cd_tree + i - m->cd_tree, cd_tree[i].n_down, cd_tree[i].c.down); #endif /* Leaf node, stop here. */ if (cd_tree[i].n_down == 0) return cd_tree[i].c.pid; /* Go down one level. */ max = cd_tree[i].n_down; cd_tree = m->cd_tree + cd_tree[i].c.down; ++level; } /* We probably shouldn't get here. */ return -1; } int bin_mdef_phone_id_nearest(bin_mdef_t * m, int32 b, int32 l, int32 r, int32 pos) { int p, tmppos; /* In the future, we might back off when context is not available, * but for now we'll just return the CI phone. */ if (l < 0 || r < 0) return b; p = bin_mdef_phone_id(m, b, l, r, pos); if (p >= 0) return p; /* Exact triphone not found; backoff to other word positions */ for (tmppos = 0; tmppos < N_WORD_POSN; tmppos++) { if (tmppos != pos) { p = bin_mdef_phone_id(m, b, l, r, tmppos); if (p >= 0) return p; } } /* Nothing yet; backoff to silence phone if non-silence filler context */ /* In addition, backoff to silence phone on left/right if in beginning/end position */ if (m->sil >= 0) { int newl = l, newr = r; if (m->phone[(int)l].info.ci.filler || pos == WORD_POSN_BEGIN || pos == WORD_POSN_SINGLE) newl = m->sil; if (m->phone[(int)r].info.ci.filler || pos == WORD_POSN_END || pos == WORD_POSN_SINGLE) newr = m->sil; if ((newl != l) || (newr != r)) { p = bin_mdef_phone_id(m, b, newl, newr, pos); if (p >= 0) return p; for (tmppos = 0; tmppos < N_WORD_POSN; tmppos++) { if (tmppos != pos) { p = bin_mdef_phone_id(m, b, newl, newr, tmppos); if (p >= 0) return p; } } } } /* Nothing yet; backoff to base phone */ return b; } int bin_mdef_phone_str(bin_mdef_t * m, int pid, char *buf) { char *wpos_name; assert(m); assert((pid >= 0) && (pid < m->n_phone)); wpos_name = WPOS_NAME; buf[0] = '\0'; if (pid < m->n_ciphone) sprintf(buf, "%s", bin_mdef_ciphone_str(m, pid)); else { sprintf(buf, "%s %s %s %c", bin_mdef_ciphone_str(m, m->phone[pid].info.cd.ctx[0]), bin_mdef_ciphone_str(m, m->phone[pid].info.cd.ctx[1]), bin_mdef_ciphone_str(m, m->phone[pid].info.cd.ctx[2]), wpos_name[m->phone[pid].info.cd.wpos]); } return 0; } pocketsphinx-5prealpha/src/libpocketsphinx/acmod.c0000664000175000017500000012051012771606425017634 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file acmod.c Acoustic model structures for PocketSphinx. * @author David Huggins-Daines */ /* System headers. */ #include #include #include /* SphinxBase headers. */ #include #include #include #include #include #include #include /* Local headers. */ #include "cmdln_macro.h" #include "acmod.h" #include "s2_semi_mgau.h" #include "ptm_mgau.h" #include "ms_mgau.h" static int32 acmod_process_mfcbuf(acmod_t *acmod); static int acmod_init_am(acmod_t *acmod) { char const *mdeffn, *tmatfn, *mllrfn, *hmmdir; /* Read model definition. */ if ((mdeffn = cmd_ln_str_r(acmod->config, "_mdef")) == NULL) { if ((hmmdir = cmd_ln_str_r(acmod->config, "-hmm")) == NULL) E_ERROR("Acoustic model definition is not specified either " "with -mdef option or with -hmm\n"); else E_ERROR("Folder '%s' does not contain acoustic model " "definition 'mdef'\n", hmmdir); return -1; } if ((acmod->mdef = bin_mdef_read(acmod->config, mdeffn)) == NULL) { E_ERROR("Failed to read acoustic model definition from %s\n", mdeffn); return -1; } /* Read transition matrices. */ if ((tmatfn = cmd_ln_str_r(acmod->config, "_tmat")) == NULL) { E_ERROR("No tmat file specified\n"); return -1; } acmod->tmat = tmat_init(tmatfn, acmod->lmath, cmd_ln_float32_r(acmod->config, "-tmatfloor"), TRUE); /* Read the acoustic models. */ if ((cmd_ln_str_r(acmod->config, "_mean") == NULL) || (cmd_ln_str_r(acmod->config, "_var") == NULL) || (cmd_ln_str_r(acmod->config, "_tmat") == NULL)) { E_ERROR("No mean/var/tmat files specified\n"); return -1; } if (cmd_ln_str_r(acmod->config, "_senmgau")) { E_INFO("Using general multi-stream GMM computation\n"); acmod->mgau = ms_mgau_init(acmod, acmod->lmath, acmod->mdef); if (acmod->mgau == NULL) return -1; } else { E_INFO("Attempting to use PTM computation module\n"); if ((acmod->mgau = ptm_mgau_init(acmod, acmod->mdef)) == NULL) { E_INFO("Attempting to use semi-continuous computation module\n"); if ((acmod->mgau = s2_semi_mgau_init(acmod)) == NULL) { E_INFO("Falling back to general multi-stream GMM computation\n"); acmod->mgau = ms_mgau_init(acmod, acmod->lmath, acmod->mdef); if (acmod->mgau == NULL) { E_ERROR("Failed to read acoustic model\n"); return -1; } } } } /* If there is an MLLR transform, apply it. */ if ((mllrfn = cmd_ln_str_r(acmod->config, "-mllr"))) { ps_mllr_t *mllr = ps_mllr_read(mllrfn); if (mllr == NULL) return -1; acmod_update_mllr(acmod, mllr); } return 0; } static int acmod_init_feat(acmod_t *acmod) { acmod->fcb = feat_init(cmd_ln_str_r(acmod->config, "-feat"), cmn_type_from_str(cmd_ln_str_r(acmod->config,"-cmn")), cmd_ln_boolean_r(acmod->config, "-varnorm"), agc_type_from_str(cmd_ln_str_r(acmod->config, "-agc")), 1, cmd_ln_int32_r(acmod->config, "-ceplen")); if (acmod->fcb == NULL) return -1; if (cmd_ln_str_r(acmod->config, "_lda")) { E_INFO("Reading linear feature transformation from %s\n", cmd_ln_str_r(acmod->config, "_lda")); if (feat_read_lda(acmod->fcb, cmd_ln_str_r(acmod->config, "_lda"), cmd_ln_int32_r(acmod->config, "-ldadim")) < 0) return -1; } if (cmd_ln_str_r(acmod->config, "-svspec")) { int32 **subvecs; E_INFO("Using subvector specification %s\n", cmd_ln_str_r(acmod->config, "-svspec")); if ((subvecs = parse_subvecs(cmd_ln_str_r(acmod->config, "-svspec"))) == NULL) return -1; if ((feat_set_subvecs(acmod->fcb, subvecs)) < 0) return -1; } if (cmd_ln_exists_r(acmod->config, "-agcthresh") && 0 != strcmp(cmd_ln_str_r(acmod->config, "-agc"), "none")) { agc_set_threshold(acmod->fcb->agc_struct, cmd_ln_float32_r(acmod->config, "-agcthresh")); } if (acmod->fcb->cmn_struct && cmd_ln_exists_r(acmod->config, "-cmninit")) { char *c, *cc, *vallist; int32 nvals; vallist = ckd_salloc(cmd_ln_str_r(acmod->config, "-cmninit")); c = vallist; nvals = 0; while (nvals < acmod->fcb->cmn_struct->veclen && (cc = strchr(c, ',')) != NULL) { *cc = '\0'; acmod->fcb->cmn_struct->cmn_mean[nvals] = FLOAT2MFCC(atof_c(c)); c = cc + 1; ++nvals; } if (nvals < acmod->fcb->cmn_struct->veclen && *c != '\0') { acmod->fcb->cmn_struct->cmn_mean[nvals] = FLOAT2MFCC(atof_c(c)); } ckd_free(vallist); } return 0; } int acmod_fe_mismatch(acmod_t *acmod, fe_t *fe) { /* Output vector dimension needs to be the same. */ if (cmd_ln_int32_r(acmod->config, "-ceplen") != fe_get_output_size(fe)) { E_ERROR("Configured feature length %d doesn't match feature " "extraction output size %d\n", cmd_ln_int32_r(acmod->config, "-ceplen"), fe_get_output_size(fe)); return TRUE; } /* Feature parameters need to be the same. */ /* ... */ return FALSE; } int acmod_feat_mismatch(acmod_t *acmod, feat_t *fcb) { /* Feature type needs to be the same. */ if (0 != strcmp(cmd_ln_str_r(acmod->config, "-feat"), feat_name(fcb))) return TRUE; /* Input vector dimension needs to be the same. */ if (cmd_ln_int32_r(acmod->config, "-ceplen") != feat_cepsize(fcb)) return TRUE; /* FIXME: Need to check LDA and stuff too. */ return FALSE; } acmod_t * acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb) { acmod_t *acmod; acmod = ckd_calloc(1, sizeof(*acmod)); acmod->config = cmd_ln_retain(config); acmod->lmath = lmath; acmod->state = ACMOD_IDLE; /* Initialize feature computation. */ if (fe) { if (acmod_fe_mismatch(acmod, fe)) goto error_out; fe_retain(fe); acmod->fe = fe; } else { /* Initialize a new front end. */ acmod->fe = fe_init_auto_r(config); if (acmod->fe == NULL) goto error_out; if (acmod_fe_mismatch(acmod, acmod->fe)) goto error_out; } if (fcb) { if (acmod_feat_mismatch(acmod, fcb)) goto error_out; feat_retain(fcb); acmod->fcb = fcb; } else { /* Initialize a new fcb. */ if (acmod_init_feat(acmod) < 0) goto error_out; } /* Load acoustic model parameters. */ if (acmod_init_am(acmod) < 0) goto error_out; /* The MFCC buffer needs to be at least as large as the dynamic * feature window. */ acmod->n_mfc_alloc = acmod->fcb->window_size * 2 + 1; acmod->mfc_buf = (mfcc_t **) ckd_calloc_2d(acmod->n_mfc_alloc, acmod->fcb->cepsize, sizeof(**acmod->mfc_buf)); /* Feature buffer has to be at least as large as MFCC buffer. */ acmod->n_feat_alloc = acmod->n_mfc_alloc + cmd_ln_int32_r(config, "-pl_window"); acmod->feat_buf = feat_array_alloc(acmod->fcb, acmod->n_feat_alloc); acmod->framepos = ckd_calloc(acmod->n_feat_alloc, sizeof(*acmod->framepos)); acmod->utt_start_frame = 0; /* Senone computation stuff. */ acmod->senone_scores = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_scores)); acmod->senone_active_vec = bitvec_alloc(bin_mdef_n_sen(acmod->mdef)); acmod->senone_active = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_active)); acmod->log_zero = logmath_get_zero(acmod->lmath); acmod->compallsen = cmd_ln_boolean_r(config, "-compallsen"); return acmod; error_out: acmod_free(acmod); return NULL; } void acmod_free(acmod_t *acmod) { if (acmod == NULL) return; feat_free(acmod->fcb); fe_free(acmod->fe); cmd_ln_free_r(acmod->config); if (acmod->mfc_buf) ckd_free_2d((void **)acmod->mfc_buf); if (acmod->feat_buf) feat_array_free(acmod->feat_buf); if (acmod->mfcfh) fclose(acmod->mfcfh); if (acmod->rawfh) fclose(acmod->rawfh); if (acmod->senfh) fclose(acmod->senfh); ckd_free(acmod->framepos); ckd_free(acmod->senone_scores); ckd_free(acmod->senone_active_vec); ckd_free(acmod->senone_active); ckd_free(acmod->rawdata); if (acmod->mdef) bin_mdef_free(acmod->mdef); if (acmod->tmat) tmat_free(acmod->tmat); if (acmod->mgau) ps_mgau_free(acmod->mgau); if (acmod->mllr) ps_mllr_free(acmod->mllr); ckd_free(acmod); } ps_mllr_t * acmod_update_mllr(acmod_t *acmod, ps_mllr_t *mllr) { if (acmod->mllr) ps_mllr_free(acmod->mllr); acmod->mllr = mllr; ps_mgau_transform(acmod->mgau, mllr); return mllr; } int acmod_write_senfh_header(acmod_t *acmod, FILE *logfh) { char nsenstr[64], logbasestr[64]; sprintf(nsenstr, "%d", bin_mdef_n_sen(acmod->mdef)); sprintf(logbasestr, "%f", logmath_get_base(acmod->lmath)); return bio_writehdr(logfh, "version", "0.1", "mdef_file", cmd_ln_str_r(acmod->config, "_mdef"), "n_sen", nsenstr, "logbase", logbasestr, NULL); } int acmod_set_senfh(acmod_t *acmod, FILE *logfh) { if (acmod->senfh) fclose(acmod->senfh); acmod->senfh = logfh; if (logfh == NULL) return 0; return acmod_write_senfh_header(acmod, logfh); } int acmod_set_mfcfh(acmod_t *acmod, FILE *logfh) { int rv = 0; if (acmod->mfcfh) fclose(acmod->mfcfh); acmod->mfcfh = logfh; fwrite(&rv, 4, 1, acmod->mfcfh); return rv; } int acmod_set_rawfh(acmod_t *acmod, FILE *logfh) { if (acmod->rawfh) fclose(acmod->rawfh); acmod->rawfh = logfh; return 0; } void acmod_grow_feat_buf(acmod_t *acmod, int nfr) { if (nfr > MAX_N_FRAMES) E_FATAL("Decoder can not process more than %d frames at once, " "requested %d\n", MAX_N_FRAMES, nfr); acmod->feat_buf = feat_array_realloc(acmod->fcb, acmod->feat_buf, acmod->n_feat_alloc, nfr); acmod->framepos = ckd_realloc(acmod->framepos, nfr * sizeof(*acmod->framepos)); acmod->n_feat_alloc = nfr; } int acmod_set_grow(acmod_t *acmod, int grow_feat) { int tmp = acmod->grow_feat; acmod->grow_feat = grow_feat; /* Expand feat_buf to a reasonable size to start with. */ if (grow_feat && acmod->n_feat_alloc < 128) acmod_grow_feat_buf(acmod, 128); return tmp; } int acmod_start_utt(acmod_t *acmod) { fe_start_utt(acmod->fe); acmod->state = ACMOD_STARTED; acmod->n_mfc_frame = 0; acmod->n_feat_frame = 0; acmod->mfc_outidx = 0; acmod->feat_outidx = 0; acmod->output_frame = 0; acmod->senscr_frame = -1; acmod->n_senone_active = 0; acmod->mgau->frame_idx = 0; acmod->rawdata_pos = 0; return 0; } int acmod_end_utt(acmod_t *acmod) { int32 nfr = 0; acmod->state = ACMOD_ENDED; if (acmod->n_mfc_frame < acmod->n_mfc_alloc) { int inptr; /* Where to start writing them (circular buffer) */ inptr = (acmod->mfc_outidx + acmod->n_mfc_frame) % acmod->n_mfc_alloc; /* nfr is always either zero or one. */ fe_end_utt(acmod->fe, acmod->mfc_buf[inptr], &nfr); acmod->n_mfc_frame += nfr; /* Process whatever's left, and any leadout or update stats if needed. */ if (nfr) nfr = acmod_process_mfcbuf(acmod); else feat_update_stats(acmod->fcb); } if (acmod->mfcfh) { long outlen; int32 rv; outlen = (ftell(acmod->mfcfh) - 4) / 4; /* Try to seek and write */ if ((rv = fseek(acmod->mfcfh, 0, SEEK_SET)) == 0) { fwrite(&outlen, 4, 1, acmod->mfcfh); } fclose(acmod->mfcfh); acmod->mfcfh = NULL; } if (acmod->rawfh) { fclose(acmod->rawfh); acmod->rawfh = NULL; } if (acmod->senfh) { fclose(acmod->senfh); acmod->senfh = NULL; } return nfr; } static int acmod_log_mfc(acmod_t *acmod, mfcc_t **cep, int n_frames) { int n = n_frames * feat_cepsize(acmod->fcb); /* Write features. */ if (fwrite(cep[0], sizeof(mfcc_t), n, acmod->mfcfh) != n) { E_ERROR_SYSTEM("Failed to write %d values to file", n); } return 0; } static int acmod_process_full_cep(acmod_t *acmod, mfcc_t ***inout_cep, int *inout_n_frames) { int32 nfr; /* Write to file. */ if (acmod->mfcfh) acmod_log_mfc(acmod, *inout_cep, *inout_n_frames); /* Resize feat_buf to fit. */ if (acmod->n_feat_alloc < *inout_n_frames) { if (*inout_n_frames > MAX_N_FRAMES) E_FATAL("Batch processing can not process more than %d frames " "at once, requested %d\n", MAX_N_FRAMES, *inout_n_frames); feat_array_free(acmod->feat_buf); acmod->feat_buf = feat_array_alloc(acmod->fcb, *inout_n_frames); acmod->n_feat_alloc = *inout_n_frames; acmod->n_feat_frame = 0; acmod->feat_outidx = 0; } /* Make dynamic features. */ nfr = feat_s2mfc2feat_live(acmod->fcb, *inout_cep, inout_n_frames, TRUE, TRUE, acmod->feat_buf); acmod->n_feat_frame = nfr; assert(acmod->n_feat_frame <= acmod->n_feat_alloc); *inout_cep += *inout_n_frames; *inout_n_frames = 0; return nfr; } static int acmod_process_full_raw(acmod_t *acmod, int16 const **inout_raw, size_t *inout_n_samps) { int32 nfr, ntail; mfcc_t **cepptr; /* Write to logging file if any. */ if (*inout_n_samps + acmod->rawdata_pos < acmod->rawdata_size) { memcpy(acmod->rawdata + acmod->rawdata_pos, *inout_raw, *inout_n_samps * sizeof(int16)); acmod->rawdata_pos += *inout_n_samps; } if (acmod->rawfh) fwrite(*inout_raw, sizeof(int16), *inout_n_samps, acmod->rawfh); /* Resize mfc_buf to fit. */ if (fe_process_frames(acmod->fe, NULL, inout_n_samps, NULL, &nfr, NULL) < 0) return -1; if (acmod->n_mfc_alloc < nfr + 1) { ckd_free_2d(acmod->mfc_buf); acmod->mfc_buf = ckd_calloc_2d(nfr + 1, fe_get_output_size(acmod->fe), sizeof(**acmod->mfc_buf)); acmod->n_mfc_alloc = nfr + 1; } acmod->n_mfc_frame = 0; acmod->mfc_outidx = 0; fe_start_utt(acmod->fe); if (fe_process_frames(acmod->fe, inout_raw, inout_n_samps, acmod->mfc_buf, &nfr, NULL) < 0) return -1; fe_end_utt(acmod->fe, acmod->mfc_buf[nfr], &ntail); nfr += ntail; cepptr = acmod->mfc_buf; nfr = acmod_process_full_cep(acmod, &cepptr, &nfr); acmod->n_mfc_frame = 0; return nfr; } /** * Process MFCCs that are in the internal buffer into features. */ static int32 acmod_process_mfcbuf(acmod_t *acmod) { mfcc_t **mfcptr; int32 ncep; ncep = acmod->n_mfc_frame; /* Also do this in two parts because of the circular mfc_buf. */ if (acmod->mfc_outidx + ncep > acmod->n_mfc_alloc) { int32 ncep1 = acmod->n_mfc_alloc - acmod->mfc_outidx; int saved_state = acmod->state; /* Make sure we don't end the utterance here. */ if (acmod->state == ACMOD_ENDED) acmod->state = ACMOD_PROCESSING; mfcptr = acmod->mfc_buf + acmod->mfc_outidx; ncep1 = acmod_process_cep(acmod, &mfcptr, &ncep1, FALSE); /* It's possible that not all available frames were filled. */ ncep -= ncep1; acmod->n_mfc_frame -= ncep1; acmod->mfc_outidx += ncep1; acmod->mfc_outidx %= acmod->n_mfc_alloc; /* Restore original state (could this really be the end) */ acmod->state = saved_state; } mfcptr = acmod->mfc_buf + acmod->mfc_outidx; ncep = acmod_process_cep(acmod, &mfcptr, &ncep, FALSE); acmod->n_mfc_frame -= ncep; acmod->mfc_outidx += ncep; acmod->mfc_outidx %= acmod->n_mfc_alloc; return ncep; } int acmod_process_raw(acmod_t *acmod, int16 const **inout_raw, size_t *inout_n_samps, int full_utt) { int32 ncep; int32 out_frameidx; int16 const *prev_audio_inptr; /* If this is a full utterance, process it all at once. */ if (full_utt) return acmod_process_full_raw(acmod, inout_raw, inout_n_samps); /* Append MFCCs to the end of any that are previously in there * (in practice, there will probably be none) */ if (inout_n_samps && *inout_n_samps) { int inptr; int32 processed_samples; prev_audio_inptr = *inout_raw; /* Total number of frames available. */ ncep = acmod->n_mfc_alloc - acmod->n_mfc_frame; /* Where to start writing them (circular buffer) */ inptr = (acmod->mfc_outidx + acmod->n_mfc_frame) % acmod->n_mfc_alloc; /* Write them in two (or more) parts if there is wraparound. */ while (inptr + ncep > acmod->n_mfc_alloc) { int32 ncep1 = acmod->n_mfc_alloc - inptr; if (fe_process_frames(acmod->fe, inout_raw, inout_n_samps, acmod->mfc_buf + inptr, &ncep1, &out_frameidx) < 0) return -1; if (out_frameidx > 0) acmod->utt_start_frame = out_frameidx; processed_samples = *inout_raw - prev_audio_inptr; if (processed_samples + acmod->rawdata_pos < acmod->rawdata_size) { memcpy(acmod->rawdata + acmod->rawdata_pos, prev_audio_inptr, processed_samples * sizeof(int16)); acmod->rawdata_pos += processed_samples; } /* Write to logging file if any. */ if (acmod->rawfh) { fwrite(prev_audio_inptr, sizeof(int16), processed_samples, acmod->rawfh); } prev_audio_inptr = *inout_raw; /* ncep1 now contains the number of frames actually * processed. This is a good thing, but it means we * actually still might have some room left at the end of * the buffer, hence the while loop. Unfortunately it * also means that in the case where we are really * actually done, we need to get out totally, hence the * goto. */ acmod->n_mfc_frame += ncep1; ncep -= ncep1; inptr += ncep1; inptr %= acmod->n_mfc_alloc; if (ncep1 == 0) goto alldone; } assert(inptr + ncep <= acmod->n_mfc_alloc); if (fe_process_frames(acmod->fe, inout_raw, inout_n_samps, acmod->mfc_buf + inptr, &ncep, &out_frameidx) < 0) return -1; if (out_frameidx > 0) acmod->utt_start_frame = out_frameidx; processed_samples = *inout_raw - prev_audio_inptr; if (processed_samples + acmod->rawdata_pos < acmod->rawdata_size) { memcpy(acmod->rawdata + acmod->rawdata_pos, prev_audio_inptr, processed_samples * sizeof(int16)); acmod->rawdata_pos += processed_samples; } if (acmod->rawfh) { fwrite(prev_audio_inptr, sizeof(int16), processed_samples, acmod->rawfh); } prev_audio_inptr = *inout_raw; acmod->n_mfc_frame += ncep; alldone: ; } /* Hand things off to acmod_process_cep. */ return acmod_process_mfcbuf(acmod); } int acmod_process_cep(acmod_t *acmod, mfcc_t ***inout_cep, int *inout_n_frames, int full_utt) { int32 nfeat, ncep, inptr; int orig_n_frames; /* If this is a full utterance, process it all at once. */ if (full_utt) return acmod_process_full_cep(acmod, inout_cep, inout_n_frames); /* Write to file. */ if (acmod->mfcfh) acmod_log_mfc(acmod, *inout_cep, *inout_n_frames); /* Maximum number of frames we're going to generate. */ orig_n_frames = ncep = nfeat = *inout_n_frames; /* FIXME: This behaviour isn't guaranteed... */ if (acmod->state == ACMOD_ENDED) nfeat += feat_window_size(acmod->fcb); else if (acmod->state == ACMOD_STARTED) nfeat -= feat_window_size(acmod->fcb); /* Clamp number of features to fit available space. */ if (nfeat > acmod->n_feat_alloc - acmod->n_feat_frame) { /* Grow it as needed - we have to grow it at the end of an * utterance because we can't return a short read there. */ if (acmod->grow_feat || acmod->state == ACMOD_ENDED) acmod_grow_feat_buf(acmod, acmod->n_feat_alloc + nfeat); else ncep -= (nfeat - (acmod->n_feat_alloc - acmod->n_feat_frame)); } /* Where to start writing in the feature buffer. */ if (acmod->grow_feat) { /* Grow to avoid wraparound if grow_feat == TRUE. */ inptr = acmod->feat_outidx + acmod->n_feat_frame; while (inptr + nfeat >= acmod->n_feat_alloc) acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); } else { inptr = (acmod->feat_outidx + acmod->n_feat_frame) % acmod->n_feat_alloc; } /* FIXME: we can't split the last frame drop properly to be on the bounary, * so just return */ if (inptr + nfeat > acmod->n_feat_alloc && acmod->state == ACMOD_ENDED) { *inout_n_frames -= ncep; *inout_cep += ncep; return 0; } /* Write them in two parts if there is wraparound. */ if (inptr + nfeat > acmod->n_feat_alloc) { int32 ncep1 = acmod->n_feat_alloc - inptr; /* Make sure we don't end the utterance here. */ nfeat = feat_s2mfc2feat_live(acmod->fcb, *inout_cep, &ncep1, (acmod->state == ACMOD_STARTED), FALSE, acmod->feat_buf + inptr); if (nfeat < 0) return -1; /* Move the output feature pointer forward. */ acmod->n_feat_frame += nfeat; assert(acmod->n_feat_frame <= acmod->n_feat_alloc); inptr += nfeat; inptr %= acmod->n_feat_alloc; /* Move the input feature pointers forward. */ *inout_n_frames -= ncep1; *inout_cep += ncep1; ncep -= ncep1; } nfeat = feat_s2mfc2feat_live(acmod->fcb, *inout_cep, &ncep, (acmod->state == ACMOD_STARTED), (acmod->state == ACMOD_ENDED), acmod->feat_buf + inptr); if (nfeat < 0) return -1; acmod->n_feat_frame += nfeat; assert(acmod->n_feat_frame <= acmod->n_feat_alloc); /* Move the input feature pointers forward. */ *inout_n_frames -= ncep; *inout_cep += ncep; if (acmod->state == ACMOD_STARTED) acmod->state = ACMOD_PROCESSING; return orig_n_frames - *inout_n_frames; } int acmod_process_feat(acmod_t *acmod, mfcc_t **feat) { int i, inptr; if (acmod->n_feat_frame == acmod->n_feat_alloc) { if (acmod->grow_feat) acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); else return 0; } if (acmod->grow_feat) { /* Grow to avoid wraparound if grow_feat == TRUE. */ inptr = acmod->feat_outidx + acmod->n_feat_frame; while (inptr + 1 >= acmod->n_feat_alloc) acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); } else { inptr = (acmod->feat_outidx + acmod->n_feat_frame) % acmod->n_feat_alloc; } for (i = 0; i < feat_dimension1(acmod->fcb); ++i) memcpy(acmod->feat_buf[inptr][i], feat[i], feat_dimension2(acmod->fcb, i) * sizeof(**feat)); ++acmod->n_feat_frame; assert(acmod->n_feat_frame <= acmod->n_feat_alloc); return 1; } static int acmod_read_senfh_header(acmod_t *acmod) { char **name, **val; int32 swap; int i; if (bio_readhdr(acmod->insenfh, &name, &val, &swap) < 0) goto error_out; for (i = 0; name[i] != NULL; ++i) { if (!strcmp(name[i], "n_sen")) { if (atoi(val[i]) != bin_mdef_n_sen(acmod->mdef)) { E_ERROR("Number of senones in senone file (%d) does not " "match mdef (%d)\n", atoi(val[i]), bin_mdef_n_sen(acmod->mdef)); goto error_out; } } if (!strcmp(name[i], "logbase")) { if (fabs(atof_c(val[i]) - logmath_get_base(acmod->lmath)) > 0.001) { E_ERROR("Logbase in senone file (%f) does not match acmod " "(%f)\n", atof_c(val[i]), logmath_get_base(acmod->lmath)); goto error_out; } } } acmod->insen_swap = swap; bio_hdrarg_free(name, val); return 0; error_out: bio_hdrarg_free(name, val); return -1; } int acmod_set_insenfh(acmod_t *acmod, FILE *senfh) { acmod->insenfh = senfh; if (senfh == NULL) { acmod->n_feat_frame = 0; acmod->compallsen = cmd_ln_boolean_r(acmod->config, "-compallsen"); return 0; } acmod->compallsen = TRUE; return acmod_read_senfh_header(acmod); } int acmod_rewind(acmod_t *acmod) { /* If the feature buffer is circular, this is not possible. */ if (acmod->output_frame > acmod->n_feat_alloc) { E_ERROR("Circular feature buffer cannot be rewound (output frame %d, " "alloc %d)\n", acmod->output_frame, acmod->n_feat_alloc); return -1; } /* Frames consumed + frames available */ acmod->n_feat_frame = acmod->output_frame + acmod->n_feat_frame; /* Reset output pointers. */ acmod->feat_outidx = 0; acmod->output_frame = 0; acmod->senscr_frame = -1; acmod->mgau->frame_idx = 0; return 0; } int acmod_advance(acmod_t *acmod) { /* Advance the output pointers. */ if (++acmod->feat_outidx == acmod->n_feat_alloc) acmod->feat_outidx = 0; --acmod->n_feat_frame; ++acmod->mgau->frame_idx; return ++acmod->output_frame; } int acmod_write_scores(acmod_t *acmod, int n_active, uint8 const *active, int16 const *senscr, FILE *senfh) { int16 n_active2; /* Uncompressed frame format: * * (2 bytes) n_active: Number of active senones * If all senones active: * (n_active * 2 bytes) scores of active senones * * Otherwise: * (2 bytes) n_active: Number of active senones * (n_active bytes) deltas to active senones * (n_active * 2 bytes) scores of active senones */ n_active2 = n_active; if (fwrite(&n_active2, 2, 1, senfh) != 1) goto error_out; if (n_active == bin_mdef_n_sen(acmod->mdef)) { if (fwrite(senscr, 2, n_active, senfh) != n_active) goto error_out; } else { int i, n; if (fwrite(active, 1, n_active, senfh) != n_active) goto error_out; for (i = n = 0; i < n_active; ++i) { n += active[i]; if (fwrite(senscr + n, 2, 1, senfh) != 1) goto error_out; } } return 0; error_out: E_ERROR_SYSTEM("Failed to write frame to senone file"); return -1; } /** * Internal version, used for reading previous frames in acmod_score() */ static int acmod_read_scores_internal(acmod_t *acmod) { FILE *senfh = acmod->insenfh; int16 n_active; size_t rv; if (acmod->n_feat_frame == acmod->n_feat_alloc) { if (acmod->grow_feat) acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); else return 0; } if (senfh == NULL) return -1; if ((rv = fread(&n_active, 2, 1, senfh)) != 1) goto error_out; acmod->n_senone_active = n_active; if (acmod->n_senone_active == bin_mdef_n_sen(acmod->mdef)) { if ((rv = fread(acmod->senone_scores, 2, acmod->n_senone_active, senfh)) != acmod->n_senone_active) goto error_out; } else { int i, n; if ((rv = fread(acmod->senone_active, 1, acmod->n_senone_active, senfh)) != acmod->n_senone_active) goto error_out; for (i = 0, n = 0; i < acmod->n_senone_active; ++i) { int j, sen = n + acmod->senone_active[i]; for (j = n + 1; j < sen; ++j) acmod->senone_scores[j] = SENSCR_DUMMY; if ((rv = fread(acmod->senone_scores + sen, 2, 1, senfh)) != 1) goto error_out; n = sen; } n++; while (n < bin_mdef_n_sen(acmod->mdef)) acmod->senone_scores[n++] = SENSCR_DUMMY; } return 1; error_out: if (ferror(senfh)) { E_ERROR_SYSTEM("Failed to read frame from senone file"); return -1; } return 0; } int acmod_read_scores(acmod_t *acmod) { int inptr, rv; if (acmod->grow_feat) { /* Grow to avoid wraparound if grow_feat == TRUE. */ inptr = acmod->feat_outidx + acmod->n_feat_frame; /* Has to be +1, otherwise, next time acmod_advance() is * called, this will wrap around. */ while (inptr + 1 >= acmod->n_feat_alloc) acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); } else { inptr = (acmod->feat_outidx + acmod->n_feat_frame) % acmod->n_feat_alloc; } if ((rv = acmod_read_scores_internal(acmod)) != 1) return rv; /* Set acmod->senscr_frame appropriately so that these scores get reused below in acmod_score(). */ acmod->senscr_frame = acmod->output_frame + acmod->n_feat_frame; E_DEBUG(1,("Frame %d has %d active states\n", acmod->senscr_frame, acmod->n_senone_active)); /* Increment the "feature frame counter" and record the file * position for the relevant frame in the (possibly circular) * buffer. */ ++acmod->n_feat_frame; acmod->framepos[inptr] = ftell(acmod->insenfh); return 1; } static int calc_frame_idx(acmod_t *acmod, int *inout_frame_idx) { int frame_idx; /* Calculate the absolute frame index to be scored. */ if (inout_frame_idx == NULL) frame_idx = acmod->output_frame; else if (*inout_frame_idx < 0) frame_idx = acmod->output_frame + 1 + *inout_frame_idx; else frame_idx = *inout_frame_idx; return frame_idx; } static int calc_feat_idx(acmod_t *acmod, int frame_idx) { int n_backfr, feat_idx; n_backfr = acmod->n_feat_alloc - acmod->n_feat_frame; if (frame_idx < 0 || acmod->output_frame - frame_idx > n_backfr) { E_ERROR("Frame %d outside queue of %d frames, %d alloc (%d > %d), " "cannot score\n", frame_idx, acmod->n_feat_frame, acmod->n_feat_alloc, acmod->output_frame - frame_idx, n_backfr); return -1; } /* Get the index in feat_buf/framepos of the frame to be scored. */ feat_idx = (acmod->feat_outidx + frame_idx - acmod->output_frame) % acmod->n_feat_alloc; if (feat_idx < 0) feat_idx += acmod->n_feat_alloc; return feat_idx; } mfcc_t ** acmod_get_frame(acmod_t *acmod, int *inout_frame_idx) { int frame_idx, feat_idx; /* Calculate the absolute frame index requested. */ frame_idx = calc_frame_idx(acmod, inout_frame_idx); /* Calculate position of requested frame in circular buffer. */ if ((feat_idx = calc_feat_idx(acmod, frame_idx)) < 0) return NULL; if (inout_frame_idx) *inout_frame_idx = frame_idx; return acmod->feat_buf[feat_idx]; } int16 const * acmod_score(acmod_t *acmod, int *inout_frame_idx) { int frame_idx, feat_idx; /* Calculate the absolute frame index to be scored. */ frame_idx = calc_frame_idx(acmod, inout_frame_idx); /* If all senones are being computed, or we are using a senone file, then we can reuse existing scores. */ if ((acmod->compallsen || acmod->insenfh) && frame_idx == acmod->senscr_frame) { if (inout_frame_idx) *inout_frame_idx = frame_idx; return acmod->senone_scores; } /* Calculate position of requested frame in circular buffer. */ if ((feat_idx = calc_feat_idx(acmod, frame_idx)) < 0) return NULL; /* * If there is an input senone file locate the appropriate frame and read * it. */ if (acmod->insenfh) { fseek(acmod->insenfh, acmod->framepos[feat_idx], SEEK_SET); if (acmod_read_scores_internal(acmod) < 0) return NULL; } else { /* Build active senone list. */ acmod_flags2list(acmod); /* Generate scores for the next available frame */ ps_mgau_frame_eval(acmod->mgau, acmod->senone_scores, acmod->senone_active, acmod->n_senone_active, acmod->feat_buf[feat_idx], frame_idx, acmod->compallsen); } if (inout_frame_idx) *inout_frame_idx = frame_idx; acmod->senscr_frame = frame_idx; /* Dump scores to the senone dump file if one exists. */ if (acmod->senfh) { if (acmod_write_scores(acmod, acmod->n_senone_active, acmod->senone_active, acmod->senone_scores, acmod->senfh) < 0) return NULL; E_DEBUG(1,("Frame %d has %d active states\n", frame_idx, acmod->n_senone_active)); } return acmod->senone_scores; } int acmod_best_score(acmod_t *acmod, int *out_best_senid) { int i, best; best = SENSCR_DUMMY; if (acmod->compallsen) { for (i = 0; i < bin_mdef_n_sen(acmod->mdef); ++i) { if (acmod->senone_scores[i] < best) { best = acmod->senone_scores[i]; *out_best_senid = i; } } } else { int16 *senscr; senscr = acmod->senone_scores; for (i = 0; i < acmod->n_senone_active; ++i) { senscr += acmod->senone_active[i]; if (*senscr < best) { best = *senscr; *out_best_senid = i; } } } return best; } void acmod_clear_active(acmod_t *acmod) { if (acmod->compallsen) return; bitvec_clear_all(acmod->senone_active_vec, bin_mdef_n_sen(acmod->mdef)); acmod->n_senone_active = 0; } #define MPX_BITVEC_SET(a,h,i) \ if (hmm_mpx_ssid(h,i) != BAD_SSID) \ bitvec_set((a)->senone_active_vec, hmm_mpx_senid(h,i)) #define NONMPX_BITVEC_SET(a,h,i) \ bitvec_set((a)->senone_active_vec, \ hmm_nonmpx_senid(h,i)) void acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm) { int i; if (acmod->compallsen) return; if (hmm_is_mpx(hmm)) { switch (hmm_n_emit_state(hmm)) { case 5: MPX_BITVEC_SET(acmod, hmm, 4); MPX_BITVEC_SET(acmod, hmm, 3); case 3: MPX_BITVEC_SET(acmod, hmm, 2); MPX_BITVEC_SET(acmod, hmm, 1); MPX_BITVEC_SET(acmod, hmm, 0); break; default: for (i = 0; i < hmm_n_emit_state(hmm); ++i) { MPX_BITVEC_SET(acmod, hmm, i); } } } else { switch (hmm_n_emit_state(hmm)) { case 5: NONMPX_BITVEC_SET(acmod, hmm, 4); NONMPX_BITVEC_SET(acmod, hmm, 3); case 3: NONMPX_BITVEC_SET(acmod, hmm, 2); NONMPX_BITVEC_SET(acmod, hmm, 1); NONMPX_BITVEC_SET(acmod, hmm, 0); break; default: for (i = 0; i < hmm_n_emit_state(hmm); ++i) { NONMPX_BITVEC_SET(acmod, hmm, i); } } } } int32 acmod_flags2list(acmod_t *acmod) { int32 w, l, n, b, total_dists, total_words, extra_bits; bitvec_t *flagptr; total_dists = bin_mdef_n_sen(acmod->mdef); if (acmod->compallsen) { acmod->n_senone_active = total_dists; return total_dists; } total_words = total_dists / BITVEC_BITS; extra_bits = total_dists % BITVEC_BITS; w = n = l = 0; for (flagptr = acmod->senone_active_vec; w < total_words; ++w, ++flagptr) { if (*flagptr == 0) continue; for (b = 0; b < BITVEC_BITS; ++b) { if (*flagptr & (1UL << b)) { int32 sen = w * BITVEC_BITS + b; int32 delta = sen - l; /* Handle excessive deltas "lossily" by adding a few extra senones to bridge the gap. */ while (delta > 255) { acmod->senone_active[n++] = 255; delta -= 255; } acmod->senone_active[n++] = delta; l = sen; } } } for (b = 0; b < extra_bits; ++b) { if (*flagptr & (1UL << b)) { int32 sen = w * BITVEC_BITS + b; int32 delta = sen - l; /* Handle excessive deltas "lossily" by adding a few extra senones to bridge the gap. */ while (delta > 255) { acmod->senone_active[n++] = 255; delta -= 255; } acmod->senone_active[n++] = delta; l = sen; } } acmod->n_senone_active = n; E_DEBUG(1, ("acmod_flags2list: %d active in frame %d\n", acmod->n_senone_active, acmod->output_frame)); return n; } int32 acmod_stream_offset(acmod_t *acmod) { return acmod->utt_start_frame; } void acmod_start_stream(acmod_t *acmod) { fe_start_stream(acmod->fe); acmod->utt_start_frame = 0; } void acmod_set_rawdata_size(acmod_t *acmod, int32 size) { assert(size >= 0); acmod->rawdata_size = size; if (acmod->rawdata_size > 0) { ckd_free(acmod->rawdata); acmod->rawdata = ckd_calloc(size, sizeof(int16)); } } void acmod_get_rawdata(acmod_t *acmod, int16 **buffer, int32 *size) { if (buffer) { *buffer = acmod->rawdata; } if (size) { *size = acmod->rawdata_pos; } } pocketsphinx-5prealpha/src/libpocketsphinx/mdef.c0000664000175000017500000005442312771605033017467 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * mdef.c -- HMM model definition: base (CI) phones and triphones * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1999 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** * * HISTORY * * * 22-Nov-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * Imported from s3.2, for supporting s3 format continuous * acoustic models. * * 14-Oct-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon * Added mdef_sseq2sen_active(). * * 06-May-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon * In mdef_phone_id(), added backing off to silence phone context from filler * context if original triphone not found. * * 30-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon * Added senone-sequence id (ssid) to phone_t and appropriate functions to * maintain it. Instead, moved state sequence info to mdef_t. * * 13-Jul-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * Added mdef_phone_str(). * * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * Allowed mdef_phone_id_nearest to return base phone id if either * left or right context (or both) is undefined. * * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * Created. */ /* * Major assumptions: * All phones have same #states, same topology. * Every phone has exactly one non-emitting, final state--the last one. * CI phones must appear first in model definition file. */ /* System headers. */ #include #include #include #include /* SphinxBase headers. */ #include #include /* Local headers. */ #include "mdef.h" #define MODEL_DEF_VERSION "0.3" static void ciphone_add(mdef_t * m, char *ci, int p) { assert(p < m->n_ciphone); m->ciphone[p].name = (char *) ckd_salloc(ci); /* freed in mdef_free */ if (hash_table_enter(m->ciphone_ht, m->ciphone[p].name, (void *)(long)p) != (void *)(long)p) E_FATAL("hash_table_enter(%s) failed; duplicate CIphone?\n", m->ciphone[p].name); } static ph_lc_t * find_ph_lc(ph_lc_t * lclist, int lc) { ph_lc_t *lcptr; for (lcptr = lclist; lcptr && (lcptr->lc != lc); lcptr = lcptr->next); return lcptr; } static ph_rc_t * find_ph_rc(ph_rc_t * rclist, int rc) { ph_rc_t *rcptr; for (rcptr = rclist; rcptr && (rcptr->rc != rc); rcptr = rcptr->next); return rcptr; } static void triphone_add(mdef_t * m, int ci, int lc, int rc, word_posn_t wpos, int p) { ph_lc_t *lcptr; ph_rc_t *rcptr; assert(p < m->n_phone); /* Fill in phone[p] information (state and tmat mappings added later) */ m->phone[p].ci = ci; m->phone[p].lc = lc; m->phone[p].rc = rc; m->phone[p].wpos = wpos; /* Create -> p mapping if not a CI phone */ if (p >= m->n_ciphone) { if ((lcptr = find_ph_lc(m->wpos_ci_lclist[wpos][(int) ci], lc)) == NULL) { lcptr = (ph_lc_t *) ckd_calloc(1, sizeof(ph_lc_t)); /* freed at mdef_free, I believe */ lcptr->lc = lc; lcptr->next = m->wpos_ci_lclist[wpos][(int) ci]; m->wpos_ci_lclist[wpos][(int) ci] = lcptr; /* This is what needs to be freed */ } if ((rcptr = find_ph_rc(lcptr->rclist, rc)) != NULL) { __BIGSTACKVARIABLE__ char buf[4096]; mdef_phone_str(m, rcptr->pid, buf); E_FATAL("Duplicate triphone: %s\n", buf); } rcptr = (ph_rc_t *) ckd_calloc(1, sizeof(ph_rc_t)); /* freed in mdef_free, I believe */ rcptr->rc = rc; rcptr->pid = p; rcptr->next = lcptr->rclist; lcptr->rclist = rcptr; } } int mdef_ciphone_id(mdef_t * m, char *ci) { int32 id; if (hash_table_lookup_int32(m->ciphone_ht, ci, &id) < 0) return -1; return id; } const char * mdef_ciphone_str(mdef_t * m, int id) { assert(m); assert((id >= 0) && (id < m->n_ciphone)); return (m->ciphone[id].name); } int mdef_phone_str(mdef_t * m, int pid, char *buf) { char *wpos_name; assert(m); assert((pid >= 0) && (pid < m->n_phone)); wpos_name = WPOS_NAME; buf[0] = '\0'; if (pid < m->n_ciphone) sprintf(buf, "%s", mdef_ciphone_str(m, pid)); else { sprintf(buf, "%s %s %s %c", mdef_ciphone_str(m, m->phone[pid].ci), mdef_ciphone_str(m, m->phone[pid].lc), mdef_ciphone_str(m, m->phone[pid].rc), wpos_name[m->phone[pid].wpos]); } return 0; } int mdef_phone_id(mdef_t * m, int ci, int lc, int rc, word_posn_t wpos) { ph_lc_t *lcptr; ph_rc_t *rcptr; int newl, newr; assert(m); assert((ci >= 0) && (ci < m->n_ciphone)); assert((lc >= 0) && (lc < m->n_ciphone)); assert((rc >= 0) && (rc < m->n_ciphone)); assert((wpos >= 0) && (wpos < N_WORD_POSN)); if (((lcptr = find_ph_lc(m->wpos_ci_lclist[wpos][(int) ci], lc)) == NULL) || ((rcptr = find_ph_rc(lcptr->rclist, rc)) == NULL)) { /* Not found; backoff to silence context if non-silence filler context */ if (m->sil < 0) return -1; newl = m->ciphone[(int) lc].filler ? m->sil : lc; newr = m->ciphone[(int) rc].filler ? m->sil : rc; if ((newl == lc) && (newr == rc)) return -1; return (mdef_phone_id(m, ci, newl, newr, wpos)); } return (rcptr->pid); } int mdef_is_ciphone(mdef_t * m, int p) { assert(m); assert((p >= 0) && (p < m->n_phone)); return ((p < m->n_ciphone) ? 1 : 0); } int mdef_is_cisenone(mdef_t * m, int s) { assert(m); if (s >= m->n_sen) { return 0; } assert(s >= 0); return ((s == m->cd2cisen[s]) ? 1 : 0); } /* Parse tmat and state->senone mappings for phone p and fill in structure */ static void parse_tmat_senmap(mdef_t * m, char *line, long off, int p) { int32 wlen, n, s; char *lp; __BIGSTACKVARIABLE__ char word[1024]; lp = line + off; /* Read transition matrix id */ if ((sscanf(lp, "%d%n", &n, &wlen) != 1) || (n < 0)) E_FATAL("Missing or bad transition matrix id: %s\n", line); m->phone[p].tmat = n; if (m->n_tmat <= n) E_FATAL("tmat-id(%d) > #tmat in header(%d): %s\n", n, m->n_tmat, line); lp += wlen; /* Read senone mappings for each emitting state */ for (n = 0; n < m->n_emit_state; n++) { if ((sscanf(lp, "%d%n", &s, &wlen) != 1) || (s < 0)) E_FATAL("Missing or bad state[%d]->senone mapping: %s\n", n, line); if ((p < m->n_ciphone) && (m->n_ci_sen <= s)) E_FATAL("CI-senone-id(%d) > #CI-senones(%d): %s\n", s, m->n_ci_sen, line); if (m->n_sen <= s) E_FATAL("Senone-id(%d) > #senones(%d): %s\n", s, m->n_sen, line); m->sseq[p][n] = s; lp += wlen; } /* Check for the last non-emitting state N */ if ((sscanf(lp, "%s%n", word, &wlen) != 1) || (strcmp(word, "N") != 0)) E_FATAL("Missing non-emitting state spec: %s\n", line); lp += wlen; /* Check for end of line */ if (sscanf(lp, "%s%n", word, &wlen) == 1) E_FATAL("Non-empty beyond non-emitting final state: %s\n", line); } static void parse_base_line(mdef_t * m, char *line, int p) { int32 wlen, n; __BIGSTACKVARIABLE__ char word[1024], *lp; int ci; lp = line; /* Read base phone name */ if (sscanf(lp, "%s%n", word, &wlen) != 1) E_FATAL("Missing base phone name: %s\n", line); lp += wlen; /* Make sure it's not a duplicate */ ci = mdef_ciphone_id(m, word); if (ci >= 0) E_FATAL("Duplicate base phone: %s\n", line); /* Add ciphone to ciphone table with id p */ ciphone_add(m, word, p); ci = (int) p; /* Read and skip "-" for lc, rc, wpos */ for (n = 0; n < 3; n++) { if ((sscanf(lp, "%s%n", word, &wlen) != 1) || (strcmp(word, "-") != 0)) E_FATAL("Bad context info for base phone: %s\n", line); lp += wlen; } /* Read filler attribute, if present */ if (sscanf(lp, "%s%n", word, &wlen) != 1) E_FATAL("Missing filler atribute field: %s\n", line); lp += wlen; if (strcmp(word, "filler") == 0) m->ciphone[(int) ci].filler = 1; else if (strcmp(word, "n/a") == 0) m->ciphone[(int) ci].filler = 0; else E_FATAL("Bad filler attribute field: %s\n", line); triphone_add(m, ci, -1, -1, WORD_POSN_UNDEFINED, p); /* Parse remainder of line: transition matrix and state->senone mappings */ parse_tmat_senmap(m, line, lp - line, p); } static void parse_tri_line(mdef_t * m, char *line, int p) { int32 wlen; __BIGSTACKVARIABLE__ char word[1024], *lp; int ci, lc, rc; word_posn_t wpos = WORD_POSN_BEGIN; lp = line; /* Read base phone name */ if (sscanf(lp, "%s%n", word, &wlen) != 1) E_FATAL("Missing base phone name: %s\n", line); lp += wlen; ci = mdef_ciphone_id(m, word); if (ci < 0) E_FATAL("Unknown base phone: %s\n", line); /* Read lc */ if (sscanf(lp, "%s%n", word, &wlen) != 1) E_FATAL("Missing left context: %s\n", line); lp += wlen; lc = mdef_ciphone_id(m, word); if (lc < 0) E_FATAL("Unknown left context: %s\n", line); /* Read rc */ if (sscanf(lp, "%s%n", word, &wlen) != 1) E_FATAL("Missing right context: %s\n", line); lp += wlen; rc = mdef_ciphone_id(m, word); if (rc < 0) E_FATAL("Unknown right context: %s\n", line); /* Read tripone word-position within word */ if ((sscanf(lp, "%s%n", word, &wlen) != 1) || (word[1] != '\0')) E_FATAL("Missing or bad word-position spec: %s\n", line); lp += wlen; switch (word[0]) { case 'b': wpos = WORD_POSN_BEGIN; break; case 'e': wpos = WORD_POSN_END; break; case 's': wpos = WORD_POSN_SINGLE; break; case 'i': wpos = WORD_POSN_INTERNAL; break; default: E_FATAL("Bad word-position spec: %s\n", line); } /* Read filler attribute, if present. Must match base phone attribute */ if (sscanf(lp, "%s%n", word, &wlen) != 1) E_FATAL("Missing filler attribute field: %s\n", line); lp += wlen; if (((strcmp(word, "filler") == 0) && (m->ciphone[(int) ci].filler)) || ((strcmp(word, "n/a") == 0) && (!m->ciphone[(int) ci].filler))) { /* Everything is fine */ } else E_FATAL("Bad filler attribute field: %s\n", line); triphone_add(m, ci, lc, rc, wpos, p); /* Parse remainder of line: transition matrix and state->senone mappings */ parse_tmat_senmap(m, line, lp - line, p); } static void sseq_compress(mdef_t * m) { hash_table_t *h; uint16 **sseq; int32 n_sseq; int32 p, j, k; glist_t g; gnode_t *gn; hash_entry_t *he; k = m->n_emit_state * sizeof(int16); h = hash_table_new(m->n_phone, HASH_CASE_YES); n_sseq = 0; /* Identify unique senone-sequence IDs. BUG: tmat-id not being considered!! */ for (p = 0; p < m->n_phone; p++) { /* Add senone sequence to hash table */ if (n_sseq == (j = hash_table_enter_bkey_int32(h, (char *)m->sseq[p], k, n_sseq))) n_sseq++; m->phone[p].ssid = j; } /* Generate compacted sseq table */ sseq = ckd_calloc_2d(n_sseq, m->n_emit_state, sizeof(**sseq)); /* freed in mdef_free() */ g = hash_table_tolist(h, &j); assert(j == n_sseq); for (gn = g; gn; gn = gnode_next(gn)) { he = (hash_entry_t *) gnode_ptr(gn); j = (int32)(long)hash_entry_val(he); memcpy(sseq[j], hash_entry_key(he), k); } glist_free(g); /* Free the old, temporary senone sequence table, replace with compacted one */ ckd_free_2d(m->sseq); m->sseq = sseq; m->n_sseq = n_sseq; hash_table_free(h); } static int32 noncomment_line(char *line, int32 size, FILE * fp) { while (fgets(line, size, fp) != NULL) { if (line[0] != '#') return 0; } return -1; } /* * Initialize phones (ci and triphones) and state->senone mappings from .mdef file. */ mdef_t * mdef_init(char *mdeffile, int32 breport) { FILE *fp; int32 n_ci, n_tri, n_map, n; __BIGSTACKVARIABLE__ char tag[1024], buf[1024]; uint16 **senmap; int p; int32 s, ci, cd; mdef_t *m; if (!mdeffile) E_FATAL("No mdef-file\n"); if (breport) E_INFO("Reading model definition: %s\n", mdeffile); m = (mdef_t *) ckd_calloc(1, sizeof(mdef_t)); /* freed in mdef_free */ if ((fp = fopen(mdeffile, "r")) == NULL) E_FATAL_SYSTEM("Failed to open mdef file '%s' for reading", mdeffile); if (noncomment_line(buf, sizeof(buf), fp) < 0) E_FATAL("Empty file: %s\n", mdeffile); if (strncmp(buf, "BMDF", 4) == 0 || strncmp(buf, "FDMB", 4) == 0) { E_INFO ("Found byte-order mark %.4s, assuming this is a binary mdef file\n", buf); fclose(fp); ckd_free(m); return NULL; } if (strncmp(buf, MODEL_DEF_VERSION, strlen(MODEL_DEF_VERSION)) != 0) E_FATAL("Version error: Expecing %s, but read %s\n", MODEL_DEF_VERSION, buf); /* Read #base phones, #triphones, #senone mappings defined in header */ n_ci = -1; n_tri = -1; n_map = -1; m->n_ci_sen = -1; m->n_sen = -1; m->n_tmat = -1; do { if (noncomment_line(buf, sizeof(buf), fp) < 0) E_FATAL("Incomplete header\n"); if ((sscanf(buf, "%d %s", &n, tag) != 2) || (n < 0)) E_FATAL("Error in header: %s\n", buf); if (strcmp(tag, "n_base") == 0) n_ci = n; else if (strcmp(tag, "n_tri") == 0) n_tri = n; else if (strcmp(tag, "n_state_map") == 0) n_map = n; else if (strcmp(tag, "n_tied_ci_state") == 0) m->n_ci_sen = n; else if (strcmp(tag, "n_tied_state") == 0) m->n_sen = n; else if (strcmp(tag, "n_tied_tmat") == 0) m->n_tmat = n; else E_FATAL("Unknown header line: %s\n", buf); } while ((n_ci < 0) || (n_tri < 0) || (n_map < 0) || (m->n_ci_sen < 0) || (m->n_sen < 0) || (m->n_tmat < 0)); if ((n_ci == 0) || (m->n_ci_sen == 0) || (m->n_tmat == 0) || (m->n_ci_sen > m->n_sen)) E_FATAL("%s: Error in header\n", mdeffile); /* Check typesize limits */ if (n_ci >= MAX_INT16) E_FATAL("%s: #CI phones (%d) exceeds limit (%d)\n", mdeffile, n_ci, MAX_INT16); if (n_ci + n_tri >= MAX_INT32) /* Comparison is always false... */ E_FATAL("%s: #Phones (%d) exceeds limit (%d)\n", mdeffile, n_ci + n_tri, MAX_INT32); if (m->n_sen >= MAX_INT16) E_FATAL("%s: #senones (%d) exceeds limit (%d)\n", mdeffile, m->n_sen, MAX_INT16); if (m->n_tmat >= MAX_INT32) /* Comparison is always false... */ E_FATAL("%s: #tmats (%d) exceeds limit (%d)\n", mdeffile, m->n_tmat, MAX_INT32); m->n_emit_state = (n_map / (n_ci + n_tri)) - 1; if ((m->n_emit_state + 1) * (n_ci + n_tri) != n_map) E_FATAL ("Header error: n_state_map not a multiple of n_ci*n_tri\n"); /* Initialize ciphone info */ m->n_ciphone = n_ci; m->ciphone_ht = hash_table_new(n_ci, HASH_CASE_YES); /* With case-insensitive string names *//* freed in mdef_free */ m->ciphone = (ciphone_t *) ckd_calloc(n_ci, sizeof(ciphone_t)); /* freed in mdef_free */ /* Initialize phones info (ciphones + triphones) */ m->n_phone = n_ci + n_tri; m->phone = (phone_t *) ckd_calloc(m->n_phone, sizeof(phone_t)); /* freed in mdef_free */ /* Allocate space for state->senone map for each phone */ senmap = ckd_calloc_2d(m->n_phone, m->n_emit_state, sizeof(**senmap)); /* freed in mdef_free */ m->sseq = senmap; /* TEMPORARY; until it is compressed into just the unique ones */ /* Allocate initial space for -> pid mapping */ m->wpos_ci_lclist = (ph_lc_t ***) ckd_calloc_2d(N_WORD_POSN, m->n_ciphone, sizeof(ph_lc_t *)); /* freed in mdef_free */ /* * Read base phones and triphones. They'll simply be assigned a running sequence * number as their "phone-id". If the phone-id < n_ci, it's a ciphone. */ /* Read base phones */ for (p = 0; p < n_ci; p++) { if (noncomment_line(buf, sizeof(buf), fp) < 0) E_FATAL("Premature EOF reading CIphone %d\n", p); parse_base_line(m, buf, p); } m->sil = mdef_ciphone_id(m, S3_SILENCE_CIPHONE); /* Read triphones, if any */ for (; p < m->n_phone; p++) { if (noncomment_line(buf, sizeof(buf), fp) < 0) E_FATAL("Premature EOF reading phone %d\n", p); parse_tri_line(m, buf, p); } if (noncomment_line(buf, sizeof(buf), fp) >= 0) E_ERROR("Non-empty file beyond expected #phones (%d)\n", m->n_phone); /* Build CD senones to CI senones map */ if (m->n_ciphone * m->n_emit_state != m->n_ci_sen) E_FATAL ("#CI-senones(%d) != #CI-phone(%d) x #emitting-states(%d)\n", m->n_ci_sen, m->n_ciphone, m->n_emit_state); m->cd2cisen = (int16 *) ckd_calloc(m->n_sen, sizeof(*m->cd2cisen)); /* freed in mdef_free */ m->sen2cimap = (int16 *) ckd_calloc(m->n_sen, sizeof(*m->sen2cimap)); /* freed in mdef_free */ for (s = 0; s < m->n_sen; s++) m->sen2cimap[s] = -1; for (s = 0; s < m->n_ci_sen; s++) { /* CI senones */ m->cd2cisen[s] = s; m->sen2cimap[s] = s / m->n_emit_state; } for (p = n_ci; p < m->n_phone; p++) { /* CD senones */ for (s = 0; s < m->n_emit_state; s++) { cd = m->sseq[p][s]; ci = m->sseq[m->phone[p].ci][s]; m->cd2cisen[cd] = ci; m->sen2cimap[cd] = m->phone[p].ci; } } sseq_compress(m); fclose(fp); return m; } void mdef_report(mdef_t * m) { E_INFO_NOFN("Initialization of mdef_t, report:\n"); E_INFO_NOFN ("%d CI-phone, %d CD-phone, %d emitstate/phone, %d CI-sen, %d Sen, %d Sen-Seq\n", m->n_ciphone, m->n_phone - m->n_ciphone, m->n_emit_state, m->n_ci_sen, m->n_sen, m->n_sseq); E_INFO_NOFN("\n"); } /* RAH 4.23.01, Need to step down the ->next list to see if there are any more things to free */ /* RAH 4.19.01, Attempt to free memory that was allocated within this module I have not verified that all the memory has been freed. I've taken only a reasonable effort for now. RAH 4.24.01 - verified that all memory is released. */ void mdef_free_recursive_lc(ph_lc_t * lc) { if (lc == NULL) return; if (lc->rclist) mdef_free_recursive_rc(lc->rclist); if (lc->next) mdef_free_recursive_lc(lc->next); ckd_free((void *) lc); } void mdef_free_recursive_rc(ph_rc_t * rc) { if (rc == NULL) return; if (rc->next) mdef_free_recursive_rc(rc->next); ckd_free((void *) rc); } /* RAH, Free memory that was allocated in mdef_init Rational purify shows that no leaks exist */ void mdef_free(mdef_t * m) { int i, j; if (m) { if (m->sen2cimap) ckd_free((void *) m->sen2cimap); if (m->cd2cisen) ckd_free((void *) m->cd2cisen); /* RAH, go down the ->next list and delete all the pieces */ for (i = 0; i < N_WORD_POSN; i++) for (j = 0; j < m->n_ciphone; j++) if (m->wpos_ci_lclist[i][j]) { mdef_free_recursive_lc(m->wpos_ci_lclist[i][j]->next); mdef_free_recursive_rc(m->wpos_ci_lclist[i][j]-> rclist); } for (i = 0; i < N_WORD_POSN; i++) for (j = 0; j < m->n_ciphone; j++) if (m->wpos_ci_lclist[i][j]) ckd_free((void *) m->wpos_ci_lclist[i][j]); if (m->wpos_ci_lclist) ckd_free_2d((void *) m->wpos_ci_lclist); if (m->sseq) ckd_free_2d((void *) m->sseq); /* Free phone context */ if (m->phone) ckd_free((void *) m->phone); if (m->ciphone_ht) hash_table_free(m->ciphone_ht); for (i = 0; i < m->n_ciphone; i++) { if (m->ciphone[i].name) ckd_free((void *) m->ciphone[i].name); } if (m->ciphone) ckd_free((void *) m->ciphone); ckd_free((void *) m); } } pocketsphinx-5prealpha/src/libpocketsphinx/kws_search.h0000664000175000017500000001056712771605033020713 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2013 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * kws_search.h -- Search structures for keyphrase spotting. */ #ifndef __KWS_SEARCH_H__ #define __KWS_SEARCH_H__ /* SphinxBase headers. */ #include #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "kws_detections.h" #include "hmm.h" /** * Segmentation "iterator" for KWS history. */ typedef struct kws_seg_s { ps_seg_t base; /**< Base structure. */ gnode_t *detection; /**< Keyphrase detection correspondent to segment. */ frame_idx_t last_frame; /**< Last frame to raise the detection */ } kws_seg_t; typedef struct kws_keyphrase_s { char* word; int32 threshold; hmm_t* hmms; int32 n_hmms; } kws_keyphrase_t; /** * Implementation of KWS search structure. */ typedef struct kws_search_s { ps_search_t base; hmm_context_t *hmmctx; /**< HMM context. */ glist_t keyphrases; /**< Keyphrases to spot */ kws_detections_t *detections; /**< Keyword spotting history */ frame_idx_t frame; /**< Frame index */ int32 beam; int32 plp; /**< Phone loop probability */ int32 bestscore; /**< For beam pruning */ int32 def_threshold; /**< default threshold for p(hyp)/p(altern) ratio */ int32 delay; /**< Delay to wait for best detection score */ int32 n_pl; /**< Number of CI phones */ hmm_t *pl_hmms; /**< Phone loop hmms - hmms of CI phones */ ptmr_t perf; /**< Performance counter */ int32 n_tot_frame; } kws_search_t; /** * Create, initialize and return a search module. Gets keyphrases either * from keyphrase or from a keyphrase file. */ ps_search_t *kws_search_init(const char *name, const char *keyphrase, const char *keyfile, cmd_ln_t * config, acmod_t * acmod, dict_t * dict, dict2pid_t * d2p); /** * Deallocate search structure. */ void kws_search_free(ps_search_t * search); /** * Update KWS search module for new key phrase. */ int kws_search_reinit(ps_search_t * kwss, dict_t * dict, dict2pid_t * d2p); /** * Prepare the KWS search structure for beginning decoding of the next * utterance. */ int kws_search_start(ps_search_t * search); /** * Step one frame forward through the Viterbi search. */ int kws_search_step(ps_search_t * search, int frame_idx); /** * Windup and clean the KWS search structure after utterance. */ int kws_search_finish(ps_search_t * search); /** * Get hypothesis string from the KWS search. */ char const *kws_search_hyp(ps_search_t * search, int32 * out_score); /** * Get active keyphrases */ char* kws_search_get_keyphrases(ps_search_t * search); #endif /* __KWS_SEARCH_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/acmod.h0000664000175000017500000004042312771605033017637 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file acmod.h Acoustic model structures for PocketSphinx. * @author David Huggins-Daines */ #ifndef __ACMOD_H__ #define __ACMOD_H__ /* System headers. */ #include /* SphinxBase headers. */ #include #include #include #include #include #include #include /* Local headers. */ #include "ps_mllr.h" #include "bin_mdef.h" #include "tmat.h" #include "hmm.h" /** * States in utterance processing. */ typedef enum acmod_state_e { ACMOD_IDLE, /**< Not in an utterance. */ ACMOD_STARTED, /**< Utterance started, no data yet. */ ACMOD_PROCESSING, /**< Utterance in progress. */ ACMOD_ENDED /**< Utterance ended, still buffering. */ } acmod_state_t; /** * Dummy senone score value for unintentionally active states. */ #define SENSCR_DUMMY 0x7fff /** * Feature space linear transform structure. */ struct ps_mllr_s { int refcnt; /**< Reference count. */ int n_class; /**< Number of MLLR classes. */ int n_feat; /**< Number of feature streams. */ int *veclen; /**< Length of input vectors for each stream. */ float32 ****A; /**< Rotation part of mean transformations. */ float32 ***b; /**< Bias part of mean transformations. */ float32 ***h; /**< Diagonal transformation of variances. */ int32 *cb2mllr; /**< Mapping from codebooks to transformations. */ }; /** * Acoustic model parameter structure. */ typedef struct ps_mgau_s ps_mgau_t; typedef struct ps_mgaufuncs_s { char const *name; int (*frame_eval)(ps_mgau_t *mgau, int16 *senscr, uint8 *senone_active, int32 n_senone_active, mfcc_t ** feat, int32 frame, int32 compallsen); int (*transform)(ps_mgau_t *mgau, ps_mllr_t *mllr); void (*free)(ps_mgau_t *mgau); } ps_mgaufuncs_t; struct ps_mgau_s { ps_mgaufuncs_t *vt; /**< vtable of mgau functions. */ int frame_idx; /**< frame counter. */ }; #define ps_mgau_base(mg) ((ps_mgau_t *)(mg)) #define ps_mgau_frame_eval(mg,senscr,senone_active,n_senone_active,feat,frame,compallsen) \ (*ps_mgau_base(mg)->vt->frame_eval) \ (mg, senscr, senone_active, n_senone_active, feat, frame, compallsen) #define ps_mgau_transform(mg, mllr) \ (*ps_mgau_base(mg)->vt->transform)(mg, mllr) #define ps_mgau_free(mg) \ (*ps_mgau_base(mg)->vt->free)(mg) /** * Acoustic model structure. * * This object encapsulates all stages of acoustic processing, from * raw audio input to acoustic score output. The reason for grouping * all of these modules together is that they all have to "agree" in * their parameterizations, and the configuration of the acoustic and * dynamic feature computation is completely dependent on the * parameters used to build the original acoustic model (which should * by now always be specified in a feat.params file). * * Because there is not a one-to-one correspondence from blocks of * input audio or frames of input features to frames of acoustic * scores (due to dynamic feature calculation), results may not be * immediately available after input, and the output results will not * correspond to the last piece of data input. * * TODO: In addition, this structure serves the purpose of queueing * frames of features (and potentially also scores in the future) for * asynchronous passes of recognition operating in parallel. */ struct acmod_s { /* Global objects, not retained. */ cmd_ln_t *config; /**< Configuration. */ logmath_t *lmath; /**< Log-math computation. */ glist_t strings; /**< Temporary acoustic model filenames. */ /* Feature computation: */ fe_t *fe; /**< Acoustic feature computation. */ feat_t *fcb; /**< Dynamic feature computation. */ /* Model parameters: */ bin_mdef_t *mdef; /**< Model definition. */ tmat_t *tmat; /**< Transition matrices. */ ps_mgau_t *mgau; /**< Model parameters. */ ps_mllr_t *mllr; /**< Speaker transformation. */ /* Senone scoring: */ int16 *senone_scores; /**< GMM scores for current frame. */ bitvec_t *senone_active_vec; /**< Active GMMs in current frame. */ uint8 *senone_active; /**< Array of deltas to active GMMs. */ int senscr_frame; /**< Frame index for senone_scores. */ int n_senone_active; /**< Number of active GMMs. */ int log_zero; /**< Zero log-probability value. */ /* Utterance processing: */ mfcc_t **mfc_buf; /**< Temporary buffer of acoustic features. */ mfcc_t ***feat_buf; /**< Temporary buffer of dynamic features. */ FILE *rawfh; /**< File for writing raw audio data. */ FILE *mfcfh; /**< File for writing acoustic feature data. */ FILE *senfh; /**< File for writing senone score data. */ FILE *insenfh; /**< Input senone score file. */ long *framepos; /**< File positions of recent frames in senone file. */ /* Rawdata collected during decoding */ int16 *rawdata; int32 rawdata_size; int32 rawdata_pos; /* A whole bunch of flags and counters: */ uint8 state; /**< State of utterance processing. */ uint8 compallsen; /**< Compute all senones? */ uint8 grow_feat; /**< Whether to grow feat_buf. */ uint8 insen_swap; /**< Whether to swap input senone score. */ frame_idx_t utt_start_frame; /**< Index of the utterance start in the stream, all timings are relative to that. */ frame_idx_t output_frame; /**< Index of next frame of dynamic features. */ frame_idx_t n_mfc_alloc; /**< Number of frames allocated in mfc_buf */ frame_idx_t n_mfc_frame; /**< Number of frames active in mfc_buf */ frame_idx_t mfc_outidx; /**< Start of active frames in mfc_buf */ frame_idx_t n_feat_alloc; /**< Number of frames allocated in feat_buf */ frame_idx_t n_feat_frame; /**< Number of frames active in feat_buf */ frame_idx_t feat_outidx; /**< Start of active frames in feat_buf */ }; typedef struct acmod_s acmod_t; /** * Initialize an acoustic model. * * @param config a command-line object containing parameters. This * pointer is not retained by this object. * @param lmath global log-math parameters. * @param fe a previously-initialized acoustic feature module to use, * or NULL to create one automatically. If this is supplied * and its parameters do not match those in the acoustic * model, this function will fail. This pointer is not retained. * @param fe a previously-initialized dynamic feature module to use, * or NULL to create one automatically. If this is supplied * and its parameters do not match those in the acoustic * model, this function will fail. This pointer is not retained. * @return a newly initialized acmod_t, or NULL on failure. */ acmod_t *acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb); /** * Adapt acoustic model using a linear transform. * * @param mllr The new transform to use, or NULL to update the existing * transform. The decoder retains ownership of this pointer, * so you should not attempt to free it manually. Use * ps_mllr_retain() if you wish to reuse it * elsewhere. * @return The updated transform object for this decoder, or * NULL on failure. */ ps_mllr_t *acmod_update_mllr(acmod_t *acmod, ps_mllr_t *mllr); /** * Start logging senone scores to a filehandle. * * @param acmod Acoustic model object. * @param logfh Filehandle to log to. * @return 0 for success, <0 on error. */ int acmod_set_senfh(acmod_t *acmod, FILE *senfh); /** * Start logging MFCCs to a filehandle. * * @param acmod Acoustic model object. * @param logfh Filehandle to log to. * @return 0 for success, <0 on error. */ int acmod_set_mfcfh(acmod_t *acmod, FILE *logfh); /** * Start logging raw audio to a filehandle. * * @param acmod Acoustic model object. * @param logfh Filehandle to log to. * @return 0 for success, <0 on error. */ int acmod_set_rawfh(acmod_t *acmod, FILE *logfh); /** * Finalize an acoustic model. */ void acmod_free(acmod_t *acmod); /** * Mark the start of an utterance. */ int acmod_start_utt(acmod_t *acmod); /** * Mark the end of an utterance. */ int acmod_end_utt(acmod_t *acmod); /** * Rewind the current utterance, allowing it to be rescored. * * After calling this function, the internal frame index is reset, and * acmod_score() will return scores starting at the first frame of the * current utterance. Currently, acmod_set_grow() must have been * called to enable growing the feature buffer in order for this to * work. In the future, senone scores may be cached instead. * * @return 0 for success, <0 for failure (if the utterance can't be * rewound due to no feature or score data available) */ int acmod_rewind(acmod_t *acmod); /** * Advance the frame index. * * This function moves to the next frame of input data. Subsequent * calls to acmod_score() will return scores for that frame, until the * next call to acmod_advance(). * * @return New frame index. */ int acmod_advance(acmod_t *acmod); /** * Set memory allocation policy for utterance processing. * * @param grow_feat If non-zero, the internal dynamic feature buffer * will expand as necessary to encompass any amount of data fed to the * model. * @return previous allocation policy. */ int acmod_set_grow(acmod_t *acmod, int grow_feat); /** * TODO: Set queue length for utterance processing. * * This function allows multiple concurrent passes of search to * operate on different parts of the utterance. */ /** * Feed raw audio data to the acoustic model for scoring. * * @param inout_raw In: Pointer to buffer of raw samples * Out: Pointer to next sample to be read * @param inout_n_samps In: Number of samples available * Out: Number of samples remaining * @param full_utt If non-zero, this block represents a full * utterance and should be processed as such. * @return Number of frames of data processed. */ int acmod_process_raw(acmod_t *acmod, int16 const **inout_raw, size_t *inout_n_samps, int full_utt); /** * Feed acoustic feature data into the acoustic model for scoring. * * @param inout_cep In: Pointer to buffer of features * Out: Pointer to next frame to be read * @param inout_n_frames In: Number of frames available * Out: Number of frames remaining * @param full_utt If non-zero, this block represents a full * utterance and should be processed as such. * @return Number of frames of data processed. */ int acmod_process_cep(acmod_t *acmod, mfcc_t ***inout_cep, int *inout_n_frames, int full_utt); /** * Feed dynamic feature data into the acoustic model for scoring. * * Unlike acmod_process_raw() and acmod_process_cep(), this function * accepts a single frame at a time. This is because there is no need * to do buffering when using dynamic features as input. However, if * the dynamic feature buffer is full, this function will fail, so you * should either always check the return value, or always pair a call * to it with a call to acmod_score(). * * @param feat Pointer to one frame of dynamic features. * @return Number of frames processed (either 0 or 1). */ int acmod_process_feat(acmod_t *acmod, mfcc_t **feat); /** * Set up a senone score dump file for input. * * @param insenfh File handle of dump file * @return 0 for success, <0 for failure */ int acmod_set_insenfh(acmod_t *acmod, FILE *insenfh); /** * Read one frame of scores from senone score dump file. * * @return Number of frames read or <0 on error. */ int acmod_read_scores(acmod_t *acmod); /** * Get a frame of dynamic feature data. * * @param inout_frame_idx Input: frame index to get, or NULL * to obtain features for the most recent frame. * Output: frame index corresponding to this * set of features. * @return Feature array, or NULL if requested frame is not available. */ mfcc_t **acmod_get_frame(acmod_t *acmod, int *inout_frame_idx); /** * Score one frame of data. * * @param inout_frame_idx Input: frame index to score, or NULL * to obtain scores for the most recent frame. * Output: frame index corresponding to this * set of scores. * @return Array of senone scores for this frame, or NULL if no frame * is available for scoring (such as if a frame index is * requested that is not yet or no longer available). The * data pointed to persists only until the next call to * acmod_score() or acmod_advance(). */ int16 const *acmod_score(acmod_t *acmod, int *inout_frame_idx); /** * Write senone dump file header. */ int acmod_write_senfh_header(acmod_t *acmod, FILE *logfh); /** * Write a frame of senone scores to a dump file. */ int acmod_write_scores(acmod_t *acmod, int n_active, uint8 const *active, int16 const *senscr, FILE *senfh); /** * Get best score and senone index for current frame. */ int acmod_best_score(acmod_t *acmod, int *out_best_senid); /** * Clear set of active senones. */ void acmod_clear_active(acmod_t *acmod); /** * Activate senones associated with an HMM. */ void acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm); /** * Activate a single senone. */ #define acmod_activate_sen(acmod, sen) bitvec_set((acmod)->senone_active_vec, sen) /** * Build active list from */ int32 acmod_flags2list(acmod_t *acmod); /** * Get the offset of the utterance start of the current stream, helpful for stream-wide timing. */ int32 acmod_stream_offset(acmod_t *acmod); /** * Reset the current stream */ void acmod_start_stream(acmod_t *acmod); /** * Sets the limit of the raw audio data to store */ void acmod_set_rawdata_size(acmod_t *acmod, int32 size); /** * Retrieves the raw data collected during utterance decoding */ void acmod_get_rawdata(acmod_t *acmod, int16 **buffer, int32 *size); #endif /* __ACMOD_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/ps_alignment.c0000664000175000017500000003404612771605033021233 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2010 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ps_alignment.c Multi-level alignment structure */ /* System headers. */ /* SphinxBase headers. */ #include /* Local headers. */ #include "ps_alignment.h" ps_alignment_t * ps_alignment_init(dict2pid_t *d2p) { ps_alignment_t *al = ckd_calloc(1, sizeof(*al)); al->d2p = dict2pid_retain(d2p); return al; } int ps_alignment_free(ps_alignment_t *al) { if (al == NULL) return 0; dict2pid_free(al->d2p); ckd_free(al->word.seq); ckd_free(al->sseq.seq); ckd_free(al->state.seq); ckd_free(al); return 0; } #define VECTOR_GROW 10 static void * vector_grow_one(void *ptr, uint16 *n_alloc, uint16 *n, size_t item_size) { int newsize = *n + 1; if (newsize < *n_alloc) { *n += 1; return ptr; } newsize += VECTOR_GROW; if (newsize > 0xffff) return NULL; ptr = ckd_realloc(ptr, newsize * item_size); *n += 1; *n_alloc = newsize; return ptr; } static ps_alignment_entry_t * ps_alignment_vector_grow_one(ps_alignment_vector_t *vec) { void *ptr; ptr = vector_grow_one(vec->seq, &vec->n_alloc, &vec->n_ent, sizeof(*vec->seq)); if (ptr == NULL) return NULL; vec->seq = ptr; return vec->seq + vec->n_ent - 1; } static void ps_alignment_vector_empty(ps_alignment_vector_t *vec) { vec->n_ent = 0; } int ps_alignment_add_word(ps_alignment_t *al, int32 wid, int duration) { ps_alignment_entry_t *ent; if ((ent = ps_alignment_vector_grow_one(&al->word)) == NULL) return 0; ent->id.wid = wid; if (al->word.n_ent > 1) ent->start = ent[-1].start + ent[-1].duration; else ent->start = 0; ent->duration = duration; ent->score = 0; ent->parent = PS_ALIGNMENT_NONE; ent->child = PS_ALIGNMENT_NONE; return al->word.n_ent; } int ps_alignment_populate(ps_alignment_t *al) { dict2pid_t *d2p; dict_t *dict; bin_mdef_t *mdef; int i, lc; /* Clear phone and state sequences. */ ps_alignment_vector_empty(&al->sseq); ps_alignment_vector_empty(&al->state); /* For each word, expand to phones/senone sequences. */ d2p = al->d2p; dict = d2p->dict; mdef = d2p->mdef; lc = bin_mdef_silphone(mdef); for (i = 0; i < al->word.n_ent; ++i) { ps_alignment_entry_t *went = al->word.seq + i; ps_alignment_entry_t *sent; int wid = went->id.wid; int len = dict_pronlen(dict, wid); int j, rc; if (i < al->word.n_ent - 1) rc = dict_first_phone(dict, al->word.seq[i+1].id.wid); else rc = bin_mdef_silphone(mdef); /* First phone. */ if ((sent = ps_alignment_vector_grow_one(&al->sseq)) == NULL) { E_ERROR("Failed to add phone entry!\n"); return -1; } sent->id.pid.cipid = dict_first_phone(dict, wid); sent->id.pid.tmatid = bin_mdef_pid2tmatid(mdef, sent->id.pid.cipid); sent->start = went->start; sent->duration = went->duration; sent->score = 0; sent->parent = i; went->child = (uint16)(sent - al->sseq.seq); if (len == 1) sent->id.pid.ssid = dict2pid_lrdiph_rc(d2p, sent->id.pid.cipid, lc, rc); else sent->id.pid.ssid = dict2pid_ldiph_lc(d2p, sent->id.pid.cipid, dict_second_phone(dict, wid), lc); assert(sent->id.pid.ssid != BAD_SSID); /* Internal phones. */ for (j = 1; j < len - 1; ++j) { if ((sent = ps_alignment_vector_grow_one(&al->sseq)) == NULL) { E_ERROR("Failed to add phone entry!\n"); return -1; } sent->id.pid.cipid = dict_pron(dict, wid, j); sent->id.pid.tmatid = bin_mdef_pid2tmatid(mdef, sent->id.pid.cipid); sent->id.pid.ssid = dict2pid_internal(d2p, wid, j); assert(sent->id.pid.ssid != BAD_SSID); sent->start = went->start; sent->duration = went->duration; sent->score = 0; sent->parent = i; } /* Last phone. */ if (j < len) { xwdssid_t *rssid; assert(j == len - 1); if ((sent = ps_alignment_vector_grow_one(&al->sseq)) == NULL) { E_ERROR("Failed to add phone entry!\n"); return -1; } sent->id.pid.cipid = dict_last_phone(dict, wid); sent->id.pid.tmatid = bin_mdef_pid2tmatid(mdef, sent->id.pid.cipid); rssid = dict2pid_rssid(d2p, sent->id.pid.cipid, dict_second_last_phone(dict, wid)); sent->id.pid.ssid = rssid->ssid[rssid->cimap[rc]]; assert(sent->id.pid.ssid != BAD_SSID); sent->start = went->start; sent->duration = went->duration; sent->score = 0; sent->parent = i; } /* Update lc. Could just use sent->id.pid.cipid here but that * seems needlessly obscure. */ lc = dict_last_phone(dict, wid); } /* For each senone sequence, expand to senones. (we could do this * nested above but this makes it more clear and easier to * refactor) */ for (i = 0; i < al->sseq.n_ent; ++i) { ps_alignment_entry_t *pent = al->sseq.seq + i; ps_alignment_entry_t *sent; int j; for (j = 0; j < bin_mdef_n_emit_state(mdef); ++j) { if ((sent = ps_alignment_vector_grow_one(&al->state)) == NULL) { E_ERROR("Failed to add state entry!\n"); return -1; } sent->id.senid = bin_mdef_sseq2sen(mdef, pent->id.pid.ssid, j); assert(sent->id.senid != BAD_SENID); sent->start = pent->start; sent->duration = pent->duration; sent->score = 0; sent->parent = i; if (j == 0) pent->child = (uint16)(sent - al->state.seq); } } return 0; } /* FIXME: Somewhat the same as the above function, needs refactoring */ int ps_alignment_populate_ci(ps_alignment_t *al) { dict2pid_t *d2p; dict_t *dict; bin_mdef_t *mdef; int i; /* Clear phone and state sequences. */ ps_alignment_vector_empty(&al->sseq); ps_alignment_vector_empty(&al->state); /* For each word, expand to phones/senone sequences. */ d2p = al->d2p; dict = d2p->dict; mdef = d2p->mdef; for (i = 0; i < al->word.n_ent; ++i) { ps_alignment_entry_t *went = al->word.seq + i; ps_alignment_entry_t *sent; int wid = went->id.wid; int len = dict_pronlen(dict, wid); int j; for (j = 0; j < len; ++j) { if ((sent = ps_alignment_vector_grow_one(&al->sseq)) == NULL) { E_ERROR("Failed to add phone entry!\n"); return -1; } sent->id.pid.cipid = dict_pron(dict, wid, j); sent->id.pid.tmatid = bin_mdef_pid2tmatid(mdef, sent->id.pid.cipid); sent->id.pid.ssid = bin_mdef_pid2ssid(mdef, sent->id.pid.cipid); assert(sent->id.pid.ssid != BAD_SSID); sent->start = went->start; sent->duration = went->duration; sent->score = 0; sent->parent = i; } } /* For each senone sequence, expand to senones. (we could do this * nested above but this makes it more clear and easier to * refactor) */ for (i = 0; i < al->sseq.n_ent; ++i) { ps_alignment_entry_t *pent = al->sseq.seq + i; ps_alignment_entry_t *sent; int j; for (j = 0; j < bin_mdef_n_emit_state(mdef); ++j) { if ((sent = ps_alignment_vector_grow_one(&al->state)) == NULL) { E_ERROR("Failed to add state entry!\n"); return -1; } sent->id.senid = bin_mdef_sseq2sen(mdef, pent->id.pid.ssid, j); assert(sent->id.senid != BAD_SENID); sent->start = pent->start; sent->duration = pent->duration; sent->score = 0; sent->parent = i; if (j == 0) pent->child = (uint16)(sent - al->state.seq); } } return 0; } int ps_alignment_propagate(ps_alignment_t *al) { ps_alignment_entry_t *last_ent = NULL; int i; /* Propagate duration up from states to phones. */ for (i = 0; i < al->state.n_ent; ++i) { ps_alignment_entry_t *sent = al->state.seq + i; ps_alignment_entry_t *pent = al->sseq.seq + sent->parent; if (pent != last_ent) { pent->start = sent->start; pent->duration = 0; pent->score = 0; } pent->duration += sent->duration; pent->score += sent->score; last_ent = pent; } /* Propagate duration up from phones to words. */ last_ent = NULL; for (i = 0; i < al->sseq.n_ent; ++i) { ps_alignment_entry_t *pent = al->sseq.seq + i; ps_alignment_entry_t *went = al->word.seq + pent->parent; if (went != last_ent) { went->start = pent->start; went->duration = 0; went->score = 0; } went->duration += pent->duration; went->score += pent->score; last_ent = went; } return 0; } int ps_alignment_n_words(ps_alignment_t *al) { return (int)al->word.n_ent; } int ps_alignment_n_phones(ps_alignment_t *al) { return (int)al->sseq.n_ent; } int ps_alignment_n_states(ps_alignment_t *al) { return (int)al->state.n_ent; } ps_alignment_iter_t * ps_alignment_words(ps_alignment_t *al) { ps_alignment_iter_t *itor; if (al->word.n_ent == 0) return NULL; itor = ckd_calloc(1, sizeof(*itor)); itor->al = al; itor->vec = &al->word; itor->pos = 0; return itor; } ps_alignment_iter_t * ps_alignment_phones(ps_alignment_t *al) { ps_alignment_iter_t *itor; if (al->sseq.n_ent == 0) return NULL; itor = ckd_calloc(1, sizeof(*itor)); itor->al = al; itor->vec = &al->sseq; itor->pos = 0; return itor; } ps_alignment_iter_t * ps_alignment_states(ps_alignment_t *al) { ps_alignment_iter_t *itor; if (al->state.n_ent == 0) return NULL; itor = ckd_calloc(1, sizeof(*itor)); itor->al = al; itor->vec = &al->state; itor->pos = 0; return itor; } ps_alignment_entry_t * ps_alignment_iter_get(ps_alignment_iter_t *itor) { return itor->vec->seq + itor->pos; } int ps_alignment_iter_free(ps_alignment_iter_t *itor) { ckd_free(itor); return 0; } ps_alignment_iter_t * ps_alignment_iter_goto(ps_alignment_iter_t *itor, int pos) { if (itor == NULL) return NULL; if (pos >= itor->vec->n_ent) { ps_alignment_iter_free(itor); return NULL; } itor->pos = pos; return itor; } ps_alignment_iter_t * ps_alignment_iter_next(ps_alignment_iter_t *itor) { if (itor == NULL) return NULL; if (++itor->pos >= itor->vec->n_ent) { ps_alignment_iter_free(itor); return NULL; } return itor; } ps_alignment_iter_t * ps_alignment_iter_prev(ps_alignment_iter_t *itor) { if (itor == NULL) return NULL; if (--itor->pos < 0) { ps_alignment_iter_free(itor); return NULL; } return itor; } ps_alignment_iter_t * ps_alignment_iter_up(ps_alignment_iter_t *itor) { ps_alignment_iter_t *itor2; if (itor == NULL) return NULL; if (itor->vec == &itor->al->word) return NULL; if (itor->vec->seq[itor->pos].parent == PS_ALIGNMENT_NONE) return NULL; itor2 = ckd_calloc(1, sizeof(*itor2)); itor2->al = itor->al; itor2->pos = itor->vec->seq[itor->pos].parent; if (itor->vec == &itor->al->sseq) itor2->vec = &itor->al->word; else itor2->vec = &itor->al->sseq; return itor2; } ps_alignment_iter_t * ps_alignment_iter_down(ps_alignment_iter_t *itor) { ps_alignment_iter_t *itor2; if (itor == NULL) return NULL; if (itor->vec == &itor->al->state) return NULL; if (itor->vec->seq[itor->pos].child == PS_ALIGNMENT_NONE) return NULL; itor2 = ckd_calloc(1, sizeof(*itor2)); itor2->al = itor->al; itor2->pos = itor->vec->seq[itor->pos].child; if (itor->vec == &itor->al->word) itor2->vec = &itor->al->sseq; else itor2->vec = &itor->al->state; return itor2; } pocketsphinx-5prealpha/src/libpocketsphinx/state_align_search.h0000664000175000017500000000643712771605033022402 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2010 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file state_align_search.h State (and phone and word) alignment search. */ #ifndef __STATE_ALIGN_SEARCH_H__ #define __STATE_ALIGN_SEARCH_H__ /* SphinxBase headers. */ #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "ps_alignment.h" #include "hmm.h" /** * History structure */ struct state_align_hist_s { uint16 id; int32 score; }; typedef struct state_align_hist_s state_align_hist_t; /** * Phone loop search structure. */ struct state_align_search_s { ps_search_t base; /**< Base search structure. */ hmm_context_t *hmmctx; /**< HMM context structure. */ ps_alignment_t *al; /**< Alignment structure being operated on. */ hmm_t *hmms; /**< Vector of HMMs corresponding to phone level. */ int n_phones; /**< Number of HMMs (phones). */ int frame; /**< Current frame being processed. */ int32 best_score; /**< Best score in current frame. */ int n_emit_state; /**< Number of emitting states (tokens per frame) */ state_align_hist_t *tokens; /**< Tokens (backpointers) for state alignment. */ int n_fr_alloc; /**< Number of frames of tokens allocated. */ }; typedef struct state_align_search_s state_align_search_t; ps_search_t *state_align_search_init(const char *name, cmd_ln_t *config, acmod_t *acmod, ps_alignment_t *al); #endif /* __STATE_ALIGN_SEARCH_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/hmm.h0000664000175000017500000002433212771605033017336 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file hmm.h Hidden Markov Model base structures. */ #ifndef __HMM_H__ #define __HMM_H__ /* System headers. */ #include /* SphinxBase headers. */ #include #include /* PocketSphinx headers. */ #include "bin_mdef.h" #ifdef __cplusplus extern "C" { #endif /** * Type for frame index values. Used in HMM indexes and * backpointers and affects memory required.Due to limitations of FSG * search implementation this value needs to be signed. */ typedef int32 frame_idx_t; /** * Maximum number of frames in index, should be in sync with above. */ #define MAX_N_FRAMES MAX_INT32 /** Shift count for senone scores. */ #define SENSCR_SHIFT 10 /** * Large "bad" score. * * This number must be "bad" enough so that 4 times WORST_SCORE will * not overflow. The reason for this is that the search doesn't check * the scores in a model before evaluating the model and it may * require as many was 4 plies before the new 'good' score can wipe * out the initial WORST_SCORE initialization. */ #define WORST_SCORE ((int)0xE0000000) /** * Watch out, though! Transition matrix entries that are supposed to * be "zero" don't actually get that small due to quantization. */ #define TMAT_WORST_SCORE (-255) /** * Is one score better than another? */ #define BETTER_THAN > /** * Is one score worse than another? */ #define WORSE_THAN < /** \file hmm.h * \brief HMM data structure and operation * * For efficiency, this version is hardwired for two possible HMM * topologies, but will fall back to others: * * 5-state left-to-right HMMs: (0 is the *emitting* entry state and E * is a non-emitting exit state; the x's indicate allowed transitions * between source and destination states): * *
 *               0   1   2   3   4   E (destination-states)
 *           0   x   x   x
 *           1       x   x   x
 *           2           x   x   x
 *           3               x   x   x
 *           4                   x   x
 *    (source-states)
 * 
* * 5-state topologies that contain a subset of the above transitions should work as well. * * 3-state left-to-right HMMs (similar notation as the 5-state topology above): * *
 *               0   1   2   E (destination-states)
 *           0   x   x   x
 *           1       x   x   x
 *           2           x   x 
 *    (source-states)
 * 
* * 3-state topologies that contain a subset of the above transitions should work as well. */ /** * @struct hmm_context_t * @brief Shared information between a set of HMMs. * * We assume that the initial state is emitting and that the * transition matrix is n_emit_state x (n_emit_state+1), where the * extra destination dimension correponds to the non-emitting final or * exit state. */ typedef struct hmm_context_s { int32 n_emit_state; /**< Number of emitting states in this set of HMMs. */ uint8 ** const *tp; /**< State transition scores tp[id][from][to] (logs3 values). */ int16 const *senscore; /**< State emission scores senscore[senid] (negated scaled logs3 values). */ uint16 * const *sseq; /**< Senone sequence mapping. */ int32 *st_sen_scr; /**< Temporary array of senone scores (for some topologies). */ listelem_alloc_t *mpx_ssid_alloc; /**< Allocator for senone sequence ID arrays. */ void *udata; /**< Whatever you feel like, gosh. */ } hmm_context_t; /** * Hard-coded limit on the number of emitting states. */ #define HMM_MAX_NSTATE 5 /** * @struct hmm_t * @brief An individual HMM among the HMM search space. * * An individual HMM among the HMM search space. An HMM with N * emitting states consists of N+1 internal states including the * non-emitting exit (out) state. */ typedef struct hmm_s { hmm_context_t *ctx; /**< Shared context data for this HMM. */ int32 score[HMM_MAX_NSTATE]; /**< State scores for emitting states. */ int32 history[HMM_MAX_NSTATE]; /**< History indices for emitting states. */ int32 out_score; /**< Score for non-emitting exit state. */ int32 out_history; /**< History index for non-emitting exit state. */ uint16 ssid; /**< Senone sequence ID (for non-MPX) */ uint16 senid[HMM_MAX_NSTATE]; /**< Senone IDs (non-MPX) or sequence IDs (MPX) */ int32 bestscore; /**< Best [emitting] state score in current frame (for pruning). */ int16 tmatid; /**< Transition matrix ID (see hmm_context_t). */ frame_idx_t frame; /**< Frame in which this HMM was last active; <0 if inactive */ uint8 mpx; /**< Is this HMM multiplex? (hoisted for speed) */ uint8 n_emit_state; /**< Number of emitting states (hoisted for speed) */ } hmm_t; /** Access macros. */ #define hmm_context(h) (h)->ctx #define hmm_is_mpx(h) (h)->mpx #define hmm_in_score(h) (h)->score[0] #define hmm_score(h,st) (h)->score[st] #define hmm_out_score(h) (h)->out_score #define hmm_in_history(h) (h)->history[0] #define hmm_history(h,st) (h)->history[st] #define hmm_out_history(h) (h)->out_history #define hmm_bestscore(h) (h)->bestscore #define hmm_frame(h) (h)->frame #define hmm_mpx_ssid(h,st) (h)->senid[st] #define hmm_nonmpx_ssid(h) (h)->ssid #define hmm_ssid(h,st) (hmm_is_mpx(h) \ ? hmm_mpx_ssid(h,st) : hmm_nonmpx_ssid(h)) #define hmm_mpx_senid(h,st) (hmm_mpx_ssid(h,st) == BAD_SENID \ ? BAD_SENID : (h)->ctx->sseq[hmm_mpx_ssid(h,st)][st]) #define hmm_nonmpx_senid(h,st) ((h)->senid[st]) #define hmm_senid(h,st) (hmm_is_mpx(h) \ ? hmm_mpx_senid(h,st) : hmm_nonmpx_senid(h,st)) #define hmm_senscr(h,st) (hmm_senid(h,st) == BAD_SENID \ ? WORST_SCORE \ : -(h)->ctx->senscore[hmm_senid(h,st)]) #define hmm_tmatid(h) (h)->tmatid #define hmm_tprob(h,i,j) (-(h)->ctx->tp[hmm_tmatid(h)][i][j]) #define hmm_n_emit_state(h) ((h)->n_emit_state) #define hmm_n_state(h) ((h)->n_emit_state + 1) /** * Create an HMM context. **/ hmm_context_t *hmm_context_init(int32 n_emit_state, uint8 ** const *tp, int16 const *senscore, uint16 * const *sseq); /** * Change the senone score array for a context. **/ #define hmm_context_set_senscore(ctx, senscr) ((ctx)->senscore = (senscr)) /** * Free an HMM context. * * @note The transition matrices, senone scores, and senone sequence * mapping are all assumed to be allocated externally, and will NOT be * freed by this function. **/ void hmm_context_free(hmm_context_t *ctx); /** * Populate a previously-allocated HMM structure, allocating internal data. **/ void hmm_init(hmm_context_t *ctx, hmm_t *hmm, int mpx, int ssid, int tmatid); /** * Free an HMM structure, releasing internal data (but not the HMM structure itself). */ void hmm_deinit(hmm_t *hmm); /** * Reset the states of the HMM to the invalid condition. * i.e., scores to WORST_SCORE and hist to undefined. */ void hmm_clear(hmm_t *h); /** * Reset the scores of the HMM. */ void hmm_clear_scores(hmm_t *h); /** * Renormalize the scores in this HMM based on the given best score. */ void hmm_normalize(hmm_t *h, int32 bestscr); /** * Enter an HMM with the given path score and history ID. **/ void hmm_enter(hmm_t *h, int32 score, int32 histid, int frame); /** * Viterbi evaluation of given HMM. * * @note If this module were being used for tracking state * segmentations, the dummy, non-emitting exit state would have to be * updated separately. In the Viterbi DP diagram, transitions to the * exit state occur from the current time; they are vertical * transitions. Hence they should be made only after the history has * been logged for the emitting states. But we're not bothered with * state segmentations, for now. So, we update the exit state as * well. */ int32 hmm_vit_eval(hmm_t *hmm); /** * Like hmm_vit_eval, but dump HMM state and relevant senscr to fp first, for debugging;. */ int32 hmm_dump_vit_eval(hmm_t *hmm, /**< In/Out: HMM being updated */ FILE *fp /**< An output file pointer */ ); /** * For debugging, dump the whole HMM out. */ void hmm_dump(hmm_t *h, /**< In/Out: HMM being updated */ FILE *fp /**< An output file pointer */ ); #ifdef __cplusplus } #endif #endif /* __HMM_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/ms_mgau.c0000664000175000017500000002124712771605033020202 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * ms_mgau.c -- Essentially a wrapper that wrap up gauden and * senone. It supports multi-stream. * * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1997 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** * HISTORY * $Log$ * Revision 1.2 2006/02/22 16:56:01 arthchan2003 * Merged from SPHINX3_5_2_RCI_IRII_BRANCH: Added ms_mgau.[ch] into the trunk. It is a wrapper of ms_gauden and ms_senone * * Revision 1.1.2.4 2005/09/25 18:55:19 arthchan2003 * Added a flag to turn on and off precomputation. * * Revision 1.1.2.3 2005/08/03 18:53:44 dhdfu * Add memory deallocation functions. Also move all the initialization * of ms_mgau_model_t into ms_mgau_init (duh!), which entails removing it * from decode_anytopo and friends. * * Revision 1.1.2.2 2005/08/02 21:05:38 arthchan2003 * 1, Added dist and mgau_active as intermediate variable for computation. 2, Added ms_cont_mgau_frame_eval, which is a multi stream version of GMM computation mainly s3.0 family of tools. 3, Fixed dox-doc. * * Revision 1.1.2.1 2005/07/20 19:37:09 arthchan2003 * Added a multi-stream cont_mgau (ms_mgau) which is a wrapper of both gauden and senone. Add ms_mgau_init and model_set_mllr. This allow eliminating 600 lines of code in decode_anytopo/align/allphone. * * * */ /* Local headers. */ #include "ms_mgau.h" static ps_mgaufuncs_t ms_mgau_funcs = { "ms", ms_cont_mgau_frame_eval, /* frame_eval */ ms_mgau_mllr_transform, /* transform */ ms_mgau_free /* free */ }; ps_mgau_t * ms_mgau_init(acmod_t *acmod, logmath_t *lmath, bin_mdef_t *mdef) { /* Codebooks */ ms_mgau_model_t *msg; ps_mgau_t *mg; gauden_t *g; senone_t *s; cmd_ln_t *config; int i; config = acmod->config; msg = (ms_mgau_model_t *) ckd_calloc(1, sizeof(ms_mgau_model_t)); msg->config = config; msg->g = NULL; msg->s = NULL; if ((g = msg->g = gauden_init(cmd_ln_str_r(config, "_mean"), cmd_ln_str_r(config, "_var"), cmd_ln_float32_r(config, "-varfloor"), lmath)) == NULL) { E_ERROR("Failed to read means and variances\n"); goto error_out; } /* Verify n_feat and veclen, against acmod. */ if (g->n_feat != feat_dimension1(acmod->fcb)) { E_ERROR("Number of streams does not match: %d != %d\n", g->n_feat, feat_dimension1(acmod->fcb)); goto error_out; } for (i = 0; i < g->n_feat; ++i) { if (g->featlen[i] != feat_dimension2(acmod->fcb, i)) { E_ERROR("Dimension of stream %d does not match: %d != %d\n", i, g->featlen[i], feat_dimension2(acmod->fcb, i)); goto error_out; } } s = msg->s = senone_init(msg->g, cmd_ln_str_r(config, "_mixw"), cmd_ln_str_r(config, "_senmgau"), cmd_ln_float32_r(config, "-mixwfloor"), lmath, mdef); s->aw = cmd_ln_int32_r(config, "-aw"); /* Verify senone parameters against gauden parameters */ if (s->n_feat != g->n_feat) E_FATAL("#Feature mismatch: gauden= %d, senone= %d\n", g->n_feat, s->n_feat); if (s->n_cw != g->n_density) E_FATAL("#Densities mismatch: gauden= %d, senone= %d\n", g->n_density, s->n_cw); if (s->n_gauden > g->n_mgau) E_FATAL("Senones need more codebooks (%d) than present (%d)\n", s->n_gauden, g->n_mgau); if (s->n_gauden < g->n_mgau) E_ERROR("Senones use fewer codebooks (%d) than present (%d)\n", s->n_gauden, g->n_mgau); msg->topn = cmd_ln_int32_r(config, "-topn"); E_INFO("The value of topn: %d\n", msg->topn); if (msg->topn == 0 || msg->topn > msg->g->n_density) { E_WARN ("-topn argument (%d) invalid or > #density codewords (%d); set to latter\n", msg->topn, msg->g->n_density); msg->topn = msg->g->n_density; } msg->dist = (gauden_dist_t ***) ckd_calloc_3d(g->n_mgau, g->n_feat, msg->topn, sizeof(gauden_dist_t)); msg->mgau_active = ckd_calloc(g->n_mgau, sizeof(int8)); mg = (ps_mgau_t *)msg; mg->vt = &ms_mgau_funcs; return mg; error_out: ms_mgau_free(ps_mgau_base(msg)); return NULL; } void ms_mgau_free(ps_mgau_t * mg) { ms_mgau_model_t *msg = (ms_mgau_model_t *)mg; if (msg == NULL) return; if (msg->g) gauden_free(msg->g); if (msg->s) senone_free(msg->s); if (msg->dist) ckd_free_3d((void *) msg->dist); if (msg->mgau_active) ckd_free(msg->mgau_active); ckd_free(msg); } int ms_mgau_mllr_transform(ps_mgau_t *s, ps_mllr_t *mllr) { ms_mgau_model_t *msg = (ms_mgau_model_t *)s; return gauden_mllr_transform(msg->g, mllr, msg->config); } int32 ms_cont_mgau_frame_eval(ps_mgau_t * mg, int16 *senscr, uint8 *senone_active, int32 n_senone_active, mfcc_t ** feat, int32 frame, int32 compallsen) { ms_mgau_model_t *msg = (ms_mgau_model_t *)mg; int32 gid; int32 topn; int32 best; gauden_t *g; senone_t *sen; topn = ms_mgau_topn(msg); g = ms_mgau_gauden(msg); sen = ms_mgau_senone(msg); if (compallsen) { int32 s; for (gid = 0; gid < g->n_mgau; gid++) gauden_dist(g, gid, topn, feat, msg->dist[gid]); best = (int32) 0x7fffffff; for (s = 0; s < sen->n_sen; s++) { senscr[s] = senone_eval(sen, s, msg->dist[sen->mgau[s]], topn); if (best > senscr[s]) { best = senscr[s]; } } /* Normalize senone scores */ for (s = 0; s < sen->n_sen; s++) { int32 bs = senscr[s] - best; if (bs > 32767) bs = 32767; if (bs < -32768) bs = -32768; senscr[s] = bs; } } else { int32 i, n; /* Flag all active mixture-gaussian codebooks */ for (gid = 0; gid < g->n_mgau; gid++) msg->mgau_active[gid] = 0; n = 0; for (i = 0; i < n_senone_active; i++) { /* senone_active consists of deltas. */ int32 s = senone_active[i] + n; msg->mgau_active[sen->mgau[s]] = 1; n = s; } /* Compute topn gaussian density values (for active codebooks) */ for (gid = 0; gid < g->n_mgau; gid++) { if (msg->mgau_active[gid]) gauden_dist(g, gid, topn, feat, msg->dist[gid]); } best = (int32) 0x7fffffff; n = 0; for (i = 0; i < n_senone_active; i++) { int32 s = senone_active[i] + n; senscr[s] = senone_eval(sen, s, msg->dist[sen->mgau[s]], topn); if (best > senscr[s]) { best = senscr[s]; } n = s; } /* Normalize senone scores */ n = 0; for (i = 0; i < n_senone_active; i++) { int32 s = senone_active[i] + n; int32 bs = senscr[s] - best; if (bs > 32767) bs = 32767; if (bs < -32768) bs = -32768; senscr[s] = bs; n = s; } } return 0; } pocketsphinx-5prealpha/src/libpocketsphinx/fsg_search.c0000664000175000017500000014030712771605033020655 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * fsg_search.c -- Search structures for FSM decoding. * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 2004 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** * * HISTORY * * 18-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon * Started. */ /* System headers. */ #include #include #include /* SphinxBase headers. */ #include #include #include #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "ps_lattice_internal.h" #include "fsg_search_internal.h" #include "fsg_history.h" #include "fsg_lextree.h" /* Turn this on for detailed debugging dump */ #define __FSG_DBG__ 0 #define __FSG_DBG_CHAN__ 0 static ps_seg_t *fsg_search_seg_iter(ps_search_t *search); static ps_lattice_t *fsg_search_lattice(ps_search_t *search); static int fsg_search_prob(ps_search_t *search); static ps_searchfuncs_t fsg_funcs = { /* start: */ fsg_search_start, /* step: */ fsg_search_step, /* finish: */ fsg_search_finish, /* reinit: */ fsg_search_reinit, /* free: */ fsg_search_free, /* lattice: */ fsg_search_lattice, /* hyp: */ fsg_search_hyp, /* prob: */ fsg_search_prob, /* seg_iter: */ fsg_search_seg_iter, }; static int fsg_search_add_silences(fsg_search_t *fsgs, fsg_model_t *fsg) { dict_t *dict; int32 wid; int n_sil; dict = ps_search_dict(fsgs); /* * NOTE: Unlike N-Gram search, we do not use explicit start and * end symbols. This is because the start and end nodes are * defined in the grammar. We do add silence/filler self-loops to * all states in order to allow for silence between words and at * the beginning and end of utterances. * * This has some implications for word graph generation, namely, * that there can (and usually will) be multiple start and end * states in the word graph. We therefore do add explicit start * and end nodes to the graph. */ /* Add silence self-loops to all states. */ fsg_model_add_silence(fsg, "", -1, cmd_ln_float32_r(ps_search_config(fsgs), "-silprob")); n_sil = 0; /* Add self-loops for all other fillers. */ for (wid = dict_filler_start(dict); wid < dict_filler_end(dict); ++wid) { char const *word = dict_wordstr(dict, wid); if (wid == dict_startwid(dict) || wid == dict_finishwid(dict)) continue; fsg_model_add_silence(fsg, word, -1, cmd_ln_float32_r(ps_search_config(fsgs), "-fillprob")); ++n_sil; } return n_sil; } /* Scans the dictionary and check if all words are present. */ static int fsg_search_check_dict(fsg_search_t *fsgs, fsg_model_t *fsg) { dict_t *dict; int i; dict = ps_search_dict(fsgs); for (i = 0; i < fsg_model_n_word(fsg); ++i) { char const *word; int32 wid; word = fsg_model_word_str(fsg, i); wid = dict_wordid(dict, word); if (wid == BAD_S3WID) { E_ERROR("The word '%s' is missing in the dictionary\n", word); return FALSE; } } return TRUE; } static int fsg_search_add_altpron(fsg_search_t *fsgs, fsg_model_t *fsg) { dict_t *dict; int n_alt, n_word; int i; dict = ps_search_dict(fsgs); /* Scan FSG's vocabulary for words that have alternate pronunciations. */ n_alt = 0; n_word = fsg_model_n_word(fsg); for (i = 0; i < n_word; ++i) { char const *word; int32 wid; word = fsg_model_word_str(fsg, i); wid = dict_wordid(dict, word); if (wid != BAD_S3WID) { while ((wid = dict_nextalt(dict, wid)) != BAD_S3WID) { n_alt += fsg_model_add_alt(fsg, word, dict_wordstr(dict, wid)); } } } E_INFO("Added %d alternate word transitions\n", n_alt); return n_alt; } ps_search_t * fsg_search_init(const char *name, fsg_model_t *fsg, cmd_ln_t *config, acmod_t *acmod, dict_t *dict, dict2pid_t *d2p) { fsg_search_t *fsgs = ckd_calloc(1, sizeof(*fsgs)); ps_search_init(ps_search_base(fsgs), &fsg_funcs, PS_SEARCH_TYPE_FSG, name, config, acmod, dict, d2p); fsgs->fsg = fsg_model_retain(fsg); /* Initialize HMM context. */ fsgs->hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->mdef), acmod->tmat->tp, NULL, acmod->mdef->sseq); if (fsgs->hmmctx == NULL) { ps_search_free(ps_search_base(fsgs)); return NULL; } /* Intialize the search history object */ fsgs->history = fsg_history_init(NULL, dict); fsgs->frame = -1; /* Get search pruning parameters */ fsgs->beam_factor = 1.0f; fsgs->beam = fsgs->beam_orig = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-beam")) >> SENSCR_SHIFT; fsgs->pbeam = fsgs->pbeam_orig = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pbeam")) >> SENSCR_SHIFT; fsgs->wbeam = fsgs->wbeam_orig = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-wbeam")) >> SENSCR_SHIFT; /* LM related weights/penalties */ fsgs->lw = cmd_ln_float32_r(config, "-lw"); fsgs->pip = (int32) (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pip")) * fsgs->lw) >> SENSCR_SHIFT; fsgs->wip = (int32) (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-wip")) * fsgs->lw) >> SENSCR_SHIFT; /* Acoustic score scale for posterior probabilities. */ fsgs->ascale = 1.0 / cmd_ln_float32_r(config, "-ascale"); E_INFO("FSG(beam: %d, pbeam: %d, wbeam: %d; wip: %d, pip: %d)\n", fsgs->beam_orig, fsgs->pbeam_orig, fsgs->wbeam_orig, fsgs->wip, fsgs->pip); if (!fsg_search_check_dict(fsgs, fsg)) { fsg_search_free(ps_search_base(fsgs)); return NULL; } if (cmd_ln_boolean_r(config, "-fsgusefiller") && !fsg_model_has_sil(fsg)) fsg_search_add_silences(fsgs, fsg); if (cmd_ln_boolean_r(config, "-fsgusealtpron") && !fsg_model_has_alt(fsg)) fsg_search_add_altpron(fsgs, fsg); if (fsg_search_reinit(ps_search_base(fsgs), ps_search_dict(fsgs), ps_search_dict2pid(fsgs)) < 0) { ps_search_free(ps_search_base(fsgs)); return NULL; } ptmr_init(&fsgs->perf); return ps_search_base(fsgs); } void fsg_search_free(ps_search_t *search) { fsg_search_t *fsgs = (fsg_search_t *)search; double n_speech = (double)fsgs->n_tot_frame / cmd_ln_int32_r(ps_search_config(fsgs), "-frate"); E_INFO("TOTAL fsg %.2f CPU %.3f xRT\n", fsgs->perf.t_tot_cpu, fsgs->perf.t_tot_cpu / n_speech); E_INFO("TOTAL fsg %.2f wall %.3f xRT\n", fsgs->perf.t_tot_elapsed, fsgs->perf.t_tot_elapsed / n_speech); ps_search_base_free(search); fsg_lextree_free(fsgs->lextree); if (fsgs->history) { fsg_history_reset(fsgs->history); fsg_history_set_fsg(fsgs->history, NULL, NULL); fsg_history_free(fsgs->history); } hmm_context_free(fsgs->hmmctx); fsg_model_free(fsgs->fsg); ckd_free(fsgs); } int fsg_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) { fsg_search_t *fsgs = (fsg_search_t *)search; /* Free the old lextree */ if (fsgs->lextree) fsg_lextree_free(fsgs->lextree); /* Free old dict2pid, dict */ ps_search_base_reinit(search, dict, d2p); /* Update the number of words (not used by this module though). */ search->n_words = dict_size(dict); /* Allocate new lextree for the given FSG */ fsgs->lextree = fsg_lextree_init(fsgs->fsg, dict, d2p, ps_search_acmod(fsgs)->mdef, fsgs->hmmctx, fsgs->wip, fsgs->pip); /* Inform the history module of the new fsg */ fsg_history_set_fsg(fsgs->history, fsgs->fsg, dict); return 0; } static void fsg_search_sen_active(fsg_search_t *fsgs) { gnode_t *gn; fsg_pnode_t *pnode; hmm_t *hmm; acmod_clear_active(ps_search_acmod(fsgs)); for (gn = fsgs->pnode_active; gn; gn = gnode_next(gn)) { pnode = (fsg_pnode_t *) gnode_ptr(gn); hmm = fsg_pnode_hmmptr(pnode); assert(hmm_frame(hmm) == fsgs->frame); acmod_activate_hmm(ps_search_acmod(fsgs), hmm); } } /* * Evaluate all the active HMMs. * (Executed once per frame.) */ static void fsg_search_hmm_eval(fsg_search_t *fsgs) { gnode_t *gn; fsg_pnode_t *pnode; hmm_t *hmm; int32 bestscore; int32 n, maxhmmpf; bestscore = WORST_SCORE; if (!fsgs->pnode_active) { E_ERROR("Frame %d: No active HMM!!\n", fsgs->frame); return; } for (n = 0, gn = fsgs->pnode_active; gn; gn = gnode_next(gn), n++) { int32 score; pnode = (fsg_pnode_t *) gnode_ptr(gn); hmm = fsg_pnode_hmmptr(pnode); assert(hmm_frame(hmm) == fsgs->frame); #if __FSG_DBG__ E_INFO("pnode(%08x) active @frm %5d\n", (int32) pnode, fsgs->frame); hmm_dump(hmm, stdout); #endif score = hmm_vit_eval(hmm); #if __FSG_DBG_CHAN__ E_INFO("pnode(%08x) after eval @frm %5d\n", (int32) pnode, fsgs->frame); hmm_dump(hmm, stdout); #endif if (score BETTER_THAN bestscore) bestscore = score; } #if __FSG_DBG__ E_INFO("[%5d] %6d HMM; bestscr: %11d\n", fsgs->frame, n, bestscore); #endif fsgs->n_hmm_eval += n; /* Adjust beams if #active HMMs larger than absolute threshold */ maxhmmpf = cmd_ln_int32_r(ps_search_config(fsgs), "-maxhmmpf"); if (maxhmmpf != -1 && n > maxhmmpf) { /* * Too many HMMs active; reduce the beam factor applied to the default * beams, but not if the factor is already at a floor (0.1). */ if (fsgs->beam_factor > 0.1) { /* Hack!! Hardwired constant 0.1 */ fsgs->beam_factor *= 0.9f; /* Hack!! Hardwired constant 0.9 */ fsgs->beam = (int32) (fsgs->beam_orig * fsgs->beam_factor); fsgs->pbeam = (int32) (fsgs->pbeam_orig * fsgs->beam_factor); fsgs->wbeam = (int32) (fsgs->wbeam_orig * fsgs->beam_factor); } } else { fsgs->beam_factor = 1.0f; fsgs->beam = fsgs->beam_orig; fsgs->pbeam = fsgs->pbeam_orig; fsgs->wbeam = fsgs->wbeam_orig; } if (n > fsg_lextree_n_pnode(fsgs->lextree)) E_FATAL("PANIC! Frame %d: #HMM evaluated(%d) > #PNodes(%d)\n", fsgs->frame, n, fsg_lextree_n_pnode(fsgs->lextree)); fsgs->bestscore = bestscore; } static void fsg_search_pnode_trans(fsg_search_t *fsgs, fsg_pnode_t * pnode) { fsg_pnode_t *child; hmm_t *hmm; int32 newscore, thresh, nf; assert(pnode); assert(!fsg_pnode_leaf(pnode)); nf = fsgs->frame + 1; thresh = fsgs->bestscore + fsgs->beam; hmm = fsg_pnode_hmmptr(pnode); for (child = fsg_pnode_succ(pnode); child; child = fsg_pnode_sibling(child)) { newscore = hmm_out_score(hmm) + child->logs2prob; if ((newscore BETTER_THAN thresh) && (newscore BETTER_THAN hmm_in_score(&child->hmm))) { /* Incoming score > pruning threshold and > target's existing score */ if (hmm_frame(&child->hmm) < nf) { /* Child node not yet activated; do so */ fsgs->pnode_active_next = glist_add_ptr(fsgs->pnode_active_next, (void *) child); } hmm_enter(&child->hmm, newscore, hmm_out_history(hmm), nf); } } } static void fsg_search_pnode_exit(fsg_search_t *fsgs, fsg_pnode_t * pnode) { hmm_t *hmm; fsg_link_t *fl; int32 wid; fsg_pnode_ctxt_t ctxt; assert(pnode); assert(fsg_pnode_leaf(pnode)); hmm = fsg_pnode_hmmptr(pnode); fl = fsg_pnode_fsglink(pnode); assert(fl); wid = fsg_link_wid(fl); assert(wid >= 0); #if __FSG_DBG__ E_INFO("[%5d] Exit(%08x) %10d(score) %5d(pred)\n", fsgs->frame, (int32) pnode, hmm_out_score(hmm), hmm_out_history(hmm)); #endif /* * Check if this is filler or single phone word; these do not model right * context (i.e., the exit score applies to all right contexts). */ if (fsg_model_is_filler(fsgs->fsg, wid) /* FIXME: This might be slow due to repeated calls to dict_to_id(). */ || (dict_is_single_phone(ps_search_dict(fsgs), dict_wordid(ps_search_dict(fsgs), fsg_model_word_str(fsgs->fsg, wid))))) { /* Create a dummy context structure that applies to all right contexts */ fsg_pnode_add_all_ctxt(&ctxt); /* Create history table entry for this word exit */ fsg_history_entry_add(fsgs->history, fl, fsgs->frame, hmm_out_score(hmm), hmm_out_history(hmm), pnode->ci_ext, ctxt); } else { /* Create history table entry for this word exit */ fsg_history_entry_add(fsgs->history, fl, fsgs->frame, hmm_out_score(hmm), hmm_out_history(hmm), pnode->ci_ext, pnode->ctxt); } } /* * (Beam) prune the just evaluated HMMs, determine which ones remain * active, which ones transition to successors, which ones exit and * terminate in their respective destination FSM states. * (Executed once per frame.) */ static void fsg_search_hmm_prune_prop(fsg_search_t *fsgs) { gnode_t *gn; fsg_pnode_t *pnode; hmm_t *hmm; int32 thresh, word_thresh, phone_thresh; assert(fsgs->pnode_active_next == NULL); thresh = fsgs->bestscore + fsgs->beam; phone_thresh = fsgs->bestscore + fsgs->pbeam; word_thresh = fsgs->bestscore + fsgs->wbeam; for (gn = fsgs->pnode_active; gn; gn = gnode_next(gn)) { pnode = (fsg_pnode_t *) gnode_ptr(gn); hmm = fsg_pnode_hmmptr(pnode); if (hmm_bestscore(hmm) >= thresh) { /* Keep this HMM active in the next frame */ if (hmm_frame(hmm) == fsgs->frame) { hmm_frame(hmm) = fsgs->frame + 1; fsgs->pnode_active_next = glist_add_ptr(fsgs->pnode_active_next, (void *) pnode); } else { assert(hmm_frame(hmm) == fsgs->frame + 1); } if (!fsg_pnode_leaf(pnode)) { if (hmm_out_score(hmm) >= phone_thresh) { /* Transition out of this phone into its children */ fsg_search_pnode_trans(fsgs, pnode); } } else { if (hmm_out_score(hmm) >= word_thresh) { /* Transition out of leaf node into destination FSG state */ fsg_search_pnode_exit(fsgs, pnode); } } } } } /* * Propagate newly created history entries through null transitions. */ static void fsg_search_null_prop(fsg_search_t *fsgs) { int32 bpidx, n_entries, thresh, newscore; fsg_hist_entry_t *hist_entry; fsg_link_t *l; int32 s; fsg_model_t *fsg; fsg = fsgs->fsg; thresh = fsgs->bestscore + fsgs->wbeam; /* Which beam really?? */ n_entries = fsg_history_n_entries(fsgs->history); for (bpidx = fsgs->bpidx_start; bpidx < n_entries; bpidx++) { fsg_arciter_t *itor; hist_entry = fsg_history_entry_get(fsgs->history, bpidx); l = fsg_hist_entry_fsglink(hist_entry); /* Destination FSG state for history entry */ s = l ? fsg_link_to_state(l) : fsg_model_start_state(fsg); /* * Check null transitions from d to all other states. (Only need to * propagate one step, since FSG contains transitive closure of null * transitions.) */ /* Add all links from from_state to dst */ for (itor = fsg_model_arcs(fsg, s); itor; itor = fsg_arciter_next(itor)) { fsg_link_t *l = fsg_arciter_get(itor); /* FIXME: Need to deal with tag transitions somehow. */ if (fsg_link_wid(l) != -1) continue; newscore = fsg_hist_entry_score(hist_entry) + (fsg_link_logs2prob(l) >> SENSCR_SHIFT); if (newscore >= thresh) { fsg_history_entry_add(fsgs->history, l, fsg_hist_entry_frame(hist_entry), newscore, bpidx, fsg_hist_entry_lc(hist_entry), fsg_hist_entry_rc(hist_entry)); } } } } /* * Perform cross-word transitions; propagate each history entry created in this * frame to lextree roots attached to the target FSG state for that entry. */ static void fsg_search_word_trans(fsg_search_t *fsgs) { int32 bpidx, n_entries; fsg_hist_entry_t *hist_entry; fsg_link_t *l; int32 score, newscore, thresh, nf, d; fsg_pnode_t *root; int32 lc, rc; n_entries = fsg_history_n_entries(fsgs->history); thresh = fsgs->bestscore + fsgs->beam; nf = fsgs->frame + 1; for (bpidx = fsgs->bpidx_start; bpidx < n_entries; bpidx++) { hist_entry = fsg_history_entry_get(fsgs->history, bpidx); assert(hist_entry); score = fsg_hist_entry_score(hist_entry); assert(fsgs->frame == fsg_hist_entry_frame(hist_entry)); l = fsg_hist_entry_fsglink(hist_entry); /* Destination state for hist_entry */ d = l ? fsg_link_to_state(l) : fsg_model_start_state(fsgs-> fsg); lc = fsg_hist_entry_lc(hist_entry); /* Transition to all root nodes attached to state d */ for (root = fsg_lextree_root(fsgs->lextree, d); root; root = root->sibling) { rc = root->ci_ext; if ((root->ctxt.bv[lc >> 5] & (1 << (lc & 0x001f))) && (hist_entry->rc.bv[rc >> 5] & (1 << (rc & 0x001f)))) { /* * Last CIphone of history entry is in left-context list supported by * target root node, and * first CIphone of target root node is in right context list supported * by history entry; * So the transition can go ahead (if new score is good enough). */ newscore = score + root->logs2prob; if ((newscore BETTER_THAN thresh) && (newscore BETTER_THAN hmm_in_score(&root->hmm))) { if (hmm_frame(&root->hmm) < nf) { /* Newly activated node; add to active list */ fsgs->pnode_active_next = glist_add_ptr(fsgs->pnode_active_next, (void *) root); #if __FSG_DBG__ E_INFO ("[%5d] WordTrans bpidx[%d] -> pnode[%08x] (activated)\n", fsgs->frame, bpidx, (int32) root); #endif } else { #if __FSG_DBG__ E_INFO ("[%5d] WordTrans bpidx[%d] -> pnode[%08x]\n", fsgs->frame, bpidx, (int32) root); #endif } hmm_enter(&root->hmm, newscore, bpidx, nf); } } } } } int fsg_search_step(ps_search_t *search, int frame_idx) { fsg_search_t *fsgs = (fsg_search_t *)search; int16 const *senscr; acmod_t *acmod = search->acmod; gnode_t *gn; fsg_pnode_t *pnode; hmm_t *hmm; /* Activate our HMMs for the current frame if need be. */ if (!acmod->compallsen) fsg_search_sen_active(fsgs); /* Compute GMM scores for the current frame. */ senscr = acmod_score(acmod, &frame_idx); fsgs->n_sen_eval += acmod->n_senone_active; hmm_context_set_senscore(fsgs->hmmctx, senscr); /* Mark backpointer table for current frame. */ fsgs->bpidx_start = fsg_history_n_entries(fsgs->history); /* Evaluate all active pnodes (HMMs) */ fsg_search_hmm_eval(fsgs); /* * Prune and propagate the HMMs evaluated; create history entries for * word exits. The words exits are tentative, and may be pruned; make * the survivors permanent via fsg_history_end_frame(). */ fsg_search_hmm_prune_prop(fsgs); fsg_history_end_frame(fsgs->history); /* * Propagate new history entries through any null transitions, creating * new history entries, and then make the survivors permanent. */ fsg_search_null_prop(fsgs); fsg_history_end_frame(fsgs->history); /* * Perform cross-word transitions; propagate each history entry across its * terminating state to the root nodes of the lextree attached to the state. */ fsg_search_word_trans(fsgs); /* * We've now come full circle, HMM and FSG states have been updated for * the next frame. * Update the active lists, deactivate any currently active HMMs that * did not survive into the next frame */ for (gn = fsgs->pnode_active; gn; gn = gnode_next(gn)) { pnode = (fsg_pnode_t *) gnode_ptr(gn); hmm = fsg_pnode_hmmptr(pnode); if (hmm_frame(hmm) == fsgs->frame) { /* This HMM NOT activated for the next frame; reset it */ fsg_psubtree_pnode_deactivate(pnode); } else { assert(hmm_frame(hmm) == (fsgs->frame + 1)); } } /* Free the currently active list */ glist_free(fsgs->pnode_active); /* Make the next-frame active list the current one */ fsgs->pnode_active = fsgs->pnode_active_next; fsgs->pnode_active_next = NULL; /* End of this frame; ready for the next */ ++fsgs->frame; return 1; } /* * Set all HMMs to inactive, clear active lists, initialize FSM start * state to be the only active node. * (Executed at the start of each utterance.) */ int fsg_search_start(ps_search_t *search) { fsg_search_t *fsgs = (fsg_search_t *)search; int32 silcipid; fsg_pnode_ctxt_t ctxt; /* Reset dynamic adjustment factor for beams */ fsgs->beam_factor = 1.0f; fsgs->beam = fsgs->beam_orig; fsgs->pbeam = fsgs->pbeam_orig; fsgs->wbeam = fsgs->wbeam_orig; silcipid = bin_mdef_ciphone_id(ps_search_acmod(fsgs)->mdef, "SIL"); /* Initialize EVERYTHING to be inactive */ assert(fsgs->pnode_active == NULL); assert(fsgs->pnode_active_next == NULL); fsg_history_reset(fsgs->history); fsg_history_utt_start(fsgs->history); fsgs->final = FALSE; /* Dummy context structure that allows all right contexts to use this entry */ fsg_pnode_add_all_ctxt(&ctxt); /* Create dummy history entry leading to start state */ fsgs->frame = -1; fsgs->bestscore = 0; fsg_history_entry_add(fsgs->history, NULL, -1, 0, -1, silcipid, ctxt); fsgs->bpidx_start = 0; /* Propagate dummy history entry through NULL transitions from start state */ fsg_search_null_prop(fsgs); /* Perform word transitions from this dummy history entry */ fsg_search_word_trans(fsgs); /* Make the next-frame active list the current one */ fsgs->pnode_active = fsgs->pnode_active_next; fsgs->pnode_active_next = NULL; ++fsgs->frame; fsgs->n_hmm_eval = 0; fsgs->n_sen_eval = 0; ptmr_reset(&fsgs->perf); ptmr_start(&fsgs->perf); return 0; } /* * Cleanup at the end of each utterance. */ int fsg_search_finish(ps_search_t *search) { fsg_search_t *fsgs = (fsg_search_t *)search; gnode_t *gn; fsg_pnode_t *pnode; int32 n_hist, cf; /* Deactivate all nodes in the current and next-frame active lists */ for (gn = fsgs->pnode_active; gn; gn = gnode_next(gn)) { pnode = (fsg_pnode_t *) gnode_ptr(gn); fsg_psubtree_pnode_deactivate(pnode); } for (gn = fsgs->pnode_active_next; gn; gn = gnode_next(gn)) { pnode = (fsg_pnode_t *) gnode_ptr(gn); fsg_psubtree_pnode_deactivate(pnode); } glist_free(fsgs->pnode_active); fsgs->pnode_active = NULL; glist_free(fsgs->pnode_active_next); fsgs->pnode_active_next = NULL; fsgs->final = TRUE; n_hist = fsg_history_n_entries(fsgs->history); fsgs->n_tot_frame += fsgs->frame; E_INFO ("%d frames, %d HMMs (%d/fr), %d senones (%d/fr), %d history entries (%d/fr)\n\n", fsgs->frame, fsgs->n_hmm_eval, (fsgs->frame > 0) ? fsgs->n_hmm_eval / fsgs->frame : 0, fsgs->n_sen_eval, (fsgs->frame > 0) ? fsgs->n_sen_eval / fsgs->frame : 0, n_hist, (fsgs->frame > 0) ? n_hist / fsgs->frame : 0); /* Print out some statistics. */ ptmr_stop(&fsgs->perf); /* This is the number of frames processed. */ cf = ps_search_acmod(fsgs)->output_frame; if (cf > 0) { double n_speech = (double) (cf + 1) / cmd_ln_int32_r(ps_search_config(fsgs), "-frate"); E_INFO("fsg %.2f CPU %.3f xRT\n", fsgs->perf.t_cpu, fsgs->perf.t_cpu / n_speech); E_INFO("fsg %.2f wall %.3f xRT\n", fsgs->perf.t_elapsed, fsgs->perf.t_elapsed / n_speech); } return 0; } static int fsg_search_find_exit(fsg_search_t *fsgs, int frame_idx, int final, int32 *out_score) { fsg_hist_entry_t *hist_entry = NULL; fsg_model_t *fsg; int bpidx, frm, last_frm, besthist; int32 bestscore; if (frame_idx == -1) frame_idx = fsgs->frame - 1; last_frm = frm = frame_idx; /* Scan backwards to find a word exit in frame_idx. */ bpidx = fsg_history_n_entries(fsgs->history) - 1; while (bpidx > 0) { hist_entry = fsg_history_entry_get(fsgs->history, bpidx); if (fsg_hist_entry_frame(hist_entry) <= frame_idx) { frm = last_frm = fsg_hist_entry_frame(hist_entry); break; } bpidx--; } /* No hypothesis (yet). */ if (bpidx <= 0) return bpidx; /* Now find best word exit in this frame. */ bestscore = INT_MIN; besthist = -1; fsg = fsgs->fsg; while (frm == last_frm) { fsg_link_t *fl; int32 score; fl = fsg_hist_entry_fsglink(hist_entry); score = fsg_hist_entry_score(hist_entry); if (fl == NULL) break; /* Prefer final hypothesis */ if (score == bestscore && fsg_link_to_state(fl) == fsg_model_final_state(fsg)) { besthist = bpidx; } else if (score BETTER_THAN bestscore) { /* Only enforce the final state constraint if this is a final hypothesis. */ if ((!final) || fsg_link_to_state(fl) == fsg_model_final_state(fsg)) { bestscore = score; besthist = bpidx; } } --bpidx; if (bpidx < 0) break; hist_entry = fsg_history_entry_get(fsgs->history, bpidx); frm = fsg_hist_entry_frame(hist_entry); } /* Final state not reached. */ if (besthist == -1) { E_ERROR("Final result does not match the grammar in frame %d\n", frame_idx); return -1; } /* This here's the one we want. */ if (out_score) *out_score = bestscore; return besthist; } /* FIXME: Mostly duplicated with ngram_search_bestpath(). */ static ps_latlink_t * fsg_search_bestpath(ps_search_t *search, int32 *out_score, int backward) { fsg_search_t *fsgs = (fsg_search_t *)search; if (search->last_link == NULL) { search->last_link = ps_lattice_bestpath(search->dag, NULL, 1.0, fsgs->ascale); if (search->last_link == NULL) return NULL; /* Also calculate betas so we can fill in the posterior * probability field in the segmentation. */ if (search->post == 0) search->post = ps_lattice_posterior(search->dag, NULL, fsgs->ascale); } if (out_score) *out_score = search->last_link->path_scr + search->dag->final_node_ascr; return search->last_link; } char const * fsg_search_hyp(ps_search_t *search, int32 *out_score) { fsg_search_t *fsgs = (fsg_search_t *)search; dict_t *dict = ps_search_dict(search); char *c; size_t len; int bp, bpidx; /* Get last backpointer table index. */ bpidx = fsg_search_find_exit(fsgs, fsgs->frame, fsgs->final, out_score); /* No hypothesis (yet). */ if (bpidx <= 0) { return NULL; } /* If bestpath is enabled and the utterance is complete, then run it. */ if (fsgs->bestpath && fsgs->final) { ps_lattice_t *dag; ps_latlink_t *link; if ((dag = fsg_search_lattice(search)) == NULL) { E_WARN("Failed to obtain the lattice while bestpath enabled\n"); return NULL; } if ((link = fsg_search_bestpath(search, out_score, FALSE)) == NULL) { E_WARN("Failed to find the bestpath in a lattice\n"); return NULL; } return ps_lattice_hyp(dag, link); } bp = bpidx; len = 0; while (bp > 0) { fsg_hist_entry_t *hist_entry = fsg_history_entry_get(fsgs->history, bp); fsg_link_t *fl = fsg_hist_entry_fsglink(hist_entry); char const *baseword; int32 wid; bp = fsg_hist_entry_pred(hist_entry); wid = fsg_link_wid(fl); if (wid < 0 || fsg_model_is_filler(fsgs->fsg, wid)) continue; baseword = dict_basestr(dict, dict_wordid(dict, fsg_model_word_str(fsgs->fsg, wid))); len += strlen(baseword) + 1; } ckd_free(search->hyp_str); if (len == 0) { search->hyp_str = NULL; return search->hyp_str; } search->hyp_str = ckd_calloc(1, len); bp = bpidx; c = search->hyp_str + len - 1; while (bp > 0) { fsg_hist_entry_t *hist_entry = fsg_history_entry_get(fsgs->history, bp); fsg_link_t *fl = fsg_hist_entry_fsglink(hist_entry); char const *baseword; int32 wid; bp = fsg_hist_entry_pred(hist_entry); wid = fsg_link_wid(fl); if (wid < 0 || fsg_model_is_filler(fsgs->fsg, wid)) continue; baseword = dict_basestr(dict, dict_wordid(dict, fsg_model_word_str(fsgs->fsg, wid))); len = strlen(baseword); c -= len; memcpy(c, baseword, len); if (c > search->hyp_str) { --c; *c = ' '; } } return search->hyp_str; } static void fsg_seg_bp2itor(ps_seg_t *seg, fsg_hist_entry_t *hist_entry) { fsg_search_t *fsgs = (fsg_search_t *)seg->search; fsg_hist_entry_t *ph = NULL; int32 bp; if ((bp = fsg_hist_entry_pred(hist_entry)) >= 0) ph = fsg_history_entry_get(fsgs->history, bp); seg->word = fsg_model_word_str(fsgs->fsg, hist_entry->fsglink->wid); seg->ef = fsg_hist_entry_frame(hist_entry); seg->sf = ph ? fsg_hist_entry_frame(ph) + 1 : 0; /* This is kind of silly but it happens for null transitions. */ if (seg->sf > seg->ef) seg->sf = seg->ef; seg->prob = 0; /* Bogus value... */ /* "Language model" score = transition probability. */ seg->lback = 1; seg->lscr = fsg_link_logs2prob(hist_entry->fsglink) >> SENSCR_SHIFT; if (ph) { /* FIXME: Not sure exactly how cross-word triphones are handled. */ seg->ascr = hist_entry->score - ph->score - seg->lscr; } else seg->ascr = hist_entry->score - seg->lscr; } static void fsg_seg_free(ps_seg_t *seg) { fsg_seg_t *itor = (fsg_seg_t *)seg; ckd_free(itor->hist); ckd_free(itor); } static ps_seg_t * fsg_seg_next(ps_seg_t *seg) { fsg_seg_t *itor = (fsg_seg_t *)seg; if (++itor->cur == itor->n_hist) { fsg_seg_free(seg); return NULL; } fsg_seg_bp2itor(seg, itor->hist[itor->cur]); return seg; } static ps_segfuncs_t fsg_segfuncs = { /* seg_next */ fsg_seg_next, /* seg_free */ fsg_seg_free }; static ps_seg_t * fsg_search_seg_iter(ps_search_t *search) { fsg_search_t *fsgs = (fsg_search_t *)search; fsg_seg_t *itor; int32 out_score; int bp, bpidx, cur; bpidx = fsg_search_find_exit(fsgs, fsgs->frame, fsgs->final, &out_score); /* No hypothesis (yet). */ if (bpidx <= 0) return NULL; /* If bestpath is enabled and the utterance is complete, then run it. */ if (fsgs->bestpath && fsgs->final) { ps_lattice_t *dag; ps_latlink_t *link; if ((dag = fsg_search_lattice(search)) == NULL) return NULL; if ((link = fsg_search_bestpath(search, &out_score, TRUE)) == NULL) return NULL; return ps_lattice_seg_iter(dag, link, 1.0); } /* Calling this an "iterator" is a bit of a misnomer since we have * to get the entire backtrace in order to produce it. On the * other hand, all we actually need is the bptbl IDs, and we can * allocate a fixed-size array of them. */ itor = ckd_calloc(1, sizeof(*itor)); itor->base.vt = &fsg_segfuncs; itor->base.search = search; itor->base.lwf = 1.0; itor->n_hist = 0; bp = bpidx; while (bp > 0) { fsg_hist_entry_t *hist_entry = fsg_history_entry_get(fsgs->history, bp); bp = fsg_hist_entry_pred(hist_entry); ++itor->n_hist; } if (itor->n_hist == 0) { ckd_free(itor); return NULL; } itor->hist = ckd_calloc(itor->n_hist, sizeof(*itor->hist)); cur = itor->n_hist - 1; bp = bpidx; while (bp > 0) { fsg_hist_entry_t *hist_entry = fsg_history_entry_get(fsgs->history, bp); itor->hist[cur] = hist_entry; bp = fsg_hist_entry_pred(hist_entry); --cur; } /* Fill in relevant fields for first element. */ fsg_seg_bp2itor((ps_seg_t *)itor, itor->hist[0]); return (ps_seg_t *)itor; } static int fsg_search_prob(ps_search_t *search) { fsg_search_t *fsgs = (fsg_search_t *)search; /* If bestpath is enabled and the utterance is complete, then run it. */ if (fsgs->bestpath && fsgs->final) { ps_lattice_t *dag; ps_latlink_t *link; if ((dag = fsg_search_lattice(search)) == NULL) return 0; if ((link = fsg_search_bestpath(search, NULL, TRUE)) == NULL) return 0; return search->post; } else { /* FIXME: Give some kind of good estimate here, eventually. */ return 0; } } static ps_latnode_t * find_node(ps_lattice_t *dag, fsg_model_t *fsg, int sf, int32 wid, int32 node_id) { ps_latnode_t *node; for (node = dag->nodes; node; node = node->next) if ((node->sf == sf) && (node->wid == wid) && (node->node_id == node_id)) break; return node; } static ps_latnode_t * new_node(ps_lattice_t *dag, fsg_model_t *fsg, int sf, int ef, int32 wid, int32 node_id, int32 ascr) { ps_latnode_t *node; node = find_node(dag, fsg, sf, wid, node_id); if (node) { /* Update end frames. */ if (node->lef == -1 || node->lef < ef) node->lef = ef; if (node->fef == -1 || node->fef > ef) node->fef = ef; /* Update best link score. */ if (ascr BETTER_THAN node->info.best_exit) node->info.best_exit = ascr; } else { /* New node; link to head of list */ node = listelem_malloc(dag->latnode_alloc); node->wid = wid; node->sf = sf; node->fef = node->lef = ef; node->reachable = FALSE; node->entries = NULL; node->exits = NULL; node->info.best_exit = ascr; node->node_id = node_id; node->next = dag->nodes; dag->nodes = node; ++dag->n_nodes; } return node; } static ps_latnode_t * find_start_node(fsg_search_t *fsgs, ps_lattice_t *dag) { ps_latnode_t *node; glist_t start = NULL; int nstart = 0; /* Look for all nodes starting in frame zero with some exits. */ for (node = dag->nodes; node; node = node->next) { if (node->sf == 0 && node->exits) { E_INFO("Start node %s.%d:%d:%d\n", fsg_model_word_str(fsgs->fsg, node->wid), node->sf, node->fef, node->lef); start = glist_add_ptr(start, node); ++nstart; } } /* If there was more than one start node candidate, then we need * to create an artificial start node with epsilon transitions to * all of them. */ if (nstart == 1) { node = gnode_ptr(start); } else { gnode_t *st; int wid; wid = fsg_model_word_add(fsgs->fsg, ""); if (fsgs->fsg->silwords) bitvec_set(fsgs->fsg->silwords, wid); node = new_node(dag, fsgs->fsg, 0, 0, wid, -1, 0); for (st = start; st; st = gnode_next(st)) ps_lattice_link(dag, node, gnode_ptr(st), 0, 0); } glist_free(start); return node; } static ps_latnode_t * find_end_node(fsg_search_t *fsgs, ps_lattice_t *dag) { ps_latnode_t *node; glist_t end = NULL; int nend = 0; /* Look for all nodes ending in last frame with some entries. */ for (node = dag->nodes; node; node = node->next) { if (node->lef == dag->n_frames - 1 && node->entries) { E_INFO("End node %s.%d:%d:%d (%d)\n", fsg_model_word_str(fsgs->fsg, node->wid), node->sf, node->fef, node->lef, node->info.best_exit); end = glist_add_ptr(end, node); ++nend; } } if (nend == 1) { node = gnode_ptr(end); } else if (nend == 0) { ps_latnode_t *last = NULL; int ef = 0; /* If there were no end node candidates, then just use the * node with the last exit frame. */ for (node = dag->nodes; node; node = node->next) { if (node->lef > ef && node->entries) { last = node; ef = node->lef; } } node = last; if (node) E_INFO("End node %s.%d:%d:%d (%d)\n", fsg_model_word_str(fsgs->fsg, node->wid), node->sf, node->fef, node->lef, node->info.best_exit); } else { /* If there was more than one end node candidate, then we need * to create an artificial end node with epsilon transitions * out of all of them. */ gnode_t *st; int wid; wid = fsg_model_word_add(fsgs->fsg, ""); if (fsgs->fsg->silwords) bitvec_set(fsgs->fsg->silwords, wid); node = new_node(dag, fsgs->fsg, fsgs->frame, fsgs->frame, wid, -1, 0); /* Use the "best" (in reality it will be the only) exit link * score from this final node as the link score. */ for (st = end; st; st = gnode_next(st)) { ps_latnode_t *src = gnode_ptr(st); ps_lattice_link(dag, src, node, src->info.best_exit, fsgs->frame); } } glist_free(end); return node; } static void mark_reachable(ps_lattice_t *dag, ps_latnode_t *end) { glist_t q; /* It doesn't matter which order we do this in. */ end->reachable = TRUE; q = glist_add_ptr(NULL, end); while (q) { ps_latnode_t *node = gnode_ptr(q); latlink_list_t *x; /* Pop the front of the list. */ q = gnode_free(q, NULL); /* Expand all its predecessors that haven't been seen yet. */ for (x = node->entries; x; x = x->next) { ps_latnode_t *next = x->link->from; if (!next->reachable) { next->reachable = TRUE; q = glist_add_ptr(q, next); } } } } /** * Generate a lattice from FSG search results. * * One might think that this is simply a matter of adding acoustic * scores to the FSG's edges. However, one would be wrong. The * crucial difference here is that the word lattice is acyclic, and it * also contains timing information. */ static ps_lattice_t * fsg_search_lattice(ps_search_t *search) { fsg_search_t *fsgs; fsg_model_t *fsg; ps_latnode_t *node; ps_lattice_t *dag; int32 i, n; fsgs = (fsg_search_t *)search; /* Check to see if a lattice has previously been created over the * same number of frames, and reuse it if so. */ if (search->dag && search->dag->n_frames == fsgs->frame) return search->dag; /* Nope, create a new one. */ ps_lattice_free(search->dag); search->dag = NULL; dag = ps_lattice_init_search(search, fsgs->frame); fsg = fsgs->fsg; /* * Each history table entry represents a link in the word graph. * The set of nodes is determined by the number of unique * (word,start-frame) pairs in the history table. So we will * first find all those nodes. */ n = fsg_history_n_entries(fsgs->history); for (i = 0; i < n; ++i) { fsg_hist_entry_t *fh = fsg_history_entry_get(fsgs->history, i); int32 ascr; int sf; /* Skip null transitions. */ if (fh->fsglink == NULL || fh->fsglink->wid == -1) continue; /* Find the start node of this link. */ if (fh->pred) { fsg_hist_entry_t *pfh = fsg_history_entry_get(fsgs->history, fh->pred); /* FIXME: We include the transition score in the lattice * link score. This is because of the practical * difficulty of obtaining it separately in bestpath or * forward-backward search, and because it is essentially * a unigram probability, so there is no need to treat it * separately from the acoustic score. However, it's not * clear that this will actually yield correct results.*/ ascr = fh->score - pfh->score; sf = pfh->frame + 1; } else { ascr = fh->score; sf = 0; } /* * Note that although scores are tied to links rather than * nodes, it's possible that there are no links out of the * destination node, and thus we need to preserve its score in * case it turns out to be utterance-final. */ new_node(dag, fsg, sf, fh->frame, fh->fsglink->wid, fsg_link_to_state(fh->fsglink), ascr); } /* * Now, we will create links only to nodes that actually exist. */ n = fsg_history_n_entries(fsgs->history); for (i = 0; i < n; ++i) { fsg_hist_entry_t *fh = fsg_history_entry_get(fsgs->history, i); fsg_arciter_t *itor; ps_latnode_t *src, *dest; int32 ascr; int sf; /* Skip null transitions. */ if (fh->fsglink == NULL || fh->fsglink->wid == -1) continue; /* Find the start node of this link and calculate its link score. */ if (fh->pred) { fsg_hist_entry_t *pfh = fsg_history_entry_get(fsgs->history, fh->pred); sf = pfh->frame + 1; ascr = fh->score - pfh->score; } else { ascr = fh->score; sf = 0; } src = find_node(dag, fsg, sf, fh->fsglink->wid, fsg_link_to_state(fh->fsglink)); sf = fh->frame + 1; for (itor = fsg_model_arcs(fsg, fsg_link_to_state(fh->fsglink)); itor; itor = fsg_arciter_next(itor)) { fsg_link_t *link = fsg_arciter_get(itor); /* FIXME: Need to figure out what to do about tag transitions. */ if (link->wid >= 0) { /* * For each non-epsilon link following this one, look for a * matching node in the lattice and link to it. */ if ((dest = find_node(dag, fsg, sf, link->wid, fsg_link_to_state(link))) != NULL) ps_lattice_link(dag, src, dest, ascr, fh->frame); } else { /* * Transitive closure on nulls has already been done, so we * just need to look one link forward from them. */ fsg_arciter_t *itor2; /* Add all non-null links out of j. */ for (itor2 = fsg_model_arcs(fsg, fsg_link_to_state(link)); itor2; itor2 = fsg_arciter_next(itor2)) { fsg_link_t *link = fsg_arciter_get(itor2); if (link->wid == -1) continue; if ((dest = find_node(dag, fsg, sf, link->wid, fsg_link_to_state(link))) != NULL) { ps_lattice_link(dag, src, dest, ascr, fh->frame); } } } } } /* Figure out which nodes are the start and end nodes. */ if ((dag->start = find_start_node(fsgs, dag)) == NULL) { E_WARN("Failed to find the start node\n"); goto error_out; } if ((dag->end = find_end_node(fsgs, dag)) == NULL) { E_WARN("Failed to find the end node\n"); goto error_out; } E_INFO("lattice start node %s.%d end node %s.%d\n", fsg_model_word_str(fsg, dag->start->wid), dag->start->sf, fsg_model_word_str(fsg, dag->end->wid), dag->end->sf); /* FIXME: Need to calculate final_node_ascr here. */ /* * Convert word IDs from FSG to dictionary. */ for (node = dag->nodes; node; node = node->next) { node->wid = dict_wordid(dag->search->dict, fsg_model_word_str(fsg, node->wid)); node->basewid = dict_basewid(dag->search->dict, node->wid); } /* * Now we are done, because the links in the graph are uniquely * defined by the history table. However we should remove any * nodes which are not reachable from the end node of the FSG. * Everything is reachable from the start node by definition. */ mark_reachable(dag, dag->end); ps_lattice_delete_unreachable(dag); { int32 silpen, fillpen; silpen = (int32)(logmath_log(fsg->lmath, cmd_ln_float32_r(ps_search_config(fsgs), "-silprob")) * fsg->lw) >> SENSCR_SHIFT; fillpen = (int32)(logmath_log(fsg->lmath, cmd_ln_float32_r(ps_search_config(fsgs), "-fillprob")) * fsg->lw) >> SENSCR_SHIFT; ps_lattice_penalize_fillers(dag, silpen, fillpen); } search->dag = dag; return dag; error_out: ps_lattice_free(dag); return NULL; } pocketsphinx-5prealpha/src/libpocketsphinx/tmat.c0000664000175000017500000002153212771605033017514 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* System headers. */ #include /* SphinxBase headers. */ #include #include #include #include /* Local headers. */ #include "tmat.h" #include "hmm.h" #include "vector.h" #define TMAT_PARAM_VERSION "1.0" /** * Checks that no transition matrix in the given object contains backward arcs. * @returns 0 if successful, -1 if check failed. */ static int32 tmat_chk_uppertri(tmat_t *tmat, logmath_t *lmath); /** * Checks that transition matrix arcs in the given object skip over * at most 1 state. * @returns 0 if successful, -1 if check failed. */ static int32 tmat_chk_1skip(tmat_t *tmat, logmath_t *lmath); void tmat_dump(tmat_t * tmat, FILE * fp) { int32 i, src, dst; for (i = 0; i < tmat->n_tmat; i++) { fprintf(fp, "TMAT %d = %d x %d\n", i, tmat->n_state, tmat->n_state + 1); for (src = 0; src < tmat->n_state; src++) { for (dst = 0; dst <= tmat->n_state; dst++) fprintf(fp, " %12d", tmat->tp[i][src][dst]); fprintf(fp, "\n"); } fprintf(fp, "\n"); } fflush(fp); } /* * Check model tprob matrices that they conform to upper-triangular assumption; * i.e. no "backward" transitions allowed. */ int32 tmat_chk_uppertri(tmat_t * tmat, logmath_t *lmath) { int32 i, src, dst; /* Check that each tmat is upper-triangular */ for (i = 0; i < tmat->n_tmat; i++) { for (dst = 0; dst < tmat->n_state; dst++) for (src = dst + 1; src < tmat->n_state; src++) if (tmat->tp[i][src][dst] < 255) { E_ERROR("tmat[%d][%d][%d] = %d\n", i, src, dst, tmat->tp[i][src][dst]); return -1; } } return 0; } int32 tmat_chk_1skip(tmat_t * tmat, logmath_t *lmath) { int32 i, src, dst; for (i = 0; i < tmat->n_tmat; i++) { for (src = 0; src < tmat->n_state; src++) for (dst = src + 3; dst <= tmat->n_state; dst++) if (tmat->tp[i][src][dst] < 255) { E_ERROR("tmat[%d][%d][%d] = %d\n", i, src, dst, tmat->tp[i][src][dst]); return -1; } } return 0; } tmat_t * tmat_init(char const *file_name, logmath_t *lmath, float64 tpfloor, int32 breport) { char tmp; int32 n_src, n_dst, n_tmat; FILE *fp; int32 byteswap, chksum_present; uint32 chksum; float32 **tp; int32 i, j, k, tp_per_tmat; char **argname, **argval; tmat_t *t; if (breport) { E_INFO("Reading HMM transition probability matrices: %s\n", file_name); } t = (tmat_t *) ckd_calloc(1, sizeof(tmat_t)); if ((fp = fopen(file_name, "rb")) == NULL) E_FATAL_SYSTEM("Failed to open transition file '%s' for reading", file_name); /* Read header, including argument-value info and 32-bit byteorder magic */ if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) E_FATAL("Failed to read header from file '%s'\n", file_name); /* Parse argument-value list */ chksum_present = 0; for (i = 0; argname[i]; i++) { if (strcmp(argname[i], "version") == 0) { if (strcmp(argval[i], TMAT_PARAM_VERSION) != 0) E_WARN("Version mismatch(%s): %s, expecting %s\n", file_name, argval[i], TMAT_PARAM_VERSION); } else if (strcmp(argname[i], "chksum0") == 0) { chksum_present = 1; /* Ignore the associated value */ } } bio_hdrarg_free(argname, argval); argname = argval = NULL; chksum = 0; /* Read #tmat, #from-states, #to-states, arraysize */ if ((bio_fread(&n_tmat, sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&n_src, sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&n_dst, sizeof(int32), 1, fp, byteswap, &chksum) != 1) || (bio_fread(&i, sizeof(int32), 1, fp, byteswap, &chksum) != 1)) { E_FATAL("Failed to read header from '%s'\n", file_name); } if (n_tmat >= MAX_INT16) E_FATAL("%s: Number of transition matrices (%d) exceeds limit (%d)\n", file_name, n_tmat, MAX_INT16); t->n_tmat = n_tmat; if (n_dst != n_src + 1) E_FATAL("%s: Unsupported transition matrix. Number of source states (%d) != number of target states (%d)-1\n", file_name, n_src, n_dst); t->n_state = n_src; if (i != t->n_tmat * n_src * n_dst) { E_FATAL ("%s: Invalid transitions. Number of coefficients (%d) doesn't match expected array dimension: %d x %d x %d\n", file_name, i, t->n_tmat, n_src, n_dst); } /* Allocate memory for tmat data */ t->tp = ckd_calloc_3d(t->n_tmat, n_src, n_dst, sizeof(***t->tp)); /* Temporary structure to read in the float data */ tp = ckd_calloc_2d(n_src, n_dst, sizeof(**tp)); /* Read transition matrices, normalize and floor them, and convert to log domain */ tp_per_tmat = n_src * n_dst; for (i = 0; i < t->n_tmat; i++) { if (bio_fread(tp[0], sizeof(float32), tp_per_tmat, fp, byteswap, &chksum) != tp_per_tmat) { E_FATAL("Failed to read transition matrix %d from '%s'\n", i, file_name); } /* Normalize and floor */ for (j = 0; j < n_src; j++) { if (vector_sum_norm(tp[j], n_dst) == 0.0) E_WARN("Normalization failed for transition matrix %d from state %d\n", i, j); vector_nz_floor(tp[j], n_dst, tpfloor); vector_sum_norm(tp[j], n_dst); /* Convert to logs3. */ for (k = 0; k < n_dst; k++) { int ltp; #if 0 /* No, don't do this! It will subtly break 3-state HMMs. */ /* For these ones, we floor them even if they are * zero, otherwise HMM evaluation goes nuts. */ if (k >= j && k-j < 3 && tp[j][k] == 0.0f) tp[j][k] = tpfloor; #endif /* Log and quantize them. */ ltp = -logmath_log(lmath, tp[j][k]) >> SENSCR_SHIFT; if (ltp > 255) ltp = 255; t->tp[i][j][k] = (uint8)ltp; } } } ckd_free_2d(tp); if (chksum_present) bio_verify_chksum(fp, byteswap, chksum); if (fread(&tmp, 1, 1, fp) == 1) E_ERROR("Non-empty file beyond end of data\n"); fclose(fp); if (tmat_chk_uppertri(t, lmath) < 0) E_FATAL("Tmat not upper triangular\n"); if (tmat_chk_1skip(t, lmath) < 0) E_FATAL("Topology not Left-to-Right or Bakis\n"); return t; } void tmat_report(tmat_t * t) { E_INFO_NOFN("Initialization of tmat_t, report:\n"); E_INFO_NOFN("Read %d transition matrices of size %dx%d\n", t->n_tmat, t->n_state, t->n_state + 1); E_INFO_NOFN("\n"); } /* * RAH, Free memory allocated in tmat_init () */ void tmat_free(tmat_t * t) { if (t) { if (t->tp) ckd_free_3d(t->tp); ckd_free(t); } } pocketsphinx-5prealpha/src/libpocketsphinx/ngram_search_fwdflat.c0000664000175000017500000010161312771605033022706 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file ngram_search_fwdflat.c Flat lexicon search. */ /* System headers. */ #include #include /* SphinxBase headers. */ #include #include #include /* Local headers. */ #include "ngram_search.h" #include "ps_lattice_internal.h" /* Turn this on to dump channels for debugging */ #define __CHAN_DUMP__ 0 #if __CHAN_DUMP__ #define chan_v_eval(chan) hmm_dump_vit_eval(&(chan)->hmm, stderr) #else #define chan_v_eval(chan) hmm_vit_eval(&(chan)->hmm) #endif static void ngram_fwdflat_expand_all(ngram_search_t *ngs) { int n_words, i; /* For all "real words" (not fillers or /) in the dictionary, * * 1) Add the ones which are in the LM to the fwdflat wordlist * 2) And to the expansion list (since we are expanding all) */ ngs->n_expand_words = 0; n_words = ps_search_n_words(ngs); bitvec_clear_all(ngs->expand_word_flag, ps_search_n_words(ngs)); for (i = 0; i < n_words; ++i) { if (!ngram_model_set_known_wid(ngs->lmset, dict_basewid(ps_search_dict(ngs),i))) continue; ngs->fwdflat_wordlist[ngs->n_expand_words] = i; ngs->expand_word_list[ngs->n_expand_words] = i; bitvec_set(ngs->expand_word_flag, i); ngs->n_expand_words++; } E_INFO("Utterance vocabulary contains %d words\n", ngs->n_expand_words); ngs->expand_word_list[ngs->n_expand_words] = -1; ngs->fwdflat_wordlist[ngs->n_expand_words] = -1; } static void ngram_fwdflat_allocate_1ph(ngram_search_t *ngs) { dict_t *dict = ps_search_dict(ngs); int n_words = ps_search_n_words(ngs); int i, w; /* Allocate single-phone words, since they won't have * been allocated for us by fwdtree initialization. */ ngs->n_1ph_words = 0; for (w = 0; w < n_words; w++) { if (dict_is_single_phone(dict, w)) ++ngs->n_1ph_words; } ngs->single_phone_wid = ckd_calloc(ngs->n_1ph_words, sizeof(*ngs->single_phone_wid)); ngs->rhmm_1ph = ckd_calloc(ngs->n_1ph_words, sizeof(*ngs->rhmm_1ph)); i = 0; for (w = 0; w < n_words; w++) { if (!dict_is_single_phone(dict, w)) continue; /* DICT2PID location */ ngs->rhmm_1ph[i].ciphone = dict_first_phone(dict, w); ngs->rhmm_1ph[i].ci2phone = bin_mdef_silphone(ps_search_acmod(ngs)->mdef); hmm_init(ngs->hmmctx, &ngs->rhmm_1ph[i].hmm, TRUE, /* ssid */ bin_mdef_pid2ssid(ps_search_acmod(ngs)->mdef, ngs->rhmm_1ph[i].ciphone), /* tmatid */ bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, ngs->rhmm_1ph[i].ciphone)); ngs->rhmm_1ph[i].next = NULL; ngs->word_chan[w] = (chan_t *) &(ngs->rhmm_1ph[i]); ngs->single_phone_wid[i] = w; i++; } } static void ngram_fwdflat_free_1ph(ngram_search_t *ngs) { int i, w; int n_words = ps_search_n_words(ngs); for (i = w = 0; w < n_words; ++w) { if (!dict_is_single_phone(ps_search_dict(ngs), w)) continue; hmm_deinit(&ngs->rhmm_1ph[i].hmm); ++i; } ckd_free(ngs->rhmm_1ph); ngs->rhmm_1ph = NULL; ckd_free(ngs->single_phone_wid); } void ngram_fwdflat_init(ngram_search_t *ngs) { int n_words; n_words = ps_search_n_words(ngs); ngs->fwdflat_wordlist = ckd_calloc(n_words + 1, sizeof(*ngs->fwdflat_wordlist)); ngs->expand_word_flag = bitvec_alloc(n_words); ngs->expand_word_list = ckd_calloc(n_words + 1, sizeof(*ngs->expand_word_list)); ngs->frm_wordlist = ckd_calloc(ngs->n_frame_alloc, sizeof(*ngs->frm_wordlist)); ngs->min_ef_width = cmd_ln_int32_r(ps_search_config(ngs), "-fwdflatefwid"); ngs->max_sf_win = cmd_ln_int32_r(ps_search_config(ngs), "-fwdflatsfwin"); E_INFO("fwdflat: min_ef_width = %d, max_sf_win = %d\n", ngs->min_ef_width, ngs->max_sf_win); /* No tree-search; pre-build the expansion list, including all LM words. */ if (!ngs->fwdtree) { /* Build full expansion list from LM words. */ ngram_fwdflat_expand_all(ngs); /* Allocate single phone words. */ ngram_fwdflat_allocate_1ph(ngs); } } void ngram_fwdflat_deinit(ngram_search_t *ngs) { double n_speech = (double)ngs->n_tot_frame / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); E_INFO("TOTAL fwdflat %.2f CPU %.3f xRT\n", ngs->fwdflat_perf.t_tot_cpu, ngs->fwdflat_perf.t_tot_cpu / n_speech); E_INFO("TOTAL fwdflat %.2f wall %.3f xRT\n", ngs->fwdflat_perf.t_tot_elapsed, ngs->fwdflat_perf.t_tot_elapsed / n_speech); /* Free single-phone words if we allocated them. */ if (!ngs->fwdtree) { ngram_fwdflat_free_1ph(ngs); } ckd_free(ngs->fwdflat_wordlist); bitvec_free(ngs->expand_word_flag); ckd_free(ngs->expand_word_list); ckd_free(ngs->frm_wordlist); } int ngram_fwdflat_reinit(ngram_search_t *ngs) { /* Reallocate things that depend on the number of words. */ int n_words; ckd_free(ngs->fwdflat_wordlist); ckd_free(ngs->expand_word_list); bitvec_free(ngs->expand_word_flag); n_words = ps_search_n_words(ngs); ngs->fwdflat_wordlist = ckd_calloc(n_words + 1, sizeof(*ngs->fwdflat_wordlist)); ngs->expand_word_flag = bitvec_alloc(n_words); ngs->expand_word_list = ckd_calloc(n_words + 1, sizeof(*ngs->expand_word_list)); /* No tree-search; take care of the expansion list and single phone words. */ if (!ngs->fwdtree) { /* Free single-phone words. */ ngram_fwdflat_free_1ph(ngs); /* Reallocate word_chan. */ ckd_free(ngs->word_chan); ngs->word_chan = ckd_calloc(dict_size(ps_search_dict(ngs)), sizeof(*ngs->word_chan)); /* Rebuild full expansion list from LM words. */ ngram_fwdflat_expand_all(ngs); /* Allocate single phone words. */ ngram_fwdflat_allocate_1ph(ngs); } /* Otherwise there is nothing to do since the wordlist is * generated anew every utterance. */ return 0; } /** * Find all active words in backpointer table and sort by frame. */ static void build_fwdflat_wordlist(ngram_search_t *ngs) { int32 i, f, sf, ef, wid, nwd; bptbl_t *bp; ps_latnode_t *node, *prevnode, *nextnode; /* No tree-search, use statically allocated wordlist. */ if (!ngs->fwdtree) return; memset(ngs->frm_wordlist, 0, ngs->n_frame_alloc * sizeof(*ngs->frm_wordlist)); /* Scan the backpointer table for all active words and record * their exit frames. */ for (i = 0, bp = ngs->bp_table; i < ngs->bpidx; i++, bp++) { sf = (bp->bp < 0) ? 0 : ngs->bp_table[bp->bp].frame + 1; ef = bp->frame; wid = bp->wid; /* Anything that can be transitioned to in the LM can go in * the word list. */ if (!ngram_model_set_known_wid(ngs->lmset, dict_basewid(ps_search_dict(ngs), wid))) continue; /* Look for it in the wordlist. */ for (node = ngs->frm_wordlist[sf]; node && (node->wid != wid); node = node->next); /* Update last end frame. */ if (node) node->lef = ef; else { /* New node; link to head of list */ node = listelem_malloc(ngs->latnode_alloc); node->wid = wid; node->fef = node->lef = ef; node->next = ngs->frm_wordlist[sf]; ngs->frm_wordlist[sf] = node; } } /* Eliminate "unlikely" words, for which there are too few end points */ for (f = 0; f < ngs->n_frame; f++) { prevnode = NULL; for (node = ngs->frm_wordlist[f]; node; node = nextnode) { nextnode = node->next; /* Word has too few endpoints */ if ((node->lef - node->fef < ngs->min_ef_width) || /* Word is
and doesn't actually end in last frame */ ((node->wid == ps_search_finish_wid(ngs)) && (node->lef < ngs->n_frame - 1))) { if (!prevnode) ngs->frm_wordlist[f] = nextnode; else prevnode->next = nextnode; listelem_free(ngs->latnode_alloc, node); } else prevnode = node; } } /* Form overall wordlist for 2nd pass */ nwd = 0; bitvec_clear_all(ngs->word_active, ps_search_n_words(ngs)); for (f = 0; f < ngs->n_frame; f++) { for (node = ngs->frm_wordlist[f]; node; node = node->next) { if (!bitvec_is_set(ngs->word_active, node->wid)) { bitvec_set(ngs->word_active, node->wid); ngs->fwdflat_wordlist[nwd++] = node->wid; } } } ngs->fwdflat_wordlist[nwd] = -1; E_INFO("Utterance vocabulary contains %d words\n", nwd); } /** * Build HMM network for one utterance of fwdflat search. */ static void build_fwdflat_chan(ngram_search_t *ngs) { int32 i, wid, p; root_chan_t *rhmm; chan_t *hmm, *prevhmm; dict_t *dict; dict2pid_t *d2p; dict = ps_search_dict(ngs); d2p = ps_search_dict2pid(ngs); /* Build word HMMs for each word in the lattice. */ for (i = 0; ngs->fwdflat_wordlist[i] >= 0; i++) { wid = ngs->fwdflat_wordlist[i]; /* Single-phone words are permanently allocated */ if (dict_is_single_phone(dict, wid)) continue; assert(ngs->word_chan[wid] == NULL); /* Multiplex root HMM for first phone (one root per word, flat * lexicon). diphone is irrelevant here, for the time being, * at least. */ rhmm = listelem_malloc(ngs->root_chan_alloc); rhmm->ci2phone = dict_second_phone(dict, wid); rhmm->ciphone = dict_first_phone(dict, wid); rhmm->next = NULL; hmm_init(ngs->hmmctx, &rhmm->hmm, TRUE, bin_mdef_pid2ssid(ps_search_acmod(ngs)->mdef, rhmm->ciphone), bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, rhmm->ciphone)); /* HMMs for word-internal phones */ prevhmm = NULL; for (p = 1; p < dict_pronlen(dict, wid) - 1; p++) { hmm = listelem_malloc(ngs->chan_alloc); hmm->ciphone = dict_pron(dict, wid, p); hmm->info.rc_id = (p == dict_pronlen(dict, wid) - 1) ? 0 : -1; hmm->next = NULL; hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, dict2pid_internal(d2p,wid,p), bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, hmm->ciphone)); if (prevhmm) prevhmm->next = hmm; else rhmm->next = hmm; prevhmm = hmm; } /* Right-context phones */ ngram_search_alloc_all_rc(ngs, wid); /* Link in just allocated right-context phones */ if (prevhmm) prevhmm->next = ngs->word_chan[wid]; else rhmm->next = ngs->word_chan[wid]; ngs->word_chan[wid] = (chan_t *) rhmm; } } void ngram_fwdflat_start(ngram_search_t *ngs) { root_chan_t *rhmm; int i; ptmr_reset(&ngs->fwdflat_perf); ptmr_start(&ngs->fwdflat_perf); build_fwdflat_wordlist(ngs); build_fwdflat_chan(ngs); ngs->bpidx = 0; ngs->bss_head = 0; for (i = 0; i < ps_search_n_words(ngs); i++) ngs->word_lat_idx[i] = NO_BP; /* Reset the permanently allocated single-phone words, since they * may have junk left over in them from previous searches. */ for (i = 0; i < ngs->n_1ph_words; i++) { int32 w = ngs->single_phone_wid[i]; rhmm = (root_chan_t *) ngs->word_chan[w]; hmm_clear(&rhmm->hmm); } /* Start search with ; word_chan[] is permanently allocated */ rhmm = (root_chan_t *) ngs->word_chan[ps_search_start_wid(ngs)]; hmm_enter(&rhmm->hmm, 0, NO_BP, 0); ngs->active_word_list[0][0] = ps_search_start_wid(ngs); ngs->n_active_word[0] = 1; ngs->best_score = 0; ngs->renormalized = FALSE; for (i = 0; i < ps_search_n_words(ngs); i++) ngs->last_ltrans[i].sf = -1; if (!ngs->fwdtree) ngs->n_frame = 0; ngs->st.n_fwdflat_chan = 0; ngs->st.n_fwdflat_words = 0; ngs->st.n_fwdflat_word_transition = 0; ngs->st.n_senone_active_utt = 0; } static void compute_fwdflat_sen_active(ngram_search_t *ngs, int frame_idx) { int32 i, nw, w; int32 *awl; root_chan_t *rhmm; chan_t *hmm; acmod_clear_active(ps_search_acmod(ngs)); nw = ngs->n_active_word[frame_idx & 0x1]; awl = ngs->active_word_list[frame_idx & 0x1]; for (i = 0; i < nw; i++) { w = *(awl++); rhmm = (root_chan_t *)ngs->word_chan[w]; if (hmm_frame(&rhmm->hmm) == frame_idx) { acmod_activate_hmm(ps_search_acmod(ngs), &rhmm->hmm); } for (hmm = rhmm->next; hmm; hmm = hmm->next) { if (hmm_frame(&hmm->hmm) == frame_idx) { acmod_activate_hmm(ps_search_acmod(ngs), &hmm->hmm); } } } } static void fwdflat_eval_chan(ngram_search_t *ngs, int frame_idx) { int32 i, w, nw, bestscore; int32 *awl; root_chan_t *rhmm; chan_t *hmm; nw = ngs->n_active_word[frame_idx & 0x1]; awl = ngs->active_word_list[frame_idx & 0x1]; bestscore = WORST_SCORE; ngs->st.n_fwdflat_words += nw; /* Scan all active words. */ for (i = 0; i < nw; i++) { w = *(awl++); rhmm = (root_chan_t *) ngs->word_chan[w]; if (hmm_frame(&rhmm->hmm) == frame_idx) { int32 score = chan_v_eval(rhmm); if ((score BETTER_THAN bestscore) && (w != ps_search_finish_wid(ngs))) bestscore = score; ngs->st.n_fwdflat_chan++; } for (hmm = rhmm->next; hmm; hmm = hmm->next) { if (hmm_frame(&hmm->hmm) == frame_idx) { int32 score = chan_v_eval(hmm); if (score BETTER_THAN bestscore) bestscore = score; ngs->st.n_fwdflat_chan++; } } } ngs->best_score = bestscore; } static void fwdflat_prune_chan(ngram_search_t *ngs, int frame_idx) { int32 i, nw, cf, nf, w, pip, newscore, thresh, wordthresh; int32 *awl; root_chan_t *rhmm; chan_t *hmm, *nexthmm; cf = frame_idx; nf = cf + 1; nw = ngs->n_active_word[cf & 0x1]; awl = ngs->active_word_list[cf & 0x1]; bitvec_clear_all(ngs->word_active, ps_search_n_words(ngs)); thresh = ngs->best_score + ngs->fwdflatbeam; wordthresh = ngs->best_score + ngs->fwdflatwbeam; pip = ngs->pip; E_DEBUG(3,("frame %d thresh %d wordthresh %d\n", frame_idx, thresh, wordthresh)); /* Scan all active words. */ for (i = 0; i < nw; i++) { w = *(awl++); rhmm = (root_chan_t *) ngs->word_chan[w]; /* Propagate active root channels */ if (hmm_frame(&rhmm->hmm) == cf && hmm_bestscore(&rhmm->hmm) BETTER_THAN thresh) { hmm_frame(&rhmm->hmm) = nf; bitvec_set(ngs->word_active, w); /* Transitions out of root channel */ newscore = hmm_out_score(&rhmm->hmm); if (rhmm->next) { assert(!dict_is_single_phone(ps_search_dict(ngs), w)); newscore += pip; if (newscore BETTER_THAN thresh) { hmm = rhmm->next; /* Enter all right context phones */ if (hmm->info.rc_id >= 0) { for (; hmm; hmm = hmm->next) { if ((hmm_frame(&hmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&hmm->hmm))) { hmm_enter(&hmm->hmm, newscore, hmm_out_history(&rhmm->hmm), nf); } } } /* Just a normal word internal phone */ else { if ((hmm_frame(&hmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&hmm->hmm))) { hmm_enter(&hmm->hmm, newscore, hmm_out_history(&rhmm->hmm), nf); } } } } else { assert(dict_is_single_phone(ps_search_dict(ngs), w)); /* Word exit for single-phone words (where did their * whmms come from?) (either from * ngram_search_fwdtree, or from * ngram_fwdflat_allocate_1ph(), that's where) */ if (newscore BETTER_THAN wordthresh) { ngram_search_save_bp(ngs, cf, w, newscore, hmm_out_history(&rhmm->hmm), 0); } } } /* Transitions out of non-root channels. */ for (hmm = rhmm->next; hmm; hmm = hmm->next) { if (hmm_frame(&hmm->hmm) >= cf) { /* Propagate forward HMMs inside the beam. */ if (hmm_bestscore(&hmm->hmm) BETTER_THAN thresh) { hmm_frame(&hmm->hmm) = nf; bitvec_set(ngs->word_active, w); newscore = hmm_out_score(&hmm->hmm); /* Word-internal phones */ if (hmm->info.rc_id < 0) { newscore += pip; if (newscore BETTER_THAN thresh) { nexthmm = hmm->next; /* Enter all right-context phones. */ if (nexthmm->info.rc_id >= 0) { for (; nexthmm; nexthmm = nexthmm->next) { if ((hmm_frame(&nexthmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&nexthmm->hmm))) { hmm_enter(&nexthmm->hmm, newscore, hmm_out_history(&hmm->hmm), nf); } } } /* Enter single word-internal phone. */ else { if ((hmm_frame(&nexthmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&nexthmm->hmm))) { hmm_enter(&nexthmm->hmm, newscore, hmm_out_history(&hmm->hmm), nf); } } } } /* Right-context phones - apply word beam and exit. */ else { if (newscore BETTER_THAN wordthresh) { ngram_search_save_bp(ngs, cf, w, newscore, hmm_out_history(&hmm->hmm), hmm->info.rc_id); } } } /* Zero out inactive HMMs. */ else if (hmm_frame(&hmm->hmm) != nf) { hmm_clear_scores(&hmm->hmm); } } } } } static void get_expand_wordlist(ngram_search_t *ngs, int32 frm, int32 win) { int32 f, sf, ef; ps_latnode_t *node; if (!ngs->fwdtree) { ngs->st.n_fwdflat_word_transition += ngs->n_expand_words; return; } sf = frm - win; if (sf < 0) sf = 0; ef = frm + win; if (ef > ngs->n_frame) ef = ngs->n_frame; bitvec_clear_all(ngs->expand_word_flag, ps_search_n_words(ngs)); ngs->n_expand_words = 0; for (f = sf; f < ef; f++) { for (node = ngs->frm_wordlist[f]; node; node = node->next) { if (!bitvec_is_set(ngs->expand_word_flag, node->wid)) { ngs->expand_word_list[ngs->n_expand_words++] = node->wid; bitvec_set(ngs->expand_word_flag, node->wid); } } } ngs->expand_word_list[ngs->n_expand_words] = -1; ngs->st.n_fwdflat_word_transition += ngs->n_expand_words; } static void fwdflat_word_transition(ngram_search_t *ngs, int frame_idx) { int32 cf, nf, b, thresh, pip, i, nw, w, newscore; int32 best_silrc_score = 0, best_silrc_bp = 0; /* FIXME: good defaults? */ bptbl_t *bp; int32 *rcss; root_chan_t *rhmm; int32 *awl; float32 lwf; dict_t *dict = ps_search_dict(ngs); dict2pid_t *d2p = ps_search_dict2pid(ngs); cf = frame_idx; nf = cf + 1; thresh = ngs->best_score + ngs->fwdflatbeam; pip = ngs->pip; best_silrc_score = WORST_SCORE; lwf = ngs->fwdflat_fwdtree_lw_ratio; /* Search for all words starting within a window of this frame. * These are the successors for words exiting now. */ get_expand_wordlist(ngs, cf, ngs->max_sf_win); /* Scan words exited in current frame */ for (b = ngs->bp_table_idx[cf]; b < ngs->bpidx; b++) { xwdssid_t *rssid; int32 silscore; bp = ngs->bp_table + b; ngs->word_lat_idx[bp->wid] = NO_BP; if (bp->wid == ps_search_finish_wid(ngs)) continue; /* DICT2PID location */ /* Get the mapping from right context phone ID to index in the * right context table and the bscore_stack. */ rcss = ngs->bscore_stack + bp->s_idx; if (bp->last2_phone == -1) rssid = NULL; else rssid = dict2pid_rssid(d2p, bp->last_phone, bp->last2_phone); /* Transition to all successor words. */ for (i = 0; ngs->expand_word_list[i] >= 0; i++) { int32 n_used; w = ngs->expand_word_list[i]; /* Get the exit score we recorded in save_bwd_ptr(), or * something approximating it. */ if (rssid) newscore = rcss[rssid->cimap[dict_first_phone(dict, w)]]; else newscore = bp->score; if (newscore == WORST_SCORE) continue; /* FIXME: Floating point... */ newscore += lwf * (ngram_tg_score(ngs->lmset, dict_basewid(dict, w), bp->real_wid, bp->prev_real_wid, &n_used) >> SENSCR_SHIFT); newscore += pip; /* Enter the next word */ if (newscore BETTER_THAN thresh) { rhmm = (root_chan_t *) ngs->word_chan[w]; if ((hmm_frame(&rhmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { hmm_enter(&rhmm->hmm, newscore, b, nf); /* DICT2PID: This is where mpx ssids get introduced. */ /* Look up the ssid to use when entering this mpx triphone. */ hmm_mpx_ssid(&rhmm->hmm, 0) = dict2pid_ldiph_lc(d2p, rhmm->ciphone, rhmm->ci2phone, dict_last_phone(dict, bp->wid)); assert(IS_S3SSID(hmm_mpx_ssid(&rhmm->hmm, 0))); E_DEBUG(6,("ssid %d(%d,%d) = %d\n", rhmm->ciphone, dict_last_phone(dict, bp->wid), rhmm->ci2phone, hmm_mpx_ssid(&rhmm->hmm, 0))); bitvec_set(ngs->word_active, w); } } } /* Get the best exit into silence. */ if (rssid) silscore = rcss[rssid->cimap[ps_search_acmod(ngs)->mdef->sil]]; else silscore = bp->score; if (silscore BETTER_THAN best_silrc_score) { best_silrc_score = silscore; best_silrc_bp = b; } } /* Transition to */ newscore = best_silrc_score + ngs->silpen + pip; if ((newscore BETTER_THAN thresh) && (newscore BETTER_THAN WORST_SCORE)) { w = ps_search_silence_wid(ngs); rhmm = (root_chan_t *) ngs->word_chan[w]; if ((hmm_frame(&rhmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { hmm_enter(&rhmm->hmm, newscore, best_silrc_bp, nf); bitvec_set(ngs->word_active, w); } } /* Transition to noise words */ newscore = best_silrc_score + ngs->fillpen + pip; if ((newscore BETTER_THAN thresh) && (newscore BETTER_THAN WORST_SCORE)) { for (w = dict_filler_start(dict); w <= dict_filler_end(dict); w++) { if (w == ps_search_silence_wid(ngs)) continue; rhmm = (root_chan_t *) ngs->word_chan[w]; /* Noise words that aren't a single phone will have NULL here. */ if (rhmm == NULL) continue; if ((hmm_frame(&rhmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { hmm_enter(&rhmm->hmm, newscore, best_silrc_bp, nf); bitvec_set(ngs->word_active, w); } } } /* Reset initial channels of words that have become inactive even after word trans. */ nw = ngs->n_active_word[cf & 0x1]; awl = ngs->active_word_list[cf & 0x1]; for (i = 0; i < nw; i++) { w = *(awl++); rhmm = (root_chan_t *) ngs->word_chan[w]; if (hmm_frame(&rhmm->hmm) == cf) { hmm_clear_scores(&rhmm->hmm); } } } static void fwdflat_renormalize_scores(ngram_search_t *ngs, int frame_idx, int32 norm) { root_chan_t *rhmm; chan_t *hmm; int32 i, nw, cf, w, *awl; cf = frame_idx; /* Renormalize individual word channels */ nw = ngs->n_active_word[cf & 0x1]; awl = ngs->active_word_list[cf & 0x1]; for (i = 0; i < nw; i++) { w = *(awl++); rhmm = (root_chan_t *) ngs->word_chan[w]; if (hmm_frame(&rhmm->hmm) == cf) { hmm_normalize(&rhmm->hmm, norm); } for (hmm = rhmm->next; hmm; hmm = hmm->next) { if (hmm_frame(&hmm->hmm) == cf) { hmm_normalize(&hmm->hmm, norm); } } } ngs->renormalized = TRUE; } int ngram_fwdflat_search(ngram_search_t *ngs, int frame_idx) { int16 const *senscr; int32 nf, i, j; int32 *nawl; /* Activate our HMMs for the current frame if need be. */ if (!ps_search_acmod(ngs)->compallsen) compute_fwdflat_sen_active(ngs, frame_idx); /* Compute GMM scores for the current frame. */ senscr = acmod_score(ps_search_acmod(ngs), &frame_idx); ngs->st.n_senone_active_utt += ps_search_acmod(ngs)->n_senone_active; /* Mark backpointer table for current frame. */ ngram_search_mark_bptable(ngs, frame_idx); /* If the best score is equal to or worse than WORST_SCORE, * recognition has failed, don't bother to keep trying. */ if (ngs->best_score == WORST_SCORE || ngs->best_score WORSE_THAN WORST_SCORE) return 0; /* Renormalize if necessary */ if (ngs->best_score + (2 * ngs->beam) WORSE_THAN WORST_SCORE) { E_INFO("Renormalizing Scores at frame %d, best score %d\n", frame_idx, ngs->best_score); fwdflat_renormalize_scores(ngs, frame_idx, ngs->best_score); } ngs->best_score = WORST_SCORE; hmm_context_set_senscore(ngs->hmmctx, senscr); /* Evaluate HMMs */ fwdflat_eval_chan(ngs, frame_idx); /* Prune HMMs and do phone transitions. */ fwdflat_prune_chan(ngs, frame_idx); /* Do word transitions. */ fwdflat_word_transition(ngs, frame_idx); /* Create next active word list, skip fillers */ nf = frame_idx + 1; nawl = ngs->active_word_list[nf & 0x1]; for (i = 0, j = 0; ngs->fwdflat_wordlist[i] >= 0; i++) { int32 wid = ngs->fwdflat_wordlist[i]; if (bitvec_is_set(ngs->word_active, wid) && wid < ps_search_start_wid(ngs)) { *(nawl++) = wid; j++; } } /* Add fillers */ for (i = ps_search_start_wid(ngs); i < ps_search_n_words(ngs); i++) { if (bitvec_is_set(ngs->word_active, i)) { *(nawl++) = i; j++; } } if (!ngs->fwdtree) ++ngs->n_frame; ngs->n_active_word[nf & 0x1] = j; /* Return the number of frames processed. */ return 1; } /** * Destroy wordlist from the current utterance. */ static void destroy_fwdflat_wordlist(ngram_search_t *ngs) { ps_latnode_t *node, *tnode; int32 f; if (!ngs->fwdtree) return; for (f = 0; f < ngs->n_frame; f++) { for (node = ngs->frm_wordlist[f]; node; node = tnode) { tnode = node->next; listelem_free(ngs->latnode_alloc, node); } } } /** * Free HMM network for one utterance of fwdflat search. */ static void destroy_fwdflat_chan(ngram_search_t *ngs) { int32 i, wid; for (i = 0; ngs->fwdflat_wordlist[i] >= 0; i++) { root_chan_t *rhmm; chan_t *thmm; wid = ngs->fwdflat_wordlist[i]; if (dict_is_single_phone(ps_search_dict(ngs),wid)) continue; assert(ngs->word_chan[wid] != NULL); /* The first HMM in ngs->word_chan[wid] was allocated with * ngs->root_chan_alloc, but this will attempt to free it * using ngs->chan_alloc, which will not work. Therefore we * free it manually and move the list forward before handing * it off. */ rhmm = (root_chan_t *)ngs->word_chan[wid]; thmm = rhmm->next; listelem_free(ngs->root_chan_alloc, rhmm); ngs->word_chan[wid] = thmm; ngram_search_free_all_rc(ngs, wid); } } void ngram_fwdflat_finish(ngram_search_t *ngs) { int32 cf; destroy_fwdflat_chan(ngs); destroy_fwdflat_wordlist(ngs); bitvec_clear_all(ngs->word_active, ps_search_n_words(ngs)); /* This is the number of frames processed. */ cf = ps_search_acmod(ngs)->output_frame; /* Add a mark in the backpointer table for one past the final frame. */ ngram_search_mark_bptable(ngs, cf); ptmr_stop(&ngs->fwdflat_perf); /* Print out some statistics. */ if (cf > 0) { double n_speech = (double)(cf + 1) / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); E_INFO("%8d words recognized (%d/fr)\n", ngs->bpidx, (ngs->bpidx + (cf >> 1)) / (cf + 1)); E_INFO("%8d senones evaluated (%d/fr)\n", ngs->st.n_senone_active_utt, (ngs->st.n_senone_active_utt + (cf >> 1)) / (cf + 1)); E_INFO("%8d channels searched (%d/fr)\n", ngs->st.n_fwdflat_chan, ngs->st.n_fwdflat_chan / (cf + 1)); E_INFO("%8d words searched (%d/fr)\n", ngs->st.n_fwdflat_words, ngs->st.n_fwdflat_words / (cf + 1)); E_INFO("%8d word transitions (%d/fr)\n", ngs->st.n_fwdflat_word_transition, ngs->st.n_fwdflat_word_transition / (cf + 1)); E_INFO("fwdflat %.2f CPU %.3f xRT\n", ngs->fwdflat_perf.t_cpu, ngs->fwdflat_perf.t_cpu / n_speech); E_INFO("fwdflat %.2f wall %.3f xRT\n", ngs->fwdflat_perf.t_elapsed, ngs->fwdflat_perf.t_elapsed / n_speech); } } pocketsphinx-5prealpha/src/libpocketsphinx/ms_gauden.h0000664000175000017500000001326612771605033020523 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ #ifndef _LIBFBS_GAUDEN_H_ #define _LIBFBS_GAUDEN_H_ /** \file ms_gauden.h * \brief (Sphinx 3.0 specific) Gaussian density module. * * Gaussian density distribution implementation. There are two major * difference bettwen ms_gauden and cont_mgau. One is the fact that * ms_gauden only take cares of the Gaussian computation part where * cont_mgau actually take care of senone computation as well. The * other is the fact that ms_gauden is a multi-stream implementation * of GMM computation. * */ /* SphinxBase headers. */ #include #include #include /* Local headers. */ #include "vector.h" #include "pocketsphinx_internal.h" #include "hmm.h" #ifdef __cplusplus extern "C" { #endif /** * \struct gauden_dist_t * \brief Structure to store distance (density) values for a given input observation wrt density values in some given codebook. */ typedef struct { int32 id; /**< Index of codeword (gaussian density) */ mfcc_t dist; /**< Density value for input observation wrt above codeword; NOTE: result in logs3 domain, but var_t used for speed */ } gauden_dist_t; /** * \struct gauden_t * \brief Multivariate gaussian mixture density parameters */ typedef struct { mfcc_t ****mean; /**< mean[codebook][feature][codeword] vector */ mfcc_t ****var; /**< like mean; diagonal covariance vector only */ mfcc_t ***det; /**< log(determinant) for each variance vector; actually, log(sqrt(2*pi*det)) */ logmath_t *lmath; /**< log math computation */ int32 n_mgau; /**< Number codebooks */ int32 n_feat; /**< Number feature streams in each codebook */ int32 n_density; /**< Number gaussian densities in each codebook-feature stream */ int32 *featlen; /**< feature length for each feature */ } gauden_t; /** * Read mixture gaussian codebooks from the given files. Allocate memory space needed * for them. Apply the specified variance floor value. * Return value: ptr to the model created; NULL if error. * (See Sphinx3 model file-format documentation.) */ gauden_t * gauden_init (char const *meanfile,/**< Input: File containing means of mixture gaussians */ char const *varfile,/**< Input: File containing variances of mixture gaussians */ float32 varfloor, /**< Input: Floor value to be applied to variances */ logmath_t *lmath ); /** Release memory allocated by gauden_init. */ void gauden_free(gauden_t *g); /**< In: The gauden_t to free */ /** Transform Gaussians according to an MLLR matrix (or, eventually, more). */ int32 gauden_mllr_transform(gauden_t *s, ps_mllr_t *mllr, cmd_ln_t *config); /** * Compute gaussian density values for the given input observation vector wrt the * specified mixture gaussian codebook (which may consist of several feature streams). * Density values are left UNnormalized. * @return 0 if successful, -1 otherwise. */ int32 gauden_dist (gauden_t *g, /**< In: handle to entire ensemble of codebooks */ int mgau, /**< In: codebook for which density values to be evaluated (g->{mean,var}[mgau]) */ int n_top, /**< In: Number top densities to be evaluated */ mfcc_t **obs, /**< In: Observation vector; obs[f] = for feature f */ gauden_dist_t **out_dist /**< Out: n_top best codewords and density values, in worsening order, for each feature stream. out_dist[f][i] = i-th best density for feature f. Caller must allocate memory for this output */ ); /** Dump the definitionn of Gaussian distribution. */ void gauden_dump (const gauden_t *g /**< In: Gaussian distribution g*/ ); /** Dump the definition of Gaussian distribution of a particular index to the standard output stream */ void gauden_dump_ind (const gauden_t *g, /**< In: Gaussian distribution g*/ int senidx /**< In: The senone index of the Gaussian */ ); #ifdef __cplusplus } #endif #endif /* GAUDEN_H */ pocketsphinx-5prealpha/src/libpocketsphinx/dict.c0000664000175000017500000003442112771605033017473 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* System headers. */ #include /* SphinxBase headers. */ #include #include /* Local headers. */ #include "dict.h" #define DELIM " \t\n" /* Set of field separator characters */ #define DEFAULT_NUM_PHONE (MAX_S3CIPID+1) #if WIN32 #define snprintf sprintf_s #endif extern const char *const cmu6_lts_phone_table[]; static s3cipid_t dict_ciphone_id(dict_t * d, const char *str) { if (d->nocase) return bin_mdef_ciphone_id_nocase(d->mdef, str); else return bin_mdef_ciphone_id(d->mdef, str); } const char * dict_ciphone_str(dict_t * d, s3wid_t wid, int32 pos) { assert(d != NULL); assert((wid >= 0) && (wid < d->n_word)); assert((pos >= 0) && (pos < d->word[wid].pronlen)); return bin_mdef_ciphone_str(d->mdef, d->word[wid].ciphone[pos]); } s3wid_t dict_add_word(dict_t * d, char const *word, s3cipid_t const * p, int32 np) { int32 len; dictword_t *wordp; s3wid_t newwid; char *wword; if (d->n_word >= d->max_words) { E_INFO("Reallocating to %d KiB for word entries\n", (d->max_words + S3DICT_INC_SZ) * sizeof(dictword_t) / 1024); d->word = (dictword_t *) ckd_realloc(d->word, (d->max_words + S3DICT_INC_SZ) * sizeof(dictword_t)); d->max_words = d->max_words + S3DICT_INC_SZ; } wordp = d->word + d->n_word; wordp->word = (char *) ckd_salloc(word); /* Freed in dict_free */ /* Determine base/alt wids */ wword = ckd_salloc(word); if ((len = dict_word2basestr(wword)) > 0) { int32 w; /* Truncated to a baseword string; find its ID */ if (hash_table_lookup_int32(d->ht, wword, &w) < 0) { E_ERROR("Missing base word for: %s\n", word); ckd_free(wword); ckd_free(wordp->word); wordp->word = NULL; return BAD_S3WID; } /* Link into alt list */ wordp->basewid = w; wordp->alt = d->word[w].alt; d->word[w].alt = d->n_word; } else { wordp->alt = BAD_S3WID; wordp->basewid = d->n_word; } ckd_free(wword); /* Associate word string with d->n_word in hash table */ if (hash_table_enter_int32(d->ht, wordp->word, d->n_word) != d->n_word) { ckd_free(wordp->word); wordp->word = NULL; return BAD_S3WID; } /* Fill in word entry, and set defaults */ if (p && (np > 0)) { wordp->ciphone = (s3cipid_t *) ckd_malloc(np * sizeof(s3cipid_t)); /* Freed in dict_free */ memcpy(wordp->ciphone, p, np * sizeof(s3cipid_t)); wordp->pronlen = np; } else { wordp->ciphone = NULL; wordp->pronlen = 0; } newwid = d->n_word++; return newwid; } static int32 dict_read(FILE * fp, dict_t * d) { lineiter_t *li; char **wptr; s3cipid_t *p; int32 lineno, nwd; s3wid_t w; int32 i, maxwd; size_t stralloc, phnalloc; maxwd = 512; p = (s3cipid_t *) ckd_calloc(maxwd + 4, sizeof(*p)); wptr = (char **) ckd_calloc(maxwd, sizeof(char *)); /* Freed below */ lineno = 0; stralloc = phnalloc = 0; for (li = lineiter_start(fp); li; li = lineiter_next(li)) { lineno++; if (0 == strncmp(li->buf, "##", 2) || 0 == strncmp(li->buf, ";;", 2)) continue; if ((nwd = str2words(li->buf, wptr, maxwd)) < 0) { /* Increase size of p, wptr. */ nwd = str2words(li->buf, NULL, 0); assert(nwd > maxwd); /* why else would it fail? */ maxwd = nwd; p = (s3cipid_t *) ckd_realloc(p, (maxwd + 4) * sizeof(*p)); wptr = (char **) ckd_realloc(wptr, maxwd * sizeof(*wptr)); } if (nwd == 0) /* Empty line */ continue; /* wptr[0] is the word-string and wptr[1..nwd-1] the pronunciation sequence */ if (nwd == 1) { E_ERROR("Line %d: No pronunciation for word '%s'; ignored\n", lineno, wptr[0]); continue; } /* Convert pronunciation string to CI-phone-ids */ for (i = 1; i < nwd; i++) { p[i - 1] = dict_ciphone_id(d, wptr[i]); if (NOT_S3CIPID(p[i - 1])) { E_ERROR("Line %d: Phone '%s' is mising in the acoustic model; word '%s' ignored\n", lineno, wptr[i], wptr[0]); break; } } if (i == nwd) { /* All CI-phones successfully converted to IDs */ w = dict_add_word(d, wptr[0], p, nwd - 1); if (NOT_S3WID(w)) E_ERROR ("Line %d: Failed to add the word '%s' (duplicate?); ignored\n", lineno, wptr[0]); else { stralloc += strlen(d->word[w].word); phnalloc += d->word[w].pronlen * sizeof(s3cipid_t); } } } E_INFO("Dictionary size %d, allocated %d KiB for strings, %d KiB for phones\n", dict_size(d), (int)stralloc / 1024, (int)phnalloc / 1024); ckd_free(p); ckd_free(wptr); return 0; } int dict_write(dict_t *dict, char const *filename, char const *format) { FILE *fh; int i; if ((fh = fopen(filename, "w")) == NULL) { E_ERROR_SYSTEM("Failed to open '%s'", filename); return -1; } for (i = 0; i < dict->n_word; ++i) { char *phones; int j, phlen; if (!dict_real_word(dict, i)) continue; for (phlen = j = 0; j < dict_pronlen(dict, i); ++j) phlen += strlen(dict_ciphone_str(dict, i, j)) + 1; phones = ckd_calloc(1, phlen); for (j = 0; j < dict_pronlen(dict, i); ++j) { strcat(phones, dict_ciphone_str(dict, i, j)); if (j != dict_pronlen(dict, i) - 1) strcat(phones, " "); } fprintf(fh, "%-30s %s\n", dict_wordstr(dict, i), phones); ckd_free(phones); } fclose(fh); return 0; } dict_t * dict_init(cmd_ln_t *config, bin_mdef_t * mdef) { FILE *fp, *fp2; int32 n; lineiter_t *li; dict_t *d; s3cipid_t sil; char const *dictfile = NULL, *fillerfile = NULL; if (config) { dictfile = cmd_ln_str_r(config, "-dict"); fillerfile = cmd_ln_str_r(config, "_fdict"); } /* * First obtain #words in dictionary (for hash table allocation). * Reason: The PC NT system doesn't like to grow memory gradually. Better to allocate * all the required memory in one go. */ fp = NULL; n = 0; if (dictfile) { if ((fp = fopen(dictfile, "r")) == NULL) { E_ERROR_SYSTEM("Failed to open dictionary file '%s' for reading", dictfile); return NULL; } for (li = lineiter_start(fp); li; li = lineiter_next(li)) { if (0 != strncmp(li->buf, "##", 2) && 0 != strncmp(li->buf, ";;", 2)) n++; } fseek(fp, 0L, SEEK_SET); } fp2 = NULL; if (fillerfile) { if ((fp2 = fopen(fillerfile, "r")) == NULL) { E_ERROR_SYSTEM("Failed to open filler dictionary file '%s' for reading", fillerfile); fclose(fp); return NULL; } for (li = lineiter_start(fp2); li; li = lineiter_next(li)) { if (0 != strncmp(li->buf, "##", 2) && 0 != strncmp(li->buf, ";;", 2)) n++; } fseek(fp2, 0L, SEEK_SET); } /* * Allocate dict entries. HACK!! Allow some extra entries for words not in file. * Also check for type size restrictions. */ d = (dict_t *) ckd_calloc(1, sizeof(dict_t)); /* freed in dict_free() */ d->refcnt = 1; d->max_words = (n + S3DICT_INC_SZ < MAX_S3WID) ? n + S3DICT_INC_SZ : MAX_S3WID; if (n >= MAX_S3WID) { E_ERROR("Number of words in dictionaries (%d) exceeds limit (%d)\n", n, MAX_S3WID); fclose(fp); fclose(fp2); ckd_free(d); return NULL; } E_INFO("Allocating %d * %d bytes (%d KiB) for word entries\n", d->max_words, sizeof(dictword_t), d->max_words * sizeof(dictword_t) / 1024); d->word = (dictword_t *) ckd_calloc(d->max_words, sizeof(dictword_t)); /* freed in dict_free() */ d->n_word = 0; if (mdef) d->mdef = bin_mdef_retain(mdef); /* Create new hash table for word strings; case-insensitive word strings */ if (config && cmd_ln_exists_r(config, "-dictcase")) d->nocase = cmd_ln_boolean_r(config, "-dictcase"); d->ht = hash_table_new(d->max_words, d->nocase); /* Digest main dictionary file */ if (fp) { E_INFO("Reading main dictionary: %s\n", dictfile); dict_read(fp, d); fclose(fp); E_INFO("%d words read\n", d->n_word); } if (dict_wordid(d, S3_START_WORD) != BAD_S3WID) { E_ERROR("Remove sentence start word '' from the dictionary\n"); dict_free(d); return NULL; } if (dict_wordid(d, S3_FINISH_WORD) != BAD_S3WID) { E_ERROR("Remove sentence start word '' from the dictionary\n"); dict_free(d); return NULL; } if (dict_wordid(d, S3_SILENCE_WORD) != BAD_S3WID) { E_ERROR("Remove silence word '' from the dictionary\n"); dict_free(d); return NULL; } /* Now the filler dictionary file, if it exists */ d->filler_start = d->n_word; if (fillerfile) { E_INFO("Reading filler dictionary: %s\n", fillerfile); dict_read(fp2, d); fclose(fp2); E_INFO("%d words read\n", d->n_word - d->filler_start); } if (mdef) sil = bin_mdef_silphone(mdef); else sil = 0; if (dict_wordid(d, S3_START_WORD) == BAD_S3WID) { dict_add_word(d, S3_START_WORD, &sil, 1); } if (dict_wordid(d, S3_FINISH_WORD) == BAD_S3WID) { dict_add_word(d, S3_FINISH_WORD, &sil, 1); } if (dict_wordid(d, S3_SILENCE_WORD) == BAD_S3WID) { dict_add_word(d, S3_SILENCE_WORD, &sil, 1); } d->filler_end = d->n_word - 1; /* Initialize distinguished word-ids */ d->startwid = dict_wordid(d, S3_START_WORD); d->finishwid = dict_wordid(d, S3_FINISH_WORD); d->silwid = dict_wordid(d, S3_SILENCE_WORD); if ((d->filler_start > d->filler_end) || (!dict_filler_word(d, d->silwid))) { E_ERROR("Word '%s' must occur (only) in filler dictionary\n", S3_SILENCE_WORD); dict_free(d); return NULL; } /* No check that alternative pronunciations for filler words are in filler range!! */ return d; } s3wid_t dict_wordid(dict_t *d, const char *word) { int32 w; assert(d); assert(word); if (hash_table_lookup_int32(d->ht, word, &w) < 0) return (BAD_S3WID); return w; } int dict_filler_word(dict_t *d, s3wid_t w) { assert(d); assert((w >= 0) && (w < d->n_word)); w = dict_basewid(d, w); if ((w == d->startwid) || (w == d->finishwid)) return 0; if ((w >= d->filler_start) && (w <= d->filler_end)) return 1; return 0; } int dict_real_word(dict_t *d, s3wid_t w) { assert(d); assert((w >= 0) && (w < d->n_word)); w = dict_basewid(d, w); if ((w == d->startwid) || (w == d->finishwid)) return 0; if ((w >= d->filler_start) && (w <= d->filler_end)) return 0; return 1; } int32 dict_word2basestr(char *word) { int32 i, len; len = strlen(word); if (word[len - 1] == ')') { for (i = len - 2; (i > 0) && (word[i] != '('); --i); if (i > 0) { /* The word is of the form (...); strip from left-paren */ word[i] = '\0'; return i; } } return -1; } dict_t * dict_retain(dict_t *d) { ++d->refcnt; return d; } int dict_free(dict_t * d) { int i; dictword_t *word; if (d == NULL) return 0; if (--d->refcnt > 0) return d->refcnt; /* First Step, free all memory allocated for each word */ for (i = 0; i < d->n_word; i++) { word = (dictword_t *) & (d->word[i]); if (word->word) ckd_free((void *) word->word); if (word->ciphone) ckd_free((void *) word->ciphone); } if (d->word) ckd_free((void *) d->word); if (d->ht) hash_table_free(d->ht); if (d->mdef) bin_mdef_free(d->mdef); ckd_free((void *) d); return 0; } void dict_report(dict_t * d) { E_INFO_NOFN("Initialization of dict_t, report:\n"); E_INFO_NOFN("Max word: %d\n", d->max_words); E_INFO_NOFN("No of word: %d\n", d->n_word); E_INFO_NOFN("\n"); } pocketsphinx-5prealpha/src/libpocketsphinx/state_align_search.c0000664000175000017500000002352412771605033022371 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2010 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file state_align_search.c State (and phone and word) alignment search. */ #include "state_align_search.h" static int state_align_search_start(ps_search_t *search) { state_align_search_t *sas = (state_align_search_t *)search; /* Activate the initial state. */ hmm_enter(sas->hmms, 0, 0, 0); return 0; } static void renormalize_hmms(state_align_search_t *sas, int frame_idx, int32 norm) { int i; for (i = 0; i < sas->n_phones; ++i) hmm_normalize(sas->hmms + i, norm); } static int32 evaluate_hmms(state_align_search_t *sas, int16 const *senscr, int frame_idx) { int32 bs = WORST_SCORE; int i; hmm_context_set_senscore(sas->hmmctx, senscr); for (i = 0; i < sas->n_phones; ++i) { hmm_t *hmm = sas->hmms + i; int32 score; if (hmm_frame(hmm) < frame_idx) continue; score = hmm_vit_eval(hmm); if (score BETTER_THAN bs) { bs = score; } } return bs; } static void prune_hmms(state_align_search_t *sas, int frame_idx) { int nf = frame_idx + 1; int i; /* Check all phones to see if they remain active in the next frame. */ for (i = 0; i < sas->n_phones; ++i) { hmm_t *hmm = sas->hmms + i; if (hmm_frame(hmm) < frame_idx) continue; hmm_frame(hmm) = nf; } } static void phone_transition(state_align_search_t *sas, int frame_idx) { int nf = frame_idx + 1; int i; for (i = 0; i < sas->n_phones - 1; ++i) { hmm_t *hmm, *nhmm; int32 newphone_score; hmm = sas->hmms + i; if (hmm_frame(hmm) != nf) continue; newphone_score = hmm_out_score(hmm); /* Transition into next phone using the usual Viterbi rule. */ nhmm = hmm + 1; if (hmm_frame(nhmm) < frame_idx || newphone_score BETTER_THAN hmm_in_score(nhmm)) { hmm_enter(nhmm, newphone_score, hmm_out_history(hmm), nf); } } } #define TOKEN_STEP 20 static void extend_tokenstack(state_align_search_t *sas, int frame_idx) { if (frame_idx >= sas->n_fr_alloc) { sas->n_fr_alloc = frame_idx + TOKEN_STEP + 1; sas->tokens = ckd_realloc(sas->tokens, sas->n_emit_state * sas->n_fr_alloc * sizeof(*sas->tokens)); } memset(sas->tokens + frame_idx * sas->n_emit_state, 0xff, sas->n_emit_state * sizeof(*sas->tokens)); } static void record_transitions(state_align_search_t *sas, int frame_idx) { state_align_hist_t *tokens; int i; /* Push another frame of tokens on the stack. */ extend_tokenstack(sas, frame_idx); tokens = sas->tokens + frame_idx * sas->n_emit_state; /* Scan all active HMMs */ for (i = 0; i < sas->n_phones; ++i) { hmm_t *hmm = sas->hmms + i; int j; if (hmm_frame(hmm) < frame_idx) continue; for (j = 0; j < sas->hmmctx->n_emit_state; ++j) { int state_idx = i * sas->hmmctx->n_emit_state + j; /* Record their backpointers on the token stack. */ tokens[state_idx].id = hmm_history(hmm, j); tokens[state_idx].score = hmm_score(hmm, j); /* Update backpointer fields with state index. */ hmm_history(hmm, j) = state_idx; } } } static int state_align_search_step(ps_search_t *search, int frame_idx) { state_align_search_t *sas = (state_align_search_t *)search; acmod_t *acmod = ps_search_acmod(search); int16 const *senscr; int i; /* Calculate senone scores. */ for (i = 0; i < sas->n_phones; ++i) acmod_activate_hmm(acmod, sas->hmms + i); senscr = acmod_score(acmod, &frame_idx); /* Renormalize here if needed. */ /* FIXME: Make sure to (unit-)test this!!! */ if ((sas->best_score - 0x300000) WORSE_THAN WORST_SCORE) { E_INFO("Renormalizing Scores at frame %d, best score %d\n", frame_idx, sas->best_score); renormalize_hmms(sas, frame_idx, sas->best_score); } /* Viterbi step. */ sas->best_score = evaluate_hmms(sas, senscr, frame_idx); prune_hmms(sas, frame_idx); /* Transition out of non-emitting states. */ phone_transition(sas, frame_idx); /* Generate new tokens from best path results. */ record_transitions(sas, frame_idx); /* Update frame counter */ sas->frame = frame_idx; return 0; } static int state_align_search_finish(ps_search_t *search) { state_align_search_t *sas = (state_align_search_t *)search; hmm_t *final_phone = sas->hmms + sas->n_phones - 1; ps_alignment_iter_t *itor; ps_alignment_entry_t *ent; int last_frame, cur_frame; state_align_hist_t last, cur; /* Best state exiting the last cur_frame. */ last.id = cur.id = hmm_out_history(final_phone); last.score = hmm_out_score(final_phone); if (last.id == 0xffff) { E_ERROR("Failed to reach final state in alignment\n"); return -1; } itor = ps_alignment_states(sas->al); last_frame = sas->frame + 1; for (cur_frame = sas->frame - 1; cur_frame >= 0; --cur_frame) { cur = sas->tokens[cur_frame * sas->n_emit_state + cur.id]; /* State boundary, update alignment entry for next state. */ if (cur.id != last.id) { itor = ps_alignment_iter_goto(itor, last.id); assert(itor != NULL); ent = ps_alignment_iter_get(itor); ent->start = cur_frame + 1; ent->duration = last_frame - ent->start; ent->score = last.score - cur.score; E_DEBUG(1,("state %d start %d end %d\n", last.id, ent->start, last_frame)); last = cur; last_frame = cur_frame + 1; } } /* Update alignment entry for initial state. */ itor = ps_alignment_iter_goto(itor, 0); assert(itor != NULL); ent = ps_alignment_iter_get(itor); ent->start = 0; ent->duration = last_frame; E_DEBUG(1,("state %d start %d end %d\n", 0, ent->start, last_frame)); ps_alignment_iter_free(itor); ps_alignment_propagate(sas->al); return 0; } static int state_align_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) { /* This does nothing. */ return 0; } static void state_align_search_free(ps_search_t *search) { state_align_search_t *sas = (state_align_search_t *)search; ps_search_base_free(search); ckd_free(sas->hmms); ckd_free(sas->tokens); hmm_context_free(sas->hmmctx); ckd_free(sas); } static ps_searchfuncs_t state_align_search_funcs = { /* start: */ state_align_search_start, /* step: */ state_align_search_step, /* finish: */ state_align_search_finish, /* reinit: */ state_align_search_reinit, /* free: */ state_align_search_free, /* lattice: */ NULL, /* hyp: */ NULL, /* prob: */ NULL, /* seg_iter: */ NULL, }; ps_search_t * state_align_search_init(const char *name, cmd_ln_t *config, acmod_t *acmod, ps_alignment_t *al) { state_align_search_t *sas; ps_alignment_iter_t *itor; hmm_t *hmm; sas = ckd_calloc(1, sizeof(*sas)); ps_search_init(ps_search_base(sas), &state_align_search_funcs, PS_SEARCH_TYPE_STATE_ALIGN, name, config, acmod, al->d2p->dict, al->d2p); sas->hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->mdef), acmod->tmat->tp, NULL, acmod->mdef->sseq); if (sas->hmmctx == NULL) { ckd_free(sas); return NULL; } sas->al = al; /* Generate HMM vector from phone level of alignment. */ sas->n_phones = ps_alignment_n_phones(al); sas->n_emit_state = ps_alignment_n_states(al); sas->hmms = ckd_calloc(sas->n_phones, sizeof(*sas->hmms)); for (hmm = sas->hmms, itor = ps_alignment_phones(al); itor; ++hmm, itor = ps_alignment_iter_next(itor)) { ps_alignment_entry_t *ent = ps_alignment_iter_get(itor); hmm_init(sas->hmmctx, hmm, FALSE, ent->id.pid.ssid, ent->id.pid.tmatid); } return ps_search_base(sas); } pocketsphinx-5prealpha/src/libpocketsphinx/phone_loop_search.c0000664000175000017500000002715612771605033022246 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2008 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file phone_loop_search.h Fast and rough context-independent phoneme loop search. */ #include #include "phone_loop_search.h" static int phone_loop_search_start(ps_search_t *search); static int phone_loop_search_step(ps_search_t *search, int frame_idx); static int phone_loop_search_finish(ps_search_t *search); static int phone_loop_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p); static void phone_loop_search_free(ps_search_t *search); static char const *phone_loop_search_hyp(ps_search_t *search, int32 *out_score); static int32 phone_loop_search_prob(ps_search_t *search); static ps_seg_t *phone_loop_search_seg_iter(ps_search_t *search); static ps_searchfuncs_t phone_loop_search_funcs = { /* start: */ phone_loop_search_start, /* step: */ phone_loop_search_step, /* finish: */ phone_loop_search_finish, /* reinit: */ phone_loop_search_reinit, /* free: */ phone_loop_search_free, /* lattice: */ NULL, /* hyp: */ phone_loop_search_hyp, /* prob: */ phone_loop_search_prob, /* seg_iter: */ phone_loop_search_seg_iter, }; static int phone_loop_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) { phone_loop_search_t *pls = (phone_loop_search_t *)search; cmd_ln_t *config = ps_search_config(search); acmod_t *acmod = ps_search_acmod(search); int i; /* Free old dict2pid, dict, if necessary. */ ps_search_base_reinit(search, dict, d2p); /* Initialize HMM context. */ if (pls->hmmctx) hmm_context_free(pls->hmmctx); pls->hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->mdef), acmod->tmat->tp, NULL, acmod->mdef->sseq); if (pls->hmmctx == NULL) return -1; /* Initialize penalty storage */ pls->n_phones = bin_mdef_n_ciphone(acmod->mdef); pls->window = cmd_ln_int32_r(config, "-pl_window"); if (pls->penalties) ckd_free(pls->penalties); pls->penalties = (int32 *)ckd_calloc(pls->n_phones, sizeof(*pls->penalties)); if (pls->pen_buf) ckd_free_2d(pls->pen_buf); pls->pen_buf = (int32 **)ckd_calloc_2d(pls->window, pls->n_phones, sizeof(**pls->pen_buf)); /* Initialize phone HMMs. */ if (pls->hmms) { for (i = 0; i < pls->n_phones; ++i) hmm_deinit((hmm_t *)&pls->hmms[i]); ckd_free(pls->hmms); } pls->hmms = (hmm_t *)ckd_calloc(pls->n_phones, sizeof(*pls->hmms)); for (i = 0; i < pls->n_phones; ++i) { hmm_init(pls->hmmctx, (hmm_t *)&pls->hmms[i], FALSE, bin_mdef_pid2ssid(acmod->mdef, i), bin_mdef_pid2tmatid(acmod->mdef, i)); } pls->penalty_weight = cmd_ln_float64_r(config, "-pl_weight"); pls->beam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pl_beam")) >> SENSCR_SHIFT; pls->pbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pl_pbeam")) >> SENSCR_SHIFT; pls->pip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pl_pip")) >> SENSCR_SHIFT; E_INFO("State beam %d Phone exit beam %d Insertion penalty %d\n", pls->beam, pls->pbeam, pls->pip); return 0; } ps_search_t * phone_loop_search_init(cmd_ln_t *config, acmod_t *acmod, dict_t *dict) { phone_loop_search_t *pls; /* Allocate and initialize. */ pls = (phone_loop_search_t *)ckd_calloc(1, sizeof(*pls)); ps_search_init(ps_search_base(pls), &phone_loop_search_funcs, PS_SEARCH_TYPE_PHONE_LOOP, PS_DEFAULT_PL_SEARCH, config, acmod, dict, NULL); phone_loop_search_reinit(ps_search_base(pls), ps_search_dict(pls), ps_search_dict2pid(pls)); return ps_search_base(pls); } static void phone_loop_search_free_renorm(phone_loop_search_t *pls) { gnode_t *gn; for (gn = pls->renorm; gn; gn = gnode_next(gn)) ckd_free(gnode_ptr(gn)); glist_free(pls->renorm); pls->renorm = NULL; } static void phone_loop_search_free(ps_search_t *search) { phone_loop_search_t *pls = (phone_loop_search_t *)search; int i; ps_search_base_free(search); for (i = 0; i < pls->n_phones; ++i) hmm_deinit((hmm_t *)&pls->hmms[i]); phone_loop_search_free_renorm(pls); ckd_free_2d(pls->pen_buf); ckd_free(pls->hmms); ckd_free(pls->penalties); hmm_context_free(pls->hmmctx); ckd_free(pls); } static int phone_loop_search_start(ps_search_t *search) { phone_loop_search_t *pls = (phone_loop_search_t *)search; int i; /* Reset and enter all phone HMMs. */ for (i = 0; i < pls->n_phones; ++i) { hmm_t *hmm = (hmm_t *)&pls->hmms[i]; hmm_clear(hmm); hmm_enter(hmm, 0, -1, 0); } memset(pls->penalties, 0, pls->n_phones * sizeof(*pls->penalties)); for (i = 0; i < pls->window; i++) memset(pls->pen_buf[i], 0, pls->n_phones * sizeof(*pls->pen_buf[i])); phone_loop_search_free_renorm(pls); pls->best_score = 0; pls->pen_buf_ptr = 0; return 0; } static void renormalize_hmms(phone_loop_search_t *pls, int frame_idx, int32 norm) { phone_loop_renorm_t *rn = (phone_loop_renorm_t *)ckd_calloc(1, sizeof(*rn)); int i; pls->renorm = glist_add_ptr(pls->renorm, rn); rn->frame_idx = frame_idx; rn->norm = norm; for (i = 0; i < pls->n_phones; ++i) { hmm_normalize((hmm_t *)&pls->hmms[i], norm); } } static void evaluate_hmms(phone_loop_search_t *pls, int16 const *senscr, int frame_idx) { int32 bs = WORST_SCORE; int i; hmm_context_set_senscore(pls->hmmctx, senscr); for (i = 0; i < pls->n_phones; ++i) { hmm_t *hmm = (hmm_t *)&pls->hmms[i]; int32 score; if (hmm_frame(hmm) < frame_idx) continue; score = hmm_vit_eval(hmm); if (score BETTER_THAN bs) { bs = score; } } pls->best_score = bs; } static void store_scores(phone_loop_search_t *pls, int frame_idx) { int i, j, itr; for (i = 0; i < pls->n_phones; ++i) { hmm_t *hmm = (hmm_t *)&pls->hmms[i]; pls->pen_buf[pls->pen_buf_ptr][i] = (hmm_bestscore(hmm) - pls->best_score) * pls->penalty_weight; } pls->pen_buf_ptr++; pls->pen_buf_ptr = pls->pen_buf_ptr % pls->window; /* update penalties */ for (i = 0; i < pls->n_phones; ++i) { pls->penalties[i] = WORST_SCORE; for (j = 0, itr = pls->pen_buf_ptr + 1; j < pls->window; j++, itr++) { itr = itr % pls->window; if (pls->pen_buf[itr][i] > pls->penalties[i]) pls->penalties[i] = pls->pen_buf[itr][i]; } } } static void prune_hmms(phone_loop_search_t *pls, int frame_idx) { int32 thresh = pls->best_score + pls->beam; int nf = frame_idx + 1; int i; /* Check all phones to see if they remain active in the next frame. */ for (i = 0; i < pls->n_phones; ++i) { hmm_t *hmm = (hmm_t *)&pls->hmms[i]; if (hmm_frame(hmm) < frame_idx) continue; /* Retain if score better than threshold. */ if (hmm_bestscore(hmm) BETTER_THAN thresh) { hmm_frame(hmm) = nf; } else hmm_clear_scores(hmm); } } static void phone_transition(phone_loop_search_t *pls, int frame_idx) { int32 thresh = pls->best_score + pls->pbeam; int nf = frame_idx + 1; int i; /* Now transition out of phones whose last states are inside the * phone transition beam. */ for (i = 0; i < pls->n_phones; ++i) { hmm_t *hmm = (hmm_t *)&pls->hmms[i]; int32 newphone_score; int j; if (hmm_frame(hmm) != nf) continue; newphone_score = hmm_out_score(hmm) + pls->pip; if (newphone_score BETTER_THAN thresh) { /* Transition into all phones using the usual Viterbi rule. */ for (j = 0; j < pls->n_phones; ++j) { hmm_t *nhmm = (hmm_t *)&pls->hmms[j]; if (hmm_frame(nhmm) < frame_idx || newphone_score BETTER_THAN hmm_in_score(nhmm)) { hmm_enter(nhmm, newphone_score, hmm_out_history(hmm), nf); } } } } } static int phone_loop_search_step(ps_search_t *search, int frame_idx) { phone_loop_search_t *pls = (phone_loop_search_t *)search; acmod_t *acmod = ps_search_acmod(search); int16 const *senscr; int i; /* All CI senones are active all the time. */ if (!ps_search_acmod(pls)->compallsen) { acmod_clear_active(ps_search_acmod(pls)); for (i = 0; i < pls->n_phones; ++i) acmod_activate_hmm(acmod, (hmm_t *)&pls->hmms[i]); } /* Calculate senone scores for current frame. */ senscr = acmod_score(acmod, &frame_idx); /* Renormalize, if necessary. */ if (pls->best_score + (2 * pls->beam) WORSE_THAN WORST_SCORE) { E_INFO("Renormalizing Scores at frame %d, best score %d\n", frame_idx, pls->best_score); renormalize_hmms(pls, frame_idx, pls->best_score); } /* Evaluate phone HMMs for current frame. */ evaluate_hmms(pls, senscr, frame_idx); /* Store hmm scores for senone penaly calculation */ store_scores(pls, frame_idx); /* Prune phone HMMs. */ prune_hmms(pls, frame_idx); /* Do phone transitions. */ phone_transition(pls, frame_idx); return 0; } static int phone_loop_search_finish(ps_search_t *search) { /* Actually nothing to do here really. */ return 0; } static char const * phone_loop_search_hyp(ps_search_t *search, int32 *out_score) { E_WARN("Hypotheses are not returned from phone loop search"); return NULL; } static int32 phone_loop_search_prob(ps_search_t *search) { /* FIXME: Actually... they ought to be. */ E_WARN("Posterior probabilities are not returned from phone loop search"); return 0; } static ps_seg_t * phone_loop_search_seg_iter(ps_search_t *search) { E_WARN("Hypotheses are not returned from phone loop search"); return NULL; } pocketsphinx-5prealpha/src/libpocketsphinx/bin_mdef.h0000664000175000017500000002064312771605033020321 00000000000000/* -*- c-file-style: "linux" -*- */ /* ==================================================================== * Copyright (c) 2005 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * @file bin_mdef.h * * Binary format model definition files, with support for * heterogeneous topologies and variable-size N-phones * * @author David Huggins-Daines */ #ifndef __BIN_MDEF_H__ #define __BIN_MDEF_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* SphinxBase headers. */ #include #include #include #include "mdef.h" #define BIN_MDEF_FORMAT_VERSION 1 /* Little-endian machines will write "BMDF" to disk, big-endian ones "FDMB". */ #define BIN_MDEF_NATIVE_ENDIAN 0x46444d42 /* 'BMDF' in little-endian order */ #define BIN_MDEF_OTHER_ENDIAN 0x424d4446 /* 'BMDF' in big-endian order */ #ifdef __GNUC__ #define __ATTRIBUTE_PACKED __attribute__((packed)) #else #define __ATTRIBUTE_PACKED #endif /** * Phone entry (on-disk, 12 bytes) */ typedef struct mdef_entry_s mdef_entry_t; struct mdef_entry_s { int32 ssid; /**< Senone sequence ID */ int32 tmat; /**< Transition matrix ID */ /* FIXME: is any of this actually necessary? */ union { /**< CI phone information - attributes (just "filler" for now) */ struct { uint8 filler; uint8 reserved[3]; } ci; /**< CD phone information - context info. */ struct { uint8 wpos; uint8 ctx[3]; /**< quintphones will require hacking */ } cd; } info; } __ATTRIBUTE_PACKED; /** * Invalid senone sequence ID (limited to 16 bits for PocketSphinx). */ #define BAD_SSID 0xffff /** * Invalid senone ID (limited to 16 bits for PocketSphinx). */ #define BAD_SENID 0xffff /** * Node in CD phone tree (on-disk, 8 bytes). */ typedef struct cd_tree_s cd_tree_t; struct cd_tree_s { int16 ctx; /**< Context (word position or CI phone) */ int16 n_down; /**< Number of children (0 for leafnode) */ union { int32 pid; /**< Phone ID (leafnode) */ int32 down; /**< Next level of the tree (offset from start of cd_trees) */ } c; }; /** * Model definition structure (in-memory). */ typedef struct bin_mdef_s bin_mdef_t; struct bin_mdef_s { int refcnt; int32 n_ciphone; /**< Number of base (CI) phones */ int32 n_phone; /**< Number of base (CI) phones + (CD) triphones */ int32 n_emit_state; /**< Number of emitting states per phone (0 for heterogeneous) */ int32 n_ci_sen; /**< Number of CI senones; these are the first */ int32 n_sen; /**< Number of senones (CI+CD) */ int32 n_tmat; /**< Number of transition matrices */ int32 n_sseq; /**< Number of unique senone sequences */ int32 n_ctx; /**< Number of phones of context */ int32 n_cd_tree; /**< Number of nodes in cd_tree (below) */ int16 sil; /**< CI phone ID for silence */ mmio_file_t *filemap;/**< File map for this file (if any) */ char **ciname; /**< CI phone names */ cd_tree_t *cd_tree; /**< Tree mapping CD phones to phone IDs */ mdef_entry_t *phone; /**< All phone structures */ uint16 **sseq; /**< Unique senone sequences (2D array built at load time) */ uint8 *sseq_len; /**< Number of states in each sseq (NULL for homogeneous) */ /* These two are not stored on disk, but are generated at load time. */ int16 *cd2cisen; /**< Parent CI-senone id for each senone */ int16 *sen2cimap; /**< Parent CI-phone for each senone (CI or CD) */ /** Allocation mode for this object. */ enum { BIN_MDEF_FROM_TEXT, BIN_MDEF_IN_MEMORY, BIN_MDEF_ON_DISK } alloc_mode; }; #define bin_mdef_is_fillerphone(m,p) (((p) < (m)->n_ciphone) \ ? (m)->phone[p].info.ci.filler \ : (m)->phone[(m)->phone[p].info.cd.ctx[0]].info.ci.filler) #define bin_mdef_is_ciphone(m,p) ((p) < (m)->n_ciphone) #define bin_mdef_n_ciphone(m) ((m)->n_ciphone) #define bin_mdef_n_phone(m) ((m)->n_phone) #define bin_mdef_n_sseq(m) ((m)->n_sseq) #define bin_mdef_n_emit_state(m) ((m)->n_emit_state) #define bin_mdef_n_emit_state_phone(m,p) ((m)->n_emit_state ? (m)->n_emit_state \ : (m)->sseq_len[(m)->phone[p].ssid]) #define bin_mdef_n_sen(m) ((m)->n_sen) #define bin_mdef_n_tmat(m) ((m)->n_tmat) #define bin_mdef_pid2ssid(m,p) ((m)->phone[p].ssid) #define bin_mdef_pid2tmatid(m,p) ((m)->phone[p].tmat) #define bin_mdef_silphone(m) ((m)->sil) #define bin_mdef_sen2cimap(m,s) ((m)->sen2cimap[s]) #define bin_mdef_sseq2sen(m,ss,pos) ((m)->sseq[ss][pos]) #define bin_mdef_pid2ci(m,p) (((p) < (m)->n_ciphone) ? (p) \ : (m)->phone[p].info.cd.ctx[0]) /** * Read a binary mdef from a file. */ POCKETSPHINX_EXPORT bin_mdef_t *bin_mdef_read(cmd_ln_t *config, const char *filename); /** * Read a text mdef from a file (creating an in-memory binary mdef). */ POCKETSPHINX_EXPORT bin_mdef_t *bin_mdef_read_text(cmd_ln_t *config, const char *filename); /** * Write a binary mdef to a file. */ POCKETSPHINX_EXPORT int bin_mdef_write(bin_mdef_t *m, const char *filename); /** * Write a binary mdef to a text file. */ POCKETSPHINX_EXPORT int bin_mdef_write_text(bin_mdef_t *m, const char *filename); /** * Retain a pointer to a bin_mdef_t. */ bin_mdef_t *bin_mdef_retain(bin_mdef_t *m); /** * Release a pointer to a binary mdef. */ int bin_mdef_free(bin_mdef_t *m); /** * Context-independent phone lookup. * @return phone id for ciphone. */ int bin_mdef_ciphone_id(bin_mdef_t *m, /**< In: Model structure being queried */ const char *ciphone); /**< In: ciphone for which id wanted */ /** * Case-insensitive context-independent phone lookup. * @return phone id for ciphone. */ int bin_mdef_ciphone_id_nocase(bin_mdef_t *m, /**< In: Model structure being queried */ const char *ciphone); /**< In: ciphone for which id wanted */ /* Return value: READ-ONLY ciphone string name for the given ciphone id */ const char *bin_mdef_ciphone_str(bin_mdef_t *m, /**< In: Model structure being queried */ int32 ci); /**< In: ciphone id for which name wanted */ /* Return value: phone id for the given constituents if found, else -1 */ int bin_mdef_phone_id(bin_mdef_t *m, /**< In: Model structure being queried */ int32 b, /**< In: base ciphone id */ int32 l, /**< In: left context ciphone id */ int32 r, /**< In: right context ciphone id */ int32 pos); /**< In: Word position */ /* Look up a phone id, backing off to other word positions. */ int bin_mdef_phone_id_nearest(bin_mdef_t * m, int32 b, int32 l, int32 r, int32 pos); /** * Create a phone string for the given phone (base or triphone) id in the given buf. * * @return 0 if successful, -1 if error. */ int bin_mdef_phone_str(bin_mdef_t *m, /**< In: Model structure being queried */ int pid, /**< In: phone id being queried */ char *buf); /**< Out: On return, buf has the string */ #ifdef __cplusplus }; /* extern "C" */ #endif /* __cplusplus */ #endif /* __BIN_MDEF_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/blkarray_list.c0000664000175000017500000001110212771605033021401 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * blkarray_list.c -- block array-based list structure. * * HISTORY * * 18-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon * Started. */ /* System headers. */ #include /* SphinxBase headers. */ #include #include #include /* Local headers. */ #include "blkarray_list.h" #define BLKARRAY_DEFAULT_MAXBLKS 16380 #define BLKARRAY_DEFAULT_BLKSIZE 16380 blkarray_list_t * _blkarray_list_init(int32 maxblks, int32 blksize) { blkarray_list_t *bl; if ((maxblks <= 0) || (blksize <= 0)) { E_ERROR("Cannot allocate %dx%d blkarray\n", maxblks, blksize); return NULL; } bl = (blkarray_list_t *) ckd_calloc(1, sizeof(blkarray_list_t)); bl->ptr = (void ***) ckd_calloc(maxblks, sizeof(void **)); bl->maxblks = maxblks; bl->blksize = blksize; bl->n_valid = 0; bl->cur_row = -1; /* No row is allocated (dummy) */ bl->cur_row_free = blksize; /* The dummy row is full */ return bl; } blkarray_list_t * blkarray_list_init(void) { return _blkarray_list_init(BLKARRAY_DEFAULT_MAXBLKS, BLKARRAY_DEFAULT_BLKSIZE); } void blkarray_list_free(blkarray_list_t *bl) { blkarray_list_reset(bl); ckd_free(bl->ptr); ckd_free(bl); } int32 blkarray_list_append(blkarray_list_t * bl, void *data) { int32 id; assert(bl); if (bl->cur_row_free >= bl->blksize) { /* Previous row is filled; need to allocate a new row */ bl->cur_row++; if (bl->cur_row >= bl->maxblks) { E_ERROR("Block array (%dx%d) exhausted\n", bl->maxblks, bl->blksize); bl->cur_row--; return -1; } /* Allocate the new row */ assert(bl->ptr[bl->cur_row] == NULL); bl->ptr[bl->cur_row] = (void **) ckd_malloc(bl->blksize * sizeof(void *)); bl->cur_row_free = 0; } bl->ptr[bl->cur_row][bl->cur_row_free] = data; (bl->cur_row_free)++; id = (bl->n_valid)++; assert(id >= 0); return id; } void blkarray_list_reset(blkarray_list_t * bl) { int32 i, j; /* Free all the allocated elements as well as the blocks */ for (i = 0; i < bl->cur_row; i++) { for (j = 0; j < bl->blksize; j++) ckd_free(bl->ptr[i][j]); ckd_free(bl->ptr[i]); bl->ptr[i] = NULL; } if (i == bl->cur_row) { /* NEED THIS! (in case cur_row < 0) */ for (j = 0; j < bl->cur_row_free; j++) ckd_free(bl->ptr[i][j]); ckd_free(bl->ptr[i]); bl->ptr[i] = NULL; } bl->n_valid = 0; bl->cur_row = -1; bl->cur_row_free = bl->blksize; } void * blkarray_list_get(blkarray_list_t *list, int32 n) { int32 r, c; if (n >= blkarray_list_n_valid(list)) return NULL; r = n / blkarray_list_blksize(list); c = n - (r * blkarray_list_blksize(list)); return blkarray_list_ptr(list, r, c); } pocketsphinx-5prealpha/src/libpocketsphinx/kws_detections.h0000664000175000017500000000471112771605033021601 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2014 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * kws_detections.h -- Structures for storing keyphrase spotting results. */ #ifndef __KWS_DETECTIONS_H__ #define __KWS_DETECTIONS_H__ /* SphinxBase headers. */ #include /* Local headers. */ #include "pocketsphinx_internal.h" #include "hmm.h" typedef struct kws_detection_s { const char* keyphrase; frame_idx_t sf; frame_idx_t ef; int32 prob; int32 ascr; } kws_detection_t; typedef struct kws_detections_s { glist_t detect_list; } kws_detections_t; /** * Reset history structure. */ void kws_detections_reset(kws_detections_t *detections); /** * Add history entry. */ void kws_detections_add(kws_detections_t *detections, const char* keyphrase, int sf, int ef, int prob, int ascr); /** * Compose hypothesis. */ char* kws_detections_hyp_str(kws_detections_t *detections, int frame, int delay); #endif /* __KWS_DETECTIONS_H__ */ pocketsphinx-5prealpha/src/libpocketsphinx/dict.h0000664000175000017500000001673712771605033017512 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ #ifndef _S3_DICT_H_ #define _S3_DICT_H_ /** \file dict.h * \brief Operations on dictionary. */ /* SphinxBase headers. */ #include /* Local headers. */ #include "s3types.h" #include "bin_mdef.h" #include "pocketsphinx_export.h" #define S3DICT_INC_SZ 4096 #ifdef __cplusplus extern "C" { #endif /** \struct dictword_t \brief a structure for one dictionary word. */ typedef struct { char *word; /**< Ascii word string */ s3cipid_t *ciphone; /**< Pronunciation */ int32 pronlen; /**< Pronunciation length */ s3wid_t alt; /**< Next alternative pronunciation id, NOT_S3WID if none */ s3wid_t basewid; /**< Base pronunciation id */ } dictword_t; /** \struct dict_t \brief a structure for a dictionary. */ typedef struct { int refcnt; bin_mdef_t *mdef; /**< Model definition used for phone IDs; NULL if none used */ dictword_t *word; /**< Array of entries in dictionary */ hash_table_t *ht; /**< Hash table for mapping word strings to word ids */ int32 max_words; /**< #Entries allocated in dict, including empty slots */ int32 n_word; /**< #Occupied entries in dict; ie, excluding empty slots */ int32 filler_start; /**< First filler word id (read from filler dict) */ int32 filler_end; /**< Last filler word id (read from filler dict) */ s3wid_t startwid; /**< FOR INTERNAL-USE ONLY */ s3wid_t finishwid; /**< FOR INTERNAL-USE ONLY */ s3wid_t silwid; /**< FOR INTERNAL-USE ONLY */ int nocase; } dict_t; /** * Initialize a new dictionary. * * If config and mdef are supplied, then the dictionary will be read * from the files specified by the -dict and -fdict options in config, * with case sensitivity determined by the -dictcase option. * * Otherwise an empty case-sensitive dictionary will be created. * * Return ptr to dict_t if successful, NULL otherwise. */ dict_t *dict_init(cmd_ln_t *config, /**< Configuration (-dict, -fdict, -dictcase) or NULL */ bin_mdef_t *mdef /**< For looking up CI phone IDs (or NULL) */ ); /** * Write dictionary to a file. */ int dict_write(dict_t *dict, char const *filename, char const *format); /** Return word id for given word string if present. Otherwise return BAD_S3WID */ POCKETSPHINX_EXPORT s3wid_t dict_wordid(dict_t *d, const char *word); /** * Return 1 if w is a filler word, 0 if not. A filler word is one that was read in from the * filler dictionary; however, sentence START and FINISH words are not filler words. */ int dict_filler_word(dict_t *d, /**< The dictionary structure */ s3wid_t w /**< The word ID */ ); /** * Test if w is a "real" word, i.e. neither a filler word nor START/FINISH. */ POCKETSPHINX_EXPORT int dict_real_word(dict_t *d, /**< The dictionary structure */ s3wid_t w /**< The word ID */ ); /** * Add a word with the given ciphone pronunciation list to the dictionary. * Return value: Result word id if successful, BAD_S3WID otherwise */ s3wid_t dict_add_word(dict_t *d, /**< The dictionary structure. */ char const *word, /**< The word. */ s3cipid_t const *p, /**< The pronunciation. */ int32 np /**< Number of phones. */ ); /** * Return value: CI phone string for the given word, phone position. */ const char *dict_ciphone_str(dict_t *d, /**< In: Dictionary to look up */ s3wid_t wid, /**< In: Component word being looked up */ int32 pos /**< In: Pronunciation phone position */ ); /** Packaged macro access to dictionary members */ #define dict_size(d) ((d)->n_word) #define dict_num_fillers(d) (dict_filler_end(d) - dict_filler_start(d)) /** * Number of "real words" in the dictionary. * * This is the number of words that are not fillers, , or . */ #define dict_num_real_words(d) \ (dict_size(d) - (dict_filler_end(d) - dict_filler_start(d)) - 2) #define dict_basewid(d,w) ((d)->word[w].basewid) #define dict_wordstr(d,w) ((w) < 0 ? NULL : (d)->word[w].word) #define dict_basestr(d,w) ((d)->word[dict_basewid(d,w)].word) #define dict_nextalt(d,w) ((d)->word[w].alt) #define dict_pronlen(d,w) ((d)->word[w].pronlen) #define dict_pron(d,w,p) ((d)->word[w].ciphone[p]) /**< The CI phones of the word w at position p */ #define dict_filler_start(d) ((d)->filler_start) #define dict_filler_end(d) ((d)->filler_end) #define dict_startwid(d) ((d)->startwid) #define dict_finishwid(d) ((d)->finishwid) #define dict_silwid(d) ((d)->silwid) #define dict_is_single_phone(d,w) ((d)->word[w].pronlen == 1) #define dict_first_phone(d,w) ((d)->word[w].ciphone[0]) #define dict_second_phone(d,w) ((d)->word[w].ciphone[1]) #define dict_second_last_phone(d,w) ((d)->word[w].ciphone[(d)->word[w].pronlen - 2]) #define dict_last_phone(d,w) ((d)->word[w].ciphone[(d)->word[w].pronlen - 1]) /* Hard-coded special words */ #define S3_START_WORD "" #define S3_FINISH_WORD "" #define S3_SILENCE_WORD "" #define S3_UNKNOWN_WORD "" /** * If the given word contains a trailing "(....)" (i.e., a Sphinx-II style alternative * pronunciation specification), strip that trailing portion from it. Note that the given * string is modified. * Return value: If string was modified, the character position at which the original string * was truncated; otherwise -1. */ int32 dict_word2basestr(char *word); /** * Retain a pointer to an dict_t. */ dict_t *dict_retain(dict_t *d); /** * Release a pointer to a dictionary. */ int dict_free(dict_t *d); /** Report a dictionary structure */ void dict_report(dict_t *d /**< A dictionary structure */ ); #ifdef __cplusplus } #endif #endif pocketsphinx-5prealpha/src/programs/0000775000175000017500000000000012771610005015077 500000000000000pocketsphinx-5prealpha/src/programs/Makefile.am0000664000175000017500000000114512771605033017061 00000000000000bin_PROGRAMS = \ pocketsphinx_batch \ pocketsphinx_continuous \ pocketsphinx_mdef_convert pocketsphinx_mdef_convert_SOURCES = mdef_convert.c pocketsphinx_mdef_convert_LDADD = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la pocketsphinx_batch_SOURCES = batch.c pocketsphinx_batch_LDADD = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la pocketsphinx_continuous_SOURCES = continuous.c pocketsphinx_continuous_LDADD = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -lsphinxad AM_CFLAGS =-I$(top_srcdir)/include \ -I$(top_srcdir)/src/libpocketsphinx \ -I$(top_builddir)/include pocketsphinx-5prealpha/src/programs/Makefile.in0000664000175000017500000005317312771607732017112 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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 = pocketsphinx_batch$(EXEEXT) \ pocketsphinx_continuous$(EXEEXT) \ pocketsphinx_mdef_convert$(EXEEXT) subdir = src/programs DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_pocketsphinx_batch_OBJECTS = batch.$(OBJEXT) pocketsphinx_batch_OBJECTS = $(am_pocketsphinx_batch_OBJECTS) pocketsphinx_batch_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_pocketsphinx_continuous_OBJECTS = continuous.$(OBJEXT) pocketsphinx_continuous_OBJECTS = \ $(am_pocketsphinx_continuous_OBJECTS) pocketsphinx_continuous_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la am_pocketsphinx_mdef_convert_OBJECTS = mdef_convert.$(OBJEXT) pocketsphinx_mdef_convert_OBJECTS = \ $(am_pocketsphinx_mdef_convert_OBJECTS) pocketsphinx_mdef_convert_DEPENDENCIES = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la 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@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(pocketsphinx_batch_SOURCES) \ $(pocketsphinx_continuous_SOURCES) \ $(pocketsphinx_mdef_convert_SOURCES) DIST_SOURCES = $(pocketsphinx_batch_SOURCES) \ $(pocketsphinx_continuous_SOURCES) \ $(pocketsphinx_mdef_convert_SOURCES) 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) # 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)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pocketsphinx_mdef_convert_SOURCES = mdef_convert.c pocketsphinx_mdef_convert_LDADD = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la pocketsphinx_batch_SOURCES = batch.c pocketsphinx_batch_LDADD = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la pocketsphinx_continuous_SOURCES = continuous.c pocketsphinx_continuous_LDADD = \ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -lsphinxad AM_CFLAGS = -I$(top_srcdir)/include \ -I$(top_srcdir)/src/libpocketsphinx \ -I$(top_builddir)/include all: all-am .SUFFIXES: .SUFFIXES: .c .lo .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/programs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/programs/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list pocketsphinx_batch$(EXEEXT): $(pocketsphinx_batch_OBJECTS) $(pocketsphinx_batch_DEPENDENCIES) $(EXTRA_pocketsphinx_batch_DEPENDENCIES) @rm -f pocketsphinx_batch$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pocketsphinx_batch_OBJECTS) $(pocketsphinx_batch_LDADD) $(LIBS) pocketsphinx_continuous$(EXEEXT): $(pocketsphinx_continuous_OBJECTS) $(pocketsphinx_continuous_DEPENDENCIES) $(EXTRA_pocketsphinx_continuous_DEPENDENCIES) @rm -f pocketsphinx_continuous$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pocketsphinx_continuous_OBJECTS) $(pocketsphinx_continuous_LDADD) $(LIBS) pocketsphinx_mdef_convert$(EXEEXT): $(pocketsphinx_mdef_convert_OBJECTS) $(pocketsphinx_mdef_convert_DEPENDENCIES) $(EXTRA_pocketsphinx_mdef_convert_DEPENDENCIES) @rm -f pocketsphinx_mdef_convert$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pocketsphinx_mdef_convert_OBJECTS) $(pocketsphinx_mdef_convert_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/batch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/continuous.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdef_convert.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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: $(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: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ 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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS # 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: pocketsphinx-5prealpha/src/programs/continuous.c0000664000175000017500000002363512771605033017407 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2010 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * continuous.c - Simple pocketsphinx command-line application to test * both continuous listening/silence filtering from microphone * and continuous file transcription. */ /* * This is a simple example of pocketsphinx application that uses continuous listening * with silence filtering to automatically segment a continuous stream of audio input * into utterances that are then decoded. * * Remarks: * - Each utterance is ended when a silence segment of at least 1 sec is recognized. * - Single-threaded implementation for portability. * - Uses audio library; can be replaced with an equivalent custom library. */ #include #include #include #if defined(_WIN32) && !defined(__CYGWIN__) #include #else #include #endif #include #include #include "pocketsphinx.h" static const arg_t cont_args_def[] = { POCKETSPHINX_OPTIONS, /* Argument file. */ {"-argfile", ARG_STRING, NULL, "Argument file giving extra arguments."}, {"-adcdev", ARG_STRING, NULL, "Name of audio device to use for input."}, {"-infile", ARG_STRING, NULL, "Audio file to transcribe."}, {"-inmic", ARG_BOOLEAN, "no", "Transcribe audio from microphone."}, {"-time", ARG_BOOLEAN, "no", "Print word times in file transcription."}, CMDLN_EMPTY_OPTION }; static ps_decoder_t *ps; static cmd_ln_t *config; static FILE *rawfd; static void print_word_times() { int frame_rate = cmd_ln_int32_r(config, "-frate"); ps_seg_t *iter = ps_seg_iter(ps); while (iter != NULL) { int32 sf, ef, pprob; float conf; ps_seg_frames(iter, &sf, &ef); pprob = ps_seg_prob(iter, NULL, NULL, NULL); conf = logmath_exp(ps_get_logmath(ps), pprob); printf("%s %.3f %.3f %f\n", ps_seg_word(iter), ((float)sf / frame_rate), ((float) ef / frame_rate), conf); iter = ps_seg_next(iter); } } static int check_wav_header(char *header, int expected_sr) { int sr; if (header[34] != 0x10) { E_ERROR("Input audio file has [%d] bits per sample instead of 16\n", header[34]); return 0; } if (header[20] != 0x1) { E_ERROR("Input audio file has compression [%d] and not required PCM\n", header[20]); return 0; } if (header[22] != 0x1) { E_ERROR("Input audio file has [%d] channels, expected single channel mono\n", header[22]); return 0; } sr = ((header[24] & 0xFF) | ((header[25] & 0xFF) << 8) | ((header[26] & 0xFF) << 16) | ((header[27] & 0xFF) << 24)); if (sr != expected_sr) { E_ERROR("Input audio file has sample rate [%d], but decoder expects [%d]\n", sr, expected_sr); return 0; } return 1; } /* * Continuous recognition from a file */ static void recognize_from_file() { int16 adbuf[2048]; const char *fname; const char *hyp; int32 k; uint8 utt_started, in_speech; int32 print_times = cmd_ln_boolean_r(config, "-time"); fname = cmd_ln_str_r(config, "-infile"); if ((rawfd = fopen(fname, "rb")) == NULL) { E_FATAL_SYSTEM("Failed to open file '%s' for reading", fname); } if (strlen(fname) > 4 && strcmp(fname + strlen(fname) - 4, ".wav") == 0) { char waveheader[44]; fread(waveheader, 1, 44, rawfd); if (!check_wav_header(waveheader, (int)cmd_ln_float32_r(config, "-samprate"))) E_FATAL("Failed to process file '%s' due to format mismatch.\n", fname); } if (strlen(fname) > 4 && strcmp(fname + strlen(fname) - 4, ".mp3") == 0) { E_FATAL("Can not decode mp3 files, convert input file to WAV 16kHz 16-bit mono before decoding.\n"); } ps_start_utt(ps); utt_started = FALSE; while ((k = fread(adbuf, sizeof(int16), 2048, rawfd)) > 0) { ps_process_raw(ps, adbuf, k, FALSE, FALSE); in_speech = ps_get_in_speech(ps); if (in_speech && !utt_started) { utt_started = TRUE; } if (!in_speech && utt_started) { ps_end_utt(ps); hyp = ps_get_hyp(ps, NULL); if (hyp != NULL) printf("%s\n", hyp); if (print_times) print_word_times(); fflush(stdout); ps_start_utt(ps); utt_started = FALSE; } } ps_end_utt(ps); if (utt_started) { hyp = ps_get_hyp(ps, NULL); if (hyp != NULL) { printf("%s\n", hyp); if (print_times) { print_word_times(); } } } fclose(rawfd); } /* Sleep for specified msec */ static void sleep_msec(int32 ms) { #if (defined(_WIN32) && !defined(GNUWINCE)) || defined(_WIN32_WCE) Sleep(ms); #else /* ------------------- Unix ------------------ */ struct timeval tmo; tmo.tv_sec = 0; tmo.tv_usec = ms * 1000; select(0, NULL, NULL, NULL, &tmo); #endif } /* * Main utterance processing loop: * for (;;) { * start utterance and wait for speech to process * decoding till end-of-utterance silence will be detected * print utterance result; * } */ static void recognize_from_microphone() { ad_rec_t *ad; int16 adbuf[2048]; uint8 utt_started, in_speech; int32 k; char const *hyp; if ((ad = ad_open_dev(cmd_ln_str_r(config, "-adcdev"), (int) cmd_ln_float32_r(config, "-samprate"))) == NULL) E_FATAL("Failed to open audio device\n"); if (ad_start_rec(ad) < 0) E_FATAL("Failed to start recording\n"); if (ps_start_utt(ps) < 0) E_FATAL("Failed to start utterance\n"); utt_started = FALSE; E_INFO("Ready....\n"); for (;;) { if ((k = ad_read(ad, adbuf, 2048)) < 0) E_FATAL("Failed to read audio\n"); ps_process_raw(ps, adbuf, k, FALSE, FALSE); in_speech = ps_get_in_speech(ps); if (in_speech && !utt_started) { utt_started = TRUE; E_INFO("Listening...\n"); } if (!in_speech && utt_started) { /* speech -> silence transition, time to start new utterance */ ps_end_utt(ps); hyp = ps_get_hyp(ps, NULL ); if (hyp != NULL) { printf("%s\n", hyp); fflush(stdout); } if (ps_start_utt(ps) < 0) E_FATAL("Failed to start utterance\n"); utt_started = FALSE; E_INFO("Ready....\n"); } sleep_msec(100); } ad_close(ad); } int main(int argc, char *argv[]) { char const *cfg; config = cmd_ln_parse_r(NULL, cont_args_def, argc, argv, TRUE); /* Handle argument file as -argfile. */ if (config && (cfg = cmd_ln_str_r(config, "-argfile")) != NULL) { config = cmd_ln_parse_file_r(config, cont_args_def, cfg, FALSE); } if (config == NULL || (cmd_ln_str_r(config, "-infile") == NULL && cmd_ln_boolean_r(config, "-inmic") == FALSE)) { E_INFO("Specify '-infile ' to recognize from file or '-inmic yes' to recognize from microphone.\n"); cmd_ln_free_r(config); return 1; } ps_default_search_args(config); ps = ps_init(config); if (ps == NULL) { cmd_ln_free_r(config); return 1; } E_INFO("%s COMPILED ON: %s, AT: %s\n\n", argv[0], __DATE__, __TIME__); if (cmd_ln_str_r(config, "-infile") != NULL) { recognize_from_file(); } else if (cmd_ln_boolean_r(config, "-inmic")) { recognize_from_microphone(); } ps_free(ps); cmd_ln_free_r(config); return 0; } #if defined(_WIN32_WCE) #pragma comment(linker,"/entry:mainWCRTStartup") #include //Windows Mobile has the Unicode main only int wmain(int32 argc, wchar_t * wargv[]) { char **argv; size_t wlen; size_t len; int i; argv = malloc(argc * sizeof(char *)); for (i = 0; i < argc; i++) { wlen = lstrlenW(wargv[i]); len = wcstombs(NULL, wargv[i], wlen); argv[i] = malloc(len + 1); wcstombs(argv[i], wargv[i], wlen); } //assuming ASCII parameters return main(argc, argv); } #endif pocketsphinx-5prealpha/src/programs/batch.c0000664000175000017500000006053512771605033016262 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2001 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* System headers. */ #include /* SphinxBase headers. */ #include #include #include #include #include /* PocketSphinx headers. */ #include /* S3kr3t headerz. */ #include "pocketsphinx_internal.h" /* Silvio Moioli: setbuf doesn't exist in Windows CE */ #if defined(_WIN32_WCE) void setbuf(FILE* file, char* buf){ } #endif static const arg_t ps_args_def[] = { POCKETSPHINX_OPTIONS, /* Various options specific to batch-mode processing. */ /* Argument file. */ { "-argfile", ARG_STRING, NULL, "Argument file giving extra arguments." }, /* Control file. */ { "-ctl", ARG_STRING, NULL, "Control file listing utterances to be processed" }, { "-ctloffset", ARG_INT32, "0", "No. of utterances at the beginning of -ctl file to be skipped" }, { "-ctlcount", ARG_INT32, "-1", "No. of utterances to be processed (after skipping -ctloffset entries)" }, { "-ctlincr", ARG_INT32, "1", "Do every Nth line in the control file" }, { "-mllrctl", ARG_STRING, NULL, "Control file listing MLLR transforms to use for each utterance" }, { "-mllrdir", ARG_STRING, NULL, "Base directory for MLLR transforms" }, { "-mllrext", ARG_STRING, NULL, "File extension for MLLR transforms (including leading dot)" }, { "-lmnamectl", ARG_STRING, NULL, "Control file listing LM name to use for each utterance" }, { "-fsgctl", ARG_STRING, NULL, "Control file listing FSG file to use for each utterance" }, { "-fsgdir", ARG_STRING, NULL, "Base directory for FSG files" }, { "-fsgext", ARG_STRING, NULL, "File extension for FSG files (including leading dot)" }, /* Input file types and locations. */ { "-adcin", ARG_BOOLEAN, "no", "Input is raw audio data" }, { "-adchdr", ARG_INT32, "0", "Size of audio file header in bytes (headers are ignored)" }, { "-senin", ARG_BOOLEAN, "no", "Input is senone score dump files" }, { "-cepdir", ARG_STRING, NULL, "Input files directory (prefixed to filespecs in control file)" }, { "-cepext", ARG_STRING, ".mfc", "Input files extension (suffixed to filespecs in control file)" }, /* Output files. */ { "-hyp", ARG_STRING, NULL, "Recognition output file name" }, { "-hypseg", ARG_STRING, NULL, "Recognition output with segmentation file name" }, { "-ctm", ARG_STRING, NULL, "Recognition output in CTM file format (may require post-sorting)" }, { "-outlatdir", ARG_STRING, NULL, "Directory for dumping word lattices" }, { "-outlatfmt", ARG_STRING, "s3", "Format for dumping word lattices (s3 or htk)" }, { "-outlatext", ARG_STRING, ".lat", "Filename extension for dumping word lattices" }, { "-outlatbeam", ARG_FLOAT64, "1e-5", "Minimum posterior probability for output lattice nodes" }, { "-build_outdirs", ARG_BOOLEAN, "yes", "Create missing subdirectories in output directory" }, { "-nbestdir", ARG_STRING, NULL, "Directory for writing N-best hypothesis lists" }, { "-nbestext", ARG_STRING, ".hyp", "Extension for N-best hypothesis list files" }, { "-nbest", ARG_INT32, "0", "Number of N-best hypotheses to write to -nbestdir (0 for no N-best)" }, CMDLN_EMPTY_OPTION }; static mfcc_t ** read_mfc_file(FILE *infh, int sf, int ef, int *out_nfr, int ceplen) { long flen; int32 nmfc, nfr; float32 *floats; mfcc_t **mfcs; int swap, i; fseek(infh, 0, SEEK_END); flen = ftell(infh); fseek(infh, 0, SEEK_SET); if (fread(&nmfc, 4, 1, infh) != 1) { E_ERROR_SYSTEM("Failed to read 4 bytes from MFCC file"); return NULL; } swap = 0; if (nmfc != flen / 4 - 1) { SWAP_INT32(&nmfc); swap = 1; if (nmfc != flen / 4 - 1) { E_ERROR("File length mismatch: 0x%x != 0x%x, maybe it's not MFCC file\n", nmfc, flen / 4 - 1); return NULL; } } if (nmfc == 0) { E_ERROR("Empty mfcc file\n"); return NULL; } fseek(infh, sf * 4 * ceplen, SEEK_CUR); if (ef == -1) ef = nmfc / ceplen; nfr = ef - sf; mfcs = ckd_calloc_2d(nfr, ceplen, sizeof(**mfcs)); floats = (float32 *)mfcs[0]; if (fread(floats, 4, nfr * ceplen, infh) != nfr * ceplen) { E_ERROR_SYSTEM("Failed to read %d items from mfcfile"); ckd_free_2d(mfcs); return NULL; } if (swap) { for (i = 0; i < nfr * ceplen; ++i) SWAP_FLOAT32(&floats[i]); } #ifdef FIXED_POINT for (i = 0; i < nfr * ceplen; ++i) mfcs[0][i] = FLOAT2MFCC(floats[i]); #endif *out_nfr = nfr; return mfcs; } static int process_mllrctl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *file) { char const *mllrdir, *mllrext; char *infile = NULL; ps_mllr_t *mllr; static char *lastfile; if (file == NULL) return 0; if (lastfile && 0 == strcmp(file, lastfile)) return 0; ckd_free(lastfile); lastfile = ckd_salloc(file); mllrext = cmd_ln_str_r(config, "-mllrext"); if ((mllrdir = cmd_ln_str_r(config, "-mllrdir"))) infile = string_join(mllrdir, "/", file, mllrext ? mllrext : "", NULL); else if (mllrext) infile = string_join(file, mllrext, NULL); else infile = ckd_salloc(file); if ((mllr = ps_mllr_read(infile)) == NULL) { ckd_free(infile); return -1; } if (ps_update_mllr(ps, mllr) == NULL) { ps_mllr_free(mllr); ckd_free(infile); return -1; } E_INFO("Using MLLR: %s\n", file); ckd_free(infile); return 0; } static int process_fsgctl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *fname) { fsg_model_t *fsg; int err; char *path = NULL; const char *fsgdir = cmd_ln_str_r(config, "-fsgdir"); const char *fsgext = cmd_ln_str_r(config, "-fsgext"); if (fname == NULL) return 0; if (fsgdir) path = string_join(fsgdir, "/", fname, fsgext ? fsgext : "", NULL); else if (fsgext) path = string_join(fname, fsgext, NULL); else path = ckd_salloc(fname); fsg = fsg_model_readfile(path, ps_get_logmath(ps), cmd_ln_float32_r(config, "-lw")); err = 0; if (!fsg) { err = -1; goto error_out; } if (ps_set_fsg(ps, fname, fsg)) { err = -1; goto error_out; } E_INFO("Using FSG: %s\n", fname); if (ps_set_search(ps, fname)) err = -1; error_out: fsg_model_free(fsg); ckd_free(path); return err; } static int process_lmnamectl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *lmname) { if (!lmname) return 0; E_INFO("Using language model: %s\n", lmname); if (ps_set_search(ps, lmname)) { E_ERROR("No such language model: %s\n", lmname); return -1; } return 0; } static int build_outdir_one(cmd_ln_t *config, char const *arg, char const *uttpath) { char const *dir; if ((dir = cmd_ln_str_r(config, arg)) != NULL) { char *dirname = string_join(dir, "/", uttpath, NULL); build_directory(dirname); ckd_free(dirname); } return 0; } static int build_outdirs(cmd_ln_t *config, char const *uttid) { char *uttpath = ckd_salloc(uttid); path2dirname(uttid, uttpath); build_outdir_one(config, "-outlatdir", uttpath); build_outdir_one(config, "-mfclogdir", uttpath); build_outdir_one(config, "-rawlogdir", uttpath); build_outdir_one(config, "-senlogdir", uttpath); build_outdir_one(config, "-nbestdir", uttpath); ckd_free(uttpath); return 0; } static int process_ctl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *file, char const *uttid, int32 sf, int32 ef) { FILE *infh; char const *cepdir, *cepext; char *infile; if (ef != -1 && ef < sf) { E_ERROR("End frame %d is < start frame %d\n", ef, sf); return -1; } cepdir = cmd_ln_str_r(config, "-cepdir"); cepext = cmd_ln_str_r(config, "-cepext"); /* Build input filename. */ infile = string_join(cepdir ? cepdir : "", "/", file, cepext ? cepext : "", NULL); if (uttid == NULL) uttid = file; if ((infh = fopen(infile, "rb")) == NULL) { E_ERROR_SYSTEM("Failed to open %s", infile); ckd_free(infile); return -1; } /* Build output directories. */ if (cmd_ln_boolean_r(config, "-build_outdirs")) build_outdirs(config, uttid); if (cmd_ln_boolean_r(config, "-senin")) { /* start and end frames not supported. */ ps_decode_senscr(ps, infh); } else if (cmd_ln_boolean_r(config, "-adcin")) { if (ef != -1) { ef = (int32)((ef - sf) * (cmd_ln_float32_r(config, "-samprate") / cmd_ln_int32_r(config, "-frate")) + (cmd_ln_float32_r(config, "-samprate") * cmd_ln_float32_r(config, "-wlen"))); } sf = (int32)(sf * (cmd_ln_float32_r(config, "-samprate") / cmd_ln_int32_r(config, "-frate"))); fseek(infh, cmd_ln_int32_r(config, "-adchdr") + sf * sizeof(int16), SEEK_SET); ps_decode_raw(ps, infh, ef); } else { mfcc_t **mfcs; int nfr; if (NULL == (mfcs = read_mfc_file(infh, sf, ef, &nfr, cmd_ln_int32_r(config, "-ceplen")))) { E_ERROR("Failed to read MFCC from the file '%s'\n", infile); fclose(infh); ckd_free(infile); return -1; } ps_start_stream(ps); ps_start_utt(ps); ps_process_cep(ps, mfcs, nfr, FALSE, TRUE); ps_end_utt(ps); ckd_free_2d(mfcs); } fclose(infh); ckd_free(infile); return 0; } static int write_lattice(ps_decoder_t *ps, char const *latdir, char const *uttid) { ps_lattice_t *lat; logmath_t *lmath; cmd_ln_t *config; char *outfile; int32 beam; if ((lat = ps_get_lattice(ps)) == NULL) { E_ERROR("Failed to obtain word lattice for utterance %s\n", uttid); return -1; } config = ps_get_config(ps); outfile = string_join(latdir, "/", uttid, cmd_ln_str_r(config, "-outlatext"), NULL); /* Prune lattice. */ lmath = ps_get_logmath(ps); beam = logmath_log(lmath, cmd_ln_float64_r(config, "-outlatbeam")); ps_lattice_posterior_prune(lat, beam); if (0 == strcmp("htk", cmd_ln_str_r(config, "-outlatfmt"))) { if (ps_lattice_write_htk(lat, outfile) < 0) { E_ERROR("Failed to write lattice to %s\n", outfile); return -1; } } else { if (ps_lattice_write(lat, outfile) < 0) { E_ERROR("Failed to write lattice to %s\n", outfile); return -1; } } return 0; } static int write_nbest(ps_decoder_t *ps, char const *nbestdir, char const *uttid) { cmd_ln_t *config; char *outfile; FILE *fh; ps_nbest_t *nbest; int32 i, n, score; const char* hyp; config = ps_get_config(ps); outfile = string_join(nbestdir, "/", uttid, cmd_ln_str_r(config, "-nbestext"), NULL); n = cmd_ln_int32_r(config, "-nbest"); fh = fopen(outfile, "w"); if (fh == NULL) { E_ERROR_SYSTEM("Failed to write a lattice to file %s\n", outfile); return -1; } nbest = ps_nbest(ps); for (i = 0; i < n && nbest && (nbest = ps_nbest_next(nbest)); i++) { hyp = ps_nbest_hyp(nbest, &score); fprintf(fh, "%s %d\n", hyp, score); } if (nbest) ps_nbest_free(nbest); fclose(fh); return 0; } static int write_hypseg(FILE *fh, ps_decoder_t *ps, char const *uttid) { int32 ascr, lscr, sf, ef; ps_seg_t *itor = ps_seg_iter(ps); /* Accumulate language model scores. */ lscr = 0; ascr = 0; while (itor) { int32 wlascr, wlscr; ps_seg_prob(itor, &wlascr, &wlscr, NULL); lscr += wlscr; ascr += wlascr; itor = ps_seg_next(itor); } fprintf(fh, "%s S %d T %d A %d L %d", uttid, 0, /* "scaling factor" which is mostly useless anyway */ ascr + lscr, ascr, lscr); /* Now print out words. */ itor = ps_seg_iter(ps); while (itor) { char const *w = ps_seg_word(itor); int32 ascr, wlscr; ps_seg_prob(itor, &ascr, &wlscr, NULL); ps_seg_frames(itor, &sf, &ef); fprintf(fh, " %d %d %d %s", sf, ascr, wlscr, w); itor = ps_seg_next(itor); } fprintf(fh, " %d\n", ef); return 0; } static int write_ctm(FILE *fh, ps_decoder_t *ps, ps_seg_t *itor, char const *uttid, int32 frate) { logmath_t *lmath = ps_get_logmath(ps); char *dupid, *show, *channel, *c; double ustart = 0.0; /* We have semi-standardized on comma-separated uttids which * correspond to the fields of the STM file. So if there's a * comma in the uttid, take the first two fields as show and * channel, and also try to find the start time. */ show = dupid = ckd_salloc(uttid ? uttid : "(null)"); if ((c = strchr(dupid, ',')) != NULL) { *c++ = '\0'; channel = c; if ((c = strchr(c, ',')) != NULL) { *c++ = '\0'; if ((c = strchr(c, ',')) != NULL) { ustart = atof_c(c + 1); } } } else { channel = NULL; } while (itor) { int32 prob, sf, ef, wid; char const *w; /* Skip things that aren't "real words" (FIXME: currently * requires s3kr3t h34d3rz...) */ w = ps_seg_word(itor); wid = dict_wordid(ps->dict, w); if (wid >= 0 && dict_real_word(ps->dict, wid)) { prob = ps_seg_prob(itor, NULL, NULL, NULL); ps_seg_frames(itor, &sf, &ef); fprintf(fh, "%s %s %.2f %.2f %s %.3f\n", show, channel ? channel : "1", ustart + (double)sf / frate, (double)(ef - sf) / frate, /* FIXME: More s3kr3tz */ dict_basestr(ps->dict, wid), logmath_exp(lmath, prob)); } itor = ps_seg_next(itor); } ckd_free(dupid); return 0; } static void process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) { int32 ctloffset, ctlcount, ctlincr; int32 i; char *line; size_t len; FILE *hypfh = NULL, *hypsegfh = NULL, *ctmfh = NULL; FILE *mllrfh = NULL, *lmfh = NULL, *fsgfh = NULL; double n_speech, n_cpu, n_wall; char const *outlatdir; char const *nbestdir; char const *str; int frate; ctloffset = cmd_ln_int32_r(config, "-ctloffset"); ctlcount = cmd_ln_int32_r(config, "-ctlcount"); ctlincr = cmd_ln_int32_r(config, "-ctlincr"); outlatdir = cmd_ln_str_r(config, "-outlatdir"); nbestdir = cmd_ln_str_r(config, "-nbestdir"); frate = cmd_ln_int32_r(config, "-frate"); if ((str = cmd_ln_str_r(config, "-mllrctl"))) { mllrfh = fopen(str, "r"); if (mllrfh == NULL) { E_ERROR_SYSTEM("Failed to open MLLR control file file %s", str); goto done; } } if ((str = cmd_ln_str_r(config, "-fsgctl"))) { fsgfh = fopen(str, "r"); if (fsgfh == NULL) { E_ERROR_SYSTEM("Failed to open FSG control file file %s", str); goto done; } } if ((str = cmd_ln_str_r(config, "-lmnamectl"))) { lmfh = fopen(str, "r"); if (lmfh == NULL) { E_ERROR_SYSTEM("Failed to open LM name control file file %s", str); goto done; } } if ((str = cmd_ln_str_r(config, "-hyp"))) { hypfh = fopen(str, "w"); if (hypfh == NULL) { E_ERROR_SYSTEM("Failed to open hypothesis file %s for writing", str); goto done; } setbuf(hypfh, NULL); } if ((str = cmd_ln_str_r(config, "-hypseg"))) { hypsegfh = fopen(str, "w"); if (hypsegfh == NULL) { E_ERROR_SYSTEM("Failed to open hypothesis file %s for writing", str); goto done; } setbuf(hypsegfh, NULL); } if ((str = cmd_ln_str_r(config, "-ctm"))) { ctmfh = fopen(str, "w"); if (ctmfh == NULL) { E_ERROR_SYSTEM("Failed to open hypothesis file %s for writing", str); goto done; } setbuf(ctmfh, NULL); } i = 0; while ((line = fread_line(ctlfh, &len))) { char *wptr[4]; int32 nf, sf, ef; char *mllrline = NULL, *lmline = NULL, *fsgline = NULL; char *fsgfile = NULL, *lmname = NULL, *mllrfile = NULL; if (mllrfh) { mllrline = fread_line(mllrfh, &len); if (mllrline == NULL) { E_ERROR("File size mismatch between control and MLLR control\n"); ckd_free(line); ckd_free(mllrline); goto done; } mllrfile = string_trim(mllrline, STRING_BOTH); } if (lmfh) { lmline = fread_line(lmfh, &len); if (lmline == NULL) { E_ERROR("File size mismatch between control and LM control\n"); ckd_free(line); ckd_free(lmline); goto done; } lmname = string_trim(lmline, STRING_BOTH); } if (fsgfh) { fsgline = fread_line(fsgfh, &len); if (fsgline == NULL) { E_ERROR("File size mismatch between control and FSG control\n"); ckd_free(line); ckd_free(fsgline); goto done; } fsgfile = string_trim(fsgline, STRING_BOTH); } if (i < ctloffset) { i += ctlincr; goto nextline; } if (ctlcount != -1 && i >= ctloffset + ctlcount) { goto nextline; } sf = 0; ef = -1; nf = str2words(line, wptr, 4); if (nf == 0) { /* Do nothing. */ } else if (nf < 0) { E_ERROR("Unexpected extra data in control file at line %d\n", i); } else { char const *hyp, *file, *uttid; int32 score; file = wptr[0]; if (nf > 1) sf = atoi(wptr[1]); if (nf > 2) ef = atoi(wptr[2]); if (nf > 3) uttid = wptr[3]; else uttid = file; E_INFO("Decoding '%s'\n", uttid); /* Do actual decoding. */ if(process_mllrctl_line(ps, config, mllrfile) < 0) continue; if(process_lmnamectl_line(ps, config, lmname) < 0) continue; if(process_fsgctl_line(ps, config, fsgfile) < 0) continue; if(process_ctl_line(ps, config, file, uttid, sf, ef) < 0) continue; hyp = ps_get_hyp(ps, &score); /* Write out results and such. */ if (hypfh) { fprintf(hypfh, "%s (%s %d)\n", hyp ? hyp : "", uttid, score); } if (hypsegfh) { write_hypseg(hypsegfh, ps, uttid); } if (ctmfh) { ps_seg_t *itor = ps_seg_iter(ps); write_ctm(ctmfh, ps, itor, uttid, frate); } if (outlatdir) { write_lattice(ps, outlatdir, uttid); } if (nbestdir) { write_nbest(ps, nbestdir, uttid); } ps_get_utt_time(ps, &n_speech, &n_cpu, &n_wall); E_INFO("%s: %.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", uttid, n_speech, n_cpu, n_wall); E_INFO("%s: %.2f xRT (CPU), %.2f xRT (elapsed)\n", uttid, n_cpu / n_speech, n_wall / n_speech); /* help make the logfile somewhat less opaque (air) */ E_INFO_NOFN("%s (%s %d)\n", hyp ? hyp : "", uttid, score); E_INFO_NOFN("%s done --------------------------------------\n", uttid); } i += ctlincr; nextline: ckd_free(mllrline); ckd_free(fsgline); ckd_free(lmline); ckd_free(line); } ps_get_all_time(ps, &n_speech, &n_cpu, &n_wall); E_INFO("TOTAL %.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", n_speech, n_cpu, n_wall); E_INFO("AVERAGE %.2f xRT (CPU), %.2f xRT (elapsed)\n", n_cpu / n_speech, n_wall / n_speech); done: if (hypfh) fclose(hypfh); if (hypsegfh) fclose(hypsegfh); if (ctmfh) fclose(ctmfh); } int main(int32 argc, char *argv[]) { ps_decoder_t *ps; cmd_ln_t *config; char const *ctl; FILE *ctlfh; config = cmd_ln_parse_r(NULL, ps_args_def, argc, argv, TRUE); /* Handle argument file as -argfile. */ if (config && (ctl = cmd_ln_str_r(config, "-argfile")) != NULL) { config = cmd_ln_parse_file_r(config, ps_args_def, ctl, FALSE); } if (config == NULL) { /* This probably just means that we got no arguments. */ return 1; } if ((ctl = cmd_ln_str_r(config, "-ctl")) == NULL) { E_FATAL("-ctl argument not present, nothing to do in batch mode!\n"); } if ((ctlfh = fopen(ctl, "r")) == NULL) { E_FATAL_SYSTEM("Failed to open control file '%s'", ctl); } ps_default_search_args(config); if (!(ps = ps_init(config))) { cmd_ln_free_r(config); fclose(ctlfh); E_FATAL("PocketSphinx decoder init failed\n"); } process_ctl(ps, config, ctlfh); fclose(ctlfh); ps_free(ps); cmd_ln_free_r(config); return 0; } #if defined(_WIN32_WCE) #pragma comment(linker,"/entry:mainWCRTStartup") #include /* Windows Mobile has the Unicode main only */ int wmain(int32 argc, wchar_t *wargv[]) { char** argv; size_t wlen; size_t len; int i; argv = malloc(argc*sizeof(char*)); for (i = 0; i < argc; i++){ wlen = lstrlenW(wargv[i]); len = wcstombs(NULL, wargv[i], wlen); argv[i] = malloc(len+1); wcstombs(argv[i], wargv[i], wlen); } /* assuming ASCII parameters */ return main(argc, argv); } #endif pocketsphinx-5prealpha/src/programs/mdef_convert.c0000664000175000017500000000676112771605033017655 00000000000000/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 2006 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /** * mdef_convert.c - convert text to binary model definition files (and vice versa) * * Author: David Huggins-Daines **/ #include #include #include #include "bin_mdef.h" int main(int argc, char *argv[]) { const char *infile, *outfile; bin_mdef_t *bin; int tobin = 1; if (argc < 3 || argc > 4) { fprintf(stderr, "Usage: %s [-text | -bin] INPUT OUTPUT\n", argv[0]); return 1; } if (argv[1][0] == '-') { if (strcmp(argv[1], "-text") == 0) { tobin = 0; ++argv; } else if (strcmp(argv[1], "-bin") == 0) { tobin = 1; ++argv; } else { fprintf(stderr, "Unknown argument %s\n", argv[1]); fprintf(stderr, "Usage: %s [-text | -bin] INPUT OUTPUT\n", argv[0]); return 1; } } infile = argv[1]; outfile = argv[2]; if (tobin) { if ((bin = bin_mdef_read_text(NULL, infile)) == NULL) { fprintf(stderr, "Failed to read text mdef from %s\n", infile); return 1; } if (bin_mdef_write(bin, outfile) < 0) { fprintf(stderr, "Failed to write binary mdef to %s\n", outfile); return 1; } } else { if ((bin = bin_mdef_read(NULL, infile)) == NULL) { fprintf(stderr, "Failed to read binary mdef from %s\n", infile); return 1; } if (bin_mdef_write_text(bin, outfile) < 0) { fprintf(stderr, "Failed to write text mdef to %s\n", outfile); return 1; } } return 0; } pocketsphinx-5prealpha/src/Makefile.am0000664000175000017500000000006412771605033015226 00000000000000SUBDIRS = libpocketsphinx \ programs \ gst-plugin pocketsphinx-5prealpha/src/Makefile.in0000664000175000017500000004524012771607732015254 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = libpocketsphinx \ programs \ gst-plugin all: all-recursive .SUFFIXES: $(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 .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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-recursive 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: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am 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 \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # 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: pocketsphinx-5prealpha/m4/0000775000175000017500000000000012771610005012776 500000000000000pocketsphinx-5prealpha/m4/ltversion.m40000644000175000017500000000126212771607726015224 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # 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. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) pocketsphinx-5prealpha/m4/lt~obsolete.m40000644000175000017500000001375612771607726015564 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # 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. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) pocketsphinx-5prealpha/m4/ltoptions.m40000644000175000017500000003007312771607726015234 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # 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. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) pocketsphinx-5prealpha/m4/pkg.m40000664000175000017500000001214512771605033013751 00000000000000# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl 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 ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure 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_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- 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 ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # 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 $1]) _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 _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [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 ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [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 .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES pocketsphinx-5prealpha/m4/ax_pkg_swig.m40000664000175000017500000001515312771605033015474 00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html # =========================================================================== # # SYNOPSIS # # AX_PKG_SWIG([major.minor.micro], [action-if-found], [action-if-not-found]) # # DESCRIPTION # # This macro searches for a SWIG installation on your system. If found, # then SWIG is AC_SUBST'd; if not found, then $SWIG is empty. If SWIG is # found, then SWIG_LIB is set to the SWIG library path, and AC_SUBST'd. # # You can use the optional first argument to check if the version of the # available SWIG is greater than or equal to the value of the argument. It # should have the format: N[.N[.N]] (N is a number between 0 and 999. Only # the first N is mandatory.) If the version argument is given (e.g. # 1.3.17), AX_PKG_SWIG checks that the swig package is this version number # or higher. # # As usual, action-if-found is executed if SWIG is found, otherwise # action-if-not-found is executed. # # In configure.in, use as: # # AX_PKG_SWIG(1.3.17, [], [ AC_MSG_ERROR([SWIG is required to build..]) ]) # AX_SWIG_ENABLE_CXX # AX_SWIG_MULTI_MODULE_SUPPORT # AX_SWIG_PYTHON # # LICENSE # # Copyright (c) 2008 Sebastian Huber # Copyright (c) 2008 Alan W. Irwin # Copyright (c) 2008 Rafael Laboissiere # Copyright (c) 2008 Andrew Collier # Copyright (c) 2011 Murray Cumming # # 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 2 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 . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 11 AC_DEFUN([AX_PKG_SWIG],[ # Ubuntu has swig 2.0 as /usr/bin/swig2.0 AC_PATH_PROGS([SWIG],[swig swig2.0]) if test -z "$SWIG" ; then m4_ifval([$3],[$3],[:]) elif test -n "$1" ; then AC_MSG_CHECKING([SWIG version]) [swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`] AC_MSG_RESULT([$swig_version]) if test -n "$swig_version" ; then # Calculate the required version number components [required=$1] [required_major=`echo $required | sed 's/[^0-9].*//'`] if test -z "$required_major" ; then [required_major=0] fi [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] [required_minor=`echo $required | sed 's/[^0-9].*//'`] if test -z "$required_minor" ; then [required_minor=0] fi [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] [required_patch=`echo $required | sed 's/[^0-9].*//'`] if test -z "$required_patch" ; then [required_patch=0] fi # Calculate the available version number components [available=$swig_version] [available_major=`echo $available | sed 's/[^0-9].*//'`] if test -z "$available_major" ; then [available_major=0] fi [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] [available_minor=`echo $available | sed 's/[^0-9].*//'`] if test -z "$available_minor" ; then [available_minor=0] fi [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] [available_patch=`echo $available | sed 's/[^0-9].*//'`] if test -z "$available_patch" ; then [available_patch=0] fi # Convert the version tuple into a single number for easier comparison. # Using base 100 should be safe since SWIG internally uses BCD values # to encode its version number. required_swig_vernum=`expr $required_major \* 10000 \ \+ $required_minor \* 100 \+ $required_patch` available_swig_vernum=`expr $available_major \* 10000 \ \+ $available_minor \* 100 \+ $available_patch` if test $available_swig_vernum -lt $required_swig_vernum; then AC_MSG_WARN([SWIG version >= $1 is required. You have $swig_version.]) SWIG='' m4_ifval([$3],[$3],[]) else AC_MSG_CHECKING([for SWIG library]) SWIG_LIB=`$SWIG -swiglib` AC_MSG_RESULT([$SWIG_LIB]) m4_ifval([$2],[$2],[]) fi else AC_MSG_WARN([cannot determine SWIG version]) SWIG='' m4_ifval([$3],[$3],[]) fi fi AC_SUBST([SWIG_LIB]) ]) pocketsphinx-5prealpha/m4/libtool.m40000644000175000017500000105743212771607726014656 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # 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. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS pocketsphinx-5prealpha/m4/ltsugar.m40000644000175000017500000001042412771607726014660 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) pocketsphinx-5prealpha/m4/ax_python_devel.m40000664000175000017500000002562712771605033016371 00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_python_devel.html # =========================================================================== # # SYNOPSIS # # AX_PYTHON_DEVEL([version]) # # DESCRIPTION # # Note: Defines as a precious variable "PYTHON_VERSION". Don't override it # in your configure.ac. # # This macro checks for Python and tries to get the include path to # 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LDFLAGS) # output variables. It also exports $(PYTHON_EXTRA_LIBS) and # $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code. # # You can search for some particular version of Python by passing a # parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please # note that you *have* to pass also an operator along with the version to # match, and pay special attention to the single quotes surrounding the # version number. Don't use "PYTHON_VERSION" for this: that environment # variable is declared as precious and thus reserved for the end-user. # # This macro should work for all versions of Python >= 2.1.0. As an end # user, you can disable the check for the python version by setting the # PYTHON_NOVERSIONCHECK environment variable to something else than the # empty string. # # If you need to use this macro for an older Python version, please # contact the authors. We're always open for feedback. # # LICENSE # # Copyright (c) 2009 Sebastian Huber # Copyright (c) 2009 Alan W. Irwin # Copyright (c) 2009 Rafael Laboissiere # Copyright (c) 2009 Andrew Collier # Copyright (c) 2009 Matteo Settenvini # Copyright (c) 2009 Horst Knorr # Copyright (c) 2013 Daniel Mullner # # 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 . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 17 AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL]) AC_DEFUN([AX_PYTHON_DEVEL],[ # # Allow the use of a (user set) custom python version # AC_ARG_VAR([PYTHON_VERSION],[The installed Python version to use, for example '2.3'. This string will be appended to the Python interpreter canonical name.]) AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]]) if test -z "$PYTHON"; then AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path]) PYTHON_VERSION="" fi # # Check for a version of Python >= 2.1.0 # AC_MSG_CHECKING([for a version of Python >= '2.1.0']) ac_supports_python_ver=`$PYTHON -c "import sys; \ ver = sys.version.split ()[[0]]; \ print (ver >= '2.1.0')"` if test "$ac_supports_python_ver" != "True"; then if test -z "$PYTHON_NOVERSIONCHECK"; then AC_MSG_RESULT([no]) AC_MSG_FAILURE([ This version of the AC@&t@_PYTHON_DEVEL macro doesn't work properly with versions of Python before 2.1.0. You may need to re-run configure, setting the variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG, PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. Moreover, to disable this check, set PYTHON_NOVERSIONCHECK to something else than an empty string. ]) else AC_MSG_RESULT([skip at user request]) fi else AC_MSG_RESULT([yes]) fi # # if the macro parameter ``version'' is set, honour it # if test -n "$1"; then AC_MSG_CHECKING([for a version of Python $1]) ac_supports_python_ver=`$PYTHON -c "import sys; \ ver = sys.version.split ()[[0]]; \ print (ver $1)"` if test "$ac_supports_python_ver" = "True"; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) AC_MSG_ERROR([this package requires Python $1. If you have it installed, but it isn't the default Python interpreter in your system path, please pass the PYTHON_VERSION variable to configure. See ``configure --help'' for reference. ]) PYTHON_VERSION="" fi fi # # Check if you have distutils, else fail # AC_MSG_CHECKING([for the distutils Python package]) ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` if test -z "$ac_distutils_result"; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot import Python module "distutils". Please check your Python installation. The error was: $ac_distutils_result]) PYTHON_VERSION="" fi # # Check for Python include path # AC_MSG_CHECKING([for Python include path]) if test -z "$PYTHON_CPPFLAGS"; then python_path=`$PYTHON -c "import distutils.sysconfig; \ print (distutils.sysconfig.get_python_inc ());"` plat_python_path=`$PYTHON -c "import distutils.sysconfig; \ print (distutils.sysconfig.get_python_inc (plat_specific=1));"` if test -n "${python_path}"; then if test "${plat_python_path}" != "${python_path}"; then python_path="-I$python_path -I$plat_python_path" else python_path="-I$python_path" fi fi PYTHON_CPPFLAGS=$python_path fi AC_MSG_RESULT([$PYTHON_CPPFLAGS]) AC_SUBST([PYTHON_CPPFLAGS]) # # Check for Python library path # AC_MSG_CHECKING([for Python library path]) if test -z "$PYTHON_LDFLAGS"; then # (makes two attempts to ensure we've got a version number # from the interpreter) ac_python_version=`cat<]], [[Py_Initialize();]]) ],[pythonexists=yes],[pythonexists=no]) AC_LANG_POP([C]) # turn back to default flags CPPFLAGS="$ac_save_CPPFLAGS" LIBS="$ac_save_LIBS" AC_MSG_RESULT([$pythonexists]) if test ! "x$pythonexists" = "xyes"; then AC_MSG_FAILURE([ Could not link test program to Python. Maybe the main Python library has been installed in some non-standard library path. If so, pass it to configure, via the LDFLAGS environment variable. Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib" ============================================================================ ERROR! You probably have to install the development version of the Python package for your distribution. The exact name of this package varies among them. ============================================================================ ]) PYTHON_VERSION="" fi # # all done! # ]) pocketsphinx-5prealpha/depcomp0000755000175000017500000005601612771605157013775 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # 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 2, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: pocketsphinx-5prealpha/config.sub0000755000175000017500000010531512771605157014400 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-04-24' # This file 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 . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: pocketsphinx-5prealpha/NEWS0000664000175000017500000000314212771605033013102 00000000000000Pocketsphinx 0.8 ^^^^^^^^^^^^^^^^ Thanks: Tanel Alumae, Douglas Bagnall, Halle Winkler, Peter Grasch, Vyacheslav Klimkov Erik Andresen, Nicola Murino, Melmahdy, Scott Silliman, Riccardo Magliocchetti, Marc Legendre, Kho-And-Mica, Zheng6822, Pankaj Pailwar, Evandro Gouvea Improvements: * API is better exposed in Python, SWIG and gstreamer * New API for exact grammar match * Configurable type for the frame counter, allows utterances way longer than 5 minutes Fixes: * Memory leaks, refcounting and other memory-related issues * Use proper word bounary senones for the words added on the fly * Accurate FSG lextree construction Pocketsphinx 0.7 ^^^^^^^^^^^^^^^^ Thanks: David Huggins-Daines, Chen Tao, creative64, Edwin Miguel, Bhiksha Raj Improvements: * Nice performance improvements * Use arc iterators to build FSG lextrees, speeds this up immensely * Filler word propagation is responsible for 5% speedup * Continuous decoder can decode files, not from the microphone * Add senone score dumping and reloading capability * Functional alignment pass * Symbian support * Add the Android makefile and other JNI stuff * Case sensitive names, including phone names * Better error messages * Report timing for individual search passes Bug fixes: * Accuracy regression fixes * Fixes the bug with reading transition matrix on big-endian platforms * Fixes very important regression with NULL transitions in fsg search * Proper acoustic score scaling during posterior calculation. And many, many, many more intersting things! Pocketsphinx pre ^^^^^^^^^^^^^^^^ 2000-01-27 CMU Sphinx is going Open Source! pocketsphinx-5prealpha/autogen.sh0000775000175000017500000000601712771605033014410 00000000000000#!/bin/sh # Run this to generate all the initial makefiles, etc. srcdir=`dirname $0` PKG_NAME="the package." DIE=0 # Check tools (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`autoconf' installed to." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } (grep "^LT_INIT" $srcdir/configure.ac >/dev/null) && { if libtoolize --version /dev/null 2>&1; then LIBTOOLIZE=libtoolize elif glibtoolize --version /dev/null 2>&1; then LIBTOOLIZE=glibtoolize else echo echo "**Error**: You must have \`libtool' installed." echo "Get ftp://ftp.gnu.org/pub/gnu/libtool/libtool-2.2.6b.tar.gz" echo "(or a newer version if it is available)" DIE=1 fi } (automake --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`automake' installed." echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.11.tar.gz" echo "(or a newer version if it is available)" DIE=1 NO_AUTOMAKE=yes } # if no automake, don't bother testing for aclocal test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: Missing \`aclocal'. The version of \`automake'" echo "installed doesn't appear recent enough." echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.11.tar.gz" echo "(or a newer version if it is available)" DIE=1 } if test "$DIE" -eq 1; then exit 1 fi if test -z "$*"; then echo "**Warning**: I am going to run \`configure' with no arguments." echo "If you wish to pass any to it, please specify them on the" echo \`$0\'" command line." echo fi case $CC in xlc ) am_opt=--include-deps;; esac for coin in `find $srcdir -name configure.ac -print` do dr=`dirname $coin` if test -f $dr/NO-AUTO-GEN; then echo skipping $dr -- flagged as no auto-gen else echo processing $dr macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` ( cd $dr aclocalinclude="$ACLOCAL_FLAGS" for k in $macrodirs; do if test -d $k; then aclocalinclude="$aclocalinclude -I $k" ##else ## echo "**Warning**: No such directory \`$k'. Ignored." fi done if grep "^LT_INIT" configure.ac >/dev/null; then echo "Running $LIBTOOLIZE..." $LIBTOOLIZE --force --copy fi echo "Running aclocal $aclocalinclude ..." aclocal -I m4 $aclocalinclude if grep "^AC_CONFIG_HEADER" configure.ac >/dev/null; then echo "Running autoheader..." autoheader fi echo "Running automake --foreign --copy $am_opt ..." automake --add-missing --foreign --copy $am_opt echo "Running autoconf ..." autoconf ) fi done #conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c if test x$NOCONFIGURE = x; then echo Running $srcdir/configure $conf_flags "$@" ... $srcdir/configure $conf_flags "$@" \ && echo Now type \`make\' to compile $PKG_NAME else echo Skipping configure process. fi pocketsphinx-5prealpha/pocketsphinx.sln0000664000175000017500000000721412771605033015644 00000000000000 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Express 2012 for Windows Desktop Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx", "win32\pocketsphinx\pocketsphinx.vcxproj", "{94001A0E-A837-445C-8004-F918F10D0226}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx_continuous", "win32\pocketsphinx_continuous\pocketsphinx_continuous.vcxproj", "{1380AF76-C926-44D0-8002-06C228AC869A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx_batch", "win32\pocketsphinx_batch\pocketsphinx_batch.vcxproj", "{CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx_mdef_convert", "win32\pocketsphinx_mdef_convert\pocketsphinx_mdef_convert.vcxproj", "{4FB65800-11B8-46BD-95B8-6E4F73BDAD91}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.ActiveCfg = Debug|Win32 {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.Build.0 = Debug|Win32 {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.ActiveCfg = Debug|x64 {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.Build.0 = Debug|x64 {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.ActiveCfg = Release|Win32 {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.Build.0 = Release|Win32 {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.ActiveCfg = Release|x64 {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.Build.0 = Release|x64 {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|Win32.ActiveCfg = Debug|Win32 {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|Win32.Build.0 = Debug|Win32 {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|x64.ActiveCfg = Debug|x64 {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|x64.Build.0 = Debug|x64 {1380AF76-C926-44D0-8002-06C228AC869A}.Release|Win32.ActiveCfg = Release|Win32 {1380AF76-C926-44D0-8002-06C228AC869A}.Release|Win32.Build.0 = Release|Win32 {1380AF76-C926-44D0-8002-06C228AC869A}.Release|x64.ActiveCfg = Release|x64 {1380AF76-C926-44D0-8002-06C228AC869A}.Release|x64.Build.0 = Release|x64 {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|Win32.ActiveCfg = Debug|Win32 {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|Win32.Build.0 = Debug|Win32 {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|x64.ActiveCfg = Debug|x64 {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|x64.Build.0 = Debug|x64 {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|Win32.ActiveCfg = Release|Win32 {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|Win32.Build.0 = Release|Win32 {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|x64.ActiveCfg = Release|x64 {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|x64.Build.0 = Release|x64 {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|Win32.ActiveCfg = Debug|Win32 {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|Win32.Build.0 = Debug|Win32 {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|x64.ActiveCfg = Debug|x64 {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|x64.Build.0 = Debug|x64 {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|Win32.ActiveCfg = Release|Win32 {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|Win32.Build.0 = Release|Win32 {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|x64.ActiveCfg = Release|x64 {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal pocketsphinx-5prealpha/Makefile.am0000664000175000017500000000103612771605033014437 00000000000000SUBDIRS = src doc model include test swig EXTRA_DIST = \ LICENSE \ autogen.sh \ m4/pkg.m4 \ pocketsphinx.pc.in \ pocketsphinx.sln \ win32/pocketsphinx/pocketsphinx.vcxproj \ win32/pocketsphinx/pocketsphinx.vcxproj.filters \ win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj \ win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj \ win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = pocketsphinx.pc CLEANFILES = pocketsphinx.pc ACLOCAL_AMFLAGS = -I m4 pocketsphinx-5prealpha/test-driver0000755000175000017500000000761112771605157014613 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2012-06-27.10; # UTC # Copyright (C) 2011-2013 Free Software Foundation, Inc. # # 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 2, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: pocketsphinx-5prealpha/doc/0000775000175000017500000000000012771610005013223 500000000000000pocketsphinx-5prealpha/doc/pocketsphinx_continuous.10000664000175000017500000002056012771605033020242 00000000000000.TH POCKETSPHINX_CONTINUOUS 1 "2016-04-01" .SH NAME pocketsphinx_continuous \- Run speech recognition in continuous listening mode .SH SYNOPSIS .B pocketsphinx_continuous .RI [ \fB\-infile\fR \fIfilename.wav\fR ] [ \fB\-inmic yes\fR ] [ \fIoptions\fR ]... .SH DESCRIPTION .PP This program opens the audio device or a file and waits for speech. When it detects an utterance, it performs speech recognition on it. .PP To record from microphone and decode use .TP .B \-inmic yes .PP To decode a 16kHz 16-bit mono WAV file use .TP .B \-infile \fIfilename.wav\fR .PP You can also specify .B \-lm or .B \-fsg or .B \-kws depending on whether you are using a statistical language model or a finite-state grammar or look for a keyphase. .SH OPTIONS .TP .B \-adcdev of audio device to use for input. .TP .B \-agc Automatic gain control for c0 ('max', 'emax', 'noise', or 'none') .TP .B \-agcthresh Initial threshold for automatic gain control .TP .B \-allphone phoneme decoding with phonetic lm .TP .B \-allphone_ci Perform phoneme decoding with phonetic lm and context-independent units only .TP .B \-alpha Preemphasis parameter .TP .B \-argfile file giving extra arguments. .TP .B \-ascale Inverse of acoustic model scale for confidence score calculation .TP .B \-aw Inverse weight applied to acoustic scores. .TP .B \-backtrace Print results and backtraces to log file. .TP .B \-beam Beam width applied to every frame in Viterbi search (smaller values mean wider beam) .TP .B \-bestpath Run bestpath (Dijkstra) search over word lattice (3rd pass) .TP .B \-bestpathlw Language model probability weight for bestpath search .TP .B \-ceplen Number of components in the input feature vector .TP .B \-cmn Cepstral mean normalization scheme ('current', 'prior', or 'none') .TP .B \-cmninit Initial values (comma-separated) for cepstral mean when 'prior' is used .TP .B \-compallsen Compute all senone scores in every frame (can be faster when there are many senones) .TP .B \-debug level for debugging messages .TP .B \-dict pronunciation dictionary (lexicon) input file .TP .B \-dictcase Dictionary is case sensitive (NOTE: case insensitivity applies to ASCII characters only) .TP .B \-dither Add 1/2-bit noise .TP .B \-doublebw Use double bandwidth filters (same center freq) .TP .B \-ds Frame GMM computation downsampling ratio .TP .B \-fdict word pronunciation dictionary input file .TP .B \-feat Feature stream type, depends on the acoustic model .TP .B \-featparams containing feature extraction parameters. .TP .B \-fillprob Filler word transition probability .TP .B \-frate Frame rate .TP .B \-fsg format finite state grammar file .TP .B \-fsgusealtpron Add alternate pronunciations to FSG .TP .B \-fsgusefiller Insert filler words at each state. .TP .B \-fwdflat Run forward flat-lexicon search over word lattice (2nd pass) .TP .B \-fwdflatbeam Beam width applied to every frame in second-pass flat search .TP .B \-fwdflatefwid Minimum number of end frames for a word to be searched in fwdflat search .TP .B \-fwdflatlw Language model probability weight for flat lexicon (2nd pass) decoding .TP .B \-fwdflatsfwin Window of frames in lattice to search for successor words in fwdflat search .TP .B \-fwdflatwbeam Beam width applied to word exits in second-pass flat search .TP .B \-fwdtree Run forward lexicon-tree search (1st pass) .TP .B \-hmm containing acoustic model files. .TP .B \-infile file to transcribe. .TP .B \-inmic Transcribe audio from microphone. .TP .B \-input_endian Endianness of input data, big or little, ignored if NIST or MS Wav .TP .B \-jsgf grammar file .TP .B \-keyphrase to spot .TP .B \-kws file with keyphrases to spot, one per line .TP .B \-kws_delay Delay to wait for best detection score .TP .B \-kws_plp Phone loop probability for keyword spotting .TP .B \-kws_threshold Threshold for p(hyp)/p(alternatives) ratio .TP .B \-latsize Initial backpointer table size .TP .B \-lda containing transformation matrix to be applied to features (single-stream features only) .TP .B \-ldadim Dimensionality of output of feature transformation (0 to use entire matrix) .TP .B \-lifter Length of sin-curve for liftering, or 0 for no liftering. .TP .B \-lm trigram language model input file .TP .B \-lmctl a set of language model .TP .B \-lmname language model in \fB\-lmctl\fR to use by default .TP .B \-logbase Base in which all log-likelihoods calculated .TP .B \-logfn to write log messages in .TP .B \-logspec Write out logspectral files instead of cepstra .TP .B \-lowerf Lower edge of filters .TP .B \-lpbeam Beam width applied to last phone in words .TP .B \-lponlybeam Beam width applied to last phone in single-phone words .TP .B \-lw Language model probability weight .TP .B \-maxhmmpf Maximum number of active HMMs to maintain at each frame (or \fB\-1\fR for no pruning) .TP .B \-maxwpf Maximum number of distinct word exits at each frame (or \fB\-1\fR for no pruning) .TP .B \-mdef definition input file .TP .B \-mean gaussian means input file .TP .B \-mfclogdir to log feature files to .TP .B \-min_endfr Nodes ignored in lattice construction if they persist for fewer than N frames .TP .B \-mixw mixture weights input file (uncompressed) .TP .B \-mixwfloor Senone mixture weights floor (applied to data from \fB\-mixw\fR file) .TP .B \-mllr transformation to apply to means and variances .TP .B \-mmap Use memory-mapped I/O (if possible) for model files .TP .B \-ncep Number of cep coefficients .TP .B \-nfft Size of FFT .TP .B \-nfilt Number of filter banks .TP .B \-nwpen New word transition penalty .TP .B \-pbeam Beam width applied to phone transitions .TP .B \-pip Phone insertion penalty .TP .B \-pl_beam Beam width applied to phone loop search for lookahead .TP .B \-pl_pbeam Beam width applied to phone loop transitions for lookahead .TP .B \-pl_pip Phone insertion penalty for phone loop .TP .B \-pl_weight Weight for phoneme lookahead penalties .TP .B \-pl_window Phoneme lookahead window size, in frames .TP .B \-rawlogdir to log raw audio files to .TP .B \-remove_dc Remove DC offset from each frame .TP .B \-remove_noise Remove noise with spectral subtraction in mel-energies .TP .B \-remove_silence Enables VAD, removes silence frames from processing .TP .B \-round_filters Round mel filter frequencies to DFT points .TP .B \-samprate Sampling rate .TP .B \-seed Seed for random number generator; if less than zero, pick our own .TP .B \-sendump dump (compressed mixture weights) input file .TP .B \-senlogdir to log senone score files to .TP .B \-senmgau to codebook mapping input file (usually not needed) .TP .B \-silprob Silence word transition probability .TP .B \-smoothspec Write out cepstral-smoothed logspectral files .TP .B \-svspec specification (e.g., 24,0-11/25,12-23/26-38 or 0-12/13-25/26-38) .TP .B \-time Print word times in file transcription. .TP .B \-tmat state transition matrix input file .TP .B \-tmatfloor HMM state transition probability floor (applied to \fB\-tmat\fR file) .TP .B \-topn Maximum number of top Gaussians to use in scoring. .TP .B \-topn_beam Beam width used to determine top-N Gaussians (or a list, per-feature) .TP .B \-toprule rule for JSGF (first public rule is default) .TP .B \-transform Which type of transform to use to calculate cepstra (legacy, dct, or htk) .TP .B \-unit_area Normalize mel filters to unit area .TP .B \-upperf Upper edge of filters .TP .B \-uw Unigram weight .TP .B \-vad_postspeech Num of silence frames to keep after from speech to silence. .TP .B \-vad_prespeech Num of speech frames to keep before silence to speech. .TP .B \-vad_startspeech Num of speech frames to trigger vad from silence to speech. .TP .B \-vad_threshold Threshold for decision between noise and silence frames. Log-ratio between signal level and noise level. .TP .B \-var gaussian variances input file .TP .B \-varfloor Mixture gaussian variance floor (applied to data from \fB\-var\fR file) .TP .B \-varnorm Variance normalize each utterance (only if CMN == current) .TP .B \-verbose Show input filenames .TP .B \-warp_params defining the warping function .TP .B \-warp_type Warping function type (or shape) .TP .B \-wbeam Beam width applied to word exits .TP .B \-wip Word insertion penalty .TP .B \-wlen Hamming window length .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. .br .SH "SEE ALSO" .BR pocketsphinx_batch (1), .BR sphinx_fe (1). .brpocketsphinx-5prealpha/doc/pocketsphinx_batch.10000664000175000017500000002400712771605033017115 00000000000000.TH POCKETSPHINX_BATCH 1 "2007-08-27" .SH NAME pocketsphinx_batch \- Run speech recognition in batch mode .SH SYNOPSIS .B pocketsphinx_batch .RI \fB\-ctl\fR \fIctlfile\fR \fB\-cepdir\fR \fIcepdir\fR \fB\-cepext\fR \fI.mfc\fR [\fI options \fR]... .SH DESCRIPTION .PP Run speech recognition over a list of utterances in batchmode. A list of arguments follows: .TP .B \-adchdr Size of audio file header in bytes (headers are ignored) .TP .B \-adcin Input is raw audio data .TP .B \-agc Automatic gain control for c0 ('max', 'emax', 'noise', or 'none') .TP .B \-agcthresh Initial threshold for automatic gain control .TP .B \-allphone phoneme decoding with phonetic lm .TP .B \-allphone_ci Perform phoneme decoding with phonetic lm and context-independent units only .TP .B \-alpha Preemphasis parameter .TP .B \-argfile file giving extra arguments. .TP .B \-ascale Inverse of acoustic model scale for confidence score calculation .TP .B \-aw Inverse weight applied to acoustic scores. .TP .B \-backtrace Print results and backtraces to log file. .TP .B \-beam Beam width applied to every frame in Viterbi search (smaller values mean wider beam) .TP .B \-bestpath Run bestpath (Dijkstra) search over word lattice (3rd pass) .TP .B \-bestpathlw Language model probability weight for bestpath search .TP .B \-build_outdirs Create missing subdirectories in output directory .TP .B \-cepdir files directory (prefixed to filespecs in control file) .TP .B \-cepext Input files extension (suffixed to filespecs in control file) .TP .B \-ceplen Number of components in the input feature vector .TP .B \-cmn Cepstral mean normalization scheme ('current', 'prior', or 'none') .TP .B \-cmninit Initial values (comma-separated) for cepstral mean when 'prior' is used .TP .B \-compallsen Compute all senone scores in every frame (can be faster when there are many senones) .TP .B \-ctl file listing utterances to be processed .TP .B \-ctlcount No. of utterances to be processed (after skipping \fB\-ctloffset\fR entries) .TP .B \-ctlincr Do every Nth line in the control file .TP .B \-ctloffset No. of utterances at the beginning of \fB\-ctl\fR file to be skipped .TP .B \-ctm output in CTM file format (may require post-sorting) .TP .B \-debug level for debugging messages .TP .B \-dict pronunciation dictionary (lexicon) input file .TP .B \-dictcase Dictionary is case sensitive (NOTE: case insensitivity applies to ASCII characters only) .TP .B \-dither Add 1/2-bit noise .TP .B \-doublebw Use double bandwidth filters (same center freq) .TP .B \-ds Frame GMM computation downsampling ratio .TP .B \-fdict word pronunciation dictionary input file .TP .B \-feat Feature stream type, depends on the acoustic model .TP .B \-featparams containing feature extraction parameters. .TP .B \-fillprob Filler word transition probability .TP .B \-frate Frame rate .TP .B \-fsg format finite state grammar file .TP .B \-fsgctl file listing FSG file to use for each utterance .TP .B \-fsgdir directory for FSG files .TP .B \-fsgext extension for FSG files (including leading dot) .TP .B \-fsgusealtpron Add alternate pronunciations to FSG .TP .B \-fsgusefiller Insert filler words at each state. .TP .B \-fwdflat Run forward flat-lexicon search over word lattice (2nd pass) .TP .B \-fwdflatbeam Beam width applied to every frame in second-pass flat search .TP .B \-fwdflatefwid Minimum number of end frames for a word to be searched in fwdflat search .TP .B \-fwdflatlw Language model probability weight for flat lexicon (2nd pass) decoding .TP .B \-fwdflatsfwin Window of frames in lattice to search for successor words in fwdflat search .TP .B \-fwdflatwbeam Beam width applied to word exits in second-pass flat search .TP .B \-fwdtree Run forward lexicon-tree search (1st pass) .TP .B \-hmm containing acoustic model files. .TP .B \-hyp output file name .TP .B \-hypseg output with segmentation file name .TP .B \-input_endian Endianness of input data, big or little, ignored if NIST or MS Wav .TP .B \-jsgf grammar file .TP .B \-keyphrase to spot .TP .B \-kws file with keyphrases to spot, one per line .TP .B \-kws_delay Delay to wait for best detection score .TP .B \-kws_plp Phone loop probability for keyword spotting .TP .B \-kws_threshold Threshold for p(hyp)/p(alternatives) ratio .TP .B \-latsize Initial backpointer table size .TP .B \-lda containing transformation matrix to be applied to features (single-stream features only) .TP .B \-ldadim Dimensionality of output of feature transformation (0 to use entire matrix) .TP .B \-lifter Length of sin-curve for liftering, or 0 for no liftering. .TP .B \-lm trigram language model input file .TP .B \-lmctl a set of language model .TP .B \-lmname language model in \fB\-lmctl\fR to use by default .TP .B \-lmnamectl file listing LM name to use for each utterance .TP .B \-logbase Base in which all log-likelihoods calculated .TP .B \-logfn to write log messages in .TP .B \-logspec Write out logspectral files instead of cepstra .TP .B \-lowerf Lower edge of filters .TP .B \-lpbeam Beam width applied to last phone in words .TP .B \-lponlybeam Beam width applied to last phone in single-phone words .TP .B \-lw Language model probability weight .TP .B \-maxhmmpf Maximum number of active HMMs to maintain at each frame (or \fB\-1\fR for no pruning) .TP .B \-maxwpf Maximum number of distinct word exits at each frame (or \fB\-1\fR for no pruning) .TP .B \-mdef definition input file .TP .B \-mean gaussian means input file .TP .B \-mfclogdir to log feature files to .TP .B \-min_endfr Nodes ignored in lattice construction if they persist for fewer than N frames .TP .B \-mixw mixture weights input file (uncompressed) .TP .B \-mixwfloor Senone mixture weights floor (applied to data from \fB\-mixw\fR file) .TP .B \-mllr transformation to apply to means and variances .TP .B \-mllrctl file listing MLLR transforms to use for each utterance .TP .B \-mllrdir directory for MLLR transforms .TP .B \-mllrext extension for MLLR transforms (including leading dot) .TP .B \-mmap Use memory-mapped I/O (if possible) for model files .TP .B \-nbest Number of N-best hypotheses to write to \fB\-nbestdir\fR (0 for no N-best) .TP .B \-nbestdir for writing N-best hypothesis lists .TP .B \-nbestext Extension for N-best hypothesis list files .TP .B \-ncep Number of cep coefficients .TP .B \-nfft Size of FFT .TP .B \-nfilt Number of filter banks .TP .B \-nwpen New word transition penalty .TP .B \-outlatbeam Minimum posterior probability for output lattice nodes .TP .B \-outlatdir for dumping word lattices .TP .B \-outlatext Filename extension for dumping word lattices .TP .B \-outlatfmt Format for dumping word lattices (s3 or htk) .TP .B \-pbeam Beam width applied to phone transitions .TP .B \-pip Phone insertion penalty .TP .B \-pl_beam Beam width applied to phone loop search for lookahead .TP .B \-pl_pbeam Beam width applied to phone loop transitions for lookahead .TP .B \-pl_pip Phone insertion penalty for phone loop .TP .B \-pl_weight Weight for phoneme lookahead penalties .TP .B \-pl_window Phoneme lookahead window size, in frames .TP .B \-rawlogdir to log raw audio files to .TP .B \-remove_dc Remove DC offset from each frame .TP .B \-remove_noise Remove noise with spectral subtraction in mel-energies .TP .B \-remove_silence Enables VAD, removes silence frames from processing .TP .B \-round_filters Round mel filter frequencies to DFT points .TP .B \-samprate Sampling rate .TP .B \-seed Seed for random number generator; if less than zero, pick our own .TP .B \-sendump dump (compressed mixture weights) input file .TP .B \-senin Input is senone score dump files .TP .B \-senlogdir to log senone score files to .TP .B \-senmgau to codebook mapping input file (usually not needed) .TP .B \-silprob Silence word transition probability .TP .B \-smoothspec Write out cepstral-smoothed logspectral files .TP .B \-svspec specification (e.g., 24,0-11/25,12-23/26-38 or 0-12/13-25/26-38) .TP .B \-tmat state transition matrix input file .TP .B \-tmatfloor HMM state transition probability floor (applied to \fB\-tmat\fR file) .TP .B \-topn Maximum number of top Gaussians to use in scoring. .TP .B \-topn_beam Beam width used to determine top-N Gaussians (or a list, per-feature) .TP .B \-toprule rule for JSGF (first public rule is default) .TP .B \-transform Which type of transform to use to calculate cepstra (legacy, dct, or htk) .TP .B \-unit_area Normalize mel filters to unit area .TP .B \-upperf Upper edge of filters .TP .B \-uw Unigram weight .TP .B \-vad_postspeech Num of silence frames to keep after from speech to silence. .TP .B \-vad_prespeech Num of speech frames to keep before silence to speech. .TP .B \-vad_startspeech Num of speech frames to trigger vad from silence to speech. .TP .B \-vad_threshold Threshold for decision between noise and silence frames. Log-ratio between signal level and noise level. .TP .B \-var gaussian variances input file .TP .B \-varfloor Mixture gaussian variance floor (applied to data from \fB\-var\fR file) .TP .B \-varnorm Variance normalize each utterance (only if CMN == current) .TP .B \-verbose Show input filenames .TP .B \-warp_params defining the warping function .TP .B \-warp_type Warping function type (or shape) .TP .B \-wbeam Beam width applied to word exits .TP .B \-wip Word insertion penalty .TP .B \-wlen Hamming window length .PP To do batchmode recognition, you will need to specify a control file, using .B \-ctl This is a simple text file containing one entry per line. Each entry is the name of an input file relative to the .B \-cepdir directory, and without the filename extension (which is given in the .B \-cepext argument). .PP If you are using acoustic feature files as input (see .BR sphinx_fe (1) for information on how to generate these), you can also specify a subpart of a file, using the following format: .PP .RS .B FILENAME START\-FRAME END\-FRAME UTTERANCE-ID .RE .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. .br .SH "SEE ALSO" .BR pocketsphinx_continuous (1), .BR sphinx_fe (1). .brpocketsphinx-5prealpha/doc/pocketsphinx_mdef_convert.10000664000175000017500000000145612771605033020512 00000000000000.TH POCKETSPHINX_MDEF_CONVERT 1 "2007-08-27" .SH NAME pocketsphinx_mdef_convert \- Convert text-format model definition files to and from PocketSphinx format .SH SYNOPSIS .B pocketsphinx_mdef_convert [\fI options \fR] .B INPUT OUTPUT .SH DESCRIPTION .PP This program converts the text format acoustic model definition files generated by SphinxTrain into the fast binary format used by PocketSphinx. It can also convert binary files back to text format. .TP .B -text The input is in text format, and is to be converted to binary. .TP .B -bin The input is in binary format, and is to be converted to text. .SH AUTHOR Written by David Huggins-Daines . .SH COPYRIGHT Copyright \(co 2016 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. .br pocketsphinx-5prealpha/doc/doxyfile.in0000664000175000017500000014537212771605033015337 00000000000000# Doxyfile 1.5.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file that # follow. The default is UTF-8 which is also the encoding used for all text before # the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into # libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of # possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = PocketSphinx # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @VERSION@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = @builddir@ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, # Italian, Japanese, Japanese-en (Japanese with English messages), Korean, # Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, # Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = @top_srcdir@ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = @top_srcdir@/include @top_srcdir@/src/libpocketsphinx # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default # input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. # See http://www.gnu.org/software/libiconv for the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = */.svn/* */.deps/* */.libs/* */cmu6_lts_rules.* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the output. # The symbol name can be a fully qualified name, a word, or if the wildcard * is used, # a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = YES # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = @sphinxbasebuild@/doc/doxytags=../sphinxbase # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = @builddir@/doxytags # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to # produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to # specify the directory where the mscgen tool resides. If left empty the tool is assumed to # be found in the default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen will always # show the root nodes and its direct children regardless of this setting. DOT_GRAPH_MAX_NODES = 50 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO pocketsphinx-5prealpha/doc/Makefile.am0000664000175000017500000000236012771605033015205 00000000000000man_MANS = \ pocketsphinx_batch.1 \ pocketsphinx_continuous.1 \ pocketsphinx_mdef_convert.1 EXTRA_DIST = \ args2man.pl \ doxy2swig.py \ pocketsphinx_batch.1.in \ pocketsphinx_continuous.1.in \ pocketsphinx_batch.1 \ pocketsphinx_continuous.1 \ pocketsphinx_mdef_convert.1 # pocketsphinx_batch.1: pocketsphinx_batch.1.in # $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_batch \ # < $< > $@ # pocketsphinx_continuous.1: pocketsphinx_continuous.1.in # $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_continuous \ # < $< > $@ if BUILD_SWIG SWIG_DOC = pydoc.i pydoc.i: html/index.html $(PYTHON) $(srcdir)/doxy2swig.py -n xml/index.xml pydoc.i endif if BUILD_DOXYGEN all-local: html/index.html $(SWIG_DOC) endif headers = \ $(top_srcdir)/include/pocketsphinx.h \ $(top_srcdir)/include/ps_lattice.h \ $(top_srcdir)/include/ps_mllr.h \ $(top_srcdir)/include/ps_search.h latex/refman.pdf: doxyfile $(headers) doxygen $(MAKE) -C latex refman.pdf html/index.html: doxyfile $(headers) doxygen clean-local: -rm -rf html xml latex doxytags $(SWIG_DOC) # Totally CMU-specific rule for uploading documentation upload: html/index.html rsync -av html/ file:/usr12/apache2/htdocs/sphinx/doc/doxygen/pocketsphinx/ pocketsphinx-5prealpha/doc/pocketsphinx_continuous.1.in0000664000175000017500000000212312771605033020642 00000000000000.TH POCKETSPHINX_CONTINUOUS 1 "2016-04-01" .SH NAME pocketsphinx_continuous \- Run speech recognition in continuous listening mode .SH SYNOPSIS .B pocketsphinx_continuous .RI [ \fB\-infile\fR \fIfilename.wav\fR ] [ \fB\-inmic yes\fR ] [ \fIoptions\fR ]... .SH DESCRIPTION .PP This program opens the audio device or a file and waits for speech. When it detects an utterance, it performs speech recognition on it. .PP To record from microphone and decode use .TP .B \-inmic yes .PP To decode a 16kHz 16-bit mono WAV file use .TP .B \-infile \fIfilename.wav\fR .PP You can also specify .B \-lm or .B \-fsg or .B \-kws depending on whether you are using a statistical language model or a finite-state grammar or look for a keyphase. .SH OPTIONS .\" ### ARGUMENTS ### .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. .br .SH "SEE ALSO" .BR pocketsphinx_batch (1), .BR sphinx_fe (1). .brpocketsphinx-5prealpha/doc/Makefile.in0000664000175000017500000004163412771607732015235 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/doxyfile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = doxyfile CONFIG_CLEAN_VPATH_FILES = 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 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GST_CFLAGS = @GST_CFLAGS@ GST_LIBS = @GST_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GStreamer_CFLAGS = @GStreamer_CFLAGS@ GStreamer_LIBS = @GStreamer_LIBS@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ man_MANS = \ pocketsphinx_batch.1 \ pocketsphinx_continuous.1 \ pocketsphinx_mdef_convert.1 EXTRA_DIST = \ args2man.pl \ doxy2swig.py \ pocketsphinx_batch.1.in \ pocketsphinx_continuous.1.in \ pocketsphinx_batch.1 \ pocketsphinx_continuous.1 \ pocketsphinx_mdef_convert.1 # pocketsphinx_batch.1: pocketsphinx_batch.1.in # $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_batch \ # < $< > $@ # pocketsphinx_continuous.1: pocketsphinx_continuous.1.in # $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_continuous \ # < $< > $@ @BUILD_SWIG_TRUE@SWIG_DOC = pydoc.i headers = \ $(top_srcdir)/include/pocketsphinx.h \ $(top_srcdir)/include/ps_lattice.h \ $(top_srcdir)/include/ps_mllr.h \ $(top_srcdir)/include/ps_search.h all: all-am .SUFFIXES: $(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 doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): doxyfile: $(top_builddir)/config.status $(srcdir)/doxyfile.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(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: check-am @BUILD_DOXYGEN_FALSE@all-local: all-am: Makefile $(MANS) all-local installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: 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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool clean-local cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am 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-man1 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-man uninstall-man1 @BUILD_SWIG_TRUE@pydoc.i: html/index.html @BUILD_SWIG_TRUE@ $(PYTHON) $(srcdir)/doxy2swig.py -n xml/index.xml pydoc.i @BUILD_DOXYGEN_TRUE@all-local: html/index.html $(SWIG_DOC) latex/refman.pdf: doxyfile $(headers) doxygen $(MAKE) -C latex refman.pdf html/index.html: doxyfile $(headers) doxygen clean-local: -rm -rf html xml latex doxytags $(SWIG_DOC) # Totally CMU-specific rule for uploading documentation upload: html/index.html rsync -av html/ file:/usr12/apache2/htdocs/sphinx/doc/doxygen/pocketsphinx/ # 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: pocketsphinx-5prealpha/doc/doxy2swig.py0000664000175000017500000003777712771605033015506 00000000000000#!/usr/bin/env python """Doxygen XML to SWIG docstring converter. Usage: doxy2swig.py [options] input.xml output.i Converts Doxygen generated XML files into a file containing docstrings that can be used by SWIG-1.3.x. Note that you need to get SWIG version > 1.3.23 or use Robin Dunn's docstring patch to be able to use the resulting output. input.xml is your doxygen generated XML file and output.i is where the output will be written (the file will be clobbered). """ ###################################################################### # # This code is implemented using Mark Pilgrim's code as a guideline: # http://www.faqs.org/docs/diveintopython/kgp_divein.html # # Author: Prabhu Ramachandran # License: BSD style # # Thanks: # Johan Hake: the include_function_definition feature # Bill Spotz: bug reports and testing. # Sebastian Henschel: Misc. enhancements. # ###################################################################### from xml.dom import minidom import re import textwrap import sys import types import os.path import optparse # TODO: do not process unnecessary files TYPEMAP = { 'ps_decoder_t': ('Decoder', 'ps_'), 'ps_lattice_t': ('Lattice', 'ps_lattice_'), 'ps_nbest_t': ('NBest', 'ps_nbest_'), 'ps_seg_t': ('Segment', 'ps_seg_') } USE_PREFIXES = [ 'ps_', ] def my_open_read(source): if hasattr(source, "read"): return source else: return open(source) def my_open_write(dest): if hasattr(dest, "write"): return dest else: return open(dest, 'w') class Doxy2SWIG: """Converts Doxygen generated XML files into a file containing docstrings that can be used by SWIG-1.3.x that have support for feature("docstring"). Once the data is parsed it is stored in self.pieces. """ def __init__(self, src, include_function_definition=True, quiet=False): """Initialize the instance given a source object. `src` can be a file or filename. If you do not want to include function definitions from doxygen then set `include_function_definition` to `False`. This is handy since this allows you to use the swig generated function definition using %feature("autodoc", [0,1]). """ f = my_open_read(src) self.my_dir = os.path.dirname(f.name) self.xmldoc = minidom.parse(f).documentElement f.close() self.pieces = [] self.pieces.append('\n// File: %s\n'%\ os.path.basename(f.name)) self.space_re = re.compile(r'\s+') self.lead_spc = re.compile(r'^(%feature\S+\s+\S+\s*?)"\s+(\S)') self.multi = 0 self.ignores = ['inheritancegraph', 'param', 'listofallmembers', 'innerclass', 'name', 'declname', 'incdepgraph', 'invincdepgraph', 'programlisting', 'type', 'references', 'referencedby', 'location', 'collaborationgraph', 'reimplements', 'reimplementedby', 'derivedcompoundref', 'basecompoundref'] #self.generics = [] self.include_function_definition = include_function_definition if not include_function_definition: self.ignores.append('argsstring') self.quiet = quiet def generate(self): """Parses the file set in the initialization. The resulting data is stored in `self.pieces`. """ self.parse(self.xmldoc) def parse(self, node): """Parse a given node. This function in turn calls the `parse_` functions which handle the respective nodes. """ pm = getattr(self, "parse_%s"%node.__class__.__name__) pm(node) def parse_Document(self, node): self.parse(node.documentElement) def parse_Text(self, node): txt = node.data txt = txt.replace('\\', r'\\\\') txt = txt.replace('"', r'\"') # ignore pure whitespace m = self.space_re.match(txt) if m and len(m.group()) == len(txt): pass else: self.add_text(textwrap.fill(txt, break_long_words=False)) def parse_Element(self, node): """Parse an `ELEMENT_NODE`. This calls specific `do_` handers for different elements. If no handler is available the `generic_parse` method is called. All tagNames specified in `self.ignores` are simply ignored. """ name = node.tagName ignores = self.ignores if name in ignores: return attr = "do_%s" % name if hasattr(self, attr): handlerMethod = getattr(self, attr) handlerMethod(node) else: self.generic_parse(node) #if name not in self.generics: self.generics.append(name) def parse_Comment(self, node): """Parse a `COMMENT_NODE`. This does nothing for now.""" return def add_text(self, value): """Adds text corresponding to `value` into `self.pieces`.""" if isinstance(value, tuple) or isinstance(value, list): self.pieces.extend(value) else: self.pieces.append(value) def get_specific_nodes(self, node, names): """Given a node and a sequence of strings in `names`, return a dictionary containing the names as keys and child `ELEMENT_NODEs`, that have a `tagName` equal to the name. """ nodes = [(x.tagName, x) for x in node.childNodes \ if x.nodeType == x.ELEMENT_NODE and \ x.tagName in names] return dict(nodes) def generic_parse(self, node, pad=0): """A Generic parser for arbitrary tags in a node. Parameters: - node: A node in the DOM. - pad: `int` (default: 0) If 0 the node data is not padded with newlines. If 1 it appends a newline after parsing the childNodes. If 2 it pads before and after the nodes are processed. Defaults to 0. """ npiece = 0 if pad: npiece = len(self.pieces) if pad == 2: self.add_text('\n') for n in node.childNodes: self.parse(n) if pad: if len(self.pieces) > npiece: self.add_text('\n') def space_parse(self, node): self.add_text(' ') self.generic_parse(node) do_ref = space_parse do_emphasis = space_parse do_bold = space_parse do_computeroutput = space_parse do_formula = space_parse def do_compoundname(self, node): self.add_text('\n\n') data = node.firstChild.data self.add_text('%%feature("docstring") %s "\n' % data) def do_compounddef(self, node): kind = node.attributes['kind'].value if kind in ('class', 'struct'): prot = node.attributes['prot'].value if prot != 'public': return names = ('compoundname', 'briefdescription', 'detaileddescription', 'includes') first = self.get_specific_nodes(node, names) for n in names: if first.has_key(n): self.parse(first[n]) self.add_text(['";','\n']) for n in node.childNodes: if n not in first.values(): self.parse(n) elif kind in ('file', 'namespace'): nodes = node.getElementsByTagName('sectiondef') for n in nodes: self.parse(n) def do_includes(self, node): self.add_text('C++ includes: ') self.generic_parse(node, pad=1) def do_parameterlist(self, node): text='unknown' for key, val in node.attributes.items(): if key == 'kind': if val == 'param': text = 'Parameters' elif val == 'exception': text = 'Exceptions' else: text = val break self.add_text(['\n', '\n', text, ':', '\n']) self.generic_parse(node, pad=1) def do_para(self, node): self.add_text('\n') self.generic_parse(node, pad=1) def do_parametername(self, node): self.add_text('\n') try: data=node.firstChild.data except AttributeError: # perhaps a tag in it data=node.firstChild.firstChild.data if data.find('Exception') != -1: self.add_text(data) else: self.add_text("%s: "%data) def do_parameterdefinition(self, node): self.generic_parse(node, pad=1) def do_detaileddescription(self, node): self.generic_parse(node, pad=1) def do_briefdescription(self, node): self.generic_parse(node, pad=1) def do_memberdef(self, node): prot = node.attributes['prot'].value id = node.attributes['id'].value kind = node.attributes['kind'].value tmp = node.parentNode.parentNode.parentNode compdef = tmp.getElementsByTagName('compounddef')[0] cdef_kind = compdef.attributes['kind'].value if prot == 'public': first = self.get_specific_nodes(node, ('definition', 'name')) name = first['name'].firstChild.data for n in node.getElementsByTagName('param'): arg_type = n.getElementsByTagName('type')[0] ref = self.get_specific_nodes(arg_type, ('ref')) if 'ref' in ref: type_name = ref['ref'].firstChild.data # TODO: check argument position if type_name in TYPEMAP: alias, prefix = TYPEMAP[type_name] short_name = name.replace(prefix, '') if not re.match(r'^\d', short_name): name = alias + '::' + name.replace(prefix, '') break if name[:8] == 'operator': # Don't handle operators yet. return if not ('definition' in first) or \ kind in ['variable', 'typedef']: return if self.include_function_definition: defn = first['definition'].firstChild.data else: defn = "" self.add_text('\n') self.add_text('%feature("docstring") ') anc = node.parentNode.parentNode if cdef_kind in ('file', 'namespace'): ns_node = anc.getElementsByTagName('innernamespace') if not ns_node and cdef_kind == 'namespace': ns_node = anc.getElementsByTagName('compoundname') if ns_node: ns = ns_node[0].firstChild.data self.add_text(' %s::%s "\n%s'%(ns, name, defn)) else: self.add_text(' %s "\n%s'%(name, defn)) elif cdef_kind in ('class', 'struct'): # Get the full function name. anc_node = anc.getElementsByTagName('compoundname') cname = anc_node[0].firstChild.data self.add_text(' %s::%s "\n%s'%(cname, name, defn)) for n in node.childNodes: if n not in first.values(): self.parse(n) self.add_text(['";', '\n']) def do_definition(self, node): data = node.firstChild.data self.add_text('%s "\n%s'%(data, data)) def do_sectiondef(self, node): kind = node.attributes['kind'].value if kind in ('public-func', 'func', 'user-defined', ''): self.generic_parse(node) def do_header(self, node): """For a user defined section def a header field is present which should not be printed as such, so we comment it in the output.""" data = node.firstChild.data self.add_text('\n/*\n %s \n*/\n'%data) # If our immediate sibling is a 'description' node then we # should comment that out also and remove it from the parent # node's children. parent = node.parentNode idx = parent.childNodes.index(node) if len(parent.childNodes) >= idx + 2: nd = parent.childNodes[idx+2] if nd.nodeName == 'description': nd = parent.removeChild(nd) self.add_text('\n/*') self.generic_parse(nd) self.add_text('\n*/\n') def do_simplesect(self, node): kind = node.attributes['kind'].value if kind in ('date', 'rcs', 'version'): pass elif kind == 'warning': self.add_text(['\n', 'WARNING: ']) self.generic_parse(node) elif kind == 'see': self.add_text('\n') self.add_text('See: ') self.generic_parse(node) else: self.generic_parse(node) def do_argsstring(self, node): self.generic_parse(node, pad=1) def do_member(self, node): kind = node.attributes['kind'].value refid = node.attributes['refid'].value if kind == 'function' and refid[:9] == 'namespace': self.generic_parse(node) def do_doxygenindex(self, node): self.multi = 1 comps = node.getElementsByTagName('compound') for c in comps: refid = c.attributes['refid'].value fname = refid + '.xml' for prefix in USE_PREFIXES: if fname.startswith(prefix): if not os.path.exists(fname): fname = os.path.join(self.my_dir, fname) if not self.quiet: print ("parsing file: %s" % fname) p = Doxy2SWIG(fname, self.include_function_definition, self.quiet) p.generate() self.pieces.extend(self.clean_pieces(p.pieces)) break def write(self, fname): o = my_open_write(fname) if self.multi: o.write("".join(self.pieces)) else: o.write("".join(self.clean_pieces(self.pieces))) o.close() def clean_pieces(self, pieces): """Cleans the list of strings given as `pieces`. It replaces multiple newlines by a maximum of 2 and returns a new list. It also wraps the paragraphs nicely. """ ret = [] count = 0 for i in pieces: if i == '\n': count = count + 1 else: if i == '";': if count: ret.append('\n') elif count > 2: ret.append('\n\n') elif count: ret.append('\n'*count) count = 0 ret.append(i) _data = "".join(ret) ret = [] for i in _data.split('\n\n'): if i == 'Parameters:' or i == 'Exceptions:': ret.extend([i, '\n-----------', '\n\n']) elif i.find('// File:') > -1: # leave comments alone. ret.extend([i, '\n']) else: _tmp = textwrap.fill(i.strip(), break_long_words=False) _tmp = self.lead_spc.sub(r'\1"\2', _tmp) ret.extend([_tmp, '\n\n']) return ret def convert(input, output, include_function_definition=True, quiet=False): p = Doxy2SWIG(input, include_function_definition, quiet) p.generate() p.write(output) def main(): usage = __doc__ parser = optparse.OptionParser(usage) parser.add_option("-n", '--no-function-definition', action='store_true', default=False, dest='func_def', help='do not include doxygen function definitions') parser.add_option("-q", '--quiet', action='store_true', default=False, dest='quiet', help='be quiet and minimize output') options, args = parser.parse_args() if len(args) != 2: parser.error("error: no input and output specified") convert(args[0], args[1], not options.func_def, options.quiet) if __name__ == '__main__': main() pocketsphinx-5prealpha/doc/pocketsphinx_batch.1.in0000664000175000017500000000240512771605033017520 00000000000000.TH POCKETSPHINX_BATCH 1 "2007-08-27" .SH NAME pocketsphinx_batch \- Run speech recognition in batch mode .SH SYNOPSIS .B pocketsphinx_batch .RI \fB\-ctl\fR \fIctlfile\fR \fB\-cepdir\fR \fIcepdir\fR \fB\-cepext\fR \fI.mfc\fR [\fI options \fR]... .SH DESCRIPTION .PP Run speech recognition over a list of utterances in batchmode. A list of arguments follows: .\" ### ARGUMENTS ### .PP To do batchmode recognition, you will need to specify a control file, using .B \-ctl This is a simple text file containing one entry per line. Each entry is the name of an input file relative to the .B \-cepdir directory, and without the filename extension (which is given in the .B \-cepext argument). .PP If you are using acoustic feature files as input (see .BR sphinx_fe (1) for information on how to generate these), you can also specify a subpart of a file, using the following format: .PP .RS .B FILENAME START\-FRAME END\-FRAME UTTERANCE-ID .RE .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. .br .SH "SEE ALSO" .BR pocketsphinx_continuous (1), .BR sphinx_fe (1). .brpocketsphinx-5prealpha/doc/args2man.pl0000775000175000017500000000304312771605033015222 00000000000000#!/usr/bin/env perl use strict; use Pod::Usage; my $program = shift; pod2usage(2) unless defined($program); open ARGTEXT, "$program 2>&1 |" or die "Failed to run $program: $!"; my $inargs = 0; my @args; while () { chomp; if (/^\[NAME/) { $inargs = 1; next; } next unless $inargs; last if /^\s*$/; my ($name, $deflt, $descr) = /^(\S+)\s+(\S+)\s+(.*)$/; push @args, [$name, $deflt, $descr]; } die "No arguments found!" unless @args; while (<>) { if (/\.\\\" ### ARGUMENTS ###/) { foreach (@args) { my ($name, $deflt, $descr) = @$_; $name =~ s/-/\\-/g; $descr =~ s/ (-\S+)/ \\fB\\$1\\fR/g; print <<"EOA"; .TP .B $name $descr EOA } } else { print; } } __END__ =head1 NAME sphinx_args2man - Generate manual pages from the output of Sphinx programs =head1 SYNOPSIS B I E I